{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/app/services/translation.service.ts","webpack:///./src/app/services/date.service.ts","webpack:///./src/app/enum/SortType.ts","webpack:///./src/app/directives/_layout/v-table/_services/v-table.service.ts","webpack:///./src/app/enum/SortDirection.ts","webpack:///./src/app/services/navigation.service.ts","webpack:///./src/app/services/unitConversion.service.ts","webpack:///./src/app/enum/DateRange.enum.ts","webpack:///./src/app/services/accountFeature.service.ts","webpack:///./src/app/services/vehicle.service.ts","webpack:///./src/app/class/SettingsName.ts","webpack:///./src/app/enum/account/AccountFeature.ts","webpack:///./src/app/_pipes/_pipes.module.ts","webpack:///./src/app/directives/_misc/_misc.directives.module.ts","webpack:///./src/app/directives/_core/_core.directives.module.ts","webpack:///./src/app/class/Utilities.ts","webpack:///./src/app/directives/_veri/_veri.directives.module.ts","webpack:///./src/app/services/currentUser.service.ts","webpack:///./src/app/directives/_layout/_layout.directives.module.ts","webpack:///./src/app/main/components/videos/enums/VideoStatus.ts","webpack:///./src/app/enum/UserType.ts","webpack:///./src/app/directives/_forms/_form.directives.module.ts","webpack:///./src/app/main/modules/foundation/foundation.navigation.ts","webpack:///./src/app/main/modules/foundation/_services/account.service.ts","webpack:///./src/app/main/components/reports/_services/dynamicReports.service.ts","webpack:///./src/app/directives/_resourceFilters/_resourceFilters.directives.module.ts","webpack:///./src/app/services/veriDate.service.ts","webpack:///./src/app/enum/BroadcastEvent.ts","webpack:///./src/app/services/constantsService.ts","webpack:///./src/app/directives/_layout/v-table/_enums/VTableRowStatus.enum.ts","webpack:///./src/app/enum/VehicleType.enum.ts","webpack:///./src/app/enum/ReasonCode.ts","webpack:///./src/app/directives/_forms/form-validation.service.ts","webpack:///./src/app/enum/ResourceType.ts","webpack:///./src/app/services/caching/data-cache.service.ts","webpack:///./src/app/directives/_vehicle/_vehicle.directives.module.ts","webpack:///./src/app/directives/_layout/v-table/v-table.module.ts","webpack:///./src/app/main/modules/foundation/foundation.enums.ts","webpack:///./src/app/main/components/videos/enums/CameraProductType.ts","webpack:///./src/app/main/modules/fleet/fleet.navigation.ts","webpack:///./src/app/interfaces/IUser.ts","webpack:///./src/app/interfaces/IGeofences.ts","webpack:///./src/app/directives/_resourceFilters/filter-bar/filter-bar.service.ts","webpack:///./src/app/services/map.service.ts","webpack:///./src/app/main/modules/foundation/_services/vehicle.service.ts","webpack:///./src/app/services/enum.service.ts","webpack:///./src/app/services/driver.service.ts","webpack:///./src/app/main/components/reports/enums/ReportTableRowDataSource.ts","webpack:///./src/app/main/modules/foundation/foundation.interfaces.ts","webpack:///./src/app/directives/_map/_map.directives.module.ts","webpack:///./src/app/services/googleMarker.service.ts","webpack:///./src/app/enum/GeofenceType.ts","webpack:///./src/app/directives/_layout/v-table/_components/v-table.component.ts","webpack:///./src/app/services/responsive.service.ts","webpack:///./src/app/directives/_layout/v-dialog/v-dialog.service.ts","webpack:///./src/app/interfaces/IPeripheral.ts","webpack:///./src/app/services/account.service.ts","webpack:///./src/app/services/preferences.service.ts","webpack:///./src/app/directives/_resourceFilters/filter-bar/filter-bar.component.ts","webpack:///./src/app/services/_services.module.ts","webpack:///./src/app/services/geocode.service.ts","webpack:///./src/app/class/PageStateNames.ts","webpack:///./src/app/main/components/videos/utils/video-entry-utils.ts","webpack:///./src/app/main/components/videos/enums/VideoEventCode.ts","webpack:///./src/app/services/group.service.ajs.ts","webpack:///./src/app/main/modules/alerts/_enums/alerts.enums.ts","webpack:///./src/app/main/modules/foundation/_services/peripheral.service.ts","webpack:///./src/app/main/modules/tms/_enums/RouteVisitStatus.ts","webpack:///./src/app/enum/SpecialUserPermissions.ts","webpack:///./src/app/services/htmlService.service.ts","webpack:///./src/app/main/components/reports/enums/ColumnDataType.ts","webpack:///./src/app/main/modules/temperature/_services/temperature-probe.service.ts","webpack:///./src/app/main/modules/foundation/_services/user.service.ts","webpack:///./src/app/common/hybrid-service-accessor.ts","webpack:///./src/app/interfaces/IDriver.ts","webpack:///./src/app/services/session.service.ts","webpack:///./src/app/services/geofence.service.ts","webpack:///./src/app/main/components/videos/enums/VideoReviewStatus.enum.ts","webpack:///./src/app/directives/_forms/v-autocomplete/v-autocomplete.component.ts","webpack:///./src/app/main/components/reports/models/IReportParameters.ts","webpack:///./src/app/services/colour.service.ts","webpack:///./src/app/main/components/videos/services/camera.service.ts","webpack:///./src/app/directives/_layout/v-tabs/v-tabs.component.ts","webpack:///./src/app/main/modules/foundation/_services/unit.service.ts","webpack:///./src/app/main/modules/alerts/_services/alerts.service.ts","webpack:///./src/app/main/modules/temperature/_services/zone.service.ts","webpack:///./src/app/main/modules/foundation/_services/engineer-job-item.service.ts","webpack:///./src/app/main/modules/tms/_services/planned-route.service.ts","webpack:///./src/app/services/journey.service.ts","webpack:///./src/app/directives/_core/v-dropdown/v-button-dropdown/v-button-dropdown.component.ts","webpack:///./src/app/class/ComponentUtility.ts","webpack:///./src/app/directives/_misc/v-progress-bar/v-progress-bar.component.ts","webpack:///./src/app/main/modules/tms/tms.navigation.ts","webpack:///./src/app/services/reasonCode.service.ts","webpack:///./src/app/services/driverAssignment.service.ts","webpack:///./src/app/main/components/videos/enums/VideoStreamType.ts","webpack:///./src/app/directives/_veri/veriTable/veriTable.component.ts","webpack:///./src/app/main/components/videos/services/video-entry.service.ts","webpack:///./src/app/main/components/resourceManagement/groups/groups.module.ts","webpack:///./src/app/main/modules/tms/_enums/RouteStatus.ts","webpack:///./src/app/main/components/livemap/model/CoordsModel.ts","webpack:///./src/app/directives/_forms/v-input/v-input.component.ts","webpack:///./src/app/main/components/reports/reports.navigation.ts","webpack:///./src/app/services/tags.service.ts","webpack:///./src/app/services/tacho.service.ts","webpack:///./src/app/main/modules/foundation/_services/peripheral.service.ajs.ts","webpack:///./src/app/main/components/reports/enums/TimeFilterType.ts","webpack:///./src/app/services/users.service.ts","webpack:///./src/app/main/components/videos/enums/CameraLocation.ts","webpack:///./src/app/main/components/videos/enums/VideoObservation.ts","webpack:///./src/app/main/components/videos/enums/VideoReviewSubStatus.enum.ts","webpack:///./src/app/main/modules/cameras/_services/camera-channels.service.ts","webpack:///./src/app/directives/_layout/v-tabs/v-tab.component.ts","webpack:///./src/app/services/device-profile.service.ts","webpack:///./src/app/main/components/resourceManagement/driving-styles-manager/driving-styles.service.ts","webpack:///./src/app/enum/account/AccountStatus.ts","webpack:///./src/app/main/modules/foundation/_routes/developerConsole/signalr.service.ts","webpack:///./src/app/main/modules/foundation/_services/device-data-validation.service.ts","webpack:///./src/app/main/modules/foundation/_services/vehicle-validation-check-record.service.ts","webpack:///./src/app/main/modules/foundation/_services/engineer.service.ts","webpack:///./src/app/main/modules/foundation/_services/engineer-job.service.ts","webpack:///./src/app/directives/_map/v-map/v-map/v-map.component.ts","webpack:///./src/app/services/plot.service.ts","webpack:///./src/app/services/display.service.ts","webpack:///./src/app/services/login.service.ajs.ts","webpack:///./src/app/main/modules/cameras/camera.module.ajs.ts","webpack:///./src/app/enum/VTableSelectionType.ts","webpack:///./src/app/main/modules/temperature/_enums/temperature/TemperatureProbeCategory.enum.ts","webpack:///./src/app/services/canvas.service.ts","webpack:///./src/app/main/components/videos/services/camera-status.service.ts","webpack:///./src/app/main/components/tacho/alcolockCompliance/alcolock.enums.ts","webpack:///./src/app/main/components/reports/enums/ReportDataFunction.ts","webpack:///./src/app/services/charts.service.ts","webpack:///./src/app/main/components/videos/enums/CameraChannelType.ts","webpack:///./src/app/main/components/videos/enums/VideoCoachingStatus.enum.ts","webpack:///./src/app/main/components/resourceManagement/resourceManagement.module.ts","webpack:///./src/app/services/camera/streamax-camera-profile-service.ts","webpack:///./src/app/main/modules/foundation/_components/components.modules.ts","webpack:///./src/app/main/modules/foundation/_services/sim.service.ts","webpack:///./src/app/main/modules/foundation/_routes/rv-lite/application/_models/ICameraApp.ts","webpack:///./src/app/interfaces/ISensorDataValue.ts","webpack:///./src/app/main/components/maintenance/sensorData/sensor-data.service.ts","webpack:///./src/app/directives/_map/veriMap/veriMapComponent/veriMap.component.ts","webpack:///./src/app/main/components/planning/tmsService.ts","webpack:///./src/app/enum/measurements/DistanceMeasurement.enum.ts","webpack:///./src/app/main/components/resourceManagement/resourceManagement.navigation.ts","webpack:///./src/app/enum/DayOfWeek.ts","webpack:///./src/app/services/fullscreen.service.ts","webpack:///./src/app/main/components/resourceManagement/vor/vor.interfaces.ts","webpack:///./src/app/directives/_veri/v-pills/v-pills.component.ts","webpack:///./src/app/main/components/resourceManagement/driving-styles-manager/driving-styles.enums.ts","webpack:///./src/app/enum/account/Platform.ts","webpack:///./src/app/main/modules/temperature/_enums/reefer/MultiStateInputCategory.enum.ts","webpack:///./src/app/main/modules/foundation/_enums/camera-configs/CameraConfigEnums.ts","webpack:///./src/app/interfaces/ISim.ts","webpack:///./src/app/main/modules/foundation/_routes/rv-lite/application/_services/camera-app.service.ts","webpack:///./src/app/main/modules/foundation/_routes/commissions/commission.service.ts","webpack:///./src/app/main/modules/foundation/_services/account.service.ajs.ts","webpack:///./src/app/main/modules/foundation/_services/user-group.service.ts","webpack:///./src/app/main/modules/foundation/_services/engineer-job-booking.service.ts","webpack:///./src/app/main/components/videos/cameraDisplay.service.ts","webpack:///./src/app/main/modules/foundation/_routes/rv-lite/config/_services/config.service.ts","webpack:///./src/app/main/components/maintenance/faultCodes/fault-codes.service.ts","webpack:///./src/app/main/modules/temperature/_services/multi-state-input.service.ts","webpack:///./src/app/main/modules/temperature/_services/reefer.service.ts","webpack:///./src/app/main/modules/alerts/_services/alert-review.service.ts","webpack:///./src/app/main/modules/alerts/_enums/AlertReviewStatus.enums.ts","webpack:///./src/app/main/components/nps/nps.service.ts","webpack:///./src/app/main/modules/tms/_enums/VisitOnTimeStatus.ts","webpack:///./src/app/main/modules/tms/_services/active-routes.service.ts","webpack:///./src/app/directives/_vehicle/journeySummary/journeySummary.component.ts","webpack:///./src/app/main/components/csvImporter/enums/FieldType.ts","webpack:///./src/app/directives/_misc/tooltip/tooltip.service.ts","webpack:///./src/app/directives/_forms/v-toggle/v-toggle.component.ts","webpack:///./src/app/directives/_misc/depotName/depotName.component.ts","webpack:///./src/app/main/modules/temperature/temperature.navigation.ts","webpack:///./src/app/directives/_misc/async-observable/async-observable.component.ts","webpack:///./src/app/directives/_layout/v-table/_enums/VTableHeaderType.enum.ts","webpack:///./src/app/interfaces/IVehicleInput.ts","webpack:///./src/app/directives/_misc/temperatureReading/temperatureReading.component.ts","webpack:///./src/app/main/modules/temperature/_services/temperature.service.ts","webpack:///./src/app/directives/_misc/vehicle-online-status-indicator/vehicle-online-status.component.ts","webpack:///./src/app/main/components/videos/services/camera-online-history.service.ts","webpack:///./src/app/services/veriMarker.service.ts","webpack:///./src/app/directives/_forms/fileUpload/fileUpload.component.ts","webpack:///./src/app/directives/_forms/v-select/v-select.component.ts","webpack:///./src/app/directives/_forms/_radio-buttons/radio-button-base/radio-button-base.component.ts","webpack:///./src/app/services/breadcrumb.service.ts","webpack:///./src/app/directives/_veri/export/legacyExport.service.ts","webpack:///./src/app/main/components/reports/enums/SchedulingFrequency.ts","webpack:///./src/app/services/product.service.ts","webpack:///./src/app/directives/_veri/v-date-selector/v-date-selector.component.ts","webpack:///./src/app/directives/_visualisations/visualisations.module.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/_services/hardware-mapping.service.ts","webpack:///./src/app/services/groups/group.service.ts","webpack:///./src/app/main/modules/foundation/_enums/NoteType.ts","webpack:///./src/app/main/modules/foundation/_enums/ResourceType.ts","webpack:///./src/app/main/modules/foundation/_services/sim-mapping.service.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/_enums/CommServerRequestState.ts","webpack:///./src/app/services/camera/camera-communication-server.service.ts","webpack:///./src/app/main/modules/foundation/_routes/commissions/commission.module.ts","webpack:///./src/app/main/modules/foundation/_services/engineer-commission.service.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/_models/IPulseRecord.ts","webpack:///./src/app/services/observations.service.ts","webpack:///./src/app/main/modules/cameras/_components/video-address/video-address.component.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/pulse/pulse.service.ts","webpack:///./src/app/main/components/reports/_components/report-schedules/report-schedules.component.ts","webpack:///./src/app/main/components/reports/_services/report-history.service.ts","webpack:///./src/app/main/modules/temperature/_services/temperature-setpoint.service.ts","webpack:///./src/app/services/vehicleInput.service.ts","webpack:///./src/app/main/modules/temperature/_services/temperature-record.service.ts","webpack:///./src/app/main/modules/temperature/_services/temperature-out-of-bounds.service.ts","webpack:///./src/app/main/modules/alerts/components/alert-detail/axle-weight-alert-detail/axle-weight-alert-detail.service.ts","webpack:///./src/app/main/modules/alerts/components/alert-detail/geofence-alert-detail/geofence-alert-detail.service.ts","webpack:///./src/app/main/modules/alerts/components/alert-detail/input-alert-detail/input-alert-detail.service.ts","webpack:///./src/app/main/modules/alerts/components/alert-detail/power-loss-alert-detail/power-loss-alert-detail.service.ts","webpack:///./src/app/main/modules/alerts/components/alert-detail/toll-alert-detail/toll-alert-detail.service.ts","webpack:///./src/app/main/modules/alerts/components/alert-detail/tyre-record-alert-detail/tyre-record-detail.service.ts","webpack:///./src/app/main/modules/alerts/components/alert-detail/vehicle-diagnostic-detail/vehicle-diagnostic-detail.service.ts","webpack:///./src/app/main/modules/alerts/components/alert-detail/video-alert-detail/video-alert-detail.service.ts","webpack:///./src/app/main/components/dashboardV2/dashboard.service.ts","webpack:///./src/app/main/components/insights/driver-behaviour/driver-behaviour-comparison.component.ts","webpack:///./src/app/main/modules/tms/_components/route-performance-bar/route-performance-bar.component.ts","webpack:///./src/app/main/modules/tms/_services/planned-route.service2.ts","webpack:///./src/app/main/components/csvImporter/enums/ImportSource.ts","webpack:///./src/app/main/components/csvImporter/csvImporter.html","webpack:///./src/app/services/plotEvent.service.ts","webpack:///./src/app/directives/_core/v-nav-bar/v-nav-item/v-nav-item.component.ts","webpack:///./src/app/directives/_core/v-button/v-button.component.ts","webpack:///./src/app/directives/_forms/v-flag-toggle/v-flag-toggle.component.ts","webpack:///./src/app/directives/_misc/delete-confirm/delete-confirm.component.ts","webpack:///./src/app/main/modules/alerts/alerts.navigation.ts","webpack:///./src/app/services/avatar.service.ts","webpack:///./src/app/directives/_misc/flvPlayer/flv-player.component.ts","webpack:///./src/app/directives/_misc/location-information/location-information.component.ts","webpack:///./src/app/services/location-information/location-information.service.ts","webpack:///./src/app/directives/_misc/video-download-status/video-download-status.component.ts","webpack:///./src/app/directives/_vehicle/vehicleReg/vehicleReg.component.ts","webpack:///./src/app/services/popup.service.ts","webpack:///./src/app/directives/_layout/v-table/_components/cells/checkbox-cell/checkbox-cell.component.ts","webpack:///./src/app/directives/_layout/v-table/_components/cells/enum-cell/v-enum-cell.component.ts","webpack:///./src/app/directives/_layout/v-table/_components/cells/percentage-bar/percentage-bar-cell.component.ts","webpack:///./src/app/directives/_layout/v-table/_components/cells/rag-cell/rag-cell.component.ts","webpack:///./src/app/directives/_layout/v-table/_components/cells/stacked-date/date-cell.component.ts","webpack:///./src/app/directives/_layout/v-table/_components/cells/status-cell/status-cell.component.ts","webpack:///./src/app/directives/_layout/v-table/_components/cells/header/v-table-header.component.ts","webpack:///./src/app/filters/formatBytes.filter.ts","webpack:///./src/app/directives/_translations/_translations.directives.module.ts","webpack:///./src/app/services/fileReader.service.ts","webpack:///./src/app/filters/enumNames.filter.ts","webpack:///./src/app/services/mapzen.service.ts","webpack:///./src/app/main/components/reports/enums/ReportTypesNavLabels.ts","webpack:///./src/app/directives/_layout/v-dialog/v-dialog-ref.ts","webpack:///./src/app/services/cameraCommunicationServer.service.ts","webpack:///./src/app/services/theme.service.ts","webpack:///./src/app/main/components/fleetMaintenance/vehicleData.service.ts","webpack:///./src/app/services/saml.service.ts","webpack:///./src/app/services/utilisation.service.ts","webpack:///./src/app/directives/_veri/veriVideo/v-stream-collection/v-stream-collection.component.ts","webpack:///./src/app/styles/animations/fade-in-fade-out.animation.ts","webpack:///./src/app/directives/_veri/v-calendar/v-calendar.component.ts","webpack:///./src/app/directives/_veri/v-time-filters/v-time-filters.component.ts","webpack:///./src/app/directives/_layout/_page-design/page-actions/page-actions.component.ts","webpack:///./src/app/directives/_layout/_page-design/_layouts/default-layout/default-layout.component.ts","webpack:///./src/app/services/plots/plot.service.ts","webpack:///./src/app/main/components/videos/services/video-review-status.service.ts","webpack:///./src/app/directives/_layout/resourceGroupDisplay/resourceGroupDisplay.component.ts","webpack:///./src/app/directives/_layout/_page-design/page-title-pill/page-title-pill.component.ts","webpack:///./src/app/directives/_layout/_page-design/page-title/page-title.component.ts","webpack:///./src/app/directives/_vehicle/driverSummaryPanel/driverSummaryPanel.component.ts","webpack:///./src/app/main/components/resourceManagement/cameras/camera-channels-editor/auto-download-configuration/auto-download-configuration.component.ts","webpack:///./src/app/main/components/resourceManagement/cameras/camera-vehicles-manager/camera-vehicles-manager.component.ts","webpack:///./src/app/main/components/resourceManagement/contextual-speeding-settings-manager/contextual-speeding-by-road/contextual-speeding-by-road.component.ts","webpack:///./src/app/services/contextual-speeding-override.service.ts","webpack:///./src/app/main/components/resourceManagement/contextual-speeding-settings-manager/contextual-speeding-by-vehicle/contextual-speeding-by-vehicle.component.ts","webpack:///./src/app/main/components/resourceManagement/device-profiles-manager/device-profile-comparison-status-label/device-profile-comparison-status-label.component.ts","webpack:///./src/app/main/components/resourceManagement/device-profiles-manager/device-profile-editor/device-profile-editor.component.ts","webpack:///./src/app/services/products.service.ts","webpack:///./src/app/main/components/resourceManagement/driving-styles-manager/driving-style-metric-editor/driving-style-metric-editor.component.ts","webpack:///./src/app/main/components/resourceManagement/driving-styles-manager/driving-style-metric-selector/driving-style-metric-selector.component.ts","webpack:///./src/app/main/modules/alerts/_enums/AlertRuleStatus.enums.ts","webpack:///./src/app/main/components/resourceManagement/users/userEditor/user-editor.component.ts","webpack:///./src/app/main/modules/temperature/_enums/reefer/ReeferZoneOperatingModeCategory.enum.ts","webpack:///./src/app/main/modules/temperature/_enums/temperature/ZoneStatus.enum.ts","webpack:///./src/app/main/modules/foundation/_routes/rv-lite/config/_services/cameraConfigurationRequestService.ts","webpack:///./src/app/main/modules/foundation/_services/userResellerMapping.service.ts","webpack:///./src/app/main/modules/foundation/_components/diagnostics4G/diagnostics-4g.component.ts","webpack:///./src/app/main/modules/foundation/_services/vehicle.service.ajs.ts","webpack:///./src/app/main/modules/foundation/_services/manual-device-validation-check.service.ts","webpack:///./src/app/main/modules/foundation/_routes/commissions/commissionEditor/components/deviceInstallEditor/device-install-editor.component.ts","webpack:///./src/app/main/modules/foundation/_routes/device-health/device-health.service.ts","webpack:///./src/app/main/modules/foundation/_routes/device-health/enums/device-health-record-type.ts","webpack:///./src/app/main/modules/foundation/_routes/device-health/components/device-health-vehicles/device-health-vehicles.component.ts","webpack:///./src/app/main/modules/foundation/_routes/jobs/jobs.module.ts","webpack:///./src/app/main/modules/foundation/_routes/jobs/job-details/job-details.component.ts","webpack:///./src/app/main/components/videos/services/camera-footage.service.ts","webpack:///./src/app/main/modules/cameras/_components/video-download-progress/video-download-progress.component.ts","webpack:///./src/app/main/modules/cameras/_components/video-driver-assignment/video-driver-assignment.component.ts","webpack:///./src/app/main/components/videos/enums/VideoEventRisk.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/_enums/CreationCode.enum.ts","webpack:///./src/app/main/modules/foundation/_routes/rv-lite/application/_components/application-manager/application-manager.component.ts","webpack:///./src/app/main/components/reports/_components/report-filters/report-filters.component.ts","webpack:///./src/app/main/components/reports/_components/report-parameters/report-parameters.component.ts","webpack:///./src/app/main/components/reports/_routes/report-history-page/report-history-page.component.ts","webpack:///./src/app/services/audio.service.ts","webpack:///./src/app/main/modules/temperature/_enums/reefer/ReeferEngineModeCategory.enum.ts","webpack:///./src/app/main/modules/temperature/_enums/reefer/ReeferMake.enum.ts","webpack:///./src/app/main/modules/temperature/_enums/reefer/ReeferOperatingModeCategory.enum.ts","webpack:///./src/app/main/modules/temperature/_components/zone/zoneOperatingModeWidget/zone-operating-mode-widget.component.ts","webpack:///./src/app/main/modules/temperature/_components/compliance/stacked-probe-reading/stacked-probe-reading.component.ts","webpack:///./src/app/main/modules/alerts/components/alert-category/alert-category.component.ts","webpack:///./src/app/main/modules/alerts/components/alert-detail/geofence-alert-detail/geofence-alert-detail.component.ts","webpack:///./src/app/main/modules/alerts/components/alert-detail/temperature-alert-detail/temperature-alert-detail.component.ts","webpack:///./src/app/main/components/nps/nps-rater.component.ts","webpack:///./src/app/main/modules/tms/_routes/activeRoutes/active-route-progress/active-route-progress.component.ts","webpack:///./src/app/main/modules/tms/_services/unplanned-stop.service.ts","webpack:///./src/app/main/modules/tms/_services/scheduling.service.ts","webpack:///./src/app/main/components/insights/insights.navigation.ts","webpack:///./src lazy namespace object","webpack:///./src/app/app.module.ajs.ts","webpack:///./src/app/app.module.ts","webpack:///./src/app/directives/_map/angularGoogleMaps/uiGmapMarkers.component.ts","webpack:///./src/app/directives/_map/angularGoogleMaps/uiGmapPolygon.component.ts","webpack:///./src/app/directives/_map/veriMap/veriMapCurrentJourney/veriMapCurrentJourney.component.ts","webpack:///./src/app/enum/AccelerometerInfoType.ts","webpack:///./src/app/directives/_map/angularGoogleMaps/uiGmapMarker.component.ts","webpack:///./src/app/directives/_map/angularGoogleMaps/uiGmapPolyline.component.ts","webpack:///./src/app/directives/_map/angularGoogleMaps/uiGmapPolylines.component.ts","webpack:///./src/app/directives/_map/veriMap/veriMapJourneysNew/veriMapJourneysNew.component.ts","webpack:///./src/app/_pipes/translate.pipe.ts","webpack:///./src/app/_pipes/veri-date.pipe.ts","webpack:///./src/app/enum/Currency.enum.ts","webpack:///./src/app/enum/measurements/FuelConsumptionMeasurement.enum.ts","webpack:///./src/app/enum/measurements/TemperatureMeasurement.enum.ts","webpack:///./src/app/enum/measurements/VolumeMeasurement.ts","webpack:///./src/app/main/components/reports/enums/ReportMeasurementType.ts","webpack:///./src/app/directives/splash-screen/splash-screen.component.ts","webpack:///./src/app/directives/unauthorized-view/unauthorized-view.component.ts","webpack:///./src/app/directives/_core/v-nav-bar/v-nav-bar.component.ts","webpack:///./src/app/directives/_core/v-nav-bar/v-nav-bar.service.ts.ts","webpack:///./src/app/directives/_core/v-dropdown/v-dropdown.component.ts","webpack:///./src/app/directives/_core/v-dropdown/v-item-dropdown/v-item-dropdown.component.ts","webpack:///./src/app/directives/_forms/v-flag-toggle-list-item/v-flag-toggle-list-item.component.ts","webpack:///./src/app/directives/_forms/dropdown-container/dropdown-container.ts","webpack:///./src/app/directives/_forms/v-toggle-list-item/v-toggle-list-item.component.ts","webpack:///./src/app/directives/_misc/delete-confirm/group-delete-confirm/group-delete-confirm.component.ts","webpack:///./src/app/directives/_misc/delete-confirm/delete-confirm.component.html","webpack:///./src/app/directives/_misc/delayed-hover.service.ts","webpack:///./src/app/directives/_misc/multiStepIndicator/multiStepIndicator.component.ts","webpack:///./src/app/directives/_misc/accountSwitcher/accountSwitcher.component.ts","webpack:///./src/app/userPreferences/userpreferences.directive.ts","webpack:///./src/app/userPreferences/userpreferences.html","webpack:///./src/app/main/components/companyImage/companyImage.html","webpack:///./src/app/directives/_misc/batteryIndicator/batteryIndicator.component.ts","webpack:///./src/app/directives/_misc/breadcrumbs/breadcrumbs.component.ts","webpack:///./src/app/directives/_misc/day-of-week-picker/day-of-week-picker.component.ts","webpack:///./src/app/directives/_misc/driver-name/driver-name.component.ts","webpack:///./src/app/directives/_misc/driverImage/driverImage.component.ts","webpack:///./src/app/directives/_veri/veriVideo/v-stream-collection/stream.service.ts","webpack:///./src/app/directives/_misc/fullScreenButton/fullScreenButton.component.ts","webpack:///./src/app/directives/_misc/loadingIndicator/loadingIndicator.component.ts","webpack:///./src/app/directives/_misc/navCount/navCount.component.ts","webpack:///./src/app/enum/UnitStatus.ts","webpack:///./src/app/directives/_misc/site-status-indicator/site-status-indicator.component.ts","webpack:///./src/app/directives/_misc/tachoMode/tachoMode.directive.ts","webpack:///./src/app/enum/DriverDecisionSupportType.ts","webpack:///./src/app/directives/_misc/trendArrow/trendArrow.component.ts","webpack:///./src/app/directives/_misc/unitConversionSuffix.component.ts","webpack:///./src/app/directives/_misc/vector-dots/vector-dots.component.ts","webpack:///./src/app/directives/_misc/veriMarker/veriMarker.directive.ts","webpack:///./src/app/directives/_misc/vertical-collapsable-divider/vertical-collapsable-divider.component.ts","webpack:///./src/app/directives/_translations/languageSelector/languageSelector.component.ts","webpack:///./src/app/directives/_forms/checkbox/checkbox.component.ts","webpack:///./src/app/directives/_forms/formDetails/formDetails.component.ts","webpack:///./src/app/directives/_forms/textarea/textarea.component.ts","webpack:///./src/app/directives/_forms/v-enum-select/v-enum-select.component.ts","webpack:///./src/app/directives/_forms/v-select/v-select.component.html","webpack:///./src/app/directives/_forms/v-order-buttons/v-order-buttons.component.ts","webpack:///./src/app/directives/_forms/v-select/v-select-option/v-select-option.component.ts","webpack:///./src/app/directives/_forms/v-slider/v-slider.component.ts","webpack:///./src/app/directives/_forms/v-radio-button/v-radio-button.component.ts","webpack:///./src/app/directives/_forms/smsInput/sms-input.component.ts","webpack:///./src/app/directives/_forms/_radio-buttons/radio-button-cards/radio-button-cards.component.ts","webpack:///./src/app/directives/_forms/_radio-buttons/radio-button-small-cards/radio-button-small-cards.component.ts","webpack:///./src/app/directives/_layout/_page-design/route-breadcrumbs/route-breadcrumbs.component.ts","webpack:///./src/app/directives/_veri/export/v-export-button/v-export-button.component.ts","webpack:///./src/app/directives/_layout/v-dialog/v-dialog.component.ts","webpack:///./src/app/directives/_resourceFilters/filter-bar/filter-bar.models.ts","webpack:///./src/app/directives/_veri/v-list/v-list.component.ts","webpack:///./src/app/directives/_veri/v-timeline/v-timeline.component.ts","webpack:///./src/app/directives/_veri/veriPills/veriPills.component.ts","webpack:///./src/app/services/google.service.ts","webpack:///./src/app/main/components/fleetMaintenance/IVehicleData.ts","webpack:///./src/app/enum/DriverAssignmentSource.enum.ts","webpack:///./src/app/enum/UserAccessPermissions.ts","webpack:///./src/app/services/vor.service.ts","webpack:///./src/app/directives/_vehicle/VehicleVideoStream/v-vehicle-video-stream.component.ts","webpack:///./src/app/main/components/videos/models/ICameraChannel.ts","webpack:///./src/app/directives/_veri/dashboard/dashboardBoxSmall.component.ts","webpack:///./src/app/directives/_veri/v-descriptive-list-item/v-descriptive-list-item.component.ts","webpack:///./src/app/directives/_veri/v-tags/v-tags.component.ts","webpack:///./src/app/directives/_veri/veriBadge/veriBadge.component.ts","webpack:///./src/app/directives/_veri/veriCard/veriCard.component.ts","webpack:///./src/app/directives/_veri/veriColourPicker/veriColourPicker.component.ts","webpack:///./src/app/directives/_veri/veriInfoPanel/veriInfoPanel.component.ts","webpack:///./src/app/directives/_veri/veriNumberField/veriNumberField.component.ts","webpack:///./src/app/directives/_veri/veriSearchBox/veriSearchBox.directive.ts","webpack:///./src/app/directives/_veri/veriSimpleNav/veriSimpleNav.component.ts","webpack:///./src/app/directives/_veri/veriTable/veriTableContainer/veriTableContainer.component.ts","webpack:///./src/app/directives/_veri/veriTable/veriTableSummary/veriTableSummary.component.ts","webpack:///./src/app/directives/_veri/veriVideo/v-video.component.ts","webpack:///./src/app/directives/_veri/veriVideo/v-video-collection/v-video-collection.component.ts","webpack:///./src/app/main/modules/foundation/_services/sensor-data.service.ts","webpack:///./src/app/directives/_veri/veriVideo/videoControls/video-controls.component.ts","webpack:///./src/app/directives/_veri/veriVideo/videoProgress/video-progress.component.ts","webpack:///./src/app/directives/_veri/veriVideoThumbnails/veriVideoThumbnails.component.ts","webpack:///./src/app/directives/_layout/accordian/accordian.component.ts","webpack:///./src/app/directives/_layout/empty-state/empty-state.component.ts","webpack:///./src/app/directives/_layout/revealingColumns/revealingColumns.component.ts","webpack:///./src/app/directives/_layout/veri-panel/veri-panel.component.ts","webpack:///./src/app/directives/_layout/_page-design/detail-page/detail-page.component.ts","webpack:///./src/app/directives/_layout/_page-design/sidebar/sidebar.component.ts","webpack:///./src/app/directives/_layout/_page-design/_layouts/horizontal-layout/horizontal-layout.component.ts","webpack:///./src/app/directives/_layout/_page-design/_layouts/vertical-layout/vertical-layout.component.ts","webpack:///./src/app/directives/_layout/_page-design/_layouts/vertical-map-layout/vertical-map-layout.component.ts","webpack:///./src/app/directives/_resourceFilters/filter-bar/date-button-filter/date-button-filter.component.ts","webpack:///./src/app/directives/_resourceFilters/filter-bar/driver-button-filter/driver-button-filter.component.ts","webpack:///./src/app/directives/_resourceFilters/filter-bar/item-filter/item-filter.component.ts","webpack:///./src/app/directives/_resourceFilters/vertical-filter-list/vertical-filter-list.component.ts","webpack:///./src/app/directives/_vehicle/vehicle-button-filter/vehicle-button-filter.component.ts","webpack:///./src/app/directives/_vehicle/vehicle-status/vehicle-status.component.ts","webpack:///./src/app/directives/_vehicle/vehicleInfoCard/vehicleInfoCard.component.ts","webpack:///./src/app/directives/_vehicle/vehiclePlotTime/vehiclePlotTime.component.ts","webpack:///./src/app/directives/_layout/v-table/_components/cells/stacked-cell/stacked-cell.component.ts","webpack:///./src/app/directives/_layout/v-table/_components/cells/v-table-cell.component.ts","webpack:///./src/app/directives/_layout/v-table/_directives/componentAnchor.directive.ts","webpack:///./src/app/directives/_layout/v-table/_components/v-table-actions/v-table-actions.component.ts","webpack:///./src/app/directives/_layout/v-table/_components/v-table-layout-container/v-table-layout-container.component.ts","webpack:///./src/app/directives/_layout/v-table/_components/visualisations/table-summary-box/table-summary-box.component.ts","webpack:///./src/app/directives/_visualisations/activeRangeBarChart/active-range-bar-chart.component.ts","webpack:///./src/app/main/components/resourceManagement/account-settings/account-settings-manager.component.ts","webpack:///./src/app/services/account-settings.service.ts","webpack:///./src/app/main/components/resourceManagement/account-settings/account-settings-save-warning/account-settings-save-warning.component.ts","webpack:///./src/app/main/components/videos/enums/VideoEventCodeSimplified.ts","webpack:///./src/app/services/autoDownloadSetting.service.ts","webpack:///./src/app/main/components/resourceManagement/cameras/camera-channels-editor/auto-download-configuration/editor/auto-download-configuration-editor.component.ts","webpack:///./src/app/main/components/resourceManagement/cameras/camera-channels-editor/camera-channels-editor.component.ts","webpack:///./src/app/main/components/resourceManagement/cameras/camera-channels-editor/channel-thumbnail/channel-thumbnail.component.ts","webpack:///./src/app/main/components/resourceManagement/contextual-speeding-settings-manager/base/contextual-speeding-tab.ts","webpack:///./src/app/services/contextual-speeding-threshold.service.ts","webpack:///./src/app/main/components/resourceManagement/contextual-speeding-settings-manager/contextual-speeding-road-editor/contextual-speeding-road-editor.component.ts","webpack:///./src/app/main/components/resourceManagement/contextual-speeding-settings-manager/base/contextual-speeding-editor.ts","webpack:///./src/app/main/components/resourceManagement/contextual-speeding-settings-manager/contextual-speeding-settings-manager.component.ts","webpack:///./src/app/main/components/resourceManagement/contextual-speeding-settings-manager/contextual-speeding-vehicle-editor/contextual-speeding-vehicle-editor.component.ts","webpack:///./src/app/main/components/resourceManagement/device-profiles-manager/device-profile-vehicle-preview/device-profile-vehicle-preview.component.ts","webpack:///./src/app/main/components/resourceManagement/device-profiles-manager/device-profile-vehicle-view/device-profile-vehicle-view.component.ts","webpack:///./src/app/main/components/resourceManagement/device-profiles-manager/device-profiles-manager.component.ts","webpack:///./src/app/main/components/resourceManagement/driving-styles-manager/driving-style-associations-manager/driving-style-associations-manager.component.ts","webpack:///./src/app/main/components/resourceManagement/driving-styles-manager/driving-style-editor/driving-style-editor.component.ts","webpack:///./src/app/main/components/resourceManagement/driving-styles-manager/driving-style-metric-weighting-label/driving-style-metric-weighting-label.component.ts","webpack:///./src/app/main/components/resourceManagement/driving-styles-manager/driving-style-vehicle-preview/driving-style-vehicle-preview.component.ts","webpack:///./src/app/main/components/resourceManagement/driving-styles-manager/driving-styles-manager.component.ts","webpack:///./src/app/directives/_resourceFilters/filter-bar/group-button-filter/group-button-filter.component.ts","webpack:///./src/app/directives/_veri/group-autocomplete/group-autocomplete.component.ts","webpack:///./src/app/main/components/resourceManagement/groups/group-editor/group-details/group-details.component.ts","webpack:///./src/app/main/components/resourceManagement/groups/group-editor/group-editor.component.ts","webpack:///./src/app/main/components/resourceManagement/groups/group-hierarchy/group-hierarchy.component.ts","webpack:///./src/app/main/components/resourceManagement/groups/groups-list/groups-list.component.ts","webpack:///./src/app/main/components/resourceManagement/users/saml-configuration/saml-configuration.component.ts","webpack:///./src/app/services/accountUserMapping.service.ts","webpack:///./src/app/main/components/resourceManagement/vehicles/temperatureProbes/temperature-zones-edit/temperature-zones-edit.component.ts","webpack:///./src/app/main/modules/foundation/_routes/streamax-configs/account-list/streamax-configs-account-list.component.ts","webpack:///./src/app/main/modules/foundation/_services/config-account-group.service.ts","webpack:///./src/app/services/camera/streamax-camera-parameters.service.ts","webpack:///./src/app/main/modules/foundation/_routes/streamax-configs/custom-trigger-metrics/custom-trigger-metrics.component.ts","webpack:///./src/app/main/modules/foundation/_routes/streamax-configs/streamax-configs-account-view.component.ts","webpack:///./src/app/directives/_veri/veriTable/veriTable.service.ts","webpack:///./src/app/main/modules/foundation/_components/customer-name/customer-name.component.ts","webpack:///./src/app/main/modules/foundation/_components/foundation-notes-list/foundation-notes-list.component.ts","webpack:///./src/app/main/modules/foundation/_services/notes.service.ts","webpack:///./src/app/main/modules/foundation/_components/simStatusInfo/simStatusInfo.component.ts","webpack:///./src/app/interfaces/ISimMapping.ts","webpack:///./src/app/main/modules/foundation/_components/barcode-scanner/barcode-scanner-livestream.component.ts","webpack:///./src/app/main/modules/foundation/_components/barcode-scanner/barcode-scanner.component.ts","webpack:///./src/app/main/modules/foundation/_components/commandSender/commandSender.component.ts","webpack:///./src/app/main/modules/foundation/_services/deviceMessage.service.ts","webpack:///./src/app/enum/deviceMessage/DeviceCommunicationType.ts","webpack:///./src/app/main/modules/foundation/_components/configSwitcher/config-switcher.component.ts","webpack:///./src/app/main/modules/foundation/_routes/rv-lite/application/_services/cameraApplicationRequestService.ts","webpack:///./src/app/main/modules/foundation/_components/device-summary/device-summary.component.ts","webpack:///./src/app/main/modules/foundation/_components/diagnostics4G/commission4gCheck/commission-4g-check.component.ts","webpack:///./src/app/main/modules/foundation/_components/notesAuditList/notes-audit-list.component.ts","webpack:///./src/app/main/modules/foundation/_components/foundation-csv-importer/foundation-csv-importer.component.ts","webpack:///./src/app/main/modules/foundation/_routes/commissions/commission-detail/commission-detail.component.ts","webpack:///./src/app/main/modules/foundation/_routes/commissions/commission-list.component.ts","webpack:///./src/app/main/modules/foundation/_routes/commissions/commissionEditor/commission-editor.component.ts","webpack:///./src/app/main/modules/foundation/_routes/commissions/commissionEditor/components/add-vehicle/add-vehicle.component.ts","webpack:///./src/app/main/modules/foundation/_services/engineer-job-booking-mapping.service.ts","webpack:///./src/app/main/modules/foundation/_services/notes.service.ajs.ts","webpack:///./src/app/main/modules/foundation/_routes/customers/customer-subscriptions-page/customer-subscriptions-page.component.ts","webpack:///./src/app/main/modules/foundation/_routes/customers/customer-subscriptions/customer-subscriptions.component.ts","webpack:///./src/app/main/modules/foundation/_enums/AccountSubscriptionType.ts","webpack:///./src/app/main/modules/foundation/_routes/customers/customerEdit/customer-edit.component.ts","webpack:///./src/app/main/modules/foundation/_routes/customers/customerOverview/customer-overview.component.ts","webpack:///./src/app/main/modules/foundation/_routes/customers/customers.component.ts","webpack:///./src/app/main/modules/foundation/_routes/customers/customerView/customer-view.component.ts","webpack:///./src/app/main/modules/foundation/_routes/customers/userList/user-list.component.ts","webpack:///./src/app/main/modules/foundation/_routes/developerConsole/developer-console.component.ts","webpack:///./src/app/main/modules/foundation/_routes/device-health/components/device-health-accounts/device-health-accounts.component.ts","webpack:///./src/app/main/modules/foundation/_routes/device-health/helpers/device-health-record-helper.ts","webpack:///./src/app/main/modules/foundation/_routes/device-health/components/device-health-vehicle-view/device-health-vehicle-view.component.ts","webpack:///./src/app/main/modules/foundation/_routes/device-health/components/device-health/device-health.component.ts","webpack:///./src/app/main/modules/foundation/_routes/engineer-commission-history/engineer-commission-history-list.component.ts","webpack:///./src/app/main/modules/foundation/_routes/jobs/job-completion/job-completion.component.ts","webpack:///./src/app/main/modules/foundation/_routes/jobs/job-list.component.ts","webpack:///./src/app/main/modules/foundation/_routes/jobs/job-editor/job-editor.component.ts","webpack:///./src/app/main/modules/foundation/_routes/visit-failure-form/visit-failure-form.component.ts","webpack:///./src/app/main/modules/foundation/_enums/VisitFailureReason.ts","webpack:///./src/app/main/modules/foundation/_services/visit-failure.service.ts","webpack:///./src/app/main/modules/foundation/_routes/engineer-job-items/engineer-job-item-list.component.ts","webpack:///./src/app/main/modules/foundation/_routes/engineer-users/engineer-users-list.component.ts","webpack:///./src/app/main/modules/cameras/camera.module.ts","webpack:///./src/app/main/components/videos/requestVideo/request-video-form/request-video-form.component.ts","webpack:///./src/app/main/components/videos/requestVideo/requestVideo.service.ts","webpack:///./src/app/main/components/videos/requestVideo/requestVideoActivityChart/request-video-activity-chart.component.ts","webpack:///./src/app/main/components/videos/services/camera-footage-timeline.service.ts","webpack:///./src/app/main/components/videos/video-channel-selector/video-channel-selector.component.ts","webpack:///./src/app/main/modules/cameras/_components/camera-signal-strength/camera-signal-strength.component.ts","webpack:///./src/app/main/modules/cameras/_components/download-quality-selector/download-quality-selector.component.ts","webpack:///./src/app/main/modules/cameras/_components/video-download-list/video-download-list.component.ts","webpack:///./src/app/main/modules/cameras/_components/video-entry/video-entry.component.ts","webpack:///./src/app/main/modules/cameras/_components/video-event-list/video-event-list.component.ts","webpack:///./src/app/main/components/videos/services/video-event-code.service.ts","webpack:///./src/app/main/modules/cameras/_components/video-list/video-list.component.ts","webpack:///./src/app/main/components/videos/services/video-review.service.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/_services/camera-events.service.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/camera-logs/camera-logs.component.ts","webpack:///./src/app/main/modules/foundation/_services/video.service.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/camera-view/camera-view.component.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/peripheral-list/peripheral-list.component.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/peripheral-view/peripheral-view.component.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/sim/sim-list/sim-list.component.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/units/unit-list/unit-list.component.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/units/unit-logs/unit-logs.component.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/units/unit-logs/unit-log.service.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/units/unit-view/unit-view.component.ts","webpack:///./src/app/main/modules/foundation/_routes/release-notes/release-notes.component.ts","webpack:///./src/app/main/modules/foundation/_routes/rv-lite/camera-config/camera-configuration.component.ts","webpack:///./src/app/main/modules/foundation/_routes/rv-lite/config/_components/config-manager/config-manager.component.ts","webpack:///./src/app/main/modules/foundation/_routes/rv-lite/rv-lite.component.ts","webpack:///./src/app/main/modules/foundation/_routes/vehicles/vehicle-list.component.ts","webpack:///./src/app/main/modules/foundation/_routes/vehicles/vehicleView/vehicle-view.component.ts","webpack:///./src/app/main/modules/foundation/_routes/visit-failures/visit-failures.component.ts","webpack:///./src/app/main/modules/foundation/_services/user.service.ajs.ts","webpack:///./src/app/main/components/reports/_components/report-card/report-card.component.ts","webpack:///./src/app/main/components/reports/_components/report-category-selector/report-category-selector.component.ts","webpack:///./src/app/main/components/reports/_components/report-column-headers-selector/report-column-headers-selector.component.ts","webpack:///./src/app/main/components/reports/enums/ChartDefinition.ts","webpack:///./src/app/main/components/reports/_components/report-internationalisation-options/report-internationalisation-options.component.ts","webpack:///./src/app/main/components/reports/_components/report-schedule-editor/report-schedule-editor.component.ts","webpack:///./src/app/main/components/reports/_components/row-data-source-selector2/row-data-source-selector2.component.ts","webpack:///./src/app/main/components/reports/enums/ReportRunProgressState.enum.ts","webpack:///./src/app/main/components/reports/_routes/report-history-view/report-history-view.component.ts","webpack:///./src/app/main/components/reports/_routes/report-list-page/report-list-page.component.ts","webpack:///./src/app/main/components/reports/_routes/report-schedule-page/report-schedule-page.component.ts","webpack:///./src/app/main/components/reports/_routes/report-view/report-view.component.ts","webpack:///./src/app/main/modules/temperature/temperature.module.ts","webpack:///./src/app/main/modules/temperature/_components/reefer-detail/reefer-detail.component.ts","webpack:///./src/app/main/modules/temperature/_components/reefer-list/reefer-list.component.ts","webpack:///./src/app/main/modules/temperature/_components/tempGraph/temperature-graph.component.ts","webpack:///./src/app/main/modules/temperature/_enums/temperature/TemperatureProfileMaterialisationOptions.enum.ts","webpack:///./src/app/main/modules/temperature/_components/compliance/input-list/input-list.component.ts","webpack:///./src/app/main/modules/temperature/_components/compliance/probe-detail/probe-detail.component.ts","webpack:///./src/app/main/modules/temperature/_components/compliance/temperature-log/temperature-log.component.ts","webpack:///./src/app/main/modules/temperature/_components/compliance/temperature-compliance/temperature-compliance.component.ts","webpack:///./src/app/main/navigation/site-search/site-search.component.ts","webpack:///./src/app/main/modules/alerts/components/alert-detail/alert-detail.component.ts","webpack:///./src/app/main/modules/alerts/components/alert-detail/axle-weight-alert-detail/axle-weight-alert-detail.component.ts","webpack:///./src/app/main/modules/alerts/components/alert-detail/input-alert-detail/input-alert-detail.component.ts","webpack:///./src/app/main/modules/alerts/components/alert-detail/power-loss-alert-detail/power-loss-alert-detail.component.ts","webpack:///./src/app/main/modules/alerts/components/alert-detail/temperature-alert-detail/temperature-alert-detail.service.ts","webpack:///./src/app/main/modules/temperature/_services/temperature-profile.service.ts","webpack:///./src/app/main/modules/alerts/components/alert-detail/toll-alert-detail/toll-alert-detail.component.ts","webpack:///./src/app/main/modules/alerts/components/alert-detail/tyre-record-alert-detail/tyre-record-alert-detail.component.ts","webpack:///./src/app/main/modules/alerts/components/alert-detail/vehicle-diagnostic-detail/vehicle-diagnostic-alert-detail.component.ts","webpack:///./src/app/main/modules/alerts/components/alert-detail/video-alert-detail/video-alert-detail.component.ts","webpack:///./src/app/main/modules/alerts/components/alert-review-dialog/alert-review-dialog.component.ts","webpack:///./src/app/main/modules/alerts/components/alert-review-history/alert-review-history.component.ts","webpack:///./src/app/main/modules/alerts/components/resolution-code-editor/resolution-code-editor.component.ts","webpack:///./src/app/main/components/diagnostics/permissions/user-access-tester/user-access-tester.component.ts","webpack:///./src/app/main/components/livemap/components/videoRestriction.component.ts","webpack:///./src/app/main/components/livemap/temperature-row.component.ts","webpack:///./src/app/main/components/insights/depot-compliance/depot-compliance.component.ts","webpack:///./src/app/main/components/insights/driver-behaviour/driver-behaviour-stack/driver-behaviour-stack.component.ts","webpack:///./src/app/main/components/insights/driver-behaviour/driver-score-graph/driver-score-graph.component.ts","webpack:///./src/app/main/components/insights/vehicleUtilisation/vehicle-utilisation.component.ts","webpack:///./src/app/main/components/nps/nps-dashboard/nps-dashboard.component.ts","webpack:///./src/app/main/components/nps/nps-gauge-horizontal/nps-gauge-horizontal.component.ts","webpack:///./src/app/main/components/maintenance/faultCodes/_components/fault-code-vehicle-history/fault-code-vehicle-history.component.ts","webpack:///./src/app/main/components/maintenance/faultCodes/_components/fault-codes/fault-codes.component.ts","webpack:///./src/app/main/components/maintenance/sensorData/_components/sensor-data-history/sensor-data-history.component.ts","webpack:///./src/app/main/components/maintenance/sensorData/_components/sensor-data/sensor-data.component.ts","webpack:///./src/app/main/components/tacho/tacho-compliance-page/tacho-compliance-page.component.ts","webpack:///./src/app/main/modules/fleet/_routes/vehicles/vehicles.component.ts","webpack:///./src/app/main/modules/help/_routes/contact-page/contact-page.component.ts","webpack:///./src/app/main/components/resourceManagement/geofences/geofenceEditor/delivery-profile/delivery-profile-edit.component.ts","webpack:///./src/app/main/components/resourceManagement/geofences/geofenceEditor/delivery-profile/delivery-profile-view.component.ts","webpack:///./src/app/main/components/planning/optimiser.service.ts","webpack:///./src/app/main/modules/tms/_components/pva-bar-chart/pva-bar-chart.component.ts","webpack:///./src/app/main/modules/tms/_components/pva-bar-chart/pva-chart-legend.component.ts","webpack:///./src/app/main/modules/tms/_models/IPlannedRoute.ts","webpack:///./src/app/main/modules/tms/_routes/activeRoutes/active-route-visit/active-route-visit.component.ts","webpack:///./src/app/main/modules/tms/_routes/activeRoutes/active-routes.component.ts","webpack:///./src/app/main/modules/tms/_routes/history/notes/notes.component.ts","webpack:///./src/app/main/modules/tms/_routes/route-performance/route-performance.component.ts","webpack:///./src/app/main/modules/tms/_routes/scheduling/_components/schedule-import/schedule-import.component.ts","webpack:///./src/app/main/modules/tms/_routes/visit-performance/ahead-behind/ahead-behind.component.ts","webpack:///./src/app/main/modules/tms/_routes/visit-performance/visit-performance.component.ts","webpack:///./src/app/main/modules/tms/_services/planned-route-audit.service.ts","webpack:///./src/app/main/modules/tms/_services/planned-route-map.service.ts","webpack:///./src/app/main/modules/tms/_services/planned-route-note.service.ts","webpack:///./src/app/main/modules/tms/_services/planned-route-visit.service.ts","webpack:///./src/app/main/modules/tms/_enums/VisitMatchOptions.ts","webpack:///./src/app/main/modules/tms/_components/close-route/close-route-reason.component.ts","webpack:///./src/app/main/modules/tms/_routes/history/tms-history.component.ts","webpack:///./src/app/directives/_map/veriMap/veriMapHeatMap/veriMapHeatMap.html","webpack:///./src/app/directives/_map/veriMap/veriMapPlotHistory/veriMapPlotHistory.html","webpack:///./src/app/directives/_vehicle/vehicleList/vehicleList.component.ts","webpack:///./src/app/main/components/csvImporter/interfaces/IImportAdapterResult.ts","webpack:///./src/app/services/accelerometerRecord.service.ts","webpack:///./src/app/main/components/maintenance/tpms/tpms.service.ts","webpack:///./src/app/main/components/csvImporter/csvImporter.component.ts","webpack:///./src/app/main/components/csvImporter/geofenceImporter/geofenceImporter.dialog.html","webpack:///./src/app/main/components/csvImporter/routeImporter/csvRouteImporter.component.ts","webpack:///./src/app/main/components/planning/interfaces/ITMSJob.ts","webpack:///./src/app/main/components/csvImporter/routeImporter/csvRouteImporter.dialog.html","webpack:///./src/app/main/components/planning/routeExport/tmsRouteExport.dialog.html","webpack:///./src/app/main/components/planning/routePlanner/alternativeRoutes.dialog.html","webpack:///./src/app/main/components/resourceManagement/geofences/geofences.module.ts","webpack:///./src/app/services/highcharts.service.ts","webpack:///./src/app/main/modules/foundation/foundation.module.ajs.ts","webpack:///./src/app/main/components/messaging/service/messaging.service.ts","webpack:///./src/app/main/components/messaging/groupMessage.controller.ts","webpack:///./src/app/main/components/messaging/models/conversation.ts","webpack:///./src/app/enum/NotificationRecipientType.ts","webpack:///./src/app/enum/NotificationRecordStatus.ts","webpack:///./src/app/main.ts","webpack:///./src/app/common/common.ts","webpack:///./src/app/bootstrap.ts","webpack:///./src/app/directives/directives.module.ts","webpack:///./src/app/directives/_map/v-map/v-map/v-map.component.html","webpack:///./src/app/interfaces/ISensorData.ts","webpack:///./src/app/directives/_map/veriMap/veriMapCurrentJourney/veriMapCurrentJourney.html","webpack:///./src/app/directives/_map/veriMap/veriMapContainer/veri-map-container.component.ts","webpack:///./src/app/directives/_map/veriMap/veriMapJourneysNew/veriMapJourneysNew.component.html","webpack:///./src/app/directives/_map/veriMap/veriMapSingleGeofence/v-map-single-geofence.component.ts","webpack:///./src/app/_pipes/enum-names.pipe.ts","webpack:///./src/app/_pipes/location.pipe.ts","webpack:///./src/app/_pipes/date.pipe.ts","webpack:///./src/app/_pipes/enum-as-string.pipe.ts","webpack:///./src/app/_pipes/format-number.pipe.ts","webpack:///./src/app/_pipes/order-by-prop.pipe.ts","webpack:///./src/app/_pipes/ordinal-suffix.pipe.ts","webpack:///./src/app/_pipes/phone-number.pipe.ts","webpack:///./src/app/_pipes/relative-time.pipe.ts","webpack:///./src/app/_pipes/split-pascal-case.ts","webpack:///./src/app/_pipes/time.pipe.ts","webpack:///./src/app/_pipes/unit-conversion.pipe.ts","webpack:///./src/app/_pipes/with-loading.pipe.ts","webpack:///./src/app/directives/splash-screen/splash-screen.component.html","webpack:///./src/app/directives/unauthorized-view/unauthorized-view.component.html","webpack:///./src/app/directives/_core/v-nav-bar/v-nav-item/v-nav-item.component.html","webpack:///./src/app/directives/_core/v-nav-bar/v-nav-bar.component.html","webpack:///./src/app/directives/_core/bind-css-variable/bind-css-variable.directive.ts","webpack:///./src/app/directives/_core/scroll-shadow/scroll-shadow.directive.ts","webpack:///./src/app/directives/_core/v-button/v-button.component.html","webpack:///./src/app/directives/_core/v-dropdown/v-button-dropdown/v-button-dropdown.component.html","webpack:///./src/app/animations/anim-dropdown.animations.ts","webpack:///./src/app/directives/_core/v-dropdown/v-dropdown.component.html","webpack:///./src/app/directives/_core/v-dropdown/v-item-dropdown/v-item-dropdown.component.html","webpack:///./src/app/directives/_core/v-tiles/v-tiles.component.ts","webpack:///./src/app/directives/_core/v-tiles/v-tiles.component.html","webpack:///./src/app/directives/_core/v-tiles/v-tile.component.ts","webpack:///./src/app/directives/_core/v-tiles/v-tile.component.html","webpack:///./src/app/directives/_forms/autofocus/autofocus.directive.ts","webpack:///./src/app/animations/slide.animations.ts","webpack:///./src/app/directives/_forms/v-toggle/v-toggle.component.html","webpack:///./src/app/directives/_forms/v-flag-toggle/v-flag-toggle.component.html","webpack:///./src/app/directives/_forms/v-flag-toggle-list-item/v-flag-toggle-list-item.component.html","webpack:///./src/app/directives/_forms/v-input/v-input.component.html","webpack:///./src/app/directives/_forms/v-toggle-list-item/v-toggle-list-item.component.html","webpack:///./src/app/directives/_misc/delayedHover.directive.ts","webpack:///./src/app/directives/_misc/multiStepIndicator/multiStepIndicator.component.html","webpack:///./src/app/directives/_misc/tooltip/tooltip.directive.ts","webpack:///./src/app/directives/_misc/trailer/trailer.component.ts","webpack:///./src/app/directives/_misc/trailer/trailer.component.html","webpack:///./src/app/directives/_misc/v-progress-bar/v-progress-bar.component.html","webpack:///./src/app/main/components/account/account.html","webpack:///./src/app/userPreferences/userpreferences.mobile.html","webpack:///./src/app/directives/_misc/accountSwitcher/accountSwitcher.component.html","webpack:///./src/app/directives/_misc/async-observable/async-observable.component.html","webpack:///./src/app/directives/_misc/batteryIndicator/batteryIndicator.component.html","webpack:///./src/app/directives/_misc/breadcrumbs/breadcrumbs.html","webpack:///./src/app/directives/_misc/countTo.directive.ts","webpack:///./src/app/directives/_misc/day-of-week-picker/day-of-week-picker.component.html","webpack:///./src/app/directives/_misc/driver-name/driver-name.component.html","webpack:///./src/app/directives/_misc/driverImage/driverImage.html","webpack:///./src/app/directives/_misc/flvPlayer/flv-player.component.html","webpack:///./src/app/directives/_misc/fullScreenButton/fullScreenButton.html","webpack:///./src/app/directives/_misc/hide-in-production/hide-in-production.directive.ts","webpack:///./src/app/directives/_misc/highlight-text/highlight-text.component.ts","webpack:///./src/app/directives/_misc/if-enabled.directive.ts","webpack:///./src/app/services/class/AccountOption.ts","webpack:///./src/app/directives/_map/geofences/geofenceoverlay.ts","webpack:///./src/app/directives/_misc/location-information/location-information.component.html","webpack:///./src/app/directives/_misc/recently-selected/recently-selected.component.ts","webpack:///./src/app/directives/_misc/video-download-status/video-download-status.component.html","webpack:///./src/app/directives/_vehicle/vehicleReg/vehicleReg.component.html","webpack:///./src/app/directives/_layout/v-table/_components/cells/checkbox-cell/checkbox-cell.component.html","webpack:///./src/app/directives/_layout/v-table/_components/cells/percentage-bar/percentage-bar-cell.component.html","webpack:///./src/app/directives/_layout/v-table/_components/cells/rag-cell/rag-cell.component.html","webpack:///./src/app/directives/_layout/v-table/_components/cells/stacked-date/date-cell.component.html","webpack:///./src/app/directives/_layout/v-table/_components/cells/status-cell/status-cell.component.html","webpack:///./src/app/directives/_layout/v-table/_components/cells/header/v-table-header.component.html","webpack:///./src/app/directives/_layout/v-table/_components/v-table.component.html","webpack:///./src/app/directives/_misc/recently-selected/recently-selected.component.html","webpack:///./src/app/directives/_misc/site-status-indicator/site-status-indicator.component.html","webpack:///./src/app/directives/_misc/temperatureReading/temperatureReading.html","webpack:///./src/app/directives/_misc/trendArrow/trendArrow.html","webpack:///./src/app/directives/_misc/vehicle-online-status-indicator/vehicle-online-status.component.html","webpack:///./src/app/directives/_misc/vertical-collapsable-divider/vertical-collapsable-divider.component.html","webpack:///./src/app/directives/_translations/languageSelector/languageSelector.component.html","webpack:///./src/app/directives/_translations/translate/translate.directive.ts","webpack:///./src/app/styles/animations/zoom-in-out.anim.ts","webpack:///./src/app/directives/_forms/checkbox/checkbox.component.html","webpack:///./src/app/directives/_forms/control-errors/control-errors.component.ts","webpack:///./src/app/directives/_forms/control-errors/control-errors.component.html","webpack:///./src/app/directives/_forms/fileUpload/fileUpload.html","webpack:///./src/app/directives/_forms/formDetails/formDetails.component.html","webpack:///./src/app/directives/_forms/input-mask/v-input-mask.directive.ts","webpack:///./src/app/directives/_forms/textarea/textarea.component.html","webpack:///./src/app/directives/_forms/v-autocomplete/v-autocomplete.component.html","webpack:///./src/app/directives/_forms/v-autocomplete/v-driver-autocomplete/v-driver-autocomplete.component.ts","webpack:///./src/app/directives/_forms/v-autocomplete/v-driver-autocomplete/v-driver-autocomplete.component.html","webpack:///./src/app/directives/_forms/v-autocomplete/v-vehicle-autocomplete/v-vehicle-autocomplete.component.ts","webpack:///./src/app/directives/_forms/v-autocomplete/v-vehicle-autocomplete/v-vehicle-autocomplete.component.html","webpack:///./src/app/directives/_forms/v-order-buttons/v-order-buttons.component.html","webpack:///./src/app/directives/_forms/v-select/v-select-option/v-select-option.component.html","webpack:///./src/app/directives/_forms/v-slider/v-slider.component.html","webpack:///./src/app/directives/_forms/v-time-picker/v-time-picker.component.ts","webpack:///./src/app/directives/_forms/v-time-picker/v-time-picker.component.html","webpack:///./src/app/directives/_forms/v-radio-button/v-radio-button.component.html","webpack:///./src/app/directives/_forms/smsInput/sms-input.service.ts","webpack:///./src/app/directives/_forms/smsInput/sms-input.component.html","webpack:///./src/app/directives/_forms/smsInput/phone-input.directive.ts","webpack:///./src/app/directives/_forms/_radio-buttons/radio-button-base/radio-button-base.component.html","webpack:///./src/app/directives/_forms/_radio-buttons/radio-button-cards/radio-button-cards.component.html","webpack:///./src/app/directives/_forms/_radio-buttons/radio-button-small-cards/radio-button-small-cards.component.html","webpack:///./src/app/directives/_forms/v-autocomplete/v-geofence-autocomplete/v-geofence-autocomplete.component.ts","webpack:///./src/app/directives/_forms/v-autocomplete/v-geofence-autocomplete/v-geofence-autocomplete.component.html","webpack:///./src/app/directives/_forms/v-select/v-select-input/v-select-input.component.ts","webpack:///./src/app/directives/_forms/v-select/v-select-input/v-select-input.component.html","webpack:///./src/app/directives/_forms/v-autocomplete/v-places-autocomplete/v-places-autocomplete.component.ts","webpack:///./src/app/directives/_forms/v-autocomplete/v-places-autocomplete/v-places-autocomplete.component.html","webpack:///./src/app/directives/_layout/_page-design/route-breadcrumbs/route-breadcrumbs.component.html","webpack:///./src/app/directives/_veri/export sync ^\\.\\/.*\\/.*\\.dialog\\.html$","webpack:///./src/app/directives/_veri/export/eventsExport/eventsExport.dialog.html","webpack:///./src/app/directives/_veri/export/journeysExport/journeysExport.dialog.html","webpack:///./src/app/directives/_veri/export/plotsExport/plotsExport.dialog.html","webpack:///./src/app/directives/_layout/v-dialog/v-dialog.component.html","webpack:///./src/app/directives/_resourceFilters/filter-bar/filter-bar.component.html","webpack:///./src/app/directives/_veri/export/export.service.ts","webpack:///./src/app/main/components/reports/_services/dynamic-reports.service.ts","webpack:///./src/app/directives/_veri/export/v-export-button/v-export-button.component.html","webpack:///./src/app/directives/_veri/v-list/v-list.component.html","webpack:///./src/app/directives/_veri/v-timeline/v-timeline.component.html","webpack:///./src/app/directives/_veri/veriPills/veriPills.component.html","webpack:///./src/app/main/components/videos/enums/video-label-icon.ts","webpack:///./src/app/main/components/videos/models/camera-event-thresholds.ts","webpack:///./src/app/directives/_veri/veriVideo/v-stream-collection/v-stream-collection.component.html","webpack:///./src/app/directives/_vehicle/VehicleVideoStream/v-vehicle-video-stream.component.html","webpack:///./src/app/directives/_veri/dashboard/dashboardBoxSmall.component.html","webpack:///./src/app/directives/_veri/v-calendar/v-calendar.component.html","webpack:///./src/app/directives/_veri/v-time-filters/v-time-filters.component.html","webpack:///./src/app/directives/_veri/v-date-selector/v-date-selector.component.html","webpack:///./src/app/directives/_veri/v-descriptive-list-item/v-descriptive-list-item.component.html","webpack:///./src/app/directives/_veri/v-pills/v-pills.component.html","webpack:///./src/app/directives/_veri/v-tags/tag-selector/tag-selector.component.ts","webpack:///./src/app/directives/_veri/v-tags/tag-selector/tag-selector.component.html","webpack:///./src/app/directives/_veri/v-tags/v-tags.component.html","webpack:///./src/app/directives/_veri/veriBadge/veriBadge.html","webpack:///./src/app/directives/_veri/veriCard/veriCard.component.html","webpack:///./src/app/directives/_veri/veriColourPicker/veriColourPicker.html","webpack:///./src/app/directives/_veri/veriInfoPanel/veriInfoPanel.component.html","webpack:///./src/app/directives/_veri/veriNumberField/veriNumberField.component.html","webpack:///./src/app/directives/_veri/veriTable/veriTable.html","webpack:///./src/app/directives/_layout/_page-design/page-actions/page-actions.component.html","webpack:///./src/app/directives/_layout/_page-design/_layouts/default-layout/default-layout.component.html","webpack:///./src/app/directives/_veri/veriSearchBox/veriSearchBox.template.html","webpack:///./src/app/directives/_veri/veriSimpleNav/veriSimpleNav.html","webpack:///./src/app/directives/_veri/veriTable/veriTableContainer/veriTableContainer.html","webpack:///./src/app/directives/_veri/veriTable/veriTableSummary/veriTableSummary.component.html","webpack:///./src/app/directives/_veri/veriVideo/v-video.component.html","webpack:///./src/app/directives/_veri/veriVideo/v-video-collection/v-video-collection.component.html","webpack:///./src/app/directives/_veri/veriVideo/videoControls/video-controls.component.html","webpack:///./src/app/directives/_veri/veriVideo/videoProgress/video-progress.component.html","webpack:///./src/app/directives/_veri/veriVideoThumbnails/veriVideoThumbnails.component.html","webpack:///./src/app/directives/_layout/accordian/accordian-entry/accordian-entry.component.ts","webpack:///./src/app/directives/_layout/accordian/accordian.component.html","webpack:///./src/app/directives/_layout/accordian/accordian-entry/accordian-entry.component.html","webpack:///./src/app/directives/_layout/empty-state/empty-state.component.html","webpack:///./src/app/directives/_layout/max-parent-width/max-parent-width.directive.ts","webpack:///./src/app/directives/_layout/max-window-breakpoint/max-window-breakpoint.directive.ts","webpack:///./src/app/directives/_layout/min-parent-width/min-parent-width.directive.ts","webpack:///./src/app/directives/_layout/min-window-breakpoint/min-window-breakpoint.directive.ts","webpack:///./src/app/directives/_layout/resourceGroupDisplay/resourceGroupDisplay.html","webpack:///./src/app/directives/_layout/revealingColumns/revealingColumns.html","webpack:///./src/app/directives/_layout/v-tabs/v-tabs.component.html","webpack:///./src/app/directives/_layout/v-tabs/v-tab.component.html","webpack:///./src/app/directives/_layout/veri-panel/veri-panel.component.html","webpack:///./src/app/directives/_layout/_page-design/detail-page/detail-page.component.html","webpack:///./src/app/directives/_layout/_page-design/page-title/page-title.component.html","webpack:///./src/app/directives/_layout/_page-design/page-title-pill/page-title-pill.component.html","webpack:///./src/app/styles/animations/slide-from-left.animation.ts","webpack:///./src/app/directives/_layout/_page-design/sidebar/sidebar.component.html","webpack:///./src/app/directives/_layout/_page-design/_layouts/horizontal-layout/horizontal-layout.component.html","webpack:///./src/app/directives/_layout/_page-design/_layouts/vertical-layout/vertical-layout.component.html","webpack:///./src/app/directives/_layout/_page-design/_layouts/vertical-map-layout/vertical-map-layout.component.html","webpack:///./src/app/directives/_resourceFilters/driver-list/driver-list.component.ts","webpack:///./src/app/directives/_resourceFilters/driver-list/driver-list.component.html","webpack:///./src/app/directives/_resourceFilters/filter-bar/date-button-filter/date-button-filter.component.html","webpack:///./src/app/directives/_resourceFilters/filter-bar/driver-button-filter/driver-button-filter.component.html","webpack:///./src/app/directives/_resourceFilters/filter-bar/item-filter/item-filter.component.html","webpack:///./src/app/directives/_resourceFilters/filter-bar/resource-type-button-filter/vehicle-type-button-filter.component.ts","webpack:///./src/app/directives/_resourceFilters/filter-bar/resource-type-button-filter/vehicle-type-button-filter.component.html","webpack:///./src/app/directives/_resourceFilters/filter-bar/tag-button-filter/tag-button-filter.component.ts","webpack:///./src/app/directives/_resourceFilters/filter-bar/tag-button-filter/tag-button-filter.component.html","webpack:///./src/app/directives/_resourceFilters/vertical-filter-list/vertical-filter-list.component.html","webpack:///./src/app/directives/_vehicle/driverSummaryPanel/driverSummaryPanel.component.html","webpack:///./src/app/directives/_vehicle/vehicle-button-filter/vehicle-button-filter.component.html","webpack:///./src/app/directives/_vehicle/vehicle-list/vehicle-list.component.ts","webpack:///./src/app/directives/_vehicle/vehicle-list/vehicle-list.component.html","webpack:///./src/app/directives/_vehicle/vehicle-status/vehicle-status.service.ts","webpack:///./src/app/directives/_vehicle/vehicle-status/vehicle-status.component.html","webpack:///./src/app/directives/_vehicle/vehicleInfoCard/vehicleInfoCard.component.html","webpack:///./src/app/directives/_vehicle/vehiclePlotTime/vehiclePlotTime.component.html","webpack:///./src/app/main/modules/foundation/foundation.module.ts","webpack:///./src/app/directives/_layout/v-table/_components/cells/stacked-cell/stacked-cell.component.html","webpack:///./src/app/directives/_layout/v-table/_components/cells/v-table-cell.component.html","webpack:///./src/app/directives/_layout/v-table/_components/v-table-actions/v-table-actions.component.html","webpack:///./src/app/directives/_layout/v-table/_components/v-table-column-editor/v-table-column-editor.component.ts","webpack:///./src/app/directives/_layout/v-table/_components/v-table-column-editor/v-table-column-editor.component.html","webpack:///./src/app/directives/_layout/v-table/_components/v-table-layout-container/v-table-layout-container.component.html","webpack:///./src/app/directives/_layout/v-table/_components/visualisations/table-summary-box/table-summary-box.component.html","webpack:///./src/app/directives/_visualisations/activeRangeBarChart/active-range-bar-chart.component.html","webpack:///./src/app/main/components/resourceManagement/account-settings/account-settings-manager.component.html","webpack:///./src/app/main/components/resourceManagement/account-settings/account-settings-save-warning/account-settings-save-warning.component.html","webpack:///./src/app/main/components/resourceManagement/cameras/camera-channels-editor/auto-download-configuration/auto-download-configuration.component.html","webpack:///./src/app/main/components/resourceManagement/cameras/camera-channels-editor/auto-download-configuration/editor/auto-download-configuration-editor.component.html","webpack:///./src/app/main/components/resourceManagement/cameras/camera-vehicles-manager/camera-vehicles-manager.component.html","webpack:///./src/app/main/components/resourceManagement/cameras/camera-channels-editor/camera-channels-editor.component.html","webpack:///./src/app/main/components/resourceManagement/cameras/camera-channels-editor/channel-thumbnail/channel-thumbnail.component.html","webpack:///./src/app/main/components/resourceManagement/contextual-speeding-settings-manager/contextual-speeding-by-road/contextual-speeding-by-road.component.html","webpack:///./src/app/main/components/resourceManagement/contextual-speeding-settings-manager/contextual-speeding-by-vehicle/contextual-speeding-by-vehicle.component.html","webpack:///./src/app/main/components/resourceManagement/contextual-speeding-settings-manager/contextual-speeding-road-editor/contextual-speeding-road-editor.component.html","webpack:///./src/app/main/components/resourceManagement/contextual-speeding-settings-manager/enums/contextual-speeding-tab.ts","webpack:///./src/app/main/components/resourceManagement/contextual-speeding-settings-manager/contextual-speeding-settings-manager.component.html","webpack:///./src/app/main/components/resourceManagement/contextual-speeding-settings-manager/contextual-speeding-vehicle-editor/speeding-examples-calculator.ts","webpack:///./src/app/main/components/resourceManagement/contextual-speeding-settings-manager/contextual-speeding-vehicle-editor/contextual-speeding-vehicle-editor.component.html","webpack:///./src/app/main/components/resourceManagement/device-profiles-manager/device-profile-comparison-status-label/device-profile-comparison-status-label.component.html","webpack:///./src/app/main/components/resourceManagement/device-profiles-manager/device-profile-editor/device-profile-editor.component.html","webpack:///./src/app/main/components/resourceManagement/device-profiles-manager/device-profile-vehicle-preview/device-profile-vehicle-preview.component.html","webpack:///./src/app/main/components/resourceManagement/device-profiles-manager/device-profile-vehicle-view/device-profile-vehicle-view.component.html","webpack:///./src/app/main/components/resourceManagement/device-profiles-manager/device-profiles-manager.component.html","webpack:///./src/app/main/components/resourceManagement/driving-styles-manager/driving-style-associations-manager/driving-style-associations-manager.component.html","webpack:///./src/app/main/components/resourceManagement/driving-styles-manager/driving-style-metric-editor/driving-style-metric-editor.component.html","webpack:///./src/app/main/components/resourceManagement/driving-styles-manager/driving-style-metric-selector/driving-style-metric-selector.component.html","webpack:///./src/app/main/components/resourceManagement/driving-styles-manager/driving-style-editor/driving-style-editor.component.html","webpack:///./src/app/main/components/resourceManagement/driving-styles-manager/driving-style-metric-weighting-label/driving-style-metric-weighting-label.component.html","webpack:///./src/app/main/components/resourceManagement/driving-styles-manager/driving-style-vehicle-preview/driving-style-vehicle-preview.component.html","webpack:///./src/app/main/components/resourceManagement/driving-styles-manager/driving-styles-manager.component.html","webpack:///./src/app/directives/_resourceFilters/filter-bar/group-button-filter/group-button-filter.component.html","webpack:///./src/app/directives/_veri/group-autocomplete/group-autocomplete.component.html","webpack:///./src/app/main/components/resourceManagement/groups/group-editor/group-details/group-details.component.html","webpack:///./src/app/main/components/resourceManagement/groups/group-editor/group-editor.component.html","webpack:///./src/app/main/components/resourceManagement/groups/group-editor/group-resources/group-resources.component.ts","webpack:///./src/app/main/components/resourceManagement/groups/group-editor/group-resources/group-resources.component.html","webpack:///./src/app/main/components/resourceManagement/groups/group-hierarchy/group-hierarchy.component.html","webpack:///./src/app/main/components/resourceManagement/groups/groups-list/groups-list.component.html","webpack:///./src/app/main/components/resourceManagement/users/saml-configuration/saml-configuration.component.html","webpack:///./src/app/services/users/user.service.ts","webpack:///./src/app/main/components/resourceManagement/users/userEditor/user-editor.service.ts","webpack:///./src/app/services/login.service.ts","webpack:///./src/app/main/components/resourceManagement/users/userEditor/user-editor.component.html","webpack:///./src/app/main/modules/temperature/_enums/temperature/ZoneCreationSource.enum.ts","webpack:///./src/app/main/components/resourceManagement/vehicles/temperatureProbes/temperature-zones-edit/temperature-zones-edit.component.html","webpack:///./src/app/main/modules/foundation/_routes/streamax-configs/streamax-configs.module.ts","webpack:///./src/app/main/modules/foundation/_routes/streamax-configs/account-list/streamax-configs-percentage-bar.service.ts","webpack:///./src/app/main/modules/foundation/_routes/streamax-configs/account-list/streamax-configs-account-list.component.html","webpack:///./src/app/main/modules/foundation/_routes/streamax-configs/custom-trigger-metrics/custom-trigger-metrics.component.html","webpack:///./src/app/main/modules/foundation/_routes/streamax-configs/profiles/streamax-config-profile-editor.component.ts","webpack:///./src/app/main/modules/foundation/_routes/streamax-configs/profiles/streamax-config-profile-editor.component.html","webpack:///./src/app/main/modules/foundation/_routes/streamax-configs/streamax-configs-account-view.component.html","webpack:///./src/app/main/modules/foundation/_routes/streamax-configs/streamax-configs-device-list/streamax-configs-device-list.component.ts","webpack:///./src/app/main/modules/foundation/_routes/streamax-configs/streamax-configs-device-list/streamax-configs-device-list.component.html","webpack:///./src/app/main/modules/foundation/_routes/streamax-configs/streamax-configs-vehicle-summary/streamax-configs-vehicle-summary.component.ts","webpack:///./src/app/main/modules/foundation/_routes/streamax-configs/streamax-configs-vehicle-summary/streamax-configs-vehicle-summary.component.html","webpack:///./src/app/main/components/reports/models/IDrivingStyleMetricScore.ts","webpack:///./src/app/main/modules/foundation/_components/customer-name/customer-name.component.html","webpack:///./src/app/main/modules/foundation/_components/foundation-notes-list/foundation-notes-list.component.html","webpack:///./src/app/main/modules/foundation/_components/simStatusInfo/simStatusInfo.component.html","webpack:///./src/app/main/modules/foundation/_routes/hardware/sim/sim-data/sim-data.component.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/sim/sim-data/sim-data.component.html","webpack:///./src/app/main/modules/foundation/_routes/hardware/sim/sim-status/sim-status.component.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/sim/sim-status/sim-status.component.html","webpack:///./src/app/main/modules/foundation/_components/barcode-scanner/barcode-scanner-livestream.config.ts","webpack:///./src/app/main/modules/foundation/_components/barcode-scanner/barcode-types.ts","webpack:///./src/app/main/modules/foundation/_components/barcode-scanner/barcode-scanner-livestream.component.html","webpack:///./src/app/main/modules/foundation/_components/barcode-scanner/barcode-scanner.component.html","webpack:///./src/app/enum/deviceMessage/DeviceCommunicationMethod.ts","webpack:///./src/app/enum/deviceMessage/DeviceMessageStatus.ts","webpack:///./src/app/main/modules/foundation/_components/commandSender/commandSender.component.html","webpack:///./src/app/main/modules/foundation/_components/commissionCheck/commission-check.component.ts","webpack:///./src/app/main/modules/foundation/_components/commissionCheck/commission-check.component.html","webpack:///./src/app/main/modules/foundation/_components/configSwitcher/config-switcher.component.html","webpack:///./src/app/main/modules/foundation/_components/device-install-validator/device-install-validator.component.ts","webpack:///./src/app/main/modules/foundation/_components/device-install-validator/device-install-validator.component.html","webpack:///./src/app/main/modules/foundation/_components/device-summary/device-summary.component.html","webpack:///./src/app/main/modules/foundation/_components/device-validation-summary/device-validation-summary.component.ts","webpack:///./src/app/main/modules/foundation/_components/device-validation-summary/device-validation-summary.component.html","webpack:///./src/app/main/modules/foundation/_components/diagnostics4G/commission4gCheck/commission-4g-check.component.html","webpack:///./src/app/main/modules/foundation/_components/diagnostics4G/diagnostics-4g.component.html","webpack:///./src/app/main/modules/foundation/_components/notesAuditList/notes-audit-list.component.html","webpack:///./src/app/main/modules/foundation/_components/reseller-name/reseller-name.component.ts","webpack:///./src/app/main/modules/foundation/_components/reseller-name/reseller-name.component.html","webpack:///./src/app/main/modules/foundation/_components/validation-check-container/validation-check-container.component.ts","webpack:///./src/app/main/modules/foundation/_components/validation-check-container/validation-check-container.component.html","webpack:///./src/app/main/modules/foundation/_services/foundation-csv-importer.service.ts","webpack:///./src/app/main/modules/foundation/_enums/ErrorType.ts","webpack:///./src/app/main/modules/foundation/_components/foundation-csv-importer/foundation-csv-importer.component.html","webpack:///./src/app/main/modules/foundation/_components/manual-test-container/manual-test-container.component.ts","webpack:///./src/app/main/modules/foundation/_components/manual-test-container/manual-test-container.component.html","webpack:///./src/app/main/modules/foundation/_enums/UnitLocations.ts","webpack:///./src/app/main/modules/foundation/_routes/commissions/commissionEditor/components/deviceInstallEditor/device-install-editor.component.html","webpack:///./src/app/main/modules/foundation/_routes/commissions/commission-detail/commission-detail.component.html","webpack:///./src/app/main/modules/foundation/_routes/commissions/commission-detail/commission-summary/commission-summary.component.ts","webpack:///./src/app/main/modules/foundation/_routes/commissions/commission-detail/commission-summary/commission-summary.component.html","webpack:///./src/app/services/login-history.service.ts","webpack:///./src/app/main/modules/foundation/_routes/commissions/commission-list.component.html","webpack:///./src/app/main/modules/foundation/_routes/commissions/commissionEditor/commission-editor.component.html","webpack:///./src/app/main/modules/foundation/_routes/commissions/commissionEditor/components/add-vehicle/add-vehicle.component.html","webpack:///./src/app/main/modules/foundation/_routes/commissions/commissionEditor/components/new-commission-detail/new-commission-detail.component.ts","webpack:///./src/app/main/modules/foundation/_routes/commissions/commissionEditor/components/new-commission-detail/new-commission-detail.component.html","webpack:///./src/app/main/modules/foundation/_routes/customers/customer-subscriptions-page/customer-subscriptions-page.component.html","webpack:///./src/app/main/modules/foundation/_services/customer-subscriptions.service.ts","webpack:///./src/app/main/modules/foundation/_routes/customers/customer-subscriptions/customer-subscriptions.component.html","webpack:///./src/app/services/accounts/preferences.service.ts","webpack:///./src/app/main/modules/foundation/_routes/customers/customerEdit/customer-edit.component.html","webpack:///./src/app/main/modules/foundation/_routes/customers/customerOverview/customer-overview.component.html","webpack:///./src/app/enum/account/AccountSector.ts","webpack:///./src/app/enum/account/AccountFleetType.ts","webpack:///./src/app/main/modules/foundation/_routes/customers/customers.component.html","webpack:///./src/app/main/modules/foundation/_routes/customers/customerView/customer-view.component.html","webpack:///./src/app/main/modules/foundation/_routes/customers/userList/user-list.component.html","webpack:///./src/app/main/modules/foundation/_routes/developerConsole/log-level.enum.ts","webpack:///./src/app/main/modules/foundation/_routes/developerConsole/developer-console.component.html","webpack:///./src/app/main/modules/foundation/_routes/device-health/device-health-account.service.ts","webpack:///./src/app/main/modules/foundation/_routes/device-health/models/device-health-records-by-vehicle.ts","webpack:///./src/app/main/modules/foundation/_routes/device-health/components/device-health-accounts/device-health-accounts.component.html","webpack:///./src/app/main/modules/foundation/_routes/device-health/enums/sd-card-error-type.ts","webpack:///./src/app/main/modules/foundation/_routes/device-health/components/device-health-vehicle-view/device-health-vehicle-view.component.html","webpack:///./src/app/main/modules/foundation/_routes/device-health/components/device-health-vehicles/device-health-vehicles.component.html","webpack:///./src/app/main/modules/foundation/_routes/device-health/components/device-health/device-health.component.html","webpack:///./src/app/main/modules/foundation/_routes/engineer-commission-history/engineer-commission-history-list.component.html","webpack:///./src/app/main/modules/foundation/_routes/engineer-job-items/engineer-job-item-list.module.ts","webpack:///./src/app/main/modules/foundation/_routes/jobs/job-list.component.html","webpack:///./src/app/main/modules/foundation/_routes/jobs/job-editor/job-editor.component.html","webpack:///./src/app/main/modules/foundation/_routes/jobs/job-details/job-details.component.html","webpack:///./src/app/main/modules/foundation/_routes/jobs/job-item-editor/job-item-editor.component.ts","webpack:///./src/app/main/modules/foundation/_routes/jobs/job-item-editor/job-item-editor.component.html","webpack:///./src/app/main/modules/foundation/_routes/jobs/job-item-list/job-item-list.component.ts","webpack:///./src/app/main/modules/foundation/_routes/jobs/job-item-list/job-item-list.component.html","webpack:///./src/app/main/modules/foundation/_routes/jobs/engineer-select/engineer-select.component.ts","webpack:///./src/app/main/modules/foundation/_routes/jobs/engineer-select/engineer-select.component.html","webpack:///./src/app/main/modules/foundation/_routes/visit-failure-form/visit-failure-form.component.html","webpack:///./src/app/main/modules/foundation/_routes/engineer-job-items/engineer-job-item-list.component.html","webpack:///./src/app/main/modules/foundation/_routes/engineer-users/engineer-editor/engineer-editor.component.ts","webpack:///./src/app/main/modules/foundation/_routes/engineer-users/engineer-editor/engineer-editor.component.html","webpack:///./src/app/main/modules/foundation/_routes/engineer-users/engineer-users-list.component.html","webpack:///./src/app/main/modules/foundation/_routes/hardware/hardware.module.ts","webpack:///./src/app/main/components/videos/requestVideo/request-video-form/request-video-form.component.html","webpack:///./src/app/main/components/videos/requestVideo/requestVideoActivityChart/request-video-activity-chart.component.html","webpack:///./src/app/main/components/videos/video-channel-selector/video-channel-selector.component.html","webpack:///./src/app/main/components/videos/videoToast.html","webpack:///./src/app/main/modules/cameras/_components/camera-signal-strength/camera-signal-strength.component.html","webpack:///./src/app/main/modules/cameras/_components/download-quality-selector/download-quality-selector.component.html","webpack:///./src/app/main/modules/cameras/_components/video-address/video-address.component.html","webpack:///./src/app/main/modules/cameras/_components/video-download-progress/video-download-progress.component.html","webpack:///./src/app/main/modules/cameras/_components/video-driver-assignment/video-driver-assignment.component.html","webpack:///./src/app/main/modules/cameras/_components/video-download-list/video-download-list.component.html","webpack:///./src/app/main/modules/cameras/_components/video-entry/video-entry.component.html","webpack:///./src/app/main/components/videos/utils/video-event-code-groups.ts","webpack:///./src/app/main/modules/cameras/_components/video-event-list/video-event-list.component.html","webpack:///./src/app/main/modules/cameras/_components/video-list/video-list.component.html","webpack:///./src/app/main/modules/cameras/_components/video-request-status/video-request-status.component.ts","webpack:///./src/app/main/modules/cameras/_components/video-request-status/video-request-status.component.html","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/p100-device-details/p100-device-details.component.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/_enums/CameraDiagnosticRecordType.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/p100-device-details/p100-device-details.component.html","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/streamax-device-details/streamax-device-details.component.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/streamax-device-details/streamax-device-details.component.html","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/camera-events/camera-events.component.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/camera-events/camera-events.component.html","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/camera-logs/camera-logs.service.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/camera-logs/camera-logs.component.html","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/camera-videos/camera-videos-view/camera-video-view.component.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/camera-videos/camera-videos-view/camera-video-view.component.html","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/camera-videos/camera-videos.component.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/camera-videos/camera-videos.component.html","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/camera-view/camera-view.component.html","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/gps-detail/gps-detail.component.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/gps-detail/gps-detail.component.html","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/peripheral-device-details/peripheral-device-details.component.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/peripheral-device-details/peripheral-device-details.component.html","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/peripheral-list/peripheral-list.component.html","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/peripheral-view/peripheral-view.component.html","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/pulse/pulse-message-detail/pulse-message-detail.component.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/pulse/pulse-message-detail/pulse-message-detail.component.html","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/pulse/pulse-messages.component.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/pulse/pulse-messages.component.html","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/pulse/pulse-response/pulse-response.component.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/peripherals/pulse/pulse-response/pulse-response.component.html","webpack:///./src/app/main/modules/foundation/_routes/hardware/sim/sim-detail/sim-detail.component.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/sim/sim-detail/sim-detail.component.html","webpack:///./src/app/main/modules/foundation/_routes/hardware/sim/sim-list/sim-list.component.html","webpack:///./src/app/main/modules/foundation/_routes/hardware/sim/sim-unit-summary/sim-unit-summary.component.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/sim/sim-unit-summary/sim-unit-summary.component.html","webpack:///./src/app/main/modules/foundation/_routes/hardware/units/unit-list/unit-list.component.html","webpack:///./src/app/main/modules/foundation/_routes/hardware/units/unit-logs/unit-logs.component.html","webpack:///./src/app/main/modules/foundation/_routes/hardware/units/unit-view/unit-overview/unit-overview.component.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/units/unit-view/unit-overview/unit-overview.component.html","webpack:///./src/app/main/modules/foundation/_routes/hardware/units/unit-view/unit-plots/unit-plots.component.ts","webpack:///./src/app/main/modules/foundation/_routes/hardware/units/unit-view/unit-plots/unit-plots.component.html","webpack:///./src/app/main/modules/foundation/_routes/hardware/units/unit-view/unit-view.component.html","webpack:///./src/app/main/modules/foundation/_routes/release-notes/release-notes.component.html","webpack:///./src/app/main/modules/foundation/_routes/rv-lite/rv-lite.module.ts","webpack:///./src/app/main/modules/foundation/_routes/rv-lite/commserver-migration/commserver-migration.component.ts","webpack:///./src/app/main/modules/foundation/_routes/rv-lite/commserver-migration/commserver-migration.component.html","webpack:///./src/app/main/modules/foundation/_routes/rv-lite/application/_components/application-editor/application-editor.component.ts","webpack:///./src/app/main/modules/foundation/_routes/rv-lite/application/_components/application-editor/application-editor.component.html","webpack:///./src/app/main/modules/foundation/_routes/rv-lite/application/_components/application-manager/application-manager.component.html","webpack:///./src/app/main/modules/foundation/_routes/rv-lite/camera-config/camera-configuration.component.html","webpack:///./src/app/main/modules/foundation/_routes/rv-lite/config/_components/config-editor/config-editor.component.ts","webpack:///./src/app/main/modules/foundation/_routes/rv-lite/config/_components/config-editor/config-editor.component.html","webpack:///./src/app/main/modules/foundation/_routes/rv-lite/config/_components/config-manager/config-manager.component.html","webpack:///./src/app/main/modules/foundation/_routes/rv-lite/rv-lite.component.html","webpack:///./src/app/main/modules/foundation/_routes/vehicles/vehicle-list.component.html","webpack:///./src/app/main/modules/foundation/_routes/vehicles/vehicleView/vehicle-view.component.html","webpack:///./src/app/main/modules/foundation/_routes/visit-failures/visit-failures.component.html","webpack:///./src/app/main/components/reports/reports.module.ts","webpack:///./src/app/main/components/reports/_components/report-card/report-card.component.html","webpack:///./src/app/main/components/reports/_components/report-category-selector/report-category-selector.html","webpack:///./src/app/main/components/reports/_components/report-column-headers-selector/report-column-headers-selector.component.html","webpack:///./src/app/main/components/reports/_components/report-editor/report-editor.component.ts","webpack:///./src/app/main/components/reports/_components/report-editor/report-editor.component.html","webpack:///./src/app/enum/DurationFormat.enum.ts","webpack:///./src/app/main/components/reports/_components/report-internationalisation-options/report-internationalisation-options.component.html","webpack:///./src/app/main/components/reports/_components/report-parameters/report-parameters.component.html","webpack:///./src/app/main/components/reports/_components/report-filters/report-filters.component.html","webpack:///./src/app/main/components/reports/_components/report-schedule-editor/report-schedule-editor.component.html","webpack:///./src/app/main/components/reports/_components/report-schedules/report-schedules.component.html","webpack:///./src/app/main/components/reports/_components/row-data-source-selector2/row-data-source-selector2.component.html","webpack:///./src/app/main/components/reports/_routes/report-history-page/report-parameter-mappings.ts","webpack:///./src/app/enum/RoadType.enum.ts","webpack:///./src/app/main/components/reports/_routes/report-history-page/report-history-page.component.html","webpack:///./src/app/main/components/reports/_routes/report-history-view/report-history-view.component.html","webpack:///./src/app/main/components/reports/_routes/report-list-page/report-list-page.component.html","webpack:///./src/app/main/components/reports/_routes/report-schedule-page/report-schedule-page.component.html","webpack:///./src/app/main/components/reports/_routes/report-view/report-view.component.html","webpack:///./src/app/main/modules/temperature/_enums/reefer/ReeferEngineSpeedModeCategory.enum.ts","webpack:///./src/app/main/modules/temperature/_enums/reefer/ReeferInterfaceStatusCategory.enum.ts","webpack:///./src/app/main/modules/temperature/_models/troubleCodes/IReeferTroubleCodeHistory.ts","webpack:///./src/app/main/modules/temperature/_components/reefer-detail/reefer-detail.component.html","webpack:///./src/app/main/modules/temperature/_components/zone/zoneOperatingModeWidget/zone-operating-mode-widget.component.html","webpack:///./src/app/main/modules/temperature/_components/reefer-list/reefer-list.component.html","webpack:///./src/app/main/modules/temperature/_components/temperature-source-data/temperature-source-data.component.ts","webpack:///./src/app/main/modules/temperature/_components/temperature-source-data/temperature-source-data.component.html","webpack:///./src/app/main/modules/temperature/_components/temperature-trend/temperature-trend.component.ts","webpack:///./src/app/main/modules/temperature/_components/temperature-trend/temperature-trend.component.html","webpack:///./src/app/main/modules/temperature/_components/tempGraph/temperature-graph.component.html","webpack:///./src/app/main/modules/temperature/_components/compliance/input-list/input-list.component.html","webpack:///./src/app/main/modules/temperature/_components/compliance/probe-detail/probe-detail.component.html","webpack:///./src/app/main/modules/temperature/_components/compliance/stacked-probe-reading/stacked-probe-reading.component.html","webpack:///./src/app/main/modules/temperature/_components/compliance/temperature-compliance-detail/temperature-compliance-detail.component.ts","webpack:///./src/app/main/modules/temperature/_components/compliance/temperature-log/temperature-log.component.html","webpack:///./src/app/main/modules/temperature/_components/compliance/temperature-compliance-detail/temperature-compliance-detail.component.html","webpack:///./src/app/main/modules/temperature/_components/compliance/temperature-compliance/temperature-compliance.component.html","webpack:///./src/app/main/modules/temperature/_components/reefer-error-list/reefer-error-list.component.ts","webpack:///./src/app/main/modules/temperature/_components/reefer-error-list/reefer-error-list.component.html","webpack:///./src/app/main/modules/temperature/_components/zone/zone-detail-page/zone-detail-page.component.ts","webpack:///./src/app/main/modules/temperature/_components/zone/zone-detail-page/zone-detail-page.component.html","webpack:///./src/app/main/modules/temperature/_components/zone/zone-overview-page/zone-overview-page.component.ts","webpack:///./src/app/main/modules/temperature/_components/zone/zone-overview-page/zone-overview-page.component.html","webpack:///./src/app/main/modules/temperature/_components/zone/zone-setpoint/zone-setpoint.component.ts","webpack:///./src/app/main/modules/temperature/_components/zone/zone-setpoint/zone-setpoint.component.html","webpack:///./src/app/main/modules/temperature/_components/zone/zone-summary-view/zone-summary-view.component.ts","webpack:///./src/app/main/modules/temperature/_components/zone/zone-summary-view/zone-summary-view.component.html","webpack:///./src/app/main/modules/temperature/_components/zone/zone-temperature/zone-temperature.component.ts","webpack:///./src/app/main/modules/temperature/_components/zone/zoned-temperature-detail/zoned-temperature-detail.component.ts","webpack:///./src/app/main/modules/temperature/_components/zone/zoned-temperature-detail/zoned-temperature-detail.component.html","webpack:///./src/app/main/navigation/site-search/site-search.component.html","webpack:///./src/app/main/modules/alerts/alerts.module.ts","webpack:///./src/app/main/modules/alerts/components/alert-category/alert-category.component.html","webpack:///./src/app/main/modules/alerts/components/alert-detail/alert-detail.component.html","webpack:///./src/app/interfaces/IAxleWeightOutOfBoundsHistory.ts","webpack:///./src/app/main/modules/alerts/components/alert-detail/axle-weight-alert-detail/axle-weight-alert-detail.component.html","webpack:///./src/app/main/modules/alerts/components/alert-detail/geofence-alert-detail/geofence-alert-detail.component.html","webpack:///./src/app/main/modules/alerts/components/alert-detail/input-alert-detail/input-alert-detail.component.html","webpack:///./src/app/main/modules/alerts/components/alert-detail/power-loss-alert-detail/power-loss-alert-detail.component.html","webpack:///./src/app/main/modules/alerts/components/alert-detail/temperature-alert-detail/temperature-alert-detail.component.html","webpack:///./src/app/main/modules/alerts/components/alert-detail/toll-alert-detail/toll-alert-detail.component.html","webpack:///./src/app/main/modules/alerts/components/alert-detail/tyre-record-alert-detail/tyre-record-alert-detail.component.html","webpack:///./src/app/main/modules/alerts/components/alert-detail/vehicle-diagnostic-detail/vehicle-diagnostic-alert-detail.component.html","webpack:///./src/app/main/modules/alerts/components/alert-detail/video-alert-detail/video-alert-detail.component.html","webpack:///./src/app/main/modules/alerts/components/alert-review-dialog/alert-review-dialog.component.html","webpack:///./src/app/main/modules/alerts/components/alert-detail/alert-detail.service.ts","webpack:///./src/app/main/modules/alerts/components/alert-review-history/alert-review-history.component.html","webpack:///./src/app/main/modules/alerts/components/resolution-code-editor/resolution-code-editor.component.html","webpack:///./src/app/authInterceptor.ts","webpack:///./src/app/main/components/components.modules.ts","webpack:///./src/app/main/components/diagnostics/diagnostics.module.ts","webpack:///./src/app/main/components/diagnostics/permissions/user-access-tester/user-access-tester.component.html","webpack:///./src/app/main/components/livemap/livemap.module.ts","webpack:///./src/app/main/components/livemap/temperature-row.component.html","webpack:///./src/app/main/components/insights/insights.module.ts","webpack:///./src/app/main/components/insights/depot-compliance/depot-compliance.component.html","webpack:///./src/app/main/components/insights/driver-behaviour/driver-behaviour-comparison.component.html","webpack:///./src/app/main/components/insights/driver-behaviour/driver-behaviour-stack/driver-behaviour-stack.component.html","webpack:///./src/app/main/components/insights/driver-behaviour/driver-score-graph/driver-score-graph.component.html","webpack:///./src/app/main/components/insights/vehicleUtilisation/vehicle-utilisation.component.html","webpack:///./src/app/main/components/nps/nps.module.ts","webpack:///./src/app/main/components/nps/nps-rater.component.html","webpack:///./src/app/main/components/nps/nps-gauge-horizontal/nps-gauge-horizontal.component.html","webpack:///./src/app/main/components/nps/nps-dashboard/nps-dashboard.component.html","webpack:///./src/app/main/components/maintenance/maintenance.module.ts","webpack:///./src/app/main/components/maintenance/faultCodes/_components/fault-code-vehicle-history/fault-code-vehicle-history.component.html","webpack:///./src/app/main/components/maintenance/faultCodes/_components/fault-codes/fault-codes.component.html","webpack:///./src/app/main/components/maintenance/sensorData/_components/sensor-data-history/sensor-data-history.component.html","webpack:///./src/app/main/components/maintenance/sensorData/_components/sensor-data/sensor-data.component.html","webpack:///./src/app/main/components/tacho/_tacho.module.ts","webpack:///./src/app/main/components/tacho/tacho-compliance-page/tacho-compliance-page.component.html","webpack:///./src/app/main/modules/fleet/fleet.module.ts","webpack:///./src/app/main/modules/fleet/_routes/vehicles/vehicles.component.html","webpack:///./src/app/main/modules/help/help.module.ts","webpack:///./src/app/main/modules/help/_routes/contact-page/contact-page.component.html","webpack:///./src/app/main/modules/tms/tms.module.ts","webpack:///./src/app/main/components/resourceManagement/geofences/geofenceEditor/delivery-profile/delivery-profile-edit.component.html","webpack:///./src/app/main/components/resourceManagement/geofences/geofenceEditor/delivery-profile/delivery-profile-view.component.html","webpack:///./src/app/main/modules/tms/_components/pva-bar-chart/pva-bar-chart.component.html","webpack:///./src/app/main/modules/tms/_components/pva-bar-chart/pva-chart-legend.component.html","webpack:///./src/app/main/modules/tms/_components/route-performance-bar/route-performance-bar.component.html","webpack:///./src/app/main/modules/tms/_routes/activeRoutes/active-route-progress/active-route-progress.component.html","webpack:///./src/app/main/modules/tms/_routes/activeRoutes/active-route-visit/active-route-visit.component.html","webpack:///./src/app/main/modules/tms/_routes/activeRoutes/active-routes.animations.ts","webpack:///./src/app/main/modules/tms/_routes/activeRoutes/active-routes.component.html","webpack:///./src/app/main/modules/tms/_routes/history/notes/notes.component.html","webpack:///./src/app/main/modules/tms/_routes/route-performance/route-performance.component.html","webpack:///./src/app/main/modules/tms/_routes/scheduling/_components/schedule-import/schedule-import.component.html","webpack:///./src/app/main/modules/tms/_routes/visit-performance/ahead-behind/ahead-behind.component.html","webpack:///./src/app/main/modules/tms/_routes/visit-performance/visit-performance.component.html","webpack:///./src/app/main/modules/tms/_enums/RouteEndCondition.ts","webpack:///./src/app/main/modules/tms/_enums/RouteStartCondition.ts","webpack:///./src/app/main/modules/tms/_enums/PlannedRouteClosureReason.ts","webpack:///./src/app/main/modules/tms/_components/close-route/close-route-reason.component.html","webpack:///./src/app/main/modules/tms/_routes/history/tms-history.component.html","webpack:///./src/app/request.interceptor.ts","webpack:///./src/app/directives/directives.module.ajs.ts","webpack:///./src/app/directives/_core/_core.directives.module.ajs.ts","webpack:///./src/app/directives/_forms/_form.directives.module.ajs.ts","webpack:///./src/app/directives/_forms/checkboxes/checkboxes.component.ts","webpack:///./src/app/directives/_forms/autocomplete/autocomplete.component.ts","webpack:///./src/app/directives/_forms/autocomplete/autocomplete.html","webpack:///./src/app/directives/_forms/autocomplete/autocompleteFocus.directive.ts","webpack:///./src/app/directives/_forms/compareTo.directive.ts","webpack:///./src/app/directives/_forms/fileDragDrop.directive.ts","webpack:///./src/app/directives/_forms/fileSelected.directive.ts","webpack:///./src/app/directives/_forms/validatePassword.directive.ts","webpack:///./src/app/directives/_forms/validationFunction.directive.ts","webpack:///./src/app/directives/_forms/validators/groupNameValidator.ts","webpack:///./src/app/directives/_forms/validators/reportNameValidator.ts","webpack:///./src/app/directives/_forms/validators/userEmail.ts","webpack:///./src/app/directives/_forms/verifyCurrentPassword.ts","webpack:///./src/app/directives/_layout/_layout.directives.module.ajs.ts","webpack:///./src/app/directives/_layout/timeline/timeline.component.ts","webpack:///./src/app/directives/_layout/timeline/timeline.html","webpack:///./src/app/directives/_layout/timeline/timelineEntry.component.ts","webpack:///./src/app/directives/_layout/timeline/timelineEntry.html","webpack:///./src/app/directives/_layout/v-table/v-table.directives.module.ajs.ts","webpack:///./src/app/directives/_map/_map.directives.module.ajs.ts","webpack:///./src/app/directives/_map/geofences/geoarea.directive.ts","webpack:///./src/app/directives/_map/geofences/GeoareaOverlay.ts","webpack:///./src/app/directives/_map/veriMap/veriMapHeatMap/veriMapHeatMap.component.ts","webpack:///./src/app/directives/_map/veriMap/veriMapJourneys/veriMapJourneys.component.ts","webpack:///./src/app/directives/_map/veriMap/veriMapJourneys/veriMapJourneys.html","webpack:///./src/app/directives/_map/veriMap/veriMapLocation/veriMapLocation.component.ts","webpack:///./src/app/directives/_map/veriMap/veriMapLocation/veriMapLocation.html","webpack:///./src/app/directives/_map/veriMap/veriMapVideoEvent/veriMapVideoEvent.component.ts","webpack:///./src/app/main/components/videos/enums/VideoPlaybackState.ts","webpack:///./src/app/directives/_map/veriMap/veriMapVideoEvent/veriMapVideoEvent.html","webpack:///./src/app/directives/_map/geofences/geofenceNavPoints/geofenceNavPoints.component.ts","webpack:///./src/app/directives/_map/geofences/geofenceNavPoints/geofenceNavPoints.component.html","webpack:///./src/app/directives/_map/geofences/geofences.directive.ts","webpack:///./src/app/directives/_map/veriMap/veriMapComponent/veriMap.html","webpack:///./src/app/directives/_map/geofences/geofenceShape/geofenceShape.component.ts","webpack:///./src/app/directives/_map/geofences/geofenceShape/geofenceShape.component.html","webpack:///./src/app/directives/_map/mapControls/mapControls.directive.ts","webpack:///./src/app/directives/_map/mapControls/mapControls.html","webpack:///./src/app/directives/_map/veriMap/veriMapAlternativeRoutes/veriMapAlternativeRoutes.component.ts","webpack:///./src/app/directives/_map/veriMap/veriMapAlternativeRoutes/veriMapAlternativeRoutes.html","webpack:///./src/app/directives/_map/veriMap/veriMapContainer/veriMapContainer.component.ts","webpack:///./src/app/directives/_map/veriMap/veriMapContainer/veriMapContainer.component.html","webpack:///./src/app/directives/_map/veriMap/veriMapPlot/veriMapPlot.component.ts","webpack:///./src/app/directives/_map/veriMap/veriMapPlot/veriMapPlot.html","webpack:///./src/app/directives/_map/veriMap/veriMapPlotHistory/veriMapPlotHistory.component.ts","webpack:///./src/app/directives/_map/veriMap/veriMapPopup/veriMapPopup.component.ts","webpack:///./src/app/directives/_map/veriMap/veriMapPopup/veriMapPopup.html","webpack:///./src/app/directives/_map/veriMap/veriMapRoute/veriMapRoute.component.ts","webpack:///./src/app/directives/_map/veriMap/veriMapRoute/veriMapRoute.html","webpack:///./src/app/directives/_map/veriMap/veriMapRouteOld/veriMapRoute.old.ts","webpack:///./src/app/directives/_map/veriMap/veriMapRouteOld/veriMapRoute.old.html","webpack:///./src/app/directives/_map/veriMap/veriMapSingleGeofence/veriMapSingleGeofence.component.ts","webpack:///./src/app/directives/_map/veriMap/veriMapSingleGeofence/veriMapSingleGeofence.html","webpack:///./src/app/directives/_map/veriMap/veriMapTMSAudit/veriMapTMSAudit.component.ts","webpack:///./src/app/directives/_map/veriMap/veriMapTMSAudit/veriMapTMSAudit.html","webpack:///./src/app/directives/_map/veriMap/veriMapVehicles/veriMapVehicles.component.ts","webpack:///./src/app/directives/_map/veriMap/veriMapVehicles/veriMapVehicles.html","webpack:///./src/app/directives/_misc/_misc.directives.module.ajs.ts","webpack:///./src/app/directives/_misc/backgroundImage.ts","webpack:///./src/app/directives/_misc/tooltip/tooltip.directive.ajs.ts","webpack:///./src/app/directives/_misc/convertToNumber.ts","webpack:///./src/app/directives/_misc/countTo.directive.ajs.ts","webpack:///./src/app/directives/_misc/delayCreation.directive.ts","webpack:///./src/app/directives/_misc/deleteConfirm/deleteConfirm.ts","webpack:///./src/app/directives/_misc/deleteConfirm/deleteConfirm.html","webpack:///./src/app/directives/_misc/driverUsername.ts","webpack:///./src/app/directives/_misc/hideInProduction/hideInProduction.ts","webpack:///./src/app/directives/_misc/hideOnIE/hideOnIE.ts","webpack:///./src/app/directives/_misc/ifEnabled.directive.ajs.ts","webpack:///./src/app/directives/_misc/ifUserInternal.directive.ts","webpack:///./src/app/directives/_misc/ifUserInternalOrFoundation.directive.ts","webpack:///./src/app/directives/_misc/ifUserNotInternal.directive.ts","webpack:///./src/app/directives/_misc/keyWordTrigger.directive.ts","webpack:///./src/app/directives/_misc/popup/popup.directive.ts","webpack:///./src/app/directives/_misc/printElement/printElement.directive.ts","webpack:///./src/app/directives/_misc/site-updated-indicator/site-updated-indicator.component.ts","webpack:///./src/app/directives/_misc/site-updated-indicator/site-updated-indicator.component.html","webpack:///./src/app/directives/_misc/snow/snow.component.ts","webpack:///./src/app/directives/_misc/timeAgo.component.ts","webpack:///./src/app/directives/_misc/veriDialog.controller.ts","webpack:///./src/app/directives/_mouse/_mouse.directives.module.ts","webpack:///./src/app/directives/_mouse/clickOut/clickOut.directive.ts","webpack:///./src/app/directives/_mouse/fastScroll.directive.ts","webpack:///./src/app/directives/_mouse/ngMouseWheelDown.directive.ts","webpack:///./src/app/directives/_mouse/ngMouseWheelUp.directive.ts","webpack:///./src/app/directives/_mouse/rightClick.directive.ts","webpack:///./src/app/directives/_mouse/scrollTo.directive.ts","webpack:///./src/app/directives/_mouse/scrollShadow.directive.ts","webpack:///./src/app/directives/_resourceFilters/_resourceFilters.directives.module.ajs.ts","webpack:///./src/app/directives/_resourceFilters/filters/combinedResourceFilter.component.ts","webpack:///./src/app/directives/_resourceFilters/filters/combinedResourceFilter.component.html","webpack:///./src/app/directives/_resourceFilters/filters/dateResourceFilter.component.ts","webpack:///./src/app/directives/_resourceFilters/filters/dateResourceFilter.html","webpack:///./src/app/directives/_resourceFilters/filters/driverResourceFilter.component.ts","webpack:///./src/app/directives/_resourceFilters/filters/driverResourceFilter.html","webpack:///./src/app/directives/_resourceFilters/filters/geofenceResourceFilter.component.ts","webpack:///./src/app/directives/_resourceFilters/filters/geofenceResourceFilter.html","webpack:///./src/app/directives/_resourceFilters/filters/groupResourceFilter.component.ts","webpack:///./src/app/directives/_resourceFilters/filters/groupResourceFilter.html","webpack:///./src/app/directives/_resourceFilters/filters/observationsResourceFilter.component.ts","webpack:///./src/app/directives/_resourceFilters/filters/observationsResourceFilter.html","webpack:///./src/app/directives/_resourceFilters/filters/tableColumnResourceFilter.component.ts","webpack:///./src/app/directives/_resourceFilters/filters/tableColumnResourceFilter.html","webpack:///./src/app/directives/_resourceFilters/filters/tagsResourceFilter.component.ts","webpack:///./src/app/directives/_resourceFilters/filters/tagsResourceFilter.html","webpack:///./src/app/directives/_resourceFilters/filters/vehicleResourceFilter.component.ts","webpack:///./src/app/directives/_resourceFilters/filters/vehicleResourceFilter.html","webpack:///./src/app/directives/_resourceFilters/newResourceFilterBar.component.ts","webpack:///./src/app/directives/_resourceFilters/newResourceFilterBar2.html","webpack:///./src/app/directives/_resourceFilters/newResourceFilterBar.html","webpack:///./src/app/directives/_resourceFilters/resourceFilterBarModal.component.ts","webpack:///./src/app/directives/_translations/_translations.directives.module.ajs.ts","webpack:///./src/app/directives/_translations/translate/translate.directive.ajs.ts","webpack:///./src/app/directives/_vehicle/_vehicle.directives.module.ajs.ts","webpack:///./src/app/directives/_vehicle/journeySummary/journeySummary.html","webpack:///./src/app/directives/_vehicle/vehicleList/vehicleList.html","webpack:///./src/app/directives/_veri/_veri.directives.module.ajs.ts","webpack:///./src/app/directives/calendar/veriCalendar.component.ts","webpack:///./src/app/directives/calendar/veriCalendar.html","webpack:///./src/app/directives/_veri/veriTab/routeTabs.component.ts","webpack:///./src/app/directives/_veri/veriTab/routeTabs.component.html","webpack:///./src/app/directives/_veri/downloadAsReport/downloadAsReport.component.ts","webpack:///./src/app/directives/_veri/downloadAsReport/downloadAsReport.html","webpack:///./src/app/directives/_veri/export/eventsExport/eventsExport.component.ts","webpack:///./src/app/directives/_veri/export/eventsExport/eventsExport.html","webpack:///./src/app/directives/_veri/export/journeysExport/journeysExport.component.ts","webpack:///./src/app/directives/_veri/export/journeysExport/journeysExport.html","webpack:///./src/app/directives/_veri/export/plotsExport/plotsExport.component.ts","webpack:///./src/app/directives/_veri/export/plotsExport/plotsExport.html","webpack:///./src/app/directives/_veri/externalReference/externalReference.component.ts","webpack:///./src/app/directives/_veri/externalReference/externalReferenceDialog/externalReferenceRecord.dialog.html","webpack:///./src/app/directives/_veri/externalReference/externalReference.maintenance.html","webpack:///./src/app/directives/_veri/externalReference/externalReference.service.ts","webpack:///./src/app/directives/_veri/externalReference/externalReferenceDialog/externalReferenceRecord.component.ts","webpack:///./src/app/directives/_veri/externalReference/externalReferenceDialog/externalReferenceRecord.html","webpack:///./src/app/directives/_veri/groupHierarchy/groupHierarchy.component.ts","webpack:///./src/app/directives/_veri/groupHierarchy/groupHierarchy.component.html","webpack:///./src/app/directives/_veri/groupHierarchy/groupSelector.component.ts","webpack:///./src/app/directives/_veri/groupHierarchy/groupSelector.html","webpack:///./src/app/directives/_veri/tags/tags.component.ts","webpack:///./src/app/main/components/resourceManagement/geofences/geofenceTagsEdit/geofenceTagsEdit.dialog.html","webpack:///./src/app/directives/_veri/tags/tags.html","webpack:///./src/app/directives/_veri/veriDateRange/veriDateRange.component.ts","webpack:///./src/app/directives/_veri/veriDateRange/veriDateRange.html","webpack:///./src/app/directives/_veri/veriInlineDatePicker/veriInlineDatePicker.component.ts","webpack:///./src/app/directives/_veri/veriInlineDatePicker/veriInlineDatePicker.html","webpack:///./src/app/directives/_veri/veriList/veriList.component.ts","webpack:///./src/app/directives/_veri/veriList/veriList.html","webpack:///./src/app/directives/_veri/veriPage/veriPage.component.ts","webpack:///./src/app/directives/_veri/veriPage/veriPage.html","webpack:///./src/app/directives/_veri/veriTab/veriTab.component.ts","webpack:///./src/app/directives/_veri/veriTab/veriTab.html","webpack:///./src/app/directives/_veri/veriTab/veriTabs.component.ts","webpack:///./src/app/directives/_veri/veriTab/veriVerticalTabs.html","webpack:///./src/app/directives/_veri/veriTab/veriTabs.html","webpack:///./src/app/directives/_veri/veriTable/drillDownReportTable/drillDownReportTable.component.ts","webpack:///./src/app/directives/_veri/veriTable/drillDownReportTable/drillDownReportTable.html","webpack:///./src/app/directives/_veri/veriTable/reportTable/reportTable.component.ts","webpack:///./src/app/directives/_veri/veriTable/reportTable/reportTable.html","webpack:///./src/app/directives/_veri/veriVideo/veriVideo.component.ts","webpack:///./src/app/directives/_veri/veriVideo/veriVideo.html","webpack:///./src/app/directives/_visualisations/visualisations.module.ajs.ts","webpack:///./src/app/directives/_visualisations/barChart/barChart.component.ts","webpack:///./src/app/directives/_visualisations/barChart/barChart.html","webpack:///./src/app/directives/_visualisations/ganttChart/ganttChart.component.ts","webpack:///./src/app/directives/_visualisations/ganttChart/ganttChart.html","webpack:///./src/app/directives/_visualisations/horizontalBarChart/horizontalBarChart.component.ts","webpack:///./src/app/directives/_visualisations/horizontalBarChart/horizontalBarChart.html","webpack:///./src/app/directives/_visualisations/listogram/listogram.component.ts","webpack:///./src/app/directives/_visualisations/listogram/listogram.html","webpack:///./src/app/directives/_visualisations/ragRangeBarChart/ragRangeBarChart.component.ts","webpack:///./src/app/directives/_visualisations/ragRangeBarChart/ragRangeBarChart.html","webpack:///./src/app/filters/filters.module.ts","webpack:///./src/app/filters/capitalise.ts","webpack:///./src/app/filters/degreesToCompassTerm.ts","webpack:///./src/app/filters/formatNumber.filter.ajs.ts","webpack:///./src/app/filters/minutesToDurationFilter.ts","webpack:///./src/app/filters/positive.filter.ts","webpack:///./src/app/filters/splitPascalCase.filter.ts","webpack:///./src/app/filters/splitPascalCaseCustom.filter.ts","webpack:///./src/app/filters/trustedHtml.filter.ts","webpack:///./src/app/filters/trustedSource.filter.ts","webpack:///./src/app/filters/minuteOfDayToTime.filter.ts","webpack:///./src/app/filters/translate.filter.ajs.ts","webpack:///./src/app/filters/markdown.filter.ts","webpack:///./src/app/filters/phoneNumber.filter.ajs.ts","webpack:///./src/app/filters/unitConversion.filter.ajs.ts","webpack:///./src/app/filters/veriDate.filter.ts","webpack:///./src/app/filters/geocode.filter.ts","webpack:///./src/app/index.config.ts","webpack:///./src/app/services/veriCacheInterceptor.service.ts","webpack:///./src/app/services/veriHttpInterceptor.service.ts","webpack:///./src/app/index.constants.ts","webpack:///./src/app/index.route.ts","webpack:///./src/app/layouts/mobile.html","webpack:///./src/app/layouts/default.html","webpack:///./src/app/index.run.ts","webpack:///./src/app/countWatchers.ts","webpack:///./src/app/main/components/components.modules.ajs.ts","webpack:///./src/app/main/components/account/account.module.ts","webpack:///./src/app/main/components/account/account.controller.ts","webpack:///./src/app/main/components/account/passwordEditor/passwordEditor.component.ts","webpack:///./src/app/main/components/account/passwordEditor/passwordEditor.component.html","webpack:///./src/app/main/components/companyImage/companyImage.module.ts","webpack:///./src/app/main/components/companyImage/companyImage.controller.ts","webpack:///./src/app/main/components/csvImporter/csvImporter.module.ts","webpack:///./src/app/main/components/csvImporter/adapters/paragonImportAdapter.service.ts","webpack:///./src/app/main/components/csvImporter/csvImporter.service.ts","webpack:///./src/app/main/components/csvImporter/geofenceImporter/geofenceImporter.service.ts","webpack:///./src/app/main/components/csvImporter/routeImporter/routeDataImporter.service.ts","webpack:///./src/app/main/components/dashboardV2/dashboard.module.ts","webpack:///./src/app/main/components/dashboardV2/dashboard.controller.ts","webpack:///./src/app/main/components/dashboardV2/dashboard/dashboard.component.ts","webpack:///./src/app/main/components/dashboardV2/dashboard/dashboard.html","webpack:///./src/app/main/components/dashboardV2/widgets/charts/chartWidget.component.ts","webpack:///./src/app/main/components/dashboardV2/widgets/charts/chartWidget.html","webpack:///./src/app/main/components/dashboardV2/widgets/charts/chartWidgetEditor.component.ts","webpack:///./src/app/main/components/dashboardV2/widgets/charts/chartWidgetEditor.html","webpack:///./src/app/main/components/dashboardV2/widgets/charts/gaugeWidget.component.ts","webpack:///./src/app/main/components/dashboardV2/widgets/charts/gaugeWidget.html","webpack:///./src/app/main/components/dashboardV2/widgets/metrics/metricWidget.component.ts","webpack:///./src/app/main/components/dashboardV2/widgets/metrics/metricWidget.html","webpack:///./src/app/main/components/dashboardV2/widgets/metrics/metricWidgetEditor.component.ts","webpack:///./src/app/main/components/dashboardV2/widgets/metrics/metricWidgetEditor.html","webpack:///./src/app/main/components/dashboardV2/widgets/other/clockWidget/clockWidget.component.ts","webpack:///./src/app/main/components/dashboardV2/widgets/other/clockWidget/clockWidget.html","webpack:///./src/app/main/components/dashboardV2/widgets/other/mapWidget/mapWidget.component.ts","webpack:///./src/app/main/components/dashboardV2/widgets/other/mapWidget/mapWidget.html","webpack:///./src/app/main/components/dashboardV2/widgets/other/mapWidget/mapWidgetEditor.component.ts","webpack:///./src/app/main/components/dashboardV2/widgets/other/mapWidget/mapWidgetEditor.component.html","webpack:///./src/app/main/components/dashboardV2/widgets/other/tableWidget/tableWidget.component.ts","webpack:///./src/app/main/components/dashboardV2/widgets/other/tableWidget/tableWidget.html","webpack:///./src/app/main/components/dashboardV2/widgets/other/tachoWarnings/tachoWarnings.component.ts","webpack:///./src/app/main/components/dashboardV2/widgets/other/tachoWarnings/tachoWarnings.html","webpack:///./src/app/main/components/dashboardV2/widgets/other/trafficIncidentsWidget/trafficIncidentsWidget.component.ts","webpack:///./src/app/main/components/dashboardV2/widgets/other/trafficIncidentsWidget/trafficIncidentsWidget.html","webpack:///./src/app/main/components/dashboardV2/widgets/other/utilisationHeatmap/utilisationHeatMap.component.ts","webpack:///./src/app/main/components/dashboardV2/widgets/other/utilisationHeatmap/utilisationHeatMap.html","webpack:///./src/app/main/components/dashboardV2/widgets/tms/tmsPVABar.component.ts","webpack:///./src/app/main/components/dashboardV2/widgets/tms/tmsPVABar.html","webpack:///./src/app/main/components/dashboardV2/widgets/widget.component.ts","webpack:///./src/app/main/components/dashboardV2/widgets/widget.html","webpack:///./src/app/main/components/dashboardV2/widgets/widget.service.ts","webpack:///./src/app/main/components/dashboardV2/widgets/widgetEditor.component.ts","webpack:///./src/app/main/components/dashboardV2/widgets/widgetEditor.html","webpack:///./src/app/main/components/dashboardV2/dashboard.html","webpack:///./src/app/main/components/diagnostics/diagnostics.module.ajs.ts","webpack:///./src/app/main/components/diagnostics/healthCheck/healthCheck.component.ts","webpack:///./src/app/main/components/diagnostics/healthCheck/healthCheck.component.html","webpack:///./src/app/main/components/diagnostics/diagnostics.controller.ts","webpack:///./src/app/main/components/diagnostics/diagnostics.service.ts","webpack:///./src/app/main/components/diagnostics/formBuilder/formBuilder.component.ts","webpack:///./src/app/main/components/diagnostics/formBuilder/formBuilder.html","webpack:///./src/app/main/components/diagnostics/formBuilder/formBuilder.service.ts","webpack:///./src/app/main/components/diagnostics/formBuilder/updateFormDetails/updateFormDetails.component.ts","webpack:///./src/app/main/components/diagnostics/formBuilder/updateFormDetails/updateFormDetails.html","webpack:///./src/app/main/components/diagnostics/videoDiagnostics/videoDiagnostics.component.ts","webpack:///./src/app/main/components/diagnostics/videoDiagnostics/videoDiagnostics.component.html","webpack:///./src/app/main/components/diagnostics/videoDiagnostics/videoDiagnostics.service.ts","webpack:///./src/app/main/components/diagnostics/diagnostics.html","webpack:///./src/app/main/components/drivers/drivers.module.ts","webpack:///./src/app/main/components/drivers/driverActivityGantt.component.ts","webpack:///./src/app/main/components/drivers/driverActivityGantt.html","webpack:///./src/app/main/components/drivers/drivers.controller.ts","webpack:///./src/app/main/components/drivers/driverScore.component.ts","webpack:///./src/app/main/components/drivers/driverScore.html","webpack:///./src/app/main/components/drivers/driversPage/driversPage.component.ts","webpack:///./src/app/main/components/drivers/driversPage/driversPage.component.html","webpack:///./src/app/main/components/drivers/driverView/driverView.component.ts","webpack:///./src/app/main/components/drivers/driverView/driverView.component.html","webpack:///./src/app/main/components/drivers/simpleBarChart.component.ts","webpack:///./src/app/main/components/drivers/simpleBarChart.html","webpack:///./src/app/main/components/drivers/drivers.html","webpack:///./src/app/main/components/fleetMaintenance/fleetMaintenance.module.ts","webpack:///./src/app/main/components/fleetMaintenance/fleetMaintenance.controller.ts","webpack:///./src/app/main/components/fleetMaintenance/fleetMaintenance.html","webpack:///./src/app/main/components/insights/insights.module.ajs.ts","webpack:///./src/app/main/components/insights/findNearest/findNearest.component.ts","webpack:///./src/app/main/components/insights/findNearest/findNearest.html","webpack:///./src/app/main/components/insights/fleetEvents/components/fleetEventBar/fleetEventBar.component.ts","webpack:///./src/app/main/components/insights/fleetEvents/components/fleetEventBar/fleetEventBar.component.html","webpack:///./src/app/main/components/insights/fleetEvents/components/fleetEventDetails/fleetEventDetails.component.ts","webpack:///./src/app/main/components/insights/fleetEvents/components/fleetEventDetails/fleetEventDetails.component.html","webpack:///./src/app/main/components/insights/fleetEvents/components/fleetEventListItem/fleetEventListItem.component.ts","webpack:///./src/app/main/components/insights/fleetEvents/components/fleetEventListItem/fleetEventListItem.component.html","webpack:///./src/app/main/components/insights/fleetEvents/fleetEvents.component.ts","webpack:///./src/app/main/components/insights/fleetEvents/fleetEvents.component.html","webpack:///./src/app/main/components/insights/fleetHistory/components/fleetHistoryJourneyScrubber/fleetHistoryJourneyScrubber.component.ts","webpack:///./src/app/main/components/insights/fleetHistory/components/fleetHistoryJourneyScrubber/fleetHistoryJourneyScrubber.component.html","webpack:///./src/app/main/components/insights/fleetHistory/components/fleetHistoryTimeRangeSelector/fleetHistoryTimeRangeSelector.component.ts","webpack:///./src/app/main/components/insights/fleetHistory/components/fleetHistoryTimeRangeSelector/fleetHistoryTimeRangeSelector.component.html","webpack:///./src/app/main/components/insights/fleetHistory/fleetHistory.component.ts","webpack:///./src/app/main/components/insights/fleetHistory/fleetHistory.component.html","webpack:///./src/app/main/components/insights/h3.service.ts","webpack:///./src/app/main/components/insights/isochrone.service.ts","webpack:///./src/app/main/components/livemap/livemap.module.ajs.ts","webpack:///./src/app/main/components/livemap/components/editOdometer.controller.ts","webpack:///./src/app/main/components/livemap/components/vehicleTimeline.component.ts","webpack:///./src/app/main/components/livemap/components/vehicleTimeline.html","webpack:///./src/app/main/components/livemap/driverTachoSummary.component.ts","webpack:///./src/app/main/components/livemap/driverTachoSummary.template.html","webpack:///./src/app/main/components/livemap/journeys/journeyGraph.component.ts","webpack:///./src/app/main/components/livemap/journeys/journeyGraph.html","webpack:///./src/app/main/components/livemap/livemap.controller.ts","webpack:///./src/app/main/components/livemap/nearest/nearestGeofences.component.ts","webpack:///./src/app/main/components/livemap/nearest/nearestGeofences.html","webpack:///./src/app/main/components/livemap/nearest/nearestVehicles.component.ts","webpack:///./src/app/main/components/livemap/nearest/nearestVehicles.html","webpack:///./src/app/main/components/livemap/plotInfoTable.component.ts","webpack:///./src/app/main/components/livemap/plotInfoTable.template.html","webpack:///./src/app/main/components/livemap/sideNav/vehicleHistory.component.ts","webpack:///./src/app/enum/PlotReasonFilter.ts","webpack:///./src/app/main/components/livemap/sideNav/vehicleHistory.html","webpack:///./src/app/main/components/livemap/streetview.directive.ts","webpack:///./src/app/main/components/livemap/vehicleDrivers.component.ts","webpack:///./src/app/main/components/livemap/vehicleDrivers.html","webpack:///./src/app/main/components/livemap/vehicleHistoryGanttChart.component.ts","webpack:///./src/app/main/components/livemap/vehicleHistoryGanttChart.html","webpack:///./src/app/main/components/livemap/vehicleSummaryStatistics.component.ts","webpack:///./src/app/main/components/livemap/vehicleSummaryStatistics.html","webpack:///./src/app/main/components/livemap/video/gForceGauge.component.ts","webpack:///./src/app/main/components/livemap/video/gForceGauge.template.html","webpack:///./src/app/main/components/livemap/livemap.html","webpack:///./src/app/main/components/mobile/vehiclemap.html","webpack:///./src/app/main/components/maintenance/maintenance.module.ajs.ts","webpack:///./src/app/main/components/maintenance/maintenance.controller.ts","webpack:///./src/app/main/components/maintenance/tpms/tpms.component.ts","webpack:///./src/app/main/components/maintenance/tpms/tpms.html","webpack:///./src/app/main/components/maintenance/tpms/tpmsList.component.ts","webpack:///./src/app/main/components/maintenance/tpms/tpmsList.html","webpack:///./src/app/main/components/maintenance/tpms/tpmsTyre.component.ts","webpack:///./src/app/main/components/maintenance/tpms/tpmsTyre.html","webpack:///./src/app/main/components/maintenance/tpms/tpmsWireframe.component.ts","webpack:///./src/app/main/components/maintenance/tpms/tpmsWireframe.html","webpack:///./src/app/main/components/maintenance/vor/vor.component.ts","webpack:///./src/app/main/components/maintenance/vor/vor.html","webpack:///./src/app/main/components/maintenance/maintenance.html","webpack:///./src/app/main/components/mobile/mobile.module.ts","webpack:///./src/app/main/components/mobile/vehiclemap.controller.ts","webpack:///./src/app/main/components/nps/nps.module.ajs.ts","webpack:///./src/app/main/components/planning/planning.module.ts","webpack:///./src/app/main/components/csvImporter/geofenceImporter/geofenceImporter.component.ts","webpack:///./src/app/main/components/planning/tmsWeeklyPlanner/tmsPlanRoute.dialog.html","webpack:///./src/app/main/components/planning/jobDetails/jobDetails.dialog.html","webpack:///./src/app/main/components/planning/planning.controller.ts","webpack:///./src/app/main/components/planning/planning.html","webpack:///./src/app/main/components/planning/tms.module.ts","webpack:///./src/app/main/components/planning/routeReply/routeReplay.component.ts","webpack:///./src/app/main/components/planning/routeReply/routeReplay.html","webpack:///./src/app/main/components/planning/arrivalsBoard/arrivalsBoard.component.ts","webpack:///./src/app/main/components/planning/arrivalsBoard/arrivalsBoard.html","webpack:///./src/app/main/components/planning/manageTemplates/manageTemplates.component.ts","webpack:///./src/app/main/components/planning/manageTemplates/manageTemplates.html","webpack:///./src/app/main/components/planning/notes/notes.component.ts","webpack:///./src/app/main/components/planning/notes/notes.html","webpack:///./src/app/main/components/planning/plannedRouteList.component.ts","webpack:///./src/app/main/components/planning/plannedRouteList.html","webpack:///./src/app/main/components/planning/routeExport/tmsRouteExport.ts","webpack:///./src/app/main/components/planning/routeExport/tmsRouteExport.html","webpack:///./src/app/main/components/planning/routePlanner/alternativeRoutes.component.ts","webpack:///./src/app/main/components/planning/routePlanner/alternativeRoutes.html","webpack:///./src/app/main/components/planning/routePlanner/routePlanner.component.ts","webpack:///./src/app/main/components/planning/routePlanner/routeplanner.html","webpack:///./src/app/main/components/planning/tms.controller.ts","webpack:///./src/app/main/components/planning/tmsJobs/tmsJobs.component.ts","webpack:///./src/app/main/components/planning/tmsJobs/tmsJobs.html","webpack:///./src/app/main/components/planning/tmsJobs/tmsJobView.component.ts","webpack:///./src/app/main/components/planning/tmsJobs/tmsJobView.html","webpack:///./src/app/main/components/planning/tmsWeeklyPlanner/tmsPlanRoute.component.ts","webpack:///./src/app/main/components/planning/tmsWeeklyPlanner/tmsPlanRoute.html","webpack:///./src/app/main/components/planning/tmsWeeklyPlanner/tmsWeeklyPlanner.component.ts","webpack:///./src/app/main/components/planning/tmsWeeklyPlanner/tmsWeeklyPlanner.html","webpack:///./src/app/main/components/planning/tms.html","webpack:///./src/app/main/components/reports/dynamicreports.module.ajs.ts","webpack:///./src/app/main/components/reports/_components/expensesV2/expenses.component.ts","webpack:///./src/app/main/components/reports/_components/expensesV2/expenses.html","webpack:///./src/app/main/components/reports/_components/parameters/timePicker.component.ts","webpack:///./src/app/main/components/reports/_components/parameters/timePicker.html","webpack:///./src/app/main/components/reports/_components/reportBuilder/formStatusIndicator.component.ts","webpack:///./src/app/main/components/reports/_components/reportBuilder/formStatusIndicator.html","webpack:///./src/app/main/components/reports/_components/reportBuilder/newReportColumnSelector/newReportColumnSelector.component.ts","webpack:///./src/app/main/components/reports/_components/reportBuilder/newReportColumnSelector/newReportColumnSelector.component.html","webpack:///./src/app/main/components/reports/_components/reportBuilder/reportBuilder.component.ts","webpack:///./src/app/main/components/reports/_components/reportBuilder/reportBuilder.html","webpack:///./src/app/main/components/reports/_components/reportBuilder/reportBuilderList.component.ts","webpack:///./src/app/main/components/reports/_components/reportBuilder/reportBuilderList.html","webpack:///./src/app/main/components/reports/_components/reportBuilder/reportColumn/reportColumn.component.ts","webpack:///./src/app/main/components/reports/_components/reportBuilder/reportColumn/reportColumn.html","webpack:///./src/app/main/components/reports/_components/reportBuilder/tableColumnSelector/tableColumnSelector.component.ts","webpack:///./src/app/main/components/reports/_components/reportBuilder/tableColumnSelector/tableColumnSelector.html","webpack:///./src/app/main/components/resourceManagement/geofences/geofences_moved.html","webpack:///./src/app/main/components/tacho/_tacho.module.ajs.ts","webpack:///./src/app/main/components/tacho/alcolockCompliance/alcolock.service.ts","webpack:///./src/app/main/components/tacho/alcolockCompliance/alcolockCompliance.component.ts","webpack:///./src/app/main/components/tacho/alcolockCompliance/alcolockCompliance.html","webpack:///./src/app/main/components/tacho/alcolockCompliance/complianceRing.component.ts","webpack:///./src/app/main/components/tacho/alcolockCompliance/complianceRing.html","webpack:///./src/app/main/components/tacho/tacho.controller.ts","webpack:///./src/app/main/components/tacho/tacho.html","webpack:///./src/app/main/components/util/util.module.ts","webpack:///./src/app/main/components/videos/_videos.module.ajs.ts","webpack:///./src/app/main/components/videos/vehicleVideosPage/vehicleVideosPage.component.ts","webpack:///./src/app/main/components/videos/vehicleVideosPage/vehicleVideosPage.html","webpack:///./src/app/main/modules/cameras/_components/videoEventView/videoEventView.component.ts","webpack:///./src/app/main/modules/cameras/_components/videoEventView/videoEventView.component.html","webpack:///./src/app/main/modules/cameras/dashboard/cameraDashboard.component.ts","webpack:///./src/app/main/modules/cameras/dashboard/cameraDashboard.component.html","webpack:///./src/app/main/components/videos/compositeVideoPlayer/compositeVideoPlayer.component.ts","webpack:///./src/app/main/components/videos/compositeVideoPlayer/compositeVideoPlayer.html","webpack:///./src/app/main/components/videos/driverOverviewPage/driverOverviewPage.component.ts","webpack:///./src/app/main/components/videos/driverOverviewPage/driverOverviewPage.html","webpack:///./src/app/main/components/videos/driverVideoCard/driverVideoCard.component.ts","webpack:///./src/app/main/components/videos/driverVideoCard/driverVideoCard.html","webpack:///./src/app/main/components/videos/driverVideosPage/driverVideosPage.component.ts","webpack:///./src/app/main/components/videos/driverVideosPage/driverVideosPage.html","webpack:///./src/app/main/components/videos/evidence/videoEvidence.ts","webpack:///./src/app/main/components/videos/evidence/videoEvidence.html","webpack:///./src/app/main/components/videos/liveStreamVideo/liveStreamVideo.component.ts","webpack:///./src/app/main/components/videos/liveStreamVideo/liveStreamVideo.html","webpack:///./src/app/main/components/videos/notes/notes.component.ts","webpack:///./src/app/main/components/videos/notes/notes.html","webpack:///./src/app/main/components/videos/requestVideo/requestVideo.component.ts","webpack:///./src/app/main/components/videos/requestVideo/requestVideo.component.html","webpack:///./src/app/main/components/videos/requestVideo/requestVideoMap/requestVideoMap.component.ts","webpack:///./src/app/main/components/videos/requestVideo/requestVideoMap/requestVideoMap.component.html","webpack:///./src/app/main/components/videos/requestVideo/requestVideoQueryStatus/requestVideoQueryStatus.component.ts","webpack:///./src/app/main/components/videos/requestVideo/requestVideoQueryStatus/requestVideoQueryStatus.component.html","webpack:///./src/app/main/components/videos/vehicleVideoCard/vehicleVideoCard.component.ts","webpack:///./src/app/main/components/videos/vehicleVideoCard/vehicleVideoCard.html","webpack:///./src/app/main/components/videos/videoCoachingPage/videoCoachingPage.component.ts","webpack:///./src/app/main/components/videos/videoCoachingPage/videoCoachingPage.component.html","webpack:///./src/app/main/components/videos/videoJourneySummary/journeyOverviewCard/journeyOverviewCard.component.ts","webpack:///./src/app/main/components/videos/videoJourneySummary/journeyOverviewCard/journeyOverviewCard.html","webpack:///./src/app/main/components/videos/videoJourneySummary/journeySummaryCard/journeySummaryCard.component.ts","webpack:///./src/app/main/components/videos/videoJourneySummary/journeySummaryCard/journeySummaryCard.html","webpack:///./src/app/main/components/videos/videoJourneySummary/videoJourneySummary.component.ts","webpack:///./src/app/main/components/videos/videoJourneySummary/videoJourneySummary.html","webpack:///./src/app/main/components/videos/videoPageController.controller.ts","webpack:///./src/app/main/components/resourceManagement/resourceManagement.module.ajs.ts","webpack:///./src/app/main/components/resourceManagement/driverassignment/driverassignment.component.ts","webpack:///./src/app/main/components/resourceManagement/driverassignment/driverassignment.html","webpack:///./src/app/main/components/resourceManagement/geofences/geofenceDetailsInfo/geofenceDetailsInfo.component.ts","webpack:///./src/app/main/components/resourceManagement/geofences/geofenceDetailsInfo/geofenceDetailsInfo.html","webpack:///./src/app/main/components/resourceManagement/geofences/geofenceEditor/geofenceEditor.component.ts","webpack:///./src/app/main/components/resourceManagement/geofences/geofenceEditor/geofenceEditor.component.html","webpack:///./src/app/main/components/resourceManagement/geofences/geofenceList/geofenceList.component.ts","webpack:///./src/app/main/components/resourceManagement/geofences/geofenceList/geofenceList.html","webpack:///./src/app/main/components/resourceManagement/geofences/geofenceTags/geofenceTags.component.ts","webpack:///./src/app/main/components/resourceManagement/geofences/geofenceTags/geofenceTags.html","webpack:///./src/app/main/components/resourceManagement/geofences/geofenceTagsEdit/geofenceTagsEdit.component.ts","webpack:///./src/app/main/components/resourceManagement/geofences/geofenceTagsEdit/geofenceTagsEdit.html","webpack:///./src/app/main/components/resourceManagement/geofences/geofenceVisits/geofenceVisits.component.ts","webpack:///./src/app/main/components/resourceManagement/geofences/geofenceVisits/geofenceVisits.html","webpack:///./src/app/main/components/resourceManagement/geofences/resourceGeofences.component.ts","webpack:///./src/app/main/components/resourceManagement/geofences/resourceGeofences.html","webpack:///./src/app/main/components/resourceManagement/resourceManagement.controller.ts","webpack:///./src/app/main/components/resourceManagement/users/userActivityChart/userActivityChart.component.ts","webpack:///./src/app/main/components/resourceManagement/users/userActivityChart/userActivityChart.html","webpack:///./src/app/main/components/resourceManagement/users/userEditor/userEditor.component.ts","webpack:///./src/app/main/components/resourceManagement/users/userEditor/userEditor.component.html","webpack:///./src/app/main/components/resourceManagement/users/userPermissions/userPermissions.component.ts","webpack:///./src/app/main/components/resourceManagement/users/userPermissions/userPermissions.html","webpack:///./src/app/main/components/resourceManagement/users/users.component.ts","webpack:///./src/app/main/components/resourceManagement/users/users.html","webpack:///./src/app/main/components/resourceManagement/vehicles/temperatureProbes/temperatureProbes.component.ts","webpack:///./src/app/main/components/resourceManagement/vehicles/temperatureProbes/temperatureProfilesZonesEdit.dialog.html","webpack:///./src/app/main/components/resourceManagement/vehicles/temperatureProbes/temperatureProbes.html","webpack:///./src/app/main/components/resourceManagement/vehicles/temperatureProbes/temperatureProfilesEdit/temperatureProfilesEdit.component.ts","webpack:///./src/app/main/components/resourceManagement/vehicles/temperatureProbes/temperatureProfilesEdit/temperatureProfilesEdit.html","webpack:///./src/app/main/components/resourceManagement/vehicles/vehicleInputEditor/inputStateDescription/inputStateDescription.ts","webpack:///./src/app/main/components/resourceManagement/vehicles/vehicleInputEditor/inputStateDescription/inputStateDescription.html","webpack:///./src/app/main/components/resourceManagement/vehicles/vehicleInputEditor/vehicleInputEditor.component.ts","webpack:///./src/app/main/components/resourceManagement/vehicles/vehicleInputEditor/vehicleInputTypeManager/vehicleInputTypeManager.dialog.html","webpack:///./src/app/main/components/resourceManagement/vehicles/vehicleInputEditor/vehicleInputEditor.html","webpack:///./src/app/main/components/resourceManagement/vehicles/vehicleInputEditor/vehicleInputTypeManager/vehicleInputTypeManager.component.ts","webpack:///./src/app/main/components/resourceManagement/vehicles/vehicleInputEditor/vehicleInputTypeManager/vehicleInputTypeManager.html","webpack:///./src/app/main/components/resourceManagement/vehicles/vehicles.component.ts","webpack:///./src/app/main/components/livemap/components/editOdometer.template.html","webpack:///./src/app/main/components/resourceManagement/vehicles/vehicles.html","webpack:///./src/app/main/components/resourceManagement/vor/vor.maintenance.component.ts","webpack:///./src/app/main/components/resourceManagement/vor/vorRecordEntryDialog/varRecordEntry.dialog.html","webpack:///./src/app/main/components/resourceManagement/vor/vor.maintenance.html","webpack:///./src/app/main/components/resourceManagement/vor/vorRecordEntryDialog/vorRecordEntry.component.ts","webpack:///./src/app/main/components/resourceManagement/vor/vorRecordEntryDialog/vorRecordEntry.html","webpack:///./src/app/main/components/resourceManagement/users/resourceGroupList/resourceGroupList.component.ts","webpack:///./src/app/main/components/resourceManagement/users/resourceGroupList/resourceGroupList.component.html","webpack:///./src/app/main/modules/foundation/_routes/home/home.component.ts","webpack:///./src/app/main/modules/foundation/_routes/home/home.component.html","webpack:///./src/app/main/modules/foundation/_components/components.module.ajs.ts","webpack:///./src/app/main/modules/foundation/_components/cameraDeviceInfo/cameraDeviceInfo.component.ts","webpack:///./src/app/main/modules/foundation/_components/cameraDeviceInfo/cameraDeviceInfo.component.html","webpack:///./src/app/main/modules/foundation/_components/formWarning/formWarning.component.ts","webpack:///./src/app/main/modules/foundation/_components/formWarning/formWarning.component.html","webpack:///./src/app/main/modules/foundation/_components/infoEntry/infoEntry.component.ts","webpack:///./src/app/main/modules/foundation/_components/infoEntry/infoEntry.component.html","webpack:///./src/app/main/modules/foundation/_components/sdCardInfo/sdCardInfo.component.ts","webpack:///./src/app/main/modules/foundation/_components/sdCardInfo/sdCardInfo.component.html","webpack:///./src/app/main/modules/foundation/_routes/commissions/commission.module.ajs.ts","webpack:///./src/app/main/modules/help/help.module.ajs.ts","webpack:///./src/app/main/modules/help/help.navigation.ts","webpack:///./src/app/main/navigation/navigation.module.ts","webpack:///./src/app/main/navigation/sideNavigation.service.ts","webpack:///./src/app/main/components/messaging/models/ExpiryOptionsModel.ts","webpack:///./src/app/main/components/messaging/messaging.module.ts","webpack:///./src/app/main/components/messaging/messaging.controller.ts","webpack:///./src/app/main/components/messaging/groupMessage.dialog.html","webpack:///./src/app/main/components/messaging/messagingConversation.component.ts","webpack:///./src/app/main/components/messaging/messagingConversation.html","webpack:///./src/app/main/components/messaging/messaging.html","webpack:///./src/app/main/navigation/moduleNavigation/moduleNavigation.component.ts","webpack:///./src/app/main/navigation/moduleNavigation/moduleNavigation.html","webpack:///./src/app/main/navigation/siteNavigation/siteNavigation.component.ts","webpack:///./src/app/main/navigation/siteNavigation/siteNavigation.html","webpack:///./src/app/main/modules/tms/tms.module.ajs.ts","webpack:///./src/app/main/modules/tms/_components/driverActivitySheet/driverActivitySheet.component.ts","webpack:///./src/app/main/modules/tms/_components/driverActivitySheet/driverActivitySheet.html","webpack:///./src/app/main/modules/tms/_components/routeDetails/routeDetails.component.ts","webpack:///./src/app/main/modules/tms/_enums/UserAccessType.ts","webpack:///./src/app/main/modules/tms/_components/routeDetails/routeDetails.component.html","webpack:///./src/app/main/modules/tms/_routes/arrivalsBoard/arrivalsBoard.component.ts","webpack:///./src/app/main/modules/tms/_routes/arrivalsBoard/arrivalsBoard.component.html","webpack:///./src/app/main/modules/tms/_routes/dashboard/tmsDashboard.component.ts","webpack:///./src/app/main/modules/tms/_routes/dashboard/tmsDashboard.component.html","webpack:///./src/app/main/modules/tms/_routes/scheduling/_components/scheduleEditor/scheduleEditor.component.ts","webpack:///./src/app/main/modules/tms/_routes/scheduling/_components/scheduleEditor/scheduleEditor.component.html","webpack:///./src/app/main/modules/tms/_routes/scheduling/_components/scheduleVisitsList/scheduleVisitsList.component.ts","webpack:///./src/app/main/modules/tms/_routes/scheduling/_components/scheduleVisitsList/scheduleVisitsList.component.html","webpack:///./src/app/main/modules/tms/_routes/scheduling/_components/scheduleVisitsListItem/scheduleVisitsListItem.component.ts","webpack:///./src/app/main/modules/tms/_routes/scheduling/_components/scheduleVisitsListItem/scheduleVisitsListItem.component.html","webpack:///./src/app/main/modules/tms/_routes/scheduling/_components/scheduleVisitValidation/scheduleVisitValidation.component.ts","webpack:///./src/app/main/modules/tms/_routes/scheduling/_components/scheduleVisitValidation/scheduleVisitValidation.component.html","webpack:///./src/app/main/modules/tms/_routes/scheduling/scheduling.component.ts","webpack:///./src/app/main/modules/tms/_routes/scheduling/scheduling.component.html","webpack:///./src/app/main/modules/fleet/fleet.module.ajs.ts","webpack:///./src/app/main/pages/auth/login/login.module.ts","webpack:///./src/app/main/pages/auth/login/loginBox/loginBox.component.ts","webpack:///./src/app/main/pages/auth/login/loginBox/loginBox.component.html","webpack:///./src/app/main/pages/auth/login/loginPage/loginPage.component.ts","webpack:///./src/app/main/pages/auth/login/loginPage/loginPage.component.html","webpack:///./src/app/layouts/basic.html","webpack:///./src/app/services/_services.module.ajs.ts","webpack:///./src/app/services/axleWeight.service.ts","webpack:///./src/app/services/powerLossHistory.service.ts","webpack:///./src/app/services/routeConfigHelper.provider.ts","webpack:///./src/app/services/validation.service.ts","webpack:///./src/app/services/accountUserMapping.service.ajs.ts","webpack:///./src/app/services/authorization.service.ts","webpack:///./src/app/services/cache.Service.ts","webpack:///./src/app/services/debounce.service.ts","webpack:///./src/app/services/delay.service.ts","webpack:///./src/app/services/event.services.ts","webpack:///./src/app/services/filterOptions.service.ts","webpack:///./src/app/services/ganttSeries.service.ts","webpack:///./src/app/services/inputType.service.ts","webpack:///./src/app/services/loginHistory.service.ajs.ts","webpack:///./src/app/services/messageDialog.service.ts","webpack:///./src/app/services/notify.factory.ts","webpack:///./src/app/services/print.service.ts","webpack:///./src/app/services/resourceFilterBar.service.ts","webpack:///./src/app/services/throttle.service.ts","webpack:///./src/app/services/userMappings.service.ts","webpack:///./src/app/services/userResellerMappingService.ajs.ts","webpack:///./src/app/services/version.service.ts","webpack:///./src/app/services/websocket.service.ts","webpack:///./src/app/userPreferences/userpreferences.module.ts","webpack:///./src/app/userPreferences/service/userpreferences.service.ts","webpack:///./src/app/main/modules/alerts/alerts.module.ajs.ts","webpack:///./src/app/main/modules/alerts/components/alertReviewCompliance/alertReviewCompliance.component.ts","webpack:///./src/app/main/modules/alerts/components/alertReviewCompliance/alertReviewCompliance.component.html","webpack:///./src/app/main/modules/alerts/components/incidentView/incidentDetail.component.ts","webpack:///./src/app/main/modules/alerts/components/incidentView/incidentDetail.component.html","webpack:///./src/app/main/modules/alerts/components/alertEditor/alertEditor.component.ts","webpack:///./src/app/main/modules/alerts/_enums/alertEditor.enums.ts","webpack:///./src/app/main/modules/alerts/components/alertEditor/alertEditor.component.html","webpack:///./src/app/main/modules/alerts/components/alertHistory/alertHistory.component.ts","webpack:///./src/app/main/modules/alerts/components/alertHistory/alertHistory.component.html","webpack:///./src/app/main/modules/alerts/components/alertsManager/alertsManager.component.ts","webpack:///./src/app/main/modules/alerts/components/alertsManager/alertsManager.component.html","webpack:///./src/app/main/modules/alerts/components/recentAlerts/recentAlerts.component.ts","webpack:///./src/app/main/modules/alerts/components/recentAlerts/recentAlerts.component.html","webpack:///./src/app/main/modules/temperature/temperature.module.ajs.ts","webpack:///./src/app/main/modules/temperature/_components/temperatureGraph/temperatureGraph.component.ts","webpack:///./src/app/main/modules/temperature/_components/temperatureGraph/temperatureGraph.html"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","1","exports","module","l","e","Promise","resolve","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","oe","err","console","error","jsonpArray","window","oldJsonpFunction","slice","PluralizationKey","TranslationService","$http","constantsService","userLanguageCode","translationValues","languagePluralisation","visualizerStorageKey","this","isVisualizerEnabled","localStorage","getItem","setItem","getLanguageCode","getListOfLocales","then","translationLocales","alert","location","reload","matchingLocale","find","translationLocale","Locale","getUserLanguageJsonFile","json","languageJsonFile","initialiseLanguagePluralistion","setPolyglot","phrase","params","translate","phraseHasUnknownValues","translatedString","param","Number","pluralizationKey","getPluralizationKey","pluralizedPhrase","getPluralizedPhrase","polyglot","0","Array","isArray","type","enumName","nullCaseFallback","translateEnum","enumKey","endsWith","has","locale","method","url","response","catch","status","cache","locales","sort","l1","l2","Title","localeCompare","getIsProduction","filter","warn","id","Zero","One","Other","phraseEndsWithMissingKeyValue","indexOf","phraseHasUndefinedKeyValue","userSetLanguage","phrases","fixedPhrases","fixParameterProblem","Polyglot","log","phrasesString","JSON","stringify","replace","parse","$inject","DateUnit","DateService","translationService","getUserLocale","date","options","parsedDate","Date","dateOptions","day","month","year","timeOptions","hour12","hour","minute","second","toLocaleDateString","excludeYear","undefined","longMonth","dateTime","dateString","timeString","toLocaleTimeString","setMidnightToZeroes","timeOnly","stringDayOnly","getDayOfWeek","getDay","time","parseInt","isNaN","Intl","DateTimeFormat","resolvedOptions","timeZone","offsetMinutes","getTimezoneOffset","Math","abs","floor","timespanValue","array","split","hours","formatTime","minutes","seconds","dateFrom","dateTo","isSameDate","formatDate","diffMs","getDiff","Ms","timeAgoFormat","RelativeTimeFormat","style","msToDateUnit","Min","Year","diff","customRound","format","Day","Hour","unitOfTime","milliseconds","Week","Sec","Error","millisecondsInMinute","millisecondsInHour","millisecondsInDay","remainingMilliseconds","remainingMillisecondsAfterHours","remainingMillisecondsAfterMinutes","duration","days","getDurationFormatting","date1","date2","date1IsAfterDate2","years","getYearsDifference","months","getMonthsDifference","getDaysDifference","durationString","executionCount","createSeparatorIfRequired","getFullYear","getMonth","getDate","daysDifference","getTime","numberOfDaysInPreviousMonth","unit","ms","amount","allDatesAreValid","dateMs","dD","setDate","Month","mD","setMonth","start","end","includeStart","includeEnd","parsedStart","parsedEnd","dateIsAfterStart","dateIsBeforeEnd","setHours","dayOfWeek","startOfWeekDate","addOrSubtractTime","getStartOfDay","daysToAdd","endOfMonth","getEndOfDay","includeTime","parsedDate1","parsedDate2","sameYear","sameMonth","sameDay","sameTime","includeIsSame","beforeDate","afterDate","dates","some","parsedDates","forEach","latestDate","dateAsNumber","trunc","getOrdinalSuffix","number","String","numberAsString","smallestUnit","pop","hoursMinutesSeconds","updatedHoursDate","updatedMinutesDate","setMinutes","updatedSecondsDate","setSeconds","includeSeconds","getHoursAsString","getMinutesAsString","getSecondsAsString","sortDirection","SortDirection","Descending","parsedDate1Time","Ascending","getHours","getMinutes","getSeconds","dateRange","startDate","endDate","rangeEndsYesterday","DateRange","Today","Yesterday","Last7Days","Last14Days","Last30Days","ThisWeek","getStartOfWeek","ThisMonth","getStartOfMonth","getEndOfMonth","Latest3Weeks","Latest14Days","Latest4Weeks","Latest7Days","LastWeek","getEndOfWeek","LastMonth","mm","ss","secondOfDay","updateTime","ceil","shorten","translationKey","substr","toString","getLocaleFromBrowser","navigator","languages","language","substring","Injectable","providedIn","SortType","FallbackCellType","SORT_NULL_VALUE","VTableService","dateService","geocodeService","locationInformationService","columns","preSelectedRow","rows","createTableRow","selected","row","cells","column","cell","createCellFunction","header","searchable","searchString","searchData","toLowerCase","disableSelect","disableRow","newRow","table","columnIndex","sortType","a","b","sortDataA","sortData","sortDataB","Boolean","filteredData","tableRowMap","Map","map","Id","hide","VTableHeaderType","Default","translation","tKey","title","width","minWidth","sortable","sorted","classes","minTableWidth","excludeFromExport","exportOnly","canEdit","hidden","createTableHeader","Vehicle","Status","Checkbox","fallbackType","Dashed","values","every","item","cellContent","NA","Blank","Unknown","Never","exportData","exportDataMethod","component","componentInputs","template","tooltip","icon","createTableCell","exportStatusMethod","StatusCell","vehicle","vehicleId","allowNonDatabaseVehicle","regString","Reg","ShortReg","regSearchString","VehicleRegComponent","cellOptions","plotId","plot","latLng","exportLocationInformationMethod","LocationInformationComponent","locationInformation","CheckboxCell","displayData","behavior","RagCellComponent","dataToSort","negativeSegment","positiveSegment","count","neutralSegment","PercentageBarCellComponent","model","fallbackCellType","validationCutOff","exportDateMethod","DateCell","showErrorIfBeforeDate","showWarningIfBeforeDate","showRelativeTime","dateUnit","convertToMilliseconds","displayValue","formatTimeFromMilliseconds","formatDuration","enumType","enumValue","EnumCellComponent","tEnum","label","autoDownload","VideoDownloadStatusComponent","tableColumns","join","existingPreferences","getTableId","col","getLocationInformationFromPlotId","GeofenceIds","getGeofenceNamesString","LocationDescription","reject","VTableRowStatus","GeocodeService","LocationInformationService","NavigationService","$window","$rootScope","$state","vehicleService","breadcrumbService","accountFeatureService","$location","defaultFeatureRouteMap","AccountFeatures","Breathalock","FleetNavigationModule","Messaging","Messages","Tacho","Tachograph","TrackingDevice","Vehicles","Camera","CameraModule","defaultResourceManagementRouteMap","UserRole","ManageDrivers","ResourceManagementNavigationModule","DriversManagement","ManageGroups","GroupsManagement","ManageVehicles","VehiclesManagement","Administrator","mobileOnlyFeatureRoutes","Dashboard","Temperature","TmsModuleNavigation","parentStateName","$current","parent","go","displayName","$broadcast","BroadcastEvent","UpdateBreadcrumbs","nameResolver","updateNameResolver","currentUser","Type","UserType","InternalUser","FoundationNavigationModule","toStateParams","Engineer","DefaultEngineer","pathname","goToDefaultPage","accountData","targetRoute","toState","current","previous","PageStateNames","AUTHENTICATION_FORGOTPASSWORD","canUserAccessRoute","getDefaultRouteForUser","FOUNDATION_CUSTOMERS_OVERVIEW","FOUNDATION_CUSTOMERS","AUTHENTICATION_LOGIN","historical","routeParams","getSanitizedReg","isToday","isSame","moment","goToState","COMPONENTS_RESOURCEMANAGEMENT","page","pageName","reloadIfSame","assign","stateString","paramName","search","reloadPage","notify","resourceType","modelId","typeString","ResourceType","toLocaleLowerCase","goTo","modelType","argument1","ActiveRoutes","Planning","AUTHORIZATION_UNAUTHORIZED","platform","UserPlatform","Foundation","isRouteAllowedForMobileUser","defaultFleetRoute","getDefaultFleetRouteForAccountAndCurrentUser","accountAndUserHaveAllFeatureAccess","doesCurrentUserHaveSpecialPermission","SpecialUserPermissions","ManageGeofences","Geofences","TMS","ShowReports","ReportsNavigationModule","defaultResourceManagementRoute","getDefaultResourceManagementRouteForCurrentUser","currentUserHasFeatureAccess","TemperatureNavigationModule","currentUserHasRole","ManageAlerts","AlertsNavigationModule","ManageAlertReviews","ReviewAlerts","route","getIsMobile","includes","fleetFeatures","defaultMappedRoute","feature","matchingDefaultMappedRoute","accountAndUserHaveFeatureAccess","ShowHistoricalPlots","resourceManagementRoles","keys","role","to","ParentRoot","UnitConversionType","UnitConversionService","$filter","sessionService","kmToMiles","milesToKm","mpgToKml","kplToMpgUK","kplToMpgUS","mpgUKToKpl","mpgUSToKpl","litersToGallons","litersToUSGallons","gallonsToLiters","usGallonsToLiters","kplToMpl","kplToKpg","userUnitIsImperial","getAccountOptions","input","unitType","FuelCapacity","precision","parsedValue","parseFloat","convertedValue","convert","hasScaledValue","scaleLargeNumbers","scaleLargeNumbersLimit","round","conversionLabel","getConversionLabel","dataType","ColumnDataType","Percent","placeLabelAtSuffix","isLabelSuffix","imperialToMetricConvert","customPref","customPreferenceContent","preferences","userPreferences","returnValue","Distance","Speed","DistanceMeasurement","Value","Miles","VolumeMeasurement","UsGallon","Gallon","Litre","FuelEfficiency","FuelConsumptionMeasurement","UnitedStatesMilesPerGallon","MilesPerGallon","LitresPer100Kilometres","convertTemperatureForSaving","convertTemperature","roundToXDecimalPlaces","shouldConvertToMetric","modifier","pow","suffixType","precisionToUse","convertedUnit","convertToUserUnit","convertUnitWithFormatting","Currency","milage","temperature","temp","TemperatureMeasurement","Fahrenheit","convertCelsiusToFahrenheit","convertedTemp","toFixed","convertFahrenheitToCelsius","celsius","fahrenheit","Time","conversionType","getConversionLabelWithUnitOption","Celsius","KilometresPerLitre","EUR","GBP","USD","measurementType","MeasurementCategoryType","Fuel","videoEntry","VideoAccelerometerData","accelometerData","newData","X","convertAccelerationToGUnit","ProductGroupId","Y","Z","ProductVendor","IntelligentTelematics","x","y","accelerationMSec","cameraType","gunit","RTL","SettingsName","UserOptions","FeatureAccessType","History","ManageReportBuilder","AccountFeatureService","accountService","featureStringCache","reportTypeMappings","reportType","accountFeature","Can","Read","skipAccountFeatureCheck","getAccountDataFromCache","features","accountAndUserHaveAnyFeatureAccess","Features","hasAllFeatures","accountHasFeatureAccess","isAnyEnabled","user","accountHasAccess","hasBasePermissionModel","hasUserManageAccess","CurrentAccountUserMapping","ManageFeatures","hasUserReadAccess","ReadFeatures","GPS","FaultCodes","Tyres","isAdmin","Manage","mapping","disableAccountFeature","enableAccountFeature","rolesToCheck","allRoles","AccountUserType","Admin","rolesUserHas","hasSpecialUserPermission","userHasAllRoles","userHasRoles","trim","userInRole","permission","accountUserMapping","getSpecialUserPermissionDescriptions","description","descriptions","getSpecialUserPermissionsEnumKeys","description1","description2","descriptionsMap","getFeatureDescriptions","getFeatureDescriptionsMap","enabled","hasManageFunctionality","accountFeatures","getAccountFeaturesEnumKeys","featureFlagsHaveFeatureAccess","newFeatureDescription","createFeatureDescription","feature1","feature2","featureString","getDescriptionsForFeaturesFlag","reduce","reportDefinition","TableDefinition","ReportFeatures","reportTypes","isReportTypeEnabled","EnumService","enumToArray","includedFeatures","index","requireUser","VehicleService","$q","cacheService","tagsService","plotService","vorService","veriDate","foundationPeripheralService","$injector","cameraOnlineHistoryService","HybridServiceAccessor","vehiclesCache","vehicleProbesCache","isDemoSite","getIsDemoSite","createCache","maxAge","text","vehicles","v","vehicleSearchPredicate","VehicleType","Trailer","Plant","Asset","regToFind","lowerCaseReg","sanitizeTextForUrl","sanitizeDelimeter","depots","depot","VehicleIds","vId","RegExp","invalidateCache","minsToLive","startTime","endTime","toISOString","vehiclePromise","getVehicles","includePeripheralMappings","trailerAssociationPromise","getVehicleTrailerMappings","all","trailerAssociations","ta","findVehicle","VehicleId","trailer","TrailerId","queryOptions","getVehiclesFromDatabase","getUserOptions","vehiclesPromise","getOrRetreiveVehicles","dontCopy","mapVehiclesRegsForDemo","tagMappingPromise","includeTags","getTagVehicleMappings","when","trailerMappingPromise","includeTrailerMappings","getActiveTrailerMappings","vorPromise","includeVOR","getCurrentRecords","probePromise","includeProbes","getVehicleProbesForAccount","tempPromise","includeLatestTemp","getLatestVehicleTemperatureRecords","plotsPromise","includeLatestPlots","getLatestPlots","peripheralPromise","getAllPeripherals","peripheralMappingPromise","getAllPeripheralMappings","onlineStatusesPromise","service","getCameraOnlineStatuses","tagMappings","vorRecords","trailerMappings","probes","tempRecords","plots","peripherals","peripheralMappings","onlineStatuses","mapTagMappingsToResources","TagResourceType","mapPeripheralsAndVehicles","shouldDisplayVehicle","mapRecordsToVehicles","reg","setVehiclePlots","mapTrailersToVehicle","mapProbesToVehicle","mapVorToVehicle","mapTempRecordsToVehicle","Temperatures","attachedTrailers","tractor","userOptions","TrailerAssociations","trailerMapping","vorRecord","vor","saveResourceTags","updateOrInsertVehicleCache","addOrUpdateItem","v1","v2","plotMap","twoDaysAgo","add","Plot","PlotId","vehicleHasPlotFromLastTwoDays","UtcMoment","isAfter","unitStatus","UnitStatus","Responding","NoResponseWithin48Hours","probe","getProbes","sanitiseVehicleProbes","cleanVehicleProbeName","showProbe","canChangeZone","Source","HardwareSource","Ibox","Carrier","vehicleReg","regEx","cleanName","Name","test","ignoreOldData","today","record","createMoment","Timestamp","vehicleTypes","getItemsForSelect","newOdometer","oldOdometer","NewOdometer","OldOdometer","addVehicle","ShowVehiclesNoUnit","ShowVehiclesNotTracking","vehicleProbes","depotsWithHomeLocations","GeofenceId","vehiclesWithHomeLocations","findVehiclesWithHomeLocations","latestPlots","findProbesForVehicle","HasUnit","vehicleHasPeripheral","regOrShortRegHasSpace","getRegPlateWithSpace","unsafe","getOrRetrieveData","HasInstalledDevice","shouldDisplay","includeAllVehicles","vehicleHasUnitOrPeripheral","publicDeclarations","VeriDatePipe","TranslatePipe","PhoneNumberPipe","EnumNamesPipe","UnitConversionPipe","FormatNumberPipe","EnumAsString","VDatePipe","VTimePipe","VRelativeTimePipe","VOrdinalSuffixPipe","OrderByPropPipe","SplitPascalCasePipe","VLocationPipe","WithLoadingPipe","PipesModule","NgModule","declarations","providers","privateComponents","publicComponents","LoadingIndicatorComponent","TachoModeComponent","TachoModeStatusComponent","BreadcrumbsComponent","VehicleOnlineStatusComponent","DriverImageComponent","TrendArrowComponent","TemperatureReadingComponent","BatteryIndicatorComponent","UnitConversionSuffixComponent","VeriMarkerComponent","NavCountComponent","DepotNameComponent","MultiStepIndicatorComponent","FullScreenButtonComponent","AccountSwitcherComponent","DayOfWeekPickerComponent","VerticalCollapsableDivider","SiteStatusIndicatorComponent","DriverNameComponent","DeleteConfirmationComponent","GroupDeleteConfirmationComponent","VProgressBar","TrailerComponent","VFlvPlayer","AsyncObservableComponent","RecentlySelectedComponent","VectorDotsComponent","CountToDirective","DelayedHoverDirective","TooltipDirective","IfEnabledDirective","HighlightTextDirective","HideInProductionDirective","MiscDirectivesModule","imports","ReactiveFormsModule","CommonModule","BrowserAnimationsModule","HttpClientModule","CoreDirectivesModule","entryComponents","VDropdownComponent","VItemDropdownComponent","VButtonComponent","VButtonDropdownComponent","VNavBarComponent","VNavItemComponent","VTilesComponent","VTileComponent","BindCssVariableDirective","ScrollShadowDirective","timeout","setTimeout","HttpParams","nestedKey","append","cname","cvalue","exdays","setTime","expires","toUTCString","document","cookie","ca","decodeURIComponent","charAt","DashboardBoxSmallComponent","VTagsComponent","VPillsComponent","VeriInfoPanelComponent","VeriNavPillsComponent","VeriCardComponent","VeriTableContainerComponent","VeriTableSummaryComponent","VeriBadgeComponent","VeriSearchBoxComponent","VeriSimpleNavComponent","VeriColourPickerComponent","VeriVideoThumbnailsComponent","VVideoComponent","VeriNumberFieldComponent","VExportButtonComponent","VCalendarComponent","VDateSelectorComponent","VTimeFiltersComponent","VTimelineComponent","VListComponent","VDescriptiveListItemComponent","VVideoControlsComponent","VVideoProgressComponent","VVideoCollectionComponent","VStreamCollectionComponent","VVehicleVideoStreamComponent","TagSelectorComponent","VeriDirectivesModule","providerCreator","LegacyExportService","FormsModule","FormsDirectivesModule","schemas","NO_ERRORS_SCHEMA","CurrentUserService","$timeout","$mdDialog","accountUserMappingService","userResellerMappingService","cacheName","cachedUser","resetPasswordCheck","ResetPassword","show","textContent","ok","showPasswordEditor","forcePasswordReset","currentUserPromise","getUser","accountUserMappingsPromise","cachedAccountUserMappings","AccountUserMappings","userResellerMappingsPromise","getCurrentUserMappings","getCurrentAccountUserMappings","accountMappings","userResellerMappings","hasCachedAccountUserMappings","UserId","AccountId","ResellerIds","EndTime","ResellerId","Valkyrie","save","sanitisedEmail","Email","updateCachedAccountUserMapping","CurrentUserFeaturesUpdatedEvent","ResourceGroupDisplayComponent","RevealingColumnsComponent","EmptyStateComponent","VeriPanelComponent","DefaultLayoutComponent","VerticalMapLayoutComponent","HorizontalLayoutComponent","VerticalLayoutComponent","SideBarComponent","PageActionsComponent","PageTitleComponent","PageTitlePillComponent","DetailPageComponent","RouteBreadcrumbsComponent","VTabComponent","VTabsComponent","AccordianComponent","AccordianEntryComponent","VDialogComponent","MinParentWidthDirective","MinWindowBreakpointDirective","MaxParentWidthDirective","MaxWindowBreakpointDirective","LayoutDirectivesModule","OverlayModule","VideoStatus","UserStatus","FormDetailsComponent","FileUploadComponent","VInputComponent","VAutocompleteComponent","VVehicleAutocompleteComponent","VPlacesAutocompleteComponent","VDriverAutocompleteComponent","VGeofenceAutocompleteComponent","VToggleComponent","VToggleListItemComponent","VFlagToggleComponent","VFlagToggleListItemComponent","VSelectComponent","VSelectOptionComponent","VSelectInputComponent","VEnumSelectComponent","VTimePickerComponent","CheckboxComponent","VOrderButtonsComponent","VRadioButtonComponent","VSliderComponent","ControlErrorsComponent","TextareaComponent","SmsInputComponent","RadioButtonBaseComponent","RadioButtonCardsComponent","RadioButtonSmallCardsComponent","AutofocusDirective","InputMaskDirective","PhoneInputDirective","TranslationDirectivesModule","FormValidationService","Commissioning","Customers","DeviceHealth","StreamaxConfigsAccountList","JobItems","Units","AccountService","http","dataCacheService","currentUserService","customerAccountsCacheName","resellerAccountsCacheName","account","getSingleValue","of","getOrRequest","getCustomerAccountsFromDb","pipe","accounts","AccountStatus","Prospective","getResellersFromDb","customerId","updateCustomerFeatures","switchMap","getCustomerFeatureSet","accountId","post","Website","Platform","Verilocation","resellers","resellerId","resellerAccount","Description","getCustomerAccount","customer","refreshFeatureSet","includeDisabled","featureSet","getFeatureDescriptionsForAccount","f","HttpClient","DataCacheService","ExportType","DynamicReportService","$document","preferencesService","reportDefenitionsCacheName","dataSourceIconMappings","dataSource","rowDataSourceToCustomParameterMappings","rowDataSource","ReportTableRowDataSource","DriverGroup","mappings","parameterName","valueType","ReportParameterValueType","ParameterType","ReportParameterType","CreateUnassignedGroupRow","defaultValue","Active","VehicleGroup","VehicleDepot","reportTypeToCustomParameterMappings","MinimumDistance","minValue","MinimumFuelUsed","MinimumSpeed","MinimumIdleTime","ExcludeGpsJourneys","ExcludeInconsequentialJourneys","ShowOnlyBusinessJourneys","LatLongOnly","Select","ShowOnlyAlcolockEventGroup","AlcolockEventGroup","Fail","Circumvention","Pass","SignificantEvent","MinimumFuelLevelChange","maxValue","IncludeOnlyInstalledCameras","ReasonCode","ContextualSpeeding","HarshAcceleration","HarshSteering","HarshBraking","BadAnticipation","IdlingOverThreshold","CanbusPto","MinimumEventTime","ShowDurationPastEndTime","InProgressGeofenceVisits","TemperatureProbes","HiddenProbes","ExcludeVehiclesWithoutActivity","enumNames","vt","apiUrl","getApiUrl","RowDataSource","SubRowDataSource","None","Portrait","Headers","Rows","SummarySections","newReport","Shared","reportId","newReportSchedule","Frequency","SchedulingFrequency","Weekly","ReportDefinitionId","PDF","RepeatOn","DayOfWeek","Monday","SendTo","parseScheduleParametersJson","parseSchedulePreferencesJson","getColumnHeaders","reportColumns","rowTitleColumn","findColumn","stringColumn","doubleColumn","dateColumn","durationColumn","successfulLogs","reportLog","Success","formatReportLog","scheduleId","reportParameters","Start","End","isNullOrDefault","parametersHaveDatesSet","TimeFilterType","TimeFilterStart","TimeFilterEnd","timeStart","getDurationFromTimeSpan","timeEnd","timespanToUTC","timespanToLocal","preview","formatParametersToUTCTimezone","Parameters","formatParametersToLocalTimezone","Footer","uniqueId","getUniqueColumnId","ReportType","DataSourceValue","reportName","existingReportId","encodeURIComponent","getColumnsPromise","getDataSourceDefinitionPromise","getDataSourceDefinitions","accountPromise","getAccountData","dataSourceDefinition","mapDataSourceDefinitionsToColumns","formatColumnsForDisplay","columnHeaders","availableColumnHeaders","IsVisible","ColumnDefinition","Format","getDisplayColumnHeaders","IsRowTitle","dataTypeDisplayName","getColumnTypeDisplayName","DefaultTitle","supportedReportDataFunctionDefinitions","createDisplayDatafunctions","mapIconForDataSource","DataSourceType","columnDefinition","functionDefinitions","SupportedReportDataFunctions","func","definition","ReportDataFunction","function","Sum","report","TachoRecord","isTemperatureReport","TemperatureRecord","headersContainsReportType","getCurrentUser","reportPromise","formatReportForDisplay","isSystemReport","i1","i2","definitionId","deleteItem","getReportsFromDB","reportsPromise","reportDefinitions","userPrefs","setReportPreferences","ReportTypesNavLabels","System","User","reportNavType","getReportType","collatedHeaders","currentHeader","currentRunningTotal","h","headerName","headers","schedule","promise","Preferences","getAllPreferences","combinedPrefs","Timezone","stringifyScheduleParameters","stringifySchedulePreferences","savedSchedule","exportType","responseType","fileURL","URL","createObjectURL","createElement","href","target","download","getDocumentExtension","body","appendChild","click","removeChild","filteredReportDefinitions","showReportDefinition","activeMappings","existingMatch","customParameters","activeMapping","matches","flatMap","match","setParameterDefinitionsFromReport","ap","reportParameterValueType","customReportDefinitions","getCustomParameterDefinitions","containsType","CustomParameters","cp","GeofenceCategory","Zone","requiresSelector","latestParameterTypes","LatestCameraOnlineHistory","LatestBrakePerformanceHistory","LatestBrakePerformanceValue","hasLatestParameter","StaticStockReportId","allColumns","categories","getColumnDataSourceName","existingCategory","columnFilterOptions","getUniqueReportCategories","Icon","option","TranslatedDisplayName","cfo","filterOptions","dateFilter","filterType","vehicleFilter","driverFilter","DriverId","driver","groupFilter","VehicleGroupId","group","DriverGroupId","dataSourceType","columnsToSearch","getTimezone","timezone","localOffset","utcOffset","tz","IanaId","foundColumn","findColumnsOfType","PreferencesJson","ParametersJson","DurationFormat","newPreferences","Section","Internationalisation","columnHeader","ensureUniqueColumnId","random","titleHeader","findIndex","rowTitleHeader","newHeaderColumn","getTitleForRowDataSource","Sorted","findAndReplaceRowTitle","debug","getColumnHeaderFilterOptions","canFilterColumn","showFilterValueOperators","showTimeFilter","filterTimeHour","filterTimeMinute","Duration","parsedTimeSpan","parseTimeSpan","FilterValue","timeFilter","setMomentToMinuteOfDay","typesWithFilterValueOperators","Double","Int","Score","typesWithoutFilterValueOperators","List","Location","displayTimeFilterControls","displayFilterValueControl","displayValueContainsControl","displayGenericFilterValueControls","Driver","Geofence","Journey","Route","StationaryLocations","TrailerAssociation","reportTile","ReportTitle","ThumbnailFileGuid","thumbnailUrl","pdfUrl","PdfFileGuid","excelUrl","ExcelFileGuid","csvUrl","CsvFileGuid","headerSortSettings","headerId","ascending","sortHeader","SortAscending","local","utc","CSV","Excel","parameterDefinitions","parameter","reportParameter","direction","mapPrefs","preference","Report","mappingFn","FilterBarComponent","ItemFilterComponent","DriverButtonFilterComponent","DateButtonFilterComponent","TagButtonFilterComponent","DriverListComponent","VerticalFilterListComponent","VehicleTypeButtonFilterComponent","directives","TagsService","ResourceFiltersDirectivesModule","ScrollingModule","VeriDate","timeFormat","fullTimeFormat","dayFormat","monthFormat","yearFormat","dayMonthFormat","dateFormat","dateTimeFormat","fullDateTimeFormat","formatType","momentDate","outputFormat","isMoment","fromNow","clone","startOf","durationMs","asDays","formatDurationMs","formattedDate","startMoment","endMoment","roundBy","roundUp","remainder","subtract","createDate","secondsDiff","Custom","daysInMonth","startDateString","endOf","toDate","inputMinutes","exceptionValue","exceptionString","shortHand","displayMinutes","displayHours","hourDisplay","minDisplay","timeSpan","dayHourSplit","timeSplit","isBefore","isBetween","totalMins","set","timespan","segments","hourSeconds","minuteSeconds","final","hoursString","minuteOfDate","getMinuteOfDayFromDate","convertMinsToTimeSpan","toJSON","onPageVisibilityShow","onPageVisibilityHide","updateAccountImage","groupFilterChanged","hidePopup","onShowResourceFilterBar","onHideResourceFilterBar","closeResourceFilterBar","updateVideoSize","openGeofenceEditor","onReportRun","ConstantsService","googleMapsApiKey","reportsApiUrl","isMobile","isLocalDevelopment","isDev","isUat","isProduction","isFleet","tokenUrl","moduleDirectory","moduleCount","migrationStatus","calculateAngularJSComponents","totalComponentCount","AJSComponentCount","MigratedComponentCount","migrationPercentage","greenBar","greyBar","moduleName","OtherCount","ServiceCount","angular","iq","requires","subModule","subModuleStatus","errors","requiredLength","min","max","control","formGroup","controls","updateValueAndValidity","markAllAsTouched","valid","CustomFormValidators","doesVehicleExist","vehicleExists","vehicleDuplicated","isFinite","emptyWhiteSpace","minimumArrayLength","minimum","duplicateVehicle","accountHasConfig","accountIds","duplicateEmail","users","emailAlreadyExists","duplicateConfigName","configs","config","configNameDuplicated","GroupCanBeUsedAsParent","allGroups","IsDepot","prospectiveParentId","anyCascadeGroupIsDepot","parentGroup","g","ParentId","duplicateProperty","items","propertyName","customErrorKey","duplicateArrayItem","formArrayControls","duplicateControls","formArrayControl","simIccid","iccid","sum","val","lastDigit","parity","intVal","luhnCheck","ResourceAllocation","requestQueue","expiryTimers","callback","setDefaultOptions","collection","getCollection","isExpired","resetCache","fetchData","subject","emitData","keyName","age","additionalData","insertItemIntoCollection","removeItemFromCollection","clearAllTimeouts","clear","expiry","existingCollection","ReplaySubject","existingItem","delete","from","next","request","catchError","throwError","shareReplay","subscribe","mappedData","complete","setTimeoutForCache","clearCache","timer","clearTimeout","VehicleInfoCardComponent","VehiclePlotTimeComponent","DriverSummaryPanelComponent","VehicleStatusComponent","VehicleButtonFilterComponent","VehicleListComponent","VehicleDirectivesModule","MapDirectivesModule","VTableLayoutContainer","VTableComponent","VTableHeader","VTableCell","StackedCell","VTableActionsComponent","TableSummaryBox","VTableColumnEditorComponent","ComponentAnchorDirective","VTableModule","DriverIdType","TachoType","IgnitionType","EngineerJobItemStatus","EngineerJobItemType","EngineerCommissionStatus","ExtendedDetails","CommissionPeripheralForm","CommissionDurationPeriods","NonTestableDevices","IAampAlarmType","ValidationResult","InstallSetupCode","Category","CommissioningCheckType","AampSimStatus","ImportStrategyReference","ImportType","Drivers","Colour","FilterBarService","dataChanged","Subject","tableColumnEditorOpen","translationString","predicate","open","MapService","colourService","googleMarkerService","mapReadyPromises","mapAPIReady","boundsBuffer","getUsersLocation","getGoogleMapsApiKey","loadGoogleMapsScript","channel","libraries","transport","isGoogleMapsForWork","userLocation","google","maps","LatLng","coords","latitude","longitude","isChina","query","omitOptions","k","defer","mapAPIReadyPromise","loadMarkerWithLabelScript","loadMarkerClusterScript","waitForMapsToFullyLoad","script","async","src","getGoogleMapsAPIUrl","head","elementRef","nativeElement","parentNode","nodeName","element","isolateScope","scope","$ctrl","container","myOptions","mapReadyPromise","event","addListenerOnce","relativeToWindow","topRight","getProjection","fromLatLngToPoint","getBounds","getNorthEast","bottomLeft","getSouthWest","scale","getZoom","worldPoint","mapRect","getDiv","getBoundingClientRect","left","top","Point","point","fromPointToLatLng","trigger","fromLat","fromLng","toLat","toLng","inMetres","a1","toRadians","a2","b1","b2","sin","cos","distance","atan2","sqrt","setOptions","styles","featureType","stylers","visibility","latlng","offsetx","offsety","point1","getCenter","point2","panTo","circle","Circle","setCenter","setRadius","bounds","fitBounds","currentZoom","smoothZoom","setZoom","zoomLevel","targetZoom","equals","contains","smoothPanAndZoomTo","zoomAndCallback","gmap","mapOffset","originalPoint","convertLatLngToPoint","convertPointToLatLng","newBounds","LatLngBounds","topRightPoint","offsetTopRight","bottomLeftPoint","offsetBottomLeft","extend","latLngs","getBoundsFromLatLngArray","mapDiv","dimensions","clientWidth","height","clientHeight","maxZoom","getBoundsZoomLevel","setOffsetCenter","newCenterLatLng","offsetLatLng","newCenterLat","lat","newCenterLng","lng","offsetX","offsetY","pixelOffset","newPoint","locations","TILE_SIZE","latRadian","PI","radX2","zoom","mapPx","worldPx","fraction","LN2","ne","sw","latFraction","lngDiff","lngFraction","latZoom","lngZoom","position","Latitude","Longitude","createEventMarkerOptions","color","events","stroke","weight","opacity","latLngArray","dashed","path","getDefaultDashedPolylineOptions","getDefaultPolylineOptions","redColor","convertPlotsToGoogleLatLng","newPolyline","createPolyline","addDirectionArrows","polyline","lineColor","icons","SymbolPath","FORWARD_CLOSED_ARROW","fillOpacity","fillColor","strokeColor","strokeWeight","offset","repeat","strokeOpacity","linePoints","points","p0","p1","p2","p3","bp1","bp2","d1","d2","d3","A","B","N","M","d3powA","d2powA","d3pow2A","d2pow2A","d1pow2A","d1powA","alpha","ax","ay","bx","by","cx","cy","dx","dy","tolerance","highestQuality","performance","mark","sqTolerance","simplifyRadialDist","simplifyDouglasPeucker","measure","last","simplified","simplifyDPStep","first","maxSqDist","sqDist","getSqSegDist","simplifyRoute","encodedLine","getPointsFromEncodedStringNative","xsum","ysum","bigInt","zero","or","shiftLeft","diagonal","toJSNumber","ny","nx","prevPoint","newPoints","len","getSqDist","bigInt0","BigInt","bigInt1","bigInt2","bigInt5","bigInt31","bigInt32","latLngList","geolocation","getCurrentPosition","FoundationVehiclesService","activeVehiclesCacheName","allVehiclesCacheName","activeOnly","cacheToRetrieve","getVehiclesFromDb","serial","activeVehiclesOnly","getNames","enumeration","enumCache","list","one","two","DriverService","displayService","driverId","cachedDrivers","driversPromise","getDriversFromDatabase","drivers","labelInactive","getTagDriverMappings","ShowInactiveDrivers","DisplayName","activeDriverList","driverPromise","driverIndex","driverToFind","lowerCaseName","driverSearchPredicate","FirstName","LastName","updateOrInsertDriverCache","driversCache","username","base64ImageString","Mobile","censorDriverName","idx","EngineerJobStatus","UIGmapMarkersComponent","UIGmapMarkerComponent","UIGmapPolylinesComponent","UIGmapPolylineComponent","UIGmapPolygonComponent","VeriMapCurrentJourneyComponent","VeriMapJourneysNewComponent","VMapComponent","VeriMapSingleGeofenceComponentFacade","VeriMapContainerComponentFacade","MarkerAnchorPosition","EventMarkerType","GoogleMarkerService","veriMarkerService","factSession","markerWidth","markerHeight","getDefaultMarkerWidth","isPip","generatePip","Reason","scaledSize","Size","anchor","zIndex","createVeriMarkerOptions","generateMarkerOptions","veriMarkerOptions","showPlotTime","isMarkerOptionsSame","markerModel","VehicleLabel","MarkerLabel","VehicleLabelText","labelIsReg","optionsCopy","copy","googleMarkerOptions","labelAnchor","labelClass","labelContent","formattedTime","Utc","generateMarkerImageUrl","draggable","visible","anchorPosition","getEventMarkerAnchorPosition","markerOptions","showLabel","subIcon","Top","eventType","buildOptions","showLabelClass","colour","markerClass","imageUrl","ngMapMarkerClusterer","showMethod","clusters_","updateClusterIconFunction","clusterIcon_","cluster","_show","GeofenceType","cd","el","filterBarService","responsiveService","vTableService","selectionType","VTableSelectionType","rowClick","EventEmitter","tableRowsChange","tableDisplayRowsChange","selectedRowsChange","vTableSelectionType","subscriptions","Subscription","rowHeight","canEditColumns","showColumnEditor","setupSubscriptions","changes","tableRows","handleNewTableRows","showCheckboxColumn","Multi","subscribeToRowDataChanges","observers","clickable","tableHeaders","render","unsubscribe","visibilityObserver","unobserve","tableHeader","applyColumnSorting","toggleTableColumnEditor","sortedHeader","getSortedHeader","sortColumn","bringSelectedRowsToTop","setDisplayRows","viewport","checkViewportSize","tableRow","Single","emit","toggleRow","selectAll","selectableRows","displayRows","selectedRows","toggleAllRows","class","detectChanges","currentWidth","checkCanEdit","createTable","setTableHeaderIds","setTableRowIds","linkHeadersToCells","trueSize","setTrueSize","getTableColumnPreferences","numRows","minHeight","maxHeight","classList","updateSelectedRows","setupMultiSelect","clearAllSelectedRows","markedForRemoval","rowInTable","setAllRowsSelected","accumulator","rowIndex","cellIndex","selectedRowIndex","allRowsSelected","setupVisibilityObserver","IntersectionObserver","entries","entry","isIntersecting","currentWindowWidth","markForCheck","observe","setupTable","unshift","rowDataObservable","loading","untilDestroyed","createTableRows","Input","Observable","HostBinding","Output","ViewChild","CdkVirtualScrollViewport","ViewChildren","QueryList","UntilDestroy","Component","selector","ChangeDetectorRef","ElementRef","ResponsiveService","WindowBreakpoint","currentBreakpoint","BehaviorSubject","getBreakpointFromWidth","innerWidth","currentBreakpoint$","asObservable","currentWindowWidth$","subscribeToWindowEvents","minDisplayWidth","widthToCompareTo","maxDisplayWidth","minBreakpoint","breakpointToCompareTo","minBreakpointWidth","getWidthFromBreakpoint","maxBreakpoint","maxBreakpointWidth","parentElement","renderer","setStyle","originalDisplayStyle","removeStyle","fromEvent","debounceTime","windowEvent","updateCurrentBreakpointUsingWidth","newBreakpoint","breakpointMap","getBreakpointMap","breakpointWidth","breakpoint","Small","Medium","Large","ExtraLarge","Massive","DialogService","overlay","injector","content","OverlayConfig","hasBackdrop","panelClass","backdropClass","overlayRef","myOverlayRef","VDialogRef","createInjector","attach","ComponentPortal","ref","inj","Injector","provide","useValue","Overlay","SavedState","CommserverMigrationStatus","$on","AccountFeaturesUpdatedEvent","password","getAccountDataFromDatabase","processAccountData","passwordReset","emailRequired","targetEvent","multiple","escapeToClose","clickOutsideToClose","controller","controllerAs","locals","defaultLanguage","dialogOptions","UserPreferencesDirectiveController","$event","dialogHTML","dialogId","customClass","bindings","onCancelled","onPasswordUpdated","preventFocusOnOpen","hideXCloseButton","showDialog","clearAllCachesAndSessions","updateCache","CompanyName","Image","updateAccountCache","RouteStartCondition","RouteEndCondition","VisitMatchOptions","JourneyCostType","LandingPageOptions","PreferencesService","accountPreferences","userId","timeZoneName","localUILanguageString","updateDatabasePreferencesIfRequired","updateLocalLanguage","userLangPref","Language","LocalUILanguageString","tempUserPrefs","saveRequired","sanitisedLocalUILanguageString","savePreference","updateUserPreferences","compact","tabs","rowDataUniqueKey","change","noTabs","showAdditionalFilters","aggregateFilterEvent","moreFilterTypes","filters","filterBarListFilters","showHideFilters","updateTabCounts","tableRowsMap","setSearchPredicate","tableSearchPredicate","showSearch","searchPredicate","onFilterChange","filterData","remainingSpace","searchDebounce","tab","setEventData","customName","filterTableRows","activeElement","blur","updateFilterVisibility","itemsToShow","dropdownItem","querySelector","filterBarFilter","filterPredicate","display","filterDataPredicate","rebuildList","maxListItemCount","updateList","countAsPercentageOfMax","updateAllFilterBarCounts","updateFilterBarCounts","otherFilterListsToinclude","selectedItems","itemLength","updateItemCount","itemList","filterList","multiSelectMode","hasFilterApplied","updateFilterListCounts","filterDataByListFilters","custom","ignoreTabFilter","filterLists","FilterBarListIterable","fl","FilterBarItemSearchPredicate","IReportHistory","providerString","useFactory","deps","googleMarkerServiceFactory","journeyServiceFactory","colourServiceFactory","chartServiceFactory","loginServiceFactory","accountServiceFactory","sessionServiceFactory","plotServiceFactory","googleServiceFactory","popupServiceFactory","mapServiceFactory","mapzenServiceFactory","vehicleServiceFactory","driverServiceFactory","groupServiceFactory","tachoServiceFactory","vehicleDataFactory","veriDateFactory","currentUserServiceFactory","usersServiceFactory","accountFeatureServiceFactory","avatarServiceFactory","constantsServiceFactory","unitConverisonFactory","geofenceServiceFactory","geocodeServiceFactory","driverAssignmentServiceFactory","fullScreenServiceFactory","canvasServiceFactory","veriMarkerServiceFactory","fileReaderServiceFactory","displayServiceFactory","translationServiceFactory","googleMarkerServiceProvider","journeyServiceProvider","JourneyService","colourServiceProvider","ColourService","chartServiceProvider","ChartService","loginServiceProvider","LoginService","accountServiceProvider","sessionServiceProvider","SessionService","plotServiceProvider","PlotService","googleServiceProvider","GoogleService","popupServiceProvider","PopupService","mapServiceProvider","mapzenServiceProvider","MapzenService","vehicleServiceProvider","driverServiceProvider","groupServiceProvider","GroupService","tachoServiceProvider","TachoService","vehicleDataServiceProvider","VehicleDataService","veriDateProvider","currentUserServiceProvider","usersServiceProvider","UsersService","accountFeatureServiceProvider","avatarServiceProvider","AvatarService","constantsServiceProvider","unitConversionServiceProvider","geofenceServiceProvider","GeofenceService","geocodeServiceProvider","driverAssignmentServiceProvider","DriverAssignmentService","fullScreenServiceProvider","FullScreenService","canvasServiceProvider","CanvasService","veriMarkerServiceProvider","VeriMarkerService","fileReaderServiceProvider","FileReaderService","displayServiceProvider","DisplayService","translationServiceProvider","ServicesModule","VorService","ReasonCodeService","CameraCommunicationServer","ThemeService","HTMLService","PlotEventService","BreadcrumbService","TemperatureService","ProductService","UtilisationService","SamlService","BoundsSource","LocationType","address","isCountryCode","getAddressFromPoint","videoEntryId","AUTHENTICATION_LOCK","VideoEntryUtils","EventCode","VideoEventCode","UserRequested","Archived","Downloaded","isSeen","MetaData","Watched","UploadRequested","UserUploadRequested","Uploading","Uploaded","PartiallyUploaded","hasNoFootage","NoFootageAvailable","PartiallyDownloaded","DateDownloaded","AwaitingIndexing","AwaitingRedaction","RedactionCompleted","IndexingInProgress","RedactionInProgress","AwaitingVideoMute","NoFilesAvailable","HardwareDeleted","Cancelled","Expired","MediaDeleted","MediaPendingDeletion","isDownloaded","isDownloading","reviewStatus","VideoReviewStatus","NeedsReview","videoEvent","DownloadProgress","Mp4VideoFileGuid","isDownloadFailed","groupNamesCache","groupsBasicMappingsCache","groupsFullMappingsCache","groups","groupSearchPredicate","GroupIds","vehicleList","groupVehicle","showVehicleWithNoUnit","showNonFunctioningUnit","unsetGroupRelations","groupId","DriverIds","children","hasDriver","hasVehicle","idToMatch","assetType","groupIds","assets","resourceId","ResourceId","includeDepotSubGroups","getFlatChildGroupList","concat","getGroupsFromDatabase","getGroupsWithFullMappings","findGroup","setGroupsRelations","addOrUpdateGroup","groupName","existingGroupId","matchedMapping","findMapping","included","OwnedByGroup","Count","removeMapping","groupMapping","GroupId","OwningGroupIds","mappingIndex","newGroupVehicleMappings","GroupVehicleMappings","newGroupDriverMappings","GroupDriverMappings","copiedGroup","resourceName","propertyMapping","vehicleID","assignedDepotId","currentDepotId","newVehicleDepot","existingDepots","groupsToSave","groupsToModify","childrenGroupsToModify","existingDepot","removeVehicleFromGroup","removeVehicleFromGroupChildren","addVehicleToGroup","promises","saveGroup","groupPropertyName","bigList","self","child","removeDuplicatesFromGroups","setGroupParents","sortGroups","textA","toUpperCase","textB","parentIndex","kid","grandParent","groupIndex","acc","sumParents","flattenedChildren","flat","sumChildrenNestingLevel","removeDuplicates","groupType","ids","obj","dedupedIds","RecipientType","RecipientDeliveryType","NotificationStatus","ApplicationType","AlertState","AlertCategory","VehicleAlertSubCategory","TollAlertSubCategory","GeofenceAndZoneAlertSubCategory","TyreAlertSubCategory","FaultCodeAlertSubCategory","TachoAlertSubCategory","TranscanAlertSubCategory","InputAlertSubCategory","TemperatureProfileAlertSubCategory","ResourceFilterType","TriggerValueOperator","AlcolockAlertSubCategory","VideoEventSubCategory","AlertPreferenceType","AxleWeightProfileAlertSubCategory","PowerEventAlertSubCategory","PeripheralService","hardwareMappingService","productsService","peripheralsCache","getPeripheralsFromDb","combineLatest","getPeripherals","getPeripheralMappings","vehiclesMap","mergeMap","peripheralMappingsMap","Serial","peripheralsWithPeripheralMappings","applyVehicleMappingsToUnits","getProductsAndMap","getAllPeripheralsWithMappings","cameras","onlineStatusesMap","filterCameras","getPulseRecords","camera","onlineStatus","lastOnlineTime","online","hasStreaming","sortingTime","LastOnlineTime","Product","ProductMetadata","CameraFeatures","LiveStream","Online","records","recordsMap","Required","latestRecord","parsedPayload","Payload","currentFW","HardwareFirmwareVersion","HardwareConfigName","Completed","currentConfig","currentTelematicsAppVersion","Applications","AppVersion","currentUpdaterAppVersion","FirmwareVersion","getPeripheralsForVehicle","getProductUiViewModels","products","peripheral","product","ProductId","featuresEnumArray","peripheralsCurrentlyInstalled","peripheralsNotInstalled","featureEnum","findInstalledPeripheralForFeature","setMetaDataOnUnit","installed","notInstalled","getPeripheralsWithMappingsForVehicle","createInstalledPeripheralList","imei","jobItemVehicleId","updateDto","featureIndex","chosenPeripheral","peripheralFeatures","findFeaturesFromFeaturesEnum","alreadyAddedPeripheral","installedPeripheral","getOnlineStatusForCamera","vehicleMapping","CameraOnlineHistoryService","HardwareMappingService","ProductsService","RouteVisitStatus","elementId","iterationCount","targetElement","getElementById","scrollIntoView","block","scrollTo","elRect","rects","right","bottom","visibleWidth","visibleHeight","isVisible","isContained","rect","scrollingParent","stopY","step","speed","iterate","newPosition","scrollTop","scrollStep","tagName","getParentByTag","getAngularComponentFromElement","ngProbeElement","ng","componentInstance","ngElement","startElement","className","stopTagNames","startingElement","ignoreParents","currentSearchDepth","maxDepth","childElement","childResult","findNearest","parentTag","scrollParent","getScrollParent","offsetLeft","offsetTop","offsetWidth","offsetHeight","includeHidden","getComputedStyle","excludeStaticParent","overflowRegex","overflow","overflowY","overflowX","scrollingElement","TemperatureProbeService","ambientProbe","TemperatureProbeCategory","Ambient","zones","temperatureRecords","zone","mapProbeLatestRecord","rec","TemperatureProbeId","temperatureProbes","category","latestTemperature","profile","TemperatureProfile","UpperBound","LowerBound","UserService","usersCacheName","getUsernameMappings","getAllUsersFromDb","getMappings","getAccountUserMappings","applyMappingsToUsers","forkJoin","getAccountUserMappingsForAccount","userLanguage","tap","postAccountUserMapping","saveUser","IsActive","emailAddress","includeCurrent","AccountUserMappingService","FoundationUserResellerMappingService","_service","DriverStatus","$cacheFactory","$log","userPreferencesService","webSocketService","dataStorage","needToCollectUserData","refreshPromise","refreshAttempts","getTokenUrl","refreshBuster","AccessToken","sessionStorage","clearCustomerCacheData","force","removeItem","transition","isSessionStorageKey","DriverVehicles_DONTUSE","Geofences_DONTUSE","ReasonCode_DONTUSE","keyString","access_token","RefreshToken","refresh_token","LoginFail","LastTokenAssignmentTime","dateLastRefreshed","rt","refreshSession","internal","setStorage","logout","finally","saveUserOptions","saveAccountOptions","accountOptions","AccountOptions","ConfigurableDashboards","accountOptionModel","AccountOption","sessionKey","refreshCountString","refreshCount","host","close","clearAllCaches","removeAll","canvasService","driverService","groupService","filterOptionsService","$sanitize","blueGeofenceColors","defaultGeofenceColors","selectedGeofenceColors","MAX_POLYGON_AREA","MIN_POLYGON_AREA","MAX_GEOFENCE_RADIUS","MIN_GEOFENCE_RADIUS","geofenceCacheName","navPointCacheName","deleteOnExpire","geofenceId","getOrRetrieveItem","getGeofenceNavigationPointsFromDatabase","navigationPoints","geofenceNavigationPoints","upsertItem","newItem","visitsPromise","getAndMapVehiclesToVisits","includeAllIntersecting","mapVehiclesAndDrivers","geofencesPromise","getGeofencesFromDatabase","getTagGeofenceMappings","tagsPromise","getTags","tags","geofences","geofence","TagIds","Tags","tag","geofenceTagId","t1","t2","Position","PriorityTag","geofencePromise","showLabelWhenZoomedOut","drawImmediately","overlays","createGeofenceOverlay","geofenceOverlay","nw","se","geometry","spherical","computeArea","MapCoords","Points","center","polylabel","Polygon","createGeofenceCoords","GeofenceOverlay","resource","newGeofence","Radius","Standard","Addr3","addressPromise","geocodedAddress","geofenceCopy","createSerializeableGeofenceCopy","isSystemGeofence","removeAndResetGeofenceTags","updateOrInsertGeofenceCache","geoFences","geofencesCopy","createSerializeableGeofencesCopy","geofenceSource","geofencesSource","PendingDelete","clearInstanceListeners","setMap","Addr1","Addr2","Addr4","addressComponents","deleteVertexParams","polygon","getPath","addListener","deleteButton","remove","geoArea","computeDistanceBetween","vs","inside","xi","yi","xj","yj","veriMap","getAllGeofencePoints","geofenceCenter","gTop","computeOffset","gBottom","northeast","southwest","fitMap","geofenceVisits","geofenceVisit","vehicleDepot","dialogTitle","focusedLatLngs","onGeofenceEditorCancelled","onGeofenceEditorSaved","savedGeofence","onGeofenceEditorDeleted","deletedGeofence","ignoreMaxSize","newValidation","failedReason","currentRadius","polyPath","currentPolyArea","maxAreaLabel","minAreaLabel","Shapes","pointsArray","shape","shapePoints","pointGroups","newPolyGroups","pointGroup","getLatLngArrayFromPointsArray","paths","polygonGroups","polygonGroup","createPolygonGroupForGeofence","geoJsonObject","getPolygonPoints","getMin","getMax","minLat","minLng","coordinates","DescriptionExt","getDrivers","visits","visit","btnDelete","allowDelete","getLength","hover","$","css","mousedown","unbind","removeAt","amendedGeofence","formValidationService","super","selectedItemProp","minLength","useStatus","itemClicked","noMatches","textChanged","inputStatus","VButtonStatus","showDropdown","onLoadingItems","onLoadingItemsFromObservable","setSelectedItemFromProps","validateItemProps","previousValue","currentValue","clearInput","ignoreClicksFrom","autoCompleteInputRef","reset","filterResult","triggeredByInput","itemPromise","itemObservable$","filterResults","focus","toggleDropdownVisibility","updateStatus","onTextChanged","itemDisplayProp","selectedItem","onItemClicked","selectedItemId","itemFilter","valueString","lowerCaseText","results","onDataLoaded","openDropdown","allowError","TemplateRef","read","colours","journeyColours","tagColours","greenColor","orangeColor","greyColor","vigetColours","createColours","maxDimensions","multiplier","journeyColoursOnly","getColourIndex","hexToRgb","solidColour","isJourneyColour","isTagColour","colourEnum","Blue","Purple","Yellow","Orange","Green","Red","Black","Grey","transparentColour","createTransparentColor","createStylesForJourneyColors","hex","bigint","runtimeStyles","getJourneyBorderClassName","getJourneyBackgroundClassName","CameraService","httpClient","productService","eventLabel","VideoLabelIcon","NotificationsActive","Person","DirectionsCar","LocalCarWash","Videocam","video","channelMedia","media","mp4VideoUrl","iframe","setAttribute","getOptionsQueryParams","lastValueFrom","isLiveStreamCam","videoStreams","uniqueStreams","videoStream","uniqueStream","ChannelId","StreamUrl","peripheralSerial","videoRequest","streamType","put","streams","totalStreams","forwardStream","stream","CameraLocation","Forward","channel5Stream","channel1Stream","firstOrDefault","getIconForEvent","displayEventCode","videoEntries","videoEvents","VideoStartTime","needsReviewCount","Authorised","unwatchedCount","channels","videoChannels","playSession","seekTime","acceleration","CameraEventThreshold","braking","cornering","CameraEventThresholds","thresholds","getCameraThresholds","eventPeriods","currentPeriod","medium","startSecond","endSecond","VTabStepperState","navigationService","tabLayout","hideFinalButton","onFinishCallback","tabSelect","registeredTabs","disablePrev","fontAwesome","selectedTab","tabIndex","setDefaultSelectedTab","startTab","allowOverride","disabled","stepperState","Complete","hideTab","showTab","InProgress","preventDefault","getNextTab","selectTab","onFinish","overrideDisable","getPrevTab","tabTitle","currentIndex","tabId","UnitsService","units","getAllUnits","getAllUnitMappings","unitMappingsMap","unitsWithUnitMappings","getUnitBySerial","getVehicleMappingsForUnit","searchResponse","Unit","unitMappings","getUnitMappingsForVehicle","getUnit","unitLocation","UnitLocation","StartUtc","AlertRecordMaterialisationOptions","AlertsService","unitConversionService","activeAlertsCacheName","monthToCheck","materialisationOptions","MaterialisationOptions","ruleId","dateParameters","getDateRange","recordId","rule","prepareRuleForDisplay","rules","getActiveAlertRulesFromDb","alertRuleRecordId","notificationId","code","alertRule","autoLoadedRecordId","onAlertEditorCancelled","onAlertEditorDeleted","onAlertEditorSaved","prepareRuleForSaving","AlertRuleStatus","Deleted","recipient","customCode","smsParts","countryDialCode","plusCountryDialCode","remaining","startsWith","alertCategoryTriggers","enum","categoryAllowedDelayResend","speedUnitSuffix","subCategories","Speeding","FuelLevelChange","ExcessiveDwell","subCategoriesAllowedDelayResend","showReasonCodes","PlotReason","labels","subCategoriesUnits","Toll","Alcolock","FaultCode","DrivingWithoutTachoCard","Inputs","Transcan","CameraEvent","AxleWeightProfile","PowerEvent","alertRecord","AlertMetadataJson","alertMetadata","subCategoryEnum","subCategoryString","Recipients","Group","Filters","All","Any","Specific","ZoneService","latestMultiStateInputRecords","multiStateInputs","source","inputs","MultiStateInputCategory","ReeferZoneOperatingMode","statusesByZone","linkedRecord","history","MultiStateInputId","triggerStateItem","zoneId","ZoneId","State","reeferZoneModes","reeferZoneMode","operatingMode","zoneOperatingMode","temperatureSetpoints","setpoint","setpointReading","histories","SetpointValue","activeOutOfBoundsHistory","outOfBounds","reeferUnit","ReeferZoneOperatingModeCategory","Heating","Cooling","Defrost","Idle","Sleep","PowerOff","Pretrip","zoneIcon","getOperatingModeIcon","zoneIconClass","getOperatingModeColourClass","EngineerJobItemService","jobItemsCacheName","getEngineerJobItemsFromDb","engineerJobItem","jobItem","jobItemId","createUpdateEngineerJobItem","jobItems","completedJobItems","totalJobItems","selectListFn","out","inx","PlannedRouteService","driverAssignmentService","geofenceService","googleService","plannedRouteVisitService","unplannedStopService","plannedRouteServiceCache","plannedRouteId","updateDatabase","routeId","plannedRoute","RouteStatus","removeDetailPropertiesForSave","route1","route2","routes","plannedRoutePromise","unplannedStopsPromise","getUnplannedStops","getUnplannedStopsForRoute","getLinkedElementsForPlannedRoutes","plannedRoutes","filterRoutes","getPlannedRoutesFromDatabase","customTimes","getUnplannedStopsForRoutes","mapVehicles","mapDrivers","assignmentsPromise","getDriverAssignments","mapGeofences","getGeofences","unplannedStops","assignments","updatedPlannedRoutes","formatRoutePromises","updatedRoute","getCancelledVisits","filterOutCancelledVisits","mapDriversToVehicles","assignVehicleToRoute","assignDriverToRoute","formatPlannedVisitsForDisplay","formatRouteForDisplay","parseRouteRules","groupPlannedAndUnplannedVisits","formatDistanceAndLineForRouteVisits","PlannedVisits","updateOnSiteTimeMins","mapGeofenceToVisit","setDisplayLabelForPlannedVisit","unplannedVisits","allVisits","createRouteDetailVisitFromPlannedVisits","createRouteDetailVisitFromUnplannedStops","plannedArrivalTime","allVisitsId","totalPlannedDistanceKm","setEditableStatus","setDeletableStatus","setFirstAndLastVisit","firstVisit","lastVisit","setRouteDisplayName","setRouteDisplayDuration","setRouteDisplayPlannedDistance","setRouteDisplayStatus","setTotalPlannedVisits","editingDisabled","Planned","Started","deletingDisabled","ExternalReference","displayLabel","routeDisplayName","getRouteDuration","totalDurationMins","calculateTotalDistanceKm","planned","ActualEndTime","ActualArrivalTime","PlannedArrivalTime","ActualDepartureTime","PlannedDepartureTime","sortVisitsByPlannedArrivalTime","totalDistanceKm","updateDistance","updateLinePoints","updateDirectionsForVisits","startLocation","endLocation","latLngFrom","getLatLngsForVisit","latLngTo","getDirections","RouteStopLocation","RouteStopLocationJson","geoAreas","routeVehicle","routeDriver","filteredPlannedRoutes","addToList","showCancelledRoutes","PlannedStartTime","onlyRoutesThatCanBeEdited","findGeofence","GeocodedAddress","Address","FormattedAddress","displayNameAddressLabel","valueOf","routeDisplayStatus","routeDetailDisplayStatus","visitCount","Arrived","Departed","CompletedWithMissing","requiresStartLocation","requiresEndLocation","TmsRouteRules","RouteMatchingRules","StartRouteOnDepartStartingLocation","EndRouteOnArriveAtEndingLocation","totalPlannedVisits","openRouteDetailsDialogById","VisitOnTimeStatus","Missed","arrivalDiff","travelTimeBufferMins","convertTimeSpanToMins","TravelTimeBuffer","OnTime","Early","Late","departureDiff","onSiteTimeBufferMins","OnSiteTimeBuffer","costMultiplier","JourneyCostValue","routeDetails","visitDetail","createRouteDetailVisitFromPlannedVisit","arrivalTimeStatus","getArrivalVisitOnTimeStatus","departureTimeStatus","getDepartureVisitOnTimeStatus","setPolygonGeofenceVisualCenter","actualArrivalTime","actualDepartureTime","plannedDepartureTime","arrivalEta","ArrivalEta","ActualDriverId","ActualVehicleId","visitType","VisitType","ArrivalPlotId","stop","createRouteDetailVisitFromUnplannedStop","unplannedStop","VisitTime","DepartureTime","Unplanned","TmsRouteRulesJson","plotEventService","vehicleInputService","mapService","eventService","videoEntryService","latLongs","journey","randomNumber","getColour","isCurrent","processJourney","includeLinePoints","includeFormattedAddress","useCache","includeCan","getJourneyDateRange","journeys","filterSmallJourneys","processJourneys","errorMessage","selectedDate","currentJourneyPromise","getCurrentJourney","journeysPromise","getJourneysForVehicle","currentJourney","rangeStart","rangeEnd","getSensorsData","includeCurrentJourney","getHistoricalDayForVehicle","getJourneysForDateAndVehicle","lastJourneyEndDate","getLastJourneyEndUtcDate","plotsEndDate","vehicleInputPromise","getVehicleInputs","probesPromise","getVehicleProbes","plotPromise","getPlotsForDateRange","assignmentPromise","getVehicleDriverAssignmentsForDateRange","videoPromise","getVideosEntriesForVehicle","createFileUrls","commonEventPromise","getEventsForVehicle","tempRecordPromise","getVehicleTemperatureRecords","sensorsData","vehicleInputs","videos","commonEvents","attachSensorDataToPlots","hasCANPTOEvents","allJourneyEvents","parsePlotEvents","createAdditionalJourneyEvents","mapDataToJourneyPromises","mapDataToJourney","TemperatureRecords","findTempRecordsForPlot","journeyEvent","matchingVideo","findMatchingVideo","journeyModel","createJourneyModel","eventTime","isSameOrBefore","VideoEndTime","isSameOrAfter","driverCount","escapeCount","getJourneysForDateAndDriver","plotPromises","sensorDataPromises","EndUtc","allPlots","allSensorsData","sd","slicePlotArrayByTime","previousJourney","vehicleJourneyCount","colorJourney","durationMoment","timeToNextJourney","PointsEncoded","LinePoints","getPointsFromEncodedString","totalElapsedTime","totalDistance","DistanceKm","journeyEvents","SnappedLinePoints","convertArrayToGoogleLatLng","matchingVehicleJourneysMap","journeysByDay","visibleJourneys","megaJourney","journeyCount","matchingVehicleJourneyDayMap","vehicleJourneyByDateMap","indexColor","mapByDay","totalElapsedMinutes","startMinute","startMinuteOfDay","endMinuteOfDay","StartLatitude","StartLongitude","EndLatitude","EndLongitude","journeyVehicles","journeyDrivers","filterJourneysByGroup","journeysToFilter","filteredVideos","fv","commonEvent","findPlotById","StartPlotId","createEventMarker","setJourneyEvents","startEvent","stopEvent","createJourneyStartStopEvent","LocationInformation","StartLocationInformation","getPlot","EndPlotId","EndLocationInformation","findJourneyDriver","getCachedDriver","latestPlot","IgnitionOn","marker","CurrentPosition","Wakeup","filterOutStartMinute","filterOutEndMinute","mapInitialised","mapBounds","getMap","visibleInBounds","journey1","journey2","minuteBufferEitherSide","timeFilterFromMinutes","timeFilterEndMinutes","sensorData","SensorData","endUtc","showDropDown","NG_VALUE_ACCESSOR","multi","useExisting","NG_VALIDATORS","ProgressColourPalette","defaultColourRules","GreenZoneStart","YellowZoneStart","roundNumber","palette","GreenOnly","colourRules","roundTo","updateClasses","setRounding","percentage","total","validateProgress","updateProgressBar","setProperty","classesAdded","classAdded","removeClass","getClassNameForPercentage","grayscale","addClass","RAG","getRAGClass","Renderer2","Scheduling","createStylesForReasonCodes","reasonCode","isTravelling","Velocity","convertUnitWithSuffix","IgnitionOff","Telematics","JbusIgnitionOn","JbusIgnitionOff","JbusTimed","Fms","FmsEngineOn","FmsEngineOff","Accelerometer","Incident","IncidentAccelerometer","IncidentGPS","Crossing","backgroundColour","getBackgroundColor","isHexColorDark","reasonCodeLabel","foregroundColour","getForegroundColor","rgb","driverAssignmentCacheName","permanentEndDate","assignmentSource","DriverAssignmentSource","DigiDl","ButtonPress","ManualAssignment","getDriverAssignmentsFromDB","logging","driverSpecificAssignmentsPromise","driverAssignments","findAssignmentByDriverForTime","formatAssignments","getAssignmentsByVehicleForTime","filteredAssignments","assignment","vehicleSpecificAssignmentsPromise","getIntersectingAssignmentsByVehicle","timeMoment","getDriverAssignmentsForVehicle","vehicleAssignments","findAssignmentByVehicleForTime","findDriver","driverAssignment","VehicleDriverMapping","unkownDriver","safe","currentAssignment","currentAssignmentCopy","AssignmentSource","getAssignmentPermanentDate","assignmentIsPermanent","VideoStreamType","VeriTableRowStatus","VeriTableComponentController","$scope","$element","$transclude","$templateCache","htmlService","downloadable","withoutGroups","showCompactFilters","hasPreparedRowsForSearchAndSort","setDefaults","showResourceFilter","isSlotFilled","hasEmptyState","updateRowType","veriTableContainer","parentVeriTable","registerChild","getGroups","checkForCompactMode","allUserGroupIds","UserIds","allGeofenceGroupIds","allVehicleGroupIds","allDriverGroupIds","onChangesObj","sortRows","searchRows","dropDownFilterOptions","selectedDropDownFilterOption","navPillFilterOptions","selectedNavPillFilterOption","highlighted","prepareHeaders","prepareRows","isFirstChange","ignoreNextSelectedItemChange","calculateSelectedItemIndex","selectedGroup","maxRows","onRowsUpdated","showHideColumnsWithNoData","resourceCount","expectedArrayLength","columnHasNoDataMap","hasNoData","summedArray","fill","hideIfNoData","hideOnMobile","filterRows","$applyAsync","$index","onRowClicked","highlightSelectedItems","onRowRightClicked","onRowHighlighted","highlightedRow","$label","selectedTag","showGraphOptions","showStatusColumn","addStatusHeader","paddingToAdd","lastHeaderWidth","alignRight","templateUrl","rowWarningStatus","addStatusCell","contents","ex","updateCounts","excludeFromSearch","createSearchCallback","customSearchString","updateDropDownFilterCount","updateSimpleNavFilterCount","dropDownFilterValues","navPillFilterValues","forceDigest","selectedGroupRowCount","prepareRowsForSearchAndSort","safeSearchString","useRowsFilters","ri","rowMatchedSearchString","rowMatchedGroup","isInGroup","isRowInGroup","tagIds","searchBox","clearSearchTerm","rowType","showGroupFilter","showTagFilter","tagResourceType","row1","row2","cell1","cell2","rowsUpdated","filterBar","getElementsByClassName","showRows","selectedItemIdentifier","selectedItemIndex","updateSortColumnPosition","warningCell","Warning","OkChecked","OkDash","rowClassName","getClassForStatus","OK","onGetLastAvailableData","require","searchPlaceholder","exportAsLandscape","exportTitle","hideExport","transclude","VideoEntryService","usersService","videoReviewStatusService","cameraStatusService","downloadVideoCountUpdatedSubject","downloadVideoCountUpdated$","videoUpdateSubject","videoUpdate$","VideoEventId","ExternalId","convertExtensionDataIntoGForce","getAllVideosEntries","getAllChannelVideos","getUsers","includeAdmins","mapVideoEntries","thumbnail","getMediaURL","FileGuid","now","getVideoEntriesRequested","videosForDisplay","getAllVideosEntriesFromDatabase","getVideoEntryForDisplay","processEntries","getVideoEntriesWithFileUrls","getVideosFiltered","productGroupId","videoExternalId","entryId","getDriverAssignmentForTime","getVehicle","videoEntryCopy","eventCategory","apiResult","getVideoEntriesRequestedFromDatabase","excludeMediaDeleted","includeArchived","downloadedOnly","getVideoWithMetadataFormattedForDisplay","setVideoPositionPromises","setVideoPosition","updatedVideos","updatedVideo","getLatLngForVideoRequest","getPlotNearestToTime","mappedEntries","VideoEntryId","removeDuplicateChannels","any","StoryboardFileGuid","WebmVideoFileGuid","mainChannel","getEventLabel","assignmentAtTimeOfVideo","dateIsBetweenDates","EventTimeUtc","RequestedBy","requestedByUser","findUser","uniqueChannels","unique","compare","displayStatus","getVideoDisplayStatus","placeName","PlaceName","getVideoChannelMediaForDisplay","displayEventType","VideoExtensionData","storyboardUrl","Label","Button","Sensor","labelLower","filterVideoByGroup","videosToFilter","driverIncluded","vehicleIncluded","guid","uriRedirect","watched","videoSeen","lastNote","getVideoLastNote","reviewSubStatus","ReviewStatus","coachingStatus","CoachingStatus","reviewStatusDisplayValue","getVideoReviewStatusDisplayValue","formattedVideo","reviewed","userAction","favourite","Favourite","companyFavourite","VideoObservations","VideoObservation","Notes","VideoReviewSubStatus","VideoCoachingStatus","useRequestedTime","getAllChannelVideosFromDatabase","VideoReviewStatusService","CameraStatusService","GroupsListComponent","GroupEditorComponent","GroupDetailComponent","GroupResourcesComponent","GroupHierarchyComponent2","GroupButtonFilterComponent","GroupAutocompleteComponent","GroupsModule","DropdownContainer","required","showCopyButton","readonly","autofocus","stepValue","enterPress","valueChange","showClearButton","validateOnType","justCopied","focused","mouseOver","showHideClearButton","onChange","onTouched","state","touched","NgControl","hasValidator","Validators","checkIfErrorsToShow","emitNewValue","runChangeValidation","keyCode","distinctUntilChanged","simpleChanges","autoSetIcon","autoSetPlaceholder","newValue","onValueChange","runFormChange","validateNumber","clipboard","writeText","lastValueEmitted","updateLastValueEmitted","placeholder","showErrors","static","HostListener","ComponentUtility","createValueAccessorProvider","createValidatorProvider","ReportList","tagsServiceCache","getTagsFromDatabase","ColourObject","tagId","mappingType","endpoint","resourceProperty","getMappingPropertyForResourceType","pendingTagIds","tagMappingsPromise","existingTagMappings","tagIdsToAdd","pendingTagId","existingTagMapping","TagId","tagMappingsToRemove","removePromises","addPromises","newTag","newTagMapping","newTagMappingPromise","addTagMapping","mappingToRemove","deleteTagMapping","resources","resourcesMap","matchingResource","DriverTachoMode","DriverInfringementStatus","createStatusMessages","mapDriversAndVehicles","getDriversWithVehicles","tachoPromise","getDriversTacho","driverList","driverTachoList","mapDriversToTachoObjects","driverTacho","processDriverTachoDisplay","daysDiff","getHistoricalTachoForDriver","tachoData","tachoDays","periodStart","periodEnd","modePeriods","calculateTachoModePeriods","EventTime","tachoDay","periods","rawData","modeSummary","calculateModeSummary","getModeMessage","Mode","ModeEnumString","DurationMins","DurationString","modes","Break","Work","POA","Drive","modeSummaryMins","createModeSummary","tachoHour","summary","rawTachoData","previousTachoHours","processedHistoricalData","modeArray","previousTachoModePeriod","ModeString","StartTime","closeTachoModePeriod","modeString","addStartAndEndRestPeriods","percentagePerMin","DurationPercentage","modePeriod","summaryPeriod","calculateTachoModePeriodDuration","firstPacketTime","startOfDay","timeToFirstPacket","startPeriod","lastPacketTime","endOfDay","timeToEndOfDay","endPeriod","tachoModePeriod","StringDescription","getStatusMessage","TimeRelatedStates","DriverTachoDisplay","statusClass","statusMessage","modeMessage","sourceMessage","getSourceMessage","DriverDecisionSupportType","Prewarning","getCurrentTachoForDriver","driverTachoMode","timeRelatedStates","tachoStatusMessages","mapDriverToTachoObjects","tacho","Ok","driverDecisionSupportType","DigiDL","KLine","UnitConfigAndFirmwareStatus","FoundationPeripheralService","plotOption","Usage","dataUsageFormatted","formatBytes","ctdDataUsage","unitId","commonProperties","Peripheral","SimId","Imei","vendorString","peripheralString","primaryFeature","getSingleFeatureForPeripheral","productVendorString","getProductVendorString","getIconForPeripheral","setMetaDataOnPeripheral","mapProductsToUnits","relevantPeriperals","date1IsBeforeDate2","mappingsByVehicleId","findAndGetOnlineStatus","hasCamera","IsCameraProduct","getOnlineStatus","getCameraProductVendors","AAMP","Streamax","VisionTrack","getIconForFeature","userMappingsService","Fleet","AccessMask","UserAccessPermissions","newUserLanguageCode","getUsersOptions","getUsersFromDatabase","accountMappingPromise","groupMappingPromise","getGroupMappings","usersPromise","getUsersPromise","groupMappings","currentMappings","filterNonAdmins","isCurrentUserOnFoundationPlatform","isCurrentUserInternal","newList","CameraChannelService","nextLabel","nextIcon","onTabSelected","Todo","registerTab","stepperComplete","onTabStepperStateChanged","unregisterTab","ContentChild","Optional","Inject","forwardRef","DeviceParameterType","DeviceComparisonStatus","DeviceParameterProfileMaterialisationOptions","DeviceProfileService","deviceParameterDefaults","GreenBandLower","SweetSpotLower","SweetSpotUpper","GreenBandUpper","OverRev","deviceProfilesSubject","deviceProfilesUpdated","profilesCache","comparison","vehicleHasUnit","Comparisons","IsCorrect","profileQueryOptions","getProfilesFromDb","latestParameterRecordQueryOptions","deviceParameterProfile","CreatedTime","UpdatedTime","deleteModel","UnitDeviceParameterProfileMappings","addUpdateProfile","deviceProfileMapping","ParameterMap","createDeviceParameterMap","deviceParameterTypes","deviceParameterType1","deviceParameter2","newDeviceParameterMap","kvp","deviceProfile","deviceProfiles","deviceProfileNameInUse","customMessage","matchingStyles","existingDrivingStyle","parameterKeys","appliesToLabel","hasAllResourcesMapping","allResourcesProfile","matchingProfile","hasVehicleIdMapping","latestDeviceParameterRecords","unitMapping","deviceLastSynced","deviceParameterComparisonResultMap","deviceParameterComparisonResult","hasAssignedProfile","getDeviceParameterComparisonResultStatus","NoUnitInstalled","IncompatibleUnit","Synchronized","AwaitingSync","NoProfileAssigned","totalAwaitingSync","outOfSyncLabel","DrivingStylesService","includeDefaultDrivingStyle","drivingStyle","drivingStyleId","metricDenominatorMap","getDrivingStyleMetricsWithDenominations","denominatorKeys","metricMapping","DrivingStyleMetric","denominator","createMetricDescription","Denominator","styleWithJourneys","Journeys","createScoringJourneys","DrivingStyle","translateCalculationDescriptions","journeysWithAssociatedDrivingStyle","level","MetricMappingWeightingLevel","Low","isDefault","High","Critical","hideFromDropdown","DrivingStyleAssociations","DrivingStyleMetricMappings","UpperRagBound","LowerRagBound","WeightingType","DrivingStyleWeightingType","Even","DrivingStyleId","drivingStyleMetric","newDrivingStyleMetricMapping","HighScoreValue","LowScoreValue","Created","Updated","CruiseDuration","metricMappings","weightingLevelDetails","getMetricMappingWeightingLevelDetails","updateMetricWithWeightingLevelDetails","defaultDrivingStyle","addDrivingStyleMetricDefault","matchingDefaultMetric","defaultMapping","defaults","metricDescriptions","addDrivingStyleMetricDescription","metricDescriptionDetails","isTotal","descriptionDetail","drivingStyleMetricDescription","drivingStyleMetricName","Total","getUnitForMetricDenominatorLabel","DrivingStyleMetricCategory","accelerometerMetrics","HarshBrakingAccelerometerEvents","HarshAccelerationAccelerometerEvents","HarshCorneringAccelerometerEvents","CAN","drivingStyles","drivingStyleNameInUse","weightingLevelDetail","weightingType","metricMappingWeightlingLevelDetails","matchingWeightingLevelDetail","detail","Weighting","displayPillsForAssociations","association","isAllResourcesAssociation","groupPill","getGroupPillFromAssociation","vehicleTypeLabel","getVehicleTypePillFromAssociation","combinePills","stripDuplicateAssociations","weightingTypes","weightingType1","weightingType2","metricMappingsError","totalWeighting","getTotalWeightingOnStyle","metricWithWeightingProblem","metricTranslation","metric","DrivingStyleMetricDenominator","PerHundredKm","DurationEngineOn","DurationDriving","scoringJourneys","EngineOnDuration","OverRevDuration","CoastingDuration","OverIdlingDuration","BrakeApplicationsOverThreshold","DistanceKmCan","JourneyType","DrivingDuration","AccelerationCountGps","DecelerationCountGps","CorneringCountGps","OverAccelerationDuration","BadAnticipationCount","ContextualSpeedingEventCount","GreenBandDurationLowThreshold","SweetSpotDurationLowThreshold","CruiseWhileInTopGearDuration","performanceSummary","CalculationResult","DrivingStyleMetricScoreMetadataItems","metadataItem","score","ProportionOfTotalScore","decimalPipe","DecimalPipe","calculationDescription","transform","matchingGroup","getIconForVehicleType","vehicleType","Car","BusOrPSV","HgvLessThan12T","Hgv12Tto22T","HgvGreaterThan22T","Lcv","Motorcycle","tableCellPills","pill","pill1","pill2","metricMappingWeightingLevelDetails","matchingWeightingLevelDetails","AvailableAccountStatus","SignalRService","constantService","joinedGroups","Set","deviceSerial","hubConnection","invoke","WebSocketCommands","JoinDeviceGroup","HubConnectionState","Disconnected","signalR","HubConnectionBuilder","withUrl","skipNegotiation","HttpTransportType","WebSockets","accessTokenFactory","withAutomaticReconnect","configureLogging","LogLevel","Information","build","startConnection","on","WebSocketEvents","DeviceDataValidationService","validationRequestParameters","ValidationStatus","ValidationCheckType","StringSearchType","VehicleValidationCheckRecordService","checkRecordListSubject","checkRecordsList","constructHttpParams","checkRecords","checkRecord","addCheckRecordToCachedJobItemList","vehicleValidationCheckRecord","newCheckRecord","checkRecordIds","commissionId","commission","getVehicleValidationCheckRecords","CommissionId","passCount","failCount","warningCount","getRecordStatistics","getCachedCheckRecordsForVehicle","existing","cr","ValidationCheckResultJson","parsedResult","EngineerService","loginHistoryService","userService","engineerCacheName","getEngineers","getLatestLoginHistories","engineers","loginHistory","engineer","engineerLoginHistory","lastLoggedIn","getEngineersFromDb","getUsersForAccount","updateMappings","LoginHistoryService","EngineerJobService","engineerJobBookingService","jobsCacheName","jobId","getEngineerJobById","getEngineeringJobBookingsWithMappings","JobId","job","bookings","jobBooking","getEngineerJobsFromDb","cachedJob","engineerJob","createUpdateEngineerJob","jobs","booking","Open","CreatedDate","CustomerInstruction","EngineerInstruction","DealId","EngineerJobBookingService","mapInitialisedPromise","mapInitialisedPromiseResolve","initialiseMap","setMapBoundsWithOffset","getMapOffset","getMapAPIReadyPromise","getDefaultMapLocation","controlSize","getMapStyle","createMap","googleMapContainer","greyscale","reasonCodeService","directionArray","PlannedEndTime","getPlotsForDateRangeByDriver","newDate","preparePlotsForMap","preparePlotForMap","utilised","includePlot","locationArray","simplifiedArray","newPlotList","simplifiedArrayIndex","selectedPlot","projection","lastPoint","worldCoordinateNW","worldCoordinate","recordLastPoint","xPixels","yPixels","promiseArray","generateGoogleMapsMarkerOptionsForPlot","closestPlot","closestPlotDistance","MAX_VALUE","plotLatLng","plot1","plot2","minDistance","speedMph","speedKph","plotList","startDateMoment","endDateMoment","dateValue","degrees","simpleNumber","arrayIndex","optimized","clusterer","getClusters","markers","getMarkers","div_","isMoving","FormattedDate","matchingPlot","lastPlot","dontCreateOptions","ReasonText","getReasonCodeLabel","filteredPlots","previousIncludedPlot","$mdToast","message","hideDelay","simple","dialogOptionsJson","focusOnOpen","createDialogWrapper","fullscreen","fullScreen","mobileClass","preventFullScreenOnMobile","afterTitle","email","token","flushExistingSession","login","encodedUsername","storeLoginSession","reloadOnSuccess","switchAccount","accountRedirect","switchToInternal","reloadBrowserLocation","getAllUserAndAccountSettings","performUserValidationChecks","loginResponse","singleUseCanvasStore","imageCanvasStore","blobCache","blobPromiseCache","uniqueCacheCode","canvas","toBlob","blob","context","angle","rotate","ctx","radius","tl","tr","br","bl","defaultRadius","side","beginPath","moveTo","lineTo","arcTo","closePath","identifiers","identifier","createCachedImageIdentifier","createHiDPICanvas","arrayPosition","cachedCanvas","getContext","clearRect","setCanvasDimensions","devicePixelRatio","getDevicePixelRatio","dataSeries","drawPieChart","getPieCanvas","toDataURL","padding","centerX","centerY","degrees90","degreeToRadians","strokeStyle","getTotal","startAngle","calculateStart","endAngle","calculateEnd","fillStyle","arc","calculateEndAngle","font","getSingleUseCanvas","measureText","forceStatusUpdateSubject","forceStatusUpdate$","supplierCode","intervalMs","getLatestPlotForVehicle","getVideoChannels","getCameraOnlineStatus","streamingChannels","isRequested","isFaceblurring","EventOnly","Restricted","isIgnitionOn","channelsLength","AlcolockEventCode","AlcolockRecordType","RingStatus","charts","dispatchEvent","Event","axisOptions","getAxisOptions","xaxis","mouseXPosition","toValue","addOrUpdateChartCrossHair","xValue","removePlotLine","addPlotLine","chart","xAxis","callBackFn","axisArray","axisOption","formatter","legend","newAxis","yAxis","eventName","chartType","plotOptions","clientX","createChartOptions","endOnTick","minPadding","marginTop","marginLeft","spacing","plotBorderWidth","alignTicks","load","credits","exporting","backgroundColor","resetZoomButton","theme","createLineChartOptions","createColumnChartOptions","createPolarChartOptions","createPieChartOptions","createBaseChartOptions","polar","borderWidth","borderColor","margin","startOnTick","tickPositions","outside","shared","series","animation","lineWidth","shadow","states","negativeColor","pie","innerSize","dataLabels","showInLegend","plotBackgroundColor","plotBorderColor","zoomType","crosshairs","maxPadding","plotBands","minRange","align","reserveSpace","line","getDefaultLineChartConfig","spline","areaspline","getDefaultAreaChartConfig","spacingLeft","spacingBottom","xrangeSeries","createXRangeChartOptions","verticalAlign","turboThreshold","reversed","defaultAreaLineChartConfig","getOptions","colors","getGradientFade","initialOpacity","highChartsColor","Color","linearGradient","x1","y1","x2","y2","stops","setOpacity","numDimensions","getVigetColor","zoneAxis","CameraChannelType","DrivingStylesManagerComponent","DrivingStyleEditorComponent","DrivingStyleAssociationsManagerComponent","DrivingStyleMetricEditorComponent","DrivingStyleMetricSelectorComponent","DrivingStyleMetricWeightingLabelComponent","DrivingStyleVehiclePreviewComponent","TemperatureZonesComponent","DeviceProfilesManagerComponent","DeviceProfileEditorComponent","DeviceProfileVehicleViewComponent","DeviceProfileVehiclePreviewComponent","DeviceProfileComparisonStatusLabelComponent","CameraChannelsEditorComponent","CameraVehiclesManagerComponent","UserEditorComponent","ChannelThumbnailComponent","AccountSettingsManagerComponent","AccountSettingsSaveWarningComponent","ContextualSpeedingSettingsManagerComponent","ContextualSpeedingByVehicleComponent","ContextualSpeedingByRoadComponent","ContextualSpeedingRoadEditorComponent","ContextualSpeedingVehicleEditorComponent","SamlConfigurationComponent","AutoDownloadConfigurationComponent","AutoDownloadConfigurationEditorComponent","ResourceManagementModule","VisualisationsModule","StateParams","StreamaxCameraProfileService","streamaxCameraProfilesCache","profileId","customTriggers","activeSet","streamaxTimezoneId","timezoneInfoId","SimStatusInfoComponent","CustomerNameComponent","ResellerNameComponent","FoundationNotesListComponent","BarcodeScannerComponent","BarcodeScannerLivestreamComponent","CommandSenderComponent","ConfigSwitcherComponent","Diagnostics4gComponent","Commission4gCheckComponent","FoundationAuditNotesListComponent","DeviceSummaryComponent","SimDataComponent","SimStatusComponent","DeviceValidationSummaryComponent","DeviceInstallValidatorComponent","ValidationCheckContainerComponent","CommissionCheckComponent","VeriTableService","FoundationComponentsModule","SimService","simId","getSims","sims","Iccid","simStatus","DataUsage","sim","CameraAppType","CameraApplicationState","SensorDataValueType","sensorDataType","sensorDataValue","SensorDataService","LatestSensorDataValues","sensorDataPromise","getLatestSensorDataValues","matchingSensorData","latestSensorDataValues","MapPopupType","VeriMapComponentController","fullScreenService","$throttle","showResource","showIgnitionOff","disableDefaultUi","clusteringEnabled","childComponents","greyMapStyle","userDoesntHaveManageGeofencesPermission","debouncedMapMouseMove","mapMouseMove","mapOptions","mapObject","onMapUnloaded","updateMapStyle","updateMapSize","fitMapToAll","mapCenter","mapZoom","$onChanges","translateGoogleButtons","childComponent","onEditGeofenceClick","getLatLngsForFitMap","childLatLngs","trafficLayer","TrafficLayer","toggleAll","popupType","hideControls","popupLatLng","popupModel","popupHideControls","popupPosition","onShowPopup","immediate","$digest","onGeofenceClicked","onToggleResource","onToggleIgnitionOff","mapDefer","setMapOptions","onMapInitialised","mapTypeId","MapTypeId","ROADMAP","scaleControl","streetViewControl","fullscreenControl","streetViewControlOptions","ControlPosition","LEFT_TOP","scaleControlOptions","zoomControlOptions","mapTypeControlOptions","TOP_LEFT","disableDefaultUI","mapTypeControl","panControl","rotateControl","zoomControl","showControlsOnRight","TOP_RIGHT","RIGHT_TOP","mapTypes","currentMapType","getMapTypeId","mouseEvent","stopPropogation","MouseEvent","isPrototypeOf","currentMouseEvent","currentMouseLatLng","onMouseMove","onMapLoaded","onMapLoad","onMapIdle","onMapBoundsChanged","showPopup","RightClick","enablePOI","updateMapSizeAndFit","showFullScreen","includeVehicleSearch","hideGeofences","hideFitMap","disablePopup","showResourceToggle","showIgnitionOffToggle","ignitionOffCount","onPopupClick","RouteEditingDisabledReason","PlannedRouteStatus","OldTmsService","veriTableService","defaultOnSiteTimeMins","defaultTravelTimeMinsBuffer","defaultOnsiteTimeMinsBuffer","hideDeleteTemplates","routeTemplatePromise","templateList","templateIndexVersionCount","found","version","templateIndex","AccountTemplateIndex","currentVersion","routeTemplates","formatTemplateForFrontEnd","templateId","RouteStops","RouteVisitPosition","objectId","routeTemplate","fail","onSiteTimeMins","TravelDistanceMetres","travelTimeMins","OnSiteTime","TravelTime","routeStop","startPosition","createRouteMarkerOptions","markerType","includeMappings","tmsJobsPromise","tmsJobs","getTMSJobLabelStatus","PlanningStatus","SignatureFileGuid","signatureUrl","PhotoFileGuid","photoUrl","PlannedRouteId","plannedRouteStop","PlannedRouteStopId","jobStatus","TMSJobPlanningStatus","Imported","mapLinkedElements","filterOutCancelledPlannedRoutes","convertPlannedRouteIntoFrontEndRoute","getLinkedElementsForPlannedRoute","externalReference","activePlannedRoutes","replay","formatPlannedRouteForFrontEnd","Audits","formatRouteAuditLog","replayRouteById","auditLog","currentVisit","nextVisit","RouteStatusString","applyIsVisitAuditProperty","PlannedVisitId","createDisplayLabel","setStopStatusLabel","LastStop","CurrentStop","NextStop","isVisitAudit","convertPlannedRoutesIntoFrontEndRoute","mapLinkedElementsToPlannedRoutes","getVehiclesWithDrivers","mapVehicleToRoute","mapDriverToRoute","mapGeofencesToRouteStops","note","userResponse","plannedRouteNotesPromise","notes","mapUsersToNotes","plannedRouteStopsToRouteStops","totalOnSiteTimeMins","totalTravelTimeMins","updateTemplateDurationAndDistance","plannedRouteStops","routeStops","disableEdit","routeStartTime","setPlannedRouteEditable","PlannedRouteNotes","utcMoment","updateRouteStops","firstStop","lastStop","timeTillStartMins","asMinutes","editingDisabledReason","Incomplete","filteredRoutes","showRoute","historyMode","selectedRoute","selectedStop","nextStop","isFirstStop","isFinalStop","updateRouteStopTimes","updateRouteStopState","displayArrivalLabel","displayDepartureLabel","arrivalTimeDiff","departureTimeDiff","arrivalLate","isArrivalLate","arrivalEarly","isArrivalEarly","departureLate","isDepartureLate","departureEarly","isDepartureEarly","plannedStopMins","displayArrivalTime","displayDepartureTime","bufferedArrivalTime","departureTime","bufferedDepartureTime","arrivalClassName","departureClassName","resetTemplateDistanceAndTime","mapGeofenceToRouteTemplate","updatePlannedRouteDurationAndDistance","updatePlannedRouteTotals","stopIndex","isStartOrEndStop","updateTemplateTotals","previousPlannedStop","stopPosition","ActualDistanceTraveled","RouteStopId","$routeStops","hit","newStop","oldStop","waypoint","actualDriver","includeInSummary","createTableCells","createDriverSummaryPanelCell","summaryIcon","getTMSStatusIcon","DeviceProfilesManagement","DrivingStylesManagement","enable","documentElement","isEnabled","cancel","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","cancelFullScreen","mozCancelFullScreen","webkitExitFullscreen","msExitFullscreen","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","docElm","requestFullScreen","VorRecordStatus","pillRemoveClick","removeIcon","allowRemove","hovering","StreamaxRecordOverwrite","FtCloudConfigExceptionError","CameraCoveredAlarmSensitivity","ChannelFlag","DSTOffsetMonth","DSTOffsetWeek","DSTOffsetDay","CalcType","SegmentClass","SimStatus","SimType","SimSubType","CameraAppService","cameraApplicationsCacheName","getApplicationFilesFromDb","app","formData","HttpHeaders","Updater","Beta","Version","appId","cameraApplications","CommissionService","peripheralService","sensorDataService","unitService","getExtendedPlotsByImei","getSensorDataByImei","FoundationSensorDataService","FoundationAccountService","getCustomerAccounts","requiresUpdate","selectedAccount","editTitle","addTitle","UserGroupService","userGroupSubject","getUserGroupsFromDb","sortGroupsByDescription","engineerService","engineerJobBookingMappingService","userGroupService","selectedJobBookingUpdated","jobBookings","getEngineeringJobBookings","getEngineerJobBookingMappings","getUserGroups","userGroups","EngineerJobBookingId","assignedEngineers","UserGroupId","assignedGroupId","assignedGroup","eng","JobBookingId","allJobBookings","take","sites","SiteId","newBooking","updateAllJobBookings","jobBookingId","bk","EngineerJobBookingMappingService","CameraDisplayService","createPlotFromGpsData","getVideoEntry","showVideoPlayer","statusChanged","showCoaching","onStatusUpdate","selectedVideo","eventDescription","requestVideoTime","requestLengthInSeconds","onRequestVideoCancelled","onRequestVideoSent","playVideo","addSnapping","createdPolyline","createPolylineFromPlots","footage","startP","getFootagePositionFromTime","endP","startPercentage","widthPercentage","getMinuteOfDayFromMoment","snapAndInterpolatePath","heading","velocity","VideoGpsData","Heading","Direction","ConfigManagerService","configFileCacheName","getConfigsFromDb","migrationDevices","FaultCodesService","activeRecordsPromise","getActiveDiagnosticRecords","lastRecordsPromise","getLastDiagnosticRecords","activeRecords","lastRecords","vehicleDiagnosticRecords","vehicleRecord","getEmptyDiagnosticRecords","findAndAddRecordsForVehicle","findAndAssignLastRecord","codesPromise","getDiagnosticTroubleCodes","recordPromise","getDiagnosticRecordsForVehicle","codes","DiagnosticTroubleCodeId","lastRecord","activeRecordsForVehicle","matchingRecords","MultiStateInputService","reeferService","inputHistory","triggerState","multiStateInputCategory","ReeferEngineMode","ReeferEngineModeCategory","ReeferEngineSpeedMode","ReeferEngineSpeedModeCategory","ReeferInterfaceStatus","ReeferInterfaceStatusCategory","ReeferOperatingMode","ReeferOperatingModeCategory","multiStateInputRecords","hardwareSource","getHardwareSource","Make","engineMode","ReeferService","SerialNumber","str","openReeferDetailsDialogById","inputHistories","modeType","latestHistory","TriggerState","diagnosticRecords","latestUpdates","DateReceived","DiagnosticTroubleCodeCategory","troubleCodes","currentReeferActiveRecords","filterReeferErrorCodes","currentActiveTroubleCodes","errorCode","dateRaised","AlarmLevel","make","ReeferMake","IBOX","historiesAtTime","sensorDataValues","fuelLevel","getValue","PrimaryAuxEngineFuelLevel","voltage","PrimaryAuxBatteryVoltage","engineHours","PrimaryAuxEngineOnDuration","electricHours","PrimaryAuxElectricOnDuration","standbyDuration","PrimaryAuxStandbyOnDuration","historyStartTime","timelineEntries","largeDetails","DateCleared","AlertReviewService","messageDialogService","temperatureService","alertReviewHistoryUpdated","alertReviewHistoryUpdated$","alertReviewHistoryCache","alertEventsCache","alertReviewHistory","getAlertReviewHistoryFromDatabase","getAlertReviewEventsFromDatabase","historyItem","metadata","AlertRecord","TemperatureAlarmRecordId","alarmRecordPromise","getTemperatureAlarmRecord","histPromise","getVehicleTemperatureOutOfBoundsHistoryByAlarmRecord","alarm","TemperatureExtreme","TemperatureProfileId","TemperatureOutOfBoundsHistoryId","profilePromise","getTemperatureProfiles","temperatureProfiles","getVehicleTemperatureOutOfBoundsHistory","incident","incidentId","openIncidentDetailsDialogById","AlertReviewEvents","AlertReviewHistoryId","AlertRecordId","eventUser","u","alertRules","AlertRuleId","SubCategory","LatestAlertReviewEvent","latestAlertReviewEvent","LatestAlertReviewEventId","setMostRecentEvent","currentStatus","AlertReviewStatus","getCurrentStatusOfHistoryItem","Closed","ResolutionCodeId","ClosedAtDataTime","TriggeredAtDataTimestamp","getStartAndEndDates","existingAlertHistory","alertHistory","indexOfExistingItem","NPSService","vDialogService","foundationAccountService","NPSRaterComponent","afterClosed$","res","createHttpParams","npsEntries","populateCustomers","customerPromise","resellersPromise","getResellers","filterRatingsByReseller","resellerName","getResellerName","accountMap","CustomerId","hideInternal","hideCustomers","ratings","getCurrentUserFromCache","IsReseller","getColor","scoreLabel","detractors","isDetractor","promoters","isPromoter","promoter","createCalculatedMetrics","passive","detractor","scoreHistogram","highestCount","matchingHistogram","rating","customers","calculateNPSScore","reseller","platformId","totalEntries","ActiveRoutesService","filterRouteByTextPredicate","updatedVisits","expectedArrivalTime","displayPlannedVisits","isFirstVisit","isFinalVisit","updateRouteVisitTimes","updateRouteVisitState","visitActualArrival","visitPlannedArrival","visitActualDeparture","visitPlannedDeparture","EventAction","JourneySummaryComponentController","hideEvents","hasMultipleEvents","updateEvents","onClick","onMouseover","onEventAction","mouseAction","Selected","Hover","showIntervalAbove","FieldType","TooltipService","rendererFactory","createRenderer","createText","setPosition","boundingElement","setDirectionAdjustedPosition","pos","arrow_padding","tooltipBounding","stringStartsWith","stringContains","elBounding","scrollLeft","scrollX","scrollY","findString","RendererFactory2","onChanged","removeElementsIfEmpty","stopPropagation","labelContainer","innerHTML","TemperatureCompliance","InputState","InputStateDescription","temperatureProbeService","isDateWarn","reefer","mutedClass","updating","debounceTimeout","updateLabel","showUpdatingText","temperatureReading","getTemperatureRecord","setLabel","setProbeName","smartConvert","temperatureRecordId","temperatureRecord","temperatureProbe","getProbe","probeName","getTemperatureProbesForVehicle","ITemperatureProbe","Moment","historyId","alarmId","statusChange","subscribeToOnlineStatus","subscribeToForceOnlineStatus","onlineStatusSubscription","live","createOnlineStatusObservable","displayText","emitUpdatedStatus","relativeTime","showContext","newStatus","IVehicle","statuses","defaultMarkerBuffer","defaultMarkerWidth","defaultMarkerHeight","adjustedWidth","getCachedImageCanvas","createCachedImageCanvas","drawRoundRect","selectedColor","reason","markerContents","AccelerometerInfo","AccelerometerInfoType","Acceleration","Deceleration","Cornering","drawAngle","getMarkerSize","markerXPos","markerYPos","drawMarker","markerCode","createUniqueMarkerCode","existingBlobPromise","getBlobCachePromise","generateMarkerImageCanvas","getBlobUrlPromise","isNumeric","drawMarkerShape","textAlign","textToFill","fillText","drawingX","drawingY","rotateContext","cornerRadius","registrationContext","regHeight","drawImage","maxRegLength","fileReaderService","onFileChanged","onFileCleared","fileTooLarge","maxFileSize","processNewFile","dataTransfer","files","setDraggingState","file","inputId","maxFileSizeLabel","fileSizeAsString","ngContent","hasProjectedContent","childElementCount","onFileUpdated","onFileStringUpdated","maxFileSizeMb","fileInput","fileString","showMessage","updateHasFile","hasFileChanged","clearFile","dragging","size","fileSizeLabel","readAsDataUrl","fileIsImage","isImage","hasFile","File","DragEvent","selectedValueChange","setSelectedValue","selectedValue","selectedOption","indexOfChild","clearSelectedValue","matchingValue","allowNone","layout","selectedChange","allowMultiple","buttons","button","selectButtonByValue","handleMultipleClick","handleStandardClick","clickedButton","indexOfButton","canRemoveLastButton","clearSelected","$transitions","stateCallbacks","breadcrumbNameResolvers","onSuccess","fireCallbacks","breadcrumbs","getBreadcrumbs","stateData","subtitleTranslationKey","Subtitle","subtitle","pageTitle","reverse","subDomain","hostname","getIsFleet","abstract","breadcrumbNameResolverKey","navigable","subTitle","updateDocumentTitle","dynamicReportService","createDialogOptions","createReportDefinitionForExport","veriTableRow","downloadReportExport","documentUrl","getStandardColumns","standardColumns","createReportTableFromVeriTable","tableDefinition","HideParameterList","createVeriTableReportRows","reportRows","createVeriTableReportHeaders","reportHeaders","reportHeader","Width","veriTableRows","rowPromises","rowPromise","createVeriTableReportCells","reportRow","Cells","HasData","subRowPromise","subRows","ChildRows","cellPromises","createReportCellFromVeriTable","reportCell","Data","Contents","CellDataType","getDocumentUrl","generate","reportPdfUrl","reportCsvUrl","reportExcelUrl","exportFileName","sanitizer","mobile","showQuickDates","quickDates","timeRestrictionOptions","showTimeFilterOptions","defaultTimeFilterStart","defaultTimeFilterEnd","selectedTimeRestrictionOption","createQuickDates","setMobileView","matchingRange","qd","quickDateClicked","updateQuickDateSelectionFromDates","autoSetVertical","timeFilters","setUpTimeFiltersView","timeFiltersSubscription","dateChanged","dateRangeChanged","quickDate","range","dateRangeFromEnum","_endDate","q","monthsToShow","disableTimeFilterToggle","dateRangeIntoEnum","maxDays","vertical","ComponentRef","Sanitizer","ActiveRangeBarChartComponent","getSingleFeatureForUnit","getIconForUnit","groupsCacheBasic","groupsCacheNames","groupsCacheFull","removeChildGroupsFromCache","fullList","uniqueGroups","groupsWithParents","gatherAllGroupsForCacheRemoval","grp","removeGroupFromCache","listForRemoval","getGroupsWithMappings","NoteType","SimMappingService","simMapping","CommServerRequestState","CameraCommunicationServerService","deviceId","update","deviceTypeId","DeviceInstallEditor","ManualTestContainerComponent","CommissionListComponent","CommissionDetailComponent","VCommissionEditorComponent","NewCommissionDetailComponent","CommissionSummaryComponent","AddVehicleComponent","FoundationCsvImporterComponent","CommissionModule","EngineerCommissionService","VisitReason","VisitReasonId","engineerCommission","mappingResult","PulseMessageConsoleDisplayType","CameraCommandType","ObservationsService","eventsToGetObservationsBy","observationsToReturn","observation","observationEnum","observationsToFilter","createAvailableObservationsToFilterBy","obs","obsToFilter","o1","o2","observations","vc","VideoAddressComponent","hideEllipsis","small","initialise","videoEntryIsSameLocation","setNoPlotLabel","GeocodedAddressId","getLocationInformationFromVideo","videoEntryChange","IVideoEntry","PulseService","signalRService","pulseMessageReceived","joinDeviceGroup","registerEvents","Pulse","getParams","pulseId","responseJson","CommandJson","parsedCommand","ReportSchedulesComponent","scheduleClick","createScheduleClick","loadReportSchedules","selectedSchedule","existingIndex","schedules","mapEntitiesToSchedules","recreateSchedulesTable","reports","getReportSchedules","IsActiveSchedule","getReports","createStatusTableHeader","createStatusCell","getScheduleTableStatus","createDateCell","LastScheduledQueueTime","nextRunDate","NextScheduledQueueTime","formattedValue","getScheduleStatus","RetryCount","Info","ReportHistoryService","reportHistoriesCacheName","getLatestReportHistoryFromDb","logs","setupLogs","getNestedQueryOptionsParams","reportLogs","paramsString","paramsArr","customParams","customParamsString","getCustomParamsAsString","groupParamsString","getGroupParamsAsString","getReportHistory","GeofenceGroup","GeofenceGroupId","TemperatureSetpointService","setpointPromises","getTemperatureSetpoints","getTemperatureSetpointHistories","setpoints","setpointHistories","TemperatureSetpointId","setpointsAtTime","temperatureSetpointHistories","recentHistories","buildSetpointChangeTimelineTitle","zoneName","VehicleInputService","inputTypeService","vehicleInputsCache","getOrRetrieveVehicleInputs","inputSourceString","getInputTypes","types","mapInputTypesToInputs","includeOverlapping","getVehicleInputsFromDatabase","inputTypes","matchingInputType","InputTypeId","TemperatureRecordService","recordIsToday","recordTime","TemperatureOutOfBoundsHistoryService","outOfBoundsHistories","outOfBoundsHistory","zoneNumber","AxleWeightAlertDetailService","axleWeightService","getAlertData","VehicleAxle","createAlertLabel","AxleWeightExtreme","lowerBound","upperBound","getAxleWeightProfile","getAxleWeightHistory","getBound","ProfileBound","Lower","Upper","weightDiffExtreme","weightDiffMessageExtreme","AxleWeightProfileId","AxleWeightOutOfBoundsHistoryId","getAxleWeightOutOfBoundsHistory","bound","axle","TotalUpperBound","TotalLowerBound","Axle1","Axle1UpperBound","Axle1LowerBound","Axle2","Axle2UpperBound","Axle2LowerBound","Axle3","Axle3UpperBound","Axle3LowerBound","Axle4","Axle4UpperBound","Axle4LowerBound","GeofenceAlertDetailService","getGeofence","getGeofenceById","InputAlertDetailService","inputStateDescription","getInput","getInputHistory","inputType","InputId","InputRecordHistoryId","getVehicleInputHistoryById","PowerLossAlertDetailService","powerLossHistoryService","getPowerLossHistory","PowerLossHistoryId","TollAlertDetailService","TyreRecordAlertDetailService","VehicleDiagnosticAlertDetailService","VideoAlertDetailService","DashboardServiceV2","dashboard","dashboardWidgets","Widgets","widget","translateDashboardWidget","WidgetColumnTitleTranslations","dashboards","translateDashboard","translationDictionary","DataWidgetParameters","DataSource","TranslatedTitle","initialDrillRow","dataDefinition","widgetTable","SyncGraphToolHoverEvent","isPointCoveringElement","elementAtPosition","elementFromPoint","isSameNode","dataFunction","First","Last","Average","average","aggregateData","useTotalsRow","createChartSeries","convertDataValue","hideEmptySeries","useTotals","processDataDefinitionRow","TotalsRow","RoundTo","EPSILON","filtersToDefinition","checkAndLogReportTimings","widgets","loadingUpdateCallback","compatibleWidgetLists","createCompatibleWidgetLists","pooledRequests","pooledRequestPromises","compatibleWidgets","pooledRequest","createPooledRequest","w","completed","WidgetsJson","getRandomNumber","combinedDefinition","combineDefinitions","createReportParameters","InclusiveGroupFiltering","populateDataDefinition","responseDataDefinition","splitDefinitions","currentHeaderIndex","headerLengthEnd","sortDefinitionRows","sortHeaderIndex","DataSourceSortDirection","DataSourceSortIndex","sortDefinitionRowsAsNumber","sortDefinitionRowsAsDate","sortIndex","r1","r2","r1num","r2num","dataSourceToWidgetDataDefinition","addedToList","compatibleWidgetList","compatible","compatibleWidget","definitionsAreCompatible","newWidget","existingWidget","newDefinition","existingDefinition","checkAndLogTimings","DataCollectionTime","PopulateRowTime","RowCreationTime","dateMoment","DriverBehaviourComparisonComponent","dashboardService","addDriver","createReport","totalScoreColumn","drivingFuelColumn","maxSpeed","idleColumn","durationInJourneyColumn","distanceColumn","fuelUsedColumn","mapDriverReportToScoreDefinition","createDriverScoreDefinition","driverRow","subscores","otherMetrics","lastScoreIndex","lowerRagBound","upperRagBound","RoutePerformanceBarComponent","plannedRouteService","minWidthNumber","minWidthText","setupProgressBar","routeVisits","selectMany","calculatePercentages","maxComponentWidth","s1","createSegment","s2","s3","s4","segment","showNumber","showText","showPercentage","percentageString","toLocaleString","maximumFractionDigits","IPlannedRouteDetail","PlannedRouteService2","plannedRoutesSubject","getRouteDependencies","startedRoutesOnly","editableStatus","deletableStatus","displayLabelForPlannedVisit","routeDuration","routeDisplayPlannedDistance","routeIndexToUpdate","UnplannedStopService","ImportSource","cameraDisplayService","EventType","Pto","includeTelematicsPTO","journeyStartPlot","journeyEndPlot","adjustedStartDate","adjustedEndDate","findMatchingPlot","plotEvent","createEventFromVideo","nearestPlot","eventText","Header","OverRpm","OverTorque","ptoLabel","EventFlag","ptoClass","Idling","OverAcceleration","navBarService","navItemChange","VNavBarService","contentAlign","dropDownPosition","onNextClick","onPrevClick","onItemClick","isFontAwesome","dropdownIsFontAwesome","isDropdown","dropDownItems","span","iconOnly","showNextPrev","cancelBubble","dropDownItem","currentFlagsChange","updateFlagState","toggleComponent","toggle","addFlag","removeFlag","currentFlags","hasFlag","flag","cancelVerb","onConfirm","showDeleteConfirm","inlineConfirm","showDeleteDialog","subjectVerb","subjectName","onConfirmDialog","confirmation","AlertHistory","greyColours","avatarCache","singleLetter","nameSplit","initials","cacheKey","dataURI","colourIndex","charCodeAt","fillRect","streamService","receivedMedia","streamTimeEnded","videoPlaybackNotSupported","receivedMetaData","receivedScriptData","statisics","ready","seeked","resumed","paused","closed","player","previousSourceUrl","setupListener","updatePlayer","destroyPlayer","unloadHtmlElement","removeHtmlElement","removeTimers","streamTimeoutTimer","setupPlayer","featureList","flvjs","getFeatureList","mseFlvPlayback","mseLiveFlvPlayback","sourceUrl","loadMedia","setupEvents","pause","unload","detachMediaElement","destroy","htmlVideoElement","removeAttribute","mediaSource","isLive","hasAudio","hasVideo","withCredentials","createPlayer","enableWorker","lazyLoadMaxDuration","seekType","attachMediaElement","LoggingControl","enableAll","Events","ERROR","details","MEDIA_INFO","mediaInfo","startTimer","META_DATA_ARRIVED","SCRIPTDATA_ARRIVED","STATISTICS_INFO","statisticsInfo","READY","SEEKED","RESUMED","PAUSED","clearInterval","streamTimeoutInterval","CLOSED","timeoutOnMouseIdle","startMouseIdleTimer","streamTimeout","displayTimer","setInterval","streamResetTrigger","resetMouseIdleTimeout","VideoStreamService","showAddressWithGeofence","plotLocationSubscription","setLocationInformationFromLatLng","isGeofence","setPlotLocation","getPlotLocation","getLocationInformationFromLatLng","IPlot","ILocationInformation","includeAddress","getAllGeofences","geofenceName","geofenceNamePromises","gId","getGeofenceName","getLocationInformationFromLatLong","popupService","navigateToVehicle","loadVehicle","getVehicleFromDatabase","vehicleUpdated","updateTextStrings","shouldApplyTrailerClass","isNonDrivableVehicleType","applyTrailerClass","applyNoVehicleClass","appliedTrailerClass","shouldApplyNoVehicleClass","appliedNoVehicleClass","primaryPlateText","tooltipText","VehicleView","$compile","insertedPopup","$new","insertedElementScope","insertedTemplate","popupComponent","pixelsToRightOfScreen","innerHeight","showOnRight","cellClick","PointerEvent","changeDetection","ChangeDetectionStrategy","OnPush","displaySegments","computeValues","totalItems","getTotalItems","buildDisplaySegment","getSegments","warning","selectRows","destroy$","setDisplay","takeUntil","shouldDisplayUsingMinWidth","getWidth","rawInput","inputUnit","indexOfUnit","LanguageSelectorComponent","publicDirectives","TranslateDirective","deferred","getReader","readAsDataURL","readAsText","parsedArray","ignoreHeaderLine","normaliseWhitespace","ignoreEmptyLines","fileSize","reader","FileReader","onload","onerror","onprogress","isInteger","countryCode","backdropClick","_close","dispose","themes","defaultThemeName","onEnter","setTheme","createThemes","themeName","newTheme","previousTheme","currentTheme","bodyClass","accentColourLightest","accentColourLighter","accentColour","accentColourDarker","accentColourDarkest","changeFavicon","favIcon","defaultTheme","addSecureTheme","faviconUrl","link","querySelectorAll","rel","vehicleData","threeWeeksFromNow","motExpirationStatus","DataValidationStatus","NoDetailsFound","taxExpirationStatus","MotExpiry","motExpiryMoment","DueSoon","Valid","TaxExpiry","taxExpiryMoment","SamlConfigurationStatus","SamlConfigurationVerificationStatus","VerificationIdentifier","createInitialConfiguration","domain","FormData","vehicleUtilisationRecords","utilisationRecord","createJourneyUtilisationRecordForVehicle","orderUtilisationRecords","findDepotsWithHomeLocations","visitsToDepotsOrHomeLocations","findGeofenceVisitsToDepotsOrHomeLocations","createDepotUtilisationRecordForVehicle","vehicleDepots","findGroupIdsAssetBelongsTo","homeGeofence","utilisationRecords","utilisationPercentage","totalWidth1","prev","cur","vehicleJourneys","validateJourney","vu","startOfRange","endOfRange","minutesInRange","createAndUpdateUtilisationRecord","vehicleGeofenceVisits","validateGeofenceVisit","previousGeofenceVisit","previousPeriod","datedPeriod","period","createUtilisationRecord","diffMinutesStart","cameraService","isPreview","hideSkipControls","videoPlayStateChange","videoTimedOut","videoMediaReceived","cameraUnavailable","restartStreams","timeChanged","streamUpdated","fitToFrame","isZoomed","showPlaybackSpeedOptions","ignore","isPlaying","animateCallCount","actualAnimationCount","resetStreamTimeout","setVisibleChannelsForLiveView","setMainChannel","matchChannelsToStreams","firstChange","channelAdded","restart","playbackStreams","updateStreamQuality","seekPreview","videoHasTimedOut","videoErrored","showVideoControls","emitIsPlaying","errored","highQuality","FtCloudStreamType","Mainstream","Substream","getLiveStreamUrls","StreamType","firstPlaybackStarted","allPreviewStreams","getHistoricalStreamUrls","play","vStreamComponents","toArray","setIgnore","playerExists","flvPlayer","streamTime","previousCameraChannels","currentCameraChannels","loadingStreams","previewStreamType","availableStreamQualities","Sub","getPlaybackUrls","Length","filterDuplicateVideoStreams","matchingStream","loaded","PlaybackSession","ignoreTimeout","primaryChannel","getPrimaryChannel","focusStream","toggleHighQuality","controlsTimeout","animations","animFadeInOut","animate","allowRangeUpdateOnHover","initVCalendar","updateDayStates","setDates","updateDirectionStates","updateDayStateForAllMonths","getNextMonth","createVCalendar","_startDate","canNavigateForwards","checkDateRangeIsValid","checkIfSelectionIsInvalid","invalidSelection","_datesChanged","thisMonth","createCalendarForMonth","adjustedDate","getDaysInMonth","monthStartingDay","getStartingDayOfMonth","calendarMonth","startingDay","dayHeaders","createDayHeaders","createDays","startingDayOfMonth","dow","getDayOfWeekString","weekday","updateDayState","displayedDate","navigate","dayLoading","isDayEnabled","updateDaySelection","createOrderedTimeRange","allowedDates","allowedDate","canNavigateBackwards","nextMonth","isSameMonth","tempStartDate","showRangeFilter","showDailyFilter","increments","timeFilterStartChange","timeFilterEndChange","timeFilterTypeChange","timeFilterStart","timeFilterEnd","timeFilterType","Range","Daily","enableDailyFilter","enabledTimeFilterStart","enabledTimeFilterEnd","updateModel","changeStartTimeFilter","changeEndTimeFilter","onTimeFilterStartChanged","onTimeFilterEndChanged","changeFilterType","newType","findAndRegisterTable","findAndRegisterFilterBar","removeIfEmpty","veriTable","nearest","getAngularJSComponentFromElement","existingCallback","args","placeholderCount","updatePlaceholderTranslation","isEmpty","childNodes","IVeriTableBindings","userCanAccessPlots","getSensorDataForVehicle","sensorDataMap","getReviewStatusDisplayValue","reviewedSubStatus","Coached","Reviewed","NoActionRequired","ignoreNone","ActionRequired","DriverTrained","Praise","reviewDisplayStatus","getReviewDisplayStatus","reviewSubStatusString","getReviewSubDisplayStatus","coachingStatusString","getCoachingDisplayStatus","displayGroups","hiddenGroups","loadGroups","mapGroups","tooltipLabel","populateGroupUsers","populateGroup","idToFind","addGroup","isAtMaxLimit","addGroupToTooltip","IDriver","IGeofence","IUser","validClass","invalidClass","warningClass","setValidClass","onPillAdded","onPillRemoved","pills","showBackButton","updateRouteTitle","registerStateCallback","updateBreadcrumbs","trimTitle","onPillChanged","getElementsByTagName","goToParent","originalSubtitle","useRoute","routeTitle","getPageTitle","getPageSubtitle","hideSubtitle","currentBreadcrumb","parentState","preventBreadcrumbBack","recursionCount","success","node","nodeType","Node","TEXT_NODE","replaceWith","createTextNode","Transition","tachoService","compactView","hideVehicleReg","showPhone","showTacho","lightText","vehicleTBC","originalDriver","originalVehicle","updateDriver","updateVehicle","isRealDriver","setDriverLabel","setVehicleLabel","updateDriverTacho","timeCopy","sanitizedTime","showTbcs","historicalDriver","vehicleAssignedFromBinding","getAssignmentByDriverForTime","historicalVehicle","autoDownloadSettingService","createColumns","getData","selectedSetting","createDefaultSetting","selectSetting","clearSelectedSetting","settings","createRows","createFilter","VideoEventCodeSimplified","Channels","VideoDuration","setting","AutoDownloadSettingService","cameraChannelService","cameraChannelTypes","firstLoad","isAutoDownloadSelected","selectedVehicle","clearSelectedVehicle","autoDownloadComponent","createNewSetting","getPeripheralsAndMapToVehicles","isAnyPeripheralCamera","cameraChannelTypeColumns","getChannelTypeCountCell","createVehicleTableHeader","createVehicleRegCell","createChannelsCell","getCameraChannels","cameraChannels","active","vehicleChannels","channelTypeList","ContextualSpeedingTab","overrideService","getContextualSpeedingOverrides","deleteContextualSpeedingOverride","getSpeedFormatted","ReportedSpeedKph","OverrideSpeedKph","createDateTableHeader","convertToUserUnitWithLabel","ContextualSpeedingOverrideService","overrideId","override","thresholdId","createLabeledMarker","thresholdService","getAdjustedVehicleTypes","getContextualSpeedingThresholds","getVehicleTypeName","getCalculationFormatted","speedThresholdAllowanceNoWhitespace","SpeedThresholdAllowanceKph","SpeedPercentThreshold","ContextualSpeedingThresholdService","deviceProfileService","comparisonResult","IDeviceParameterComparisonResult","formBuilder","dialogService","vehicleFilterSearchPredicate","validateFormParameter","deviceParameterType","parameterIndex","availableDeviceParameterTypes","availableParamType","parameterAbove","dirtyDeviceProfile","parameterBelow","setupParametersEnum","mappingsInvalid","deviceProfileForm","invalid","allResourcesAssociationError","displayParameter","refreshDisplayParameters","vehiclesAutocomplete","DeviceParameterProfileId","refresh","silent","saving","savedProfile","savedChanges","alreadyAdded","matchesName","indexOfExistingMapping","cacheMappings","createAllResourcesAssociation","recoverCachedMappings","parameterType","mappingRemovalDialog","mappingsRequiringRemoval","parameterTypesArray","validateMappings","refreshDisplayMappings","refreshDisplayVehicles","getProfiles","WithMappings","existingDeviceProfiles","prepareModel","determineAllResourcesAssociation","buildForm","displayVehicles","vehicleDeviceComparisonStatus","incompatibleUnit","matchingDeviceProfileMapping","existingDeviceProfile","mappingsContainVehicleId","maxLength","uniqueDeviceProfileNameValidator","addControl","FormControl","createDeviceParameterProfileTemplate","displayParameters","existingDisplayParameter","hasMappingsRequiringRemoval","displayDeviceParameterProfileMappings","matchingVehicle","validationError","newDisplayMapping","badVehicleRemovalTemplate","removeMappingsAndSave","removeVehicleMappingById","saveDeviceProfile","hasAllResourcesAssociation","validateMapping","validateAllResourceAssociation","existingMatchingMapping","profileName","mappingsContainsAllResourcesMapping","cachedMappings","IDeviceParameterProfile","FormBuilder","drivingStylesService","metricMappingChange","alterativeMetricClick","metricForm","prepare","defaultMetricMappingWeightingLevelDetail","selectWeightingLevelDetail","emitChange","selectedWeightingLevelDetail","newCustomWeighting","customWeightingControl","setValue","updateCustomWeightingsError","virtualHighScoreValue","upperRagBoundControl","lowerRagBoundControl","displayMetricMappings","weightingCount","Simple","metricMetadataItem","displayMetricMapping","determineScoreDirection","updateMetricMappingWeightingLevelDetail","updateSliderValues","updateDisplayMetricMappings","sliderValues","weighting","setWeightingLevelDetailOnMetric","VirtualHighScoreValue","validateScoreValue","validateRagBound","CustomWeighting","highScoreIsBad","IDrivingStyle","IDrivingStyleMetricMapping","maxAllowedMetrics","currentMetricMappingsChange","metricMappingClick","filterTabs","createDisplayMetricMappings","createFilterTabs","filteredMetricMappings","sortFilteredMetricMappings","currentMetricMappings","onToggleMetricMapping","addMetricMappingToCurrent","removeMetricMappingFromCurrent","newDisplayMetricMappings","availableMetricMappings","availableMetricMapping","newDisplayMetricMapping","createTabDefinition","usedMetricMappingCategories","usedMetricMappingCategory","indexOfMetricMapping","currentMetricMapping","defaultMetricMappingPriorityOptions","addWeightingLevelDetailsToMetric","metricMapping1","metricMapping2","loginService","userEditorService","userSave","SpecialUserPermission","userTypes","getValuesFromEnum","currentUserOnFoundationPlatform","accountFeatureDescriptions$","specialUserPermissionsDescriptionsMap","getSpecialUserPermissionsDescriptionsMap","createForm","amendedUser","output","isValid","userForm","internationalized","onReadFeatureChanged","onManageFeatureChanged","saveUserWithAccountMapping","userMapping","getLoginToken","loginWithToken","emailValidators","FormGroup","Phone","setAmendedUser","statusChanges","UserEditorService","ZoneStatus","CameraConfigurationRequestService","configRequestUpdateReceived","configRequest","LogRequestUpdate","cameraCommunicationServer","diagnosticsFailed","roadview","connexas","uat","dev","processingChanged","refreshDiagnosticsTests","checks","processing","setCheckLabels","getDeviceInfo","deviceInfo","device","getValkVideoEntry","parseExternalId","CameraLatestVideos","FileName","valkVideoEntry","validate4Gdevice","action","loadingLabel","pulsePacket","processPulsePacket","gpsAccuracy","processGPSAccuracy","receivingDelay","processReceivingDelay","lastIgnition","processLastIgnitionData","operator","processOperator","sdCard","processSDcard","camerasCount","processCamerasCount","processVideo","firmware","processFirmware","processConfig","LastConnected","failedLabel","packetDelayMinutes","plotDelayMinutes","warningLabel","subText","LastIgnitionChangeTime","successLabel","SatCount","GPSAccuracy","Lat","Lon","delay","UtcHost","IsIgnitionOn","NetworkOperator","infoLabel","SDCardSerial","SDCardAvailableMB","SDCardSizeMB","SDCardLabel","AvailableChannels","camCount","checkProdConfigName","ConfigName","fileNameWithExtension","fileName","extension","fileNameWOChannelSuffix","deviceConfigName","externalId","getVideoEntryByProductGroupIdAndExternalId","ProdUpdaterId","ProdTelematicsId","UpdaterId","TelematicsId","TelematicsRequestedId","UpdaterRequestedId","IsAutoDeployment","ConfigId","FoundationVehicleService","foundationVehiclesCache","foundationActiveVehiclesCache","ManualTests","ManualDeviceValidationCheckService","peripheralType","DVS","section","assertion","DvsAlarm","DvsNearsideCamera","LightsWork","SpinningTest","manualDeviceValidationCheckService","commissionService","foundationVehicleService","deviceMessageService","devicesUpdated","allowAddButton","allowRemoveButton","showAddDevice","showBarcodeScanner","showExistingHardwareValidation","checkResults","ptoActive","peripheralNoTrackerError","unitSupportsTemperatureProbes","includeTemperatureTests","nonTestableDevice","nonTestableDeviceTypesAdded","DurationPeriod","requiresUnitLocation","editGpsOdo","currentOdoKm","currentOdoMiles","distanceMeasurementOptions","distanceMeasurement","distanceRaw","distanceInMetres","milesConversionConstant","kilometreConversionConstant","preselectableLocations","resetDeviceToAdd","createnonTestDeviceTypes","getSelectedVehiclePeripherals","Install","Reinstall","Uninstall","ServiceCall","Peripherals","deviceToAdd","IsTracker","buttonStatus","pendingCommissionChanges","savedState","RemovedRequiresSave","Chargeable","ChargeReason","deviceType","manualCategories","createPeripheralTestCategories","parentTrackerImei","barcode","serialChanged","serialSearch","searchForSerial","onBarcodeSelected","validationResult","validationResults","checksRun","deviceValidationCheckRecordIds","ValidationResultDatabaseId","plotCheck","TestData","Odometer","getDeviceCommunicationCommands","deviceCommands","odoSetCommand","Item2","DeviceCommunicationType","SetOdometer","existingDeviceToValidate","existingDeviceUnitToValidate","NoSaveRequired","addUnitChangedComment","AddedRequiresSave","removeUnitChangedComment","CameraId","dirtyCameraId","setAnyDevicesUpdated","updateInstallationState","deviceCommand","CommandValue","Kilometres","CommunicationMethod","Item1","CommunicationType","sendDeviceCommunicationCommands","Metadata","NoFaultFound","newPeripheral","createUnitFromSerial","Squarell","CanbusId","faultFlagged","faultRecorded","faultComments","isCamera","Comments","setupUnits","hasAdded","hasRemoved","existingHardwareAcquired","type1","type2","ajsPromise","unitPromise","unitLocationPromise","getVehicleUnitLocation","convertQPromiseIntoNativePromise","verb","lastIndexOf","lines","showLoader","getUnitOrPeripheralBySerial","IEngineerCommission","DeviceMessageService","DeviceHealthService","getAllSummaries","summaries","combineAndGetSummariesWithAccounts","getRecords","IncludeAllIntersecting","mergedRecords","activeRecord","mapProductNameToRecords","DeviceHealthRecordsByVehicle","cameraRecordTypes","telematicsRecordTypes","DeviceHealthRecordType","getProperRecordTypesFromSummary","translateRecordType","firstValueFrom","accountsIdsWithReseller","resellerAccounts","minMaxValues","minRecords","maxRecords","minDuration","maxDuration","recordsCount","totalDuration","Infinity","productName","accountsMap","createAccountMap","summariesByVehicle","groupSummariesByVehicleId","buildDeviceHealthVehicleDurationSummary","getVehicleSummariesWithScores","firstSummary","allTypeSummaries","DaySummaries","TypeSummaries","getRecordsCountFromAllDays","getRecordTypes","cameraRecordTypesDesc","getRecordTypesDesc","telematicsRecordTypesDesc","getTotalDuration","VehicleRegistration","companyName","getMinAndMaxValues","normalizedRecords","normalizedDuration","DurationSec","recordTypes","recordType","DeviceHealthRecordHelper","isTelematic","DeviceHealthVehiclesComponent","deviceHealthService","cameraRecordTypeFilterItems","telematicsRecordTypeFilterItems","resellerFilterItems","selectedRecordTypes","worstTenPercentMap","loadData","getAccounts","filterBy","DeviceHealthVehicleView","searchText","createDurationCell","getSummariesWithCompany","getWorstTenPercent","createRecordTypeFilterItems","createResellerFilterItems","worstTenPercent","veh","getRecordTypeFiltersForVehicleSummaries","getResellerFiltersForVehicleSummaries","JobListComponent","JobDetailsComponent","JobEditorComponent","JobItemListComponent","JobCompletionComponent","JobItemEditorComponent","EngineerSelectComponent","VisitFailureFormComponent","FoundationJobsModule","CUSTOM_ELEMENTS_SCHEMA","engineerJobService","engineerJobItemService","newJobItem","jobItemsLength","jobItemsCompleted","engineerJobStatus","jobIsClosed","showImportSideBar","importStrategyRef","JobItem","getRouteParam","loadJob","jobEditor","saveJob","Jobs","setSelectedJobBooking","amendedJob","cancelJobItems","closeJob","dataSubscription","getEngineerJob","getSelectedJobBooking","getEngineerJobItems","checkJobStatus","checkJobItemCompletion","Failed","closeEngineerJobItem","CameraFootageService","concatenated","VideoRequest","MaxRequestLength","isVisionTrack","cameraIsNotLiveStream","cameraHasVideoRequest","RequestStep","VideoDownloadProgressComponent","currentStep","Requested","latestOfflineProgressRetrieved","endTimer$","loadProgress","downloadCompleted","handleDownloadFailed","handleDownloadSuccessful","handleFaceblurring","handleVideoUploaded","Downloading","Faceblurring","VideoDriverAssignmentComponent","getDriverAssignment","VideoEventRisk","CreationCode","ApplicationManagerComponent","cameraAppService","isActivePredicate","isInactivePredicate","createTabs","confirm","selectedApp","updateApp","clearError","saveApp","cameraApps","createNewApp","saveMethod","clearSelectedApp","getApplicationFiles","apps","createFilters","createEnumCell","finalize","typesList","createFilterItems","statesList","ReportFiltersComponent","reportChange","reportChangeDebounce$","startDateRange","userTZMatch","setupChangeDebounce","showParameterOptions","showGeofenceFilters","shouldShowGeofenceFilters","checkShouldHideDateFilter","checkForTemperatureChartColumns","resourceChecks","createTimezoneOffsetWarning","triggerModelChange","processI18nOptionsChange","datesAreValid","vehicleIdChanged","processVehicleChange","rowDataSourceChanged","subRow","findRowTitleColumn","setReportDefinitionRowTitle","updateSortedHeader","isMachineAndUserTZSame","showTemperatureChartCheckBox","sortSettings","getSortSettings","hideDate","requiresDateSelector","requireSingleResource","restrictReportToSingleResource","vehicleQueryOptions","HasTemperatureProbeInstalled","IReportDefinition","ReportParametersComponent","ReportInternationalisationOptionsComponent","probesForVehicle","displayProbes","setupParametersFromReport","customParameterDefinitions","paramDefinition","newConversionLabel","cachedCustomPreferences","labelIsMetric","isLabelMetric","onCustomParameterChanged","clearCachedProbes","clearProbeParameters","processVehicle","displayProbe","changedParameter","updateCustomParameters","def","newParam","customParameterDefinition","temperatureProbeParamDefinition","fixParameterDefinitions","cachedVehicleId","processTemperatureProbes","getTemperatureProbes","setDisplayProbes","matchingProbe","findProbeInDefinition","newMapping","Code","ReportHistoryPageComponent","legacyExportService","reportService","reportHistoryService","reportHistorySelected","defaultDateRange","ReportRunProgressState","createDefaultDates","updateHistory","updateInterval","paramType","selectedHistory","openReportStatus","getGroupParams","showReportStatus","clearSelectedHistory","ViewReport","filterEvent","noDateParams","fileType","downloadReport","MinimumDurationOverWeight","RoadType","FilterVehicleRowsByVehicleType","reportParameterMappings","showSpinner","After","Before","definitions","isReportFeatureEnabledOnAccount","createReportRows","checkForUpdatesRequired","getReportRowStatus","scheduledString","manualString","ReportScheduleId","ProgressState","createParameterString","Finished","Pending","t3","t4","DocumentCreationTime","groupParams","getGroup","audioPlayer","Audio","ZoneOperatingModeWidget","zoneService","updateCategory","updateDisplayText","updateClassName","updateIcon","getZoneAtPosition","zonePosition","getOperatingModeTranslation","IMultiStateInputRecord","StackedProbeReadingComponent","AlertCategoryComponent","GeofenceAlertDetailComponent","alertDetailService","tableMode","getGeofenceData","alertDetailData","tableModeLabel","IAlertRuleRecord","TemperatureAlertDetailComponent","temperatureAlertDetailService","getTemperatureData","TemperatureAlertDetailService","selectedRating","userDescription","PlatformId","UserDescription","comments","submitRating","showThankYou","ActiveRouteProgressComponent","progress","updateRouteProgress","updateElementVisibility","calculateRouteProgress","autohide","UserExpired","tableExportDataDelegate","numCompletedVisits","IRouteDetailDisplay","unplannedStopsServiceCache","getUnplannedStopsForRoutesFromDatabase","PlannedRouteVisitListValidationReason","SchedulingService","VisitMatchingRules","createDefaultVisitMatchingRules","createDefaultRouteMatchingRules","RouteExpiryRules","createDefaultRouteExpiryRules","newRules","StartRouteOnArriveAnyVisitLocation","StartRouteOnDepartAnyVisitLocation","StartRouteOnJourneyStart","EndRouteOnAllVisitsArrived","EndRouteOnAllVisitsDeparted","EndRouteOnDepartAtEndingLocation","MinimumStartTime","setStartRulesFromPreferences","setEndRulesFromPreferences","JourneyStart","DepartFromAnyVisit","DepartStartLocation","ArriveAllVisits","ArriveEndLocation","ArriveOn","VisitMatchCondition","DepartOn","OnLocation","RecordUnplannedVisits","CanMatchOnMissedVisits","RecordVisitsAsMissedIfVisitedOutOfOrder","ArriveOnTimeResidingInLocation","RestartRouteOnReturnToStartingLocation","MaximumTimeToRestartRoute","MaximumLateTimeAllowed","MaximumExpiryTime","MaximumStartTime","validation","reasonMap","NoVisits","previousLatLng","showFollowingDayLabel","previousVisit","plannedArrivalDate","plannedArrivalDateString","previousVisitDepartureDateString","previousVisitDepartureTime","previousVisitDepartureDate","VisitArrivalTimeBeforePrevious","VisitMissingLocation","VisitSameLocationAsPrevious","NoDepartureTime","NoArrivalTime","NoArrivalAndDepartureTime","totalErroredVisits","setVisitAsDirty","showValidationError","startOptions","getStartRouteMatchingRuleLabels","activeStartOptionProperty","endOptions","getEndRouteMatchingRuleLabels","activeEndOptionProperty","RouteTemplateId","CreationDateTime","LastUpdateDateTime","CreatedBy","ActualStartTime","StartPlot","EndPlot","TrackingMode","TravelBufferTime","OnSiteBufferTime","ArrivalPlot","DeparturePlot","createDateHeader","relavantVisits","createDateTimeCell","FleetHistory","webpackEmptyAsyncContext","req","MODULE_NAME","downgradeModule","extraProviders","platformBrowserDynamic","bootstrapModule","NgAppModule","RouteConfig","Config","run","RunBlock","fontFamily","global","useUTC","lang","thousandsSep","enableProdMode","FoundationModule","BrowserModule","DirectivesModule","ComponentsModule","ReportsModule","MaintenanceModule","FleetModule","TmsModule","HelpModule","AlertsModule","TemperatureModule","TachoModule","HTTP_INTERCEPTORS","useClass","AuthInterceptor","RequestInterceptor","vMap","tooltipService","onMarkersUpdated","showOutOfBoundsIndicator","addedMarkerModelMap","findVeriMap","mapZoomListener","removeTooltips","models","createMarkers","markerList","getMarkerMapArray","googleMarker","markerClusterer","MarkerClusterer","typeoptions","setIgnoreHidden","typeevents","postClusterShow","clusterIcon","setMaxZoom","setGridSize","addClusterEvents","idkey","recreateMarkers","removeMarkerEvents","removeMarkerTooltip","clearMarkers","repaint","addedMarkerArray","getPosition","isFunction","getTitle","numChanged","createMarkerModelMap","originalModel","getModel","getLabelPositionPoint","existingMarkerMap","getExistingMarkerMap","markerNeedsUpdate","addMarker","numRemoved","removeMarkers","getVisible","areIconsTheSame","getIcon","icon1","icon2","MarkerWithLabel","addMarkerEvents","initialCount","_","modelMap","getModelByKey","markerModelMap","removeMarker","xPos","yPos","exec","googlePolygon","polygonOptions","journeyService","showJourneyStart","vehicleChanged","vehiclePlotChanged","mapIdleListener","showHideJourneyStart","createJourneyMarker","journeyStartMarker","journeyPolyline","journeyStart","getCurrentJourneyWithPlots","vehiclePlot","createJourneyPolyline","getAndMapPlotsForJourney","getPlotsForJourney","nePoint","swPoint","maxDifference","IGoogleMapsMarker","googlePolyline","polylineOptions","geodesic","Polyline","polylines","polylineMap","updatePolylines","createPolylines","removePolylines","gMap","existingPolylineMap","mouseover","findAndRegisterVeriMap","veriMapHTML","Pipe","SplashScreenComponent","timeoutHandle","refreshPage","UnauthorizedViewComponent","navItemSubscription","navItemChanged","clickedItem","navItems","ContentChildren","VerticalDirection","closeOnEsc","closeOnClickOutside","closeOnClickInside","Down","opened","dropdownHeight","maxDropDownHeight","minDropDownHeight","subscribeToEvents","previousState","calculateStyles","subscribeToOutsideClicks","unsubcribeToOutsideClicks","outsideClickSubscriptions","capture","handleClick","handleEscPressed","nodeTarget","clickedContent","clickedIgnoreElement","hideDropDown","findContentsHeight","dropdownElementBox","minPercentage","scrollHeight","positionPercentage","Up","autoSize","dropdownContents","contentsContainer","targetHeight","animDropDown","openChange","selectedIndex","subscription","subscribeToParentKeyPress","setSelectedIndex","scrollToSelected","itemToSelect","dropDown","selectedChild","keydownListener","keyEvent","handleArrowPress","handleEnterPress","itemClick","onClosed","HTMLElement","updateHasFlag","toggleFlagComponent","animSlideFromTop","keyPress","KeyboardEvent","canBeDeleted","buildDialogHtmlString","buildTitleString","contextString","dialogHtmlStringBuilder","groupAlertMapping","AlertRules","IAlertRuleGroupMapping","DelayedHoverService","observer","hoverDelay","hide$","show$","merge","MultiStepStatus","hasSubText","steps","accountList","onAccountSwitched","getMultiAccountUserMappings","accountMapping","currentAccount","reconcileLanguagesRequiresRefresh","showMyPreferences","formIsValid","phoneIsValid","isPristine","userPrefToSave","accountPrefToSave","removeUnchangedProperties","updateAccountPrefPromise","updateAccountPreferences","updateJourneyCostTypeLabel","showMyCompanyImageDialog","companyImage","currentPreferences","prefPromise","companyDataPromise","countryCodesPromise","getCountryCodes","timezonesPromise","getTimezones","localePromise","prefs","companyData","countryCodes","timezones","Account","timezoneReadOnly","setExistingPrefProperties","setPreferencesToUserPrefs","translationPhrase","Hourly","journeyCostTypeLabel","sourceModel","targetModel","UserPreferencesDirective","restrict","bindToController","directive","background","processBatteryLevel","calculatePercentageFromVoltage","setBackground","setHeight","crumb","selectedDaysChange","createDayOfWeekMap","setEnabledDays","removeHighlights","selectedDays","selectSingleDay","setRange","onSelectionChanged","selection","resetSelection","enableWeekdays","enableWeekends","highlightRange","dayOfWeekMap","enableDay","clickedDay","firstInRange","endInRange","dayIndex","getTranslatedDayOfWeek","firstLetter","sunday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday","getSelectedDaysRange","selectedRange","firstDayInRange","getDriver","avatarService","driverImage","updateDriverImage","HasImage","driverNameToUse","getAvatar","streamResetTriggerSubject","isFullScreen","elementToToggle","defaultTransitionTime","styleFromState","styletoState","fadeInOut","toggleSpinnerTimeout","toggleSlowTimeout","supressSlowMessage","slowTimeout","slow","onFinishedAnimation","updated","truncateLargeCount","suffix","statusPageUrl","startMonitoring","dataObservable","getStatus","processStatusUpdate","handleError","intervalObservable","attributes","aggregate_state","announcement","statusIcon","darkBackground","updateModeInformation","tachoMode","tachoImageUrl","getModeImage","checkAndSetConversionType","createUOMString","setOutputValue","fuel","capacity","currency","outputValue","conversion","FPS","numStars","hardwareConcurrency","mouse","subscriptons","createCanvas","createStars","animateFrame","destroyCachedImageCanvases","requestAnimationFrame","draw","globalCompositeOperation","stars","starI","starII","vx","vy","xs","ys","updateImage","collapsed","darkText","loadCountries","getSelectedLocale","localeCode","foundLocale","reloadAll","foundUserLanguageCode","selectedLocale","onChecked","onTouchedCallback","noop","onChangeCallback","checkedValue","emitValue","animZoomInOut","populateItemsFromEnum","clearChildren","enumNameFilter","registerSelectOption","moveUp","moveDown","moveUpDisabled","moveDownDisabled","moveUpTooltip","moveDownTooltip","deregisterSelectOption","valuesChange","totalZones","sliderKeyPrefix","updateHandleLabels","hasActiveDrags","clearSelectHandle","clearAllHandleDragFlags","onHandleMoved","selectedHandle","moveHandleX","handle","getSelection","removeAllRanges","selectHandle","detectActiveDrags","getDraggingHandles","processMove","leftPercentage","getLeftPercentageForValue","propagateHandleChanges","generateHandles","generateConfig","handles","valueIndex","labelTop","hideGrip","sliderRail","sliderRect","sliderWidth","newLeftPercentage","activeHandles","orderHandlesByValue","handle1","handle2","exportValues","showMinLabel","zoneColors","getDefaultColors","zoneLabels","getDefaultLabels","keyContainer","keyElements","currentElementRect","maxWidth","newMaxWidth","radioButton","smsInputService","outputChange","countries","loadUserOptions","getCountries","setDefaultCountry","selectCountryFromIsoCode","selectedIsoCode","sendOutput","dialCodeHadChanged","onPhoneNumberChanged","newDialCode","getCountryDialCodeFromPhoneNumber","selectedCountry","dialCode","finalPhoneNumber","country","isInternationalPhoneNumberValid","isDirty","selectCountryFromDialCode","selectCountryFromCountryCode","CountryCode","onCountryChanged","phoneNumber","phoneNumberWithoutPlus","onCountrySelectionUpdated","isoCode","selectedDialCode","isValidPhoneNumber","defaultCountry","defaultCallingCode","SmsInputService","breadcrumb","parentBreadcrumb","backBreadcrumb","filterBarComponent","exportService","exportTypes","createExportItem","exportReport","exportVTable","exportVeriTable","dialog","getLabel","getExportTitle","vTableHeaders","vTableRows","rej","HttpErrorResponse","statusText","downloadTableAsReport","downloadOldTableAsReport","errorResponse","errorTpl","ExportService","contentType","onRowHover","itemLabel","cleanRows","selectedRowId","onFilterOptionChanged","calculateNumFilterOptions","selectedFilterOption","navLabels","rowMatched","hasAllOption","filterOption","updateNavPillLabels","dateFormatOptions","hasNgContent","sortByNew","listItems","inlineDetails","showDateFooter","ngContentContainer","IDateFormatOptions","onSelected","navPill","navPills","boundsGreatBritain","latlngs","requestArray","closePlotsArrays","previousPlot","pathIndex","triggerProcess","currentPlot","lastIndex","getDistanceInMetres","googleSnapToRoads","requests","closePlots","snappedPlots","startIndex","endIndex","searchTerm","autoCompleteService","places","AutocompleteService","getQueryPredictions","PlacesServiceStatus","interpolatedPath","promiseToWaitOn","requestPool","numRequests","requestPoints","directionsPromise","overview_path","wayPoints","optimizeWaypoints","getDirectionsSimple","directionsService","DirectionsService","origin","destination","travelMode","TravelMode","DRIVING","unitSystem","UnitSystem","IMPERIAL","provideRouteAlternatives","waypoints","stopover","DirectionsStatus","From","To","legs","leg","decodePolyline","encoded","poly","returnLeg","updateDistanceText","updateDurationText","elevationPromise","getElevationForLatLngs","elevationResults","elevation","elevationService","ElevationService","requestLatLngs","elevationRequest","samples","getElevationAlongPath","ElevationStatus","allElevationResults","polylineColor","startLat","startLng","getPolylineMapUrl","partialUrl","encoding","encodePath","makeGoogleMapsImageRequest","getDistance","deg","chunkLatLngStringRequests","latLngString","sendSnapToRoadsRequest","snappedLatLngs","roadData","snappedPoints","partialurl","fullUrl","maxLatLngsPerRequest","subList","toPrecision","toUrlValue","interpolate","updatedVorRecord","deletedVorId","permanentDate","isOverlapping","vorStatus","EndDate","StartDate","mapToUi","invalidateVorCache","getAllRecordsPromise","mapFromUi","getVorIndex","getVorIndexOnCreate","updateOrCreateCachedRecord","setVorStatus","recordToSave","receivedMediaSub","highQualitySub","showRestartOnTimeout","videoTimeout","videoRestart","initStreamUpdatedSub","initHQToggleSub","setVideoUrl","networkTimeout","showRestart","streamingChannel","videoLoadSuccessful","videoUrl","hq","streamId","getCurrentStreamId","switchStreamType","urlBySlash","IVideoStream","UrlRequired","titleStartContainer","titleEndContainer","titleContainer","descriptionContainer","showAdd","showRemove","fillVoid","voidLabel","large","onClickRemoveTag","filteredTags","clickCallback","addTag","filterTag","addVoidElement","compactTitle","collapsable","cardTitle","titleStart","titleEnd","footer","actionFooter","colourSelected","selectedColour","IColour","onValueChanged","pageActions","searchChange","registerSearchBox","searchBoxChange","translatedPlaceholder","onLabelClicked","order","hasHighlighted","animSlideIn","animSlideInOutFromLeft","chartService","componentLoaded","findChildTable","childTable","graphOptions","toggleShowGraph","reflowChart","createChartForHeader","relatedChart","removeChart","buildChart","chartIndex","matchingHeader","chartObject","reflow","graphHeaders","graphOptionsAvailable","veriTableChart","Blob","chartConfig","maxSeries","createChartDefinition","newSeries","getSeriesData","Highcharts","seriesCount","useVigetColours","createPieChartConfig","stacked","stacking","textOutline","convertDataToPieSeries","getSeriesForStackedChart","convertDateHeaderToSeries","dataMap","getHeaderIndex","cellTitle","graphLabel","summaryLabel","matchingDataPoint","dataSet","pointIntervalUnit","dataByDay","countDataPerDayForStackedChart","createSeriesData","countDataPerDay","dateAsMoment","dataLabel","eventSummary","selectedEvent","maxEvents","boxWidth","setFilterRows","updateNumbers","buildEventSummary","indexes","headerTitle","excludeFromSummary","existingEventSummary","summarySubLabel","summaryColour","eventSummaryColour","popped","poppedCount","totalPlaceholdersRequired","sources","playbackSpeed","timeUpdate","canPlay","seeking","sectionLoaded","createVideoElements","addVideoSource","videoPlayer","playbackRate","destroyVideoElement","streamPaused","hlsPlayer","stopLoad","currentTime","startLoad","startPauseStreamTimer","videoElementId","autoplay","playsInline","muted","poster","m3u8VideoUrl","videoSource","setupStreamPlayer","onloadedmetadata","videoLoaded","oncanplay","onplay","onpause","onseeked","videoProgress","seekable","buffered","sections","si","pauseVideo","detachMedia","enableWebVTT","liveDurationInfinity","autoStartLoad","capLevelToPlayerSize","startFragPrefetch","fragLoadingTimeOut","attachMedia","MEDIA_ATTACHED","loadSource","MANIFEST_PARSED","once","FRAG_LOADED","fatal","ErrorTypes","NETWORK_ERROR","MEDIA_ERROR","recoverMediaError","showError","closeVideos","secondsUpdate","firstPlayStarted","maxVideoDuration","showLargeControls","loadedVideoSections","getChannelNames","getExtensionData","activityPeriods","getRegionsOfAccelerometerActivity","checkStartPlay","stopAnimation","temporarilyShowPlayStateIndicator","isHovering","mouseOverTimeout","bbox","mouseX","mouseY","clientY","xPercent","yPercent","loadedSections","previousMainChannel","togglePlayPauseState","showPlayStateIndicator","secondsPlayed","currentVideoTime","currentAccelerometerData","accel","vVideoComponents","startAnimation","seek","restartVideo","allPaused","cancelAnimationFrame","rafNumber","drawVideoFrames","forceUpdate","playTimes","getCurrentTime","medianPlayTime","arr","mid","median","lastMedianPlayTime","checkExisting","startPlay","getMaxVideoDuration","getDuration","availableCameraChannels","unlabelledChannel","ch","ChannelLabel","cameraChannelIndex","cameraChannel","addChannelTypeToLabel","remainingChannel","rewind","fastForward","speedChanged","playbackSpeedOptions","showZoom","showFitToFrame","showSpeedOptions","showFwRw","checkButtonVisibility","fillFrame","fit","zoomIn","speedOption","togglePlaybackSpeedOptions","rounded","secondsPlayedString","formatTimeDuration","videoDuration","videoDurationString","liveStream","progressPercentage","toolTipOffsetPerc","toolTipText","periodTitle","updateContainerWidth","updateProgressBarWidth","getTooltipPosition","updateThumbnailPosition","getSecondsFromXOffset","matchingActivityPeriod","endPercentage","seekPosition","getPositionFromTime","containerWidth","getContainerWidth","num","precisionPow","tooltipRadius","getPositionPercentage","totalX","thumbnailPosition","thumbnailX","thumbnailY","thumbnailClass","tinyMode","highlightPrimaryThumbnail","primaryThumbnails","thumbnails","secondaryThumbnails","selectThumbnail","selectedThumbnail","selectedSecondaryThumbnail","swapSelectedThumbnails","IVideoThumbnail","onSecondColumnClose","setDefaultColumnSize","showSecondColumn","largeColumnSize","onClose","animSlideFromLeft","defaultLabel","updateLabelText","setTimes","hideFilter","registerFilter","createDatesFromDateRange","applyRangeStartAndEnd","dropdown","getTimeAsString","startEnd","Inactive","onDriverClick","filteredItemCount","processNewItems","filteredItems","viewAllItems","childClosed","searchItems","prefilterDataset","alignSelectedItems","filterChildData","displayItems","newSelected","IPromise","FilterBarItemPredicate","ViewContainerRef","themeService","multiSelect","showChart","trackByItem","connectFilterBar","setIcon","onItemSelected","previousSelectionState","filtersChange","onFiltersChange","itemCreationCallback","callbackIcon","unselectedIcon","selectedIcon","registerFilterBarList","weekAgo","onVehicleClick","vehicleStatusService","statusToolTip","getVehiclePlot","setStatus","isDriving","ignitionOn","activityText","lastReported","statusColor","sevenDaysAgo","VehicleStatusService","vehicleDataService","hideImage","getDataForVehicle","calculateMOTAndTaxStatus","changeDetectorRef","ComponentFactoryResolver","componentHost","viewContainerRef","loadComponent","setClassesAndStyles","templateContext","$implicit","componentRef","detach","componentFactory","resolveComponentFactory","createComponent","instance","IVTableCell","Directive","buttonString","rowChangeSubscription","clearSubscriptions","calculator","process","isMiddleInclusive","leftSectionStart","getPercentageOfDayFromMinute","leftSectionWidth","rightSectionStart","rightSectionWidth","updateRangeDescriptor","minuteOfDay","leadingVocabulary","startTimeString","getMinuteOfDayToTime","endTimeString","firstRange","secondRange","getUTCOffsetLabel","getLocalTimezone","rangeDescriptorHtml","minuteOfDayNumber","AccountSettingsFormState","accountSettingsService","formState","Loading","Loaded","formChanged","checkIfFormValuesChanged","enableLiveView","onFormChanged","enableNonEventDownloads","enableVideoRedaction","enableVideoMute","Saving","dirtyAccountSettings","createAccountSettingsContentFromForm","addOrUpdateAccountSettings","accountSettings","clearFormChanged","Saved","updateLocalValuesForCameraSettings","getDefaultAccountSettings","getAccountSettings","defaultAccountSettings","getInitialFormValue","accountSettingsForm","videoRetentionDays","VideoRetentionDays","DisableLiveView","DisableNonEventDownloads","EnableVideoRedaction","EnableVideoMute","onResponse","confirmed","onSaveDialogResponse","AccountSettingsService","AccountSettings","eventCode","settingId","IsHighDefinition","eventTypes","channelsList","onSettingSaved","dataUsageInformation","numberOfEvents","numberOfVehiclesInFleet","camerasSelected","autoDownloadForm","getNumberOfVehicles","getNumberOfEvents","isChecked","setDataUsageInformation","videoDurations","HdDataUsage","SdDataUsage","dataUsagePerSecond","totalDataUsage","dataUsageMessage","validateIfChannelSeleceted","IAutoDownloadSetting","updateCameraChannels","cameraChannelsObservable","vehicleObservable","getChannelThumbnails","processData","thumbnailForChannel","Guid","createMediaGuidUrl","channel1","channel2","IVehicleWithCameraMappings","editorVisible","editor","updateData","hideEditor","showEditor","clearSelectedItem","deleteSelectedItem","itemIndex","threshold","getVehicleTypes","ContextualSpeedingEditor","contextualSpeedingService","form","initiateForm","setSpeedUnit","optionallySetSelectedValues","place","onMapClicked","validationItems","overrideSpeed","createMapMarker","checkForPolylineUpdate","routeData","getContextualSpeedingOverrideRoute","mapPoints","adjustMarkersToPolyline","overrideSpeedKph","convertToDatabaseUnit","segmentIdentifiers","SegmentIdentifiers","ContextualSpeedingOverrideSegments","SegmentIdentifier","reportedSpeedKph","PostedSpeedLimit","EncodedPolyline","updateContextualSpeedingOverride","addContextualSpeedingOverride","patchValue","setMapValuesFromSelectedItem","getPointsForContextualSpeedingOverride","fulfillMarkersAddresses","getAddressForMarker","speedUnit","Tab","tabButtons","ByVehicle","byVehicle","ByRoad","byRoad","speedPercentThreshold","speedThresholdAllowance","currentItems","SpeedingExamplesCalculator","getExamples","setVehicleTypes","optionallySetFormValues","speedThresholdAllowanceKph","updateContextualSpeedingThreshold","addContextualSpeedingThreshold","currentlyUsedVehicleTypes","typeIsNotInUse","percentageValue","constantValue","getProfileForVehicle","getComparisonForVehicle","vehicleFilterTabs","createTables","subscribeToChanges","selectedDeviceProfile","clearSelectedDeviceProfile","onCloseDeviceProfileForm","selectDeviceProfile","selectVehicle","resetTable","deleting","deleteProfile","deviceParameterProfiles","pr","mapAndRenderData","getComparisonsForAllVehicles","getLatestDeviceParameterRecords","mapDeviceProfilesToVehicles","mapDeviceParameterComparisonResultsToVehicles","mapDeviceEventTimeToVehicles","addDecoratingDataToProfiles","parametersSetLabel","getParameterLabelForProfile","createMappingPillsForDeviceProfile","profiles","createProfilesTable","createVehiclesTable","profilesTableColumns","vehiclesTableColumns","getDeviceParameterComparisonResultStatusLabel","getDescriptiveDeviceParameterComparisonResultLabel","profilesTableRows","vehiclesTableRows","profilesTable","vehiclesTable","SelectionType","drivingStyleChange","validate","groupFilterSearchPredicate","associationForm","newAssociation","createAssociationModel","selectedGroupId","selectedVehicleTypeKVP","updatePills","groupsAutocomplete","setDefaultVehicleType","resetForm","onGroupCleared","vehicleTypeKVP","vehicleTypeControl","validateForm","groupIdControl","associationToRemove","matchingAssociations","matchingAssociation","isDepot","existingAssociations","existingDrivingStyles","setupForm","validateAssociationField","groupIdValue","vehicleTypeValue","associationHasValues","existingMatchingAssociationInOtherStyles","createDefaultDrivingStyleAssociation","depotGroups","vehicleTypeKVPs","filterAvailableVehicleTypes","createAssociationPillsForDrivingStyle","availableVehicleTypes","vehicleType1","vehicleType2","showVehicleTypeSelect","$stateParams","maxTotalAllowedMetrics","selectedMetricMapping","drivingStyleForm","dirtyDrivingStyle","associationsValid","applyRouterDrivingStyleId","setStyleIdForMetricMappings","fixAssociatons","saveDrivingStyle","deleteDrivingStyleById","indexOfSelectedMetricMapping","clearSelectedMetricMapping","matchingAvailableMetricMapping","availableDrivingStyleMetricMappings","selectMetricMappingFromMetric","queryDrivingStylePerformanceSummary","updatedMetricMappings","fixWeightingProperties","updateWeightingLevelDetails","setupAvailableDrivingStyleMetricMappings","getDefaultDrivingStyle","getDrivingStyles","getDrivingStyleMetricDescriptionDetails","drivingStyleMetricDescriptionDetails","existingMetricMapping","calculatedDrivingStyle","calculateDrivingScore","clearPerformanceSummaryOnMetricMappings","assignPerformanceSummaryOnMetricMappings","drivingStyleMetricEditor","createDefaultDrivingStyle","addDrivingStyleMetricDescriptionDetails","addDrivingStyleMetricDefaults","addWeightingLevelDetailsToMetricMappings","routeParamDrivingStyleId","newMetricMapping","createDrivingStyleMetricMapping","OverTorqueDuration","uniqueDrivingStyleNameValidator","matchingMetricMappingPriorityOptions","getDrivingStyleForVehicle","editDrivingStyle","NewDrivingStyle","addColumnDataForAssociations","EditDrivingStyle","getDataForAssociationsAsString","string","onGroupSelected","IGroup","groupSelected","onClear","selectGroup","groupChange","newSubGroup","depotStatusChanged","childDepots","alertRuleGroupMappings","selectedParentGroupId","groupForm","totalDrivers","totalVehicles","totalGeofences","totalUsers","GroupGeofenceMappings","selectedGeofence","unchangedGroup","existingDepotVehicleMatchesFound","parentDepot","numParents","clearAllValues","createTableColumns","checkParentIsDepot","checkChildIsDepot","validators","valueChanges","setValidators","checkDepotValidity","alertService","newGroup","savingGroup","groupSaved","groupDeleted","selectedVehicleIds","hiddenVehiclesCount","selectedDriverIds","hiddenDriversCount","selectedGeofenceIds","hiddenGeofencesCount","getResources","changedGroup","getAlertRulesContainsGroupId","groupAlertMappings","groupDetail","groupHasChanged","setMappingsOnAllResources","deleteGroup","vehicleIds","geofenceIds","driverIds","checkForExistingDepotVehicleAssignments","getVehiclesBasic","checkVisibleResources","resourceIds","propertyIdsName","rId","existingMapping","resourceIsHiddenFromUser","countResourceTotals","setMappings","groupToFilter","getDepots","allExistingVehicleMatchMappings","existingDepotVehicleIds","existingVehicleMatchMappings","existingDepotVehicleId","autoLoadGroups","showCounts","readOnly","groupsReady","processGroups","setGroupSelectionStatus","setFilteredDisplayGroups","createGroupHierarchy","updateDisplayGroups","calculateGroupResourceTotals","parentGroups","hasParent","nesting","flattenedGroups","nestCount","nestSpacers","groupHasChildrenAndSibling","childGroups","flattenGroups","showAllGroups","lcSearchString","doesGroupNameContainSearchParameter","filteredGroups","displayedParents","displayedChildren","shallowCheck","childGroup","targetState","otherGroupReference","determineScreenWidth","groupEditor","formIsDirty","clearSelectedGroup","getGroupCounts","groupSubscription","showLoading","showSidebar","samlService","verificationCheckLoading","configuration","loadConfigData","validateTXTRecord","Domain","VerificationStatus","Verified","configurationForm","EntityId","Endpoint","Certificate","saveConfiguration","closeEditor","getConfiguration","createFormGroup","createRadioButtons","selectedEnforcementSetting","ssoEnforcementSettings","Testing","formatMappings","replacementMapping","currentAccountUserMappingIndex","editMode","prepareList","saveTemperatureZone","selectedZone","getZones","mapProbesToZone","listItem","resolutionCodeText","ZoneCreationSource","ZonePosition","updateVehicleProbe","addOrUpdateZone","zoneList","StreamaxConfigsAccountListComponent","streamaxCameraProfileService","configAccountGroupService","percentageBarService","showAccountDrilldownView","showProfileEditor","profileIsSaveable","IsUnmatchedPredicate","dto","PeripheralWithConfigRecord","LatestRecord","CameraDeviceParameterSettings","ProfileExceptionErrors","Errors","isPartiallyMatchedPredicate","hasEmpty","hasNonEmpty","isMatchedPredicate","isNoAssociationPredicate","streamaxTimezoneValues","updateBreadcrumbNameResolver","configAccountBreadcrumbKey","accountsList","StreamaxConfigsAccountView","selectedAccountConfig","selectedAccountName","newProfile","newAccountGroup","CombinedErrors","accountGroupConfigs","updateProfileToCache","filteredRecords","getConfigAccountGroups","accountGroups","profilesList","EMPTY","accountGroup","createPercentageBarCell","getPercentageBarModel","DeviceComms","TotalErrors","TotalSync","ConfigAccountGroupService","StreamaxConfigsPercentageBarService","streamaxCameraParametersService","configAccountGroupCacheName","createNewConfigAccountGroups","getLatestParameterRecords","latestRecords","usableLatest","streamaxPeripherals","accountPeripheralGroups","groupByAccountId","accountRecordGroups","peripheralWithConfigRecord","combinedErrors","StreamaxCameraParametersService","streamaxCameraParametersCache","getLatestParameterRecordsFromDb","updatedRecords","CustomTriggerMetrics","customTriggerUpdated","customTriggerDeleted","VehicleTypes","setupComponent","postTriggerOverride","selectedRow","triggerMetrics","overriddenVehicleTypes","closeCustomEditor","isNew","firstAvailableEnumValue","TriggerMetricsMap","HarshAccelerationTriggerMetrics","Offset","EndSpeed","StartSpeed","ReAlertTimeSeconds","HarshBrakingTriggerMetrics","LeftTurnTriggerMappings","RightTurnTriggerMappings","GyroTriggers","XTrigger","YTrigger","ZTrigger","createFormGroups","vehicleTypeForm","UpdateTriggerMetrics","formCategories","deleteTriggerOverride","controlKey","formCategory","createVehicleTypeCategory","categoryName","formGroupConfig","getMaxValues","saveDisabled","updatedTriggerMetricsMap","getRawValue","StreamaxConfigsComponent","devicesList","updateProfileAndReassessRecords","CameraDeviceParameterProfileSettings","AlarmProfileMap","TriggerMetricOverrides","internalTimezoneInfo","updatedTimezoneInfo","TimeSettings","updatedStreamaxTimeSettings","postProfile","convertTimezoneInfoIdToStreamaxModel","streamaxTimezoneModel","updateProfileFn","reassessRecordDeviations","peripheralWithConfig","updatedRecord","ur","vehiclesList","parseBaseUtcOffset","BaseUtcOffset","runTestBuild","baseUtcOffset","createTableRowCells","createSearchString","rowData","additionalParams","nullFallback","createNACell","contentsTop","contentsBottom","timeAgoClass","contentsMessage","showTBC","vehicleDriverSortData","createRobustRegPlateSearchString","dataBinding","reportRowCell","metricScore","exportVideoEntryLocationMethod","latestOfflineStatusTime","liveUpdates","showIcon","labelNoData","vehicleStatus","labelVehicleOffRoad","labelNoRecentData","labelDriving","labelStationary","createStatusText","Dwell","minutesToDurationString","lowerBoundConvertedValue","convertTemperatureWithSuffix","upperBoundConvertedValue","lowerBoundConvertedExportValue","upperBoundConvertedExportValue","rowStatus","customer$","CustomerView","notesService","tabCount","updateNotes","showNoteForm","noteToAdd","entityId","Manual","CreatedOn","CreatedByUserId","addNote","UserName","getNotes","FoundationNotesService","noteType","filteredNotes","noteTypeString","simService","inFailureState","isUnsupportedSim","tooltipString","getSimInfo","SessionDetails","inSession","dateSessionStarted","dateSessionEnded","createStatusMessage","overageLimitReached","SimMappingType","_valueChanges","started","_started","_destroyed","codeResult","decodedCodes","_getMedian","errorFilter","drawingCtx","ImageDebug","drawPath","onProcessed","onDetected","configQuagga","DEFAULT_CONFIG","inputStream","barcodeScanner","decoder","readers","mapToReader","constraints","init","half","_init","drawingCanvas","dom","boxes","getAttribute","box","Partial","onScanned","barcodeValues","deviceMessages","deviceCommunicationCommands","deviceMessageDirection","DeviceMessageDirection","deviceCommunicationMethod","DeviceCommunicationMethod","deviceMessageStatus","DeviceMessageStatus","thirdPartyMessagingProvider","ThirdPartyMessagingProvider","unitSerial","getDeviceCommunicationTypes","createDeviceCommand","deviceMessage","statusString","toggleSidebar","setValueSelectorAndInfo","commandAdditionalValue","showSendCommandSidebar","selectedDeviceCommunicationCommand","TelematicsMode","LoggingLevel","additionalValueInfo","valueSelectorRequired","CameraReboot","RemovePendingVideoRequests","isPeripheralCommand","command","GetLogFile","GenericFileUpload","PeripheralSerial","getAllDeviceMessages","directionString","deviceCommunicationMethodString","thirdPartyMessagingProviderString","getDeviceMessageUpdates","messageUpdate","messageToUpdate","RequestId","Sent","TimestampCreated","Message","deviceMessageCommandUpdateReceived","DeviceMessageCommandUpdate","cameraConfigurationRequestService","cameraApplicationRequestService","selectedDevices","onActionsSet","onAutoUpdateSet","configHistoryTableColumns","configHistoryTableRows","updaterHistoryTableColumns","updaterHistoryTableRows","telematicsHistoryTableColumns","telematicsHistoryTableRows","loadingTable","changeUpdateList","configUpdateHistory","telematicsAppToApply","updaterAppToApply","configToApply","closeDialog","observablesArray","newRequest","ForceUpdate","RequestState","ConfigurationId","DeviceSerial","Expires","postConfigurationRequest","ApplicationId","postApplicationRequest","cancelSupersededRequests","veriConfigUpdateHistory","veriAppUpdateHistory","constructChangesUpdateList","confirmApplyTemplate","peripheralMetadata","AutoUpdate","getAppType","allApps","getIdToNameMappings","userList","availableTelematicsApps","availableUpdaterApps","availableConfigs","allConfigs","userToNameList","includeSetupOption","isDeviceSpecific","getConfigDataFromCommserver","Production","ConfigJson","VersionGroup","RequestedDate","InstalledDate","RequestedUserName","getUserNameFromId","combinedConfigUpdates","Username","word","selectedConfigFile","getAvailableConfigFiles","configFiles","ConfigFileName","selectCurrentConfig","configFile","ConfigFileId","currentConfigId","getConfigurationUpdateHistory","configHistory","DeviceTypeId","DeviceId","getConfigFilesForDevice","getConfigHistory","postConfigUpdate","IPeripheral","IPeripheralMetadata","CameraApplicationRequestService","appRequestUpdateReceived","appRequest","simMappingService","showSimDetail","isCameraProduct","Cameras","TachoSys","SevenTelematics","updateUnitOrPeripheralLabel","unitSearchResponse","getSimMappings","simMappings","createUnitLabel","IUnit","showDetails","updateState","updateStyle","checkStyle","pending","pendingLabel","info","Automatic","foundationCsvImporterService","modelSave","selectedFile","importStrategyReference","importValidationResult","selectedSimType","WirelessLogic","simType","simTypeStrings","selectedJobItemType","engineerJobItemType","visitReasonStrings","createSelectionTables","createValidationTables","Device","initProductTable","initEngineerGroupTable","initJobReasonTable","resellerMap","selectedUserGroup","engineerGroupTableRows","engineerGroupTableColumns","getProducts","HasSerial","Visible","importType","Calamp","Queclink","sortProductsByGroup","selectedProduct","productTableRows","productTableColumns","jobReasonTableRows","jobReasonTableColumns","validationCompleted","toSend","CsvString","validateFile","importCount","modelsJson","ModelsToImportJson","setupSimValidationReturn","setupPeripheralValidationReturn","setupUnitValidationReturn","setupEngineerValidationReturn","setupJobItemValidationReturn","setCompletionString","setupAssetErrorTable","mainAssetErrors","ImportValidationErrors","ErrorType","MainAsset","fileSetupErrors","FileSetup","deviceErrorTableRows","deviceErrorTableColumns","newSimsToCreate","SimsToCreate","preMappedSimsToSerial","MappingsToCreateJson","existingMappingsToEnd","MappingsToEndJson","simErrors","fatalSimErrors","SimFatal","warningSimErrors","SimWarning","simErrorTableRows","simErrorTableColumns","simImportTableRows","simImportTableColumns","vTabsComponent","stepPrev","importRequestConfirmation","fileUpload","stepToBeginning","returnModels","saveFile","ModelsToCreate","completionResult","validateImportFile","confirmUpload","completionString","selectedTypeString","peripheralImportTableRows","peripheralImportTableColumns","unitImportTableRows","unitImportTableColumns","engineerImportTableRows","engineerImportTableColumns","jobItemImportTableRows","jobItemImportTableColumns","createDeviceErrorTable","createSimErrorTable","createSimImportTable","createPeripheralImportTable","createUnitImportTable","createEngineerImportTable","createJobItemImportTable","createProductTable","createEngineerGroupTable","createJobReasonTable","enumNumber","userGroup","LineNumber","Imsi","Msisdn","VehicleRequiresCreation","EngineerJobItem","FoundationCsvImporterService","unitsService","vehicleValidationCheckRecordService","commissionValidationCheckRecords","getEngineerCommissions","commissions","getAssociatedProperties","getDevices","EngineerUserId","engineerUser","internalUser","loadingDevices","serials","DigidlId","FmiId","TdtId","installedDevices","resellerItemCreationCallback","visitReasonItemCreationCallback","validationItemCreationCallback","repeatVisitsItemCreationCallback","subscriptionsCalculator","ViewCommission","NewCommissionWithBindings","createVehicleMap","engineersMap","mapDataToCommissions","Cost","CommissionNumber","getValidationCheckForCommission","mapVehicleToCommission","mapAccountToCommission","Upgrade","validationObservable","getRecordResultsForTable","observable$","useLoading","onFinishRedirectTo","confirmSaveTemplate","saveCommission","tab3","tabsComponent","tab2","rerouteAfterError","savingCommission","addMissingCommissionProperties","processCommissionMappings","IsSuccess","errorTitle","ExceptionMessage","errorTemplate","createUpdateEngineerCommission","commissionResult","pendingCamera","pendingCameraId","completeJobItem","completeEngineerJobItem","updateChannels","getCommissionChannels","saveCommissionChannels","createUpdateVehicle","associateCommissionIdToCheckRecords","associateVehicleValidationCheckRecordsToCommission","Submitted","JobItemId","EngineerId","Client","Model","MessagingId","PtoInputState","PtoDescription","concatenateCommentsSections","concatenatedComments","comment","vehicleSave","vType","loadVehicles","vehicleForm","selectedVehicleType","getVehiclesForAccount","createVehicleEditForm","createVehicleAddForm","duplicateVehicleFromDatabaseAsync","jobBookingMappingListsSubject","jobBookingMappingLists","addMappingToCachedJobBookingMappingList","mappingObservables","createJobBookingMappingsFromEngineerId","removeMappingFromCachedBookingMappingLists","mappingId","engineerId","addUpdateEngineerJobBookingMapping","getCachedJobBookingMappingListsForJobBookingId","indexToRemove","mp","NotesService","CustomerSubscriptionsPageComponent","CustomerSubscriptionsComponent","customerSubscriptionService","AccountSubscriptionType","totalCharge","activeSubscriptions","uniqueCustomerCalculator","allItems","monthlyChargeCalculator","ChargePerUnit","Amount","yearlyChargeCalculator","subscriptionsObservable","getSubscriptions","getSubscriptionsForAccount","setEndTimes","calculateSubscriptionCosts","sub","TotalCharge","CustomerSubscriptionService","FoundationCustomerEditComponent","preferenceService","accountStatusList","accountStatusChanged","formSubscription","amendedCustomer","isPhoneValid","customerEditForm","formName","amendedPreferences","selectedResellerId","checkFormValid","saveCustomer","saveAccount","currentUserCanUpdateAccountStatus$","currentUserCanUpdateAccountStatus","accountRequest","createNewAccount","getDefaultResellerId","setAmendedCustomer","getPreferences","getLocales","getCustomerImage","IsDefault","FleetSize","ShowZones","ViewSystemGeofences","GeofenceLabelWhenZoomedOut","Clustering","JourneyCost","subscribeToFormChanges","selectedStatus","preferenceQueryOptions","isAccountPreferences","getAccountPreferences","countryCodes$","timeZones$","loadingLocales","customerImage$","getCustomerAccountImage","PreferenceService","CustomerOverviewComponent","updateFeatureset","accountFeatureSet$","updateFeatureSet","FoundationCustomersComponent","AccountFleetType","AccountSector","featureItems","resellerItems","createAccountFeatureFilterItems","viewCustomer","recentItem","CustomerNew","mapResellersAndFeaturesToCustomers","getResellersFilterItems","getFeatureString","DateTimeSetup","FleetType","SectorId","Isotrak","Disabled","Barred","featureDesc","CustomerViewComponent","tabChanged","CustomerEdit","accountName","customerAccount$","updateTitle","CustomerUserList","selectedUser","userEditor","deactivate","toggleStatus","resetPasswordTemplate","sendForgotPasswordEmail","userToUpdate","closeUserEditor","selectedUserId","selectUserById","toggleInternalUserStatus","FailedLoginAttempts","DeveloperConsoleComponent","logMessageReceived","tachoReceived","pulseResponseReceived","logMessages","pulseMessages","tachoMessages","logLevel","LogMessage","CameraCommand","consoleDisplayType","Record","Response","DeviceHealthAccountsComponent","deviceHealthAccountService","onAccountSelection","cameraFailingVehiclesCount","telematicFailingVehiclesCount","getPercentageTelematicsModel","getPercentageCameraModel","getStatsForAccounts","mainTextKey","vehiclesCount","mainText","DeviceHealthAccountService","BadSatFix","MessageSpam","MissingOdometer","LocationSnapped","CameraVideoLoss","CameraMemoryFault","CameraStorageFailure","CameraPowerLoss","CameraGPSLoss","DeviceHealthVehicleViewComponent","dayRange","filterItems","recordGroup","setQueryParams","queryParams","getQueryParams","nowMinusIncludeDays","getAllActiveAndHistoricalRecords","setSelectedFilterItem","vehicleRegistration","regBehavior","redFn","grayFn","createRagCell","getStatusLabel","SDCardErrorType","getFiltersForVehicleDetails","verticalFilterList","selectItem","DeviceHealthComponent","vehiclesTab","vehiclesComponent","selectAccount","EngineerCommissionHistoryListComponent","engineerCommissionService","getCommissions","jobItemService","calculateTotals","calculateJobCompletion","displayJobs","filterJobsByDate","JobView","showAddJobForm","selectedJob","createNewJob","closeJobForm","getEngineerJobs","renderJobs","loadJobs","filteredJobs","mapAccountsToJobs","mapBookingsToJobs","getCompanyNameForJob","getEngineerAssignCell","exportJobCompletionMethod","engineerNames","jobIsAssignedToGroup","engineerAssignedString","buildEngineerAssignedString","getEngineerSearchDataString","jobSaved","jobBookingSaved","saveOrUpdateJob","jobEditorForm","markAsDirty","amendedJobBooking","clearSelectedParentCompany","selectedUserGroupId","showParentCompany","dirty","dateSelector","calendar","setupJobEditorForm","userGroups$","setAmendedJob","setSelectedUserGroup","toggleShowParentCompany","deleteCancelledAssignments","saveNewEngineerMappings","saveJobBooking","selectedEngineersCopy","createUpdateEngineeringJobBooking","engineersMatchMapping","selectedGroupMatchMapping","deleteJobBookingMapping","mappingExists","IEngineerJob","IEngineerJobBookingWithEngineerMappings","visitFailureService","visitFailureSaved","VisitFailureReason","failReasons","issueForm","visitFailureRecord","FailureTimestampUTC","saveVisitFailure","selectedEngineer","KitNotOnSiteCustomer","VehicleNotOnSite","disableChargeable","recordToEdit","setExistingRecord","EngineerReason","CustomerAdvisor","userIsEngineer","Comment","Contact","IEngineerJobItem","IVisitFailureRecord","VisitFailureService","visitFailure","EngineerJobItemListComponent","foundJobItem","filterJobItemsBySearchText","setFoundJobItemIfApplicable","rawParams","JobItemsCommissionNew","selectedJobItem","showIssueSidebar","getAccountListFromDatabase","mapVehiclesToJobItems","mapJobs","searchTextLower","assignJobAvailability","jobAvailability","EngineerUsersComponent","hasReseller","newUserGroup","addNewUserGroup","savingUserGroup","saveUserGroup","closeUserGroupSidebar","showCsvImporter","eventEngineers","CreatedModels","addCsvImportedEngineersToCache","getEngineersWithMappings","closeEdit","isActiveText","VideoEntryComponent","VideoEventListComponent","VideoListComponent","VideoDownloadListComponent","VideoRequestStatusComponent","CameraSignalStrengthComponent","RequestVideoFormComponent","RequestVideoActivityChartComponent","VideoChannelSelectorComponent","DownloadQualitySelector","RequestVideoService","cameraFootageService","requestDateChange","videoLengthChange","selectedChannelsChange","downloadQualityChange","noAvailableDates","selectableDates","requestTimeHasChanged","setQuality","timeChangeDebounce","calendarUnavailable","noFootageAvailable","setRouteParam","requestDate","emitDateChange","timeIsNullOrNaN","convertTimeToString","updatedDate","videoLength","emitVideoLengthChange","selectedChannels","emitChannelsChange","quality","selectedStreamType","mainstreamSelected","Main","showChannelsEditor","loadingChannels","closeChannelsEditor","getPeripheralChannels","customVideoLengthEnabled","isFootageLengthFunctionalityAvailable","cameraDevice","isLiveStreamCamera","OnlineOnly","getAvailableDates","setupRequestableVideoLengths","canEditChannels","requestHour","requestMinute","requestSecond","qualitiesAvailable","addRequestableVideoLengths","getMaxRequestFootageLength","requestableVideoLengths","videoLength1","videoLength2","lengthInSeconds","setRequestableDatesFromFtCloudFootage","updateSelectableDatesFromJourneys","setRequestDate","handleNoAvailableDates","journeyStartTime","journeyEndTime","dailyFootageDate","calendarLoading","getLatestCalendarFootageHistory","latestFootageCalendar","latestCalendarFromFtCloud","getDailyFootageDate","clearLatestFootageHistoryDateQueried","updateLatestQueriedDate","updateSelectableDatesFromFtCloudCalendar","presetTime","AvailableDates","calendarDay","latestFootageHistoryDateQueried","updateLatestQueryDateCheck","requestDateSameAsLatestQuery","secondsInitial","minutesAbbr","activeChannels","newTime","footageHistory","createTimelineFootage","requestedVideoStartDate","requestedVideoEndDate","timeline","availableFootage","getFootageAvailableAtTime","availableVideoStreamTypes","displaySections","endOfToday","dateEnd","dateStart","historicalFootage","startKey","endKey","newTimelineFootage","requestDateMoment","footageStartTime","footageEndTime","existingMatchingStartSection","videoStreamTypes","hasMainStream","hasSubStream","footageSection","cameraFootageTimelineService","selectedSecondChange","totalSecondsInRange","setHoveredTimeUsingMouseEvent","clearHover","newSecondOfDayClicked","selectSecondOfDay","newSecond","selectedSecondOfDay","selectedSection","selectedPercentage","calculateSelectedLabelOffset","footageSections","selectedTime","getFootageSectionForDateTime","setupFutureMask","futureMask","availableChannelIds","setFootageSectionPercentages","maxOffset","hoveredPercentage","hoveredSecondOfDay","hoveredTime","hoveredSection","calculateHoveredLabelOffset","requested","listen","handleMouseUp","handleKeyDown","offsetParent","selectChart","deselectChart","handleArrowsKeys","originalEvent","selectedLabelFlipped","hoveredLabelFlipped","CameraFootageTimelineService","requiredQuality","startSection","getTimelineDisplaySectionAtDate","latestSection","availableDailyFootageFromJourneys","convertJourneysIntoAvailableDailyFootage","createAvailableDailyFootageTimeline","availableDailyFootage","summaryStartDate","summaryEndDate","createTimelineSummaryTemplate","channelSummaries","createChannelOverviews","channelSummary","getVideoStreamTypesFromFootage","createFootageDisplaySections","patch","setStartEndDatesFromFootage","overview","channelOverviews","channelFootageMap","getChannelFootageMapFromSummary","channelId","createChannelOverview","channelOverview","createChannelOverviewTemplate","channelTimelines","createChannelTimelines","getChannelStreamTypeFootageMap","createChannelTimeline","channelTimeline","createChannelTimelineTemplate","createChannelTimelineDisplaySections","newSection","Channel","createBaseTimelineTemplate","filteredFootage","filterFootageWithinDates","orderFootageByDateProperty","newTemplate","channelMap","channelArray","footage1","footage2","section1","section2","timelineBase","findFootageWithLatestEndDate","latest","getSecondOfDay","gap","createNewSection","currentSection","footageInCurrentSection","addFootageToSection","footageStartAtCurrentSectionEnd","footageStartAfterCurrentSectionEnd","footageStartAfterCurrentSectionStart","footageStartsBeforeCurrentSectionStart","footageStartsBeforeCurrentSectionEnd","footageEndsBeforeCurrentSectionEnd","footageChannelInCurrentSection","footageStreamTypeInCurrentSection","footageSharesCharacteristics","newSeparateSection","newIntersectionSection","createNewIntersectingSection","extendFootageSection","footageToExtendToNewSection","currentSectionFootage","extendableFootage","gaps","getGaps","patchGaps","postGaps","newSections","newSectionsForGap","orderSectionsByDateProperty","previousSection","previousSectionEnd","sectionStart","earliestFootageDateEnd","findFootageWithEarliestEndDate","nextSectionDateStart","newGap","lastSection","lastSectionEnd","lastSectionFootage","earliestEndDateFootage","trimSectionEndDateIfEarlier","footageTails","sectionFootage","earliestTailEnd","overrideDateStart","overrideDateEnd","autoSelectAll","channelsChange","channelSelectorLabel","isOpen","visibleChannels","updateChannelSelectorLabel","availableChannels","processChannels","getAllActiveStreamingChannels","setSelectedChannels","createChannelCards","primary","updateVisibleChannelList","selectedButtons","channelRadioButtons","channelLabel","signalType","signalStrength","updateDataAfterInterval","cameraSupportsSignalStrength","signalStatus","showLoadingIndicator","hideComponent","intervalSubscription","getSignalStrength","parseSignalStrengthResponse","SignalStrength4g","SignalStrength3g","signalStrengthClass","elementToHide","Host","qualityChange","getAvailableQualities","getFootageHistoryForDay","availableFootageTypes","ftg","substreamAvailable","mainstreamAvailable","timerSubscription","createExportName","subscribeToCacheUpdates","unsubscribeFromUpdates","removeVideoEntryFromList","selectVideoEntry","selectedVideoEntry","videosAvailable","clearSelectedVideoEntry","subscribeToUpdates","getVideoDownloadStatusLabel","DateRequested","updateVideoEntry","filteredEntries","setVideoEntriesData","showLoadingSpinner","firstLoadComplete","timer$","getVideoEntries","filterVideoEntries","processVideoEntries","getVideoEntriesRequestedWithMappings","UserRequestedUploadDate","DateCreated","dateCellOptions","createLocationInformationHeader","createOnlineStatusCell","createVideoDownloadStatusCell","exportOnlineStatusMethod","AuditLogs","exportedFileName","eventsList","enumValues","observationsService","thumbnailSourceType","onPlayVideo","showVideoPreview","thumbnailSrc","getThumbnailSrc","createTags","downloadVideo","onloadeddata","videoObservation","setObservationTitleForDisplay","videoEventCodeService","eventCategories","eventItemCreationCallback","vehicleItemCreationCallback","driverItemCreationCallback","configureEventMarkerOptions","addVideoEntryToCurrentEntries","goToEvent","filterVideos","getVideoEvents","getVideosEntriesWithMappings","processEventCategories","displayVideoEvents","pipCache","generateEventMarkerPipOptions","generateColorPip","eventMarkerOptions","typeOptions","imagePath","gridSize","typeEvents","createClusterIcon","EventView","eventId","eventArray","cluster_","markers_","matchingEventCategories","getEventCategoriesForEvents","pieCanvas","width_","numPossibleVideoEvents","existingcategory","eventcategory","getEventRisk","isDeleted","isEventAndActive","Exception","VideoEventCodeService","VideoEventCodeGroups","lowRiskCodes","mediumRiskCodes","highRiskCodes","urgentRiskCodes","Urgent","dmsEventCodes","adasEventCodes","LowShock","MediumShock","videoReviewService","displayVideos","setupListeners","createDefaultDateRange","hideResourceFilter","getObservations","getVideos","foundObservation","isUnseen","createDayBoundaries","previousVideo","newDay","unseenVideoCountUpdated$","favouriteVideoCountUpdated$","VideoReviewService","unseenVideoCountUpdatedSubject","favouriteVideoCountUpdatedSubject","checkIfExistAndAddToTimeline","actions","ActionDate","getUserAction","findUserAndGetUserAction","customDisplayText","updateVideo","existingAction","isActionSetForUser","actionIndex","getUniqueUserAction","statusDisplayValue","metaData","userActions","CameraEventService","diagMessageReceived","DiagnosticPacketUpdate","parseEventPayloads","RecordType","CameraDiagnosticRecordType","Gps","PayloadJson","CameraLogsComponent","logService","logFiles","requestStartDate","requestDuration","endSubscription$","fileContentDictionary","logRequests","logRequestIdKey","FileCount","showDetailsSidebar","cameraLogFile","localFile","FileContent","showCreateRequestSidebar","onSelectedTimeChanged","hoursDate","minuteDate","secondDate","newLogRequest","RequestTime","createLogRequest","logRequest","createLogRequestTableRows","toggleCreateRequestSidebar","getLogRequests","getLogFiles","requestId","currentFile","LogRequestId","getLogRequestUpdates","updateRequestStatus","logRequestMessage","logRequestToUpdate","SentTime","CameraLogService","FoundationVideoService","setPrimaryChannel","CameraViewComponent","configHistoryData","cameraSerial","cameraChannelsEditor","saveChannels","cameraLogsViewer","channelsTab","getPeripheral","getRtlConfigData","getVeriConfigData","getVeriAppData","getPeripheralMetadata","rtlConfigData","veriConfigData","veriAppData","rtlConfigUpdateHistory","streamaxMetadata","DeviceMetadataInfoJson","getPeripheralBySerial","peripheralNameBreadcrumbKey","getApplicationRequests","getConfigurationRequests","isAutoDeployment","PeripheralListComponent","setVendors","viewName","camerasView","showDeviceImport","vendor","newPeripherals","importButtonString","getLocation","setImportButtonText","vendorsList","productVendors","PeripheralViewComponent","SimListComponent","simTypeItemCreationCallback","simStatusItemCreationCallback","selectedSim","selectedSimCurrentMapping","UnitListComponent","newUnits","getAllUnitsWithMappings","UnitLogsComponent","unitLogService","selectedLog","getLogs","Errored","ProcessingTime","HostDescription","Raw","ErrorMessage","UnitLogService","UnitViewComponent","getUnitBySerialWithMappings","getAccountMapping","getAccountMappings","accountUnitMappings","ReleaseNotesComponent","releaseNotes","displayNotes","pipeline","filterBySearchText","rn","Changes","changeIdContainsText","changeTitleContainsText","environmentName","prepareReleaseNote","PBIs","Bugs","CustomerRequest","CustomerBugs","Enhancements","Parents","createParentHierarchy","Parent","Classification","pbi","findAndAssignParent","Children","CameraConfigurationComponent","appService","configService","selectedRowsCopy","appToApply","showDeviceConfigure","resetSelectedActions","getAppsAndConfigs","loadAccounts","loadCameras","getCustomerAccountName","createCameraOnlineStatusCell","selectedDeviceColumns","getOnlineStatusForVehicle","getAllConfigurableCameras","setConfigNameString","getConfigs","availableApps","ConfigManagerComponent","selectedConfigs","selectedConfig","saveConfig","clearSelectedConfig","onConfigSaved","RVLiteComponent","FoundationVehicleListComponent","customerMap","VehicleViewComponent","pulseService","showingEditVehicleForm","p100ProductId","inProcess","diagnosticsInProcess","showDiagnostics","diagnostic4g","getPlotsWithSensorData","getLatestPulseMessage","latestPulse","latestPulseRecord","getLatestPlot","selectedMapPlot","locationMarker","getInstallerUnitAndMapping","updatePeripherals","selectedVehicleCurrentUnit$","getVehicleCurrentUnit","selectedVehiclePeripherals$","getInstalledPeripheralsForVehicle","FuelLevel","convertDirectionToWords","getCanDataColumns","samplePlot","canDataColumns","excludedColumns","VisitFailuresComponent","reasonItemCreationCallback","loadingJob","getEngineerJobsForAccount","accountJobs","accountJobItems","showNewRecordForm","newRecord","clearAccountAndJobs","visitFailureRecords","selectedVisitFailureRecord","getVisitFailures","getAllUsers","getAllEngineerJobItems","jobItemsMap","getJobId","getUsername","getEngineerName","isChargeable","FoundationUserService","getUsersForAccountPromise","resellerMappings","ReportCardComponent","reportDefinitionHistory","historyView","loadSchedule","updateDisplay","clearTitle","lastRanByLabel","IReportDefinitionHistory","ReportCategorySelectorComponent","categoryIndex","optionChanged","FilterTitleRowColumnHeaderPipe","ReportColumnHeadersSelectorComponent","columnHeadersChange","columnHeaderFilter","columnHeaderSearchPredicate","updateFilterOptionsForColumnHeaders","moveTitleRowToTop","allowedColumnHeaders","updateRemainingAllowedColumnHeaders","indexOfColumnHeader","newIndex","moveColumnHeader","columnHeaderSelected","columnHeaderCopy","columnHeaderAutocomplete","forceArrayChanges","accordianEntry","showEdit","filterOptionsProp","FilterValueOperator","Equals","onFormValueChanged","revertTitle","matchesTitle","matchesDefaultTitle","matchesCategory","indexOfColumn","indexOfHeader","removedColumn","filteredColumnHeaders","allowedColumnHeader","addedColumnHeader","remainingAllowedColumns","indexOfTitleRow","ChartDefinition","cacheCustomPreferences","prepareReport","hasMissingPreferences","addMissingReportPreferences","DaysHoursMinutesSeconds","newCachedCustomPreferences","createPreferenceForCaching","ReportScheduleEditorComponent","schedulingFrequency","reportFilter","filterSchedulingFrequencies","scheduleEditorForm","dirtySchedule","prepareScheduleModel","originalSchedule","loadReports","isSaving","cleanFormData","mapPreferences","saveSchedule","isDeleting","objectToDelete","sendTo","createEmailRecipientControl","validateRecipients","updateScheduleUsingReport","getHoursAndMinutesFromTimeString","setSelectedReport","selectedReport","updateReportUsingSchedule","retryCountExceeded","getFrequencyText","getPeriodText","getRangeText","getRecipientsString","Monthly","repeatDate","validateSelectedDays","reportSingleResourceIsSelected","createReportScheduleTemplate","originalReportId","reportDefinitionId","reportFilters","existingScheduleNames","scheduleName","uniqueScheduleNameValidator","RunDate","FormArray","createDefaultRecipients","processFormChanges","mapFormToModel","emailControls","CurrentMonth","Overnight","Weekend","currentFrequency","lowerCaseScheduleName","trimScheduleName","scheduleModel","copyScheduleParametersToReport","copySchedulePreferencesToReport","reportModel","copyReportParametersToSchedule","copyReportPreferencesToSchedule","reportScheduleName","translatedFrequency","startDay","startDayTime","getStartTime","endDay","endDayTime","getEndTime","dayOfMonth","recipientsString","splitTime","IDynamicReportSchedule","RowDataSourceSelectorComponent2","originalRowDataSourceOptions","originalSubRowDataSourceOptions","GeofenceVisits","AlcolockRecord","VehicleInput","CommonEvent","rowDataSourceOptions","subRowDataSourceOptions","setRowsForDataSource","setSubRowsForDataSource","addSupportedDataSources","validateSelection","setSelectedOptions","selectedRowOption","selectedSubRowOption","disableSubRowOptions","combo","FormSubmission","rowFound","subRowFound","ReportHistoryViewComponent","domSanitizer","reportHistoryId","getLog","getSingleReportHistory","reportHistory","trustPdfUrl","bypassSecurityTrustResourceUrl","DomSanitizer","ReportListPageComponent","allHistory","selectedCategoryHistory","displayReportHistory","counts","isReportOfType","filterDriverReports","filterVehicleReports","showReport","showReportEditor","reportEditorValid","reportSave","closeReportEditor","savedReport","deleted","definitionPromise","historyPromise","getLatestReportHistory","countsPromise","getLogCounts","createReportHistory","runCount","sortReportHistoryMethod","dataSources","ReportSchedulePageComponent","editSchedule","addSchedule","clearSelectedSchedule","reportSchedules","scheduleSaved","scheduleDeleted","ReportViewComponent","loadingReportHistory","runningReport","runningReportFinished","scheduleSaving","updateSubject","updateSubject$","checkForHistory","subscribeToReportHistory","reportToRun","reloadHistory","openReportHistory","reportEditorSave","savedAsCopy","activeSchedules","deletedSchedule","selectSchedule","closeReportRunner","viewTab","clearPdf","populateReport","selectHistory","createHistory","lastReportRun","historyTab","cancelError","runReport","errorDialog","clearRouteParam","clearData","clearUpdateSubject","loadReport","processReport","processReportHistory","updateNavigation","updateLastReportRun","reportNameKey","ReeferListComponent","ReeferDetailComponent","ReeferErrorListComponent","TemperatureGraphComponent2","TemperatureTrendComponent","TemperatureSourceDataComponent","TemperatureComplianceComponent","TemperatureComplianceDetailComponent","ZonedTemperatureDetailComponent","ZoneSummaryViewComponent","ZoneDetailPageComponent","ZoneOverviewPageComponent","ZoneTemperatureComponent","ZoneSetPointComponent","ProbeDetailComponent","InputListComponent","TemperatureLogComponent","SiteSearchComponent","AudioService","faultCodeService","multiStateInputService","lastUpdated","reeferPromise","getReeferData","propertiesPromise","getPropertiesForReeferData","reeferUnits","santitiseReeferSerialNumber","getModes","diagnosticErrors","getActiveReeferErrors","diagnosticTroubleCodes","getVehicleData","getDiagnosticData","getMultiStateInputData","faultCodePromises","getActiveDiagnosticRecordsForVehicle","getReeferDiagnosticTroubleCodes","getLatestMultiStateInputRecords","temperatureSetpointService","conversionService","dateRangeStart","openReeferDetailsDialog","Reefer","reeferData","setupSensorDataForReefer","mapHistoriesToSetPoints","getVehicleMultiStateInputHistory","mapPropertiesToZones","diagnosticRecord","getLastUpdated","activeErrors","currentError","getActiveReeferError","errorStatus","temperaturePromises","getZonesTemperatureOutOfBoundsHistory","zoneTemperatureOutOfBoundsHistory","multiStateInputPromises","getMultiStateInputs","getLatestReeferZoneOperatingModes","mapZoneStatuses","mapTemperatureSetpointsToZones","mapOutOfBoundsHistoryToZones","mapProbesLatestRecord","hasZoneOutOfBounds","outOfBoundsList","isReeferInactive","createLocationInformationCell","createOperatingModeCell","createEngineModeCell","createZoneOpModeCell","createSetpointCellForZone","getTemperatureReadingCell","Return","Supply","Evaporator","reading","getTemperatureReading","opMode","operatingModeString","engineModeString","getProbeByType","showSourceData","probeGraphLoading","inputChartLoading","showInputChart","tooltipWidth","tempProfiles","tooltipInputPoints","tooltipMultiStateInputPoints","tooltipProbePoints","inputCategories","showProbeConfigGraph","resetState","setDefaultStartAndEndDates","loadGraphData","probeGraph","inputChart","probeGraphConfig","seriesLabelPadding","hideTooltip","showTooltip","tooltipContainer","currentTarget","tooltipElement","tooltipXOffset","tooltipLeft","tooltipYOffset","tooltipTop","currentchart","plotlinePosition","addOrUpdateChartCrossHairFromMouseX","tooltipDate","updateTooltipData","setExtremes","showResetZoom","filename","exportChart","inputChartConfig","latestRequested","loadInputs","loadTemperatureData","loadMultiStateInputs","loadSetpoints","createProbeChart","createInputChart","TemperatureProfileMaterialisationOptions","WithHistories","relevantProfile","TemperatureProfileHistories","MinPrimaryThreshold","MaxPrimaryThreshold","temperatureProfile","getMultiStateInputHistories","multiStateInputHistories","multiStateInput","inputPromises","getVehicleInputHistory","temperatureSeries","isInZone","foundRecords","timestampValue","seriesColour","dashStyle","addTemperatureSeries","addSetpointSeries","createTempChartConfig","sortExportLabels","getExportingOptions","setChartXAxisExtremes","inactive","displayTempProfilesOnGraph","itemMarginTop","itemMarginBottom","syncChartZooming","seriesData","vehicleInput","isMultiStateInput","historyListItem","inputName","inputCategoryName","getColourForTriggerState","getDescriptionForTriggerState","xRangeSeries","addInputSeries","addMultiStateInputSeries","orderInputCategoriesByName","pointWidth","pointPadding","createBasicXRangeChart","setOnLoadCallback","marginRight","chartOptions","yaxis","plotLines","fontSize","fontWeight","currentChart","afterSetExtremes","userMax","axisPoint","seriesItem","foundProbePoint","orderTooltipInputPointsByName","getOperatingModeColour","getTriggerStateName","setupInputsTable","stackedDateLocationCellTemplate","createDurationCellFromDates","inputsData","createInputItem","temperatureRecordService","getLatestTemperatureRecordsForVehicle","latestTemperatureRecords","getProfileNames","getTimeInAlarm","filterProbes","lowerBoundString","upperBoundString","temperatureIsInBoundsAccordingToProfile","timeInAlarm","inAlarm","IVehicleWithTemperatureData","temperatureOutOfBoundsHistoryService","temperatureLog","numberOfProbes","getTemperatureRecordsForVehicle","getVehicleTemperatureOutOfBoundsHistories","temperatureRecordsByDate","groupRecordsByDate","temperatureOutOfBoundsHistory","mapTemperatureRecordsToProbes","setExportedFileName","setupTemperatureLog","probeIds","rowId","timestamp","probe1","probe2","probe3","probe4","rowHasData","probeHasOutOfBoundsHistory","groupedRecords","timestampStr","maxColumns","createProbeReadingCell","probeKey","audioService","temperatureRecordsService","changeDetector","temperatureData","useAudibleAlarm","totalVisibleColumns","maxVisibleColumns","totalExportableProbeColumns","latestUpdateTime","reloadInterval","inJourney","journeyStatus","getLatestTemperatureRecords","getActiveVehicleTemperatureOutOfBoundsHistories","activeOutOfBoundsHistories","mapData","checkForNewOutOfBounds","setupProbes","mapTemperatureProbesToVehicles","latestTemperatureUpdate","getLastUpdatedForVehicleProbes","lastUpdatedRelativeTime","getVehicleIsInJourney","getVehicleIsInErrorState","checkVehicleHasProfileSet","cleanVehicleProbeNames","mapHistoriesToProbe","probeIsActive","alarmSounded","soundAlarm","isRecentData","cutoff","errorState","vehicleHasProbeOutOfBounds","thirtyMinutesAgo","outOfDate","hasProfile","createTemperatureReadingCell","latestTemp","cutOff","probeIsOutOfBounds","isInProfileBounds","searchValue","matchedVehicles","matchedDrivers","matchedGeofences","dataLoaded","searchVehicles","searchDrivers","searchGeofences","searchValueUpdated","AlertDetailComponent","alertReviewService","alertsService","categoryString","getCategory","subcategory","getAlertRuleSubcategoryEnum","subCatString","AxleWeightAlertDetailComponent","getAxleWeightData","alertData","InputAlertDetailComponent","getInputData","PowerLossAlertDetailComponent","getPowerLossData","temperatureProfileService","alarmRecord","createAlertDetailData","temperatureExtreme","detailData","temperatureAlarmRecord","temperatureDiffExtreme","temperatureDiffMessageExtreme","TemperatureProfileService","temperatureProfilesCacheName","getTemperatureProfilesFromDb","TollAlertDetailComponent","getTollData","TyreRecordAlertDetailComponent","getTyreRecordData","VehicleDiagnosticAlertDetailComponent","VideoAlertDetailComponent","getVideoData","AlertReviewDialogComponent","addAlertReviewEvent","noteText","agreement","resolvingIncident","resolutionId","alertReviewEvent","onResCodesChanged","getAlertReviewEvents","getAlertResolutionCodes","alertEvents","resolutionCodes","mapEventsToHistory","getResolution","setupActionForm","getResolutionCode","resolution","IAlertReviewHistory","AlertReviewHistoryComponent","iteration","updateAlertReviewHistoryItem","openIncidentDetailsDialog","getAlertRules","dateQueryOptions","getAlertReviewHistory","alertRecordQueryOptions","WithMetadata","getAlertRuleRecordsUsingQueryOptions","alertReviewEvents","alertRecords","mapVehicleToHistory","mapAlertRecordToHistory","parseAlertRecordMetadata","createTableColumn","setRowWarningStatus","getVehicleDepot","getAlertRuleCategory","subCategory","getAlertRuleSubCategory","createInformationCell","detailExportMethod","TemperatureRecordId","TollId","TyreRecordDataId","VehicleDiagnosticRecordId","getAlertDetailExport","AlertDetailService","ResolutionCodeEditorComponent","updateAlertResolutionCode","resolutionCode","addAlertResolutionCode","cancelEditMode","UserAccessTesterComponent","AccountFeature","cacheUserType","processUserType","printAccountFeatureListForAccount","updateCurrentUserCache","cacheFeatureAccess","cacheSpecialPermissionAccess","updateAccountData","accountDataPromose","accountFeatureDescriptions","getFeatureDescriptionsForAccountAndUser","specialUserPermissionDescriptions","featureDescription","addUserReadFeature","removeUserReadFeature","addUserManageFeature","removeUserManageFeature","cachedUserType","cachedReadFeatures","cachedManageFeatures","cachedSpecialUserPermissions","isAdminUser","setAllReadFeatures","setAllManageFeatures","VideoRestrictionComponent","checkRestriction","hideVideoButton","videoRestricted","videoRestrictionCheck","VideoId","CanBeRequested","TemperatureRowComponent","getProbesAndProfiles","setOutOfBounds","IPlotTemperatureRecord","DepotComplianceComponent","createSelectedVehicleTable","createSelectedVehicleTableRows","setTimeWindow","getGeofenceVisits","mapDepotToVehicles","mapVisitsToVehicles","getDepotVisitsBreakdown","homeDepotGroup","findVehicleDepot","timeWindow","getVisitDuration","allGeofenceVisits","allDepotVisits","isVisitLocationADepot","visitIsOver9Hours","homeVisits","depotVisitBreakdown","dv","curr","depotBreakdown","findMostVisitedDepotsForVehicle","durationFormatted","totalTime","mostVisitedDepot","getRowWarningStatus","mostVisited","mostVisitedPercentage","templateData","createTableTemplateCell","mostVisitedColumn","totalTimeSpent","getTotalTimeAtDepots","selectedVehicleTableColumns","visitBreakdown","selectedVehicleTableRows","DriverBehaviourStackComponent","IDriverComparison","DriverScoreGraphComponent","resizeCanvas","drawCanvas","b3","createSegments","onScoreUpdated","currentIndicatorPosition","targetIndicatorPosition","targetScore","buffer","horizontal","distancePerTick","animateCanvas","setMessageClass","drawHorizontalSegments","drawArcSegments","drawIndicatorDots","drawIndicator","endPosition","drawArcSegment","startSegment","endSegment","angle1","angle2","lineCap","circleSize","innerCircleSize","shadowColor","shadowBlur","globalAlpha","numDots","runningValue","messageClass","messageString","IDriverScore","UtilisationSource","VehicleUtilisationComponent","utilisationService","timeLabels","allVehicles","utilisationSource","updateTimeLabels","getBaseData","getJourneyUtilisationData","getDepotUtilisationData","createUtilisationRecords","groupsPromise","geofenceVisitsPromise","getAllJourneys","createUtilisationRecordsForDepots","createUtilisationRecordsForJourneys","hoursInRange","maxLabels","hoursPerLabel","dayMode","subLabel","NPSDashboardComponent","npsService","resellerScores","customerScores","happyCustomers","unhappyCustomers","donutSlices","selectRating","selectedUserRecentRatings","getSelectedUserEmail","selectedRatingTableRows","selectedRatingTableColumns","selectedUserEmail","getRatings","prepareNPSEntriesForDisplay","calculateScoreHistogram","calculateAggregatedScoresByCustomer","calculateAggregatedScoresByReseller","calculateDonut","createDonutSlice","resultsTableColumns","createResultsTable","resultsTableRows","summaryTableColumns1","createSummaryTable","summaryTableColumns2","summaryTableColumns3","resellersSummaryTableRows","happiestSummaryTableRows","unhappySummaryTableRows","includeCustomer","DateTime","scoreTemplate","aggregatedScore","NpsGaugeHorizontal","ICalculatedNPSScore","FaultCodeVehicleHistoryComponent","faultCodesService","loadDiagnosticRecords","FriendlyCode","getVehicleDiagnosticRecords","vehicleRecords","IVehicleDiagnosticRecords","FaultCodesComponent","getFriendlyCodesString","getLastAndActiveDiagnosticRecords","SensorDataHistoryComponent","loadSensorData","getEngineHours","getSensorData","IVehicleWithSensorDataValues","SensorDataComponent","getLatestVehiclesSensorData","TachoComplianceComponent","currentDriverTachoHours","updateTimeCutOff","loadTachoDataForDriver","selectedDriver","sideBarLoading","selectedDriverTachoDays","getTachoDaysForDriver","createModeSummaryMins","getCurrentTachoForAllDrivers","driverTachoHours","getRowStatus","ContinuousDrive","BreakRestTaken","DailyDrive","WeeklyDrive","tachoHours","VehiclesPageRouteComponent","maxTempColumns","ContactPageComponent","supportEmail","foundationKbAddress","DeliveryProfileEditComponent","DeliveryProfileViewComponent","OptimiserService","OnSiteTimeMins","maxDistanceKmPerVehicle","maxDistanceKmSlack","numVehicles","maxWorkingTimeHours","maxDrivingTimeHours","depotIndex","breakRequired","loc","optimiseRequest","createDefaultOptimiserRequest","createUnplannedLocationsFromJobs","setDepot","optimiserRequest","optimiserResponse","previousLocation","newDistance","OptimisedVehicleRoutes","ovr","TotalDistanceKm","totalHours","distancePercentage","distanceSavingPercentage","durationPercentage","durationSavingPercentage","stats","originalDistance","optimisedDistance","originalDurationMinutes","optimisedDurationMinutes","OptimisedLocations","Breaks","createRouteTimeline","calculateOptimiserStats","originalMapLink","createGoogleMapsLink","optimisedMapLink","OriginalLocation","shiftStartTime","previousTimelineEntry","takenBreak","cumulativeDuration","TravelTimeSeconds","StartSecond","breakEntry","createRouteTimelineEntry","DurationSeconds","arrivalTime","isBreak","timelineEntry","DistanceToStop","previousEntry","travelTime","activityTime","travelDistance","activityDuration","cumulativeDistance","IPvaBarChartType","PvaBarChartComponent","isValidInput","distanceUnit","createBars","setChartLabels","defineHeights","plannedFigure","actualFigure","bars","percentageHeight","getTooltipLabel","Actual","bar","getConvertedDistance","difference","prefix","differenceLabel","chartLabel","differenceLabelClass","valueToConvert","PvaChartLegend","ActiveRouteVisitComponent","activeRoutesService","delayedHoverService","visitIndex","getVisitClass","updateDisplayLabelWidth","updateVisitIcon","createMouseEnterDelay","pixelsToNextStop","pixelWidth","visitIcon","IRouteDetailVisitDisplay","ActiveRoutesComponent","activeRoutes","displayRoutes","hoursToDisplay","screenWidth","leftNavBuffer","pixelsPerHour","currentTimePosition","panLeftClickPressed","panLeftClickInitialX","panLeftDistanceTravelledX","panLeftOriginalOffsetX","panLeftOffsetX","swimlaneHeight","scrollOffsetY","scrollContainerHeight","calendarPanPosition","showSyncButtonRight","showSyncButtonLeft","filterRoutesBySearchText","onResize","calendarContainerWidth","calendarContainer","calendarTitle","addEventListener","toggleZoom","canManageTMS","showAsTimeline","middleScreenTime","setTimeHeaders","updateCurrentTimeMarker","deltaY","zoomOut","setMinMaxZoom","setPositionsOnStops","calendarPanLimitsReached","updateRouteVisitVisibility","updateCalendarPanPosition","onMouseUp","maxScrollRight","maxScrollRightListView","openRouteDetailsDialog","plannedStartTimePixelPosition","getChartPixelPosition","syncScreen","orderedRoutes","earliestRouteStart","latestRouteEnd","originalStart","originalEnd","startTimeWindow","endTimeWindow","totalTimeWindowToGet","getPlannedRoutes","createDisplayPlannedVisitsOnRoute","updateRouteVisits","totalStopCount","updateTimeHeaders","averageHoursPerStop","idealPixelsPerStop","pixelsPerTimelineMinute","firstTime","pixelPosition","minsFromStartUntilNow","updateVisibility","previousStop","startTimeWindowPosition","endTimeWindowPosition","startPixelPosition","endPixelPosition","classSize","calculatePixelsTravelled","pixelMargin","actualPixelsTravelled","currentTravelSecs","pixelsPerSecond","screenBuffer","hasVisibleVisits","insideLeftBounds","insideRightBounds","isLeftOfScreen","middleScreenPosition","getChartTimeFromPixel","halfScreenWidth","visibleStateTrigger","showStateTrigger","HistoryNotesComponent","newNoteAdded","initForm","notesForm","newNote","Note","RoutePerformanceComponent","plannedRouteService2","routePerformance","plannedRoutesSubscription","selectedRouteTableRows","selectedRouteTableColumns","requestData","requestPlannedRoutes","createSelectedRowTable","processRoutes","getOrCreateExistingRoutePerformance","arrivalEarlyCount","arrivalOnTimeCount","arrivalLateCount","arrivalMissedCount","rp","routesEquivalent","arrivalEarlyMins","arrivalLateMins","arrivalOnTimeMins","performanceRating","r1visit","r2visit","TMSImportErrorType","TMSErrorLevel","TMSRouteGenerationErrorType","ScheduleImportComponent","numToSave","saveSuccessCount","saveErrorCount","exampleCsvFilePath","startDateValid","defaultAreaValid","defaultGeofenceRadius","generateRoutesSub","getDateInInputFormat","weekCommencingDate","defaultAreaInput","selectedGeneratedRoute","createSelectedRouteTables","checkValidity","uploadCSV","dateFromInclusive","importFilename","uploadRouteCsv","allRoutesTableRows","allRoutesTableColumns","createAllRouteTableColumns","generatedRouteSummary","allRoutes","addPlannedRoute","PlannedRoute","fileResultSummary","rowsWithErrors","ErrorLevel","RowIndex","errorCount","validRowCount","TMSFileRecords","createSummaryBox","rs","fr","convertTmsErrorLevelToTableCellStatus","errorLevelString","errorTypeString","reportProgress","HttpEventType","UploadProgress","processValidationResult","validationErrorsTableRows","validationErrorsTableColumns","fileRecordsTableRows","fileRecordsTableColumns","generatePlannedRoutesModel","TMSFileIngestionResult","TMSFileParseRequest","DateFromInclusive","Filename","DefaultGeofenceRadius","invalidRoutes","validRoutes","processPlannedRoutes","allRoutesWithErrorsTableColumns","maxTmsErrorLevel","highPriorityError","errorString","routeResultSummary","createValidationErrorsTableColumns","createFileRecordTableColumns","ColumnIndex","ColumnName","RouteNumber","VisitNumber","VisitArrivalDateTime","withErrors","createSelectedColumns","createSelectedRouteRows","selectedGeneratedRouteColumns","selectedRouteErrorColumns","selectedGeneratedRouteRows","selectedRouteErrorRows","AheadBehindComponent","calculateBarWidths","rightPercentage","VisitPerformanceComponent","visitPerformance","maxVisits","maxDiffMins","prepareForData","createSelectedVisitsTableRows","createSelectedVisitsTable","processVisits","existingVP","totalVisitCount","missCount","successCount","departureEarlyCount","departureLateCount","onsiteEarlyMins","onsiteLateMins","processDepartedVisit","visitperformance","createPerformanceVisit","vp","calculateEarlyLateMins","createPerformanceRatingCell","selectedVisitsTableColumns","selectedVisitsTableRows","PlannedRouteAuditService","PlannedRouteMapService","darkColor","mapMarkers","showUnplannedStops","addUnplannedStopsMarkers","showPlannedStops","addPlannedVisitsMarkers","showEveryStop","bypassStatus","existingMarkers","createPipMarkerOptions","unplannedStopTime","convertMomentToTimespan","showStartLocation","showEndLocation","combineStartEndLocation","hasRouteStopLocation","visitPlannedInFuture","performanceStatus","getColorUsingStatus","actualArrivalTimeSpanString","isFirstOrLastMarker","createAddressMarkerForVisit","pipSize","anchorBottom","plannedVisit","plannedVisitIndex","Bottom","friendlyMarkerString","PlannedRouteNoteService","plannedRouteNoteServiceCache","getNotesForPlannedRoutesFromDatabase","notesPromise","author","noteUser","PlannedRouteVisitService","updateTravelDistance","saveData","updateDirectionsForVisit","plannedRouteVisit","plannedDistanceAccKm","actualDistanceAccKm","actual","updateVisit","getRouteBetweenVisitLocations","googleStepToLatLongArray","updatePlannedRouteVisit","iconValueSet","updateTravelTimeMins","updatePlannedArrivalTimeSpan","updatePlannedDepartureTimeSpan","plannedArrivalTimeMoD","plannedArrivalTimeSpan","plannedDepartureTimeMoD","plannedDepartureTimeSpan","CloseRouteReasonComponent","plannedRouteClosureReason","closureReasonOptions","PlannedRouteClosureReason","TmsHistoryComponent","routeProgressExportData","routeVehicleDriverExportData","routeVisitCountData","displayNameLabel","LiveMapOrderByOptions","VehicleListComponentController","loadedVehicles","showVehicleSortOptions","showMilesAway","selectedVehicleIndex","dontScrollListOnNextUpdate","vehicleWildcard","viewOptions","orderBy","groupBy","orderByOptions","DriverName","LastUpdated","filterDisplayVehicles","vehiclesDisplay","calculateVehicleDistancesFromPoint","sortDisplayVehicles","vehicleOrderbyChanged","$orderBy","vehicleClickTimeout","vehicleDoubleClicked","$vehicle","vehicleClicked","filterVehicleList","vehiclesFiltered","$vehicles","sortUpdatedVehicles","trailers","trailerIndex","tractorIndex","showTrailerHookup","preventRecursion","vehicleMatchesSearchTerm","vehicleListFilterOptions","filtered","lowerCaseWildCard","wildcardHit","wildcardRequired","groupHit","groupRequired","isFunctioningUnit","nearestToCenter","hideSort","ImportPreProcessResult","ForceVector","Severity","AccelerometerRecordService","TPMSTyreStatus","TyreRecordEventCode","TyreSystemAlarmStatus","TyreSystemError","TyreAlarmStatus","TyrePressureThresholdStatus","TyreModuleElectricalStatus","TyreStatus","TyreModuleStatus","TPMSService","tyreRecordPromise","tyreRecords","tyreRecord","populateLayoutData","includeSpeedData","tpmsHistoryPromise","speedDataPromise","speedData","allAxles","isSpacer","allTyres","tyre","findPlot","originalData","tyreRecordData","tractorAxles","trailerAxles","TyreRecordData","getAxle","populateTyreData","populateAllLists","createAxleLabels","createDriveTrain","axleNumber","AxleNumber","axleTyrePosition","AxleTyrePosition","uniqueTyreRef","pressure","PressureKPa","pressurePSI","tyresLeft","tyresRight","createEmtpyAxleData","axles","firstAxleInUse","lastAxleInUse","showDriveTrain","axleCount","CsvImporterController","csvImporterService","invalidRouteCount","showMappings","showResults","mappingsIncomplete","showRowErrors","showValidationErrors","showSelectDate","showHelpInfo","submitted","columnImportNames","maxCols","failedCount","validationErrors","importOptions","importConfig","informationText","setHelpInfoText","infoTableHeaderCols","informationTableHeader","infoTableRowCols","informationTableRow","dateForm","minDate","getMinStartOfWeekDate","maxDate","importFile","fileText","prepareToProcessCsvFile","onCancel","onSubmit","importedData","fieldType","preprocessImportFile","helpInfoText","csvImportLines","extractLines","onUseAdapter","onCallAdapter","csvLines","processCsvFile","conversionResult","preProcessedDataRows","processAdaptedImportFile","preparePreprocessValidationErrors","colNumber","addError","fieldName","fieldValue","rowNumber","originalRowCols","displayValidationErrors","initOptions","processCsvDataUseColumnPositions","hasTitles","csvFileHasTitles","processCsvDataUseTitles","createMappedOptionsArray","mappedImportOptions","mappedColumnIdx","indexPosition","repeatCount","repeatOption","opt","repeats","titleRowCellValues","getTitleRowCellValues","isValidFieldForType","Integer","PositiveDouble","colIdx","importOption","repeatAfterCols","repeatColIdx","effectiveColIdx","setTitleOptions","removeHeaderLine","processCsvImportData","rowColTranslations","getDropdownColumnNumbers","allRowsValid","rowIsValid","csvLine","rowIdx","validateCellFormats","validateRow","validateAllRows","onValidateRow","validationStatus","onValidateData","importResults","importResult","validationName","importSource","RouteTemplate","validateImportResult","routeResult","genericErrorText","errorText","addOrUpdateValidationError","altName","cellValues","getFieldValuesFromLine","cellValue","columnIdx","getMappedImportOption","validateField","isEmptyCell","isRequired","addValidationError","getInvalidFieldForTypeMessage","validationText","colIndex","inserted","alphabet","fromCharCode","firstChar","columnNames","getColumnNames","mapImportOptionFromTitles","getDropdownColumnNames","CsvRouteImporterController","tmsService","routeDataImporterService","paragonImportAdapterService","fieldMappings","getImportOptions","getTableHeaders","getInformationText","getInformationTableHeader","getInformationTableRow","routeTemplatesPromise","getRouteTemplates","validateData","savePromises","successfullyImported","getPlannedRoute","exception","failedImport","fileHasParagonHeader","preProcessImportFile","importRoute","createRouteStops","travelDistanceMetres","columnName","aliases","validateDriverOrVehicle","validateGeofence","DateOrInteger","nameLowercase","searchReg","validDriver","validVehicle","foundGeofence","TMSJobStatus","TMSJobTrackingStatus","TMSJobStatusReason","$stateProvider","views","squash","dynamic","panel","authorize","authorization","authorizeForUser","HighChartsService","onReadyCallback","highchartsOptions","getStandardChartOptions","areaZone","yAxisOptions","band","yAxisPadding","paddedFrom","paddedTo","spacingTop","routeConfigHelperProvider","routeConfigHelper","$get","HomePage","authorizeForEngineer","ConfigManager","AppManager","CameraConfig","createDetailStateWithBoundParams","stateName","bindingName","NewCommissionNoBindings","NPS","CustomerSubscriptions","ReleaseNotes","queryParamsNames","DeviceHealthCompanies","Sims","RVLite","VisitFailures","EngineerHistory","DeveloperConsole","Engineers","redirectTo","userPlatform","HomeComponent","downgradeComponent","MessageService","unreadMessageModels","numUnreadMessages","unreadMessage","UnreadMessages","UnreadMessageCountUpdatedEvent","pageSize","messageId","messageBody","expiryCode","Body","ExpiryCode","MsgCode","TimestampQueued","Originator","expiryOptions","ExpiryOptionsModel","GroupMessageController","messageService","getExpiryOptions","messageReplyExpiryId","vehicleGroups","onGroupChange","selectedGroupHasNoVehicles","groupMessageConfig","expiryId","lastMessage","createMessageModel","messages","unreadMessageCount","updateOrPushMessage","arrayMessage","NotificationRecipientType","NotificationRecordStatus","keyFn","bootstrap","strictDi","UpgradeComponent","parsedEnum","pure","inputNumber","thousands","dataCopy","data1","data2","getSortResponse","parsePhoneNumberWithError","ParseError","ignoreDigits","includeUnit","conversionTypeString","getConversionType","isObservable","startWith","variable","removeProperty","showingTopShadow","showingBottomShadow","scrolling","throttleTime","showHideShadows","addRemoveScrollingClass","topShadow","createShadow","bottomShadow","accountForParentPaddings","removeScrollTimeout","prepend","showShadowClass","paddingTop","paddingBottom","setAutoFocus","animSlideFromBottom","hoverEvent","removeTooltip","filterParam","isOnScreen","countToData","countTo","setContent","setupObserver","disconnect","calculate","tick","refreshInterval","countFrom","countToString","increment","easeOutCubic","t_currentTime","b_startValue","c_endValue","d_duration","root","rootMargin","hideClass","separatedText","separatedSearchedText","splitFlag","matchFlag","spanStart","spanEnd","caseSensitive","_content","_searchTerm","highlight","searchPattern","matchpattern","innerText","templateRef","createView","embeddedViewRef","createEmbeddedView","hasRequirements","removeElement","requireRemoveDueToFeatureAccess","requireRemoveDueToUserRole","clearView","accountOption","userRoles","readFeatures","manageFeatures","requiresReadFeatures","requiresManageFeatures","hasMissingReadFeature","hasMissingManageFeature","currentUserHasAllFeatureAccess","requiresUserRole","requireAllRoles","rootNodes","DisplayDistance","Tms","ReportBuilder","EditOdometer","Options","optionSplit","isBoolean","toBoolean","drawOnAdd","div","isReadable","navigationPointMarkerZoomThreshold","hasAddedNavigationPoints","previousSize","initOverlay","descriptionLines","splitGeofenceName","longestLine","getLongestLine","createElements","forceShowLabel","previousClassname","updateColoursForMapType","hideElement","showElement","drawGeofence","SATELLITE","HYBRID","overlayProjection","fromLatLngToDivPixel","forceRedraw","hasResized","resizeContainingElement","setGeofenceClass","drawCircleGeofence","drawPolygonGeofence","getBoundingBoxForCircle","getBoundingBoxForPolygonArray","OverlayView","onAdd","addOverlayElements","onRemove","textElement","existingElements","shouldShowNavigationPoints","removeCurrentNavigationPointElements","totalWidth","totalHeight","navigationPoint","elementClass","convertLatLngToPixelCoordinates","newDiv","north","east","south","west","getPanes","overlayLayer","drawText","pixel","middleLng","mappedXpercent","mappedYpercent","drawCircle","getOverlaySize","isGeofenceTextReadable","createNavigationPointElements","getFontSizeForLine","textBaseline","includeMidPoint","lineArray","midPoint","lineArray1","reduceLineCount","lineArray2","letterFraction","pixelSize","idProp","labelProp","maxItems","recentList","loadRecentList","addRecentlySelectedItem","updateDateTimeOnItem","itemId","getNestedProperty","removeOldItems","saveRecentList","updateEmptyClass","sortList","propString","jsonString","storageKey","translatePhrase","translateParams","validationService","renderErrors","errorLabel","getErrorLabel","ValidationErrors","inputMask","specialKeys","readOnlyChars","metaKey","ctrlKey","cursorPosition","selectionStart","handleDelete","replaceCharacterAtPosition","char","charToReplace","setSelectionRange","newInput","indexToDelete","findCharIndexToDelete","driverSelected","selectedDriverId","vehicleSelected","selectedVehicleId","IVehicleQueryOptions","selectedTimeChange","setupAvailableTimes","availableTimes","incrementsPerHour","inc","hourString","replaceablePrefix","exampleMobileNumber","ngModel","updateValue","parsedPn","phoneInputDial","viewToModelUpdate","NgModel","geofenceSelected","geofenceFilter","selectedGeofenceId","otherText","showInputField","mapzenService","placeSelected","setupCountryCode","autocomplete","getItems","formatted","webpackContext","webpackContextResolve","createReportTableFromTable","createTableReportRows","createTableReportHeaders","createTableReportCells","createReportCellFromTable","DynamicReportsService","low","high","minThreshold","maxThreshold","tagService","tagIdsChanged","allTags","tagPills","renderPills","clickedTag","addPill","tagIndex","availableTags","selectedTagIndex","loadTags","accordian","registerAccordianEntry","cacheOriginalDisplayStyle","handleWindowResize","maxParentWidth","parentWidth","getParentWidthOfElementRef","calculateDisplayFromParentWidth","removeHiddenElementStyling","addHiddenElementStyling","handleBreakpoint","maxWindowBreakpoint","calculateDisplay","shouldDisplayUsingMaxBreakpoint","minParentWidth","minWindowBreakpoint","shouldDisplayUsingMinBreakpoint","driverClick","displayDrivers","scrollToSelectedDriver","sortDrivers","virtualScroll","scrollToIndex","onVehicleTypeClick","resourceAllocation","onTagClick","ITag","vehicleClick","scrollToSelectedVehicle","sortVehicles","EngineerEditorComponent","EngineerJobItemListModule","HardwareModule","RVLiteModule","StreamaxConfigsModule","columnsChange","checked","saveUserColumnPreferences","percentageMultiplier","allowedValue","selectedResourcesChange","selectResourcesInGroup","selectedResourceIds","getWidthForLabel","getLabelCellForResource","hideReg","getCurrentGroupsCellForResource","isVehicle","createLabelCellForVehicle","isDriver","createLabelCellForDriver","createLabelCellForGeofence","getCurrentGroupsCellForVehicle","getCurrentGroupsCellForDriver","depotContainingResource","getOtherDepotForResource","searchAndSortString","getSearchAndSortStringForResourceGroups","selectFromSavedList","deselectAllRows","otherDepot","StreamaxConfigProfileEditor","StreamaxConfigsDeviceList","DeviceProfileVehicleSummaryComponent","maxErrors","accountGroupDto","calcType","calculateDeviceCommsPercentages","calculateTotalErrorsPercentages","calculateTotalSyncPercentages","getSegment","totalPossibleErrorsOverall","totalPossibleErrorsReceived","profileUpdated","newProfileCreated","profileIsInSavableState","AudioEnabled","CameraCoveredAlarm","VideoLossAlarm","IgnitionDelay","RecordOverwrite","ByCapacity","TimezoneId","DSTEnabled","OffSetStartMonth","March","OffSetEndMonth","October","OffSetStartWeek","LastWeekOfMonth","OffSetEndWeek","OffSetStartDay","OffSetEndDay","OffSetStartHour","OffSetEndHour","OffSetStartMinute","OffSetEndMinute","AlarmEnabled","HardAccelerationTriggerEnabled","HarshBrakingTriggerEnabled","HarshLeftTurnTriggerEnabled","HarshRightTurnTriggerEnabled","updateTimezoneInfo","selectedNewAccount","accountPicker","AccountPicker","streamaxTimezone","newProfileToSave","createFormCategories","convertStreamaxTimezoneId","timezoneId","isNewAccount","createAccountFormCategory","createAudioFormCategory","createIgnitionFormCategory","createVideoLossFormCategory","createCameraCoveredFormCategory","createTimezoneFormCategory","createGlobalAccelerationAlarmFormCategory","createAccelerationAlarmTriggerFormCategory","createBrakingAlarmTriggerFormCategory","createLeftAlarmTriggerFormCategory","createRightAlarmTriggerFormCategory","audioForm","ignitionDelayForm","videoLossForm","cameraCoveredForm","accelAlarmGlobal","accelAlarmTrigger","brakeAlarmTrigger","leftAlarmTrigger","rightAlarmTrigger","timezoneForm","accountIdsWithExistingProfile","updateProfile","AccelAlarmGlobal","ICameraDeviceParameterProfileSettings","IsExpiredPredicate","twoWeeksAgo","isUncollectedPredicate","createExceptionPills","peripheralWithConfigRecords","cellErrors","cellError","Failure","computeCellStatus","AudioToggle","AcceleratorAlarmToggle","HardAccelerationTrigger","HardAccelerationTriggerMetrics","HarshBrakingTrigger","HarshLeftTurnTrigger","HarshLeftTurnTriggerMetrics","HarshRightTurnTrigger","HarshRightTurnTriggerMetrics","GyroMetrics","VideoLossAlarmToggle","VideoLossAlarmTrigger","CameraCoveredAlarmToggle","CameraCoveredAlarmTrigger","DaylightSavingsToggle","DaylightSavingsOffset","ChannelSpecificSettings","CameraConnected","IgnitionDelaySeconds","Acc1AlarmSettings","Accel2AlarmSettings","HarshBrakingTriggerSettings","TriggerEnabled","HardAccelerationTriggerSettings","HarshLeftTurnTriggerSettings","HarshRightTurnTriggerSettings","CameraCoveredAlarmSettings","getChannelTriggers","ChannelTriggersEnabled","VideoLossAlarmSettings","getConnectedChannelPositions","LocalTimeSettings","ExceptionPills","Uncollected","extraCount","labelAndTooltip","ChannelPosition","positions","IAccountGroupConfigDto","profileService","recordToProfileGeneralComparisons","recordToProfileTimezoneComparisons","recordToProfileAccAlarmComparisons","recordToProfileStatusAlarmComparisons","getTriggerDefaults","deviceRecord","defaultTriggers","accTriggerDefaults","setupGeneralComparisons","setupTimeComparisons","setupAccAlarmComparisons","setupStatusAlarmComparisons","deviceMetric","profileMetric","MetricString","InputType","isChannelTriggered","ErrorStringOverride","enabledFlags","channelPosition","bitmask","acceleratorAlarmType","comparisonTriggers","deviceTimezoneInfoId","profileTimezoneInfoId","ICameraDeviceParameterRecord","simUpdated","simTypes","simExists","loadSimData","showUpdateSim","clearValidationErrors","createSimForm","newSimForm","showCreateSimFormFields","newSim","validateSim","clearNewSimDetails","simValidationSubscription","simAlreadyAssigned","currentMapping","endSimMapping","newSimId","createNewMapping","currentSim","onSimUpdateCompleted","updateSim","clearAllSimData","confirmReassignTemplate","newSimMapping","addOrUpdateSim","newIccid","getSimByIccid","isUnit","addSimMapping","Aplicom","Astra","Falcom","Trakm8","getSimAndMappings","getSim","Tele2","Aeris","getSimStatus","getSimStatusByIccid","simStatusInfo","aspectRatio","facingMode","singleChannel","locator","patchSize","halfSample","locate","numOfWorkers","checkBarCodeType","BARCODE_TYPES","mapToBarcodeType","TestResponseString","ValidationTestResult","deviceDataValidationService","validationComplete","newDevice","runCoreTests","check","ValidationResults","saveCheckRecords","runRemainingTests","observables","addVehicleValidationCheckRecords","commissionVehicle","cat","Core","CheckType","ParentTrackerImei","getValidationResults","categoriesRemaining","validationOptions","caught","failedCheck","checkType","failureResult","InfoMessageString","parentTrackerReference","getValidationCategories","autoRunTests","runTests","IDeviceToAdd","sessions","createDataTable","Match","existingSession","session","sessionTime","commissonId","validationRecordsRows","validationRecordColumns","validationSession","countRecordResults","statusToCount","onValidationComplete","deviceToAddChanged","showCheckDetails","createDataTables","aampTestData","assignData","ftCloudTestData","digiDlData","pulsePacketString","resetTables","gpsTableRows","gpsTableColumns","temperatureTableRows","temperatureTableColumns","sensorFuelDataTableRows","sensorFuelDataTableColumns","sensorTimingsDataTableRows","sensorTimingsDataTableColumns","sensorDriverDataTableRows","sensorDriverDataTableColumns","aampGpsDataTableRows","GpsRecords","aampGpsDataTableColumns","aampAlarmDataTableRows","AlarmRecords","aampAlarmDataTableColumns","aampFootageHistoryDataTableRows","FootageRecords","aampFootageHistoryDataTableColumns","ftCloudGpsDataTableRows","ftCloudGpsDataTableColumns","ftCloudAlarmDataTableRows","ftCloudAlarmDataTableColumns","ftCloudFootageHistoryDataTableRows","ftCloudFootageHistoryDataTableColumns","digiDataTableRows","digiDataTableColumns","resolveAddress","AddsecureCamera","rtlP100Data","veriP100Data","FtCloud","Ceiba","GpsLat","GpsLng","latitutde","createGpsTables","createTemperatureTable","createSensorFuelDataTable","createSensorTimingsDataTable","createSensorDriverDataTable","createAampGpsDataTable","createAampAlarmDataTable","createAampFootageHistoryDataTable","createFtCloudGpsDataTable","createFtCloudAlarmDataTable","createFtCloudFootageHistoryDataTable","createDigiDataTable","FuelUsedPto","FuelUsedIdle","FuelUsedTotal","PtoDuration","IdlingDuration","TachoSlot1Driver","aampGpsData","GpsTime","aampAlarmData","Content","aampFootageHistoryData","chn","starttime","endtime","ftCloudGpsData","ftCloudAlarmData","gpsInfo","AlarmType","ftCloudFootageHistoryData","RemainingDrive","toValidate","toSave","validateCompletion","testConfirmation","verified","IManualValidationCheckCategory","accountsService","jobService","commissionChanged","vehicleConfirmed","visitReasons","requiredTrue","JobNumber","showAddVehicleButton","commissionForm","selectedVisitReason","selectedEngineerLegacy","engineerName","clearVehicle","toggleEditVehicleDetails","newVehicle","editVehicleDetails","showAddVehicleForm","vehicleAutocomplete","newVehicleReg","onVehicleSelected","observable","availableEngineers","mapDataToCommission","vehiclesLoading","visitReasonId","vehicleMake","vehicleModel","onEngineerSelected","onAccountSelected","onVisitReasonSelected","mapJobItemToCommission","subscriptionsCacheName","getSubscriptionsFromDb","getSubscriptionCostPerUnit","EmailQuota","SmsQuota","SSO","getSubscriptionCost","prefsObservable","defaultPrefs","getDefaultPreferences","mergedPrefs","telematicSummaries","cameraSummaries","groupSummariesByType","vehiclesByAccount","mapDataToAccount","ds","ts","getFailingVehiclesCount","VehicleMake","VehicleModel","jobItemSaved","lastJobItemCancelled","vehicleAdd","reportIssueClick","showVehicleAddForm","vehicleToAdd","noVehicleAvailable","isLastJobItem","engineerJobItemStatus","loadCommissions","mapPropertiesToAmendedJobItem","setupForms","getIsLastJobItem","amendedJobItem","setNoVehicle","cancelAddVehicle","noVehicle","setupJobItemEditorForm","setupVehicleAddForm","instructions","jobItemEditorForm","Instructions","vehicleAddForm","allJobItems","allOpenJobItems","deleteConfirmSubjectTranslation","messageDialog","jobCloseConfirm","duplicateJobId","duplicate","createdModels","created","mapVehiclesAndCommissionsToJobItems","openIssueReportSidebar","closeIssueReportSidebar","renderTable","showIssueReporter","selectedEngineers","titleKey","selectionChanged","engineerPills","engineerIndex","selectedEngineerIndex","loadEngineers","filteredEngineers","allEngineers","engineerSaved","saveEngineer","engineerEditorForm","emailExists","EmailExistsValidator","validateIfHasReseller","resellerIds","UnitOverviewComponent","UnitPlotsComponent","SimUnitSummaryComponent","PeripheralDeviceDetails","PulseMessagesComponent","PulseMessageDetailComponent","PulseResponseComponent","StreamaxDeviceDetail","P100DeviceDetails","CameraEventsComponent","GpsDetailComponent","SimDetailComponent","CameraVideosComponent","CameraVideoViewComponent","LaneDeparture","Pedestrian","DriverDistraction","DriverFatigue","DriverYawn","BlindSpot","HighShock","Braking","Turning","DriverOnPhone","Collision","VehicleTooClose","NoSeatBelt","DriverSmoking","DriverAbsent","videoOpen","downloadComplete","detailedStatus","showProgressBar","auditEntries","getDownloadedChannelsCount","updateDetailedStatus","createMarkerFromVideoLocation","checkForErrors","videoMarker","loadingLocation","downloadedChannelsCount","Retrieving","isRequestComplete","configManagerService","cameraEventService","translationsService","selectChannelsTab","adas","dms","commServerToVerilocationConfigMappings","ADASSensor","DMSSensor","showSimManager","showChannelManager","showConfigManager","setConfigInfo","setAppInfo","showGpsDetail","closeChannelManager","setAutoUpdateProperty","AutoUpdateEnabled","recordStartDate","recordEndDate","getHistoricalPulseMessages","getGPSCameraEvents","rtlConfigs","cameraConfigs","pulseRecords","autoUpdateEnabled","latestEvents","latestData","getIgnitionStatus","latestGPSPacket","getLatestGPSPacket","latestDataDelayString","computeLatestDataDelay","cameraDiagnosticRecord","creationTime","delayMs","setConfigName","setLatestConfigInstallDate","setPendingConfigRequests","setLatestAppInstalls","setPendingAppInstalls","gpsData","ignitionStatus","fourteenDaysAgo","ignitionOffLongerThan14Days","mostRecent","pendingUpdaterInstalls","pendingTelematicsInstalls","pendingTelematicsAppVersion","pendingUpdaterAppVersion","updaterInstalls","telematicsInstalls","updaterInstallDate","telematicsInstallDate","completedRequests","configInstallDate","relevantRequests","configName","pendingVerilocationRequests","pendingConfigRequestName","pendingRtlRequests","pulseConfigName","cameraConfigId","ConfigFileUniqueId","mb","openCameraConfigButtonLabel","ChannelList","showMetadataSidebar","showPeripheralDataSideBar","getCameraConfigPageUrl","deviceModel","Url","showSimManagerSidebar","cameraStatus","commsMetadata","communication","creationCodeItemCreationCallback","additionalDataItemCreationCallback","setDefaultDate","setLiveUpdates","getCameraEvents","subscribeToLiveMessages","getIncomingDiagMessages","newEvent","diagMessagesTable","addNewRow","logRequestUpdateReceived","videoService","getVideo","videoId","getChannelMedia","setChannelMedia","createTimelineFromAuditTrail","cancelLoading","cm","mapMarker","splitLog","logDate","logText","setDefaultDates","UseCreatedDate","CameraUploadRequestedTime","ICameraDiagnosticRecord","pulsePayload","pulseRecord","IPulseRecord","cancelLiveUpdates$","initDates","getHistoricalMessagesAndSubscribeToNew","selectedMessage","selectedMessagePlot","createPlot","selectedMessageLocation","createLocation","selectedPayload","getParsedPayload","historicalMessages","createExportTitle","getPulseMessages","getEnumFlagsAsString","getFlagsEnumAsPills","getFirmwareVersion","getTelematicsVersion","getConfigVersion","payload","flags","flagNames","GetEnumFlagsAsList","flagPills","getPulseResponse","pulseRecordId","pulseResponse","mappingUpdate","getMappingForSelectedSim","navigationPath","mappedHardware","isPeripheral","allMappings","createSimHistoryTableRows","getMappedUnit","hardware","ISim","getSimMappingHistory","simMappingHistory$","accountMapping$","configData$","getConfigMappings","firmwareData$","getFirmwareMappings","vehicleData$","getVehicleMappings","configTableColumns","Identifier","UnitConfigStatus","getDateDescription","firmwareTableColumns","UnitFirmwareStatus","vehicleTableColumns","accountTableColumns","sourcedata","onDateChanged","plotsSubscription","getUnitPlotsByImei","getPlotVehicle","plotVehicleSubscription","lastPlotDate","initialiseStartAndEndDates","getPlots","getLatestUnitPlotsByImei","selectedPlotVehicle","Sats","Rssi","ConfigEditorComponent","AppEditorComponent","CommserverMigration","configRequestService","cameraCommunicationService","csvDevices","failedSerials","showMigrationSideBar","showCsvSidebar","applyMigration","processingSerials","getDeviceInfos","deviceInfos","updaterVersion","UpdaterVersion","telematicsVersion","TelematicsVersion","isVersionHighEnoughToMigrate","csvRows","failRows","failedColumns","deviceVersion","requiredVersionArray","splitVersionStringDevice","csvSerialsList","fileReader","fileContent","rtlDeviceInfos","matchingDevice","matchingRtlInfo","getConfigsAndRequests","setStatusSymbol","getCustomerResellerName","failedModel","commserverMigrationStatus","getMigrationConfigIds","RequestStates","migrationConfigIds","pendingConfigRequests","configRequests","appSaved","formUpdated","appTypes","Firmware","applicationStates","selectedState","appForm","selectedType","getFile","downloadFile","revokeObjectURL","ICameraApp","configSaved","configForm","updatedConfigData","updatedConfigJsonString","configData","updateNewConfig","createStandardFormCategories","ICameraConfiguration","ReportEditorComponent","DragDropModule","showDebugButtons","allColumnHeaders","availableDataSources","reportDataSources","headersForReportDataSource","saveAsCopySuffix","reportEditorForm","getDataSourceDefinitionsAndMapToColumns","saveAsCopy","validateModelExists","validateSaveProgress","setSaveAsCopyReportName","saveReportDefinition","saveReport","loadingPreview","previewReportModel","createReportPreviewModel","setupNewReport","gettingData","setReportDefinitionColumnIds","ensureUniqueReportColumnHeadersIds","ensureUniqueColumnHeadersIds","primaryDataSource","selectNewDataSources","getCurrentDataSources","filterHeadersByReportDataSource","secondaryDataSource","sortHeaderId","sortAscending","titleRowId","updateChartsSettings","showDataSources","createReportTemplate","loadCombinedPreferences","loadJourneys","findAndSetVehicleWithMostJourneys","filterAvailableColumnHeaders","renderDataSourceFiltering","detectReportDataSources","combinedPreferences","uniqueReportNameValidator","proposedReportName","reportNameInUse","matchingReports","copiedReport","ShowCharts","vehicleWithMostJourneys","showTemperatureCharts","rangeJourneyCount","highestKey","highestKey2","highestCount2","dataSourceKeys","dataSourceKey1","dataSourceKey2","highestSource","highestSource2","Motorway","DualCarriageway","SingleCarriageway","BuiltUpArea","sourceData","tableRecord","getOperatingModeForTemperatureRecord","getSetpointForTemperatureRecord","return","supply","evaporator","getZoneOutOfBounds","tableRecordHasOutOfBoundsHistory","mapHistoriesToInputs","showProbeData","outOfBoundsTemplate","IZoneWithProbes","iconClass","getProbeLatestRecords","latestRecordIsMoreThan24Hours","isLessThan24Hours","calculateDiff","createSparklineChart","createDashboardChartOptions","createSparklineData","trendGraph","createHistoricalDiffData","maxDiffCalculation","nextRecord","graphDiff","ITemperatureProbeWithTemperatureData","userHasHistoricalAccess","showGraph","resetGraph","zoneTimelineEntries","zoneSelected","createVehicleMarker","generateGoogleMapsMarkerOptionsForVehicle","reeferLocationMarker","IReeferWithMappings","latestTimes","getZoneLastUpdated","setpointLastUpdated","getSetpointLastUpdated","latestZoneUpdate","getLatestDate","zoneInactive","zoneActiveAgo","getDisplayTemperature","probeType","outOfBoundsService","lastUpdateChanged","setDefaultDateRange","outputLastUpdated","setupTimeline","allDiagnosticRecords","getLatestVehicleTemperatureRecordsForVehicle","allTemperatureRecords","setZonesOperatingMode","createTimelineEntriesForSetpointChanges","createTimelineEntriesForDiagnosticErrors","recentOutOfBoundsHistory","createTimelineEntriesForOutOfBoundsHistory","axleWeightAlertDetailService","geofenceAlertDetailService","inputAlertDetailService","powerLossAlertDetailService","tollAlertDetailService","tyreRecordAlertDetailService","vehicleDiagnosticAlertDetailService","videoAlertDetailService","getAlertExport","addAPIUrlPrefix","getAccessToken","clonedreq","addBearerToken","succ","bearer","DiagnosticsModule","LiveMapModule","ExploreModule","NpsModule","keyframes","requestsInProgress","urlWithParams","existingRequest","CoreModuleName","FormModuleName","attrs","$watch","$eval","bindHtmlCompile","sanitizedValue","html","compileScope","bindHtmlScope","$parse","compile","expr","fastBindAttrOnNotify","fastBindOnNotifyName","lastValues","$set","fastBindOnNotify","lastValue","fastBindAttrOnce","DEFAULT_MODE","fastBindNotifier","fastBindNotifierName","fastBindNotifierMode","handler","oldValue","$watchCollection","fastBindOnce","startX","startY","absParent","cancelWatch","mousemove","pageY","pageX","mouseup","dragOb","gmOnInvalidDrop","off","prop","gmDraggable","$$gmDropZone","gmDropZone","after","pointerEvents","elBoundingRect","attr","gmOnHover","gmOnDrop","$apply","AutocompleteComponent","FileDragDropDirective","factory","FileSelectedDirective","CompareToDirective","UserEmailDirective","AutoFocus","ValidatePasswordDirective","VerifyCurrentPasswordDirective","GroupNameValidator","ReportNameValidator","ValidationFunctionDirective","CheckboxesComponent","checkboxes","emitChanges","checkboxComponent","indexOfCheckbox","checkedValues","checkbox","cachedChanges","fn","isDisabled","styleUrls","AutocompleteComponentController","externallyUpdated","placeHolderText","customPlaceHolderText","removeBrowserAutocomplete","lastSelectedItem","lastSelectedSource","maxMatches","buildPlaceHolderText","labelChange","selectedMatchId","setSelectedMatchById","querySource","dataLoadedPromise","onSearchTextChanged","onSelect","uniqueCallback","$match","lowercaseSearchText","dataUpdatePromise","mapzenAutocompletePromise","includePlaces","querySourcePromise","$searchText","dataResults","placeResults","querySourceResults","driverMatches","findDriverMatches","geofenceMatches","findGeofenceMatches","zoneMatches","findZoneMatches","vehicleMatches","findVehicleMatches","groupMatches","findGroupMatches","userMatches","findUserMatches","depotMatches","findDepotMatches","inputTypeMatches","findInputTypeMatches","placeMatches","findMapzenPlaceMatches","querySourceMatches","findQuerySourceMatches","populateMatches","inputElement","selectedMatch","isUnique","whatsIncluded","getWhatsIncluded","includeNumbers","includeDrivers","includeGeofences","includeZones","includeVehicles","includeGroups","includeUsers","includeDepots","includeInputTypes","querySourceLabel","numAdded","addMatch","matchSource","matchSearchText","createDriverMatch","createGeofenceMatch","createZoneMatch","createVehicleMatch","createGroupMatch","createUserMatch","createDepotMatch","createInputTypeMatch","mapzenAutocompleteResponse","transformedResults","inputString","matchLabel","formatted_address","matchId","forceRefresh","filterResourcesByGroup","includeVehicleLatestPlot","filterByGroupId","groupDrivers","groupVehicles","groupGeofences","groupUsers","searchOnClick","eagerLoad","$attrs","setFocus","elementToFocus","is","otherModelValue","$validators","modelValue","$validate","$observe","processDragOverOrEnter","processDragDrop","fileDragDrop","effectAllowed","validMimeTypes","srcElement","fileSelected","validationFunction","viewValue","$value","groupNameValidator","$asyncValidators","groupNameExists","reportNameValidator","foundMatch","reportNameExists","foundationUserService","userEmail","formValue","originalUserEmail","emailBelongsToAccount","verifyCurrentPassword","TimelineComponent","TimelineEntryComponent","ComponentController","transEl","transScope","empty","downgradeInjectable","VeriMapContainerComponent","VeriMapComponent","VeriMapAlternativeRoutesComponent","VeriMapHeatMapComponent","VeriMapJourneyComponent","VeriMapPlotComponent","VeriMapLocationComponent","VeriMapPlotHistoryComponent","VeriMapPopupComponent","VeriMapRouteComponent","VeriMapRouteOldComponent","VeriMapVehiclesComponent","VeriMapVideoEventComponent","VeriMapControlsComponent","VeriMapTMSAuditComponent","VeriMapSingleGeofenceComponent","GeofencesComponent","GeoAreasComponent","GeofenceNavPointsComponent","GeofenceShapeComponent","GeoAreaComponentController","debounceService","mapEventListeners","geoAreaOverlays","loadingGeofences","registerChildComponent","debouncedToggleVisibility","debounce","toggleViewportGeoAreas","geoareas","createGeofencesOverlays","listener","removeListener","destroyOverlays","deregisterChildComponent","zoomListener","idleListener","mapTypeListener","mousePosition","closestOverlayMatch","setHover","pointIsInsideGeofence","distanceFromPointToGeofence","highlightGeofenceOverlay","createGeoAreaOverlays","toggleGeoareas","createGeoAreaOverlay","createGeoAreaCoords","GeoAreaOverlay","previousBounds","visibleForZoomLevel","intersects","defaultStrokeStyle","VeriMapHeatMapComponentController","heatMapLayer","createPlotLatLngs","createJourneyLatLngs","showHeatMap","createHeatMapLayer","setData","MVCArray","visualization","HeatmapLayer","dissipating","maxIntensity","setHeatMapLayer","latLngsForVehicle","VeriMapJourneyComponentController","journeyEventMarkerEvents","markerObj","onEventMarkerClicked","plotMarkerEvents","highlightedPlot","onPlotMarkerClicked","rightclick","onPlotMarkerRightClicked","setHighlightedPlot","journeyPolylines","latLngsToFitTo","showJourneyHover","ignoreNextExtremesUpdated","snapToRoadWorking","parseJourneys","parseJourneyEvents","showHideJourneyEvents","showCurrentPositionOnly","highlightJourneyPath","createLatLngsForJourneys","panToSelectedEvent","createLatLngsForExtremes","hidePlotsBasedOnZoomLevel","setJourneyExtremes","clusteringend","onClusteringEnd","plotsFitToFilter","getPlotsForJourneys","plotUtcValue","extremes","snapJourneyBasedOnZoomLevel","getBoundsWithOffset","snappingPromises","totalMinutes","snapThisJourney","snappedJourneys","journeyToHighlight","highlightedJourney","selectedJourney","highlightedEvent","showEvents","fitmap","journeyMouseOverEvent","findPlotClosestToLatLng","onJourneyPlotHover","$plot","showPlots","displayPlots","getVisisblePlotsBasedOnZoomLevel","internalDisplayPlots","plotsToFitTo","panMap","journeysMin","journeysMax","MIN_VALUE","journeyEnd","journeyExtremes","onJourneyExtremesChange","$extremes","visible_","snapRoads","Controller","createMarker","VeriMapVideoEventComponentController","videoPlaybackEvent","VideoPlaybackState","currentGpsData","createVideoMapEvents","updateVideoPolyline","updateGpsPlot","gps","videoPolyline","startGps","endGps","leftToRight","startAnchorPosition","Left","Right","endAnchorPosition","fakeStartPlot","fakeEndPlot","endEvent","videoPlot","GeofenceNavPointsComponentController","enableEdit","navigationPointMarkers","navigationPointMarkerEvents","dragend","onNavigationPointMarkerDragEnd","updateMarkers","clearCurrentMarkers","addMarkersForNavigationPoints","newMarkers","CoordsModel","createMapMarkerForNavigationPoint","onNavPointPositionChanged","GeofencesComponentController","geofenceOverlays","showZones","onlyRightClick","hideGeofencePopup","zonePolygonGroups","toggleViewportGeofences","createGeofenceZones","clickListener","mapClicked","rightClickListener","hidePopupControls","addNonexistentUnsavedSelectedGeofence","standardGeofences","createGeofenceOverlays","toggleGeofences","removeDisplayZones","zoneGeofences","shownZones","polygons","processZoneVisibility","zonePolygonGroup","zonePolygon","currentMapZoomLevel","maxZoomOpacityChange","isSelectedGeofence","hideGeofence","HideFromMap","onlyShowSelectedGeofence","loadGeofences","leftClick","geofenceClicked","showGeofenceEditor","GeofenceShapeComponentController","editable","maxRadius","prepareMaximumSize","createGeofenceVisual","geofenceType","setGeofenceAddressFromPosition","destroyGeofence","geofenceVisual","maxDiameter","minRadius","minDiameter","minPolygonArea","maxPolygonArea","removeDeleteVertexButtonFromPolygon","createBasicSquarePolygon","setGeofenceEditable","geofenceChanged","getPolygonFromBoundingBox","ignoringMaxSize","updateGeofenceModelFromVisual","syncGeofenceTypes","circleCenter","getRadius","getArray","setDraggable","setEditable","addDeleteVertexButtonToPolygon","polygonUpdated","circleVisual","differenceLat","differenceLng","initSearchBox","clearExistingMarker","Marker","VeriMapAlternativeRoutesComponentController","updateRouteDisplay","createRoutePolyline","updateMarkerIcons","getLatLngLiteral","VeriMapContainerComponentController","VeriMapPlotComponentController","updateDisplayPlot","displayPlot","VeriMapPlotHistoryComponentController","setSelectedPlot","mouseout","polylinePlots","onPlotSelected","onPlotHighlighted","lastHighlightedPlot","onPlotLeave","plotPolyline","VeriMapPopupComponentController","showFromBottom","showHidePopup","setPopupPosition","popupHeight","popupWidth","mapWidth","popupIsTooHigh","isOnLeftSide","isAtExtremes","popupHideTimeout","VeriMapRouteComponentController","schedulingService","plannedRouteMapService","updatePlannedVisits","createVisitPolyline","routeVisit","createPolylineForVisit","scheduleMode","createMapMarkersForRoute","routeStopLocation","CenterPoint","selectedVisit","getRouteStopCoords","actualJourneys","showPlannedRoute","showActualRoute","VeriMapRouteOldComponentController","markerEvents","onMarkerUpdate","$marker","offRoadPoly","createRouteStopOffRoadPolyline","routeStopPosition","nextStopPosition","basePolyline","isStartPoint","visibleWaypoints","VeriMapSingleGeofenceComponentController","mapUnloaded","fitMapToGeofences","matchingAudit","routeReplay","Update","onAuditSelected","audit","polylineEvents","polylineMouseOverEvent","stopsMarkers","selectedAudit","plotsWithAudit","mapPlots","highlightPloyline","getPolylineId","primaryPlots","secondaryPlots","VeriMapVehiclesComponentController","displayMarkers","disableClustering","vehicleMarkerOptions","hasFitMap","clickedVehicle","vehicleRightClicked","onVehicleMouseOver","stopEventPropogation","onVehicleMouseOut","clusteringFunction","onClusterClick","ngMapCluster","onClusterMouseOver","onClusterMouseOut","onVehiclesUpdated","foundTractor","updateSelectedVehicleStatus","promiseList","showVehicleOnMap","isSelected","addVehicleLatestPlot","forceFitMap","getMarkerModel","markerLabel","wasSelected","newOptions","setZIndex","shouldFitMap","Cluster","clusterMouseOut","vehicleMouseOver","vehicleMouseOut","utilisationColorRaw","getUtilisationColor","nonUtilisationColorRaw","utilisation","calculateClusterUtilisation","numUtilised","numNotUtilised","updateClusterSelectionStatus","currentImageString","url_","vehicleUtilisisationCount","vehicleUnderUtilisisationCount","isPlotUtilised","updateTrigger","clusterMouseOver","DeleteConfirmComponent","ConvertToNumberDirective","BackgroundImageDirective","DelayCreationDirective","DriverUsernameDirective","HideInProduction","HideOnIe","TooltipDirectiveAJS","IfUserInternal","IfUserNotInternal","IfUserInternalOrFoundation","IfEnabled","KeyWordTriggerDirective","PrintElementDirective","SnowComponent","PopupComponent","TimeAgoComponent","SiteUpdatedIndicator","VeriDialogController","backgroundImage","fixedPosition","titleClass","createTooltip","getDirection","updateTooltip","tooltipNoAnimate","calculatePosition","removeAttr","newTitle","newDirection","showTootipViaAttr","$parsers","$formatters","setFilters","timeoutPromise","terminal","priority","createComment","DeleteConfirmComponentController","lowercaseSubjectVerb","htmlContent","reference","onYesClick","onNoClick","onYes","onNo","driverUsername","isDriverUsernameInUse","absUrl","localhostOnly","redirect","isUsingLocahost","isUsingDevelopment","developmentDomain","isIE","userAgent","readFeature","manageFeature","roles","redirectAttr","removeDueToFeatureAccess","removeDueToUserRole","hasReadFeatureAccess","hasManageFeatureAccess","matchingReadFeature","matchingManageFeature","keyWordTrigger","triggerWord","triggerWordArray","keyBuffer","eventObject","PopupComponentController","requireSameElement","popupClassName","bodyClickHandler","getEventTargetElement","mouseEnterHandler","cancelHide","mouseLeaveHandler","uniqueCode","showCenter","popupWrapper","showDelay","registerHandlers","unregisterHandlers","previousMouseEvent","isDisplayed","arrowPosition","lastUniqueCodeDisplayed","$$element","updateArrowPosition","popupLocation","updatePopupPosition","previousPopupPosition","getElementPositionInfo","yOverrun","updateOverrunClass","classesToKeep","showPromise","ignoreDelay","cancelShow","hidePromise","elementHeight","pageXOffset","pageYOffset","startAtLeafNode","removeEventListener","printService","evt","print","SiteUpdatedIndicatorComponentController","versionService","newVersion","previousVersion","versionUpdated","particleMaxPer","particleSize","particleOpacity","particleSpeed","particleSinus","snowflakes","outerWidth","outerHeight","createSnowFlake","iterateSnowFlakes","snowFlake","summer","originalY","originalX","delta","drawSnowFlake","snowflake","TimeAgoController","$interval","intervalPromise","timeAgo","FastScrollDirective","ClickOutDirective","ngMouseWheelDown","ngMouseWheelUp","ngRightClick","ScrollToDirective","isChild","isSelf","isInside","isIgnored","clickOutIgnoreClasses","shouldIgnoreElement","classNameStr","clickOut","classesToIgnore","enableFastScroll","disableFastScroll","wheelDelta","$scrollPosition","$elementHeight","isIE11","setup","topShadowElement","bottomShadowElement","scrollShadowBottom","throttle","addShadow","oElm","strCssRule","strValue","defaultView","getPropertyValue","currentStyle","strMatch","shadowString","eq","NewResourceFilterBarComponent","CombinedResourceFilterComponent","DriverResourceFilterComponent","VehicleResourceFilterComponent","TagsResourceFilterComponent","ObservationsResourceFilterComponent","GeofenceResourceFilterComponent","GroupResourceFilterComponent","DateResourceFilterComponent","TableColumnResourceFilterComponent","ResourceFilterBarModalComponent","filterName","showClearFilterButton","updateFilterLabel","filterLabel","filterIcon","isInvalid","disableNext","restrictToSingleDay","restrictToSingleWeek","includeTimeRange","hideDateRange","startHour","endHour","endMinute","dateRangeOptions","dateDayOptions","maxDateRangeUnit","updateMaxDateRangeUnitName","addDateRangeOptions","sendUpdate","restrictTimeRange","setMinMaxDates","setTimeFilterFromReportParameters","createDefaults","futureDates","maxEndDate","minStartDate","startTimeChanged","endTimeChanged","displayMaxDateRange","checkTimeRanges","toTimespan","currentRange","getDateRangeInDays","maxDateRangeUnitName","displayTimeRangeInfo","createFilterObject","maxDateRange","getReadableDateRangeLabel","createTableHeaders","hideZones","selectedResourceType","selectedObservation","eventsToFilter","obsTitle","columnVariations","selectedColumnVariations","parentResourceFilterBar","waitForTable","updateColumnDetails","createColumnVariations","onIncludedItemChanged","columnVariation","newInclusionState","cv","columnNumber","getTableHeaderIndexForColumn","filterTitle","waitCount","columnPosition","onlyTemperatureVehicles","ResourceFilterBarComponentController","$mdMedia","compactViewCenter","showFilterLabel","hideFilterDropdownArrow","supressClose","newLayout","showAddFilterDropDown","toggleFilter","setChildFilterVisibility","childFilter","openChild","sendOnChangeEvent","previousFilter","broadcast","setVisibilityOnChildren","toggleChildFilterVisibility","clearFilter","filterBoxRight","closeFilter","matchingDropDownItem","matchingButton","popupRight","setPopupPositionBasedOnButton","filterDropDown","showInline","showFilterBy","showSettingsCenter","filterBarEvent","commonAncestorDistance","modalList","iAmClosest","modal","distanceToCommonParent","closeFilterBar","nodes","node1","node2","parents1","parents","parents2","Translate","translatedPhrase","JourneySummaryComponent","ExternalReferenceService","ExternalReferenceRecordComponent","ExternalReferenceComponent","VeriListComponent","VeriDateRangeComponent","VeriInlineDatePickerComponent","TagsComponent","VeriPageComponent","VeriTabComponent","VeriTabsComponent","VeriRouteTabsComponent","VeriTableComponent","ReportTableComponent","DrillDownReportTableComponent","DownloadAsReportComponent","VeriVideoComponent","GroupHierarchyComponent","GroupSelectorComponent","PlotsExportComponent","JourneysExportComponent","EventsExportComponent","CalendarComponent","CalendarComponentController","dateFilterFn","$stateRegistry","authorizationService","routeTabs","cState","childState","isUserAuthorized","routeName","countKey","DownloadAsReportComponentController","downloadOptionsLeft","tooltipAlignRight","downloadOptions","showDownloadOptions","updateEventsTable","createExportDataFromJourneyEvents","startTimeMinutes","endTimeMinutes","createTableRowsWithCells","eventTimeMinutes","updateJourneysTable","createExportDataFromJourneys","journeyStartTimeMinutes","journeyEndTimeMinutes","createConvertedValueCell","OdometerKmStart","OdometerKmEnd","AverageSpeed","updatePlotsTable","createExportDataFromJourneyPlots","plotTimeMinutes","odometerKm","ExternalReferenceComponentController","externalReferenceService","createHeaders","getId","disableAdd","ExternalReferenceTypeId","openExternalReferenceRecordTaskDialog","reloadParent","getExternalTypes","externalTypes","getExtReferenceData","getType","externalReferences","updateCachedValues","externalReferenceType","selectedRecord","sanitize","updatedExternalRef","addedExternalRef","deleteExternalRef","externalReferenceTypesCacheName","driverExternalReferenceCacheName","vehicleExternalReferenceCacheName","geofenceExternalReferenceCacheName","getExternalTypesFromDB","extTypes","externalReferenceList","getExtRefIndex","setUpdatedExtReferenceType","matchingPredicate","retrievalCallback","getAllDriverExternalReferencesFromDB","getReferencesById","getDriverExternalReferencesFromDB","getAllGeofenceExternalReferencesFromDB","getGeofenceExternalReferencesFromDB","getAllVehicleExternalReferencesFromDB","getVehicleExternalReferencesFromDB","referenceId","getAllDriverExternalReferences","getAllGeofenceExternalReferences","getAllVehicleExternalReferences","getByExternalReference","getResourceType","failureMessage","getDriverExternalReferences","getGeofenceExternalReferences","getVehicleExternalReferences","er","initExternalRefChangeFields","deleteDriverExternalReference","deleteGeofenceExternalReference","deleteVehicleExternalReference","validateExternalReference","updateDriverExternalReference","setExternalRefChangeFields","updateGeofenceExternalReference","updateVehicleExternalReference","getExternalTypesByType","existingType","addExternalReferenceType","refId","ExternalReferenceRecordComponentController","externalReferenceTypes","showExternalReferenceType","clearErrorMessage","hasSpecialCharacters","deleteReference","updateExternalReferenceType","typeId","extRefType","updateReference","ev","foundedSC","character","showOnlyDepots","uniqueInstanceReference","showGeofenceCount","showVehiclesCount","openAll","sourceGroups","filterByDepots","scrollToGroup","updateScrollPosition","updateComponentHeight","showHideGroup","onGroupClicked","largeDelay","scrollIndex","showUngroupedResources","filterUnusedResourcesAndGetTotals","removeVehiclesWithNoUnitFromGroup","removeInactiveDriversFromGroup","sizer","onGroupSelectionChanged","AttachmentPosition","noSelectionLabel","attachmentPosition","TopRight","isNumber","showGroupFilterDialog","loadingGroups","TagsComponentController","assignedTags","hiddenTags","showSelect","resourceAllocationEnum","updateTags","onTagDeleted","onGeofenceTagDeleted","unselectedTags","AutoTag","deDupeTags","resourceTagId","tag1","tag2","assignHiddenTags","deDupedTags","npTag","hiddenTagCount","addTagToTooltip","VeriDateRangeComponentController","selectedDateRange","syncDates","setSelectDateRange","updateDateRange","onRangeChanged","hideRanges","hideTimes","VeriInlineDatePickerComponentController","canGotoNextDay","canGotoPreviousDay","maxDateIsToday","minDateIsToday","dayOfYear","disableButtons","VeriListComponentController","customSorter","showOptionsAsNav","filterPlaceholder","VeriPageComponentController","VeriTabComponentController","preferredOrder","badgeCount","tabVisibilityChanged","veriVerticalTabs","veriTabs","scroll","tabVisible","hideTimeout","tabSubtitle","tabCountLabel","tabDisabled","tabSelected","tabTooltip","tabTooltipDirection","borderLeft","tabReference","disableNextButton","nextButtonLabel","nextButtonFunction","VeriTabsComponentController","$animateCss","$mdUtil","slimStepper","hideNav","processingNextButtonFunction","trans","reflectTransition","showTabUrl","lastSegment","router","urlService","tabToShow","hasResourceFilterBar","hasTitleStart","hasTitleEnd","calculateStepperSize","findTab","tab1","updateSelectedTabIndex","disableAutoTabSelect","updateNextPreviousTabs","calculateLeftyRighty","nextTab","indexOfCurrentTab","selectedTabComponent","indexOfClickedTab","stepperValidationError","notifyTabChange","transitionObject","previousTab","selectedTabIndex","nextTabIndex","nextButtonPromise","prevTabIndex","tabUrl","onTabChanged","tabToFind","foundTab","hasSeenSelected","stateChanged","setClassName","stepper","stepperBarListItems","stepWidth","calculateStepperOffset","stepperOffset","disableBack","disableFinish","finishMessage","dashboardServiceV2","showCustomView","loadRelatedData","reportList","initialReport","setReportClickable","createFilterOptions","selectReport","loadReportData","updateChartData","$row","$subRow","performCustomClickAction","drillDown","displayReport","forceState","reportCopy","addReportToList","PrimaryReportParameter","CameraEventId","showVideoPlayerById","GeofenceVisitId","createBreadcrumbs","createBreadCrumbsFromReportParameters","setNextParameters","setNextDrillDownDataSource","generateReportTitle","determineNextMostLikeleyDataSource","getNextDrillDownDataSource","dataSourceSupportsClicking","TemperatureOutOfBoundsRecord","minimumTimeout","createDateParameterString","columnPromise","chartWidgetConfig","onDataDefinitionUpdated","reportBreadcrumbs","hasChildRows","isActualReport","showMap","detectChildRows","completeWhenFinishedAnimating","createTableContents","previousReading","currentTableWidth","getTableWidth","parseSortingInformation","getRowDataSourceSortType","longestWordCount","longestWord","longestWordsCalculator","reportTableWidth","combinedHeadersWidth","measureWordSize","shouldColumnAlignRight","forceColumnWidthForType","getColumnWidthForType","adjustedSize","getTextWidth","dashboardRow","childRow","childRowIndex","newCell","createRowCell","setColumnWidths","reportRowCells","tableCells","veriTableRowCell","formatContents","gpsLocation","resourceInformation","Resource","createScoreCell","LocationString","showGPSLocationPopup","dataDate","HasChildRows","gpsLocationLabel","VeriVideoComponentController","$sce","lastSecondPlayed","correctVideoSizeCount","videoElement","currentposition","webmVideoUrl","trustAsResourceUrl","levels","onError","loadingProgress","updateFakeLoadingProgress","controlsMarkup","autoplayMarkup","videoHtml","onLoad","onCanPlay","onPlay","onPause","onSeeked","onSeeking","onSectionLoaded","videoLabel","onTimeUpdate","videoCollection","RagRangeBarChartComponent","DriverActivityGanttComponent","BarChartComponent","HorizontalBarChartComponent","ListogramComponent","updateMaxValue","updateBarHeights","useBarThresholds","DriverActivityGanttController","ganttSeries","timeSeries","showIndicator","sidePadding","labelWidth","throttleMouseMove","elementClientX","calculateMinMaxTime","processUpdate","requiresDebounce","getEventIndicatorTime","indicatorTime","minTime","maxTime","onMousemove","clickTime","onMouseClick","roundedMouseX","indicatorX","timePosition","minutesPerPixel","calculateTimeSeries","postProcessGanttEvents","graphDurationMins","intervals","currentSeriesTime","roundDate","gi","ei","startUtc","showNoDataMessage","percentPerSec","HorizontalBarChartComponentController","showValue","ListogramComponentController","maxResults","updateColours","listToDisplay","displayList","timePeriodTitle","RagRangeBarChartComponentController","upperValue","lowerValue","showExample","hideExample","exampleValue","examplePercentage","displayPercentage","displayClass","getExampleClass","exampleUnit","exampleNoun","formatNumberFilter","unitConversionFilter","capitalise","minutesToDuration","positiveFilter","splitPascalCase","splitPascalCaseCustom","trustedHtml","trustedSource","geocodeFilter","degreesToCompassTerm","minuteOfDayToTimeFilter","translateFilter","phoneNumberFilter","markdownFilter","replacer","trustAsHtml","marked","isLatLng","failureString","locationString","$compileProvider","$mdDateLocaleProvider","$mdThemingProvider","$httpProvider","$sceDelegateProvider","primaryPalette","accentPalette","loadDebugInfo","debugInfoEnabled","useApplyAsync","interceptors","VeriHttpInterceptor","Factory","VeriCacheInterceptor","resourceUrlWhitelist","updateLocale","future","past","hh","dd","MM","yy","httpTimeToLiveCache","createConfigWithUrl","removeCacheVariables","keysToAppendToUrl","setBearerToken","responsePromise","shouldRefreshToken","connectionErrorDialog","closeErrorDialog","responseError","rejection","showErrorToast","showErrorDialog","getMdDialog","opera","constant","hash","$urlRouterProvider","$locationProvider","$uiRouterProvider","plugin","StickyStatesPlugin","html5Mode","otherwise","layoutHtml","translations","isUserUnauthorized","isDeployed","showToolbarLoadingIndicator","showPageLoader","fromState","$evalAsync","countWatchers","watchers","scopeProperty","$$watchers","watcher","watchersWithoutDuplicates","listWatchers","getWatchersFromScope","getElemWatchers","isolateWatchers","$isolateScope","analyseWatchers","countArray","watch","expLabel","exp","showStats","showAngularStats","logDigest","analyseWatchers2","elements","elements_per_attr","scopes","$id","include","outerHTML","element_obj","element_data","relevant_watcher","current_value","countHTMLElements","foundCount","il","AccountController","PasswordEditorComponent","preventDialogFromClosing","newPassword1","newPassword2","detailsPromise","passwordPromise","imagePromise","changePassword","setAccountImage","PasswordEditorComponentController","autocompleteId","isFormValid","newPassword","isSavingPassword","failedToSave","CompanyImageController","fileUploadDetails","CsvImporterService","GeofenceImporterService","ParagonImportAdapterService","RouteDataImporterService","hasValidMinimumLines","importErrorResult","removeTitleLine","validatePreProcessingFields","paragonData","getParagonData","translateImportedData","paragonMatchCols","getValidationError","rowCells","translatedCsvRows","paragonDataItems","paragonDataItem","getCsvLine","rowCols","getOriginalRowCols","dataItem","optionIndexes","routeColsFrom","sourceDepotDepartureTime","sourceDepot","colFrom","siteColsFrom","siteName","siteArrivalTime","siteDepartTime","travelDistanceToNextCall","siteIdx","site","siteColIdx","sourceRow","getDepotCsvString","getSiteCsvString","toFormattedDate","titleRow","dataRows","initParagonData","dataRow","importCellValues","storeRouteData","initParagonDataItem","endDepot","siteNextCallTravelDistance","getStartOfWeekDateNoTime","getImportOptionIndexes","isNewRouteTrip","setNextRoute","isNextSite","setSite","updateSite","storeEndDepot","targetColFrom","getTargetCol","isNewCustomer","nextSite","getSiteVisit","latestSite","lastSiteIdx","siteToUpdate","getDepartureTime","tripNo","getRoute","getTripNo","getVehicleReg","getRouteStartTime","getSourceDepot","getEndDepot","isNewTripNo","isNewRoute","getCustomer","optionIndex","getCellValueByColumnIndex","trip","getDateTimeFromParagonDate","endDepotArrivalTime","getSourceDepotName","getSourceDepotDepartureTime","sourceColFrom","getEndDepotName","endDepotArrivalTimeMoment","getEndDepotArrivalTime","endDepotDepartureTimeMoment","getSiteName","getTravelDistance","getArrivalTime","getNextCallTravelDistance","travelDistanceStr","getTravelDistanceFromPrevCall","travelDistanceFromPrevCall","getSiteArrivalTime","getSiteDepartureTime","paragonDate","paragonDateFields","mins","paragonTime","isValidInteger","isValidDay","isValidTime","validationMessage","toNonTechEnglish","formatPascalCase","csvString","hasCellValues","cellIdx","matchesAlias","checkOnly","setTitleOption","addOptionNotMappedError","rowNo","colNo","rowCol","getPreprocessTranslatedRowNo","colStr","isValidString","isValidDateOrNumber","isValidDate","isValidPositiveDouble","isValidDouble","isValidBoolean","aliasIdx","addHeaderValidationError","fieldAsMoment","isValidDoubleNonNegative","isValidDoubleCanBeNegative","fieldValueLower","dateValidationResult","intValidationResult","nameColIdx","importGeofences","importGeofence","descColIdx","extRefColIdx","address1ColIdx","address2ColIdx","address3ColIdx","address4ColIdx","postCodeColIdx","latColIdx","lngColIdx","radiusColIdx","address4","getCellValue","postCode","address4AndPostCode","latText","lngText","long","mapCoords","importValue","rowClass","getRoutes","getInitialRoutesData","minStart","maxStart","existingRoutes","existingRoute","setRouteValidity","setRouteName","fillInVisitDistances","getInitialRoute","setVisits","vehicleOrDriverColumnIdx","startDateTimeIdx","vehicleOrDriver","startDateTime","validTime","totalTravlTimeMins","totalTimeMins","numberOfCells","nextSiteColIdx","previousStopTime","moreSites","getNextSite","importVisit","noOfCols","setSiteVisitDurations","setSiteVisitsValidity","setVisitDetails","arrivalDateOrTravelMins","getDateOrNumber","isDate","momentVal","numberVal","departureDateOrStopMins","getFloat","numberValue","firstDesc","lastDesc","setVisitValidity","visitIdx","getStraightLineDistance","lastGeofence","currentGeofence","getRouteTemplate","geofenceLatLng","addedSiteVisit","googleLatLng","foundTemplate","indexNumber","routeIdx","getRouteDistance","DashboardController","WidgetService","DashboardComponent","WidgetComponent","WidgetEditorComponent","GaugeWidgetComponent","ChartWidgetComponent","ChartWidgetEditorComponent","MetricWidgetComponent","MetricWidgetEditorComponent","MapWidgetComponent","MapWidgetEditorComponent","ClockWidgetComponent","TableWidgetComponent","TachoWarningsComponent","TrafficIncidentsWidgetComponent","UtilisationHeatmapComponent","TmsPvsBarComponent","html2canvas","_html2canvas","getDashboards","boards","createDashboards","selectedDashboard","translateDashboards","prompt","initialValue","newDashboard","createDashboardCanvas","pdf","imgData","addImage","printCanvas","onclone","documentClone","widgetService","loadingCount","widgetToEditIsHidden","showWidgetAdder","enableWidgetDragDrop","updateLoadingIndicator","showWidgetTable","widgetElement","gridDropX","Column","gridDropY","Row","draggingWidget","dropObscured","moveObscuredWidgets","calculateTargetDropPosition","showModal","widgetToEdit","isAdding","Height","checkIfWidgetCovered","setLoading","poolRequests","widgetUpdatedStatus","keepChanges","onUpdate","setupWidgetDragDrop","removeAddingWidgets","closeWidgetEditor","updatePreview","dashboardContainer","containerRect","adjustedX","adjustedY","isWidgetObscured","widgetsObscured","widgetsUnderWidget","moveWidgetToNextAvailableSpace","WidgetName","excludeDraggingWidget","matchingWidgets","draggingWidgetXLocations","getWidgetXLocations","draggingWidgetYLocations","getWidgetYLocations","widgetXLocations","widgetYLocations","widgetToTest","getElement","isWidgetCovered","widgetsToRequestDataFor","editorConfig","createDefaultEditorConfig","numDataRows","noData","numDataSources","dragover","dragenter","dragleave","drop","setDragImage","dragstart","hidePageTitle","updateSeriesData","ChartWidgetParameters","ChartType","updateChartDefinition","rowTime","setChartColours","createBarChartConfig","createColumnChartConfig","createPolarChartConfig","setLegendPosition","LegendPosition","groupPadding","convertDataDefinitionToChartSeries","HideEmptySeries","UseTotals","newDataObject","enableLegend","this_","labelFormatter","basicPercentageFormatter","pieLabelFormatter","basicLabelFormatter","yData","totalValue","matchedStyle","accountSpecificDefault","convertDataDefinitionToMetricSeries","aggregateChartSeries","driverScore","showTrend","calculateTrendDifference","MetricWidgetParameters","firstHeader","unitConversionType","getUnitType","MeasurementCategory","DataFunction","createChart","updateDisplayValue","setChartSeries","subscribeToMouseEvents","dataPoint","setHighlightedDataPoint","sendGraphHoverEvent","onChartInitialised","showFirstLabel","showLastLabel","getDataType","tickInterval","redColour","amberColour","greenColour","highlightValue","highlightTitle","trendDifference","previousDataPoint","angularEvent","anyData","setState","pointer","normalize","searchPoint","drawCrosshair","chartSeries","convertMeasurementCategoryIntoUnitConversionType","dateSegments","showVehicles","onSettingsUpdated","updateMapLocation","MapWidgetParameters","defaultGeofenceLocation","DisableDefaultUi","warnings","popupEvent","highlightedWarning","tachoStates","tachoState","tachoWarning","w1","w2","xmlDoc","xml","parseFromString","loadXML","parseError","srcText","parseXml","toObj","nodeValue","firstChild","textChild","cdataChild","hasElementChild","nextSibling","removeWhite","escape","innerXml","toJson","ind","asXml","txt","nxt","xml2json","incidents","rss","dayMap","hoursPerVerticalSegment","createDayMaps","dayString","hourUtilisation","utilisationPeriods","createEmptyDayMaps","currentHour","nextHour","currentHourStart","currentHourEnd","vehiclesUtilised","vehiclesUtilisedPercentage","vehiclesMoved","percentageClass","adjustedDensity","createWidget","HideTitle","HideBackground","insertedEl","WidgetType","widgetName","widgetPosition","createDefaultDisplayProperties","createDefaultWidgetParameters","properties","HideTitleConfiguration","parameters","filterSortType","hasCustomEditor","filterColumnDataType","widthList","heightList","selectedColumnHeaders","availableWidgetTypes","availableWidgetTypeCategories","createAvailableWidgetTypes","showWidgetTypeEditor","setupEditorScreen","reflowAllCharts","originalWidget","widgetType","widgetTypeDescription","defaultWidth","defaultHeight","onTypeChanged","checkAndUpdateTitle","showColumnSelector","updateWidgetIcon","onUpdatePreview","rowTitleColum","createCustomWidgetEditor","populateColumnHeaders","populateHeaders","editorName","dataWidget","getAppropriateColumnIcon","newColumns","COMPONENTS_DIAGNOSTICS","DiagnosticsService","FormBuilderService","FormBuilderComponent","UpdateFormDetailsComponent","HealthCheckComponent","VideoDiagnosticsComponent","VideoDiagnosticsService","DiagnosticsController","alcolockService","getVehicleFeatureSets","journeyPromise","alcolockPromise","getLatestAlcolockRecords","alcolockRecords","createVehicleRegHeader","twoHours","twelveHours","lastTempTime","lastMovementTime","lastTachoRecord","tachoMoment","lastAlcolockRecord","lastAlcolockRecordTime","createTickboxDateContent","greenAge","amberAge","minutesDiff","websocketRawDataList","commissionDiagnosticsVehicleId","$onDestroy","unregisterListener","enableVisualizer","disableVisualizer","toggleConfigurableDashboards","videoSourceUrl","tempVideoSourceUrl","playbackSourceUrl","tempPlaybackSourceUrl","updateStockReports","stockReports","stockReportDefinitions","goToPlanning","FormBuilderController","formBuilderService","fieldTypes","formTypes","autoDataFields","selectedFormId","changesMade","createFormMode","jobCompletionTypeFormId","initTableHeaders","selectedForm","FormFields","forms","selectedFormDetails","getFieldTypes","getAutoDataFields","retrieveData","getForms","checkJobCompletionType","unknownFormType","formTypeItem","getFormTypes","formTypeName","getFormTypeName","formId","cancelChanges","fieldId","updatedDetails","FieldId","addMode","addFormDetails","updateFormDetails","updateForm","addForm","Validation","DefaultValue","isIdField","Enabled","createNewFormDetail","deleteConfirm","deleteForm","removeForm","formItem","enableJobCompletionType","UpdateFormDetailsController","fieldTypeOldLabel","fieldTypeOldInput","fieldTypeCheckbox","fieldTypeRadioGroup","fieldTypeSwitch","fieldTypeComboList","fieldTypeInput","fieldTypeDatePicker","fieldTypeTimePicker","fieldTypeCustomVehicleCheck","fieldTypeLocationStamp","fieldTypeDateStamp","fieldTypeAuto","initComplete","catMaps","categoryFormInvalid","selectedCategoryTab","inputForm","populateUiModelFromDbModel","initFormArrays","createAddModeInitialState","formDetails","isInvalidStatus","missingFields","catMap","hasInvalidOptions","duplicateCategoriesDialog","duplicateCategories","showDuplicateCategoriesDialog","populateDbModelFromUiModel","catIdx","onDelete","formWasChanged","createNewFormUiDetail","categoryDetailsChanged","formDetailIdx","formIsInvalid","categoryIsInvalid","isCategoryDataInvalid","newCategoryName","nameInUse","iterationIdx","isAddModeInitialState","getNewCategoryName","categoryIdx","isMultiOptionFieldType","optionItems","optionLabel","formDetail","optionItem","isSwitch","formUiDetails","formFields","fd","mapUiToDbModel","categoryMaps","fieldItem","mapDbToUiModel","formUiDetail","inputFilterTypeNumeric","isBold","defaultToToday","defaultField","getSwitchOptions","convertUiToDbAutoLookupTypes","setValidationField","setDefaultField","defaultFields","isAutoField","convertDbAutoLookupTypes","setUiValidationFields","setUiDefaultFields","videoDiagnosticsService","currentTabIndex","alarmsLoading","ignoredCodes","loadAlarms","getAlarmsForVehicle","alarmData","searchFootage","getAddressFromLatLng","alarmPromise","getAlarms","alarms","locationPromise","createDateTimeHeader","loggedStatus","doesBackendIgnoreAlarm","NumberOfEvents","ignored","sensorAlarmTypes","IO1","IO2","IO3","IO4","IO5","IO6","IO7","IO8","eventTypesString","DriverView","Drivers_Old","DriversController","DriversPageComponent","DriverViewComponent","SimpleBarChartComponent","DriverScoreComponent","eventSeries","isIconSeries","transitSeries","currentTransitEvent","wasMoving","performanceCharts","fakeScore","overallScore","harshBraking","overAcceleration","harshCornering","overSpeeding","getMapUrl","driverStaticMap","getJourneysForDriverSlim","j1","j2","createPerformanceCharts","selectDriver","mileageSeries","mileageChartConfig","createGenericDashboardChartConfig","forced","setXAxisType","firstDay","lastDay","DriverScoreComponentController","latestPlotsPromise","matchingReportRow","SimpleBarChartComponentController","PageStateName","FleetMaintenanceController","createState","ExploreNavigationModule","subtitleTranslation","FleetUtilisation","FleetEvents","FindNearest","DriverBehaviour","DepotCompliance","FindNearestComponent","FleetHistoryComponent","FleetHistoryTimeRangeSelectorComponent","FleetHistoryJourneyScrubberComponent","FleetEventsComponent","FleetEventBarComponent","FleetEventDetailsComponent","FleetEventListItemComponent","IsochroneService","h3Service","isochroneService","searchType","isochronePolygon","updateCrossLocation","compute","cycles","slices","DistanceMatrixStatus","OVER_QUERY_LIMIT","createIsoPolygon","updateVisibleVehicles","createLatLngLiteralPath","containsLocation","polylinePath","crossSize","searchCenterPolyline","faded","maxTotalSegmentPercentage","maxTotal","thisSegmentPercentage","thisSegmentValue","showSegmentCount","updateFadedFromTotal","sticky","hideTotal","FleetEventBarComponentController","processEvent","asMilliseconds","updateEventPlots","startPlotPromise","startPlot","endPlotPromise","endPlot","startText","endText","FleetEventsComponentController","accelerometerRecordService","unseenVideoCountUpdatedSub","currentMainTabIndex","currentSelectedEventTabIndex","isLoadingData","initialLoadComplete","displayedEvents","selectedMapEventPolylines","selectedMapEvent","hoveredMapEvent","eventsRelatedToSelectedMapEvent","loadingSelectedEventVideos","loadingSelectedEventVideoChannels","selectedMapEventVideoRequested","selectedEventVehicleHasRequestFootageFunctionality","selectedEventVideoDownloadProgress","selectedEventVideos","requestedVideoEventIds","driverEvents","locationEvents","driverEvent","locationEvent","severity","userHasVideoAccess","configureDataViewTable","getVideosForEvent","getFleetEventsMapData","prepareDefaultView","eventVideoHasBeenRequested","clickedEvent","displayedEvent","selectMapEvent","clearCategoryFilterToMatchEvent","processSelectedEventInformation","refreshAllMaps","checkForEventVideos","newEventCategory","processDisplayedView","clearEventsCategoryFilter","clearDriverEventFilter","locationIdentifier","clearLocationEventFilter","selectedEventMapMarkerStart","selectedEventMapMarkerEnd","cancelExistingEventVideoInterval","clearCurrentVeriMap","clearCurrentMiniVeriMap","currentVeriMap","currentMiniVeriMap","createMapMarkerForEvent","contextualSpeedingData","contextualSpeedingLinePoints","createPolylinesForEvent","mapCenterFromSelectedEvent","refreshMap","fitMapToMapEvent","fitMapToDisplayedMapEvents","clearCurrentSelectedEvent","refreshEventsData","processEventVideos","videosPendingDownload","eventVideo","getVideoDownloadProgress","selectedEventVideoDownloadStatus","getVideoRequestStatus","clearSelectedEventVideoDownloadProgress","shouldShowVideoEntry","isFootageFunctionalityAvailable","dateFilterStart","dateFilterEnd","eventsPromise","getEventsForFleet","accelerometerEventsPromise","accelerometerRecords","accelerometerEventsMap","filterEvents","filterDataByGroupFilter","attachDriverAndVehicleToEvent","setEventTagIds","getEventCategories","getDriverEvents","getLocationEvents","getAccelerometerRecordForEvent","sortEventCategories","processDriverEvents","processLocationEvents","EventName","filterByDriverIds","filterByVehicleIds","isRelevantDriver","isRelevantVehicle","clearAllFilters","onMarkerClick","onMarkerMouseover","loadingSelectedEventPlots","createRelatedEventsForSelectedMapEvent","eventVideoChannelsPromise","getVideosChannelsForEvent","eventFootageFunctionalityPromise","getRequestFootageFunctionalityAbilityFromEvent","eventPlotsPromise","updateSelectedEventPlots","getFormattedDurationForSelectedEvent","getDurationForSelectedEvent","RolloverStabilityControl","selectedEventRaisedMoment","selectedEventClearedMoment","earliestMoment","latestMoment","eventRaisedMoment","updateContextualSpeedingOverviewBars","updateDriverEventsOverviewBars","updateLocationEventsOverviewBars","newTotalEventsOverviewBar","createSummaryBarSegmentsFromEvents","updateContextualSpeedingRoadSpeedOverviewBars","updateContextualSpeedingRoadTypeOverviewBars","updateContextualSpeedingVehicleTypeOverviewBars","contextualSpeedingRoadSpeedOverviewBars","contextualSpeedingEvents","roadSpeeds","RoadSpeedKph","filterEventsByDriverFilter","filterEventsByLocationFilter","newEventBar","createContextualSpeedingRoadSpeedSummaryBarSegmentsFromEvents","contextualSpeedingRoadTypeOverviewBars","highestEventsCount","roadTypes","roadType1","roadType2","roadTypesIndex","roadType","baseLabel","newBarSegment","bar1","bar2","contextualSpeedingVehicleTypeOverviewBars","vehicleTypeString","vehicleTypesIndex","driverEventsOverviewBars","barEvents","filterEventsByCategoryFilter","driverName","newBar","createOverviewBarFromEvents","dataId","overviewBar","locationEventsOverviewBars","getLocationIdentifier","barSegments","roadSpeed1","roadSpeed2","currentRoadSpeedIndex","roadSpeed","withSmoothZoom","googleMapsBounds","eventMapBounds","filterDisplayedEvents","updateOverviewBars","postProcessFilteredEvents","createDataViewTableRows","preparedEvents","eventLocationIdentifier","noDriverExistsOnEvent","noCategoryFilterOrFilterMatches","noDriverFilterOrFilterMatches","noLocationFilterOrFilterMatches","isUnknownDriver","repeatId","driverEvent1","driverEvent2","cityPostcode","getCityPostcodeFromLocation","postcode","locationEvent1","locationEvent2","accelerometerRecord","event1","event2","moveAllDriversToTop","moveAllLocationsToTop","addGrandTotals","allDriversIndex","allLocationsIndex","vTableColumns","geofenceNames","createVTableRows","fromRequestingVideo","gatherEventVideosInterval","city","locationSegments","simpleValue","cityAndPostcodeSegments","additionPostcode","filteredDriverId","PlaybackDirection","FleetHistoryJourneyScrubberController","disableScrubber","indicatorLabelPixelWidth","hasDataAndEnabled","temporalHeaders","vehicleJourneyModels","timelineElementDetails","timelineLeftX","timelineRightX","timelineWidth","additionalWidthBloatLeft","additionalWidthBloatRight","hoveringAJourney","selectingTimelinePeriod","isMouseDown","mouseOutsideTimeline","playbackDirection","currentPlaybackPixel","isPlayingBackHistory","onTimeSelectorMouseMove","bindWindowResizeEvent","gatherDOMElementBasedDetails","resetHoverIndicator","unbindWindowResizeEvent","updateCoreTimelineStructure","processMouseTimelinePosition","cachedMouseX","Backward","pausePlaybackHistory","getNormalPlaybackSpeed","playbackInterval","updatePlaybackPixel","cancelExistingPlaybackInterval","lastMouseDownX","selectionStartMoment","getMomentFromRawMouseX","selectionEndMoment","updateSelectionStartIndicatorUsingMoment","getRelativeMouseXFromMouseX","processTimelineMouseUp","cancelTimelineSelection","newTemporalHeaders","minutesPerSegment","totalMinutesInRange","minutesIntoTotal","percentageIntoRange","headerMoment","leftOffset","boundingClientRect","scrollRect","journeyContainerIsScrollable","newVehicleJourneyModels","styledJourney","existingJourneyModel","styleWidth","styleLeft","model1","model2","hoverIndicatorLeftPixels","hoveredMoment","createTemporalHeaders","usingRelativeMouse","preventEmittingMoveEvent","relativeMouseX","updateHoverIndicatorPositionUsingMoment","hoveredMinuteOfDay","getMinuteOfDayFromRelativeMouseX","updateSelectionEndIndicatorUsingMoment","updateSelectionArea","startMouseMinuteOfDay","selectionPercentageOfTotalMinuteRange","selectionAreaLeftPixels","selectionStartIndicatorLeftPixels","selectionAreaWidthPixels","newMoment","percentageMomentIntoTimeline","getPercentageOnTimelineFromMoment","getLeftPixelsForTimelineFromMoment","selectionEndIndicatorLeftPixels","detectIfIndicatorWithinAJourney","processTimelineSelection","onSelectedTimeRange","mouseMinuteOfDay","FleetHistoryTimeRangeSelectorController","timeIsSquished","selectedEarliestPercentage","selectedFromMinuteOfDay","selectedLatestPercentage","selectedToMinuteOfDay","selectedEarliestMoment","selectedLatestMoment","timeRangeActivityBars","maxVeriMapZoomLevel","vehicleMarkerMinZoomLevel","MAX_PLOT_PROMISE_COUNT","journeyList","journeyMap","vehicleJourneysMaps","creatingClosestPlotMarkers","mapZoomLevel","mouseMoveJourneyPlotMarkers","hoveredJourneyPlotMarkers","timeFilterFrom","timeFilterTo","heatMapPolygons","inHeatmapMode","exportDataHeaders","resetFilters","clearAllData","onTimeFilterFromChanged","onTimeFilterToChanged","updateStartMinuteOfDay","refreshMapWithOptionalFit","createClosestPlotmarkersForJourneys","updateEndMinuteOfDay","getJourneyFromPlotId","mapHoverJourney","refreshFleetHistoryData","createSelectedJourneyMarkers","clearSelectedJourneyMarkers","selectedJourneyMapMarkerStart","selectedJourneyMapMarkerEnd","hoveredJourneyMapMarkerStart","hoveredJourneyMapMarkerEnd","journeyHasPlots","journeyId","getFleetHistoryData","vehicleDataPromise","postProcessFleetHistoryData","updateTotalElapsedMinutesForJourney","updateStartMinuteOfDayForJourney","updateEndMinuteOfDayForJourney","mapVehicleJourneys","generateTimeRangeActivityBars","relevantJourneyPool","formatJourneys","timeFilterIsApplied","filterJourneysByTime","filteredStartMinuteOfDay","filteredEndMinuteOfDay","filterJourneysForSelectedOrHasPlotData","paintJourneysByVehicle","totalJourneysVisibleInBounds","totalDriversVisibleInBounds","totalVehiclesVisibleInBounds","createHeatmap","buildPolylines","alreadyFit","getLatLngsForJourneys","journeyExportData","checkIfJourneysInMapBounds","sortJourneysByStartTime","sortJourneysByInMapBounds","earliestMomentForFilteredDay","latestMomentForFilteredDay","timeFilterMinMinutesIntoDay","timeFilterMaxMinutesIntoDay","utcMinutesIntoTheDay","hasRelevantJourneyData","assignedVehicleColors","existingColorForThisVehicle","journeyColor","newColor","totalPlotPromisesRequired","getTotalJourneyPlotPromisesForView","journeyPlotPromises","createJourneyPlotPromises","createPolylinesFromJourneys","createExportDataFromJourneyMap","totalRequired","maxCount","getPlotsForJourneyAndVehicle","createdPolylines","currentJourneyPolylines","showDirectionArrows","lineAndArrowColor","createSegmentedPolylineForJourney","addDirectionArrowsToPolylines","removeDirectionArrowsFromPolylines","createdSegmentedPolylines","plotGroups","plotTimeWithinFilter","utcIsWithinTimeFilter","mostRecentPlotGroup","inTimeFilter","addPlotToLatestPlotGroup","addPlotToNewPlotGroup","plotGroup","existingPlotGroups","latestPlotGroup","mostRecentExistingPlotGroup","mostRecentPlotGroupInTime","initialDashedFromSolid","onDateFilterChanged","relevant","totalRequiredPromises","correctJourneys","createMapMarkerForJourney","closestToTime","mouseLatLngs","timeRelevantPlots","findPlotClosestToTime","existingDisplayVehicle","cachedPlot","finalPlot","h3Map","createH3Map","createH3DensityMap","megaPolygon","h3","h3SetToMultiPolygon","h3array","getHeatmapColor","density","addGeoJson","getProperty","jIndex","previousHexCoords","geoToH3","hexCoords","hexLine","h3Line","hIndex","lineHex","newCount","resourceFilter","densityMap","h3StringArray","matchingarray","roundedDensity","cycle","system","computationCallback","METRIC","walking","bicycling","driving","transit","radians","DistanceMatrixService","destinations","relations","getDistanceMatrix","origins","getDistanceMatrixCallback","minWeight","maxWeight","DistanceMatrixElementStatus","GForceGaugeComponent","DriverTachoSummaryComponent","JourneyGraphComponent","PlotInfoTableComponent","VehicleSummaryStatisticsComponent","VehicleDriversComponent","NearestGeofencesComponent","NearestVehiclesComponent","VehicleHistoryComponent","VehicleHistoryGanttChartComponent","VehicleTimelineComponent","EditOdometerController","LiveMapController","StreetViewDirective","convertMilesToMeters","updateOdometer","unchangedOdometer","successDialog","alertDialog","odometersAreEqual","loadingDriverData","loadingInputData","loadingTrailerData","loadingGeofenceData","trailerTableHeaders","trailerTableRows","inputTableHeaders","inputTableRows","geofenceVisitTableHeaders","geofenceVisitTableRows","driverTableHeaders","driverTableRows","trailerEntries","updateTrailerData","updateGeofenceVisits","updateDriverInformation","updateInputData","timelineObj","geofenceEndTime","onTimelineClicked","inputEvent","driverMapping","_i","trailerStart","inputHistoryList","createInputTableRows","getVehicleTrailerMappingsWithVehicles","associations","getGeofenceVisitsByVehicle","createGeofenceVisitTableRows","getIntersectingDriverAssignmentsForVehicle","matchingAssignments","timeWithinDateRange","tachoPromises","restrictTimeToDateRange","driversTachoData","createDriverAssignmentRows","driverTachoData","driverTachoRows","createDriverTachoRows","previousMode","createDriverTableCells","getSourceString","addedMapping","statusExportData","createGeofenceVisitTableCells","visitGeofence","visitDurationSortData","createInputTableCells","onDriverTimelineClicked","onTrailerTimelineClicked","DriverTachoSummaryController","tachoTypes","displayTachoLimit","isTachoOlderThanLimit","twoWeeklyDriveLimit","lastWeeksDrive","dailyDriveClass","weeklyDriveClass","errorValue","dailyDrivePercentage","weeklyDriverPercentage","tachoModeStatus","MaximumDailyDrive","TwoWeekDrive","MaximumWeeklyDrive","getPercentageClass","KalmanFilter","JourneyGraphComponentController","noDataHighChartsTitle","lastGraphHighlightX","showChartType","hideTemperature","firstNonWakeupPlot","lastNonWakeupPlot","redrawCharts","displayChartConfig","getChartObj","getHighchartsObject","findPointBasedOnX","onPlotPointHover","$plotPoint","$mouseXPos","createSpeedChartConfig","createTorqueChartConfig","createFuelChartConfig","canPlots","isTimedCANPlot","updatePlotsElevation","updatedPlot","roundValue","axis","previousPoint","colorArray","speeding","SpeedLimit","diffSeconds","diffPercentage","TotalWeight","previousTimedCANPlot","getTorqueDataPoint","getRPMDataPoint","fuelKalmanFilter","R","Q","filteredLevel","fuelDataPoint","tickAmount","opposite","getSpeedSeriesData","getAxleWeightSeriesData","speedLimitResponse","getSpeedLimitsSeriesData","getTorqueDataSeries","getRPMDataSeries","getElevationSeriesData","getFuelDataSeries","spacingRight","setLegendOptions","highlightPlotBasedOnX","onExtremesUpdated","LiveMapPageStates","selectedPlotDate","initialLoading","loadingHistory","showMapCross","showLiveView","livemapTabs","addLivemapTab","Live","Graph","Video","Timeline","canManageGeofencesPermission","loadUserPreferences","updateInputGraphs","timelineClickData","getUserPreferences","showVehiclesNotTracking","loadHistoryIfRequired","getTab","previousLiveStatus","showHistoryView","showGraphView","showVideoView","showLocationsView","showTimelineView","loadingBottomPanelContents","bottomPanelHeight","loadHistoryForSelectedDay","updatePageState","expectedVideoLocation","eventAction","foundEvent","historicalDay","isEventVideoEvent","onHistoricalMouseEvent","selectedPlotEvent","selectPlotEvent","plotHighlighted","highlightPlotEvent","highlightedPlotIndex","viewState","vehicleHistoryPage","goToMessagesPage","goToTMSPage","goToPlanningPage","highlightedPlotEvent","tabLabel","disabledFunc","urlSlug","startUpdates","setupSocketStreaming","stopUpdates","firstRun","vehicleUpdateInterval","lastScreenRefreshTime","latestPlotUpdateTime","updateVehicleList","getMapOffsetCenter","closePlotsView","updateTabDisabledStatus","requestTime","clearMap","resetHistoryMarkers","historicalDriverTime","plotPoint","mouseXPos","setSelectedVehicle","vehicleMarker","utilisationMetrics","metrics","closePopups","panToPlotPoint","panPlotList","updateJourneyPlot","setPlotSelectedClass","highlightedVehicle","ShowPlotLocations","existingVehicleIndex","refreshedSelectedVehicle","selectedDateIsToday","getAllJourneyDataForVehicle","hasTemperature","sanitizedReg","findVehicleByReg","dateComponent","preselectPageState","getSensorsDataForVehicle","NearestGeofencesComponentController","nearestGeofences","numResultsToShow","maxDistance","updateNearestGeofences","dist","roundedDistance","nearestVehicles","updateNearestVehicles","onVehicleClicked","PlotInfoTableController","displayTemperatures","createDebouncedTemperatureRecordsFn","updateHideVideoButton","hasRequestFootageFunctionality","updateStrings","setDisplayTemps","onRequestVideoClick","hideVideo","showGeofenceIcon","vehicleDirection","odometer","plotReasonString","vehicleView","vehicleDirectionString","plotReason","getOdometerData","setOdometer","showLatestData","OdometerKmCan","OdometerKm","canEditOdometer","debouncedTemperatureRecordsFn","VehicleHistoryPage","VehicleHistoryComponentController","reverseJourneys","historicalPlotRows","plotFilterTypes","currentViewState","viewStates","PlotReasonFilter","FMS","Ignition","Travel","createHistoricalPlotRows","highlightPlot","onMouseEvent","onPlotsFiltered","Plots","showExportPlotsDialog","showExportJourneysDialog","showExportEventsDialog","onViewChanged","lastMouseEvent","plotReasonFilter","TravelSend","TravelStart","TravelStop","TravelStationarySend","hideJourneySummary","availableCheck","$watchGroup","showStreetView","createOptions","getStreetViewStatus","available","StreetViewStatus","svp","createStreetViewPanorama","setStreetViewPosition","pov","pitch","defaultOptions","linksControl","ZoomControlStyle","SMALL","enableCloseButton","StreetViewPanorama","setVisible","setPov","StreetViewService","getPanoramaByLocation","streetViewPanoramaData","streetViewStatus","VehicleDriversComponentController","updateLast25Drivers","driverAssignmentPromise","previousAssignment","newDateEnd","newDateStart","VehicleHistoryGanttChartComponentController","ganttSeriesService","createGanttSeries","journeyUnderMouse","getJourneyAtTime","onJourneyHover","onJourneyClick","foundJourney","ganttChartSeries","createJourneySeries","VehicleSummaryStatisticsController","geofenceVisitHistogram","geofenceVisitVsUnknownHistogram","vehicleUtilisationHistogram","unknownLocationsHistogram","updateListograms","createUnknownPlacesHistogram","placeArray","timeSinceLastPlot","parsedAddress","sortedLocations","topLocations","totalUnknownLocationsTime","geofenceVisitPromise","createGeofenceVisitHistogram","createGeofenceVsUnknownHistogram","visitHistogram","findExistingHistogram","totalGeofenceVisitDuration","totalPlotDuration","histogramArray","histogram","hg","GForceGaugeComponentController","accelDataMaxG","swapLatLng","currentAccelData","updateGForce","accelDataLatG","accelDataLongG","accelDataVertG","capNumberToBounds","accelDataLatGPercentage","convertToRadialCoordinates","accelDataLongGPercentage","convertGToPercentageOfMax","accelDataVertGPercentage","capped","maxOverallG","number1","number2","Maintenance","serviceType","MaintenanceController","VorListComponent","TPMSListComponent","TPMSTyreComponent","TPMSWireframeComponent","TPMSComponent","selectedPage","TPMSComponentController","TPMSListComponentController","tpmsService","tpmsLayouts","dataInterval","selectedRecordHistory","getTPMSHistoryForVehicle","tyreRecordHistory","createTyreCharts","loadHistory","getLatestTPMSRecords","layouts","getLayoutRowStatus","rowClicked","tractorAxleStatus","getAxleRowStatus","trailerAxleStatus","findWorstStatus","worstStatus","status1","status2","tractorAxleCount","countAxles","trailerAxleCount","layoutString","createMiniTyresForAxles","createMiniTyres","tyres","tyreCharts","recordDate","createTyreChart","createTyreChartSeries","TPMSTyreComponentController","TPMSWireframeComponentController","isTractor","VorComponentController","detailContents","vorContents","VehicleMapController","showMobileMap","loadingHistoricalData","historicalDate","vehicleInterval","loadVehicleDataForDay","selectedHistoricalPlot","setDisplayVehicles","PlanningConfig","startingPosition","startingAddress","PlanningController","GeofenceImporterController","geofenceImporterService","importData","getGeofencesFromImportData","valText","lngVal","latVal","radiusVal","validateLatitude","validateLongitude","validateRadius","COMPONENTS_TMS","TMSController","ArrivalsBoardComponent","CsvRouteImporterComponent","CsvImporterComponent","NotesComponent","TMSJobsComponent","TMSJobViewComponent","RouteTemplateCreatorComponent","PlannedRouteListComponent","AlternativeRoutesComponent","RoutePlanningComponent","TMSPlanRouteComponent","TmsWeeklyPlannerComponent","TMSRouteExportComponent","RouteReplayComponent","setTrackedResourceFromExistingRoute","replayRoute","trackedResourceMatch","replayLoading","getPlotsForRoute","replayPromise","displayAudits","createAuditDisplayRows","useFullLogs","highlightedAudit","selectAudit","ActiveJobsComponentController","oldTmsService","routeStatus","showRouteDetails","lastStopArrivalTime","filterOutNoneActiveRoutes","firstStopDepartureTime","RouteTemplateCreatorComponentController","isNewTemplate","showRouteUpdated","disableTimeBuffers","canSave","updateRouteTemplates","createNewTemplate","showChangesConfirmDialog","selectedTemplate","routeWithLinePoints","templateSelectedWithPoints","syncChnagedRouteStopsWithTemplate","selectRouteStop","displayRouteUpdatedBlinker","updateCanSave","saveRouteTemplate","deleteRouteTemplate","displayTemplates","selectTemplate","changesConfirm","highestExistingTemplateIndex","filterDisplayRoutes","NotesController","noteTextToAdd","onNoteAdded","noteAdded","RoutePlanningNavLabels","PlannedRouteListComponentController","veriDateService","listTitle","onScheduleRouteClick","navPillLabels","selectedNavLabelType","templates","resetNavLabel","AM","PM","filterPlannedRoutes","pushToNavLabel","onRouteClick","labelType","TMSRouteExportComponentController","selectedCount","loadRoutes","countSelectedRoutes","formatStringForCsv","formatMomentForCsv","formatNumberForCsv","linkElement","btoa","clickEvent","valueToAdd","AlternativeRoutesComponentController","createMapUrl","mapUrl","onRouteSelected","$route","simplifyLatlngs","getRouteMapUrl","RoutePlannerController","showOptions","showOptimisationLoader","routeResults","ignoreNextUpdate","returnToStart","focusIndex","doesRouteEndAtTheStart","calculateJourney","ensureMinimumWaypoints","addWaypoint","addWayPointToList","endItem","returnToStartChanged","addNewWaypoint","lastWaypoint","currentPosition","moveWayPoint","selectedMatchChange","newRouteSelected","popupMapGeofence","popupMapPosition","getDirectionsFromGoogle","blank","optimisedDirectionsResult","showOptimisationResultDialog","routeOrderDifferentFromInput","flattenedLeg","flattenLegs","distanceWithSuffix","useOptimalRoute","newWaypointOrder","waypoint_order","newWaypoints","oldIndex","invisibleWayPoints","wp","firstIndex","colorWayPoints","fromPosition","toPosition","optimise","latlngWaypoints","getVisibleWaypoints","directionResult","clearExistingJourneys","convertGoogleRouteToRouteResult","handleDirectionsError","directionsRoute","routeLeg","durationInTraffic","duration_in_traffic","estimatedCost","startStop","setRouteStopInformation","wayPointIndex","lastLinePoint","newLinePoint","onRouteStopsChanged","validStops","MAX_WAYPOINTS_EXCEEDED","ZERO_RESULTS","NOT_FOUND","showAlternativeRoutes","showOptimiseRoutes","showTms","stopUpdateTimer","showTMSJobDialog","startUpdateTimer","routesPromise","jobsPromise","getTMSJobs","PlannedDeliveryDate","mapRoutesToJobs","getJobRowClassName","TrackingStatus","deliveryDate","ActualDeliveryDate","plannedDeliveryDate","plannedDeliveryDateString","hhmmss","LoadReference","JobReference","JobStatus","Rejected","JsonData","randId","DeliveryName","TMSPlanRouteComponentController","minHour","minMinute","showInvalidMessage","plannedRouteStatus","routeEditingDisabledReason","showCancelConfirm","overLappingVorPeriod","setMinTime","selectedVehicleDriverMatch","plannedRouteToRouteTemplate","syncExistingRouteFormData","updateRouteTimes","selectedRouteMatch","validatePlannedRoute","invalidVorMessage","getVehicleRecords","getPlannedRouteByExternalReference","invalidExternalReference","minStartTime","cancelPlannedRoute","createPlannedRouteStops","newPlannedRoute","routeTemplateId","convertRouteTemplatesToAutoCompleteMatches","addPlannedRouteNotes","noteLoading","getPlannedRouteNotes","updateEndTime","setRouteStopsArrivalAndDeparture","checkForVorOverlappingWithRoute","totalRouteTimeMins","routeTimeMins","isUndefined","invalidMessage","predecitedEndTime","selectedRoutePredictedEndTime","TmsWeeklyPlannerComponentController","plannedDates","createHistoryTableHeaders","createHistoryTableRows","routeWithLines","createOrEditRoute","planRoute","createOrEditRouteSchedule","ReportSchedules","Expenses","FormStatusIndicatorComponent","ReportBuilderComponent","ReportBuilderListComponent","ReportColumnComponent","NewReportColumnSelectorComponent","TableColumnSelectorComponent","ExpensesComponent","TimePickerComponent","totalExpensedJourneys","getJourneysForDriver","preferencesPromise","filterJourneys","mapJourneysToResources","displayJourneys","calculateJourneysCost","getStartAndEndPlotsForJourneys","Expensed","updateJourneyExpense","updateAllJourneys","journeysToUpdate","showSimple","updateJourneys","expensed","updateJourneysExpenses","createReportTable","createReportHeaders","createTotalsRow","createHeader","createExpenseJourneyCells","createExpenseTotalsCells","reportCells","createCell","totalFuelUsed","totalCost","sourceHeader","AlwaysShowOnTotalsRow","calculateCost","costValue","distanceFactor","asHours","TimePickerComponentController","labelHour","labelMinute","onTimeChanged","disableControls","FormStatusIndicatorComponentController","updateModels","colorClass","selectedColumns","lowerCaseString","allCategories","columnShowCount","showColumns","columnCopy","matchingColumns","updateSelectedColumnState","onColumnsChanged","reportDefinitionPromise","columnHeaderPromise","recentlyRunReports","popularReportRunCount","createReportCount","popularReportCategories","getReportCategoriesFromReportCounts","reportCategories","popularReports","popularReportEntry","reportRunCount","matchingReport","reportCategory","matchedCategory","rc","ReportBuilderComponentController","reportTypeHeaders","enableTabPreview","enableSaveReport","includeRecordsWithNoData","setRowTitle","headerSortChanged","loadPreview","updateSelectedHeaderSortStatus","updateSortedColumn","deleteReportDefinition","reportTileInUse","onSave","$report","ensureUniqueColumnIds","previewReportDebounce","showChangeParameters","getAndSetColumnHeaders","createDefaultDefinition","createPreviewDebounceMethod","htmlDocument","previewReport","isInUse","reportDef","mapColumnDefinitions","displayColumns","typeHeader","showReportBuilder","reportCounts","latestLog","lastRunTimestamp","lastRunFormattedTimestamp","ReportColumnComponentController","highlightText","TableColumnSelectorComponentController","dataFunctions","columnsHaveChanged","columnPickerLoading","columnDataTypes","categoryFilterTitle","showColumnPicker","triggerOnColumnsChangedCallback","displayReportCategories","searchStringLower","matchingReportColumns","columnToEdit","setColumnFilterOptions","selectedColumnChanged","resetCategoryFilterTitle","updateSelectedDisplayColumns","DefaultReportDataFunction","showAddColumnDialog","editColumn","TachoController","AlcolockService","AlcolockComplianceComponent","ComplianceRingComponent","processAlcolockRecords","Show","alcolockResults","Reading","AlcoholMeasurement","ResultType","EventGroup","Details","mapEventCode","FormattedReading","createFormattedReading","PortableDeviceSerial","csv","convertArrayOfObjectsToCsv","msSaveBlob","ctr","columnDelimiter","lineDelimiter","alcolockEventCode","PowerUp","InitialSampleFailed","RandomSampleFailed","InitialSamplePassed","RandomSamplePassed","PossiblePushStart","OverridePeriodStarted","OverridePeriodEnded","EmergencyOverridePeriodStarted","ForcedSampleRequest","RandomSampleRequest","CallTimeExpired","CircumventionBreathRelated","CircumventionSuckBack","CircumventionBlowingTooHard","SystemRearmedStartTimeExpired","SystemRearmedRestartTimeExpired","TabConnected","DriverChangeRequest","DriverChangePassed","DriverChangeFailed","DriverChangeCallExpired","ManualSample","PassedAfterRandomCallExpired","PassedAfterDriverChangeCallExpired","FailedAfterRandomCallExpired","FailedAfterDriverChangeCallExpired","CircumventionInsufficientSample","DoorOpened","DatabaseDeleted","ServiceReminder","ServiceExpired","AlcolockComplianceComponentController","selectedVehicleResults","selectedVehicleTableHeaders","createSelectedVehicleHeaders","selectedVehicleNumPasses","selectedVehicleNumEvents","selectedVehicleNumFails","getVehicleAlcolockResults","selectedResult","createSelectedVehicleRows","mapResultToCsvFormat","downloadCsv","loadHistoryForDate","highlightedRecord","getAlcolockTop5PerVehicle","groupPromise","alcolockTypeToClassName","alcolockResultTypeToRowStatus","historyString","historyExportString","historicalResult","iconName","mapEventName","Handset","alcolockEventGroup","createSelectedVehicleTableCells","roundedReading","resultType","ComplianceRingComponentController","showLegend","okRingLabel","warningRingLabel","errorRingLabel","totalRingSize","okRing","warningRing","errorRing","okRingPercentage","warningRingPercentage","errorRingPercentage","okRingOffset","warningRingOffset","errorRingOffset","ringStatus","NoData","showHoursOfService","common","Videos","Coaching","Downloads","VideoPageController","CameraDashboardComponent","VideoEvidenceComponent","VideoJourneySummaryComponent","JourneySummaryCardComponent","JourneyOverviewCardComponent","DriverOverviewPageComponent","LiveStreamVideoComponent","RequestVideoComponent","RequestVideoMapComponent","RequestVideoQueryStatusComponent","CompositeVideoPlayerComponent","VideoCoachingPageComponent","VehicleVideoCardComponent","VideoEventViewComponent","DriverVideosPageComponent","DriverVideoCardComponent","VehicleVideosPageComponent","loadingVideos","getDataInterval","showVehicleDialog","applyFilters","vehiclesToDisplay","silentLoad","videoEntriesDateRange","videoEntriesPromise","channelsPromise","processVehicles","prepareTable","getVehiclesWithMetadataUpdated","getVehiclesWithStreamingChannelsMapped","updateLatestOfflineStatusTime","createVehicleOnlineStatusCell","createDriverCell","channelCount","dmsEvents","isDmsEvent","adasEvents","isAdasEvent","clearLatestOfflineStatusTime","getEvent","videoRequested","requestingVideo","videoEventDuration","requestVideoUpload","bufferedStartTime","bufferedEndTime","videoEventDisplayDate","risk","riskPill","deviceNotInstalled","cameraDashboard","videoJourneys","videoStatusTypes","cameraProductGroupIds","mandatoryCommentRequired","showCoachingOnStartup","addMissingReviewStatus","extensionData","createBrakingAccelerationChartOptions","createCorneringChartOptions","updateVideoTimeline","mapMetaDataNotesToUsers","setFavouriteAndReviewed","populateVideoVehicleAndDriver","markVideoAsWatched","showVideo","setShowDownloadProgress","newVideoReviewStatus","videoReviewStatus","hasChanged","originalVideoReviewStatus","updateMandatoryCommentRequired","videoReviewSubStatus","videoCoachingStatus","newVideoReviewSubStatus","newVideoCoachingStatus","userReviewed","isUserActionSet","userFavourite","createMapEventMarker","addNoteToVideo","setVideoReviewStatus","onFavouriteChange","setVideoFavourite","setVideoReviewed","videoObservationSearchString","assignedVideoObservations","uniqueVideoObservations","corneringChart","brakingAccelerationChart","createVideoTimeline","createBasicAnnotations","createBrakingAccelerationChartSeries","brakingAccelerationChartConfig","createPostLoadChartAnnotations","createCorneringChartSeries","corneringChartConfig","annotations","labelOptions","topText","bottomText","plotSizeX","plotSizeY","accelerometerData","amberBand","redBand","createVideoMapMarker","createPolylinesFromPlots","createStartMarker","createEndMarker","videoJourney","startMapMarker","endMapMarker","showDownloadProgress","downloadProgress","downloadStatus","isSet","noActionRequiredCount","actionRequiredCount","driverTrainedCount","driverPraisedCount","totalVideoEvents","totalAverageDriverVideoEvents","totalNewVideos","currentDriverSeries","averageDriverSeries","latestVideos","setTotalDistance","onDashboardBoxClick","createChartConfigs","getStatusCounts","getAverageDriverVideoCount","getNewVideoCount","pieChartConfig","barChartConfig","createPieChartSeries","createBarChartSeries","colorByPoint","filterMinorEvents","getObservationsColour","allEvents","createCategoriesSetCurrentDriverSeries","setAverageDriverSeries","uniqueDriverCount","getUniqueDriverCount","updatedCount","existingDriverData","uniqueDrivers","ud","isMinorEvent","resetStatusCounts","showMinorEvents","setSelectedTab","filterStatus","DriversVideosComponentController","filterDriversByObservations","showDriverDialog","driverClicked","entriesPromise","createReviewChartSeries","createCoachingOutcomeChartSeries","createObservationsChartSeries","lastWeekStart","thisWeekStart","thisWeekEnd","observationSummary","existingSegment","lastWeekCount","thisWeekCount","formattedLastWeekStart","formattedThisWeekStart","formattedThisWeekEnd","lastWeekObservationsSeries","thisWeekObservationsSeries","observationsChartConfig","reviewStatusSeries","videoSeriesName","existingSeries","reviewStatusChartConfig","coachingStatusChartConfig","legendOptions","needingReview","coachedActionTaken","unseen","fatigueEvents","createReviewActionCell","createTopObservationsCell","displayDriver","rowVideoEvents","topObservations","existingSegments","addTopObservationLabels","topObservation","actionSegments","createActionSegmentsExport","filterModel","allStreamsOffline","cameraOnline","getLiveStreamDevice","forceStatusUpdate","mandatoryReason","requestVideoService","requestStartSecondOfDay","canPreview","loadingFootage","vehicleVideoNameKey","getChannelSessionData","setDeviceInfo","setHideRequestControls","checkCanRequestVideoAtTime","updateQualityControls","clearTrimRequestLengthLabel","selectedDay","getDailyFootageFromFtCloud","updateSeekingStatus","createTimeline","trimRequestLengthToFitAvailableFootage","setVideoRequestTimeFromSecondOfDay","sanitizedVideoLength","getChannelNumbersFromChannels","VerifiedPeriod","getVerifiedPeriod","getPlotForRequest","eventValue","videoPlaying","closeChannelStreams","seekingFootage","getDateTimeFromSecondOfDay","hideRequestControls","setRequestSecondOfDay","timelineSummary","createAvailableDailyFootageTimelineFromJourneys","journeysForRequestDate","loadingJourneys","requestLengthAdjustmentLabel","projectedEndDate","trimmedEndDate","trimEndDateForRequestUsingSummary","endTimeFits","channelNumbers","verifiedPeriod","hasFootageAvailableAtTime","canRequestVideo","gettingSessionData","peripheralHasActiveSessions","hasSession","availableFootageForRequestTime","availableQualitiesSet","availableQualitiesAtRequestVideoTime","debounceRenderMap","renderMap","showLastKnownLocation","createLastKnownLocationMarker","buildPolylineFromExtensionData","createJourneysFromVideoData","createJourneysFromPlotData","mapLatLngs","vehiclePolyline","plotsForRequestDate","getJourneysPromise","journeysAtTimeOfVideo","plotAtTime","onClosestPlotFound","createApproximateLocationMarker","createVideoJourneys","createVideoMarker","relevantJourneys","clearMapMarkers","allLinePoints","plotsFromLinePoints","lp","startPlotLatLng","endPlotLatLng","startLinePointPlot","endLinePointPlot","startLinePointIndex","endLinePointIndex","onJourneysLoaded","friendlyTime","isOnline","buildJourneyMap","QueryStatus","RequestVideoQueryStatusController","queryStatusMap","GettingOnlineStatus","DeviceOffline","GettingJourneyHistory","GettingLatestMonthlyDaysFromCeiba","FailedToGetCalendar","ctaLabel","GettingDailyCeibaFootage","FailedToGetDailyFootage","NoAvailableDates","RequestedCustomVideo","RequestedExistingEvent","cta","showCTA","checkedFunctionality","receivedOnlineStatus","requestVideoEnabled","accountSettingsShowRequestVideo","vehicleOnlineStatus","accountSettingsShowLiveView","doesVehicleHaveActiveChannels","renderTabs","loadVehicleFromId","getAllAccountSettings","currentTab","updatedVehicleOnlineStatus","initial","hideTitle","filterVideoEventsByObservations","getRowStatusForVideoReviewStatus","getRowClassNameFromRowStatus","getEventSummaryColour","lastCoachingEvent","coachingEventTimeCell","coachingUserCell","matchingUser","getReviewStatusIcon","videoEventsPromise","statusToFilter","JourneyOverviewCardComponentController","totalEventsCount","setJourneyStatus","setIcons","setEventsCount","journeyOverviewCardClick","getFilteredEventsForVideo","startIcon","endIcon","JourneySummaryCardComponentController","videoStatus","lastSelectedEvent","sortJourneyEvents","eventCardClick","eventCardHover","VideoJourneySummaryComponentController","getJourneyData","veriTableMap","onVideoEventClick","showMore","setSelectedEvent","dateToFilter","setJourneyDriver","sortJourneys","displayEvents","displayEventsCollapsed","expandEvent","downloadVideoCountUpdatedSub","numVideos","numNewVideos","numEvents","numDownloads","UsersManagement","CameraManagement","Settings","authorizeFoundationOrInternal","ContextualSpeedingSettings","authorizeDevOnly","ResourceManagementController","GroupListComponent","DriversComponent","GeofenceDetailsInfoComponent","ResourceGeofencesComponent","GeofenceListComponent","GeofenceEditorComponent","GeofenceTagsComponent","GeofenceVisitsComponent","GeofenceTagsEditComponent","VehiclesComponent","VehicleInputEditorComponent","TemperatureProbesComponent","TemperatureProfilesEditComponent","VorMaintenanceComponent","VorRecordEntryComponent","UsersComponent","UserEditorComponentOld","UserPermissionsComponent","UserActivityChartComponent","VehicleInputTypeManagerComponent","InputStateDescriptionComponent","Password","ButtonId","DriversComponentController","assignmentChanges","duplicateDriverName","existingDriverUsernames","minEndDate","verifyData","driverFormInvalid","reactivateDriver","deactivateDriver","endDateType","updateCurrentAssignmentModel","assignmentChanged","assignmentEnd","setImageHasChanged","saveAdditionalData","assignmentUpdatePromise","newAssignment","saveDriverAssignment","originalAssignment","endDriverAssignment","imageHasChanged","saveDriverImage","editDriverForm","$invalid","selectedGroups","updateEndDateType","driverImageFile","getDriverImage","image","assignDriverGroupIds","updateAssignmentChangedState","vehicleAssigned","activeAssignment","findAssignmentByVehicleId","handleInfoMessage","getAssignmentEndLabel","createDriverResourceGroupDisplayCell","Nfc","externalRefPromise","isPermanent","updateUIEndDatesFromAssignment","createDefaultAssignmentModel","updateAssignmentTranslations","assignmentSourceLabel","assignmentsAreSame","targetVehicle","startAssignmentText","vehicleDriverMappings","setMilliseconds","dataIsDirty","formIsPending","$pending","$dirty","allowSave","onDriversChanged","GeofenceDetailsInfoComponentController","GeofenceEditorComponentController","geofenceInitialized","isSavingGeofence","isDeletingGeofence","navigationPointEditorEnabled","showNavigationPointEditor","wizardMode","journeyEndPoints","providedEmailIsValid","canSetRestrictedFlag","dirtyGeofence","geoJsonInputElement","currentTabTitle","prepareGeofence","prepareWizardMode","geofenceFacade","refreshValidationErrors","deletedTag","deleteGeofence","setPolygonGeofenceRadius","ignitionRadius","CIRCLE","ep","isNewGeofence","cleanupGeofencePointsAndRadius","saveGeofence","savedGeofenceId","applyGeofenceIdToNavigationPoints","saveGeofenceNavigationPoints","navPoint","closeNavigationPointEditor","selectedNavigationPoint","newNavigationPointName","clearNewNavigationPointName","prepareNewGeofenceAtLocation","isPhoneNumberValid","onFormUpdated","saveNavigationPoint","addNavigationPoint","validateGeofenceShape","currentTabValidationError","geofenceValidation","geofenceForm","$valid","isEmailValid","ContactEmail","ignoreGeofenceMaxSize","emailIsValid","area","getRecentIgnitionOffs","createNewGeofence","geoJsonPoints","updateWithImportedData","geoJson","getPolygonCenterCoordinates","GeofenceListComponentController","isShowingZones","filteredGeofences","dropDownfilterOptions","getGroupComboBox","onSearch","onGeofenceMouseEvent","createTagsCell","GeofenceTagsComponentController","includedRows","excludedRows","listExcluded","mapLoaded","updateAllRows","item2","updateTables","sortTagsInToPriorityOrder","createExcludedList","blockCallback","updateGeofencePrimaryTag","createIncludedRows","createExcludedRows","onIncludedListChanged","GeofenceTagsEditComponentController","tagRows","maxTagPosition","disableSave","showChangeInfo","clashedResources","setupEnumArrays","availableColours","setSelectedTag","onDeleteConfirm","checkDuplicateResources","postTag","forceSelect","onHideDeleteButton","hideDeleteButton","createTagRows","resourceAllocationTypes","GeofenceVisitsComponentController","loadGeofenceVisits","loadingGeofenceVisits","geofenceVisitDate","getGeofenceVisitsByGeofence","selectedGeofenceCurrentlyActiveVisits","showCurrentlyActiveVisits","loadingNavPoints","showingZones","showGeofenceEditorDialog","clearSelectedGeofence","setSelectedGeofence","getPointFromAddressPromise","geocode","address_components","place_id","location_type","getPointFromAddress","pointsFromAddress","mapCenterValidateGeofence","addGeofenceAtPosition","isRestrictedReadOnly","isReadOnly","selectedGeofenceTab","clearSelectedGeofenceIfIsZone","selectedNavPill","dontUseApply","updateGeofenceCount","selectGeofenceById","preventEditingSystemOrRestrictedGeofences","onNavPillSelected","getGeofenceNavigationPoints","updateSelectedGeofenceAddress","getLatestAndCurrentGeofenceVisits","resetVisitsCounts","setLatestVisit","setActiveVisits","selectedGeofenceLastVisit","selectedGeofenceAddress","updateExteranlIds","refList","extRef","UserActivityChartComponentController","loginDataExists","getDays","displayLoginHistory","loginHistoryForCurrentUser","getAllLoginHistoryForUser","createLoginHistoryData","numberOfDays","loginData","datesWithLogin","Logins","ClassName","Tooltip","UserEditorComponentController","dirtyUser","prepareUserModel","createUserSavePromise","additionalSavePromises","createUserPreferencesSavePromise","createResourceMappingsSavePromise","updateOrInsertUserCache","onSaved","onCreated","deactivating","deactivateUser","onDeactivated","reactivating","reactivateUser","onReactivated","validateEmail","resettingPassword","passwordResultDialog","existingGroupIndex","removeGroup","disableUserMappingFeatureAccount","enableUserMappingFeatureAccess","digest","checkForUnsavedChanged","updateResourceTotals","hasManageFeature","removeGroupIncludingDuplicates","refreshSelectedUserGroups","cachedSelectedVehicleIds","cachedSelectedDriverIds","cachedSelectedGeofenceIds","processChangedResource","AllowAllVehicles","AllowAllDrivers","AllowAllGeofences","mappingPromises","updateUserDriverMappings","updateUserVehicleMappings","updateUserGeofenceMappings","updateUserGroupMappings","langPref","createNewUserPreferences","patchMissingUserProperties","cacheResourceIds","cacheUserMappings","prepareAvailableAccountFeatures","localesPromise","loginHistoryPromise","getLatestLoginHistoryForUser","accountFeatureDescriptionsMap","getFeatureDescriptionsMapForAccount","updateLastLoggedInDate","getDriverMappingsByUserId","getVehicleMappingsByUserId","getGeofenceMappingsByUserId","driverMappings","vehicleMappings","geofenceMappings","hasUnsavedChanges","checkUserValidity","totalAssignedGroups","recursivelySearchSelectedUserGroups","groupIdsChecked","groupsToIterate","arrayName","resourceArray","totalAssignedVehicles","totalAssignedDrivers","totalAssignedGeofences","userResources","resourceList","lastLoggedInDate","UserPermissionsComponentController","UsersComponentController","loadingLoginHistories","userFilter","showInactiveUsers","showSSOConfiguration","showUserCreatedDialog","reloadData","clearSelectedUser","selectUser","createDefaultUserModel","lastRecordCell","lastLoginRecord","userLoginHistories","fetchUsers","loadLoginHistory","onUsersChanged","TemperatureProbesComponentController","profileList","loadTemperatureProfiles","sortProbes","loadTemperatureZones","checkProbeValidity","checkDuplicateName","onProbesValid","TemperatureProfilesEditComponentController","profileRows","decimalCheck","loadProfiles","activeState","setSelectedProfile","selectedProfile","saveTemperatureProfile","profileCreatedDate","profileLastUpdated","checkboxTicked","createProfileRows","descriptionId","checkNameValidity","selectedInputType","onInputsValid","dopt","VehicleInputManagerController","inputTypeRows","loadInputTypes","getStateDescriptions","newInputType","setSelectedType","deleteInputTypes","addOrUpdateInputTypes","createInputTypeRows","stateDescriptions","VehiclesComponentController","inputsValid","foundVehicle","inputErrorMessage","vehicleDepotId","PhoneNumber","vehicleSavingPromise","PrimaryNotification","notificationList","notification","SecondaryNotification","secondNotificationList","inputSavingPromise","saveInputs","currentVehicleDepot","groupSavingPromise","updateVehicleDepot","updateVehicleGroupIds","probesTabDisabled","setProbeClientSideValues","PrimaryRollingAverageMins","useRollingAverage","SecondaryRollingAverageMins","useSecondRollingAverage","addGroupsIdsToVehicles","motExportData","motContents","isEligibleForDVLACheck","taxExportData","taxContents","createVehicleStatusCell","VehicleYear","DvlaMake","createStackedCell","DvlaModel","createVehicleResourceGroupDisplayCell","clearCaches","externalReferencesPromise","vehicleDataList","findVehicleData","foundGroup","onVehiclesChanged","VorMaintenanceComponentController","vorRecordStatus","setupNewInstance","selectedVorRecord","openVorRecordTaskDialog","saveVorRecord","updateCachedData","saveRecord","onVorUpdate","EndDateType","VorRecordEntryComponentController","noEndDate","endDateTypes","updateTimes","validateDates","checkForOverlappingVorRecords","specific","Filter","GroupListComponentController","numIncluded","Included","NotIncluded","createEntityCallback","entity","rowDataUpdated","createRowFilterData","includedForFilter","setRowStateForAll","newState","rowEntity","maxSelectedItems","listLabel","listItemLabel","hideAddAll","HomeComponentController","input1","input2","levenshtein","InfoEntryComponent","SDCardInfoComponent","FormWarningComponent","CameraDeviceInfoComponent","CameraDeviceInfoComponentController","devicePlot","FormWarningComponentController","InfoEntryComponentController","SDCardInfoComponentController","updatePercentage","percentageUsed","availableMb","sizeMb","HelpNavigationModule","ModuleNavigationComponent","SiteNavigationComponent","SideNavigationService","visitedCookie","getIsLocalDevelopment","accountDataPromise","navigationItems","createNavigationItemsForFoundation","createNavigationItemsForFoundationEngineers","listeners","createListenersForSuperUser","createNavigationItemsForUser","createListenersForUser","findAndExpandParentNav","subNavItems","expanded","navItem","subNavItem","uiSref","visitedPages","getCookie","setCookie","new","navObject","addNavigationItem","getFleetSubNavItems","requiredReadFeatures","getExploreSubNavItems","showNew","createCameraNavigationItems","createTmsNavigationItems","createTemperatureNavigationItems","showOnMobile","createReportNavigationItems","createAlertNavigationItems","divider","createAdminNavigationItems","diagnostics","updateMessageCounts","messageUpdateInterval","updateMessageCount","updateVideoCounts","videoUpdateInterval","findNavItem","accountHasAnyFeatureAccess","currentUserHasAnyFeatureAccess","requiredManageFeatures","hideFromReseller","hideIfNotInternalOrFoundation","isInternalOrFoundation","hideInProduction","onlyShowOnTMS","tmsEnabledOnAccount","hasNewSubItem","Compliance","ArrivalsBoard","RoutePerformance","VisitPerformance","videoItem","countSuffix","requestedPromise","requestedEntries","updateNavItemCount","needsReview","getMessageUnreadCounts","unreadMessageCounts","createCustomerNavigationItems","createInstallsNavigationItems","createHardwareNavigationItems","createDeviceHealthNavigationItems","foundItem","navItemName","visitedPagesCookie","MessagingController","MessagingConversationComponent","isLoading","conversationFilter","sendingGroupMessage","selectedConversation","Conversation","conversations","conversation","conversationsDisplay","updateLatestMessages","latestConversation","findConversation","selectConversation","updateMessageUnreadCounts","onDestroy","clearMessages","newMessage","sendMessage","preserveScope","sendGroupMessage","getLatestMessages","latestMessages","setLatestMessages","unreadMessages","mostRecentConvo","lm","convo","latestMessageUpdateIntervalPromise","MessagingConversationComponentController","messageReplyBody","scrollToBottom","setupExpiryOptions","conversationUpdateIntervalPromise","loadMessages","onVehicleChanged","sendMessageToVehicle","sendUpdates","setMessageToRead","emitMarkedAsRead","setConversationMessagesToRead","resetScrollToBottom","getNextPageNumber","scrollWhenFinished","getMessagesForVehicle","applyNewMessages","insertNewMessageToConversation","onMarkedAsRead","hideHeader","sideNavigationService","eventListeners","collapseNav","npsRaterIsVisible","toggleNpsRaterVisibility","updateAccountInfo","removeEventListeners","removeIntervalListeners","setCollapseNavClass","removeNavItemNewStatus","closeOtherNavParents","setHasNewSubNavItemStatus","showMyPreferencesDialog","showNPSRater","npsEntry","createNavigationForUser","toParams","toggleNavCollapsedState","updateVersionNumber","updateBetaMessage","nav","showNoAuthorizationWarning","toggleClass","navigationItem","getLatestRating","daysSinceLastRating","getAPIVersion","appVersion","betaMessage","getIsDev","showTooltips","onNavItemClicked","EditSchedule","NewSchedule","ImportSchedule","createTMSRouteView","parentViewName","TmsDashboardComponent","RouteDetailsComponent","DriverActivitySheetComponent","SchedulingComponent","ScheduleEditorComponent","ScheduleVisitsListComponent","ScheduleVisitsListItemComponent","ScheduleVisitValidationComponent","DriverActivitySheetComponentController","logoUrl","odoStart","odoEnd","VisitFilter","RouteDetailsComponentController","plannedRouteNoteService","actualFiguresAvailable","showDriverSheet","routeIsInProgressOrPlanned","visitsLoading","showSettings","showRespinButton","vehicleAndDriverMissing","canReallocateAssets","routeSettingsString","canCloseRoute","routeClosed","canShowSideBar","visitFilters","selectedVisitFilter","getRouteSettingsString","panToVisit","filterDisplayVisits","updatePlannedRoute","assetChanged","plannedNote","noteString","getNotesForPlannedRoute","settingsString","createStartRuleString","createEndRuleString","createArriveVisitRuleString","createRuleString","startingPeriodTimeRuleString","maximumLateTimeAllowedMins","maximumExpiryTime","arrival","departure","updatePlannedRouteCache","OnJourney","OnDwell","ruleValue","geocodeUnplannedStops","setIntervalIfRouteInProgress","isRouteInProgressOrPlanned","routeNameKey","isRouteCreatedAfterStart","isRouteInChangebleState","Draft","setActualData","extractGeoAreasFromRoute","checkIfVehicleIsAtVisitLocation","getDashboardFigures","filteredVisits","vehiclePresent","getPvaTime","getPvaDistance","getMissedVisitsCount","getFuelConsumption","arrivalComment","buildStringForVisitComment","departureComment","timeOnSite","expectedDepartureTime","updateDistanceFromComment","distanceFrom","getDistanceFromVisitLocation","distanceNumber","distanceString","distanceLabel","startAndEndTime","getRouteStartAndEndTime","MAX_SAFE_INTEGER","time1","time2","onTimeStatus","differenceMinutes","firstPlannedStop","lastPlannedStop","plannedDuration","actualDuration","pvaDiffMins","pvaDistanceDiff","actualDistanceKm","missedVisitsCount","fuelConsumption","actualDurationMins","journeyBufferMins","historicalDayPromise","getJourneyDataForDriver","setVisitComments","setOdoFigures","standardSubject","UserAccessType","Api","noun","addVisitToTimeline","arriveDepartText","departTime","filterOutInactiveRoutes","getRouteDetails","tmsDashboard","ScheduleEditorComponentController","updateAvailableRules","prepareRoute","sortRouteVisitsByPlannedArrivalTime","dirtyRoute","updateRouteRules","addDefaultVisits","cacheRouteRules","setDefaultStartMoment","updateDisplayRoute","startingOptionsProperty","endingOptionsProperty","calculating","calculatingRoute","cancelledRoute","saveModel","createModelForSaving","savedRoute","updateStartMoment","newStartMoment","previousStartMoment","updatePlannedStartEndTime","selectedVehicleMatch","triggerChange","firstLocation","lastLocation","lastForcedVisitUpdate","selectedDriverMatch","enableRouteRule","showingStartOptions","showingEndOptions","updateTimeProperties","createRouteTemplate","setVisitsAsDirty","refreshRouteStats","fitMapToVisits","createDefaultTmsRouteRules","getActiveStartOptionProperty","startRouteMatchingRuleLabels","getActiveEndOptionProperty","endRouteMatchingRuleLabels","clearAvailableStartRulesModel","clearAvailableEndRulesModel","ruleKey","cachedRouteRules","startRuleDropdownItems","endRuleDropdownItems","ruleProperty","validateVisitList","createPlannedVisitTemplate","setMandatoryRules","routeCopy","cancelledVisits","originalVisit","displayRoute","PlannedRouteVisitWarningType","ScheduleVisitsListComponentController","maxVisitsForAutomatedRecalculate","routeCalculationId","onSiteTimes","showDebugLabels","refreshReturnToStartState","calculateRoute","refreshDisplayVisits","visitsChange","routeRulesChange","startMomentChange","forceVisitsUpdateChange","filterCancelledVisits","processRouteRulesChange","setFirstVisitDate","refreshDisplay","titleTranslation","contentTranslation","yesTranslation","cancelTranslation","calculateVisitingTimes","setReturnToStartLocation","onEndingLocationMatchCleared","updateVisitWithLocationMatch","resetVisitData","setReturnToStart","updateStartMomentUsingTimespan","changeVisitArrivalTimeFromTimestamp","isStartLocation","isEndLocation","fromTemplate","newVisit","endLocationRequired","routeRules","isBasicVisit","setVisitAsNotDirty","scrollToBottomOfVisits","realIndex","getDisplayVisitIndexToRealIndex","targetIndex","displayVisit","displayVisits","indexOfDisplayVisit","indexOfVisit","newTargetIndex","resetVisitTravel","showingRecalculateWarning","routeWarning","OutOfSync","currentRouteCalculationId","setCalculatingRoute","clearRecalculateWarning","clearCurrentCalculationsOnVisits","onCalculatingRoute","emitVisits","onStartMomentChanged","totalRouteTimeMinutes","displayIndex","visitsContainer","currentlyNeedsStartLocation","currentlyNeedsEndLocation","previouslyNeededStartLocation","previouslyNeededEndLocation","changeMade","addEndLocation","removeStartLocation","removeEndLocation","addNewVisit","timeStamp","refreshRouteWarning","relevantDate","previousVisitMinuteOfDay","currentVisitMinuteOfDay","newArrivalTimeMoment","updateVisitDepartureTime","bool","currentlyRequiresStartLocation","currentlyRequiresEndLocation","startVisit","endVisit","pasteVisitLocationIntoVisit","showRecalculateWarning","onReturnToStart","forceVisitsUpdate","ScheduleVisitsListItemComponentController","addAllCustomOnsiteTimes","onOnsiteTimeChanged","onLocationMatch","onLocationMatchCleared","onArrivalTimeChanged","onVisitRemoved","ScheduleVisitValidationComponentController","SchedulingComponentController","selectedNavIndex","quickEditRecord","editMenuActive","createNavPills","ScheduleView","routeToEdit","menuX","menuY","updateNavPills","clearNavPillsData","recountNavPillTotals","VehiclesNew","allowAnonymous","LoginBoxComponent","LoginPageComponent","LoginScreenPage","loggingIn","inError","screenToShow","Login","sentEmail","sendingEmail","showPasswordBox","checkAutomaticLogin","hasActiveSession","resetStates","onLine","SamlLogin","isSSOEnabled","loginSaml","performLogin","performSamlLogin","ForgotPassword","showLoginClicked","flushExsistingSession","loginToken","getUserInformation","loginCode","refreshRequired","redirectToFoundation","showAccountPickerScreen","loginViaCode","atob","loginViaToken","winter","showSnow","showDots","monthOfYear","CacheService","AuthorizationService","Debounce","DelayService","FilterOptionsService","VersionService","WebSocketService","ThrottleService","PrintService","EventService","GanttSeriesService","ValidationService","MessageDialogService","InputTypeService","UserMappingsService","AxleWeightService","PowerLossHistoryService","UserResellerMappingService","NotifyFactory","provider","RouteConfigHelperProvider","createVeriTabSubRoute","createVeriTabRoute","createViewWithBoundParams","createDetailState","appendQueryParams","emailRegExp","formatResponse","sendToLoginScreen","refreshSessionIfRequired","authorizedDefaultRoute","goToUnauthorizedPage","goToStateString","cacheFactory","getDataRetrievalPromiseCacheName","clearAll","dataCache","dataRetrievalCallback","invalidate","getDataRetrievalPromise","dataRetrievalPromise","saveDataRetrievalPromise","transfomToCacheItem","transformToData","cacheItem","delItem","wait","callNow","arguments","later","CommonEventStatus","CommonEventCategory","isInRange","movingEvents","currentMovingEvent","previousReason","adjustedReason","OnOff","OpenClosed","ActiveInactive","ConnectedDisconnected","LoginSource","errorDetail","$emit","printSection","matchMedia","mql","afterPrint","onafterprint","elementName","elemToPrint","printElement","landscape","printWindow","elem","domClone","cloneNode","localStorageKey","firstCheck","startVersionMonitoring","getCachedAPIVersion","showVersionUpdatedNotification","connected","loggingEnabled","messageQueue","ping","autoReconnect","webSocket","sendQueue","send","initialCommand","readyState","logWarning","parsedData","getMessageDataType","messageObj","firstSemiColon","firstComma","retryTimeout","logError","optionalParams","UserPreferencesService","ShowLabelsWhenZoomedOut","VisibleAt","createAlertView","AlertsManagerComponent","AlertHistoryComponent","AlertEditorComponent","RecentAlertsComponent","AlertReviewComplianceComponent","IncidentDetailComponent","AlertReviewComplianceComponentController","alertRulesPromise","resolutionCodesPromise","alertReviewHistoryPromise","alertReviewEventsPromise","alertRecordsPromise","mapUsersToEvents","setupNavPillData","openDuration","getResolvingUser","resCodeId","IncidentDetailComponentComponentController","previousAlertsLoading","dateStartIsEqualToEnd","showMapMarkers","formSubmitting","showTemperatureGraph","showGeofences","isAuthorized","onAlertReviewEventAdded","emitAlertReviewHistoryUpdate","showPreviousAlertsSidebar","incidentPromise","alertEventsPromise","getAlertRecords","getPreviousAlertsForVehicle","incidentName","AlertRule","setupPageElements","createPrevAlertsTableHeaders","previousAlertsPromise","createPreviousAlertsPromise","createAlertEventsPromise","createAlertRecordsPromise","alerts","previousAlerts","createPrevAlertsTableRows","alertEventsQueryOptions","previousAlertQueryOptions","prevAlertsTableHeaders","prevAlertsTableRows","createPrevAlertsTableCells","ActionAtDataTimestamp","setupTempGraph","tempGraphStart","tempGraphEnd","mostRecentEvent","incidentResolutionCode","incidentDurationToResolve","getDurationInAlarm","incidentResolveByUser","incidentResolutionComment","getResolutionComment","alertRaisedDateTime","dateStartAndEndLabel","formatDatesFromAndTo","formattedStartDate","alertRulePromise","getAlertRule","alertRecordPromise","getAlertRuleRecord","loadPlot","getAllPlotsForAlert","getDateStartAndEndLabel","endLabel","alertPolyline","alertLocationMarker","AlertRuleExclusionTimePeriods","incidentDayOfWeek","alertRestrictions","alarmTime","rationalisedStart","StartTimeAdjusted","rationalisedEnd","EndTimeAdjusted","alertRuleHasDelay","FirstNotificationDelay","alertSendTime","alarmStartTime","alarmStartTimelineEntry","isAlarmOutsideActiveTimeRange","firstNotificationSentTimelineEntry","ResendAlerts","SentCount","mostRecentNotificationSentTimelineEntry","LastSent","AlertEditorComponentController","VehicleSubAlertCatagory","recipientTypes","recipientDeliveryTypes","distanceUnitTypes","temperatureUnitTypes","volumeUnitTypes","currencyTypes","alertCategories","reasonCodes","allDays","weekDays","weekendDays","existingAlertRules","isLoadingAlertNotifications","isLoadingAlertRecords","isSavingAlertRule","isFormReady","enableDelay","resendIntervalType","ResendIntervalType","Minutes","alertRuleRecordVehicles","inputTypeFilter","subCategoryUnits","alertExclusionDays","newRecipient","defaultDelayValue","defaultResendValue","conversationalSegments","alertPreferences","languagePreferenceValue","timezonePreferenceValue","availablePlotReasonsForAlerting","dirtyAlertRule","alertForm","createAlertTriggerMappings","selectedHistoryDate","setupRule","resetDelayAndResendIfNeeded","updateConversationalSegments","setDefaultValueOfCategoryTrigger","setInputTypeFilter","setUIAlertPreferences","TriggerValue","getSubCategoryUnitsList","setLocalDelayVars","ResendMinuteInterval","setLocalResendVars","updateResendMinuteInterval","resendMinuteInterval","hasForDuplicateAlertName","inputContainsInvalidChars","invalidInput","clearRecipientAddError","currentRecipientType","currentRecipientDeliveryType","replaceEmailRecipientWithUser","recipientValidation","isValidRecipient","retainCustomValue","errorReason","recipientAddError","resetNewRecipientPlaceholder","addLabelsToRecipient","deliveryTypeTooltip","getRecipientDeliveryTypeTooltip","currentRecipient","deliveryType","timeRange","generateExclusionTimePeriodsForAlert","deleteRule","TimeZoneId","runConversionForModel","setAlertRulePreferences","saveRule","runConversionForView","notificationStatus","recipientType","toggledDayOfWeek","forceOverride","overrideValue","newExclusionDays","daysOfWeek","currentDayOfWeekValue","existingDayValue","includedDaysOfWeek","excludedDaysOfWeek","toggleDayOfWeek","alertIsActive","Paused","triggerKeys","intervalType","minuteInterval","newConversationalSegments","styleClass","recipientLabel","primaryLabel","totalRecipientCount","getTotalRecipientCount","totalOtherCount","otherWordage","finalLabel","pluralNumber","pluralWord","weekDaysDescriptor","recipients","recipientCount","getUserCountFromGroupId","getActiveAlertRules","alertCategoryTrigger","categoryTriggerAllowedDelayResend","resetAlertDelayAndResend","reasonCode1","resaonCode2","category1","category2","day1","day2","recipientType1","recipientType2","recipientDeliveryType1","recipientDeliveryType2","distanceUnitType1","distanceUnitType2","temperatureUnitType1","temperatureUnitType2","volumeUnitType1","volumeUnitType2","currencyType1","currencyType2","createDefaultRule","setDefaultAlertRulePreferences","setDelayResendIcon","processAlertRule","isDuplicateGroup","ruleRecipient","isDuplicateUser","isDuplicateCustom","userCount","secondaryLabel","emailString","Sms","prefType","prefTypeId","pref","PreferenceTypeId","isGroupIdValid","isUserIdValid","phoneNumberIsValid","isDuplicateRecipient","retainPreviousCustomValue","RuleId","newRecipientSmsInput","validateTimeRange","timeRangeValid","exclusionDay","excludedDayStartTime","excludedDayEndTime","getExcludedDaysOfWeek","timeRangeToMinuteOfDay","timeRangeFromMinuteOfDay","includedDayStartTime","includedDayEndTime","isFullDayPeriod","updateWeekDaysDescriptor","addRecipientLabelsToRecipients","getTimeRangeFromAlertRule","getExclusionsDaysFromAlertRule","Hours","includesWholeWeekend","includesWholeWorkWeek","day1Translation","day2Translation","timeRangeSelection","createDefaultTimeRangeSelection","exclusionTimePeriod","fixedStartTime","fixCeEpochTime","fixedEndTime","startTimeMinuteOfDay","endTimeMinuteOfDay","currentTimeRangeFromMinuteOfDay","currentTimeRangeToMinuteOfDay","timeRangeIsFullDay","fixedTime","timezoneOffsetMs","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","exclusionDays","fromMinutes","toMinutes","GreaterThan","delayResendIcon","AlertHistoryComponentController","recipientTableHeaders","recipientTableRows","historyTableHeaders","historyTableRows","loadingAlertRecords","loadAlertRecords","alertRuleRecord","selectedAlertRuleRecord","getAlertNotifications","notifications","alertNotifications","lastAlertNotification","fixNotificationRichHtmlLink","getNotificationRecords","getAlertNotificationRecords","notificationRecords","NotificationRecords","createHistoryTable","createRecipientTable","ruleRecord","showAlertEditor","Rich","rulePromise","recordsPromise","getAlertRuleRecords","getAlertRuleRecordsForAccount","populateRecordsWithMetaData","rulesToShow","Recipient","Processed","TimestampSent","AlertsManagerComponentController","loadingAlertRules","alertCategory","filteredAlertRules","displayRules","isSystemUser","canManageAlerts","cat1","cat2","alertsDate","refreshData","clearSelectedAlertRule","selectedAlert","showAlertEditorDialog","canAccessAlert","renderDashboardBoxes","quotasPromise","getNotificationQuotas","notificationQuotas","addNotificationQuotaPercentages","searchAlertRules","forceNewRuleMode","hasFilterAccess","hasGroupAccess","hasResourceTypeAccess","emailPercentageUsed","TotalUsed","TotalAllowed","smsPercentageUsed","createDataViewTableHeaders","resendPluralWord","resendPluralNumber","resendLabel","pluralize","delayLabel","LastSentTime","numberFilter","totalEmailsUsed","totalEmailsAllowed","totalSmsUsed","totalSmsAllowed","usageDashboardBoxInfo","emailUsageTitle","emailUsageSubtitle","smsUsageTitle","smsUsageSubtitle","RecentAlertsComponentController","loadingRecentAlerts","loadingAlertRule","alertRuleRecords","maxListLength","initUser","yesterdaysDate","alertRuleRecordsPromise","prepareAlertRuleRecords","preparedAlertRuleRecords","record1","record2","createReeferRecordView","TemperatureGraphComponent","TemperatureGraphComponentController","DisplayPlotOnMap","vehicleInputList","sortOutExportLabels","graphPlotLine","doesLatestRequested","inputHistoryPromise","legendTopRight"],"mappings":"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EAAAt/C,QAAU,CAAC,SAAU,mBAAoB,gBAAiB,WAAY,qBAAsB,QAAS,QAAS,aAAc,eAAgB,UAAW,a,uGCZlK,SAAYkV,GACR,mBACA,yBACA,yBACA,qBACA,+BACA,6BACA,yBACA,yBARJ,CAAY,EAAAA,kBAAA,EAAAA,gBAAe,M,wGCC3B,SAAYwV,GACR,oBACA,yBACA,iBACA,2BACA,uCACA,iCACA,6CACA,iBACA,gCACA,0BACA,sBACA,sBAZJ,CAAY,EAAAA,cAAA,EAAAA,YAAW,M,qGCAvB,SAAY4c,GACR,kCACA,oCACA,yBACA,+BACA,mDACA,yBACA,2BACA,2BACA,+BACA,iCACA,+BACA,+BACA,kCACA,0BACA,8BACA,wBACA,8BACA,kCACA,8BACA,wCACA,0CACA,0BACA,kCACA,wBACA,sCACA,kCACA,kCACA,oCACA,gCACA,4CACA,gCACA,0CACA,8CACA,wCACA,0CACA,wCACA,wCACA,4BACA,kBACA,kCACA,oCACA,kCACA,0BACA,gCACA,sCACA,wBACA,kBACA,4BACA,kCACA,sDACA,4BACA,kCACA,wDACA,oCACA,sCACA,4CACA,gDACA,oCACA,sCACA,8CACA,kDACA,8BACA,oCACA,0BACA,oDACA,sCACA,0DACA,0CACA,8BAEA,wDACA,wDACA,0DACA,8BACA,4BACA,wBACA,sBACA,kCACA,oCACA,kEACA,gEACA,sCACA,wCACA,gCACA,wBACA,4CACA,8BACA,kCACA,gCACA,4DA1FJ,CAAY,EAAAA,aAAA,EAAAA,WAAU,M,6mBCDtB,aAOA,OAEA,QAKA,IAAavF,EAAb,MAEI,YACqB5hC,GAAA,KAAAA,qBAIrB,cAAcmgD,GAEV,OAAIA,EAAiB,SACVnlD,KAAKgF,mBAAmB3G,EAAE,kCAGjC8mD,EAAkB,UACXnlD,KAAKgF,mBAAmB3G,EAAE,kCAAmC8mD,EAAkB,UAAEC,gBAGxFD,EAAkB,UACXnlD,KAAKgF,mBAAmB3G,EAAE,kCAAmC8mD,EAAkB,UAAEC,gBAGxFD,EAAc,MACPnlD,KAAKgF,mBAAmB3G,EAAE,+BAGjC8mD,EAAY,IACLnlD,KAAKgF,mBAAmB3G,EAAE,4BAA6B8mD,EAAY,IAAEE,KAG5EF,EAAY,IACLnlD,KAAKgF,mBAAmB3G,EAAE,4BAA6B8mD,EAAY,IAAEG,KAK5EH,EAAe,OACRnlD,KAAKgF,mBAAmB3G,EAAE,gCAGjC8mD,EAA2B,mBACpBnlD,KAAKgF,mBAAmB3G,EAAE,4CAGjC8mD,EAA2B,mBACpBnlD,KAAKgF,mBAAmB3G,EAAE,4CAGjC8mD,EAAwB,gBACjBnlD,KAAKgF,mBAAmB3G,EAAE,yCAGjC8mD,EAA2B,mBACpBnlD,KAAKgF,mBAAmB3G,EAAE,4CAGjC8mD,EAA6B,qBACtBnlD,KAAKgF,mBAAmB3G,EAAE,8CAGjC8mD,EAA4B,oBACrBnlD,KAAKgF,mBAAmB3G,EAAE,6CAGjC8mD,EAAkC,0BAC3BnlD,KAAKgF,mBAAmB3G,EAAE,mDAGjC8mD,EAA0B,kBACnBnlD,KAAKgF,mBAAmB3G,EAAE,8CAGjC8mD,EAAoB,YACbnlD,KAAKgF,mBAAmB3G,EAAE,qCAGjC8mD,EAAmB,WACZnlD,KAAKgF,mBAAmB3G,EAAE,oCAGjC8mD,EAAmC,2BAC5BnlD,KAAKgF,mBAAmB3G,EAAE,oDAGjC8mD,EAAyB,iBAClBnlD,KAAKgF,mBAAmB3G,EAAE,0CAIjC8mD,EAAsB,cACfA,EAAsB,eAGjCjmD,QAAQwE,KAAK,2BAA4ByhD,GAElCnlD,KAAKgF,mBAAmB3G,EAAE,mCAGrC,iBAAiBknD,GACb,QAAKA,IAIEA,EAAQJ,UAAYvpD,OAAOqmB,KAAKsjC,EAAQJ,QAAQxpD,QAG3D,uBAAuB6pD,GAEnB,GAAKA,aAAS,EAATA,EAAWC,SAAhB,CAIA,IAAK,IAAI/mD,KAAO8mD,EAAUC,SACtBD,EAAUC,SAAS/mD,GAAKgnD,yBAG5BF,EAAUG,mBACVH,EAAUE,0BAGd,eAAeF,GAEX,QAAKA,IAILxlD,KAAK0lD,uBAAuBF,GAErBA,EAAUI,SA/HZhf,EAAqB,GAHjC,EAAAr1B,WAAW,CACRC,WAAY,S,uBAK+C,mB,OAAA,IAAlB,EAAA/R,oBAAA,EAAAA,oBAAkB,YAHlDmnC,GAAA,EAAAA,wBAmIb,MAAaif,EAsMT,yCAAyCzyB,EAAoCmV,GACzE,OAAQgd,GACGnyB,EAAQ0yB,iBAAiBvd,EAAWgd,EAAQnnD,OAAO0pC,KACtD,EAAAh0B,KAAIiyC,GAEIA,EACO,CACHC,mBAAmB,GAIpB,SAjN3B,yBACW,EAAAp4C,OAAU23C,GAET5jD,OAAOskD,SAASV,EAAQnnD,OACjB,KAGJ,CACH,OAAU,CAAEwnD,OAAO,IAIpB,EAAAM,gBAAmBX,GACjBA,EAAQnnD,MAITmnD,EAAQnnD,MAAMzC,QAAU4pD,EAAQnnD,MAAM2tB,OAAOpwB,OACtC,KAGJ,CACH,gBAAmB,CAAEiqD,OAAO,IARrB,KAYR,EAAAO,mBAAsBC,GAAqBb,GAC1CA,EAAQnnD,MAAMzC,QAAUyqD,EACjB,KAGJ,CACH,mBAAsB,CAAER,OAAO,IAIhC,EAAAS,iBAAoBj3B,GAA0Bm2B,IACjD,IAAKA,EAAQnnD,OAASmnD,EAAQnnD,MAAMzC,OAAS,KAAMyzB,aAAQ,EAARA,EAAUzzB,QACzD,OAOJ,OAJwByzB,EAASvuB,MAAK2V,GAC3BA,EAAQI,IAAI9D,gBAAkByyC,EAAQnnD,MAAM0U,eAAiB0D,EAAQK,SAAS/D,gBAAkByyC,EAAQnnD,MAAM0U,gBAI9G,CAAEkzC,mBAAmB,GAGzB,MAGJ,EAAAM,iBAAoBC,GAA0BhB,IACjD,KAAKgB,aAAU,EAAVA,EAAY5qD,QACb,OAGJ,IAAK4pD,EAAQnnD,MACT,OAAO,KAOX,OAJ0BmoD,EAAW1lD,MAAKwS,GAC/BkzC,EAAWl5C,MAAK1J,GAAMA,IAAO4hD,EAAQnnD,MAAM2V,OAI3C,CACH,iBAAoB,CAAE6xC,OAAO,IAI9B,MAGJ,EAAAY,eAAkBC,GAAoBlB,IACzC,IAAKA,EAAQnnD,OAASmnD,EAAQnnD,MAAMzC,OAAS,KAAM8qD,aAAK,EAALA,EAAO9qD,QACtD,OAOJ,OAJqB8qD,EAAM5lD,MAAK0pB,GACrBA,EAAKwY,MAAMjwB,gBAAkByyC,EAAQnnD,MAAM0U,gBAI3C,CAAE4zC,oBAAoB,GAG1B,MAGJ,EAAAC,oBAAuBC,GAAqCrB,IAC/D,IAAKA,EAAQnnD,OAASmnD,EAAQnnD,MAAMzC,OAAS,KAAMirD,aAAO,EAAPA,EAASjrD,QACxD,OAOJ,OAJuBirD,EAAQ/lD,MAAKgmD,GACzBA,EAAO7vB,KAAKlkB,gBAAkByyC,EAAQnnD,MAAM0U,gBAI5C,CAAEg0C,sBAAsB,GAG5B,MAGJ,EAAAC,uBAAyB,CAAC/N,EAAegO,IAAyBzB,IACrE,IAAKA,EAAQnnD,MACT,OAGJ,IAAK46C,EAAMiO,QACP,OAAO,KAGX,IAAIC,EAAsB3B,EAAQnnD,MAC9B+oD,GAAyB,EAE7B,KAASD,IAAwBC,GAAwB,CACrD,MAAMC,EAAcJ,EAAUnmD,MAAKwmD,GAAKA,EAAEtzC,KAAOmzC,IAEjDC,EAAyBC,EAAYH,QAErCC,EAAsBE,EAAYE,SAGtC,OAAIH,EACO,CACH,2BAA8B,CAAEvB,OAAO,IAIxC,MAGJ,EAAA2B,kBAAoB,CAACC,EAAcC,EAAsBC,IAA4BnC,IACxF,IAAKA,EAAQnnD,QAAUopD,EAAM7rD,OACzB,OAOJ,OAJqB6rD,EAAM3mD,MAAK2U,GACrBA,EAAKiyC,GAAc30C,gBAAkByyC,EAAQnnD,MAAM0U,gBAInD,CAAE,CAAC40C,IAAiB,GAGxB,MAGJ,EAAAC,mBAAsBpC,I,MAEzB,IAAKA,EAAQnnD,MACT,OAAO,KAGX,MAAMwpD,EAAyD,QAAlB,EAAArC,EAAiB,eAAC,eAAa,SAE5E,KAAKqC,aAAiB,EAAjBA,EAAmBjsD,QACpB,OAAO,KAGX,MAAMksD,EAAuCD,EAAkBnkD,QAAOqkD,GAC3DA,IAAqBvC,GACrBuC,EAAiB1pD,QAAUmnD,EAAQnnD,OACjB,KAAlBmnD,EAAQnnD,QAGnB,OAAKypD,aAAiB,EAAjBA,EAAmBlsD,QAIjB,CACH,mBAAsB,CAAEiqD,OAAO,IAJxB,MAQR,EAAAmC,SAAYxC,GACVA,EAAQnnD,MAITmnD,EAAQnnD,MAAMzC,OAAS,IAAM4pD,EAAQnnD,MAAMzC,OAAS,GAC7C,CACH,YAAe,CAAEiqD,OAAO,IA+BxC,SAAmBoC,GACf,IAAIC,EAAM,EACNC,EAAMF,EAAMh3C,OAAO,EAAGg3C,EAAMrsD,OAAS,GACrCwsD,EAAYthD,SAASmhD,EAAMh3C,OAAOg3C,EAAMrsD,OAAS,EAAG,IACpDysD,EAASF,EAAIvsD,OAAS,EAE1B,IAAK,IAAIF,EAAIysD,EAAIvsD,OAAS,EAAGF,GAAK,EAAGA,IAAK,CACtC,IAAI4sD,EAASxhD,SAASqhD,EAAIl3C,OAAOvV,EAAG,IAChCA,EAAI,GAAK2sD,IACTC,GAAU,EACNA,EAAS,IACTA,EAAS,EAAKA,EAAS,KAG/BJ,GAAOI,EAGX,OAAe,EAANJ,EAAW,KAAQE,EA5CnBG,CAAU/C,EAAQnnD,OAMhB,KALI,CACH,WAAc,CAAEwnD,OAAO,IAXpB,M,yHCrUnB,SAAYpmC,GACR,kBACA,yBACA,yBACA,mBACA,iBACA,+BACA,yBACA,+BACA,yBACA,mCACA,iBACA,oBACA,oBACA,0BACA,wBACA,sBACA,4BACA,kCACA,wBACA,0BACA,4CACA,oCACA,oBACA,oBACA,sDACA,0CACA,4BACA,sBACA,0BACA,0BACA,sCACA,4BACA,wBACA,kCACA,wCACA,kBACA,oBACA,0CACA,kCACA,oCACA,gDACA,8BA1CJ,CAAY,EAAAA,eAAA,EAAAA,aAAY,KA6CxB,SAAY+oC,GACR,iBACA,yBACA,uBACA,2BAJJ,CAAY,EAAAA,qBAAA,EAAAA,mBAAkB,M,ilBC7C9B,aACA,OACA,QACA,QAoBA,IAAa/e,EAAb,MAKI,YACqB33B,GAAA,KAAAA,cALb,KAAA5O,MAAQ,IAAI4Q,IACZ,KAAA20C,aAA6C,IAAI30C,IACjD,KAAA40C,aAAgD,GAaxD,aAAatnB,EAAmBunB,EAAmCvjD,EAAyB,IACxFA,EAAUnF,KAAK2oD,kBAAkBxjD,GAEjC,MAAMyjD,EAA0B5oD,KAAK6oD,cAAc1nB,GAEnD,OAAKynB,GAAc5oD,KAAK8oD,UAAU3nB,IAAch8B,EAAQirB,iBACpDpwB,KAAK+oD,WAAW5nB,EAAWunB,EAAUvjD,GACrCnF,KAAKgpD,UAAU7nB,EAAWh8B,GACnBnF,KAAK6oD,cAAc1nB,GAAW8nB,UAGzCjpD,KAAKkpD,SAAS/nB,GAEPynB,EAAWK,SAUtB,gBAAgB7qD,EAAY+iC,EAAmBgoB,EAAkB,MAC7D,IAAKnpD,KAAK6oD,cAAc1nB,GACpB,OAGJ,MAAMynB,EAAa5oD,KAAK6oD,cAAc1nB,GAEtC,GAAInhC,KAAK8oD,UAAU3nB,GAAY,CAC3B,MAAMh8B,EAAUnF,KAAK2oD,kBAAkB,CAC/BS,IAAKR,EAAWQ,IAChBC,eAAgB,CAACjrD,KAKzB,OAFA4B,KAAK+oD,WAAW5nB,EAAWynB,EAAWF,SAAUvjD,QAChDnF,KAAKgpD,UAAU7nB,EAAW,CAAEgoB,UAASE,eAAgB,CAACjrD,KAI1D4B,KAAKspD,yBAAyBlrD,EAAO+iC,EAAWgoB,GAUpD,WAAW/qD,EAAY+iC,EAAmBgoB,EAAkB,MACpDnpD,KAAK8oD,UAAU3nB,GACfnhC,KAAKgpD,UAAU7nB,EAAW,CAAEgoB,YAIhCnpD,KAAKupD,yBAAyBnrD,EAAO+iC,EAAWgoB,GAQpD,eAAezqD,EAAUyiC,GACrB,GAAInhC,KAAK8oD,UAAU3nB,GACf,OAKJ,OAF2BnhC,KAAK6oD,cAAc1nB,GAEjChmC,KAAK6C,IAAIU,GAM1B,iBACIsB,KAAKwpD,mBACLxpD,KAAKwoD,aAAaiB,QAClBzpD,KAAKiD,MAAMwmD,QAKP,UAAUtoB,GACd,MAAMynB,EAAa5oD,KAAK6oD,cAAc1nB,GAEtC,IAAKynB,EACD,OAAO,EAGX,MAAMc,EAASd,EAAWc,OAE1B,OAAO1pD,KAAK6R,YAAY5H,kBAAkB,IAAI5E,KAAQqkD,GAGlD,WAAWvoB,EAAmBunB,EAAmCvjD,GACrE,MAAMwkD,EAAqB3pD,KAAK6oD,cAAc1nB,GAE9C,IAAI8nB,EAAgCU,aAAkB,EAAlBA,EAAoBV,SAEpD9jD,EAAQirB,iBAAoBu5B,IAC5BV,EAAU,IAAI,EAAAW,cAAqB,IAGnC5pD,KAAKiD,MAAMg/C,IAAI9gB,EAAW,CACtBhmC,KAAM,IAAI0Y,IACV60C,WACAO,UACAS,OAAQ1pD,KAAK6R,YAAYxF,kBAAkB,IAAIhH,KAAQF,EAAQikD,KAAO,IAAK,EAAAtkD,SAASsE,KACpFggD,KAAKO,aAAkB,EAAlBA,EAAoBP,MAAOjkD,EAAQikD,MAI5C,yBAAyBhrD,EAAY+iC,EAAmBgoB,EAAkB,MAE9E,MAAMP,EAAa5oD,KAAK6oD,cAAc1nB,GAEhC0oB,EAAejB,EAAWztD,KAAK6C,IAAII,EAAM+qD,IAE3CU,GACAjB,EAAWztD,KAAK2uD,OAAOD,EAAaV,IAGxCP,EAAWztD,KAAK8mD,IAAI7jD,EAAM+qD,GAAU/qD,GAEpC4B,KAAKkpD,SAAS/nB,GAGV,yBAAyB/iC,EAAY+iC,EAAmBgoB,EAAkB,MAC9E,MAAMP,EAAa5oD,KAAK6oD,cAAc1nB,GAChC0oB,EAAejB,EAAWztD,KAAK6C,IAAII,EAAM+qD,IAE3CU,GACAjB,EAAWztD,KAAK2uD,OAAOD,EAAaV,IAGxCnpD,KAAKkpD,SAAS/nB,GAGV,SAASA,GACb,MAAMynB,EAAa5oD,KAAK6oD,cAAc1nB,GAEhChmC,EAAO+G,MAAM6nD,KAAKnB,EAAWztD,MAAMqa,GAC9BA,EAAK,KAGhBozC,EAAWK,QAAQe,KAAK7uD,GAGpB,UAAUgmC,EAAmBh8B,GACjC,MAAMyjD,EAAa5oD,KAAK6oD,cAAc1nB,GAEtC,IAAI8oB,EAGAjqD,KAAKwoD,aAAa9lD,IAAIy+B,KAEtB8oB,EAAUjqD,KAAKwoD,aAAaxqD,IAAImjC,IAG/B8oB,IACDA,EAAUrB,EAAWF,WAAW5gB,KAC5B,EAAAoiB,YAAW/qD,IAEPa,KAAKwoD,aAAasB,OAAO3oB,GAClB,EAAAgpB,WAAWhrD,MAEtB,EAAAirD,YAAY,KAIpBH,EAAQI,UAAU,CACdL,KAAM7uD,IACF,MAAMmvD,EAAa,IAAIz2C,IAAI1Y,EAAK2Y,KAAI0B,GAAQ,CAACA,EAAKrQ,EAAQgkD,SAAU3zC,MAE9DozC,EAAa5oD,KAAK6oD,cAAc1nB,GAEjCynB,IAKLA,EAAWztD,KAAOmvD,EAClBtqD,KAAKkpD,SAAS/nB,GAEdynB,EAAWc,OAAS1pD,KAAK6R,YAAYxF,kBAAkB,IAAIhH,KAAQujD,EAAWQ,KAAO,IAAK,EAAAtkD,SAASsE,OAEvGmhD,SAAU,KAEDvqD,KAAK6oD,cAAc1nB,KAKpBh8B,EAAQkkD,gBACRlkD,EAAQkkD,eAAe97C,SAAQiI,GAAQxV,KAAKspD,yBAAyB9zC,EAAM2rB,EAAWh8B,EAAQgkD,WAGlGnpD,KAAKwoD,aAAasB,OAAO3oB,GAEzBnhC,KAAKwqD,mBAAmBrpB,GACxBnhC,KAAKkpD,SAAS/nB,OAKlB,mBAAmBA,GACvB,MAAMioB,EAAMppD,KAAK6oD,cAAc1nB,GAAWioB,IAEpCzrB,EAAUC,YAAW,KACvB59B,KAAKyqD,WAAWtpB,KACX,IAANioB,GAEHppD,KAAKyoD,aAAaxsD,KAAK0hC,GAGnB,WAAWwD,GACDnhC,KAAK6oD,cAAc1nB,GAC3BhmC,KAAKsuD,QAGP,mBACJzpD,KAAKyoD,aAAal7C,SAAQm9C,IACtBC,aAAaD,MAIb,kBAAkBvlD,GAStB,OARKA,EAAQgkD,UACThkD,EAAQgkD,QAAU,MAGjBhkD,EAAQikD,MACTjkD,EAAQikD,IAAM,KAGXjkD,EAGH,cAAcg8B,GAClB,OAAOnhC,KAAKiD,MAAMjF,IAAImjC,KAnQjBqI,EAAgB,GAH5B,EAAAj4B,WAAW,CACRC,WAAY,S,uBAQiC,mB,OAAA,IAAX,EAAAzM,aAAA,EAAAA,aAAW,YANpCykC,GAAA,EAAAA,oB,ylBCvBb,cACA,OACA,OACA,QACA,QACA,QACA,SACA,QACA,QACA,QACA,SACA,SACA,UACA,SACA,SACA,SACA,SAEMnP,EAAoB,GAEpBC,EAAmB,CACrB,EAAAswB,yBACA,EAAA7zC,oBACA,EAAA8zC,yBACA,EAAAC,4BACA,EAAAC,uBACA,EAAAC,6BACA,EAAAC,sBA4BJ,IAAaC,EAAb,MACI,iBADSA,EAAuB,GAzBnC,EAAAhxB,SAAS,CACNwC,QAAS,CACL,EAAAE,aACA,EAAA3C,YACA,EAAA+kB,gBACA,EAAAze,qBACA,EAAA9D,qBACA,EAAAkE,sBACA,EAAAwqB,oBACA,EAAApM,gCACA,EAAAhiB,sBAEJ5C,aAAc,IACPE,KACAC,GAGP0C,gBAAiB,IACV3C,KACAC,GAEPp9B,QAAS,IACFo9B,K,2BAGE4wB,GAAA,EAAAA,2B,2kBCvDb,cACA,OACA,OACA,QACA,QACA,QACA,QACA,QACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,UACA,SACA,SACA,SACA,SAEM7wB,EAAiC,GAGjCC,EAAgC,CAClC,EAAA8wB,sBACA,EAAAC,gBACA,EAAAC,aACA,EAAAC,WACA,EAAAC,YACA,EAAAnzC,SACA,EAAAd,aACA,EAAAhB,WACA,EAAAyC,kBACA,EAAAyyC,uBACA,EAAAC,gBACA,EAAAh0C,iBACA,EAAAM,2BACA,EAAA2zC,6BAIExxB,EAAsB,CACxB,EAAAyxB,0BAqBJ,IAAaC,EAAb,MACI,iBADSA,EAAY,GAlBxB,EAAA3xB,SAAS,CACNE,UAAW,GAGXsC,QAAS,CACL,EAAAE,aACA,EAAAH,qBACA,EAAAM,qBACA,EAAA0H,uBACA,EAAA9D,sBACA,EAAA1G,YACA,EAAA+kB,iBAEJhiB,gBAAiB,IAAI1C,KAAqBD,GAC1CF,aAAc,IAAIG,KAAqBD,KAAsBF,GAC7Dj9B,QAAS,IAAIo9B,KAAqBH,GAClCyG,QAAS,CAAC,EAAAC,oB,2BAEDgrB,GAAA,EAAAA,gB,wbCnEb,SAAYC,GACR,mBACA,iBACA,qBACA,iBAJJ,CAAY,EAAAA,eAAA,EAAAA,aAAY,KAOxB,SAAYC,GACR,mBACA,yBACA,+BAHJ,CAAY,EAAAA,YAAA,EAAAA,UAAS,KAMrB,SAAYC,GACR,yBACA,mBACA,2BACA,6BAJJ,CAAY,EAAAA,eAAA,EAAAA,aAAY,KAOxB,SAAYC,GACR,+BACA,2BACA,6BACA,uBAJJ,CAAY,EAAAA,wBAAA,EAAAA,sBAAqB,KAOjC,SAAYC,GACR,yBACA,6BACA,6BACA,iCACA,yBALJ,CAAY,EAAAA,sBAAA,EAAAA,oBAAmB,KAQ/B,SAAYC,GACR,6BACA,2BACA,qBACA,uBACA,uCALJ,CAAY,EAAAA,2BAAA,EAAAA,yBAAwB,KAQpC,SAAYC,GACR,mBACA,uBACA,iBAHJ,CAAY,EAAAA,kBAAA,EAAAA,gBAAe,KAM3B,SAAYC,GACR,mBACA,uBAFJ,CAAY,EAAAA,2BAAA,EAAAA,yBAAwB,KAKpC,SAAYC,GACR,+CACA,mCACA,2CACA,2CACA,yCACA,qCACA,6CACA,mCACA,2CACA,mCAVJ,CAAY,EAAAA,4BAAA,EAAAA,0BAAyB,KAarC,SAAYC,GACR,iBACA,2BAFJ,CAAY,EAAAA,qBAAA,EAAAA,mBAAkB,KAK9B,SAAYC,GACR,6BACA,yCACA,qBACA,2CACA,iBACA,iBACA,iBACA,iBACA,iBACA,kBACA,kBACA,kBACA,gCACA,4BACA,8BACA,gCACA,kBACA,sBACA,0CACA,0CACA,4CACA,sCACA,wDACA,wCACA,4BACA,gCACA,kCACA,wDACA,sCACA,4CACA,8CACA,mDACA,mDACA,iCACA,uCACA,yCApCJ,CAAY,EAAAA,iBAAA,EAAAA,eAAc,KAuC1B,SAAYC,GACR,mBACA,yBACA,mBAHJ,CAAY,EAAAA,mBAAA,EAAAA,iBAAgB,KAM5B,SAAYC,GACR,+CACA,2CACA,iCACA,mBACA,iBACA,2BACA,qBACA,iCACA,uBACA,iCACA,oDACA,0BACA,oDACA,sCACA,4BAfJ,CAAY,EAAAA,mBAAA,EAAAA,iBAAgB,KAkB5B,SAAYC,GACR,yBACA,iBACA,iBACA,iBACA,uCACA,+BACA,iCACA,qBACA,qCATJ,CAAY,EAAAA,WAAA,EAAAA,SAAQ,KAYpB,SAAYC,GACR,+CACA,6CACA,uCACA,2CACA,6CACA,qCACA,uBACA,2CACA,uCACA,uBACA,sDACA,oCACA,gDACA,4BACA,wBACA,0BACA,0CACA,sCACA,kCACA,8BACA,4BACA,0CACA,sCACA,wCACA,8CACA,oDACA,sCACA,sCACA,0CACA,oCACA,4CACA,oCACA,oCACA,wCACA,0DACA,0DACA,gEACA,4DACA,0CACA,0CACA,8CACA,gEA1CJ,CAAY,EAAAA,yBAAA,EAAAA,uBAAsB,KA6ClC,SAAYC,GACR,mBACA,6BACA,+CACA,2DAJJ,CAAY,EAAAA,gBAAA,EAAAA,cAAa,KAOzB,SAAYC,GACR,uBACA,2BACA,yBAHJ,CAAY,EAAAA,0BAAA,EAAAA,wBAAuB,KAMnC,SAAYC,GACR,+BACA,mBACA,2BACA,yBAJJ,CAAY,EAAAA,aAAA,EAAAA,WAAU,M,sGC7MtB,SAAYrkC,GACR,yBACA,yBACA,uBACA,wBACA,4B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,QAAW,CACP,CACI,MAAS,UAIrB,CACI,YAAe,8BACf,YAAe,mBACf,QAAW,CACP,CACI,UAAa,SAIzB,CACI,YAAe,YACf,YAAe,WACf,QAAW,CACP,CACI,MAAS,aAIrB,CACI,YAAe,qBACf,YAAe,WACf,QAAW,CACP,CACI,WAAc,QAElB,CACI,UAAa,MAEjB,CACI,WAAc,SAI1B,CACI,YAAe,oBACf,YAAe,mBACf,QAAW,CACP,CACI,WAAc,QAElB,CACI,UAAa,SAIzB,CACI,YAAe,oBACf,YAAe,qBACf,QAAW,CACP,CACI,WAAc,QAElB,CACI,UAAa,OAEjB,CACI,OAAU,OAItB,CACI,YAAe,oBACf,YAAe,cACf,QAAW,CACP,CACI,WAAc,UAI1B,CACI,YAAe,MACf,YAAe,WACf,QAAW,CACP,CACI,WAAc,QAElB,CACI,UAAa,QAIzB,CACI,YAAe,MACf,YAAe,SACf,QAAW,CACP,CACI,WAAc,QAElB,CACI,UAAa,OAIzB,CACI,YAAe,iBACf,YAAe,WACf,QAAW,CACP,CACI,UAAa,MAEjB,CACI,WAAc,UAI1B,CACI,YAAe,WACf,YAAe,WACf,QAAW,CACP,CACI,MAAS,WAEb,CACI,WAAc,MAElB,CACI,WAAc,OAElB,CACI,UAAa,QAIzB,CACI,YAAe,WACf,YAAe,SACf,QAAW,CACP,CACI,WAAc,MAElB,CACI,UAAa,MAIzB,CACI,YAAe,OACf,YAAe,MACf,QAAW,CACP,CACI,UAAa,MAIzB,CACI,YAAe,eACf,YAAe,WACf,QAAW,CACP,CACI,MAAS,WAEb,CACI,WAAc,UAI1B,CACI,YAAe,gBACf,YAAe,WACf,QAAW,CACP,CACI,MAAS,WAEb,CACI,WAAc,QAElB,CACI,UAAa,QAIzB,CACI,YAAe,gBACf,YAAe,kBACf,QAAW,CACP,CACI,UAAa,SAIzB,CACI,YAAe,aACf,YAAe,WACf,QAAW,CACP,CACI,MAAS,WAEb,CACI,UAAa,QAIzB,CACI,YAAe,aACf,YAAe,gBACf,QAAW,CACP,CACI,WAAc,QAElB,CACI,UAAa,MAEjB,CACI,MAAS,OAIrB,CACI,YAAe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CA,2BACA,iBACA,6BACA,qCACA,8BACA,4CACA,kDACA,kDACA,sDACA,4CACA,kDACA,kDACA,sDACA,4CACA,kCACA,8BACA,4CACA,kEACA,kCACA,wBACA,0BACA,oCACA,sCACA,kCACA,kCACA,kCACA,kCACA,8CACA,8DACA,8DACA,gEACA,wEACA,sCACA,oDACA,4CACA,4CACA,wCACA,wCACA,0DACA,oEACA,0CACA,0CACA,oDACA,oDACA,4CACA,0DACA,oEACA,oEACA,sEACA,wCACA,0CACA,oCACA,sDACA,kCACA,sCACA,4BACA,wCACA,0DACA,4DACA,oFACA,sFACA,gDACA,wEACA,wEACA,0EACA,0CACA,0CACA,kEACA,kEACA,oEACA,0CACA,kEACA,kEACA,oEACA,8CACA,gDACA,gDACA,kCACA,8CACA,0CACA,oDACA,wDACA,gEACA,oEACA,kEACA,8DACA,4DACA,8BACA,8DACA,+DACA,qEACA,uEACA,uEACA,yEACA,uEACA,uEACA,yEACA,uEACA,uEACA,yEACA,uEACA,uEACA,yEACA,iFACA,uFACA,iFACA,uFACA,2CACA,6BACA,iCACA,2CACA,uCACA,mCACA,uCACA,yCACA,qCACA,iDACA,6CACA,6CA7HJ,CAAYA,EAAA,EAAAA,sBAAA,EAAAA,oBAAmB,M,mqBCpC/B,cACA,OAGA,SAEA,QACA,OAIA,IAAaG,EAAb,MACI,YACqBjrD,EACA5nF,GADA,KAAA4nF,aACA,KAAA5nF,iBAGrB,oBAAoB8V,GAAkB,GAClC,MAAMjrB,EAAU,CAAE7D,OAAQ,IAK1B,OAHA6D,EAAQ7D,OAAmB,WAAI,GAC/B6D,EAAQ7D,OAAwB,gBAAI8uB,EAE7B,EAAA8yE,cAAcljG,KAAKkiG,WAAWlkG,IAAmB,yBAA0BmH,IAGtF,6BAA6BsR,EAAmB2Z,GAAkB,GAC9D,MAAMjrB,EAAU,CAAE7D,OAAQ,IAK1B,OAHA6D,EAAQ7D,OAAmB,WAAI,GAC/B6D,EAAQ7D,OAAwB,gBAAI8uB,EAE7B,EAAA8yE,cAAcljG,KAAKkiG,WAAWlkG,IAAiB,0BAA0ByY,IAAatR,IAG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","file":"main.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t1: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + ({}[chunkId]||chunkId) + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// The chunk loading function for additional chunks\n \t// Since all referenced chunks are already included\n \t// in this file, this function is empty here.\n \t__webpack_require__.e = function requireEnsure() {\n \t\treturn Promise.resolve();\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([1215,0]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import { ICombinedPreferences } from \"@interfaces/ICombinedPreferences\";\r\nimport { ConstantsService } from \"@services/constantsService\";\r\nimport copy from \"fast-copy/dist/fast-copy.esm.js\";\r\nimport * as Polyglot from 'node-polyglot';\r\n\r\nexport enum PluralizationKey {\r\n One = \"one\",\r\n Zero = \"zero\",\r\n Other = \"other\",\r\n}\r\n\r\nexport interface IPhraseLocale {\r\n id: string;\r\n name: string;\r\n code: string;\r\n\r\n default: boolean;\r\n rtl: boolean;\r\n pluralForms: string[];\r\n\r\n createdAt: string;\r\n updatedAt: string;\r\n\r\n statistics?: IPhraseLocaleStatistics;\r\n}\r\n\r\nexport interface IPhraseLocaleStatistics {\r\n keys_total_count: number;\r\n keys_untranslated_count: number;\r\n words_total_count: number;\r\n translations_completed_count: number;\r\n translations_unverified_count: number;\r\n unverified_words_count: number;\r\n missing_words_count: number;\r\n\r\n // --\r\n\r\n translatedCount: number;\r\n translatedCountProgress: number;\r\n translationProgressClass: string;\r\n\r\n verificationCount: number;\r\n verificationCountProgress: number;\r\n verificationProgressClass: string;\r\n}\r\n\r\nexport interface ITranslationLocale {\r\n Locale: string;\r\n Title: string;\r\n}\r\n\r\nexport class TranslationService {\r\n\r\n polyglot: Polyglot;\r\n userOptions: ICombinedPreferences;\r\n\r\n userLanguageCode: string = 'en';\r\n\r\n languageJsonFile: any;\r\n\r\n translationValues: any[] = [];\r\n languagePluralisation: string[][] = [];\r\n\r\n isVisualizerEnabled: boolean;\r\n readonly visualizerStorageKey: string = \"translationsVisualizerEnabled\";\r\n\r\n static $inject = [\"$http\", \"constantsService\"]\r\n\r\n constructor(\r\n private readonly $http: angular.IHttpService,\r\n private readonly constantsService: ConstantsService) {\r\n this.isVisualizerEnabled = localStorage.getItem(this.visualizerStorageKey) === \"enabled\";\r\n }\r\n\r\n enableVisualizer(): void {\r\n localStorage.setItem(this.visualizerStorageKey, \"enabled\");\r\n this.isVisualizerEnabled = true;\r\n }\r\n\r\n disableVisualizer(): void {\r\n localStorage.setItem(this.visualizerStorageKey, \"disabled\");\r\n this.isVisualizerEnabled = false;\r\n }\r\n\r\n initialise(): angular.IPromise {\r\n this.getLanguageCode();\r\n\r\n return this.getListOfLocales().then((translationLocales: ITranslationLocale[]) => {\r\n\r\n if (!translationLocales?.length) {\r\n alert(\"There was a problem obtaining necessary language files. Click Ok to refresh the page and try again.\")\r\n window.location.reload(true);\r\n return;\r\n }\r\n\r\n let matchingLocale = translationLocales.find(translationLocale => translationLocale.Locale === this.userLanguageCode);\r\n\r\n if (!matchingLocale) {\r\n matchingLocale = translationLocales.find(translationLocale => translationLocale.Locale === \"en\") || translationLocales[0];\r\n }\r\n\r\n return this.getUserLanguageJsonFile(matchingLocale).then(json => {\r\n this.languageJsonFile = json;\r\n\r\n this.initialiseLanguagePluralistion();\r\n this.setPolyglot();\r\n });\r\n });\r\n }\r\n\r\n t(phrase: string, params?: number | string | Polyglot.InterpolationOptions): string {\r\n return this.translate(phrase, params);\r\n }\r\n\r\n translate(phrase: string, params?: number | string | Polyglot.InterpolationOptions): string {\r\n if (!this.languageJsonFile) {\r\n console.error(\"Translation Error 1: No translation file available\");\r\n return \"T Error 1\";\r\n }\r\n\r\n if (!phrase) {\r\n console.error(`Translation Error 2: No phrase provided`);\r\n return \"T Error 2\";\r\n }\r\n\r\n if (this.phraseHasUnknownValues(phrase)) {\r\n console.error(`Translation Error 3: Unknown phrase parameter value for ${phrase}`);\r\n return \"T Error 3\";\r\n }\r\n\r\n let translatedString = \"\";\r\n\r\n if (params != null) {\r\n if (typeof params == \"number\") {\r\n const param = Number(params);\r\n const pluralizationKey = this.getPluralizationKey(param);\r\n const pluralizedPhrase = this.getPluralizedPhrase(phrase, pluralizationKey);\r\n\r\n phrase = (pluralizedPhrase) ? pluralizedPhrase : phrase;\r\n\r\n translatedString = this.polyglot.t(phrase, { 0: param });\r\n\r\n } else if (Array.isArray(params)) {\r\n // If we are an array, we pass it in, arrays act like parameters to the translation\r\n // E.g. if we translate \"Hello {0} welcome to {1}\" then the params might be [\"Chris\",\"Verilocation\"]\r\n translatedString = this.polyglot.t(phrase, params);\r\n\r\n } else {\r\n translatedString = this.polyglot.t(phrase, { 0: params });\r\n }\r\n }\r\n\r\n if (!translatedString) {\r\n translatedString = this.polyglot.t(phrase);\r\n }\r\n\r\n if (this.userLanguageCode == \"qa\") {\r\n return `#${translatedString}#`;\r\n }\r\n\r\n if (this.isVisualizerEnabled) {\r\n return `«${translatedString}»`;\r\n }\r\n\r\n return translatedString;\r\n }\r\n\r\n tEnum(type: T, enumName: string, value: number, nullCaseFallback = \"Unknown\"): string {\r\n return this.translateEnum(type, enumName, value, nullCaseFallback);\r\n }\r\n\r\n tEnumTitle(enumName: string) {\r\n return this.t(`${enumName}Enum.Title`);\r\n }\r\n\r\n translateEnum(type: T, enumName: string, value: number, nullCaseFallback = \"Unknown\"): string {\r\n\r\n if (typeof value === \"undefined\" || value == null || !type[value]) {\r\n return nullCaseFallback;\r\n }\r\n\r\n var enumKey = enumName.endsWith(\"Enum\")\r\n ? `${enumName}.${type[value]}`\r\n : `${enumName}Enum.${type[value]}`;\r\n\r\n if (this.polyglot.has(enumKey)) {\r\n return this.t(enumKey);\r\n }\r\n\r\n return type[value];\r\n }\r\n\r\n getUserLanguageJsonFile(locale: ITranslationLocale): angular.IPromise {\r\n\r\n if (!locale) {\r\n console.error(\"getUserLanguageJsonFile has no locale\");\r\n return null;\r\n }\r\n\r\n return this\r\n .$http({\r\n method: \"GET\",\r\n url: `/assets/languages/${locale.Locale}.json`\r\n })\r\n .then(response => {\r\n return response.data;\r\n }).catch((error) => {\r\n if (error?.status === 404) {\r\n localStorage.setItem('userSelectedLanguageCode', \"en\");\r\n }\r\n });\r\n }\r\n\r\n getListOfLocales(): angular.IPromise {\r\n\r\n return this\r\n .$http({\r\n method: \"GET\",\r\n url: `/assets/languages/locales.json`,\r\n cache: true\r\n })\r\n .then((response: any) => {\r\n\r\n let translationLocales: ITranslationLocale[] = response?.data?.locales;\r\n\r\n if (!translationLocales?.length) {\r\n console.warn(\"No language locales available\");\r\n return;\r\n }\r\n\r\n translationLocales.sort((l1, l2) => l1.Title.localeCompare(l2.Title));\r\n\r\n if (this.constantsService.getIsProduction()) {\r\n return translationLocales.filter(translationLocale => translationLocale.Locale != \"qa\");\r\n }\r\n\r\n return translationLocales;\r\n\r\n }).catch((error: any) => {\r\n console.warn(\"Failed to get language locales list\");\r\n return null;\r\n });\r\n }\r\n\r\n getListOfLocalesRemote(): angular.IPromise {\r\n return this\r\n .$http({\r\n method: \"GET\",\r\n url: `/api/translations/locales/remote`\r\n })\r\n .then(locales => {\r\n return locales.data;\r\n });\r\n }\r\n\r\n getLocaleDetails(locale: IPhraseLocale): angular.IPromise {\r\n return this\r\n .$http({\r\n method: \"GET\",\r\n url: `/api/translations/${locale.id}/details`\r\n })\r\n .then(response => {\r\n return response.data;\r\n });\r\n }\r\n\r\n //-----------------------\r\n\r\n private getPluralizationKey(params: number): PluralizationKey {\r\n switch (params) {\r\n case 0:\r\n return PluralizationKey.Zero;\r\n\r\n case 1:\r\n return PluralizationKey.One;\r\n\r\n default:\r\n return PluralizationKey.Other;\r\n }\r\n }\r\n\r\n private getPluralizedPhrase(phrase: string, pluralizationKey: PluralizationKey): string {\r\n const pluralizedPhrase = `${phrase}.${pluralizationKey}`;\r\n\r\n return (this.polyglot.has(pluralizedPhrase)) ? pluralizedPhrase : null;\r\n }\r\n\r\n private phraseHasUnknownValues(phrase: string): boolean {\r\n const phraseEndsWithMissingKeyValue = phrase.indexOf(\".\") === phrase.length - 1;\r\n const phraseHasUndefinedKeyValue = phrase.indexOf(\".undefined\") !== -1;\r\n\r\n return phraseEndsWithMissingKeyValue || phraseHasUndefinedKeyValue;\r\n }\r\n\r\n private getLanguageCode(): void {\r\n const userSetLanguage = localStorage.getItem('userSelectedLanguageCode');\r\n\r\n this.userLanguageCode = (userSetLanguage) ? userSetLanguage : \"en\";\r\n }\r\n\r\n private setPolyglot() {\r\n const locale = this.userLanguageCode;\r\n const phrases = this.languageJsonFile;\r\n const fixedPhrases = this.fixParameterProblem(phrases);\r\n\r\n this.polyglot = new Polyglot({ locale, phrases: fixedPhrases });\r\n }\r\n\r\n private initialiseLanguagePluralistion() {\r\n //zero, one, few, many, other - phrase plurals\r\n this.languagePluralisation['fr'] = [];\r\n this.languagePluralisation['fr'][0] = \"zero\";\r\n this.languagePluralisation['fr'][1] = \"zero\";\r\n\r\n this.languagePluralisation['en'] = [];\r\n this.languagePluralisation['en'][0] = \"zero\";\r\n this.languagePluralisation['en'][1] = \"one\";\r\n\r\n this.languagePluralisation['sp'] = copy(this.languagePluralisation['en']);\r\n this.languagePluralisation['no'] = copy(this.languagePluralisation['en']);\r\n this.languagePluralisation['fi'] = copy(this.languagePluralisation['en']);\r\n this.languagePluralisation['nl'] = copy(this.languagePluralisation['en']);\r\n\r\n // polish set to en plurals just for testing\r\n this.languagePluralisation['pl'] = copy(this.languagePluralisation['en']);\r\n\r\n //test set up for testing purposes\r\n this.languagePluralisation['qa'] = copy(this.languagePluralisation['en']);\r\n\r\n //this.languagePluralisation['pl'] = [];\r\n this.languagePluralisation['se'] = [];\r\n this.languagePluralisation['dk'] = [];\r\n }\r\n\r\n private createPhrasePlurals(phrase: string, params: number): string {\r\n try {\r\n var pluralForm = this.languagePluralisation[this.userLanguageCode][params] || \"other\";\r\n\r\n return `${phrase}.${pluralForm}`;\r\n }\r\n catch (e) {\r\n console.log(\"createPhrasePlurals failed\", phrase, params);\r\n console.error(\"createPhrasePlurals failed\", e);\r\n }\r\n }\r\n\r\n private getDefaultLocale(): angular.IPromise {\r\n return this.getListOfLocales().then(locales => {\r\n return locales.find(l => l.Locale == \"en\");\r\n });\r\n }\r\n\r\n private getMainLanguageJson(): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/assets/languages/en.json`,\r\n method: \"GET\",\r\n cache: false\r\n })\r\n .then(response => {\r\n return response.data;\r\n });\r\n }\r\n\r\n private fixParameterProblem(phrases: Object): Object {\r\n let phrasesString = JSON.stringify(phrases);\r\n\r\n const firstFixRegEx = /([a-zA-Z0-9.,:-])\\%\\s\\{/g;\r\n const secondFixRegEx = /%\\s\\{/g;\r\n\r\n phrasesString = phrasesString.replace(firstFixRegEx, \"$1 %{\");\r\n phrasesString = phrasesString.replace(secondFixRegEx, \"%{\");\r\n\r\n return JSON.parse(phrasesString);\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { DateRange } from \"@app/enum/DateRange.enum\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { IDateRange } from \"@app/interfaces/IDateRange\";\r\nimport { TranslationService } from \"./translation.service\";\r\n\r\nexport interface IDateFormatOptions {\r\n longMonth?: boolean;\r\n excludeYear?: boolean;\r\n dateTime?: boolean;\r\n timeOnly?: boolean;\r\n second?: 'numeric' | '2-digit';\r\n stringDayOnly?: boolean;\r\n}\r\n\r\nexport interface IDurationFormatOptions {\r\n style: \"long\" | \"narrow\"\r\n}\r\n\r\nexport interface IDurationFormatDuration {\r\n years?: number,\r\n months?: number,\r\n weeks?: number,\r\n days?: number,\r\n hours?: number,\r\n minutes?: number,\r\n seconds?: number,\r\n milliseconds?: number\r\n}\r\n\r\nexport enum DateUnit {\r\n Ms,\r\n Sec,\r\n Min,\r\n Hour,\r\n Day,\r\n Week,\r\n Month,\r\n Year\r\n}\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DateService {\r\n\r\n locale: string;\r\n\r\n constructor(private readonly translationService: TranslationService) {\r\n this.locale = this.getUserLocale();\r\n }\r\n\r\n formatDate(date: Date | string, options?: IDateFormatOptions): string {\r\n if (!date) {\r\n return this.translationService.t(\"Common.Never\");\r\n }\r\n\r\n let parsedDate = new Date(date);\r\n\r\n let dateOptions: Intl.DateTimeFormatOptions = { day: \"numeric\", month: \"short\", year: \"numeric\" };\r\n let timeOptions: Intl.DateTimeFormatOptions = { hour12: false, hour: 'numeric', minute: 'numeric', second: options?.second };\r\n\r\n if (!options) {\r\n return parsedDate.toLocaleDateString(this.locale, dateOptions);\r\n }\r\n\r\n if (options.excludeYear) {\r\n dateOptions.year = undefined;\r\n }\r\n\r\n if (options.longMonth) {\r\n dateOptions.month = \"long\";\r\n }\r\n\r\n if (options.dateTime) {\r\n const dateString = parsedDate.toLocaleDateString(this.locale, dateOptions);\r\n let timeString = parsedDate.toLocaleTimeString(this.locale, timeOptions);\r\n timeString = this.setMidnightToZeroes(timeString);\r\n\r\n return `${timeString}, ${dateString}`;\r\n }\r\n\r\n if (options.timeOnly) {\r\n let timeString = parsedDate.toLocaleTimeString(this.locale, timeOptions);\r\n timeString = this.setMidnightToZeroes(timeString);\r\n\r\n return timeString;\r\n }\r\n\r\n if (options.stringDayOnly) {\r\n return this.getDayOfWeek(parsedDate.getDay());\r\n }\r\n\r\n\r\n return parsedDate.toLocaleDateString(this.locale, dateOptions);\r\n }\r\n\r\n formatTime(time: string): number {\r\n var value = parseInt(time);\r\n\r\n return isNaN(value) ? 0 : value;\r\n }\r\n\r\n getLocalTimezone(): string {\r\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\r\n }\r\n\r\n getUTCOffsetLabel(): string {\r\n const now: Date = new Date();\r\n const offsetMinutes: number = now.getTimezoneOffset();\r\n const symbol: string = (offsetMinutes > 0) ? \"-\" : \"+\";\r\n const offsetHours: number = Math.abs(Math.floor(offsetMinutes / 60));\r\n\r\n return `UTC${symbol}${offsetHours}`;\r\n }\r\n\r\n getDurationFromTimeSpan(timespanValue: string): IDurationFormatDuration {\r\n var array = timespanValue.split(\":\");\r\n\r\n return {\r\n hours: this.formatTime(array[0]),\r\n minutes: this.formatTime(array[1]),\r\n seconds: this.formatTime(array[2])\r\n }\r\n }\r\n\r\n formatDatesFromAndTo(dateFrom: Date | string, dateTo: Date | string): string {\r\n if (this.isSameDate(dateFrom, dateTo)) {\r\n return this.translationService.t('VeriDateService.FromTime1ToTime2OnDate', [this.formatDate(dateFrom, { timeOnly: true }), this.formatDate(dateTo, { timeOnly: true }), this.formatDate(dateFrom)])\r\n }\r\n\r\n return this.translationService.t('VeriDateService.FromDate1ToDate2', [this.formatDate(dateFrom), this.formatDate(dateTo)]);\r\n }\r\n\r\n relativeTime(date: Date | string): string {\r\n\r\n date = new Date(date);\r\n\r\n const locale = this.getUserLocale();\r\n\r\n const diffMs = this.getDiff(new Date(), date, DateUnit.Ms);\r\n const timeAgoFormat = new Intl.RelativeTimeFormat(locale, { style: 'long' });\r\n\r\n if (isNaN(diffMs)) {\r\n return this.translationService.t(\"VeriDateService.Never\");\r\n }\r\n\r\n if (Math.abs(this.msToDateUnit(diffMs, DateUnit.Min)) < 1) {\r\n return this.translationService.t(\"VeriDateService.JustNow\");\r\n }\r\n if (Math.abs(this.msToDateUnit(diffMs, DateUnit.Year)) > 5) { // older than 5 years\r\n return this.translationService.t(\"VeriDateService.LongTimeAgo\");\r\n }\r\n\r\n let diff = this.customRound(this.msToDateUnit(diffMs, DateUnit.Min));\r\n\r\n if (Math.abs(this.msToDateUnit(diffMs, DateUnit.Year)) > 1) {\r\n diff = this.customRound(this.msToDateUnit(diffMs, DateUnit.Year));\r\n return timeAgoFormat.format(diff, 'year')\r\n }\r\n\r\n if (Math.abs(this.msToDateUnit(diffMs, DateUnit.Day)) > 1) {\r\n diff = this.customRound(this.msToDateUnit(diffMs, DateUnit.Day));\r\n return timeAgoFormat.format(diff, 'day')\r\n }\r\n if (Math.abs(this.msToDateUnit(diffMs, DateUnit.Hour)) > 1) {\r\n diff = this.customRound(this.msToDateUnit(diffMs, DateUnit.Hour));\r\n return timeAgoFormat.format(diff, 'hour')\r\n }\r\n if (Math.abs(this.msToDateUnit(diffMs, DateUnit.Min)) > 1) {\r\n diff = this.customRound(this.msToDateUnit(diffMs, DateUnit.Min));\r\n return timeAgoFormat.format(diff, 'minute')\r\n }\r\n }\r\n\r\n convertToMilliseconds(unitOfTime: DateUnit, value: number): number {\r\n let milliseconds = 0;\r\n\r\n switch (unitOfTime) {\r\n case DateUnit.Week:\r\n milliseconds = value * 7 * 24 * 60 * 60 * 1000;\r\n break;\r\n case DateUnit.Day:\r\n milliseconds = value * 24 * 60 * 60 * 1000;\r\n break;\r\n case DateUnit.Hour:\r\n milliseconds = value * 60 * 60 * 1000;\r\n break;\r\n case DateUnit.Min:\r\n milliseconds = value * 60 * 1000;\r\n break;\r\n case DateUnit.Sec:\r\n milliseconds = value * 1000;\r\n break;\r\n case DateUnit.Ms:\r\n return value;\r\n break;\r\n default:\r\n throw new Error('Invalid date unit');\r\n }\r\n\r\n return milliseconds;\r\n }\r\n\r\n formatTimeFromMilliseconds(milliseconds: number, format: IDurationFormatOptions = { style: \"long\" }): string {\r\n if (!milliseconds && milliseconds != 0) {\r\n return;\r\n }\r\n\r\n const millisecondsInSecond = 1000;\r\n const millisecondsInMinute = 60 * millisecondsInSecond;\r\n const millisecondsInHour = 60 * millisecondsInMinute;\r\n const millisecondsInDay = 24 * millisecondsInHour;\r\n\r\n const days = Math.floor(milliseconds / millisecondsInDay);\r\n const remainingMilliseconds = milliseconds % millisecondsInDay;\r\n\r\n const hours = Math.floor(remainingMilliseconds / millisecondsInHour);\r\n const remainingMillisecondsAfterHours = remainingMilliseconds % millisecondsInHour;\r\n\r\n const minutes = Math.floor(remainingMillisecondsAfterHours / millisecondsInMinute);\r\n const remainingMillisecondsAfterMinutes = remainingMillisecondsAfterHours % millisecondsInMinute;\r\n\r\n const seconds = Math.floor(remainingMillisecondsAfterMinutes / millisecondsInSecond);\r\n\r\n var duration: IDurationFormatDuration = {\r\n days: days,\r\n hours: hours, minutes: minutes,\r\n seconds: seconds,\r\n milliseconds: milliseconds\r\n };\r\n\r\n // Pass zero years and months, as we have leap years + different days per month.\r\n return this.getDurationFormatting(duration, format);\r\n }\r\n\r\n formatDuration(date1: Date | string, date2: Date | string, format: IDurationFormatOptions = { style: \"long\" }): string {\r\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DurationFormat is an option but still in experimental stages as of July 2023\r\n if (this.date1IsAfterDate2(date1, date2)) {\r\n console.warn(\"Date 1 is after Date 2, unable to format duration\");\r\n return;\r\n }\r\n\r\n date1 = new Date(date1);\r\n date2 = new Date(date2);\r\n\r\n const diffMs = this.getDiff(date1, date2, DateUnit.Ms);\r\n\r\n var duration: IDurationFormatDuration = {\r\n years: this.getYearsDifference(date1, date2),\r\n months: this.getMonthsDifference(date1, date2) % 12,\r\n days: this.getDaysDifference(date1, date2),\r\n hours: Math.abs(this.msToDateUnit(diffMs, DateUnit.Hour)) % 24,\r\n minutes: Math.abs(this.msToDateUnit(diffMs, DateUnit.Min)) % 60,\r\n seconds: Math.abs(this.msToDateUnit(diffMs, DateUnit.Sec)) % 60\r\n }\r\n\r\n return this.getDurationFormatting(duration, format);\r\n }\r\n\r\n getDurationFormatting(duration: IDurationFormatDuration, format: IDurationFormatOptions = { style: \"long\" }): string {\r\n var durationString = \"\";\r\n var executionCount = 0;\r\n const maxExecutionCount = 2;\r\n\r\n var createSeparatorIfRequired = (durationString) => {\r\n if (executionCount > 1) {\r\n durationString = durationString + \", \";\r\n }\r\n\r\n return durationString;\r\n }\r\n\r\n if (duration.years > 0 && executionCount++ <= maxExecutionCount) {\r\n durationString += format.style == \"narrow\"\r\n ? `${Math.floor(duration.years)}y`\r\n : `${this.translationService.t(\"VeriDateService.Years\", Math.floor(duration.years))}`;\r\n }\r\n\r\n if (duration.months > 0 && executionCount++ <= maxExecutionCount) {\r\n durationString = createSeparatorIfRequired(durationString);\r\n\r\n durationString += format.style == \"narrow\"\r\n ? `${Math.floor(duration.months)}m`\r\n : `${this.translationService.t(\"VeriDateService.Months\", Math.floor(duration.months))}`;\r\n }\r\n\r\n if (duration.days > 0 && executionCount++ <= maxExecutionCount) {\r\n durationString = createSeparatorIfRequired(durationString);\r\n\r\n durationString += format.style == \"narrow\"\r\n ? `${Math.floor(duration.days)}d`\r\n : `${this.translationService.t(\"VeriDateService.Days\", Math.floor(duration.days))}`;\r\n }\r\n\r\n if (duration.hours > 0 && executionCount++ <= maxExecutionCount) {\r\n durationString = createSeparatorIfRequired(durationString);\r\n\r\n durationString += format.style == \"narrow\"\r\n ? `${Math.floor(duration.hours)}h`\r\n : `${this.translationService.t(\"VeriDateService.Hours\", Math.floor(duration.hours))}`;\r\n }\r\n\r\n if (duration.minutes > 0 && executionCount++ <= maxExecutionCount) {\r\n durationString = createSeparatorIfRequired(durationString);\r\n\r\n durationString += format.style == \"narrow\"\r\n ? `${Math.floor(duration.minutes)}m`\r\n : `${this.translationService.t(\"VeriDateService.Minutes\", Math.floor(duration.minutes))}`;\r\n }\r\n\r\n if (duration.seconds > 0 && executionCount++ <= maxExecutionCount) {\r\n durationString = createSeparatorIfRequired(durationString);\r\n\r\n durationString += format.style == \"narrow\"\r\n ? `${Math.floor(duration.seconds)}s`\r\n : `${this.translationService.t(\"VeriDateService.Seconds\", Math.floor(duration.seconds))}`;\r\n }\r\n\r\n if (duration.milliseconds < 1000 && executionCount++ <= maxExecutionCount) {\r\n durationString = createSeparatorIfRequired(durationString);\r\n durationString += format.style == \"narrow\"\r\n ? `${Math.floor(duration.milliseconds)}ms`\r\n : `${this.translationService.t(\"VeriDateService.Milliseconds\", duration.milliseconds)}`;\r\n }\r\n\r\n return durationString;\r\n }\r\n\r\n getYearsDifference(date1: Date | string, date2: Date | string): number {\r\n date1 = new Date(date1);\r\n date2 = new Date(date2);\r\n\r\n let years = date2.getFullYear() - date1.getFullYear();\r\n\r\n if (years > 0 && (date2.getMonth() < date1.getMonth() || date2.getMonth() == date1.getMonth() && date1.getDate() - date2.getDate() > 0)) {\r\n years--;\r\n }\r\n\r\n return years;\r\n }\r\n\r\n getMonthsDifference(date1: Date | string, date2: Date | string): number {\r\n date1 = new Date(date1);\r\n date2 = new Date(date2);\r\n\r\n let months: number = date2.getMonth() - date1.getMonth();\r\n\r\n if (months >= 0 && date1.getDate() - date2.getDate() <= 0) {\r\n return months;\r\n }\r\n\r\n if (months > 0 && date1.getDate() - date2.getDate() > 0) {\r\n months--;\r\n }\r\n else {\r\n months = date2.getMonth() + (11 - date1.getMonth());\r\n }\r\n\r\n return months;\r\n }\r\n\r\n getDaysDifference(date1: Date | string, date2: Date | string): number {\r\n date1 = new Date(date1);\r\n date2 = new Date(date2);\r\n\r\n const timeDifference: number = date2.getTime() - date1.getTime();\r\n const daysDifference: number = timeDifference / (1000 * 60 * 60 * 24);\r\n\r\n if (daysDifference >= 0) {\r\n return daysDifference;\r\n }\r\n\r\n const daysInMonth = (year, month) => new Date(year, month, 0).getDate();\r\n const numberOfDaysInPreviousMonth = daysInMonth(date2.getFullYear(), date2.getMonth());\r\n\r\n const days = date2.getDate() + (numberOfDaysInPreviousMonth - date1.getDate());\r\n\r\n return days;\r\n }\r\n\r\n getDiff(date1: Date | string, date2: Date | string, unit: DateUnit): number {\r\n\r\n date1 = new Date(date1);\r\n date2 = new Date(date2);\r\n\r\n var ms = date2.getTime() - date1.getTime();\r\n\r\n // Add one millisecond to account for end-of-day 23:59:59\r\n return this.msToDateUnit(ms + 1, unit)\r\n }\r\n\r\n addOrSubtractTime(date: Date | string, amount: number, unit: DateUnit): Date {\r\n if (!this.allDatesAreValid([new Date(date)])) {\r\n return;\r\n }\r\n\r\n const dateMs = new Date(date).getTime();\r\n\r\n switch (unit) {\r\n case DateUnit.Ms:\r\n return new Date(dateMs + amount);\r\n\r\n case DateUnit.Sec:\r\n return new Date(dateMs + (amount * 1000));\r\n\r\n case DateUnit.Min:\r\n return new Date(dateMs + (amount * 1000 * 60));\r\n\r\n case DateUnit.Hour:\r\n return new Date(dateMs + (amount * 1000 * 60 * 60));\r\n\r\n case DateUnit.Day:\r\n let dD = new Date(date);\r\n dD.setDate(dD.getDate() + amount);\r\n return dD;\r\n\r\n case DateUnit.Week:\r\n return new Date(dateMs + (amount * 1000 * 60 * 60 * 24 * 7));\r\n\r\n case DateUnit.Month:\r\n let mD = new Date(date);\r\n mD.setMonth(mD.getMonth() + amount);\r\n return mD;\r\n\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n dateIsBetweenDates(date: Date | string, start: Date | string, end: Date | string, includeStart?: boolean, includeEnd?: boolean) {\r\n const parsedDate = new Date(date);\r\n const parsedStart = new Date(start);\r\n const parsedEnd = new Date(end);\r\n\r\n if (!this.allDatesAreValid([parsedDate, parsedStart, parsedEnd])) {\r\n return;\r\n }\r\n\r\n let dateIsAfterStart = false;\r\n let dateIsBeforeEnd = false;\r\n\r\n if (includeStart) {\r\n dateIsAfterStart = parsedDate.getTime() >= parsedStart.getTime()\r\n }\r\n else {\r\n dateIsAfterStart = parsedDate.getTime() > parsedStart.getTime()\r\n }\r\n\r\n\r\n if (includeEnd) {\r\n dateIsBeforeEnd = parsedDate.getTime() <= parsedEnd.getTime();\r\n }\r\n else {\r\n dateIsBeforeEnd = parsedDate.getTime() < parsedEnd.getTime();\r\n }\r\n\r\n return dateIsAfterStart && dateIsBeforeEnd;\r\n }\r\n\r\n getStartOfDay(date: Date | string) {\r\n const parsedDate = new Date(date);\r\n\r\n if (!this.allDatesAreValid([parsedDate])) {\r\n return;\r\n }\r\n\r\n parsedDate.setHours(0, 0, 0, 0);\r\n return parsedDate;\r\n }\r\n\r\n getEndOfDay(date: Date | string): Date {\r\n const parsedDate = new Date(date);\r\n\r\n if (!this.allDatesAreValid([parsedDate])) {\r\n return;\r\n }\r\n\r\n parsedDate.setHours(23, 59, 59);\r\n return parsedDate;\r\n }\r\n\r\n getStartOfWeek(date: Date | string): Date {\r\n const parsedDate = new Date(date);\r\n\r\n if (!this.allDatesAreValid([parsedDate])) {\r\n return;\r\n }\r\n\r\n const dayOfWeek = parsedDate.getDay();\r\n\r\n const startOfWeekDate = this.addOrSubtractTime(parsedDate, -dayOfWeek + 1, DateUnit.Day);\r\n\r\n return new Date(this.getStartOfDay(startOfWeekDate));\r\n\r\n }\r\n\r\n getEndOfWeek(date: Date | string): Date {\r\n const parsedDate = new Date(date);\r\n\r\n if (!this.allDatesAreValid([parsedDate])) {\r\n return;\r\n }\r\n\r\n const daysToAdd = 7 - parsedDate.getDay();\r\n\r\n return new Date(this.addOrSubtractTime(parsedDate, daysToAdd, DateUnit.Day));\r\n }\r\n\r\n getStartOfMonth(date: Date | string): Date {\r\n const parsedDate = new Date(date);\r\n\r\n if (!this.allDatesAreValid([parsedDate])) {\r\n return;\r\n }\r\n\r\n parsedDate.setDate(1);\r\n\r\n return new Date(this.getStartOfDay(parsedDate));\r\n\r\n }\r\n\r\n getEndOfMonth(date: Date | string): Date {\r\n const parsedDate = new Date(date);\r\n\r\n if (!this.allDatesAreValid([parsedDate])) {\r\n return;\r\n }\r\n\r\n const endOfMonth = new Date(parsedDate.getFullYear(), parsedDate.getMonth() + 1, 0);\r\n\r\n return new Date(this.getEndOfDay(endOfMonth));\r\n }\r\n\r\n isSameDate(date1: Date | string, date2: Date | string, includeTime: boolean = false): boolean {\r\n\r\n if (!date1 || !date2) {\r\n return false;\r\n }\r\n\r\n const parsedDate1 = new Date(date1);\r\n const parsedDate2 = new Date(date2);\r\n\r\n if (!this.allDatesAreValid([parsedDate1, parsedDate2])) {\r\n return false;\r\n }\r\n\r\n const sameYear = parsedDate1.getFullYear() === parsedDate2.getFullYear();\r\n const sameMonth = parsedDate1.getMonth() === parsedDate2.getMonth();\r\n const sameDay = parsedDate1.getDate() === parsedDate2.getDate();\r\n\r\n if (includeTime) {\r\n const sameTime = Math.floor((parsedDate1.getTime() / 1000)) === Math.floor((parsedDate2.getTime() / 1000));\r\n\r\n return sameYear && sameMonth && sameDay && sameTime;\r\n }\r\n\r\n return sameYear && sameMonth && sameDay;\r\n }\r\n\r\n isSameMonth(date1: Date | string, date2: Date | string): boolean {\r\n\r\n const parsedDate1 = new Date(date1);\r\n const parsedDate2 = new Date(date2);\r\n\r\n if (!this.allDatesAreValid([parsedDate1, parsedDate2])) {\r\n return false;\r\n }\r\n\r\n const sameYear = parsedDate1.getFullYear() === parsedDate2.getFullYear();\r\n const sameMonth = parsedDate1.getMonth() === parsedDate2.getMonth();\r\n\r\n return sameYear && sameMonth;\r\n }\r\n\r\n date1IsAfterDate2(date1: Date | string, date2: Date | string, includeIsSame?: boolean): boolean {\r\n const parsedDate1 = new Date(date1);\r\n const parsedDate2 = new Date(date2);\r\n\r\n if (!this.allDatesAreValid([parsedDate1, parsedDate2])) {\r\n return false;\r\n }\r\n\r\n if (includeIsSame) {\r\n return parsedDate1.getTime() >= parsedDate2.getTime();\r\n }\r\n\r\n return parsedDate1.getTime() > parsedDate2.getTime();\r\n }\r\n\r\n isAfter(beforeDate: Date | string, afterDate: Date | string): boolean {\r\n return this.date1IsAfterDate2(beforeDate, afterDate)\r\n }\r\n\r\n allDatesAreValid(dates: Date[]): boolean {\r\n return !dates.some(date => isNaN(date.getTime()));\r\n }\r\n\r\n getLatestDate(dates: Date[]): Date {\r\n\r\n var parsedDates: Date[] = [];\r\n\r\n dates.forEach(d => parsedDates.push(new Date(d)));\r\n\r\n if (!this.allDatesAreValid(parsedDates)) {\r\n return null;\r\n }\r\n\r\n var latestDate = null\r\n\r\n parsedDates.forEach(d => {\r\n if (latestDate == null) {\r\n latestDate = d;\r\n return;\r\n }\r\n\r\n if (this.date1IsAfterDate2(d, latestDate)) {\r\n latestDate = d;\r\n }\r\n });\r\n\r\n return latestDate;\r\n }\r\n\r\n getDateWithSuffix(date: string | number): string {\r\n let dateAsNumber = Math.trunc(Number(date));\r\n if (dateAsNumber < 0 || dateAsNumber > 31) {\r\n console.error(date, \"is not a valid date\");\r\n return;\r\n }\r\n\r\n return this.getOrdinalSuffix(dateAsNumber);\r\n }\r\n\r\n getOrdinalSuffix(number: number) {\r\n\r\n const locale = localStorage.getItem('userSelectedLanguageCode');\r\n\r\n if (locale !== 'en') {\r\n // No current support for translation\r\n return String(number);\r\n }\r\n\r\n let numberAsString = String(number);\r\n const smallestUnit = numberAsString.split('').pop();\r\n switch (Number(smallestUnit)) {\r\n case 1:\r\n return this.translationService.t(\"VeriDateService.stSuffix\", numberAsString);\r\n case 2:\r\n return this.translationService.t(\"VeriDateService.ndSuffix\", numberAsString);\r\n case 3:\r\n return this.translationService.t(\"VeriDateService.rdSuffix\", numberAsString);\r\n default:\r\n return this.translationService.t(\"VeriDateService.thSuffix\", numberAsString);\r\n }\r\n }\r\n\r\n updateTime(date: Date, timeString: string): Date {\r\n if (!date) {\r\n return;\r\n }\r\n\r\n const hoursMinutesSeconds = timeString.split(':');\r\n const hours = hoursMinutesSeconds[0];\r\n const minutes = hoursMinutesSeconds[1];\r\n const seconds = hoursMinutesSeconds[2] || '00';\r\n\r\n let updatedHoursDate = new Date(date).setHours(Number(hours));\r\n let updatedMinutesDate = new Date(updatedHoursDate).setMinutes(Number(minutes));\r\n let updatedSecondsDate = new Date(updatedMinutesDate).setSeconds(Number(seconds));\r\n\r\n return new Date(updatedSecondsDate);\r\n }\r\n\r\n\r\n getTimeAsString(date: Date | string, includeSeconds: boolean = false): string {\r\n const parsedDate = new Date(date);\r\n const hours = this.getHoursAsString(parsedDate);\r\n\r\n const minutes = this.getMinutesAsString(parsedDate);\r\n\r\n const seconds = this.getSecondsAsString(parsedDate);\r\n\r\n if (includeSeconds) {\r\n return `${hours}:${minutes}:${seconds}`;\r\n }\r\n\r\n return `${hours}:${minutes}`;\r\n }\r\n\r\n sort(date1: string | Date, date2: string | Date, sortDirection: SortDirection = SortDirection.Descending): number {\r\n var parsedDate1 = new Date(date1);\r\n var parsedDate2 = new Date(date2);\r\n\r\n const parsedDate1Time = parsedDate1.getTime();\r\n if (isNaN(parsedDate1Time)) {\r\n console.error(date1, \"is not a date\", typeof date1);\r\n }\r\n\r\n if (sortDirection == SortDirection.Ascending) {\r\n return parsedDate1Time - parsedDate2.getTime();\r\n }\r\n else {\r\n return parsedDate2.getTime() - parsedDate1Time;\r\n }\r\n }\r\n\r\n getMinuteOfDay(date: Date): number {\r\n\r\n const parsedDate = new Date(date);\r\n\r\n const hours = parsedDate.getHours();\r\n const minutes = parsedDate.getMinutes();\r\n\r\n return (hours * 60) + minutes;\r\n }\r\n\r\n getSecondOfDay(date: Date): number {\r\n\r\n const parsedDate = new Date(date);\r\n\r\n const hours = parsedDate.getHours();\r\n const minutes = parsedDate.getMinutes();\r\n const seconds = parsedDate.getSeconds();\r\n\r\n return (hours * 3600) + (minutes * 60) + seconds;\r\n }\r\n\r\n dateRangeFromEnum(dateRange: DateRange): IDateRange {\r\n let startDate: Date = this.getStartOfDay(new Date());\r\n let endDate: Date = this.getEndOfDay(new Date());\r\n\r\n let rangeEndsYesterday = false;\r\n\r\n switch (dateRange) {\r\n case DateRange.Today:\r\n startDate = this.getStartOfDay(new Date());\r\n break;\r\n\r\n case DateRange.Yesterday:\r\n startDate = this.addOrSubtractTime(new Date(), -1, DateUnit.Day);\r\n endDate = new Date(this.getEndOfDay(startDate));\r\n break;\r\n\r\n case DateRange.Week:\r\n startDate = this.addOrSubtractTime(new Date(), -1, DateUnit.Week);\r\n rangeEndsYesterday = true;\r\n break;\r\n\r\n case DateRange.Last7Days:\r\n startDate = this.addOrSubtractTime(new Date(), -6, DateUnit.Day);\r\n rangeEndsYesterday = true;\r\n break;\r\n\r\n case DateRange.Last14Days:\r\n startDate = this.addOrSubtractTime(new Date(), -14, DateUnit.Day);\r\n rangeEndsYesterday = true;\r\n break;\r\n\r\n case DateRange.Last30Days:\r\n startDate = this.addOrSubtractTime(new Date(), -30, DateUnit.Day);\r\n rangeEndsYesterday = true;\r\n break;\r\n\r\n case DateRange.ThisWeek:\r\n startDate = this.getStartOfWeek(new Date());\r\n endDate = new Date(this.addOrSubtractTime(startDate, 6, DateUnit.Day));\r\n break;\r\n\r\n case DateRange.ThisMonth:\r\n startDate = this.getStartOfMonth(new Date());\r\n endDate = this.getEndOfMonth(new Date());\r\n break;\r\n\r\n case DateRange.Latest3Weeks:\r\n startDate = this.addOrSubtractTime(this.getStartOfWeek(new Date()), -2, DateUnit.Week);\r\n break;\r\n\r\n case DateRange.Latest14Days:\r\n startDate = this.addOrSubtractTime(new Date(), -14, DateUnit.Day);\r\n break;\r\n\r\n case DateRange.Latest4Weeks:\r\n startDate = this.addOrSubtractTime(new Date(), -28, DateUnit.Day);\r\n break;\r\n\r\n case DateRange.Latest7Days:\r\n startDate = this.addOrSubtractTime(new Date(), -7, DateUnit.Day);\r\n break;\r\n\r\n case DateRange.LastWeek:\r\n startDate = this.addOrSubtractTime(this.getStartOfWeek(new Date()), -1, DateUnit.Week);\r\n endDate = new Date(this.getEndOfWeek(startDate));\r\n break;\r\n\r\n case DateRange.LastMonth:\r\n startDate = this.getStartOfMonth(this.addOrSubtractTime(new Date(), -1, DateUnit.Month));\r\n endDate = new Date(this.getEndOfMonth(startDate));\r\n break;\r\n\r\n case DateRange.Latest4Weeks:\r\n startDate = this.addOrSubtractTime(new Date(), 4, DateUnit.Week);\r\n break;\r\n }\r\n\r\n if (rangeEndsYesterday) {\r\n startDate = new Date(this.addOrSubtractTime(startDate, -1, DateUnit.Day));\r\n endDate = new Date(this.addOrSubtractTime(endDate, -1, DateUnit.Day));\r\n }\r\n\r\n return {\r\n start: startDate,\r\n end: endDate\r\n }\r\n }\r\n\r\n formatTimeDuration(seconds: number): string {\r\n if (!seconds) {\r\n return \"00:00\";\r\n }\r\n\r\n const mm = Math.floor(seconds / 60);\r\n const ss = Math.floor(seconds % 60);\r\n\r\n return `${mm < 10 ? \"0\" : \"\"}${mm}:${ss < 10 ? \"0\" : \"\"}${ss}`;\r\n }\r\n\r\n getDateTimeFromSecondOfDay(secondOfDay: number, date: Date): Date {\r\n const hours = Math.floor(secondOfDay / 3600);\r\n const minutes = Math.floor((secondOfDay % 3600) / 60);\r\n const seconds = Math.floor(secondOfDay % 60);\r\n\r\n return this.updateTime(date, `${hours}:${minutes}:${seconds}`)\r\n }\r\n\r\n private customRound(value: number): number {\r\n return value > 0 ? Math.floor(value) : Math.ceil(value);\r\n }\r\n\r\n private getDayOfWeek(day: number, shorten = false): string {\r\n var translationKey = \"\";\r\n\r\n switch (day) {\r\n case 0:\r\n translationKey = \"VeriDateService.Sunday\";\r\n break;\r\n\r\n case 1:\r\n translationKey = \"VeriDateService.Monday\";\r\n break;\r\n\r\n case 2:\r\n translationKey = \"VeriDateService.Tuesday\";\r\n break;\r\n\r\n case 3:\r\n translationKey = \"VeriDateService.Wednesday\";\r\n break;\r\n\r\n case 4:\r\n translationKey = \"VeriDateService.Thursday\";\r\n break;\r\n\r\n case 5:\r\n translationKey = \"VeriDateService.Friday\";\r\n break;\r\n\r\n case 6:\r\n translationKey = \"VeriDateService.Saturday\";\r\n break;\r\n }\r\n\r\n if (shorten) {\r\n return this.translationService.t(translationKey).substr(0, 3);\r\n }\r\n\r\n return this.translationService.t(translationKey);\r\n }\r\n\r\n private getHoursAsString(date: Date): string {\r\n let hours = date.getHours().toString();\r\n if (hours.length < 2) {\r\n hours = \"0\" + hours;\r\n }\r\n\r\n return hours;\r\n }\r\n\r\n private getMinutesAsString(date: Date): string {\r\n let minutes = date.getMinutes().toString();\r\n if (minutes.length < 2) {\r\n minutes = \"0\" + minutes;\r\n }\r\n\r\n return minutes;\r\n }\r\n\r\n private getSecondsAsString(date: Date): string {\r\n let seconds = date.getSeconds().toString();\r\n if (seconds.length < 2) {\r\n seconds = \"0\" + seconds;\r\n }\r\n\r\n return seconds;\r\n }\r\n\r\n private msToDateUnit(ms: number, unit: DateUnit): number {\r\n switch (unit) {\r\n case DateUnit.Ms:\r\n return ms;\r\n\r\n case DateUnit.Sec:\r\n return ms / 1000;\r\n\r\n case DateUnit.Min:\r\n return ms / 1000 / 60;\r\n\r\n case DateUnit.Hour:\r\n return ms / 1000 / 60 / 60;\r\n\r\n case DateUnit.Day:\r\n return ms / 1000 / 60 / 60 / 24;\r\n\r\n case DateUnit.Year:\r\n return ms / 1000 / 60 / 60 / 24 / 365;\r\n }\r\n }\r\n\r\n private getUserLocale(): string {\r\n let locale = localStorage.getItem('userSelectedLanguageCode');\r\n\r\n if (!locale || locale === 'en') {\r\n // So we can differentiate between en-GB and en-US\r\n locale = this.getLocaleFromBrowser();\r\n }\r\n\r\n return locale;\r\n }\r\n\r\n private getLocaleFromBrowser() {\r\n if (navigator.languages != undefined) {\r\n return navigator.languages[0];\r\n }\r\n\r\n return navigator.language;\r\n }\r\n\r\n private setMidnightToZeroes(timeString: string): string {\r\n // Ensure midnight always shown as \"00\" and never \"24\" which sometimes happens when Chrome locale is \"en-US\" \r\n if (timeString.substring(0, 2) == \"24\") {\r\n timeString = timeString.replace(/^.{2}/, \"00\");\r\n }\r\n\r\n return timeString;\r\n }\r\n}\r\n","export enum SortType {\r\n //None, - consider in future?\r\n String,\r\n Number,\r\n Date,\r\n Boolean\r\n}\r\n","import { Injectable, TemplateRef } from \"@angular/core\";\r\nimport { LocationInformationComponent } from \"@app/directives/_misc/location-information/location-information.component\";\r\nimport { VideoDownloadStatusComponent } from \"@app/directives/_misc/video-download-status/video-download-status.component\";\r\nimport { VehicleRegComponent } from \"@app/directives/_vehicle/vehicleReg/vehicleReg.component\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { DateService, DateUnit } from \"@app/services/date.service\";\r\nimport { GeocodeService } from \"@app/services/geocode.service\";\r\nimport { LocationInformationService } from \"@app/services/location-information/location-information.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { CheckboxCell } from \"../_components/cells/checkbox-cell/checkbox-cell.component\";\r\nimport { EnumCellComponent } from \"../_components/cells/enum-cell/v-enum-cell.component\";\r\nimport { PercentageBarCellComponent, PercentageBarModel } from \"../_components/cells/percentage-bar/percentage-bar-cell.component\";\r\nimport { RagCellBehavior, RagCellComponent } from \"../_components/cells/rag-cell/rag-cell.component\";\r\nimport { DateCell } from \"../_components/cells/stacked-date/date-cell.component\";\r\nimport { StatusCell } from \"../_components/cells/status-cell/status-cell.component\";\r\nimport { VTableHeaderType } from \"../_enums/VTableHeaderType.enum\";\r\nimport { VTableRowStatus } from \"../_enums/VTableRowStatus.enum\";\r\nimport { ILocationCellOptions } from \"../_models/ILocationCellOptions\";\r\nimport { IVTable } from \"../_models/IVTable\";\r\nimport { IVTableCell } from \"../_models/IVTableCell\";\r\nimport { IVTableCellOptions } from \"../_models/IVTableCellOptions\";\r\nimport { IVTableColumn } from \"../_models/IVTableColumn\";\r\nimport { IVTableHeader } from \"../_models/IVTableHeader\";\r\nimport { IVTableHeaderOptions } from \"../_models/IVTableHeaderOptions\";\r\nimport { IVTableRow } from \"../_models/IVTableRow\";\r\n\r\nexport enum FallbackCellType {\r\n NA,\r\n Dashed,\r\n Blank,\r\n Unknown,\r\n Never\r\n}\r\n\r\nexport interface IDateCellOptions {\r\n showRelativeTime?: boolean;\r\n showErrorIfBeforeDate?: Date;\r\n showWarningIfBeforeDate?: Date;\r\n dateTime?: boolean;\r\n fallbackCellType?: FallbackCellType;\r\n validationCutOff?: Date; // If date is earlier than this then it should be classed as invalid; helps rule out automatic dates such as 1900-01-01 and 0001-01-01\r\n}\r\n\r\nconst SORT_NULL_VALUE = -99999999999;\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class VTableService {\r\n constructor(private readonly dateService: DateService,\r\n private readonly geocodeService: GeocodeService,\r\n private readonly locationInformationService: LocationInformationService,\r\n private readonly translationService: TranslationService) { }\r\n\r\n /**\r\n * @description Creates an array of table rows based on column configuration and data array\r\n * @template TModel - The object type for the data param\r\n * @param {TModel[]} data The array of data to convert to table rows\r\n * @param {IVTableColumn[]} columns The array of column configurations\r\n * @param {number} [preSelectedRow] (optional) Preselect a row in a multi select table \r\n * @returns {IVTableRow[]}\r\n */\r\n createTableRows(data: TModel[], columns: IVTableColumn[], preSelectedRow?: number): IVTableRow[] {\r\n if (!data) {\r\n return;\r\n }\r\n const rows: IVTableRow[] = []\r\n\r\n data.forEach(d => {\r\n rows.push(this.createTableRow(d, columns));\r\n })\r\n\r\n if (preSelectedRow != null) {\r\n rows[preSelectedRow].selected = true;\r\n }\r\n\r\n return rows;\r\n }\r\n\r\n /**\r\n * @description Create a single table row based on column configuration and data object\r\n * @template TModel - The object type for the data param\r\n * @param {TModel[]} data The data object to convert to a table row\r\n * @param {IVTableColumn[]} columns The array of column configurations\r\n * @returns {IVTableRow}\r\n */\r\n createTableRow(data: TModel, columns: IVTableColumn[]): IVTableRow {\r\n const row: IVTableRow = {\r\n cells: [],\r\n data: data,\r\n };\r\n\r\n columns.forEach(column => {\r\n const cell: IVTableCell = column.createCellFunction(data);\r\n row.cells.push(cell);\r\n if (column.header.searchable) {\r\n row.searchString += `||||${cell.searchData ? cell.searchData.toLowerCase() : ''}`;\r\n }\r\n })\r\n\r\n row.disableSelect = row.cells.some(cell => cell.disableRow);\r\n\r\n return row;\r\n }\r\n\r\n /**\r\n * @description Add a new table row to an existing array of rows\r\n * @template TModel - The object type for the data param\r\n * @param {TModel[]} data The data object to convert to a table row\r\n * @param {IVTableColumn[]} columns The array of column configurations\r\n * @param {IVTableRow[]} rows: The array of rows to append the new row to\r\n * @returns {void}\r\n */\r\n addNewRow(data: TModel, columns: IVTableColumn[], rows: IVTableRow[]): void {\r\n if (!rows?.length) {\r\n return;\r\n }\r\n\r\n const newRow = this.createTableRow(data, columns);\r\n rows.push(newRow);\r\n }\r\n\r\n // Sorting and Filtering\r\n\r\n /**\r\n * @description Sort table rows by a specific column\r\n * @param {IVTable} table The table to sort\r\n * @param {IVTableHeader} header The header (column) to sort by\r\n * @returns {IVTable}\r\n */\r\n sortColumn(table: IVTable, header: IVTableHeader): IVTable {\r\n if (!table?.rows) {\r\n return;\r\n }\r\n\r\n const columnIndex = header.id;\r\n\r\n switch (header.sortType) {\r\n case SortType.Date:\r\n table.rows.sort((a, b) => {\r\n const sortDataA = a.cells[columnIndex].sortData as any;\r\n const sortDataB = b.cells[columnIndex].sortData as any;\r\n\r\n if (sortDataA === SORT_NULL_VALUE && sortDataB !== SORT_NULL_VALUE) {\r\n return 0;\r\n }\r\n if (sortDataA !== SORT_NULL_VALUE && sortDataB === SORT_NULL_VALUE) {\r\n return -1;\r\n }\r\n return header.sortDirection === SortDirection.Ascending\r\n ? sortDataA - sortDataB\r\n : sortDataB - sortDataA;\r\n });\r\n break;\r\n case SortType.Number:\r\n case SortType.Boolean:\r\n table.rows.sort((a, b) => {\r\n return header.sortDirection === SortDirection.Ascending ?\r\n (a.cells[columnIndex].sortData as any) - (b.cells[columnIndex].sortData as any) :\r\n (b.cells[columnIndex].sortData as any) - (a.cells[columnIndex].sortData as any)\r\n });\r\n break;\r\n case SortType.String:\r\n table.rows.sort((a, b) => {\r\n if (String(a.cells[columnIndex].sortData) < String(b.cells[columnIndex].sortData)) {\r\n return header.sortDirection === SortDirection.Ascending ? -1 : 1;\r\n }\r\n if (String(a.cells[columnIndex].sortData) > String(b.cells[columnIndex].sortData)) {\r\n return header.sortDirection === SortDirection.Ascending ? 1 : -1;\r\n }\r\n return 0;\r\n });\r\n break;\r\n }\r\n\r\n return table;\r\n }\r\n\r\n /**\r\n * @description Filter table rows according to pre-filtered data. Any rows that don't have a corresponding data item are hidden.\r\n * @param {IVTable} table The table to filter\r\n * @param {any[]} filteredData The array of data that has been filtered eg. in filterBarComponent\r\n * @returns {void}\r\n */\r\n filterRows(table: IVTable, filteredData: any[]): void {\r\n if (!table?.rows) {\r\n return;\r\n }\r\n const tableRowMap = new Map(table.rows.map(row => [row.data.Id, row]))\r\n table.rows.forEach(row => row.hide = true);\r\n\r\n if (!filteredData.length) {\r\n return;\r\n }\r\n\r\n filteredData.forEach(data => {\r\n const row = tableRowMap.get(data[\"Id\"]);\r\n if (row) {\r\n row.hide = false;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * @description Generate a new table column using the supplied configuration\r\n * @template TModel - The object type for the data the table is displaying\r\n * @param {IVTableHeader} header The configuration options for the header\r\n * @param {(data: TModel) => IVTableCell} createCellFunction The method that will generate the table cell, including the data to be displayed and any configuration options\r\n * @returns {IVTableColumn}\r\n */\r\n createTableColumn(header: IVTableHeader, createCellFunction: (data: TModel) => IVTableCell): IVTableColumn {\r\n return {\r\n header: header,\r\n createCellFunction: createCellFunction\r\n }\r\n }\r\n\r\n // Header creation\r\n\r\n /**\r\n * @description Generate a new table header using the supplied configuration\r\n * @param {IVTableHeaderOptions} options The configuration options for the header\r\n * @param {VTableHeaderType} [type = VTableHeaderType.Default] (optional) Determines the visual appearance of the header, defaults to VTableHeaderType.Default\r\n * @returns {IVTableHeader}\r\n */\r\n createTableHeader(options: IVTableHeaderOptions, type: VTableHeaderType = VTableHeaderType.Default): IVTableHeader {\r\n const translation = options.tKey || options.translationKey;\r\n\r\n const header = {\r\n title: translation ? this.translationService.translate(translation) : options.title || \"\",\r\n type: type,\r\n width: options.width,\r\n minWidth: options.minWidth,\r\n searchable: options.searchable != undefined ? options.searchable : true,\r\n sortable: options.sortable != undefined ? options.sortable : true,\r\n sortDirection: options.sortDirection | SortDirection.Ascending,\r\n sorted: options.sorted,\r\n sortType: options.sortType || SortType.String,\r\n classes: options.classes || \"\",\r\n minTableWidth: options.minTableWidth,\r\n excludeFromExport: options.excludeFromExport,\r\n exportOnly: options.exportOnly,\r\n canEdit: options.canEdit,\r\n hidden: options.hidden || false\r\n }\r\n\r\n if (header.sortable) {\r\n header.classes += \" sortable\";\r\n }\r\n\r\n return header;\r\n }\r\n\r\n /**\r\n * @description Generate a new table header with a default configuration for vehicle headers: {title: \"Vehicle\", width: 100, sortType: SortType.String, type: VTableHeaderType.Vehicle}\r\n * @param {IVTableHeaderOptions} options Any extra configuration options for the header.\r\n * @returns {IVTableHeader}\r\n */\r\n createVehicleTableHeader(options?: IVTableHeaderOptions): IVTableHeader {\r\n return this.createTableHeader({ title: this.translationService.t(\"Common.Vehicle\"), width: 100, sortType: SortType.String, ...options }, VTableHeaderType.Vehicle);\r\n }\r\n\r\n /**\r\n * @description Generate a new table header with a default configuration for status headers\r\n * @param {IVTableHeaderOptions} options Any extra configuration options for the header.\r\n * @example {title: \"Status\", width: 65, sortable: true, sorted: true, sortDirection: SortDirection.Descending, sortType: SortType.Number, classes: 'status', type: VTableHeaderType.Status}\r\n * @returns {IVTableHeader}\r\n */\r\n createStatusTableHeader(options?: IVTableHeaderOptions): IVTableHeader {\r\n return this.createTableHeader({ title: this.translationService.t(\"Common.Status\"), width: 65, sortable: true, sorted: true, sortDirection: SortDirection.Descending, sortType: SortType.Number, classes: 'status', ...options }, VTableHeaderType.Status);\r\n }\r\n\r\n /**\r\n * @description Generate a new table header with a default configuration for date headers: { title: \"Date\", width: 150, sortType: SortType.Date, type: VTableHeaderType.Date}\r\n * @param {IVTableHeaderOptions} options Any extra configuration options for the header.\r\n * @returns {IVTableHeader}\r\n */\r\n createDateTableHeader(options?: IVTableHeaderOptions): IVTableHeader {\r\n return this.createTableHeader({ title: this.translationService.t(\"Common.Date\"), width: 150, sortType: SortType.Date, ...options }, VTableHeaderType.Date)\r\n }\r\n\r\n /**\r\n * @description Generate a new table header with a default configuration for location information headers: {title: \"Location\", sortable: false, width: 200}\r\n * @param {IVTableHeaderOptions} options Any extra configuration options for the header.\r\n * @returns {IVTableHeader}\r\n */\r\n createLocationInformationHeader(options?: IVTableHeaderOptions): IVTableHeader {\r\n return this.createTableHeader({\r\n sortable: false,\r\n title: this.translationService.t(\"Common.Location\"),\r\n width: 200,\r\n ...options\r\n })\r\n }\r\n\r\n /**\r\n * @description Generate a new table header containing a checkbox for multi-select tables. Will be called automatically when table configuration specifies multi-select\r\n * @returns {IVTableHeader}\r\n */\r\n createCheckboxHeader(): IVTableHeader {\r\n return this.createTableHeader({\r\n width: 50,\r\n sortable: false\r\n }, VTableHeaderType.Checkbox)\r\n }\r\n\r\n // Cell creation\r\n\r\n\r\n /**\r\n * @description Generate a new table cell using the supplied configuration\r\n * @param {any} data The data the cell relates to. This can be any type but undefined or null will result in a dashed or N/A cell.\r\n * @param {IVTableCellOptions} [options = {}] (optional) Any configuration options to apply to the cell\r\n * @param {FallbackCellType} [fallbackType = FallbackCellType.Dashed] (optional) Determines what is displayed in the cell in the case of null or undefined data\r\n * @returns {IVTableCell}\r\n */\r\n createTableCell(data: any, options: IVTableCellOptions = {}, fallbackType: FallbackCellType = FallbackCellType.Dashed): IVTableCell {\r\n if (!data && data !== 0 ||\r\n !String(data).length ||\r\n (typeof (data) === 'object' && Object.values(data).length > 0 && Object.values(data).every(item => !item)) // Covers when a template object has null for every key\r\n ) {\r\n let cellContent: string;\r\n switch (fallbackType) {\r\n case FallbackCellType.NA:\r\n cellContent = 'N/A';\r\n break;\r\n\r\n case FallbackCellType.Dashed:\r\n cellContent = '--';\r\n break;\r\n\r\n case FallbackCellType.Blank:\r\n cellContent = \"\";\r\n break;\r\n case FallbackCellType.Unknown:\r\n cellContent = this.translationService.t(\"Common.Unknown\")\r\n break;\r\n case FallbackCellType.Never:\r\n cellContent = this.translationService.t(\"Common.Never\")\r\n break;\r\n default:\r\n cellContent = \"--\";\r\n break;\r\n }\r\n\r\n return {\r\n data: cellContent,\r\n searchData: \"\",\r\n exportData: \"\",\r\n sortData: SORT_NULL_VALUE, //TODO - there must be a better way...\r\n classes: \"text-muted \" + options.classes,\r\n disableRow: options.disableRow\r\n }\r\n\r\n }\r\n\r\n const cell: IVTableCell = {\r\n data: data,\r\n sortData: options?.sortData || (options?.sortData !== 0 ? data : options?.sortData),\r\n searchData: options?.searchData?.toString() || options?.sortData?.toString() || options?.exportData?.toString() || data.toString(),\r\n exportData: options?.exportData || data,\r\n classes: options?.classes,\r\n exportDataMethod: options.exportDataMethod,\r\n component: options.component,\r\n componentInputs: options.componentInputs,\r\n template: options.template,\r\n tooltip: options.tooltip,\r\n icon: options.icon,\r\n disableRow: options.disableRow\r\n }\r\n\r\n return cell;\r\n }\r\n\r\n /**\r\n * @description Helper method to generate a new table cell with default configuration for using an angular template\r\n * @param {any} data The data object required by the supplied TemplateRef\r\n * @param {TemplateRef} template The templateRef to be injected into the cell\r\n * @param {IVTableCellOptions} [options = {}] (optional) Any configuration options to apply to the cell\r\n * @returns {IVTableCell}\r\n */\r\n createTableTemplateCell(data: any, template: TemplateRef, options?: IVTableCellOptions): IVTableCell {\r\n return this.createTableCell(data, { ...options, template: template })\r\n }\r\n\r\n /**\r\n * @description Helper method to generate a new table cell with default configuration for displaying a row status. Displays the status with a StatusCell component.\r\n * @see StatusCell\r\n * @param {VTableRowStatus} data The status to display - will show an icon relating to the row status\r\n * @param {IVTableCellOptions} [options = {}] (optional) Any configuration options to apply to the cell\r\n * @returns {IVTableCell}\r\n */\r\n createStatusCell(data: VTableRowStatus, options?: IVTableCellOptions): IVTableCell {\r\n return this.createTableCell(data, { searchData: null, exportDataMethod: () => this.exportStatusMethod(data), component: StatusCell, componentInputs: { data: data }, sortData: options?.sortData || data }, FallbackCellType.Dashed);\r\n }\r\n\r\n /**\r\n * @description Helper method to generate a new table cell with default configuration for displaying a vehicle registration. Displays a VehicleRegComponent.\r\n * @see VehicleRegComponent\r\n * @param {IVehicle} vehicle The vehicle to display\r\n * @param {number} [vehicleId] (optional) Can be used if no vehicle object exists\r\n * @param {IVTableCellOptions} [options = {}] (optional) Any configuration options to apply to the cell\r\n * @returns {IVTableCell}\r\n */\r\n createVehicleRegCell(vehicle: IVehicle, vehicleId?: number, allowNonDatabaseVehicle: boolean = false): IVTableCell {\r\n let regString: string = vehicle?.Reg || vehicle?.ShortReg || \"N/A\";\r\n let regSearchString: string = `${vehicle?.Reg}||||${vehicle?.ShortReg}` || \"N/A\";\r\n return this.createTableCell(regString, { sortData: regString, exportData: regString, searchData: regSearchString, component: VehicleRegComponent, componentInputs: { vehicle: vehicle, vehicleId: vehicleId, allowNonDatabaseVehicle: allowNonDatabaseVehicle } });\r\n }\r\n\r\n /**\r\n * @description Helper method to generate a new table cell showing a resource location (address or geofence). Displays a LocationInformationComponent.\r\n * @see LocationInformationComponent\r\n * @param {ILocationCellOptions} cellOptions Contains the data (eg. plotId, IPlot, lat/lng) that is required by the LocationInformationComponent to retrieve the location\r\n * @returns {IVTableCell}\r\n */\r\n createLocationInformationCell(cellOptions: ILocationCellOptions): IVTableCell {\r\n return this.createTableCell(\r\n cellOptions.plotId || cellOptions.plot?.Id || cellOptions.latLng,\r\n {\r\n searchData: null,\r\n exportDataMethod: () => this.exportLocationInformationMethod(cellOptions.plotId || cellOptions.plot?.Id),\r\n component: LocationInformationComponent,\r\n componentInputs: {\r\n plot: cellOptions.plot || { Id: cellOptions.plotId },\r\n latLng: cellOptions.latLng,\r\n locationInformation: cellOptions.locationInformation\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * @description Helper method to generate a new table cell showing a checkbox. Displays a CheckboxCell component.\r\n * @see CheckboxCell\r\n * @param {boolean} [selected = false] (optional) Whether the checkbox should be pre-selected. Defaults to false.\r\n * @returns {IVTableCell}\r\n */\r\n createCheckboxCell(selected = false): IVTableCell {\r\n return this.createTableCell(selected, { component: CheckboxCell, componentInputs: { data: selected } });\r\n }\r\n\r\n /**\r\n * @description Helper method to generate a new table cell showing a red/amber/green indicator. Displays a RagCellComponent.\r\n * @see RagCellComponent\r\n * @param {any} displayData \r\n * @param {T} item \r\n * @param {RagCellBehavior} behavior \r\n * @returns {IVTableCell}\r\n */\r\n createRagCell(displayData: any, item: T, behavior: RagCellBehavior): IVTableCell {\r\n return this.createTableCell(displayData, { component: RagCellComponent, componentInputs: { item: item, behavior: behavior, displayData: displayData }, });\r\n }\r\n\r\n /**\r\n * @description Helper method to generate a new table cell showing a percentage bar. Displays a PercentageBarCellComponent.\r\n * @see PercentageBarCellComponent\r\n * @param {PercentageBarModel} data \r\n * @returns {IVTableCell}\r\n */\r\n createPercentageBarCell(data: PercentageBarModel): IVTableCell {\r\n let dataToSort = 0;\r\n\r\n switch (true) {\r\n case (!!data.negativeSegment && !!data.positiveSegment):\r\n dataToSort = data.negativeSegment.count / data.positiveSegment.count;\r\n break;\r\n \r\n case (!!data.negativeSegment && !!data.neutralSegment):\r\n dataToSort = data.negativeSegment.count / data.neutralSegment.count;\r\n break;\r\n\r\n case (!!data.neutralSegment && !!data.positiveSegment):\r\n dataToSort = data.neutralSegment.count / data.positiveSegment.count;\r\n break;\r\n\r\n case (!!data.negativeSegment && !!data.neutralSegment):\r\n dataToSort = data.negativeSegment.count / data.positiveSegment.count;\r\n break;\r\n }\r\n\r\n if (Number.isNaN(dataToSort)) {\r\n dataToSort = -1;\r\n }\r\n\r\n return this.createTableCell(dataToSort, { component: PercentageBarCellComponent, componentInputs: { model: data } });\r\n }\r\n\r\n /**\r\n * @description Helper method to generate a new table cell showing a date. Displays a DateCell component.\r\n * @see DateCell\r\n * @param {Date | string} date The date to be displayed\r\n * @param {IDateCellOptions} [options] (optional) Configuration options such as error status and showing relative time (time ago).\r\n * @returns {IVTableCell}\r\n */\r\n createDateCell(date: Date | string, options?: IDateCellOptions): IVTableCell {\r\n const parsedDate = new Date(date);\r\n\r\n if (isNaN(parsedDate.getTime()) || parsedDate.getFullYear() < 1000 || parsedDate.getFullYear() > 2100 || date == null) {\r\n // If year is < 1000 it is probably not an accurate date, sometimes we get 0001-01-01\r\n return this.createTableCell(null, { sortData: parsedDate?.getTime() || SORT_NULL_VALUE, classes: 'text-muted' }, options?.fallbackCellType);\r\n }\r\n\r\n if (options?.validationCutOff && this.dateService.date1IsAfterDate2(options.validationCutOff, parsedDate)) {\r\n return this.createTableCell(this.translationService.t(\"Common.Unknown\"), { sortData: 0, classes: 'text-muted' });\r\n }\r\n\r\n return this.createTableCell(parsedDate, {\r\n searchData: null,\r\n sortData: parsedDate.getTime(),\r\n exportDataMethod: () => this.exportDateMethod(parsedDate, options?.dateTime ? options?.dateTime : true),\r\n component: DateCell,\r\n componentInputs: {\r\n date: parsedDate,\r\n showErrorIfBeforeDate: options?.showErrorIfBeforeDate,\r\n showWarningIfBeforeDate: options?.showWarningIfBeforeDate,\r\n showRelativeTime: options?.showRelativeTime,\r\n dateTime: options?.dateTime ? options?.dateTime : true\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * @description Helper method to generate a new table cell showing a duration.\r\n * @param {number} value The duration to convert. Can be any unit of time such as seconds, days etc.\r\n * @param {DateUnit} [dateUnit = DateUnit.Ms] (optional) The unit of time that the value param is measured in. Defaults to ms.\r\n * @returns {IVTableCell}\r\n */\r\n createDurationCell(value: number, dateUnit: DateUnit = DateUnit.Ms): IVTableCell {\r\n const milliseconds = this.dateService.convertToMilliseconds(dateUnit, value);\r\n\r\n const displayValue = this.dateService.formatTimeFromMilliseconds(milliseconds, { style: \"narrow\" });\r\n\r\n return this.createTableCell(displayValue, { sortData: milliseconds });\r\n }\r\n\r\n /**\r\n * @description Helper method to generate a new table cell showing a duration, based on given dates.\r\n * @param {Date} start Start Date\r\n * @param {Date} end End Date\r\n * @returns {IVTableCell}\r\n */\r\n createDurationCellFromDates(start: Date, end: Date): IVTableCell {\r\n start = new Date(start);\r\n end = new Date(end);\r\n\r\n const sortData = end.getTime() - start.getTime();\r\n const displayValue = this.dateService.formatDuration(start, end);\r\n\r\n return this.createTableCell(displayValue, { sortData: sortData });\r\n }\r\n\r\n /**\r\n * @description Helper method to generate a new table cell showing translated enum.\r\n * @template {T} - The enum type\r\n * @param {T} enumType The enum type\r\n * @param {string} enumName The enum type as a string\r\n * @param {number} enumValue The value as a number\r\n * @example createEnumCell(VehicleType, \"VehicleType\", resource.VehicleType)\r\n * @returns {IVTableCell}\r\n */\r\n createEnumCell(enumType: T, enumName: string, enumValue: number): IVTableCell {\r\n return this.createTableCell(enumValue, {\r\n sortData: enumValue,\r\n component: EnumCellComponent,\r\n componentInputs: {\r\n enumType,\r\n enumName,\r\n enumValue\r\n },\r\n exportDataMethod: () => Promise.resolve(this.translationService.tEnum(enumType, enumName, enumValue))\r\n })\r\n }\r\n\r\n createVideoDownloadStatusCell(label: string, autoDownload: boolean): IVTableCell {\r\n { \r\n return this.createTableCell(label, {\r\n exportData: label,\r\n component: VideoDownloadStatusComponent,\r\n componentInputs: {\r\n label: label,\r\n autoDownload: autoDownload\r\n }\r\n }) \r\n }\r\n }\r\n\r\n /**\r\n * @description Generate a unique Id for a table based on headers. Used to generate a local storage key to save user table preferences\r\n * @param {IVTableColumn[]} tableColumns\r\n * @returns {string}\r\n */\r\n getTableId(tableColumns: IVTableColumn[]): string {\r\n return tableColumns.map(c => c.header.title).join(\"\").slice(-0, 40);\r\n }\r\n\r\n /**\r\n * @description Retrieve the user's column preferences from local storage\r\n * @param {IVTableColumn[]} tableColumns\r\n * @returns {IVTableColumn[]}\r\n */\r\n getTableColumnPreferences(tableColumns: IVTableColumn[]): IVTableColumn[] {\r\n const existingPreferences = window.localStorage.getItem(this.getTableId(tableColumns));\r\n if (existingPreferences) {\r\n return JSON.parse(existingPreferences);\r\n }\r\n\r\n return tableColumns;\r\n }\r\n\r\n /**\r\n * @description Check if any table headers are editable to trigger column editor button\r\n * @param {IVTableColumn[]} tableColumns\r\n * @returns {boolean}\r\n */\r\n getCanEditColumns(tableColumns: IVTableColumn[]): boolean {\r\n return tableColumns.some(col => col.header.canEdit);\r\n }\r\n\r\n // Cell Export Methods\r\n\r\n private exportLocationInformationMethod(plotId: number): Promise {\r\n return new Promise((resolve) => {\r\n return this.geocodeService.getLocationInformationFromPlotId(plotId).then(locationInformation => {\r\n if (!locationInformation) {\r\n resolve(\"N/A\");\r\n }\r\n\r\n if (locationInformation.GeofenceIds.length) {\r\n resolve(\r\n this.locationInformationService.getGeofenceNamesString(locationInformation)\r\n );\r\n } else {\r\n resolve(locationInformation.LocationDescription);\r\n }\r\n }).catch((error) => {\r\n console.error(`Error retrieving location: ${error}`);\r\n resolve(\"--\");\r\n });\r\n })\r\n }\r\n\r\n private exportStatusMethod(status: VTableRowStatus): Promise {\r\n return new Promise((resolve, reject) => {\r\n if (!status) {\r\n resolve('--');\r\n }\r\n\r\n const statusString = this.translationService.tEnum(VTableRowStatus, 'VTableRowStatus', status);\r\n resolve(statusString);\r\n })\r\n }\r\n\r\n private exportDateMethod(date: Date, dateTime: boolean): Promise {\r\n return new Promise((resolve, reject) => {\r\n resolve(this.dateService.formatDate(date, { dateTime: dateTime }));\r\n })\r\n } \r\n}\r\n","export enum SortDirection {\r\n Ascending,\r\n Descending\r\n}\r\n","import { ReportsNavigationModule } from \"@app/main/components/reports/reports.navigation\";\r\nimport { ResourceManagementNavigationModule } from \"@app/main/components/resourceManagement/resourceManagement.navigation\";\r\nimport { AlertsNavigationModule } from \"@app/main/modules/alerts/alerts.navigation\";\r\nimport { FleetNavigationModule } from \"@app/main/modules/fleet/fleet.navigation\";\r\nimport { FoundationNavigationModule } from \"@app/main/modules/foundation/foundation.navigation\";\r\nimport { BroadcastEvent } from \"@enums/BroadcastEvent\";\r\nimport { SpecialUserPermissions } from \"@enums/SpecialUserPermissions\";\r\nimport { AccountFeatures } from \"@enums/account/AccountFeature\";\r\nimport { IRunBlockRootScope } from \"@interfaces/IRunBlockRootScope\";\r\nimport { UserPlatform } from \"@interfaces/IUser\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { IAccount } from \"@services/account.service\";\r\nimport { BreadcrumbService, IBreadcrumbNameResolver } from \"@services/breadcrumb.service\";\r\nimport { TemperatureNavigationModule } from \"@temperature/temperature.navigation\";\r\nimport { TmsModuleNavigation } from \"@tms/tms.navigation\";\r\nimport { RawParams, StateOrName, StateService } from \"@uirouter/core\";\r\nimport * as moment from \"moment\";\r\nimport { CameraModule } from \"src/app/main/modules/cameras/camera.module.ajs\";\r\nimport { PageStateNames } from \"../class/PageStateNames\";\r\nimport { ResourceType } from \"../enum/ResourceType\";\r\nimport { UserType } from \"../enum/UserType\";\r\nimport { AccountFeatureService, UserRole } from \"./accountFeature.service\";\r\nimport { ConstantsService } from \"./constantsService\";\r\nimport { VehicleService } from \"./vehicle.service\";\r\n\r\nexport class NavigationService {\r\n\r\n readonly defaultFeatureRouteMap: { [feature: number]: string } = {\r\n [AccountFeatures.Breathalock]: FleetNavigationModule.Breathalock,\r\n [AccountFeatures.Messaging]: FleetNavigationModule.Messages,\r\n [AccountFeatures.Tacho]: FleetNavigationModule.Tachograph,\r\n [AccountFeatures.TrackingDevice]: FleetNavigationModule.Vehicles,\r\n [AccountFeatures.Camera]: CameraModule.Default,\r\n }\r\n\r\n readonly defaultResourceManagementRouteMap: { [role: string]: string } = {\r\n [UserRole.ManageDrivers]: ResourceManagementNavigationModule.DriversManagement,\r\n [UserRole.ManageGroups]: ResourceManagementNavigationModule.GroupsManagement,\r\n [UserRole.ManageVehicles]: ResourceManagementNavigationModule.VehiclesManagement,\r\n [UserRole.Administrator]: ResourceManagementNavigationModule.Default\r\n }\r\n\r\n readonly mobileOnlyFeatureRoutes: string[] = [\r\n FleetNavigationModule.Dashboard,\r\n FleetNavigationModule.Vehicles,\r\n FleetNavigationModule.Temperature,\r\n CameraModule.Dashboard,\r\n TmsModuleNavigation.Default\r\n ];\r\n\r\n static $inject = [\"$window\", \"$rootScope\", \"$state\", \"vehicleService\", \"breadcrumbService\", \"accountFeatureService\", \"constantsService\", \"$location\"];\r\n\r\n constructor(\r\n private readonly $window: angular.IWindowService,\r\n private readonly $rootScope: IRunBlockRootScope,\r\n private readonly $state: StateService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly breadcrumbService: BreadcrumbService,\r\n private readonly accountFeatureService: AccountFeatureService,\r\n private readonly constantsService: ConstantsService,\r\n private readonly $location: angular.ILocationService\r\n ) {\r\n }\r\n\r\n goToParent() {\r\n const parentStateName = this.$state.$current.parent.name;\r\n this.$state.go(parentStateName);\r\n }\r\n\r\n updateTitle(title: string) {\r\n this.$state.$current.data.displayName = title;\r\n this.$rootScope.$broadcast(BroadcastEvent.UpdateBreadcrumbs);\r\n }\r\n\r\n updateBreadcrumbNameResolver(nameResolver: IBreadcrumbNameResolver) {\r\n this.breadcrumbService.updateNameResolver(nameResolver);\r\n this.$rootScope.$broadcast(BroadcastEvent.UpdateBreadcrumbs);\r\n }\r\n\r\n redirectToFoundation() {\r\n if (this.$rootScope.currentUser?.Type == UserType.InternalUser) {\r\n this.$state.go(FoundationNavigationModule.Default, this.$rootScope.toStateParams);\r\n }\r\n\r\n if (this.$rootScope.currentUser?.Type == UserType.Engineer) {\r\n this.$state.go(FoundationNavigationModule.DefaultEngineer, this.$rootScope.toStateParams);\r\n }\r\n }\r\n\r\n reloadBrowserLocation(): void {\r\n this.$window.location.reload();\r\n }\r\n\r\n getLocation(): string {\r\n return this.$window.location.pathname;\r\n }\r\n\r\n reloadAll() {\r\n ///* var targetRoute =*/ this.$.reload();\r\n //this.$state.go(this.$state.current.name, {}, { reload: true });\r\n //this.$state.go(this.$state.current, {}, { reload: true });\r\n //this.$state.go(PageStateNames.COMPONENTS_PLANNING, {}, { reload: true });\r\n this.goToDefaultPage(null, true);\r\n //AUTHENTICATION_LOCK\r\n }\r\n\r\n goToDefaultPage(accountData?: IAccount, reload = false) {\r\n var targetRoute = this.$rootScope.toState?.name;\r\n\r\n if (this.$state.current.data?.previous?.name && this.$state.current.data.previous.name !== PageStateNames.AUTHENTICATION_FORGOTPASSWORD) {\r\n targetRoute = this.$state.current.data.previous.name;\r\n }\r\n\r\n if (!targetRoute || !this.canUserAccessRoute(targetRoute)) {\r\n targetRoute = this.getDefaultRouteForUser(accountData);\r\n }\r\n\r\n if (!accountData && targetRoute == PageStateNames.FOUNDATION_CUSTOMERS_OVERVIEW && this.canUserAccessRoute(targetRoute)) {\r\n targetRoute = PageStateNames.FOUNDATION_CUSTOMERS\r\n }\r\n\r\n if (!this.$rootScope.currentUser) {\r\n targetRoute = PageStateNames.AUTHENTICATION_LOGIN;\r\n }\r\n\r\n this.$state.go(targetRoute, this.$rootScope.toStateParams, { reload: reload });\r\n }\r\n\r\n goToVehiclesPage(vehicle: IVehicle, historical = false, date: moment.Moment = null) {\r\n const sanitizedReg = this.vehicleService.getSanitizedReg(vehicle);\r\n\r\n const routeParams: RawParams = { \"vehicle\": sanitizedReg };\r\n if (!historical) {\r\n routeParams[\"panel\"] = \"live\";\r\n }\r\n else {\r\n var isToday = date == null || date.isSame(moment(), \"d\");;\r\n\r\n routeParams[\"panel\"] = \"history\";\r\n routeParams[\"date\"] = isToday ? \"today\" : date.format(\"YYYY-MM-DD\");\r\n }\r\n\r\n this.goToState(FleetNavigationModule.Vehicles, routeParams);\r\n }\r\n\r\n editVehicle(vehicle: IVehicle) {\r\n this.goToState(PageStateNames.COMPONENTS_RESOURCEMANAGEMENT, {\r\n page: \"vehicles\",\r\n model: vehicle\r\n });\r\n }\r\n\r\n goToMessagesPage(vehicle: IVehicle) {\r\n const routeParams: RawParams = { vehicle: vehicle.Id };\r\n\r\n this.goToState(FleetNavigationModule.Messages, routeParams);\r\n }\r\n\r\n go(pageName: PageStateNames, params: RawParams = null, reloadIfSame = true) {\r\n\r\n this.goToState(pageName, params, reloadIfSame);\r\n }\r\n\r\n goTo(pageName: PageStateNames, page: string, params: RawParams = null, reloadIfSame = true) {\r\n\r\n let routeParams: RawParams = {\r\n page: page,\r\n };\r\n\r\n routeParams = Object.assign(routeParams, params);\r\n\r\n this.goToState(pageName, routeParams, reloadIfSame);\r\n }\r\n\r\n goToStateString(stateString: string, params: RawParams = null, reloadIfSame = true) {\r\n let routeParams: RawParams = {};\r\n\r\n routeParams = Object.assign(routeParams, params);\r\n\r\n this.goToState(stateString, routeParams, reloadIfSame);\r\n }\r\n\r\n getRouteParam(paramName: string) {\r\n return this.$state.params[paramName];\r\n }\r\n\r\n getQueryParams(): Partial {\r\n return this.$location.search();\r\n }\r\n\r\n setRouteParam(paramName: string, value: any, reloadPage = true) {\r\n this.$state.params[paramName] = value;\r\n\r\n if (reloadPage) {\r\n this.$state.go(this.$state.current.name, this.$state.params, { location: \"replace\", notify: false, reload: false });\r\n }\r\n }\r\n\r\n clearRouteParam(paramName: string): void {\r\n delete this.$state.params[paramName];\r\n }\r\n\r\n goToResourcesPage(resourceType: ResourceType, modelId: number) {\r\n //app.components_resourceManagement({ page: 'geofences', model: $ctrl.popupModel.Id, modelType: 'geofence', panel: 'edit' })\r\n const typeString = ResourceType[resourceType].toLocaleLowerCase();\r\n this.goTo(PageStateNames.COMPONENTS_RESOURCEMANAGEMENT, `${typeString}s`, { model: modelId, modelType: typeString });\r\n\r\n //const routeParams: RawParams = {\r\n // page: `${typeString}s`,\r\n // model: modelId,\r\n // modelType: typeString\r\n //};\r\n\r\n //this.goToState(PageStateNames.COMPONENTS_RESOURCEMANAGEMENT, routeParams);\r\n }\r\n\r\n goToTMSPage(vehicle: IVehicle) {\r\n const routeParams: RawParams = { page: '', argument1: vehicle.ShortReg };\r\n this.goToState(TmsModuleNavigation.ActiveRoutes, routeParams);\r\n }\r\n\r\n goToPlanningPage(vehicle: IVehicle) {\r\n const routeParams: RawParams = { page: '', argument1: vehicle.ShortReg };\r\n this.goToState(FleetNavigationModule.Planning, routeParams);\r\n }\r\n\r\n goToPlanning() {\r\n const routeParams: RawParams = { page: '' };\r\n this.goToState(FleetNavigationModule.Planning, routeParams);\r\n }\r\n\r\n goToUnauthorizedPage() {\r\n const routeParams: RawParams = { page: '' };\r\n this.goToState(PageStateNames.AUTHORIZATION_UNAUTHORIZED, routeParams);\r\n }\r\n\r\n getState(): StateService {\r\n return this.$state;\r\n }\r\n\r\n getDefaultRouteForUser(accountData?: IAccount): string {\r\n const userIsFoundationUser = this.$rootScope.currentUser?.platform == UserPlatform.Foundation;\r\n\r\n // foundation user\r\n if (userIsFoundationUser) {\r\n\r\n if (this.$rootScope.currentUser?.Type == UserType.InternalUser && this.isRouteAllowedForMobileUser(FoundationNavigationModule.Default)) {\r\n return FoundationNavigationModule.Default;\r\n }\r\n\r\n if (this.$rootScope.currentUser?.Type == UserType.Engineer && this.isRouteAllowedForMobileUser(FoundationNavigationModule.DefaultEngineer)) {\r\n return FoundationNavigationModule.DefaultEngineer;\r\n }\r\n\r\n }\r\n\r\n // no account data\r\n if (!accountData) {\r\n return PageStateNames.AUTHORIZATION_UNAUTHORIZED;\r\n }\r\n\r\n // fleet user\r\n const defaultFleetRoute = this.getDefaultFleetRouteForAccountAndCurrentUser(accountData);\r\n\r\n if (defaultFleetRoute && this.isRouteAllowedForMobileUser(defaultFleetRoute)) {\r\n return defaultFleetRoute;\r\n }\r\n\r\n // camera user\r\n if (this.accountFeatureService.accountAndUserHaveAllFeatureAccess(accountData, this.$rootScope.currentUser, [AccountFeatures.Camera])\r\n && this.isRouteAllowedForMobileUser(CameraModule.Default)) {\r\n return CameraModule.Default;\r\n }\r\n\r\n // geofences user\r\n if (this.accountFeatureService.doesCurrentUserHaveSpecialPermission(SpecialUserPermissions.ManageGeofences)\r\n && this.isRouteAllowedForMobileUser(FleetNavigationModule.Geofences)) {\r\n return FleetNavigationModule.Geofences;\r\n }\r\n\r\n // tms user\r\n if (this.accountFeatureService.accountAndUserHaveAllFeatureAccess(accountData, this.$rootScope.currentUser, [AccountFeatures.TMS])\r\n && this.isRouteAllowedForMobileUser(TmsModuleNavigation.Default)) {\r\n return TmsModuleNavigation.Default;\r\n }\r\n\r\n // reports user\r\n if (this.accountFeatureService.doesCurrentUserHaveSpecialPermission(SpecialUserPermissions.ShowReports)\r\n && this.isRouteAllowedForMobileUser(ReportsNavigationModule.Default)) {\r\n return ReportsNavigationModule.Default;\r\n }\r\n\r\n // resource management user\r\n const defaultResourceManagementRoute = this.getDefaultResourceManagementRouteForCurrentUser();\r\n\r\n if (defaultResourceManagementRoute && this.isRouteAllowedForMobileUser(defaultResourceManagementRoute)) {\r\n return defaultResourceManagementRoute;\r\n }\r\n\r\n // temperatures user\r\n if (this.accountFeatureService.currentUserHasFeatureAccess(AccountFeatures.Temperature)) {\r\n return TemperatureNavigationModule.Default;\r\n }\r\n\r\n // alert review user\r\n if (this.accountFeatureService.currentUserHasRole([UserRole.ManageAlerts])) {\r\n return AlertsNavigationModule.Default;\r\n }\r\n else if (this.accountFeatureService.currentUserHasRole([UserRole.ManageAlertReviews])) {\r\n return AlertsNavigationModule.ReviewAlerts;\r\n }\r\n\r\n // unauthorized\r\n return PageStateNames.AUTHORIZATION_UNAUTHORIZED;\r\n }\r\n\r\n // -------------------\r\n\r\n private isRouteAllowedForMobileUser(route: string): boolean {\r\n const userIsMobile = this.constantsService.getIsMobile();\r\n\r\n if (userIsMobile && !this.mobileOnlyFeatureRoutes.includes(route)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private getDefaultFleetRouteForAccountAndCurrentUser(accountData: IAccount): string {\r\n const fleetFeatures: AccountFeatures[] = [\r\n AccountFeatures.TrackingDevice,\r\n AccountFeatures.Messaging,\r\n AccountFeatures.Tacho,\r\n AccountFeatures.Temperature,\r\n AccountFeatures.Breathalock\r\n ];\r\n\r\n let defaultMappedRoute: string;\r\n\r\n for (let feature of fleetFeatures) {\r\n const matchingDefaultMappedRoute = this.defaultFeatureRouteMap[feature];\r\n\r\n if (matchingDefaultMappedRoute && this.accountFeatureService.accountAndUserHaveFeatureAccess(accountData, this.$rootScope.currentUser, feature)) {\r\n defaultMappedRoute = matchingDefaultMappedRoute;\r\n\r\n break;\r\n }\r\n }\r\n\r\n if (defaultMappedRoute && this.accountFeatureService.doesCurrentUserHaveSpecialPermission(SpecialUserPermissions.ShowHistoricalPlots)) {\r\n return FleetNavigationModule.Default;\r\n }\r\n\r\n return defaultMappedRoute;\r\n }\r\n\r\n private getDefaultResourceManagementRouteForCurrentUser(): string {\r\n if (this.accountFeatureService.currentUserHasRole([UserRole.Administrator])) {\r\n return ResourceManagementNavigationModule.Default;\r\n }\r\n\r\n const resourceManagementRoles: string[] = Object.keys(this.defaultResourceManagementRouteMap);\r\n\r\n let defaultMappedRoute: string;\r\n\r\n for (let role of resourceManagementRoles) {\r\n const matchingDefaultMappedRoute = this.defaultResourceManagementRouteMap[role];\r\n\r\n if (matchingDefaultMappedRoute && this.accountFeatureService.currentUserHasRole([role])) {\r\n defaultMappedRoute = matchingDefaultMappedRoute;\r\n\r\n break;\r\n }\r\n }\r\n\r\n return defaultMappedRoute;\r\n }\r\n\r\n private goToState(to: StateOrName, routeParams: RawParams, reloadIfSame = true) {\r\n const reload = reloadIfSame && (this.$state.current.name.indexOf(to.toString()) == 0);\r\n\r\n this.$state.go(to, routeParams, { location: true, notify: false, reload: reload });\r\n }\r\n\r\n private canUserAccessRoute(route: string): boolean {\r\n if (this.$rootScope.currentUser && route == PageStateNames.AUTHENTICATION_LOGIN) {\r\n return false;\r\n }\r\n\r\n const userIsFoundationUser = this.$rootScope.currentUser?.platform == UserPlatform.Foundation;\r\n const newStateIsFoundation = route.indexOf(FoundationNavigationModule.ParentRoot) == 0;\r\n\r\n return userIsFoundationUser == newStateIsFoundation;\r\n }\r\n}\r\n","import { IPreferencesContent } from \"@app/interfaces/IPreferencesContent\";\r\nimport { Currency } from \"@enums/Currency.enum\";\r\nimport { DistanceMeasurement } from \"@enums/measurements/DistanceMeasurement.enum\";\r\nimport { FuelConsumptionMeasurement } from \"@enums/measurements/FuelConsumptionMeasurement.enum\";\r\nimport { TemperatureMeasurement } from \"@enums/measurements/TemperatureMeasurement.enum\";\r\nimport { VolumeMeasurement } from \"@enums/measurements/VolumeMeasurement\";\r\nimport { ICombinedPreferences } from \"@interfaces/ICombinedPreferences\";\r\nimport { MeasurementCategoryType } from \"@reports/enums/ReportMeasurementType\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { ProductVendor } from \"@videos/enums/CameraProductType\";\r\nimport { IVideoEntry } from \"@videos/models/IVideoEntry\";\r\nimport { IVideoExtensionData } from \"@videos/models/IVideoExtensionData\";\r\nimport * as angular from \"angular\";\r\nimport { SettingsName } from \"../class/SettingsName\";\r\nimport { ColumnDataType } from \"../main/components/reports/enums/ColumnDataType\";\r\nimport { SessionService } from \"./session.service\";\r\n\r\nexport enum UnitConversionType {\r\n Unknown = -1,\r\n Distance,\r\n Speed,\r\n FuelEfficiency,\r\n FuelCapacity,\r\n Currency,\r\n Temperature,\r\n Time\r\n}\r\n\r\nexport interface IUnitConversionOptions {\r\n precision?: number;\r\n scaleLargeNumbers?: boolean;\r\n scaleLargeNumbersLimit?: number;\r\n dataType?: ColumnDataType;\r\n}\r\n\r\nexport class UnitConversionService {\r\n\r\n private readonly kmToMiles = 0.621371;\r\n private readonly milesToKm = 1.609344;\r\n //private milesToMeter = 1609.344;\r\n private readonly mpgToKml = 0.35400619;\r\n private readonly kplToMpgUK = 2.824815; // UK calculation\r\n private readonly kplToMpgUS = 2.352145; // US calculation\r\n\r\n\r\n\r\n private readonly mpgUKToKpl = 0.425144; // UK calculation\r\n private readonly mpgUSToKpl = 0.354006; // US calculation\r\n\r\n private readonly litersToGallons = 0.219969;\r\n private readonly litersToUSGallons = 0.264172;\r\n private readonly gallonsToLiters = 4.54609;\r\n private readonly usGallonsToLiters = 3.78541;\r\n private readonly kplToMpl = 0.6214;\r\n private readonly kplToKpg = 3.78541178; // US calculation\r\n\r\n private userUnitIsImperial = true;\r\n\r\n private userPreferences: ICombinedPreferences;\r\n\r\n static $inject = [\"$filter\", \"sessionService\", \"translationService\"];\r\n\r\n constructor(\r\n private $filter: angular.IFilterService,\r\n private sessionService: SessionService,\r\n private readonly translationService: TranslationService\r\n ) {\r\n\r\n this.getAccountOptions();\r\n }\r\n\r\n smartConvert(input: string | number, unitType: UnitConversionType, options?: IUnitConversionOptions): string {\r\n if (input === null || input === undefined && unitType !== UnitConversionType.Temperature && unitType !== UnitConversionType.FuelCapacity) {\r\n return \"0\";\r\n }\r\n\r\n if (input === null || input === undefined && (unitType === UnitConversionType.Temperature || unitType === UnitConversionType.FuelCapacity)) {\r\n return;\r\n }\r\n\r\n if (!options) {\r\n options = {\r\n precision: 2,\r\n\r\n }\r\n }\r\n\r\n const parsedValue = parseFloat(input.toString());\r\n let convertedValue = this.convert(parsedValue, unitType, options.precision);\r\n\r\n let hasScaledValue = false;\r\n if (options.scaleLargeNumbers && convertedValue > options.scaleLargeNumbersLimit) {\r\n convertedValue = Math.round(convertedValue / 1000);\r\n hasScaledValue = true;\r\n }\r\n\r\n var conversionLabel = this.getConversionLabel(unitType);\r\n if (options.dataType == ColumnDataType.Percent) {\r\n conversionLabel = \"%\";\r\n }\r\n\r\n var placeLabelAtSuffix = this.isLabelSuffix(unitType);\r\n\r\n var displayValue = this.$filter(\"number\")(convertedValue);\r\n\r\n if (hasScaledValue) { displayValue += \"k\"; }\r\n\r\n if (placeLabelAtSuffix) {\r\n displayValue += ` ${conversionLabel}`;\r\n }\r\n else {\r\n displayValue = `${conversionLabel}${displayValue}`;\r\n }\r\n\r\n return displayValue;\r\n }\r\n\r\n convert(input: string | number, unitType: UnitConversionType, precision = 0, imperialToMetricConvert: boolean = false, customPref: number = -1, customPreferenceContent: IPreferencesContent = null) {\r\n\r\n if (typeof input === undefined || input == null) {\r\n console.warn(`Conversion cancelled, no input`);\r\n return 0;\r\n }\r\n\r\n if (!customPreferenceContent) {\r\n this.getAccountOptions();\r\n }\r\n\r\n const preferences: IPreferencesContent = (!!customPreferenceContent) ? customPreferenceContent : this.userPreferences;\r\n\r\n if (!preferences) {\r\n console.warn(`Conversion cancelled, no preferences determined`);\r\n return 0;\r\n }\r\n\r\n const parsedInput = parseFloat(input.toString());\r\n\r\n var returnValue = parsedInput; // Kilometers, Litres and Kilometers Per Liters not require conversion\r\n\r\n switch (unitType) {\r\n case UnitConversionType.Distance:\r\n case UnitConversionType.Speed:\r\n\r\n if (customPref == -1) {\r\n\r\n if (preferences.DistanceMeasurement.Value == DistanceMeasurement.Miles) {\r\n returnValue = returnValue * (imperialToMetricConvert ? this.milesToKm : this.kmToMiles);\r\n }\r\n\r\n }\r\n else {\r\n\r\n if (customPref == DistanceMeasurement.Miles) {\r\n returnValue = returnValue * (imperialToMetricConvert ? this.milesToKm : this.kmToMiles)\r\n }\r\n\r\n }\r\n break;\r\n\r\n case UnitConversionType.FuelCapacity:\r\n if (customPref == -1) {\r\n\r\n switch (preferences?.VolumeMeasurement.Value) {\r\n\r\n case VolumeMeasurement.UsGallon:\r\n returnValue = returnValue * (imperialToMetricConvert ? this.usGallonsToLiters : this.litersToUSGallons);\r\n break;\r\n\r\n case VolumeMeasurement.Gallon:\r\n returnValue = returnValue * (imperialToMetricConvert ? this.gallonsToLiters : this.litersToGallons);\r\n break;\r\n\r\n case VolumeMeasurement.Litre:\r\n default:\r\n break;\r\n\r\n }\r\n }\r\n else {\r\n\r\n switch (customPref) {\r\n case VolumeMeasurement.UsGallon:\r\n\r\n returnValue = returnValue * (imperialToMetricConvert ? this.usGallonsToLiters : this.litersToUSGallons);\r\n break;\r\n\r\n case VolumeMeasurement.Gallon:\r\n\r\n returnValue = returnValue * (imperialToMetricConvert ? this.gallonsToLiters : this.litersToGallons);\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n }\r\n break;\r\n\r\n\r\n case UnitConversionType.FuelEfficiency:\r\n\r\n if (preferences?.FuelConsumptionMeasurement.Value == FuelConsumptionMeasurement.UnitedStatesMilesPerGallon) {\r\n returnValue = returnValue * (imperialToMetricConvert ? this.mpgUSToKpl : this.kplToMpgUS);\r\n }\r\n\r\n if (preferences?.FuelConsumptionMeasurement.Value == FuelConsumptionMeasurement.MilesPerGallon) {\r\n returnValue = returnValue * (imperialToMetricConvert ? this.mpgUKToKpl : this.kplToMpgUK);\r\n }\r\n\r\n if (preferences?.FuelConsumptionMeasurement.Value == FuelConsumptionMeasurement.LitresPer100Kilometres) {\r\n returnValue = 100 / returnValue;\r\n }\r\n break;\r\n\r\n case UnitConversionType.Temperature:\r\n\r\n returnValue = (imperialToMetricConvert ? this.convertTemperatureForSaving(returnValue) : this.convertTemperature(returnValue));\r\n break;\r\n\r\n }\r\n\r\n return this.roundToXDecimalPlaces(returnValue, precision);\r\n }\r\n\r\n convertToDatabaseUnit(input: string | number, unitType: UnitConversionType, precision = 0) {\r\n this.getAccountOptions();\r\n\r\n // For custom purpose only Speed caught for conversion.\r\n // If this methods need to be used for other Types,\r\n // another cases are most likely needed to be created.\r\n switch (unitType) {\r\n case UnitConversionType.Speed:\r\n const shouldConvertToMetric = this.userPreferences.DistanceMeasurement.Value === DistanceMeasurement.Miles;\r\n return this.convert(input, unitType, precision, shouldConvertToMetric);\r\n\r\n default:\r\n return this.convert(input, unitType, precision);\r\n }\r\n }\r\n\r\n convertToUserUnit(input: string | number, unitType: UnitConversionType, precision = 0): number {\r\n this.getAccountOptions();\r\n\r\n return this.convert(input, unitType, precision);\r\n }\r\n\r\n convertToUserUnitWithLabel(input: string | number, unitType: UnitConversionType, precision = 0): string {\r\n this.getAccountOptions();\r\n\r\n const value = this.convert(input, unitType, precision);\r\n const label = this.getConversionLabel(unitType);\r\n\r\n return `${value} ${label}`;\r\n }\r\n\r\n roundToXDecimalPlaces(input: number, precision: number): number {\r\n const modifier = Math.pow(10, precision);\r\n return Math.round(input * modifier) / modifier;\r\n }\r\n\r\n convertUnitWithFormatting(input: string | number, suffixType: UnitConversionType = UnitConversionType.Speed, precision?: number): string {\r\n this.getAccountOptions();\r\n\r\n var precisionToUse = suffixType == UnitConversionType.FuelEfficiency ? 2 : 0 || UnitConversionType.Temperature ? 1 : 0;\r\n if (precision !== undefined) {\r\n precisionToUse = precision;\r\n }\r\n\r\n const convertedUnit = this.convertToUserUnit(input, suffixType, precisionToUse);\r\n return this.$filter(\"number\")(convertedUnit);\r\n }\r\n\r\n convertUnitWithSuffix(input: string | number, suffixType: UnitConversionType = UnitConversionType.Speed, precision?: number): string {\r\n let convertedUnit = this.convertUnitWithFormatting(input, suffixType, precision);\r\n\r\n if (suffixType === UnitConversionType.Currency) {\r\n convertedUnit = `${this.getConversionLabel(suffixType)}${convertedUnit}`;\r\n return convertedUnit;\r\n }\r\n\r\n convertedUnit += suffixType === UnitConversionType.Temperature ? \"\" : \" \";\r\n convertedUnit += this.getConversionLabel(suffixType);\r\n\r\n return convertedUnit;\r\n }\r\n\r\n convertMilesToMeters(milage: number) {\r\n return Math.round(milage * this.milesToKm * 1000);\r\n }\r\n\r\n convertTemperature(temperature: number) {\r\n var temp = temperature;\r\n\r\n this.getAccountOptions();\r\n\r\n if (this.userPreferences.TemperatureMeasurement.Value == TemperatureMeasurement.Fahrenheit) {\r\n temp = Number(this.convertCelsiusToFahrenheit(temperature));\r\n }\r\n\r\n return temp;\r\n }\r\n\r\n convertTemperatureWithSuffix(temperature: number) {\r\n var convertedTemp = this.convertTemperature(temperature).toFixed(1).toString();\r\n\r\n convertedTemp += this.getConversionLabel(UnitConversionType.Temperature);\r\n\r\n return convertedTemp;\r\n }\r\n\r\n convertTemperatureForSaving(temperature: number) {\r\n var temp = temperature;\r\n\r\n this.getAccountOptions();\r\n\r\n if (this.userPreferences.TemperatureMeasurement.Value == TemperatureMeasurement.Fahrenheit) {\r\n temp = Number(this.convertFahrenheitToCelsius(temperature));\r\n }\r\n\r\n return temp;\r\n }\r\n\r\n convertMpgToKml(milage: number) {\r\n return Math.round(milage * this.mpgToKml);\r\n }\r\n\r\n convertCelsiusToFahrenheit(celsius: number) {\r\n var fahren = celsius * 9 / 5 + 32;\r\n\r\n return fahren.toFixed(2);\r\n }\r\n\r\n convertFahrenheitToCelsius(fahrenheit: number) {\r\n return (fahrenheit - 32) * 5 / 9;\r\n }\r\n\r\n getConversionType(suffixType: string): UnitConversionType {\r\n suffixType = suffixType.toLowerCase();\r\n\r\n if (suffixType === \"distance\") {\r\n return UnitConversionType.Distance;\r\n }\r\n else if (suffixType === \"speed\") {\r\n return UnitConversionType.Speed;\r\n }\r\n else if (suffixType === \"fuel\") {\r\n return UnitConversionType.FuelEfficiency;\r\n }\r\n else if (suffixType === \"capacity\") {\r\n return UnitConversionType.FuelCapacity;\r\n }\r\n else if (suffixType === \"temperature\") {\r\n return UnitConversionType.Temperature;\r\n }\r\n else if (suffixType === \"currency\") {\r\n return UnitConversionType.Currency;\r\n }\r\n else if (suffixType === \"time\") {\r\n return UnitConversionType.Time;\r\n }\r\n else if (suffixType === \"none\") {\r\n return UnitConversionType.Unknown;\r\n }\r\n\r\n // Default\r\n return UnitConversionType.Distance;\r\n }\r\n\r\n getConversionLabel(conversionType: UnitConversionType = UnitConversionType.Speed, customPreferenceContent: IPreferencesContent = null): string {\r\n return this.getConversionLabelWithUnitOption(conversionType, customPreferenceContent);\r\n }\r\n\r\n isLabelSuffix(conversionType: UnitConversionType): boolean {\r\n if (conversionType == UnitConversionType.Currency) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n getConversionLabelWithUnitOption(suffixType: UnitConversionType, customPreferenceContent: IPreferencesContent = null): string {\r\n\r\n if (!customPreferenceContent) {\r\n this.getAccountOptions();\r\n }\r\n\r\n const preferences: IPreferencesContent = (!!customPreferenceContent) ? customPreferenceContent : this.userPreferences;\r\n\r\n switch (suffixType) {\r\n case UnitConversionType.Speed:\r\n return preferences?.DistanceMeasurement.Value === DistanceMeasurement.Miles\r\n ? \"mph\"\r\n : \"km/h\";\r\n\r\n case UnitConversionType.Distance:\r\n return preferences?.DistanceMeasurement.Value === DistanceMeasurement.Miles\r\n ? this.translationService.t(\"unitConversionService.miles\")\r\n : \"km\";\r\n\r\n case UnitConversionType.Temperature:\r\n return preferences?.TemperatureMeasurement.Value === TemperatureMeasurement.Celsius\r\n ? \"°C\"\r\n : \"°F\";\r\n\r\n case UnitConversionType.FuelCapacity:\r\n return preferences?.VolumeMeasurement.Value === VolumeMeasurement.Gallon || preferences?.VolumeMeasurement.Value === VolumeMeasurement.UsGallon\r\n ? \"gal.\"\r\n : this.translationService.t(\"unitConversionService.litres\");\r\n case UnitConversionType.FuelEfficiency:\r\n switch (preferences?.FuelConsumptionMeasurement.Value) {\r\n case FuelConsumptionMeasurement.MilesPerGallon:\r\n case FuelConsumptionMeasurement.UnitedStatesMilesPerGallon:\r\n return \"mpg\";\r\n case FuelConsumptionMeasurement.LitresPer100Kilometres:\r\n return \"l/100km\";\r\n case FuelConsumptionMeasurement.KilometresPerLitre:\r\n return \"kpl\";\r\n }\r\n case UnitConversionType.Currency:\r\n switch (preferences?.Currency.Value) {\r\n case Currency.EUR:\r\n return \"€\";\r\n case Currency.GBP:\r\n return \"£\";\r\n case Currency.USD:\r\n return \"$\";\r\n default:\r\n return \"£\";\r\n }\r\n\r\n case UnitConversionType.Time:\r\n return this.translationService.t(\"unitConversionService.minutes\");\r\n\r\n default:\r\n return \"\";\r\n }\r\n }\r\n\r\n convertMeasurementCategoryIntoUnitConversionType(measurementType: MeasurementCategoryType): UnitConversionType {\r\n switch (measurementType) {\r\n case MeasurementCategoryType.Distance:\r\n return UnitConversionType.Distance;\r\n\r\n case MeasurementCategoryType.Fuel:\r\n return UnitConversionType.FuelCapacity;\r\n\r\n case MeasurementCategoryType.FuelEfficiency:\r\n return UnitConversionType.FuelEfficiency;\r\n\r\n case MeasurementCategoryType.Currency:\r\n return UnitConversionType.Currency;\r\n\r\n case MeasurementCategoryType.Speed:\r\n return UnitConversionType.Speed;\r\n\r\n default:\r\n return UnitConversionType.Unknown;\r\n }\r\n }\r\n\r\n convertExtensionDataIntoGForce(videoEntry: IVideoEntry, data: IVideoExtensionData): IVideoExtensionData {\r\n if (!data || !data.VideoAccelerometerData) {\r\n return;\r\n }\r\n\r\n const accelometerData = data.VideoAccelerometerData.map(data => {\r\n const newData = { ...data };\r\n\r\n newData.X = this.convertAccelerationToGUnit(data.X, videoEntry.ProductGroupId);\r\n newData.Y = this.convertAccelerationToGUnit(data.Y, videoEntry.ProductGroupId) * -1; // This is done to make left / right feel more obvious visually\r\n newData.Z = this.convertAccelerationToGUnit(data.Z, videoEntry.ProductGroupId);\r\n\r\n // IT cameras swap lat / lng (aka X and Y around)\r\n if (videoEntry.ProductGroupId == ProductVendor.IntelligentTelematics) {\r\n const x = newData.Y;\r\n const y = newData.X;\r\n\r\n // IT Vision camera seems to invert their long figure...\r\n newData.X = y;\r\n newData.Y = x;\r\n }\r\n\r\n return newData;\r\n });\r\n\r\n return { ...data, VideoAccelerometerData: accelometerData };\r\n }\r\n\r\n convertAccelerationToGUnit(accelerationMSec: number, cameraType: ProductVendor): number {\r\n var gunit = accelerationMSec / 100;\r\n\r\n // RTL cameras are already in G units so no need for an extra conversion\r\n if (cameraType != ProductVendor.RTL) {\r\n // May need to divide by 1000 for IT?\r\n\r\n // 1 g- unit is equal 980.66499997877 gal (cm / s�)\r\n //var accelerationCmSec = accelerationMSec * 100;\r\n var gunit = gunit / 9.8066499997877;\r\n }\r\n\r\n return this.roundToXDecimalPlaces(gunit, 2);\r\n }\r\n\r\n getAccountOptions(): ICombinedPreferences {\r\n if (!this.userPreferences) {\r\n this.userPreferences = this.sessionService.getItem(SettingsName.UserOptions);\r\n }\r\n\r\n return this.userPreferences;\r\n }\r\n\r\n isLabelMetric(label: string): boolean {\r\n const metricLabels: string[] = [\r\n \"km\",\r\n \"kpl\",\r\n \"km/h\",\r\n `${this.translationService.t(\"unitConversionService.litres\")}`\r\n ];\r\n\r\n return metricLabels.includes(label);\r\n }\r\n}\r\n","export enum DateRange {\r\n Today = 0,\r\n Yesterday = 1,\r\n Week = 2,\r\n Last30Days = 3,\r\n Custom = 4,\r\n ThisWeek = 5,\r\n LastWeek = 6,\r\n Latest3Weeks = 7,\r\n ThisMonth = 8,\r\n LastMonth = 9,\r\n\r\n /*\r\n * Last 14 days exclusive of today (i.e. ends yesterday)\r\n */\r\n Last14Days = 10,\r\n Last7Days = 11,\r\n\r\n /*\r\n * Last 14 days inclusive of today\r\n */\r\n Latest14Days = 12,\r\n Latest7Days = 13,\r\n Latest4Weeks = 14\r\n}\r\n","import { IKeyValuePair } from \"@app/interfaces/IKeyValuePair\";\r\nimport { AccountUserType } from \"@enums/UserType\";\r\nimport { IRunBlockRootScope } from \"@interfaces/IRunBlockRootScope\";\r\nimport { IAccountUserMapping, IUser, UserPlatform } from \"@interfaces/IUser\";\r\nimport { IReportDefinition } from \"@reports/models/IReportDefinition\";\r\nimport { AccountFeatures } from \"../enum/account/AccountFeature\";\r\nimport { SpecialUserPermissions } from \"../enum/SpecialUserPermissions\";\r\nimport { AccountService, IAccount } from \"./account.service\";\r\nimport { EnumService } from \"./enum.service\";\r\nimport { TranslationService } from \"./translation.service\";\r\n\r\nexport interface IAccountFeatureDescriptionMap {\r\n [key: number]: IAccountFeatureDescription\r\n}\r\n\r\nexport interface IAccountFeatureDescription {\r\n name: string;\r\n description: string;\r\n enabled: boolean;\r\n feature: AccountFeatures;\r\n hasManageFunctionality: boolean; // used to determine whether or not we need both Read & Manage toggles\r\n}\r\n\r\nexport interface ISpecialUserPermissionDescription {\r\n name: string;\r\n description: string;\r\n permission: SpecialUserPermissions;\r\n}\r\n\r\nexport interface ISpecialUserPermissionDescriptionMap {\r\n [key: number]: ISpecialUserPermissionDescription\r\n}\r\n\r\nexport interface IUserRoleMap {\r\n [key: string]: boolean\r\n}\r\n\r\nexport enum FeatureAccessType {\r\n Read,\r\n Manage\r\n}\r\n\r\nexport class UserRole {\r\n static Administrator: string = \"administrator\";\r\n static History: string = \"history\";\r\n static ManageDrivers: string = \"managedrivers\";\r\n static ManageVehicles: string = \"managevehicles\";\r\n static ManageGeofences: string = \"managegeofences\";\r\n static ManageGroups: string = \"managegroups\";\r\n static ManageAlerts: string = \"managealerts\";\r\n static ManageReportBuilder: string = \"managereportbuilder\";\r\n static ManageAlertReviews: string = \"managealertreviews\";\r\n static ShowReports: string = \"showreports\";\r\n}\r\n\r\nexport class AccountFeatureService {\r\n\r\n featureStringCache: string[] = [];\r\n\r\n static $inject = [\"$rootScope\", \"accountService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly $rootScope: IRunBlockRootScope,\r\n private readonly accountService: AccountService,\r\n private readonly translationService: TranslationService\r\n ) {\r\n }\r\n\r\n currentUserHasFeatureAccess(feature: AccountFeatures, type: FeatureAccessType = FeatureAccessType.Read, skipAccountFeatureCheck: boolean = false): boolean {\r\n const accountData = this.accountService.getAccountDataFromCache();\r\n\r\n return this.accountAndUserHaveFeatureAccess(accountData, this.$rootScope.currentUser, feature, type, skipAccountFeatureCheck);\r\n }\r\n\r\n currentUserHasAnyFeatureAccess(features: AccountFeatures[], type: FeatureAccessType = FeatureAccessType.Read, skipAccountFeatureCheck: boolean = false): boolean {\r\n const accountData = this.accountService.getAccountDataFromCache();\r\n\r\n return this.accountAndUserHaveAnyFeatureAccess(accountData, this.$rootScope.currentUser, features, type, skipAccountFeatureCheck);\r\n }\r\n\r\n currentUserHasAllFeatureAccess(features: AccountFeatures[], type: FeatureAccessType = FeatureAccessType.Read, skipAccountFeatureCheck: boolean = false): boolean {\r\n const accountData = this.accountService.getAccountDataFromCache();\r\n\r\n return this.accountAndUserHaveAllFeatureAccess(accountData, this.$rootScope.currentUser, features, type, skipAccountFeatureCheck);\r\n }\r\n\r\n accountHasFeatureAccess(accountData: IAccount, feature: AccountFeatures): boolean {\r\n return (accountData.Features & feature) === feature;\r\n }\r\n\r\n featureFlagsHaveFeatureAccess(features: AccountFeatures, feature: AccountFeatures): boolean {\r\n return (features & feature) === feature;\r\n }\r\n\r\n accountHasAllFeatureAccess(accountData: IAccount, features: AccountFeatures[]): boolean {\r\n if (!accountData || !features?.length) {\r\n return false;\r\n }\r\n\r\n let hasAllFeatures = true;\r\n\r\n for (let i = 0; i < features.length; i++) {\r\n if (this.accountHasFeatureAccess(accountData, features[i])) {\r\n continue;\r\n }\r\n\r\n hasAllFeatures = false;\r\n break;\r\n }\r\n\r\n return hasAllFeatures;\r\n }\r\n\r\n accountHasAnyFeatureAccess(accountData: IAccount, features: AccountFeatures[]): boolean {\r\n if (!accountData || !features?.length) {\r\n return false;\r\n }\r\n\r\n let isAnyEnabled = false;\r\n\r\n for (let i = 0; i < features.length; i++) {\r\n if (!this.accountHasFeatureAccess(accountData, features[i])) {\r\n continue;\r\n }\r\n\r\n isAnyEnabled = true;\r\n break;\r\n }\r\n\r\n return isAnyEnabled;\r\n }\r\n\r\n accountAndUserHaveFeatureAccess(accountData: IAccount, user: IUser, feature: AccountFeatures, type: FeatureAccessType = FeatureAccessType.Read, skipAccountFeatureCheck: boolean = false): boolean {\r\n const accountHasAccess = this.accountHasFeatureAccess(accountData, feature);\r\n\r\n if (!skipAccountFeatureCheck && !accountHasAccess) {\r\n return false;\r\n }\r\n\r\n if (!this.hasBasePermissionModel(user)) {\r\n return false;\r\n }\r\n\r\n const hasUserManageAccess = (user.CurrentAccountUserMapping.ManageFeatures & feature) === feature;\r\n let hasUserReadAccess = (user.CurrentAccountUserMapping.ReadFeatures & feature) === feature;\r\n\r\n // overwriting the CurrentAccountUserMapping setting as we don't add toggles for these features on user-editor, taking account feature flag instead\r\n if ([AccountFeatures.Can, AccountFeatures.GPS, AccountFeatures.FaultCodes, AccountFeatures.Tyres].includes(feature)) {\r\n hasUserReadAccess = this.accountHasFeatureAccess(accountData, feature);\r\n }\r\n\r\n if (this.isAdmin(user)) {\r\n return true;\r\n }\r\n\r\n if (!hasUserReadAccess) {\r\n return false;\r\n }\r\n\r\n if (type === FeatureAccessType.Manage) {\r\n return hasUserManageAccess;\r\n }\r\n\r\n return hasUserReadAccess;\r\n }\r\n\r\n accountAndUserHaveAnyFeatureAccess(accountData: IAccount, user: IUser, features: AccountFeatures[], type: FeatureAccessType = FeatureAccessType.Read, skipAccountFeatureCheck: boolean = false): boolean {\r\n if (!skipAccountFeatureCheck && !accountData) {\r\n return false;\r\n }\r\n\r\n if (!user || !features?.length) {\r\n return false;\r\n }\r\n\r\n let isAnyEnabled = false;\r\n\r\n for (let i = 0; i < features.length; i++) {\r\n if (!this.accountAndUserHaveFeatureAccess(accountData, user, features[i], type, skipAccountFeatureCheck)) {\r\n continue;\r\n }\r\n\r\n isAnyEnabled = true;\r\n break;\r\n }\r\n\r\n return isAnyEnabled;\r\n }\r\n\r\n accountAndUserHaveAllFeatureAccess(accountData: IAccount, user: IUser, features: AccountFeatures[], type: FeatureAccessType = FeatureAccessType.Read, skipAccountFeatureCheck: boolean = false): boolean {\r\n if (!skipAccountFeatureCheck && !accountData) {\r\n return false;\r\n }\r\n\r\n if (!user || !features?.length) {\r\n return false;\r\n }\r\n\r\n let hasAllFeatures = true;\r\n\r\n for (let i = 0; i < features.length; i++) {\r\n if (this.accountAndUserHaveFeatureAccess(accountData, user, features[i], type, skipAccountFeatureCheck)) {\r\n continue;\r\n }\r\n\r\n hasAllFeatures = false;\r\n break;\r\n }\r\n\r\n return hasAllFeatures;\r\n }\r\n\r\n enableUserMappingFeatureAccess(mapping: IAccountUserMapping, feature: AccountFeatures, type: FeatureAccessType = FeatureAccessType.Read): void {\r\n if (type === FeatureAccessType.Manage) {\r\n mapping.ManageFeatures = mapping.ManageFeatures | feature;\r\n }\r\n\r\n if (type === FeatureAccessType.Read) {\r\n mapping.ReadFeatures = mapping.ReadFeatures | feature;\r\n }\r\n }\r\n\r\n disableUserMappingFeatureAccount(mapping: IAccountUserMapping, feature: AccountFeatures, type: FeatureAccessType = FeatureAccessType.Read): void {\r\n if (type === FeatureAccessType.Manage) {\r\n mapping.ManageFeatures = mapping.ManageFeatures & ~feature;\r\n }\r\n\r\n if (type === FeatureAccessType.Read) {\r\n mapping.ReadFeatures = mapping.ReadFeatures & ~feature;\r\n }\r\n }\r\n\r\n enableAccountFeature(accountData: IAccount, feature: AccountFeatures): void {\r\n accountData.Features = accountData.Features | feature;\r\n }\r\n\r\n disableAccountFeature(accountData: IAccount, feature: AccountFeatures): void {\r\n accountData.Features = accountData.Features & ~feature;\r\n }\r\n\r\n toggleAccountFeature(accountData: IAccount, feature: AccountFeatures): void {\r\n const currentlyEnabled = this.accountHasFeatureAccess(accountData, feature);\r\n\r\n if (currentlyEnabled) {\r\n this.disableAccountFeature(accountData, feature);\r\n return;\r\n }\r\n\r\n this.enableAccountFeature(accountData, feature);\r\n }\r\n\r\n currentUserHasRole(rolesToCheck: string[], allRoles = true): boolean {\r\n if (!rolesToCheck?.length) {\r\n return false;\r\n }\r\n\r\n const user = this.$rootScope.currentUser;\r\n\r\n // If we dont have a user OR we are an internal user who has not set our account mappings, then we cannot access these routes\r\n if (!user || user.platform == UserPlatform.Foundation || !user.CurrentAccountUserMapping) {\r\n return false;\r\n }\r\n\r\n if (!user || user.CurrentAccountUserMapping.Type == AccountUserType.Admin) {\r\n return true;\r\n }\r\n\r\n const rolesUserHas: IUserRoleMap = {\r\n [UserRole.Administrator]: user.CurrentAccountUserMapping.Type < 1,\r\n [UserRole.History]: this.hasSpecialUserPermission(user.CurrentAccountUserMapping, SpecialUserPermissions.ShowHistoricalPlots),\r\n [UserRole.ManageAlerts]: this.hasSpecialUserPermission(user.CurrentAccountUserMapping, SpecialUserPermissions.ManageAlerts),\r\n [UserRole.ManageDrivers]: this.hasSpecialUserPermission(user.CurrentAccountUserMapping, SpecialUserPermissions.ManageDrivers),\r\n [UserRole.ManageGeofences]: this.hasSpecialUserPermission(user.CurrentAccountUserMapping, SpecialUserPermissions.ManageGeofences),\r\n [UserRole.ManageGroups]: this.hasSpecialUserPermission(user.CurrentAccountUserMapping, SpecialUserPermissions.ManageGroups),\r\n [UserRole.ManageVehicles]: this.hasSpecialUserPermission(user.CurrentAccountUserMapping, SpecialUserPermissions.ManageVehicles),\r\n [UserRole.ManageReportBuilder]: this.hasSpecialUserPermission(user.CurrentAccountUserMapping, SpecialUserPermissions.ManageReportBuilder),\r\n [UserRole.ManageAlertReviews]: this.hasSpecialUserPermission(user.CurrentAccountUserMapping, SpecialUserPermissions.ManageAlertReviews),\r\n [UserRole.ShowReports]: this.hasSpecialUserPermission(user.CurrentAccountUserMapping, SpecialUserPermissions.ShowReports),\r\n }\r\n\r\n let userHasAllRoles = true;\r\n let userHasRoles = false;\r\n\r\n rolesToCheck.forEach(role => {\r\n role = role.toLowerCase().trim();\r\n const userInRole = rolesUserHas[role];\r\n\r\n userHasAllRoles = userHasAllRoles && userInRole;\r\n userHasRoles = userHasRoles || userInRole;\r\n });\r\n\r\n if (allRoles) {\r\n return userHasAllRoles;\r\n }\r\n\r\n return userHasRoles;\r\n }\r\n\r\n doesCurrentUserHaveSpecialPermission(permission: SpecialUserPermissions): boolean {\r\n const user = this.$rootScope.currentUser;\r\n\r\n if (!this.hasBasePermissionModel(user)) {\r\n return false;\r\n }\r\n\r\n if (this.isAdmin(user)) {\r\n return true;\r\n }\r\n\r\n return this.hasSpecialUserPermission(user.CurrentAccountUserMapping, permission);\r\n }\r\n\r\n hasSpecialUserPermission(accountUserMapping: IAccountUserMapping, permission: SpecialUserPermissions): boolean {\r\n if (!accountUserMapping.SpecialUserPermissions || !SpecialUserPermissions[permission]) {\r\n return false;\r\n }\r\n\r\n return (accountUserMapping.SpecialUserPermissions & permission) === permission;\r\n }\r\n\r\n getSpecialUserPermissionDescription(permission: SpecialUserPermissions): ISpecialUserPermissionDescription {\r\n const descriptions = this.getSpecialUserPermissionDescriptions();\r\n\r\n return descriptions.find(description => description.permission === permission);\r\n }\r\n\r\n getSpecialUserPermissionDescriptions(): ISpecialUserPermissionDescription[] {\r\n const descriptions: ISpecialUserPermissionDescription[] = [];\r\n\r\n this.getSpecialUserPermissionsEnumKeys().forEach(key => {\r\n descriptions.push({\r\n permission: SpecialUserPermissions[key],\r\n name: this.translationService.t(`SpecialUserPermissionsEnum.${key}`),\r\n description: this.translationService.t(`SpecialUserPermissionDescription.${key}`)\r\n });\r\n });\r\n\r\n descriptions.sort((description1, description2) => description1.name.localeCompare(description2.name));\r\n\r\n return descriptions;\r\n }\r\n\r\n getSpecialUserPermissionsDescriptionsMap(): ISpecialUserPermissionDescriptionMap {\r\n const descriptionsMap: ISpecialUserPermissionDescriptionMap = {};\r\n const descriptions = this.getSpecialUserPermissionDescriptions();\r\n\r\n descriptions.forEach(description => descriptionsMap[description.permission] = description);\r\n\r\n return descriptionsMap;\r\n }\r\n\r\n getFeatureDescriptionsForAccount(accountData: IAccount): IAccountFeatureDescription[] {\r\n return this.getFeatureDescriptions(accountData);\r\n }\r\n\r\n getFeatureDescriptionsForAccountAndUser(accountData: IAccount, user: IUser): IAccountFeatureDescription[] {\r\n if (!this.hasBasePermissionModel(user)) return [];\r\n\r\n return this.getFeatureDescriptions(accountData, user, true);\r\n }\r\n\r\n getFeatureDescriptionsMapForAccount(accountData: IAccount): IAccountFeatureDescriptionMap {\r\n return this.getFeatureDescriptionsMap(accountData);\r\n }\r\n\r\n getFeatureDescriptionsMapForAccountAndUser(accountData: IAccount, user: IUser): IAccountFeatureDescriptionMap {\r\n if (!this.hasBasePermissionModel(user)) return {};\r\n\r\n return this.getFeatureDescriptionsMap(accountData, user, true);\r\n }\r\n\r\n createFeatureDescription(enumKey: string, enabled: boolean = false): IAccountFeatureDescription {\r\n // Skip as we dont want to \"say\" default\r\n if (AccountFeatures[enumKey] === AccountFeatures.Default) {\r\n return;\r\n }\r\n\r\n // Skip GPS as its confusing\r\n if (AccountFeatures[enumKey] === AccountFeatures.GPS) {\r\n return;\r\n }\r\n\r\n // Ignoring these for now\r\n if ([AccountFeatures.Can, AccountFeatures.FaultCodes, AccountFeatures.Tyres].includes(AccountFeatures[enumKey])) {\r\n return;\r\n }\r\n\r\n let name = this.translationService.tEnum(AccountFeatures, \"AccountFeatures\", AccountFeatures[enumKey]);\r\n let description = this.translationService.t(`AccountFeaturesDescription.${enumKey}`);\r\n\r\n // Added to support the use of Planning when TMS is toggled off on an account\r\n if (AccountFeatures[enumKey] === AccountFeatures.TMS && !enabled) {\r\n name = this.translationService.t(\"Common.Planning\");\r\n description = this.translationService.t(`AccountFeaturesDescription.Planning`);\r\n }\r\n\r\n return {\r\n name: name,\r\n description: description,\r\n feature: AccountFeatures[enumKey],\r\n enabled: enabled,\r\n hasManageFunctionality: this.hasManageFunctionality(AccountFeatures[enumKey])\r\n }\r\n }\r\n\r\n getDescriptionsForFeaturesFlag(accountFeatures: AccountFeatures): IAccountFeatureDescription[] {\r\n const features: IAccountFeatureDescription[] = [];\r\n\r\n this.getAccountFeaturesEnumKeys().forEach(enumKey => {\r\n\r\n const enabled = this.featureFlagsHaveFeatureAccess(accountFeatures, AccountFeatures[enumKey]);\r\n const newFeatureDescription = this.createFeatureDescription(enumKey, enabled);\r\n\r\n if (!newFeatureDescription) {\r\n return;\r\n }\r\n\r\n features.push(newFeatureDescription);\r\n });\r\n\r\n features.sort((feature1, feature2) => feature1.name.localeCompare(feature2.name));\r\n\r\n return features;\r\n }\r\n\r\n printAccountFeatureListForAccount(accountData: IAccount): void {\r\n const featureList: IAccountFeatureDescription[] = this.getFeatureDescriptions(accountData);\r\n\r\n featureList.forEach(feature => {\r\n const icon = feature.enabled ? \"✅\" : \"🚫\";\r\n\r\n console.log(`${icon} ${feature.name}`);\r\n });\r\n }\r\n\r\n getFeatureString(features: AccountFeatures): string {\r\n if (this.featureStringCache[features]) {\r\n return this.featureStringCache[features];\r\n }\r\n\r\n const featureString = this.getDescriptionsForFeaturesFlag(features).reduce((x, y) => {\r\n if (y.enabled) {\r\n return x + (x ? \", \" : \"\") + y.name;\r\n }\r\n\r\n return x;\r\n }, \"\");\r\n\r\n this.featureStringCache[features] = featureString;\r\n\r\n return featureString;\r\n }\r\n\r\n reportTypeMappings = [\r\n { reportType: \"Camera\", accountFeature: [AccountFeatures.Camera] },\r\n { reportType: \"VideoStreaming\", accountFeature: [AccountFeatures.Camera] },\r\n { reportType: \"Tacho\", accountFeature: [AccountFeatures.Tacho] },\r\n { reportType: \"Temperature\", accountFeature: [AccountFeatures.Temperature] },\r\n { reportType: \"TemperatureOutOfBounds\", accountFeature: [AccountFeatures.Temperature] },\r\n { reportType: \"AlcolockReadings\", accountFeature: [AccountFeatures.Breathalock] },\r\n { reportType: \"Alcolock\", accountFeature: [AccountFeatures.Breathalock] },\r\n { reportType: \"Journey\", accountFeature: [AccountFeatures.TrackingDevice, AccountFeatures.Can, AccountFeatures.Camera] },\r\n { reportType: \"StationaryLocation\", accountFeature: [AccountFeatures.TrackingDevice, AccountFeatures.Can, AccountFeatures.Camera] },\r\n { reportType: \"GeofenceVisit\", accountFeature: [AccountFeatures.TrackingDevice, AccountFeatures.Can, AccountFeatures.Camera] },\r\n { reportType: \"GeofenceVisits\", accountFeature: [AccountFeatures.TrackingDevice, AccountFeatures.Can, AccountFeatures.Camera] },\r\n { reportType: \"TMS\", accountFeature: [AccountFeatures.TrackingDevice, AccountFeatures.Can] },\r\n { reportType: \"VehicleInput\", accountFeature: [AccountFeatures.TrackingDevice, AccountFeatures.Can] },\r\n ]\r\n\r\n isReportFeatureEnabledOnAccount(accountData: IAccount, reportDefinition: IReportDefinition): boolean {\r\n if (reportDefinition.TableDefinition.ReportFeatures == undefined || reportDefinition.TableDefinition.ReportFeatures == 0) {\r\n return true;\r\n }\r\n\r\n return (accountData.Features & reportDefinition.TableDefinition.ReportFeatures) > 0;\r\n }\r\n\r\n isAnyReportTypeEnabled(accountData: IAccount, reportTypes: string): boolean {\r\n let enabled = true;\r\n\r\n reportTypes.split(\",\").forEach(reportType => {\r\n enabled = this.isReportTypeEnabled(accountData, reportType);\r\n });\r\n\r\n return enabled;\r\n }\r\n\r\n isReportTypeEnabled(accountData: IAccount, reportType: string): boolean {\r\n let enabled = true;\r\n\r\n this.reportTypeMappings.forEach(mapping => {\r\n const currentUser = this.$rootScope.currentUser;\r\n\r\n if (mapping.reportType === reportType.replace(/\\s/g, '') && !this.accountAndUserHaveAnyFeatureAccess(accountData, currentUser, mapping.accountFeature)) {\r\n enabled = false;\r\n }\r\n });\r\n\r\n return enabled;\r\n }\r\n\r\n findFeaturesFromFeaturesEnum(value: number): AccountFeatures[] {\r\n const features: IKeyValuePair[] = EnumService.enumToArray(\"AccountFeatures\", AccountFeatures);\r\n const includedFeatures: AccountFeatures[] = [];\r\n\r\n if (!features.length) {\r\n return includedFeatures;\r\n }\r\n\r\n features.sort((feature1: IKeyValuePair, feature2: IKeyValuePair) => {\r\n return (+feature2.value) - (+feature1.value)\r\n });\r\n\r\n features.forEach((feature, index) => {\r\n const enumValue: number = +feature.value;\r\n\r\n if (value == enumValue || value / enumValue >= 1) {\r\n includedFeatures.push(enumValue);\r\n value -= enumValue;\r\n }\r\n });\r\n\r\n return includedFeatures;\r\n }\r\n\r\n getIconForFeature(feature: AccountFeatures) {\r\n switch (feature) {\r\n case AccountFeatures.Camera:\r\n return `videocam`;\r\n\r\n case AccountFeatures.GPS:\r\n return `near_me`;\r\n\r\n default:\r\n return `token`;\r\n }\r\n }\r\n\r\n // ---\r\n\r\n private hasBasePermissionModel(user: IUser): boolean {\r\n return (user && user.platform !== UserPlatform.Foundation && !!user.CurrentAccountUserMapping);\r\n }\r\n\r\n private isAdmin(user: IUser): boolean {\r\n return user?.CurrentAccountUserMapping?.Type == AccountUserType.Admin;\r\n }\r\n\r\n private getFeatureDescriptionsMap(accountData: IAccount, user: IUser = null, requireUser: boolean = false): IAccountFeatureDescriptionMap {\r\n const descriptionsMap: IAccountFeatureDescriptionMap = {};\r\n const descriptions = (requireUser)\r\n ? this.getFeatureDescriptions(accountData, user, requireUser)\r\n : this.getFeatureDescriptions(accountData);\r\n\r\n descriptions.forEach(description => descriptionsMap[description.feature] = description);\r\n\r\n return descriptionsMap;\r\n }\r\n\r\n private getFeatureDescriptions(accountData: IAccount, user: IUser = null, requireUser: boolean = false): IAccountFeatureDescription[] {\r\n const features: IAccountFeatureDescription[] = [];\r\n\r\n this.getAccountFeaturesEnumKeys().forEach(enumKey => {\r\n\r\n const enabled = (requireUser)\r\n ? this.accountAndUserHaveFeatureAccess(accountData, user, AccountFeatures[enumKey])\r\n : this.accountHasFeatureAccess(accountData, AccountFeatures[enumKey]);\r\n\r\n const newFeatureDescription = this.createFeatureDescription(enumKey, enabled);\r\n\r\n if (!newFeatureDescription) {\r\n return;\r\n }\r\n\r\n features.push(newFeatureDescription);\r\n });\r\n\r\n features.sort((feature1, feature2) => feature1.name.localeCompare(feature2.name));\r\n\r\n return features;\r\n }\r\n\r\n private getSpecialUserPermissionsEnumKeys(): string[] {\r\n return Object.keys(SpecialUserPermissions).filter(key => !isNaN(Number(SpecialUserPermissions[key])) && SpecialUserPermissions[key] > 0);\r\n }\r\n\r\n private getAccountFeaturesEnumKeys(): string[] {\r\n return Object.keys(AccountFeatures).filter(key => !isNaN(Number(AccountFeatures[key])) && AccountFeatures[key] > 0);\r\n }\r\n\r\n private hasManageFunctionality(feature: AccountFeatures): boolean {\r\n const featuresWithManageFunctionality: AccountFeatures[] = [\r\n AccountFeatures.TMS\r\n ];\r\n\r\n return featuresWithManageFunctionality.includes(feature);\r\n }\r\n}\r\n","import { HybridServiceAccessor } from \"@app/common/hybrid-service-accessor\";\r\nimport { IPeripheral } from \"@app/interfaces/IPeripheral\";\r\nimport { ITagVehicleMapping } from \"@app/interfaces/ITag\";\r\nimport { IVehiclePeripheralMapping } from \"@app/interfaces/IVehiclePeripheralMapping\";\r\nimport { IVehicleQueryOptions } from \"@app/interfaces/IVehicleQueryOptions\";\r\nimport { CameraOnlineStatus } from \"@app/main/components/videos/models/camera-online-status\";\r\nimport { CameraOnlineHistoryService } from \"@app/main/components/videos/services/camera-online-history.service\";\r\nimport { AccountFeatures } from \"@enums/account/AccountFeature\";\r\nimport { UnitStatus } from \"@enums/UnitStatus\";\r\nimport { VehicleType } from \"@enums/VehicleType.enum\";\r\nimport { FoundationPeripheralService } from \"@foundation/_services/peripheral.service.ajs\";\r\nimport { ICombinedPreferences } from \"@interfaces/ICombinedPreferences\";\r\nimport { IKeyValuePair } from \"@interfaces/IKeyValuePair\";\r\nimport { IPlot, IPlotTemperatureRecord } from \"@interfaces/IPlot\";\r\nimport { IProbe } from \"@interfaces/IProbe\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { IGroup } from \"@interfaces/IVehicleGroup\";\r\nimport { HardwareSource } from \"@interfaces/IVehicleInput\";\r\nimport { IVehicleTrailerMapping } from \"@interfaces/IVehicleTrailerMapping\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport * as angular from \"angular\";\r\nimport * as moment from \"moment\";\r\nimport { SettingsName } from \"../class/SettingsName\";\r\nimport { IVorRecord } from \"../main/components/resourceManagement/vor/vor.interfaces\";\r\nimport { CacheService } from \"./cache.Service\";\r\nimport { ConstantsService } from \"./constantsService\";\r\nimport { EnumService } from \"./enum.service\";\r\nimport { PlotService } from \"./plot.service\";\r\nimport { SessionService } from \"./session.service\";\r\nimport { TagResourceType, TagsService } from \"./tags.service\";\r\nimport { VeriDate } from \"./veriDate.service\";\r\nimport { VorService } from \"./vor.service\";\r\n\r\nexport interface IVehicleFeatureSet {\r\n VehicleId: number;\r\n SupportedFeatures: AccountFeatures;\r\n LatestFeatureDateTime: { Item1: AccountFeatures, Item2: string /* Date */ }[];\r\n}\r\n\r\nexport interface IGetVehicleOptions {\r\n includeTrailerMappings?: boolean;\r\n includeVOR?: boolean;\r\n includeProbes?: boolean;\r\n includeLatestPlots?: boolean;\r\n includeLatestTemp?: boolean;\r\n includePeripheralMappings?: boolean;\r\n includeTags?: boolean;\r\n includeAllVehicles?: boolean;\r\n\r\n invalidateCache?: boolean;\r\n dontCopy?: boolean;\r\n}\r\n\r\nexport interface ISpeedingEvent {\r\n PlotId: number;\r\n VehicleId: number;\r\n DriverId: number;\r\n PtvRoadSegmentId: number;\r\n DateTime: string;\r\n PlotSpeedKph: number;\r\n SpeedLimitKph: number;\r\n}\r\n\r\nexport class VehicleService {\r\n private readonly cameraOnlineHistoryService = \r\n new HybridServiceAccessor(\"cameraOnlineHistoryService\", this.$injector);\n\r\n userOptions: ICombinedPreferences;\r\n isDemoSite: boolean;\r\n\r\n private vehiclesCache = \"vehiclesCache\";\r\n private vehicleProbesCache = \"vehicleProbesCache\";\r\n\r\n static $inject = [\"$http\", \"$q\", \"cacheService\", \"tagsService\", \"plotService\", \"sessionService\", \"vorService\", \"veriDate\", \"constantsService\", \"translationService\", \"foundationPeripheralService\", \"$injector\"];\r\n\r\n constructor(\r\n private readonly $http: angular.IHttpService,\r\n private readonly $q: angular.IQService,\r\n private readonly cacheService: CacheService,\r\n private readonly tagsService: TagsService,\r\n private readonly plotService: PlotService,\r\n private readonly sessionService: SessionService,\r\n private readonly vorService: VorService,\r\n private readonly veriDate: VeriDate,\r\n private readonly constantsService: ConstantsService,\r\n private readonly translationService: TranslationService,\r\n private readonly foundationPeripheralService: FoundationPeripheralService,\r\n private readonly $injector: angular.auto.IInjectorService\r\n ) {\r\n this.isDemoSite = this.constantsService.getIsDemoSite();\r\n this.cacheService.createCache(this.vehiclesCache, { maxAge: 60 * 60 * 1000 });\r\n this.cacheService.createCache(this.vehicleProbesCache, { maxAge: 60 * 60 * 1000 });\r\n }\r\n\r\n vehicleSearchPredicate(vehicle: IVehicle, text: string): boolean {\r\n return vehicle.ShortReg.toLowerCase().indexOf(text) >= 0 || vehicle.Reg.toLowerCase().indexOf(text) >= 0;\r\n }\r\n\r\n searchVehicles(vehicles: IVehicle[], text: string) {\r\n return vehicles.filter(v => this.vehicleSearchPredicate(v, text));\r\n }\r\n\r\n createVehicleMap(vehicles: IVehicle[]): Map {\r\n return new Map(vehicles.map(a => [a.Id, a]));\r\n }\r\n\r\n isNonDrivableVehicleType(vehicle: IVehicle): boolean {\r\n return vehicle.VehicleType == VehicleType.Trailer\r\n || vehicle.VehicleType == VehicleType.Plant\r\n || vehicle.VehicleType == VehicleType.Asset;\r\n }\r\n\r\n findVehicleByReg(vehicles: IVehicle[], regToFind: string) {\r\n var lowerCaseReg = regToFind.toLowerCase().trim();\r\n\r\n for (let i = 0; i < vehicles.length; i++) {\r\n const vehicle = vehicles[i];\r\n\r\n if (this.getSanitizedReg(vehicle) === this.sanitizeTextForUrl(lowerCaseReg)) {\r\n return vehicle;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n getSanitizedReg(vehicle: IVehicle, sanitizeDelimeter = \"\") {\r\n return this.sanitizeTextForUrl(vehicle.ShortReg);\r\n }\r\n\r\n getVehicleDepot(vehicleId: number, depots: IGroup[]): IGroup {\r\n for (var i = 0; i < depots.length; i++) {\r\n const depot = depots[i];\r\n\r\n if (depot.VehicleIds.find(vId => vId === vehicleId)) {\r\n return depot;\r\n }\r\n };\r\n\r\n return null;\r\n }\r\n\r\n // Todo: Shouldnt be here\r\n sanitizeTextForUrl(text: string, sanitizeDelimeter = \"\") {\r\n return text.replace(/\\W/g, \"\") // \\W is the equivalent of [^0-9a-zA-Z_]\r\n .replace(new RegExp(\" \", \"g\"), sanitizeDelimeter).toLowerCase();\r\n }\r\n\r\n getVehicleFeatureSet(vehicleId: number, invalidateCache = false): angular.IPromise {\r\n return this.$http({\r\n url: \"/api/vehicles/featureset\",\r\n method: \"GET\",\r\n cache: true,\r\n params: { vehicleId: vehicleId, minsToLive: 5, invalidateCache: invalidateCache }\r\n }).then((result: angular.IHttpResponse) => {\r\n\r\n return result.data;\r\n });\r\n }\r\n\r\n getVehicleFeatureSets(invalidateCache = false): angular.IPromise {\r\n return this.$http({\r\n url: \"/api/vehicles/featuresets\",\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 5, invalidateCache: invalidateCache }\r\n }).then((result: angular.IHttpResponse) => {\r\n\r\n return result.data;\r\n });\r\n }\r\n\r\n getActiveTrailerMappings(invalidateCache: boolean): angular.IPromise {\r\n\r\n return this\r\n .$http({\r\n url: \"/api/trailers/mappings/active\",\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 5, invalidateCache: invalidateCache }\r\n })\r\n .then((result: angular.IHttpResponse) => {\r\n\r\n //result.data.forEach(mapping => {\r\n // if (/*mapping.VehicleId == 97263 ||*/ mapping.TrailerId == 96246) {\r\n // console.log(mapping);\r\n // }\r\n //});\r\n\r\n return result.data;\r\n });\r\n }\r\n\r\n getVehicleTrailerMappings(vehicleId: number, startTime: moment.Moment, endTime: moment.Moment, invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/trailers/mappings/${vehicleId}/`,\r\n method: \"GET\",\r\n cache: true,\r\n params: {\r\n start: startTime.toISOString(),\r\n end: endTime.toISOString(),\r\n minsToLive: 5,\r\n invalidateCache: invalidateCache\r\n }\r\n })\r\n .then((result: angular.IHttpResponse) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n getVehicleTrailerMappingsWithVehicles(vehicleId: number, startTime: moment.Moment, endTime: moment.Moment, invalidateCache = false): angular.IPromise {\r\n var vehiclePromise = this.getVehicles({ includePeripheralMappings: true });\r\n var trailerAssociationPromise = this.getVehicleTrailerMappings(vehicleId, startTime, endTime, invalidateCache);\r\n\r\n return this.$q.all([vehiclePromise, trailerAssociationPromise]).then(([vehicles, trailerAssociations]) => {\r\n trailerAssociations.forEach(ta => {\r\n ta.vehicle = this.findVehicle(vehicles, ta.VehicleId);\r\n ta.trailer = this.findVehicle(vehicles, ta.TrailerId);\r\n });\r\n\r\n return trailerAssociations;\r\n });\r\n }\r\n\r\n // Todo - Dont call these if not required, currently happening on every call\r\n // trailer mappings\r\n // probes\r\n // vor?\r\n\r\n getVehicle(vehicleId: number, options?: IGetVehicleOptions): angular.IPromise {\r\n return this.getVehicles(options)\r\n .then(vehicles => {\r\n return this.findVehicle(vehicles, vehicleId);\r\n });\r\n }\r\n\r\n getVehicleFromDatabase(vehicleId: number, options?: IGetVehicleOptions): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/vehicles/${vehicleId}`,\r\n method: \"GET\"\r\n })\r\n .then((result: angular.IHttpResponse) => {\r\n return result.data;\r\n });\r\n }\n\n getVehiclesBasic(queryOptions?: IVehicleQueryOptions): angular.IPromise {\n return this.getVehiclesFromDatabase(queryOptions);\r\n }\r\n\r\n getVehicles(options?: IGetVehicleOptions): angular.IPromise {\r\n this.getUserOptions();\r\n\r\n const vehiclesPromise = this.getOrRetreiveVehicles(options?.invalidateCache, options?.dontCopy)\r\n .then(vehicles => {\r\n return this.isDemoSite ? this.mapVehiclesRegsForDemo(vehicles) : vehicles;\r\n });\r\n\r\n const tagMappingPromise = options?.includeTags ? this.tagsService.getTagVehicleMappings({}, options?.invalidateCache) : this.$q.when([]);\r\n const trailerMappingPromise = options?.includeTrailerMappings ? this.getActiveTrailerMappings(options?.invalidateCache) : this.$q.when([]);\r\n const vorPromise = options?.includeVOR ? this.vorService.getCurrentRecords(options?.invalidateCache) : this.$q.when([]);\r\n const probePromise = options?.includeProbes ? this.getVehicleProbesForAccount() : this.$q.when([]);\r\n const tempPromise = options?.includeLatestTemp ? this.getLatestVehicleTemperatureRecords() : this.$q.when([]);\r\n const plotsPromise = options?.includeLatestPlots ? this.plotService.getLatestPlots() : this.$q.when([]);\r\n const peripheralPromise = options?.includePeripheralMappings ? this.foundationPeripheralService.getAllPeripherals() : this.$q.when([]);\r\n const peripheralMappingPromise = options?.includePeripheralMappings ? this.foundationPeripheralService.getAllPeripheralMappings() : this.$q.when([]);\r\n const onlineStatusesPromise = options?.includePeripheralMappings ? this.cameraOnlineHistoryService.service.getCameraOnlineStatuses() as angular.IPromise : this.$q.when([]);\r\n\r\n\r\n return this.$q\r\n .all([\r\n tagMappingPromise,\r\n vehiclesPromise,\r\n vorPromise,\r\n trailerMappingPromise,\r\n probePromise,\r\n tempPromise,\r\n plotsPromise,\r\n peripheralPromise,\r\n peripheralMappingPromise,\r\n onlineStatusesPromise\r\n ]).then(([\r\n tagMappings,\r\n vehicles,\r\n vorRecords,\r\n trailerMappings,\r\n probes,\r\n tempRecords,\r\n plots,\r\n peripherals,\r\n peripheralMappings,\r\n onlineStatuses]) => {\r\n\r\n this.tagsService.mapTagMappingsToResources(tagMappings, vehicles, TagResourceType.Vehicle);\r\n\r\n if (options?.includePeripheralMappings) {\r\n\r\n this.foundationPeripheralService.mapPeripheralsAndVehicles(vehicles, peripherals, peripheralMappings, onlineStatuses)\r\n }\r\n\r\n if (vehicles) {\r\n vehicles = vehicles.filter(v => {\r\n return this.shouldDisplayVehicle(v, options);\r\n });\r\n }\r\n\r\n this.mapRecordsToVehicles(vehicles, plots, trailerMappings, vorRecords, probes, tempRecords);\r\n return vehicles;\r\n\r\n })\r\n\r\n }\r\n\r\n private mapVehiclesRegsForDemo(vehicles: IVehicle[]): IVehicle[] {\r\n return vehicles.map((vehicle, index) => {\r\n const reg = `V-${index + 1}`;\r\n\r\n return {\r\n ...vehicle,\r\n ShortReg: reg,\r\n Reg: reg\r\n }\r\n })\r\n }\r\n\r\n private mapRecordsToVehicles(\r\n vehicles: IVehicle[],\r\n plots: IPlot[],\r\n trailerMappings: IVehicleTrailerMapping[],\r\n vorRecords: IVorRecord[],\r\n probes: IProbe[], tempRecords: IPlotTemperatureRecord[],\r\n ) {\r\n this.setVehiclePlots(vehicles, plots);\r\n\r\n vehicles.forEach(vehicle => {\r\n this.mapTrailersToVehicle(vehicle, vehicles, trailerMappings);\r\n this.mapProbesToVehicle(vehicle, probes);\r\n this.mapVorToVehicle(vehicle, vorRecords);\r\n this.mapTempRecordsToVehicle(vehicle, tempRecords);\r\n });\r\n }\r\n\r\n private mapTempRecordsToVehicle(vehicle: IVehicle, tempRecords: IPlotTemperatureRecord[]) {\r\n vehicle.Temperatures = tempRecords.filter(r => r.VehicleId == vehicle.Id);\r\n\r\n }\r\n\r\n //mapVorToVehicles(vehicles: IVehicle[], vorRecords: IVorRecord[]): IVehicle[] {\r\n // vorRecords.forEach(vorRecord => {\r\n // var vehicle = vehicles.filter(vehicle => vehicle.Id === vorRecord.VehicleId).firstOrDefault();\r\n\r\n // if (vehicle) {\r\n // vehicle.vorRecord = vorRecord;\r\n // }\r\n // });\r\n\r\n // return vehicles;\r\n //}\r\n\r\n mapTrailersToVehicle(vehicle: IVehicle, vehicles: IVehicle[], trailerMappings: IVehicleTrailerMapping[]) {\r\n // Clear out any existing mappings\r\n if (vehicle.attachedTrailers) {\r\n vehicle.attachedTrailers.forEach(trailer => {\r\n trailer.tractor = null;\r\n });\r\n }\r\n\r\n vehicle.attachedTrailers = [];\r\n\r\n if (this.userOptions?.TrailerAssociations.Value) {\r\n var vehicleMappings = trailerMappings.filter(mapping => vehicle.Id == mapping.VehicleId);\r\n vehicleMappings.forEach(mapping => {\r\n //var vehicle = this.findVehicle(vehicles, mapping.VehicleId);\r\n var trailer = this.findVehicle(vehicles, mapping.TrailerId);\r\n\r\n if (vehicle && trailer) {\r\n trailer.tractor = vehicle;\r\n trailer.trailerMapping = mapping;\r\n\r\n vehicle.attachedTrailers.push(trailer);\r\n\r\n if (vehicle.attachedTrailers.length > 1) {\r\n console.error(\"Two trailers attached to a single tractor\", vehicle.attachedTrailers, mapping, trailerMappings);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n mapVorToVehicle(vehicle: IVehicle, vorRecords: IVorRecord[]) {\r\n\r\n vehicle.vorRecord = vorRecords.find(vor => vor.VehicleId == vehicle.Id);\r\n }\r\n\r\n updateVehicle(vehicle: IVehicle, invalidateCache = false): angular.IPromise {\r\n\r\n return this.$http({\r\n url: `/api/vehicles/`,\r\n method: \"POST\",\r\n data: vehicle,\r\n params: { invalidateCache }\r\n }).then((result: angular.IHttpPromiseCallbackArg) => {\r\n\r\n return this.tagsService.saveResourceTags(vehicle, TagResourceType.Vehicle).then(() => {\r\n\r\n this.updateOrInsertVehicleCache(vehicle);\r\n\r\n return result;\r\n });\r\n });\r\n\r\n }\r\n\r\n updateOrInsertVehicleCache(vehicle: IVehicle): void {\r\n this.cacheService.addOrUpdateItem(this.vehiclesCache, vehicle, (v1, v2) => v1.Id == v2.Id);\r\n }\r\n\r\n setVehiclePlots(vehicles: IVehicle[], plots: IPlot[]): void {\r\n if (!plots || plots.length == 0) {\r\n return;\r\n }\r\n\r\n const plotMap = new Map(plots.map(plot => [plot.VehicleId, plot]));\r\n const twoDaysAgo = moment().add(-2, \"day\");\r\n\r\n vehicles.forEach(vehicle => {\r\n const plot = plotMap.get(vehicle.Id);\r\n\r\n if (plot) {\r\n vehicle.Plot = plot;\r\n vehicle.PlotId = plot.Id;\r\n }\r\n\r\n const vehicleHasPlotFromLastTwoDays = vehicle.Plot && vehicle.Plot.UtcMoment && vehicle.Plot.UtcMoment.isAfter(twoDaysAgo);\r\n\r\n vehicle.unitStatus = vehicleHasPlotFromLastTwoDays\r\n ? UnitStatus.Responding\r\n : UnitStatus.NoResponseWithin48Hours;\r\n });\r\n }\r\n\r\n updateVehicleProbe(probe: IProbe, invalidateCache = false): angular.IPromise {\r\n // Angular version in TemperatureProbeService\r\n return this\r\n .$http({\r\n url: \"/api/temperature/probes\",\r\n method: \"POST\",\r\n cache: invalidateCache,\r\n data: probe\r\n })\r\n .then((result: angular.IHttpResponse) => {\r\n this.cacheService.addOrUpdateItem(this.vehicleProbesCache, probe, (v1, v2) => v1.Id == v2.Id);\r\n\r\n return result.data;\r\n });\r\n }\r\n\r\n getVehicleSpeedingEvents(vehicle: IVehicle, startTime: moment.Moment, endTime: moment.Moment, invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/speeding/events/${vehicle.Id}`,\r\n method: \"GET\",\r\n cache: true,\r\n params: {\r\n start: startTime.toISOString(),\r\n end: endTime.toISOString(),\r\n minsToLive: 60,\r\n invalidateCache: invalidateCache\r\n }\r\n })\r\n .then((response: angular.IHttpResponse) => {\r\n\r\n return response.data;\r\n });\r\n }\r\n\r\n getProbes(vehicleId: number, invalidateCache = false): angular.IPromise {\r\n // Angular version in TemperatureProbeService\r\n return this\r\n .$http({\r\n url: `/api/temperature/probes/${vehicleId}`,\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 60, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getVehicleProbes(vehicle: IVehicle, invalidateCache = false): angular.IPromise {\r\n return this.getProbes(vehicle.Id, invalidateCache)\r\n .then((probes: IProbe[]) => {\r\n return this.sanitiseVehicleProbes(vehicle, probes);\r\n });\r\n }\r\n\r\n getProbesFromDatabase(vehicleId: number, invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/temperature/probes/${vehicleId}`,\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 60, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpResponse) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n sanitiseVehicleProbes(vehicle: IVehicle, probes: IProbe[]): IProbe[] {\r\n probes.forEach(probe => {\r\n this.cleanVehicleProbeName(vehicle.Reg, probe);\r\n this.cleanVehicleProbeName(vehicle.ShortReg, probe);\r\n probe.showProbe = true;\r\n probe.canChangeZone = probe.Source !== HardwareSource.Ibox && probe.Source !== HardwareSource.Carrier;\r\n });\r\n\r\n return probes;\r\n }\r\n\r\n getVehicleProbesForAccount(): angular.IPromise {\r\n // Angular version in TemperatureProbeService\r\n return this\r\n .$http({\r\n url: `/api/temperature/probes`,\r\n method: \"GET\",\r\n params: { minsToLive: 60 }\r\n })\r\n .then((response: angular.IHttpResponse) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n cleanVehicleProbeName(vehicleReg: string, probe: IProbe) {\r\n // Deprecated - use TemperatureProbeService.cleanVehicleProbeName() instead\r\n try {\r\n var regEx = new RegExp(vehicleReg, \"ig\");\r\n var replaceMask = \"\";\r\n\r\n // Remove vehicle registration from probe name\r\n probe.cleanName = probe.Name.replace(regEx, replaceMask);\r\n\r\n // Remove all non-alphanumerics from start of strong (i.e. hypens)\r\n while (/[^a-zA-Z0-9]/.test(probe.cleanName[0]) && probe.cleanName) {\r\n probe.cleanName = probe.cleanName.slice(1).trim();\r\n }\r\n\r\n if (!probe.cleanName) {\r\n probe.cleanName = vehicleReg;\r\n }\r\n }\r\n catch (err) {\r\n }\r\n }\r\n\r\n getLatestVehicleTemperatureRecords(ignoreOldData = true): angular.IPromise {\r\n // Angular version in TemperatureRecordService\r\n return this\r\n .$http({\r\n url: `/api/temperature/latest`,\r\n method: \"GET\",\r\n params: { minsToLive: 1 }\r\n })\r\n .then((response: angular.IHttpResponse) => {\r\n\r\n if (ignoreOldData) {\r\n var today = moment();\r\n return response.data.filter(record => { return this.veriDate.createMoment(record.Timestamp).isSame(today, \"d\"); });\r\n }\r\n\r\n return response.data;\r\n });\r\n }\r\n\r\n getLatestVehicleTemperatureRecordsForVehicle(vehicleId: number): angular.IPromise {\r\n // Angular version in TemperatureRecordService\r\n return this\r\n .$http({\r\n url: `/api/temperature/${vehicleId}/latest`,\r\n method: \"GET\",\r\n params: { minsToLive: 1 }\r\n })\r\n .then((response: angular.IHttpResponse) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getVehicleTemperatureRecords(vehicleId: number, startDate: moment.Moment | Date, endDate: moment.Moment | Date, invalidateCache = false): angular.IPromise {\r\n // Angular version in TemperatureRecordService\r\n return this\r\n .$http({\r\n url: `/api/temperature/${vehicleId}`,\r\n method: \"GET\",\r\n params: { minsToLive: 60, startDate: startDate.toISOString(), endDate: endDate.toISOString(), invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpResponse) => {\r\n // Sort data first as it seems to be unordered\r\n response.data.sort((x, y) => {\r\n return x.Id - y.Id;\r\n });\r\n\r\n return response.data;\r\n });\r\n }\r\n\r\n getVehicleTypes(): IKeyValuePair[] {\r\n const vehicleTypes = EnumService.getItemsForSelect(VehicleType);\r\n\r\n vehicleTypes.forEach(type => {\r\n type.displayName = this.translationService.translateEnum(VehicleType, \"VehicleType\", type.value as any);\r\n });\r\n\r\n return vehicleTypes;\r\n }\r\n updateOdometer(vehicleId: number, newOdometer: number, oldOdometer: number) {\r\n return this\r\n .$http({\r\n method: \"POST\",\r\n url: `/api/vehicles/odometer`,\r\n data: {\r\n VehicleId: vehicleId,\r\n NewOdometer: newOdometer,\r\n OldOdometer: oldOdometer\r\n }\r\n })\r\n .then((result) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n showVehicleWithNoUnit(vehicle: IVehicle): boolean {\r\n let addVehicle = false;\r\n\r\n if (vehicle.Plot !== null || this.userOptions.ShowVehiclesNoUnit.Value) {\r\n addVehicle = true;\r\n }\r\n\r\n return addVehicle;\r\n }\r\n\r\n showNonFunctioningUnit(vehicle: IVehicle): boolean {\r\n let addVehicle = false;\r\n\r\n if (this.userOptions.ShowVehiclesNotTracking.Value) {\r\n addVehicle = true;\r\n }\r\n\r\n if (!this.userOptions.ShowVehiclesNotTracking.Value && vehicle.unitStatus === UnitStatus.Responding) {\r\n addVehicle = true;\r\n }\r\n\r\n return addVehicle;\r\n }\r\n\r\n findVehicle(vehicles: IVehicle[], vehicleId: number): IVehicle {\r\n for (let i = 0; i < vehicles.length; i++) {\r\n const vehicle = vehicles[i];\r\n\r\n if (vehicle.Id === vehicleId) {\r\n return vehicle;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n findProbesForVehicle(vehicleId: number, probes: IProbe[]): IProbe[] {\r\n var vehicleProbes: IProbe[] = [];\r\n for (let i = 0; i < probes.length; i++) {\r\n const probe = probes[i];\r\n\r\n if (probe.VehicleId === vehicleId) {\r\n vehicleProbes.push(probe);\r\n }\r\n }\r\n\r\n return vehicleProbes;\r\n }\r\n\r\n findTempRecordsForPlot(tempRecords: IPlotTemperatureRecord[], plotId: number): IPlotTemperatureRecord[] {\r\n return tempRecords.filter(record => { return record.PlotId == plotId });\r\n }\r\n\r\n findVehiclesWithHomeLocations(vehicles: IVehicle[], depotsWithHomeLocations: IGroup[]): IVehicle[] {\r\n var vehiclesWithHomeLocations = vehicles.filter(v => v.GeofenceId || depotsWithHomeLocations.find(d => d.VehicleIds.indexOf(v.Id) >= 0));\r\n\r\n return vehiclesWithHomeLocations;\r\n }\r\n\r\n findVehiclesWithNoHomeLocations(vehicles: IVehicle[], depotsWithHomeLocations: IGroup[]): IVehicle[] {\r\n var vehiclesWithHomeLocations = this.findVehiclesWithHomeLocations(vehicles, depotsWithHomeLocations);\r\n var vehiclesWithoutHomeLocations = vehicles.filter(v1 => !vehiclesWithHomeLocations.find(v2 => v2 == v1));\r\n\r\n return vehiclesWithoutHomeLocations;\r\n }\r\n\r\n findVehicleDepot(vehicleId: number, depots: IGroup[]): IGroup {\r\n for (var i = 0; i < depots.length; i++) {\r\n const depot = depots[i];\r\n\r\n if (depot.VehicleIds.find(vId => vId === vehicleId)) {\r\n return depot;\r\n }\r\n };\r\n\r\n return null;\r\n }\r\n\r\n mapLatestPlotsToVehicles(vehicles: IVehicle[], latestPlots: IPlot[]): void {\r\n if (!vehicles?.length || !latestPlots?.length) {\r\n return;\r\n }\r\n\r\n vehicles.forEach(vehicle => {\r\n vehicle.Plot = latestPlots.find(plot => plot.VehicleId === vehicle.Id);\r\n });\r\n }\r\n\r\n mapProbesToVehicles(vehicles: IVehicle[], probes: IProbe[]) {\r\n vehicles.forEach(vehicle => {\r\n this.mapProbesToVehicle(vehicle, probes);\r\n });\r\n }\r\n\r\n mapProbesToVehicle(vehicle: IVehicle, probes: IProbe[]) {\r\n vehicle.probes = this.findProbesForVehicle(vehicle.Id, probes);\r\n\r\n if (vehicle.probes) {\r\n vehicle.probes.forEach(probe => {\r\n this.cleanVehicleProbeName(vehicle.Reg, probe);\r\n //console.log(probe.Name, probe.cleanName);\r\n });\r\n }\r\n }\r\n\r\n vehicleHasUnitOrPeripheral(vehicle: IVehicle): boolean {\r\n return vehicle.HasUnit || this.vehicleHasPeripheral(vehicle);\r\n }\r\n\r\n vehicleHasPeripheral(vehicle: IVehicle): boolean {\r\n return vehicle.peripherals?.length > 0;\r\n }\r\n\r\n getRegPlateWithSpace(vehicle: IVehicle): string {\r\n\r\n if (vehicle.ShortReg.indexOf(\" \") >= 0) {\r\n return vehicle.ShortReg;\r\n }\r\n\r\n if (vehicle.Reg.indexOf(\" \") >= 0) {\r\n return vehicle.Reg;\r\n }\r\n\r\n // return in format A1 ABC\r\n if (vehicle.Reg.length === 5) {\r\n return `${vehicle.Reg.slice(0, 2)} ${vehicle.Reg.slice(2)}`\r\n }\r\n\r\n // return in format AB12 ABC\r\n if (vehicle.Reg.length === 7) {\r\n return `${vehicle.Reg.slice(0, 4)} ${vehicle.Reg.slice(4)}`\r\n }\r\n\r\n return vehicle.Reg;\r\n }\r\n\r\n regOrShortRegHasSpace(vehicle: IVehicle): boolean {\r\n return vehicle.ShortReg.indexOf(\" \") >= 0 || vehicle.Reg.indexOf(\" \") >= 0;\r\n }\r\n\r\n createRobustRegPlateSearchString(vehicle: IVehicle): string {\r\n\r\n if (!vehicle) {\r\n return;\r\n }\r\n\r\n let searchString = `${vehicle.ShortReg} ${vehicle.Reg}`;\r\n\r\n if (!this.regOrShortRegHasSpace(vehicle)) {\r\n searchString += this.getRegPlateWithSpace(vehicle);\r\n }\r\n\r\n return searchString;\r\n }\r\n\r\n // ------------------------------------------------\r\n\r\n private getOrRetreiveVehicles(invalidateCache: boolean = false, unsafe = false): angular.IPromise {\r\n return this.cacheService.getOrRetrieveData(this.vehiclesCache, () => this.getVehiclesFromDatabase(), invalidateCache, unsafe);\r\n }\r\n\r\n private getVehiclesFromDatabase(queryOptions: IVehicleQueryOptions = {}): angular.IPromise {\n this.getUserOptions();\n queryOptions.HasInstalledDevice = !this.userOptions?.ShowVehiclesNoUnit.Value;\n\r\n return this\r\n .$http({\r\n url: \"/api/vehicles\",\r\n method: \"GET\",\n params: queryOptions\r\n })\r\n .then((result: angular.IHttpResponse) => {\r\n this.getUserOptions();\r\n\r\n result.data.forEach(v => {\r\n v.shouldDisplay = this.shouldDisplayVehicle(v);\r\n })\r\n\r\n return result.data;\r\n });\r\n }\r\n\r\n //private removeVehiclesWithNoLastLocationItem(vehicles: IVehicle[]) {\r\n // for (let i = vehicles.length - 1; i >= 0; i--) {\r\n // if (!vehicles[i].Plot) {\r\n // vehicles.splice(i, 1);\r\n // }\r\n // }\r\n //}\r\n\r\n //private filterVehicleUnit(vehicleList: IVehicle[]): IVehicle[] {\r\n\r\n // const filteredVehicles: IVehicle[] = [];\r\n\r\n // if (!this.userOptions.General.ShowVehicleWithNoUnit) {\r\n // for (let i = 0; i < vehicleList.length; i++) {\r\n // const vehicle = vehicleList[i];\r\n\r\n // if (vehicle.HasUnit) {\r\n // filteredVehicles.push(vehicle);\r\n // }\r\n // }\r\n // }\r\n // else {\r\n // return vehicleList;\r\n // }\r\n\r\n // return filteredVehicles;\r\n //}\r\n\r\n private shouldDisplayVehicle(vehicle: IVehicle, queryOptions?: IGetVehicleOptions): boolean {\r\n this.getUserOptions();\r\n\r\n if (this.userOptions?.ShowVehiclesNoUnit.Value || queryOptions?.includeAllVehicles) {\r\n return true;\r\n }\r\n\r\n return this.vehicleHasUnitOrPeripheral(vehicle);\r\n }\r\n\r\n //private setInputsBitValueIsValid(io: number, bitVal: number, shouldEqual: number): boolean {\r\n\r\n // const valid = (io && bitVal) === shouldEqual;\r\n\r\n // return valid;\r\n //}\r\n\r\n //private setInputsIsActiveStateValid(currentActiveState: number, stateOne: number, stateTwo: number): boolean {\r\n\r\n // const valid = currentActiveState === stateOne || currentActiveState === stateTwo;\r\n\r\n // return valid;\r\n //}\r\n\r\n private getUserOptions() {\r\n if (this.userOptions) {\r\n return {};\r\n }\r\n\r\n this.userOptions = this.sessionService.getItem(SettingsName.UserOptions);\r\n }\r\n\r\n //private getDefaultLocationItem(): IPlot {\r\n\r\n // var locationItem: IPlot = {\r\n // coords: new CoordsModel(0, 0),\r\n // options: { visible: false },\r\n // Velocity: -1,\r\n // VelocityMph: -1\r\n // };\r\n\r\n // return locationItem;\r\n //}\r\n}\r\n","// Todo: Should be in enum\r\nexport enum SettingsName {\r\n\r\n OBJ_VEHICLE,\r\n OBJ_GEOFENCE,\r\n IS_LIVEMAP_ON,\r\n\r\n isAdmin,\r\n\r\n CredentialUsername,\r\n AccessToken,\r\n RefreshToken,\r\n SessionTimeout,\r\n LoginFail,\r\n AccountOptions,\r\n CredentialOptions_DONOTUSE,\r\n DriverVehicles_DONTUSE,\r\n Geofences_DONTUSE,\r\n\r\n SettingsGeneral,\r\n SettingsGroup,\r\n ReasonCode_DONTUSE,\r\n\r\n UserOptions,\r\n\r\n LastTokenAssignmentTime,\n AccountId,\n AccountUserMappings,\n AccountSettings\r\n}\n","// https://timdeschryver.dev/blog/flagged-enum-what-why-and-how\r\nexport enum AccountFeatures {\r\n Default = 0,\r\n TrackingDevice = 1 << 0, // Only enabled if we have a separate tracking device\r\n Can = 1 << 1,\r\n Camera = 1 << 2,\r\n Breathalock = 1 << 3,\r\n Tacho = 1 << 4,\r\n Messaging = 1 << 5,\r\n Temperature = 1 << 6,\r\n Tyres = 1 << 7,\r\n FaultCodes = 1 << 8,\r\n GPS = 1 << 9,\r\n TMS = 1 << 10,\r\n Reefer = 1 << 11,\r\n ContextualSpeeding = 1 << 12,\r\n Maintenance = 1 << 13,\r\n ReportBuilder = 1 << 14,\r\n DriverDashboard = 1 << 15,\r\n SSO = 1 << 16,\r\n Ebpms = 1 << 17,\r\n}\r\n","import { NgModule } from \"@angular/core\";\r\nimport { EnumNamesPipe } from \"@pipes/enum-names.pipe\";\r\nimport { TranslatePipe } from \"@pipes/translate.pipe\";\r\nimport { VLocationPipe } from \"./location.pipe\";\r\nimport { VDatePipe } from \"./date.pipe\";\r\nimport { EnumAsString } from \"./enum-as-string.pipe\";\r\nimport { FormatNumberPipe } from \"./format-number.pipe\";\r\nimport { OrderByPropPipe } from \"./order-by-prop.pipe\";\r\nimport { VOrdinalSuffixPipe } from \"./ordinal-suffix.pipe\";\r\nimport { PhoneNumberPipe } from \"./phone-number.pipe\";\r\nimport { VRelativeTimePipe } from \"./relative-time.pipe\";\r\nimport { SplitPascalCasePipe } from \"./split-pascal-case\";\r\nimport { VTimePipe } from \"./time.pipe\";\r\nimport { UnitConversionPipe } from \"./unit-conversion.pipe\";\r\nimport { VeriDatePipe } from \"./veri-date.pipe\";\r\nimport { WithLoadingPipe } from \"./with-loading.pipe\";\r\n\r\nconst publicDeclarations = [\r\n VeriDatePipe,\r\n TranslatePipe,\r\n PhoneNumberPipe,\r\n EnumNamesPipe,\r\n UnitConversionPipe,\r\n FormatNumberPipe,\r\n EnumAsString,\r\n VDatePipe,\r\n VTimePipe,\r\n VRelativeTimePipe,\r\n VOrdinalSuffixPipe,\r\n OrderByPropPipe,\r\n SplitPascalCasePipe,\r\n VLocationPipe,\r\n WithLoadingPipe\r\n]\r\n\r\n@NgModule({\r\n declarations: [\r\n ...publicDeclarations\r\n ],\r\n exports: [\r\n ...publicDeclarations\r\n ],\r\n providers: [\r\n VeriDatePipe,\r\n EnumNamesPipe,\r\n UnitConversionPipe,\r\n SplitPascalCasePipe\r\n ]\r\n})\r\nexport class PipesModule {\r\n constructor() { }\r\n}\r\n","import { CommonModule } from \"@angular/common\";\r\nimport { HttpClientModule } from '@angular/common/http';\r\nimport { NgModule } from \"@angular/core\";\r\nimport { ReactiveFormsModule } from \"@angular/forms\";\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\nimport { GroupDeleteConfirmationComponent } from \"@app/directives/_misc/delete-confirm/group-delete-confirm/group-delete-confirm.component\";\r\nimport { CoreDirectivesModule } from \"@directives/_core/_core.directives.module\";\r\nimport { DelayedHoverDirective } from \"@directives/_misc/delayedHover.directive\";\r\nimport { DeleteConfirmationComponent } from \"@directives/_misc/delete-confirm/delete-confirm.component\";\r\nimport { DepotNameComponent } from \"@directives/_misc/depotName/depotName.component\";\r\nimport { MultiStepIndicatorComponent } from \"@directives/_misc/multiStepIndicator/multiStepIndicator.component\";\r\nimport { TooltipDirective } from \"@directives/_misc/tooltip/tooltip.directive\";\r\nimport { TrailerComponent } from \"@directives/_misc/trailer/trailer.component\";\r\nimport { VProgressBar } from \"@directives/_misc/v-progress-bar/v-progress-bar.component\";\r\nimport { PipesModule } from \"src/app/_pipes/_pipes.module\";\r\nimport { AccountSwitcherComponent } from \"./accountSwitcher/accountSwitcher.component\";\r\nimport { AsyncObservableComponent } from \"./async-observable/async-observable.component\";\r\nimport { BatteryIndicatorComponent } from \"./batteryIndicator/batteryIndicator.component\";\r\nimport { BreadcrumbsComponent } from \"./breadcrumbs/breadcrumbs.component\";\r\nimport { CountToDirective } from \"./countTo.directive\";\r\nimport { DayOfWeekPickerComponent } from \"./day-of-week-picker/day-of-week-picker.component\";\r\nimport { DriverNameComponent } from \"./driver-name/driver-name.component\";\r\nimport { DriverImageComponent } from \"./driverImage/driverImage.component\";\r\nimport { VFlvPlayer } from \"./flvPlayer/flv-player.component\";\r\nimport { FullScreenButtonComponent } from \"./fullScreenButton/fullScreenButton.component\";\r\nimport { HideInProductionDirective } from \"./hide-in-production/hide-in-production.directive\";\r\nimport { HighlightTextDirective } from \"./highlight-text/highlight-text.component\";\r\nimport { IfEnabledDirective } from \"./if-enabled.directive\";\r\nimport { LoadingIndicatorComponent } from \"./loadingIndicator/loadingIndicator.component\";\r\nimport { LocationInformationComponent } from \"./location-information/location-information.component\";\r\nimport { NavCountComponent } from \"./navCount/navCount.component\";\r\nimport { RecentlySelectedComponent } from \"./recently-selected/recently-selected.component\";\r\nimport { SiteStatusIndicatorComponent } from \"./site-status-indicator/site-status-indicator.component\";\r\nimport { TachoModeComponent, TachoModeStatusComponent } from \"./tachoMode/tachoMode.directive\";\r\nimport { TemperatureReadingComponent } from \"./temperatureReading/temperatureReading.component\";\r\nimport { TrendArrowComponent } from \"./trendArrow/trendArrow.component\";\r\nimport { UnitConversionSuffixComponent } from \"./unitConversionSuffix.component\";\r\nimport { VectorDotsComponent } from \"./vector-dots/vector-dots.component\";\r\nimport { VehicleOnlineStatusComponent } from \"./vehicle-online-status-indicator/vehicle-online-status.component\";\r\nimport { VeriMarkerComponent } from \"./veriMarker/veriMarker.directive\";\r\nimport { VerticalCollapsableDivider } from \"./vertical-collapsable-divider/vertical-collapsable-divider.component\";\r\nimport { VideoDownloadStatusComponent } from \"./video-download-status/video-download-status.component\";\r\n\r\nconst privateComponents: any[] = [\r\n\r\n];\r\n\r\nconst publicComponents: any[] = [\r\n LoadingIndicatorComponent,\r\n TachoModeComponent,\r\n TachoModeStatusComponent,\r\n BreadcrumbsComponent,\r\n VehicleOnlineStatusComponent,\r\n VideoDownloadStatusComponent,\r\n DriverImageComponent,\r\n TrendArrowComponent,\r\n LocationInformationComponent,\r\n TemperatureReadingComponent,\r\n BatteryIndicatorComponent,\r\n UnitConversionSuffixComponent,\r\n VeriMarkerComponent,\r\n NavCountComponent,\r\n DepotNameComponent,\r\n MultiStepIndicatorComponent,\r\n FullScreenButtonComponent,\r\n AccountSwitcherComponent,\r\n DayOfWeekPickerComponent,\r\n VerticalCollapsableDivider,\r\n SiteStatusIndicatorComponent,\r\n DriverNameComponent,\r\n DeleteConfirmationComponent,\r\n GroupDeleteConfirmationComponent,\r\n VProgressBar,\r\n TrailerComponent,\r\n VFlvPlayer,\r\n AsyncObservableComponent,\r\n RecentlySelectedComponent,\r\n VectorDotsComponent\r\n];\r\n\r\nconst declarations: any[] = [\r\n CountToDirective,\r\n DelayedHoverDirective,\r\n TooltipDirective,\r\n IfEnabledDirective,\r\n HighlightTextDirective,\r\n HideInProductionDirective\r\n];\r\n\r\n@NgModule({\r\n imports: [\r\n ReactiveFormsModule,\r\n CommonModule,\r\n //FormsDirectivesModule,\r\n BrowserAnimationsModule,\r\n PipesModule,\r\n HttpClientModule,\r\n CoreDirectivesModule\r\n ],\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents, ...declarations],\r\n exports: [...publicComponents, ...declarations]\r\n})\r\nexport class MiscDirectivesModule {\r\n constructor() {\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { VNavBarComponent } from '@directives/_core/v-nav-bar/v-nav-bar.component';\r\nimport { VNavItemComponent } from '@directives/_core/v-nav-bar/v-nav-item/v-nav-item.component';\r\nimport { PipesModule } from 'src/app/_pipes/_pipes.module';\r\nimport { BindCssVariableDirective } from \"./bind-css-variable/bind-css-variable.directive\";\r\nimport { ScrollShadowDirective } from \"./scroll-shadow/scroll-shadow.directive\";\r\nimport { VButtonComponent } from \"./v-button/v-button.component\";\r\nimport { VButtonDropdownComponent } from \"./v-dropdown/v-button-dropdown/v-button-dropdown.component\";\r\nimport { VDropdownComponent } from \"./v-dropdown/v-dropdown.component\";\r\nimport { VItemDropdownComponent } from \"./v-dropdown/v-item-dropdown/v-item-dropdown.component\";\r\nimport { VTilesComponent } from './v-tiles/v-tiles.component';\r\nimport { VTileComponent } from './v-tiles/v-tile.component';\r\n\r\nconst privateComponents: any[] = [\r\n];\r\n\r\nconst publicComponents: any[] = [\r\n\r\n VDropdownComponent,\r\n VItemDropdownComponent,\r\n\r\n VButtonComponent,\r\n VButtonDropdownComponent,\r\n VNavBarComponent,\r\n VNavItemComponent,\r\n VTilesComponent,\r\n VTileComponent\r\n];\r\n\r\nconst declarations: any[] = [\r\n BindCssVariableDirective,\r\n ScrollShadowDirective\r\n];\r\n\r\n@NgModule({\r\n providers: [\r\n ],\r\n imports: [\r\n CommonModule,\r\n PipesModule\r\n ],\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents, ...declarations],\r\n exports: [...publicComponents, ...declarations]\r\n})\r\nexport class CoreDirectivesModule {\r\n constructor() {\r\n }\r\n}\r\n","import { HttpParams } from \"@angular/common/http\";\r\n\r\nexport const timeout = (ms: number = 0): Promise => {\r\n return new Promise((resolve) => {\r\n setTimeout(() => {\r\n resolve();\r\n }, ms);\r\n });\r\n}\r\nexport function getValuesFromEnum(enumType: T) {\r\n return Object.keys(enumType).filter(s => !isNaN(Number(s))).map(s => Number(s))\r\n}\r\n\r\nexport function getOptionsQueryParams(params: Object): { params: HttpParams } {\r\n if (!params) {\r\n return;\r\n }\r\n\r\n const options = { params: {} as HttpParams };\r\n\r\n Object.keys(params).forEach(key => {\r\n const value = params[key] instanceof Date\r\n ? (params[key] as Date).toISOString()\r\n : params[key] as string | number | boolean;\r\n\r\n options.params[key] = value;\r\n })\r\n\r\n return options;\r\n}\r\n\r\nexport function getNestedQueryOptionsParams(queryOptions: Object): { params: HttpParams } {\r\n let params = new HttpParams();\r\n\r\n for (const key in queryOptions) {\r\n if (queryOptions.hasOwnProperty(key)) {\r\n const value = queryOptions[key];\r\n if (typeof value === 'object') {\r\n // Handle nested objects\r\n for (const nestedKey in value) {\r\n if (value.hasOwnProperty(nestedKey)) {\r\n params = params.append(`${key}.${nestedKey}`, value[nestedKey]);\r\n }\r\n }\r\n } else {\r\n params = params.append(key, value);\r\n }\r\n }\r\n }\r\n\r\n return { params };\r\n}\r\n\r\nexport function setCookie(cname, cvalue, exdays): void {\r\n const d = new Date();\r\n d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));\r\n let expires = \"expires=\" + d.toUTCString();\r\n document.cookie = cname + \"=\" + cvalue + \";\" + expires + \";path=/\";\r\n}\r\n\r\nexport function getCookie(cname): string {\r\n let name = cname + \"=\";\r\n let decodedCookie = decodeURIComponent(document.cookie);\r\n let ca = decodedCookie.split(';');\r\n for (let i = 0; i < ca.length; i++) {\r\n let c = ca[i];\r\n while (c.charAt(0) == ' ') {\r\n c = c.substring(1);\r\n }\r\n if (c.indexOf(name) == 0) {\r\n return c.substring(name.length, c.length);\r\n }\r\n }\r\n return \"\";\r\n}\r\n\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule, NO_ERRORS_SCHEMA, Type } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { CoreDirectivesModule } from \"@directives/_core/_core.directives.module\";\r\nimport { FormsDirectivesModule } from \"@directives/_forms/_form.directives.module\";\r\nimport { LegacyExportService } from '@directives/_veri/export/legacyExport.service';\r\nimport { VExportButtonComponent } from '@directives/_veri/export/v-export-button/v-export-button.component';\r\nimport { VListComponent } from '@directives/_veri/v-list/v-list.component';\r\nimport { VTimelineComponent } from '@directives/_veri/v-timeline/v-timeline.component';\r\nimport { VeriNavPillsComponent } from '@directives/_veri/veriPills/veriPills.component';\r\nimport { providerCreator } from '@services/_services.module';\r\nimport { PipesModule } from 'src/app/_pipes/_pipes.module';\r\n//import { NgxDynamicCompilerComponent } from '../_map/dynamicThing.component';\r\nimport { MiscDirectivesModule } from '../_misc/_misc.directives.module';\r\nimport { VVehicleVideoStreamComponent } from '../_vehicle/VehicleVideoStream/v-vehicle-video-stream.component';\r\nimport { DashboardBoxSmallComponent } from './dashboard/dashboardBoxSmall.component';\r\nimport { VCalendarComponent } from \"./v-calendar/v-calendar.component\";\r\nimport { VDateSelectorComponent } from \"./v-date-selector/v-date-selector.component\";\r\nimport { VDescriptiveListItemComponent } from './v-descriptive-list-item/v-descriptive-list-item.component';\r\nimport { VPillsComponent } from './v-pills/v-pills.component';\r\nimport { TagSelectorComponent } from './v-tags/tag-selector/tag-selector.component';\r\nimport { VTagsComponent } from './v-tags/v-tags.component';\r\nimport { VTimeFiltersComponent } from './v-time-filters/v-time-filters.component';\r\nimport { VeriBadgeComponent } from './veriBadge/veriBadge.component';\r\nimport { VeriCardComponent } from './veriCard/veriCard.component';\r\nimport { VeriColourPickerComponent } from './veriColourPicker/veriColourPicker.component';\r\nimport { VeriInfoPanelComponent } from './veriInfoPanel/veriInfoPanel.component';\r\nimport { VeriNumberFieldComponent } from './veriNumberField/veriNumberField.component';\r\nimport { VeriSearchBoxComponent } from './veriSearchBox/veriSearchBox.directive';\r\nimport { VeriSimpleNavComponent } from './veriSimpleNav/veriSimpleNav.component';\r\nimport { VeriTableContainerComponent } from './veriTable/veriTableContainer/veriTableContainer.component';\r\nimport { VeriTableSummaryComponent } from './veriTable/veriTableSummary/veriTableSummary.component';\r\nimport { VVideoComponent } from './veriVideo/v-video.component';\r\nimport { VVideoCollectionComponent } from './veriVideo/v-video-collection/v-video-collection.component';\r\nimport { VVideoControlsComponent } from './veriVideo/videoControls/video-controls.component';\r\nimport { VVideoProgressComponent } from './veriVideo/videoProgress/video-progress.component';\r\nimport { VeriVideoThumbnailsComponent } from './veriVideoThumbnails/veriVideoThumbnails.component';\r\nimport { VStreamCollectionComponent } from './veriVideo/v-stream-collection/v-stream-collection.component';\r\n\r\nconst privateComponents: Type[] = [\r\n];\r\n\r\nconst publicComponents: Type[] = [\r\n DashboardBoxSmallComponent,\r\n VTagsComponent,\r\n VPillsComponent,\r\n VeriInfoPanelComponent,\r\n VeriNavPillsComponent,\r\n VeriCardComponent,\r\n VeriTableContainerComponent,\r\n VeriTableSummaryComponent,\r\n VeriBadgeComponent,\r\n VeriSearchBoxComponent,\r\n VeriSimpleNavComponent,\r\n VeriColourPickerComponent,\r\n VeriVideoThumbnailsComponent,\r\n VVideoComponent,\r\n VeriNumberFieldComponent,\r\n VExportButtonComponent,\r\n VeriNumberFieldComponent,\r\n VCalendarComponent,\r\n VDateSelectorComponent,\r\n VTimeFiltersComponent,\r\n VeriNumberFieldComponent,\r\n VTimelineComponent,\r\n VListComponent,\r\n VDescriptiveListItemComponent,\r\n VVideoControlsComponent,\r\n VVideoProgressComponent,\r\n VVideoCollectionComponent,\r\n VStreamCollectionComponent,\r\n VVehicleVideoStreamComponent,\r\n TagSelectorComponent\r\n //NgxDynamicCompilerComponent\r\n];\r\n\r\n@NgModule({\r\n providers: [\r\n providerCreator(LegacyExportService, \"exportService\"),\r\n ],\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MiscDirectivesModule,\r\n PipesModule,\r\n FormsDirectivesModule,\r\n CoreDirectivesModule\r\n ],\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents],\r\n exports: [...publicComponents],\r\n schemas: [NO_ERRORS_SCHEMA] // need this to allow highcharts angularjs component to work\r\n //schemas: [CUSTOM_ELEMENTS_SCHEMA]\r\n})\r\nexport class VeriDirectivesModule {\r\n constructor() {\r\n }\r\n}\r\n","import { IRunBlockRootScope } from \"@interfaces/IRunBlockRootScope\";\r\nimport { IAccountUserMapping, IUser, UserPlatform } from \"@interfaces/IUser\";\r\nimport { AccountService } from \"@services/account.service\";\r\nimport { AccountUserMappingService } from \"@app/services/accountUserMapping.service.ajs\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport * as angular from \"angular\";\r\n//import * as rg4js from 'raygun4js';\r\nimport { SettingsName } from \"../class/SettingsName\";\r\nimport { UserType } from \"@enums/UserType\";\r\nimport { CacheService } from \"./cache.Service\";\r\nimport { SessionService } from \"./session.service\";\r\nimport { IUserResellerMapping } from \"../main/modules/foundation/_models/IUserResellerMapping\";\r\nimport { UserResellerMappingService } from \"./userResellerMappingService.ajs\";\r\n\r\nexport class CurrentUserService {\r\n\n static CurrentUserFeaturesUpdatedEvent = \"CurrentUserFeaturesUpdatedEvent\";\n\r\n cachedUser: IUser;\r\n\r\n private cacheName = \"currentUserCache\";\r\n\r\n static $inject = [\"$q\", \"$http\", \"$rootScope\", \"$timeout\", \"$mdDialog\", \"cacheService\", \"accountService\", \"accountUserMappingService\", \"translationService\",\"sessionService\", \"userResellerMappingService\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $http: angular.IHttpService,\r\n private readonly $rootScope: IRunBlockRootScope,\r\n private readonly $timeout: angular.ITimeoutService,\r\n private readonly $mdDialog: angular.material.IDialogService,\r\n private readonly cacheService: CacheService,\r\n private readonly accountService: AccountService,\r\n private readonly accountUserMappingService: AccountUserMappingService,\r\n private readonly translationService: TranslationService,\r\n private readonly sessionService: SessionService,\n private readonly userResellerMappingService: UserResellerMappingService) {\r\n\n this.cacheService.createCache(this.cacheName);\r\n }\n\n getCurrentUserPlatform(): UserPlatform {\n return this.cachedUser.platform;\n }\r\n\r\n performUserValidationChecks() {\r\n // The timeout allows the UI to render properly before showing the box\r\n this.$timeout(() => {\r\n this.resetPasswordCheck(this.$rootScope.currentUser);\r\n }, 1000);\r\n }\r\n\r\n resetPasswordCheck(user: IUser) {\r\n if (!user) {\r\n return;\r\n }\r\n\r\n // Needs to be moved at some point, currently too many things depend on $rootScope.currentUser to move easily\r\n if (user.ResetPassword) {\r\n this.$mdDialog\r\n .show(this.$mdDialog\r\n .alert()\r\n .title(this.translationService.t(\"currentUserService.resetPasswordRequest\"))\r\n .textContent(this.translationService.t(\"currentUserService.resetPasswordRequestContent\"))\r\n .ok(this.translationService.t(\"currentUserService.changePassword\"))\r\n )\r\n .then(() => {\r\n this.accountService.showPasswordEditor(null, { forcePasswordReset: true });\r\n });\r\n }\r\n }\r\n\r\n getCurrentUserFromCache(): IUser {\r\n return this.cacheService.get(this.cacheName);\r\n }\n\n getCurrentUser(invalidateCache = false): angular.IPromise {\r\n const currentUserPromise = this.getUser(invalidateCache);\n let cachedAccountUserMappings: IAccountUserMapping[] = this.sessionService.getItem(SettingsName.AccountUserMappings);\n let accountUserMappingsPromise: angular.IPromise;\n const userResellerMappingsPromise = this.userResellerMappingService.getCurrentUserMappings();\n\n accountUserMappingsPromise = (!invalidateCache && cachedAccountUserMappings?.length > 0)\n ? this.$q.resolve(cachedAccountUserMappings)\n : this.accountUserMappingService.getCurrentAccountUserMappings(invalidateCache);\n\r\n return this.$q.all([currentUserPromise, accountUserMappingsPromise, userResellerMappingsPromise])\r\n .then(([currentUser, accountMappings, userResellerMappings]) => {\n\r\n if (!this.accountUserMappingService.hasCachedAccountUserMappings()) {\n this.sessionService.setItem(SettingsName.AccountUserMappings, accountMappings);\r\n }\n\n currentUser.AccountUserMappings = accountMappings.filter(mapping => mapping.UserId === currentUser.Id);\r\n\r\n if (currentUser.AccountUserMappings.length === 1) {\r\n currentUser.CurrentAccountUserMapping = currentUser.AccountUserMappings[0];\r\n }\r\n else {\r\n currentUser.CurrentAccountUserMapping = currentUser.AccountUserMappings.find(x => x.AccountId == this.sessionService.getItem(SettingsName.AccountId))\r\n }\n\n currentUser.ResellerIds = userResellerMappings.filter(mapping => mapping.UserId === currentUser.Id && !mapping.EndTime).map(mapping => mapping.ResellerId);\r\n\r\n currentUser.platform = (currentUser.Type == UserType.InternalUser || currentUser.Type == UserType.Engineer) && !currentUser.CurrentAccountUserMapping\r\n ? UserPlatform.Foundation\r\n : UserPlatform.Valkyrie;\r\n\r\n this.cacheService.save(this.cacheName, currentUser);\n\n this.$rootScope.currentUser = currentUser;\n this.cachedUser = currentUser;\r\n\n var sanitisedEmail = currentUser.Email;\n if (sanitisedEmail.indexOf(\"@\") >= 0) {\n sanitisedEmail = `anonymous@${sanitisedEmail.split(\"@\")[1]}`;\n }\n\n //rg4js('raygun ', {\r\n // identifier: currentUser.Id.toString(),\r\n // isAnonymous: false,\r\n // email: sanitisedEmail,\r\n // fullName: currentUser.CurrentAccountUserMapping?.Name,\r\n //});\r\n\r\n return currentUser;\r\n });\r\n }\r\n\n updateCurrentUserCache(user: IUser) {\n this.accountUserMappingService.updateCachedAccountUserMapping(user.Id, user.CurrentAccountUserMapping);\r\n this.cacheService.save(this.cacheName, user);\n\n this.$rootScope.currentUser = user;\n this.cachedUser = user;\r\n\r\n this.$rootScope.$broadcast(CurrentUserService.CurrentUserFeaturesUpdatedEvent);\r\n }\n\r\n // ---\r\n\r\n private getUser(invalidateCache = false) {\n\r\n return this\r\n .$http({\r\n url: \"/api/users/current\",\r\n method: \"GET\",\r\n params: { minsToLive: 30, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n\r\n return response.data;\r\n });\r\n }\r\n}\r\n","import { OverlayModule } from \"@angular/cdk/overlay\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { NgModule } from \"@angular/core\";\r\nimport { CoreDirectivesModule } from \"@directives/_core/_core.directives.module\";\r\nimport { RouteBreadcrumbsComponent } from \"@directives/_layout/_page-design/route-breadcrumbs/route-breadcrumbs.component\";\r\nimport { MiscDirectivesModule } from \"@directives/_misc/_misc.directives.module\";\r\nimport { VeriDirectivesModule } from \"../_veri/_veri.directives.module\";\r\nimport { AccordianEntryComponent } from \"./accordian/accordian-entry/accordian-entry.component\";\r\nimport { AccordianComponent } from \"./accordian/accordian.component\";\r\nimport { EmptyStateComponent } from \"./empty-state/empty-state.component\";\r\nimport { MaxParentWidthDirective } from \"./max-parent-width/max-parent-width.directive\";\r\nimport { MaxWindowBreakpointDirective } from \"./max-window-breakpoint/max-window-breakpoint.directive\";\r\nimport { MinParentWidthDirective } from \"./min-parent-width/min-parent-width.directive\";\r\nimport { MinWindowBreakpointDirective } from \"./min-window-breakpoint/min-window-breakpoint.directive\";\r\nimport { ResourceGroupDisplayComponent } from \"./resourceGroupDisplay/resourceGroupDisplay.component\";\r\nimport { RevealingColumnsComponent } from \"./revealingColumns/revealingColumns.component\";\r\nimport { VDialogComponent } from \"./v-dialog/v-dialog.component\";\r\nimport { VTabComponent } from \"./v-tabs/v-tab.component\";\r\nimport { VTabsComponent } from \"./v-tabs/v-tabs.component\";\r\nimport { VeriPanelComponent } from \"./veri-panel/veri-panel.component\";\r\nimport { DetailPageComponent } from \"./_page-design/detail-page/detail-page.component\";\r\nimport { PageActionsComponent } from \"./_page-design/page-actions/page-actions.component\";\r\nimport { PageTitlePillComponent } from \"./_page-design/page-title-pill/page-title-pill.component\";\r\nimport { PageTitleComponent } from \"./_page-design/page-title/page-title.component\";\r\nimport { SideBarComponent } from \"./_page-design/sidebar/sidebar.component\";\r\nimport { DefaultLayoutComponent } from \"./_page-design/_layouts/default-layout/default-layout.component\";\r\nimport { HorizontalLayoutComponent } from \"./_page-design/_layouts/horizontal-layout/horizontal-layout.component\";\r\nimport { VerticalLayoutComponent } from \"./_page-design/_layouts/vertical-layout/vertical-layout.component\";\r\nimport { VerticalMapLayoutComponent } from \"./_page-design/_layouts/vertical-map-layout/vertical-map-layout.component\";\r\n\r\nconst privateComponents: any[] = [\r\n\r\n];\r\n\r\nconst publicComponents: any[] = [\r\n ResourceGroupDisplayComponent,\r\n RevealingColumnsComponent,\r\n EmptyStateComponent,\r\n\r\n VeriPanelComponent,\r\n\r\n DefaultLayoutComponent,\r\n VerticalMapLayoutComponent,\r\n HorizontalLayoutComponent,\r\n VerticalLayoutComponent,\r\n\r\n SideBarComponent,\r\n\r\n PageActionsComponent,\r\n PageTitleComponent,\r\n PageTitlePillComponent,\r\n DetailPageComponent,\r\n RouteBreadcrumbsComponent,\r\n\r\n VTabComponent,\r\n VTabsComponent,\r\n\r\n AccordianComponent,\r\n AccordianEntryComponent,\r\n VDialogComponent\r\n];\r\n\r\n\r\nconst declarations: any[] = [\r\n MinParentWidthDirective,\r\n MinWindowBreakpointDirective,\r\n MaxParentWidthDirective,\r\n MaxWindowBreakpointDirective\r\n];\r\n\r\n@NgModule({\r\n imports: [\r\n OverlayModule,\r\n CommonModule,\r\n VeriDirectivesModule,\r\n MiscDirectivesModule,\r\n CoreDirectivesModule\r\n ],\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents, ...declarations],\r\n exports: [...publicComponents, ...declarations]\r\n})\r\nexport class LayoutDirectivesModule {\r\n constructor() {\r\n }\r\n}\r\n","export enum VideoStatus {\r\n Unknown,\r\n EventOnly,\r\n UploadRequested,\r\n Uploading,\r\n Uploaded,\r\n Error,\r\n UserUploadRequested,\r\n Downloaded,\r\n Cancelled,\r\n NoFootageAvailable,\r\n Archived,\r\n NoFilesAvailable,\r\n Restricted,\r\n PartiallyDownloaded,\r\n Expired,\r\n HardwareDeleted,\r\n PartiallyUploaded,\r\n MediaDeleted,\r\n MediaPendingDeletion,\r\n AwaitingIndexing,\r\n AwaitingRedaction,\r\n RedactionCompleted,\r\n IndexingInProgress,\r\n RedactionInProgress,\r\n AwaitingVideoMute\r\n}\r\n","\nexport enum UserType {\r\n Fleet = 0,\r\n InternalUser = 1,\n Engineer = 2\r\n}\r\nexport enum AccountUserType {\r\n Admin = 0,\r\n User = 1\r\n}\r\n\r\nexport enum UserStatus {\r\n Active = 0,\r\n Inactive = 1\r\n}\n","import { CommonModule } from \"@angular/common\";\r\nimport { NgModule } from \"@angular/core\";\r\nimport { FormsModule } from \"@angular/forms\";\r\nimport { CoreDirectivesModule } from \"@directives/_core/_core.directives.module\";\r\nimport { AutofocusDirective } from \"@directives/_forms/autofocus/autofocus.directive\";\r\nimport { VFlagToggleListItemComponent } from \"@directives/_forms/v-flag-toggle-list-item/v-flag-toggle-list-item.component\";\r\nimport { VFlagToggleComponent } from \"@directives/_forms/v-flag-toggle/v-flag-toggle.component\";\r\nimport { VInputComponent } from \"@directives/_forms/v-input/v-input.component\";\r\nimport { VToggleListItemComponent } from \"@directives/_forms/v-toggle-list-item/v-toggle-list-item.component\";\r\nimport { MiscDirectivesModule } from \"@directives/_misc/_misc.directives.module\";\r\nimport { TranslationDirectivesModule } from \"@directives/_translations/_translations.directives.module\";\r\nimport { PipesModule } from \"src/app/_pipes/_pipes.module\";\r\nimport { CheckboxComponent } from \"./checkbox/checkbox.component\";\r\nimport { ControlErrorsComponent } from \"./control-errors/control-errors.component\";\r\nimport { FileUploadComponent } from \"./fileUpload/fileUpload.component\";\r\nimport { FormValidationService } from \"./form-validation.service\";\r\nimport { FormDetailsComponent } from \"./formDetails/formDetails.component\";\r\nimport { InputMaskDirective } from \"./input-mask/v-input-mask.directive\";\r\nimport { TextareaComponent } from \"./textarea/textarea.component\";\r\nimport { VAutocompleteComponent } from \"./v-autocomplete/v-autocomplete.component\";\r\nimport { VDriverAutocompleteComponent } from \"./v-autocomplete/v-driver-autocomplete/v-driver-autocomplete.component\";\r\nimport { VVehicleAutocompleteComponent } from \"./v-autocomplete/v-vehicle-autocomplete/v-vehicle-autocomplete.component\";\r\nimport { VEnumSelectComponent } from \"./v-enum-select/v-enum-select.component\";\r\nimport { VOrderButtonsComponent } from \"./v-order-buttons/v-order-buttons.component\";\r\nimport { VSelectOptionComponent } from \"./v-select/v-select-option/v-select-option.component\";\r\nimport { VSelectComponent } from \"./v-select/v-select.component\";\r\nimport { VSliderComponent } from \"./v-slider/v-slider.component\";\r\nimport { VTimePickerComponent } from \"./v-time-picker/v-time-picker.component\";\r\nimport { VToggleComponent } from \"./v-toggle/v-toggle.component\";\r\nimport { VRadioButtonComponent } from \"./v-radio-button/v-radio-button.component\";\r\nimport { SmsInputComponent } from \"./smsInput/sms-input.component\";\r\nimport { PhoneInputDirective } from \"./smsInput/phone-input.directive\";\r\nimport { RadioButtonBaseComponent } from \"./_radio-buttons/radio-button-base/radio-button-base.component\";\r\nimport { RadioButtonCardsComponent } from \"./_radio-buttons/radio-button-cards/radio-button-cards.component\";\r\nimport { RadioButtonSmallCardsComponent } from \"./_radio-buttons/radio-button-small-cards/radio-button-small-cards.component\";\r\nimport { VGeofenceAutocompleteComponent } from \"./v-autocomplete/v-geofence-autocomplete/v-geofence-autocomplete.component\";\r\nimport { VSelectInputComponent } from \"./v-select/v-select-input/v-select-input.component\";\r\nimport { VPlacesAutocompleteComponent } from \"./v-autocomplete/v-places-autocomplete/v-places-autocomplete.component\";\r\n\r\nconst privateComponents: any[] = [\r\n\r\n];\r\n\r\nconst publicComponents: any[] = [\r\n FormDetailsComponent,\r\n FileUploadComponent,\r\n VInputComponent,\r\n\r\n VAutocompleteComponent,\r\n VVehicleAutocompleteComponent,\r\n VPlacesAutocompleteComponent,\r\n VDriverAutocompleteComponent,\r\n VGeofenceAutocompleteComponent,\r\n VToggleComponent,\r\n VToggleListItemComponent,\r\n VFlagToggleComponent,\r\n VFlagToggleListItemComponent,\r\n VSelectComponent,\r\n VSelectOptionComponent,\r\n VSelectInputComponent,\r\n VEnumSelectComponent,\r\n VInputComponent,\r\n VTimePickerComponent,\r\n CheckboxComponent,\r\n VOrderButtonsComponent,\r\n VRadioButtonComponent,\r\n\r\n VSliderComponent,\r\n\r\n ControlErrorsComponent,\r\n TextareaComponent,\r\n SmsInputComponent,\r\n\r\n RadioButtonBaseComponent,\r\n RadioButtonCardsComponent,\r\n RadioButtonSmallCardsComponent\r\n];\r\n\r\nconst declarations: any[] = [\r\n AutofocusDirective,\r\n InputMaskDirective,\r\n PhoneInputDirective\r\n]\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n PipesModule,\r\n FormsModule,\r\n\r\n TranslationDirectivesModule,\r\n CoreDirectivesModule,\r\n MiscDirectivesModule\r\n ],\r\n providers: [FormValidationService],\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents, ...declarations],\r\n exports: [...publicComponents, ...declarations]\r\n})\r\nexport class FormsDirectivesModule {\r\n constructor() {\r\n }\r\n}\r\n","export class FoundationNavigationModule {\r\n static get HomePage(): string { return 'app.foundation.homepage'; }\r\n static get Engineers(): string { return 'app.foundation.engineers'; }\r\n static get Commissioning(): string { return `app.foundation.commissioning` }\r\n static get NewCommissionWithBindings(): string { return `${FoundationNavigationModule.Commissioning}.new` }\r\n static get NewCommissionNoBindings(): string { return \"app.foundation.newcommission\" }\r\n static get ViewCommission(): string { return `${FoundationNavigationModule.Commissioning}.view` }\r\n static get NPS(): string { return 'app.foundation.nps'; }\r\n\r\n static get DeveloperConsole(): string { return 'app.foundation.console' }\r\n static get ConfigManager(): string { return 'app.foundation.configmanager' }\r\n static get AppManager(): string { return 'app.foundation.appmanager' }\r\n static get CameraConfig(): string { return 'app.foundation.cameraconfig' }\r\n\r\n static get Customers(): string { return 'app.foundation.customers'; }\r\n static get CustomerView(): string { return `${FoundationNavigationModule.Customers}.view`; }\r\n static get CustomerEdit(): string { return `${FoundationNavigationModule.Customers}.edit`; }\r\n static get CustomerNew(): string { return `${FoundationNavigationModule.Customers}.new`; }\r\n \r\n static get CustomerSubscriptions(): string { return `app.foundation.subscriptions`; }\r\n\r\n static get ReleaseNotes(): string { return `${FoundationNavigationModule.ParentRoot}.releasenotes`; }\r\n\r\n static get Vehicles(): string { return 'app.foundation.vehicles'; }\r\n static get VehicleView(): string { return `${FoundationNavigationModule.Vehicles}.view`; }\r\n\r\n static get DeviceHealth(): string { return 'app.foundation.devicehealth'; }\r\n\r\n static get DeviceHealthVehicleView(): string { return `${FoundationNavigationModule.DeviceHealth}.vehicle`; }\r\n\r\n\r\n static get DeviceHealthCompanies(): string { return 'app.foundation.devicehealth.companies'; }\r\n\r\n\r\n static get Units(): string { return `app.foundation.units` }\r\n static get Peripherals(): string { return `app.foundation.peripherals` }\r\n static get Cameras(): string { return `app.foundation.cameras` }\r\n static get CamerasVideo(): string { return `app.foundation.cameras.view.video` }\r\n static get Sims(): string { return `app.foundation.sims` }\r\n static get RVLite(): string { return `app.foundation.rvlite` }\r\n\r\n static get StreamaxConfigsAccountList(): string { return `app.foundation.streamaxconfigs` }\r\n static get StreamaxConfigsAccountView(): string { return `${FoundationNavigationModule.StreamaxConfigsAccountList}.accountview` }\r\n\r\n static get Jobs(): string { return 'app.foundation.jobs'; }\r\n static get JobItems(): string { return 'app.foundation.jobitems'; }\r\n static get EngineerHistory(): string { return 'app.foundation.engineerhistory'; }\r\n static get JobItemsCommissionNew(): string { return `${FoundationNavigationModule.JobItems}.new`; }\r\n static get JobView(): string { return 'app.foundation.jobs.view'; }\r\n static get VisitFailures(): string { return 'app.foundation.visitfailures' }\r\n\r\n static get Default(): string { return FoundationNavigationModule.Customers; }\r\n static get DefaultEngineer(): string { return FoundationNavigationModule.JobItems; }\r\n static get DefaultHardware(): string { return this.Units; }\r\n static get ParentRoot(): string { return \"app.foundation\"; }\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { AccountStatus } from \"@app/enum/account/AccountStatus\";\r\nimport { Platform } from \"@app/enum/account/Platform\";\r\nimport { IAccount } from \"@app/services/account.service\";\r\nimport { AccountFeatureService, IAccountFeatureDescription } from \"@app/services/accountFeature.service\";\r\nimport { DataCacheService } from \"@app/services/caching/data-cache.service\";\r\nimport { CurrentUserService } from \"@app/services/currentUser.service\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { map, switchMap } from \"rxjs/operators\";\r\nimport { IReseller } from \"../_models/IReseller\";\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class AccountService {\r\n private customerAccountsCacheName: string = \"customerAccountsCache\";\r\n private resellerAccountsCacheName: string = \"resellerAccountsCache\";\r\n\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly accountFeatureService: AccountFeatureService,\r\n private readonly dataCacheService: DataCacheService,\r\n private readonly currentUserService: CurrentUserService\r\n ) {\r\n }\r\n\r\n getCustomerAccount(id: number): Observable {\r\n const account = this.dataCacheService.getSingleValue(id, this.customerAccountsCacheName);\r\n\r\n if (account) {\r\n return of(account);\r\n }\r\n\r\n return this.http.get(`/api/foundation/accounts/${id}`);\r\n }\r\n\r\n getCustomerAccounts(invalidateCache = false): Observable {\r\n return this.dataCacheService.getOrRequest(this.customerAccountsCacheName, () => this.getCustomerAccountsFromDb(), { invalidateCache })\r\n .pipe(map(accounts => {\r\n return accounts.filter(a => a.Status != AccountStatus.Prospective)\r\n }));\r\n }\r\n\r\n getCustomerAccountsFromDb(): Observable {\r\n return this.http.get(`/api/foundation/accounts/`);\r\n }\r\n\r\n getResellers(invalidateCache = false): Observable {\r\n return this.dataCacheService.getOrRequest(this.resellerAccountsCacheName, () => this.getResellersFromDb(), { invalidateCache })\r\n }\r\n\r\n getResellersFromDb(): Observable {\r\n return this.http.get(`/api/foundation/accounts/resellers`);\r\n }\r\n\r\n createAccountMap(accounts: IAccount[]): Map {\r\n return new Map(accounts.map(a => [a.Id, a]));\r\n }\r\n\r\n updateFeatureSet(customerId: number): Observable {\r\n return this.updateCustomerFeatures(customerId)\r\n .pipe(switchMap(() => this.getCustomerFeatureSet(customerId)))\r\n }\r\n\r\n updateCustomerFeatures(accountId: number): Observable {\r\n return this.http.post(\"/api/foundation/accounts/updatefeatures\", Number(accountId));\r\n }\r\n\r\n getCustomerAccountImage(accountId: number, invalidateCache = false): Observable {\r\n return this.http.get(`/api/foundation/accounts/${accountId}/image`);\r\n }\r\n\r\n saveAccount(account: IAccount): Observable {\r\n if (!account) {\r\n return;\r\n }\r\n\r\n // Validate model\r\n\r\n account.Website = account.Website || \"\";\r\n account.Platform = account.Platform || Platform.Verilocation;\r\n\r\n return this.http.post(\"/api/foundation/accounts/\", account);\r\n }\r\n\r\n getResellerName(resellers: IReseller[], resellerId: number): string {\r\n if (resellerId) {\r\n const resellerAccount = resellers.find(r => r.Id == resellerId);\r\n return resellerAccount?.Description || \"Unknown\";\r\n }\r\n\r\n return `AddSecure UK`;\r\n }\r\n\r\n private getCustomerFeatureSet(customerId: number): Observable {\r\n return this.getCustomerAccount(customerId)\r\n .pipe(switchMap(\r\n customer => {\r\n return this.refreshFeatureSet(customer);\r\n }))\r\n }\r\n\r\n private refreshFeatureSet(customer, includeDisabled = false): Observable {\r\n let featureSet: IAccountFeatureDescription[] = this.accountFeatureService.getFeatureDescriptionsForAccount(customer);\r\n if (includeDisabled) {\r\n return of(featureSet);\r\n }\r\n else {\r\n return of(featureSet.filter(f => f.enabled));\r\n }\r\n }\r\n}\r\n","import { HttpParams } from \"@angular/common/http\";\r\nimport { DateService, DateUnit } from \"@app/services/date.service\";\r\nimport { DayOfWeek } from \"@enums/DayOfWeek\";\r\nimport { ReasonCode } from \"@enums/ReasonCode\";\r\nimport { AccountUserType } from \"@enums/UserType\";\r\nimport { IFilterOptions } from \"@interfaces/filters/IFilterOptions\";\r\nimport { ICombinedPreferences } from \"@interfaces/ICombinedPreferences\";\r\nimport { IComboBox } from \"@interfaces/IComboBox\";\r\nimport { GeofenceCategory } from \"@interfaces/IGeofences\";\r\nimport { IPreferencesContent } from \"@interfaces/IPreferencesContent\";\r\nimport { IUser } from \"@interfaces/IUser\";\r\nimport { ReportTypesNavLabels } from \"@reports/enums/ReportTypesNavLabels\";\r\nimport { IReportHistory } from \"@reports/models/IDynamicReportLog\";\r\nimport { ICollatedHeader } from \"@reports/models/IReportTableDefinition\";\r\nimport { AccountService } from \"@services/account.service\";\r\nimport { AccountFeatureService } from \"@services/accountFeature.service\";\r\nimport { CacheService } from \"@services/cache.Service\";\r\nimport { ConstantsService } from \"@services/constantsService\";\r\nimport { CurrentUserService } from \"@services/currentUser.service\";\r\nimport { PreferencesService, Section } from \"@services/preferences.service\";\r\nimport { SessionService } from \"@services/session.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { UnitConversionType } from \"@services/unitConversion.service\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport * as angular from \"angular\";\r\nimport copy from \"fast-copy/dist/fast-copy.esm.js\";\r\nimport * as moment from \"moment-timezone\";\r\nimport { SettingsName } from \"src/app/class/SettingsName\";\r\nimport { AlcolockEventGroup } from \"../../tacho/alcolockCompliance/alcolock.enums\";\r\nimport { ColumnDataType } from \"../enums/ColumnDataType\";\r\nimport { ReportDataFunction } from \"../enums/ReportDataFunction\";\r\nimport { MeasurementCategoryType } from \"../enums/ReportMeasurementType\";\r\nimport { ReportTableRowDataSource } from \"../enums/ReportTableRowDataSource\";\r\nimport { SchedulingFrequency } from \"../enums/SchedulingFrequency\";\r\nimport { TimeFilterType } from \"../enums/TimeFilterType\";\r\nimport { IColumnDefinition, IReportDataFunctionDefinition } from \"../models/IColumnDefinition\";\r\nimport { IColumnHeader } from \"../models/IColumnHeader\";\r\nimport { IReportTypeToCustomParameterMapping, IRowDataSourceToCustomParameterMapping } from \"../models/ICustomParameterMapping\";\r\nimport { IDataSourceDefinition } from \"../models/IDataSourceDefinition\";\r\nimport { IDynamicReportSchedule } from \"../models/IDynamicReportSchedule\";\r\nimport { IHtmlDocument } from \"../models/IHtmlDocument\";\r\nimport { IDataDefinition, IReportDefinition, IReportDefinitionHistory } from \"../models/IReportDefinition\";\r\nimport { IReportParameterDefinition, IReportParameters, ReportParameterType, ReportParameterValueType } from \"../models/IReportParameters\";\r\nimport { VehicleType } from \"@app/enum/VehicleType.enum\";\r\nimport { enumNames } from \"@app/filters/enumNames.filter\";\r\n\r\nexport interface IColumnFilterOptions {\r\n canFilterColumn?: boolean;\r\n showFilterValueOperators?: boolean;\r\n showTimeFilter?: boolean;\r\n filterTimeHour?: number;\r\n filterTimeMinute?: number;\r\n\r\n // display DOM elements\r\n displayTimeFilterControls?: boolean;\r\n displayFilterValueControl?: boolean;\r\n displayValueContainsControl?: boolean;\r\n displayGenericFilterValueControls?: boolean;\r\n}\r\n\r\nexport interface IStandardColumns {\r\n rowTitleColumn: IColumnHeader,\r\n stringColumn: IColumnHeader,\r\n doubleColumn: IColumnHeader,\r\n dateColumn: IColumnHeader,\r\n durationColumn: IColumnHeader\r\n}\r\n\r\nexport interface IReportCategory {\r\n title: string;\r\n icon: string;\r\n\r\n columns: IColumnHeader[];\r\n\r\n hide?: boolean;\r\n showColumns?: boolean;\r\n}\r\n\r\nexport interface IDateRangeOption {\r\n Before?: Date | string | null;\r\n After?: Date | string | null;\r\n}\r\n\r\nexport interface IRangeOption {\r\n GreaterThan?: T | null;\r\n LessThan?: T | null;\r\n}\r\n\r\nexport interface IReportScheduleQueryOptions {\r\n Id?: number | null;\r\n Name?: string;\r\n Frequency?: SchedulingFrequency[];\r\n ExportType?: ExportType[];\r\n RunDate?: IRangeOption;\r\n UserId?: number | null;\r\n AccountId?: number | null;\r\n ReportDefinitionId?: number | null;\r\n RetryCount?: IRangeOption;\r\n GenerationHour?: IRangeOption;\r\n LastScheduledQueueTime?: IDateRangeOption;\r\n NextScheduledQueueTime?: IDateRangeOption;\r\n IsActiveSchedule?: boolean | null;\r\n IsActiveUser?: boolean | null;\r\n IsActiveAccount?: boolean | null;\r\n\r\n invalidateCache?: boolean;\r\n minsToLive?: number;\r\n}\r\n\r\nexport interface IHeaderSortSettings {\r\n headerId: number;\r\n ascending: boolean;\r\n}\r\n\r\nexport enum ExportType {\r\n PDF,\r\n Excel,\r\n CSV\r\n}\r\n\r\nexport enum DateRange {\r\n Today = 0,\r\n Yesterday = 1,\r\n Week = 2,\r\n Month = 3,\r\n Custom = 4,\r\n ThisWeek = 5,\r\n LastWeek = 6,\r\n Latest3Weeks = 7,\r\n ThisMonth = 8,\r\n LastMonth = 9\r\n}\r\n\r\nexport class DynamicReportService {\r\n apiUrl: string;\r\n private reportDefenitionsCacheName = \"reportDefenitionsCacheName\";\r\n\r\n static $inject = [\"$q\", \"$http\", \"$document\", \"$timeout\", \"constantsService\", \"currentUserService\", \"accountService\", \"translationService\", \"cacheService\", \"accountFeatureService\", \"preferencesService\", \"sessionService\", \"veriDate\", \"dateService\"];\r\n constructor(\r\n public readonly $q: angular.IQService,\r\n private readonly $http: angular.IHttpService,\r\n private readonly $document: angular.IDocumentService,\r\n private readonly $timeout: angular.ITimeoutService,\r\n private readonly constantsService: ConstantsService,\r\n private readonly currentUserService: CurrentUserService,\r\n private readonly accountService: AccountService,\r\n private readonly translationService: TranslationService,\r\n private readonly cacheService: CacheService,\r\n private readonly accountFeatureService: AccountFeatureService,\r\n private readonly preferencesService: PreferencesService,\r\n private readonly sessionService: SessionService,\r\n private readonly veriDate: VeriDate,\r\n private readonly dateService: DateService,\r\n\r\n ) {\r\n this.apiUrl = this.constantsService.getApiUrl();\r\n this.cacheService.createCache(this.reportDefenitionsCacheName, { maxAge: 30 * 60 * 1000 });\r\n }\r\n\r\n createReportTemplate(): IReportDefinition {\r\n const newReportDefinition: IReportDefinition = {\r\n Active: true,\r\n Title: null,\r\n RowDataSource: ReportTableRowDataSource.Vehicle,\r\n SubRowDataSource: ReportTableRowDataSource.None,\r\n Portrait: true,\r\n TableDefinition: {\r\n Headers: [],\r\n Rows: [],\r\n SummarySections: []\r\n },\r\n newReport: true,\r\n Shared: false\r\n };\r\n\r\n return newReportDefinition;\r\n }\r\n\r\n createReportScheduleTemplate(reportId: number = 0): IDynamicReportSchedule {\r\n const newReportSchedule: IDynamicReportSchedule = {\r\n Name: \"\",\r\n Frequency: SchedulingFrequency.Weekly,\r\n ReportDefinitionId: reportId,\r\n ExportType: ExportType.PDF,\r\n RepeatOn: [DayOfWeek.Monday],\r\n Active: true,\r\n SendTo: [\"\"],\r\n };\r\n\r\n this.parseScheduleParametersJson(newReportSchedule);\r\n this.parseSchedulePreferencesJson(newReportSchedule);\r\n\r\n return newReportSchedule;\r\n }\r\n\r\n getStandardColumns(): angular.IPromise {\r\n return this.getColumnHeaders().then((columns) => {\r\n var reportColumns = columns;\r\n\r\n return {\r\n rowTitleColumn: this.findColumn(\"RowTitle\", \"SharedReport\", reportColumns),\r\n stringColumn: this.findColumn(\"String\", \"SharedReport\", reportColumns),\r\n doubleColumn: this.findColumn(\"Double\", \"SharedReport\", reportColumns),\r\n dateColumn: this.findColumn(\"Date\", \"SharedReport\", reportColumns),\r\n durationColumn: this.findColumn(\"Duration\", \"SharedReport\", reportColumns)\r\n }\r\n });\r\n }\r\n\r\n getLatestReportHistory(invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: \"/api/reports/logs/latest\",\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 60, invalidateCache: invalidateCache } // 60 min cache\r\n })\r\n .then((response: angular.IHttpResponse) => {\r\n\r\n var successfulLogs: IReportHistory[] = [];\r\n\r\n response.data.forEach(reportLog => {\r\n if (!reportLog.Success) {\r\n return;\r\n }\r\n\r\n this.formatReportLog(reportLog);\r\n\r\n successfulLogs.push(reportLog);\r\n });\r\n\r\n successfulLogs.sort((x, y) => {\r\n return y.Id - x.Id;\r\n });\r\n\r\n return successfulLogs;\r\n });\r\n }\r\n\r\n getLogCounts(invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: \"/api/reports/logs/count\",\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 60, invalidateCache: invalidateCache } // 60 min cache\r\n })\r\n .then((response: angular.IHttpResponse) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getReportHistory(reportId: number, invalidateCache = false): angular.IPromise {\r\n if (!reportId) {\r\n return this.$q.resolve([]);\r\n }\r\n\r\n return this\r\n .$http({\r\n url: `/api/reports/logs/${reportId}`,\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 60, invalidateCache: invalidateCache } // 60 min cache\r\n })\r\n .then((response: angular.IHttpResponse) => {\r\n\r\n var successfulLogs: IReportHistory[] = [];\r\n\r\n response.data.forEach(reportLog => {\r\n if (!reportLog.Success) {\r\n return;\r\n }\r\n\r\n this.formatReportLog(reportLog);\r\n\r\n successfulLogs.push(reportLog);\r\n });\r\n\r\n successfulLogs.sort((x, y) => {\r\n return y.Id - x.Id;\r\n });\r\n\r\n return successfulLogs;\r\n });\r\n }\r\n\r\n getReportScheduleLogs(scheduleId: number, invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/reports/logs/schedule/${scheduleId}`,\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 60, invalidateCache: invalidateCache } // 60 min cache\r\n })\r\n .then((response: angular.IHttpResponse) => {\r\n\r\n var successfulLogs: IReportHistory[] = [];\r\n\r\n response.data.forEach(reportLog => {\r\n if (!reportLog.Success) {\r\n return;\r\n }\r\n\r\n this.formatReportLog(reportLog);\r\n\r\n successfulLogs.push(reportLog);\r\n });\r\n\r\n successfulLogs.sort((x, y) => {\r\n return y.Id - x.Id;\r\n });\r\n\r\n return successfulLogs;\r\n });\r\n }\r\n\r\n parametersHaveDatesSet(reportParameters: IReportParameters): boolean {\r\n if (!(reportParameters.Start instanceof Date) || !(reportParameters.End instanceof Date)) {\r\n return false\r\n }\r\n return true;\r\n }\r\n\r\n formatParametersToUTCTimezone(reportParameters: IReportParameters): void {\r\n if (this.isNullOrDefault(reportParameters)) {\r\n return;\r\n }\r\n\r\n if (this.parametersHaveDatesSet(reportParameters) && reportParameters.TimeFilterType != TimeFilterType.None && reportParameters.TimeFilterStart && reportParameters.TimeFilterEnd) {\r\n var timeStart = this.dateService.getDurationFromTimeSpan(reportParameters.TimeFilterStart);\r\n reportParameters.Start.setHours(timeStart.hours, timeStart.minutes, timeStart.seconds);\r\n\r\n var timeEnd = this.dateService.getDurationFromTimeSpan(reportParameters.TimeFilterEnd);\r\n reportParameters.End.setHours(timeEnd.hours, timeEnd.minutes, timeEnd.seconds);\r\n }\r\n\r\n reportParameters.TimeFilterStart = this.timespanToUTC(reportParameters.TimeFilterStart);\r\n reportParameters.TimeFilterEnd = this.timespanToUTC(reportParameters.TimeFilterEnd);\r\n }\r\n\r\n formatParametersToLocalTimezone(reportParameters: IReportParameters): void {\r\n if (!reportParameters) {\r\n return;\r\n }\r\n\r\n if (this.isNullOrDefault(reportParameters)) {\r\n\r\n reportParameters.Start = new Date(reportParameters.Start);\r\n reportParameters.End = new Date(reportParameters.End);\r\n\r\n return;\r\n }\r\n\r\n reportParameters.TimeFilterStart = this.timespanToLocal(reportParameters.TimeFilterStart);\r\n reportParameters.TimeFilterEnd = this.timespanToLocal(reportParameters.TimeFilterEnd);\r\n\r\n reportParameters.Start = new Date(reportParameters.Start);\r\n reportParameters.End = new Date(reportParameters.End);\r\n }\r\n\r\n populateReport(reportDefinition: IReportDefinition, preview: boolean = false): angular.IPromise {\r\n this.formatParametersToUTCTimezone(reportDefinition.Parameters);\r\n\r\n return this.$http(\r\n {\r\n method: \"POST\",\r\n url: `/api/analytical/populate/${preview}`,\r\n data: reportDefinition,\r\n })\r\n .then((result: angular.IHttpResponse) => {\r\n var reportLog = result.data;\r\n\r\n this.formatReportLog(reportLog);\r\n this.formatParametersToLocalTimezone(reportDefinition.Parameters)\r\n\r\n return this.$timeout(() => {\r\n return reportLog;\r\n }, 500);\r\n });\r\n }\r\n\r\n previewReport(reportDefinition: IReportDefinition): angular.IPromise {\r\n reportDefinition = copy(reportDefinition);\r\n reportDefinition.Title = reportDefinition.Title || \"New Report\";\r\n\r\n return this.$http(\r\n {\r\n method: \"POST\",\r\n url: `/api/analytical/preview`,\r\n data: reportDefinition,\r\n })\r\n .then((result: angular.IHttpResponse) => {\r\n result.data.Footer = result.data.Footer.replace(`X`, `1`);\r\n result.data.Footer = result.data.Footer.replace(`Y`, `1`);\r\n\r\n return result.data;\r\n });\r\n }\r\n\r\n getColumnHeaders(): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/reports/columnheaders`,\r\n method: \"GET\",\r\n cache: true\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n\r\n response.data.forEach(column => {\r\n column.uniqueId = this.getUniqueColumnId(column);\r\n });\r\n\r\n return response.data;\r\n });\r\n }\r\n\r\n getUniqueColumnId(column: IColumnHeader): string {\r\n return `${column.ReportType}.${column.DataSourceValue}`;\r\n }\r\n\r\n setReportDefinitionColumnIds(reportDefinition: IReportDefinition): void {\r\n if (!reportDefinition) {\r\n console.warn(\"No report model\")\r\n return;\r\n }\r\n\r\n if (!reportDefinition.TableDefinition) {\r\n console.warn(\"No table definition on report model\")\r\n return;\r\n }\r\n\r\n if (!reportDefinition.TableDefinition?.Headers?.length) {\r\n console.warn(\"No table definition headers on report model\")\r\n return;\r\n }\r\n\r\n reportDefinition.TableDefinition.Headers.forEach(column => {\r\n column.uniqueId = this.getUniqueColumnId(column);\r\n });\r\n }\r\n\r\n getDataSourceDefinitions(): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/reports/datasources`,\r\n method: \"GET\",\r\n cache: true\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n reportNameExists(reportName: string, existingReportId: number) {\r\n return this\r\n .$http({\r\n url: `/api/reports/exists/${existingReportId}?reportName=${encodeURIComponent(reportName)}`,\r\n method: \"GET\",\r\n cache: true\r\n })\r\n .then((response: angular.IHttpResponse) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getDisplayColumnHeaders(): angular.IPromise {\r\n const getColumnsPromise = this.getColumnHeaders();\r\n const getDataSourceDefinitionPromise = this.getDataSourceDefinitions();\r\n const accountPromise = this.accountService.getAccountData()\r\n\r\n return this.$q.all([getColumnsPromise, getDataSourceDefinitionPromise, accountPromise]).then(([columns, dataSourceDefinition, account]) => {\r\n\r\n columns = columns.filter(column => this.accountFeatureService.isReportTypeEnabled(account, column.ReportType))\r\n\r\n this.mapDataSourceDefinitionsToColumns(columns, dataSourceDefinition);\r\n this.formatColumnsForDisplay(columns);\r\n\r\n return columns;\r\n });\r\n }\r\n\r\n filterAvailableColumnHeaders(columnHeaders: IColumnHeader[]): IColumnHeader[] {\r\n if (!columnHeaders?.length) {\r\n console.warn(\"No columnHeaders provided\");\r\n return;\r\n }\r\n\r\n const availableColumnHeaders: IColumnHeader[] = [];\r\n\r\n columnHeaders.forEach(column => {\r\n if (!(column.dataSourceDefinition\r\n && column.dataSourceDefinition.IsVisible\r\n && column.ColumnDefinition\r\n && column.ColumnDefinition.Format\r\n && column.ColumnDefinition.Format.IsVisible)) {\r\n return;\r\n }\r\n\r\n availableColumnHeaders.push(column);\r\n });\r\n\r\n return availableColumnHeaders;\r\n }\r\n\r\n getAvailableColumnHeadersForReportEditor(): angular.IPromise {\r\n return this.getDisplayColumnHeaders().then((columnHeaders: IColumnHeader[] = []) => {\r\n const availableColumnHeaders: IColumnHeader[] = [];\r\n\r\n columnHeaders.forEach(column => {\r\n if (!(column.dataSourceDefinition\r\n && column.dataSourceDefinition.IsVisible\r\n && column.ColumnDefinition\r\n && column.ColumnDefinition.Format\r\n && column.ColumnDefinition.Format.IsVisible)) {\r\n return;\r\n }\r\n\r\n availableColumnHeaders.push(column);\r\n });\r\n\r\n return availableColumnHeaders;\r\n });\r\n }\r\n\r\n findRowTitleColumn(columns: IColumnHeader[]): IColumnHeader {\r\n if (!columns?.length) {\r\n console.warn(\"No columns provided\");\r\n return;\r\n }\r\n\r\n for (let i = 0; i < columns.length; i++) {\r\n const header = columns[i];\r\n\r\n if (header.IsRowTitle || header.DataSourceValue === \"RowTitle\") {\r\n return header;\r\n }\r\n }\r\n }\r\n\r\n mapDataSourceDefinitionsToColumns(columns: IColumnHeader[], dataSourceDefinition: IDataSourceDefinition[]) {\r\n columns.forEach(column => {\r\n dataSourceDefinition.forEach(dataSource => {\r\n if (column.ReportType === dataSource.ReportType) {\r\n column.dataSourceDefinition = dataSource;\r\n }\r\n });\r\n });\r\n }\r\n\r\n formatColumnsForDisplay(columns: IColumnHeader[]) {\r\n columns.forEach(column => {\r\n\r\n if (!column.ColumnDefinition) {\r\n column.ColumnDefinition = {};\r\n }\r\n\r\n if (column.ColumnDefinition.Type) {\r\n column.ColumnDefinition.dataTypeDisplayName = this.getColumnTypeDisplayName(column.ColumnDefinition.Type);\r\n }\r\n\r\n if (!column.Title && column.DefaultTitle) {\r\n column.Title = column.DefaultTitle;\r\n }\r\n\r\n column.ColumnDefinition.supportedReportDataFunctionDefinitions = this.createDisplayDatafunctions(column.ColumnDefinition);\r\n\r\n if (column.dataSourceDefinition) {\r\n column.dataSourceDefinition.icon = this.mapIconForDataSource(column.dataSourceDefinition.DataSourceType);\r\n }\r\n\r\n if (column.DataSourceValue === \"RowTitle\") {\r\n return column.IsRowTitle = true;\r\n }\r\n });\r\n }\r\n\r\n mapIconForDataSource(dataSource: string) {\r\n let icon = \"description\";\r\n\r\n this.dataSourceIconMappings.forEach(mapping => {\r\n if (mapping.dataSource === dataSource) {\r\n icon = mapping.icon;\r\n }\r\n });\r\n\r\n if (icon === \"description\" || !icon) {\r\n console.log(\"No icon for\", dataSource);\r\n }\r\n\r\n return icon;\r\n }\r\n\r\n dataSourceIconMappings: { dataSource: string, icon: string }[] = [\r\n { dataSource: \"Camera\", icon: \"videocam\" },\r\n { dataSource: \"Maintenance\", icon: \"ballot\" },\r\n { dataSource: \"CameraDataSource\", icon: \"videocam\" },\r\n { dataSource: \"VideoStreamingDataSource\", icon: \"videocam\" },\r\n { dataSource: \"CommonEventDataSource\", icon: /*\"warning\"*/\"taxi_alert\" },\r\n { dataSource: \"GeofenceVisitDataSource\", icon: \"filter_tilt_shift\" },\r\n { dataSource: \"JourneyDataSource\", icon: /*\"timeline\"*/\"directions_car\" },\r\n { dataSource: \"SharedReportDataSource\", icon: \"category\" },\r\n { dataSource: \"StationaryLocationDataSource\", icon: \"local_parking\" },\r\n { dataSource: \"TachoDataSource\", icon: \"update\" },\r\n { dataSource: \"TemperatureDataSource\", icon: \"ac_unit\" },\r\n { dataSource: \"TemperatureOutOfBoundsDataSource\", icon: \"ac_unit\" },\r\n { dataSource: \"TmsDataSource\", icon: \"work\" },\r\n { dataSource: \"TrailerAssociationDataSource\", icon: \"link\" },\r\n { dataSource: \"VehicleDataSource\", icon: \"directions_car\" },\r\n { dataSource: \"DriverDataSource\", icon: \"person\" },\r\n { dataSource: \"VehicleMaintenanceDataSource\", icon: \"ballot\" },\r\n { dataSource: \"VehicleActivityDataSource\", icon: \"ballot\" },\r\n { dataSource: \"AlcolockDataSource\", icon: \"playlist_add_check\" },\r\n { dataSource: \"VehicleStatusDataSource\", icon: \"healing\" },\r\n { dataSource: \"VehicleInputDataSource\", icon: \"electric_car\" },\r\n { dataSource: \"EmptyRunningHistoryDataSource\", icon: \"local_shipping\" },\r\n { dataSource: \"AlertReviewDataSource\", icon: \"notifications\" },\r\n { dataSource: \"AlertRecordDataSource\", icon: \"notifications\" },\r\n { dataSource: \"VorRecordDataSource\", icon: \"report\" },\r\n { dataSource: \"CameraOnlineHistoryDataSource\", icon: \"videocam\" },\r\n { dataSource: \"VideoChannelDataSource\", icon: \"videocam\" },\r\n { dataSource: \"FormSubmissionDataSource\", icon: \"ballot\" },\r\n { dataSource: \"LatestTemperatureDataSource\", icon: \"ac_unit\" },\r\n { dataSource: \"DeviceParameterProfileDataSource\", icon: \"ballot\" },\r\n { dataSource: \"DrivingStyleDataSource\", icon: \"ballot\" },\r\n { dataSource: \"BrakePerformanceHistoryDataSource\", icon: \"construction\" },\r\n { dataSource: \"BrakePerformanceValueDataSource\", icon: \"construction\" },\r\n ];\r\n\r\n createDisplayDatafunctions(columnDefinition: IColumnDefinition): IReportDataFunctionDefinition[] {\r\n var functionDefinitions: IReportDataFunctionDefinition[] = [];\r\n\r\n columnDefinition.SupportedReportDataFunctions.forEach(func => {\r\n var definition: IReportDataFunctionDefinition =\r\n {\r\n title: ReportDataFunction[func],\r\n function: func\r\n };\r\n\r\n switch (func) {\r\n case ReportDataFunction.Sum:\r\n {\r\n definition.title = \"Total\";\r\n definition.description = `Gives a sum of all ${columnDefinition.Title}`;\r\n }\r\n }\r\n\r\n functionDefinitions.push(definition);\r\n });\r\n\r\n return functionDefinitions;\r\n }\r\n\r\n restrictReportToSingleResource(report: IReportDefinition): boolean {\r\n return report.SubRowDataSource === ReportTableRowDataSource.TachoRecord || this.isTemperatureReport(report);\r\n }\r\n\r\n isTemperatureReport(report: IReportDefinition): boolean {\r\n return report.SubRowDataSource === ReportTableRowDataSource.TemperatureRecord || this.headersContainsReportType(report, \"Temperature\");\r\n }\r\n\r\n saveReportDefinition(reportDefinition: IReportDefinition): angular.IPromise {\r\n const currentUserPromise = this.currentUserService.getCurrentUser();\r\n const getDataSourceDefinitionPromise = this.getDataSourceDefinitions();\r\n\r\n const reportPromise = this\r\n .$http({\r\n method: \"POST\",\r\n url: `/api/reports`,\r\n data: reportDefinition,\r\n })\r\n .then((response: angular.IHttpResponse) => response.data);\r\n\r\n return this.$q.all([reportPromise, currentUserPromise, getDataSourceDefinitionPromise]).then(([report, currentUser, dataSourceDefinition]) => {\r\n\r\n report = { ...reportDefinition, ...report };\r\n\r\n this.mapDataSourceDefinitionsToColumns(report.TableDefinition.Headers, dataSourceDefinition);\r\n this.formatColumnsForDisplay(report.TableDefinition.Headers);\r\n this.formatReportForDisplay(report, currentUser);\r\n\r\n report.isSystemReport = false;\r\n report.canEdit = true;\r\n\r\n this.cacheService.addOrUpdateItem(this.reportDefenitionsCacheName, report, (i1, i2) => i1.Id == i2.Id);\r\n\r\n return report\r\n });\r\n }\r\n\r\n deleteReportDefinition(definitionId: number): angular.IPromise {\r\n return this.$http(\r\n {\r\n method: \"DELETE\",\r\n url: `/api/reports/${definitionId}/`,\r\n }).then(() => {\r\n\r\n this.cacheService.deleteItem(this.reportDefenitionsCacheName, { Id: definitionId }, (i1, i2) => i1.Id == i2.Id);\r\n\r\n return;\r\n });\r\n }\r\n\r\n getReports(invalidateCache = false): angular.IPromise {\r\n return this.cacheService.getOrRetrieveData(this.reportDefenitionsCacheName, () => this.getReportsFromDB(), invalidateCache)\r\n }\r\n\r\n getReportsFromDB(invalidateCache = false): angular.IPromise {\r\n const currentUserPromise = this.currentUserService.getCurrentUser();\r\n const getDataSourceDefinitionPromise = this.getDataSourceDefinitions();\r\n\r\n const reportsPromise = this\r\n .$http({\r\n url: \"/api/reports\",\r\n method: \"GET\"\r\n })\r\n .then((response: angular.IHttpResponse) => {\r\n return response.data;\r\n });\r\n\r\n return this.$q.all([reportsPromise, currentUserPromise, getDataSourceDefinitionPromise]).then(([reportDefinitions, currentUser, dataSourceDefinition]) => {\r\n reportDefinitions.forEach(report => {\r\n\r\n const userPrefs = this.sessionService.getItem(SettingsName.UserOptions);\r\n this.setReportPreferences(report, userPrefs);\r\n this.mapDataSourceDefinitionsToColumns(report.TableDefinition.Headers, dataSourceDefinition);\r\n this.formatColumnsForDisplay(report.TableDefinition.Headers);\r\n this.formatReportForDisplay(report, currentUser);\r\n });\r\n\r\n reportDefinitions.sort((x, y) => {\r\n return x.Title.localeCompare(y.Title);\r\n });\r\n\r\n return reportDefinitions;\r\n });\r\n }\r\n\r\n updateStockReports(): angular.IPromise {\r\n return this\r\n .$http({\r\n url: \"/api/reports/stock\",\r\n method: \"POST\"\r\n })\r\n .then((response: angular.IHttpResponse) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getReportType(report: IReportDefinition): ReportTypesNavLabels {\r\n if (report.isSystemReport) {\r\n return ReportTypesNavLabels.System;\r\n }\r\n else if (report.Shared) {\r\n return ReportTypesNavLabels.Shared;\r\n }\r\n\r\n return ReportTypesNavLabels.User;\r\n }\r\n\r\n formatReportForDisplay(report: IReportDefinition, currentUser: IUser) {\r\n report.isSystemReport = (!report.UserId && !report.AccountId && report.Shared);\r\n report.canEdit = (report.UserId === currentUser.Id || (report.Shared && currentUser.CurrentAccountUserMapping.Type === AccountUserType.Admin));\r\n\r\n report.reportNavType = this.getReportType(report);\r\n\r\n report.reportTypes = report.ReportType?.split(\",\");\r\n\r\n // Colate report header types\r\n report.TableDefinition.collatedHeaders = report.TableDefinition.Headers.reduce(\r\n (collatedHeaders, currentHeader) => {\r\n if (!currentHeader.dataSourceDefinition) {\r\n return collatedHeaders;\r\n }\r\n\r\n var currentRunningTotal: ICollatedHeader = collatedHeaders.find(h => h.headerName == currentHeader.dataSourceDefinition.DataSourceType);\r\n\r\n if (!currentRunningTotal) {\r\n currentRunningTotal = {\r\n headerName: currentHeader.dataSourceDefinition.DataSourceType,\r\n icon: currentHeader.dataSourceDefinition.icon,\r\n headers: [],\r\n count: 0\r\n };\r\n\r\n collatedHeaders.push(currentRunningTotal);\r\n }\r\n\r\n currentRunningTotal.count++;\r\n currentRunningTotal.headers.push(currentHeader);\r\n\r\n return collatedHeaders;\r\n }, []);\r\n\r\n report.TableDefinition.collatedHeaders.sort((x, y) => y.count - x.count);\r\n report.icon = report.TableDefinition.collatedHeaders.length ? report.TableDefinition.collatedHeaders[0].icon : null;\r\n }\r\n\r\n getReportSchedules(options: IReportScheduleQueryOptions = {}): angular.IPromise {\r\n\r\n if (options && !options.minsToLive) {\r\n options.minsToLive = 60; // default 60 min cache\r\n }\r\n\r\n return this\r\n .$http({\r\n url: \"/api/reports/schedules\",\r\n method: \"GET\",\r\n cache: true,\r\n params: options as HttpParams\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n response.data.forEach(schedule => {\r\n this.parseSchedulePreferencesJson(schedule);\r\n this.parseScheduleParametersJson(schedule);\r\n this.formatParametersToLocalTimezone(schedule.Parameters);\r\n });\r\n\r\n return response.data;\r\n });\r\n }\r\n\r\n saveSchedule(schedule: IDynamicReportSchedule): angular.IPromise {\r\n let promise = this.$q.resolve();\r\n\r\n if (schedule.Preferences == null) {\r\n promise = this.preferencesService.getAllPreferences().then(combinedPrefs => {\r\n schedule.Preferences = combinedPrefs;\r\n });\r\n }\r\n\r\n if (schedule.Preferences.Timezone == null) {\r\n promise = this.preferencesService.getAllPreferences().then(combinedPrefs => {\r\n schedule.Preferences.Timezone = combinedPrefs.Timezone;\r\n });\r\n }\r\n\r\n return promise.then(() => {\r\n this.formatParametersToUTCTimezone(schedule.Parameters);\r\n\r\n this.stringifyScheduleParameters(schedule);\r\n this.stringifySchedulePreferences(schedule);\r\n\r\n return this.$http({\r\n method: \"POST\",\r\n url: \"/api/reports/schedules\",\r\n data: schedule,\r\n })\r\n .then((result: angular.IHttpResponse) => {\r\n const savedSchedule = result.data;\r\n this.formatParametersToLocalTimezone(savedSchedule.Parameters);\r\n this.parseScheduleParametersJson(savedSchedule);\r\n return savedSchedule;\r\n });\r\n });\r\n }\r\n\r\n generate(report: IReportDefinition, exportType: ExportType): angular.IPromise {\r\n if (report == null) {\r\n return this.$q.resolve();\r\n }\r\n\r\n return this.$http(\r\n {\r\n method: \"POST\",\r\n url: `/api/analytical/generate/${exportType}`,\r\n responseType: \"blob\",\r\n data: report,\r\n }).then((result: angular.IHttpResponse) => {\r\n var fileURL = URL.createObjectURL(result.data);\r\n\r\n var a = this.$document[0].createElement('a');\r\n a.href = fileURL;\r\n a.target = '_blank';\r\n a.download = `${report.Title}${this.getDocumentExtension(exportType)}`;\r\n this.$document[0].body.appendChild(a);\r\n a.click();\r\n this.$document[0].body.removeChild(a);\r\n });\r\n }\r\n\r\n filterReportDefinitionHistory(reportDefinitions: IReportDefinitionHistory[], searchString: string): IReportDefinitionHistory[] {\r\n if (!searchString || searchString.length === 0) {\r\n return reportDefinitions;\r\n }\r\n\r\n searchString = searchString.toLowerCase();\r\n\r\n const filteredReportDefinitions: IReportDefinitionHistory[] = [];\r\n\r\n reportDefinitions.forEach(report => {\r\n let showReportDefinition = false;\r\n\r\n if (report.definition.Title.toLowerCase().indexOf(searchString) >= 0) {\r\n showReportDefinition = true;\r\n }\r\n\r\n if (showReportDefinition) {\r\n filteredReportDefinitions.push(report);\r\n }\r\n });\r\n\r\n return filteredReportDefinitions;\r\n }\r\n\r\n getCustomParameterDefinitions(reportDefinition: IReportDefinition): IReportParameterDefinition[] {\r\n if (!reportDefinition || !reportDefinition.TableDefinition) {\r\n return [];\r\n }\r\n\r\n const activeMappings: IReportTypeToCustomParameterMapping[] = [];\r\n\r\n reportDefinition.TableDefinition.Headers.forEach(header => {\r\n var existingMatch = false;\r\n\r\n activeMappings.forEach(mapping => {\r\n if (header.ReportType === mapping.reportType) {\r\n existingMatch = true;\r\n }\r\n });\r\n\r\n if (existingMatch) {\r\n return;\r\n }\r\n\r\n this.reportTypeToCustomParameterMappings.forEach(mapping => {\r\n if (header.ReportType === mapping.reportType) {\r\n activeMappings.push(copy(mapping));\r\n }\r\n });\r\n\r\n });\r\n\r\n var customParameters: IReportParameterDefinition[] = [];\r\n\r\n activeMappings.forEach(activeMapping => {\r\n activeMapping.mappings.forEach(mapping => {\r\n customParameters.push(mapping);\r\n });\r\n });\r\n\r\n const matches = this.rowDataSourceToCustomParameterMappings.filter(mapping => mapping.rowDataSource == reportDefinition.RowDataSource || mapping.rowDataSource == reportDefinition.SubRowDataSource)\r\n\r\n if (matches.length) {\r\n customParameters.push(...matches.flatMap(match => match.mappings));\r\n }\r\n\r\n this.setParameterDefinitionsFromReport(reportDefinition, customParameters);\r\n\r\n // Sort by type and then by conversion type\r\n customParameters.sort((a, b) => {\r\n // Put selects first\r\n if (a.valueType == ReportParameterValueType.Select) {\r\n return -1;\r\n }\r\n else if (b.valueType == ReportParameterValueType.Select) {\r\n return 1;\r\n }\r\n\r\n if (a.valueType == b.valueType) {\r\n return a.conversionType - b.conversionType;\r\n }\r\n\r\n return a.valueType - b.valueType;\r\n });\r\n\r\n // Filter duplicates (it can happen)\r\n customParameters = customParameters.reduce((a, b) => {\r\n if (a.filter(ap => ap.ParameterType == b.ParameterType).length == 0) {\r\n a.push(b);\r\n }\r\n\r\n return a;\r\n }, []);\r\n\r\n return customParameters;\r\n }\r\n\r\n getCustomParameterDefinitionsForValueType(reportDefinition: IReportDefinition, reportParameterValueType: ReportParameterValueType): IReportParameterDefinition[] {\r\n const customReportDefinitions: IReportParameterDefinition[] = this.getCustomParameterDefinitions(reportDefinition);\r\n\r\n if (!customReportDefinitions?.length) {\r\n return null;\r\n }\r\n\r\n return customReportDefinitions.filter(param => param.valueType === reportParameterValueType);\r\n }\r\n\r\n headersContainsReportType(reportDefinitions: IReportDefinition, reportType: string) {\r\n var containsType = false;\r\n\r\n reportDefinitions.TableDefinition.Headers.forEach(header => {\r\n if (header.ReportType === reportType) {\r\n containsType = true;\r\n }\r\n });\r\n\r\n return containsType;\r\n }\r\n\r\n requiresGeofenceSelector(reportDefinition: IReportDefinition): boolean {\r\n if (!reportDefinition || !reportDefinition.Parameters || !reportDefinition.Parameters.CustomParameters) {\r\n return false;\r\n }\r\n\r\n if (reportDefinition.Parameters.CustomParameters.filter(cp => cp.ParameterType === ReportParameterType.GeofenceCategory && cp.Value === GeofenceCategory.Zone).length) {\r\n return false;\r\n }\r\n\r\n return this.requiresSelector(reportDefinition, [\"GeofenceVisit\"]);\r\n }\r\n\r\n requiresDateSelector(reportDefinition: IReportDefinition): boolean {\r\n let requiresSelector = false;\r\n\r\n const reportTypes = [\"VehicleStatus\", \"SharedReport\", \"VideoStreaming\", \"VideoChannel\"];\r\n const reportsToExclude: string[] = [\"76efb175-78f6-4271-98a3-47f4ea3f7895\"];\r\n const latestParameterTypes = [ReportParameterType.LatestCameraOnlineHistory, ReportParameterType.LatestBrakePerformanceHistory, ReportParameterType.LatestBrakePerformanceValue];\r\n\r\n reportDefinition.TableDefinition.Headers.forEach(header => {\r\n if (!reportTypes.includes(header.ReportType)) {\r\n requiresSelector = true;\r\n }\r\n });\r\n\r\n const hasLatestParameter: boolean = !!reportDefinition.Parameters.CustomParameters.find(param => {\r\n return latestParameterTypes.includes(param.ParameterType) && param.Value && param.Active;\r\n })\r\n\r\n if (reportsToExclude.includes(\r\n reportDefinition.StaticStockReportId) ||\r\n hasLatestParameter) {\r\n requiresSelector = false;\r\n }\r\n\r\n return requiresSelector;\r\n }\r\n\r\n\r\n requiresGeofenceGroupSelector(reportDefinitions: IReportDefinition): boolean {\r\n return false;\r\n }\r\n\r\n getUniqueReportCategories(allColumns: IColumnHeader[]): IReportCategory[] {\r\n var categories: IReportCategory[] = [];\r\n\r\n allColumns.forEach(column => {\r\n\r\n const displayName = this.getColumnDataSourceName(column);\r\n const existingCategory = categories.find(c => c.title == displayName);\r\n\r\n if (existingCategory) {\r\n existingCategory.columns.push(column);\r\n return;\r\n }\r\n\r\n categories.push({\r\n title: displayName,\r\n icon: column.dataSourceDefinition ? column.dataSourceDefinition.icon : \"category\",\r\n columns: [column]\r\n });\r\n });\r\n\r\n // Sort categories\r\n categories.sort((x, y) => { return x.title.localeCompare(y.title); });\r\n\r\n // Sort category columns\r\n categories.forEach(c => {\r\n c.columns.sort((x, y) => { return x.Title.localeCompare(y.Title); });\r\n });\r\n\r\n return categories;\r\n }\r\n\r\n createColumnFilterOptions(allColumns: IColumnHeader[]): IComboBox[] {\r\n var uniqueCategories = this.getUniqueReportCategories(allColumns);\r\n var columnFilterOptions: IComboBox[] = uniqueCategories.map(c => { return { Name: c.title, Value: 0, Icon: c.icon }; });\r\n\r\n columnFilterOptions.forEach((option, i) => { option.Value = i + 1; });\r\n\r\n return columnFilterOptions;\r\n }\r\n\r\n getColumnDataSourceName(column: IColumnHeader): string {\r\n var displayName = column.dataSourceDefinition.TranslatedDisplayName\r\n ? column.dataSourceDefinition.TranslatedDisplayName\r\n : \"Unknown\";\r\n\r\n return displayName;\r\n }\r\n\r\n getColumnFilterOption(column: IColumnHeader, columnFilterOptions: IComboBox[]): IComboBox {\r\n var option: IComboBox;\r\n\r\n columnFilterOptions.forEach(cfo => {\r\n var displayName = this.getColumnDataSourceName(column);\r\n\r\n if (cfo.Name === displayName) {\r\n option = cfo;\r\n }\r\n });\r\n\r\n return option;\r\n }\r\n\r\n filtersToDefinition(filterOptions: IFilterOptions, definition: IDataDefinition) {\r\n if (!definition.Parameters) {\r\n definition.Parameters = {};\r\n }\r\n\r\n if (!filterOptions) {\r\n return;\r\n }\r\n\r\n if (filterOptions.dateFilter) {\r\n definition.Parameters.Start = filterOptions.dateFilter.start;\r\n definition.Parameters.End = filterOptions.dateFilter.end;\r\n }\r\n\r\n if (filterOptions.dateFilter.startTime && filterOptions.dateFilter.endTime) {\r\n definition.Parameters.TimeFilterStart = filterOptions.dateFilter.startTime;\r\n definition.Parameters.TimeFilterEnd = filterOptions.dateFilter.endTime;\r\n }\r\n\r\n if (filterOptions.dateFilter.filterType) {\r\n definition.Parameters.TimeFilterType = filterOptions.dateFilter.filterType;\r\n }\r\n\r\n if (filterOptions.vehicleFilter) {\r\n definition.Parameters.VehicleId = filterOptions.vehicleFilter.vehicle.Id;\r\n }\r\n\r\n if (filterOptions.driverFilter) {\r\n definition.Parameters.DriverId = filterOptions.driverFilter.driver.Id;\r\n }\r\n\r\n if (filterOptions.groupFilter) {\r\n // Todo: Clarify - May not want to align them both together...\r\n definition.Parameters.VehicleGroupId = filterOptions.groupFilter.group.Id;\r\n definition.Parameters.DriverGroupId = filterOptions.groupFilter.group.Id;\r\n }\r\n\r\n }\r\n\r\n findColumnsOfType(dataSourceType: string, columns: IColumnHeader[]): IColumnHeader[] {\r\n dataSourceType = dataSourceType.toLowerCase();\r\n\r\n let columnsToSearch = [];\r\n\r\n if (dataSourceType && columns) {\r\n columnsToSearch = columns.filter(column => { return column.DataSourceType.toLowerCase().indexOf(dataSourceType) !== -1 });\r\n }\r\n\r\n return columnsToSearch;\r\n }\r\n\r\n isMachineAndUserTZSame(): angular.IPromise {\r\n\r\n let userOptions = this.sessionService.getItem(SettingsName.UserOptions);\r\n\r\n return this.preferencesService.getTimezone(userOptions.Timezone.Value).then((timezone) => {\r\n\r\n let localOffset = moment().utcOffset();\r\n let userOffset = moment.tz(timezone.IanaId).utcOffset();\r\n return (userOffset - localOffset) == 0;\r\n });\r\n }\r\n\r\n findColumn(dataSource: string, dataSourceType: string, columns: IColumnHeader[]): IColumnHeader {\r\n dataSource = dataSource.toLowerCase();\r\n\r\n var foundColumn: IColumnHeader;\r\n\r\n const columnsToSearch = this.findColumnsOfType(dataSourceType, columns);\r\n\r\n columnsToSearch.forEach(header => {\r\n if (header.DataSourceValue.toLowerCase() === dataSource || header.Title.toLowerCase() == dataSource) {\r\n foundColumn = header;\r\n }\r\n });\r\n\r\n return copy(foundColumn);\r\n }\r\n\r\n stringifySchedulePreferences(schedule: IDynamicReportSchedule): void {\r\n if (!schedule?.Preferences) {\r\n schedule.Preferences = {};\r\n }\r\n\r\n schedule.PreferencesJson = JSON.stringify(schedule.Preferences)\r\n }\r\n\r\n parseSchedulePreferencesJson(schedule: IDynamicReportSchedule): void {\r\n if (!schedule?.PreferencesJson) {\r\n schedule.Preferences = {};\r\n return;\r\n }\r\n\r\n schedule.Preferences = JSON.parse(schedule.PreferencesJson);\r\n }\r\n\r\n stringifyScheduleParameters(schedule: IDynamicReportSchedule): void {\r\n if (!schedule?.Parameters) {\r\n schedule.Parameters = {};\r\n }\r\n\r\n schedule.ParametersJson = JSON.stringify(schedule.Parameters)\r\n }\r\n\r\n parseScheduleParametersJson(schedule: IDynamicReportSchedule): void {\r\n if (!schedule?.ParametersJson) {\r\n schedule.Parameters = {};\r\n return;\r\n }\r\n\r\n schedule.Parameters = JSON.parse(schedule.ParametersJson);\r\n }\r\n\r\n copyScheduleParametersToReport(schedule: IDynamicReportSchedule, report: IReportDefinition): void {\r\n report.Parameters = schedule.Parameters;\r\n }\r\n\r\n copySchedulePreferencesToReport(schedule: IDynamicReportSchedule, report: IReportDefinition): void {\r\n if (schedule.Preferences) {\r\n report.Currency = schedule.Preferences.Currency?.Value;\r\n report.VolumeMeasurement = schedule.Preferences.VolumeMeasurement?.Value;\r\n report.DistanceMeasurement = schedule.Preferences.DistanceMeasurement?.Value;\r\n report.TemperatureMeasurement = schedule.Preferences.TemperatureMeasurement?.Value;\r\n report.FuelConsumptionMeasurement = schedule.Preferences.FuelConsumptionMeasurement?.Value;\r\n }\r\n\r\n report.DurationFormat = schedule.DurationFormat;\r\n }\r\n\r\n copyReportParametersToSchedule(report: IReportDefinition, schedule: IDynamicReportSchedule): void {\r\n schedule.Parameters = {\r\n ...schedule.Parameters,\r\n ...report.Parameters\r\n }\r\n schedule.ParametersJson = JSON.stringify(schedule.Parameters);\r\n }\r\n\r\n copyReportPreferencesToSchedule(report: IReportDefinition, schedule: IDynamicReportSchedule): void {\r\n const newPreferences: IPreferencesContent = {\r\n Currency: {\r\n Value: report.Currency, Section: Section.Internationalisation\r\n },\r\n VolumeMeasurement: {\r\n Value: report.VolumeMeasurement, Section: Section.Internationalisation\r\n },\r\n DistanceMeasurement: {\r\n Value: report.DistanceMeasurement, Section: Section.Internationalisation\r\n },\r\n TemperatureMeasurement: {\r\n Value: report.TemperatureMeasurement, Section: Section.Internationalisation\r\n },\r\n FuelConsumptionMeasurement: {\r\n Value: report.FuelConsumptionMeasurement, Section: Section.Internationalisation\r\n }\r\n }\r\n\r\n schedule.Preferences = newPreferences;\r\n schedule.DurationFormat = report.DurationFormat;\r\n\r\n schedule.PreferencesJson = JSON.stringify(schedule.Preferences);\r\n }\r\n\r\n ensureUniqueReportColumnHeadersIds(reportDefinition: IReportDefinition) {\r\n if (!reportDefinition.TableDefinition.Headers?.length) {\r\n console.warn(\"No report table definition headers provided\");\r\n return;\r\n }\r\n\r\n reportDefinition.TableDefinition.Headers.forEach(columnHeader => {\r\n this.ensureUniqueColumnId(columnHeader);\r\n });\r\n }\r\n\r\n ensureUniqueColumnHeadersIds(columnHeaders: IColumnHeader[]) {\r\n if (!columnHeaders?.length) {\r\n console.warn(\"No headers provided\");\r\n return;\r\n }\r\n\r\n columnHeaders.forEach(columnHeader => {\r\n this.ensureUniqueColumnId(columnHeader);\r\n });\r\n }\r\n\r\n ensureUniqueColumnId(columnHeader: IColumnHeader) {\r\n if (!columnHeader) {\r\n console.warn(\"No columnHeader provided\");\r\n return;\r\n }\r\n\r\n if (columnHeader.Id && !isNaN(columnHeader.Id)) {\r\n return;\r\n }\r\n\r\n columnHeader.Id = Math.floor(Math.random() * 20000000);\r\n }\r\n\r\n findAndReplaceRowTitle(reportDefinition: IReportDefinition, titleHeader: IColumnHeader) {\r\n const index = reportDefinition.TableDefinition.Headers.findIndex(header => header.IsRowTitle || header.DataSourceValue === \"RowTitle\");\r\n\r\n if (index) {\r\n reportDefinition.TableDefinition.Headers.splice(index, 1, titleHeader);\r\n return;\r\n }\r\n\r\n reportDefinition.TableDefinition.Headers.splice(0, 1, titleHeader);\r\n }\r\n\r\n setReportDefinitionRowTitle(reportDefinition: IReportDefinition, rowTitleHeader: IColumnHeader): void {\r\n if (!rowTitleHeader) {\r\n console.warn(\"No rowTitleHeader provided\");\r\n return;\r\n }\r\n\r\n if (!reportDefinition) {\r\n console.warn(\"No reportDefinition provided\");\r\n return;\r\n }\r\n\r\n const newHeaderColumn: IColumnHeader = copy(rowTitleHeader);\r\n\r\n newHeaderColumn.Title = this.getTitleForRowDataSource(reportDefinition);\r\n newHeaderColumn.IsRowTitle = true;\r\n newHeaderColumn.Sorted = true;\r\n\r\n this.ensureUniqueColumnId(newHeaderColumn);\r\n this.findAndReplaceRowTitle(reportDefinition, newHeaderColumn);\r\n }\r\n\r\n updateFilterOptionsForColumnHeaders(columnHeader: IColumnHeader[] = [], debug: boolean = false): void {\r\n columnHeader.forEach(columnHeader => {\r\n if (!!columnHeader.filterOptions) {\r\n return;\r\n }\r\n\r\n columnHeader.filterOptions = this.getColumnHeaderFilterOptions(columnHeader, debug);\r\n });\r\n }\r\n\r\n getColumnHeaderFilterOptions(columnHeader: IColumnHeader, debug: boolean = false): IColumnFilterOptions {\r\n\r\n const filterOptions: IColumnFilterOptions = {\r\n canFilterColumn: false,\r\n showFilterValueOperators: false,\r\n showTimeFilter: false,\r\n filterTimeHour: null,\r\n filterTimeMinute: null\r\n };\r\n\r\n if (!columnHeader) {\r\n return filterOptions;\r\n }\r\n\r\n if (columnHeader.ColumnDefinition.Type === ColumnDataType.Duration) {\r\n const parsedTimeSpan: number = this.veriDate.parseTimeSpan(columnHeader.FilterValue);\r\n const timeFilter = this.veriDate.createMoment(new Date());\r\n\r\n this.veriDate.setMomentToMinuteOfDay(timeFilter, parsedTimeSpan / 60);\r\n\r\n filterOptions.filterTimeHour = timeFilter.hour();\r\n filterOptions.filterTimeMinute = timeFilter.minute();\r\n filterOptions.showTimeFilter = true;\r\n }\r\n\r\n const typesWithFilterValueOperators: ColumnDataType[] = [\r\n ColumnDataType.Double,\r\n ColumnDataType.Int,\r\n ColumnDataType.Score,\r\n ColumnDataType.Percent,\r\n ColumnDataType.Duration\r\n ];\r\n\r\n const typesWithoutFilterValueOperators: ColumnDataType[] = [\r\n ColumnDataType.String,\r\n ColumnDataType.List,\r\n ColumnDataType.Location\r\n ];\r\n\r\n filterOptions.canFilterColumn = typesWithFilterValueOperators.includes(columnHeader.ColumnDefinition.Type) || typesWithoutFilterValueOperators.includes(columnHeader.ColumnDefinition.Type);\r\n filterOptions.showFilterValueOperators = typesWithFilterValueOperators.includes(columnHeader.ColumnDefinition.Type);\r\n\r\n // display DOM elements\r\n filterOptions.displayTimeFilterControls = filterOptions.canFilterColumn && filterOptions.showFilterValueOperators && filterOptions.showTimeFilter;\r\n filterOptions.displayFilterValueControl = filterOptions.canFilterColumn && filterOptions.showFilterValueOperators && !filterOptions.showTimeFilter;\r\n filterOptions.displayValueContainsControl = filterOptions.canFilterColumn && !filterOptions.showFilterValueOperators;\r\n filterOptions.displayGenericFilterValueControls = filterOptions.displayFilterValueControl || filterOptions.displayValueContainsControl;\r\n\r\n\r\n return filterOptions;\r\n }\r\n\r\n getDataSourceDefinitionsAndMapToColumns(columns: IColumnHeader[]): Promise {\r\n return (this.getDataSourceDefinitions() as Promise).then((dataSourceDefinition: IDataSourceDefinition[]) => {\r\n this.mapDataSourceDefinitionsToColumns(columns, dataSourceDefinition);\r\n this.formatColumnsForDisplay(columns);\r\n });\r\n }\r\n\r\n getTitleForRowDataSource(reportDefinition: IReportDefinition): string {\r\n if (!reportDefinition) {\r\n console.warn(\"No reportDefinition provided\");\r\n return;\r\n }\r\n\r\n let dataSource = reportDefinition.RowDataSource;\r\n\r\n if (Number.isNaN(dataSource) || typeof (dataSource) === \"string\") {\r\n dataSource = Number.parseInt(reportDefinition.RowDataSource.toString());\r\n }\r\n\r\n switch (dataSource) {\r\n case ReportTableRowDataSource.Day:\r\n return \"Day\";\r\n case ReportTableRowDataSource.Week:\r\n return \"Week\";\r\n case ReportTableRowDataSource.Driver:\r\n return \"Driver\";\r\n case ReportTableRowDataSource.Vehicle:\r\n return \"Vehicle\";\r\n case ReportTableRowDataSource.DriverGroup:\r\n return \"Driver Group\";\r\n case ReportTableRowDataSource.VehicleGroup:\r\n return \"Vehicle Group\";\r\n case ReportTableRowDataSource.Geofence:\r\n return \"Geofence\";\r\n case ReportTableRowDataSource.Journey:\r\n return \"Journey\";\r\n case ReportTableRowDataSource.Route:\r\n return \"Route\";\r\n case ReportTableRowDataSource.StationaryLocations:\r\n return \"Stationary Location\";\r\n case ReportTableRowDataSource.TemperatureRecord:\r\n return \"Temperature Record\";\r\n case ReportTableRowDataSource.TrailerAssociation:\r\n return \"Trailer Association\";\r\n }\r\n\r\n return ReportTableRowDataSource[dataSource];\r\n }\r\n\r\n formatReportLog(log: IReportHistory) {\r\n let reportTile = \"Report\";\r\n if (log.ReportTitle) {\r\n reportTile = log.ReportTitle.replace(/[^\\w\\s]/gi, \"\");\r\n }\r\n\r\n if (log.ThumbnailFileGuid) {\r\n log.thumbnailUrl = `${this.apiUrl}/file/thumbnail/${log.ThumbnailFileGuid}`;\r\n }\r\n \r\n log.pdfUrl = `${this.apiUrl}/file/${reportTile}/${log.PdfFileGuid}`;\r\n log.excelUrl = `${this.apiUrl}/file/${reportTile}/${log.ExcelFileGuid}`;\r\n log.csvUrl = `${this.apiUrl}/file/${reportTile}/${log.CsvFileGuid}`;\r\n\r\n if (!log.ReportTitle) {\r\n log.ReportTitle = \"...\";\r\n }\r\n\r\n this.formatParametersToLocalTimezone(log.Parameters);\r\n }\r\n\r\n getSortSettings(report: IReportDefinition): IHeaderSortSettings {\r\n const headerSortSettings: IHeaderSortSettings = {\r\n headerId: null,\r\n ascending: null\r\n }\r\n\r\n if (!report?.TableDefinition?.Headers?.length) {\r\n console.warn(\"Couldn't create sort settings due to no headers\");\r\n return headerSortSettings;\r\n }\r\n\r\n const sortHeader = report.TableDefinition.Headers.find(header => header.Sorted);\r\n\r\n if (!sortHeader) {\r\n console.warn(\"Couldn't create sort settings due to no sort header\");\r\n return headerSortSettings;\r\n }\r\n\r\n headerSortSettings.headerId = sortHeader.Id;\r\n headerSortSettings.ascending = sortHeader.SortAscending;\r\n\r\n return headerSortSettings;\r\n }\r\n\r\n shouldShowGeofenceFilters(report: IReportDefinition): boolean {\r\n return report.ReportType.toLowerCase().includes(\"geofence\");\r\n }\r\n // ---\r\n\r\n private isNullOrDefault(reportParameters: IReportParameters): boolean {\r\n if (!reportParameters.TimeFilterStart || !reportParameters.TimeFilterEnd) {\r\n return true;\r\n }\r\n\r\n if (reportParameters.TimeFilterStart === \"00:00:00\" && reportParameters.TimeFilterEnd === \"00:00:00\") {\r\n return true;\r\n }\r\n\r\n if (reportParameters.TimeFilterStart === \"00:00:00\" && reportParameters.TimeFilterEnd === \"23:59:59\") {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private timespanToUTC(time: string): string {\r\n return moment(time, \"HH:mm:ss\").local().utc().format(\"HH:mm:ss\");\r\n }\r\n\r\n private timespanToLocal(time: string): string {\r\n return moment.utc(time, \"HH:mm:ss\").local().format(\"HH:mm:ss\");\r\n }\r\n\r\n private getDocumentExtension(exportType: ExportType): string {\r\n switch (exportType) {\r\n case ExportType.PDF:\r\n return \".pdf\";\r\n\r\n case ExportType.CSV:\r\n return \".csv\";\r\n\r\n case ExportType.Excel:\r\n return \".xlsx\";\r\n\r\n default:\r\n return \"\";\r\n }\r\n }\r\n\r\n private setParameterDefinitionsFromReport(reportDefinitions: IReportDefinition, parameterDefinitions: IReportParameterDefinition[]): void {\r\n if (!reportDefinitions || !reportDefinitions.Parameters || !reportDefinitions.Parameters.CustomParameters || !parameterDefinitions) {\r\n return;\r\n }\r\n parameterDefinitions.forEach(parameter => {\r\n reportDefinitions.Parameters.CustomParameters.forEach(reportParameter => {\r\n if (parameter.ParameterType === reportParameter.ParameterType) {\r\n parameter.Active = reportParameter.Active;\r\n parameter.Value = reportParameter.Value;\r\n }\r\n });\r\n });\r\n }\r\n\r\n private getColumnTypeDisplayName(type: ColumnDataType): string {\r\n if (type === ColumnDataType.Double || type === ColumnDataType.Int) {\r\n return \"Number\";\r\n }\r\n\r\n if (type === ColumnDataType.Duration) {\r\n return \"Duration\";\r\n }\r\n\r\n return ColumnDataType[type];\r\n }\r\n\r\n private rowDataSourceToCustomParameterMappings: IRowDataSourceToCustomParameterMapping[] = [\r\n {\r\n rowDataSource: ReportTableRowDataSource.DriverGroup,\r\n mappings: [{\r\n parameterName: this.translationService.t(\"Reports.CreateUnassignedGroupRow\"),\r\n valueType: ReportParameterValueType.Boolean,\r\n ParameterType: ReportParameterType.CreateUnassignedGroupRow,\r\n defaultValue: false,\r\n Value: false,\r\n Active: false,\r\n }]\r\n },\r\n {\r\n rowDataSource: ReportTableRowDataSource.VehicleGroup,\r\n mappings: [{\r\n parameterName: this.translationService.t(\"Reports.CreateUnassignedGroupRow\"),\r\n valueType: ReportParameterValueType.Boolean,\r\n ParameterType: ReportParameterType.CreateUnassignedGroupRow,\r\n defaultValue: false,\r\n Value: false,\r\n Active: false,\r\n }]\r\n },\r\n {\r\n rowDataSource: ReportTableRowDataSource.VehicleDepot,\r\n mappings: [{\r\n parameterName: this.translationService.t(\"Reports.CreateUnassignedGroupRow\"),\r\n valueType: ReportParameterValueType.Boolean,\r\n ParameterType: ReportParameterType.CreateUnassignedGroupRow,\r\n defaultValue: false,\r\n Value: false,\r\n Active: false,\r\n }]\r\n }\r\n ]\r\n\r\n private reportTypeToCustomParameterMappings: IReportTypeToCustomParameterMapping[] = [\r\n {\r\n reportType: \"Journey\",\r\n mappings: [\r\n {\r\n parameterName: this.translationService.t(\"Reports.MinimumDistance\"),\r\n valueType: ReportParameterValueType.Number,\r\n conversionType: UnitConversionType.Distance,\r\n ParameterType: ReportParameterType.MinimumDistance,\r\n defaultValue: 0,\r\n Value: 0,\r\n Active: false,\r\n minValue: 0,\r\n },\r\n {\r\n parameterName: this.translationService.t(\"Reports.MinimumFuelUsed\"),\r\n valueType: ReportParameterValueType.Number,\r\n conversionType: UnitConversionType.FuelCapacity,\r\n ParameterType: ReportParameterType.MinimumFuelUsed,\r\n defaultValue: 0,\r\n Value: 0,\r\n Active: false,\r\n minValue: 0,\r\n },\r\n {\r\n parameterName: this.translationService.t(\"Reports.MinimumSpeed\"),\r\n valueType: ReportParameterValueType.Number,\r\n conversionType: UnitConversionType.Speed,\r\n ParameterType: ReportParameterType.MinimumSpeed,\r\n defaultValue: 0,\r\n Value: 0,\r\n Active: false,\r\n minValue: 0,\r\n },\r\n {\r\n parameterName: this.translationService.t(\"Reports.MinimumIdleTime\"),\r\n valueType: ReportParameterValueType.Number,\r\n conversionType: UnitConversionType.Time,\r\n ParameterType: ReportParameterType.MinimumIdleTime,\r\n defaultValue: 0,\r\n Value: 0,\r\n Active: false,\r\n minValue: 0,\r\n },\r\n {\r\n parameterName: this.translationService.t(\"Reports.ExcludeGpsJourneys\"),\r\n valueType: ReportParameterValueType.Boolean,\r\n ParameterType: ReportParameterType.ExcludeGpsJourneys,\r\n defaultValue: false,\r\n Value: false,\r\n Active: false\r\n },\r\n {\r\n parameterName: this.translationService.t(\"Reports.ExcludeInconsequentialJourneys\"),\r\n valueType: ReportParameterValueType.Boolean,\r\n ParameterType: ReportParameterType.ExcludeInconsequentialJourneys,\r\n defaultValue: false,\r\n Value: false,\r\n Active: false\r\n },\r\n {\r\n parameterName: this.translationService.t(\"Reports.ShowOnlyBusinessJourneys\"),\r\n valueType: ReportParameterValueType.Boolean,\r\n ParameterType: ReportParameterType.ShowOnlyBusinessJourneys,\r\n defaultValue: false,\r\n Value: false,\r\n Active: false\r\n },\r\n {\r\n parameterName: this.translationService.t(\"Reports.HideLocationAddressShowonlyLatitudeandLongitude\"),\r\n valueType: ReportParameterValueType.Boolean,\r\n ParameterType: ReportParameterType.LatLongOnly,\r\n defaultValue: false,\r\n Value: false,\r\n Active: false\r\n }\r\n ]\r\n },\r\n {\r\n reportType: \"Alcolock\",\r\n mappings: [\r\n {\r\n parameterName: this.translationService.t(\"Reports.EventGroup\"),\r\n valueType: ReportParameterValueType.Select,\r\n ParameterType: ReportParameterType.ShowOnlyAlcolockEventGroup,\r\n defaultValue: -1,\r\n Value: -1,\r\n Active: false,\r\n options: [\r\n { Name: \"Any\", Value: -1 },\r\n { Name: \"Fail\", Value: AlcolockEventGroup.Fail },\r\n { Name: \"Circumvention\", Value: AlcolockEventGroup.Circumvention },\r\n { Name: \"Pass\", Value: AlcolockEventGroup.Pass },\r\n { Name: \"SignificantEvent\", Value: AlcolockEventGroup.SignificantEvent }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n reportType: \"StationaryLocation\",\r\n mappings: [\r\n {\r\n parameterName: this.translationService.t(\"Reports.MinimumFuelLevelChange\") + \"(%)\",\r\n valueType: ReportParameterValueType.Number,\r\n ParameterType: ReportParameterType.MinimumFuelLevelChange,\r\n defaultValue: 0,\r\n Value: 0,\r\n Active: false,\r\n minValue: 0,\r\n maxValue: 100\r\n },\r\n {\r\n parameterName: this.translationService.t(\"Reports.ExcludeGpsJourneys\"),\r\n valueType: ReportParameterValueType.Boolean,\r\n ParameterType: ReportParameterType.ExcludeGpsJourneys,\r\n defaultValue: true,\r\n Value: true,\r\n Active: true\r\n },\r\n {\r\n parameterName: this.translationService.t(\"Reports.HideLocationAddressShowonlyLatitudeandLongitude\"),\r\n valueType: ReportParameterValueType.Boolean,\r\n ParameterType: ReportParameterType.LatLongOnly,\r\n defaultValue: false,\r\n Value: false,\r\n Active: false\r\n }\r\n ]\r\n },\r\n {\r\n reportType: \"VehicleStatus\",\r\n mappings: [\r\n {\r\n parameterName: this.translationService.t(\"Reports.IncludeOnlyInstalledCameras\"),\r\n valueType: ReportParameterValueType.Boolean,\r\n ParameterType: ReportParameterType.IncludeOnlyInstalledCameras,\r\n defaultValue: false,\r\n Value: false,\r\n Active: false\r\n },\r\n {\r\n parameterName: this.translationService.t(\"Reports.HideLocationAddressShowonlyLatitudeandLongitude\"),\r\n valueType: ReportParameterValueType.Boolean,\r\n ParameterType: ReportParameterType.LatLongOnly,\r\n defaultValue: false,\r\n Value: false,\r\n Active: false\r\n }\r\n ]\r\n },\r\n {\r\n reportType: \"CommonEvent\",\r\n mappings: [\r\n {\r\n parameterName: this.translationService.t(\"Reports.Reason\"),\r\n valueType: ReportParameterValueType.Select,\r\n ParameterType: ReportParameterType.ReasonCode,\r\n defaultValue: 54,\r\n Value: 54,\r\n Active: false,\r\n options: [\r\n { Name: this.translationService.t(\"Reports.Speeding\"), Value: ReasonCode.ContextualSpeeding },\r\n { Name: this.translationService.t(\"Reports.HarshAcceleration\"), Value: ReasonCode.HarshAcceleration },\r\n { Name: this.translationService.t(\"Reports.HarshSteering\"), Value: ReasonCode.HarshSteering },\r\n { Name: this.translationService.t(\"Reports.HarshBraking\"), Value: ReasonCode.HarshBraking },\r\n { Name: this.translationService.t(\"Reports.BadAnticipation\"), Value: ReasonCode.BadAnticipation },\r\n { Name: this.translationService.t(\"Reports.Idling\"), Value: ReasonCode.IdlingOverThreshold },\r\n { Name: \"PTO\", Value: ReasonCode.CanbusPto },\r\n ]\r\n },\r\n {\r\n parameterName: this.translationService.t(\"Reports.MinimumEventTime\"),\r\n valueType: ReportParameterValueType.Number,\r\n conversionType: UnitConversionType.Time,\r\n ParameterType: ReportParameterType.MinimumEventTime,\r\n defaultValue: 0,\r\n Value: 0,\r\n Active: false,\r\n minValue: 0,\r\n },\r\n {\r\n parameterName: this.translationService.t(\"Reports.HideLocationAddressShowonlyLatitudeandLongitude\"),\r\n valueType: ReportParameterValueType.Boolean,\r\n ParameterType: ReportParameterType.LatLongOnly,\r\n defaultValue: false,\r\n Value: false,\r\n Active: false\r\n }\r\n ]\r\n },\r\n {\r\n reportType: \"GeofenceVisit\",\r\n mappings: [\r\n {\r\n parameterName: this.translationService.t(\"Reports.ShowDurationPastEndTime\"),\r\n valueType: ReportParameterValueType.Boolean,\r\n ParameterType: ReportParameterType.ShowDurationPastEndTime,\r\n defaultValue: false,\r\n Value: false,\r\n Active: false\r\n },\r\n {\r\n parameterName: this.translationService.t(\"Reports.HideLocationAddressShowonlyLatitudeandLongitude\"),\r\n valueType: ReportParameterValueType.Boolean,\r\n ParameterType: ReportParameterType.LatLongOnly,\r\n defaultValue: false,\r\n Value: false,\r\n Active: false\r\n },\r\n {\r\n parameterName: this.translationService.t(\"Reports.CurrentlyDwellingAssestsOnly\"),\r\n valueType: ReportParameterValueType.Number,\r\n ParameterType: ReportParameterType.InProgressGeofenceVisits,\r\n defaultValue: 0,\r\n Value: 0,\r\n Active: false,\r\n minValue: 0,\r\n conversionLabel: this.translationService.t(\"Reports.ForNDays\")\r\n\r\n }]\r\n },\r\n {\r\n reportType: \"Temperature\",\r\n mappings: [\r\n {\r\n parameterName: this.translationService.t(\"Reports.HideProbes\"),\r\n valueType: ReportParameterValueType.TemperatureProbes,\r\n ParameterType: ReportParameterType.HiddenProbes,\r\n defaultValue: [],\r\n Value: [],\r\n Active: true\r\n }]\r\n },\r\n {\r\n reportType: \"VehicleInput\",\r\n mappings: [\r\n {\r\n parameterName: this.translationService.t(\"Reports.HideLocationAddressShowonlyLatitudeandLongitude\"),\r\n valueType: ReportParameterValueType.Boolean,\r\n ParameterType: ReportParameterType.LatLongOnly,\r\n defaultValue: false,\r\n Value: false,\r\n Active: false\r\n }\r\n ]\r\n },\r\n {\r\n reportType: \"Camera\",\r\n mappings: [\r\n {\r\n parameterName: this.translationService.t(\"Reports.HideLocationAddressShowonlyLatitudeandLongitude\"),\r\n valueType: ReportParameterValueType.Boolean,\r\n ParameterType: ReportParameterType.LatLongOnly,\r\n defaultValue: false,\r\n Value: false,\r\n Active: false\r\n }\r\n ]\r\n },\r\n {\r\n reportType: \"VehicleActivity\",\r\n mappings:\r\n [\r\n {\r\n parameterName: this.translationService.t(\"Reports.ExcludeVehiclesWithoutActivity\"),\r\n valueType: ReportParameterValueType.Boolean,\r\n ParameterType: ReportParameterType.ExcludeVehiclesWithoutActivity,\r\n defaultValue: false,\r\n Value: false,\r\n Active: false\r\n },\r\n ]\r\n },\r\n {\r\n reportType: \"BrakePerformanceValue\",\r\n mappings:\r\n [\r\n {\r\n parameterName: this.translationService.t(\"Reports.VehicleType\"),\r\n valueType: ReportParameterValueType.Select,\r\n ParameterType: ReportParameterType.VehicleType,\r\n defaultValue: VehicleType.Trailer,\r\n Value: null,\r\n Active: false,\r\n // Show all VehicleType, except for the UI-defined option None, which has a negative value\r\n options: enumNames()(VehicleType).filter(vt => VehicleType[vt] >= 0).map(vt => ({ Name: this.translationService.translate(`VehicleTypeEnum.${vt}`), Value: VehicleType[vt] }))\r\n },\r\n ]\r\n }\r\n ];\r\n\r\n private requiresSelector(reportDefinitions: IReportDefinition, reportTypes: string[]): boolean {\r\n\r\n var requiresSelector = false;\r\n\r\n if (reportDefinitions && reportDefinitions.TableDefinition) {\r\n reportDefinitions.TableDefinition.Headers.forEach(header => {\r\n if (reportTypes.indexOf(header.ReportType) >= 0) {\r\n requiresSelector = true;\r\n }\r\n });\r\n }\r\n\r\n return requiresSelector;\r\n }\r\n\r\n mapPreferences(schedule: IDynamicReportSchedule, report: IReportDefinition, direction: \"to-report\" | \"to-schedule\"): void {\r\n if (!schedule) {\r\n console.warn(\"No schedule provided\");\r\n return;\r\n }\r\n\r\n if (!report) {\r\n console.warn(\"No report provided\");\r\n return;\r\n }\r\n\r\n switch (direction) {\r\n case \"to-schedule\":\r\n\r\n schedule.Preferences = {} as any;\r\n schedule.DurationFormat = report?.DurationFormat;\r\n\r\n this.mapPrefs((preference: string) => {\r\n schedule.Preferences[preference] = {\r\n Value: report[preference],\r\n Section: Section.Report,\r\n };\r\n });\r\n\r\n break;\r\n\r\n case \"to-report\":\r\n\r\n report.DurationFormat = schedule?.DurationFormat;\r\n\r\n this.setReportPreferences(report, schedule.Preferences)\r\n\r\n break;\r\n }\r\n }\r\n\r\n private mapPrefs(mappingFn: (preference: string) => void): void {\r\n const preferencesFields: Array> = [\r\n \"DistanceMeasurement\",\r\n \"TemperatureMeasurement\",\r\n \"VolumeMeasurement\",\r\n \"FuelConsumptionMeasurement\",\r\n \"Currency\",\r\n ];\r\n preferencesFields.forEach((preference) => mappingFn(preference));\r\n }\r\n\r\n private setReportPreferences(report: IReportDefinition, preferences: IPreferencesContent): void {\r\n\r\n if (!preferences) {\r\n return;\r\n }\r\n\r\n this.mapPrefs((preference: string) => {\r\n if (preferences[preference]) {\r\n report[preference] = preferences[preference].Value;\r\n }\r\n });\r\n\r\n }\r\n}\r\n","import { ScrollingModule } from \"@angular/cdk/scrolling\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { NgModule } from \"@angular/core\";\r\nimport { TagsService } from \"@app/services/tags.service\";\r\nimport { CoreDirectivesModule } from \"@directives/_core/_core.directives.module\";\r\nimport { FormsDirectivesModule } from \"@directives/_forms/_form.directives.module\";\r\nimport { LayoutDirectivesModule } from \"@directives/_layout/_layout.directives.module\";\r\nimport { MiscDirectivesModule } from \"@directives/_misc/_misc.directives.module\";\r\nimport { VeriDirectivesModule } from \"@directives/_veri/_veri.directives.module\";\r\nimport { DynamicReportService } from \"@reports/_services/dynamicReports.service\";\r\nimport { providerCreator } from \"@services/_services.module\";\r\nimport { PipesModule } from \"src/app/_pipes/_pipes.module\";\r\nimport { DriverListComponent } from \"./driver-list/driver-list.component\";\r\nimport { DateButtonFilterComponent } from \"./filter-bar/date-button-filter/date-button-filter.component\";\r\nimport { DriverButtonFilterComponent } from \"./filter-bar/driver-button-filter/driver-button-filter.component\";\r\nimport { FilterBarComponent } from \"./filter-bar/filter-bar.component\";\r\nimport { ItemFilterComponent } from \"./filter-bar/item-filter/item-filter.component\";\r\nimport { VehicleTypeButtonFilterComponent } from \"./filter-bar/resource-type-button-filter/vehicle-type-button-filter.component\";\r\nimport { TagButtonFilterComponent } from \"./filter-bar/tag-button-filter/tag-button-filter.component\";\r\nimport { VerticalFilterListComponent } from \"./vertical-filter-list/vertical-filter-list.component\";\r\n\r\nconst privateComponents: any[] = [\r\n\r\n];\r\n\r\nconst publicComponents: any[] = [\r\n FilterBarComponent,\r\n ItemFilterComponent,\r\n\r\n DriverButtonFilterComponent,\r\n DateButtonFilterComponent,\r\n TagButtonFilterComponent,\r\n\r\n DriverListComponent,\r\n\r\n VerticalFilterListComponent,\r\n VehicleTypeButtonFilterComponent,\r\n];\r\n\r\nconst directives: any[] = [\r\n //NewResourceFilterBarWrapper,\r\n //DateResourceFilterWrapper\r\n];\r\n\r\nconst providers: any[] = [\r\n providerCreator(DynamicReportService, \"dynamicReportService\"),\r\n providerCreator(TagsService, \"tagsService\")\r\n];\r\n\r\n@NgModule({\r\n providers: providers,\r\n imports: [\r\n CommonModule,\r\n ScrollingModule,\r\n VeriDirectivesModule,\r\n PipesModule,\r\n FormsDirectivesModule,\r\n CoreDirectivesModule,\r\n MiscDirectivesModule,\r\n LayoutDirectivesModule\r\n ],\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents, ...directives],\r\n exports: [...publicComponents, ...directives]\r\n})\r\nexport class ResourceFiltersDirectivesModule {\r\n constructor() {\r\n }\r\n}\r\n","import { IDateRange } from \"@app/interfaces/IDateRange\";\r\nimport { DateRange } from \"@enums/DateRange.enum\";\r\nimport { SortDirection } from \"@enums/SortDirection\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport * as moment from \"moment\";\r\nimport \"moment-duration-format\";\r\n\r\nexport type FormatDateTypes = \"full\" | \"noyear\" | \"date\" | \"time\" | \"timeago\" | \"timeortimeago\" | \"timeordate\" | \"fulltime\" | \"fulldatetime\" | \"isostring\" | string;\r\n\r\n\r\nexport class VeriDate {\r\n\r\n readonly timeFormat = \"HH:mm\"; // 13:23\r\n readonly fullTimeFormat = \"HH:mm:ss\"; // 13:23:00\r\n readonly dayFormat = \"Do\";\r\n readonly monthFormat = \"MMM\";\r\n readonly yearFormat = \"YYYY\";\r\n\r\n readonly dayMonthFormat = `${this.dayFormat} ${this.monthFormat}`; // 3rd May 2016\r\n readonly dateFormat = `${this.dayMonthFormat} ${this.yearFormat}`; // 3rd May 2016\r\n\r\n readonly dateTimeFormat = `${this.timeFormat}, ${this.dateFormat}`; // 13:23, 3rd May 2016\r\n readonly fullDateTimeFormat = `${this.fullTimeFormat}, ${this.dateFormat}`; // 13:23:21, 3rd May 2016\r\n\r\n static $inject = [\"translationService\"]\r\n\r\n constructor(private readonly translationService: TranslationService) {\r\n }\r\n\r\n formatDate(date: string | Date | moment.Moment, formatType?: FormatDateTypes): string {\r\n if (formatType) {\r\n formatType = formatType.toLowerCase();\r\n }\r\n\r\n // If date is not sent through, the moment constructor would create a datetime of now, we should actually respond with \"\"\r\n if (!date) {\r\n if (formatType === \"timeago\") {\r\n return this.translationService.t(\"Common.Never\");\r\n }\r\n\r\n return \"\";\r\n }\r\n\r\n let outputFormat = \"\";\r\n let momentDate: moment.Moment;\r\n\r\n if (date instanceof Date || typeof date === \"string\") {\r\n momentDate = this.createMoment(date);\r\n }\r\n else {\r\n momentDate = date;\r\n }\r\n\r\n if (!moment.isMoment(momentDate)) {\r\n // Unable to format\r\n return momentDate;\r\n }\r\n\r\n // Default option or \"full\"\r\n if (!formatType || formatType === \"full\") {\r\n outputFormat = this.dateTimeFormat;\r\n }\r\n else if (formatType === \"fulldatetime\") {\r\n outputFormat = this.fullDateTimeFormat;\r\n }\r\n else if (formatType === \"noyear\") {\r\n outputFormat = `${this.timeFormat}, ${this.dayFormat} ${this.monthFormat}`;\r\n }\r\n else if (formatType === \"date\") {\r\n outputFormat = this.dateFormat;\r\n }\r\n else if (formatType === \"time\") {\r\n // If we are time only, show am/pm to give context\r\n outputFormat = `${this.timeFormat}`; // dropped the a\r\n }\r\n else if (formatType === \"timeordate\") {\r\n // If we are time only, show am/pm to give context\r\n if (momentDate.isSame(this.createMoment(new Date()), \"d\")) {\r\n outputFormat = `${this.timeFormat}a`;\r\n }\r\n else {\r\n outputFormat = this.dateFormat;\r\n }\r\n }\r\n else if (formatType === \"fulltime\") {\r\n // If we are time only, show am/pm to give context\r\n outputFormat = `${this.fullTimeFormat}`; // dropped the a\r\n }\r\n else if (formatType === \"timeago\" || formatType === \"duration\") {\r\n if (Math.abs(this.createMoment(new Date()).diff(momentDate, \"s\")) < 60) { // 1000 milliseconds\r\n return this.translationService.t(\"VeriDateService.JustNow\");\r\n }\r\n if (Math.abs(this.createMoment(new Date()).diff(momentDate, \"years\")) > 5) { // older than 5 years\r\n return this.translationService.t(\"VeriDateService.LongTimeAgo\");\r\n }\r\n\r\n // Todo: From Now is expensive\r\n //debugger;\r\n console.warn(\"timeago > slow performance\");\r\n return momentDate.fromNow(formatType === \"duration\");\r\n }\r\n else if (formatType === \"timeortimeago\") {\r\n if (momentDate.clone().startOf(\"day\").diff(this.createMoment(new Date()).startOf(\"day\")) >= 0) {\r\n outputFormat = this.timeFormat;\r\n }\r\n else {\r\n console.warn(\"timeago > slow performance\");\r\n return momentDate.fromNow();\r\n }\r\n }\r\n else if (formatType === \"dayofweek\") {\r\n return this.getDayOfWeek(momentDate.day())\r\n }\r\n else if (formatType === \"isostring\") {\r\n return momentDate.toISOString();\r\n }\r\n else {\r\n outputFormat = this.dateTimeFormat;\r\n }\r\n\r\n return momentDate.format(outputFormat);\r\n }\r\n\r\n formatDurationMs(durationMs: number) {\r\n const d = moment.duration(durationMs);\r\n\r\n if (d.asDays() >= 365) {\r\n return (d as any).format(\"y [years], M [months]\");\r\n }\r\n\r\n if (d.asDays() >= 1) {\r\n return (d as any).format(\"d [days], h [hours]\");\r\n }\r\n\r\n return (d as any).format(\"h [hours], m [mins]\");\r\n }\r\n\r\n getDiff(startTime: moment.Moment | string | Date, endTime: moment.Moment | string | Date, unitOfTime?: moment.unitOfTime.Diff) {\r\n if (!moment.isMoment(startTime)) {\r\n startTime = this.createMoment(startTime);\r\n }\r\n\r\n if (!moment.isMoment(endTime)) {\r\n endTime = this.createMoment(endTime);\r\n }\r\n\r\n return endTime.diff(startTime, unitOfTime);\r\n }\r\n\r\n formatDuration(startTime: moment.Moment | string | Date, endTime: moment.Moment | string | Date) {\r\n const ms = this.getDiff(startTime, endTime);\r\n\r\n return this.formatDurationMs(ms);\r\n }\r\n\r\n formatDatesFromAndTo(start: Date | string, end?: Date | string): string {\r\n let formattedDate = \"\";\r\n const startMoment = this.createMoment(start);\r\n const endMoment = end ? this.createMoment(end) : null;\r\n\r\n start = new Date(start);\r\n\r\n if (!end) {\r\n return this.translationService.t('VeriDateService.FromToNow', startMoment.format(this.dateTimeFormat));\r\n }\r\n\r\n if (startMoment.isSame(endMoment, 'day')) {\r\n formattedDate = this.translationService.t('VeriDateService.FromTime1ToTime2OnDate', [startMoment.format(this.timeFormat), endMoment.format(this.timeFormat), startMoment.format(this.dateFormat)]);\r\n }\r\n else {\r\n formattedDate = this.translationService.t('VeriDateService.FromDate1ToDate2', [startMoment.format(this.dateTimeFormat), endMoment.format(this.dateTimeFormat)]);\r\n }\r\n\r\n return formattedDate;\r\n }\r\n\r\n roundDate(date: moment.Moment, roundBy = 15, roundUp: boolean) {\r\n\r\n if (roundUp) {\r\n const remainder = roundBy - (date.minute() % roundBy);\r\n date.add(remainder, \"m\");\r\n }\r\n\r\n else {\r\n const remainder = (date.minute() % roundBy);\r\n date.subtract(remainder, \"m\");\r\n }\r\n }\r\n\r\n formatTimeDuration(seconds: number): string {\r\n return seconds\r\n ? moment().startOf(\"day\").seconds(seconds).format(\"mm:ss\")\r\n : \"\";\r\n }\r\n\r\n sort(date1: string | Date, date2: string | Date, sortDirection: SortDirection = SortDirection.Descending): number {\r\n var parsedDate1 = new Date(date1);\r\n var parsedDate2 = new Date(date2);\r\n\r\n const parsedDate1Time = parsedDate1.getTime();\r\n if (isNaN(parsedDate1Time)) {\r\n console.error(date1, \"is not a date\", typeof date1);\r\n }\r\n\r\n if (sortDirection == SortDirection.Ascending) {\r\n return parsedDate1Time - parsedDate2.getTime();\r\n }\r\n else {\r\n return parsedDate2.getTime() - parsedDate1Time;\r\n }\r\n }\r\n\r\n createDate(date: string | Date) {\r\n return new Date(date as Date);\r\n }\r\n\r\n createMoment(date: string | Date | moment.Moment): moment.Moment {\r\n if (date instanceof moment) {\r\n return date as moment.Moment;\r\n }\r\n\r\n return moment(this.createDate(date as Date));\r\n }\r\n\r\n date1IsBeforeDate2(date1: string | Date, date2: string | Date) {\r\n\r\n var parsedDate1 = date1 instanceof Date ? date1 : new Date(date1 as string);\r\n var parsedDate2 = date2 instanceof Date ? date2 : new Date(date2 as string);\r\n\r\n return parsedDate1.getTime() < parsedDate2.getTime();\r\n }\r\n\r\n date1IsAfterDate2(date1: string | Date, date2: string | Date) {\r\n\r\n var parsedDate1 = new Date(date1);\r\n var parsedDate2 = new Date(date2);\r\n\r\n return parsedDate1.getTime() > parsedDate2.getTime();\r\n }\r\n\r\n dateBetweenRange(date: string | Date, dateFrom: string | Date, dateTo: string | Date) {\r\n return this.date1IsAfterDate2(date, dateFrom) && this.date1IsAfterDate2(dateTo, date);\r\n }\r\n\r\n isSameDate(date1: Date, date2: Date): boolean {\r\n if (date1.getFullYear() === date2.getFullYear() &&\r\n date1.getMonth() === date2.getMonth() &&\r\n date1.getDate() === date2.getDate()) {\r\n return true;\r\n }\r\n\r\n var secondsDiff = (date2.getTime() - date1.getTime()) / 1000;\r\n\r\n // Sometimes we have exactly 24 hours difference it may not show up as the same day (i.e. the above condition)\r\n return date1.getHours() == 0 && date1.getMinutes() == 0 && secondsDiff == 86_400;\r\n }\r\n\r\n getDayOfWeek(day: number, shorten = false) {\r\n var translationKey = \"\";\r\n\r\n switch (day) {\r\n case 0:\r\n translationKey = \"VeriDateService.Sunday\";\r\n break;\r\n\r\n case 1:\r\n translationKey = \"VeriDateService.Monday\";\r\n break;\r\n\r\n case 2:\r\n translationKey = \"VeriDateService.Tuesday\";\r\n break;\r\n\r\n case 3:\r\n translationKey = \"VeriDateService.Wednesday\";\r\n break;\r\n\r\n case 4:\r\n translationKey = \"VeriDateService.Thursday\";\r\n break;\r\n\r\n case 5:\r\n translationKey = \"VeriDateService.Friday\";\r\n break;\r\n\r\n case 6:\r\n translationKey = \"VeriDateService.Saturday\";\r\n break;\r\n }\r\n\r\n if (shorten) {\r\n //translationKey += \"Abbrv\";\r\n return this.translationService.t(translationKey).substr(0, 3);\r\n }\r\n\r\n return this.translationService.t(translationKey);\r\n }\r\n\r\n //getDateMilliseconds(date: string): number {\r\n // const d = new Date(date);\r\n // return d.getMilliseconds();\r\n //}\r\n\r\n getReadableDateRangeLabel(start: Date | moment.Moment, end: Date | moment.Moment, dateRange: DateRange): string {\r\n const startDate = moment(start);\r\n const endDate = moment(end);\r\n\r\n if (dateRange != DateRange.Custom) {\r\n return this.translationService.tEnum(DateRange, \"DateRange\", dateRange);\r\n }\r\n\r\n if (startDate.isSame(endDate, \"d\")) {\r\n return this.formatDate(startDate, \"date\");\r\n }\r\n\r\n if (startDate.isSame(endDate, \"month\") && startDate.date() == 1 && endDate.date() == endDate.daysInMonth()) {\r\n\r\n return startDate.format(\"MMM YYYY\");\r\n }\r\n\r\n var startDateString = this.formatDate(startDate, \"date\");\r\n if (startDate.isSame(endDate, \"month\") && startDate.isSame(endDate, \"year\")) {\r\n\r\n startDateString = startDate.format(this.dayFormat);\r\n }\r\n else if (startDate.isSame(endDate, \"year\")) {\r\n\r\n startDateString = startDate.format(this.dayMonthFormat);\r\n }\r\n\r\n return `${startDateString} to ${this.formatDate(endDate, \"date\")}`;\r\n }\r\n\r\n dateRangeIntoEnum(dateRange: IDateRange): DateRange {\r\n const startDate = moment(dateRange.start);\r\n const endDate = moment(dateRange.end);\r\n\r\n if (startDate.isSame(moment(), \"days\") && endDate.isSame(moment(), \"days\")) {\r\n return DateRange.Today;\r\n }\r\n else if (startDate.isSame(moment().add(-1, \"days\"), \"day\") && endDate.isSame(moment().add(-1, \"days\"), \"day\")) {\r\n return DateRange.Yesterday;\r\n }\r\n else if (startDate.isSame(moment().add(-7 - 1, \"days\"), \"day\") && endDate.isSame(moment().add(-1, \"days\"), \"days\")) {\r\n return DateRange.Last7Days;\r\n }\r\n else if (startDate.isSame(moment().add(-14 - 1, \"days\"), \"day\") && endDate.isSame(moment().add(-1, \"days\"), \"days\")) {\r\n return DateRange.Last14Days;\r\n }\r\n else if (startDate.isSame(moment().add(-30 - 1, \"days\"), \"day\") && endDate.isSame(moment().add(-1, \"days\"), \"days\")) {\r\n return DateRange.Last30Days;\r\n }\r\n else if (startDate.isSame(moment().add(-7, \"days\"), \"day\") && endDate.isSame(moment(), \"days\")) {\r\n return DateRange.Latest7Days;\r\n }\r\n else if (startDate.isSame(moment().add(-14, \"days\"), \"day\") && endDate.isSame(moment(), \"days\")) {\r\n return DateRange.Latest14Days;\r\n }\r\n else if (startDate.isSame(moment().startOf(\"isoWeek\"), \"day\") && endDate.isSame(moment().endOf(\"isoWeek\"), \"day\")) {\r\n return DateRange.ThisWeek;\r\n }\r\n else if (startDate.isSame(moment().add(-1, \"weeks\").startOf(\"isoWeek\"), \"day\") && endDate.isSame(moment().add(-1, \"weeks\").endOf(\"isoWeek\"), \"day\")) {\r\n return DateRange.LastWeek;\r\n }\r\n else if (startDate.isSame(moment().startOf(\"month\"), \"day\") && endDate.isSame(moment().endOf(\"month\"), \"day\")) {\r\n return DateRange.ThisMonth;\r\n }\r\n else if (startDate.isSame(moment().add(-1, \"months\").startOf(\"month\"), \"day\") &&\r\n endDate.isSame(moment().add(-1, \"months\").endOf(\"month\"), \"day\")) {\r\n return DateRange.LastMonth;\r\n }\r\n else {\r\n return DateRange.Custom;\r\n }\r\n }\r\n\r\n dateRangeFromEnum(dateRange: DateRange): IDateRange {\r\n let startMoment: moment.Moment = moment();\r\n let endMoment: moment.Moment = moment();\r\n\r\n var rangeEndsYesterday = false;\r\n\r\n switch (dateRange) {\r\n case DateRange.Today:\r\n startMoment = moment();\r\n break;\r\n\r\n case DateRange.Yesterday:\r\n startMoment = moment().subtract(1, \"days\");\r\n endMoment = startMoment.clone();\r\n break;\r\n\r\n case DateRange.Week:\r\n startMoment = moment().subtract(1, \"weeks\");\r\n rangeEndsYesterday = true;\r\n break;\r\n\r\n case DateRange.Last7Days:\r\n startMoment = moment().subtract(6, \"days\");\r\n rangeEndsYesterday = true;\r\n break;\r\n\r\n case DateRange.Last14Days:\r\n startMoment = moment().subtract(14, \"days\");\r\n rangeEndsYesterday = true;\r\n break;\r\n\r\n case DateRange.Last30Days:\r\n startMoment = moment().subtract(30, \"days\");\r\n rangeEndsYesterday = true;\r\n break;\r\n\r\n case DateRange.ThisWeek:\r\n startMoment = moment().startOf(\"isoWeek\");\r\n endMoment = startMoment.clone().add(6, \"d\");\r\n break;\r\n\r\n case DateRange.ThisMonth:\r\n startMoment = moment().startOf(\"month\");\r\n endMoment = moment().endOf(\"month\");\r\n break;\r\n\r\n case DateRange.Latest3Weeks:\r\n startMoment = moment().startOf(\"isoWeek\").subtract(2, \"weeks\").subtract(1, \"day\");\r\n break;\r\n\r\n case DateRange.Latest14Days:\r\n startMoment = moment().subtract(14, \"days\");\r\n break;\r\n\r\n case DateRange.Latest4Weeks:\r\n startMoment = moment().subtract(28, \"days\");\r\n break;\r\n\r\n case DateRange.Latest7Days:\r\n startMoment = moment().subtract(7, \"days\");\r\n break;\r\n\r\n case DateRange.LastWeek:\r\n startMoment = moment().subtract(1, \"weeks\").startOf(\"isoWeek\");\r\n endMoment = moment().subtract(1, \"weeks\").endOf(\"isoWeek\");\r\n break;\r\n\r\n case DateRange.LastMonth:\r\n startMoment = moment().subtract(1, \"months\").startOf(\"month\");\r\n endMoment = moment().subtract(1, \"months\").endOf(\"month\");\r\n break;\r\n\r\n case DateRange.Latest4Weeks:\r\n startMoment = moment().subtract(4, \"weeks\");\r\n break;\r\n }\r\n\r\n if (rangeEndsYesterday) {\r\n startMoment.subtract(1, \"d\");\r\n endMoment.subtract(1, \"d\");\r\n }\r\n\r\n return {\r\n start: startMoment.startOf(\"d\").toDate(),\r\n end: endMoment.endOf(\"d\").toDate()\r\n }\r\n }\r\n\r\n minutesToDaysHoursMinutes(inputMinutes: number) {\r\n //https://stackoverflow.com/a/37096512/94278\r\n //inputMinutes = Number(inputMinutes);\r\n\r\n var h = Math.floor(inputMinutes / 60);\r\n var m = Math.floor(inputMinutes % 60 / 60);\r\n var s = Math.floor(inputMinutes % 60 % 60);\r\n\r\n var hDisplay = h > 0 ? this.translationService.t('VeriDateService.Hours', h) : \"\";\r\n var mDisplay = m > 0 ? this.translationService.t('VeriDateService.Minutes', m) : \"\";\r\n var sDisplay = s > 0 ? this.translationService.t('VeriDateService.Seconds', s) : \"\";\r\n\r\n return hDisplay + mDisplay + sDisplay;\r\n }\r\n\r\n minutesToDurationString(inputMinutes: number, exceptionValue?: number, exceptionString?: string, shortHand = true): string {\r\n\r\n if (exceptionValue && exceptionValue === inputMinutes) {\r\n if (!exceptionString) {\r\n console.warn(\"minutesToDuration expects an 'exceptionString' when using 'exceptionValue'\");\r\n }\r\n\r\n return exceptionString;\r\n }\r\n\r\n if (isNaN(inputMinutes)) {\r\n console.warn(\"minutesToDuration invalid input\", inputMinutes);\r\n }\r\n\r\n // Ensure we round to nearest value\r\n inputMinutes = Math.round(inputMinutes);\r\n\r\n //console.log(\"minutesToDuration\", inputMinutes);\r\n\r\n // Ensure we have a valid number\r\n inputMinutes = inputMinutes || 0;\r\n\r\n var displayMinutes: number;\r\n var displayHours: number;\r\n\r\n if (inputMinutes >= 0) {\r\n displayMinutes = Math.floor(inputMinutes % 60);\r\n displayHours = Math.floor(inputMinutes / 60);\r\n }\r\n else {\r\n displayMinutes = Math.ceil(inputMinutes % 60);\r\n displayHours = Math.ceil(inputMinutes / 60);\r\n }\r\n\r\n let hourDisplay = \"h\";\r\n let minDisplay = \"m\";\r\n\r\n if (!shortHand) {\r\n hourDisplay = \" hour\";\r\n minDisplay = \" min\";\r\n\r\n if (displayHours !== 1) {\r\n hourDisplay += \"s\";\r\n }\r\n\r\n if (displayMinutes !== 1) {\r\n minDisplay += \"s\";\r\n }\r\n }\r\n\r\n return displayHours !== 0\r\n ? `${displayHours}${hourDisplay}, ${displayMinutes}${minDisplay}`\r\n : `${displayMinutes}${minDisplay}`;\r\n }\r\n\r\n parseTimeSpan(timeSpan: string): number {\r\n //console.log(\"parseTimeSpan\", timeSpan);\r\n // \"33.15:35:12\"\r\n var seconds = 0;\r\n var minutes = 0;\r\n var hours = 0;\r\n\r\n if (!timeSpan) {\r\n return 0;\r\n }\r\n\r\n if (typeof timeSpan === \"number\") {\r\n return parseInt(timeSpan);\r\n }\r\n\r\n if (timeSpan.indexOf(\".\") >= 0) {\r\n\r\n var dayHourSplit = timeSpan.split(\".\");\r\n seconds = parseFloat(`0.${dayHourSplit[1]}`) /*parseInt(dayHourSplit[0]) * 24;*/\r\n\r\n timeSpan = dayHourSplit[0];\r\n }\r\n\r\n var timeSplit = timeSpan.split(\":\");\r\n hours += parseInt(timeSplit[0]);\r\n minutes += parseInt(timeSplit[1]);\r\n seconds += parseInt(timeSplit[2]);\r\n\r\n return (hours * 60 * 60) + (minutes * 60) + seconds;\r\n }\r\n\r\n clamp(time: moment.Moment, start: moment.Moment, end: moment.Moment) {\r\n if (time.isBefore(start)) {\r\n return start;\r\n }\r\n else if (time.isAfter(end)) {\r\n return end;\r\n }\r\n\r\n else return time;\r\n }\r\n\r\n timeWithinRange(time: moment.Moment, start: moment.Moment, end: moment.Moment) {\r\n return time.isBetween(start, end);\r\n }\r\n\r\n setMomentToMinuteOfDay(moment: moment.Moment, totalMins: number): void {\r\n const hours = Math.floor(totalMins / 60);\r\n totalMins %= 60;\r\n const minutes = Math.round(totalMins);\r\n\r\n moment.set(\"hours\", hours);\r\n moment.set(\"minutes\", minutes);\r\n }\r\n\r\n convertTimeSpanToMins(timespan: string): number {\r\n const segments = timespan.split(\":\");\r\n\r\n const hourSeconds = +segments[0] * 60 * 60;\r\n const minuteSeconds = +segments[1] * 60;\r\n const seconds = +segments[2];\r\n\r\n let final = 0\r\n final += (hourSeconds) ? hourSeconds : 0;\r\n final += (minuteSeconds) ? minuteSeconds : 0;\r\n final += (seconds) ? seconds : 0;\r\n\r\n return Math.round(final / 60);\r\n }\r\n\r\n getTimeSpanDetailsFromMinuteOfDay(secondOfDay: number): { hour: number; minute: number; second: number } {\r\n const hours = Math.floor(secondOfDay / 3600);\r\n const minutes = Math.floor((secondOfDay % 3600) / 60);\r\n const seconds = Math.floor(secondOfDay % 60);\r\n\r\n return {\r\n hour: hours,\r\n minute: minutes,\r\n second: seconds\r\n }\r\n }\r\n\r\n convertMinsToTimeSpan(totalMins: number, includeSeconds: boolean = false): string {\r\n const hours = Math.floor(totalMins / 60);\r\n const hoursString = (hours < 10) ? `0${hours}` : `${hours}`;\r\n\r\n totalMins %= 60;\r\n const minutes = Math.round(totalMins);\r\n const minutesString = (minutes < 10) ? `:0${minutes}` : `:${minutes}`;\r\n\r\n const secondsString = (includeSeconds) ? `:00` : \"\";\r\n\r\n return `${hoursString}${minutesString}${secondsString}`;\r\n }\r\n\r\n convertMomentToTimespan(moment: moment.Moment): string {\r\n const minuteOfDate: number = this.getMinuteOfDayFromDate(moment.toDate());\r\n\r\n return this.convertMinsToTimeSpan(minuteOfDate);\r\n }\r\n\r\n getMinuteOfDayFromDate(date: Date): number {\r\n return (date.getHours() * 60) + date.getMinutes();\r\n }\r\n\r\n getDateInInputFormat(date: Date): string {\r\n //Return a date in YYYY-MM-DD format string to use as html date input placeholder\r\n date.setMinutes(date.getMinutes() - date.getTimezoneOffset());\r\n return date.toJSON().slice(0, 10);\r\n }\r\n\r\n getMinuteOfDayFromMoment(value: moment.Moment): number {\r\n if (!moment.isMoment(value)) {\r\n return 0;\r\n }\r\n\r\n return (value.get('hour') * 60) + value.get('minute');\r\n }\r\n}\r\n","\r\nexport class BroadcastEvent {\n static onPageVisibilityShow = \"onPageVisibilityShow\";\n static onPageVisibilityHide = \"onPageVisibilityHide\";\n\r\n static updateAccountImage = \"updateAccountImage\";\n static groupFilterChanged = \"groupFilterChanged\";\n static hidePopup = \"hidePopup\";\n static onShowResourceFilterBar = \"onShowResourceFilterBar\";\n static onHideResourceFilterBar = \"onHideResourceFilterBar\";\n\n static closeResourceFilterBar = \"closeResourceFilterBar\";\n\n static updateVideoSize = \"updateVideoSize\";\n\n static openGeofenceEditor = \"openGeofenceEditor\";\n\n static onReportRun = \"onReportRun\";\n\n static UpdateBreadcrumbs = \"updateBreadcrumbs\";\r\n}\n","import * as angular from \"angular\";\r\nimport MODULE_NAME from \"../app.module.ajs\";\r\n\r\ninterface IModuleMigrationStatus {\r\n AJSComponentCount: number;\r\n MigratedComponentCount: number;\r\n ServiceCount: number;\r\n OtherCount: number;\r\n}\r\n\r\nexport class ConstantsService {\r\n\r\n static $inject = [\"apiUrl\", \"googleMapsApiKey\", \"reportsApiUrl\", \"isMobile\", \"isLocalDevelopment\", \"isDev\", \"isUat\", \"isDemoSite\", \"isProduction\", \"isFleet\", \"tokenUrl\"];\r\n\r\n constructor(\r\n private readonly apiUrl: string,\r\n private readonly googleMapsApiKey: string,\r\n private readonly reportsApiUrl: string,\r\n private readonly isMobile: boolean,\r\n private readonly isLocalDevelopment: boolean,\r\n private readonly isDev: boolean,\r\n private readonly isUat: boolean,\r\n private readonly isDemoSite: boolean,\r\n private readonly isProduction: boolean,\r\n private readonly isFleet: boolean,\r\n private readonly tokenUrl: string\r\n ) {\r\n if (this.isLocalDevelopment) {\r\n var migrationStatus = this.calculateAngularJSComponents(MODULE_NAME);\r\n\r\n //console.log(\"Angular Migration Status\", this.moduleCount, migrationStatus);\r\n var totalComponentCount = migrationStatus.AJSComponentCount + migrationStatus.MigratedComponentCount;\r\n var migrationPercentage = Math.round(migrationStatus.MigratedComponentCount * 100 / totalComponentCount);\r\n //console.log(\"%cAngular Migration\", \"font-weight: bold;\");\r\n\r\n //console.log(\" - AJS Components\", migrationStatus.AJSComponentCount);\r\n //console.log(\" - Migrated Components\", migrationStatus.MigratedComponentCount, ``);\r\n //console.log(\" - Services\", migrationStatus.ServiceCount);\r\n //console.log(\" - Other\", migrationStatus.OtherCount);\r\n\r\n // Print bar\r\n var scaleFactor = 2;\r\n var greenBar = Array(scaleFactor * Math.round(Math.round(migrationPercentage / 10))).join('█');\r\n var greyBar = Array(scaleFactor * Math.round(Math.round(10 - (migrationPercentage / 10)))).join('█');\r\n /*console.log(` - Progress %c${greenBar}%c${greyBar} %c(${migrationPercentage})%`, 'color: green', 'color: lightgrey', 'color: green')*/\r\n\r\n console.log(\"| Migration -----------------\");\r\n console.log(`| %c${greenBar}%c${greyBar} %c${migrationPercentage}%`, 'color: green', 'color: lightgrey', 'color: green');\r\n console.log(`| Files: %c${migrationStatus.MigratedComponentCount} / ${totalComponentCount}`, 'color: grey');\r\n console.log(\"| ---------------------------\");\r\n\r\n // 31.08.2022. 135 / 423 (32%)\r\n // 29.12.2022. 175 / 470 (37%)\r\n // 31.07.2024. 278 / 503 (55%)\r\n }\r\n }\r\n\r\n getApiUrl() {\r\n return this.apiUrl;\r\n }\r\n\r\n getGoogleMapsApiKey() {\r\n return this.googleMapsApiKey;\r\n }\r\n\r\n getReportsApiUrl() {\r\n return this.reportsApiUrl;\r\n }\r\n\r\n getIsMobile() {\r\n return this.isMobile;\r\n }\r\n\r\n getIsLocalDevelopment() {\r\n return this.isLocalDevelopment;\r\n }\r\n\r\n getIsDev() {\r\n return this.isDev;\r\n }\r\n\r\n getIsUat() {\r\n return this.isUat;\r\n }\r\n\r\n getIsDemoSite() {\r\n return this.isDemoSite;\r\n }\r\n\r\n getIsProduction() {\r\n return this.isProduction;\r\n }\r\n\r\n getIsFleet() {\r\n return this.isFleet;\r\n }\r\n\r\n getTokenUrl() {\r\n return this.tokenUrl;\r\n }\r\n\r\n // Migration status\r\n\r\n moduleDirectory: IModuleMigrationStatus[] = [];\r\n moduleCount = 0;\r\n\r\n calculateAngularJSComponents(moduleName: string): IModuleMigrationStatus {\r\n if (this.moduleDirectory[moduleName]) {\r\n return null;\r\n }\r\n\r\n // Do lookup to see if name exists in Angular??\r\n\r\n var migrationStatus: IModuleMigrationStatus = {\r\n AJSComponentCount: 0,\r\n MigratedComponentCount: 0,\r\n OtherCount: 0,\r\n ServiceCount: 0\r\n };\r\n\r\n this.moduleDirectory[moduleName] = migrationStatus;\r\n this.moduleCount++;\r\n\r\n var module = angular.module(moduleName);\r\n\r\n // Calculate counts\r\n module['_invokeQueue'].forEach((iq) => {\r\n switch (iq[1]) {\r\n case \"component\":\r\n migrationStatus.AJSComponentCount++;\r\n break;\r\n\r\n case \"service\":\r\n migrationStatus.ServiceCount++;\r\n break;\r\n\r\n case \"directive\":\r\n migrationStatus.MigratedComponentCount++;\r\n break;\r\n\r\n default:\r\n migrationStatus.OtherCount++;\r\n break;\r\n }\r\n });\r\n\r\n // Sub modules\r\n module.requires.forEach(subModule => {\r\n if (subModule.indexOf(\"app.\") >= 0) {\r\n var subModuleStatus = this.calculateAngularJSComponents(subModule);\r\n\r\n if (subModuleStatus) {\r\n migrationStatus.AJSComponentCount += subModuleStatus.AJSComponentCount;\r\n migrationStatus.MigratedComponentCount += subModuleStatus.MigratedComponentCount;\r\n migrationStatus.ServiceCount += subModuleStatus.ServiceCount;\r\n migrationStatus.OtherCount += subModuleStatus.OtherCount;\r\n }\r\n }\r\n });\r\n\r\n //console.log(\"Calculating for \", moduleName, /*module,*/ migrationStatus);\r\n return migrationStatus;\r\n }\r\n}\r\n","export enum VTableRowStatus {\r\n Info,\r\n Success,\r\n Warning,\r\n Error,\r\n InProgress,\r\n Completed,\r\n Pending,\r\n Failure\r\n}\r\n","\r\nexport enum VehicleType {\r\n None = -1,\r\n Trailer = 0,\r\n Car = 1,\r\n BusOrPSV = 5,\r\n HgvLessThan12T = 6,\r\n Hgv12Tto22T = 7,\r\n HgvGreaterThan22T = 8,\r\n Lcv = 9,\r\n Motorcycle = 10,\r\n Unknown = 11,\r\n Asset = 12,\r\n Plant = 13\r\n}\r\n","\r\nexport enum ReasonCode {\r\n CameraEvent = -2,\r\n GenericError = -1,\r\n Unknown = 0,\r\n TravelSend,\r\n TravelStationarySend,\r\n SendLoc,\r\n Distance,\r\n Crossing,\r\n Telematics,\r\n TravelStart,\r\n TravelStop,\r\n IgnitionOn,\r\n IgnitionOff,\r\n PowerOn,\r\n JbusTimed,\r\n Wakeup,\r\n OverSpeed,\r\n NormalSpeed,\r\n DirChange,\r\n OpenConnection,\r\n CloseConnection,\r\n Message,\r\n LogonStatus,\r\n MdtFtp,\r\n MdtStartShift,\r\n MdtEndShift,\r\n Temperature,\r\n MdtDriverLog,\r\n PadModeMsg,\r\n JbusNewLegDriver,\r\n JbusNewLeg,\r\n JbusActiveFault,\r\n JbusInactiveFault,\r\n JbusIgnitionOn,\r\n JbusIgnitionOff,\r\n JbusUpperBound,\r\n JbusLowerBound,\r\n OdbiiDtc,\r\n Fms,\r\n FmsEngineOn,\r\n FmsEngineOff,\r\n MessageForm,\r\n Reportz,\r\n MdtDotSync,\r\n Accelerometer,\r\n Garmin,\r\n Nfc,\r\n Incident,//Crash,\r\n IncidentGPS,//CrashGPS,\r\n IncidentAccelerometer,//CrashAccelerometer\r\n Alcolock = 48,\r\n Diagnostics = 49,\r\n PeripheralDisconnected = 50,\r\n TroubleCodes = 51,\r\n TyrePressures = 52,\r\n AlcolockOverride = 53,\r\n ContextualSpeeding = 54,\r\n HarshBraking = 55,\r\n HarshSteering = 56,\r\n HarshAcceleration = 57,\r\n IdlingOverThreshold = 58,\r\n CanbusPto = 59,\r\n InputTrigger = 60,\r\n OverRpm = 61,\r\n TranscanTemperatures = 62,\r\n TranscanInput = 63,\r\n TranscanRequestedUpdate = 64,\r\n BadAnticipation = 65,\r\n FuelTheft = 66,\r\n //TranscanTemperatureAlarm = 67,\r\n IdlingOverLowThreshold = 68,\r\n IdlingOverMedThreshold = 69,\r\n IdlingOverHighThreshold = 70,\r\n CruiseOff = 71,\r\n CruiseOn = 72,\r\n PtoOff = 73,\r\n PtoOn = 74,\r\n TopGearStop = 75,\r\n TopGearStart = 76,\r\n TopGearCruisePotentialStart = 77,\r\n TopGearCruisePotentialStop = 78,\r\n EngineBrakeOn = 79,\r\n EngineBrakeOff = 80,\r\n PowerEvent = 81,\r\n Motion = 82,\r\n FridgeController = 83,\r\n IdlingEnd = 84, // This reason code is only used for supporting messages coming from old jpod configs as we transition to using reason codes, not sensor data\r\n TachoUpdate = 85,\r\n OverRpmEnd = 86,\n RolloverStabilityControl = 87\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { AbstractControl, AsyncValidatorFn, FormGroup, NgControl, ValidationErrors } from '@angular/forms';\r\nimport { IUser } from '@app/interfaces/IUser';\r\nimport { IVehicle } from '@app/interfaces/IVehicle';\r\nimport { IGroup } from '@app/interfaces/IVehicleGroup';\r\nimport { ICameraConfiguration } from '@app/main/modules/foundation/_routes/rv-lite/config/_models/ICameraConfiguration';\r\nimport { FoundationVehiclesService } from '@app/main/modules/foundation/_services/vehicle.service';\r\nimport { TranslationService } from '@services/translation.service';\r\nimport { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FormValidationService {\r\n\r\n constructor(\r\n private readonly translationService: TranslationService\r\n ) {\r\n }\r\n\r\n getErrorLabel(errors: ValidationErrors): string {\r\n\r\n if (errors[\"required\"]) {\r\n return this.translationService.t(\"FormValidationService.Required\");\r\n }\r\n\r\n if (errors[\"minlength\"]) {\r\n return this.translationService.t(\"FormValidationService.MinLength\", errors[\"minlength\"].requiredLength);\r\n }\r\n\r\n if (errors[\"maxlength\"]) {\r\n return this.translationService.t(\"FormValidationService.MaxLength\", errors[\"maxlength\"].requiredLength);\r\n }\r\n\r\n if (errors[\"email\"]) {\r\n return this.translationService.t(\"FormValidationService.Email\");\r\n }\r\n\r\n if (errors[\"min\"]) {\r\n return this.translationService.t(\"FormValidationService.Min\", errors[\"min\"].min);\r\n }\r\n\r\n if (errors[\"max\"]) {\r\n return this.translationService.t(\"FormValidationService.Max\", errors[\"max\"].max);\r\n }\r\n\r\n // --- custom validators\r\n\r\n if (errors[\"number\"]) {\r\n return this.translationService.t(\"FormValidationService.Number\");\r\n }\r\n\r\n if (errors[\"minimumArrayLength\"]) {\r\n return this.translationService.t(\"FormValidationService.MinimumArrayLength\");\r\n }\r\n\r\n if (errors[\"duplicateArrayItem\"]) {\r\n return this.translationService.t(\"FormValidationService.DuplicateArrayItem\");\r\n }\r\n\r\n if (errors[\"emptyWhiteSpace\"]) {\r\n return this.translationService.t(\"FormValidationService.EmptyWhiteSpace\");\r\n }\r\n\r\n if (errors[\"emailAlreadyExists\"]) {\r\n return this.translationService.t(\"FormValidationService.EmailAlreadyExists\");\r\n }\r\n\r\n if (errors[\"configNameDuplicated\"]) {\r\n return this.translationService.t(\"FormValidationService.ConfigNameDuplicated\");\r\n }\r\n\r\n if (errors[\"groupNameDuplicated\"]) {\r\n return this.translationService.t(\"FormValidationService.GroupNameDuplicated\");\r\n }\r\n\r\n if (errors[\"roadSegmentNameDuplicated\"]) {\r\n return this.translationService.t(\"FormValidationService.RoadSegmentNameDuplicated\");\r\n }\r\n\r\n if (errors[\"vehicleDuplicated\"]) {\r\n return this.translationService.t(\"FormValidationService.VehicleAlreadyExists\");\r\n }\r\n\r\n if (errors[\"iccidFormat\"]) {\r\n return this.translationService.t(\"FormValidationService.IccidFormat\");\r\n }\r\n\r\n if (errors[\"iccidValid\"]) {\r\n return this.translationService.t(\"FormValidationService.IccidValid\");\r\n }\r\n\r\n if (errors[\"parentCascadeContainsDepot\"]) {\r\n return this.translationService.t(\"FormValidationService.ParentCascadeContainsDepot\");\r\n }\r\n\r\n if (errors[\"accountHasConfig\"]) {\r\n return this.translationService.t(\"FormValidationService.AccountHasConfig\")\r\n }\r\n\r\n // Todo allow translation keys to be passed\r\n if (errors[\"customMessage\"]) {\r\n return errors[\"customMessage\"];\r\n }\r\n\r\n console.warn(\"No error state given for\", errors);\r\n\r\n return this.translationService.t(\"FormValidationService.Fallback\");\r\n }\r\n\r\n controlHasErrors(control: NgControl): boolean {\r\n if (!control) {\r\n return false;\r\n }\r\n\r\n return control.errors && !!Object.keys(control.errors).length;\r\n }\r\n\r\n updateValueAndValidity(formGroup: FormGroup): void {\r\n\r\n if (!formGroup?.controls) {\r\n return;\r\n }\r\n\r\n for (let key in formGroup.controls) {\r\n formGroup.controls[key].updateValueAndValidity();\r\n }\r\n\r\n formGroup.markAllAsTouched();\r\n formGroup.updateValueAndValidity();\r\n }\r\n\r\n checkFormValid(formGroup: FormGroup): boolean {\r\n\r\n if (!formGroup) {\r\n return false;\r\n }\r\n\r\n this.updateValueAndValidity(formGroup);\r\n\r\n return formGroup.valid;\r\n }\r\n}\r\n\r\nexport class CustomFormValidators {\r\n static number = (control: AbstractControl): ValidationErrors | null => {\r\n\r\n if (Number.isFinite(control.value)) {\r\n return null;\r\n }\r\n\r\n return {\r\n \"number\": { valid: false }\r\n };\r\n }\r\n\r\n static emptyWhiteSpace = (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) {\r\n return null;\r\n }\r\n\r\n if (control.value.length && control.value.trim().length) {\r\n return null;\r\n }\r\n\r\n return {\r\n \"emptyWhiteSpace\": { valid: false }\r\n };\r\n }\r\n\r\n static minimumArrayLength = (minimum: number) => (control: AbstractControl): ValidationErrors | null => {\r\n if (control.value.length >= minimum) {\r\n return null;\r\n }\r\n\r\n return {\r\n \"minimumArrayLength\": { valid: false }\r\n };\r\n }\r\n\r\n static duplicateVehicle = (vehicles: IVehicle[]) => (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value || control.value.length < 3 || !vehicles?.length) {\r\n return;\r\n }\r\n\r\n const matchingVehicle = vehicles.find(vehicle => {\r\n return vehicle.Reg.toLowerCase() === control.value.toLowerCase() || vehicle.ShortReg.toLowerCase() === control.value.toLowerCase();\r\n })\r\n\r\n if (matchingVehicle) {\r\n return { vehicleDuplicated: true };\r\n }\r\n\r\n return null;\r\n }\r\n\r\n static accountHasConfig = (accountIds: number[]) => (control: AbstractControl): ValidationErrors | null => {\r\n if (!accountIds?.length) {\r\n return;\r\n }\r\n\r\n if (!control.value) {\r\n return null;\r\n }\r\n\r\n const matchingAccountId = accountIds.find(a => {\r\n return accountIds.some(id => id === control.value.Id);\r\n })\r\n\r\n if (matchingAccountId) {\r\n return {\r\n \"accountHasConfig\": { valid: false }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n static duplicateEmail = (users: IUser[]) => (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value || control.value.length < 3 || !users?.length) {\r\n return;\r\n }\r\n\r\n const matchingUser = users.find(user => {\r\n return user.Email.toLowerCase() === control.value.toLowerCase();\r\n })\r\n\r\n if (matchingUser) {\r\n return { emailAlreadyExists: true };\r\n }\r\n\r\n return null;\r\n }\r\n\r\n static duplicateConfigName = (configs: ICameraConfiguration[]) => (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value || control.value.length < 3 || !configs?.length) {\r\n return;\r\n }\r\n\r\n const matchingConfig = configs.find(config => {\r\n return config.Name.toLowerCase() === control.value.toLowerCase();\r\n })\r\n\r\n if (matchingConfig) {\r\n return { configNameDuplicated: true };\r\n }\r\n\r\n return null;\r\n }\r\n\r\n static GroupCanBeUsedAsParent = (group: IGroup, allGroups: IGroup[]) => (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) {\r\n return;\r\n }\r\n\r\n if (!group.IsDepot) {\r\n return null;\r\n }\r\n\r\n let prospectiveParentId = control.value;\r\n let anyCascadeGroupIsDepot = false;\r\n\r\n while (!!prospectiveParentId && !anyCascadeGroupIsDepot) {\r\n const parentGroup = allGroups.find(g => g.Id === prospectiveParentId);\r\n\r\n anyCascadeGroupIsDepot = parentGroup.IsDepot;\r\n\r\n prospectiveParentId = parentGroup.ParentId;\r\n }\r\n \r\n if (anyCascadeGroupIsDepot) {\r\n return {\r\n \"parentCascadeContainsDepot\": { valid: false }\r\n };\r\n }\r\n\r\n return null;\r\n }\r\n\r\n static duplicateProperty = (items: any[], propertyName: string, customErrorKey: string) => (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value || !items.length) {\r\n return;\r\n }\r\n\r\n const matchingItem = items.find(item => {\r\n return item[propertyName].toLowerCase() === control.value.toLowerCase();\r\n })\r\n\r\n if (matchingItem) {\r\n return { [customErrorKey]: true }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n static duplicateArrayItem = (control: AbstractControl): ValidationErrors | null => {\r\n\r\n if (!control.value) {\r\n return null;\r\n }\r\n\r\n const formArrayControls: AbstractControl[] = control[\"_parent\"]?.[\"controls\"];\r\n\r\n if (!formArrayControls?.length) {\r\n return null;\r\n }\r\n\r\n const duplicateControls: AbstractControl[] = formArrayControls.filter(formArrayControl => {\r\n return formArrayControl !== control\r\n && formArrayControl.value === control.value\r\n && control.value !== \"\";\r\n });\r\n\r\n if (!duplicateControls?.length) {\r\n return null;\r\n }\r\n\r\n return {\r\n \"duplicateArrayItem\": { valid: false }\r\n };\r\n }\r\n\r\n static simIccid = (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) {\r\n return null;\r\n }\r\n\r\n if (control.value.length < 19 || control.value.length > 20) {\r\n return {\r\n \"iccidFormat\": { valid: false }\r\n };\r\n }\r\n\r\n if (!luhnCheck(control.value)) {\r\n return {\r\n \"iccidValid\": { valid: false }\r\n };\r\n }\r\n\r\n return null;\r\n }\r\n\r\n static duplicateVehicleFromDatabaseAsync(service: FoundationVehiclesService, accountId: number): AsyncValidatorFn {\r\n return (control: AbstractControl): Observable => {\r\n return service.doesVehicleExist(accountId, control.value).pipe(\r\n map(vehicleExists => {\r\n\r\n if (vehicleExists) {\r\n return {\r\n vehicleDuplicated: true\r\n };\r\n }\r\n\r\n return null;\r\n })\r\n );\r\n };\r\n }\r\n}\r\n\r\nfunction luhnCheck(iccid): boolean {\r\n let sum = 0;\r\n let val = iccid.substr(0, iccid.length - 1)\r\n let lastDigit = parseInt(iccid.substr(iccid.length - 1, 1))\r\n let parity = val.length % 2\r\n\r\n for (let i = val.length - 1; i >= 0; i--) {\r\n let intVal = parseInt(val.substr(i, 1));\r\n if (i % 2 != parity) {\r\n intVal *= 2;\r\n if (intVal > 9) {\r\n intVal = 1 + (intVal % 10);\r\n }\r\n }\r\n sum += intVal;\r\n }\r\n\r\n return ((sum * 9) % 10) === lastDigit;\r\n}\r\n","export enum ResourceType {\n Any = -1,\r\n Account,\r\n Contact,\r\n Deal,\r\n Job,\r\n JobBooking,\r\n Package,\r\n Peripheral,\r\n Product,\r\n ProductGroup,\r\n Sim,\r\n Site,\r\n Unit,\r\n Vehicle,\r\n Ticket,\r\n Stock,\r\n Engineer,\r\n SoftwareLog,\r\n Driver,\r\n Trailer,\r\n VerilocationUser,\r\n Announcement,\r\n Plot,\r\n User,\r\n DriverDecisionSupport,\r\n GeocodedAddress,\r\n Geofence,\r\n Group,\r\n Journey,\r\n Message,\r\n OutboundQueue,\r\n RfidData,\r\n DigiDl,\r\n AlertRecord,\r\n ReportSchedule,\r\n Log,\r\n Test,\r\n MaintenanceType,\r\n StirlingJob,\r\n DigiDlPacket,\r\n EngineerCommission,\r\n InputType,\r\n}\n\nexport enum ResourceAllocation {\r\n All,\r\n Vehicle,\r\n Driver,\r\n Geofence\r\n}\n","import { Injectable } from \"@angular/core\";\r\nimport { Observable, ReplaySubject, throwError } from \"rxjs\";\r\nimport { catchError, shareReplay } from \"rxjs/operators\";\r\nimport { DateService, DateUnit } from \"../date.service\";\r\n\r\ninterface ICacheValue {\r\n data: Map;\r\n expiry: Date;\r\n callback: () => Observable;\r\n subject: ReplaySubject;\r\n age: number; // Seconds\r\n}\r\n\r\ninterface ICacheOptions {\r\n invalidateCache?: boolean;\r\n age?: number; // Seconds\r\n keyName?: string;\r\n additionalData?: any[];\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DataCacheService {\r\n private cache = new Map();\r\n private requestQueue: Map> = new Map>();\r\n private expiryTimers: ReturnType[] = [];\r\n\r\n constructor(\r\n private readonly dateService: DateService\r\n ) { }\r\n\r\n /**\r\n * @description Retrieve an entire collection of cached values if it exists, or trigger http request to fetch the data for the first time.\r\n * @param {string} cacheName The name of the cache\r\n * @param {() => {}} callback The http method that will retrieve the data in the case of no cached data\r\n * @param {ICacheOptions} options Set options such as expiry date and whether to invalidate cache\r\n * @returns {ReplaySubject}\r\n */\r\n getOrRequest(cacheName: string, callback: () => Observable, options: ICacheOptions = {}): ReplaySubject {\r\n options = this.setDefaultOptions(options);\r\n\r\n const collection: ICacheValue = this.getCollection(cacheName);\r\n\r\n if (!collection || this.isExpired(cacheName) || options.invalidateCache) {\r\n this.resetCache(cacheName, callback, options);\r\n this.fetchData(cacheName, options);\r\n return this.getCollection(cacheName).subject;\r\n }\r\n \r\n this.emitData(cacheName);\r\n\r\n return collection.subject;\r\n }\r\n\r\n /**\r\n * @description Update a single value in an existing array of cached values, or refreshes the cache if it has expired. Triggers next() on the cache subject to keep subscribers updated on current state\r\n * @param {any} value The data item to add\r\n * @param {string} cacheName The name of the cache\r\n * @param {string} [keyName = \"Id\"] The unique identifier property name for the value\r\n * @returns {void}\r\n */\r\n addOrUpdateItem(value: any, cacheName: string, keyName: string = 'Id'): void {\r\n if (!this.getCollection(cacheName)) {\r\n return;\r\n }\r\n\r\n const collection = this.getCollection(cacheName);\r\n\r\n if (this.isExpired(cacheName)) {\r\n const options = this.setDefaultOptions({\r\n age: collection.age,\r\n additionalData: [value]\r\n });\r\n\r\n this.resetCache(cacheName, collection.callback, options);\r\n this.fetchData(cacheName, { keyName, additionalData: [value] });\r\n return;\r\n }\r\n\r\n this.insertItemIntoCollection(value, cacheName, keyName);\r\n }\r\n\r\n /**\r\n * @description Remove a single value in an existing array of cached values, or refreshes the cache if it has expired. Triggers next() on the cache subject to keep subscribers updated on current state\r\n * @param {any} value The data item to remove\r\n * @param {string} cacheName The name of the cache\r\n * @param {string} [keyName = \"Id\"] The unique identifier property name for the value\r\n * @returns {void}\r\n */\r\n deleteItem(value: any, cacheName: string, keyName: string = 'Id'): void {\r\n if (this.isExpired(cacheName)) {\r\n this.fetchData(cacheName, { keyName });\r\n return;\r\n }\r\n\r\n this.removeItemFromCollection(value, cacheName, keyName);\r\n }\r\n\r\n /**\r\n * @description Retrieve a single value in an existing array of cached values\r\n * @param {any} key The unique identifier for the value to be retrieved\r\n * @param {string} cacheName The name of the cache to retrieve the value from\r\n */\r\n getSingleValue(key: any, cacheName: string): any {\r\n if (this.isExpired(cacheName)) {\r\n return;\r\n }\r\n\r\n const cache: ICacheValue = this.getCollection(cacheName);\r\n\r\n return cache.data.get(key);\r\n }\r\n\r\n /**\r\n * @description Empty the cache eg. on logout or switch user\r\n */\r\n clearAllCaches(): void {\r\n this.clearAllTimeouts();\r\n this.requestQueue.clear();\r\n this.cache.clear();\r\n }\r\n\r\n //--\r\n\r\n private isExpired(cacheName: string): boolean {\r\n const collection = this.getCollection(cacheName);\r\n\r\n if (!collection) {\r\n return true;\r\n }\r\n\r\n const expiry = collection.expiry;\r\n \r\n return this.dateService.date1IsAfterDate2(new Date(), expiry);\r\n }\r\n\r\n private resetCache(cacheName: string, callback: () => Observable, options: ICacheOptions): void {\r\n const existingCollection = this.getCollection(cacheName);\r\n\r\n let subject: ReplaySubject = existingCollection?.subject;\r\n\r\n if (options.invalidateCache || !existingCollection) {\r\n subject = new ReplaySubject(1);\r\n }\r\n\r\n this.cache.set(cacheName, {\r\n data: new Map(),\r\n callback,\r\n subject,\r\n expiry: this.dateService.addOrSubtractTime(new Date(), options.age || 300, DateUnit.Sec),\r\n age: existingCollection?.age || options.age\r\n });\r\n }\r\n\r\n private insertItemIntoCollection(value: any, cacheName: string, keyName: string = 'Id'): void {\r\n \r\n const collection = this.getCollection(cacheName);\r\n\r\n const existingItem = collection.data.get(value[keyName]);\r\n\r\n if (existingItem) {\r\n collection.data.delete(existingItem[keyName]);\r\n }\r\n\r\n collection.data.set(value[keyName], value);\r\n\r\n this.emitData(cacheName);\r\n }\r\n\r\n private removeItemFromCollection(value: any, cacheName: string, keyName: string = 'Id'): void {\r\n const collection = this.getCollection(cacheName);\r\n const existingItem = collection.data.get(value[keyName]);\r\n\r\n if (existingItem) {\r\n collection.data.delete(existingItem[keyName]);\r\n }\r\n\r\n this.emitData(cacheName);\r\n }\r\n\r\n private emitData(cacheName: string): void {\r\n const collection = this.getCollection(cacheName);\r\n\r\n const data = Array.from(collection.data, item => {\r\n return item[1];\r\n });\r\n\r\n collection.subject.next(data);\r\n }\r\n\r\n private fetchData(cacheName: string, options: ICacheOptions): void {\r\n const collection = this.getCollection(cacheName);\r\n\r\n let request: Observable;\r\n\r\n // Check if a request is already in progress\r\n if (this.requestQueue.has(cacheName)) {\r\n // Return the existing observable for the request\r\n request = this.requestQueue.get(cacheName);\r\n }\r\n\r\n if (!request) {\r\n request = collection.callback().pipe(\r\n catchError(error => {\r\n\r\n this.requestQueue.delete(cacheName);\r\n return throwError(error);\r\n }),\r\n shareReplay(1) // Share the response with any future subscribers\r\n );\r\n }\r\n\r\n request.subscribe({\r\n next: data => {\r\n const mappedData = new Map(data.map(item => [item[options.keyName], item]));\r\n\r\n const collection = this.getCollection(cacheName);\r\n\r\n if (!collection) {\r\n // Collection has already been cleared - eg. by a session ending\r\n return;\r\n }\r\n\r\n collection.data = mappedData;\r\n this.emitData(cacheName);\r\n\r\n collection.expiry = this.dateService.addOrSubtractTime(new Date(), collection.age || 300, DateUnit.Sec)\r\n },\r\n complete: () => {\r\n\r\n if (!this.getCollection(cacheName)) {\r\n // Collection has already been cleared - eg. by a session ending\r\n return;\r\n }\r\n\r\n if (options.additionalData) {\r\n options.additionalData.forEach(item => this.insertItemIntoCollection(item, cacheName, options.keyName));\r\n }\r\n\r\n this.requestQueue.delete(cacheName);\r\n\r\n this.setTimeoutForCache(cacheName);\r\n this.emitData(cacheName);\r\n }\r\n });\r\n }\r\n\r\n private setTimeoutForCache(cacheName: string): void {\r\n const age = this.getCollection(cacheName).age;\r\n\r\n const timeout = setTimeout(() => {\r\n this.clearCache(cacheName);\r\n }, age * 1000)\r\n\r\n this.expiryTimers.push(timeout);\r\n }\r\n\r\n private clearCache(cacheName: string): void {\r\n const cache = this.getCollection(cacheName);\r\n cache.data.clear();\r\n }\r\n\r\n private clearAllTimeouts(): void {\r\n this.expiryTimers.forEach(timer => {\r\n clearTimeout(timer);\r\n })\r\n }\r\n\r\n private setDefaultOptions(options: ICacheOptions): ICacheOptions {\r\n if (!options.keyName) {\r\n options.keyName = 'Id';\r\n }\r\n\r\n if (!options.age) {\r\n options.age = 300;\r\n }\r\n\r\n return options;\r\n }\r\n\r\n private getCollection(cacheName): ICacheValue {\r\n return this.cache.get(cacheName);\r\n }\r\n}\r\n","import { ScrollingModule } from \"@angular/cdk/scrolling\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { NgModule } from \"@angular/core\";\r\nimport { FormsDirectivesModule } from \"@directives/_forms/_form.directives.module\";\r\nimport { PipesModule } from \"src/app/_pipes/_pipes.module\";\r\nimport { CoreDirectivesModule } from \"../_core/_core.directives.module\";\r\nimport { MapDirectivesModule } from \"../_map/_map.directives.module\";\r\nimport { MiscDirectivesModule } from \"../_misc/_misc.directives.module\";\r\nimport { ResourceFiltersDirectivesModule } from \"../_resourceFilters/_resourceFilters.directives.module\";\r\nimport { VeriDirectivesModule } from \"../_veri/_veri.directives.module\";\r\nimport { DriverSummaryPanelComponent } from \"./driverSummaryPanel/driverSummaryPanel.component\";\r\nimport { VehicleButtonFilterComponent } from \"./vehicle-button-filter/vehicle-button-filter.component\";\r\nimport { VehicleListComponent } from \"./vehicle-list/vehicle-list.component\";\r\nimport { VehicleStatusComponent } from \"./vehicle-status/vehicle-status.component\";\r\nimport { VehicleInfoCardComponent } from \"./vehicleInfoCard/vehicleInfoCard.component\";\r\nimport { VehiclePlotTimeComponent } from \"./vehiclePlotTime/vehiclePlotTime.component\";\r\nimport { VehicleRegComponent } from \"./vehicleReg/vehicleReg.component\";\r\n\r\nconst privateComponents = [];\r\n\r\nconst publicComponents = [\r\n VehicleInfoCardComponent,\r\n VehicleRegComponent,\r\n VehiclePlotTimeComponent,\r\n DriverSummaryPanelComponent,\r\n VehicleStatusComponent,\r\n VehicleButtonFilterComponent,\r\n VehicleListComponent\r\n];\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n PipesModule,\r\n ScrollingModule,\r\n VeriDirectivesModule,\r\n MiscDirectivesModule,\r\n FormsDirectivesModule,\r\n MapDirectivesModule,\r\n ResourceFiltersDirectivesModule,\r\n CoreDirectivesModule\r\n ],\r\n declarations: [\r\n ...privateComponents,\r\n ...publicComponents,\r\n\r\n ],\r\n entryComponents: [\r\n ...privateComponents,\r\n ...publicComponents,\r\n ],\r\n exports: [\r\n ...publicComponents,\r\n ]\r\n})\r\nexport class VehicleDirectivesModule {\r\n constructor() { }\r\n}\r\n","import { ScrollingModule } from \"@angular/cdk/scrolling\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { NgModule, NO_ERRORS_SCHEMA, Type } from \"@angular/core\";\r\nimport { PipesModule } from \"@app/_pipes/_pipes.module\";\r\nimport { CoreDirectivesModule } from \"@app/directives/_core/_core.directives.module\";\r\nimport { FormsDirectivesModule } from \"@app/directives/_forms/_form.directives.module\";\r\nimport { LayoutDirectivesModule } from \"@app/directives/_layout/_layout.directives.module\";\r\nimport { MiscDirectivesModule } from \"@app/directives/_misc/_misc.directives.module\";\r\nimport { CheckboxCell } from \"./_components/cells/checkbox-cell/checkbox-cell.component\";\r\nimport { EnumCellComponent } from \"./_components/cells/enum-cell/v-enum-cell.component\";\r\nimport { VTableHeader } from \"./_components/cells/header/v-table-header.component\";\r\nimport { PercentageBarCellComponent } from \"./_components/cells/percentage-bar/percentage-bar-cell.component\";\r\nimport { RagCellComponent } from \"./_components/cells/rag-cell/rag-cell.component\";\r\nimport { StackedCell } from \"./_components/cells/stacked-cell/stacked-cell.component\";\r\nimport { DateCell } from \"./_components/cells/stacked-date/date-cell.component\";\r\nimport { StatusCell } from \"./_components/cells/status-cell/status-cell.component\";\r\nimport { VTableCell } from \"./_components/cells/v-table-cell.component\";\r\nimport { VTableActionsComponent } from \"./_components/v-table-actions/v-table-actions.component\";\r\nimport { VTableColumnEditorComponent } from \"./_components/v-table-column-editor/v-table-column-editor.component\";\r\nimport { VTableLayoutContainer } from \"./_components/v-table-layout-container/v-table-layout-container.component\";\r\nimport { VTableComponent } from \"./_components/v-table.component\";\r\nimport { TableSummaryBox } from \"./_components/visualisations/table-summary-box/table-summary-box.component\";\r\nimport { ComponentAnchorDirective } from \"./_directives/componentAnchor.directive\";\r\n\r\nconst privateComponents: Type[] = [\r\n];\r\n\r\nconst publicComponents: Type[] = [\r\n VTableLayoutContainer,\r\n VTableComponent,\r\n VTableHeader,\r\n VTableCell,\r\n StackedCell,\r\n DateCell,\r\n CheckboxCell,\r\n StatusCell,\r\n EnumCellComponent,\r\n VTableActionsComponent,\r\n TableSummaryBox,\r\n RagCellComponent,\r\n PercentageBarCellComponent,\r\n VTableColumnEditorComponent\r\n];\r\n\r\n\r\nconst declarations: any[] = [\r\n ComponentAnchorDirective\r\n];\r\n\r\n@NgModule({\r\n providers: [\r\n\r\n ],\r\n imports: [\r\n CommonModule,\r\n MiscDirectivesModule,\r\n CoreDirectivesModule,\r\n LayoutDirectivesModule,\r\n FormsDirectivesModule,\r\n PipesModule,\r\n ScrollingModule\r\n ],\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents, ...declarations],\r\n exports: [...publicComponents, ...declarations],\r\n schemas: [NO_ERRORS_SCHEMA]\r\n})\r\nexport class VTableModule {\r\n constructor() {\r\n }\r\n}\r\n","export enum DriverIdType {\r\n None = 0,\r\n Fob = 1,\r\n Tacho = 2,\r\n Mdt = 3\r\n}\r\n\r\nexport enum TachoType {\r\n None = 0,\r\n Siemens = 1,\r\n Stoneridge = 2\r\n}\r\n\r\nexport enum IgnitionType {\r\n Unknown = 0,\r\n None = 1,\r\n Ignition = 2,\r\n EngineRun = 3\r\n}\r\n\r\nexport enum EngineerJobItemStatus {\r\n Incomplete = 0,\r\n Complete = 1,\r\n Cancelled = 2,\r\n Failed = 3\r\n}\r\n\r\nexport enum EngineerJobItemType {\r\n Install = 0,\r\n Uninstall = 1,\r\n Reinstall = 3,\r\n ServiceCall = 4,\r\n Upgrade = 5\r\n}\r\n\r\nexport enum EngineerCommissionStatus {\r\n Submitted,\r\n Complete,\r\n Saved,\r\n Failed,\r\n FailedComplete\r\n}\r\n\r\nexport enum ExtendedDetails {\r\n None,\r\n Device,\r\n SIM\r\n}\r\n\r\nexport enum CommissionPeripheralForm {\r\n None,\r\n Camera\r\n}\r\n\r\nexport enum CommissionDurationPeriods {\r\n LessThanThirtyMins,\r\n LessThanHour,\r\n LessThanHourHalf,\r\n LessThenTwoHours,\r\n LessThanTwoHalf,\r\n LessThanThree,\r\n LessThanThreeHalf,\r\n LessThanFour,\r\n LessThanFourHalf,\r\n MoreThanFive\r\n}\r\n\r\nexport enum NonTestableDevices {\r\n DVS,\r\n Transcan\r\n}\r\n\r\nexport enum IAampAlarmType {\r\n VideoLoss = 1,\r\n MotionDetection = 2,\r\n Cover = 3,\r\n StorageException = 4,\r\n IO1 = 5,\r\n IO2 = 6,\r\n IO3 = 7,\r\n IO4 = 8,\r\n IO5 = 9,\r\n IO6 = 10,\r\n IO7 = 11,\r\n IO8 = 12,\r\n PanicAlarm = 13,\r\n LowSpeed = 14,\r\n HighSpeed = 0xF,\r\n LowVoltage = 0x10,\r\n ACC = 17,\r\n Fence = 18,\r\n IllegalPowerOff = 19,\r\n IllegalShutdown = 20,\r\n TemperatureAlarm = 29,\r\n DistanceAlarm = 36,\r\n TemperatureChangeAlarm = 47,\r\n FatigueDriving = 58,\r\n NoDriver = 59,\r\n DriverCall = 60,\r\n DriverSmoke = 61,\r\n DriverUnderDistraction = 62,\r\n LaneDeparture = 0x3F,\r\n FontCarCollision = 0x40,\r\n AbnormalBootAlarm = 74,\r\n CarDistanceTooClose = 162,\r\n PedestrianCollision = 163,\r\n DriverYawn = 164,\r\n LeftBlindZone = 165,\r\n RightBlindZone = 166\r\n}\r\n\r\nexport enum ValidationResult {\r\n Pass,\r\n Warning,\r\n Fail\r\n}\r\n\r\nexport enum InstallSetupCode {\r\n CalampAndFlexTruck,\r\n CalampAndFlexVan,\r\n CalampBasic,\r\n JPOD,\r\n OBD,\r\n GV600TTU,\r\n GV350,\r\n GV350WithG2,\r\n DigiDL,\r\n Temperature,\r\n FourGAddsecureCamera,\r\n AampDvr,\r\n WhiteListNoDataTests,\r\n FtCloudCamera,\r\n Squarell\r\n}\r\n\r\nexport enum Category {\r\n General,\r\n Sim,\r\n Gps,\r\n Can,\r\n RoadviewCamera,\r\n AampCamera,\r\n Temperature,\r\n Tacho,\r\n FtCloudCamera\r\n}\r\n\r\nexport enum CommissioningCheckType {\r\n DeviceInStockCheck,\r\n DeviceNotAssigned,\r\n BasicPlotCheck,\r\n GPSLocationCheck,\r\n GPSRegularUpdates,\r\n IgnitionOnOff,\r\n OdoSet,\r\n RecentSensorData,\r\n BasicFuelLevel,\r\n CANOdo,\r\n TotalFuelAccumulation,\r\n FuelUsedIdle,\r\n IncreaseInIdleTime,\r\n FMSOnOff,\r\n Driver,\r\n PTOFuel,\r\n TachoModeChange,\r\n ThresholdsSet,\r\n FMSSpamming,\r\n PlotCheck,\r\n GpsCheck,\r\n SensorDataCheck,\r\n FuelDataCheck,\r\n SimStatusCheck,\r\n FuelDataPopulated,\r\n DeviceInStockCheck4G,\r\n SdCardCheck4G,\r\n ConfigCheck4G,\r\n IgnitionCheck4G,\r\n VideoCheck4G,\r\n SimStatusCheck4G,\r\n SimCheckAamp,\r\n GpsCheckAamp,\r\n AlarmCheckAamp,\r\n FootageHistoryCheckAamp,\r\n TemperatureRecordsCheck,\r\n TemperatureProbeCountCheck,\r\n TachoRecordsCreatedCheck,\r\n ModeChangeCheck,\r\n FtCloudGpsCheck,\r\n FtCloudAlarmCheck,\r\n FtCloudFootageHistoryCheck\r\n}\r\n\r\nexport enum AampSimStatus {\r\n None,\r\n NoSimCard,\r\n NoModuleAndSimCard,\r\n ModuleAndSimCardDetected\r\n}\r\n\r\nexport enum ImportStrategyReference {\r\n Device,\r\n Engineer,\r\n JobItem\r\n}\r\n\r\nexport enum ImportType {\r\n Peripheral,\r\n Unit,\r\n Engineer,\r\n JobItem\r\n}\r\n","export enum ProductVendor {\r\n Unknown = 0,\r\n Webtech = 1,\r\n Calamp = 8,\r\n Garmin = 10,\r\n Squarell = 11,\r\n IntelligentTelematics = 16,\r\n TachoSys = 23,\r\n VisionTrack = 30,\r\n Geotab = 34,\r\n Alcolock = 64,\r\n AAMP = 66,\r\n Streamax = 67,\r\n Astra = 69,\r\n Falcom = 70,\r\n Trakm8 = 72,\r\n SevenTelematics = 73,\r\n RTL = 75,\r\n Aplicom = 76,\r\n Queclink = 84,\r\n Geometris = 85,\r\n AssuredTechmatics = 91,\r\n Axscend = 93,\r\n}\r\n\r\n\r\n//0 Unknown\r\n//1 WebTech\r\n//2 INS\r\n//4 Phone Tracker\r\n//5 Orion\r\n//6 Box\r\n//7 iPhone\r\n//8 CalAmp\r\n//9 Mobile Devices\r\n//10 Garmin\r\n//11 Squarell\r\n//12 Peripheral\r\n//13 Unit Wiring\r\n//14 Installation Extra\r\n//15 Engineering Stock\r\n//16 Intelligent Telematics\r\n//17 NeoCom\r\n//18 Mio\r\n//19 DVR\r\n//20 Unknown\r\n//21 Autoloc\r\n//22 SecureSeal\r\n//23 TachoSys\r\n//24 Verilocation\r\n//25 CoPilot\r\n//26 SpeedGauge\r\n//27 Armour Automotive\r\n//28 RugGear\r\n//29 Servision\r\n//30 VisionTrack\r\n//31 Transend\r\n//32 Unknown\r\n//33 Isotrak\r\n//34 Geotab Inc\r\n//35 QinetiQ\r\n//36 Novacom Europe BV\r\n//37 RS Components Ltd\r\n//38 A Latter & Co Ltd\r\n//39 Alba Engineering Ltd\r\n//40 Arkle Electronic Systems\r\n//41 ASM Technologies Ltd\r\n//42 Beal(UK) Ltd\r\n//43 Betterbox Communications Ltd\r\n//44 Borsig\r\n//45 Inventure ZRT\r\n//46 Ecopac(UK) Ltd\r\n//47 Farnell\r\n//48 HomeChip\r\n//49 Greenway Electronic Co Ltd\r\n//50 Hubs Trailer Service Inc\r\n//51 Knorr - Bremse\r\n//52 LCP Automotive\r\n//53 Micronet Inc\r\n//54 Nemesis GB Ltd\r\n//55 RAM Mount UK Ltd\r\n//56 Truckeast Ltd\r\n//57 Digital Distribution(GB) Ltd\r\n//58 Co - Star Components\r\n//59 Symec Technologies Ltd\r\n//60 Strike Group Australia Pty Ltd\r\n//61 SIGNO Communication Electronics\r\n//62 Montrose Fasteners\r\n//63 AVR Global Technologies\r\n//64 Alcolock\r\n//65 Autowatch\r\n//66 AAMP Global\r\n//67 Streamax\r\n//68 North America & Canada\r\n//69 Astra\r\n//70 Falcom\r\n//71 Seven - Demo\r\n//72 Trackm8\r\n//73 Seven Telematics\r\n//74 Development\r\n//75 RTL\r\n//76 Aplicom\r\n//77 Aeris\r\n//78 Jinchanggps\r\n//79 Technoton\r\n//80 Eversmart\r\n//81 Ti - Lane Precision Electronic Co Ltd\r\n//82 Trimble\r\n//83 ALK\r\n//84 Queclink\r\n//85 Peak Ryzex\r\n//86 Geometris\r\n//88 ATAG\r\n//89 Amazon\r\n//90 GPS LockBox\r\n//91 Assured Techmatics\r\n//92 Lightfoot\r\n//93 Axscend\r\n","export class FleetNavigationModule {\r\n static get Dashboard(): string { return 'app.fleet.dashboard'; }\r\n static get Vehicles(): string { return 'app.fleet.vehicles'; }\r\n static get VehiclesNew(): string { return 'app.fleet.vehiclesnew'; }\r\n static get Drivers(): string { return 'app.fleet.drivers'; }\r\n static get DriverView(): string { return `${FleetNavigationModule.Drivers}.view`; }\r\n static get Drivers_Old(): string { return 'app.fleet.drivers_old'; }\r\n static get Messages(): string { return 'app.fleet.messages'; }\r\n //static get Compliance(): string { return 'app.fleet.compliance'; }\r\n static get Tachograph(): string { return 'app.fleet.tachograph'; }\r\n static get Breathalock(): string { return 'app.fleet.breathalock'; }\r\n static get Temperature(): string { return 'app.fleet.temperature'; }\r\n static get Maintenance(): string { return 'app.fleet.maintenance'; }\r\n\r\n static get Planning(): string { return \"app.fleet.planning\"; }\r\n\r\n static get Default(): string { return this.Dashboard; }\r\n static get ParentRoot(): string { return \"app.fleet\"; }\r\n\r\n // Todo - Move out of here\r\n static get Geofences(): string { return 'app.geofences'; }\r\n //static get Reports(): string { return 'app.reports'; }\r\n static get ResourceManagement(): string { return 'app.components_resourceManagement'; }\r\n}\r\n","\r\nimport { AccountStatus } from \"@enums/account/AccountStatus\";\r\nimport { AccountFeatures } from \"@enums/account/AccountFeature\";\r\nimport { SpecialUserPermissions } from \"@enums/SpecialUserPermissions\";\r\nimport { UserAccessPermissions } from \"@enums/UserAccessPermissions\";\r\nimport { UserStatus, UserType, AccountUserType } from \"@enums/UserType\";\r\n\r\nexport interface IAccountUserMapping {\n Id?: number;\n UserId?: number;\n AccountId: number;\n\n Name?: string; // name\n Phone?: string;\n\n Type?: AccountUserType;\n\r\n Status: UserStatus;\n AccountStatus?: AccountStatus;\n\r\n ReadFeatures: AccountFeatures;\r\n ManageFeatures: AccountFeatures;\r\n SpecialUserPermissions: SpecialUserPermissions;\n\r\n AccessMask: UserAccessPermissions;\r\n\r\n AllowAllVehicles?: boolean;\r\n AllowAllDrivers?: boolean;\r\n AllowAllGeofences?: boolean;\n\n Created?: string;\n Updated?: string;\n}\n\nexport interface IUserDriverMapping {\n\n Id: number,\n DriverId?: number,\n UserId?: number\r\n\r\n}\n\nexport interface IUserVehicleMapping {\n\n Id: number,\n VehicleId?: number,\n UserId?: number\r\n\r\n}\n\nexport interface IUserGeofenceMapping {\n\n Id: number,\n GeofenceId?: number,\n UserId?: number\r\n\r\n}\n\nexport interface IGroupUserMapping {\n\n Id: number,\n GroupId: number,\n UserId: number\r\n\r\n}\nexport enum UserPlatform {\n Valkyrie,\n Foundation\n}\r\n\r\nexport interface IUser {\r\n Id?: number;\r\n Type?: UserType;\n IsActive?: boolean;\n Description?: string;\n IsSystemUser?: boolean;\n IsReseller?: boolean;\n\n ResellerIds?: number[];\n UserGroupId?: number;\n\n AccountUserMappings?: IAccountUserMapping[];\n CurrentAccountUserMapping?: IAccountUserMapping;\n\r\n Email?: string;\r\n\r\n ResetPassword?: boolean;\n\n FailedLoginAttempts?: number;\r\n FirstFailedLoginAttempt?: Date;\r\n UserLockedUntil?: Date;\n\r\n VehicleIds?: number[];\r\n DriverIds?: number[];\r\n GeofenceIds?: number[];\r\n GroupIds?: number[];\n\n // ---\n\n lastLoggedIn?: Date;\n language?: boolean;\n platform?: UserPlatform;\r\n\r\n newUserLanguageCode?: string;\r\n}\n","\r\nimport { IGeofenceNavigationPoint } from \"@directives/_map/geofences/geofences.interfaces\";\r\nimport { IExternalReference } from \"@directives/_veri/externalReference/externalReferences.interfaces\";\r\nimport { IGeoArea } from \"../main/modules/tms/_models/IGeoArea\";\r\nimport { ITag } from \"./ITag\";\r\n\r\nexport interface IGeocodedAddress {\r\n Id?: number;\r\n FormattedAddress?: string;\r\n PostCode?: string;\r\n PlaceId?: number;\r\n BoundsPoints?: { Latitude: number, Longitude: number }[];\r\n\r\n CenterPoint: {\r\n Latitude?: number;\r\n Longitude?: number;\r\n };\r\n\r\n UtcUpdated?: string;\r\n}\r\n\r\nexport enum Colour {\r\n None,\r\n Blue,\r\n Red,\r\n Yellow,\r\n Orange,\r\n Green,\r\n Purple,\r\n Black,\r\n Grey\r\n}\r\n\r\nexport enum GeofenceCategory {\r\n Standard = 0,\r\n Zone = 1\r\n}\r\n\r\n// Todo: Move to App.Interfaces\r\nexport interface IGeofence extends IGeoArea {\r\n Addr1?: string;\r\n Addr2?: string;\r\n Addr3?: string;\r\n Addr4?: string;\r\n\r\n Description?: string;\r\n DescriptionExt?: string;\r\n\r\n Email?: string;\r\n ContactEmail?: string;\r\n Phone?: string;\r\n Notes?: string;\r\n DeliveryInformation?: string;\r\n AdditionalInformation?: string; \r\n \r\n Category?: GeofenceCategory;\r\n\r\n Id?: number;\r\n AccountId?: number;\r\n\r\n RouteStopIsActive?: boolean;\r\n RouteStopIsDepot?: boolean;\r\n\r\n Tags?: ITag[];\r\n TagIds?: number[];\r\n PriorityTag?: ITag;\r\n\r\n Created?: string;\r\n Updated?: string;\r\n Restricted?: boolean;\r\n\r\n/* Our properties */\r\n HideFromMap?: boolean;\r\n PendingDelete?: boolean;\r\n externalReferences?: IExternalReference[];\r\n\r\n //----\r\n\r\n navigationPoints?: IGeofenceNavigationPoint[];\r\n isSystemGeofence?: boolean;\r\n isRestrictedReadOnly?: boolean;\r\n isReadOnly?: boolean;\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { Subject } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FilterBarService {\r\n dataChanged = new Subject();\r\n tableColumnEditorOpen = new Subject<{ open: boolean, tableColumns: IVTableColumn[] }>();\r\n\r\n constructor(private readonly translationService: TranslationService) { }\r\n\r\n createTabDefinition(translationString: string, callback: (item: T) => boolean): { title: string, predicate: (item: T) => boolean } {\r\n\r\n return { title: this.translationService.t(translationString), predicate: callback };\r\n }\r\n\r\n toggleTableColumnEditor(show: boolean, tableColumns: IVTableColumn[]): void {\r\n this.tableColumnEditorOpen.next({ open: show, tableColumns });\r\n }\r\n\r\n}\r\n","import { ElementRef } from \"@angular/core\";\r\nimport { IGoogleMapsMarker } from \"@interfaces/IGoogleMapsMarkerOptions\";\r\nimport { IPlot } from \"@interfaces/IPlot\";\r\nimport { ColourService } from \"@services/colour.service\";\r\nimport { GoogleMarkerService, ICreateEventMarkerOptions } from \"@services/googleMarker.service\";\r\nimport { IPolyline, IPolylineOptions } from \"@typings/google.maps.angular\";\r\nimport * as angular from \"angular\";\r\nimport * as bigInt from \"big-integer\";\r\nimport { IVeriMapComponent } from \"../directives/_map/veriMap/veriMapComponent/veriMap.component\";\r\nimport { ConstantsService } from \"./constantsService\";\r\n\r\ntype BigInt = number;\r\ndeclare const BigInt: typeof Number;\r\n\r\nexport class MapService {\r\n\r\n mapReadyPromises: angular.IPromise[] = [];\r\n mapAPIReadyPromise: angular.IPromise;\r\n mapAPIReady = false;\r\n\r\n // edge buffer for fitting markers within viewport\r\n boundsBuffer = 20; // was 50\r\n googleMapsApiKey: string;\n\n userLocation: GeolocationPosition;\r\n\r\n static $inject = [\"$q\", \"$timeout\", \"constantsService\", \"colourService\", \"googleMarkerService\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $timeout: angular.ITimeoutService,\r\n private readonly constantsService: ConstantsService,\n private readonly colourService: ColourService,\n private readonly googleMarkerService: GoogleMarkerService) {\n\n this.getUsersLocation();\r\n\r\n this.googleMapsApiKey = this.constantsService.getGoogleMapsApiKey();\r\n\r\n this.loadGoogleMapsScript({\r\n key: this.googleMapsApiKey,\r\n channel: \"106315\",\r\n libraries: \"places,geometry,visualization,drawing\",\r\n transport: \"https\",\r\n v: \"quarterly\",\r\n isGoogleMapsForWork: true\r\n });\r\n }\n\n getDefaultMapLocation(): google.maps.LatLng {\n return this.userLocation\n ? new google.maps.LatLng(this.userLocation.coords.latitude, this.userLocation.coords.longitude)\n : new google.maps.LatLng(-34.397, 150.644);\n }\r\n\r\n getGoogleMapsAPIUrl(isChina = false) {\r\n if (isChina) {\r\n return 'https://maps.google.cn/maps/api/js?';\r\n }\r\n\r\n return 'https://maps.googleapis.com/maps/api/js?';\r\n }\r\n\r\n loadGoogleMapsScript(options: any) {\r\n var query = \"\";\r\n var omitOptions = ['transport', 'isGoogleMapsForWork', 'china', 'preventLoad', 'key'];\r\n\r\n Object.keys(options).forEach(k => {\r\n if (omitOptions[k]) {\r\n return;\r\n }\r\n\r\n if (query) {\r\n query += \"&\";\r\n }\r\n\r\n query += `${k}=${options[k]}`;\r\n });\r\n\r\n query += \"&callback=googleMapsCallback\";\r\n\r\n var defer = this.$q.defer();\r\n this.mapAPIReadyPromise = defer.promise;\r\n\r\n window[\"googleMapsCallback\"] = () => {\r\n\r\n this.loadMarkerWithLabelScript();\r\n this.loadMarkerClusterScript();\r\n\r\n this.waitForMapsToFullyLoad(defer);\r\n };\r\n\r\n var script = document.createElement(\"script\");\r\n script.id = \"google_maps_script\";\r\n script.type = \"text/javascript\";\n script.async = true;\n script.src = this.getGoogleMapsAPIUrl(false) + query;\r\n\r\n document.head.appendChild(script);\r\n }\r\n\r\n private waitForMapsToFullyLoad(defer: angular.IDeferred) {\r\n\r\n this.$timeout(() => {\r\n if (window[\"MarkerClusterer\"]) {\r\n this.mapAPIReady = true;\r\n defer.resolve();\r\n }\r\n else {\r\n this.waitForMapsToFullyLoad(defer);\r\n }\r\n }, 10);\r\n }\r\n\r\n private loadMarkerWithLabelScript() {\r\n var script = document.createElement('script');\r\n script.type = 'text/javascript';\r\n script.src = \"/assets/js/markerwithlabel.js\";\n script.async = true;\r\n document.head.appendChild(script);\r\n }\r\n\r\n private loadMarkerClusterScript() {\r\n var script = document.createElement('script');\r\n script.type = 'text/javascript';\r\n script.src = \"/assets/js/markerclusterer.js\";\n script.async = true;\r\n document.head.appendChild(script);\r\n }\n\r\n findVeriMap(elementRef: ElementRef): IVeriMapComponent {\r\n var i = 0;\r\n var parent: Node = elementRef.nativeElement;\r\n\r\n do {\r\n parent = parent.parentNode;\r\n\r\n if (parent.nodeName.toLowerCase() == \"veri-map\") {\r\n const element = window.angular.element(parent);\r\n const scope: any = element.length && (element.isolateScope() || element.scope());\r\n\r\n return scope.$ctrl;\r\n }\r\n }\r\n while (parent && i++ < 100);\r\n }\r\n\r\n createMap(container: Element, myOptions?: google.maps.MapOptions): angular.IPromise {\r\n var map = new google.maps.Map(container, myOptions);\r\n\r\n var defer = this.$q.defer();\r\n var mapReadyPromise = defer.promise;\r\n this.mapReadyPromises.push(mapReadyPromise);\r\n\r\n google.maps.event.addListenerOnce(map, \"idle\", () => {\r\n defer.resolve(map);\r\n });\r\n\r\n return mapReadyPromise;\r\n }\r\n\r\n getMapAPIReadyPromise(): angular.IPromise {\r\n return this.mapAPIReadyPromise;\r\n }\r\n\r\n convertLatLngToPoint(latLng: google.maps.LatLng, map: google.maps.Map, relativeToWindow = false): google.maps.Point {\r\n if (map == null) {\r\n console.error(\"Map object is null\");\r\n }\r\n\r\n const topRight = map.getProjection().fromLatLngToPoint(map.getBounds().getNorthEast());\r\n const bottomLeft = map.getProjection().fromLatLngToPoint(map.getBounds().getSouthWest());\r\n const scale = Math.pow(2, map.getZoom());\r\n const worldPoint = map.getProjection().fromLatLngToPoint(latLng);\r\n\r\n var x = (worldPoint.x - bottomLeft.x) * scale;\r\n var y = (worldPoint.y - topRight.y) * scale;\r\n\r\n if (relativeToWindow) {\r\n var mapRect = map.getDiv().getBoundingClientRect();\r\n x += mapRect.left;\r\n y += mapRect.top;\r\n }\r\n\r\n return new google.maps.Point(x, y);\r\n }\r\n\r\n convertPointToLatLng(point, map: google.maps.Map): google.maps.LatLng {\r\n const topRight = map.getProjection().fromLatLngToPoint(map.getBounds().getNorthEast());\r\n const bottomLeft = map.getProjection().fromLatLngToPoint(map.getBounds().getSouthWest());\r\n const scale = Math.pow(2, map.getZoom());\r\n const worldPoint = new google.maps.Point(point.x / scale + bottomLeft.x, point.y / scale + topRight.y);\r\n\r\n return map.getProjection().fromPointToLatLng(worldPoint);\r\n }\r\n\r\n updateMapSize(map: google.maps.Map) {\r\n if (map) {\r\n google.maps.event.trigger(map, \"resize\");\r\n } else {\r\n console.error(\"No map provided to updateMapSize\");\r\n }\r\n }\r\n\r\n getDistance(fromLat: number, fromLng: number, toLat: number, toLng: number, inMetres = false): number {\r\n\r\n // Taken from http://www.movable-type.co.uk/scripts/latlong.html\r\n\r\n const radius = 6378137; // earth radius in metres\r\n const a1 = this.toRadians(fromLat);\r\n const a2 = this.toRadians(toLat);\r\n const b1 = this.toRadians(toLat - fromLat);\r\n const b2 = this.toRadians(toLng - fromLng);\r\n\r\n const a = Math.sin(b1 / 2) * Math.sin(b1 / 2) +\r\n Math.cos(a1) *\r\n Math.cos(a2) *\r\n Math.sin(b2 / 2) *\r\n Math.sin(b2 / 2);\r\n const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\r\n\r\n let distance = radius * c;\r\n\r\n if (inMetres) {\r\n return distance;\r\n }\r\n\r\n distance = parseFloat((distance / 1000).toFixed(0));\r\n\r\n return distance;\r\n }\r\n\r\n private toRadians(value: number): number {\r\n\r\n /** Converts numeric degrees to radians */\r\n return 0.017453 * value;\r\n }\r\n\r\n enablePOI(map: google.maps.Map) {\r\n const styles = [\r\n {\r\n featureType: \"poi.business\",\r\n stylers: [\r\n { visibility: \"on\" }\r\n ]\r\n }\r\n ];\r\n\r\n map.setOptions({ styles: styles } as any);\r\n }\r\n\r\n setStyle(map: google.maps.Map, styles = null) {\r\n if (styles) {\r\n map.set('styles', styles);\r\n return;\r\n }\r\n\r\n var styles: any = [\r\n {\r\n \"featureType\": \"administrative\",\r\n \"elementType\": \"all\",\r\n \"stylers\": [{ \"visibility\": \"on\" }, { \"lightness\": 33 }]\r\n },\r\n {\r\n \"featureType\": \"administrative\",\r\n \"elementType\": \"labels\",\r\n \"stylers\": [{ \"saturation\": \"-100\" }]\r\n },\r\n {\r\n \"featureType\": \"administrative\",\r\n \"elementType\": \"labels.text\",\r\n \"stylers\": [\r\n {\r\n \"gamma\": \"0.75\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"administrative.neighborhood\",\r\n \"elementType\": \"labels.text.fill\",\r\n \"stylers\": [\r\n {\r\n \"lightness\": \"-37\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"landscape\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#f9f9f9\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"landscape.man_made\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"saturation\": \"-100\"\r\n },\r\n {\r\n \"lightness\": \"40\"\r\n },\r\n {\r\n \"visibility\": \"off\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"landscape.natural\",\r\n \"elementType\": \"labels.text.fill\",\r\n \"stylers\": [\r\n {\r\n \"saturation\": \"-100\"\r\n },\r\n {\r\n \"lightness\": \"-37\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"landscape.natural\",\r\n \"elementType\": \"labels.text.stroke\",\r\n \"stylers\": [\r\n {\r\n \"saturation\": \"-100\"\r\n },\r\n {\r\n \"lightness\": \"100\"\r\n },\r\n {\r\n \"weight\": \"2\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"landscape.natural\",\r\n \"elementType\": \"labels.icon\",\r\n \"stylers\": [\r\n {\r\n \"saturation\": \"-100\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"poi\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"saturation\": \"-100\"\r\n },\r\n {\r\n \"lightness\": \"80\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"poi\",\r\n \"elementType\": \"labels\",\r\n \"stylers\": [\r\n {\r\n \"saturation\": \"-100\"\r\n },\r\n {\r\n \"lightness\": \"0\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"poi.attraction\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"lightness\": \"-4\"\r\n },\r\n {\r\n \"saturation\": \"-100\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"poi.park\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#c5dac6\"\r\n },\r\n {\r\n \"visibility\": \"on\"\r\n },\r\n {\r\n \"saturation\": \"-95\"\r\n },\r\n {\r\n \"lightness\": \"62\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"poi.park\",\r\n \"elementType\": \"labels\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"on\"\r\n },\r\n {\r\n \"lightness\": 20\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road\",\r\n \"elementType\": \"all\",\r\n \"stylers\": [\r\n {\r\n \"lightness\": 20\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road.highway\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#c5c6c6\"\r\n },\r\n {\r\n \"saturation\": \"-100\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road.arterial\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#e4d7c6\"\r\n },\r\n {\r\n \"saturation\": \"-100\"\r\n },\r\n {\r\n \"lightness\": \"47\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road.arterial\",\r\n \"elementType\": \"geometry.stroke\",\r\n \"stylers\": [\r\n {\r\n \"lightness\": \"-12\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road.local\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"color\": \"#fbfaf7\"\r\n },\r\n {\r\n \"lightness\": \"77\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road.local\",\r\n \"elementType\": \"geometry.fill\",\r\n \"stylers\": [\r\n {\r\n \"saturation\": \"-100\"\r\n },\r\n {\r\n \"lightness\": \"-5\"\r\n },\r\n {\r\n \"gamma\": \"1\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"road.local\",\r\n \"elementType\": \"geometry.stroke\",\r\n \"stylers\": [\r\n {\r\n \"lightness\": \"-15\"\r\n },\r\n {\r\n \"saturation\": \"-100\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"transit.station.airport\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"lightness\": \"47\"\r\n },\r\n {\r\n \"saturation\": \"-100\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"water\",\r\n \"elementType\": \"all\",\r\n \"stylers\": [\r\n {\r\n \"visibility\": \"on\"\r\n },\r\n {\r\n \"color\": \"#acbcc9\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"water\",\r\n \"elementType\": \"geometry\",\r\n \"stylers\": [\r\n {\r\n \"saturation\": \"53\"\r\n }\r\n ]\r\n },\r\n {\r\n \"featureType\": \"water\",\r\n \"elementType\": \"labels.text.fill\",\r\n \"stylers\": [{ \"lightness\": \"-42\" }, { \"saturation\": \"17\" }]\r\n },\r\n {\r\n \"featureType\": \"water\",\r\n \"elementType\": \"labels.text.stroke\",\r\n \"stylers\": [{ \"lightness\": \"61\" }]\r\n }\r\n ];\r\n\r\n var styles2 = [\r\n {\r\n \"featureType\": \"landscape.man_made\",\r\n \"elementType\": \"geometry.fill\",\r\n \"stylers\": [\r\n {\r\n \"color\":\r\n \"#ece2d9\"\r\n }\r\n ]\r\n }, {\r\n \"featureType\": \"landscape.natural\",\r\n \"elementType\": \"geometry.fill\",\r\n \"stylers\": [{ \"visibility\": \"on\" }, { \"color\": \"#EBE5E0\" }]\r\n }, { \"featureType\": \"poi\", \"elementType\": \"all\", \"stylers\": [{ \"visibility\": \"on\" }] },\r\n { \"featureType\": \"poi.park\", \"elementType\": \"all\", \"stylers\": [{ \"visibility\": \"on\" }] },\r\n { \"featureType\": \"poi.park\", \"elementType\": \"geometry.fill\", \"stylers\": [{ \"color\": \"#ccdca1\" }] },\r\n { \"featureType\": \"poi.sports_complex\", \"elementType\": \"all\", \"stylers\": [{ \"visibility\": \"on\" }] },\r\n {\r\n \"featureType\": \"road\",\r\n \"elementType\": \"geometry.fill\",\r\n \"stylers\": [{ \"hue\": \"#ff0000\" }, { \"saturation\": -100 }, { \"lightness\": 99 }]\r\n }, {\r\n \"featureType\": \"road\",\r\n \"elementType\": \"geometry.stroke\",\r\n \"stylers\": [{ \"color\": \"#808080\" }, { \"lightness\": 54 }]\r\n }, { \"featureType\": \"road\", \"elementType\": \"labels.text.fill\", \"stylers\": [{ \"color\": \"#767676\" }] },\r\n { \"featureType\": \"road\", \"elementType\": \"labels.text.stroke\", \"stylers\": [{ \"color\": \"#ffffff\" }] },\r\n {\r\n \"featureType\": \"water\",\r\n \"elementType\": \"all\",\r\n \"stylers\": [{ \"saturation\": 43 }, { \"lightness\": -11 }, { \"hue\": \"#0088ff\" }]\r\n }, {\r\n \"featureType\": \"water\",\r\n \"elementType\": \"geometry.fill\",\r\n \"stylers\": [{ \"saturation\": \"-20\" }, { \"lightness\": \"40\" }]\r\n }\r\n ];\r\n\r\n map.set(\"styles\", styles2);\r\n }\r\n\r\n public panToWithOffset(map: google.maps.Map, latlng: google.maps.LatLng, offsetx: number, offsety: number) {\r\n var point1 = map.getProjection()\r\n .fromLatLngToPoint(\r\n (latlng instanceof google.maps.LatLng) ? latlng : map.getCenter()\r\n );\r\n\r\n var scale = Math.pow(2, map.getZoom());\r\n\r\n var point2 = new google.maps.Point((offsetx / scale) || 0, (offsety / scale) || 0);\r\n\r\n map.panTo(map.getProjection()\r\n .fromPointToLatLng(new google.maps.Point(\r\n point1.x + point2.x,\r\n point1.y + point2.y\r\n )));\r\n }\r\n\r\n public zoomOnPoint(map: google.maps.Map, latlng: google.maps.LatLng) {\r\n var circle = new google.maps.Circle();\r\n\r\n circle.setCenter(latlng);\r\n circle.setRadius(1000);\r\n\r\n var bounds = circle.getBounds();\r\n\r\n map.fitBounds(bounds);\r\n }\r\n\r\n smoothZoom(map: google.maps.Map, target: number, currentZoom?: number, callback?: Function) {\r\n currentZoom = currentZoom || map.getZoom();\r\n\r\n // If we check for equality, we will always stop 1 zoom too short, hence the need for +1\r\n if (currentZoom > target) {\r\n if (callback) {\r\n callback();\r\n }\r\n\r\n return;\r\n }\r\n\r\n google.maps.event.addListenerOnce(map, \"zoom_changed\", (event) => {\r\n return this.smoothZoom(map, target, target < currentZoom ? currentZoom - 1 : currentZoom + 1, callback);\r\n });\r\n\r\n setTimeout(() => {\r\n map.setZoom(currentZoom)\r\n }, 150); // 80ms\r\n }\r\n\r\n zoomAndCallback(map: google.maps.Map, zoomLevel: number, callback: Function, timeout?: number) {\r\n google.maps.event.addListenerOnce(map, \"zoom_changed\", () => {\r\n callback();\r\n });\r\n\r\n setTimeout(() => { map.setZoom(zoomLevel) }, timeout || 80); // 80ms\r\n }\r\n\r\n smoothPanAndZoomTo(map: google.maps.Map, latLng: google.maps.LatLng, targetZoom: number): angular.IPromise {\r\n var defer = this.$q.defer();\r\n\r\n const actionInterval = 300;//150\r\n\r\n // Check if position is within the current maps bounds, if so pan\r\n if (map.getCenter().equals(latLng)) {\r\n\r\n // If we are at the correct position then we just need to zoom to the correct level\r\n if (map.getZoom() !== targetZoom) {\r\n\r\n setTimeout(() => {\r\n this.smoothZoom(map, targetZoom, null, () => { defer.resolve(); });\r\n\r\n }, actionInterval);\r\n } else {\r\n // done\r\n defer.resolve();\r\n }\r\n }\r\n else if (map.getBounds().contains(latLng)) {\r\n setTimeout(() => {\r\n map.panTo(latLng);\r\n\r\n setTimeout(() => {\r\n this.smoothPanAndZoomTo(map, latLng, targetZoom).then(() => {\r\n defer.resolve();\r\n });\r\n }, actionInterval);\r\n }, actionInterval);\r\n }\r\n else {\r\n // Zoom out until we can pan\r\n this.zoomAndCallback(map, map.getZoom() - 1, () => {\r\n this.smoothPanAndZoomTo(map, latLng, targetZoom).then(() => {\r\n defer.resolve();\r\n });\r\n });\r\n }\r\n return defer.promise;\r\n }\r\n\r\n applyOffsetToLatLng(gmap: google.maps.Map, latLng: google.maps.LatLng, mapOffset: google.maps.Point): google.maps.LatLng {\r\n var originalPoint = this.convertLatLngToPoint(latLng, gmap);\r\n\r\n originalPoint.x += mapOffset.x;\r\n originalPoint.y += mapOffset.y;\r\n\r\n var adjustedLatLng = this.convertPointToLatLng(originalPoint, gmap);\r\n return adjustedLatLng;\r\n }\r\n\r\n getBoundsWithOffset(gmap: google.maps.Map, mapOffset: google.maps.Point): google.maps.LatLngBounds {\r\n if (gmap == null) {\r\n console.error(\"mapService.getBoundsWithOffset - gmap = null\");\r\n return;\r\n }\r\n\r\n if (mapOffset == null) {\r\n mapOffset = new google.maps.Point(0, 0);\r\n }\r\n\r\n const bounds = gmap.getBounds();\r\n const newBounds = new google.maps.LatLngBounds();\r\n\r\n var topRightPoint = this.convertLatLngToPoint(bounds.getNorthEast(), gmap);\r\n topRightPoint.x += mapOffset.x - this.boundsBuffer;\r\n topRightPoint.y += this.boundsBuffer;\r\n var offsetTopRight = this.convertPointToLatLng(topRightPoint, gmap);\r\n\r\n var bottomLeftPoint = this.convertLatLngToPoint(bounds.getSouthWest(), gmap);\r\n bottomLeftPoint.x += this.boundsBuffer;\r\n bottomLeftPoint.y -= this.boundsBuffer;\r\n var offsetBottomLeft = this.convertPointToLatLng(bottomLeftPoint, gmap);\r\n\r\n newBounds.extend(offsetTopRight);\r\n newBounds.extend(offsetBottomLeft);\r\n\r\n return newBounds;\r\n }\r\n\r\n setMapBoundsWithOffset(gmap: google.maps.Map, latLngs: google.maps.LatLng[] /*| google.maps.LatLngLiteral[]*/, mapOffset: google.maps.Point | { x: number, y: number } = new google.maps.Point(0, 0)): void {\r\n\r\n const bounds = this.getBoundsFromLatLngArray(latLngs);\r\n const mapDiv = gmap.getDiv();\r\n\r\n const dimensions = {\r\n width: mapDiv.clientWidth - Math.abs(mapOffset.x) - (this.boundsBuffer * 2),\r\n height: mapDiv.clientHeight - Math.abs(mapOffset.y) - (this.boundsBuffer * 2)\r\n };\r\n\n // For single items we will zoom out a bit to show context\n const maxZoom = latLngs.length == 1 ? 18 : 25;\n\r\n const zoomLevel = Math.min(this.getBoundsZoomLevel(bounds, dimensions), maxZoom);\n\r\n if (zoomLevel !== gmap.getZoom()) {\r\n gmap.setZoom(zoomLevel);\r\n }\r\n\r\n this.setOffsetCenter(gmap, bounds.getCenter(), mapOffset);\n }\r\n\r\n setOffsetCenter(gmap: google.maps.Map, latlng: google.maps.LatLng, mapOffset: google.maps.Point | { x: number, y: number }) {\r\n\r\n if (!mapOffset) {\r\n mapOffset = new google.maps.Point(0, 0);\r\n }\r\n else {\r\n //console.log(\"offset\", mapOffset);\r\n }\r\n\r\n const newCenterLatLng = this.offsetLatLng(gmap, latlng, mapOffset.x / 2, mapOffset.y / 2);\r\n const newCenterLat = newCenterLatLng.lat();\r\n const newCenterLng = newCenterLatLng.lng();\r\n\r\n if (!isNaN(newCenterLat) && !isNaN(newCenterLng)) {\r\n gmap.panTo(newCenterLatLng);\r\n }\r\n };\r\n\r\n setCenter(gmap: google.maps.Map, latlng: google.maps.LatLng, mapOffset: google.maps.Point | { x: number, y: number }) {\r\n const offsetX = mapOffset ? mapOffset.x / 2 : 0;\r\n const offsetY = mapOffset ? mapOffset.y / 2 : 0;\r\n const newCenterLatLng = this.offsetLatLng(gmap, latlng, offsetX, offsetY);\r\n\r\n gmap.setCenter(newCenterLatLng);\r\n };\r\n\r\n offsetLatLng(gmap: google.maps.Map, latlng: google.maps.LatLng, offsetX: number, offsetY: number) {\r\n offsetX = offsetX || 0;\r\n offsetY = offsetY || 0;\r\n\r\n const scale = Math.pow(2, gmap.getZoom());\r\n const point = gmap.getProjection().fromLatLngToPoint(latlng);\r\n const pixelOffset = new google.maps.Point((offsetX / scale), (offsetY / scale));\r\n\r\n const newPoint = new google.maps.Point(\r\n point.x - pixelOffset.x,\r\n point.y + pixelOffset.y\r\n );\r\n\r\n return gmap.getProjection().fromPointToLatLng(newPoint);\r\n };\r\n\r\n getBoundsFromLatLngArray(locations: google.maps.LatLng[]): google.maps.LatLngBounds {\r\n const bounds = new google.maps.LatLngBounds();\r\n\r\n for (var i = 0; i < locations.length; i++) {\r\n if (!locations[i]?.lat || !locations[i]?.lng) {\r\n continue;\r\n }\r\n\r\n bounds.extend(locations[i]);\r\n }\r\n\r\n return bounds;\r\n }\r\n\r\n getBoundsZoomLevel(bounds: google.maps.LatLngBounds, dimensions: { width: number, height: number }) {\r\n\r\n dimensions.width = Math.max(1, dimensions.width);\r\n dimensions.height = Math.max(1, dimensions.height);\r\n\r\n const TILE_SIZE = { height: 256, width: 256 }; // google World tile size, as of v3.22\r\n const ZOOM_MAX = 21; // max google maps zoom level, as of v3.22\r\n\r\n const latRadian = lat => {\r\n let sin = Math.sin(lat * Math.PI / 180);\r\n let radX2 = Math.log((1 + sin) / (1 - sin)) / 2;\r\n\r\n return Math.max(Math.min(radX2, Math.PI), -Math.PI) / 2;\r\n };\r\n\r\n const zoom = (mapPx, worldPx, fraction) => {\r\n return Math.floor(Math.log(mapPx / worldPx / fraction) / Math.LN2);\r\n };\r\n\r\n const ne = bounds.getNorthEast();\r\n const sw = bounds.getSouthWest();\r\n\r\n const latFraction = (latRadian(ne.lat()) - latRadian(sw.lat())) / Math.PI;\r\n const lngDiff = ne.lng() - sw.lng();\r\n const lngFraction = ((lngDiff < 0) ? (lngDiff + 360) : lngDiff) / 360;\r\n\r\n const latZoom = zoom(dimensions.height, TILE_SIZE.height, latFraction);\r\n const lngZoom = zoom(dimensions.width, TILE_SIZE.width, lngFraction);\r\n\r\n return Math.min(latZoom, lngZoom, ZOOM_MAX);\r\n }\n\n createMapMarker(plot: IPlot, options: ICreateEventMarkerOptions): IGoogleMapsMarker {\r\n options.position = {\r\n lat: plot.Latitude,\r\n lng: plot.Longitude\r\n };\r\n\r\n return {\r\n id: 1,\r\n options: this.googleMarkerService.createEventMarkerOptions(options)\r\n };\r\n }\r\n\r\n getDefaultPolylineOptions(color?: string, events?: any): IPolylineOptions {\r\n return {\r\n stroke: {\r\n color: color || \"#00426a\",\r\n weight: 3,\r\n opacity: 0.9\r\n },\r\n events: events\r\n }\r\n }\r\n\r\n createPolyline(id: number, latLngArray: google.maps.LatLng[], color?: string, events?: any, dashed?: boolean): IPolyline {\r\n const polylineOptions = (dashed)\n ? this.getDefaultDashedPolylineOptions(color, events)\n : this.getDefaultPolylineOptions(color, events);\r\n\r\n const polyline: IPolyline = {\r\n id: id,\r\n path: latLngArray,\r\n options: polylineOptions,\r\n };\r\n\r\n return polyline;\r\n }\n\n createPolylineFromPlots(plots: IPlot[], color = this.colourService.redColor) {\n const latLngArray = this.convertPlotsToGoogleLatLng(plots);\n const newPolyline = this.createPolyline(0, latLngArray, color, null, false);\r\n this.addDirectionArrows(newPolyline, color);\r\n\r\n return newPolyline;\r\n }\r\n\r\n addDirectionArrows(polyline: IPolyline, lineColor: string) {\r\n polyline.options.stroke.weight = 3;\r\n polyline.options.icons = [{\r\n icon: {\r\n path: google.maps.SymbolPath.FORWARD_CLOSED_ARROW,\r\n fillOpacity: 1,\r\n scale: 3,\r\n fillColor: \"white\",\r\n strokeColor: lineColor,\r\n strokeWeight: 1,\r\n },\r\n offset: \"100%\",\r\n repeat: \"100px\"\r\n }];\r\n }\r\n\r\n getDefaultDashedPolylineOptions(color?: string, events?: any): IPolylineOptions {\r\n var options = this.getDefaultPolylineOptions(color, events);\r\n options.stroke.opacity = 0;\r\n\r\n options.icons = [\r\n {\r\n icon: {\r\n path: \"M 0,-1 0,1\",\r\n strokeOpacity: 1,\r\n scale: 2,\r\n strokeWeight: 2\r\n },\r\n offset: \"0\",\r\n repeat: \"10px\"\r\n }\r\n ];\r\n\r\n return options;\r\n }\r\n\r\n catmullRomSpline(linePoints: number[][]): number[][] {\r\n const points: number[][] = [];\r\n\r\n var alpha = 0.5;\r\n // If 'alpha' is 0.5 then the 'Centripetal' variant is used\r\n // If 'alpha' is 1 then the 'Chordal' variant is used\r\n\r\n var p0, p1, p2, p3, bp1, bp2, d1, d2, d3, A, B, N, M;\r\n var d3powA, d2powA, d3pow2A, d2pow2A, d1pow2A, d1powA;\r\n //var linePoints;\r\n //var d = Math.round(linePoints[0][0]) + ',' + Math.round(linePoints[0][1]) + ' ';\r\n\r\n points.push([linePoints[0][0], linePoints[0][1]]);\r\n\r\n var length = linePoints.length;\r\n for (var i = 0; i < length - 1; i++) {\r\n\r\n p0 = i == 0 ? linePoints[0] : linePoints[i - 1];\r\n p1 = linePoints[i];\r\n p2 = linePoints[i + 1];\r\n p3 = i + 2 < length ? linePoints[i + 2] : p2;\r\n\r\n d1 = Math.sqrt(Math.pow(p0[0] - p1[0], 2) + Math.pow(p0[1] - p1[1], 2));\r\n d2 = Math.sqrt(Math.pow(p1[0] - p2[0], 2) + Math.pow(p1[1] - p2[1], 2));\r\n d3 = Math.sqrt(Math.pow(p2[0] - p3[0], 2) + Math.pow(p2[1] - p3[1], 2));\r\n\r\n // Catmull-Rom to Cubic Bezier conversion matrix\r\n\r\n // A = 2d1^2a + 3d1^a * d2^a + d3^2a\r\n // B = 2d3^2a + 3d3^a * d2^a + d2^2a\r\n\r\n // [ 0 1 0 0 ]\r\n // [ -d2^2a /N A/N d1^2a /N 0 ]\r\n // [ 0 d3^2a /M B/M -d2^2a /M ]\r\n // [ 0 0 1 0 ]\r\n\r\n d3powA = Math.pow(d3, alpha);\r\n d3pow2A = Math.pow(d3, 2 * alpha);\r\n d2powA = Math.pow(d2, alpha);\r\n d2pow2A = Math.pow(d2, 2 * alpha);\r\n d1powA = Math.pow(d1, alpha);\r\n d1pow2A = Math.pow(d1, 2 * alpha);\r\n\r\n A = 2 * d1pow2A + 3 * d1powA * d2powA + d2pow2A;\r\n B = 2 * d3pow2A + 3 * d3powA * d2powA + d2pow2A;\r\n N = 3 * d1powA * (d1powA + d2powA);\r\n if (N > 0) {\r\n N = 1 / N;\r\n }\r\n\r\n M = 3 * d3powA * (d3powA + d2powA);\r\n if (M > 0) {\r\n M = 1 / M;\r\n }\r\n\r\n bp1 = [\r\n (-d2pow2A * p0[0] + A * p1[0] + d1pow2A * p2[0]) * N,\r\n (-d2pow2A * p0[1] + A * p1[1] + d1pow2A * p2[1]) * N\r\n ];\r\n\r\n bp2 = [\r\n (d3pow2A * p1[0] + B * p2[0] - d2pow2A * p3[0]) * M,\r\n (d3pow2A * p1[1] + B * p2[1] - d2pow2A * p3[1]) * M\r\n ];\r\n\r\n if (bp1[0] == 0 && bp1[1] == 0) {\r\n bp1 = p1;\r\n }\r\n\r\n if (bp2[0] == 0 && bp2[1] == 0) {\r\n bp2 = p2;\r\n }\r\n\r\n //d += 'C' + bp1[0] + ',' + bp1[1] + ' ' + bp2[0] + ',' + bp2[1] + ' ' + p2[0] + ',' + p2[1] + ' ';\r\n\r\n\r\n points.push([bp1[0], bp1[1]]);\r\n points.push([bp2[0], bp2[1]]);\r\n points.push([p2[0], p2[1]]);\r\n }\r\n\r\n return points;\r\n }\r\n\r\n bSplineLinePoints(linePoints: number[][]): number[][] {\r\n let i, t, ax, ay, bx, by, cx, cy, dx, dy, lat, lng;\r\n const points: number[][] = [];\r\n\r\n for (i = 2; i < linePoints.length - 2; i++) {\r\n for (t = 0; t < 1; t += 0.2) {\r\n ax = (-linePoints[i - 2][0] + 3 * linePoints[i - 1][0] - 3 * linePoints[i][0] + linePoints[i + 1][0]) / 6;\r\n ay = (-linePoints[i - 2][1] + 3 * linePoints[i - 1][1] - 3 * linePoints[i][1] + linePoints[i + 1][1]) / 6;\r\n\r\n bx = (linePoints[i - 2][0] - 2 * linePoints[i - 1][0] + linePoints[i][0]) / 2;\r\n by = (linePoints[i - 2][1] - 2 * linePoints[i - 1][1] + linePoints[i][1]) / 2;\r\n\r\n cx = (-linePoints[i - 2][0] + linePoints[i][0]) / 2;\r\n cy = (-linePoints[i - 2][1] + linePoints[i][1]) / 2;\r\n\r\n dx = (linePoints[i - 2][0] + 4 * linePoints[i - 1][0] + linePoints[i][0]) / 6;\r\n dy = (linePoints[i - 2][1] + 4 * linePoints[i - 1][1] + linePoints[i][1]) / 6;\r\n\r\n lat = (ax * Math.pow(t + 0.1, 3)) + (bx * Math.pow(t + 0.1, 2)) + (cx * (t + 0.1)) + dx;\r\n lng = (ay * Math.pow(t + 0.1, 3)) + (by * Math.pow(t + 0.1, 2)) + (cy * (t + 0.1)) + dy;\r\n\r\n points.push([lat, lng]);\r\n }\r\n }\r\n\r\n return points;\r\n }\r\n\r\n // Credit: mourner.github.io/simplify-js\r\n simplifyRoute(points: number[][], tolerance: number, highestQuality: boolean): number[][] {\r\n performance.mark(\"simplifyRoute\");\r\n\r\n if (points.length <= 2) {\r\n return points;\r\n }\r\n\r\n const sqTolerance = tolerance !== undefined ? tolerance * tolerance : 1;\r\n\r\n points = highestQuality ? points : this.simplifyRadialDist(points, sqTolerance);\r\n points = this.simplifyDouglasPeucker(points, sqTolerance);\r\n\r\n performance.measure(\"simplifyRoute\");\r\n\r\n return points;\r\n }\r\n\r\n // simplification using Ramer-Douglas-Peucker algorithm\r\n private simplifyDouglasPeucker(points: number[][], sqTolerance: number) {\r\n const last = points.length - 1;\r\n\r\n const simplified = [points[0]];\r\n this.simplifyDPStep(points, 0, last, sqTolerance, simplified);\r\n simplified.push(points[last]);\r\n\r\n return simplified;\r\n }\r\n\r\n private simplifyDPStep(points: number[][], first: number, last: number, sqTolerance: number, simplified: number[][]) {\r\n let maxSqDist = 0,\r\n index = 0;\r\n\r\n for (let i = first + 1; i < last; i++) {\r\n const sqDist = this.getSqSegDist(points[i], points[first], points[last]);\r\n\r\n if (sqDist > maxSqDist) {\r\n index = i;\r\n maxSqDist = sqDist;\r\n }\r\n }\r\n\r\n if (maxSqDist > sqTolerance) {\r\n if (index - first > 1) {\r\n this.simplifyDPStep(points, first, index, sqTolerance, simplified);\r\n }\r\n\r\n simplified.push(points[index]);\r\n\r\n if (last - index > 1) {\r\n this.simplifyDPStep(points, index, last, sqTolerance, simplified);\r\n }\r\n }\r\n }\r\n\r\n private getSqDist(p1: number[], p2: number[]) {\r\n\r\n const dx = p1[0] - p2[0];\r\n const dy = p1[1] - p2[1];\r\n\r\n return dx * dx + dy * dy;\r\n }\r\n\r\n // square distance from a point to a segment\r\n private getSqSegDist(p: number[], p1: number[], p2: number[]) {\r\n let x = p1[0];\r\n let y = p1[1];\r\n let dx = p2[0] - x;\r\n let dy = p2[1] - y;\r\n\r\n if (dx !== 0 || dy !== 0) {\r\n const t = ((p[0] - x) * dx + (p[1] - y) * dy) / (dx * dx + dy * dy);\r\n\r\n if (t > 1) {\r\n x = p2[0];\r\n y = p2[1];\r\n\r\n }\r\n else if (t > 0) {\r\n x += dx * t;\r\n y += dy * t;\r\n }\r\n }\r\n\r\n dx = p[0] - x;\r\n dy = p[1] - y;\r\n\r\n return dx * dx + dy * dy;\r\n }\r\n\r\n simplifyLatlngs(latLngs: google.maps.LatLng[], tolerance: number, highestQuality: boolean): google.maps.LatLng[] {\r\n var points: number[][] = [];\r\n\r\n for (var i = 0; i < latLngs.length; i++) {\r\n const latLng = latLngs[i];\r\n points.push([latLng.lat(), latLng.lng()]);\r\n }\r\n\r\n points = this.simplifyRoute(points, tolerance, highestQuality);\r\n\r\n latLngs = [];\r\n\r\n for (var i = 0; i < points.length; i++) {\r\n const point = points[i];\r\n latLngs.push(new google.maps.LatLng(point[0], point[1]));\r\n }\r\n\r\n return latLngs;\r\n }\r\n\r\n // BigInt version\r\n getPointsFromEncodedString(encodedLine: string): number[][] {\r\n\r\n // Use native where possible\r\n if (window[\"BigInt\"]) {\r\n return this.getPointsFromEncodedStringNative(encodedLine);\r\n }\r\n\r\n performance.mark(\"getPointsFromEncodedString\");\r\n const EncodingString = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-\";\r\n\r\n var points: number[][] = [];\r\n\r\n if (!encodedLine) {\r\n return points;\r\n }\r\n\r\n var index = 0;\r\n var xsum = 0;\r\n var ysum = 0;\r\n\r\n while (index < encodedLine.length) {\r\n var n = bigInt.zero;\r\n var k = 0;\r\n\r\n while (true) {\r\n if (index >= encodedLine.length) {\r\n return points;\r\n }\r\n\r\n var b = EncodingString.indexOf(encodedLine[index++]);\r\n\r\n if (b == -1) {\r\n return points;\r\n }\r\n\r\n n = n.or(bigInt(b & 31).shiftLeft(k));\r\n\r\n k += 5;\r\n if (b < 32) {\r\n break;\r\n }\r\n }\r\n\r\n var diagonal = Math.floor((Math.sqrt(8 * n.toJSNumber() + 5) - 1) / 2);\r\n\r\n n = n.subtract(diagonal * (diagonal + 1) / 2);\r\n\r\n var ny = n.toJSNumber();\r\n var nx = diagonal - ny;\r\n\r\n nx = (nx >> 1) ^ -(nx & 1);\r\n ny = (ny >> 1) ^ -(ny & 1);\r\n\r\n xsum += nx;\r\n ysum += ny;\r\n\r\n points.push([ysum * 0.00001, xsum * 0.00001]);\r\n }\r\n\r\n performance.measure(\"getPointsFromEncodedString\");\r\n\r\n var countNow = points.length;\r\n points = this.simplifyRoute(points, 0.00001, true);\r\n var reduction = countNow - points.length;\r\n\r\n return points;\r\n }\r\n\r\n // basic distance-based simplification\r\n private simplifyRadialDist(points: number[][], sqTolerance: number) {\r\n\r\n let prevPoint = points[0];\r\n let point = points[0];\r\n\r\n const newPoints = [prevPoint];\r\n\r\n for (var i = 1, len = points.length; i < len; i++) {\r\n point = points[i];\r\n\r\n if (this.getSqDist(point, prevPoint) > sqTolerance) {\r\n newPoints.push(point);\r\n prevPoint = point;\r\n }\r\n }\r\n\r\n if (prevPoint !== point) {\r\n newPoints.push(point);\r\n }\r\n\r\n return newPoints;\r\n }\r\n\r\n getPointsFromEncodedStringNative(encodedLine) {\r\n\r\n var points = [];\r\n\r\n if (!encodedLine) {\r\n return points;\r\n }\r\n\r\n const EncodingString = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-\";\r\n\r\n var index = 0;\r\n var xsum = 0;\r\n var ysum = 0;\r\n\r\n const bigInt0 = BigInt(0);\r\n const bigInt1 = BigInt(1);\r\n const bigInt2 = BigInt(2);\r\n const bigInt5 = BigInt(5);\r\n const bigInt31 = BigInt(31);\r\n const bigInt32 = BigInt(32);\r\n\r\n while (index < encodedLine.length) {\r\n var n = bigInt0;\r\n var k = bigInt0;\r\n\r\n while (true) {\r\n if (index >= encodedLine.length) {\r\n return points;\r\n }\r\n\r\n var b = BigInt(EncodingString.indexOf(encodedLine[index++]));\r\n\r\n if (b === -1) {\r\n return points;\r\n }\r\n\r\n n |= (b & bigInt31) << k;\r\n k += bigInt5;\r\n\r\n if (b < bigInt32) {\r\n break;\r\n }\r\n }\r\n\r\n var diagonal = BigInt(Math.floor(((Math.sqrt(8 * Number(n) + 5) - 1) / 2)));\r\n\r\n n -= BigInt(diagonal * (diagonal + bigInt1) / bigInt2);\r\n\r\n var ny = n;\r\n var nx = diagonal - ny;\r\n\r\n nx = (nx >> bigInt1) ^ -(nx & bigInt1);\r\n ny = (ny >> bigInt1) ^ -(ny & bigInt1);\r\n\r\n xsum += Number(nx);\r\n ysum += Number(ny);\r\n\r\n points.push([ysum * 0.00001, xsum * 0.00001]);\r\n }\r\n\r\n return points;\r\n }\r\n\r\n // Todo: Move to map service?\r\n convertArrayToGoogleLatLng(plots: number[][]): google.maps.LatLng[] {\r\n if (!plots) {\r\n return [];\r\n }\r\n\r\n const latLngList: google.maps.LatLng[] = [];\r\n\r\n for (let i = 0; i < plots.length; i++) {\r\n const plot = plots[i];\r\n\r\n const latLng = new google.maps.LatLng(plot[0], plot[1]);\r\n latLngList.push(latLng);\r\n }\r\n\r\n return latLngList;\r\n }\r\n\r\n // Todo: Move to map service?\r\n convertPlotsToGoogleLatLng(plots: IPlot[]): google.maps.LatLng[] {\r\n if (!plots) {\r\n return [];\r\n }\r\n\r\n const latLngList: google.maps.LatLng[] = [];\r\n\r\n for (let i = 0; i < plots.length; i++) {\r\n const plot = plots[i];\r\n\r\n const latLng = new google.maps.LatLng(plot.Latitude, plot.Longitude);\r\n latLngList.push(latLng);\r\n }\r\n\r\n return latLngList;\r\n }\n\n private getUsersLocation() {\n navigator.geolocation.getCurrentPosition(\n location => {\n this.userLocation = location;\n });\n }\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { IVehiclePeripheralMapping } from \"@app/interfaces/IVehiclePeripheralMapping\";\r\nimport { DataCacheService } from \"@app/services/caching/data-cache.service\";\r\nimport { Observable } from \"rxjs\";\r\nimport { map } from \"rxjs/operators\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FoundationVehiclesService {\r\n\r\n private activeVehiclesCacheName: string = \"activeVehiclesCache\";\r\n private allVehiclesCacheName: string = \"allVehiclesCache\";\r\n\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly dataCacheService: DataCacheService\r\n ) { }\r\n\r\n getVehicles(activeOnly: boolean = false, invalidateCache = false): Observable {\r\n const cacheToRetrieve = activeOnly ? this.activeVehiclesCacheName : this.allVehiclesCacheName;\r\n return this.dataCacheService.getOrRequest(cacheToRetrieve, () => this.getVehiclesFromDb(activeOnly), { invalidateCache });\r\n }\r\n\r\n getVehicle(vehicleId: number): Observable {\r\n return this.http.get(`/api/foundation/vehicles/${vehicleId}`);\r\n }\r\n\r\n getVehiclesExtended(): Observable {\r\n return this.http.get(`/api/foundation/vehicles/extendedinfo/`);\r\n }\r\n\r\n getPeripheralMapping(serial: string): Observable {\r\n return this.http.get(`/api/foundation/vehicles/peripheral/${serial}`);\r\n }\r\n\r\n getVehicleUnitLocation(vehicleId: number): Observable {\r\n return this.http.get(`/api/foundation/vehicles/${vehicleId}/unitlocation`, {responseType: 'text'});\r\n }\r\n\r\n createUpdateVehicle(vehicle: IVehicle): Observable {\r\n return this.http.post(`/api/foundation/vehicles/`, vehicle);\r\n }\r\n\r\n updateVehicleData(vehicle: IVehicle): Observable {\r\n return this.http.post(`/api/foundation/vehicles/updatevehicledata`, vehicle);\r\n }\r\n\r\n getVehiclesForAccount(accountId: number): Observable {\r\n return this.getVehicles().pipe(map(vehicles => {\r\n return vehicles.filter(vehicle => Number(vehicle.AccountId) === Number(accountId));\r\n }))\r\n }\r\n\r\n createVehicleMap(vehicles: IVehicle[]): Map {\r\n return new Map(vehicles.map(a => [a.Id, a]));\r\n }\r\n\r\n doesVehicleExist(accountId: number, vehicleReg: string): Observable {\r\n return this.http.get(`/api/foundation/vehicles/vehicleexists/${accountId}/${vehicleReg}`); \r\n }\r\n\r\n private getVehiclesFromDb(activeOnly: boolean = false): Observable {\r\n return this.http.get(`/api/foundation/vehicles/`, { params: { activeVehiclesOnly: activeOnly } });\r\n }\r\n}\r\n","import { IKeyValuePair } from \"@interfaces/IKeyValuePair\";\r\n\r\nexport class EnumService {\r\n\r\n static enumCache: IKeyValuePair[][] = [];\r\n\r\n static getItemsForSelect(enumType: any): IKeyValuePair[] {\r\n const items = this.getNames(enumType).map(name => {\r\n const selectListItem: IKeyValuePair = {\r\n name: name,\r\n value: enumType[name]\r\n }\r\n\r\n return selectListItem;\r\n });\r\n\r\n items.sort((x, y) => { return x.name.localeCompare(y.name); });\r\n\r\n return items;\r\n }\r\n\r\n static getNames(e: T): string[] {\r\n return Object.keys(e).filter(key => isNaN(+key));\r\n }\r\n\r\n public static enumToArray(enumName: string, enumeration: T): IKeyValuePair[] {\r\n if (this.enumCache[enumName]) {\r\n\r\n return this.enumCache[enumName];\r\n }\r\n\r\n const list: IKeyValuePair[] = [];\r\n\r\n for (var n in enumeration) {\r\n if (typeof enumeration[n] === 'number') {\r\n list.push({\r\n name: n,\r\n value: enumeration[n] as any\r\n });\r\n }\r\n }\r\n\r\n list.sort((one, two) => (one.name > two.name ? 1 : -1))\r\n\r\n this.enumCache[enumName] = list;\r\n\r\n return list;\r\n }\r\n}\r\n","import { ITagDriverMapping } from \"@app/interfaces/ITag\";\r\nimport { ICombinedPreferences } from \"@interfaces/ICombinedPreferences\";\r\nimport { IDateParameters } from \"@interfaces/IDateParameters\";\r\nimport { IDriver } from \"@interfaces/IDriver\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport * as angular from \"angular\";\r\nimport \"angular-material\";\r\nimport * as moment from \"moment\";\r\nimport { SettingsName } from \"../class/SettingsName\";\r\nimport { CacheService } from \"./cache.Service\";\r\nimport { ConstantsService } from \"./constantsService\";\r\nimport { DisplayService } from \"./display.service\";\r\nimport { SessionService } from \"./session.service\";\r\nimport { IDriverTachoHours } from \"./tacho.service\";\r\nimport { TagResourceType, TagsService } from \"./tags.service\";\r\n\r\nexport interface IGetDriverOptions {\r\n includeTags?: boolean;\r\n\r\n invalidateCache?: boolean;\r\n}\r\n\r\nexport class DriverService {\r\n userOptions: ICombinedPreferences;\r\n isDemoSite: boolean;\r\n private cacheName = \"driverCache\";\r\n\r\n static $inject = [\"$q\", \"$http\", \"cacheService\", \"tagsService\", \"sessionService\", \"displayService\", \"constantsService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $http: angular.IHttpService,\r\n private readonly cacheService: CacheService,\r\n private readonly tagsService: TagsService,\r\n private readonly sessionService: SessionService,\r\n private readonly displayService: DisplayService,\r\n private readonly constantsService: ConstantsService,\r\n private readonly translationService: TranslationService) {\r\n\r\n this.isDemoSite = this.constantsService.getIsDemoSite();\r\n this.cacheService.createCache(this.cacheName, { maxAge: 30 * 60 * 1000 });\r\n }\r\n\r\n private getDateRange(\r\n startDate: Date | moment.Moment,\r\n endDate?: Date | moment.Moment\r\n ): IDateParameters {\r\n const startMoment = moment(startDate).startOf(\"day\");\r\n const endMoment = moment(endDate || startDate).startOf(\"day\");\r\n\r\n endMoment.add(1, \"day\");\r\n\r\n const params: IDateParameters = {\r\n start: startMoment.utc().format(),\r\n end: endMoment.utc().format(),\r\n };\r\n\r\n return params;\r\n }\r\n\r\n getCachedDriver(driverId: number): IDriver {\r\n var cachedDrivers = this.cacheService.get(this.cacheName);\r\n\r\n if (cachedDrivers == null || cachedDrivers.length == 0) {\r\n console.warn(\"No cached drivers\", driverId);\r\n return null;\r\n }\r\n\r\n for (let i = 0; i < cachedDrivers.length; i++) {\r\n const driver = cachedDrivers[i];\r\n\r\n if (driverId === driver.Id) {\r\n return driver;\r\n }\r\n }\r\n\r\n console.warn(\"Couldnt find driver\", driverId);\r\n\r\n return null;\r\n }\r\n\r\n getDrivers(options?: IGetDriverOptions): angular.IPromise {\r\n this.getUserOptions();\r\n\r\n const driversPromise = this.cacheService.getOrRetrieveData(this.cacheName, () => this.getDriversFromDatabase(), options?.invalidateCache).then((drivers) => {\r\n return this.labelInactive(drivers);\r\n });\r\n\r\n const tagMappingPromise = options?.includeTags ? this.tagsService.getTagDriverMappings({}, options?.invalidateCache) : this.$q.when([]);\r\n\r\n return this.$q\r\n .all([tagMappingPromise, driversPromise])\r\n .then(([tagMappings, drivers]) => {\r\n\r\n this.tagsService.mapTagMappingsToResources(tagMappings, drivers, TagResourceType.Driver);\r\n\r\n return drivers;\r\n });\r\n }\r\n\r\n private labelInactive(drivers: IDriver[]): IDriver[] {\r\n if (this.userOptions?.ShowInactiveDrivers?.Value) {\r\n drivers.forEach((driver) => {\r\n driver.DisplayName =\r\n driver.Status === 0\r\n ? this.translationService.t('driverService.inactiveDriver', driver.Name)\r\n : driver.Name;\r\n });\r\n\r\n return drivers;\r\n }\r\n else {\r\n const activeDriverList: IDriver[] = [];\r\n\r\n for (let i = 0; i < drivers.length; i++) {\r\n const driver = drivers[i];\r\n\r\n // If driver is active include it\r\n if (driver.Status === 1) {\r\n driver.DisplayName = driver.Name;\r\n activeDriverList.push(driver);\r\n }\r\n }\r\n\r\n return activeDriverList;\r\n }\r\n }\r\n\r\n getDriver(id: number, options?: IGetDriverOptions): angular.IPromise {\r\n\r\n const driverPromise = this.$http({\r\n url: `/api/drivers/${id}`,\r\n method: \"GET\",\r\n }).then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n\r\n const tagMappingPromise = options?.includeTags ? this.tagsService.getTagDriverMappings({ DriverId: id }, options?.invalidateCache) : this.$q.when([]);\r\n\r\n return this.$q\r\n .all([tagMappingPromise, driverPromise])\r\n .then(([tagMappings, driver]) => {\r\n\r\n this.tagsService.mapTagMappingsToResources(tagMappings, [driver], TagResourceType.Driver);\r\n\r\n return driver;\r\n });\r\n }\r\n\r\n // Todo: Move to tacho service?\r\n getDriversTacho(): angular.IPromise {\r\n return this.$http({\r\n url: \"/api/drivers/tacho\",\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 5 }\r\n }).then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n // Todo: Move to tacho service?\r\n getCurrentTachoForDriver(\r\n driverId: number\r\n ): angular.IPromise {\r\n if (!driverId) {\r\n //driverId = -1;\r\n return this.$q.reject();\r\n }\r\n\r\n return this.$http\r\n .get(`/api/drivers/${driverId}/tacho/latest`)\r\n .then(\r\n (\r\n response: angular.IHttpPromiseCallbackArg\r\n ) => {\r\n return response.data;\r\n }\r\n );\r\n }\r\n\r\n findDriver(drivers: IDriver[], driverId: number): IDriver {\r\n for (let driverIndex = 0; driverIndex < drivers.length; driverIndex++) {\r\n const driver = drivers[driverIndex];\r\n\r\n if (driver.Id === driverId) {\r\n return driver;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n findDriverByName(drivers: IDriver[], driverToFind: string): IDriver {\r\n const lowerCaseName = driverToFind.toLowerCase().trim();\r\n\r\n for (let i = 0; i < drivers.length; i++) {\r\n const driver = drivers[i];\r\n\r\n if (driver.DisplayName.toLowerCase().trim() === lowerCaseName) {\r\n return driver;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n driverSearchPredicate(driver: IDriver, searchString: string): boolean {\r\n return driver.DisplayName.toLowerCase().includes(searchString);\r\n }\r\n\r\n searchDrivers(drivers: IDriver[], text: string) {\r\n return drivers.filter(v => this.driverSearchPredicate(v, text));\r\n }\r\n\r\n updateDriver(driver: IDriver, invalidateCache = false) {\r\n driver.FirstName = null;\r\n driver.LastName = null;\r\n\r\n return this.$http({\r\n url: `/api/drivers/`,\r\n method: \"POST\",\r\n data: driver,\r\n params: { invalidateCache }\r\n }).then((result: angular.IHttpPromiseCallbackArg) => {\r\n\r\n if ((!driver.Id || driver.Id === 0) && result.data) {\r\n driver.Id = result.data;\r\n }\r\n\r\n return this.tagsService.saveResourceTags(driver, TagResourceType.Driver).then(() => {\r\n\r\n this.updateOrInsertDriverCache(driver);\r\n\r\n return driver.Id;\r\n });\r\n });\r\n }\r\n\r\n updateOrInsertDriverCache(driver: IDriver): void {\r\n this.cacheService.addOrUpdateItem(this.cacheName, driver, (v1, v2) => v1.Id == v2.Id);\r\n }\r\n\r\n private getDriverCacheIndex(\r\n driver: IDriver,\r\n driversCache: IDriver[]\r\n ): number {\r\n for (let i = 0; i < driversCache.length; i++) {\r\n if (driversCache[i].Id === driver.Id) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n isDriverUsernameInUse(username: string) {\r\n const promise = this.$http({\r\n url: `/api/drivers/isDriverUsernameInUse`,\r\n method: \"GET\",\r\n params: { username: username },\r\n }).then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n deactivateDriver(driver: IDriver) {\r\n const promise = this.$http({\r\n url: `/api/drivers/${driver.Id}`,\r\n method: \"DELETE\",\r\n });\r\n\r\n this.updateOrInsertDriverCache({ ...driver, Status: 0 });\r\n\r\n return promise;\r\n }\r\n\r\n reactivateDriver(driver: IDriver) {\r\n driver.Status = 1;\r\n\r\n const promise = this.$http({\r\n method: \"POST\",\r\n url: \"/api/drivers\",\r\n data: driver,\r\n }).then((result: angular.IHttpPromiseCallbackArg) => {\r\n\r\n this.updateOrInsertDriverCache(driver);\r\n\r\n return result.data;\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n getDriverImage(driver: IDriver): angular.IPromise {\r\n const promise = this.$http({\r\n url: `/api/drivers/${driver.Id}/image`,\r\n method: \"Get\",\r\n }).then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n saveDriverImage(\r\n driverId: number,\r\n base64ImageString: string\r\n ): angular.IPromise {\r\n return this.$http({\r\n url: `/api/drivers/${driverId}/image`,\r\n method: \"POST\",\r\n data: base64ImageString ? `\"${base64ImageString}\"` : null,\r\n });\r\n }\r\n\r\n // ---------------------------------------------------\r\n\r\n private getDriversFromDatabase(): angular.IPromise {\r\n return this.$http({\r\n url: \"/api/drivers\",\r\n method: \"GET\",\r\n }).then((response: angular.IHttpPromiseCallbackArg) => {\r\n // Filter out blank phone numbers\r\n response.data.forEach((driver, i) => {\r\n if (\r\n driver.Mobile != null &&\r\n driver.Mobile.match(/^ *$/) !== null\r\n ) {\r\n driver.Mobile = null;\r\n }\r\n\r\n if (this.isDemoSite) {\r\n this.censorDriverName(driver, i + 1);\r\n }\r\n });\r\n\r\n this.cacheService.save(this.cacheName, response.data);\r\n\r\n return response.data;\r\n });\r\n }\r\n\r\n private censorDriverName(driver: IDriver, idx: number) {\r\n driver.Name = this.translationService.t('driverName', idx);\r\n }\r\n\r\n private getUserOptions() {\r\n if (this.userOptions) {\r\n return;\r\n }\r\n\r\n this.userOptions = this.sessionService.getItem(\r\n SettingsName.UserOptions\r\n );\r\n }\r\n}\r\n","export enum ReportTableRowDataSource\r\n{\r\n None,\r\n UseExisting,\r\n Day,\r\n Week,\r\n Driver,\r\n Vehicle,\r\n DriverGroup,\r\n VehicleGroup,\r\n Journey,\r\n Geofence,\r\n Route,\r\n TemperatureRecord,\r\n StationaryLocations,\r\n GeofenceVisits,\r\n TrailerAssociation,\r\n CommonEvent,\r\n TachoRecord,\r\n AlcolockRecord,\r\n RoadType,\r\n TemperatureOutOfBoundsRecord,\r\n VehicleInput,\r\n Tag,\r\n CameraEvent,\r\n VehicleDepot,\r\n FormSubmission\r\n}\r\n","import { VButtonStatus } from \"@directives/_forms/v-input/v-input.component\";\r\nimport { ManualTests } from \"@foundation/_services/manual-device-validation-check.service\";\r\nimport { IUser } from \"@interfaces/IUser\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { IAccount } from \"@services/account.service\";\r\nimport { IPeripheral, IUnit } from \"@interfaces/IPeripheral\";\r\nimport { AampSimStatus, Category, DriverIdType, EngineerCommissionStatus, EngineerJobItemStatus, EngineerJobItemType, IAampAlarmType, IgnitionType, NonTestableDevices, TachoType, CommissioningCheckType, ValidationResult, ImportStrategyReference, ImportType } from \"./foundation.enums\";\r\nimport { IEngineerJobBookingMapping } from \"./_models/IEngineerJobBookingMapping\";\r\nimport { ValidationCheck } from \"./_services/device-data-validation.service\";\r\nimport { ProductVendor } from \"@app/main/components/videos/enums/CameraProductType\";\r\nimport { IUserGroup } from \"./_models/IUserGroup\";\r\nimport { ISim, SimType } from \"@app/interfaces/ISim\";\r\nimport { ISerialSearchResponse } from \"./_models/ISerialSearchResponse\";\r\nimport { ISimMapping } from \"@app/interfaces/ISimMapping\";\r\nimport { ErrorType } from \"./_enums/ErrorType\";\r\n\r\nexport interface IEngineer {\r\n Id: number;\r\n UserId: number;\r\n Name: string;\r\n Username: string;\r\n Password: string;\r\n Mobile: string;\r\n Status: number;\r\n GroupId: number;\r\n Colour: string;\r\n FitterId: number;\r\n AdminId?: number;\r\n}\r\n\r\nexport interface IEngineerJobBooking {\r\n Id?: number;\r\n SiteId?: number;\r\n JobId?: number;\r\n StartUtc?: Date;\r\n EndUtc?: Date;\r\n Description?: string;\r\n}\r\n\r\nexport interface IEngineerJobBookingWithEngineerMappings extends IEngineerJobBooking {\r\n mappings?: IEngineerJobBookingMapping[];\r\n assignedEngineers?: IUser[];\r\n assignedGroupId?: number;\r\n assignedGroup?: IUserGroup;\r\n\r\n}\r\n\r\nexport interface IEngineerCommission {\r\n Id?: number;\r\n AccountId?: number;\r\n UserId?: number;\r\n EngineerUserId?: number;\r\n // Serial and IMEI of the Tracking Device within a vehicle\r\n Serial?: string;\r\n Imei?: string;\r\n\r\n // Use this to store peripherals for commission submission\r\n //pendingUnitsAndPeripherals?: IUnit[];\r\n pendingCommissionChanges: ICommissionUnitChanges[];\r\n Peripherals?: string[];\r\n\r\n // Legacy fields\r\n CameraId?: string;\r\n VehicleId?: number;\r\n DigidlId?: string;\r\n CanbusId?: string;\r\n FmiId?: string;\r\n TdtId?: string;\r\n\r\n Chargeable?: boolean;\r\n ChargeReason?: string\r\n Pto?: boolean;\r\n PtoInputState?: string;\r\n PtoDescription?: string;\r\n DriverIdType?: DriverIdType;\r\n TachoType?: TachoType;\r\n Cost?: number;\r\n VoltDropper?: boolean;\r\n VisitReasonId?: EngineerJobItemType;\r\n Accelerometer?: boolean;\r\n Satfix?: number;\r\n UnitLocation?: string;\r\n IgnitionState?: IgnitionType;\r\n LeftOnSite?: boolean;\r\n AdminId?: number;\r\n CommissionNumber?: number;\r\n JobNumber?: number;\r\n JobItemId?: number;\r\n Status?: EngineerCommissionStatus;\r\n Timestamp?: Date;\r\n EngineerId?: number;\r\n Model?: string;\r\n ShortReg?: string;\r\n Client?: string;\r\n Odometer?: number;\r\n VisitReason?: string;\r\n Comments?: string;\r\n MessagingId?: string;\r\n Make?: string;\r\n Duration?: number;\r\n Metadata?: ICommissionMetadata;\r\n // -----\r\n\r\n type?: EngineerJobItemType;\r\n vehicle?: IVehicle;\r\n simICCID?: string;\r\n configId?: number;\r\n engineerName?: string;\r\n engineerUser?: IUser;\r\n internalUser?: IUser;\r\n accountCompanyName?: string;\r\n account?: IAccount;\r\n dirtyCameraId?: string;\r\n vehicleDetailsConfirmed?: boolean;\r\n existingHardwareAcquired?: boolean;\r\n deviceValidationCheckRecordIds?: number[];\r\n}\r\n\r\nexport interface ICommissionMetadata {\r\n Duration?: number;\r\n DeviceTests?: IAddedDevice[];\r\n RevisitRequired?: boolean;\r\n ChargableComments?: string;\r\n NoFaultFound?: boolean;\r\n}\r\nexport interface IAddedDevice {\r\n TestResults?: IValidationResultCategory[];\r\n faultFlagged: boolean;\r\n faultComments: string;\r\n}\r\n\r\nexport interface IEngineerJob {\r\n Id?: number;\r\n AccountId?: number;\r\n Description?: string;\r\n Status?: EngineerJobStatus;\r\n CustomerInstruction?: string;\r\n EngineerInstruction?: string;\r\n DealId?: number;\r\n CreatedDate?: Date;\r\n\r\n // ----\r\n\r\n account?: IAccount;\r\n vehicle?: IVehicle;\r\n engineer?: IUser;\r\n\r\n jobBooking?: IEngineerJobBookingWithEngineerMappings;\r\n}\r\n\r\nexport interface IEngineerJobItem {\r\n Id?: number;\r\n JobId?: number;\r\n Type?: EngineerJobItemType;\r\n VId?: number;\r\n PackageId?: number;\r\n Status?: EngineerJobItemStatus;\r\n VehicleId?: number;\r\n Comments?: string;\r\n DealId?: number;\r\n\r\n // ----\r\n\r\n vehicle?: IVehicle\r\n account?: IAccount;\r\n commission?: IEngineerCommission;\r\n statusIcon?: string;\r\n statusIconColor?: string;\r\n}\r\n\r\nexport enum EngineerJobStatus {\r\n Open = 0,\r\n Booked = 1,\r\n Completed = 2,\r\n Cancelled = 3,\r\n OnHold = 4,\r\n ToRebook = 5,\r\n Provisional = 6,\r\n}\r\n\r\nexport interface CommissionTestObject {\r\n CommissioningCheckType: CommissioningCheckType,\r\n Category: Category,\r\n DelegateToUse: IValidationCheck\r\n}\r\n\r\nexport interface IAampAlarmData extends IAampGpsData {\r\n Type: IAampAlarmType;\r\n Content: string;\r\n CmdType: number;\r\n}\r\n\r\nexport interface IAampGpsData {\r\n GpsTime: Date;\r\n Altitude: number;\r\n Direction: number;\r\n GpsLat: number;\r\n GpsLng: number;\r\n Speed: number;\r\n RecordSpeed: number;\r\n State: number;\r\n Time: Date;\r\n TerId: string;\r\n}\r\n\r\nexport interface IAampCompiledTestObject {\r\n GpsRecords?: IAampGpsData[];\r\n AlarmRecords?: IAampAlarmData[];\r\n FootageRecords?: IDeviceDayCalendar[];\r\n}\r\n\r\nexport interface IDeviceDayCalendar {\r\n chn?: number;\r\n starttime?: Date;\r\n endtime?: Date;\r\n}\r\n\r\nexport interface IFtCloudGpsData {\r\n Serial: string,\r\n VehicleId, string,\r\n EventTime: Date,\r\n Latitude: number,\r\n Longitude: number,\r\n Sat: number,\r\n OdometerKm: number,\r\n Signal: number\r\n}\r\n\r\nexport interface IftCloudAlarmData {\r\n AlarmId?: number,\r\n AlarmType?: number,\r\n StartTime?: Date,\r\n EndTime?: Date\r\n gpsInfo?: IFtCloudAlarmGpsInfo\r\n}\r\n\r\nexport interface IFtCloudAlarmGpsInfo {\r\n Latitude?: number,\r\n Longitude?: number\r\n}\r\n\r\nexport interface IftCloudCompiledTestObject {\r\n GpsRecords?: IFtCloudGpsData[];\r\n AlarmRecords?: IftCloudAlarmData[];\r\n FootageRecords?: IFtCloudFootageHistory[];\r\n}\r\n\r\nexport interface IFtCloudFootageHistory {\r\n StartTime?: Date;\r\n EndTime?: Date;\r\n Channel?: number;\r\n}\r\n\r\nexport interface IDataCollectionMethod {\r\n dataCollectionMethod?: () => Promise;\r\n dataCollectionPromise?: Promise;\r\n\r\n data?: T;\r\n}\r\n\r\nexport interface ICommissionTestResult {\r\n testName?: string;\r\n testInfo?: string;\r\n resultStatus?: ValidationResult;\r\n}\r\n\r\nexport interface IValidationResultCategory {\r\n name?: string;\r\n checkResults?: ICommissionTestResult[];\r\n faultFlagged?: boolean;\r\n faultComments?: string;\r\n}\r\n\r\nexport interface IValidationCheckCategory extends IDataCollectionMethod {\r\n name: string;\r\n checks: IValidationCheck[];\r\n\r\n showData?: boolean;\r\n\r\n // ---\r\n\r\n statusIcon?: string;\r\n statusClass?: string;\r\n\r\n totalChecks?: number;\r\n completedChecks?: number;\r\n passingChecks?: number;\r\n warningChecks?: number;\r\n failingChecks?: number;\r\n criticalChecks?: number;\r\n\r\n faultComments?: string;\r\n}\r\n\r\nexport interface IValidationCheck extends IDataCollectionMethod/*, IValidationMethod */ {\r\n checkDescription: string;\r\n currentState?: string;\r\n information?: string;\r\n className?: string;\r\n\r\n loading?: boolean;\r\n\r\n validationMethod: (data: T) => ValidationResult;\r\n validationMessage?: string;\r\n validationResult?: ValidationResult;\r\n infoMessage?: string;\r\n\r\n createSuccessMessage?: (data: T) => string;\r\n createInfoMessage?: (data: T) => string;\r\n createErrorMessage: (data: T) => string;\r\n\r\n criticalCheck?: boolean;\r\n}\r\n\r\nexport interface IAampSimStorageStatus {\r\n LastUpdateTimeUtc: Date;\r\n TotalStorage: number;\r\n FreeStorage: number;\r\n IgnitionOn: boolean;\r\n SimStatus3G: AampSimStatus;\r\n SimStrength3G: number;\r\n SimStatus4G: AampSimStatus;\r\n SimStrength4G: number;\r\n CurrentlyRecording: boolean;\r\n}\r\n\r\nexport interface IManualTestValidation {\r\n name: string;\r\n assertion: string;\r\n testConfirmation?: ValidationResult;\r\n test: ManualTests;\r\n}\r\n\r\nexport interface IManualValidationCheckCategory {\r\n name: string;\r\n checks: IManualTestValidation[];\r\n section: NonTestableDevices;\r\n faultComments?: string;\r\n}\r\n\r\nexport interface IDeviceToAdd {\r\n serial: string;\r\n label?: string;\r\n\r\n searchResponse?: ISerialSearchResponse;\r\n categories?: IValidationCheckCategory[];\r\n manualCategories?: IManualValidationCheckCategory;\r\n\r\n inputStatus: VButtonStatus;\r\n buttonStatus: VButtonStatus;\r\n\r\n faultRecorded?: boolean;\r\n faultComments?: string;\r\n\r\n location?: string;\r\n}\r\n\r\nexport interface ICommissionUnitChanges {\r\n Unit: IUnit;\r\n CommissionResults?: IValidationResults[];\r\n faultFlagged?: boolean;\r\n faultComments?: string;\r\n\r\n // ----\r\n\r\n isCamera?: boolean;\r\n}\r\n\r\nexport interface IUserIdToNameMapping {\r\n UserId: number,\r\n Username: string,\r\n Description: string\r\n}\r\n\r\nexport interface IValidationResults {\r\n result: ValidationResult;\r\n checksRun: ValidationCheck[];\r\n}\r\n\r\nexport interface IProcessResult {\r\n IsSuccess?: boolean;\r\n ExceptionMessage?: string;\r\n Value?: any;\r\n}\r\n\r\nexport interface IImportValidationDTO {\r\n CsvString: string,\r\n ImportStrategyReference: ImportStrategyReference,\r\n ProductId?: number,\r\n SimType?: SimType,\r\n ProductGroupId?: ProductVendor,\r\n EngineerJobItemType?: EngineerJobItemType;\r\n JobId?: number;\r\n AccountId?: number;\r\n}\r\n\r\nexport interface ICsvImportValidationResultDTO {\r\n ImportStrategyReference: ImportStrategyReference,\r\n ModelsToImportJson?: string;\r\n ImportValidationErrors: ImportValidationError[],\r\n ImportType?: ImportType;\r\n MappingsToCreateJson?: string;\r\n MappingsToEndJson?: string;\r\n SimsToCreate?: ISim[];\r\n\r\n // -----------\r\n\r\n peripherals?: IPeripheral[];\r\n units?: IUnit[];\r\n engineers?: IUser[];\r\n jobItems?: IJobItemValidationResultDTO[];\r\n \r\n simMappings?: ISimMapping[];\r\n}\r\n\r\nexport interface ICsvImportCompletionDTO {\r\n ModelsToCreate?: string;\r\n ImportStrategyReference?: ImportStrategyReference,\r\n ProductGroupId?: ProductVendor,\r\n ResellerId?: number,\r\n ImportType?: ImportType\r\n MappingsToCreateJson?: string;\r\n MappingsToEndJson?: string;\r\n SimsToCreate?: ISim[];\r\n}\r\n\r\nexport interface ICsvImportCompletionResultDTO {\r\n CreatedModels?: string;\r\n ImportType?: ImportType;\r\n}\r\n\r\nexport interface ImportValidationError {\r\n LineNumber?: number,\r\n Message?: string,\r\n ErrorType?: ErrorType;\r\n Metadata?: string\r\n}\r\n\r\nexport interface IJobItemValidationResultDTO {\r\n Vehicle?: IVehicle,\r\n VehicleRequiresCreation?: boolean,\r\n EngineerJobItem?: IEngineerJobItem\r\n}\r\n\r\nexport interface SimToSerialMappings {\r\n Item1?: string,\r\n Item2?: string\r\n}\r\n","import { CommonModule } from \"@angular/common\";\r\nimport { NgModule } from \"@angular/core\";\r\nimport { UIGmapMarkersComponent } from \"@directives/_map/angularGoogleMaps/uiGmapMarkers.component\";\r\nimport { UIGmapPolygonComponent } from \"@directives/_map/angularGoogleMaps/uiGmapPolygon.component\";\r\nimport { VeriMapCurrentJourneyComponent } from \"@directives/_map/veriMap/veriMapCurrentJourney/veriMapCurrentJourney.component\";\r\nimport { UIGmapMarkerComponent } from \"./angularGoogleMaps/uiGmapMarker.component\";\r\nimport { UIGmapPolylineComponent } from \"./angularGoogleMaps/uiGmapPolyline.component\";\r\nimport { UIGmapPolylinesComponent } from \"./angularGoogleMaps/uiGmapPolylines.component\";\r\nimport { VMapComponent } from \"./v-map/v-map/v-map.component\";\r\nimport { VeriMapContainerComponentFacade } from \"./veriMap/veriMapContainer/veri-map-container.component\";\r\nimport { VeriMapJourneysNewComponent } from \"./veriMap/veriMapJourneysNew/veriMapJourneysNew.component\";\r\nimport { VeriMapSingleGeofenceComponentFacade } from \"./veriMap/veriMapSingleGeofence/v-map-single-geofence.component\";\r\n\r\nconst privateComponents: any[] = [\r\n\r\n];\r\n\r\nconst publicComponents: any[] = [\r\n UIGmapMarkersComponent,\r\n UIGmapMarkerComponent,\r\n UIGmapPolylinesComponent,\r\n UIGmapPolylineComponent,\r\n UIGmapPolygonComponent,\r\n\r\n VeriMapCurrentJourneyComponent,\r\n VeriMapJourneysNewComponent,\r\n\r\n VMapComponent\r\n];\r\n\r\nconst declarations: any[] = [\r\n VeriMapSingleGeofenceComponentFacade,\r\n VeriMapContainerComponentFacade\r\n];\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule\r\n ],\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents, ...declarations],\r\n exports: [...publicComponents, ...declarations]\r\n})\r\nexport class MapDirectivesModule {\r\n constructor() {\r\n }\r\n}\r\n","\r\nimport { VehicleType } from \"@enums/VehicleType.enum\";\r\nimport { ICombinedPreferences } from \"@interfaces/ICombinedPreferences\";\r\nimport { IGoogleMapsMarker, IGoogleMapsMarkerOptions } from \"@interfaces/IGoogleMapsMarkerOptions\";\r\nimport { IPlot, IPlotEvent, IVeriMarkerOptions } from \"@interfaces/IPlot\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { ClusterIcon, NgMapMarkerClusterer } from \"@typings/google.maps.angular\";\r\nimport * as angular from \"angular\";\r\nimport { SettingsName } from \"../class/SettingsName\";\r\nimport { SessionService } from \"./session.service\";\r\nimport { VeriDate } from \"./veriDate.service\";\r\nimport { VeriMarkerService } from \"./veriMarker.service\";\r\n\r\nexport enum MarkerAnchorPosition {\r\n Left,\r\n Top,\r\n Right,\r\n Bottom\r\n}\r\n\r\nexport enum EventMarkerType {\r\n CurrentPosition,\r\n Start,\r\n Stop\r\n}\r\n\r\nexport interface ICreateEventMarkerOptions {\r\n label: string;\r\n markerClass?: string;\r\n subIcon?: string;\r\n showLabel?: boolean;\r\n imageUrl?: string;\r\n anchorPosition?: MarkerAnchorPosition /*= MarkerAnchorPosition.Top*/;\r\n colour?: string /*= null*/;\r\n position?: google.maps.LatLngLiteral;\r\n eventType?: EventMarkerType;\r\n}\r\n\r\nexport interface LabeledMarkerOptions {\r\n label: string;\r\n id: number;\r\n lat: number;\r\n lng: number;\r\n icon?: string;\r\n model?: T;\r\n}\r\n\r\nexport class GoogleMarkerService {\r\n\r\n private markerWidth = 0;\r\n private markerHeight = 0;\r\n\r\n static $inject = [\"$q\", \"veriDate\", \"veriMarkerService\", \"sessionService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly veriDate: VeriDate,\r\n private readonly veriMarkerService: VeriMarkerService,\r\n private readonly factSession: SessionService,\r\n private readonly translationService: TranslationService ) {\r\n this.markerWidth = this.veriMarkerService.getDefaultMarkerWidth();\r\n this.markerHeight = this.veriMarkerService.getDefaultMarkerWidth();\r\n }\r\n\r\n generateMarkerPipOptions(plot: IPlot): IGoogleMapsMarkerOptions {\r\n\r\n let options: IGoogleMapsMarkerOptions = {\r\n isPip: true\r\n };\r\n\r\n const width = 12;\r\n\r\n const icon: google.maps.Icon = {\r\n url: this.veriMarkerService.generatePip(plot.Reason, width),\r\n scaledSize: new google.maps.Size(width, width),\r\n anchor: new google.maps.Point(width / 2, width / 2)\r\n }\r\n\r\n options = {\r\n icon: icon,\r\n zIndex: 1000,\r\n title: this.veriDate.formatDate(plot.UtcMoment, \"fulltime\")\r\n };\r\n\r\n return options;\r\n }\r\n\r\n generateGoogleMapsMarkerOptionsForPlot(plot: IPlot, selected?: boolean): angular.IPromise {\r\n this.veriMarkerService.createVeriMarkerOptions(plot, selected);\r\n\r\n return this.generateMarkerOptions(plot, plot.veriMarkerOptions);\r\n }\r\n\r\n generateGoogleMapsMarkerOptionsForVehicle(vehicle: IVehicle, selected?: boolean, showPlotTime: boolean = false): angular.IPromise {\r\n if (this.isMarkerOptionsSame(vehicle.Plot, selected)) {\r\n return this.$q.when(vehicle.Plot.markerModel.options);\r\n }\r\n\r\n const userOptions = this.factSession.getItem(SettingsName.UserOptions);\r\n\r\n this.veriMarkerService.createVeriMarkerOptions(vehicle.Plot, selected);\r\n\r\n if (userOptions.VehicleLabel.Value) {\r\n if (userOptions.MarkerLabel.Value === 'Vehicle') {\r\n if (userOptions.VehicleLabelText.Value == 'Registration') {\r\n vehicle.Plot.veriMarkerOptions.label = vehicle.ShortReg;\r\n }\r\n\r\n else if (userOptions.VehicleLabelText.Value === 'Label') {\r\n vehicle.Plot.veriMarkerOptions.label = vehicle.Reg;\r\n }\r\n\r\n vehicle.Plot.veriMarkerOptions.labelIsReg = vehicle.VehicleType != VehicleType.Trailer;\r\n }\r\n\r\n else if (userOptions.MarkerLabel.Value === 'Driver') {\r\n vehicle.Plot.veriMarkerOptions.label = vehicle.Driver ? vehicle.Driver.Name : this.translationService.t('googleMarkerService.noDriver');\r\n }\r\n }\r\n\r\n var optionsCopy = angular.copy(vehicle.Plot.veriMarkerOptions);\r\n\r\n return this.generateMarkerOptions(vehicle.Plot, vehicle.Plot.veriMarkerOptions).then(googleMarkerOptions => {\r\n\r\n if (optionsCopy.label) {\r\n googleMarkerOptions.labelAnchor = new google.maps.Point(40, -20);\r\n googleMarkerOptions.labelClass = \"vehicle-reg-container\";\r\n googleMarkerOptions.labelContent = `${optionsCopy.label}`;\r\n\r\n if (vehicle.attachedTrailers) {\r\n vehicle.attachedTrailers.forEach(trailer => {\r\n googleMarkerOptions.labelContent += `${trailer.Reg}`;\r\n });\r\n }\r\n\r\n if (showPlotTime) {\r\n const formattedTime: string = this.veriDate.formatDate(vehicle.Plot.Utc, \"time\");\r\n googleMarkerOptions.labelContent += `${formattedTime}`;\r\n }\r\n }\r\n\r\n return googleMarkerOptions;\r\n });\r\n }\r\n\r\n private isMarkerOptionsSame(plot: IPlot, selected: boolean) {\r\n if (!plot.markerModel) {\r\n return false;\r\n }\r\n\r\n return plot.markerModel.options && plot && plot.markerModel.options.plotId == plot.Id && plot.markerModel.options.selected == selected;\r\n }\r\n\r\n generateMarkerOptions(plot: IPlot, veriMarkerOptions: IVeriMarkerOptions): angular.IPromise {\r\n\r\n var defer = this.$q.defer();\r\n\r\n if (veriMarkerOptions == null) {\r\n plot.markerModel.options = null;\r\n defer.resolve(null);\r\n return defer.promise;\r\n }\r\n\r\n if (this.isMarkerOptionsSame(plot, veriMarkerOptions.selected)) {\r\n // May not be as important now we cache images\r\n defer.resolve(plot.markerModel.options);\r\n return defer.promise;\r\n }\r\n\r\n return this.veriMarkerService.generateMarkerImageUrl(veriMarkerOptions).then(url => {\r\n\r\n const icon: google.maps.Icon = {\r\n url: url,\r\n anchor: new google.maps.Point(this.markerWidth / 2, this.markerWidth / 2),\r\n scaledSize: new google.maps.Size(veriMarkerOptions.width || this.markerWidth, veriMarkerOptions.height || this.markerHeight)\r\n };\r\n\r\n const options: IGoogleMapsMarkerOptions = {\r\n plotId: plot.Id,\r\n selected: veriMarkerOptions.selected,\r\n icon: icon,\r\n draggable: false,\r\n visible: true,\r\n zIndex: 1000,\r\n position: { lat: plot.Latitude, lng: plot.Longitude }\r\n };\r\n\r\n if (veriMarkerOptions.time) {\r\n options.title = this.veriDate.formatDate(veriMarkerOptions.time, \"fulltime\");\r\n }\r\n\r\n if (!plot.markerModel) {\r\n plot.markerModel = {\r\n id: plot.Id,\r\n options: options\r\n };\r\n } else {\r\n plot.markerModel.options = options;\r\n }\r\n\r\n return plot.markerModel.options;\r\n });\r\n }\r\n\r\n createLabeledMarker(options: LabeledMarkerOptions): IGoogleMapsMarker {\r\n const anchorPosition = this.getEventMarkerAnchorPosition();\r\n\r\n const markerOptions: ICreateEventMarkerOptions = {\r\n label: options.label,\r\n showLabel: true,\r\n anchorPosition,\r\n position: { lat: options.lat, lng: options.lng },\r\n subIcon: options.icon\r\n }\r\n\r\n const googleMarkerOptions = this.createEventMarkerOptions(markerOptions)\r\n\r\n return { \r\n id: options.id, \r\n options: googleMarkerOptions, \r\n model: options.model \r\n };\r\n }\r\n\r\n getEventMarkerAnchorPosition(): MarkerAnchorPosition {\r\n return MarkerAnchorPosition.Top;\r\n }\r\n\r\n createEventMarker(plot: IPlot, options: ICreateEventMarkerOptions, data: any = null): IPlotEvent {\r\n const event: IPlotEvent = {\r\n plot: plot,\r\n label: options.label,\r\n id: `${plot.Id}-${plot.Utc}`,\r\n Utc: plot.Utc,\r\n icon: options.subIcon,\r\n data: data,\r\n options: null,\r\n eventType: options.eventType,\r\n buildOptions: () => {\r\n return this.createEventMarkerOptions(options);\r\n }\r\n }\r\n\r\n options.position = { lat: plot.Latitude, lng: plot.Longitude };\r\n event.options = event.buildOptions();\r\n\r\n return event;\r\n }\r\n\r\n createEventMarkerOptions(options: ICreateEventMarkerOptions): IGoogleMapsMarkerOptions {\r\n\r\n let showLabelClass = !options.showLabel ? \"hide-label\" : \"\";\r\n const style = options.colour ? `style='--color: ${options.colour}'` : \"\";\r\n let labelContent = `
`;\r\n\r\n if (options.subIcon) {\r\n labelContent += `${options.subIcon}`;\r\n }\r\n\r\n labelContent += `
`;\r\n labelContent += `
${options.label}
`;\r\n if (options.imageUrl) {\r\n labelContent += ``;\r\n }\r\n\r\n labelContent += `
`;\r\n\r\n labelContent += \"
\";\r\n\r\n if (options.anchorPosition == undefined) {\r\n options.anchorPosition = MarkerAnchorPosition.Top;\r\n }\r\n\r\n let labelClass = `marker-event-2 anchor-${MarkerAnchorPosition[options.anchorPosition].toLocaleLowerCase()}`;\r\n\r\n const markerOptions: IGoogleMapsMarkerOptions = {\r\n fillColor: \"red\",\r\n icon: \"//maps.gstatic.com/mapfiles/transparent.png\",\r\n labelClass: labelClass,\r\n labelContent: labelContent,\r\n position: options.position\r\n }\r\n\r\n return markerOptions;\r\n }\r\n\r\n createEventTooltipTable(label: string, plot?: IPlot): string {\r\n if (!plot || !plot.UtcMoment) {\r\n return label;\r\n }\r\n\r\n var plotText = `
\r\n ${label}\r\n \r\n ${this.veriDate.formatDate(plot.UtcMoment)}\r\n
`;\r\n\r\n return plotText;\r\n }\r\n\r\n addCustomClustering(ngMapMarkerClusterer: NgMapMarkerClusterer, showMethod: (clusterIcon: ClusterIcon) => void) {\r\n console.warn(\"addCustomClustering is deprecated, please use postClusterShow\");\r\n\r\n ngMapMarkerClusterer.clusters_.forEach(c => {\r\n\r\n this.updateClusterIconFunction(c.clusterIcon_, showMethod);\r\n });\r\n }\r\n\r\n // ---\r\n\r\n updateClusterIconFunction(cluster: ClusterIcon, showMethod: (clusterIcon: ClusterIcon) => void) {\r\n\r\n if (cluster._show) {\r\n return;\r\n }\r\n\r\n // Extend our prototype here\r\n cluster._show = cluster.show;\r\n cluster.show = function () {\r\n const clusterIcon: ClusterIcon = this;\r\n clusterIcon._show();\r\n\r\n showMethod(clusterIcon);\r\n }\r\n }\r\n}\r\n","\r\nexport enum GeofenceType {\r\n Polygon = 0, // dbgeograph POINT\r\n Circle = 1\r\n}\n","import { CdkVirtualScrollViewport } from \"@angular/cdk/scrolling\";\r\nimport { ChangeDetectorRef, Component, ElementRef, EventEmitter, HostBinding, Input, Output, QueryList, SimpleChanges, ViewChild, ViewChildren } from \"@angular/core\";\r\nimport { FilterBarService } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.service\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { VTableSelectionType } from \"@app/enum/VTableSelectionType\";\r\nimport { ResponsiveService } from \"@app/services/responsive.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { Observable, Subscription } from \"rxjs\";\r\nimport { VTableHeaderType } from \"../_enums/VTableHeaderType.enum\";\r\nimport { IVTable } from \"../_models/IVTable\";\r\nimport { IVTableCell } from \"../_models/IVTableCell\";\r\nimport { IVTableColumn } from \"../_models/IVTableColumn\";\r\nimport { IVTableHeader } from \"../_models/IVTableHeader\";\r\nimport { IVTableRow } from \"../_models/IVTableRow\";\r\nimport { VTableService } from \"../_services/v-table.service\";\r\nimport { VTableHeader } from \"./cells/header/v-table-header.component\";\r\nimport './v-table.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'v-table',\r\n template: require('./v-table.component.html')\r\n})\r\nexport class VTableComponent {\r\n @Input() tableRows: IVTableRow[];\r\n @Input() tableColumns: IVTableColumn[];\r\n @Input() loading: boolean;\r\n @Input() trueSize: boolean; // When set, this will set the tables height to the exact required to ensure no scrolling\r\n @Input('observable') rowDataObservable: Observable;\r\n\r\n @Input() selectionType: VTableSelectionType = VTableSelectionType.None;\r\n @HostBinding('class.clickable') @Input() clickable: boolean;\r\n @Output() rowClick = new EventEmitter();\r\n\r\n @Output() tableRowsChange = new EventEmitter();\r\n @Output() tableDisplayRowsChange = new EventEmitter();\r\n @Output() selectedRowsChange = new EventEmitter();\r\n\r\n @ViewChild(\"viewport\") viewport: CdkVirtualScrollViewport;\r\n @ViewChildren(VTableHeader) tableHeaders: QueryList;\r\n\r\n SortDirection = SortDirection;\r\n\r\n table: IVTable;\r\n selectedRows: IVTableRow[];\r\n\r\n vTableSelectionType = VTableSelectionType;\r\n\r\n subscriptions = new Subscription();\r\n\r\n allRowsSelected: boolean;\r\n rowHeight: number = 38;\r\n\r\n showCheckboxColumn: boolean;\r\n\r\n currentWidth: number;\r\n canEditColumns: boolean = false;\r\n showColumnEditor: boolean = false;\r\n\r\n private visibilityObserver: IntersectionObserver;\r\n constructor(\r\n private readonly cd: ChangeDetectorRef,\r\n private readonly el: ElementRef,\r\n private readonly filterBarService: FilterBarService,\r\n private readonly responsiveService: ResponsiveService,\r\n private readonly vTableService: VTableService) {\r\n };\r\n\r\n ngOnInit(): void {\r\n this.setupSubscriptions();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['tableRows'] && this.tableRows) {\r\n this.handleNewTableRows();\r\n }\r\n\r\n if (changes['selectionType']) {\r\n this.showCheckboxColumn = this.selectionType === VTableSelectionType.Multi;\r\n }\r\n\r\n if (changes['rowDataObservable']) {\r\n this.subscribeToRowDataChanges();\r\n }\r\n\r\n if ((this.rowClick.observers.length != 0 || this.selectedRowsChange.observers.length != 0) && this.clickable === undefined) {\r\n this.clickable = true;\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.subscriptions.add(\r\n this.tableHeaders.changes.subscribe(changes => {\r\n this.render();\r\n })\r\n )\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscriptions?.unsubscribe();\r\n this.visibilityObserver.unobserve(this.el.nativeElement);\r\n }\r\n\r\n toggleSortOrder(header: IVTableHeader): void {\r\n if (!header.sortable) {\r\n return;\r\n }\r\n\r\n this.table.headers.forEach((tableHeader: IVTableHeader) => {\r\n if (tableHeader.id === header.id) {\r\n return;\r\n }\r\n tableHeader.sorted = false;\r\n tableHeader.sortDirection = SortDirection.Ascending;\r\n });\r\n\r\n header.sorted = true;\r\n\r\n if (header.sortDirection === SortDirection.Ascending) {\r\n header.sortDirection = SortDirection.Descending;\r\n }\r\n else {\r\n header.sortDirection = SortDirection.Ascending;\r\n }\r\n\r\n this.applyColumnSorting();\r\n }\r\n\r\n closeColumnEditor(): void {\r\n this.filterBarService.toggleTableColumnEditor(false, this.tableColumns);\r\n }\r\n\r\n applyColumnSorting(): void {\r\n if (!this.table?.headers || !this.table?.rows) {\r\n return;\r\n }\r\n let sortedHeader = this.getSortedHeader();\r\n\r\n if (!sortedHeader) {\r\n return;\r\n }\r\n\r\n this.table.rows = [...this.vTableService.sortColumn(this.table, sortedHeader).rows];\r\n this.bringSelectedRowsToTop();\r\n this.setDisplayRows();\r\n }\r\n\r\n onChildrenRendered(): void {\r\n this.viewport?.checkViewportSize();\r\n }\r\n\r\n trackByRow(index: number, row: IVTableRow): number {\r\n return row.id;\r\n }\r\n\r\n trackByCell(index: number, cell: IVTableCell): number {\r\n return cell.id;\r\n }\r\n\r\n onRowClicked(tableRow: IVTableRow) {\r\n switch (this.selectionType) {\r\n case VTableSelectionType.Single:\r\n this.table?.rows?.forEach(row => row.selected = false);\r\n tableRow.selected = true;\r\n this.rowClick.emit(tableRow);\r\n break;\r\n case VTableSelectionType.Multi:\r\n if (!tableRow.disableSelect) {\r\n this.toggleRow(tableRow);\r\n }\r\n break;\r\n default:\r\n this.rowClick.emit(tableRow);\r\n break;\r\n }\r\n }\r\n\r\n selectAllRows(): void {\r\n if (!(this.selectionType == VTableSelectionType.Multi)) {\r\n return;\r\n }\r\n\r\n let selectAll = false;\r\n const selectableRows = this.table.displayRows.filter(row => !row.disableSelect);\r\n\r\n if (this.selectedRows.length < selectableRows.length) {\r\n selectAll = true;\r\n }\r\n\r\n this.toggleAllRows(selectAll);\r\n }\r\n\r\n render(): void {\r\n this.viewport?.checkViewportSize();\r\n }\r\n\r\n addNewRow(data): void {\r\n const newRow = this.vTableService.createTableRow(data, this.tableColumns);\r\n newRow.class = \"new\";\r\n\r\n this.table.rows = [...this.tableRows, newRow];\r\n this.tableRowsChange.emit(this.table.rows);\r\n this.cd.detectChanges();\r\n }\r\n\r\n getWidth(): number {\r\n return this.currentWidth;\r\n }\r\n\r\n //--\r\n\r\n private setupTable(): void {\r\n if (!this.tableColumns) {\r\n return;\r\n }\r\n\r\n this.selectedRows = [];\r\n this.checkCanEdit();\r\n\r\n this.table = this.createTable();\r\n this.setTableHeaderIds();\r\n this.setTableRowIds();\r\n this.setDisplayRows();\r\n this.linkHeadersToCells();\r\n\r\n if (this.trueSize) {\r\n this.setTrueSize();\r\n }\r\n\r\n this.render();\r\n }\r\n\r\n private checkCanEdit(): void {\r\n this.canEditColumns = this.tableColumns.some(col => col.header.canEdit);\r\n\r\n if (!this.canEditColumns) {\r\n return;\r\n }\r\n\r\n this.tableColumns = this.vTableService.getTableColumnPreferences(this.tableColumns);\r\n }\r\n\r\n private setTrueSize() {\r\n const element = this.el.nativeElement as HTMLElement;\r\n const numRows = this.table?.rows?.length || 5; // Assume height of 5 rows to allow for empty state component\r\n let height = this.rowHeight * (numRows + 1); // plus one for header\r\n height++; // Plus one to account for one final border\r\n\r\n element.style.minHeight = `${height}px`;\r\n element.style.maxHeight = `${height}px`;\r\n element.classList.add(\"noOverflow\");\r\n }\r\n\r\n private setDisplayRows(): void {\r\n if (!this.table) {\r\n return;\r\n }\r\n \r\n this.table.displayRows = this.table.rows?.filter(row => !row.hide) || [];\r\n this.tableDisplayRowsChange.emit(this.table.displayRows);\r\n this.updateSelectedRows();\r\n }\r\n\r\n private createTable(): IVTable {\r\n this.setupMultiSelect();\r\n return {\r\n id: this.vTableService.getTableId(this.tableColumns),\r\n headers: this.tableColumns.map(column => column.header),\r\n rows: this.tableRows\r\n }\r\n }\r\n\r\n private setupMultiSelect(): void {\r\n if (!(this.selectionType == VTableSelectionType.Multi) || this.selectedRows?.length) {\r\n return;\r\n }\r\n\r\n this.selectedRows = [];\r\n\r\n this.tableRows?.forEach(row => {\r\n if (row.selected) {\r\n this.selectedRows.push(row);\r\n }\r\n })\r\n }\r\n\r\n private clearAllSelectedRows(): void {\r\n this.table?.rows?.forEach(row => row.selected = false);\r\n }\r\n\r\n private getSortedHeader(): IVTableHeader {\r\n let sortedHeader = this.table.headers.find((header: IVTableHeader) => header.sorted);\r\n if (!sortedHeader) {\r\n // If no sorted column specified use the first available sortable column\r\n sortedHeader = this.table.headers.find((header: IVTableHeader) => header.sortable);\r\n }\r\n return sortedHeader;\r\n }\r\n\r\n private updateSelectedRows(): void {\r\n if (!(this.selectionType == VTableSelectionType.Multi) || !this.table?.displayRows || !this.selectedRows?.length) {\r\n return;\r\n }\r\n this.clearAllSelectedRows();\r\n\r\n let markedForRemoval: number[] = [];\r\n\r\n this.selectedRows.forEach((row, index) => {\r\n const rowInTable = this.table.rows.find(r => r.id === row.id || r.data.Id === row.data.Id);\r\n if (rowInTable) {\r\n rowInTable.selected = true;\r\n }\r\n else {\r\n markedForRemoval.push(index);\r\n }\r\n });\r\n\r\n markedForRemoval.forEach(index => {\r\n this.selectedRows.splice(index, 1);\r\n })\r\n\r\n this.setAllRowsSelected();\r\n this.selectedRowsChange.emit(this.selectedRows);\r\n\r\n return;\r\n }\r\n\r\n private setTableHeaderIds(): void {\r\n if (!this.table?.headers) {\r\n return;\r\n }\r\n\r\n let index = 0;\r\n this.table.headers.forEach((header: IVTableHeader) => {\r\n if (header.id || header.type === VTableHeaderType.Checkbox) {\r\n return;\r\n }\r\n header.id = index;\r\n index++;\r\n });\r\n }\r\n\r\n private setTableRowIds(): void {\r\n if (!this.table?.rows) {\r\n return;\r\n }\r\n\r\n this.table.rows.forEach((row, index) => {\r\n if (row.id) {\r\n return;\r\n }\r\n row.id = index;\r\n });\r\n }\r\n\r\n\r\n private linkHeadersToCells(): void {\r\n if (!this.table?.rows) {\r\n return;\r\n }\r\n let accumulator = 0;\r\n\r\n this.table.rows.forEach((row, rowIndex) => {\r\n row.cells.forEach((cell, cellIndex) => {\r\n cell.id = accumulator;\r\n accumulator++;\r\n cell.header = this.tableColumns[cellIndex].header\r\n });\r\n })\r\n }\r\n\r\n private toggleRow(row: IVTableRow): void {\r\n row.selected = !row.selected;\r\n\r\n const selectedRowIndex = this.selectedRows.indexOf(row);\r\n\r\n if (selectedRowIndex >= 0) {\r\n this.selectedRows.splice(selectedRowIndex, 1);\r\n }\r\n else {\r\n this.selectedRows.push(row);\r\n }\r\n\r\n this.bringSelectedRowsToTop();\r\n\r\n this.setDisplayRows();\r\n this.setAllRowsSelected();\r\n this.selectedRowsChange.emit(this.selectedRows);\r\n }\r\n\r\n private toggleAllRows(selectAll: boolean): void {\r\n if (this.selectionType !== VTableSelectionType.Multi || !this.table) {\r\n return;\r\n }\r\n\r\n this.selectedRows = [];\r\n\r\n this.table.displayRows.forEach(row => {\r\n if (row.disableSelect) {\r\n return;\r\n }\r\n\r\n row.selected = selectAll;\r\n if (selectAll) {\r\n this.selectedRows.push(row);\r\n }\r\n });\r\n\r\n this.setDisplayRows();\r\n this.setAllRowsSelected();\r\n this.selectedRowsChange.emit(this.selectedRows);\r\n }\r\n\r\n private setAllRowsSelected(): void {\r\n const selectableRows = this.table.displayRows.filter(row => !row.disableSelect);\r\n\r\n this.allRowsSelected = this.selectedRows.length && this.selectedRows.length === selectableRows.length;\r\n }\r\n\r\n private setupSubscriptions() {\r\n this.subscriptions.add(this.filterBarService.dataChanged.subscribe(() => {\r\n this.setDisplayRows();\r\n }));\r\n\r\n this.subscriptions.add(this.filterBarService.tableColumnEditorOpen.subscribe({\r\n next: ({ open, tableColumns }) => {\r\n if (!this.table) {\r\n return;\r\n }\r\n\r\n if (this.vTableService.getTableId(tableColumns) == this.table.id) {\r\n this.showColumnEditor = open;\r\n }\r\n }\r\n }))\r\n\r\n this.setupVisibilityObserver();\r\n }\r\n\r\n private setupVisibilityObserver(): void {\r\n // Ensure cdk-scroller sets the correct viewport height when table is brought\r\n // into view after loading, i.e.on tab change\r\n this.visibilityObserver = new IntersectionObserver(entries => {\r\n entries.forEach(entry => {\r\n if (entry.isIntersecting) {\r\n this.render();\r\n }\r\n });\r\n });\r\n\r\n this.subscriptions.add(this.responsiveService.currentWindowWidth.subscribe(() => {\r\n this.currentWidth = (this.el.nativeElement as HTMLElement)?.clientWidth;\r\n this.cd.markForCheck();\r\n }));\r\n\r\n this.visibilityObserver.observe(this.el.nativeElement);\r\n }\r\n\r\n private handleNewTableRows(): void {\r\n if (!this.tableRows) {\r\n return;\r\n }\r\n\r\n this.setupTable();\r\n this.applyColumnSorting();\r\n\r\n this.viewport?.checkViewportSize();\r\n\r\n this.tableRowsChange.emit(this.table.rows);\r\n }\r\n\r\n private bringSelectedRowsToTop(): void {\r\n if (this.selectionType === VTableSelectionType.None) {\r\n return;\r\n }\r\n\r\n this.table.rows = this.table.rows.filter(row => !row.selected);\r\n\r\n this.table.rows.unshift(...this.selectedRows);\r\n }\r\n\r\n private subscribeToRowDataChanges(): void {\r\n if (!this.rowDataObservable) {\r\n return;\r\n }\r\n\r\n this.loading = true;\r\n\r\n this.rowDataObservable.pipe(untilDestroyed(this)).subscribe(data => {\r\n this.tableRows = this.vTableService.createTableRows(data, this.tableColumns);\r\n this.handleNewTableRows();\r\n this.loading = false;\r\n })\r\n }\r\n}\r\n","import { ElementRef, Injectable, Renderer2 } from \"@angular/core\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { BehaviorSubject, fromEvent } from \"rxjs\";\r\nimport { debounceTime } from \"rxjs/operators\";\r\n\r\nexport enum WindowBreakpoint {\r\n None,\r\n Small, //640\r\n Medium, //768\r\n Large, //1024\r\n ExtraLarge, //1280\r\n Massive //1536\r\n}\r\n\r\ntype WindowBreakpointMap = { [width: number]: WindowBreakpoint };\r\n\r\n@UntilDestroy()\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ResponsiveService {\r\n\r\n currentBreakpoint = new BehaviorSubject(this.getBreakpointFromWidth(window.innerWidth));\r\n currentBreakpoint$ = this.currentBreakpoint.asObservable();\r\n\r\n currentWindowWidth = new BehaviorSubject(window.innerWidth);\r\n currentWindowWidth$ = this.currentWindowWidth.asObservable();\r\n\r\n breakpointMap: WindowBreakpointMap;\r\n\r\n constructor() {\r\n this.subscribeToWindowEvents();\r\n }\r\n\r\n updateCurrentBreakpoint(): void {\r\n this.currentBreakpoint.next(this.getBreakpointFromWidth(window.innerWidth));\r\n }\r\n\r\n shouldDisplayUsingMinWidth(minDisplayWidth: number, widthToCompareTo?: number /* compares to window if not provided */): boolean {\r\n\r\n if (!widthToCompareTo) {\r\n widthToCompareTo = this.currentWindowWidth.value;\r\n }\r\n\r\n return minDisplayWidth <= widthToCompareTo;\r\n }\r\n\r\n shouldDisplayUsingMaxWidth(maxDisplayWidth: number, widthToCompareTo?: number /* compares to window if not provided */): boolean {\r\n if (!widthToCompareTo) {\r\n widthToCompareTo = this.currentWindowWidth.value;\r\n }\r\n\r\n if (maxDisplayWidth >= widthToCompareTo) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n shouldDisplayUsingMinBreakpoint(minBreakpoint: WindowBreakpoint, breakpointToCompareTo?: WindowBreakpoint /* compares to window if not provided */): boolean {\r\n const minBreakpointWidth = this.getWidthFromBreakpoint(minBreakpoint);\r\n\r\n if (!WindowBreakpoint[breakpointToCompareTo]) {\r\n breakpointToCompareTo = this.getWidthFromBreakpoint(this.currentBreakpoint.value);\r\n }\r\n\r\n if (minBreakpointWidth <= breakpointToCompareTo) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n shouldDisplayUsingMaxBreakpoint(maxBreakpoint: WindowBreakpoint, breakpointToCompareTo?: WindowBreakpoint /* compares to window if not provided */): boolean {\r\n const maxBreakpointWidth = this.getWidthFromBreakpoint(maxBreakpoint);\r\n\r\n if (!WindowBreakpoint[breakpointToCompareTo]) {\r\n breakpointToCompareTo = this.getWidthFromBreakpoint(this.currentBreakpoint.value);\r\n }\r\n\r\n if (maxBreakpointWidth >= breakpointToCompareTo) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n getParentWidthOfElementRef(elementRef: ElementRef): number {\r\n return (elementRef.nativeElement as HTMLElement)?.parentElement?.clientWidth;\r\n }\r\n\r\n addHiddenElementStyling(elementRef: ElementRef, renderer: Renderer2): void {\r\n if (!elementRef?.nativeElement) {\r\n return;\r\n }\r\n\r\n renderer.setStyle(elementRef.nativeElement, \"display\", \"none\");\r\n }\r\n\r\n removeHiddenElementStyling(elementRef: ElementRef, originalDisplayStyle: string, renderer: Renderer2): void {\r\n if (!elementRef?.nativeElement) {\r\n return;\r\n }\r\n\r\n if (!originalDisplayStyle) {\r\n renderer.removeStyle(elementRef.nativeElement, \"display\");\r\n return;\r\n }\r\n\r\n renderer.setStyle(elementRef.nativeElement, \"display\", originalDisplayStyle);\r\n }\r\n\r\n // ---\r\n\r\n private subscribeToWindowEvents(): void {\r\n fromEvent(window, \"resize\")\r\n .pipe(\r\n untilDestroyed(this),\r\n debounceTime(20),\r\n )\r\n .subscribe((windowEvent: Event) => {\r\n const width: number = (windowEvent.target as any).innerWidth;\r\n\r\n this.currentWindowWidth.next(width);\r\n this.updateCurrentBreakpointUsingWidth(width);\r\n });\r\n }\r\n\r\n private updateCurrentBreakpointUsingWidth(width: number): void {\r\n const newBreakpoint = this.getBreakpointFromWidth(width);\r\n\r\n if (newBreakpoint === this.currentBreakpoint.value) {\r\n return;\r\n }\r\n\r\n this.currentBreakpoint.next(newBreakpoint);\r\n }\r\n\r\n private getBreakpointFromWidth(width: number): WindowBreakpoint {\r\n const breakpointMap = this.getBreakpointMap();\r\n let newBreakpoint = WindowBreakpoint.None;\r\n\r\n for (var breakpointWidth of Object.keys(breakpointMap)) {\r\n if (width >= +breakpointWidth) {\r\n newBreakpoint = breakpointMap[breakpointWidth];\r\n }\r\n }\r\n\r\n return newBreakpoint;\r\n }\r\n\r\n private getWidthFromBreakpoint(breakpoint: WindowBreakpoint): number {\r\n const breakpointMap = this.getBreakpointMap();\r\n\r\n for (var breakpointWidth of Object.keys(breakpointMap)) {\r\n if (breakpoint === breakpointMap[+breakpointWidth]) {\r\n return +breakpointWidth;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private getBreakpointMap(): WindowBreakpointMap {\r\n if (!this.breakpointMap) {\r\n this.breakpointMap = {\r\n [640]: WindowBreakpoint.Small,\r\n [768]: WindowBreakpoint.Medium,\r\n [1024]: WindowBreakpoint.Large,\r\n [1280]: WindowBreakpoint.ExtraLarge,\r\n [1536]: WindowBreakpoint.Massive,\r\n };\r\n }\r\n\r\n return this.breakpointMap;\r\n }\r\n}\r\n","import { Overlay, OverlayConfig } from '@angular/cdk/overlay';\r\nimport { ComponentPortal, PortalInjector } from '@angular/cdk/portal';\r\nimport { Injectable, Injector, TemplateRef, Type } from '@angular/core';\r\nimport { VDialogRef } from './v-dialog-ref';\r\nimport { VDialogComponent } from './v-dialog.component';\r\n\r\n// https://codinglatte.com/posts/angular/reusable-modal-overlay-using-angular-cdk-overlay/\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DialogService {\r\n constructor(private overlay: Overlay, private injector: Injector) {\r\n }\r\n\r\n open(\r\n content: string | TemplateRef | Type,\r\n data: T\r\n ): VDialogRef {\r\n const configs = new OverlayConfig({\r\n hasBackdrop: true,\r\n panelClass: ['modal', 'is-active'],\r\n backdropClass: 'modal-background'\r\n });\r\n\r\n const overlayRef = this.overlay.create(configs);\r\n const myOverlayRef = new VDialogRef(overlayRef, content, data);\r\n\r\n const injector = this.createInjector(myOverlayRef, this.injector);\r\n overlayRef.attach(new ComponentPortal(VDialogComponent, null, injector));\r\n\r\n return myOverlayRef;\r\n }\r\n\r\n createInjector(ref: VDialogRef, inj: Injector): Injector {\r\n return Injector.create({\r\n parent: inj,\r\n providers: [{\r\n provide: VDialogRef,\r\n useValue: ref\r\n }]\r\n })\r\n }\r\n}\r\n","import { CameraOnlineStatus } from \"@app/main/components/videos/models/camera-online-status\";\r\nimport { IApplicationCameraRequest, IConfigCameraRequest } from \"@app/main/modules/foundation/_routes/rv-lite/camera-config/camera-configuration.models\";\r\nimport { IConfigurationUpdate } from \"@app/services/cameraCommunicationServer.service\";\r\nimport { AccountFeatures } from \"@enums/account/AccountFeature\";\r\nimport { IBasicProductModel } from \"./IProductUiViewModel\";\r\nimport { IVehiclePeripheralMapping, IVehicleUnitMapping } from \"./IVehiclePeripheralMapping\";\r\n\r\nexport enum SavedState {\r\n NoSaveRequired,\r\n AddedRequiresSave,\r\n RemovedRequiresSave\r\n}\r\n\r\nexport interface IUnit extends IPeripheralUnitMetaData {\r\n Id?: number;\r\n Serial?: string;\r\n ProductId?: number;\r\n Product?: IBasicProductModel;\r\n\r\n Imei?: string;\r\n SimId?: number;\r\n StartUtc?: Date;\r\n\r\n // ---\r\n\r\n savedState?: SavedState;\r\n unitLocation?: string;\r\n type?: \"Unit\" | \"Peripheral\";\r\n vehicleMapping?: IVehicleUnitMapping;\r\n}\r\n\r\nexport interface IPeripheral extends IUnit {\r\n TimezoneSetting?: ITimezoneSetting;\r\n DaylightSavingsTime?: boolean;\r\n VehiclePeripheralMappings?: IVehiclePeripheralMapping[];\r\n // ---\r\n\r\n dirtySerial?: string; // storing a queued change to Serial before submitting to API\r\n uninstallSerial?: boolean; // storing a queued change to Serial before submitting to API\r\n\r\n isLiveStreamCam?: boolean;\r\n rtlConfigUpdateHistory?: IConfigurationUpdate[]; // Deprecating when CommServer closed down\r\n veriConfigUpdateHistory?: IConfigCameraRequest[];\r\n veriAppUpdateHistory?: IApplicationCameraRequest[];\r\n}\r\n\r\nexport interface IConfigurableCameraDevice extends IPeripheral {\r\n currentConfig?: string;\r\n currentTelematicsAppVersion?: string;\r\n currentUpdaterAppVersion?: string;\r\n currentFW?: string;\r\n onlineStatus?: CameraOnlineStatus;\r\n migrationStatus?: CommserverMigrationStatus;\r\n resellerId?: number;\r\n}\r\n\r\nexport enum CommserverMigrationStatus {\r\n Required,\r\n InProgress,\r\n Completed\r\n}\r\n\r\nexport interface IViewCommissionPeripheral extends IPeripheral {\r\n showDiagnostics: boolean\r\n}\r\n\r\n// Used for UI specific data\r\nexport interface IPeripheralUnitMetaData {\r\n primaryFeature?: AccountFeatures;\r\n productVendorString?: string;\r\n name?: string;\r\n icon?: string;\r\n}\r\n","\r\nimport { AccountFeatures } from \"@enums/account/AccountFeature\";\r\nimport { AccountFleetType } from \"@enums/account/AccountFleetType\";\r\nimport { AccountMarketType } from \"@enums/account/AccountMarketType\";\r\nimport { AccountStatus } from \"@enums/account/AccountStatus\";\nimport { AccountSector } from \"@enums/account/AccountSector\";\r\nimport { Platform } from \"@enums/account/Platform\";\r\nimport { IRunBlockRootScope } from \"@interfaces/IRunBlockRootScope\";\r\nimport { UserPlatform } from \"@interfaces/IUser\";\r\nimport { CacheService } from \"@services/cache.Service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport * as angular from \"angular\";\r\nimport { UserPreferencesDirectiveController } from \"../userPreferences/userpreferences.directive\";\r\nimport { ConstantsService } from \"./constantsService\";\r\nimport { DisplayService, IDialogOptionsJson } from \"./display.service\";\r\nimport { SessionService } from \"./session.service\";\r\n\r\nexport interface IShowPasswordEditorOptions {\r\n forcePasswordReset?: boolean;\r\n onCancelled?: () => void;\r\n onPasswordUpdated?: () => void;\r\n}\r\n\r\nexport interface IAccount {\r\n Id: number;\r\n CompanyName: string;\r\n Image?: string;\r\n Features?: AccountFeatures;\r\n\r\n ContractExpiry?: string;\r\n DateTimeSetup?: string;\r\n\r\n Status?: AccountStatus;\r\n FleetType?: AccountFleetType;\n SectorId?: AccountSector;\r\n\r\n Platform?: Platform;\r\n\r\n ResellerId?: number;\r\n\r\n FleetSize?: number;\r\n Website?: string;\r\n Phone?: string;\r\n MarketType?: AccountMarketType;\r\n\r\n // --\r\n\r\n platformString?: string;\r\n accountStatus?: string;\r\n resellerName?: string;\r\n featureString?: string;\r\n}\r\n\r\nexport class AccountService {\r\n\r\n static AccountFeaturesUpdatedEvent = \"AccountFeaturesUpdatedEvent\";\r\n\r\n isDemoSite: boolean;\r\n isMobile: boolean;\r\n\r\n private cacheName = \"accountCache\";\r\n\r\n static $inject = [\"$q\", \"$rootScope\", \"$http\", \"$mdDialog\", \"cacheService\", \"displayService\", \"translationService\", \"constantsService\", \"sessionService\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $rootScope: IRunBlockRootScope,\r\n private readonly $http: angular.IHttpService,\r\n private readonly $mdDialog: angular.material.IDialogService,\r\n private readonly cacheService: CacheService,\r\n private readonly displayService: DisplayService,\r\n private readonly translationService: TranslationService,\r\n private readonly constantsService: ConstantsService,\n private readonly sessionService: SessionService) {\r\n\r\n this.isDemoSite = this.constantsService.getIsDemoSite();\r\n this.isMobile = this.constantsService.getIsMobile();\r\n\r\n this.cacheService.createCache(this.cacheName);\r\n\r\n $rootScope.$on(AccountService.AccountFeaturesUpdatedEvent, () => { });\r\n }\r\n\r\n changePassword(password: string): angular.IPromise {\r\n return this.$http({\r\n method: \"POST\",\r\n url: \"/api/users/changepassword\",\r\n data: JSON.stringify(password)\r\n });\r\n }\r\n\r\n getAccountDataFromCache(): IAccount {\r\n return this.cacheService.get(this.cacheName);\r\n }\r\n\r\n getAccountData(invalidateCache = false): angular.IPromise {\r\n if (this.$rootScope.currentUser === undefined || !this.$rootScope.currentUser.CurrentAccountUserMapping || this.$rootScope.currentUser?.platform === UserPlatform.Foundation) {\r\n return this.$q.resolve(null);\r\n }\r\n\r\n return this.cacheService.getOrRetrieveData(this.cacheName, () => this.getAccountDataFromDatabase(), invalidateCache);\r\n }\r\n\r\n createAccountMap(accounts): Map {\r\n return new Map(accounts.map(a => [a.Id, a]));\r\n }\r\n\r\n getAccountListFromDatabase(): angular.IPromise {\r\n return this\r\n .$http({\r\n url: \"/api/accounts/\",\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 30/*, invalidateCache: invalidateCache */ }\r\n })\r\n .then(response => {\r\n response.data.forEach(accountData => {\r\n this.processAccountData(accountData, false);\r\n });\r\n\r\n return response.data;\r\n });\r\n }\r\n\r\n updateAccountData(): angular.IPromise {\r\n return this\r\n .$http({\r\n url: \"/api/account/updatefeatures\",\r\n method: \"POST\",\r\n })\r\n .then(response => {\r\n const accountData = response.data;\r\n this.processAccountData(accountData);\r\n\r\n return accountData;\r\n });\r\n }\r\n\r\n setAccountImage(base64ImageString: string, accountId?: number): angular.IPromise {\r\n return this.$http({\r\n url: `/api/account/image/${accountId}`,\r\n method: \"POST\",\r\n data: `\"${base64ImageString}\"`\r\n });\r\n }\r\n\r\n showMyAccountDialog(event?: MouseEvent, passwordReset = false, emailRequired = false) {\r\n this.$mdDialog.show({\r\n template: require(\"../main/components/account/account.html\"),\r\n targetEvent: event,\r\n multiple: true,\r\n escapeToClose: !passwordReset,\r\n clickOutsideToClose: false,\r\n controller: \"accountController\",\r\n controllerAs: \"$ctrl\",\r\n locals: { passwordReset: passwordReset, emailRequired: emailRequired }\r\n });\r\n }\r\n\r\n showMyPreferencesDialog(event?: MouseEvent, passwordReset = false, defaultLanguage = false) {\r\n const dialogOptions: angular.material.IDialogOptions = {\r\n template: this.isMobile ? require(\"../userPreferences/userpreferences.mobile.html\") : require(\"../userPreferences/userpreferences.html\"),\r\n targetEvent: event,\r\n escapeToClose: !passwordReset,\r\n multiple: true,\r\n clickOutsideToClose: false,\r\n controller: UserPreferencesDirectiveController,\r\n controllerAs: \"$ctrl\",\r\n locals: { passwordReset: passwordReset, defaultLanguage: defaultLanguage }\r\n };\r\n\r\n this.$mdDialog.show(dialogOptions);\r\n }\r\n\r\n showMyCompanyImageDialog(event?: MouseEvent) {\r\n return this.$mdDialog.show({\r\n template: require(\"../main/components/companyImage/companyImage.html\"),\r\n targetEvent: event,\r\n multiple: true,\r\n escapeToClose: true,\r\n clickOutsideToClose: true,\r\n controller: \"companyImageController\",\r\n controllerAs: \"$ctrl\",\r\n locals: { accountId: null }\r\n });\r\n }\r\n\r\n showPasswordEditor($event: MouseEvent, options?: IShowPasswordEditorOptions) {\r\n const dialogOptions: IDialogOptionsJson = {\r\n title: this.translationService.t(\"AccountService.PasswordDialogTitle\"),\r\n dialogHTML: \"\",\r\n dialogId: \"passwordEditorComponent\",\r\n customClass: `password-editor-dialog`,\r\n multiple: true,\r\n bindings: {\r\n forcePasswordReset: options?.forcePasswordReset,\r\n onCancelled: () => { options?.onCancelled() },\r\n onPasswordUpdated: () => { options?.onPasswordUpdated(); }\r\n },\r\n event: $event,\r\n preventFocusOnOpen: false,\r\n escapeToClose: !options?.forcePasswordReset,\r\n clickOutsideToClose: false,\r\n hideXCloseButton: true\r\n };\r\n\r\n this.displayService.showDialog(dialogOptions);\r\n }\r\n\r\n updateAccountCache(accountData: IAccount) {\r\n this.cacheService.save(this.cacheName, accountData);\r\n\r\n this.$rootScope.$broadcast(AccountService.AccountFeaturesUpdatedEvent);\r\n }\n\n getMultiAccountUserMappings(): angular.IPromise {\n return this\r\n .$http({\r\n url: \"/api/account/usermapped\",\r\n method: \"GET\"\r\n })\r\n .then(response => {\r\n response.data.forEach(accountData => {\r\n this.processAccountData(accountData, false);\r\n });\r\n\r\n return response.data;\r\n });\r\n }\n\n\n //api/account/usermapped\n\r\n // ---\r\n\r\n private getAccountDataFromDatabase(): angular.IPromise {\r\n return this\r\n .$http({\r\n url: \"/api/account/\",\r\n method: \"GET\"\r\n })\r\n .then(response => {\r\n const accountData = response.data;\r\n\r\n if (accountData) {\r\n this.processAccountData(accountData);\r\n }\r\n\r\n return accountData;\r\n })\n .catch(() => {\n // If this fails clear caches etc, the page will refresh shortly and present login page\n this.sessionService.clearAllCachesAndSessions();\n return null;\n });\r\n }\r\n\r\n private processAccountData(accountData: IAccount, updateCache = true) {\r\n\r\n if (this.isDemoSite) {\r\n accountData.CompanyName = \"Demo Company\";\r\n }\n\r\n if (accountData.Image) {\r\n accountData.Image = `data:image/png;base64,${accountData.Image}`;\r\n }\r\n\r\n // Todo\r\n // This currently doesnt work - requires Intranet changes.\r\n // So for now this is HARD CODED\r\n\r\n // Testing enabling features\r\n //this.enableFeature(accountData, AccountFeature.Can);\r\n //this.enableFeature(accountData, AccountFeature.Tracking);\r\n //this.enableFeature(accountData, AccountFeature.Camera);\r\n //this.enableFeature(accountData, AccountFeature.Tacho);\r\n\r\n // Testing disabling features\r\n //this.disableFeature(accountData, AccountFeature.Messaging);\r\n //this.disableFeature(accountData, AccountFeature.Camera);\r\n //this.disableFeature(accountData, AccountFeature.Temperature);\r\n //this.disableFeature(accountData, AccountFeature.Can);\r\n //this.disableFeature(accountData, AccountFeature.Tracking);\r\n //this.disableFeature(accountData, AccountFeature.Alcolock);\r\n //this.enableFeature(accountData, AccountFeature.Tacho)\r\n\r\n if (updateCache) {\r\n this.updateAccountCache(accountData);\r\n }\r\n }\r\n}\r\n","import * as angular from \"angular\";\r\nimport { ITimeZoneInfo } from \"../userPreferences/model/ITimeZoneInfo\";\r\nimport { ICountry } from \"@directives/_forms/smsInput/ICountry\";\r\nimport { IPreferencesContent } from \"@interfaces/IPreferencesContent\";\r\nimport { ICombinedPreferences } from \"@interfaces/ICombinedPreferences\";\r\n\r\nexport enum RouteStartCondition {\r\n JourneyStart,\r\n DepartFromAnyVisit,\r\n DepartStartLocation\r\n}\r\n\r\nexport enum RouteEndCondition {\r\n ArriveAllVisits,\r\n ArriveEndLocation\r\n}\r\n\r\nexport enum VisitMatchOptions {\r\n None = 0,\r\n OnLocation = 1,\r\n OnJourney = 2,\r\n OnJob = 4,\r\n OnDwell = 8\r\n}\r\n\r\nexport enum Section {\r\n General,\r\n Map,\r\n Cost,\r\n Measurement,\r\n Internationalisation,\r\n Tms,\r\n Report\r\n}\r\n\r\nexport enum Currency {\r\n GBP,\r\n EUR,\r\n USD\r\n}\r\n\r\nexport enum JourneyCostType {\r\n Distance,\r\n Hourly\r\n}\r\n\r\nexport enum LandingPageOptions {\r\n Dashboard,\r\n Vehicles,\r\n Tms,\r\n Compliance,\r\n Maintenance,\r\n Geofences,\r\n Resources\r\n}\r\n\r\nexport enum DistanceMeasurement {\r\n Kilometres,\r\n Miles\r\n}\r\n\r\nexport enum VolumeMeasurement {\r\n Litre,\r\n Gallon,\r\n UsGallon\r\n}\r\n\r\nexport enum TemperatureMeasurement {\r\n Celsius,\r\n Fahrenheit\r\n}\r\n\r\nexport enum FuelConsumptionMeasurement {\r\n MilesPerGallon,\r\n UnitedStatesMilesPerGallon,\r\n KilometresPerLitre,\r\n LitresPer100Kilometres\r\n}\r\n\r\nexport enum DurationFormat {\r\n Days,\r\n DaysHours,\r\n DaysHoursMinutes,\r\n DaysHoursMinutesSeconds,\r\n Hours,\r\n HoursMinutes,\r\n HoursMinutesSeconds,\r\n Minutes,\r\n MinutesSeconds,\r\n Seconds\r\n}\r\n\r\nexport interface IPreferencesQueryOptions {\r\n AccountId?: number;\r\n UserId?: number;\r\n isAccountPreferences?: boolean;\r\n}\r\n\r\nexport class PreferencesService {\r\n\r\n static $inject = [\"$http\", \"$q\", \"$timeout\"];\r\n\r\n constructor(\r\n private readonly $http: angular.IHttpService,\r\n private readonly $q: angular.IQService,\r\n private readonly $timeout: angular.ITimeoutService\r\n ) {\r\n }\r\n\r\n getAllPreferences(): angular.IPromise {\r\n return this\r\n .$http({\r\n url: \"/api/preferences\",\r\n method: \"GET\",\r\n })\r\n .then((response: angular.IHttpResponse) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getPreferences(queryOptions: IPreferencesQueryOptions): angular.IPromise {\r\n return this\r\n .$http({\r\n url: \"/api/preferences/preferencesContent\",\r\n method: \"GET\",\r\n params: queryOptions\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getDefaultPreferences(): angular.IPromise {\r\n return this\r\n .$http({\r\n url: \"/api/preferences/default\",\r\n method: \"GET\"\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getAccountPreferences() : angular.IPromise {\r\n return this\r\n .$http({\r\n url: \"/api/preferences/account\",\r\n method: \"GET\",\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n updateAccountPreferences(accountPreferences: IPreferencesContent, accountId?: number) : angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/preferences/account/${accountId}`,\r\n method: \"POST\",\r\n data: accountPreferences\r\n }).then(() => { });\r\n }\r\n\r\n getUserPreferences(): angular.IPromise {\r\n return this\r\n .$http({\r\n url: \"/api/preferences/user\",\r\n method: \"GET\",\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n updateUserPreferences(userPreferences: IPreferencesContent): angular.IPromise {\r\n return this\r\n .$http({\r\n url: \"/api/preferences/user\",\r\n method: \"POST\",\r\n data: userPreferences\r\n }).then(() => { });\r\n }\r\n\r\n createNewUserPreferences(userPreferences: IPreferencesContent, userId: number, accountId: number): angular.IPromise {\r\n const url = `/api/preferences/user/${userId}/account/${accountId}`;\r\n return this\r\n .$http({\r\n url: url,\r\n method: \"POST\",\r\n data: userPreferences\r\n }).then(() => { });\r\n }\r\n\r\n getTimezones(): angular.IPromise {\r\n return this.$http\r\n .get(\"/api/useroptions/timezones/\")\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n getTimezone(timeZoneName: string): angular.IPromise {\r\n return this.$http\r\n .get(`/api/useroptions/timezone/${timeZoneName}`)\r\n .then((result: angular.IHttpResponse) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n getCountryCodes(): angular.IPromise {\r\n return this.$http\r\n .get(\"/api/useroptions/countrycodes/\")\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n reconcileLanguagesRequiresRefresh(): angular.IPromise {\r\n const localUILanguageString = localStorage.getItem('userSelectedLanguageCode');\r\n\r\n return this.getAllPreferences().then((existingPreferences) => {\r\n\r\n if (!localUILanguageString) {\r\n // If first time User connects on device - set the local lang instead\r\n this.updateLocalLanguage(existingPreferences);\r\n return this.$q.resolve(true); // refresh required\r\n } else {\r\n return this.updateDatabasePreferencesIfRequired(existingPreferences, localUILanguageString).then(() => {\r\n return this.$q.resolve(false); // no refresh required\r\n });\r\n }\r\n });\r\n }\r\n\r\n private updateLocalLanguage(existingPreferences: ICombinedPreferences): void {\r\n let userLangPref = existingPreferences.User?.Language?.Value;\r\n if (userLangPref == null) {\r\n userLangPref = \"en\";\r\n }\r\n\r\n localStorage.setItem('userSelectedLanguageCode', userLangPref);\r\n }\r\n\r\n private updateDatabasePreferencesIfRequired(existingPreferences: ICombinedPreferences, LocalUILanguageString: string): angular.IPromise {\r\n if (!existingPreferences.User) {\r\n\r\n const tempUserPrefs: IPreferencesContent = {} as any;\r\n\r\n existingPreferences.User = tempUserPrefs;\r\n }\r\n\r\n let saveRequired = false;\r\n const sanitisedLocalUILanguageString = LocalUILanguageString !== \"undefined\" ? LocalUILanguageString : \"en\"\r\n\r\n if (!existingPreferences.User.Language) {\r\n existingPreferences.User.Language = {\r\n Value: sanitisedLocalUILanguageString,\r\n Section: 4,\r\n savePreference: true\r\n };\r\n saveRequired = true;\r\n }\r\n\r\n if (existingPreferences.User.Language.Value != sanitisedLocalUILanguageString) {\r\n existingPreferences.User.Language.Value = sanitisedLocalUILanguageString;\r\n saveRequired = true;\r\n }\r\n\r\n if (!saveRequired) {\r\n return this.$q.resolve();\r\n }\r\n\r\n \r\n return this.updateUserPreferences(existingPreferences.User).then(() => {\r\n return this.$timeout(() => { return this.$q.resolve(); }, 1000);\r\n });\r\n }\r\n}\r\n","import { AfterViewInit, Component, ElementRef, EventEmitter, HostBinding, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild } from \"@angular/core\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableHeader } from \"@app/directives/_layout/v-table/_models/IVTableHeader\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { IReportHistory } from \"@app/main/components/reports/models/IDynamicReportLog\";\r\nimport { IVButtonDropDownItem } from \"@directives/_core/v-button/v-button.component\";\r\nimport \"./filter-bar.component.scss\";\r\nimport { FilterBarItemSearchPredicate, FilterBarListIterable, FilterChange, FilterTriggerType, IAggregateFilterEvent, IFilterBarChange, IFilterBarFilter, IFilterBarListWithCount, IFilterBarTab, IVerticalFilterListItem } from \"./filter-bar.models\";\r\nimport { FilterBarService } from \"./filter-bar.service\";\r\n\r\n@Component({\r\n selector: \"filter-bar\",\r\n template: require(\"./filter-bar.component.html\")\r\n})\r\nexport class FilterBarComponent implements IFilterBarChange>, OnInit, OnChanges, AfterViewInit {\r\n\r\n @Input() compact = true;\r\n\r\n @Input() tabs: IFilterBarTab[] = [];\r\n @Input() hideTabsWithNoData: boolean;\r\n @Input() data: T[];\r\n\r\n @Input() exportTitle: string;\r\n\r\n @Input() showExport: boolean;\r\n @Input() showSearch: boolean;\r\n @Input() searchPredicate: FilterBarItemSearchPredicate;\r\n\r\n @Input() showExportLabel: boolean;\r\n @Input() exportAsLandscape: boolean;\r\n \r\n @Input() reportLog: IReportHistory;\r\n\r\n @Input() tableColumns: IVTableColumn[];\r\n @Input() tableRows: IVTableRow[];\r\n @Input() rowDataUniqueKey: string = 'Id';\r\n\r\n @Output() change = new EventEmitter>();\r\n @Output() tableRowsChange = new EventEmitter();\r\n\r\n @ViewChild(\"remainingSpace\") remainingSpace: ElementRef;\r\n\r\n @HostBinding(\"class.notabs\") noTabs = false;\r\n\r\n // ---\r\n\r\n tableHeaders: IVTableHeader[];\r\n showAdditionalFilters = false;\r\n aggregateFilterEvent: IAggregateFilterEvent = {} as any;\r\n\r\n moreFilterTypes: IVButtonDropDownItem[] = [];\r\n filters: IFilterBarFilter[] = [];\r\n filterBarListFilters: IFilterBarListWithCount[] = [];\r\n\r\n tableRowsMap: Map;\r\n\r\n searchDebounce: ReturnType;\r\n\r\n updateCountsWorker: Worker;\r\n canEditColumns: boolean;\r\n\r\n // ---\r\n\r\n constructor(\r\n private readonly filterBarService: FilterBarService) {\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n this.showHideFilters();\r\n\r\n if (this.tabs && this.data) {\r\n this.updateTabCounts();\r\n }\r\n\r\n if (changes[\"tableRows\"]) {\r\n this.tableRowsMap = new Map(this.tableRows?.map((row, index) => {\r\n const uniqueProperty = row.data[this.rowDataUniqueKey];\r\n if (uniqueProperty == undefined) {\r\n console.warn(`${this.rowDataUniqueKey} key not found on row data. This will affect searching and filtering of table data.`);\r\n return [index, row];\r\n }\r\n\r\n return [row.data[this.rowDataUniqueKey], row];\r\n }));\r\n\r\n this.setSearchPredicate(this.tableSearchPredicate);\r\n }\r\n\r\n if (changes[\"tableColumns\"] && this.tableColumns?.length) {\r\n this.tableHeaders = this.tableColumns.map(column => column.header);\r\n this.canEditColumns = this.tableColumns.some(col => col.header.canEdit);\r\n }\r\n\r\n // Auto show search if we specify a predicate\r\n if (this.showSearch == undefined && this.searchPredicate) {\r\n this.showSearch = true;\r\n }\r\n\r\n if (changes[\"data\"] || changes[\"tableRows\"]) {\r\n // Trigger filtering and change event\r\n this.onFilterChange(\"sourcedata\", this.data, { filterData: true });\r\n }\r\n\r\n this.noTabs = this.tabs == null || this.tabs.length == 0;\r\n }\r\n\r\n ngAfterViewInit() {\r\n\r\n //this.responsiveService.currentWindowWidth$.subscribe(() => {\r\n // this.hideFiltersIfRequired();\r\n //});\r\n\r\n setTimeout(() => {\r\n if (this.remainingSpace.nativeElement.clientWidth < 200) {\r\n this.compact = true;\r\n }\r\n\r\n //this.hideFiltersIfRequired();\r\n\r\n this.showHideFilters();\r\n });\r\n }\r\n\r\n onSearch(text: string) {\r\n clearTimeout(this.searchDebounce);\r\n\r\n this.searchDebounce = setTimeout(() => {\r\n // Small debounce to prevent potentially looping over thousands of rows on every keystroke\r\n let filterData = this.data && this.searchPredicate;\r\n this.onFilterChange(\"search\", text?.toLocaleLowerCase(), { filterData: !!filterData });\r\n }, 150)\r\n }\r\n\r\n onTabSelected(tab: IFilterBarTab) {\r\n if (this.data) {\r\n this.setEventData(\"filter\", tab.predicate);\r\n this.filterData();\r\n }\r\n\r\n this.onFilterChange(\"filter\", tab.predicate);\r\n }\r\n\r\n onFiltersChange(filters: FilterChange[]): void {\r\n filters.forEach(f => {\r\n this.setEventData(f.type, f.event, f.options?.customName);\r\n });\r\n\r\n if (filters.some(f => f.options?.filterData)) {\r\n this.filterData();\r\n this.updateTabCounts();\r\n }\r\n\r\n this.tableRows && this.filterTableRows();\r\n\r\n this.change.emit(this.aggregateFilterEvent);\r\n\r\n // Ensures any focused buttons are blurred when clicked\r\n if (this.aggregateFilterEvent.trigger != \"search\" && document.activeElement) {\r\n (document.activeElement as HTMLElement).blur();\r\n }\r\n }\r\n\r\n onFilterChange(type: FilterTriggerType, event: any, options?: { customName?: string, filterData?: boolean }) {\r\n\r\n this.setEventData(type, event, options?.customName);\r\n\r\n if (options?.filterData) {\r\n this.filterData();\r\n this.updateTabCounts();\r\n }\r\n\r\n this.tableRows && this.filterTableRows();\r\n\r\n this.change.emit(this.aggregateFilterEvent);\r\n\r\n // Ensures any focused buttons are blurred when clicked\r\n if (this.aggregateFilterEvent.trigger != \"search\" && document.activeElement) {\r\n (document.activeElement as HTMLElement).blur();\r\n }\r\n }\r\n \r\n setSearchPredicate(searchPredicate: FilterBarItemSearchPredicate): void {\r\n this.searchPredicate = searchPredicate;\r\n }\r\n\r\n setEventData(type: FilterTriggerType, event: any, customName?: string) {\r\n this.aggregateFilterEvent.trigger = type;\r\n\r\n if (type == \"custom\") {\r\n if (!customName) {\r\n console.error(\"Custom Name required to use custom FilterTriggerType\");\r\n return;\r\n }\r\n\r\n if (!this.aggregateFilterEvent[type]) {\r\n this.aggregateFilterEvent[type] = [];\r\n }\r\n\r\n this.aggregateFilterEvent[type][customName.toString().toLocaleLowerCase()] = event;\r\n }\r\n else {\r\n this.aggregateFilterEvent[type] = event;\r\n }\r\n }\r\n\r\n childClosed(filter: IFilterBarFilter) {\r\n\r\n if (!filter || filter.selected) {\r\n return;\r\n }\r\n\r\n filter.visible = false;\r\n this.updateFilterVisibility(filter);\r\n }\r\n\r\n registerFilter(filter: IFilterBarFilter) {\r\n this.filters.push(filter);\r\n\r\n this.moreFilterTypes.push({\r\n label: filter.name,\r\n icon: filter.icon,\r\n data: filter\r\n });\r\n\r\n this.showAdditionalFilters = this.filters.length != 0;\r\n //filter.visible = true;\r\n this.updateFilterVisibility(filter);\r\n\r\n // This is a beta piece of code designed to show all filters if the space is available, currently coded out to alleviate test burden\r\n // Will be added back in later\r\n //this.hideFiltersIfRequired();\r\n }\r\n\r\n onTableColumnEditClicked(): void {\r\n this.filterBarService.toggleTableColumnEditor(true, this.tableColumns);\r\n }\r\n\r\n private hideFiltersIfRequired() {\r\n var width = this.remainingSpace?.nativeElement.getBoundingClientRect().width;\r\n\r\n var itemsToShow = Math.floor(width / 200) + this.filters.filter(f => f.visible).length;\r\n if (this.showAdditionalFilters && width < 250 || width < 200) {\r\n itemsToShow--;\r\n }\r\n\r\n // Reset\r\n this.filters.forEach((f, i) => {\r\n if (i < itemsToShow) {\r\n f.visible = true;\r\n }\r\n else {\r\n f.visible = false;\r\n }\r\n\r\n //console.log(f.name, i, itemsToShow, f.visible);\r\n this.updateFilterVisibility(f);\r\n });\r\n\r\n this.showAdditionalFilters = itemsToShow < this.filters.length;\r\n }\r\n\r\n registerFilterBarList(list: IFilterBarListWithCount) {\r\n this.filterBarListFilters.push(list);\r\n }\r\n\r\n onMoreFilterClick(dropdownItem: IVButtonDropDownItem) {\r\n dropdownItem.data.visible = !dropdownItem.data.visible;\r\n this.updateFilterVisibility(dropdownItem.data);\r\n\r\n // Auto click it, so it feels nice\r\n if (dropdownItem.data.visible) {\r\n dropdownItem.data.elementRef.nativeElement.querySelector(\"button\").click();\r\n }\r\n\r\n if (!dropdownItem.data.visible) {\r\n dropdownItem.data.selected = null;\r\n\r\n this.onFilterChange('custom', dropdownItem.data.selected, { customName: dropdownItem.data['defaultLabel'], filterData: true });\r\n }\r\n }\r\n\r\n filterChildData(filterBarFilter: IFilterBarFilter, filterData: T[]): T[] {\r\n if (!this.data?.length) {\r\n\r\n console.warn(\"FilterBar: No data provided\");\r\n return [];\r\n }\r\n\r\n // O(n*m) - needs refactoring\r\n return filterData.filter(filterData => this.data.some(d => filterBarFilter.filterPredicate(d, filterData)));\r\n }\r\n\r\n updateFilterVisibility(filter: IFilterBarFilter) {\r\n filter.elementRef.nativeElement.style.display = this.compact && !filter.visible ? 'none' : null;\r\n }\r\n\r\n // ---\r\n\r\n private showHideFilters() {\r\n this.filters.forEach(f => {\r\n this.updateFilterVisibility(f);\r\n });\r\n }\r\n\r\n updateTabCounts() {\r\n if (!this.tabs) {\r\n return;\r\n }\r\n\r\n // Reset count\r\n this.tabs.forEach(t => t.count = 0);\r\n\r\n // Add up tab count\r\n if (!this.data) {\r\n return;\r\n }\r\n\r\n // We use global data for this\r\n this.data.forEach(d => {\r\n if (!this.filterDataPredicate(d, true)) {\r\n return;\r\n }\r\n\r\n this.tabs.forEach(tab => {\r\n if (tab.predicate(d)) {\r\n tab.count++;\r\n }\r\n });\r\n });\r\n }\r\n\r\n private updateFilterListCounts(rebuildList = false): void {\r\n\r\n this.filterBarListFilters.forEach(l => {\r\n l.maxListItemCount = 0;\r\n\r\n if (rebuildList) {\r\n l.updateList(this.data);\r\n }\r\n else {\r\n l.items.forEach(item => {\r\n item.count = 0;\r\n item.countAsPercentageOfMax = 0;\r\n });\r\n }\r\n });\r\n\r\n // New logic, ALL filters that arent ourselves must pass\r\n this.updateAllFilterBarCounts();\r\n\r\n if (rebuildList) {\r\n // Now we sort\r\n this.filterBarListFilters.forEach(list => {\r\n list.items.sort((a, b) => {\r\n return b.count - a.count;\r\n });\r\n });\r\n }\r\n }\r\n\r\n private updateAllFilterBarCounts() {\r\n this.filterBarListFilters.forEach(list => {\r\n\r\n this.updateFilterBarCounts(list);\r\n });\r\n }\r\n\r\n private updateFilterBarCounts(list: IFilterBarListWithCount) {\r\n const otherFilterListsToinclude = this.filterBarListFilters.filter(f => f != list && f.selectedItems.length > 0);\r\n const itemLength = list.items.length;\r\n list.maxListItemCount = 0;\r\n\r\n for (var i = 0; i < itemLength; i++) {\r\n const item = list.items[i];\r\n\r\n this.updateItemCount(item, list, otherFilterListsToinclude);\r\n list.maxListItemCount = Math.max(list.maxListItemCount, item.count);\r\n };\r\n\r\n list.items.forEach(item => {\r\n item.countAsPercentageOfMax = list.maxListItemCount ? item.count * 100.0 / list.maxListItemCount : 0;\r\n });\r\n }\r\n\r\n private updateItemCount(item: IVerticalFilterListItem, itemList: IFilterBarListWithCount, otherFilterListsToinclude: IFilterBarListWithCount[]) {\r\n if (otherFilterListsToinclude) {\r\n otherFilterListsToinclude = this.filterBarListFilters.filter(f => f != itemList && f.selectedItems.length > 0);\r\n }\r\n\r\n item.count = this.aggregateFilterEvent.filteredData.filter(d => {\r\n const itemIncluded = item.predicate(d);\r\n\r\n if (!itemIncluded) {\r\n return false;\r\n }\r\n\r\n if (otherFilterListsToinclude.length == 0) {\r\n return true;\r\n }\r\n\r\n const filterConditionsPassStatuses = otherFilterListsToinclude.map(filterList => {\r\n const selectedItems = filterList.items.filter(f => f.selected);\r\n\r\n if (selectedItems.length === 0) {\r\n return true;\r\n }\r\n\r\n const result = filterList.multiSelectMode === 'every-filter'\r\n ? selectedItems.every(f => f.predicate(d))\r\n : selectedItems.some(f => f.predicate(d));\r\n\r\n return result;\r\n });\r\n\r\n return filterConditionsPassStatuses.every(c => c);\r\n }).length;\r\n }\r\n\r\n private filterData(): void {\r\n if (!this.data) {\r\n return;\r\n }\r\n\r\n // Filter Pass 1, tabs, searches, filters\r\n if (this.hasFilterApplied()) {\r\n this.aggregateFilterEvent.filteredData = this.data.filter(d => this.filterDataPredicate(d));\r\n\r\n // Update filter list counts\r\n this.updateFilterListCounts(this.aggregateFilterEvent.trigger == \"sourcedata\");\r\n\r\n // Filter Pass 2, vertical lists (in-page filtering)\r\n this.aggregateFilterEvent.filteredData = this.filterDataByListFilters(this.aggregateFilterEvent.filteredData);\r\n }\r\n else {\r\n this.aggregateFilterEvent.filteredData = this.data;\r\n\r\n // Update filter list counts\r\n this.updateFilterListCounts(this.aggregateFilterEvent.trigger == \"sourcedata\");\r\n }\r\n\r\n }\r\n\r\n private hasFilterApplied(): boolean {\r\n return this.aggregateFilterEvent.filter != undefined || this.aggregateFilterEvent.search != undefined || this.aggregateFilterEvent.custom != undefined;\r\n }\r\n\r\n private filterDataPredicate(data: T, ignoreTabFilter = false): boolean {\r\n // Filter\r\n if (!ignoreTabFilter && this.aggregateFilterEvent.filter !== undefined && !this.aggregateFilterEvent.filter(data)) {\r\n return false;\r\n }\r\n\r\n // Text search\r\n if (this.searchPredicate && this.aggregateFilterEvent.search && !this.searchPredicate(data, this.aggregateFilterEvent.search)) {\r\n return false;\r\n }\r\n\r\n // Child filters\r\n for (var f of this.filters) {\r\n\r\n if (f.selected && f.filterPredicate && !f.filterPredicate(data, f.selected)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private filterDataByListFilters(data: T[]): T[] {\r\n const filterLists = this.filterBarListFilters\r\n .map(filterList => new FilterBarListIterable(filterList.multiSelectMode, filterList.selectedItems))\r\n .filter(filterList => filterList.selectedItems.length > 0);\r\n\r\n const result = data.filter(d => {\r\n return filterLists.every(fl => {\r\n const result = fl.mode === 'every-filter'\r\n ? fl.selectedItems.every(f => { return f.predicate(d) })\r\n : fl.selectedItems.some(f => { return f.predicate(d) });\r\n\r\n return result;\r\n })\r\n });\r\n \r\n return result;\r\n }\r\n\r\n private tableSearchPredicate(d, searchString): boolean {\r\n if (!this.tableColumns) {\r\n return;\r\n }\r\n\r\n const tableRow = this.tableRowsMap.get(d[this.rowDataUniqueKey]);\r\n\r\n if (!tableRow) {\r\n return false;\r\n }\r\n\r\n if (tableRow.searchString.includes(searchString.toLowerCase())) {\r\n return true;\r\n }\r\n }\r\n\r\n private filterTableRows() {\r\n if (!this.tableRows) {\r\n return;\r\n }\r\n\r\n this.tableRows.forEach(row => row.hide = true);\r\n\r\n if (!this.aggregateFilterEvent?.filteredData?.length) {\r\n this.filterBarService.dataChanged.next();\r\n return;\r\n }\r\n\r\n this.aggregateFilterEvent.filteredData.forEach(data => {\r\n const row = this.tableRowsMap.get(data[this.rowDataUniqueKey]);\r\n\r\n if (row) {\r\n row.hide = false;\r\n }\r\n });\r\n\r\n this.filterBarService.dataChanged.next();\r\n }\r\n}\r\n","import { HttpClientModule } from \"@angular/common/http\";\r\nimport { FactoryProvider, NgModule } from '@angular/core';\r\nimport { AccountService } from '@services/account.service';\r\nimport { CameraCommunicationServer } from '@services/cameraCommunicationServer.service';\r\nimport { ChartService } from '@services/charts.service';\r\nimport { ColourService } from '@services/colour.service';\r\nimport { GoogleService } from '@services/google.service';\r\nimport { GoogleMarkerService } from '@services/googleMarker.service';\r\nimport { JourneyService } from '@services/journey.service';\r\nimport { LoginService } from '@services/login.service.ajs';\r\nimport { MapService } from '@services/map.service';\r\nimport { NavigationService } from '@services/navigation.service';\r\nimport { PlotService } from '@services/plot.service';\r\nimport { PlotEventService } from '@services/plotEvent.service';\r\nimport { PopupService } from '@services/popup.service';\r\nimport { ThemeService } from '@services/theme.service';\r\nimport { TranslationService } from '@services/translation.service';\r\nimport { TemperatureService } from '@temperature/_services/temperature.service';\r\nimport { VehicleDataService } from '../main/components/fleetMaintenance/vehicleData.service';\r\nimport { AccountFeatureService } from './accountFeature.service';\r\nimport { AvatarService } from './avatar.service';\r\nimport { BreadcrumbService } from './breadcrumb.service';\r\nimport { CanvasService } from './canvas.service';\r\nimport { ConstantsService } from './constantsService';\r\nimport { CurrentUserService } from './currentUser.service';\r\nimport { DisplayService } from './display.service';\r\nimport { DriverService } from './driver.service';\r\nimport { DriverAssignmentService } from './driverAssignment.service';\r\nimport { FileReaderService } from './fileReader.service';\r\nimport { FullScreenService } from './fullscreen.service';\r\nimport { GeocodeService } from './geocode.service';\r\nimport { GeofenceService } from './geofence.service';\r\nimport { GroupService } from './group.service.ajs';\r\nimport { HTMLService } from './htmlService.service';\r\nimport { MapzenService } from \"./mapzen.service\";\r\nimport { PreferencesService } from './preferences.service';\r\nimport { ProductService } from \"./product.service\";\r\nimport { ReasonCodeService } from \"./reasonCode.service\";\r\nimport { SamlService } from \"./saml.service\";\r\nimport { SessionService } from './session.service';\r\nimport { TachoService } from './tacho.service';\r\nimport { UnitConversionService } from './unitConversion.service';\r\nimport { UsersService } from './users.service';\r\nimport { UtilisationService } from \"./utilisation.service\";\r\nimport { VehicleService } from './vehicle.service';\r\nimport { VeriDate } from './veriDate.service';\r\nimport { VeriMarkerService } from './veriMarker.service';\r\nimport { VorService } from './vor.service';\r\n\r\nexport function providerCreator(provide: any, providerString: string): FactoryProvider {\r\n\r\n function serviceFactory(i: angular.Injectable) { return i.get(providerString); }\r\n\r\n return {\r\n provide: provide,\r\n useFactory: serviceFactory,\r\n deps: ['$injector']\r\n };\r\n}\r\n\r\nexport function googleMarkerServiceFactory(i: angular.Injectable) { return i.get('googleMarkerService'); }\r\nexport const googleMarkerServiceProvider: FactoryProvider = { provide: GoogleMarkerService, useFactory: googleMarkerServiceFactory, deps: ['$injector'] };\r\n\r\nexport function journeyServiceFactory(i: angular.Injectable) { return i.get('journeyService'); }\r\nexport const journeyServiceProvider = { provide: JourneyService, useFactory: journeyServiceFactory, deps: ['$injector'] };\r\n\r\nexport function colourServiceFactory(i: angular.Injectable) { return i.get('colourService'); }\r\nexport const colourServiceProvider = { provide: ColourService, useFactory: colourServiceFactory, deps: ['$injector'] };\r\n\r\nexport function chartServiceFactory(i: angular.Injectable) { return i.get('chartService'); }\r\nexport const chartServiceProvider = { provide: ChartService, useFactory: chartServiceFactory, deps: ['$injector'] };\r\n\r\nexport function loginServiceFactory(i: angular.Injectable) { return i.get('loginService'); }\r\nexport const loginServiceProvider = { provide: LoginService, useFactory: loginServiceFactory, deps: ['$injector'] };\r\n\r\nexport function accountServiceFactory(i: angular.Injectable) { return i.get('accountService'); }\r\nexport const accountServiceProvider = { provide: AccountService, useFactory: accountServiceFactory, deps: ['$injector'] };\r\n\r\nexport function sessionServiceFactory(i: angular.Injectable) { return i.get('sessionService'); }\r\nexport const sessionServiceProvider = { provide: SessionService, useFactory: sessionServiceFactory, deps: ['$injector'] };\r\n\r\nexport function plotServiceFactory(i: angular.Injectable) { return i.get('plotService'); }\r\nexport const plotServiceProvider = { provide: PlotService, useFactory: plotServiceFactory, deps: ['$injector'] };\r\n\r\nexport function googleServiceFactory(i: angular.Injectable) { return i.get('googleService'); }\r\nexport const googleServiceProvider = { provide: GoogleService, useFactory: googleServiceFactory, deps: ['$injector'] };\r\n\r\nexport function popupServiceFactory(i: angular.Injectable) { return i.get('popupService'); }\r\nexport const popupServiceProvider = { provide: PopupService, useFactory: popupServiceFactory, deps: ['$injector'] };\r\n\r\nexport function mapServiceFactory(i: angular.Injectable) { return i.get('mapService'); }\r\nexport const mapServiceProvider = { provide: MapService, useFactory: mapServiceFactory, deps: ['$injector'] };\r\n\r\nexport function mapzenServiceFactory(i: angular.Injectable) { return i.get('mapzenService'); }\r\nexport const mapzenServiceProvider = { provide: MapzenService, useFactory: mapzenServiceFactory, deps: ['$injector'] };\r\n\r\nexport function vehicleServiceFactory(i: angular.Injectable) { return i.get('vehicleService'); }\r\nexport const vehicleServiceProvider = { provide: VehicleService, useFactory: vehicleServiceFactory, deps: ['$injector'] };\r\n\r\nexport function driverServiceFactory(i: angular.Injectable) { return i.get('driverService'); }\r\nexport const driverServiceProvider = { provide: DriverService, useFactory: driverServiceFactory, deps: ['$injector'] };\r\n\r\nexport function groupServiceFactory(i: angular.Injectable) { return i.get('groupService'); }\r\nexport const groupServiceProvider = { provide: GroupService, useFactory: groupServiceFactory, deps: ['$injector'] };\r\n\r\nexport function tachoServiceFactory(i: angular.Injectable) { return i.get('tachoService'); }\r\nexport const tachoServiceProvider = { provide: TachoService, useFactory: tachoServiceFactory, deps: ['$injector'] };\r\n\r\nexport function vehicleDataFactory(i: angular.Injectable) { return i.get('vehicleDataService'); }\r\nexport const vehicleDataServiceProvider = { provide: VehicleDataService, useFactory: vehicleDataFactory, deps: ['$injector'] };\r\n\r\nexport function veriDateFactory(i: angular.Injectable) { return i.get('veriDate'); }\r\nexport const veriDateProvider = { provide: VeriDate, useFactory: veriDateFactory, deps: ['$injector'] };\r\n\r\nexport function currentUserServiceFactory(i: angular.Injectable) { return i.get('currentUserService'); }\r\nexport const currentUserServiceProvider = { provide: CurrentUserService, useFactory: currentUserServiceFactory, deps: ['$injector'] };\r\n\r\nexport function usersServiceFactory(i: angular.Injectable) { return i.get('usersService'); }\r\nexport const usersServiceProvider = { provide: UsersService, useFactory: usersServiceFactory, deps: ['$injector'] };\r\n\r\nexport function accountFeatureServiceFactory(i: angular.Injectable) { return i.get('accountFeatureService'); }\r\nexport const accountFeatureServiceProvider = { provide: AccountFeatureService, useFactory: accountFeatureServiceFactory, deps: ['$injector'] };\r\n\r\nexport function avatarServiceFactory(i: angular.Injectable) { return i.get('avatarService'); }\r\nexport const avatarServiceProvider = { provide: AvatarService, useFactory: avatarServiceFactory, deps: ['$injector'] };\r\n\r\nexport function constantsServiceFactory(i: angular.Injectable) { return i.get('constantsService'); }\r\nexport const constantsServiceProvider = { provide: ConstantsService, useFactory: constantsServiceFactory, deps: ['$injector'] };\r\n\r\nexport function unitConverisonFactory(i: angular.Injectable) { return i.get('unitConversionService'); }\r\nexport const unitConversionServiceProvider = { provide: UnitConversionService, useFactory: unitConverisonFactory, deps: ['$injector'] };\r\n\r\nexport function geofenceServiceFactory(i: angular.Injectable) { return i.get('geofenceService'); }\r\nexport const geofenceServiceProvider = { provide: GeofenceService, useFactory: geofenceServiceFactory, deps: ['$injector'] };\r\n\r\nexport function geocodeServiceFactory(i: angular.Injectable) { return i.get('geocodeService'); }\r\nexport const geocodeServiceProvider = { provide: GeocodeService, useFactory: geocodeServiceFactory, deps: ['$injector'] };\r\n\r\nexport function driverAssignmentServiceFactory(i: angular.Injectable) { return i.get('driverAssignmentService'); }\r\nexport const driverAssignmentServiceProvider = { provide: DriverAssignmentService, useFactory: driverAssignmentServiceFactory, deps: ['$injector'] };\r\n\r\nexport function fullScreenServiceFactory(i: angular.Injectable) { return i.get('fullScreenService'); }\r\nexport const fullScreenServiceProvider = { provide: FullScreenService, useFactory: fullScreenServiceFactory, deps: ['$injector'] };\r\n\r\nexport function canvasServiceFactory(i: angular.Injectable) { return i.get('canvasService'); }\r\nexport const canvasServiceProvider = { provide: CanvasService, useFactory: canvasServiceFactory, deps: ['$injector'] };\r\n\r\nexport function veriMarkerServiceFactory(i: angular.Injectable) { return i.get('veriMarkerService'); }\r\nexport const veriMarkerServiceProvider = { provide: VeriMarkerService, useFactory: veriMarkerServiceFactory, deps: ['$injector'] };\r\n\r\nexport function fileReaderServiceFactory(i: angular.Injectable) { return i.get('fileReaderService'); }\r\nexport const fileReaderServiceProvider = { provide: FileReaderService, useFactory: fileReaderServiceFactory, deps: ['$injector'] };\r\n\r\nexport function displayServiceFactory(i: angular.Injectable) { return i.get('displayService'); }\r\nexport const displayServiceProvider = { provide: DisplayService, useFactory: displayServiceFactory, deps: ['$injector'] };\r\n\r\nexport function translationServiceFactory(i: angular.Injectable) { return i.get('translationService'); }\r\nexport const translationServiceProvider = { provide: TranslationService, useFactory: translationServiceFactory, deps: ['$injector'] };\r\n\r\n@NgModule({\r\n imports: [\r\n HttpClientModule\r\n ],\r\n providers: [\r\n providerCreator(VorService, \"vorService\"),\r\n providerCreator(ReasonCodeService, \"reasonCodeService\"),\r\n providerCreator(CameraCommunicationServer, \"cameraCommunicationServer\"),\r\n providerCreator(ThemeService, \"themeService\"),\r\n providerCreator(HTMLService, \"htmlService\"),\r\n providerCreator(PlotEventService, \"plotEventService\"),\r\n providerCreator(DisplayService, \"displayService\"),\r\n providerCreator(BreadcrumbService, \"breadcrumbService\"),\r\n providerCreator(NavigationService, \"navigationService\"),\r\n providerCreator(PreferencesService, \"preferencesService\"),\r\n providerCreator(TemperatureService, \"temperatureService\"),\r\n providerCreator(ProductService, \"productService\"),\r\n providerCreator(UtilisationService, \"utilisationService\"),\r\n providerCreator(SamlService, \"SamlService\"),\r\n googleMarkerServiceProvider,\r\n journeyServiceProvider,\r\n colourServiceProvider,\r\n chartServiceProvider,\r\n loginServiceProvider,\r\n accountServiceProvider,\r\n sessionServiceProvider,\r\n vehicleServiceProvider,\r\n plotServiceProvider,\r\n googleServiceProvider,\r\n mapServiceProvider,\r\n mapzenServiceProvider,\r\n popupServiceProvider,\r\n driverServiceProvider,\r\n groupServiceProvider,\r\n tachoServiceProvider,\r\n vehicleDataServiceProvider,\r\n veriDateProvider,\r\n currentUserServiceProvider,\r\n usersServiceProvider,\r\n accountFeatureServiceProvider,\r\n avatarServiceProvider,\r\n constantsServiceProvider,\r\n unitConversionServiceProvider,\r\n geofenceServiceProvider,\r\n geocodeServiceProvider,\r\n driverAssignmentServiceProvider,\r\n fullScreenServiceProvider,\r\n canvasServiceProvider,\r\n veriMarkerServiceProvider,\r\n fileReaderServiceProvider,\r\n translationServiceProvider \r\n ]\r\n})\r\nexport class ServicesModule {\r\n constructor() {\r\n }\r\n}\r\n","import * as angular from \"angular\";\r\nimport { IPlot } from \"@interfaces/IPlot\";\r\nimport { ILocationInformation } from \"@app/interfaces/ILocationInformation\";\r\n\r\nexport enum BoundsSource {\r\n Estimated = 0,\r\n Google = 1\r\n}\r\n\r\nexport interface IGeocodedAddressLatLng {\r\n Latitude: number;\r\n Longitude: number;\r\n}\r\n\r\nexport interface IGeocodedAddress {\r\n BoundsSource: BoundsSource;\r\n FormattedAddress: string;\r\n Id: number;\r\n PlaceId: string;\r\n PostCode: string;\r\n UtcUpdated: string;\r\n\r\n CenterPoint: IGeocodedAddressLatLng;\r\n BoundsPoints: IGeocodedAddressLatLng[];\r\n}\r\n\r\nexport interface IGeocode {\r\n BoundsSource: BoundsSource;\r\n FormattedAddress: string;\r\n PlaceId: string;\r\n PostCode: string;\r\n UpdatedTime: string;\n Area: number;\r\n\r\n CenterPoint: number[];\r\n Bounds: number[][];\r\n}\r\n\n\nexport interface IAddressComponent {\n ShortName: string;\r\n LongName: string;\n}\n\nexport interface IGeometry {\n location: { lat: number, lng: number };\r\n location_type: string;\r\n viewport: IViewPort;\n bounds: IViewPort;\n}\n\nexport interface IViewPort {\n northeast: { lat: number, lng: number };\n southwest: { lat: number, lng: number };\r\n}\n\nexport enum LocationType { }\n\nexport interface IGeocodeResult {\r\n address_components: IAddressComponent[];\r\n formatted_address: string;\r\n geometry: IGeometry;\r\n place_id: string;\r\n types: number[];\n}\r\n\r\nexport class GeocodeService {\r\n\r\n geocoder: google.maps.Geocoder;\r\n\r\n static $inject = [\"$q\", \"$http\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $http: angular.IHttpService) {\r\n }\r\n \n getPointFromAddress(address: string, isCountryCode: boolean = false): angular.IPromise {\n\n return this\r\n .$http({\r\n method: \"GET\",\r\n url: \"/api/map/geocode\",\r\n params: { address: address, isCountryCode: isCountryCode }\r\n })\r\n .then((response: angular.IHttpResponse) => {\r\n return response.data;\r\n });\n }\r\n\r\n getAddressFromPoint(latlng: google.maps.LatLng): angular.IPromise {\r\n return this\r\n .$http({\r\n method: \"GET\",\r\n url: \"/api/map/reversegeocode\",\r\n params: { lat: latlng.lat().toFixed(5), lng: latlng.lng().toFixed(5) }\r\n })\r\n .then((response: angular.IHttpResponse) => {\r\n return response.data;\r\n });\r\n }\n \n getLocationInformationFromLatLong(latlng: google.maps.LatLng): Promise {\n return (this.getAddressFromPoint(latlng) as Promise);\n }\r\n \n getLocationInformationFromPlotId(plotId: number): angular.IPromise {\n return this\r\n .$http({\r\n method: \"GET\",\r\n url: \"/api/map/reversegeocodeplot\",\r\n params: { plotId }\r\n })\r\n .then((response: angular.IHttpResponse) => {\r\n return response.data;\r\n });\r\n }\n \n getLocationInformationFromVideo(videoEntryId: number): angular.IPromise {\r\n return this\r\n .$http({\r\n method: \"GET\",\r\n url: `/api/map/reversegeocode/video/${videoEntryId}`,\r\n })\r\n .then((response: angular.IHttpResponse) => {\r\n return response.data;\r\n });\r\n }\n \r\n}\r\n","export class PageStateNames {\r\n\r\n // ReSharper disable InconsistentNaming\r\n\r\n static AUTHENTICATION_LOCK = \"app.pages_auth_lock\";\r\n static AUTHENTICATION_LOGIN = \"app.pages_auth_login\";\r\n\r\n static get AUTHORIZATION_UNAUTHORIZED(): string { return \"app.unauthorized\"; }\r\n\r\n static get AUTHENTICATION_FORGOTPASSWORD(): string { return \"app.pages_auth_forgot-password\"; }\r\n static get AUTHENTICATION_REGISTER(): string { return \"app.pages_auth_register\"; }\r\n\r\n static get COMPONENTS_ACCOUNT(): string { return \"app.components_account\"; }\r\n static get COMPONENTS_CALENDAR(): string { return \"app.components_calendar\"; }\r\n //static get COMPONENTS_FLEET_DASHBOARD(): string { return \"app.fleet.components_dashboard\"; }\r\n static get COMPONENTS_DASHBOARD_OLD(): string { return \"app.components_dashboard_old\"; }\r\n //static get COMPONENTS_HELP(): string { return \"app.components_help\"; }\r\n //static get COMPONENTS_JOB(): string { return \"app.components_job\"; }\r\n //static get COMPONENTS_LIVEMAP(): string { return \"app.components_livemap\"; }\r\n //static get COMPONENTS_VEHICLES(): string { return \"app.components_vehicles\"; }\r\n //static get COMPONENTS_DRIVERS(): string { return \"app.components_drivers\"; }\r\n //static get COMPONENTS_VIDEOS(): string { return \"app.cameras.components_videos\"; }\r\n //static get COMPONENTS_MESSAGING(): string { return \"app.components_messaging\"; }\r\n static get COMPONENTS_TMS(): string { return \"app.tms.components_tms\"; }\r\n static get COMPONENTS_REPORT(): string { return \"app.components_reports\"; }\r\n //static get COMPONENTS_INSIGHTS(): string { return \"app.components_insights\"; }\r\n static get COMPONENTS_DYNAMICREPORTS(): string { return \"app.components_dynamicReports\"; }\r\n static get COMPONENTS_INTERACTIVEREPORTS(): string { return \"app.components_interactiveReports\"; }\r\n\r\n static get COMPONENTS_SETTINGS(): string { return \"app.components_settings\"; }\r\n //static get COMPONENTS_COMPLIANCE(): string { return \"app.components_compliance\"; }\r\n static get COMPONENTS_TEMPLATE(): string { return \"app.components_TEMPLATE\"; }\r\n static get COMPONENTS_WIDGETS(): string { return \"app.components_widgets\"; }\r\n\r\n static get COMPONENTS_STREAM(): string { return \"app.components_stream\"; }\r\n static get COMPONENTS_RESOURCEMANAGEMENT(): string { return \"app.components_resourceManagement\"; }\r\n\r\n static get COMPONENTS_DIAGNOSTICS(): string { return \"app.components_diagnostics\"; }\r\n\r\n static get COMPONENTS_MOBILE_ALL_VEHICLES_MAP(): string { return \"app.components_mobile_all_vehicles_map\"; }\r\n\r\n static get FOUNDATION_CUSTOMERS(): string { return \"app.foundation.customers\"; }\r\n static get FOUNDATION_CUSTOMERS_OVERVIEW(): string { return \"app.foundation.customers.view.overview\"; }\r\n //static DEFAULT_PAGE = PageStateNames.COMPONENTS_FLEET_DASHBOARD;\r\n\r\n // ReSharper restore InconsistentNaming\r\n}\r\n","import { VideoEventCode } from \"../enums/VideoEventCode\";\r\nimport { VideoReviewStatus } from \"../enums/VideoReviewStatus.enum\";\r\nimport { VideoStatus } from \"../enums/VideoStatus\";\r\nimport { IVideoEntry } from \"../models/IVideoEntry\";\r\n\r\nexport class VideoEntryUtils {\r\n static isEventAndActive(v: IVideoEntry): boolean {\r\n return v.EventCode != VideoEventCode.UserRequested && v.Status != VideoStatus.Archived;\r\n }\r\n\r\n static isUnseen(v: IVideoEntry) {\r\n return v.Status == VideoStatus.Downloaded && !VideoEntryUtils.isSeen(v);\r\n }\r\n\r\n static isSeen(v: IVideoEntry): boolean {\r\n return v.Status == VideoStatus.Downloaded && v.MetaData && v.MetaData.Watched.length > 0;\r\n }\r\n\r\n static isRequested(videoEntry: IVideoEntry): boolean {\r\n const requestedStates: VideoStatus[] = [\r\n VideoStatus.UploadRequested,\r\n VideoStatus.UserUploadRequested\r\n ]\r\n\r\n return requestedStates.includes(videoEntry.Status);\r\n }\r\n\r\n static isDownloading(videoEntry: IVideoEntry): boolean {\r\n const downloadingStates: VideoStatus[] = [\r\n VideoStatus.Uploading,\r\n VideoStatus.Uploaded,\r\n VideoStatus.PartiallyUploaded\r\n ];\r\n\r\n return downloadingStates.includes(videoEntry.Status);\r\n }\r\n\r\n static isDownloaded(videoEntry: IVideoEntry): boolean {\r\n if (this.hasNoFootage(videoEntry)) {\r\n videoEntry.Status = VideoStatus.NoFootageAvailable;\r\n }\r\n\r\n const downloadedStates: VideoStatus[] = [\r\n VideoStatus.Downloaded,\r\n VideoStatus.PartiallyDownloaded\r\n ];\r\n\r\n return downloadedStates.includes(videoEntry.Status) || (videoEntry.Status === VideoStatus.Archived && !!videoEntry.DateDownloaded);\r\n }\r\n\r\n static isFaceblurring(videoEntry: IVideoEntry): boolean {\r\n const faceblurringStates: VideoStatus[] = [\r\n VideoStatus.AwaitingIndexing,\r\n VideoStatus.AwaitingRedaction,\r\n VideoStatus.RedactionCompleted,\r\n VideoStatus.IndexingInProgress,\r\n VideoStatus.RedactionInProgress,\r\n VideoStatus.AwaitingVideoMute\r\n ]\r\n\r\n return faceblurringStates.includes(videoEntry.Status);\r\n }\r\n\r\n static isDownloadFailed(videoEntry: IVideoEntry): boolean {\r\n if (this.hasNoFootage(videoEntry)) {\r\n videoEntry.Status = VideoStatus.NoFootageAvailable;\r\n }\r\n\r\n const failedStates: VideoStatus[] = [\r\n VideoStatus.Error,\r\n VideoStatus.NoFootageAvailable,\r\n VideoStatus.NoFilesAvailable,\r\n VideoStatus.HardwareDeleted,\r\n VideoStatus.Cancelled,\r\n VideoStatus.Expired\r\n ];\r\n\r\n return failedStates.includes(videoEntry.Status);\r\n }\r\n\r\n static isDeleted(videoEntry: IVideoEntry): boolean {\r\n const deletedStates: VideoStatus[] = [\r\n VideoStatus.MediaDeleted,\r\n VideoStatus.MediaPendingDeletion\r\n ];\r\n\r\n return deletedStates.includes(videoEntry.Status);\r\n }\r\n\r\n static isDownloadedOrDownloading(videoEntry: IVideoEntry): boolean {\r\n return VideoEntryUtils.isDownloaded(videoEntry) || VideoEntryUtils.isDownloading(videoEntry);\r\n }\r\n\r\n static needsReview(v: IVideoEntry): boolean {\r\n if (!VideoEntryUtils.isDownloaded(v)) {\r\n return false;\r\n }\r\n\r\n return v.reviewStatus === VideoReviewStatus.NeedsReview;\r\n }\r\n\r\n static getVideoDownloadProgress(videoEvent: IVideoEntry): number {\r\n return videoEvent.Status == VideoStatus.Downloaded ? 100 : videoEvent.MetaData.DownloadProgress;\r\n }\r\n\r\n static hasNoFootage(videoEntry: IVideoEntry): boolean {\r\n if (videoEntry.Status == VideoStatus.PartiallyDownloaded && !videoEntry.Mp4VideoFileGuid) {\r\n // There are some instances of videos that show as PartiallyDownloaded but have no associated files\r\n return true;\r\n }\r\n\r\n const noFootageStates: VideoStatus[] = [\r\n VideoStatus.NoFilesAvailable,\r\n VideoStatus.NoFootageAvailable\r\n ];\r\n\r\n return noFootageStates.includes(videoEntry.Status);\r\n }\r\n\r\n static isRequestComplete(videoEntry: IVideoEntry): boolean {\r\n return VideoEntryUtils.hasNoFootage(videoEntry) || VideoEntryUtils.isDownloadFailed(videoEntry) || VideoEntryUtils.isDownloaded(videoEntry);\r\n }\r\n}\r\n","export enum VideoEventCode {\r\n Unknown = -1,\r\n Button = 0,\r\n Speed = 1,\r\n Acceleration = 2,\r\n LowShock = 3,\r\n MediumShock = 4,\r\n HighShock = 5,\r\n Braking = 6,\r\n Turning = 7,\r\n UserRequested = 8,\r\n Sensor = 9,\r\n Exception = 10,\r\n Motion = 11,\r\n PowerOff = 12,\r\n DriverFatigue = 13,\r\n DriverOnPhone = 14,\r\n DriverSmoking = 15,\r\n DriverDistraction = 16,\r\n DriverAbsent = 17,\r\n Pedestrian = 18,\r\n Collision = 19,\r\n LaneDeparture = 20,\r\n VehicleTooClose = 21,\r\n DriverLogin = 22,\r\n BlindSpot = 23,\r\n NoSeatBelt = 24,\r\n DriverYawn = 25,\r\n CameraCovered = 26,\r\n SpeedLimitSign = 27,\r\n SpeedWarning = 28,\r\n StopSignAlarm = 29\r\n}\r\n","import { ResourceType } from \"@enums/ResourceType\";\r\nimport { IComboBox } from \"@interfaces/IComboBox\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { IDriver } from \"@interfaces/IDriver\";\r\nimport { IGroup, IGroupMapping } from \"@interfaces/IVehicleGroup\";\r\nimport { SessionService } from \"@services/session.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport * as angular from \"angular\";\r\nimport copy from \"fast-copy/dist/fast-copy.esm.js\";\r\nimport { CacheService } from \"./cache.Service\";\r\nimport { VehicleService } from \"./vehicle.service\";\r\nimport { IResourceGroupListEntry } from \"@app/main/components/resourceManagement/groups/_models/IResourceGroupListEntry\";\r\n\r\nexport class GroupService {\r\n\r\n private groupNamesCache = \"groupNamesCache\";\r\n private groupsBasicMappingsCache = \"groupsBasicMappingsCache\";\r\n private groupsFullMappingsCache = \"groupsFullMappingsCache\";\r\n\r\n static $inject = [\"$q\", \"$http\", \"cacheService\", \"vehicleService\", \"sessionService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $http: angular.IHttpService,\r\n private readonly cacheService: CacheService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly sessionService: SessionService,\r\n private readonly translationService: TranslationService) {\r\n\r\n this.cacheService.createCache(this.groupNamesCache, { maxAge: 60 * 60 * 1000 });\r\n this.cacheService.createCache(this.groupsBasicMappingsCache, { maxAge: 60 * 60 * 1000 });\r\n this.cacheService.createCache(this.groupsFullMappingsCache, { maxAge: 60 * 60 * 1000 });\r\n }\r\n\r\n groupSearchPredicate(group: IGroup, text: string): boolean {\r\n return group.Name.toLowerCase().indexOf(text) >= 0;\r\n }\r\n\r\n searchGroups(groups: IGroup[], text: string) {\r\n return groups.filter(v => this.groupSearchPredicate(v, text));\r\n }\r\n\r\n addGroupsIdsToVehicles(vehicles: IVehicle[] = [], groups: IGroup[] = []): void {\r\n if (!vehicles?.length || !groups?.length) {\r\n return;\r\n }\r\n\r\n vehicles.forEach(vehicle => {\r\n vehicle.GroupIds = groups.filter(group => group.VehicleIds.includes(vehicle.Id)).map(group => group.Id);\r\n });\r\n }\r\n\r\n addGroupsToVehicles(groups: IGroup[], vehicleList: IVehicle[]) {\r\n // Clear any vehicle of its existing group placements\r\n for (let a = 0; a < vehicleList.length; a++) {\r\n const aVehicle = vehicleList[a];\r\n aVehicle.groups = [];\r\n }\r\n\r\n //for (var i = 0, group; group = groups[i]; i++) { //faster version\r\n for (let i = 0; i < groups.length; i++) {\r\n const group = groups[i];\r\n\r\n // Loop through every vehicle and attempt to assign ourselves to it\r\n for (let j = 0; j < group.VehicleIds.length; j++) {\r\n const groupVehicle = group.VehicleIds[j];\r\n\r\n // Now go through every vehicle we have and tell it what groups are in it\r\n for (let k = 0; k < vehicleList.length; k++) {\r\n if (k === groupVehicle) {\r\n const vehicle = vehicleList[k];\r\n\r\n if (this.vehicleService.showVehicleWithNoUnit(vehicle) && this.vehicleService.showNonFunctioningUnit(vehicle)) {\r\n vehicle.groups.push(group);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n deleteGroup(group: IGroup): angular.IPromise {\r\n\r\n return this.$http(\r\n {\r\n method: \"DELETE\",\r\n url: `/api/groups/${group.Id}`\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n\r\n this.unsetGroupRelations(group);\r\n\r\n this.cacheService.deleteItem(this.groupsFullMappingsCache, group, (i1, i2) => i1.Id == i2.Id);\r\n\r\n return result;\r\n });\r\n }\r\n\r\n findGroup(groups: IGroup[], groupId: number): IGroup {\r\n for (let i = 0; i < groups.length; i++) {\r\n const group = groups[i];\r\n\r\n if (group.Id === groupId) {\r\n return group;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n hasDriver(group: IGroup, driverId: number): boolean {\r\n if (group.DriverIds.indexOf(driverId) >= 0) {\r\n return true;\r\n };\r\n\r\n if (group.children && group.children.length > 0) {\r\n for (let i = 0; i < group.children.length; i++) {\r\n if (this.hasDriver(group.children[i], driverId)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n hasVehicle(group: IGroup, vehicleId: number): boolean {\r\n if (group.VehicleIds.indexOf(vehicleId) >= 0) {\r\n return true;\r\n };\r\n\r\n if (group.children && group.children.length > 0) {\r\n for (let i = 0; i < group.children.length; i++) {\r\n if (this.hasVehicle(group.children[i], vehicleId)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n findGroupIdsAssetBelongsTo(groups: IGroup[], idToMatch: number, assetType: \"VehicleIds\" | \"DriverIds\" | \"UserIds\" | \"GeofenceIds\"): number[] {\r\n var groupIds: number[] = [];\r\n\r\n for (let i = 0; i < groups.length; i++) {\r\n const group = groups[i];\r\n const assets = group[assetType];\r\n\r\n for (let j = 0; j < assets.length; j++) {\r\n const assetId = assets[j];\r\n\r\n if (assetId == idToMatch) {\r\n groupIds.push(group.Id);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return groupIds;\r\n }\r\n\r\n findMapping(mappings: IGroupMapping[], resourceId: number): IGroupMapping {\r\n if (!mappings) {\r\n return null;\r\n }\r\n\r\n for (var i = 0; i < mappings.length; i++) {\r\n const mapping = mappings[i];\r\n\r\n if (mapping.ResourceId == resourceId) {\r\n return mapping;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n findDepotsWithHomeLocations(groups: IGroup[]): IGroup[] {\r\n\r\n return groups.filter(g => g.IsDepot && g.GeofenceId);\r\n }\r\n\r\n getDepots(includeDepotSubGroups: boolean, group: IGroup, groups: IGroup[]): IGroup[] {\r\n var depots = groups.filter(g => g.IsDepot && g.Id != group.Id);\r\n if (!includeDepotSubGroups) {\r\n return depots;\r\n }\r\n\r\n depots.forEach(depot => {\r\n var children = this.getFlatChildGroupList(depot);\r\n depots = depots.concat(children);\r\n });\r\n\r\n return depots;\r\n }\r\n\r\n getGroupNames(invalidateCache: boolean = false): angular.IPromise {\r\n return this.cacheService.getOrRetrieveData(this.groupNamesCache, () => this.getGroupsFromDatabase(\"names\"), invalidateCache);\r\n }\r\n\r\n getGroups(invalidateCache: boolean = false, unsafe = false): angular.IPromise {\r\n return this.cacheService.getOrRetrieveData(this.groupsBasicMappingsCache, () => this.getGroupsFromDatabase(\"basic\"), invalidateCache, unsafe);\r\n }\r\n\r\n getGroupsWithFullMappings(invalidateCache: boolean = false, unsafe = false): angular.IPromise {\r\n return this.cacheService.getOrRetrieveData(this.groupsFullMappingsCache, () => this.getGroupsFromDatabase(\"full\"), invalidateCache, unsafe);\r\n }\r\n\r\n // groupsFullMappingsCache\r\n addOrUpdateGpoupWithFullMappings(group: IGroup) {\r\n\r\n if (group.ParentId) {\r\n this.getGroupsWithFullMappings().then((groups) => {\r\n const parent = this.findGroup(groups, group.ParentId);\r\n\r\n this.setGroupsRelations(group, parent, groups);\r\n\r\n });\r\n } else {\r\n this.addOrUpdateGroup(group);\r\n }\r\n\r\n }\r\n\r\n // groupsFullMappingsCache\r\n private addOrUpdateGroup(group: IGroup): void {\r\n this.cacheService.addOrUpdateItem(this.groupsFullMappingsCache, group, (i1, i2) => i1.Id == i2.Id);\r\n }\r\n\r\n clearCaches() {\r\n this.cacheService.clearCache(this.groupNamesCache);\r\n this.cacheService.clearCache(this.groupsBasicMappingsCache);\r\n this.cacheService.clearCache(this.groupsFullMappingsCache);\r\n }\r\n\r\n getGroupComboBox(groups: IGroup[]): IComboBox[] {\r\n var options: IComboBox[] = [\r\n { Name: this.translationService.t(\"groupService.all\"), Value: 0 }\r\n ];\r\n\r\n groups.forEach(group => {\r\n options.push({\r\n Name: group.Name,\r\n Value: group.Id\r\n });\r\n });\r\n\r\n return options;\r\n }\r\n\r\n getGroup(groupId: number): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/groups/${groupId}`,\r\n method: \"GET\",\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n groupNameExists(groupName: string, existingGroupId: number): angular.IPromise {\r\n return this.$http(\r\n {\r\n method: \"GET\",\r\n url: \"/api/groups/groupexists\",\r\n params: { groupName: groupName.toLowerCase(), existingGroupId: existingGroupId }\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;;\r\n });\r\n }\r\n\r\n updateMappings(resourceType: ResourceType, entry: IResourceGroupListEntry, group: IGroup) {\r\n var propertyName = `Group${ResourceType[resourceType]}Mappings`;\r\n\r\n // Find existing item\r\n var matchedMapping = this.findMapping(group[propertyName], entry.id as number);\r\n\r\n if (matchedMapping) {\r\n // If we have an existing mapping, and we want to include Own this, then set it\r\n if (entry.included) {\r\n //console.log(\"OwnedByGroup = true\");\r\n matchedMapping.OwnedByGroup = true;\r\n }\r\n // If we have a mapping BUT also have visibility of this thanks to child groups\r\n else if (matchedMapping.Count > 0) {\r\n //console.log(\"OwnedByGroup = false\");\r\n matchedMapping.OwnedByGroup = false;\r\n }\r\n // If we have a mapping and we want to remove it, then do so\r\n else {\r\n //console.log(\"removeMapping\");\r\n this.removeMapping(group[propertyName], matchedMapping);\r\n }\r\n }\r\n else if (entry.included) {\r\n var groupMapping: IGroupMapping = {\r\n OwnedByGroup: true,\r\n ResourceId: entry.id,\r\n GroupId: group.Id,\r\n OwningGroupIds: []\r\n };\r\n\r\n group[propertyName].push(groupMapping);\r\n }\r\n\r\n return group;\r\n }\r\n\r\n removeMapping(mappings: IGroupMapping[], mapping: IGroupMapping /*resourceId: number*/) {\r\n //var mapping = this.findMapping(mappings, resourceId);\r\n var mappingIndex = mappings.indexOf(mapping);\r\n\r\n return mappings.splice(mappingIndex, 1);\r\n }\r\n\r\n removeVehiclesWithNoUnitFromGroup(group: IGroup, vehicles: IVehicle[]) {\r\n const newGroupVehicleMappings = [];\r\n\r\n if (!group.GroupVehicleMappings) {\r\n return;\r\n }\r\n\r\n group.GroupVehicleMappings.forEach(mapping => {\r\n const foundVehicle = vehicles.find(v => v.Id == mapping.ResourceId);\r\n if (!!foundVehicle) {\r\n newGroupVehicleMappings.push(mapping);\r\n }\r\n\r\n });\r\n\r\n group.GroupVehicleMappings = newGroupVehicleMappings;\r\n }\r\n\r\n removeInactiveDriversFromGroup(group: IGroup, drivers: IDriver[]) {\r\n const newGroupDriverMappings = [];\r\n\r\n if (!group.GroupDriverMappings) {\r\n return;\r\n }\r\n\r\n group.GroupDriverMappings.forEach(mapping => {\r\n\r\n if (drivers.find(d => d.Id == mapping.ResourceId)) {\r\n newGroupDriverMappings.push(mapping);\r\n }\r\n });\r\n\r\n group.GroupDriverMappings = newGroupDriverMappings;\r\n }\r\n\r\n\r\n saveGroups(groups: IGroup[]) {\r\n this.cacheService.save(this.groupsFullMappingsCache, groups);\r\n }\r\n\r\n saveGroup(group: IGroup): angular.IPromise {\r\n var copiedGroup = copy(group);\r\n\r\n // Prevent circular json references\r\n if (copiedGroup) {\r\n if (copiedGroup.children) {\r\n copiedGroup.children = null;\r\n }\r\n\r\n if (copiedGroup.parent) {\r\n copiedGroup.ParentId = copiedGroup.parent.Id;\r\n copiedGroup.parent = null;\r\n }\r\n }\r\n\r\n return this.$http(\r\n {\r\n method: \"POST\",\r\n url: \"/api/groups\",\r\n data: copiedGroup\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n setGroupSelections(groups: IGroup[], resourceName: \"Driver\" | \"Vehicle\", resourceId: number) {\r\n const propertyMapping = `Group${resourceName}Mappings`;\r\n\r\n groups.forEach(group => {\r\n group.selected = false;\r\n const mappings: IGroupMapping[] = group[propertyMapping];\r\n\r\n mappings.forEach(mapping => {\r\n group.selected = group.selected || (mapping.ResourceId == resourceId && mapping.OwnedByGroup);\r\n });\r\n });\r\n }\r\n\r\n setGroupParents(groups: IGroup[]) {\r\n // An odd things happen where we uber nest, lets correct it\r\n groups.forEach(g => {\r\n //if (g.parent && g.parent.parent) {\r\n // //g.parent = g.parent.parent;\r\n // this.setGroupParent(g, g.parent.parent);\r\n //}\r\n if (g.ParentId) {\r\n var parent = this.findGroup(groups, g.ParentId);\r\n this.setGroupsRelations(g, parent);\r\n }\r\n });\r\n }\r\n\r\n updateVehicleDepot(vehicleID: number, assignedDepotId: number, currentDepotId: number): angular.IPromise {\r\n\r\n return this.getGroupsWithFullMappings().then(groups => {\r\n let newVehicleDepot;\r\n\r\n const depots = groups.filter(g => g.IsDepot == true);\r\n const existingDepots: IGroup[] = [];\r\n const groupsToSave: IGroup[] = [];\r\n const groupsToModify: IGroup[] = [];\r\n const childrenGroupsToModify: IGroup[] = [];\r\n\r\n depots.forEach(depot => {\r\n\r\n if (depot.Id !== assignedDepotId && (depot.Id == currentDepotId || depot.GroupVehicleMappings.find(x => x.ResourceId == vehicleID))) {\r\n existingDepots.push(depot);\r\n }\r\n\r\n if (depot.Id == assignedDepotId) {\r\n newVehicleDepot = depot;\r\n }\r\n });\r\n\r\n\r\n if (existingDepots.length > 0) {\r\n\r\n existingDepots.forEach(existingDepot => {\r\n groupsToModify.push(...this.removeVehicleFromGroup(existingDepot, vehicleID));\r\n childrenGroupsToModify.push(...this.removeVehicleFromGroupChildren(existingDepot, vehicleID));\r\n });\r\n\r\n groupsToModify.forEach(group => {\r\n groupsToSave.push(group);\r\n });\r\n\r\n }\r\n\r\n if (newVehicleDepot) {\r\n this.addVehicleToGroup(newVehicleDepot, vehicleID);\r\n groupsToSave.push(newVehicleDepot);\r\n }\r\n\r\n let promises: angular.IPromise[] = [];\r\n\r\n groupsToSave.forEach(group => {\r\n var promise = this.saveGroup(group);\r\n\r\n promises.push(promise);\r\n });\r\n\r\n\r\n return this.$q.all(promises).then(() => {\r\n\r\n let promises: angular.IPromise[] = [];\r\n\r\n childrenGroupsToModify.forEach(group => {\r\n\r\n const promise = this.saveGroup(group);\r\n\r\n promises.push(promise);\r\n });\r\n\r\n return this.$q.all(promises);\r\n })\r\n });\r\n }\r\n\r\n countResourceTotals(group: IGroup, groupPropertyName: string): number {\r\n\r\n var bigList: number[] = [];\r\n\r\n if (group[groupPropertyName]) {\r\n bigList = group[groupPropertyName].slice().map(a => a.ResourceId);\r\n }\r\n\r\n if (group.children) {\r\n group.children.forEach(g => {\r\n if (g[groupPropertyName]) {\r\n g[groupPropertyName].forEach((mapping: IGroupMapping) => {\r\n bigList.push(mapping.ResourceId);\r\n });\r\n }\r\n });\r\n }\r\n\r\n var distinctArray = bigList.filter((value, index, self) => self.indexOf(value) === index);\r\n return distinctArray.length;\r\n }\r\n\r\n // -------------------------------------------------------------------------\r\n\r\n private getFlatChildGroupList(group: IGroup): IGroup[] {\r\n\r\n if (!group || !group.children) {\r\n return [];\r\n }\r\n\r\n var list: IGroup[] = group.children.slice();\r\n\r\n group.children.forEach(child => {\r\n var children = this.getFlatChildGroupList(child);\r\n\r\n list = list.concat(children);\r\n });\r\n\r\n return list;\r\n }\r\n\r\n private getGroupsFromDatabase(type: \"full\" | \"basic\" | \"names\"): angular.IPromise {\r\n\r\n return this\r\n .$http({\r\n url: `/api/groups/${type}`,\r\n method: \"GET\",\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n\r\n var groups = this.removeDuplicatesFromGroups(response.data);\r\n\r\n this.setGroupParents(groups);\r\n this.sortGroups(groups);\r\n\r\n return groups;\r\n });\r\n }\r\n\r\n sortGroups(groups: IGroup[]) {\r\n groups.sort((x, y) => {\r\n if (x.children && !y.children) {\r\n return -1;\r\n }\r\n else if (y.children && !x.children) {\r\n return 1;\r\n }\r\n\r\n var textA = x.Name.toUpperCase();\r\n var textB = y.Name.toUpperCase();\r\n\r\n return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;\r\n });\r\n }\r\n\r\n private setGroupsRelations(child: IGroup, parent: IGroup, groups?: IGroup[]) {\r\n\r\n if (!parent) return;\r\n\r\n if (child.parent && parent.children) {\r\n const parentIndex = parent.children.findIndex((kid) => kid.Id === child.Id);\r\n parentIndex > -1 && parent.children.splice(parentIndex, 1);\r\n }\r\n\r\n child.parent = parent;\r\n child.ParentId = parent.Id;\r\n\r\n // Set parents children\r\n if (!parent.children) {\r\n parent.children = [];\r\n }\r\n\r\n parent.children.push(child);\r\n\r\n if (groups) {\r\n this.addOrUpdateGroup(child);\r\n this.addOrUpdateGroup(parent);\r\n }\r\n\r\n if (parent.parent && groups) {\r\n // in case parent has parent it need to be updated as well\r\n const grandParent = this.findGroup(groups, parent.parent.Id);\r\n\r\n if (grandParent) {\r\n this.setGroupsRelations(parent, grandParent, groups);\r\n }\r\n }\r\n\r\n }\r\n\r\n // groupsFullMappingsCache\r\n public unsetGroupRelations(group: IGroup) {\r\n\r\n return this.getGroupsWithFullMappings().then((groups) => {\r\n\r\n const parent = groups.find(g => g.children?.some((child) => child.Id === group.Id));\r\n\r\n if (parent) {\r\n const groupIndex = parent.children.findIndex((child) => child.Id === group.Id);\r\n\r\n groupIndex > -1 && parent.children.splice(groupIndex, 1);\r\n\r\n if (parent.parent && groups) {\r\n // in case parent has parent it need to be updated as well\r\n const grandParent = this.findGroup(groups, parent.parent.Id);\r\n\r\n if (grandParent) {\r\n this.setGroupsRelations(parent, grandParent, groups);\r\n }\r\n } else {\r\n this.addOrUpdateGroup(parent);\r\n }\r\n }\r\n })\r\n }\r\n\r\n sumParents(group: IGroup, acc = 1): number {\r\n if (!group) return 0;\r\n\r\n return !group.parent ? acc : this.sumParents(group.parent, ++acc);\r\n }\r\n\r\n sumChildrenNestingLevel(groups: IGroup[], acc = 1): number {\r\n if (!groups?.length) return 0;\r\n\r\n const flattenedChildren = groups.filter(group => group.children?.length).map(group => group.children).flat();\r\n\r\n return !flattenedChildren.length ? acc : this.sumChildrenNestingLevel(flattenedChildren, ++acc)\r\n }\r\n\r\n private removeDuplicatesFromGroups(groups: IGroup[]) {\r\n window.performance.mark('removeDuplicatesFromGroups');\r\n\r\n for (var i = 0; i < groups.length; i++) {\r\n const group = groups[i];\r\n\r\n group.VehicleIds = this.removeDuplicates(\"vehicle\", group.VehicleIds, group.Name);\r\n group.DriverIds = this.removeDuplicates(\"driver\", group.DriverIds, group.Name);\r\n group.GeofenceIds = this.removeDuplicates(\"geofence\", group.GeofenceIds, group.Name);\r\n };\r\n\r\n window.performance.measure('removeDuplicatesFromGroups');\r\n\r\n return groups;\r\n }\r\n\r\n private removeDuplicates(groupType: string, ids: number[], groupName: string) {\r\n\r\n const obj = {};\r\n const dedupedIds = [];\r\n\r\n for (let i = 0; i < ids.length; i++) {\r\n obj[ids[i]] = 0;\r\n }\r\n\r\n for (let i in obj) {\r\n dedupedIds.push(Number(i));\r\n }\r\n\r\n return dedupedIds;\r\n }\r\n\r\n private removeVehicleFromGroup(group: IGroup, vehicleId: number): IGroup[] {\r\n var groupsToSave: IGroup[] = [];\r\n\r\n group.GroupVehicleMappings.forEach(mapping => {\r\n if (mapping.ResourceId == vehicleId) {\r\n this.removeMapping(group.GroupVehicleMappings, mapping);\r\n\r\n var index = group.VehicleIds.indexOf(vehicleId);\r\n group.VehicleIds.splice(index, 1);\r\n groupsToSave.push(group);\r\n }\r\n });\r\n\r\n return groupsToSave;\r\n }\r\n\r\n private removeVehicleFromGroupChildren(group: IGroup, vehicleId: number): IGroup[] {\r\n var groupsToSave: IGroup[] = [];\r\n if (group.children) {\r\n group.children.forEach(child => {\r\n child.GroupVehicleMappings.forEach(mapping => {\r\n if (mapping.ResourceId == vehicleId) {\r\n this.removeMapping(child.GroupVehicleMappings, mapping);\r\n\r\n var index = child.VehicleIds.indexOf(vehicleId);\r\n child.VehicleIds.splice(index, 1);\r\n groupsToSave.push(child);\r\n\r\n }\r\n });\r\n });\r\n }\r\n\r\n return groupsToSave;\r\n }\r\n\r\n private addVehicleToGroup(group: IGroup, vehicleId: number) {\r\n var mappings = {\r\n GroupId: group.Id,\r\n OwnedByGroup: true,\r\n OwningGroupIds: [group.Id],\r\n ResourceId: vehicleId\r\n };\r\n\r\n group.GroupVehicleMappings.push(mappings);\r\n group.VehicleIds.push(vehicleId);\r\n }\r\n}\r\n","import { AlcolockEventGroup } from \"@components/tacho/alcolockCompliance/alcolock.enums\";\r\n\r\n\r\nexport enum RecipientType {\r\n Group,\r\n User,\r\n Custom\r\n}\r\n\r\nexport enum RecipientDeliveryType { // named RecipientType on back-end\r\n Email = 0,\r\n Sms = 1\r\n}\r\n\r\nexport enum NotificationStatus {\r\n Pending = 0,\r\n Processing = 1,\r\n Processed = 2\r\n}\r\n\r\nexport enum ApplicationType {\r\n Bifrost = 0,\r\n Valkyrie = 1,\r\n Host = 2,\r\n Intranet = 3,\r\n QueueReader = 4,\r\n Tests = 5,\r\n Default = 6,\r\n Chronos = 7,\r\n DevApps = 8,\r\n Heimdall = 9,\r\n DeviceSimulator = 10,\r\n Sif = 11\r\n}\r\n\r\nexport enum ResourceType {\r\n Account = 0,\r\n Contact = 1,\r\n Deal = 2,\r\n Job = 3,\r\n JobBooking = 4,\r\n Package = 5,\r\n Peripheral = 6,\r\n Product = 7,\r\n ProductGroup = 8,\r\n Sim = 9,\r\n Site = 10,\r\n Unit = 11,\r\n Vehicle = 12,\r\n Ticket = 13,\r\n Stock = 14,\r\n Engineer = 15,\r\n SoftwareLog = 16,\r\n Driver = 17,\r\n Trailer = 18,\r\n VerilocationUser = 19,\r\n Announcement = 20,\r\n Plot = 21,\r\n User = 22,\r\n DriverDecisionSupport = 23,\r\n GeocodedAddress = 24,\r\n Geofence = 25,\r\n Group = 26,\r\n Journey = 27,\r\n Message = 28,\r\n OutboundQueue = 29,\r\n RfidData = 30,\r\n DigiDl = 31,\r\n AlertRecord = 32,\r\n ReportSchedule = 33,\r\n Log = 34,\r\n Test = 35,\r\n MaintenanceType = 36,\r\n StirlingJob = 37,\r\n DigiDlPacket = 38,\r\n EngineeringJob = 39\r\n}\r\n\r\nexport enum AlertState {\r\n Raised = 0,\r\n Cleared = 1\r\n}\r\n\r\nexport enum AlertCategory {\r\n Geofence = 0,\r\n Vehicle = 1,\r\n //Telematics = 2,\r\n //Temperature = 3, // Deprecated\r\n //Tms = 4, // Deprecated\r\n Toll = 5,\r\n Alcolock = 6,\r\n Tyres = 7,\r\n Inputs = 8,\r\n FaultCode = 9,\r\n Tachograph = 10,\r\n TemperatureProfile = 11,\r\n Transcan = 12,\r\n CameraEvent = 13,\r\n Zone = 14,\r\n AxleWeightProfile = 15,\r\n PowerEvent = 16\r\n}\r\n\r\nexport enum VehicleAlertSubCategory {\r\n //DrivingWithoutTachoCard = 0, // Deprecated\r\n Speeding = 1,\r\n ContextualSpeeding = 2,\r\n FuelLevelChange = 3,\r\n ExcessiveDwell = 4,\r\n DrivingWithoutDriverAssigned = 5,\r\n PlotReason = 6\r\n}\r\n\r\nexport enum TollAlertSubCategory {\r\n Enter,\r\n Exit\r\n}\r\n\r\nexport enum GeofenceAndZoneAlertSubCategory {\r\n Enter,\r\n Exit,\r\n}\r\n\r\n\r\nexport enum TyreAlertSubCategory {\r\n SystemError,\r\n PressureAlarm,\r\n TemperatureAlarm,\r\n PressureWarning,\r\n TemperatureWarning,\r\n}\r\n\r\nexport enum FaultCodeAlertSubCategory {\r\n Alert\r\n}\r\n\r\nexport enum TachoAlertSubCategory {\r\n Warning,\r\n Infringement,\r\n DrivingWithoutTachoCard\r\n}\r\n\r\nexport enum TranscanAlertSubCategory {\r\n Alarm\r\n}\r\n\r\nexport enum InputAlertSubCategory {\r\n On,\r\n Off,\r\n}\r\n\r\nexport enum TemperatureProfileAlertSubCategory {\r\n OutOfBounds,\r\n InBounds\r\n}\r\n\r\nexport enum ResourceFilterType {\r\n Any,\r\n Group,\r\n Specific,\r\n None\r\n}\r\n\r\nexport enum TriggerValueOperator {\r\n Equals = 0,\r\n LessThan = 1,\r\n GreaterThan = 2\r\n}\r\n\r\nexport enum AlcolockAlertSubCategory {\r\n Circumvention = AlcolockEventGroup.Circumvention,\r\n Diagnostics = AlcolockEventGroup.SignificantEvent,\r\n Fail = AlcolockEventGroup.Fail,\r\n Pass = AlcolockEventGroup.Pass\r\n}\r\n\r\nexport enum VideoEventSubCategory {\r\n //Unknown = -1,\r\n Button = 0,\r\n //Speed = 1,\r\n Acceleration = 2,\r\n //LowShock = 3,\r\n //MediumShock = 4,\r\n HighShock = 5,\r\n Braking = 6,\r\n Turning = 7,\r\n //UserRequested = 8,\r\n //Sensor = 9,\r\n //Exception = 10,\r\n //Motion = 11,\r\n //PowerOff = 12,\r\n DriverFatigue = 13,\r\n DriverOnPhone = 14,\r\n DriverSmoking = 15,\r\n DriverDistraction = 16,\r\n DriverAbsent = 17,\r\n Pedestrian = 18,\r\n Collision = 19,\r\n LaneDeparture = 20,\r\n VehicleTooClose = 21,\r\n DriverLogin = 22,\r\n BlindSpot = 23,\r\n NoSeatBelt = 24\r\n}\r\n\r\nexport enum AlertPreferenceType {\r\n\r\n DistanceMeasurement = 1,\r\n VolumeMeasurement = 2,\r\n TemperatureMeasurement = 3,\r\n Currency = 4,\r\n Language = 5,\r\n Timezone = 6\r\n}\r\n\r\nexport enum AxleWeightProfileAlertSubCategory {\r\n OutOfBounds,\r\n InBounds\r\n}\r\n\r\nexport enum PowerEventAlertSubCategory {\r\n Lost, Restored\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { AccountFeatures } from \"@app/enum/account/AccountFeature\";\r\nimport { IKeyValuePair } from \"@app/interfaces/IKeyValuePair\";\r\nimport { CommserverMigrationStatus, IConfigurableCameraDevice, IPeripheral, IViewCommissionPeripheral } from \"@app/interfaces/IPeripheral\";\r\nimport { IPlot } from \"@app/interfaces/IPlot\";\r\nimport { IVehiclePeripheralMapping } from \"@app/interfaces/IVehiclePeripheralMapping\";\r\nimport { ProductVendor } from \"@app/main/components/videos/enums/CameraProductType\";\r\nimport { CameraOnlineStatus } from \"@app/main/components/videos/models/camera-online-status\";\r\nimport { IVehicleOnlineStatus } from \"@app/main/components/videos/models/IVehicleOnlineStatus\";\r\nimport { CameraOnlineHistoryService } from \"@app/main/components/videos/services/camera-online-history.service\";\r\nimport { IPeripheralMetadata } from \"@app/main/modules/foundation/_routes/hardware/_models/IPeripheralMetadata\";\r\nimport { IPeripheralMetadataAutoUpdateDto } from \"@app/main/modules/foundation/_routes/hardware/_models/IPeripheralMetadataAutoUpdateDto\";\r\nimport { IPulseRecordPayload } from \"@app/main/modules/foundation/_routes/hardware/_models/IPulseRecordPayload\";\r\nimport { AccountFeatureService } from \"@app/services/accountFeature.service\";\r\nimport { DataCacheService } from \"@app/services/caching/data-cache.service\";\r\nimport { EnumService } from \"@app/services/enum.service\";\r\nimport { ProductsService } from \"@app/services/products.service\";\r\nimport { combineLatest, from, Observable } from \"rxjs\";\r\nimport { map, mergeMap, switchMap } from \"rxjs/operators\";\r\nimport { IPulseRecord } from \"../_routes/hardware/_models/IPulseRecord\";\r\nimport { HardwareMappingService } from \"../_routes/hardware/_services/hardware-mapping.service\";\r\nimport { FoundationVehiclesService } from \"./vehicle.service\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PeripheralService {\r\n private peripheralsCache: string = 'foundationPeripheralsCache';\r\n\r\n constructor(private readonly http: HttpClient,\r\n private readonly accountFeatureService: AccountFeatureService,\r\n private readonly dataCacheService: DataCacheService,\r\n private readonly cameraOnlineHistoryService: CameraOnlineHistoryService,\r\n private readonly hardwareMappingService: HardwareMappingService,\r\n private readonly productsService: ProductsService,\r\n private readonly vehicleService: FoundationVehiclesService) { }\r\n\r\n getPeripherals(invalidateCache = false): Observable {\r\n return this.dataCacheService.getOrRequest(this.peripheralsCache, () => this.getPeripheralsFromDb(), { invalidateCache });\r\n }\r\n\r\n getPeripheralsFromDb(): Observable {\r\n return this.http.get(`/api/foundation/peripherals/`);\r\n }\r\n\r\n getPeripheralsForVehicle(vehicleId: number): Observable {\r\n return this.http.get(`/api/foundation/peripherals/${vehicleId}`);\r\n }\r\n\r\n getPeripheralMappings(): Observable {\r\n return this.http.get(`/api/foundation/vehicles/peripheralmappings`);\r\n }\r\n\r\n getAllPeripheralsWithMappings(): Observable {\r\n return combineLatest([\r\n this.getPeripherals(),\r\n this.getPeripheralMappings(),\r\n this.vehicleService.getVehicles()\r\n ]).pipe(\r\n map(([peripherals, mappings, vehicles]) => {\r\n const vehiclesMap = new Map(vehicles.map(vehicle => [vehicle.Id, vehicle]));\r\n mappings.forEach(mapping => mapping.vehicle = vehiclesMap.get(mapping.VehicleId));\r\n return [peripherals, mappings];\r\n }),\r\n mergeMap(([peripherals, mappings]: [IPeripheral[], IVehiclePeripheralMapping[]]) => {\r\n const peripheralMappingsMap = new Map(mappings.map(mapping => [mapping.Serial, mapping]));\r\n const peripheralsWithPeripheralMappings = this.hardwareMappingService.applyVehicleMappingsToUnits(peripherals, peripheralMappingsMap);\r\n\r\n return this.hardwareMappingService.getProductsAndMap(peripheralsWithPeripheralMappings);\r\n }));\r\n }\r\n\r\n getAllConfigurableCameras(): Observable {\r\n return combineLatest([\r\n this.getAllPeripheralsWithMappings(),\r\n from(this.cameraOnlineHistoryService.getCameraOnlineStatuses())\r\n ]).pipe(\r\n map(([cameras, onlineStatuses]) => {\r\n const onlineStatusesMap = new Map(onlineStatuses.map(status => [status.VehicleId, status]));\r\n\r\n const configurableCameras: IConfigurableCameraDevice[] = this.filterCameras(cameras, onlineStatusesMap);\r\n\r\n return configurableCameras;\r\n }),\r\n switchMap((cameras) => {\r\n return this.getPulseRecords(cameras);\r\n })\r\n )\r\n\r\n }\r\n\r\n getOnlineStatusForVehicle(camera: IConfigurableCameraDevice): IVehicleOnlineStatus {\r\n if (!camera.onlineStatus) {\r\n return {\r\n lastOnlineTime: null,\r\n online: false,\r\n hasStreaming: false,\r\n sortingTime: null\r\n }\r\n }\r\n\r\n const lastOnlineTime = new Date(camera.onlineStatus.LastOnlineTime);\r\n\r\n const hasStreaming = camera.Product?.ProductMetadata?.CameraFeatures?.LiveStream;\r\n\r\n return {\r\n lastOnlineTime,\r\n online: camera.onlineStatus.Online,\r\n hasStreaming,\r\n sortingTime: lastOnlineTime\r\n }\r\n }\r\n\r\n\r\n getPulseRecords(cameras: IConfigurableCameraDevice[]): Observable {\r\n return this.http.get('/api/cameras/commserver/pulserecords/latest').pipe(\r\n map(records => {\r\n const recordsMap = new Map(records.map(record => [record.Serial, record]));\r\n\r\n cameras.forEach(camera => {\r\n \r\n if (!recordsMap.has(camera.Serial)) {\r\n camera.migrationStatus = CommserverMigrationStatus.Required\r\n return;\r\n }\r\n const latestRecord = recordsMap.get(camera.Serial);\r\n const parsedPayload = JSON.parse(latestRecord.Payload) as IPulseRecordPayload;\r\n camera.currentFW = parsedPayload.HardwareFirmwareVersion;\r\n\r\n if (parsedPayload.HardwareConfigName.indexOf(';') > -1) {\r\n parsedPayload.HardwareConfigName = parsedPayload.HardwareConfigName.substring(0, parsedPayload?.HardwareConfigName.indexOf(';'))\r\n }\r\n\r\n camera.migrationStatus = CommserverMigrationStatus.Completed;\r\n camera.currentConfig = parsedPayload.HardwareConfigName;\r\n camera.currentTelematicsAppVersion = !!parsedPayload.Applications.length ? parsedPayload.Applications[0].AppVersion : \"\";\r\n camera.currentUpdaterAppVersion = parsedPayload.FirmwareVersion;\r\n });\r\n\r\n return cameras;\r\n })\r\n )\r\n }\r\n\r\n getPeripheralsWithMappingsForVehicle(vehicleId?: number): Observable {\r\n const request = !!vehicleId ? this.getPeripheralsForVehicle(vehicleId) : this.getPeripherals();\r\n\r\n return request\r\n .pipe(switchMap(peripherals => {\r\n return this.productsService.getProductUiViewModels().pipe(map(products => {\r\n peripherals.forEach(peripheral => {\r\n peripheral.Product = products.find(product => product.ProductId === peripheral.ProductId)\r\n })\r\n\r\n return peripherals;\r\n }))\r\n }))\r\n }\r\n\r\n getPeripheralBySerial(serial: string): Observable {\r\n return this.getAllPeripheralsWithMappings().pipe(map(peripherals => {\r\n const peripheral = peripherals.find(peripheral => peripheral.Serial == serial);\r\n return peripheral;\r\n }))\r\n }\r\n\r\n\r\n\r\n createInstalledPeripheralList(peripherals: IPeripheral[]): { installed: IPeripheral[], notInstalled: IPeripheral[] } {\r\n const featuresEnumArray: IKeyValuePair[] = EnumService.enumToArray(\"AccountFeatures\", AccountFeatures);\r\n\r\n const peripheralsCurrentlyInstalled: IPeripheral[] = [];\r\n const peripheralsNotInstalled: IPeripheral[] = [];\r\n\r\n featuresEnumArray.forEach(featureEnum => {\r\n const feature: AccountFeatures = +featureEnum.value;\r\n const peripheral = this.findInstalledPeripheralForFeature(feature, peripherals, peripheralsCurrentlyInstalled);\r\n\r\n if (peripheral) {\r\n this.hardwareMappingService.setMetaDataOnUnit(peripheral, feature);\r\n peripheralsCurrentlyInstalled.push(peripheral);\r\n }\r\n else {\r\n peripheralsNotInstalled.push(peripheral);\r\n }\r\n });\r\n\r\n return {\r\n installed: peripheralsCurrentlyInstalled,\r\n notInstalled: peripheralsNotInstalled\r\n };\r\n }\r\n\r\n getInstalledPeripheralsForVehicle(vehicleId: number): Observable {\r\n return this.getPeripheralsWithMappingsForVehicle(vehicleId).pipe(map(peripherals => {\r\n const result = this.createInstalledPeripheralList(peripherals);\r\n return result.installed as IViewCommissionPeripheral[];\r\n }));\r\n }\r\n\r\n getExtendedPlotsByImei(imei: string, jobItemVehicleId?: number): Observable {\r\n return this.http.get(`/api/foundation/units/${imei}/extendedPlots`, { params: { jobItemVehicleId } })\r\n }\r\n\r\n getPeripheralMetadata(serial: string): Observable {\r\n return this.http.get(`/api/foundation/peripherals/${serial}/metadata`);\r\n }\r\n\r\n setAutoUpdateProperty(updateDto: IPeripheralMetadataAutoUpdateDto) {\r\n return this.http.post(`/api/foundation/peripherals/autoupdate`, updateDto);\r\n }\r\n\r\n private findInstalledPeripheralForFeature(featureIndex: number, peripherals, peripheralsCurrentlyInstalled): IPeripheral {\r\n if (!peripherals?.length) {\r\n return null;\r\n }\r\n\r\n let chosenPeripheral: IPeripheral;\r\n\r\n peripherals.forEach(peripheral => {\r\n const peripheralFeatures = this.accountFeatureService.findFeaturesFromFeaturesEnum(peripheral.Product.Features);\r\n\r\n if (!peripheralFeatures?.length || !!chosenPeripheral) {\r\n return;\r\n }\r\n\r\n for (let i = 0; i < peripheralFeatures.length; i++) {\r\n const feature = peripheralFeatures[i];\r\n const alreadyAddedPeripheral = peripheralsCurrentlyInstalled.find(installedPeripheral => installedPeripheral.Serial === peripheral.Serial);\r\n\r\n if (feature === featureIndex && !alreadyAddedPeripheral) {\r\n chosenPeripheral = peripheral;\r\n\r\n break;\r\n }\r\n }\r\n });\r\n\r\n return chosenPeripheral;\r\n }\r\n\r\n private filterCameras(peripherals: IPeripheral[], onlineStatusesMap: Map): IConfigurableCameraDevice[] {\r\n return (peripherals as IConfigurableCameraDevice[]).filter(camera => {\r\n if (camera.Product?.GroupId === ProductVendor.RTL) {\r\n camera.onlineStatus = this.getOnlineStatusForCamera(camera, onlineStatusesMap);\r\n return camera;\r\n }\r\n });\r\n }\r\n\r\n private getOnlineStatusForCamera(camera: IConfigurableCameraDevice, onlineStatuses: Map): CameraOnlineStatus {\r\n return onlineStatuses.get(camera.vehicleMapping?.VehicleId);\r\n }\r\n\r\n}\r\n","export enum RouteVisitStatus {\r\n Planned,\r\n Next,\r\n Arrived,\r\n Departed,\r\n Missed,\r\n Cancelled\r\n}\r\n","export enum SpecialUserPermissions {\r\n None = 0,\r\n ShowHistoricalPlots = 1,\r\n ManageVehicles = 2,\r\n ManageDrivers = 4,\r\n ManageGeofences = 8,\r\n ManageGroups = 16,\r\n ManageAlerts = 32,\r\n ShowReports = 64,\r\n ManageReportBuilder = 128,\r\n ManageAlertReviews = 256,\r\n All = ~None\r\n}\r\n","declare var ng;\r\n\r\nexport interface IElementSearchOptions {\r\n //stopTagName?: string;\r\n stopTagNames?: string[];\r\n\r\n currentSearchDepth?: number;\r\n maxDepth?: number;\r\n}\r\n\r\nexport class HTMLService {\r\n scrollTo(elementId: string, offsetY = 0, iterationCount = 50) {\r\n\r\n if (!elementId) {\r\n console.error(\"No elementId passed in\");\r\n return;\r\n }\r\n\r\n var targetElement = document.getElementById(elementId);\r\n\r\n if (targetElement == null) {\r\n if (iterationCount >= 0) {\r\n setTimeout(() => {\r\n this.scrollTo(elementId, offsetY, --iterationCount);\r\n }, 150);\r\n }\r\n\r\n return;\r\n }\r\n\r\n //targetElement.scrollIntoView({ behavior: \"auto\", block: \"center\" });\r\n targetElement.scrollIntoView({ behavior: \"auto\", block: \"center\" });\r\n }\r\n\r\n //isElementInView(targetElement: HTMLElement, scrollParent: HTMLElement): boolean {\r\n // if (!targetElement || !scrollParent) {\r\n // return false;\r\n // }\r\n\r\n // var boundingRect = targetElement.getBoundingClientRect();\r\n // var parentBoundingRect = scrollParent.getBoundingClientRect();\r\n\r\n // console.log(boundingRect, parentBoundingRect);\r\n\r\n // console.log(boundingRect.top >= 0, boundingRect.bottom <= scrollParent.clientHeight);\r\n // console.log(boundingRect.top, boundingRect.bottom, scrollParent.clientHeight, scrollParent.scrollTop, scrollParent.scrollHeight);\r\n // console.log(\"A TING\", this.visibleInScroll(targetElement, scrollParent));\r\n\r\n // return (\r\n // boundingRect.top >= 0 &&\r\n // //boundingRect.left >= 0 &&\r\n // boundingRect.bottom <= scrollParent.clientHeight /*&&*/\r\n // //boundingRect.right <= scrollParent.clientWidth\r\n // );\r\n\r\n // return true;\r\n //}\r\n\r\n private visibleInScroll(element: HTMLElement, parent: HTMLElement): boolean {\r\n if (!element || !parent) {\r\n return false;\r\n }\r\n\r\n var elRect = element.getBoundingClientRect() as any,\r\n rects = [parent.getBoundingClientRect()];\r\n\r\n elRect = {\r\n left: elRect.left,\r\n top: elRect.top,\r\n right: elRect.right,\r\n bottom: elRect.bottom,\r\n width: elRect.width,\r\n height: elRect.height,\r\n visibleWidth: elRect.width,\r\n visibleHeight: elRect.height,\r\n isVisible: true,\r\n isContained: true\r\n };\r\n\r\n //var elWidth = elRect.width,\r\n // elHeight = elRect.height;\r\n\r\n //if (parent === this[0].ownerDocument) {\r\n // return true;\r\n // return elRect;\r\n //}\r\n\r\n //var goDeep = false;\r\n\r\n //while (parent !== this[0].ownerDocument && parent !== null) {\r\n // if (parent.scrollWidth > parent.clientWidth || parent.scrollHeight > parent.clientHeight) {\r\n // rects.push(parent.getBoundingClientRect());\r\n // }\r\n\r\n // if (rects.length && goDeep) {\r\n // break;\r\n // }\r\n\r\n // parent = $(parent).scrollParent()[0];\r\n //}\r\n //if (!goDeep) {\r\n // rects.length = 1;\r\n //}\r\n\r\n for (var i = 0; i < rects.length; i += 1) {\r\n var rect = rects[i];\r\n elRect.left = Math.max(elRect.left, rect.left);\r\n elRect.top = Math.max(elRect.top, rect.top);\r\n elRect.right = Math.min(elRect.right, rect.right);\r\n elRect.bottom = Math.min(elRect.bottom, rect.bottom);\r\n }\r\n\r\n elRect.visibleWidth = Math.max(0, elRect.right - elRect.left);\r\n elRect.visibleHeight = elRect.visibleWidth && Math.max(0, elRect.bottom - elRect.top);\r\n\r\n if (!elRect.visibleHeight) {\r\n elRect.visibleWidth = 0;\r\n }\r\n\r\n elRect.isVisible = elRect.visibleWidth > 0 && elRect.visibleHeight > 0;\r\n elRect.isContained = elRect.visibleWidth === elRect.width && elRect.visibleHeight === elRect.height;\r\n\r\n return elRect.isContained;\r\n };\r\n\r\n\r\n scrollStep(scrollingParent: HTMLElement, stopY: number, step: number, speed: number) {\r\n //throw new Error(\"Method not implemented.\");\r\n setTimeout(() => {\r\n var iterate = true;\r\n var newPosition = scrollingParent.scrollTop + step;\r\n\r\n if (step < 0 && stopY >= newPosition || step > 0 && stopY <= newPosition) {\r\n newPosition = stopY;\r\n iterate = false;\r\n }\r\n\r\n scrollingParent.scrollTop = scrollingParent.scrollTop + step;\r\n console.log(\"newPos\", newPosition, \"scrollTop\", scrollingParent.scrollTop, \"stopY\", stopY, \"step\", step);\r\n\r\n if (iterate) {\r\n this.scrollStep(scrollingParent, stopY, step, speed);\r\n }\r\n }, speed);\r\n }\r\n\r\n getAngularParentByTag(element: HTMLElement, tagName: string): T {\r\n var element = this.getParentByTag(element, tagName);\r\n\r\n return this.getAngularComponentFromElement(element);\r\n }\r\n\r\n getAngularComponentFromElement(element: HTMLElement): T {\r\n console.warn(\"Warning, getAngularComponentFromElement wont work in production\");\r\n\r\n var ngProbeElement = ng.probe(element);\r\n\r\n return ngProbeElement?.componentInstance;\r\n }\r\n\r\n getAngularJSComponentFromElement(element: HTMLElement): T {\r\n var ngElement = window.angular.element(element);\r\n var scope: any = (ngElement.isolateScope() || ngElement.scope());\r\n\r\n return scope?.$ctrl;\r\n }\r\n\r\n getParentByTag(startElement: HTMLElement, tagName: string, className?: string, options?: IElementSearchOptions): HTMLElement {\r\n\r\n if (!startElement) {\r\n return null;\r\n }\r\n\r\n var parent: HTMLElement = startElement;\r\n\r\n while (parent.parentElement) {\r\n parent = parent.parentElement;\r\n\r\n if (options?.stopTagNames?.indexOf(parent.tagName.toLocaleLowerCase()) >= 0) {\r\n return;\r\n }\r\n\r\n if (parent.tagName.toLocaleLowerCase() == tagName) {\r\n if (!className || parent.className.indexOf(className) >= 0) {\r\n return parent;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n findNearest(startingElement: HTMLElement, selector: string, ignoreParents = false, options?: IElementSearchOptions): HTMLElement {\r\n\r\n if (options) {\r\n\r\n if (!options.currentSearchDepth) {\r\n options.currentSearchDepth = 0;\r\n }\r\n\r\n if (options.maxDepth && options.currentSearchDepth >= options.maxDepth) {\r\n return null;\r\n }\r\n\r\n options.currentSearchDepth = options.currentSearchDepth + 1;\r\n }\r\n\r\n for (var i = 0; i < startingElement.children.length; i++) {\r\n var childElement = startingElement.children[i] as HTMLElement;\r\n\r\n if (options?.stopTagNames?.indexOf(childElement.tagName.toLocaleLowerCase()) >= 0) {\r\n return;\r\n }\r\n\r\n if (selector[0] == '.' && childElement.classList.contains(selector.substring(1))) {\r\n return childElement;\r\n }\r\n else if (childElement.tagName.toLocaleLowerCase() == selector) {\r\n return childElement;\r\n }\r\n\r\n const childResult = this.findNearest(childElement, selector, true, options);\r\n if (childResult) {\r\n return childResult;\r\n }\r\n }\r\n\r\n if (!ignoreParents && startingElement.parentElement && startingElement.tagName.toLocaleLowerCase() != \"default-layout\") {\r\n return this.findNearest(startingElement.parentElement, selector, null, options);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n getElementScrollRect(element: HTMLElement, parentTag?: string): ClientRect {\r\n // Get veriCard parent\r\n if (element) {\r\n //var veriCardParent: HTMLElement = this.getParentByTag(targetElement, \"video-entry\");\r\n //var veriTabElement: HTMLElement = this.getParentByTag(targetElement, \"veri-tab\");\r\n //var veriList: HTMLElement = this.getParentByTag(targetElement, \"div\", \"video-list\");\r\n\r\n //var finalWidth = element.offsetWidth;\r\n //var finalHeight = element.offsetHeight;\r\n\r\n // 44 is the tab height that disappears... \r\n //var tabHeight = this.isMobile ? 0 : 44;\r\n\r\n var scrollParent = this.getScrollParent(element);\r\n\r\n return {\r\n left:/* veriCardParent.offsetLeft +*/ element.offsetLeft,\r\n top: /*veriCardParent.offsetTop +*/ element.offsetTop - scrollParent.scrollTop /*+ tabHeight*/,\r\n right: 0,\r\n bottom: 0,\r\n width: element.offsetWidth,\r\n height: element.offsetHeight\r\n }\r\n }\r\n else {\r\n return {\r\n left: 0,\r\n top: /*tabHeight*/0,\r\n right: 0,\r\n bottom: 0,\r\n width: \"100%\" as any,\r\n height: \"100%\" as any\r\n }\r\n }\r\n }\r\n\r\n getScrollParent(element: HTMLElement, includeHidden = false): HTMLElement {\r\n if (!element) {\r\n return null;\r\n }\r\n\r\n var style = getComputedStyle(element);\r\n var excludeStaticParent = style.position === \"absolute\";\r\n var overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/;\r\n\r\n if (style.position === \"fixed\") {\r\n return document.body;\r\n }\r\n\r\n for (var parent = element; (parent = parent.parentElement);) {\r\n style = getComputedStyle(parent);\r\n\r\n if (excludeStaticParent && style.position === \"static\") {\r\n continue;\r\n }\r\n\r\n if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) {\r\n return parent;\r\n }\r\n }\r\n\r\n return document.scrollingElement as HTMLElement || document.body;\r\n }\r\n\r\n // ---\r\n\r\n\r\n}\r\n","export enum ColumnDataType {\r\n String,\r\n Int,\r\n Double,\r\n Date,\r\n Score,\r\n Percent,\r\n List,\r\n Day,\r\n Week,\r\n Duration,\r\n Location,\r\n Boolean\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { IPlotTemperatureRecord } from \"@interfaces/IPlot\";\r\nimport { TemperatureProbeCategory } from \"@temperature/_enums/temperature/TemperatureProbeCategory.enum\";\r\nimport { ITemperatureProbe, ITemperatureProbeWithLatestRecord, ITemperatureProbeWithTemperatureData } from \"@temperature/_models/temperature/ITemperatureProbe\";\r\nimport { ITemperatureRecord } from \"@temperature/_models/temperature/ITemperatureRecord\";\r\nimport { IZoneWithProbes } from \"@temperature/_models/temperature/ITemperatureZone\";\r\nimport { IVehicleWithTemperatureData } from \"@temperature/_models/temperature/IVehicleWithTemperatureData\";\r\nimport { Observable } from \"rxjs\";\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class TemperatureProbeService {\r\n constructor(private readonly http: HttpClient) { }\r\n\r\n getTemperatureProbes(): Observable {\r\n return this.http.get(`/api/temperature/probes/`);\r\n }\r\n\r\n getTemperatureProbesForVehicle(vehicleId: number): Observable {\r\n return this.http.get(`/api/temperature/probes/${vehicleId}`);\r\n }\r\n\r\n updateVehicleProbe(probe: ITemperatureProbe): Observable {\r\n return this.http.post(`/api/temperature/probes`, { body: probe });\r\n }\r\n\r\n getAmbientTemperature(probes: ITemperatureProbeWithLatestRecord[]): number {\r\n if (!probes || !probes.length) {\r\n return;\r\n }\r\n const ambientProbe = probes.find(probe => probe.Category === TemperatureProbeCategory.Ambient);\r\n if (ambientProbe) {\r\n return ambientProbe.latestRecord?.Temperature;\r\n }\r\n }\r\n\r\n mapProbesLatestRecord(zones: IZoneWithProbes[] = [], temperatureRecords: ITemperatureRecord[] = []): void {\r\n zones.forEach(zone => {\r\n if (!zone.probes.length) {\r\n return;\r\n }\r\n zone.probes.forEach((probe, index) => {\r\n this.mapProbeLatestRecord(probe, temperatureRecords);\r\n })\r\n })\r\n }\r\n\r\n mapProbeLatestRecord(probe: ITemperatureProbeWithTemperatureData, temperatureRecords: ITemperatureRecord[]) {\r\n probe.latestRecord = temperatureRecords.find(rec => rec.TemperatureProbeId === probe.Id);\r\n }\r\n\r\n mapTemperatureRecordsToProbes(probes: ITemperatureProbeWithTemperatureData[], temperatureRecords: IPlotTemperatureRecord[] | ITemperatureRecord[]): void {\r\n probes.forEach(probe => {\r\n probe.records = [];\r\n probe.records = temperatureRecords.filter(record => record.TemperatureProbeId === probe.Id);\r\n })\r\n }\r\n\r\n mapTemperatureProbesToVehicles(probes: ITemperatureProbe[], vehicles: IVehicleWithTemperatureData[]): void {\r\n if (!probes || !vehicles) {\r\n return;\r\n }\r\n\r\n probes.forEach(probe => {\r\n const vehicle = vehicles.find(vehicle => vehicle.Id === probe.VehicleId);\r\n\r\n if (!vehicle) {\r\n return;\r\n }\r\n\r\n if (!vehicle.temperatureProbes?.length) {\r\n vehicle.temperatureProbes = [];\r\n }\r\n vehicle.temperatureProbes.push(probe);\r\n })\r\n }\r\n\r\n cleanVehicleProbeName(vehicleReg: string, probe: ITemperatureProbe) {\r\n try {\r\n var regEx = new RegExp(vehicleReg, \"ig\");\r\n var replaceMask = \"\";\r\n\r\n // Remove vehicle registration from probe name\r\n probe.cleanName = probe.Name.replace(regEx, replaceMask);\r\n\r\n // Remove all non-alphanumerics from start of strong (i.e. hypens)\r\n while (/[^a-zA-Z0-9]/.test(probe.cleanName[0]) && probe.cleanName) {\r\n probe.cleanName = probe.cleanName.slice(1).trim();\r\n }\r\n\r\n if (!probe.cleanName) {\r\n probe.cleanName = vehicleReg;\r\n }\r\n }\r\n catch (err) {\r\n }\r\n }\r\n\r\n getLastUpdatedForVehicleProbes(probes: ITemperatureProbeWithTemperatureData[]) {\r\n const dates = [];\r\n\r\n probes.forEach(probe => {\r\n probe.latestRecord && dates.push(new Date(probe.latestRecord?.Timestamp).getTime());\r\n })\r\n if (dates.length > 0) {\r\n return new Date(Math.max(...dates));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n getProbeByType(probes: ITemperatureProbeWithTemperatureData[], category: TemperatureProbeCategory): ITemperatureProbeWithTemperatureData {\r\n const probe = probes.find(probe => probe.Category === category);\r\n\r\n return probe;\r\n }\r\n\r\n temperatureIsInBoundsAccordingToProfile(probe: ITemperatureProbeWithTemperatureData): boolean {\r\n const latestTemperature = probe.latestRecord.Temperature;\r\n const profile = probe.TemperatureProfile;\r\n\r\n if (!latestTemperature || !profile) {\r\n return false;\r\n }\r\n\r\n if (latestTemperature <= profile.UpperBound && latestTemperature >= profile.LowerBound) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { UserType } from \"@app/enum/UserType\";\r\nimport { IAccountUserMapping, IUser } from \"@app/interfaces/IUser\";\r\nimport { AccountUserMappingService } from \"@app/services/accountUserMapping.service\";\r\nimport { DataCacheService } from \"@app/services/caching/data-cache.service\";\r\nimport { combineLatest, forkJoin, Observable, of } from \"rxjs\";\r\nimport { map, mergeMap, tap } from \"rxjs/operators\";\r\nimport { IUserIdToNameMapping } from \"../foundation.interfaces\";\r\nimport { IUserResellerMapping } from \"../_models/IUserResellerMapping\";\r\nimport { FoundationUserResellerMappingService } from \"./userResellerMapping.service\";\r\n\r\nexport interface IUserQueryOptions {\r\n Id?: number;\r\n AccountId?: number;\r\n JobId?: number;\r\n JobBookingId?: number;\r\n Email?: string;\r\n Type?: UserType;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UserService {\r\n private usersCacheName: string = \"foundationUsersCache\";\r\n\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly accountUserMappingService: AccountUserMappingService,\r\n private readonly dataCacheService: DataCacheService,\r\n private readonly userResellerMappingService: FoundationUserResellerMappingService,\r\n ) {\r\n }\r\n\r\n getIdToNameMappings(): Observable {\r\n return this.getUsernameMappings();\r\n }\r\n\r\n getAllUsers(invalidateCache = false): Observable {\r\n return this.dataCacheService.getOrRequest(this.usersCacheName, () => this.getAllUsersFromDb(), { invalidateCache });\r\n }\r\n\r\n getAllUsersFromDb(): Observable {\r\n return this.http.get(`/api/foundation/users`);\r\n }\r\n\r\n getUsers(queryOptions: IUserQueryOptions = {}): Observable {\r\n return combineLatest([\r\n this.http.get(`/api/foundation/users`, { params: queryOptions as HttpParams }),\r\n this.userResellerMappingService.getMappings(),\r\n this.accountUserMappingService.getAccountUserMappings()\r\n ]).pipe(map(([users, userResellerMappings, accountMappings]) => {\r\n const usersWithMappings = this.applyMappingsToUsers(users, accountMappings, userResellerMappings);\r\n return usersWithMappings;\r\n }));\r\n }\r\n\r\n getUsersForAccount(accountId: number): Observable {\r\n return forkJoin({\r\n accountMappings: this.accountUserMappingService.getAccountUserMappingsForAccount(accountId),\r\n userResellerMappings: this.userResellerMappingService.getMappings(),\r\n users: this.http.get(`/api/foundation/users/account/${accountId}`)\r\n }).pipe(map(data => {\r\n const users = this.applyMappingsToUsers(data.users, data.accountMappings, data.userResellerMappings, true, accountId);\r\n users.forEach(user => {\r\n user.AccountUserMappings = data.accountMappings.filter(mapping => mapping.UserId == user.Id);\r\n user.CurrentAccountUserMapping = user.AccountUserMappings.find(m => m.AccountId == accountId);\r\n });\r\n\r\n return users;\r\n }))\r\n }\r\n\r\n currentUserCanUpdateAccountStatus(): Observable {\r\n return this.http.get(`/api/foundation/users/updateaccountstatus`);\r\n }\r\n\r\n saveUser(user: IUser): Observable {\r\n const userLanguage = localStorage.getItem('userSelectedLanguageCode');\r\n return this.http.post(`/api/users/`, user, { params: { userLanguage } }).pipe(tap(userId => {\r\n user.Id = userId;\r\n }));\r\n }\r\n\r\n saveUserWithAccountMapping(user: IUser): Observable {\r\n if (user.Id > 0) {\r\n return this.accountUserMappingService.postAccountUserMapping(user.Email, user.CurrentAccountUserMapping);\r\n }\r\n\r\n return this.saveUser(user).pipe(mergeMap(userId => {\r\n return this.accountUserMappingService.postAccountUserMapping(user.Email, user.CurrentAccountUserMapping);\r\n }));\r\n }\r\n\r\n deactivateUser(user: IUser): Observable {\r\n return this.http.post(`/api/users/deactivate`, user);\r\n }\r\n\r\n toggleInternalUserStatus(user: IUser): Observable {\r\n if (user.Type == UserType.Engineer || user.Type == UserType.InternalUser) {\r\n return of(null);\r\n }\r\n\r\n user.IsActive = !user.IsActive;\r\n return this.saveUser(user);\r\n }\r\n\r\n emailExists(emailAddress: string): Observable {\r\n return this.http.get(`/api/users/emailexists`, { params: { emailAddress: emailAddress } });\r\n }\r\n\r\n\r\n //--\r\n\r\n private applyMappingsToUsers(users: IUser[], accountMappings: IAccountUserMapping[], userResellerMappings: IUserResellerMapping[], includeCurrent: boolean = false, accountId?: number): IUser[] {\r\n users.forEach(user => {\r\n user.AccountUserMappings = accountMappings.filter(mapping => mapping.UserId == user.Id);\r\n if (includeCurrent && accountId) {\r\n user.CurrentAccountUserMapping = user.AccountUserMappings.find(m => m.AccountId == accountId);\r\n }\r\n user.ResellerIds = userResellerMappings.filter(mapping => mapping.UserId === user.Id && !mapping.EndTime).map(mapping => mapping.ResellerId);\r\n });\r\n\r\n return users;\r\n }\r\n\r\n private getUsernameMappings(): Observable {\r\n return this.http.get(`/api/foundation/users/usernamemappings`);\r\n }\r\n\r\n}\r\n","/**\r\n * This is temporary solution class of DI problem:\r\n * We cannot inject Angular services into AngularJS services directly.\r\n * This will throw an error at the login screen (suppressed below) but injection will work further down the pipeline\r\n * \r\n * With this class you can inject `angular.auto.IInjectorService` with DI in AngularJS service,\r\n * and then make a property inside class:\r\n *\r\n * `private readonly someService = new HybridServiceAccessor(\"someService\", this.injector);`\r\n *\r\n * and use it like singleton instance:\r\n *\r\n * `const someData = this.someService.service.someData;`\r\n *\r\n * This class should be removed immediately after whole application (or at least\r\n * every AngularJS service) is migrated to Angular.\r\n *\r\n */\r\nexport class HybridServiceAccessor {\r\n private _service: T;\r\n\r\n get service(): T {\r\n if (!this._service) {\r\n try {\r\n this._service = this.injector.get(this.name);\r\n }\r\n catch (error) {\r\n console.warn(`Cannot access \"${this.name}\" at this stage due to ${error}`);\r\n }\r\n }\r\n\r\n return this._service;\r\n }\r\n\r\n constructor(\r\n private readonly name: string,\r\n private readonly injector: angular.auto.IInjectorService\r\n ) { }\r\n}\r\n","\r\nimport { IExternalReference } from \"@directives/_veri/externalReference/externalReferences.interfaces\";\r\nimport { IDriverTachoHours } from \"@services/tacho.service\";\r\nimport { IResourceWithVideoEvents } from \"./IResourceWithVideoEvents\";\r\nimport { IVehicle } from \"./IVehicle\";\r\nimport { IVehicleDriverMapping } from \"./IVehicleDriverMapping\";\r\n\r\nexport interface IDriver extends IResourceWithVideoEvents{\r\n\r\n Id?: number;\r\n //ID?: number;\r\n Username?: string;\r\n Name?: string;\r\n FirstName?: string;\r\n LastName?: string;\r\n DisplayName?: string;\r\n Mobile?: string;\r\n Email?: string;\r\n Status?: DriverStatus;\r\n ButtonId?: string;\r\n Password?: string;\r\n Nfc?: string;\r\n HasImage?: boolean;\r\n GroupIds?: number[];\n TagIds?: number[];\r\n Updated?: string;\r\n\r\n // ---\r\n\r\n VehicleDriverMapping?: IVehicleDriverMapping[];\r\n currentAssignment?: IVehicleDriverMapping;\n\r\n vehicle?: IVehicle;\r\n tacho?: IDriverTachoHours;\r\n //assignmentEndUtc?: string;\r\n //assignedVehicleReg?: string;\r\n externalReferences?: IExternalReference[];\r\n}\r\n\r\nexport enum DriverStatus {\r\n Inactive = 0,\r\n Active = 1,\r\n}\r\n","import { HybridServiceAccessor } from \"@app/common/hybrid-service-accessor\";\r\nimport { ICombinedPreferences } from \"@interfaces/ICombinedPreferences\";\r\nimport { IRunBlockRootScope } from \"@interfaces/IRunBlockRootScope\";\r\nimport { UserPlatform } from \"@interfaces/IUser\";\r\nimport { StateService } from \"@uirouter/angularjs\";\r\nimport * as angular from \"angular\";\r\nimport copy from \"fast-copy/dist/fast-copy.esm.js\";\r\nimport * as moment from \"moment\";\r\n//import * as rg4js from 'raygun4js';\r\nimport { PageStateNames } from \"../class/PageStateNames\";\r\nimport { SettingsName } from \"../class/SettingsName\";\r\nimport { UserPreferencesService } from \"../userPreferences/service/userpreferences.service\";\r\nimport { CacheService } from \"./cache.Service\";\r\nimport { DataCacheService } from \"./caching/data-cache.service\";\r\nimport { AccountOption, IAccountOptions } from \"./class/AccountOption\";\r\nimport { ConstantsService } from \"./constantsService\";\r\nimport { ILoginResponse } from \"./login.service.ajs\";\r\nimport { PreferencesService } from \"./preferences.service\";\r\nimport { WebSocketService } from \"./websocket.service\";\r\n\r\nexport class SessionService {\r\n\r\n private dataStorage = [];\r\n\r\n //isLoggedIn = false;\r\n needToCollectUserData = true;\r\n tokenUrl: string;\r\n\r\n static $inject = [\"$window\", \"$http\", \"$cacheFactory\", \"$rootScope\", \"cacheService\", \"$q\", \"$log\", \"$state\", \"$mdDialog\", \"userPreferencesService\", \"webSocketService\", \"constantsService\", \"preferencesService\", \"$injector\"];\r\n\r\n constructor(\r\n private readonly $window: angular.IWindowService,\r\n private readonly $http: angular.IHttpService,\r\n private readonly $cacheFactory: angular.ICacheFactoryService,\r\n private readonly $rootScope: IRunBlockRootScope,\r\n private readonly cacheService: CacheService,\r\n private readonly $q: angular.IQService,\r\n private readonly $log: angular.ILogService,\r\n private readonly $state: StateService,\r\n private readonly $mdDialog: angular.material.IDialogService,\r\n private readonly userPreferencesService: UserPreferencesService,\r\n private readonly webSocketService: WebSocketService,\r\n private readonly constantsService: ConstantsService,\r\n private readonly preferencesService: PreferencesService,\r\n private readonly $injector: angular.auto.IInjectorService) {\r\n\r\n this.tokenUrl = this.constantsService.getTokenUrl();\r\n //this.isLoggedIn = !!this.getItem(SettingsName.AccessToken);\r\n\r\n this.refreshBuster();\r\n }\r\n\r\n hasActiveSession(): boolean {\r\n return !!this.getItem(SettingsName.AccessToken);\r\n }\r\n\r\n clearAllCachesAndSessions(): void {\r\n\r\n sessionStorage.clear();\r\n\r\n this.clearCustomerCacheData();\r\n }\r\n\r\n logout(force = false) {\r\n this.removeItem(SettingsName.AccountUserMappings);\r\n this.removeItem(SettingsName.AccountId);\r\n\r\n this.clearAllCachesAndSessions();\r\n\r\n this.$mdDialog.hide();\r\n\r\n if (!force && this.$state.transition) {\r\n return;\r\n }\r\n\r\n this.$state.go(PageStateNames.AUTHENTICATION_LOGIN);\r\n }\r\n\r\n setItem(key: any, value: any): void {\r\n\r\n key = key.toString();\r\n this.dataStorage[key] = value;\r\n\r\n\r\n if (this.isSessionStorageKey(key)) {\r\n this.$window.sessionStorage.setItem(key, value);\r\n }\r\n }\r\n\r\n getItem(key: SettingsName): T {\r\n\r\n if (key === SettingsName.DriverVehicles_DONTUSE || key === SettingsName.Geofences_DONTUSE || key === SettingsName.ReasonCode_DONTUSE) {\r\n console.error(\"getItem no longer works for this request\", key);\r\n //debugger;\r\n }\r\n\r\n const keyString = key.toString();\r\n\r\n if (this.isSessionStorageKey(key)) {\r\n return copy(this.$window.sessionStorage.getItem(keyString) as any);\r\n }\r\n\r\n if (!this.dataStorage[keyString]) {\r\n //console.error(\"Key\", SettingsName[keyString], \"doesnt exist in session storage\");\r\n return null;\r\n }\r\n\r\n return copy(this.dataStorage[keyString]);\r\n }\r\n\r\n removeItem(key: any): void {\r\n key = key.toString();\r\n this.dataStorage[key] = null;\r\n }\r\n\r\n setStorage(result: ILoginResponse): void {\r\n //debugger;\r\n\r\n this.needToCollectUserData = false;\r\n\r\n // error's when changed to this._encryptopn method\r\n this.setItem(SettingsName.AccessToken, result.access_token);\r\n\r\n this.setItem(SettingsName.RefreshToken, result.refresh_token);\r\n\r\n this.setItem(SettingsName.LoginFail, \"true\");\r\n\r\n this.setItem(SettingsName.LastTokenAssignmentTime, moment.utc());\r\n\r\n //this.setItem(SettingsName.CredentialOptions_DONOTUSE, result.credentialOptions);\r\n\r\n //this.RequestSetting(\"/Settings\", SettingsName.SettingsGeneral);\r\n //this.webSocketService.open();\r\n }\r\n\r\n shouldRefreshToken(): boolean {\r\n const dateLastRefreshed = this.getItem(SettingsName.LastTokenAssignmentTime);\r\n const rt = this.getItem(SettingsName.RefreshToken);\r\n\r\n //console.log(\"shouldRefreshToken\", dateLastRefreshed?.format(), moment.utc());\r\n\r\n if (dateLastRefreshed && rt) {\r\n // Updated by CJE 29th Jan 2021 (doubled from 1 hour)\r\n // Actual token should expire after 4 hours\r\n //return dateLastRefreshed.add(20, \"s\").isBefore(moment.utc());\r\n return dateLastRefreshed.add(2, \"h\").isBefore(moment.utc());\r\n }\r\n else {\r\n return false;\r\n }\r\n }\r\n\r\n switchAccount(accountId: number): angular.IPromise {\r\n this.clearCustomerCacheData();\r\n this.setItem(SettingsName.AccountId, accountId);\r\n return this.refreshSession(accountId, false);\r\n }\r\n\r\n switchToInternal(): angular.IPromise {\r\n this.clearCustomerCacheData();\r\n return this.refreshSession(null, true);\r\n }\r\n\r\n refreshPromise: angular.IPromise = null;\n refreshAttempts: number = 0;\r\n\r\n refreshSession(accountId = null, internal = false): angular.IPromise {\r\n if (this.refreshPromise) {\r\n return this.refreshPromise;\r\n }\r\n\r\n const headers = {\r\n \"Content-Type\": \"application/x-www-form-urlencoded\",\r\n };\r\n\r\n if (accountId) {\r\n headers[\"AccountId\"] = accountId;\r\n }\r\n\r\n if (internal) {\r\n headers[\"Internal\"] = internal;\r\n }\r\n\r\n const rt = this.getItem(SettingsName.RefreshToken);\r\n this.refreshPromise = this\r\n .$http({\r\n url: this.tokenUrl,\r\n method: \"POST\",\r\n data: `grant_type=refresh_token&refresh_token=${rt}`,\r\n headers: headers\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n var result = response.data;\r\n\r\n if (result != null) {\r\n if (result.access_token.length > 0) {\r\n this.setStorage(result);\r\n }\r\n }\r\n\r\n return result;\r\n })\r\n .catch((e: angular.IHttpResponse) => {\r\n console.warn(\"Refresh session token failed\", e.data, e);\n if (this.refreshAttempts >= 3) {\n console.warn(`Refresh attempt count exceeded. Logging out.`)\n this.logout();\r\n }\n else {\n this.refreshAttempts++;\n console.warn(`Refresh attempt failed ${this.refreshAttempts} time(s). Retrying...`)\n this.refreshSession(accountId, internal);\r\n }\r\n })\r\n .finally(() => {\r\n this.refreshPromise = null;\n this.refreshAttempts = 0;\r\n });\r\n\r\n return this.refreshPromise;\r\n }\r\n\r\n getUserOptions(): angular.IPromise {\r\n return this.preferencesService.getAllPreferences().then((combinedPrefs: ICombinedPreferences) => {\r\n this.saveUserOptions(combinedPrefs);\r\n });\r\n }\r\n\r\n getAccountOptions(): angular.IPromise {\r\n return this.userPreferencesService.getAccountOptions().then(result => {\r\n this.saveAccountOptions(result);\r\n });\r\n }\r\n\r\n getAllUserAndAccountSettings() {\r\n const promises: any[] = [];\r\n\r\n promises.push(this.getUserOptions());\r\n if (this.$rootScope.currentUser.CurrentAccountUserMapping && this.$rootScope.currentUser.platform !== UserPlatform.Foundation) {\r\n promises.push(this.getAccountOptions());\r\n }\r\n\r\n return this.$q.all(promises);\r\n }\n\r\n toggleConfigurableDashboards(enabled = true) {\r\n var accountOptions = this.getItem(SettingsName.AccountOptions);\r\n\r\n accountOptions.ConfigurableDashboards = enabled;\r\n\r\n this.setItem(SettingsName.AccountOptions, accountOptions);\r\n }\r\n\r\n // ---\r\n\r\n private saveUserOptions(userOptions: ICombinedPreferences) {\r\n this.setItem(SettingsName.UserOptions, userOptions);\r\n }\r\n\r\n private saveAccountOptions(accountOptions: IAccountOptions) {\r\n const accountOptionModel = new AccountOption(accountOptions);\r\n this.setItem(SettingsName.AccountOptions, accountOptionModel);\r\n\r\n //if (accountOptions.AccountId === 37 || accountOptions.AccountId === 6224) {\r\n // this.webSocketService.open();\r\n //}\r\n }\r\n\r\n private isSessionStorageKey(key: number): boolean {\r\n\r\n // this is not good, but is the only way for now\r\n const isSessionKey = key == SettingsName.AccessToken || key == SettingsName.RefreshToken;\r\n\r\n return isSessionKey;\r\n }\r\n\r\n private refreshBuster() {\r\n\r\n // Sometimes we get into a weird refresh cycle, this is designed to short circuit this if we end up here\r\n var sessionKey = \"refreshCount\";\r\n var refreshCountString = this.$window.sessionStorage.getItem(sessionKey) || \"0\";\r\n var refreshCount = parseInt(refreshCountString);\r\n refreshCount++;\r\n\r\n if (refreshCount > 3) {\r\n this.$window.sessionStorage.clear();\r\n window.location.href = `//${window.location.host}`;\r\n return;\r\n }\r\n\r\n this.$window.sessionStorage.setItem(sessionKey, `${refreshCount + 1}`);\r\n\r\n // This allows us to clear our count AFTER we have stability\r\n setTimeout(() => {\r\n this.$window.sessionStorage.removeItem(sessionKey);\r\n }, 2000);\r\n }\r\n\r\n private clearCustomerCacheData() {\r\n\r\n if (this.webSocketService) {\r\n this.webSocketService.close();\r\n }\r\n\r\n const dataCacheService = new HybridServiceAccessor(\"dataCacheService\", this.$injector);\r\n dataCacheService?.service?.clearAllCaches();\r\n\r\n this.cacheService.clearAllCaches();\n\r\n const httpCache = this.$cacheFactory.get(\"$http\");\r\n httpCache.removeAll();\r\n }\r\n}\r\n","//import { PolyLabel } from \"./class/PolyLabel\";\r\nimport { ITag, ITagGeofenceMapping } from \"@app/interfaces/ITag\";\r\nimport { GeofenceOverlay } from \"@directives/_map/geofences/geofenceoverlay\";\r\nimport { IGeofenceNavigationPoint } from \"@directives/_map/geofences/geofences.interfaces\";\r\nimport { IVeriMapComponent } from \"@directives/_map/veriMap/veriMapComponent/veriMap.component\";\r\nimport { ICoords } from \"@interfaces/ICoords\";\r\nimport { IDeleteVertexParams } from \"@interfaces/IDeleteVertexParams\";\r\nimport { IDriver } from \"@interfaces/IDriver\";\r\nimport { GeofenceCategory, IGeofence } from \"@interfaces/IGeofences\";\r\nimport { IPlot } from \"@interfaces/IPlot\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { IGroup } from \"@interfaces/IVehicleGroup\";\r\nimport * as polylabel from \"@mapbox/polylabel\";\r\nimport { AccountService } from \"@services/account.service\";\r\nimport { ConstantsService } from \"@services/constantsService\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport * as angular from \"angular\";\r\nimport copy from \"fast-copy\";\r\nimport * as moment from \"moment\";\r\nimport { IGeoArea } from \"src/app/main/modules/tms/_models/IGeoArea\";\r\nimport { GeofenceType } from \"../enum/GeofenceType\";\r\nimport { CacheService } from \"./cache.Service\";\r\nimport { CanvasService } from \"./canvas.service\";\r\nimport { DisplayService, IDialogOptionsJson } from \"./display.service\";\r\nimport { DriverService } from \"./driver.service\";\r\nimport { FilterOptionsService } from \"./filterOptions.service\";\r\nimport { GeocodeService, IViewPort } from \"./geocode.service\";\r\nimport { GroupService } from \"./group.service.ajs\";\r\nimport { TagResourceType, TagsService } from \"./tags.service\";\r\nimport { VehicleService } from \"./vehicle.service\";\r\nimport { VeriDate } from \"./veriDate.service\";\r\n\r\nexport interface IGetGeofenceOptions {\r\n includeTags?: boolean;\r\n\r\n invalidateCache?: boolean;\r\n unsafe?: boolean;\r\n}\r\n\r\nexport interface IGeofenceShapeValidation {\r\n valid: boolean;\r\n failedReason?: string;\r\n geofence: IGeofence;\r\n}\r\n\r\nexport interface IGeofenceColors {\r\n strokeColor: string;\r\n strokeOpacity: number;\r\n strokeWeight: number;\r\n fillColor: string;\r\n fillOpacity: number;\r\n zIndex: number;\r\n}\r\n\r\nexport interface IAccumulatedData {\r\n AccelerationCountGps: number;\r\n\r\n OverAccelerationDuration: number;\r\n\r\n BrakeApplications: number;\r\n\r\n BrakeApplicationsOverThreshold: number;\r\n\r\n BrakeDistance: number;\r\n\r\n BadAnticipationCount: number;\r\n\r\n CoastingDuration: number;\r\n\r\n CoastingDistance: number;\r\n\r\n CruiseDuration: number;\r\n\r\n CorneringCountGps: number;\r\n\r\n DecelerationCountGps: number;\r\n\r\n DrivingDuration: number;\r\n\r\n EngineOnDuration: number;\r\n\r\n FuelUsedDriving: number;\r\n\r\n FuelUsedIdle: number;\r\n\r\n FuelUsedPto: number;\r\n\r\n FuelUsedTotal: number;\r\n\r\n PtoDuration: number;\r\n\r\n OverRevDuration: number;\r\n\r\n OverSpeedDuration: number;\r\n\r\n OverTorqueDuration: number;\r\n\r\n IdlingDuration: number;\r\n\r\n OverIdlingDuration: number;\r\n\r\n OverIdlingCount: number;\r\n}\r\n\r\nexport interface IAggregatedData extends IAccumulatedData {\r\n AverageSpeed: number;\r\n\r\n Distance: number;\r\n\r\n DistanceKm: number;\r\n\r\n OdometerKmStart: number;\r\n\r\n OdometerKmEnd: number;\r\n\r\n MaxSpeedKph: number;\r\n\r\n DistanceKmCan: number;\r\n\r\n FuelLevelStart: number;\r\n\r\n FuelLevelEnd: number;\r\n\r\n OdometerKmCanStart: number;\r\n\r\n OdometerKmCanEnd: number;\r\n}\r\n\r\nexport interface IGeofenceVisit {\r\n Id: number;\r\n GeofenceId: number;\r\n VehicleId: number;\r\n\r\n IgnitionStateCount: number;\r\n StartPlotId: number;\r\n EndPlotId: number;\r\n StartUtc: string;\r\n EndUtc: string;\r\n\r\n // ---\r\n\r\n geofence: IGeofence;\r\n vehicle?: IVehicle;\r\n duration?: number;\r\n durationFormatted?: string;\r\n}\r\n\r\nexport interface IShowGeofenceEditorOptions {\r\n focusedLatLngs?: google.maps.LatLng;\r\n resource?: IVehicle | IPlot;\r\n onGeofenceEditorCancelled?: () => void;\r\n onGeofenceEditorSaved?: (geofence: IGeofence) => void;\r\n onGeofenceEditorDeleted?: (geofence: IGeofence) => void;\r\n}\r\n\r\nexport interface ICachedById {\r\n id: ID,\r\n data: T\r\n}\r\n\r\n//app.components_resourceManagement({page:'geofences', model:$ctrl.popupModel.Id, modelType:'geofence',panel:'edit'})\"\r\nexport class GeofenceService {\r\n\r\n blueGeofenceColors: IGeofenceColors = {\r\n strokeColor: \"rgb(0, 66, 106)\",\r\n strokeOpacity: 0.8,\r\n strokeWeight: 1,\r\n fillColor: \"rgb(0, 66, 106)\",\r\n fillOpacity: 0.6,\r\n zIndex: 1\r\n }\r\n\r\n defaultGeofenceColors: IGeofenceColors = {\r\n strokeColor: \"rgb(50, 50, 50)\",\r\n strokeOpacity: 0.8,\r\n strokeWeight: 1,\r\n fillColor: \"rgb(50, 50, 50)\",\r\n fillOpacity: 0.4,\r\n zIndex: 1\r\n }\r\n\r\n selectedGeofenceColors: IGeofenceColors = {\r\n strokeColor: \"rgb(160, 16, 0)\",\r\n strokeOpacity: 0.8,\r\n strokeWeight: 1,\r\n fillColor: \"rgb(160, 16, 0)\",\r\n fillOpacity: 0.4,\r\n zIndex: 100\r\n }\r\n\r\n private readonly MAX_POLYGON_AREA = 3150000;\r\n private readonly MIN_POLYGON_AREA = 3925;\r\n\r\n private readonly MAX_GEOFENCE_RADIUS = 1000;\r\n private readonly MIN_GEOFENCE_RADIUS = 50;\r\n\r\n private accoundId: number;\r\n private geofenceCacheName = \"geofences\";\r\n private navPointCacheName = \"navPoints\";\r\n isDemoSite: boolean;\r\n\r\n static $inject = [\"$q\", \"$http\", \"cacheService\", \"geocodeService\", \"vehicleService\", \"canvasService\", \"tagsService\", \"driverService\", \"groupService\", \"filterOptionsService\", \"veriDate\", \"displayService\", \"constantsService\", \"translationService\", \"accountService\", \"$sanitize\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $http: angular.IHttpService,\r\n private readonly cacheService: CacheService,\r\n private readonly geocodeService: GeocodeService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly canvasService: CanvasService,\r\n private readonly tagsService: TagsService,\r\n //private readonly driverAssignmentService: DriverAssignmentService,\r\n private readonly driverService: DriverService,\r\n private readonly groupService: GroupService,\r\n private readonly filterOptionsService: FilterOptionsService,\r\n private readonly veriDate: VeriDate,\r\n private readonly displayService: DisplayService,\r\n private readonly constantsService: ConstantsService,\r\n private readonly translationService: TranslationService,\r\n private readonly accountService: AccountService,\r\n private readonly $sanitize\r\n ) {\r\n this.isDemoSite = this.constantsService.getIsDemoSite();\r\n\r\n this.cacheService.createCache(this.geofenceCacheName, {\r\n deleteOnExpire: \"passive\",\r\n maxAge: 60 * 60 * 1000, // 60min default\r\n });\r\n\r\n this.cacheService.createCache(this.navPointCacheName, {\r\n deleteOnExpire: \"passive\",\r\n maxAge: 60 * 60 * 1000, // 60min default\r\n });\r\n\r\n }\r\n\r\n //calculateConvexHull(polygon: google.maps.Polygon): google.maps.LatLng[] {\r\n // var points: google.maps.LatLng[] = polygon.getPath().getArray()\r\n\r\n // points.sort((a, b) => { return a.lng() - b.lng(); });\r\n // points.sort((a, b) => { return a.lat() - b.lat(); });\r\n\r\n // return points;\r\n //}\r\n\r\n getGeofenceNavigationPoints(geofenceId: number): angular.IPromise {\r\n return this.cacheService.getOrRetrieveItem, IGeofenceNavigationPoint[]>(\r\n this.navPointCacheName,\r\n () => this.getGeofenceNavigationPointsFromDatabase(geofenceId),\r\n (navigationPoints) => {\r\n return { id: geofenceId, data: navigationPoints };\r\n },\r\n (cache) => cache.data,\r\n geofenceId\r\n );\r\n }\r\n\r\n getGeofenceNavigationPointsFromDatabase(geofenceId: number): angular.IPromise {\r\n return this.$http({\r\n url: `/api/navigationpoints/${geofenceId}`,\r\n method: \"GET\"\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n saveGeofenceNavigationPoints(geofenceId: number, geofenceNavigationPoints: IGeofenceNavigationPoint[] = []): angular.IPromise {\r\n return this.$http\r\n .post(`/api/navigationpoints/${geofenceId}`, geofenceNavigationPoints)\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n this.cacheService.upsertItem>(\r\n this.navPointCacheName,\r\n geofenceId,\r\n { id: geofenceId, data: geofenceNavigationPoints },\r\n (cache, newItem) => { cache.data = newItem.data }\r\n );\r\n return result.data;\r\n });\r\n }\r\n\r\n getGeofenceVisitsByGeofence(geofenceId: number, startDate: moment.Moment, endDate: moment.Moment): angular.IPromise {\r\n const visitsPromise = this\r\n .$http({\r\n url: `/api/geofencevisits/geofence/${geofenceId}?start=${startDate.toISOString()}&end=${endDate.toISOString()}`,\r\n method: \"GET\"\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n\r\n return this.getAndMapVehiclesToVisits(visitsPromise);\r\n }\r\n\r\n getGeofenceVisitsByVehicle(vehicleId: number, startDate: moment.Moment, endDate: moment.Moment, includeAllIntersecting = true): angular.IPromise {\r\n const visitsPromise = this\r\n .$http({\r\n url: `/api/geofencevisits/vehicle/${vehicleId}?start=${startDate.toISOString()}&end=${endDate.toISOString()}`,\r\n method: \"GET\",\r\n params: {\r\n includeAllIntersecting: includeAllIntersecting\r\n }\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n //console.log(\"raw\", result.data[0])\r\n\r\n // May not want to stay in here - any visits that start or end after the time window will be time limited to the window itself\r\n // CJE removed 16/10/2019\r\n //result.data.forEach(visit => {\r\n // if (startDate.isAfter(visit.StartUtc)) {\r\n // visit.StartUtc = startDate.toISOString();\r\n // }\r\n\r\n // if (endDate.isBefore(visit.EndUtc)) {\r\n // visit.EndUtc = endDate.toISOString();\r\n // }\r\n //});\r\n\r\n return result.data;\r\n });\r\n\r\n return this.getAndMapVehiclesToVisits(visitsPromise);\r\n }\r\n\r\n getGeofenceVisits(startDate: moment.Moment, endDate: moment.Moment, mapVehiclesAndDrivers = true): angular.IPromise {\r\n const visitsPromise = this\r\n .$http({\r\n url: `/api/geofencevisits?start=${startDate.toISOString()}&end=${endDate.toISOString()}`,\r\n method: \"GET\"\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n\r\n if (mapVehiclesAndDrivers) {\r\n return this.getAndMapVehiclesToVisits(visitsPromise);\r\n }\r\n\r\n return visitsPromise;\r\n }\r\n\r\n getGeofences(options?: IGetGeofenceOptions): angular.IPromise {\r\n const geofencesPromise = this.cacheService.getOrRetrieveData(this.geofenceCacheName, () => this.getGeofencesFromDatabase(), options?.invalidateCache, options?.unsafe);\r\n const tagMappingPromise = options?.includeTags ? this.tagsService.getTagGeofenceMappings({}, options?.invalidateCache) : this.$q.when([]);\r\n const tagsPromise = options?.includeTags ? this.tagsService.getTags({ Active: true, invalidateCache: options?.invalidateCache }) : this.$q.when([]);\r\n\r\n return this.$q\r\n .all([tagMappingPromise, tagsPromise, geofencesPromise])\r\n .then(([tagMappings, tags, geofences]) => {\r\n this.tagsService.mapTagMappingsToResources(tagMappings, geofences, TagResourceType.Geofence);\r\n\r\n if (tags?.length && geofences?.length) {\r\n\r\n geofences.forEach(geofence => {\r\n if (!geofence.TagIds?.length) {\r\n return;\r\n }\r\n\r\n geofence.Tags = tags.filter(tag => geofence.TagIds.find(geofenceTagId => geofenceTagId === tag.Id));\r\n\r\n if (!geofence.Tags?.length) {\r\n return;\r\n }\r\n\r\n geofence.Tags.sort((t1, t2) => {\r\n return t1.Position < t2.Position ? -1 : 1;\r\n });\r\n\r\n geofence.PriorityTag = geofence.Tags[0];\r\n })\r\n }\r\n\r\n return geofences;\r\n });\r\n\r\n }\r\n\r\n getGeofenceById(geofenceId: number, options?: IGetGeofenceOptions, invalidateCache = false): angular.IPromise {\r\n\r\n const geofencePromise = this\r\n .$http({\r\n url: `/api/geofences/${geofenceId}`,\r\n method: \"GET\",\r\n params: {\r\n invalidateCache: invalidateCache\r\n }\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n\r\n const tagMappingPromise = options?.includeTags ? this.tagsService.getTagGeofenceMappings({}, invalidateCache) : this.$q.when([]);\r\n\r\n return this.$q\r\n .all([tagMappingPromise, geofencePromise])\r\n .then(([tagMappings, geofence]) => {\r\n\r\n this.tagsService.mapTagMappingsToResources(tagMappings, [geofence], TagResourceType.Geofence);\r\n\r\n return geofence;\r\n });\r\n }\r\n\r\n createGeofenceOverlays(map: google.maps.Map, geofences: IGeofence[], showLabelWhenZoomedOut: boolean, drawImmediately = false) {\r\n window.performance.mark(\"createGeofenceOverlays\");\r\n const overlays: GeofenceOverlay[] = [];\r\n\r\n if (!geofences) {\r\n return overlays;\r\n }\r\n\r\n let i = geofences.length;\r\n while (i--) {\r\n const geofence = geofences[i];\r\n const overlay = this.createGeofenceOverlay(geofence, map, showLabelWhenZoomedOut, drawImmediately);\r\n\r\n if (overlay) {\r\n overlays.push(overlay);\r\n }\r\n }\r\n\r\n // Sort by size\r\n //overlays.sort((overlay1, overlay2) => {\r\n // return this.getGeofenceOverlayArea(overlay1) > this.getGeofenceOverlayArea(overlay2)\r\n // ? 1\r\n // : -1;\r\n //});\r\n window.performance.measure(\"createGeofenceOverlays\");\r\n\r\n return overlays;\r\n }\r\n\r\n getGeofenceOverlayArea(geofenceOverlay: GeofenceOverlay) {\r\n var ne = geofenceOverlay.bounds.getNorthEast(); // LatLng of the north-east corner\r\n var sw = geofenceOverlay.bounds.getSouthWest(); // LatLng of the south-west corder\r\n var nw = new google.maps.LatLng(ne.lat(), sw.lng());\r\n var se = new google.maps.LatLng(sw.lat(), ne.lng());\r\n\r\n var latLngList: google.maps.LatLng[] = [ne, nw, sw, se];\r\n return google.maps.geometry.spherical.computeArea(latLngList);\r\n }\r\n\r\n createGeofenceCoords(geofence: IGeofence) {\r\n if (!geofence.MapCoords) {\r\n geofence.MapCoords = new google.maps.LatLng(geofence.Latitude, geofence.Longitude);\r\n }\r\n }\r\n\r\n setPolygonGeofenceVisualCenter(geofence: IGeoArea) {\r\n if (!geofence.Points?.length) {\r\n console.error(\"Tried to set visual center on geofence with no points\", geofence);\r\n return;\r\n }\r\n\r\n const center = polylabel([geofence.Points], 0.00001);\r\n\r\n [geofence.Latitude, geofence.Longitude] = center;\r\n }\r\n\r\n createGeofenceOverlay(geofence: IGeofence, map: google.maps.Map, showLabelWhenZoomedOut: boolean, drawImmediately = false): GeofenceOverlay {\r\n\r\n if (!geofence) {\r\n return null;\r\n }\r\n\r\n if (geofence.GeofenceType == GeofenceType.Circle) {\r\n }\r\n else if (geofence.GeofenceType == GeofenceType.Polygon) {\r\n var coords = [];\r\n\r\n if (!geofence.Points) {\r\n //console.error(\"Geofence set to polygon but has no points\", geofence);\r\n\r\n return null;\r\n }\r\n\r\n for (var i = 0; i < geofence.Points.length; i++) {\r\n const [lat, lng] = geofence.Points[i];\r\n coords.push({ lat, lng });\r\n }\r\n }\r\n else {\r\n return null;\r\n }\r\n\r\n this.createGeofenceCoords(geofence);\r\n\r\n return new GeofenceOverlay(geofence, map, showLabelWhenZoomedOut, drawImmediately);\r\n }\r\n\r\n createNewGeofence(latLngs: google.maps.LatLng, resource?: IVehicle | IPlot): angular.IPromise {\r\n\r\n const newGeofence: IGeofence = {\r\n Id: 0,\r\n Radius: 150,\r\n Category: GeofenceCategory.Standard,\r\n Latitude: latLngs.lat(),\r\n Longitude: latLngs.lng(),\r\n GeofenceType: GeofenceType.Circle,\r\n Email: \"\",\r\n Description: \"\",\r\n Tags: [],\r\n TagIds: [],\r\n Addr3: \"\"\r\n };\r\n\r\n let addressPromise = this.$q.resolve(this.geocodeService.getAddressFromPoint(latLngs));\r\n\r\n if (!!resource && !(\"Reg\" in resource)) {\r\n addressPromise = this.$q.resolve(this.geocodeService.getLocationInformationFromPlotId(resource.Id));\r\n }\r\n\r\n return this.$q\r\n .all([\r\n this.accountService.getAccountData(),\r\n addressPromise,\r\n ])\r\n .then(([account, geocodedAddress]) => {\r\n newGeofence.AccountId = account?.Id;\r\n newGeofence.Addr3 = geocodedAddress.LocationDescription;\r\n\r\n return this.$q.resolve(newGeofence);\r\n });\r\n }\r\n\r\n createGeofenceCoordsFromLatLng(latLng: google.maps.LatLng): ICoords {\r\n var coords: ICoords = {\r\n Latitude: latLng.lat(),\r\n Longitude: latLng.lng()\r\n };\r\n\r\n return coords;\r\n }\r\n\r\n saveGeofence(geofence: IGeofence): angular.IPromise {\r\n var geofenceCopy = this.createSerializeableGeofenceCopy(geofence);\r\n const isSystemGeofence = (geofenceCopy.isSystemGeofence != null ? geofenceCopy.isSystemGeofence : false);\r\n\r\n return this.$http({\r\n url: `/api/geofences/`,\r\n method: \"POST\",\r\n data: geofenceCopy,\r\n params: { isSystemGeofence: isSystemGeofence }\r\n }).then((result: angular.IHttpPromiseCallbackArg) => {\r\n\r\n if (!geofence.Id && result.data) {\r\n geofence.Id = result.data;\r\n }\r\n\r\n return this.tagsService.saveResourceTags(geofence, TagResourceType.Geofence).then(() => {\r\n geofence = this.removeAndResetGeofenceTags(geofence);\r\n\r\n this.updateOrInsertGeofenceCache(geofence);\r\n\r\n return geofence.Id;\r\n });\r\n });\r\n }\r\n\r\n updateOrInsertGeofenceCache(geofence: IGeofence): void {\r\n this.cacheService.addOrUpdateItem(this.geofenceCacheName, geofence, (v1, v2) => v1.Id == v2.Id);\r\n }\r\n\r\n importGeofences(geoFences: IGeofence[]): angular.IPromise {\r\n const geofencesCopy = this.createSerializeableGeofencesCopy(geoFences);\r\n\r\n return this.$http\r\n .post(\"/api/geofences/import\", geofencesCopy)\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n createSerializeableGeofenceCopy(geofenceSource: IGeofence): IGeofence {\r\n var geofenceCopy: IGeofence = {};\r\n\r\n for (var key in geofenceSource) {\r\n if (geofenceSource.hasOwnProperty(key) && key !== \"MapObject\") {\r\n geofenceCopy[key] = angular.copy(geofenceSource[key]);\r\n }\r\n }\r\n\r\n return geofenceCopy;\r\n }\r\n\r\n createSerializeableGeofencesCopy(geofencesSource: IGeofence[]): IGeofence[] {\r\n const geofencesCopy: IGeofence[] = [];\r\n\r\n geofencesSource.forEach((geofenceSource) => {\r\n geofencesCopy.push(this.createSerializeableGeofenceCopy(geofenceSource));\r\n });\r\n\r\n return geofencesCopy;\r\n }\r\n\r\n deleteGeofence(geofence: IGeofence): angular.IPromise {\r\n geofence.PendingDelete = true;\r\n\r\n return this.$http\r\n .delete(\"/api/geofences/\" + geofence.Id)\r\n .then(() => {\r\n this.cacheService.deleteItem(this.geofenceCacheName, geofence, (v1, v2) => v1.Id == v2.Id)\r\n });\r\n }\r\n\r\n destroyGeofence(geofence: google.maps.Circle | google.maps.Polygon) {\r\n if (geofence) {\r\n google.maps.event.clearInstanceListeners(geofence);\r\n geofence.setMap(null);\r\n geofence = null;\r\n }\r\n }\r\n\r\n setGeofenceAddressFromPosition(geofence: IGeofence): angular.IPromise {\r\n return this.geocodeService\r\n .getAddressFromPoint(new google.maps.LatLng(geofence.Latitude, geofence.Longitude))\r\n .then(address => {\r\n\r\n if (!geofence || !address.LocationDescription) {\r\n geofence.Addr1 = \"\";\r\n geofence.Addr2 = \"\";\r\n geofence.Addr3 = \"\";\r\n geofence.Addr4 = \"\";\r\n\r\n return;\r\n }\r\n\r\n // Split up formatted address by comma\r\n var addressComponents = address.LocationDescription.split(\",\");\r\n geofence.Addr1 = addressComponents[0];\r\n geofence.Addr2 = addressComponents[1];\r\n geofence.Addr3 = addressComponents[2];\r\n geofence.Addr4 = addressComponents[3];\r\n });\r\n }\r\n\r\n addDeleteVertexButtonToPolygon(deleteVertexParams: IDeleteVertexParams) {\r\n if (!deleteVertexParams || !deleteVertexParams.polygon || !deleteVertexParams.polygon.getPath()) {\r\n console.error(\"No polygon / path\");\r\n }\r\n\r\n // This is a bit hacky\r\n const path = deleteVertexParams.polygon.getPath();\r\n path[\"btnDeleteClickHandler\"] = {};\r\n path[\"btnDeleteImageUrl\"] = \"/assets/images/polyline_delete_button.png\";\r\n\r\n //google.maps.event.addListener(polygon, \"click\", (event: google.maps.PolyMouseEvent) => { this.callback(path, event.vertex); });\r\n google.maps.event.addListener(path, \"set_at\", (index: number) => { this.callback(path, index, deleteVertexParams); });\r\n google.maps.event.addListener(path, \"insert_at\", (index: number) => { this.callback(path, index, deleteVertexParams); });\r\n }\r\n\r\n removeDeleteVertexButtonFromPolygon() {\r\n\r\n var deleteButton = angular.element(\"#googleMapsDeletePolyVertexButton\");\r\n if (deleteButton.length > 0) {\r\n deleteButton.remove();\r\n }\r\n }\r\n\r\n pointIsInsideGeofence(point: google.maps.LatLng, geoArea: IGeoArea): boolean {\r\n const x = point.lat();\r\n const y = point.lng();\r\n\r\n if (geoArea.GeofenceType == GeofenceType.Circle) {\r\n return google.maps.geometry.spherical.computeDistanceBetween(point, geoArea.MapCoords) <= geoArea.Radius;\r\n }\r\n\r\n // ray-casting algorithm based on\r\n // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html\r\n\r\n const vs = geoArea.Points;\r\n\r\n let inside = false;\r\n for (var i = 0, j = vs.length - 1; i < vs.length; j = i++) {\r\n const xi = vs[i][0];\r\n const yi = vs[i][1];\r\n const xj = vs[j][0];\r\n const yj = vs[j][1];\r\n\r\n const intersect = ((yi > y) !== (yj > y)) && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);\r\n\r\n if (intersect) {\r\n inside = !inside;\r\n }\r\n }\r\n\r\n return inside;\r\n }\r\n\r\n findGeofence(geofences: IGeofence[], geofenceId: number): IGeofence {\r\n for (let i = 0; i < geofences.length; i++) {\r\n const geofence = geofences[i];\r\n\r\n if (geofence.Id == geofenceId) {\r\n return geofence;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n searchGeofences(geofences: IGeofence[], searchString: string): IGeofence[] {\r\n return geofences.filter(g => g.Description.localeCompare(searchString, undefined, { 'sensitivity': 'base' }))\r\n }\r\n\r\n fitMapToGeofences(veriMap: IVeriMapComponent, geofence: IGeofence, geofences: IGeofence[], bounds: IViewPort = null) {\r\n if (!veriMap) {\r\n return;\r\n }\r\n\r\n var latLngList: google.maps.LatLng[] = [];\r\n\r\n if (geofence) {\r\n const points: [number, number][] = this.getAllGeofencePoints(geofence);\r\n\r\n if (points?.length > 0) {\r\n points.forEach(point => {\r\n latLngList.push(new google.maps.LatLng(point[0], point[1]));\r\n });\r\n }\r\n else {\r\n var geofenceCenter = new google.maps.LatLng(geofence.Latitude, geofence.Longitude);\r\n var gTop = google.maps.geometry.spherical.computeOffset(geofenceCenter, geofence.Radius, 0);\r\n var gBottom = google.maps.geometry.spherical.computeOffset(geofenceCenter, geofence.Radius, 180);\r\n latLngList.push(gTop);\r\n latLngList.push(gBottom);\r\n }\r\n }\r\n else if (!geofence && geofences && geofences.length > 0) {\r\n geofences.forEach(geofence => {\r\n latLngList.push(new google.maps.LatLng(geofence.Latitude, geofence.Longitude));\r\n });\r\n }\r\n else {\r\n if (bounds) {\r\n latLngList.push(new google.maps.LatLng(bounds.northeast.lat, bounds.northeast.lng));\r\n latLngList.push(new google.maps.LatLng(bounds.southwest.lat, bounds.southwest.lng));\r\n }\r\n else {\r\n latLngList.push(new google.maps.LatLng(55.811741, 1.76896));\r\n latLngList.push(new google.maps.LatLng(49.871159, -6.37988));\r\n }\r\n\r\n }\r\n\r\n veriMap.fitMap(latLngList);\r\n }\r\n\r\n findGeofenceVisitsToDepotsOrHomeLocations(geofenceVisits: IGeofenceVisit[], depotsWithHomeLocations: IGroup[]): IGeofenceVisit[] {\r\n return geofenceVisits.filter(geofenceVisit => {\r\n\r\n if (!geofenceVisit.vehicle) {\r\n return false;\r\n }\r\n\r\n // If we have a vehicle home location, and this isnt it, then we are not inside our home location\r\n if (geofenceVisit.vehicle.GeofenceId && geofenceVisit.vehicle.GeofenceId == geofenceVisit.GeofenceId) {\r\n return true;\r\n }\r\n\r\n // Find my depot\r\n var vehicleDepot = depotsWithHomeLocations.find(g => g.VehicleIds.indexOf(geofenceVisit.VehicleId) >= 0);\r\n\r\n if (vehicleDepot && vehicleDepot.GeofenceId == geofenceVisit.GeofenceId) {\r\n return true;\r\n }\r\n\r\n return false;\r\n });\r\n }\r\n\r\n showGeofenceEditor(\r\n geofence: IGeofence = null,\r\n $event: MouseEvent,\r\n options?: IShowGeofenceEditorOptions) {\r\n\r\n const dialogTitle = (geofence) ? this.translationService.t('geofenceService.geofenceName', geofence?.Description) : this.translationService.t('geofenceService.createNewGeofence');\r\n const dialogTitleSanitized = this.$sanitize(dialogTitle);\r\n\r\n const dialogOptions: IDialogOptionsJson = {\r\n title: dialogTitleSanitized,\r\n dialogHTML: ``,\r\n dialogId: `geofenceEditorComponent`,\r\n customClass: `geofence-editor-dialog`,\r\n multiple: true,\r\n bindings: {\r\n geofence: geofence,\r\n resource: options?.resource,\r\n focusedLatLngs: options?.focusedLatLngs,\r\n onGeofenceEditorCancelled: () => { options?.onGeofenceEditorCancelled() },\r\n onGeofenceEditorSaved: (savedGeofence: IGeofence) => { options?.onGeofenceEditorSaved(savedGeofence); },\r\n onGeofenceEditorDeleted: (deletedGeofence: IGeofence) => { options?.onGeofenceEditorDeleted(deletedGeofence); }\r\n },\r\n event: $event,\r\n preventFocusOnOpen: true\r\n };\r\n\r\n this.displayService.showDialog(dialogOptions);\r\n }\r\n\r\n validateGeofenceShape(geofence: IGeofence, ignoreMaxSize: boolean = false): IGeofenceShapeValidation {\r\n\r\n let newValidation: IGeofenceShapeValidation = {\r\n valid: false,\r\n geofence\r\n };\r\n\r\n if (!geofence) {\r\n newValidation.failedReason = this.translationService.t('geofenceService.noGeofenceProvided');\r\n\r\n return newValidation;\r\n }\r\n\r\n if (geofence.GeofenceType === GeofenceType.Circle) {\r\n const currentRadius = geofence.Radius;\r\n\r\n if (!ignoreMaxSize && currentRadius > this.MAX_GEOFENCE_RADIUS) {\r\n newValidation.failedReason = this.translationService.t('geofenceService.radiusMoreThan', this.MAX_GEOFENCE_RADIUS.toFixed(0));\r\n return newValidation;\r\n\r\n } else if (currentRadius < this.MIN_GEOFENCE_RADIUS) {\r\n newValidation.failedReason = this.translationService.t('geofenceService.radiusLessThan', this.MIN_GEOFENCE_RADIUS.toFixed(0));\r\n return newValidation;\r\n }\r\n\r\n } else if (geofence.GeofenceType === GeofenceType.Polygon) {\r\n\r\n const polyPath: google.maps.LatLng[] = [];\r\n\r\n geofence?.Points?.forEach(point => {\r\n polyPath.push(new google.maps.LatLng(point[0], point[1]));\r\n });\r\n\r\n if (polyPath.length === 0) {\r\n newValidation.failedReason = this.translationService.t('geofenceService.polygonNoPoints');\r\n return newValidation;\r\n }\r\n\r\n const currentPolyArea = google.maps.geometry.spherical.computeArea(polyPath);\r\n const maxAreaLabel = +(currentPolyArea - this.MAX_POLYGON_AREA).toFixed(0);\r\n const minAreaLabel = +(this.MIN_POLYGON_AREA - currentPolyArea).toFixed(0);\r\n\r\n if (!currentPolyArea) {\r\n newValidation.failedReason = this.translationService.t('geofenceService.polygonNoArea');\r\n return newValidation;\r\n }\r\n\r\n if (!ignoreMaxSize && currentPolyArea > this.MAX_POLYGON_AREA) {\r\n newValidation.failedReason = this.translationService.t('geofenceService.areaMoreThan', maxAreaLabel);\r\n return newValidation;\r\n\r\n } else if (currentPolyArea < this.MIN_POLYGON_AREA) {\r\n newValidation.failedReason = this.translationService.t('geofenceService.areaLessThan', minAreaLabel);\r\n return newValidation;\r\n }\r\n }\r\n\r\n newValidation.valid = !newValidation.failedReason;\r\n\r\n return newValidation;\r\n }\r\n\r\n getAllGeofencePoints(geofence: IGeofence): [number, number][] {\r\n if (!geofence?.Points?.length && !geofence?.Shapes?.length) {\r\n return null;\r\n }\r\n\r\n if (geofence?.Points?.length > 0) {\r\n return geofence?.Points;\r\n }\r\n\r\n let pointsArray: [number, number][] = [];\r\n\r\n geofence?.Shapes?.forEach(shape => {\r\n shape?.forEach(shapePoints => {\r\n pointsArray = [...pointsArray, shapePoints];\r\n });\r\n });\r\n\r\n return pointsArray;\r\n }\r\n\r\n createPolygonGroupForGeofence(geofence: IGeofence): google.maps.Polygon[] {\r\n let pointGroups: [number, number][][] = [geofence?.Points];\r\n\r\n if (geofence?.Shapes?.length > 0) {\r\n pointGroups = [...pointGroups, ...geofence?.Shapes]\r\n }\r\n\r\n if (pointGroups?.length === 0) { return null; }\r\n\r\n const newPolyGroups: google.maps.Polygon[] = [];\r\n\r\n pointGroups?.forEach(pointGroup => {\r\n const coords: google.maps.LatLng[] = this.getLatLngArrayFromPointsArray(pointGroup);\r\n if (coords?.length > 0) {\r\n newPolyGroups.push(new google.maps.Polygon({\r\n paths: coords\r\n }));\r\n }\r\n });\r\n\r\n return newPolyGroups;\r\n }\r\n\r\n createPolygonsFromGeofences(geofences: IGeofence[] = []): google.maps.Polygon[] {\r\n let polygonGroups: google.maps.Polygon[] = [];\r\n\r\n geofences?.forEach(zone => {\r\n const polygonGroup: google.maps.Polygon[] = this.createPolygonGroupForGeofence(zone);\r\n if (polygonGroup) {\r\n polygonGroups = [...polygonGroups, ...polygonGroup]\r\n }\r\n });\r\n\r\n return polygonGroups;\r\n }\r\n\r\n getPolygonCenterCoordinates(geoJsonObject: any): google.maps.LatLngLiteral {\r\n\r\n const points = this.getPolygonPoints(geoJsonObject);\r\n\r\n if (!points.length) {\r\n console.log(\"Unsupported geoJSON type! Import works only with polygon and multipolygon. One shape at a time.\");\r\n return;\r\n }\r\n\r\n const getMin = (coords, idx) => Math.min(...coords.map(c => c[idx]));\r\n const getMax = (coords, idx) => Math.max.apply(null, coords.map(c => c[idx]));\r\n const getCenter = (min, max) => min + (max - min) / 2;\r\n\r\n const minLat = getMin(points, 0);\r\n const maxLat = getMax(points, 0);\r\n const lat = getCenter(maxLat, minLat);\r\n\r\n const minLng = getMin(points, 1);\r\n const maxLng = getMax(points, 1);\r\n const lng = getCenter(maxLng, minLng);\r\n\r\n return { lat, lng };\r\n }\r\n\r\n getPolygonPoints(geoJsonObject: any): [number, number][] {\r\n\r\n let coords: [number, number][];\r\n\r\n switch (true) {\r\n case geoJsonObject?.features[0]?.geometry?.type == \"MultiPolygon\":\r\n coords = geoJsonObject?.features[0]?.geometry?.coordinates[0][0];\r\n break;\r\n\r\n case geoJsonObject?.features[0]?.geometry?.type == \"Polygon\":\r\n coords = geoJsonObject?.features[0]?.geometry?.coordinates[0];\r\n break;\r\n\r\n default:\r\n return [];\r\n }\r\n\r\n return coords.map(c => [c[1], c[0]]);\r\n }\r\n\r\n // ---\r\n\r\n private getGeofencesFromDatabase(): angular.IPromise {\r\n\r\n return this.$http({ url: \"/api/geofences\", method: \"GET\", })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n\r\n if (this.isDemoSite) {\r\n result.data.forEach((g, i) => {\r\n g.Description = `Geofence ${i + 1}`;\r\n g.DescriptionExt = `Geofence Description ${i + 1}`;\r\n });\r\n }\r\n\r\n const geofences = result.data;\r\n\r\n for (var i = 0; i < geofences.length; i++) {\r\n const geofence = geofences[i];\r\n\r\n if (geofence.GeofenceType == GeofenceType.Polygon) {\r\n // Some geofences are set as polygons but are in fact circles\r\n if (geofence.Points?.length) {\r\n // Set to 0.00001 to actually make this work, otherwise returns centre point\r\n const center = polylabel([geofence.Points], 0.00001/*, isDebug*/);\r\n\r\n geofence.Latitude = center[0];\r\n geofence.Longitude = center[1];\r\n }\r\n else if (geofence.Radius != 0) {\r\n geofence.GeofenceType = GeofenceType.Circle;\r\n }\r\n }\r\n\r\n geofence.Tags = [];\r\n }\r\n\r\n return geofences;\r\n });\r\n }\r\n\r\n private getAndMapVehiclesToVisits(visitsPromise: angular.IPromise): angular.IPromise {\r\n const vehiclesPromise = this.vehicleService.getVehicles({ includePeripheralMappings: true });\r\n const driversPromise = this.driverService.getDrivers();\r\n\r\n return this.$q\r\n .all([visitsPromise, vehiclesPromise, driversPromise])\r\n .then(([visits, vehicles, drivers]) => {\r\n visits.forEach(visit => {\r\n visit.vehicle = this.vehicleService.findVehicle(vehicles, visit.VehicleId);\r\n });\r\n\r\n return visits;\r\n });\r\n }\r\n\r\n private callback(path: google.maps.MVCArray, index: number, deleteVertexParams: IDeleteVertexParams) {\r\n\r\n var btnDelete = angular.element(`img[src$='${path[\"btnDeleteImageUrl\"]}']`);\r\n\r\n var polygonPoints = deleteVertexParams.polygon.getPath().getLength();\r\n var allowDelete = polygonPoints > 3;\r\n\r\n if (btnDelete.length === 0) {\r\n var undoimg = angular.element(\"img[src$='//maps.gstatic.com/mapfiles/undo_poly.png']\");\r\n\r\n //undoimg.parent().css(\"height\", \"21px !important\");\r\n undoimg\r\n .parent()\r\n .parent()\r\n .append(\r\n `
`);\r\n\r\n // now get that button back again!\r\n btnDelete = angular.element(`img[src$='${path[\"btnDeleteImageUrl\"]}']`);\r\n btnDelete.hover(\r\n function () {\r\n $(this).css(\"left\", \"-30px\");\r\n return false;\r\n },\r\n function () {\r\n $(this).css(\"left\", \"0px\");\r\n return false;\r\n });\r\n\r\n btnDelete.mousedown(function () {\r\n $(this).css(\"left\", \"-60px\");\r\n return false;\r\n });\r\n }\r\n\r\n if (allowDelete)\r\n btnDelete.show();\r\n else\r\n btnDelete.hide();\r\n\r\n // if we've already attached a handler, remove it\r\n if (path[\"btnDeleteClickHandler\"]) {\r\n btnDelete.unbind(\"click\", path[\"btnDeleteClickHandler\"]);\r\n }\r\n\r\n // now add a handler for removing the passed in index\r\n path[\"btnDeleteClickHandler\"] = (params: any) => {\r\n\r\n path.removeAt(index);\r\n\r\n if (!params || !params.data || !params.data.geofence || !params.data.geofence.Points)\r\n return false;\r\n\r\n // update points collection on supplied geofence\r\n params.data.geofence.Points = [];\r\n const points = params.data.geofence.Points;\r\n\r\n path.forEach(p => {\r\n points.push([p.lat(), p.lng()]);\r\n });\r\n\r\n return false;\r\n };\r\n\r\n if (allowDelete) {\r\n btnDelete.one(\"click\", { geofence: deleteVertexParams.geofence }, path[\"btnDeleteClickHandler\"]);\r\n }\r\n }\r\n\r\n private getLatLngArrayFromPointsArray(points: [number, number][]): google.maps.LatLng[] {\r\n const latLngs: google.maps.LatLng[] = [];\r\n\r\n points?.forEach(point => {\r\n latLngs.push(new google.maps.LatLng(point[0], point[1]));\r\n });\r\n\r\n return latLngs;\r\n }\r\n\r\n private removeAndResetGeofenceTags(geofence: IGeofence): IGeofence {\r\n const amendedGeofence = copy(geofence);\r\n amendedGeofence.Tags = amendedGeofence.Tags?.filter(tag => geofence.TagIds.includes(tag.Id));\r\n amendedGeofence.PriorityTag = geofence.Tags[0] || null;\r\n return amendedGeofence;\r\n }\r\n}\r\n","export enum VideoReviewStatus {\r\n NeedsReview,\r\n Reviewed,\r\n Coached\r\n}\r\n","import { ChangeDetectorRef, Component, ElementRef, EventEmitter, Injector, Input, OnChanges, Output, SimpleChanges, TemplateRef, ViewChild } from \"@angular/core\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { Observable } from \"rxjs\";\r\nimport { FormValidationService } from \"../form-validation.service\";\r\nimport { VButtonStatus, VInputComponent } from \"../v-input/v-input.component\";\r\nimport \"./v-autocomplete.component.scss\";\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: \"v-autocomplete\",\r\n template: require('./v-autocomplete.component.html')\r\n})\r\nexport class VAutocompleteComponent extends VInputComponent implements OnChanges {\r\n @Input() selectedItem: T;\r\n @Input() selectedItemId: string;\r\n @Input() selectedItemProp: string = \"Id\"; // The property on the item used to identify selected items\r\n\r\n @Input() items: T[];\r\n @Input() itemDisplayProp: string; // The property on the item to display e.g. if it is a Vehicle you would pass ShortReg\r\n\r\n @Input() itemPromise: Promise;\r\n @Input() itemTemplate: TemplateRef;\r\n @Input() loading = false;\r\n @Input() itemFilter: (item: T, text: string) => boolean;\r\n\r\n @Input() itemObservable$: Observable;\r\n\r\n @Input() label: string;\r\n @Input() minLength = 0;\r\n\r\n @Input() disabled: boolean;\r\n\r\n @Input() useStatus: boolean = true;\r\n\r\n @Output() itemClicked = new EventEmitter();\r\n\r\n @Output() noMatches = new EventEmitter();\r\n\r\n @Output() clear = new EventEmitter();\r\n\r\n @Output() textChanged = new EventEmitter();\r\n\r\n @ViewChild(\"autoCompleteInput\", { read: ElementRef }) autoCompleteInputRef: ElementRef;\r\n ignoreClicksFrom: ElementRef;\r\n\r\n // ---\r\n\r\n matches: T[] = [];\r\n\r\n inputStatus: VButtonStatus = VButtonStatus.Default;\r\n showDropdown = false;\r\n\r\n constructor(\r\n protected readonly injector: Injector,\r\n protected readonly formValidationService: FormValidationService,\r\n private readonly cd: ChangeDetectorRef\r\n ) {\r\n super(injector, formValidationService);\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n\r\n if (changes[\"itemPromise\"]) {\r\n this.onLoadingItems();\r\n }\r\n\r\n if (changes[\"itemObservable$\"]) {\r\n this.onLoadingItemsFromObservable();\r\n }\r\n\r\n if (changes[\"selectedItemId\"] || changes[\"items\"]) {\r\n this.setSelectedItemFromProps();\r\n }\r\n\r\n if (changes[\"items\"]) {\r\n this.validateItemProps();\r\n }\r\n\r\n if (changes[\"disabled\"]\r\n && changes[\"disabled\"].previousValue === false\r\n && changes[\"disabled\"].currentValue === true) {\r\n // Don't clear if initialised as disabled\r\n this.clearInput();\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n //Avoids ExpressionChangedAfterItHasBeenCheckedError\r\n this.ignoreClicksFrom = this.autoCompleteInputRef; \r\n this.cd.detectChanges();\r\n }\r\n\r\n clearInput(): void {\r\n this.value = null;\r\n this.reset();\r\n }\r\n\r\n onTextChanged(text: string, filterResult = true, triggeredByInput: boolean = true) {\r\n // If no changes, then ignore this\r\n if (text == this.value) {\r\n return;\r\n }\r\n\r\n if (triggeredByInput) {\r\n this.textChanged.next(text);\r\n }\r\n\r\n this.value = text;\r\n\r\n this.inputStatus = VButtonStatus.Default;\r\n\r\n if (!this.itemPromise && !this.items && !this.itemObservable$) {\r\n console.warn(\"No Autocomplete itemPromise or itemObservable set\");\r\n return;\r\n }\r\n\r\n // Reset selected item on typing\r\n if (triggeredByInput) {\r\n this.reset();\r\n }\r\n\r\n if (filterResult) {\r\n this.filterResults();\r\n }\r\n }\r\n\r\n onFocus() {\r\n this.focus.emit();\r\n this.filterResults();\r\n this.toggleDropdownVisibility(this.matches.length != 0);\r\n }\r\n\r\n onBlur() {\r\n this.blur.emit();\r\n this.updateStatus(true);\r\n\r\n // allow time for mouse click on item before v-input blur removes item DOM elements\r\n setTimeout(() => {\r\n this.toggleDropdownVisibility(false);\r\n }, 100);\r\n }\r\n\r\n onItemClicked(item: T) {\r\n if (!item) {\r\n console.warn(\"Null item selected\");\r\n return;\r\n }\r\n\r\n this.onTextChanged(this.itemDisplayProp ? item[this.itemDisplayProp] : item, false, false);\r\n\r\n this.showDropdown = false;\r\n this.selectedItem = item;\r\n\r\n this.updateStatus();\r\n this.itemClicked.emit(item);\r\n }\r\n\r\n onEnterPressed() {\r\n if (this.matches.length) {\r\n this.onItemClicked(this.matches[0]);\r\n }\r\n }\r\n\r\n onClosed() {\r\n this.toggleDropdownVisibility();\r\n }\r\n\r\n // ---\r\n\r\n private reset(): void {\r\n this.selectedItem = null;\r\n this.selectedItemId = null;\r\n this.inputStatus = VButtonStatus.Default;\r\n this.clear.emit();\r\n }\r\n\r\n private filterResults() {\r\n\r\n this.matches = [];\r\n\r\n if (!this.items) {\r\n return;\r\n }\r\n\r\n if (!this.value) {\r\n this.matches = this.items;\r\n return;\r\n }\r\n\r\n if (!this.itemFilter) {\r\n console.error(\"No itemFilter specified\");\r\n return;\r\n }\r\n\r\n const valueString = `${this.value}`;\r\n\r\n if (valueString.length < this.minLength) {\r\n return;\r\n }\r\n\r\n var lowerCaseText = valueString.toLowerCase();\r\n\r\n this.items.forEach(item => {\r\n if (this.itemFilter(item, lowerCaseText)) {\r\n this.matches.push(item);\r\n }\r\n });\r\n\r\n if (!this.matches.length) {\r\n this.noMatches.emit(this.value);\r\n }\r\n\r\n this.toggleDropdownVisibility();\r\n }\r\n\r\n private toggleDropdownVisibility(force?: boolean) {\r\n if (force != null) {\r\n this.showDropdown = force;\r\n return;\r\n }\r\n\r\n if (this.selectedItem) {\r\n this.showDropdown = false;\r\n }\r\n else {\r\n this.showDropdown = this.matches.length > 0;\r\n }\r\n }\r\n\r\n private onLoadingItems() {\r\n\r\n if (!this.itemPromise) {\r\n return;\r\n }\r\n\r\n this.loading = true;\r\n\r\n this.itemPromise\r\n .then(results => {\r\n this.items = results;\r\n })\r\n .finally(() => {\r\n this.loading = false;\r\n this.onDataLoaded();\r\n });\r\n }\r\n\r\n private onLoadingItemsFromObservable(): void {\r\n if (!this.itemObservable$) {\r\n return;\r\n }\r\n\r\n this.loading = true;\r\n\r\n this.itemObservable$.pipe(untilDestroyed(this)).subscribe(data => {\r\n this.items = data;\r\n this.onDataLoaded(false);\r\n this.loading = false;\r\n })\r\n }\r\n\r\n private onDataLoaded(openDropdown = true): void {\r\n this.filterResults();\r\n this.toggleDropdownVisibility(openDropdown);\r\n this.setSelectedItemFromProps();\r\n }\r\n\r\n private updateStatus(allowError = false) {\r\n\r\n if (!this.useStatus) {\r\n return;\r\n }\r\n\r\n this.status = VButtonStatus.Default;\r\n\r\n if (this.selectedItem) {\r\n this.inputStatus = VButtonStatus.Success;\r\n }\r\n else if (allowError && this.value && `${this.value}`.length > this.minLength) {\r\n this.inputStatus = VButtonStatus.Error;\r\n }\r\n }\r\n\r\n private setSelectedItemFromProps() {\r\n if (this.selectedItem || !this.selectedItemId || !this.items) {\r\n return;\r\n }\r\n\r\n if (this.itemPromise && this.loading) {\r\n this.itemPromise.then(() => {\r\n this.setSelectedItemFromProps();\r\n });\r\n\r\n return;\r\n }\r\n\r\n var selectedItem = this.items.find(i => i[this.selectedItemProp] == this.selectedItemId);\r\n this.onItemClicked(selectedItem);\r\n }\r\n\r\n private validateItemProps(): void {\r\n if (!this.selectedItemProp || !this.items) {\r\n return;\r\n }\r\n\r\n const anyItemWithoutProp = this.items.find(item => !item[this.selectedItemProp] && item[this.selectedItemProp] !== 0);\r\n\r\n if (anyItemWithoutProp) {\r\n console.warn(\"AutoComplete.Items issue: selectedItemProp set to\", this.selectedItemProp, \"but item data has no matching property\");\r\n }\r\n }\r\n}\r\n","import { IComboBox } from \"@interfaces/IComboBox\";\r\nimport { IDriver } from \"@interfaces/IDriver\";\r\nimport { IGeofence } from \"@interfaces/IGeofences\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { IGroup } from \"@interfaces/IVehicleGroup\";\r\nimport { TimeFilterType } from \"@reports/enums/TimeFilterType\";\r\nimport { UnitConversionType } from \"@services/unitConversion.service\";\r\n\r\nexport enum ReportParameterType {\r\n MinimumDistance = 0,\r\n RouteId = 1,\r\n JourneyId = 2,\r\n GeofenceVisitId = 3,\r\n TrailerAssociationId = 4,\r\n CommonEventId = 5,\r\n ExcludeTrailers = 6,\r\n ShowNoDriver = 7,\r\n IncludeNoDriver = 8,\r\n MinimumSpeed = 9,\r\n MinimumIdleTime = 10,\r\n AlcolockRecordPlotId = 11,\r\n ExcludeGpsJourneys = 12,\r\n ExcludeCanJourneys = 13,\r\n ShowOnlyAlcolockEventGroup = 14,\r\n ReasonCode = 15,\r\n RoadType = 16,\r\n InputRecordHistoryId = 17,\r\n TemperatureOutOfBoundId = 18,\r\n IntersectingGeofenceVisitTimes = 19,\r\n MinimumFuelLevelChange = 20,\r\n ExcludeInconsequentialJourneys = 21,\r\n ShowRowsWithNoData = 22,\r\n MinimumFuelUsed = 23,\r\n IncludeOnlyInstalledCameras = 24,\r\n CameraEventId = 25,\r\n InclusiveGroupFiltering = 26,\r\n HideParameterList = 27,\r\n VehicleType = 28,\r\n PercentageOverSpeedLimit = 29,\r\n ShowVehiclesWithNoUnit = 30,\r\n ShowVehiclesNotTracking = 31,\r\n ShowInactiveDrivers = 32,\r\n HideMinorCameraEvents = 33,\r\n ShowOnlyDownloadedVideos = 34,\r\n GeofenceCategory = 35,\r\n ShowOnlyBusinessJourneys = 36,\r\n FormId = 37,\r\n FormFieldId = 38,\r\n FormFieldValueId = 39,\r\n MinimumEventTime = 40,\r\n ShowDurationPastEndTime = 41,\r\n ShowArchivedEvents = 42,\r\n FilterVehicleRowsByVehicleType = 43,\r\n TrailerId = 44,\r\n HiddenProbes = 45,\r\n WithoutComparisonOperator = 46,\r\n LatLongOnly = 47,\r\n ReportTimeFilter = 48,\r\n EmptyRunningJourneysOnly = 49,\r\n MinimumDurationOverWeight = 50,\r\n ReportOnSingleBound = 51,\r\n OmitTotalsRows = 52,\r\n OutOfBoundsAxleRecordId = 53,\r\n ShowOnlyRowsWithVor = 54,\r\n AlertRecordId = 55,\r\n AlertReviewId = 56,\r\n OnlyAcknowledgedAlerts = 57,\r\n OnlyUnacknowledgedAlerts = 58,\r\n TemperatureRecordId = 59,\r\n CompositeLocationId = 60,\r\n IncludeOpenAlertsInCalculations = 61,\r\n AlertResolutionCodeId = 62,\r\n InProgressGeofenceVisits = 63,\r\n ExcludeVehiclesWithoutActivity = 64,\r\n ForceDisplayAllDrivingMetricValues = 65,\r\n LatestCameraOnlineHistory = 66,\r\n CreateUnassignedGroupRow = 67,\r\n IncludeUnassigned = 68,\r\n LatestBrakePerformanceHistory = 69,\r\n LatestBrakePerformanceValue = 70,\r\n BrakePerformanceValueId = 71,\r\n}\r\n\r\nexport enum ReportParameterValueType {\r\n Text,\r\n Number,\r\n Date,\r\n Select,\r\n Boolean,\r\n TemperatureProbes\r\n}\r\n\r\nexport interface IReportParameter {\r\n ParameterType: ReportParameterType;\r\n Value: any;\r\n Active: boolean;\r\n}\r\n\r\nexport interface IReportParameterDefinitions {\r\n reportType: string;\r\n reportParameterDefinition: IReportParameterDefinition[];\r\n}\r\n\r\nexport interface IReportParameterDefinition extends IReportParameter {\r\n parameterName: string;\r\n valueType: ReportParameterValueType;\r\n maxValue?: any;\r\n minValue?: any;\r\n defaultValue?: any;\r\n stepSize?: number;\r\n options?: IComboBox[];\r\n conversionType?: UnitConversionType;\r\n conversionLabel?: string;\r\n\r\n // ---\r\n\r\n displayValue?: any;\r\n formControlName?: string;\r\n}\r\n\r\nexport interface IReportParameters {\r\n Start?: Date;\r\n\r\n End?: Date;\r\n\r\n DriverId?: number;\r\n DriverGroupId?: number;\r\n\r\n VehicleId?: number;\r\n VehicleGroupId?: number;\r\n\r\n GeofenceId?: number;\r\n GeofenceGroupId?: number;\r\n\r\n PrimaryReportParameter?: IReportParameter;\r\n CustomParameters?: IReportParameter[];\r\n\r\n IncludeRecordsWithNoData?: boolean;\r\n\r\n TimeFilterStart?: string;\r\n TimeFilterEnd?: string;\r\n TimeFilterType?: TimeFilterType;\r\n\r\n TagIds?: number[];\r\n\r\n Driver?: IDriver;\r\n Vehicle?: IVehicle;\r\n Geofence?: IGeofence;\r\n\r\n VehicleGroup?: IGroup;\r\n DriverGroup?: IGroup;\r\n GeofenceGroup?: IGroup;\r\n\r\n TranslatedTitle?: string;\r\n //groupBy?: GroupBy;\r\n}\r\n","import { Colour } from \"@interfaces/IGeofences\";\r\nimport { IRunBlockRootScope } from \"@interfaces/IRunBlockRootScope\";\r\n\r\nexport interface IColour {\r\n solidColour: string;\r\n transparentColour?: string;\r\n\r\n isJourneyColour?: boolean;\r\n isTagColour?: boolean;\r\n colourEnum?: Colour;\r\n description: string;\r\n}\r\n// Nice autumnal chart colours\r\n//[\"#ECD078\",\"#D95B43\",\"#C02942\",\"#542437\",\"#53777A\"];\r\n\r\nexport class ColourService {\r\n\r\n // Based on Flat UI Colours\r\n colours: IColour[] = [];\r\n journeyColours: IColour[] = [];\r\n tagColours: IColour[] = [];\r\n\r\n // From scss\r\n greenColor = \"#209058\";\r\n orangeColor = \"orange\";\r\n redColor = \"#cf4946\";\r\n greyColor = \"rgba(0,0,0,0.1)\";\r\n\r\n static $inject = [\"$rootScope\"];\r\n\r\n constructor(private readonly $rootScope: IRunBlockRootScope) {\r\n this.createColours();\r\n }\r\n\r\n // viget colours\r\n // https://www.viget.com/articles/add-colors-to-your-palette-with-color-mixing/\r\n vigetColours = [\"#0d3c55\", \"#0f5b78\", \"#117899\", \"#1395ba\", \"#5ca793\", \"#a2b86c\", \"#ebc844\", \"#ecaa38\", \"#ef8b2c\", \"#f16c20\", \"#d94e1f\", \"#c02e1d\"];\r\n\r\n getVigetColor(index: number, maxDimensions: number = this.vigetColours.length, offset = 0, vigetColours = this.vigetColours): string {\r\n\r\n let multiplier = Math.floor(vigetColours.length / maxDimensions);\r\n multiplier = Math.max(multiplier, 1);\r\n\r\n index = index * multiplier;\r\n index += offset;\r\n index = index % vigetColours.length;\r\n\r\n return vigetColours[index];\r\n }\r\n\r\n getColour(index: number, journeyColoursOnly: boolean): IColour {\r\n const idx = this.getColourIndex(index, journeyColoursOnly);\r\n\r\n if (journeyColoursOnly) {\r\n return this.journeyColours[idx];\r\n }\r\n\r\n return this.colours[idx];\r\n }\r\n\r\n getColourIndex(index: number, journeyColoursOnly: boolean): number {\r\n if (journeyColoursOnly) {\r\n return index % this.journeyColours.length;\r\n }\r\n\r\n return index = index % this.colours.length;\r\n }\r\n\r\n createTransparentColor(color: string, opacity: number): string {\r\n if (color.indexOf(\"rgba\") >= 0) {\r\n return color;\r\n }\r\n else if (color.indexOf(\"rgb\") >= 0) {\r\n color = color.replace(\")\", \"\");\r\n color += `,${opacity})`;\r\n return color;\r\n }\r\n else {\r\n color = color.replace('#', '');\r\n const rgb = this.hexToRgb(color);\r\n return `rgba(${rgb},${opacity})`;\r\n }\r\n }\r\n\r\n getJourneyBorderClassName(i: number) {\r\n return `jc-${i}-border-color`;\r\n }\r\n\r\n getJourneyBackgroundClassName(i: number) {\r\n return `jc-${i}-bg-color`;\r\n }\r\n \r\n // ------------------------------------------\r\n\r\n private createColours() {\r\n\r\n this.colours.push({ solidColour: \"#3498db\", description: \"Peter River\", isJourneyColour: true });\r\n this.colours.push({ solidColour: \"#2980b9\", description: \"Belize Hole\", isTagColour: true, colourEnum: Colour.Blue });\r\n\r\n this.colours.push({ solidColour: \"#9b59b6\", description: \"Amethyst\" });\r\n this.colours.push({ solidColour: \"#8e44ad\", description: \"Wisteria\", isJourneyColour: true, isTagColour: true, colourEnum: Colour.Purple });\r\n\r\n this.colours.push({ solidColour: \"#f1c40f\", description: \"Sun Flower\", isTagColour: true, colourEnum: Colour.Yellow });\r\n this.colours.push({ solidColour: \"#f39c12\", description: \"Orange\", isTagColour: true, colourEnum: Colour.Orange });\r\n\r\n this.colours.push({ solidColour: \"#e67e22\", description: \"Carrot\", isJourneyColour: true });\r\n this.colours.push({ solidColour: \"#d35400\", description: \"Pumpkin\" });\r\n\r\n this.colours.push({ solidColour: \"#1abc9c\", description: \"Turquoise\" });\r\n this.colours.push({ solidColour: \"#16a085\", description: \"Grean Sea\", isJourneyColour: false, isTagColour: true, colourEnum: Colour.Green });\r\n\r\n this.colours.push({ solidColour: \"#2ecc71\", description: \"Emerald\" });\r\n this.colours.push({ solidColour: \"#27ae60\", description: \"Nephritis\", isJourneyColour: true });\r\n\r\n this.colours.push({ solidColour: \"#e74c3c\", description: \"Alizarin\", isJourneyColour: true });\r\n this.colours.push({ solidColour: \"#c0392b\", description: \"Pomegranate\", isTagColour: true, colourEnum: Colour.Red });\r\n\r\n this.colours.push({ solidColour: \"#34495e\", description: \"Wet Asphalt\", isTagColour: true, colourEnum: Colour.Black });\r\n this.colours.push({ solidColour: \"#2c3e50\", description: \"Midnight Blue\", isJourneyColour: true });\r\n\r\n //this.colours.push({ solidColour: \"#ecf0f1\", description: \"Clouds\" });\r\n this.colours.push({ solidColour: \"#bdc3c7\", description: \"Silver\" });\r\n\r\n this.colours.push({ solidColour: \"#95a5a6\", description: \"Concrete\", isTagColour: true, colourEnum: Colour.Grey });\r\n this.colours.push({ solidColour: \"#7f8c8d\", description: \"Asbestos\" });\r\n\r\n // Create transparent versions and add to journey colours if required\r\n this.colours.forEach(colour => {\r\n colour.transparentColour = this.createTransparentColor(colour.solidColour, 0.4);\r\n\r\n if (colour.isJourneyColour) {\r\n this.journeyColours.push(colour);\r\n }\r\n if (colour.isTagColour) {\r\n this.tagColours.push(colour);\r\n }\r\n });\r\n\r\n this.createStylesForJourneyColors();\r\n }\r\n\r\n private hexToRgb(hex) {\r\n const bigint = parseInt(hex, 16);\r\n const r = (bigint >> 16) & 255;\r\n const g = (bigint >> 8) & 255;\r\n const b = bigint & 255;\r\n\r\n return r + \",\" + g + \",\" + b;\r\n }\r\n\r\n private getRandomColor() {\r\n const letters = '0123456789ABCDEF';\r\n let color = '#';\r\n for (let i = 0; i < 6; i++) {\r\n color += letters[Math.floor(Math.random() * 16)];\r\n }\r\n\r\n return color;\r\n }\r\n\r\n private createStylesForJourneyColors() {\r\n // Create styles\r\n this.$rootScope.runtimeStyles = this.$rootScope.runtimeStyles || \"\";\r\n\r\n for (let i = 0; i < this.journeyColours.length; i++) {\r\n const color = this.journeyColours[i].solidColour;\r\n\r\n this.$rootScope.runtimeStyles += `.${this.getJourneyBorderClassName(i)}{border-color:${color}!important;}`;\r\n this.$rootScope.runtimeStyles += `.${this.getJourneyBackgroundClassName(i)}{background-color:${color}!important;}`;\r\n }\r\n }\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { getOptionsQueryParams } from \"@app/class/Utilities\";\r\nimport { IPeripheral } from \"@app/interfaces/IPeripheral\";\r\nimport { IPlotEvent } from \"@app/interfaces/IPlot\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { IVehiclePeripheralMapping } from \"@app/interfaces/IVehiclePeripheralMapping\";\r\nimport { IVideoChannelQueryOptions } from \"@app/main/modules/cameras/_services/camera-channels.service\";\r\nimport { DateService, DateUnit } from \"@app/services/date.service\";\r\nimport { ProductService } from \"@app/services/product.service\";\r\nimport { CameraLocation } from \"../enums/CameraLocation\";\r\nimport { VideoStatus } from \"../enums/VideoStatus\";\r\nimport { VideoLabelIcon } from \"../enums/video-label-icon\";\r\nimport { FtCloudStreamType, ICameraChannel, IVideoStream, UrlRequired } from \"../models/ICameraChannel\";\r\nimport { ICameraEventPeriod } from \"../models/ICameraEventPeriod\";\r\nimport { IVideoEntry } from \"../models/IVideoEntry\";\r\nimport { IVideoExtensionData } from \"../models/IVideoExtensionData\";\r\nimport { IVideoRequest } from \"../models/IVideoRequest\";\r\nimport { IVideoRequestRestrictionResponse } from \"../models/IVideoRequestRestrictionResponse\";\r\nimport { CameraEventThreshold, CameraEventThresholds } from \"../models/camera-event-thresholds\";\r\nimport { CameraHistoricalStreamOptions } from \"../models/CameraHistoricalStreamOptions\";\r\nimport { lastValueFrom } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CameraService {\r\n constructor(\r\n private readonly httpClient: HttpClient,\r\n private readonly dateService: DateService,\r\n private readonly productService: ProductService\r\n ) {\r\n }\r\n\r\n getIconForEvent(eventLabel: string): string {\r\n if (!eventLabel) {\r\n return VideoLabelIcon.Videocam;\r\n }\r\n\r\n eventLabel = eventLabel.toLocaleLowerCase();\r\n\r\n if (eventLabel.includes(\"panic\") || eventLabel.includes(\"button\")) {\r\n return VideoLabelIcon.NotificationsActive;\r\n }\r\n\r\n if (eventLabel.includes(\"user\")) {\r\n return VideoLabelIcon.Person;\r\n }\r\n\r\n if (eventLabel.includes(\"speed\")) {\r\n return VideoLabelIcon.DirectionsCar;\r\n }\r\n\r\n if (eventLabel.includes(\"shock\")) {\r\n return VideoLabelIcon.LocalCarWash;\r\n }\r\n\r\n return VideoLabelIcon.Videocam;\r\n }\r\n\r\n downloadVideo(video: IVideoEntry): void {\r\n const fileUrls = video.channelMedia.map(media => media.mp4VideoUrl);\r\n\r\n fileUrls.forEach((url: string) => {\r\n const iframe: HTMLIFrameElement = document.createElement(\"iframe\");\r\n iframe.setAttribute('src', url);\r\n document.body.appendChild(iframe);\r\n\r\n setTimeout(() => {\r\n iframe.remove();\r\n }, 10000);\r\n });\r\n }\r\n\r\n async getPeripherals(vehicleId: number, invalidateCache = false): Promise {\r\n const options = getOptionsQueryParams({ minsToLive: 60, invalidateCache });\r\n\r\n const result = await lastValueFrom(this.httpClient\r\n .get(`/api/cameras/peripherals/${vehicleId}`, options));\r\n\r\n const products = await this.productService.getProductUiViewModels();\r\n\r\n return result.map(peripheral => {\r\n const product = products.find(p => p.ProductId == peripheral.ProductId);\r\n const isLiveStreamCam = peripheral.Product?.ProductMetadata?.CameraFeatures?.LiveStream;\r\n\r\n return { ...peripheral, Product: product, isLiveStreamCam };\r\n });\r\n }\r\n\r\n async getLiveStreamUrls(vehicleId: number, options?: CameraHistoricalStreamOptions): Promise {\r\n return await lastValueFrom(this.httpClient\r\n .get(`/api/cameras/streams/${vehicleId}/live`, getOptionsQueryParams(options)));\r\n }\r\n\r\n filterDuplicateVideoStreams(videoStreams: IVideoStream[] = []): IVideoStream[] {\r\n const uniqueStreams: IVideoStream[] = [];\r\n\r\n videoStreams?.forEach(videoStream => {\r\n if (uniqueStreams.find(uniqueStream => uniqueStream.ChannelId === videoStream.ChannelId && uniqueStream.StreamUrl === videoStream.StreamUrl)) {\r\n return;\r\n }\r\n\r\n uniqueStreams.push(videoStream);\r\n });\r\n\r\n return uniqueStreams;\r\n }\r\n\r\n async getPeripheralMappings(peripheralSerial: string, invalidateCache = false): Promise {\r\n const options = getOptionsQueryParams({ minsToLive: 60, invalidateCache });\r\n\r\n return await lastValueFrom(this.httpClient\r\n .get(`/api/cameras/peripheral/mapping/current/${peripheralSerial}`, options));\r\n }\r\n\r\n async getCameraChannels(queryOptions: IVideoChannelQueryOptions = {}): Promise {\r\n const options = getOptionsQueryParams(queryOptions);\r\n\r\n return await lastValueFrom(this.httpClient\r\n .get(\"/api/cameras/channels\", options))\r\n }\r\n\r\n async videoRestrictionCheck(videoRequest: IVideoRequest): Promise {\r\n return await lastValueFrom(this.httpClient\r\n .post(\"/api/cameras/videoRestrictionCheck\", videoRequest));\r\n }\r\n\r\n async closeChannelStreams(serial: string): Promise {\r\n return await lastValueFrom(this.httpClient\r\n .post(\"/api/cameras/streams/close\", { serial: serial }));\r\n }\r\n\r\n async peripheralHasActiveSessions(serial: string): Promise {\r\n const options = getOptionsQueryParams({ serial: serial, IsActive: true });\r\n\r\n return await lastValueFrom(this.httpClient\r\n .get(\"/api/cameras/streams/currentlyopen\", options));\r\n }\r\n\r\n async switchStreamType(serial: string, streamType: FtCloudStreamType): Promise {\r\n return await lastValueFrom(this.httpClient\r\n .put(\"/api/cameras/streams/switchtype\", { serial, streamType }))\r\n }\r\n\r\n getPrimaryChannel(streams: IVideoStream[], totalStreams: number = streams.length): IVideoStream {\r\n const forwardStream = streams.find(stream => stream.CameraLocation === CameraLocation.Forward);\r\n\r\n if (forwardStream) {\r\n return forwardStream;\r\n }\r\n\r\n if (totalStreams >= 5) {\r\n const channel5Stream = streams.find(s => s.ChannelId === 5);\r\n\r\n if (channel5Stream) {\r\n return channel5Stream;\r\n }\r\n }\r\n\r\n const channel1Stream = streams.find(s => s.ChannelId === 1);\r\n if (channel1Stream) {\r\n return channel1Stream;\r\n }\r\n\r\n return streams.firstOrDefault();\r\n }\r\n\r\n getFilteredEventsForVideo(events: IPlotEvent[]): IPlotEvent[] {\r\n return events\r\n .filter(event => event.video || event.label == \"Start\" || event.label == \"Stop\" || event.label == \"Current Position\")\r\n .map(event => {\r\n if (event.video && !event.video.icon) {\r\n event.video.icon = this.getIconForEvent(event.video.displayEventCode);\r\n }\r\n\r\n return event;\r\n });\r\n }\r\n\r\n getVehiclesWithMetadataUpdated(vehicles: IVehicle[], videoEntries: IVideoEntry[]): IVehicle[] {\r\n return vehicles.map(vehicle => {\r\n const videoEvents = videoEntries\r\n .filter(videoEntry => videoEntry.VehicleId === vehicle.Id)\r\n .sort((a, b) => this.dateService.sort(a.VideoStartTime, b.VideoStartTime));\r\n\r\n const needsReviewCount = vehicle\r\n .videoEvents\r\n ?.filter(videoEvent => videoEvent.MetaData.Authorised.length === 0)\r\n .length;\r\n\r\n const unwatchedCount = vehicle\r\n .videoEvents\r\n ?.filter(videoEvent => videoEvent.MetaData.Watched.length === 0 && videoEvent.Status === VideoStatus.Downloaded)\r\n .length;\r\n\r\n return { ...vehicle, videoEvents, needsReviewCount, unwatchedCount };\r\n });\r\n }\r\n\r\n getVehiclesWithStreamingChannelsMapped(channels: ICameraChannel[], vehicles: IVehicle[]): IVehicle[] {\r\n if (!channels?.length || !vehicles?.length) {\r\n return vehicles || [];\r\n }\r\n\r\n return vehicles.map(vehicle => {\r\n const videoChannels = channels.filter(channel => channel.VehicleId === vehicle.Id);\r\n return { ...vehicle, videoChannels };\r\n });\r\n }\r\n\r\n async getPlaybackUrls(vehicleId: number, options: CameraHistoricalStreamOptions): Promise {\r\n const result = await lastValueFrom(this.httpClient\r\n .get(`/api/cameras/streams/${vehicleId}/historical`, getOptionsQueryParams(options)));\r\n\r\n result.forEach(channel => {\r\n if (channel.StreamUrl) {\r\n channel.StreamUrl = channel.StreamUrl.replace(\"substream\", \"sub\").replace(\":9100\", \":28090\");\r\n }\r\n })\r\n\r\n return result;\r\n }\r\n\r\n async playbackSeek(playSession: string, startTime: Date): Promise {\r\n const result = await lastValueFrom(this.httpClient\r\n .put(`/api/ftcloudapi/playback/seek`, { playSession: playSession, seekTime: startTime.toISOString() }));\r\n\r\n return result;\r\n }\r\n\r\n async playbackPause(playSession: string): Promise {\r\n const result = await lastValueFrom(this.httpClient\r\n .put(`/api/ftcloudapi/playback/pause`, { playSession: playSession }));\r\n\r\n return result;\r\n }\r\n\r\n async playbackResume(playSession: string): Promise {\r\n const result = await lastValueFrom(this.httpClient\r\n .put(`/api/ftcloudapi/playback/resume`, { playSession: playSession }));\r\n\r\n return result;\r\n }\r\n\r\n getCameraThresholds(): CameraEventThresholds {\r\n const acceleration = new CameraEventThreshold(0.3, 0.4, 0.6);\r\n const braking = new CameraEventThreshold(0.4, 0.5, 0.7);\r\n const cornering = new CameraEventThreshold(0.4, 0.5, 0.6);\r\n\r\n return new CameraEventThresholds(acceleration, braking, cornering);\r\n }\r\n\r\n getRegionsOfAccelerometerActivity(data: IVideoExtensionData): ICameraEventPeriod[] {\r\n if (!data || data.VideoAccelerometerData?.length == 0) {\r\n return null;\r\n }\r\n\r\n const thresholds = this.getCameraThresholds();\r\n const eventPeriods: ICameraEventPeriod[] = [];\r\n const startDate = data.VideoAccelerometerData[0].Timestamp;\r\n\r\n let currentPeriod: ICameraEventPeriod;\r\n\r\n data.VideoAccelerometerData.forEach(data => {\r\n const hasBreached =\r\n Math.abs(data.Y) >= thresholds.cornering.medium ||\r\n Math.abs(data.X) >= thresholds.acceleration.medium ||\r\n Math.abs(data.X) >= thresholds.braking.medium;\r\n\r\n if (hasBreached) {\r\n if (!currentPeriod) {\r\n currentPeriod = {\r\n start: data.Timestamp,\r\n startSecond: this.dateService.getDiff(data.Timestamp, startDate, DateUnit.Sec),\r\n description: \"Accel. Activity\"\r\n };\r\n\r\n eventPeriods.push(currentPeriod);\r\n }\r\n\r\n currentPeriod.end = data.Timestamp;\r\n currentPeriod.endSecond = this.dateService.getDiff(currentPeriod.end, startDate, DateUnit.Sec);\r\n }\r\n else if (currentPeriod) {\r\n currentPeriod = null;\r\n }\r\n });\r\n\r\n return eventPeriods;\r\n }\r\n}\r\n","import { AfterViewInit, ChangeDetectorRef, Component, ElementRef, EventEmitter, HostBinding, Input, Output, QueryList, SimpleChanges, ViewChildren } from \"@angular/core\";\r\nimport { IVeriTab } from \"@directives/_veri/veriTab/veriTab.component\";\r\nimport { NavigationService } from \"@services/navigation.service\";\r\nimport { VTabComponent } from \"./v-tab.component\";\r\nimport \"./v-tabs.component.scss\";\r\n\r\nexport enum VTabStepperState {\r\n Todo,\r\n InProgress,\r\n Complete\r\n}\r\n\r\nexport interface IDynamicTabDefinition {\r\n title: string;\r\n count?: number;\r\n icon?: string;\r\n data?: T; // do we need?\r\n}\r\n\r\n@Component({\r\n selector: \"v-tabs\",\r\n template: require(\"./v-tabs.component.html\")\r\n})\r\nexport class VTabsComponent implements AfterViewInit {\r\n\r\n @Input() @HostBinding(\"class.stepper\") stepper: boolean;\r\n @Input() @HostBinding(\"class.scroll\") scroll: boolean;\r\n @Input() tabLayout: string = \"column\";\r\n @Input() @HostBinding(\"class.hide-tab-content\") hideTabContent: boolean;\r\n @Input() hideFinalButton: boolean = false;\r\n\r\n @Input() onFinish: string;\r\n\r\n @Input() startTab: string;\r\n\r\n @Output() onFinishCallback = new EventEmitter();\r\n @Output() tabSelect = new EventEmitter();\r\n\r\n // ---\r\n\r\n tabs: VTabComponent[] = [];\r\n registeredTabs: VTabComponent[] = [];\r\n selectedTab: VTabComponent;\r\n nextTab: VTabComponent;\r\n\r\n disablePrev = true;\r\n\r\n cachedTabTitlesKey: string;\r\n\r\n fontAwesome = false;\r\n\r\n get shouldHidePrevButton(): boolean {\r\n return this.hideFinalButton && this.selectedTab.tabIndex == this.tabs.length - 1;\r\n }\r\n\r\n constructor(\r\n private readonly cd: ChangeDetectorRef,\r\n private readonly navigationService: NavigationService) {\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.setDefaultSelectedTab();\r\n }\r\n\r\n registerTab(component: VTabComponent): void {\r\n component.tabIndex = this.registeredTabs.length;\r\n this.registeredTabs.push(component);\r\n\r\n if (this.registeredTabs?.length > 1 && !this.startTab) {\r\n return;\r\n }\r\n\r\n this.setDefaultSelectedTab();\r\n\r\n if (component.icon?.indexOf(\"fa-\") == 0) {\r\n this.fontAwesome = true;\r\n }\r\n }\r\n\r\n unregisterTab(component: VTabComponent): void {\r\n this.registeredTabs = this.registeredTabs.filter(t => t != component);\r\n }\r\n\r\n selectTab(tab: VTabComponent, $event?: MouseEvent, allowOverride: boolean = false) {\r\n\r\n // Guard clause for prev / nexdt\r\n if (!tab || (this.selectedTab?.disablePrev && !allowOverride) || tab.disabled) {\r\n return;\r\n }\r\n\r\n tab.selected = null;\r\n\r\n // Set previous tab to Complete\r\n if (this.selectedTab) {\r\n this.selectedTab.stepperState = VTabStepperState.Complete;\r\n }\r\n\r\n this.selectedTab = tab;\r\n this.tabSelect.emit(tab);\r\n \r\n // Stepper logic\r\n var selectedTabIndex = this.tabs.indexOf(this.selectedTab);\r\n\r\n if (this.selectedTab?.disablePrev) {\r\n this.tabs.forEach(tab => {\r\n tab.clickable = false;\r\n })\r\n }\r\n\r\n this.tabs.forEach((tab) => {\r\n tab.hideTab();\r\n });\r\n\r\n // This is in a timeout to prevent layout shift\r\n tab.showTab();\r\n\r\n if (tab.stepperState != VTabStepperState.Complete) {\r\n tab.stepperState = VTabStepperState.InProgress;\r\n }\r\n\r\n $event?.preventDefault();\r\n\r\n this.disablePrev = tab == this.tabs[0];\r\n }\r\n\r\n onTabStepperStateChanged(tab: VTabComponent) {\r\n\r\n if (tab.stepperState == VTabStepperState.Complete) {\r\n var next = this.getNextTab();\r\n if (next) {\r\n this.selectTab(next);\r\n }\r\n }\r\n }\r\n\r\n stepNext() {\r\n if (this.getNextTab()) {\r\n this.selectTab(this.getNextTab());\r\n return;\r\n }\r\n\r\n if (!!this.onFinish) {\r\n this.navigationService.go(this.onFinish);\r\n return;\r\n }\r\n\r\n this.onFinishCallback.emit();\r\n }\r\n\r\n stepPrev(overrideDisable: boolean = false) {\r\n this.selectTab(this.getPrevTab(), null, overrideDisable);\r\n }\r\n\r\n stepToBeginning() {\r\n this.selectedTab.disablePrev = false;\r\n this.selectTab(this.tabs[0], null, true);\r\n }\r\n\r\n trackBy(index: number, tab: IVeriTab) {\r\n return tab.tabTitle;\r\n }\r\n\r\n // ---\r\n\r\n private getPrevTab(): VTabComponent {\r\n var currentIndex = this.tabs.indexOf(this.selectedTab);\r\n\r\n if (currentIndex <= 0) {\r\n return null;\r\n }\r\n\r\n return this.tabs[currentIndex - 1];\r\n }\r\n\r\n private getNextTab(): VTabComponent {\r\n var currentIndex = this.tabs.indexOf(this.selectedTab);\r\n\r\n return this.tabs[currentIndex + 1];\r\n }\r\n\r\n private setDefaultSelectedTab() {\r\n if (!this.tabs?.length) {\r\n return;\r\n }\r\n\r\n let startTab = this.tabs[0];\r\n\r\n if (this.startTab) {\r\n startTab = this.tabs.find(tab => tab.tabId == this.startTab);\r\n }\r\n\r\n this.selectTab(startTab || this.tabs[0]);\r\n\r\n this.cd.detectChanges();\r\n }\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { IUnit } from \"@app/interfaces/IPeripheral\";\r\nimport { IPlot } from \"@app/interfaces/IPlot\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { IVehicleUnitMapping } from \"@app/interfaces/IVehiclePeripheralMapping\";\r\nimport { combineLatest, forkJoin, Observable, of } from \"rxjs\";\r\nimport { map, mergeMap, switchMap } from \"rxjs/operators\";\r\nimport { ISerialSearchResponse } from \"../_models/ISerialSearchResponse\";\r\nimport { HardwareMappingService } from \"../_routes/hardware/_services/hardware-mapping.service\";\r\nimport { FoundationVehiclesService } from \"./vehicle.service\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UnitsService {\r\n \r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly hardwareMappingService: HardwareMappingService,\r\n private readonly vehicleService: FoundationVehiclesService) { }\r\n\r\n getAllUnits(): Observable {\r\n return this.http.get(`/api/foundation/units`).pipe(mergeMap(units => {\r\n return this.hardwareMappingService.getProductsAndMap(units);\r\n }));\r\n }\r\n\r\n getAllUnitsWithMappings(): Observable {\r\n return combineLatest([\r\n this.getAllUnits(),\r\n this.getAllUnitMappings(),\r\n this.vehicleService.getVehicles()\r\n ]).pipe(\r\n mergeMap(([units, mappings, vehicles]) => {\r\n const vehiclesMap = new Map(vehicles.map(vehicle => [vehicle.Id, vehicle]));\r\n mappings.forEach(mapping => mapping.vehicle = vehiclesMap.get(mapping.VehicleId));\r\n const unitMappingsMap = new Map(mappings.map(mapping => [mapping.Serial, mapping]));\r\n const unitsWithUnitMappings = this.hardwareMappingService.applyVehicleMappingsToUnits(units, unitMappingsMap);\r\n return this.hardwareMappingService.getProductsAndMap(unitsWithUnitMappings);\r\n }));\r\n }\r\n\r\n getUnitBySerialWithMappings(serial: string): Observable {\r\n return combineLatest([\r\n this.getUnitBySerial(serial),\r\n this.getVehicleMappingsForUnit(serial),\r\n this.vehicleService.getVehicles()\r\n ]).pipe(\r\n mergeMap(([searchResponse, mappings, vehicles]) => {\r\n const vehiclesMap = new Map(vehicles.map(vehicle => [vehicle.Id, vehicle]));\r\n mappings.forEach(mapping => mapping.vehicle = vehiclesMap.get(mapping.VehicleId));\r\n const unitMappingsMap = new Map(mappings.map(mapping => [mapping.Serial, mapping]));\r\n const unitsWithUnitMappings = this.hardwareMappingService.applyVehicleMappingsToUnits([searchResponse.Unit], unitMappingsMap);\r\n return this.hardwareMappingService.getProductsAndMap(unitsWithUnitMappings);\r\n }));\r\n }\r\n\r\n getUnitBySerial(serial: string): Observable {\r\n return this.http.get(`/api/foundation/units/${serial}`);\r\n }\r\n\r\n getAllUnitMappings(): Observable {\r\n return this.http.get(`/api/foundation/vehicles/unitmappings`);\r\n }\r\n\r\n getUnitMappingsForVehicle(vehicleId: number): Observable {\r\n return this.http.get(`/api/foundation/vehicles/${vehicleId}/unitmappings`).pipe(map(mappings => {\r\n return mappings.filter(mapping => mapping.VehicleId === vehicleId);\r\n }));\r\n }\r\n\r\n getVehicleMappingsForUnit(serial: string): Observable {\r\n return this.http.get(`/api/foundation/vehicles/${serial}/allunitmappings`);\r\n }\r\n\r\n getUnit(vehicleId: number): Observable {\r\n return this.http.get(`/api/foundation/vehicles/${vehicleId}/unit`);\r\n }\r\n\r\n getUnitPlotsByImei(imei: string, startTime: Date, endTime: Date): Observable {\r\n return this.http.get(`/api/foundation/units/${imei}/plots`, {\r\n params: {\r\n start: startTime.toISOString(),\r\n end: endTime.toISOString()\r\n }\r\n })\r\n }\r\n\r\n getLatestUnitPlotsByImei(imei: string, amount: number = 10): Observable {\r\n return this.http.get(`/api/foundation/units/${imei}/latestplots`, {\r\n params: {\r\n amount: amount\r\n }\r\n });\r\n \r\n }\r\n\r\n getVehicleCurrentUnit(vehicle: IVehicle): Observable {\r\n return forkJoin({\r\n unitMappings: this.getUnitMappingsForVehicle(vehicle.Id),\r\n unit: this.getUnit(vehicle.Id)\r\n }).pipe(switchMap(data => {\r\n if (!data.unit) {\r\n return of(null);\r\n }\r\n\r\n return this.hardwareMappingService.getProductsAndMap([data.unit]).pipe(map(units => {\r\n data.unit.unitLocation = vehicle.UnitLocation ?? null;\r\n data.unit.StartUtc = data.unitMappings.find(x => x.Serial == data.unit.Serial)?.StartUtc;\r\n return data.unit;\r\n }))\r\n }));\r\n }\r\n\r\n}\r\n","import { CacheService } from \"@app/services/cache.Service\";\r\nimport { IDateQueryOptions } from \"@services/accelerometerRecord.service\";\r\nimport { DisplayService, IDialogOptionsJson } from \"@services/display.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { UnitConversionService, UnitConversionType } from \"@services/unitConversion.service\";\r\nimport * as angular from \"angular\";\r\nimport * as moment from \"moment\";\r\nimport { AlertRuleStatus } from \"src/app/main/modules/alerts/_enums/AlertRuleStatus.enums\";\r\nimport { AlcolockAlertSubCategory, AlertCategory, AlertPreferenceType, AlertState, AxleWeightProfileAlertSubCategory, FaultCodeAlertSubCategory, GeofenceAndZoneAlertSubCategory, InputAlertSubCategory, PowerEventAlertSubCategory, RecipientType, ResourceFilterType, TachoAlertSubCategory, TemperatureProfileAlertSubCategory, TollAlertSubCategory, TranscanAlertSubCategory, TyreAlertSubCategory, VehicleAlertSubCategory, VideoEventSubCategory } from \"src/app/main/modules/alerts/_enums/alerts.enums\";\r\nimport { IAlertResolutionCode } from \"src/app/main/modules/alerts/_models/IAlertResolutionCode\";\r\nimport { IAlertRuleGroupMapping, IAlertRecordMetadata, IAlertRule, IAlertRuleRecipient, IAlertRuleRecord, INotification, INotificationQuota, INotificationRecord } from \"../_models/alerts.interfaces\";\r\n\r\nexport interface IAlertCategoryTrigger {\r\n enumName: string;\r\n enum: any;\r\n subCategories?: { [key: number]: boolean };\r\n categoryAllowedDelayResend?: boolean;\r\n subCategoriesAllowedDelayResend?: { [key: number]: boolean };\r\n showReasonCodes?: { [key: number]: boolean };\r\n labels?: { [key: number]: string };\r\n subCategoriesUnits?: { [key: number]: number };\r\n}\r\n\r\nexport interface IShowAlertEditorOptions {\r\n autoLoadedRecordId?: number;\r\n\r\n onAlertEditorCancelled?: () => void;\r\n onAlertEditorDeleted?: () => void;\r\n onAlertEditorSaved?: () => void;\r\n}\r\n\r\ninterface IAlertDateParameters {\r\n from: string;\r\n to: string;\r\n}\r\n\r\nexport enum AlertRecordMaterialisationOptions {\r\n Basic = 0,\r\n WithSerialisedFields = 1,\r\n WithMetadata = 2,\r\n\r\n All = ~0\r\n}\r\n\r\nexport interface IAlertRecordQueryOptions extends IDateQueryOptions {\r\n MaterialisationOptions: AlertRecordMaterialisationOptions;\r\n Id?: number;\r\n AlertRuleId?: number;\r\n AccountId?: number;\r\n IsActive?: boolean;\r\n RequiresReview?: boolean;\r\n IgnoreOffRoadVehicles?: boolean;\r\n AlertState?: AlertState;\r\n VehicleId?: number;\r\n SecondaryId?: string;\r\n LastSentStart?: Date;\r\n LastSentEnd?: Date;\r\n}\r\n\r\nexport interface IAlertRuleQueryOptions {\r\n AccountId?: number;\r\n Category?: AlertCategory;\r\n IsActive?: boolean;\r\n Status?: AlertRuleStatus;\r\n RequiresReview?: boolean;\r\n ResendAlerts?: boolean;\r\n}\r\n\r\nexport interface IAlertResolutionCodeQueryOptions extends IDateQueryOptions {\r\n Id?: number;\r\n Name?: string;\r\n AccountId?: number;\r\n Active?: boolean;\r\n}\r\n\r\nexport class AlertsService {\r\n private activeAlertsCacheName = \"activeAlertsCache\";\r\n static $inject = [\"$q\", \"$http\", \"cacheService\", \"displayService\", \"translationService\", \"unitConversionService\", \"$sanitize\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $http: angular.IHttpService,\r\n private readonly cacheService: CacheService,\r\n private readonly displayService: DisplayService,\r\n private readonly translationService: TranslationService,\r\n private readonly unitConversionService: UnitConversionService,\r\n private readonly $sanitize: any) {\r\n this.cacheService.createCache(this.activeAlertsCacheName, { maxAge: 30 * 60 * 1000 });\r\n }\r\n\r\n getNotificationQuotas(monthToCheck: Date): angular.IPromise {\r\n\r\n return this\r\n .$http({\r\n url: `/api/notifications/quotas`,\r\n method: \"GET\",\r\n params: {\r\n monthToCheck: monthToCheck.toISOString()\r\n }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getNotificationQuotasUsed(monthToCheck: moment.Moment): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/notifications/quotasUsed`,\r\n method: \"GET\",\r\n params: {\r\n monthToCheck: monthToCheck.format()\r\n }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getAlertRuleRecord(id: number, materialisationOptions: AlertRecordMaterialisationOptions): angular.IPromise {\r\n\r\n const queryOptions: IAlertRecordQueryOptions = { Id: id, MaterialisationOptions: materialisationOptions };\r\n\r\n return this\r\n .$http({\r\n url: `/api/alertrecords`,\r\n method: \"GET\",\r\n params: queryOptions\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n\r\n if (!response.data.length) {\r\n return null;\r\n }\r\n\r\n return response.data[0];\r\n });\r\n }\r\n\r\n getAlertRuleRecordsUsingQueryOptions(queryOptions: IAlertRecordQueryOptions): angular.IPromise {\r\n\r\n if (queryOptions.Start) {\r\n queryOptions.Start = new Date(queryOptions.Start).toISOString();\r\n }\r\n\r\n if (queryOptions.End) {\r\n queryOptions.End = new Date(queryOptions.End).toISOString();\r\n }\r\n\r\n return this\r\n .$http({\r\n url: `/api/alertrecords`,\r\n method: \"GET\",\r\n params: queryOptions\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getAlertRuleRecords(ruleId: number, dateFrom: moment.Moment, dateTo: moment.Moment): angular.IPromise {\r\n const dateParameters: IAlertDateParameters = this.getDateRange(dateFrom, dateTo);\r\n\r\n return this\r\n .$http({\r\n url: `/api/alerts/rules/${ruleId}/history`,\r\n method: \"GET\",\r\n params: dateParameters\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getAlertRuleRecordsForAccount(dateFrom: moment.Moment | Date, dateTo: moment.Moment | Date): angular.IPromise {\r\n const dateParameters: IAlertDateParameters = this.getDateRange(dateFrom, dateTo);\r\n\r\n return this\r\n .$http({\r\n url: `/api/alerts/history`,\r\n method: \"GET\",\r\n params: dateParameters\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n\r\n\r\n getAlertRuleRecordById(recordId: number): angular.IPromise {\r\n\r\n return this\r\n .$http({\r\n url: `/api/alerts/history/${recordId}`,\r\n method: \"GET\"\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getAlertRule(ruleId: number): angular.IPromise {\r\n if (!ruleId) {\r\n return;\r\n }\r\n\r\n return this\r\n .$http({\r\n url: `/api/alerts/rules/${ruleId}`,\r\n method: \"GET\"\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n var rule = response.data;\r\n\r\n if (rule) {\r\n this.prepareRuleForDisplay(rule)\r\n }\r\n\r\n return rule;\r\n });\r\n }\r\n\r\n getAlertRules(queryOptions?: IAlertRuleQueryOptions): angular.IPromise {\r\n\r\n return this\r\n .$http({\r\n url: `/api/alerts/rules`,\r\n method: \"GET\",\r\n params: queryOptions\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n // process response\r\n var rules = response.data;\r\n\r\n rules?.forEach(rule => {\r\n this.prepareRuleForDisplay(rule);\r\n });\r\n\r\n return rules;\r\n });\r\n }\r\n\r\n getActiveAlertRules(): angular.IPromise {\r\n return this.cacheService.getOrRetrieveData(this.activeAlertsCacheName, () => this.getActiveAlertRulesFromDb(), false);\r\n }\r\n\r\n getActiveAlertRulesFromDb(): angular.IPromise {\r\n\r\n return this\r\n .$http({\r\n url: `/api/alerts/activeRules`,\r\n method: \"GET\"\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n // process response\r\n var rules = response.data;\r\n\r\n rules?.forEach(rule => {\r\n this.prepareRuleForDisplay(rule);\r\n });\r\n\r\n return rules;\r\n });\r\n }\r\n\r\n getAlertNotifications(ruleId: number, alertRuleRecordId: number): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/alerts/rules/${ruleId}/history/${alertRuleRecordId}/notifications`,\r\n method: \"GET\"\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getAlertNotificationRecords(notificationId: number): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/notifications/records/${notificationId}`,\r\n method: \"GET\"\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getAlertResolutionCodes(queryOptions?: IAlertResolutionCodeQueryOptions): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/alertresolutioncodes`,\r\n method: \"GET\",\r\n params: queryOptions\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n\r\n }\r\n\r\n addAlertResolutionCode(code: IAlertResolutionCode): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/alertresolutioncodes`,\r\n method: \"POST\",\r\n data: code\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n updateAlertResolutionCode(code: IAlertResolutionCode): angular.IPromise {\r\n\r\n return this\r\n .$http({\r\n url: `/api/alertresolutioncodes/${code.Id}`,\r\n method: \"POST\",\r\n data: code\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getAlertRulesContainsGroupId(groupId: number): angular.IPromise {\r\n\r\n return this\r\n .$http({\r\n url: `/api/alerts/rules/groupId/${groupId}`,\r\n method: \"GET\"\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n showAlertEditor(alertRule: IAlertRule, $event: MouseEvent, options?: IShowAlertEditorOptions) {\r\n\r\n const dialogTitle = alertRule\r\n ? this.translationService.t(`Alerts.alertRuleName`, alertRule?.Name)\r\n : this.translationService.t(`Alerts.newAlertRule`);\r\n\r\n const dialogOptions: IDialogOptionsJson = {\r\n title: dialogTitle,\r\n dialogHTML: ``,\r\n dialogId: `alertEditorComponent`,\r\n customClass: `alert-editor-dialog`,\r\n bindings: {\r\n alertRule: alertRule,\r\n onAlertEditorCancelled: () => { options?.onAlertEditorCancelled() },\r\n onAlertEditorDeleted: () => { options?.onAlertEditorDeleted(); },\r\n onAlertEditorSaved: () => { options?.onAlertEditorSaved(); },\r\n },\r\n event: $event\r\n };\r\n\r\n return this.displayService.showDialog(dialogOptions);\r\n }\r\n\r\n deleteRule(rule: IAlertRule) {\r\n this.prepareRuleForSaving(rule);\r\n\r\n return this\r\n .$http({\r\n url: `/api/alerts/rules/${rule.Id}`,\r\n data: rule,\r\n method: \"DELETE\"\r\n }).then(() => {\r\n this.cacheService.deleteItem(this.activeAlertsCacheName, rule, (i1, i2) => i1.Id == i2.Id);\r\n });\r\n }\r\n\r\n saveRule(rule: IAlertRule) {\r\n this.prepareRuleForSaving(rule);\r\n\r\n return this\r\n .$http({\r\n url: `/api/alerts/rules/`,\r\n data: rule,\r\n method: \"POST\"\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n const alertRule = response.data;\r\n this.prepareRuleForDisplay(alertRule);\r\n alertRule.Status != AlertRuleStatus.Deleted && this.cacheService.addOrUpdateItem(this.activeAlertsCacheName, alertRule, (i1, i2) => i1.Id == i2.Id);\r\n\r\n return alertRule;\r\n });\r\n }\r\n\r\n setSmsNumber(recipient: IAlertRuleRecipient): void {\r\n if (!recipient.Custom || recipient.Custom.trim().length < 1) {\r\n return;\r\n }\r\n\r\n const customCode = recipient.Custom.replace(\"^\\++\", \"\");\r\n const smsParts = customCode.split(\" \");\r\n const countryDialCode = recipient.countryDialCode ? recipient.countryDialCode.toString() : \"\";\r\n const plusCountryDialCode = \"+\" + countryDialCode;\r\n\r\n if (smsParts.length > 1 && smsParts[0] === countryDialCode) {\r\n return;\r\n }\r\n\r\n if (smsParts.length > 1 && smsParts[0].length < 4) {\r\n const remaining = recipient.Custom.slice(smsParts[0].length).trim();\r\n recipient.Custom = plusCountryDialCode + \" \" + (remaining.startsWith(\"0\") ? remaining.slice(1) : remaining);\r\n return;\r\n }\r\n\r\n if (customCode.startsWith(countryDialCode)) {\r\n recipient.Custom = plusCountryDialCode + (smsParts.length === 1 ? \" \" : \"\") + customCode.slice(countryDialCode.length).trim();\r\n return;\r\n }\r\n\r\n if (customCode.startsWith(\"0\") && recipient.countryDialCode && customCode.length > 1) {\r\n recipient.Custom = plusCountryDialCode + \" \" + customCode.slice(1).trim();\r\n return;\r\n }\r\n\r\n if (smsParts.length === 1) {\r\n recipient.Custom = plusCountryDialCode + \" \" + customCode.trim();\r\n return;\r\n }\r\n\r\n recipient.Custom = plusCountryDialCode + \" \" + customCode.slice(smsParts[0].length).trim();\r\n }\r\n\r\n setCountryDialCode(recipient: IAlertRuleRecipient): void {\r\n if (!recipient.Custom) {\r\n return;\r\n }\r\n const smsParts = recipient.Custom.split(\" \");\r\n if (smsParts.length > 1) {\r\n if (!isNaN(+smsParts[0])) {\r\n recipient.countryDialCode = +smsParts[0];\r\n }\r\n }\r\n }\r\n\r\n createAlertTriggerMappings(): IAlertCategoryTrigger[] {\r\n const alertCategoryTriggers: IAlertCategoryTrigger[] = [];\r\n\r\n Object.keys(AlertCategory).forEach(k => {\r\n const index: number = Number(k);\r\n\r\n if (isNaN(index)) {\r\n return;\r\n }\r\n\r\n switch (index as AlertCategory) {\r\n\r\n case AlertCategory.Geofence:\r\n alertCategoryTriggers[index] = {\r\n enumName: `GeofenceAndZoneAlertSubCategory`,\r\n enum: GeofenceAndZoneAlertSubCategory,\r\n categoryAllowedDelayResend: true\r\n };\r\n\r\n break;\r\n\r\n case AlertCategory.Vehicle:\r\n const speedUnitSuffix = this.unitConversionService.getConversionLabel(UnitConversionType.Speed);\r\n\r\n alertCategoryTriggers[index] = {\r\n enumName: `VehicleAlertSubCategory`,\r\n enum: VehicleAlertSubCategory,\r\n subCategories: {\r\n [VehicleAlertSubCategory.Speeding]: true,\r\n [VehicleAlertSubCategory.FuelLevelChange]: true,\r\n [VehicleAlertSubCategory.ExcessiveDwell]: true\r\n },\r\n subCategoriesAllowedDelayResend: {\r\n [VehicleAlertSubCategory.Speeding]: true,\r\n [VehicleAlertSubCategory.FuelLevelChange]: true,\r\n [VehicleAlertSubCategory.ExcessiveDwell]: true\r\n },\r\n showReasonCodes: {\r\n [VehicleAlertSubCategory.PlotReason]: true,\r\n },\r\n labels: {\r\n [VehicleAlertSubCategory.Speeding]: this.translationService.t(`AlertEditor.TriggerSpeedValue`),\r\n [VehicleAlertSubCategory.ContextualSpeeding]: this.translationService.t(`AlertEditor.overCertain`, speedUnitSuffix),\r\n [VehicleAlertSubCategory.FuelLevelChange]: this.translationService.t(`AlertEditor.TriggerVolumeValue`),\r\n [VehicleAlertSubCategory.ExcessiveDwell]: this.translationService.t(`AlertEditor.duration`)\r\n },\r\n subCategoriesUnits: {\r\n [VehicleAlertSubCategory.Speeding]: AlertPreferenceType.DistanceMeasurement,\r\n [VehicleAlertSubCategory.ContextualSpeeding]: AlertPreferenceType.DistanceMeasurement,\r\n [VehicleAlertSubCategory.FuelLevelChange]: AlertPreferenceType.VolumeMeasurement\r\n }\r\n\r\n };\r\n\r\n break;\r\n\r\n case AlertCategory.Toll:\r\n alertCategoryTriggers[index] = {\r\n enumName: `TollAlertSubCategory`,\r\n enum: TollAlertSubCategory\r\n };\r\n\r\n break;\r\n\r\n case AlertCategory.Alcolock:\r\n alertCategoryTriggers[index] = {\r\n enumName: `AlcolockAlertSubCategory`,\r\n enum: AlcolockAlertSubCategory\r\n };\r\n\r\n break;\r\n\r\n case AlertCategory.Tyres:\r\n alertCategoryTriggers[index] = {\r\n enumName: `TyreAlertSubCategory`,\r\n enum: TyreAlertSubCategory\r\n };\r\n\r\n break;\r\n\r\n case AlertCategory.FaultCode:\r\n alertCategoryTriggers[index] = {\r\n enumName: `FaultCodeAlertSubCategory`,\r\n enum: FaultCodeAlertSubCategory\r\n };\r\n\r\n break;\r\n\r\n case AlertCategory.Tachograph:\r\n alertCategoryTriggers[index] = {\r\n enumName: `TachoAlertSubCategory`,\r\n enum: TachoAlertSubCategory,\r\n subCategoriesAllowedDelayResend: {\r\n [TachoAlertSubCategory.DrivingWithoutTachoCard]: true\r\n }\r\n };\r\n\r\n break;\r\n\r\n case AlertCategory.Inputs:\r\n alertCategoryTriggers[index] = {\r\n enumName: `InputAlertSubCategory`,\r\n enum: InputAlertSubCategory,\r\n categoryAllowedDelayResend: true\r\n };\r\n\r\n break;\r\n\r\n case AlertCategory.TemperatureProfile:\r\n alertCategoryTriggers[index] = {\r\n enumName: `TemperatureProfileAlertSubCategory`,\r\n enum: TemperatureProfileAlertSubCategory,\r\n categoryAllowedDelayResend: true\r\n };\r\n\r\n break;\r\n\r\n case AlertCategory.Transcan:\r\n alertCategoryTriggers[index] = {\r\n enumName: `TranscanAlertSubCategory`,\r\n enum: TranscanAlertSubCategory\r\n };\r\n\r\n break;\r\n\r\n case AlertCategory.CameraEvent:\r\n alertCategoryTriggers[index] = {\r\n enumName: `VideoEventSubCategory`,\r\n enum: VideoEventSubCategory\r\n };\r\n\r\n break;\r\n\r\n case AlertCategory.Zone:\r\n alertCategoryTriggers[index] = {\r\n enumName: `GeofenceAndZoneAlertSubCategory`,\r\n enum: GeofenceAndZoneAlertSubCategory,\r\n categoryAllowedDelayResend: true\r\n };\r\n\r\n break;\r\n\r\n case AlertCategory.AxleWeightProfile:\r\n alertCategoryTriggers[index] = {\r\n enumName: `AxleWeightProfileAlertSubCategory`,\r\n enum: AxleWeightProfileAlertSubCategory,\r\n categoryAllowedDelayResend: true\r\n };\r\n\r\n break;\r\n\r\n case AlertCategory.PowerEvent:\r\n alertCategoryTriggers[index] = {\r\n enumName: `PowerEventAlertSubCategory`,\r\n enum: PowerEventAlertSubCategory,\r\n categoryAllowedDelayResend: true\r\n };\r\n\r\n break;\r\n\r\n default:\r\n\r\n break;\r\n }\r\n });\r\n\r\n return alertCategoryTriggers;\r\n }\r\n\r\n parseAlertRecordMetadata(alertRecord: IAlertRuleRecord): void {\r\n\r\n if (!alertRecord.AlertMetadataJson) {\r\n return;\r\n }\r\n\r\n alertRecord.alertMetadata = JSON.parse(alertRecord.AlertMetadataJson) as IAlertRecordMetadata;\r\n\r\n if (alertRecord.alertMetadata.PlotId) {\r\n alertRecord.plot = { Id: alertRecord.alertMetadata.PlotId }\r\n }\r\n }\r\n\r\n getAlertRuleSubcategoryEnum(category: AlertCategory): { subCategoryEnum, subCategoryString } {\r\n switch (category) {\r\n case 0:\r\n case 14:\r\n return { subCategoryEnum: GeofenceAndZoneAlertSubCategory, subCategoryString: 'GeofenceAndZoneAlertSubCategory' };\r\n case 1:\r\n return { subCategoryEnum: VehicleAlertSubCategory, subCategoryString: 'VehicleAlertSubCategory' };\r\n case 5:\r\n return { subCategoryEnum: TollAlertSubCategory, subCategoryString: 'TollAlertSubCategory' };\r\n case 6:\r\n return { subCategoryEnum: AlcolockAlertSubCategory, subCategoryString: 'AlcolockAlertSubCategory' };\r\n case 7:\r\n return { subCategoryEnum: TyreAlertSubCategory, subCategoryString: 'TyreAlertSubCategory' };\r\n case 8:\r\n return { subCategoryEnum: InputAlertSubCategory, subCategoryString: 'InputAlertSubCategory' };\r\n case 9:\r\n return { subCategoryEnum: FaultCodeAlertSubCategory, subCategoryString: 'FaultCodeAlertSubCategory' };\r\n case 10:\r\n return { subCategoryEnum: TachoAlertSubCategory, subCategoryString: 'TachoAlertSubCategory' };\r\n case 11:\r\n return { subCategoryEnum: TemperatureProfileAlertSubCategory, subCategoryString: 'TemperatureProfileAlertSubCategory' };\r\n case 12:\r\n return { subCategoryEnum: TranscanAlertSubCategory, subCategoryString: 'TranscanAlertSubCategory' };\r\n case 13:\r\n return { subCategoryEnum: VideoEventSubCategory, subCategoryString: 'VideoEventSubCategory' };\r\n case 15:\r\n return { subCategoryEnum: AxleWeightProfileAlertSubCategory, subCategoryString: 'AxleWeightProfileAlertSubCategory' };\r\n case 16:\r\n return { subCategoryEnum: PowerEventAlertSubCategory, subCategoryString: 'PowerEventAlertSubCategory' };\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n\r\n // ---\r\n\r\n private prepareRuleForDisplay(rule: IAlertRule): void {\r\n if (rule.Name) {\r\n rule.Name = this.$sanitize(rule.Name);\r\n }\r\n\r\n rule.Recipients.forEach(recipient => {\r\n if (recipient.UserId) {\r\n recipient.type = RecipientType.User;\r\n } else if (recipient.GroupId) {\r\n recipient.type = RecipientType.Group;\r\n } else {\r\n recipient.type = RecipientType.Custom;\r\n }\r\n });\r\n\r\n rule.Filters.forEach(filter => {\r\n if (filter.All) {\r\n filter.filterType = ResourceFilterType.Any;\r\n }\r\n else if (filter.None) {\r\n filter.filterType = ResourceFilterType.None;\r\n }\r\n else if (filter.GroupId) {\r\n filter.filterType = ResourceFilterType.Group;\r\n }\r\n else if (filter.ResourceId) {\r\n filter.filterType = ResourceFilterType.Specific;\r\n }\r\n });\r\n }\r\n\r\n private prepareRuleForSaving(rule: IAlertRule) {\r\n rule.Filters.forEach(filter => {\r\n // Use \"==\" not \"===\" as this has come from the front end as a string\r\n if (filter.filterType == ResourceFilterType.None) {\r\n filter.None = true;\r\n filter.GroupId = null;\r\n filter.ResourceId = null;\r\n filter.All = false;\r\n }\r\n else if (filter.filterType == ResourceFilterType.Any) {\r\n filter.All = true;\r\n }\r\n });\r\n }\r\n\r\n private getDateRange(startDate: Date | moment.Moment, endDate?: Date | moment.Moment): IAlertDateParameters {\r\n\r\n const startMoment = moment(startDate).startOf(\"day\");\r\n const endMoment = moment(endDate || startDate).startOf(\"day\");\r\n\r\n endMoment.add(1, \"day\");\r\n\r\n const params: IAlertDateParameters = {\r\n from: startMoment.utc().format(),\r\n to: endMoment.utc().format()\r\n };\r\n\r\n return params;\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { HardwareSource } from \"@interfaces/IAccumulatedData\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { MultiStateInputCategory } from \"@temperature/_enums/reefer/MultiStateInputCategory.enum\";\r\nimport { ReeferZoneOperatingModeCategory } from \"@temperature/_enums/reefer/ReeferZoneOperatingModeCategory.enum\";\r\nimport { IMultiStateInput } from \"@temperature/_models/multiStateInputs/IMultiStateInput\";\r\nimport { IReeferWithMappings } from \"@temperature/_models/reefer/IReeferWithMappings\";\r\nimport { ITemperatureProbeWithTemperatureData } from \"@temperature/_models/temperature/ITemperatureProbe\";\r\nimport { ITemperatureRecord } from \"@temperature/_models/temperature/ITemperatureRecord\";\r\nimport { ITemperatureSetpoint } from \"@temperature/_models/temperature/ITemperatureSetpoint\";\r\nimport { IZone, IZoneWithProbes } from \"@temperature/_models/temperature/ITemperatureZone\";\r\nimport { IZoneTemperatureOutOfBoundsHistory } from \"@temperature/_models/temperature/ITemperatureZoneOutOfBoundsHistory\";\r\nimport { IReeferZoneMode } from \"@temperature/_models/zones/IReeferZoneMode\";\r\nimport { IZoneQueryOptions } from \"@temperature/_models/zones/IZoneQueryOptions\";\r\nimport { ZoneTemperatureOutOfBoundsHistoryQueryOptions } from \"@temperature/_models/zones/IZoneTemperatureOutOfBoundsHistoryQueryOptions\";\r\nimport { Observable } from \"rxjs\";\r\nimport { IMultiStateInputRecord } from \"../_models/multiStateInputs/IMultiStateInputRecord\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ZoneService {\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly translationService: TranslationService) {\r\n\r\n }\r\n\r\n getZones(queryOptions: IZoneQueryOptions = {}): Observable {\r\n return this.http.get(`/api/zones`, { params: queryOptions as HttpParams });\r\n }\r\n\r\n getZonesTemperatureOutOfBoundsHistory(queryOptions: ZoneTemperatureOutOfBoundsHistoryQueryOptions = {}) {\r\n return this.http.get('/api/zones/temperature/outofboundshistory', { params: queryOptions as HttpParams });\r\n }\r\n saveTemperatureZone(zone: IZone): Observable {\r\n return this.http.post('/api/zones', zone)\r\n }\r\n\r\n getLatestReeferZoneOperatingModes(latestMultiStateInputRecords: IMultiStateInputRecord[], multiStateInputs: IMultiStateInput[], source: HardwareSource): IReeferZoneMode[] {\r\n if (!latestMultiStateInputRecords || !latestMultiStateInputRecords.length) {\r\n return;\r\n }\r\n\r\n const inputs = multiStateInputs.filter(input => input.Category === MultiStateInputCategory.ReeferZoneOperatingMode && input.Source === source);\r\n\r\n const statusesByZone: IReeferZoneMode[] = [];\r\n inputs.forEach(input => {\r\n const linkedRecord = latestMultiStateInputRecords.find(history => {\r\n return history.MultiStateInputId === input.Id;\r\n })\r\n if (linkedRecord) {\r\n const triggerStateItem = {\r\n zoneId: input.ZoneId,\r\n status: linkedRecord.State,\r\n latestRecord: linkedRecord\r\n };\r\n statusesByZone.push(triggerStateItem);\r\n }\r\n })\r\n\r\n return statusesByZone;\r\n }\r\n\r\n mapZoneStatuses(zones: IZoneWithProbes[], reeferZoneModes: IReeferZoneMode[]) {\r\n if (!zones?.length || !reeferZoneModes?.length) {\r\n return;\r\n }\r\n zones.forEach(zone => {\r\n if (!reeferZoneModes || !reeferZoneModes.length) {\r\n zone.operatingMode = -1;\r\n } else {\r\n var reeferZoneMode = reeferZoneModes.find(mode => mode.zoneId === zone.Id);\r\n zone.operatingMode = reeferZoneMode?.status;\r\n zone.zoneOperatingMode = reeferZoneMode\r\n }\r\n })\r\n }\r\n\r\n mapProbesToZone(zones: IZoneWithProbes[], probes: ITemperatureProbeWithTemperatureData[]): IZoneWithProbes[] {\r\n if (!zones || !probes) {\r\n return;\r\n }\r\n\r\n zones.forEach(zone => {\r\n zone.probes = probes.filter(probe => probe.ZoneId === zone.Id);\r\n });\r\n\r\n return zones;\r\n }\r\n\r\n mapTemperatureSetpointsToZones(zones: IZoneWithProbes[], temperatureSetpoints: ITemperatureSetpoint[]) {\r\n if (!zones || !temperatureSetpoints) {\r\n return;\r\n }\r\n zones.forEach(zone => {\r\n zone.setpoint = temperatureSetpoints.find(setpoint => setpoint.ZoneId === zone.Id);\r\n zone.setpointReading = zone.setpoint?.histories[0]?.SetpointValue;\r\n })\r\n }\r\n\r\n mapOutOfBoundsHistoryToZones(zones: IZoneWithProbes[], histories: IZoneTemperatureOutOfBoundsHistory[]) {\r\n zones.forEach(zone => {\r\n zone.activeOutOfBoundsHistory = histories.filter(history => history.ZoneId === zone.Id && !history.EndTime);\r\n if (zone.activeOutOfBoundsHistory.length > 0) {\r\n zone.outOfBounds = true;\r\n }\r\n })\r\n }\r\n\r\n hasZoneOutOfBounds(reeferUnit: IReeferWithMappings): boolean {\r\n if (!reeferUnit.zones || !reeferUnit.zones.length) {\r\n return false;\r\n }\r\n\r\n return reeferUnit.zones.some(zone => {\r\n return zone.outOfBounds;\r\n })\r\n }\r\n\r\n getOperatingModeIcon(category: ReeferZoneOperatingModeCategory) {\r\n if (category == undefined) {\r\n return undefined;\r\n }\r\n\r\n switch (category) {\r\n case ReeferZoneOperatingModeCategory.Heating:\r\n return 'local_fire_department';\r\n\r\n case ReeferZoneOperatingModeCategory.Cooling:\r\n return 'ac_unit';\r\n\r\n case ReeferZoneOperatingModeCategory.Defrost:\r\n return 'water_drop';\r\n\r\n case ReeferZoneOperatingModeCategory.Idle:\r\n return 'hourglass_empty';\r\n\r\n case ReeferZoneOperatingModeCategory.Sleep:\r\n return 'bedtime';\r\n\r\n default:\r\n case ReeferZoneOperatingModeCategory.Unknown:\r\n case ReeferZoneOperatingModeCategory.PowerOff:\r\n return 'power_settings_new';\r\n\r\n case ReeferZoneOperatingModeCategory.Pretrip:\r\n return 'timer';\r\n }\r\n }\r\n\r\n getOperatingModeTranslation(operatingMode: ReeferZoneOperatingModeCategory): string {\r\n if (!operatingMode || operatingMode === ReeferZoneOperatingModeCategory.Unknown) {\r\n return this.translationService.tEnum(ReeferZoneOperatingModeCategory, \"ReeferZoneOperatingModeCategory\", ReeferZoneOperatingModeCategory.PowerOff)\r\n }\r\n\r\n return this.translationService.tEnum(ReeferZoneOperatingModeCategory, \"ReeferZoneOperatingModeCategory\", operatingMode);\r\n }\r\n\r\n getOperatingModeColour(category: ReeferZoneOperatingModeCategory) {\r\n switch (category) {\r\n case ReeferZoneOperatingModeCategory.Cooling:\r\n return \"#8AC2E6\";\r\n\r\n case ReeferZoneOperatingModeCategory.Heating:\r\n return \"#cf4946\";\r\n\r\n default:\r\n return \"rgba(0, 0, 0, 0.54)\";\r\n }\r\n }\r\n\r\n getOperatingModeColourClass(category: ReeferZoneOperatingModeCategory): string {\r\n if (!category) {\r\n return 'op-mode-unknown';\r\n }\r\n\r\n const className = ReeferZoneOperatingModeCategory[category]?.toLowerCase();\r\n return \"op-mode-\" + className;\r\n }\r\n\r\n mapRecordsToZones(zones: IZoneWithProbes[], temperatureRecords: ITemperatureRecord[]): void {\r\n if (!zones || !temperatureRecords) {\r\n return;\r\n }\r\n\r\n zones.forEach(zone => {\r\n zone.temperatureRecords = temperatureRecords.filter(rec => rec.Position === zone.Position);\r\n });\r\n }\r\n\r\n getZoneAtPosition(zones: IZoneWithProbes[], position: number) {\r\n if (!zones?.length) {\r\n return;\r\n }\r\n\r\n return zones.find(zone => zone.Position === position);\r\n }\r\n\r\n setZonesOperatingMode(zones: IZoneWithProbes[]) {\r\n if (!zones || !zones.length) {\r\n return;\r\n }\r\n zones.forEach((zone: IZoneWithProbes) => {\r\n zone.zoneIcon = this.getOperatingModeIcon(zone.operatingMode);\r\n zone.zoneIconClass = this.getOperatingModeColourClass(zone.operatingMode);\r\n });\r\n }\r\n\r\n}\r\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { DataCacheService } from \"@app/services/caching/data-cache.service\";\r\nimport { Observable, Subject } from \"rxjs\";\r\nimport { tap } from \"rxjs/operators\";\r\nimport { EngineerJobItemStatus } from \"../foundation.enums\";\r\nimport { IEngineerJobItem, IProcessResult } from \"../foundation.interfaces\";\r\ninterface IJobItemStatusStyle {\r\n icon?: string;\r\n iconColor?: string;\r\n}\r\n\r\nexport interface IEngineerJobItemQueryOptions {\r\n jobItemId?: number\r\n JobId?: number\r\n }\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class EngineerJobItemService {\r\n private jobItemsCacheName: string = \"engineerJobItemsCache\";\r\n\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly dataCacheService: DataCacheService\r\n ) { }\r\n\r\n getAllEngineerJobItems(invalidateCache = false): Observable {\r\n return this.dataCacheService.getOrRequest(this.jobItemsCacheName, () => this.getEngineerJobItemsFromDb(), { invalidateCache })\r\n }\r\n\r\n getEngineerJobItemsFromDb(): Observable {\r\n return this.http.get(`/api/foundation/engineerJobItems`);\r\n }\r\n\r\n getEngineerJobItems(queryOptions: IEngineerJobItemQueryOptions = {}): Observable {\r\n return this.http.get(`/api/foundation/engineerJobItems`, { params: queryOptions as HttpParams });\r\n }\r\n\r\n createUpdateEngineerJobItem(engineerJobItem: IEngineerJobItem): Observable {\r\n return this.http.post(`/api/foundation/engineerJobItems/`, engineerJobItem).pipe(\r\n tap(jobItem => {\r\n this.dataCacheService.addOrUpdateItem(jobItem, this.jobItemsCacheName);\r\n })\r\n );\r\n }\r\n\r\n completeEngineerJobItem(jobItemId: number): Observable {\r\n return this.http.post(`/api/foundation/engineerJobItems/complete`, Number(jobItemId) ); \r\n }\r\n\r\n closeEngineerJobItem(jobItem: IEngineerJobItem): Observable {\r\n jobItem.Status = EngineerJobItemStatus.Cancelled;\r\n return this.createUpdateEngineerJobItem(jobItem);\r\n }\r\n\r\n calculateJobCompletion(jobItems: IEngineerJobItem[]): { completedJobItems: number, totalJobItems: number } {\r\n if (!jobItems.length) {\r\n return { completedJobItems: 0, totalJobItems: 0 };\r\n }\r\n\r\n const totalJobItems = jobItems.filter(item => item.Status !== EngineerJobItemStatus.Cancelled).length;\r\n const completedJobItems = jobItems.filter(item => item.Status === EngineerJobItemStatus.Complete).length;\r\n\r\n return { completedJobItems, totalJobItems };\r\n }\r\n\r\n}\r\n","import { IDriver } from \"@interfaces/IDriver\";\r\nimport { IGeofence } from \"@interfaces/IGeofences\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { IVehicleDriverMapping } from \"@interfaces/IVehicleDriverMapping\";\r\nimport { CacheService } from \"@services/cache.Service\";\r\nimport { AccountOption } from \"@services/class/AccountOption\";\r\nimport { DriverService } from \"@services/driver.service\";\r\nimport { DriverAssignmentService } from \"@services/driverAssignment.service\";\r\nimport { GeofenceService } from \"@services/geofence.service\";\r\nimport { GoogleService } from \"@services/google.service\";\r\nimport { NavigationService } from \"@services/navigation.service\";\r\nimport { PlotService } from \"@services/plot.service\";\r\nimport { SessionService } from \"@services/session.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport { RouteStatus } from \"@tms/_enums/RouteStatus\";\r\nimport { RouteVisitStatus } from \"@tms/_enums/RouteVisitStatus\";\r\nimport { IGeoArea } from \"@tms/_models/IGeoArea\";\r\nimport { IImportedPlannedRoute, IPlannedRoute, VisitType } from \"@tms/_models/IPlannedRoute\";\r\nimport { IPlannedRouteVisit } from \"@tms/_models/IPlannedRouteVisit\";\r\nimport { IRouteDetailVisit } from \"../_models/IRouteDetailVisit\";\r\nimport { IUnplannedStop } from \"@tms/_models/IUnplannedStop\";\r\nimport { PlannedRouteVisitService } from \"@tms/_services/planned-route-visit.service\";\r\nimport { UnplannedStopService } from \"@tms/_services/unplanned-stop.service\";\r\nimport * as moment from \"moment\";\r\nimport { SettingsName } from \"src/app/class/SettingsName\";\r\nimport { ITmsReplayResult } from \"@components/planning/interfaces/ITmsReplayResult\";\r\nimport { GeofenceType } from \"@enums/GeofenceType\";\r\nimport { IPlannedRouteOptions } from \"../_models/IPlannedRouteOptions\";\r\nimport { DateService, DateUnit } from \"@app/services/date.service\";\r\nimport { VisitOnTimeStatus } from \"../_enums/VisitOnTimeStatus\";\r\nimport { PlannedRouteClosureReason } from \"../_enums/PlannedRouteClosureReason\";\r\n\r\nexport function selectMany(input: TIn[], selectListFn: (t: TIn) => TOut[]): TOut[] {\r\n return input.reduce((out, inx) => {\r\n out.push(...selectListFn(inx));\r\n return out;\r\n }, new Array());\r\n}\r\n\r\nexport interface IPlannedRouteDetail extends IPlannedRoute {\r\n editingDisabled?: boolean;\r\n deletingDisabled?: boolean;\r\n\r\n unplannedVisits?: IUnplannedStop[];\r\n allVisits?: IRouteDetailVisit[];\r\n\r\n vehicle?: IVehicle;\r\n driver?: IDriver;\r\n totalDurationMins?: number;\r\n totalPlannedDistanceKm?: number;\r\n totalActualDistanceKm?: number;\r\n routeDisplayStatus?: string;\r\n routeDetailDisplayStatus?: string;\r\n firstVisit?: IPlannedRouteVisit;\r\n lastVisit?: IPlannedRouteVisit;\r\n routeDisplayName?: string;\r\n totalPlannedVisits?: number;\r\n\r\n plannedDuration?: number;\r\n actualDuration?: number;\r\n plannedRouteClosureReason?: PlannedRouteClosureReason;\r\n}\r\n\r\nexport class PlannedRouteService {\r\n\r\n geofences: IGeofence[];\r\n\r\n plannedRouteServiceCache = \"plannedRouteServiceCache\";\r\n\r\n static $inject = [\"$http\", \"$q\", \"cacheService\", \"driverService\", \"driverAssignmentService\", \"geofenceService\", \"googleService\", \"plotService\", \"translationService\", \"vehicleService\", \"navigationService\", \"veriDate\", \"sessionService\", \"plannedRouteVisitService\", \"unplannedStopService\", \"dateService\"];\r\n\r\n constructor(\r\n private readonly $http: angular.IHttpService,\r\n private readonly $q: angular.IQService,\r\n private readonly cacheService: CacheService,\r\n private readonly driverService: DriverService,\r\n private readonly driverAssignmentService: DriverAssignmentService,\r\n private readonly geofenceService: GeofenceService,\r\n private readonly googleService: GoogleService,\r\n private readonly plotService: PlotService,\r\n private readonly translationService: TranslationService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly navigationService: NavigationService,\r\n private readonly veriDate: VeriDate,\r\n private readonly sessionService: SessionService,\r\n private readonly plannedRouteVisitService: PlannedRouteVisitService,\r\n private readonly unplannedStopService: UnplannedStopService,\r\n private readonly dateService: DateService\r\n ) {\r\n this.cacheService.createCache(this.plannedRouteServiceCache, { maxAge: 5 * 60 * 1000 });\r\n }\r\n\r\n replayRoute(plannedRouteId: number, updateDatabase: boolean): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/tmsreplay/`,\r\n method: \"POST\",\r\n params: { updateDatabase: updateDatabase, routeId: plannedRouteId }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n\r\n return response.data;\r\n });\r\n }\r\n\r\n cancelPlannedRoute(plannedRoute: IPlannedRoute): angular.IPromise {\r\n plannedRoute.Status = RouteStatus.Cancelled;\r\n\r\n this.removeDetailPropertiesForSave(plannedRoute);\r\n\r\n return this\r\n .$http({\r\n url: `/api/tms/plannedroute/cancel`,\r\n method: \"POST\",\r\n data: plannedRoute\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n this.cacheService.addOrUpdateItem(this.plannedRouteServiceCache, plannedRoute, (route1, route2) => route1.Id == route2.Id);\r\n return response.data;\r\n });\r\n }\r\n\r\n updatePlannedRoute(plannedRoute: IPlannedRoute): angular.IPromise {\r\n this.removeDetailPropertiesForSave(plannedRoute);\r\n\r\n return this\r\n .$http({\r\n url: `/api/tms/routes`,\r\n method: \"POST\",\r\n data: plannedRoute\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n this.cacheService.addOrUpdateItem(this.plannedRouteServiceCache, plannedRoute, (route1, route2) => route1.Id == route2.Id);\r\n return response.data;\r\n });\r\n }\r\n\r\n addPlannedRoute(route: IPlannedRoute): angular.IPromise {\r\n\r\n return this\r\n .$http({\r\n url: `/api/routeimport/addroute`,\r\n method: \"POST\",\r\n data: route\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n this.cacheService.addOrUpdateItem(this.plannedRouteServiceCache, route, (route1, route2) => route1.Id == route2.Id);\r\n return response.data;\r\n });\r\n }\r\n\r\n addPlannedRoutes(routes: IPlannedRoute[]): angular.IPromise {\r\n\r\n return this\r\n .$http({\r\n url: `/api/routeimport/addroutes`,\r\n method: \"POST\",\r\n data: routes\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n routes.forEach(route => {\r\n this.cacheService.addOrUpdateItem(this.plannedRouteServiceCache, route, (route1, route2) => route1.Id == route2.Id);\r\n })\r\n return response.data;\r\n });\r\n }\r\n\r\n getPlannedRoute(routeId: number, options: IPlannedRouteOptions): angular.IPromise {\r\n const plannedRoutePromise = this\r\n .$http({\r\n url: `/api/tms/plannedroutes/${routeId}`,\r\n method: \"GET\"\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return [response.data];\r\n });\r\n\r\n let unplannedStopsPromise = this.$q.resolve([] as IUnplannedStop[]);\r\n if (options.getUnplannedStops) {\r\n unplannedStopsPromise = this.unplannedStopService.getUnplannedStopsForRoute(routeId);\r\n }\r\n\r\n return this.getLinkedElementsForPlannedRoutes(plannedRoutePromise, unplannedStopsPromise, options).then(plannedRoutes => {\r\n return this.filterRoutes(plannedRoutes, options)[0];\r\n });\r\n }\r\n\r\n // Potential bug in here when used with route performance\r\n getPlannedRoutes(start: moment.Moment, end: moment.Moment, options: IPlannedRouteOptions, unsafe = false): angular.IPromise {\r\n return this.cacheService.getOrRetrieveData(this.plannedRouteServiceCache, () => this.getPlannedRoutesFromDatabase(start, end, options), options.invalidateCache, unsafe);\r\n }\r\n\r\n getPlannedRoutesFromDatabase(start: moment.Moment, end: moment.Moment, options: IPlannedRouteOptions): angular.IPromise {\r\n\r\n if (!options.customTimes) {\r\n // Ensure we are at the start and end of days\r\n start = start.startOf(\"d\");\r\n end = end.endOf(\"d\");\r\n }\r\n\r\n const plannedRoutePromise = this\r\n .$http({\r\n url: `/api/tms/plannedroutes?start=${start.toISOString()}&end=${end.toISOString()}`,\r\n method: \"GET\"\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n\r\n let unplannedStopsPromise = this.$q.resolve([] as IUnplannedStop[]);\r\n if (options.getUnplannedStops) {\r\n unplannedStopsPromise = this.unplannedStopService.getUnplannedStopsForRoutes(start, end, true);\r\n }\r\n\r\n return this.getLinkedElementsForPlannedRoutes(plannedRoutePromise, unplannedStopsPromise, options).then(plannedRoutes => {\r\n return this.filterRoutes(plannedRoutes, options);\r\n });\r\n }\r\n\r\n getLinkedElementsForPlannedRoutes(plannedRoutePromise: angular.IPromise, unplannedStopsPromise: angular.IPromise, options: IPlannedRouteOptions): angular.IPromise {\r\n\r\n let vehiclesPromise = this.$q.resolve([] as IVehicle[]);\r\n if (options.mapVehicles) {\r\n vehiclesPromise = this.vehicleService.getVehicles({ includePeripheralMappings: true });\r\n }\r\n\r\n let driversPromise = this.$q.resolve([] as IDriver[]);\r\n if (options.mapDrivers) {\r\n driversPromise = this.driverService.getDrivers();\r\n }\r\n\r\n let assignmentsPromise = this.$q.resolve([] as IVehicleDriverMapping[]);\r\n if (options.mapVehicles && options.mapDrivers) {\r\n assignmentsPromise = this.driverAssignmentService.getDriverAssignments(true);\r\n }\r\n\r\n let geofencesPromise = this.$q.resolve([] as IGeofence[]);\r\n if (options.mapGeofences) {\r\n geofencesPromise = this.geofenceService.getGeofences();\r\n }\r\n\r\n return this.$q.all([plannedRoutePromise, unplannedStopsPromise, geofencesPromise, vehiclesPromise, driversPromise, assignmentsPromise])\r\n .then(\r\n ([plannedRoutes, unplannedStops, geofences, vehicles, drivers, assignments]) => {\r\n\r\n const updatedPlannedRoutes: IPlannedRouteDetail[] = [];\r\n const formatRoutePromises: angular.IPromise[] = [];\r\n \r\n plannedRoutes.forEach(route => {\r\n const updatedRoute: IPlannedRouteDetail = route;\r\n\r\n updatedPlannedRoutes.push(updatedRoute);\r\n\r\n if (!options.getCancelledVisits) {\r\n this.filterOutCancelledVisits(route);\r\n }\r\n\r\n this.driverAssignmentService.mapDriversToVehicles(drivers, assignments, vehicles);\r\n this.assignVehicleToRoute(updatedRoute, vehicles);\r\n this.assignDriverToRoute(updatedRoute, drivers);\r\n this.formatPlannedVisitsForDisplay(route, geofences);\r\n this.formatRouteForDisplay(updatedRoute, geofences);\r\n this.parseRouteRules(route);\r\n this.groupPlannedAndUnplannedVisits(updatedRoute, unplannedStops, options);\r\n\r\n formatRoutePromises.push(this.formatDistanceAndLineForRouteVisits(updatedRoute, options));\r\n });\r\n\r\n return this.$q.all(formatRoutePromises).then(() => {\r\n return updatedPlannedRoutes;\r\n });\r\n });\r\n }\r\n\r\n filterOutCancelledVisits(plannedRoute: IPlannedRoute): void {\r\n if (!plannedRoute?.PlannedVisits?.length) {\r\n return;\r\n }\r\n\r\n plannedRoute.PlannedVisits = plannedRoute.PlannedVisits.filter(visit => visit.Status !== RouteVisitStatus.Cancelled);\r\n }\r\n\r\n formatPlannedVisitsForDisplay(route: IPlannedRouteDetail, geofences: IGeofence[]) {\r\n route.PlannedVisits.forEach(visit => {\r\n this.plannedRouteVisitService.updateOnSiteTimeMins(visit);\r\n this.mapGeofenceToVisit(visit, geofences);\r\n this.setDisplayLabelForPlannedVisit(visit);\r\n });\r\n }\r\n\r\n\r\n groupPlannedAndUnplannedVisits(route: IPlannedRouteDetail, unplannedStops: IUnplannedStop[], options: IPlannedRouteOptions): void {\r\n route.unplannedVisits = unplannedStops;\r\n\r\n\r\n if (options.getUnplannedStops) {\r\n route.allVisits = [...this.createRouteDetailVisitFromPlannedVisits(route.PlannedVisits, options), ...this.createRouteDetailVisitFromUnplannedStops(route, options)];\r\n }\r\n else {\r\n route.allVisits = [...this.createRouteDetailVisitFromPlannedVisits(route.PlannedVisits, options)];\r\n }\r\n\r\n route.allVisits.sort((a, b) => {\r\n if (a.plannedArrivalTime < b.plannedArrivalTime) {\r\n return -1;\r\n }\r\n return 1;\r\n });\r\n route.allVisits.forEach((visit, index) => {\r\n visit.allVisitsId = index;\r\n });\r\n }\r\n\r\n formatRouteForDisplay(route: IPlannedRouteDetail, geofences: IGeofence[]): void {\r\n route.totalPlannedDistanceKm = 0;\r\n this.setEditableStatus(route);\r\n this.setDeletableStatus(route);\r\n this.setFirstAndLastVisit(route);\r\n this.mapGeofenceToVisit(route.firstVisit, geofences);\r\n this.mapGeofenceToVisit(route.lastVisit, geofences);\r\n this.setDisplayLabelForPlannedVisit(route.firstVisit);\r\n this.setDisplayLabelForPlannedVisit(route.lastVisit);\r\n this.setRouteDisplayName(route);\r\n this.setRouteDisplayDuration(route);\r\n this.setRouteDisplayPlannedDistance(route);\r\n this.setRouteDisplayStatus(route);\r\n this.setTotalPlannedVisits(route);\r\n }\r\n\r\n setEditableStatus(route: IPlannedRouteDetail) {\r\n route.editingDisabled = route.Status !== RouteStatus.Planned && route.Status !== RouteStatus.Started;\r\n }\r\n\r\n setDeletableStatus(route: IPlannedRouteDetail) {\r\n route.deletingDisabled = route.Status !== RouteStatus.Planned;\r\n }\r\n\r\n setRouteDisplayName(route: IPlannedRouteDetail): void {\r\n let name: string = route.ExternalReference ? route.ExternalReference : route.Name;\r\n if (!name) {\r\n const startLoc = route.firstVisit.displayLabel || route.firstVisit.Name || this.translationService.t(\"TmsHistory.UnknownLocation\");\r\n const endLoc = route.lastVisit.displayLabel || route.lastVisit.Name || this.translationService.t(\"TmsHistory.UnknownLocation\");\r\n name = `${startLoc} to ${endLoc}`;\r\n }\r\n route.routeDisplayName = name;\r\n }\r\n\r\n setRouteDisplayDuration(route: IPlannedRouteDetail): void {\r\n const durationMs = this.getRouteDuration(route);\r\n route.totalDurationMins = Math.abs(durationMs / 1000 / 60);\r\n }\r\n\r\n setRouteDisplayPlannedDistance(route: IPlannedRouteDetail): void {\r\n route.totalPlannedDistanceKm = this.plannedRouteVisitService.calculateTotalDistanceKm(route.PlannedVisits).planned;\r\n }\r\n\r\n getRouteDuration(route: IPlannedRouteDetail): number {\r\n // Only need to use planned visits to calculate duration as unplanned stops will not happen before leaving the starting location or after arriving at the end location\r\n if (route.Status === RouteStatus.Started) {\r\n return;\r\n }\r\n if (!route?.firstVisit) {\r\n return 0;\r\n }\r\n\r\n let endTime: Date;\r\n if (route.ActualEndTime) {\r\n endTime = route.ActualEndTime;\r\n }\r\n else if (route.lastVisit && !route.ActualEndTime && route.lastVisit.ActualArrivalTime) {\r\n endTime = route.lastVisit.ActualArrivalTime;\r\n }\r\n else if (route.lastVisit) {\r\n endTime = route.lastVisit.PlannedArrivalTime;\r\n }\r\n\r\n const startTime = route.firstVisit.ActualDepartureTime ? route.firstVisit.ActualDepartureTime : route.firstVisit.PlannedDepartureTime;\r\n\r\n const duration = new Date(endTime).getTime() - new Date(startTime).getTime();\r\n return duration;\r\n }\r\n\r\n sortRouteVisitsByPlannedArrivalTime(route: IPlannedRoute): void {\r\n this.sortVisitsByPlannedArrivalTime(route.PlannedVisits);\r\n }\r\n\r\n sortVisitsByPlannedArrivalTime(visits: IPlannedRouteVisit[]): void {\r\n if (!visits?.length) {\r\n return;\r\n }\r\n\r\n visits.sort((a, b) => {\r\n const timeA = a.PlannedArrivalTime ? new Date(a.PlannedArrivalTime) : null;\r\n const timeB = b.PlannedArrivalTime ? new Date(b.PlannedArrivalTime) : null;\r\n\r\n if (timeA < timeB) {\r\n return -1;\r\n }\r\n\r\n return 1;\r\n });\r\n }\r\n\r\n formatDistanceAndLineForRouteVisits(route: IPlannedRouteDetail, options: IPlannedRouteOptions): angular.IPromise {\r\n\r\n const totalDistanceKm = this.plannedRouteVisitService.calculateTotalDistanceKm(route.PlannedVisits).planned;\r\n\r\n if ((!totalDistanceKm && options.updateDistance) || options.updateLinePoints) {\r\n return this.plannedRouteVisitService.updateDirectionsForVisits(route.PlannedVisits, options.updateDistance, options.updateLinePoints).then(visits => {\r\n route.PlannedVisits = visits;\r\n\r\n route.totalPlannedDistanceKm = this.plannedRouteVisitService.calculateTotalDistanceKm(route.PlannedVisits).planned;\r\n });\r\n }\r\n else {\r\n route.totalPlannedDistanceKm = totalDistanceKm;\r\n }\r\n }\r\n\r\n getRouteBetweenVisitLocations(startLocation, endLocation): angular.IPromise {\r\n if (!startLocation || !endLocation) {\r\n return this.$q.resolve(null);\r\n }\r\n\r\n const latLngFrom = this.getLatLngsForVisit(startLocation);\r\n const latLngTo = this.getLatLngsForVisit(endLocation);\r\n\r\n if (!latLngFrom || !latLngTo) {\r\n return this.$q.resolve(null);\r\n }\r\n\r\n return this.googleService.getDirections(latLngFrom, latLngTo).then((response) => {\r\n return response.routes[0];\r\n });\r\n }\r\n\r\n getLatLngsForVisit(visit: IPlannedRouteVisit) {\r\n let latLng: google.maps.LatLng;\r\n\r\n if (visit.RouteStopLocation || visit.RouteStopLocationJson) {\r\n\r\n if (!visit.RouteStopLocation && visit.RouteStopLocationJson) {\r\n visit.RouteStopLocation = JSON.parse(visit.RouteStopLocationJson) as IGeoArea;\r\n }\r\n latLng = new google.maps.LatLng({\r\n lat: visit.RouteStopLocation.Latitude,\r\n lng: visit.RouteStopLocation.Longitude\r\n });\r\n }\r\n else if (visit.Geofence || visit.GeofenceId) {\r\n if (!visit.Geofence && visit.GeofenceId) {\r\n this.mapGeofenceToVisit(visit, this.geofences);\r\n }\r\n latLng = new google.maps.LatLng({\r\n lat: visit.Geofence.Latitude,\r\n lng: visit.Geofence.Longitude\r\n });\r\n }\r\n\r\n return latLng;\r\n }\r\n\r\n extractGeoAreasFromRoute(route: IPlannedRoute): IGeoArea[] {\r\n var geoAreas: IGeoArea[] = [];\r\n\r\n route.PlannedVisits.forEach(visit => {\r\n geoAreas.push(visit.RouteStopLocation);\r\n });\r\n\r\n return geoAreas;\r\n }\r\n\r\n assignVehicleToRoute(route: IPlannedRouteDetail, vehicles: IVehicle[]) {\r\n if (!route.VehicleId) {\r\n return;\r\n }\r\n const routeVehicle = vehicles.find(vehicle => {\r\n return vehicle.Id === route.VehicleId;\r\n });\r\n route.vehicle = routeVehicle;\r\n }\r\n\r\n assignDriverToRoute(route: IPlannedRouteDetail, drivers: IDriver[]) {\r\n if (!route.DriverId && !route.vehicle?.Driver) {\r\n return;\r\n }\r\n\r\n let routeDriver: IDriver = null;\r\n\r\n if (route.DriverId) {\r\n routeDriver = drivers.find(driver => {\r\n return driver.Id === route.DriverId;\r\n });\r\n }\r\n else {\r\n routeDriver = route.vehicle?.Driver;\r\n }\r\n\r\n route.driver = routeDriver;\r\n }\r\n\r\n filterRoutes(plannedRoutes: IPlannedRoute[], options: IPlannedRouteOptions): IPlannedRoute[] {\r\n const filteredPlannedRoutes: IPlannedRoute[] = [];\r\n\r\n plannedRoutes.forEach(route => {\r\n let addToList = true;\r\n if (route.Status === RouteStatus.Cancelled && !options.showCancelledRoutes) {\r\n addToList = false;\r\n }\r\n\r\n const routeCannotBeEdited = route.Status !== RouteStatus.Planned && route.Status !== RouteStatus.Started;\r\n\r\n if (routeCannotBeEdited && route.PlannedStartTime && options.onlyRoutesThatCanBeEdited) {\r\n addToList = false;\r\n }\r\n\r\n if (addToList) {\r\n filteredPlannedRoutes.push(route);\r\n }\r\n });\r\n\r\n return filteredPlannedRoutes;\r\n }\r\n\r\n setFirstAndLastVisit(route: IPlannedRouteDetail): void {\r\n if (!route.PlannedVisits?.length) {\r\n return;\r\n }\r\n\r\n route.firstVisit = route.PlannedVisits[0];\r\n route.lastVisit = route.PlannedVisits.slice(-1)[0];\r\n }\r\n\r\n mapGeofenceToVisit(visit: IPlannedRouteVisit, geofences: IGeofence[]) {\r\n if (!visit.GeofenceId) {\r\n return;\r\n }\r\n visit.Geofence = this.geofenceService.findGeofence(geofences, visit.GeofenceId);\r\n }\r\n\r\n setDisplayLabelForPlannedVisit(visit: IPlannedRouteVisit) {\r\n const {\r\n Name,\r\n GeocodedAddress,\r\n Geofence,\r\n RouteStopLocation,\r\n RouteStopLocationJson,\r\n Address\r\n } = visit;\r\n\r\n // Set displayLabel based on Name or fallback values\r\n visit.displayLabel = Name || \"Unknown\";\r\n\r\n if (!Name) {\r\n if (GeocodedAddress) {\r\n visit.displayLabel = visit.Name = GeocodedAddress.FormattedAddress;\r\n } else if (Geofence) {\r\n visit.displayLabel = visit.Name = Geofence.Description;\r\n } else if (RouteStopLocation) {\r\n visit.displayLabel = visit.Name = RouteStopLocation.Description;\r\n } else if (RouteStopLocationJson) {\r\n visit.RouteStopLocation = JSON.parse(RouteStopLocationJson) as IGeoArea;\r\n visit.displayLabel = visit.Name = visit.RouteStopLocation.Description;\r\n }\r\n }\r\n\r\n // Set displayNameAddressLabel based on address or geofence address fallback\r\n const address = Address || `${Geofence?.Addr1 ?? ''} ${Geofence?.Addr3 ?? ''}`.trim();\r\n\r\n visit.displayNameAddressLabel = address.length\r\n ? `${visit.displayLabel} (${address})`\r\n : visit.displayLabel;\r\n }\r\n\r\n setRouteDisplayStatus(route: IPlannedRouteDetail): void {\r\n switch (route.Status) {\r\n case RouteStatus.Planned:\r\n\r\n if (!route.firstVisit) {\r\n return;\r\n }\r\n\r\n const ms = this.veriDate.createMoment(route.firstVisit.PlannedArrivalTime).diff(this.veriDate.createMoment(new Date()));\r\n const duration = this.veriDate.formatDurationMs(ms);\r\n\r\n if (ms.valueOf() > 0) {\r\n route.routeDisplayStatus = `${this.translationService.t(\"Tms.StartsIn\")} ${duration}`;\r\n route.routeDetailDisplayStatus = \"Planned\";\r\n }\r\n else {\r\n route.routeDisplayStatus = route.routeDetailDisplayStatus = this.translationService.t(\"Tms.Overdue\");\r\n }\r\n\r\n break;\r\n\r\n case RouteStatus.Started:\r\n\r\n const visitCount = route.PlannedVisits.filter(visit => visit.Status == RouteVisitStatus.Arrived || visit.Status == RouteVisitStatus.Departed).length;\r\n\r\n route.routeDisplayStatus = `Visited ${visitCount} of ${route.PlannedVisits.length}`;\r\n route.routeDetailDisplayStatus = \"In Progress\"\r\n\r\n break;\r\n\r\n case RouteStatus.CompletedWithMissing:\r\n case RouteStatus.Completed:\r\n route.routeDisplayStatus = this.translationService.t(\"Tms.Ended\");\r\n route.routeDetailDisplayStatus = this.translationService.t(\"Tms.Ended\");\r\n\r\n break;\r\n\r\n default:\r\n route.routeDisplayStatus = RouteStatus[route.Status];\r\n break;\r\n }\r\n }\r\n\r\n setTotalPlannedVisits(route: IPlannedRouteDetail): void {\r\n let requiresStartLocation = false;\r\n let requiresEndLocation = false;\r\n\r\n if (route?.TmsRouteRules?.RouteMatchingRules) {\r\n requiresStartLocation = route.TmsRouteRules.RouteMatchingRules.StartRouteOnDepartStartingLocation;\r\n requiresEndLocation = route.TmsRouteRules.RouteMatchingRules.EndRouteOnArriveAtEndingLocation;\r\n }\r\n\r\n let totalPlannedVisits = route.PlannedVisits.length || 0;\r\n\r\n totalPlannedVisits = (requiresStartLocation) ? Math.max(0, totalPlannedVisits - 1) : totalPlannedVisits;\r\n totalPlannedVisits = (requiresEndLocation) ? Math.max(0, totalPlannedVisits - 1) : totalPlannedVisits;\r\n\r\n route.totalPlannedVisits = totalPlannedVisits;\r\n }\r\n\r\n openRouteDetailsDialogById(routeId: number, parentStateName = \"app.tms.activeRoutes\") {\r\n\r\n this.navigationService.go(`${parentStateName}.view`, { routeId: routeId });\r\n }\r\n\r\n openRouteDetailsDialog(route: IPlannedRouteDetail, parentStateName = \"app.tms.activeRoutes\") {\r\n\r\n this.openRouteDetailsDialogById(route.Id, parentStateName);\r\n }\r\n\r\n getArrivalVisitOnTimeStatus(visit: IPlannedRouteVisit): VisitOnTimeStatus {\r\n if (!visit.ActualArrivalTime) {\r\n // If we have no arrival time, but we do have a departure time, then this is our departure stop, so we shouldnt penalise for this\r\n if (visit.ActualDepartureTime) {\r\n return null;\r\n }\r\n\r\n return VisitOnTimeStatus.Missed;\r\n }\r\n\r\n const arrivalDiff = this.dateService.getDiff(visit.ActualArrivalTime, visit.PlannedArrivalTime, DateUnit.Min);\r\n const travelTimeBufferMins = this.veriDate.convertTimeSpanToMins(visit.TravelTimeBuffer);\r\n\r\n if (arrivalDiff > -travelTimeBufferMins && arrivalDiff < travelTimeBufferMins) {\r\n return VisitOnTimeStatus.OnTime;\r\n }\r\n\r\n if (arrivalDiff > -travelTimeBufferMins) {\r\n return VisitOnTimeStatus.Early;\r\n }\r\n\r\n if (arrivalDiff < travelTimeBufferMins) {\r\n return VisitOnTimeStatus.Late;\r\n }\r\n\r\n return VisitOnTimeStatus.OnTime;\r\n }\r\n\r\n getDepartureVisitOnTimeStatus(visit: IPlannedRouteVisit): VisitOnTimeStatus {\r\n if (!visit.ActualDepartureTime) {\r\n return null;\r\n }\r\n\r\n const departureDiff = this.veriDate.getDiff(visit.ActualDepartureTime, visit.PlannedDepartureTime, \"m\");\r\n const onSiteTimeBufferMins = this.veriDate.convertTimeSpanToMins(visit.OnSiteTimeBuffer);\r\n\r\n if (departureDiff > -onSiteTimeBufferMins && departureDiff < onSiteTimeBufferMins) {\r\n return VisitOnTimeStatus.OnTime;\r\n }\r\n\r\n if (departureDiff > -onSiteTimeBufferMins) {\r\n return VisitOnTimeStatus.Early;\r\n }\r\n\r\n if (departureDiff < onSiteTimeBufferMins) {\r\n return VisitOnTimeStatus.Late;\r\n }\r\n\r\n return VisitOnTimeStatus.OnTime;\r\n }\r\n\r\n getCostMultiplier(): number {\r\n const accountOptions = this.sessionService.getItem(SettingsName.AccountOptions);\r\n let costMultiplier: number = parseFloat(accountOptions.JourneyCostValue);\r\n\r\n if (accountOptions.JourneyCostType === \"Mileage\") {\r\n // convert from cost per mile into cost per km\r\n costMultiplier /= 1.60934;\r\n }\r\n\r\n return costMultiplier;\r\n }\r\n\r\n\r\n // ---\r\n\r\n private createRouteDetailVisitFromPlannedVisits(visits: IPlannedRouteVisit[], options: IPlannedRouteOptions): IRouteDetailVisit[] {\r\n var routeDetails: IRouteDetailVisit[] = [];\r\n\r\n visits.forEach(visit => {\r\n var visitDetail = this.createRouteDetailVisitFromPlannedVisit(visit, options);\r\n\r\n visitDetail.arrivalTimeStatus = this.getArrivalVisitOnTimeStatus(visit);\r\n visitDetail.departureTimeStatus = this.getDepartureVisitOnTimeStatus(visit);\r\n\r\n routeDetails.push(visitDetail);\r\n });\r\n\r\n return routeDetails;\r\n }\r\n\r\n private createRouteDetailVisitFromPlannedVisit(visit: IPlannedRouteVisit, options: IPlannedRouteOptions): IRouteDetailVisit {\r\n if (options.mapGeofences && visit.RouteStopLocationJson) {\r\n visit.RouteStopLocation = JSON.parse(visit.RouteStopLocationJson) as IGeoArea;\r\n }\r\n\r\n if (options.mapGeofences && (visit.RouteStopLocation?.GeofenceType == GeofenceType.Polygon || (visit.RouteStopLocation?.Latitude == 0 && visit.RouteStopLocation?.Longitude == 0))) {\r\n this.geofenceService.setPolygonGeofenceVisualCenter(visit.RouteStopLocation);\r\n }\r\n\r\n if (options.mapGeofences && (!visit.RouteStopLocation && visit.Geofence)) {\r\n visit.RouteStopLocation = visit.Geofence;\r\n }\r\n\r\n return {\r\n displayName: visit.displayLabel,\r\n actualArrivalTime: visit.ActualArrivalTime ? new Date(visit.ActualArrivalTime) : null,\r\n plannedArrivalTime: visit.PlannedArrivalTime ? new Date(visit.PlannedArrivalTime) : null,\r\n actualDepartureTime: visit.ActualDepartureTime ? new Date(visit.ActualDepartureTime) : null,\r\n plannedDepartureTime: visit.PlannedDepartureTime ? new Date(visit.PlannedDepartureTime) : null,\r\n arrivalEta: visit.ArrivalEta ? visit.ArrivalEta : null,\r\n driverId: visit.ActualDriverId,\r\n vehicleId: visit.ActualVehicleId,\r\n visitType: VisitType.Planned,\r\n address: visit.Address,\r\n latitude: visit.RouteStopLocation?.Latitude,\r\n longitude: visit.RouteStopLocation?.Longitude,\r\n status: visit.Status,\r\n plotId: visit.ArrivalPlotId,\r\n plot: { Id: visit.ArrivalPlotId },\r\n } as IRouteDetailVisit;\r\n }\r\n\r\n private createRouteDetailVisitFromUnplannedStops(route: IPlannedRouteDetail, options: IPlannedRouteOptions): IRouteDetailVisit[] {\r\n const visits: IRouteDetailVisit[] = [];\r\n\r\n if (!route.unplannedVisits) {\r\n route.unplannedVisits = [];\r\n }\r\n\r\n route.unplannedVisits.forEach(stop => {\r\n visits.push(this.createRouteDetailVisitFromUnplannedStop(stop));\r\n });\r\n\r\n return visits;\r\n }\r\n\r\n private createRouteDetailVisitFromUnplannedStop(unplannedStop: IUnplannedStop): IRouteDetailVisit {\r\n\r\n const latitude = unplannedStop.Latitude;\r\n const longitude = unplannedStop.Longitude;\r\n\r\n return {\r\n actualArrivalTime: this.veriDate.createDate(unplannedStop.VisitTime),\r\n plannedArrivalTime: this.veriDate.createDate(unplannedStop.VisitTime),\r\n actualDepartureTime: unplannedStop.DepartureTime,\r\n plannedDepartureTime: unplannedStop.DepartureTime,\r\n driverId: unplannedStop.DriverId,\r\n vehicleId: unplannedStop.VehicleId,\r\n visitType: VisitType.Unplanned,\r\n status: RouteVisitStatus.Departed,\r\n plotId: unplannedStop.PlotId,\r\n plot: { Id: unplannedStop.PlotId, Latitude: latitude, Longitude: longitude },\r\n latitude: latitude,\r\n longitude: longitude\r\n };\r\n\r\n }\r\n\r\n\r\n\r\n private parseRouteRules(route: IPlannedRouteDetail): void {\r\n if (!route.TmsRouteRulesJson) {\r\n return;\r\n }\r\n\r\n route.TmsRouteRules = JSON.parse(route.TmsRouteRulesJson);\r\n }\r\n\r\n private removeDetailPropertiesForSave(plannedRoute: IPlannedRoute | IPlannedRouteDetail): void {\r\n delete (plannedRoute as IPlannedRouteDetail).driver;\r\n delete (plannedRoute as IPlannedRouteDetail).vehicle;\r\n delete (plannedRoute as IPlannedRouteDetail).firstVisit;\r\n delete (plannedRoute as IPlannedRouteDetail).lastVisit;\r\n }\r\n\r\n}\r\n","import { HybridServiceAccessor } from \"@app/common/hybrid-service-accessor\";\r\nimport { VideoEntryService } from \"@app/main/components/videos/services/video-entry.service\";\r\nimport { IVideoEntry } from \"@components/videos/models/IVideoEntry\";\r\nimport { IVeriMapComponent } from \"@directives/_map/veriMap/veriMapComponent/veriMap.component\";\r\nimport { ReasonCode } from \"@enums/ReasonCode\";\r\nimport { SortDirection } from \"@enums/SortDirection\";\r\nimport { IDateParameters } from \"@interfaces/IDateParameters\";\r\nimport { IDriver } from \"@interfaces/IDriver\";\r\nimport { IJourney, IJourneyModel } from \"@interfaces/IJourney\";\r\nimport { IPlot, IPlotEvent } from \"@interfaces/IPlot\";\r\nimport { ISensorData } from \"@interfaces/ISensorData\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { IVehicleTrailerMapping } from \"@interfaces/IVehicleTrailerMapping\";\r\nimport { IDriverFilter } from \"@interfaces/filters/IDriverFilter\";\r\nimport { IGroupFilter } from \"@interfaces/filters/IGroupFilter\";\r\nimport { IVehicleFilter } from \"@interfaces/filters/IVehicleFilter\";\r\nimport { DateService, DateUnit } from \"@services/date.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { IPolyline } from \"@typings/google.maps.angular\";\r\nimport * as angular from \"angular\";\r\nimport copy from \"fast-copy/dist/fast-copy.esm.js\";\r\nimport * as moment from \"moment\";\r\nimport { ColourService } from \"./colour.service\";\r\nimport { DriverService } from \"./driver.service\";\r\nimport { DriverAssignmentService } from \"./driverAssignment.service\";\r\nimport { EventService, IEvent } from \"./event.services\";\r\nimport { EventMarkerType, GoogleMarkerService } from \"./googleMarker.service\";\r\nimport { MapService } from \"./map.service\";\r\nimport { PlotService } from \"./plot.service\";\r\nimport { PlotEventService } from \"./plotEvent.service\";\r\nimport { VehicleService } from \"./vehicle.service\";\r\nimport { VehicleInputService } from \"./vehicleInput.service\";\r\nimport { VeriDate } from \"./veriDate.service\";\r\n\r\n\r\nexport interface IHistoricalDay {\r\n date: Date;\r\n journeyModel: IJourneyModel;\r\n plots: IPlot[];\r\n events: IPlotEvent[];\r\n}\r\n\r\nexport interface IVehicleJourneyByDateMap {\r\n journeys: IJourney[];\r\n date: Date;\r\n}\r\n\r\nexport interface IVehicleJourneysMap {\r\n id: number;\r\n vehicle: IVehicle;\r\n journeysByDay: IVehicleJourneyByDateMap[];\r\n journeys: IJourney[];\r\n visibleJourneys: IJourney[];\r\n megaJourney?: IJourney;\r\n journeyCount: number;\r\n\r\n selected?: boolean;\r\n}\r\n\r\nexport class JourneyService {\r\n private readonly videoEntryService = new HybridServiceAccessor(\"videoEntryService\", this.$injector);\r\n\r\n // https://flatuicolors.com/\r\n //private journeyColors = [\r\n // \"#3498db\", // Blue (Light Pastel) #2980b9\r\n // \"#8e44ad\", // Purple\r\n // \"#e74c3c\", // Pink (Rusty / Salmon)\r\n // \"#16a085\", // Green (Pastel)\r\n // \"#e67e22\", // Orange\r\n // //\"#9d6079\", // Purple (Dark)\r\n // \"#34495e\", // Grey (Dark bluey)\r\n // //\"#7f8c8d\", // Silver\r\n // \"#27ae60\" // Green (Pea)\r\n //];\r\n\r\n static $inject = [\"$q\", \"$http\", \"$log\", \"plotService\", \"driverAssignmentService\", \"plotEventService\", \"googleMarkerService\", \"vehicleService\", \"vehicleInputService\", \"driverService\", \"mapService\", \"colourService\", \"eventService\", \"veriDate\", \"translationService\", \"dateService\", \"$injector\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $http: angular.IHttpService,\r\n private readonly $log: angular.ILogService,\r\n private readonly plotService: PlotService,\r\n private readonly driverAssignmentService: DriverAssignmentService,\r\n private readonly plotEventService: PlotEventService,\r\n private readonly googleMarkerService: GoogleMarkerService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly vehicleInputService: VehicleInputService,\r\n private readonly driverService: DriverService,\r\n private readonly mapService: MapService,\r\n private readonly colourService: ColourService,\r\n private readonly eventService: EventService,\r\n private readonly veriDate: VeriDate,\r\n private readonly translationService: TranslationService,\r\n private readonly dateService: DateService,\r\n private readonly $injector: angular.auto.IInjectorService,\r\n ) {\r\n\r\n //this.test();\r\n }\r\n\r\n getIntersectingJourneys(start: moment.Moment, end: moment.Moment, bounds: google.maps.LatLngBounds): angular.IPromise {\r\n\r\n const latLongs: number[][] = [];\r\n\r\n latLongs.push([bounds.getNorthEast().lat(), bounds.getNorthEast().lng()]);\r\n latLongs.push([bounds.getNorthEast().lat(), bounds.getSouthWest().lng()]);\r\n latLongs.push([bounds.getSouthWest().lat(), bounds.getSouthWest().lng()]);\r\n latLongs.push([bounds.getSouthWest().lat(), bounds.getNorthEast().lng()]);\r\n latLongs.push([bounds.getNorthEast().lat(), bounds.getNorthEast().lng()]);\r\n\r\n var params = {\r\n start: start.toISOString(),\r\n end: end.toISOString(),\r\n //vehicleId: 0,\r\n latLongs: latLongs\r\n };\r\n\r\n return this\r\n .$http({\r\n url: `/api/journeys/intersecting`,\r\n method: \"POST\",\r\n //cache: true,\r\n data: params,\r\n //params: { minsToLive: 60, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpResponse) => {\r\n //this.processJourneys(response.data);\r\n\r\n response.data.sort((x, y) => {\r\n return x.Id - y.Id;\r\n });\r\n\r\n return response.data;\r\n });\r\n }\r\n\r\n getCurrentJourney(vehicleId: number, invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/journeys/${vehicleId}/current`,\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 1, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpResponse) => {\r\n var journey = response.data;\r\n\r\n if (journey) {\r\n // This is needed so AngularJs knows when to update cards\r\n journey.Id = this.randomNumber(1, 10000000000);\r\n journey.VehicleId = vehicleId;\r\n\r\n // Color current journey with first color by default\r\n journey.lineColor = this.colourService.getColour(0, true).solidColour;\r\n journey.isCurrent = true;\r\n\r\n this.processJourney(journey);\r\n }\r\n\r\n return journey;\r\n });\r\n }\r\n\r\n getAllJourneys(startDate: Date, endDate?: Date, includeLinePoints = true, includeFormattedAddress = false, useCache = true, includeCan = false): angular.IPromise {\r\n const dateRange = this.getJourneyDateRange(startDate, endDate) as any;\r\n dateRange.includeLinePoints = includeLinePoints;\r\n dateRange.includeFormattedAddress = includeFormattedAddress;\r\n dateRange.includeCan = includeCan;\r\n\r\n return this\r\n .$http({\r\n method: \"GET\",\r\n url: `/api/journeys/`,\r\n cache: useCache,\r\n params: dateRange\r\n })\r\n .then((result: angular.IHttpResponse) => {\r\n var journeys = result.data;\r\n\r\n journeys = this.filterSmallJourneys(journeys);\r\n this.processJourneys(journeys);\r\n\r\n return journeys;\r\n })\r\n .catch((errorMessage: any) => {\r\n\r\n this.$log.error(\"Get journeys error\", errorMessage);\r\n return null;\r\n });\r\n }\r\n\r\n getJourneysForDateAndVehicle(vehicleId: number, selectedDate: Date, endDate: Date = null, includeCurrent = false, invalidateCache = false): angular.IPromise {\r\n let currentJourneyPromise: angular.IPromise = this.$q.when(null);\r\n if (includeCurrent) {\r\n currentJourneyPromise = this.getCurrentJourney(vehicleId, invalidateCache);\r\n }\r\n\r\n const journeysPromise = this.getJourneysForVehicle(vehicleId, selectedDate, endDate, invalidateCache);\r\n\r\n return this.$q.all([journeysPromise, currentJourneyPromise])\r\n .then(([journeys, currentJourney]) => {\r\n if (currentJourney) {\r\n journeys.push(currentJourney);\r\n }\r\n\r\n journeys.sort((a, b) => this.veriDate.sort(a.StartUtc, b.StartUtc, SortDirection.Ascending));\r\n\r\n this.processJourneys(journeys);\r\n return journeys;\r\n })\r\n .catch((errorMessage: any) => {\r\n\r\n this.$log.error(\"Get journeys for vehicle error\", errorMessage);\r\n return [];\r\n });\r\n }\r\n\r\n getJourneysForVehicle(vehicleId: number, startDate: Date, endDate: Date = null, invalidateCache = false): angular.IPromise {\r\n\r\n const dateRange = this.getJourneyDateRange(startDate, endDate) as any;\r\n\r\n dateRange.minsToLive = 5;\r\n dateRange.invalidateCache = invalidateCache;\r\n\r\n return this\r\n .$http({\r\n method: \"GET\",\r\n url: `/api/journeys/${vehicleId}/`,\r\n cache: true,\r\n params: dateRange\r\n })\r\n .then((result: angular.IHttpResponse) => {\r\n var journeys = result.data;\r\n journeys = this.filterSmallJourneys(journeys);\r\n\r\n journeys.sort((a, b) => this.veriDate.sort(a.StartUtc, b.StartUtc, SortDirection.Ascending));\r\n this.processJourneys(journeys);\r\n return journeys;\r\n }).catch((errorMessage: any) => {\r\n\r\n this.$log.error(\"Get journeys for vehicle error\", errorMessage);\r\n return null;\r\n });\r\n }\r\n\r\n getSensorsDataForVehicle(vehicle: IVehicle, selectedDate: Date): angular.IPromise {\r\n\r\n if (!vehicle) {\r\n console.error(\"No vehicle selected\");\r\n }\r\n\r\n const vehicleId = vehicle.Id;\r\n const dateRange = this.getJourneyDateRange(selectedDate);\r\n var rangeStart = moment(dateRange.start);\r\n var rangeEnd = moment(dateRange.end);\r\n\r\n return this.plotService.getSensorsData(vehicleId, rangeStart, rangeEnd);\r\n }\r\n\r\n getAllJourneyDataForVehicle(vehicle: IVehicle, selectedDate: Date, getCurrentJourney: boolean = false): angular.IPromise {\r\n if (!vehicle) {\r\n console.error(\"No vehicle selected\");\r\n }\r\n\r\n var includeCurrentJourney = getCurrentJourney && moment(selectedDate).isSame(moment(), \"d\");\r\n\r\n const dateRange = this.getJourneyDateRange(selectedDate);\r\n var rangeStart = moment(dateRange.start);\r\n var rangeEnd = moment(dateRange.end);\r\n\r\n return this.getHistoricalDayForVehicle(vehicle, rangeStart, rangeEnd, includeCurrentJourney)\r\n }\r\n\r\n getHistoricalDayForVehicle(vehicle: IVehicle, startDate: moment.Moment, endDate: moment.Moment, includeCurrentJourney: boolean = false): angular.IPromise {\r\n\r\n const vehicleId = vehicle.Id;\r\n\r\n const journeyPromise = this.getJourneysForDateAndVehicle(vehicleId, startDate.toDate(), endDate.toDate(), includeCurrentJourney)\r\n\r\n return journeyPromise.then((journeys: IJourney[]) => {\r\n\r\n const lastJourneyEndDate: Date = this.getLastJourneyEndUtcDate(journeys);\r\n const plotsEndDate = this.veriDate.createMoment(this.getJourneyDateRange(startDate.toDate(), lastJourneyEndDate).end);\r\n\r\n const vehicleInputPromise = this.vehicleInputService.getVehicleInputs();\r\n const probesPromise = this.vehicleService.getVehicleProbes(vehicle);\r\n const plotPromise = this.plotService.getPlotsForDateRange(vehicleId, startDate, plotsEndDate);\r\n const assignmentPromise = this.driverAssignmentService.getVehicleDriverAssignmentsForDateRange(vehicleId, startDate, endDate);\r\n const videoPromise = this.videoEntryService.service.getVideosEntriesForVehicle(vehicleId, startDate.toDate(), endDate.toDate(), { createFileUrls: true, invalidateCache: true }) as angular.IPromise;\r\n const commonEventPromise = this.eventService.getEventsForVehicle(vehicle.Id, startDate, endDate);\r\n const trailerAssociationPromise = this.vehicleService.getVehicleTrailerMappings(vehicle.Id, startDate, endDate);\r\n const tempRecordPromise = this.vehicleService.getVehicleTemperatureRecords(vehicle.Id, startDate, endDate);\r\n const sensorsData = this.plotService.getSensorsData(vehicleId, startDate, endDate);\r\n\r\n return this.$q\r\n .all([plotPromise, assignmentPromise, vehicleInputPromise, probesPromise, videoPromise, commonEventPromise, trailerAssociationPromise, tempRecordPromise, sensorsData])\r\n .then(([plots, assignments, vehicleInputs, probes, videos, commonEvents, trailerAssociations, tempRecords, sensorsData]) => {\r\n\r\n this.attachSensorDataToPlots(plots, sensorsData);\r\n\r\n const hasCANPTOEvents = this.plotEventService.hasCANPTOEvents(plots);\r\n\r\n const allJourneyEvents = this.plotEventService.parsePlotEvents(plots, assignments, vehicleInputs, videos, !hasCANPTOEvents, startDate, endDate);\r\n\r\n this.createAdditionalJourneyEvents(allJourneyEvents, vehicle, plots, commonEvents, trailerAssociations);\r\n\r\n const mapDataToJourneyPromises: angular.IPromise[] = [];\r\n\r\n journeys.forEach((journey) => {\r\n mapDataToJourneyPromises.push(this.mapDataToJourney(journey, plots, allJourneyEvents));\r\n });\r\n\r\n\r\n // Start journey at 14:44\r\n // And I have a video event at 14:40 - 14:50\r\n // then merge the start event with the video event into one event that can be played.\r\n // var matchingVideo = this.findMatchingVideoEvent(event.Utc, videos)\r\n // if(mathcingVideo) { event.video = matchingVideo; }\r\n\r\n return this.$q.all(mapDataToJourneyPromises).then(() => {\r\n allJourneyEvents.sort((a, b) => {\r\n var isSameTime = a.plot.UtcMoment.isSame(b.plot.UtcMoment);\r\n if (isSameTime) {\r\n // If plot the same, push end points behind\r\n if (a.label.indexOf(\"Journey End\") >= 0) {\r\n return 1;\r\n }\r\n else {\r\n return -1;\r\n }\r\n }\r\n\r\n return a.plot.UtcMoment.isAfter(b.plot.UtcMoment) ? 1 : -1;\r\n });\r\n\r\n plots.forEach(plot => {\r\n plot.TemperatureRecords = this.vehicleService.findTempRecordsForPlot(tempRecords, plot.Id);\r\n });\r\n\r\n allJourneyEvents.forEach(journeyEvent => {\r\n const matchingVideo = this.findMatchingVideo(journeyEvent.Utc, videos);\r\n\r\n if (matchingVideo) {\r\n journeyEvent.video = matchingVideo;\r\n }\r\n });\r\n\r\n var historicalDay: IHistoricalDay = {\r\n date: startDate.toDate(),\r\n journeyModel: this.createJourneyModel(journeys),\r\n plots: plots,\r\n events: allJourneyEvents\r\n };\r\n\r\n return historicalDay;\r\n });\r\n });\r\n });\r\n }\r\n\r\n private findMatchingVideo(eventTime: string | Date, videos: IVideoEntry[]): IVideoEntry {\r\n let matchingVideo: IVideoEntry;\r\n videos.forEach(video => {\r\n if (moment(video.VideoStartTime).isSameOrBefore(eventTime) && moment(video.VideoEndTime).isSameOrAfter(eventTime)) {\r\n matchingVideo = video;\r\n }\r\n });\r\n\r\n return matchingVideo;\r\n }\r\n\r\n private findJourneyDriver(plots: IPlot[]): number {\r\n var driverCount: number[] = [];\r\n\r\n const escapeCount = plots.length / 2;\r\n\r\n for (var i = 0; i < plots.length; i++) {\r\n const plot = plots[i];\r\n\r\n if (!plot.DriverId) {\r\n continue;\r\n }\r\n\r\n if (!driverCount[plot.DriverId]) {\r\n driverCount[plot.DriverId] = 0;\r\n }\r\n\r\n if (++driverCount[plot.DriverId] >= escapeCount) {\r\n return plot.DriverId;\r\n }\r\n }\r\n\r\n var first = Object.keys(driverCount).sort()[0];\r\n //console.log(\"first\", first, driverCount);\r\n return parseInt(first);\r\n }\r\n\r\n getJourneysForDriverSlim(driverId: number, startDate: moment.Moment, endDate: moment.Moment): angular.IPromise {\r\n const dateRange: IDateParameters = {\r\n start: startDate.startOf(\"d\").toISOString(),\r\n end: endDate.endOf(\"d\").toISOString()\r\n };\r\n\r\n return this\r\n .$http({\r\n method: \"GET\",\r\n url: `/api/drivers/${driverId}/journeys/`,\r\n params: dateRange\r\n })\r\n .then((result: angular.IHttpResponse) => {\r\n\r\n return result.data;\r\n })\r\n .catch((errorMessage: any) => {\r\n\r\n this.$log.error(\"Journey fetchAndFill error\", errorMessage);\r\n return null;\r\n });\r\n }\r\n\r\n getJourneysForDriver(driverId: number, startDate: Date, endDate: Date = null, invalidateCache = false): angular.IPromise {\r\n\r\n const dateRange = this.getJourneyDateRange(startDate, endDate) as any;\r\n\r\n dateRange.minsToLive = 5;\r\n dateRange.invalidateCache = invalidateCache;\r\n\r\n return this\r\n .$http({\r\n method: \"GET\",\r\n url: `/api/drivers/${driverId}/journeys`,\r\n cache: true,\r\n params: dateRange\r\n })\r\n .then((result: angular.IHttpResponse) => {\r\n var journeys = result.data;\r\n journeys = this.filterSmallJourneys(journeys);\r\n this.processJourneys(journeys);\r\n return journeys;\r\n }).catch((errorMessage: any) => {\r\n\r\n this.$log.error(\"Get journeys for driver error\", errorMessage);\r\n return null;\r\n });\r\n }\r\n\r\n getJourneysForDateAndDriver(driverId: number, selectedDate: Date, endDate: Date = null): angular.IPromise {\r\n const dateRange = this.getJourneyDateRange(selectedDate, endDate);\r\n\r\n return this\r\n .$http({\r\n method: \"GET\",\r\n url: `/api/drivers/${driverId}/journeys/`,\r\n params: dateRange\r\n })\r\n .then((result: angular.IHttpResponse) => {\r\n\r\n return result.data;\r\n })\r\n .catch((errorMessage: any) => {\r\n\r\n this.$log.error(\"Journey fetchAndFill error\", errorMessage);\r\n return null;\r\n });\r\n }\r\n\r\n getJourneyDataForDriver(driverId: number, selectedDate: Date, endDate: Date = null): angular.IPromise {\r\n return this.getJourneysForDateAndDriver(driverId, selectedDate, endDate).then(journeys => {\r\n var plotPromises: angular.IPromise[] = [];\r\n var sensorDataPromises: angular.IPromise[] = [];\r\n\r\n journeys.forEach(journey => {\r\n const rangeStart = moment(journey.StartUtc);\r\n const rangeEnd = moment(journey.EndUtc).add(1, \"m\");\r\n plotPromises.push(this.plotService.getPlotsForDateRange(journey.VehicleId, rangeStart, rangeEnd));\r\n sensorDataPromises.push(this.plotService.getSensorsData(journey.VehicleId, rangeStart, rangeEnd));\r\n });\r\n\r\n // const sensorsData = this.plotService.getSensorsData(vehicleId, rangeStart, rangeEnd);\r\n\r\n return this.$q.all({ plots: this.$q.all(plotPromises), sensorsData: this.$q.all(sensorDataPromises) }).then((results) => {\r\n var allPlots: IPlot[] = [];\r\n var allSensorsData: ISensorData[] = [];\r\n\r\n results.plots.forEach(plots => {\r\n allPlots = allPlots.concat(plots);\r\n });\r\n\r\n results.sensorsData.forEach(sd => {\r\n allSensorsData = allSensorsData.concat(sd);\r\n })\r\n\r\n this.attachSensorDataToPlots(allPlots, allSensorsData);\r\n\r\n journeys.forEach((journey) => {\r\n journey.plots = this.plotService.slicePlotArrayByTime(allPlots, journey.StartUtc, journey.EndUtc);\r\n journey.events = this.plotEventService.parsePlotEvents(journey.plots, [], [], [], false);\r\n });\r\n\r\n this.processJourneys(journeys);\r\n\r\n return {\r\n date: selectedDate,\r\n journeyModel: this.createJourneyModel(journeys),\r\n plots: allPlots,\r\n events: null\r\n };\r\n });\r\n });\r\n }\r\n\r\n filterSmallJourneys(journeys: IJourney[]): IJourney[] {\r\n\r\n // Remove any journeys that are 0 length or 0 minutes\r\n var filtered = journeys.filter(journey => !(journey.Distance < 100 || moment(journey.EndUtc).diff(journey.StartUtc, \"m\") < 1));\r\n return filtered;\r\n }\r\n\r\n processJourneys(journeys: IJourney[]) {\r\n var previousJourney: IJourney;\r\n\r\n var vehicleJourneyCount: number[] = [];\r\n\r\n performance.mark('processJourneys');\r\n for (var i = 0; i < journeys.length; i++) {\r\n const journey = journeys[i];\r\n\r\n // Color the journey (by vehicle)\r\n if (!vehicleJourneyCount[journey.VehicleId]) {\r\n vehicleJourneyCount[journey.VehicleId] = 0;\r\n }\r\n\r\n this.colorJourney(journey, vehicleJourneyCount[journey.VehicleId]++);\r\n\r\n this.processJourney(journey, previousJourney);\r\n\r\n previousJourney = journey;\r\n }\r\n\r\n performance.measure('processJourneys');\r\n }\r\n\r\n processJourney(journey: IJourney, previousJourney?: IJourney) {\r\n // Convert from metres into km\r\n journey.Distance = journey.Distance / 1000;\r\n\r\n if (!journey.isCurrent) {\r\n const ms = this.veriDate.createMoment(journey.EndUtc).diff(this.veriDate.createMoment(journey.StartUtc));\r\n const duration: any = moment.duration(ms);\r\n\r\n if (duration.hours() >= 1) {\r\n journey.duration = duration.format(\"h[hrs], m[m]\");\r\n }\r\n else {\r\n journey.duration = duration.format(\"m [mins]\");\r\n }\r\n journey.durationMoment = duration;\r\n }\r\n\r\n // Now calculate time difference from now until next journey\r\n if (previousJourney) {\r\n const ms = this.dateService.getDiff(previousJourney.EndUtc, journey.StartUtc, DateUnit.Ms);\r\n\r\n previousJourney.timeToNextJourney = \"0 minutes\";\r\n\r\n if (ms > 0) {\r\n previousJourney.timeToNextJourney = this.dateService.formatDuration(previousJourney.EndUtc, journey.StartUtc)\r\n }\r\n }\r\n\r\n if (journey.PointsEncoded && !journey.LinePoints) {\r\n journey.LinePoints = this.mapService.getPointsFromEncodedString(journey.PointsEncoded);\r\n //journey.LinePoints = this.mapService.catmullRomSpline(journey.LinePoints);\r\n }\r\n //else {\r\n // journey.LinePoints = journey.LinePoints||[];\r\n //}\r\n }\r\n\r\n createJourneyModel(journeys: IJourney[]): IJourneyModel {\r\n var totalElapsedTime = 0;\r\n var journeyModel: IJourneyModel = {\r\n journeys: journeys,\r\n events: [],\r\n totalDistance: 0,\r\n totalDistanceKm: 0\r\n };\r\n\r\n journeys.forEach(journey => {\r\n journeyModel.totalDistance += journey.Distance ?? 0;\r\n journeyModel.totalDistanceKm += journey.DistanceKm ?? 0;\r\n totalElapsedTime += this.veriDate.createMoment(journey.EndUtc).diff(this.veriDate.createMoment(journey.StartUtc));\r\n\r\n journey.events.forEach(event => event.lineColor = journey.lineColor);\r\n\r\n journeyModel.events.push.apply(journeyModel.events, journey.events);\r\n });\r\n\r\n journeyModel.events.sort((a, b) => {\r\n return moment(a.plot.UtcMoment).isBefore(b.plot.UtcMoment) ? -1 : 1;\r\n });\r\n\r\n const d = moment.duration(totalElapsedTime);\r\n journeyModel.totalElapsedTime = (d as any).format(\"h [hours], m [mins]\");\r\n\r\n return journeyModel;\r\n }\r\n\r\n // Shouldnt be needed anymore\r\n //setMapUrls(journeys: IJourney[], plots: IPlot[], size?: string) {\r\n\r\n // journeys.forEach(j => {\r\n // this.setMapUrl(j, plots, size);\r\n // });\r\n //}\r\n\r\n //setMapUrl(journey: IJourney, plots: IPlot[], size = \"278x133\") {\r\n\r\n // const filteredPlots = this.filterPlotsForJourney(journey, plots);\r\n // const latLngs = this.createLatLngsForPlots(filteredPlots);\r\n // let polylineColor = journey.lineColor || \"0x00426aff\";\r\n // polylineColor = polylineColor.replace(\"#\", \"0x\") + \"FF\";\r\n\r\n // const endColour = journey.isCurrent ? \"0x1e90ff\" : \"0xcf4946\";\r\n // // This gets around problems with the processor\r\n // const startLat = journey.StartLatitude || filteredPlots[0].Latitude;\r\n // const startLng = journey.StartLongitude || filteredPlots[0].Longitude;\r\n // const endLat = journey.EndLatitude || filteredPlots[filteredPlots.length - 1].Latitude;\r\n // const endLng = journey.EndLongitude || filteredPlots[filteredPlots.length - 1].Longitude;\r\n\r\n // const markers = `markers=color:0x209058|${startLat},${startLng}&markers=color:${endColour}|${endLat},${endLng}`;\r\n\r\n // this.googleService\r\n // .getPolylineMapUrl(latLngs, polylineColor, markers, size)\r\n // .then((mapUrl: string) => {\r\n // journey.mapImageUrl = mapUrl;\r\n // });\r\n //}\r\n\r\n createJourneyPolyline(journey: IJourney, journeyEvents?: any, dashed?: boolean): IPolyline {\r\n let latLngArray: google.maps.LatLng[] = null;\r\n\r\n //if (journey.SnappedLinePoints && journey.SnappedLinePoints.length !== 0) {\r\n // latLngArray = this.plotService.convertArrayToGoogleLatLng(journey.SnappedLinePoints);\r\n //}\r\n //else {\r\n // latLngArray = this.plotService.convertPlotsToGoogleLatLng(journey.plots);\r\n //}\r\n\r\n var linePoints = journey.SnappedLinePoints && journey.SnappedLinePoints.length ? journey.SnappedLinePoints : journey.LinePoints;\r\n\r\n if (linePoints && linePoints.length !== 0) {\r\n latLngArray = this.mapService.convertArrayToGoogleLatLng(linePoints);\r\n }\r\n else if (journey.plots) {\r\n latLngArray = this.mapService.convertPlotsToGoogleLatLng(journey.plots);\r\n }\r\n else {\r\n console.error(\"No data to create journey polyline from\", journey);\r\n return null;\r\n }\r\n\r\n return this.mapService.createPolyline(journey.Id, latLngArray, journey.lineColor, journeyEvents, dashed);\r\n }\r\n\r\n private getJourneyDateRange(startDate: Date, endDate?: Date): IDateParameters {\r\n\r\n const startMoment = this.veriDate.createMoment(startDate).startOf(\"day\");\r\n let endMoment = this.veriDate.createMoment(startDate).add(1, \"day\").startOf(\"day\");\r\n\r\n if (endDate && !this.veriDate.isSameDate(startDate, endDate)) {\r\n endMoment = this.veriDate.createMoment(endDate);\r\n }\r\n\r\n const params: IDateParameters = {\r\n start: startMoment.utc().format(),\r\n end: endMoment.utc().format()\r\n };\r\n\r\n return params;\r\n }\r\n\r\n mapVehicleJourneys(journeys: IJourney[], vehicles: IVehicle[]): IVehicleJourneysMap[] {\r\n var map: IVehicleJourneysMap[] = [];\r\n\r\n vehicles.forEach(vehicle => {\r\n const matchingVehicleJourneysMap = {\r\n id: vehicle.Id,\r\n vehicle: vehicle,\r\n journeysByDay: [],\r\n journeys: [],\r\n visibleJourneys: [],\r\n megaJourney: null,\r\n journeyCount: 0\r\n };\r\n\r\n matchingVehicleJourneysMap.journeys = journeys.filter(j => j.VehicleId == vehicle.Id);\r\n\r\n if (matchingVehicleJourneysMap.journeys.length == 0) {\r\n return;\r\n }\r\n\r\n map.push(matchingVehicleJourneysMap);\r\n matchingVehicleJourneysMap.journeys.sort((x, y) => this.veriDate.sort(x.StartUtc, y.StartUtc, SortDirection.Descending));\r\n\r\n var matchingVehicleJourneyDayMap: IVehicleJourneyByDateMap = null;\r\n\r\n matchingVehicleJourneysMap.journeys.forEach(journey => {\r\n var momentDate = this.veriDate.createMoment(journey.StartUtc);\r\n //console.log(journey.StartUtc);\r\n\r\n matchingVehicleJourneysMap.journeysByDay.forEach(vehicleJourneyByDateMap => {\r\n if (momentDate.isSame(this.veriDate.createMoment(vehicleJourneyByDateMap.date), \"days\")) {\r\n matchingVehicleJourneyDayMap = vehicleJourneyByDateMap;\r\n }\r\n });\r\n\r\n if (!matchingVehicleJourneyDayMap) {\r\n matchingVehicleJourneyDayMap = {\r\n date: momentDate.toDate(),\r\n journeys: []\r\n };\r\n\r\n matchingVehicleJourneysMap.journeysByDay.push(matchingVehicleJourneyDayMap);\r\n }\r\n\r\n journey.vehicle = matchingVehicleJourneysMap.vehicle;\r\n\r\n matchingVehicleJourneyDayMap.journeys.push(journey);\r\n matchingVehicleJourneysMap.journeys.push(journey);\r\n\r\n if (!matchingVehicleJourneysMap.megaJourney) {\r\n matchingVehicleJourneysMap.megaJourney = copy(journey);\r\n\r\n // Colours journey by vehicle\r\n matchingVehicleJourneysMap.megaJourney.indexColor = this.colourService.getColourIndex(matchingVehicleJourneysMap.megaJourney.VehicleId, true);\r\n matchingVehicleJourneysMap.megaJourney.lineColor = this.colourService.getColour(matchingVehicleJourneysMap.megaJourney.VehicleId, true).solidColour;\r\n\r\n if (!matchingVehicleJourneysMap.megaJourney.LinePoints) {\r\n matchingVehicleJourneysMap.megaJourney.LinePoints = []\r\n }\r\n }\r\n else if (journey.LinePoints) {\r\n matchingVehicleJourneysMap.megaJourney.LinePoints = matchingVehicleJourneysMap.megaJourney.LinePoints.concat(journey.LinePoints);\r\n }\r\n });\r\n\r\n\r\n //map.forEach(vehicleMap => {\r\n var journeyCount = 0;\r\n\r\n matchingVehicleJourneysMap.journeysByDay.forEach(mapByDay => {\r\n journeyCount += mapByDay.journeys.length;\r\n });\r\n\r\n matchingVehicleJourneysMap.journeyCount = journeyCount;\r\n matchingVehicleJourneysMap.journeysByDay.sort((x, y) => {\r\n if (x.date > y.date) {\r\n return -1;\r\n }\r\n\r\n if (x.date < y.date) {\r\n return 1;\r\n }\r\n\r\n if (x.date === y.date) {\r\n return 0;\r\n }\r\n });\r\n //});\r\n });\r\n\r\n return map;\r\n }\r\n\r\n updateTotalElapsedMinutesForJourney(journey: IJourney): void {\r\n if (!journey) {\r\n return;\r\n }\r\n\r\n journey.totalElapsedMinutes = this.veriDate.createMoment(journey.EndUtc).diff(this.veriDate.createMoment(journey.StartUtc), \"minutes\");\r\n }\r\n\r\n updateStartMinuteOfDayForJourney(journey: IJourney): void {\r\n if (!journey) {\r\n return;\r\n }\r\n\r\n const startMoment = this.veriDate.createMoment(journey.StartUtc);\r\n const startMinute = (startMoment.hour() * 60) + startMoment.minute();\r\n journey.startMinuteOfDay = startMinute;\r\n }\r\n\r\n updateEndMinuteOfDayForJourney(journey: IJourney): void {\r\n if (!journey) {\r\n return;\r\n }\r\n\r\n const endMoment = this.veriDate.createMoment(journey.EndUtc);\r\n const startMinute = (endMoment.hour() * 60) + endMoment.minute();\r\n journey.endMinuteOfDay = startMinute;\r\n }\r\n\r\n getLatLngsForJourneys(journeys: IJourney[]) {\r\n const latLngs: google.maps.LatLng[] = [];\r\n\r\n journeys.forEach(journey => {\r\n if (!journey?.LinePoints) {\r\n latLngs.push(new google.maps.LatLng(journey.StartLatitude, journey.StartLongitude));\r\n latLngs.push(new google.maps.LatLng(journey.EndLatitude, journey.EndLongitude));\r\n } else {\r\n journey.LinePoints.forEach(point => {\r\n latLngs.push(new google.maps.LatLng(point[0], point[1]));\r\n });\r\n }\r\n });\r\n\r\n return latLngs;\r\n }\r\n\r\n updateJourneyExpense(journey: IJourney): angular.IPromise {\r\n return this\r\n .$http({\r\n method: \"POST\",\r\n url: `/api/journeys/expense`,\r\n data: journey\r\n })\r\n .then((result: angular.IHttpResponse) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n updateJourneysExpenses(journeys: IJourney[]): angular.IPromise {\r\n return this\r\n .$http({\r\n method: \"POST\",\r\n url: `/api/journeys/expenses`,\r\n data: journeys\r\n })\r\n .then((result: angular.IHttpResponse) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n mapJourneysToResources(journeys: IJourney[], vehicles: IVehicle[], drivers: IDriver[]) {\r\n journeys.forEach(journey => {\r\n\r\n var journeyVehicles = vehicles.filter(vehicle => vehicle.Id == journey.VehicleId)\r\n var journeyDrivers = drivers.filter(driver => driver.Id == journey.DriverId)\r\n\r\n if (journeyVehicles.length) {\r\n journey.vehicle = journeyVehicles[0]\r\n }\r\n\r\n if (journeyDrivers.length) {\r\n journey.driver = journeyDrivers[0]\r\n }\r\n })\r\n }\r\n\r\n filterJourneys(journeys: IJourney[], vehicleFilter: IVehicleFilter, driverFilter: IDriverFilter, groupFilter: IGroupFilter): IJourney[] {\r\n\r\n if ((!vehicleFilter || !vehicleFilter.vehicle) && (!driverFilter || !driverFilter.driver) && (!groupFilter || !groupFilter.group)) {\r\n return journeys;\r\n }\r\n\r\n if (vehicleFilter && vehicleFilter.vehicle) {\r\n journeys = journeys.filter(v => v.VehicleId === vehicleFilter.vehicle.Id);\r\n }\r\n\r\n if (driverFilter && driverFilter.driver) {\r\n journeys = journeys.filter(v => v.DriverId === driverFilter.driver.Id);\r\n }\r\n\r\n if (groupFilter && groupFilter.group) {\r\n journeys = this.filterJourneysByGroup(journeys, groupFilter);\r\n }\r\n\r\n return journeys;\r\n }\r\n\r\n private filterJourneysByGroup(journeysToFilter: IJourney[], filter: IGroupFilter) {\r\n var filteredVideos: IJourney[] = [];\r\n\r\n journeysToFilter.forEach(v => {\r\n if (filter.group.DriverIds.find(driverId => driverId === v.DriverId) && !filteredVideos.find(fv => fv.Id === v.Id)) {\r\n filteredVideos.push(v);\r\n }\r\n\r\n if (filter.group.VehicleIds.find(vehicleId => vehicleId === v.VehicleId) && !filteredVideos.find(fv => fv.Id === v.Id)) {\r\n filteredVideos.push(v);\r\n }\r\n });\r\n\r\n return filteredVideos;\r\n }\r\n\r\n // ----------------------\r\n\r\n private createAdditionalJourneyEvents(allJourneyEvents: IPlotEvent[], vehicle: IVehicle, plots: IPlot[], commonEvents: IEvent[], trailerAssociations: IVehicleTrailerMapping[]) {\r\n // Setup speeding events\r\n commonEvents.forEach(commonEvent => {\r\n // In testing this happens ...\r\n if (commonEvent.VehicleId != vehicle.Id) return;\r\n\r\n const plot = this.plotService.findPlotById(commonEvent.StartPlotId, plots);\r\n if (plot) {\r\n\r\n const label = commonEvent.Type == ReasonCode.ContextualSpeeding\r\n ? this.translationService.t(\"journeyService.speeding\")\r\n : this.translationService.tEnum(ReasonCode, 'ReasonCode', commonEvent.Type);\r\n\r\n allJourneyEvents.push(this.googleMarkerService.createEventMarker(plot, { label, markerClass: \"marker-event-driver-changed\", subIcon: \"warning\" }));\r\n }\r\n });\r\n\r\n // Setup associations as events\r\n //console.log(\"trailerAssociations\", trailerAssociations);\r\n //trailerAssociations.forEach(trailerAssociation => {\r\n // var startPlot = this.plotService.findPlotClosestToTime(moment(trailerAssociation.StartUtc), plots);\r\n // var endPlot = this.plotService.findPlotClosestToTime(moment(trailerAssociation.EndUtc), plots);\r\n\r\n // var startMarker = this.googleMarkerService.createEventMarker(startPlot, \"Trailer \" + trailerAssociation.TrailerId + \" Attached\", \"marker-event-trailer-association\", \"call_merge\")\r\n // var endMarker = this.googleMarkerService.createEventMarker(endPlot, \"Trailer \" + trailerAssociation.TrailerId + \" Detached\", \"marker-event-trailer-association\", \"call_split\")\r\n\r\n // allJourneyEvents.push(startMarker);\r\n // allJourneyEvents.push(endMarker);\r\n //});\r\n\r\n // If we are missing an ignition on, create a fake one\r\n }\r\n\r\n private mapDataToJourney(journey: IJourney, plots: IPlot[], allJourneyEvents: IPlotEvent[]): angular.IPromise {\r\n journey.plots = this.plotService.slicePlotArrayByTime(plots, journey.StartUtc, journey.EndUtc);\r\n\r\n // Color plots\r\n journey.plots.forEach(plot => {\r\n plot.color = journey.lineColor;\r\n });\r\n\r\n this.plotEventService.setJourneyEvents(allJourneyEvents, journey);\r\n\r\n var startEvent: IPlotEvent = null;\r\n var stopEvent: IPlotEvent = null;\r\n\r\n journey.events.forEach(event => {\r\n if (event.label == \"Start\") { startEvent = event; }\r\n if (event.label == \"Stop\") { stopEvent = event; }\r\n \r\n });\r\n\r\n if (!startEvent && journey.plots.length) {\r\n startEvent = this.plotEventService.createJourneyStartStopEvent(journey.plots[0], \"Start\");\r\n startEvent.journey = journey;\r\n\r\n allJourneyEvents.push(startEvent);\r\n journey.events.unshift(startEvent);\r\n }\r\n\r\n if (startEvent && !startEvent.plot?.LocationInformation) {\r\n startEvent.plot.LocationInformation = journey?.StartLocationInformation;\r\n }\r\n\r\n let getPlot = this.$q.resolve();\r\n\r\n if (!stopEvent && !journey.isCurrent) {\r\n getPlot = this.plotService.getPlot(journey.VehicleId, journey.EndPlotId).then(plot => {\r\n stopEvent = this.plotEventService.createJourneyStartStopEvent(plot, \"Stop\");\r\n stopEvent.journey = journey;\r\n\r\n allJourneyEvents.push(stopEvent);\r\n journey.events.push(stopEvent);\r\n });\r\n }\r\n\r\n if (stopEvent && !stopEvent.plot?.LocationInformation) {\r\n stopEvent.plot.LocationInformation = journey?.EndLocationInformation;\r\n }\r\n\r\n journey.DriverId = this.findJourneyDriver(journey.plots);\r\n\r\n if (journey.DriverId) {\r\n journey.driver = this.driverService.getCachedDriver(journey.DriverId);\r\n }\r\n\r\n if (journey.isCurrent && plots.length > 0) {\r\n // Create current position marker for current journey\r\n var latestPlot = plots[plots.length - 1];\r\n if (latestPlot.Reason !== ReasonCode.IgnitionOn) {\r\n const marker = this.googleMarkerService.createEventMarker(\r\n latestPlot,\r\n {\r\n label: this.translationService.t(\"journeyService.currentPosition\"),\r\n markerClass: \"marker-event-current-position\",\r\n subIcon: \"directions_car\",\r\n showLabel: true,\r\n eventType: EventMarkerType.CurrentPosition\r\n });\r\n\r\n if (journey) {\r\n journey.events = journey.events || [];\r\n journey.events.push(marker);\r\n }\r\n }\r\n\r\n journey.DistanceKm = journey.DistanceKm ?? journey.Distance;\r\n }\r\n\r\n return getPlot;\r\n }\r\n\r\n colorJourney(journey: IJourney, index: number) {\r\n journey.indexColor = this.colourService.getColourIndex(index, true);\r\n journey.lineColor = this.colourService.getColour(index, true).solidColour;\r\n }\r\n\r\n private createLatLngsForPlots(plots: IPlot[]): google.maps.LatLng[] {\r\n const path: google.maps.LatLng[] = [];\r\n\r\n for (let i = 0; i < plots.length; i++) {\r\n const plot = plots[i];\r\n\r\n // Ignore these plot types\r\n if (//plot.Reason === ReasonCode.IgnitionOn ||\r\n //plot.Reason === ReasonCode.IgnitionOff ||\r\n //plot.Reason === ReasonCode.FmsEngineOn ||\r\n //plot.Reason === ReasonCode.FmsEngineOff ||\r\n //plot.Reason === ReasonCode.TravelSend ||\r\n plot.Reason === ReasonCode.Wakeup) {\r\n continue;\r\n }\r\n\r\n path.push(new google.maps.LatLng(plot.Latitude, plot.Longitude));\r\n }\r\n\r\n return path;\r\n }\r\n\r\n private randomNumber(min: number, max: number) {\r\n return Math.floor(Math.random() * (max - min + 1) + min);\r\n }\r\n\r\n checkIfJourneysInMapBounds(veriMap: IVeriMapComponent, journeys: IJourney[], filterOutStartMinute: number = null, filterOutEndMinute: number = null): void {\r\n if (!veriMap || !veriMap?.mapInitialised) {\r\n return;\r\n }\r\n\r\n const mapBounds: google.maps.LatLngBounds = veriMap.getMap().getBounds();\r\n\r\n journeys.forEach(journey => {\r\n journey.visibleInBounds = false;\r\n\r\n if (!journey.LinePoints) {\r\n return;\r\n }\r\n\r\n for (var i = 0; i < journey.LinePoints.length; i++) {\r\n const point = journey.LinePoints[i];\r\n\r\n if (mapBounds.contains(new google.maps.LatLng(point[0], point[1]))) {\r\n journey.visibleInBounds = (filterOutStartMinute && filterOutEndMinute) ? (filterOutStartMinute < filterOutEndMinute) : true;\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n\r\n sortJourneysByInMapBounds(journeys: IJourney[]): void {\r\n if (journeys?.length > 0) {\r\n journeys.sort((journey1, journey2) => (journey1.visibleInBounds === journey2.visibleInBounds) ? 0 : journey1.visibleInBounds ? -1 : 1);\r\n }\r\n }\r\n\r\n sortJourneysByStartTime(journeys: IJourney[]): void {\r\n if (journeys?.length > 0) {\r\n journeys.sort((journey1, journey2) => this.veriDate.sort(journey1.StartUtc, journey2.StartUtc, SortDirection.Ascending));\r\n }\r\n }\r\n\r\n filterJourneysByTime(journeys: IJourney[], minuteBufferEitherSide: number = 0, filterOutStartMinute: number, filterOutEndMinute: number): IJourney[] {\r\n if (!journeys) {\r\n return;\r\n }\r\n\r\n const timeFilterFromMinutes: number = filterOutStartMinute - minuteBufferEitherSide;\r\n const timeFilterEndMinutes: number = filterOutEndMinute + minuteBufferEitherSide;\r\n\r\n return journeys.filter(journey => {\r\n const startMoment: moment.Moment = this.veriDate.createMoment(journey.StartUtc);\r\n const endMoment: moment.Moment = this.veriDate.createMoment(journey.EndUtc);\r\n\r\n const startMinuteOfDay: number = (startMoment.hour() * 60) + startMoment.minute();\r\n const endMinuteOfDay: number = (endMoment.hour() * 60) + endMoment.minute();\r\n\r\n return startMinuteOfDay < timeFilterEndMinutes && endMinuteOfDay > timeFilterFromMinutes;\r\n });\r\n }\r\n\r\n attachSensorDataToPlots(plots: IPlot[], sensorsData: ISensorData[]) {\r\n plots.forEach((plot) => {\r\n const sensorData = sensorsData.find((sensorData) => sensorData.PlotId === plot.Id);\r\n if (sensorData) { plot.SensorData = sensorData }\r\n });\r\n }\r\n\r\n private getLastJourneyEndUtcDate(journeys: IJourney[]): Date {\r\n if (!journeys?.length) {\r\n return;\r\n }\r\n\r\n const endUtc = journeys[journeys.length - 1].EndUtc;\r\n\r\n if (!endUtc) {\r\n return;\r\n }\r\n\r\n return this.veriDate.createMoment(endUtc).toDate();\r\n }\r\n}\r\n","import { ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, TemplateRef, ViewChild } from \"@angular/core\";\r\nimport { VButtonComponent } from \"@directives/_core/v-button/v-button.component\";\r\nimport \"./v-button-dropdown.component.scss\";\r\n\r\n@Component({\r\n selector: \"v-button-dropdown\",\r\n template: require(\"./v-button-dropdown.component.html\")\r\n})\r\nexport class VButtonDropdownComponent extends VButtonComponent {\r\n\r\n @Input() label: string = \"Custom Filter\";\r\n @Input() autoSize: boolean;\r\n @Input() showMask: boolean;\r\n @Input() template: TemplateRef;\r\n\r\n @Output() close = new EventEmitter();\r\n\r\n @ViewChild(\"itemFilterButton\", { read: ElementRef }) itemFilterButtonRef: ElementRef;\r\n\r\n // ---\r\n\r\n constructor(\r\n cd: ChangeDetectorRef,\r\n elementRef: ElementRef) {\r\n super(cd, elementRef);\r\n }\r\n\r\n toggleDropdown() {\r\n this.showDropDown = !this.showDropDown;\r\n }\r\n\r\n closeDropdown() {\r\n this.showDropDown == false;\r\n this.close.emit();\r\n }\r\n\r\n onItemClicked() {\r\n this.showDropDown = false;\r\n }\r\n}\r\n","import { Provider, Type } from \"@angular/core\";\r\nimport { NG_VALIDATORS, NG_VALUE_ACCESSOR } from \"@angular/forms\";\r\n\r\nexport class ComponentUtility {\r\n static createValueAccessorProvider(type: Type): Provider {\r\n return {\r\n provide: NG_VALUE_ACCESSOR,\r\n multi: true,\r\n useExisting: type\r\n };\r\n }\r\n\r\n static createValidatorProvider(type: Type): Provider {\r\n return {\r\n provide: NG_VALIDATORS,\r\n multi: true,\r\n useExisting: type\r\n };\r\n }\r\n}\r\n","import { Component, ElementRef, Input, OnChanges, Renderer2, SimpleChanges } from \"@angular/core\";\r\nimport './v-progress-bar.component.scss';\r\n\r\nexport enum ProgressColourPalette {\r\n Greyscale,\r\n GreenOnly,\r\n RAG\r\n}\r\n\r\nexport interface IProgressBarColourRules {\r\n GreenZoneStart: number,\r\n YellowZoneStart: number\r\n}\r\n\r\nconst defaultColourRules: IProgressBarColourRules = {\r\n GreenZoneStart: 50,\r\n YellowZoneStart: 25\r\n};\r\n\r\n@Component({\r\n selector: 'v-progress-bar',\r\n template: require('./v-progress-bar.component.html')\r\n})\r\nexport class VProgressBar implements OnChanges {\r\n\r\n @Input() percentage: number;\r\n @Input() total: number;\r\n @Input() count: number;\r\n @Input() subject: string;\r\n\r\n @Input() roundNumber: boolean = true;\r\n @Input() showLabel = true;\r\n @Input() grayscale: boolean;\r\n @Input() palette = ProgressColourPalette.GreenOnly;\r\n @Input() colourRules: IProgressBarColourRules = defaultColourRules;\r\n\r\n // ---\r\n\r\n classesAdded: string[];\r\n roundTo: string = '1.0-1';\r\n\r\n constructor(private elementRef: ElementRef, private renderer: Renderer2) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.render();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n\r\n if (changes[\"percentage\"] || changes[\"count\"]) {\r\n this.render();\r\n }\r\n\r\n if (changes[\"grayscale\"]) {\r\n this.updateClasses();\r\n }\r\n\r\n if (changes[\"roundNumber\"]) {\r\n this.setRounding();\r\n }\r\n }\r\n\r\n get showPercentage(): boolean {\r\n return (this.percentage || this.percentage == 0) && (!this.count && this.count !== 0);\r\n }\r\n\r\n // ---\r\n\r\n private render(): void {\r\n if ((this.count || this.count === 0) && (this.total || this.total === 0)) {\r\n this.percentage = this.count / this.total * 100;\r\n }\r\n if (!this.percentage) {\r\n return;\r\n }\r\n\r\n this.validateProgress();\r\n this.updateProgressBar();\r\n this.updateClasses();\r\n\r\n }\r\n\r\n private validateProgress() {\r\n\r\n if (isNaN(this.percentage) || typeof this.percentage != \"number\") {\r\n this.percentage = 0;\r\n }\r\n\r\n if (this.percentage < 0) {\r\n this.percentage = 0;\r\n }\r\n\r\n if (this.percentage > 100) {\r\n this.percentage = 100;\r\n }\r\n }\r\n\r\n private updateProgressBar() {\r\n const htmlElement = this.elementRef.nativeElement as HTMLElement;\r\n htmlElement.style.setProperty(\"--progress\", this.percentage + \"%\");\r\n }\r\n\r\n private updateClasses() {\r\n\r\n this.classesAdded?.forEach(classAdded => this.renderer.removeClass(this.elementRef.nativeElement, classAdded));\r\n\r\n this.classesAdded = [this.getClassNameForPercentage()];\r\n\r\n if (this.grayscale) {\r\n this.classesAdded.push(\"grayscale\");\r\n }\r\n\r\n this.classesAdded.forEach(classAdded => this.renderer.addClass(this.elementRef.nativeElement, classAdded));\r\n }\r\n\r\n private getClassNameForPercentage(): string {\r\n let className = \"\";\r\n\r\n switch (this.palette) {\r\n case ProgressColourPalette.GreenOnly:\r\n className += \"ok\";\r\n break;\r\n\r\n case ProgressColourPalette.RAG:\r\n className += this.getRAGClass();\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n\r\n return className;\r\n }\r\n\r\n private getRAGClass(): string {\r\n\r\n switch (true) {\r\n case this.percentage >= this.colourRules.GreenZoneStart:\r\n return \"ok\";\r\n case this.percentage >= this.colourRules.YellowZoneStart:\r\n return \"warning\";\r\n default:\r\n return \"error\";\r\n }\r\n }\r\n\r\n private setRounding(): void {\r\n this.roundTo = this.roundNumber ? '1.0-0' : '1.0-1';\r\n }\r\n}\r\n","export class TmsModuleNavigation {\r\n static get ActiveRoutes(): string { return 'app.tms.activeRoutes'; }\r\n static get Dashboard(): string { return 'app.tms.dashboard'; }\r\n static get ArrivalsBoard(): string { return 'app.tms.arrivalsBoard'; }\r\n static get History(): string { return 'app.tms.history'; }\r\n static get Scheduling(): string { return `app.tms.scheduling`; }\r\n static get EditSchedule(): string { return `${TmsModuleNavigation.Scheduling}.edit`; }\r\n static get NewSchedule(): string { return `${TmsModuleNavigation.Scheduling}.new`; }\r\n static get ImportSchedule(): string { return `${TmsModuleNavigation.Scheduling}.import`; }\r\n static get ScheduleView(): string { return `${TmsModuleNavigation.Scheduling}.view`; }\r\n static get RoutePerformance(): string { return 'app.tms.routeperformance'; }\r\n static get VisitPerformance(): string { return 'app.tms.visitperformance'; }\r\n\r\n static get Default(): string { return TmsModuleNavigation.Dashboard; }\r\n static get ParentRoot(): string { return \"app.tms\"; }\r\n}\r\n","import { IPlot } from \"@interfaces/IPlot\";\r\nimport { IRunBlockRootScope } from \"@interfaces/IRunBlockRootScope\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { ReasonCode } from \"../enum/ReasonCode\";\r\nimport { UnitConversionService, UnitConversionType } from \"./unitConversion.service\";\r\nimport { VeriDate } from \"./veriDate.service\";\r\n\r\nexport class ReasonCodeService {\r\n\r\n static $inject = [\"$rootScope\", \"unitConversionService\", \"veriDate\", \"translationService\"];\r\n\r\n constructor(\n private $rootScope: IRunBlockRootScope,\n private readonly unitConversionService: UnitConversionService,\n private readonly veriDate: VeriDate,\n private readonly translationService: TranslationService) {\r\n this.createStylesForReasonCodes();\r\n\n //setTimeout(() => {\n // for (let item in ReasonCode) {\r\n // if (!isNaN(Number(item))) {\r\n // console.log(\"ReasonCode\", item, this.getReasonCodeLabel(item as any));\r\n // }\r\n // }\n //}, 2000);\r\n }\r\n\r\n getReasonCodeLabel(reasonCode: ReasonCode): string {\r\n if (!reasonCode || !ReasonCode[reasonCode]) {\n return \"\";\r\n }\n\r\n var reasonCodeLabel = this.translationService.tEnum(ReasonCode, \"ReasonCode\", reasonCode);\r\n\r\n // This is stolen from splitPascalCase.filter, should be in a service?\r\n return reasonCodeLabel.replace(/([A-Z][a-z])/g, \" $1\").replace(/(\\d)/g, \" $1\").trim();\r\n }\n\n createStatusText(plot: IPlot): string {\n if (!plot) {\n return \"\";\n }\n\n if (this.isTravelling(plot.Reason)) {\n if (plot.Velocity > 0) {\n return this.unitConversionService.convertUnitWithSuffix(plot.Velocity, UnitConversionType.Speed).toString();\n }\n }\n\n return this.translationService.t('reasonCodeService.stoppped');\n }\r\n\r\n isTravelling(reasonCode: ReasonCode): boolean {\r\n switch (reasonCode) {\r\n case ReasonCode.Wakeup:\r\n case ReasonCode.IgnitionOff:\r\n case ReasonCode.Unknown:\r\n return false;\r\n\r\n default:\r\n return true;\r\n }\r\n }\r\n\r\n isIgnitionOn(reasonCode: ReasonCode): boolean {\n if (!reasonCode) {\n return false;\r\n }\n\r\n switch (reasonCode) {\r\n case ReasonCode.IgnitionOff:\r\n case ReasonCode.Wakeup:\n return false;\r\n\r\n default:\r\n return true;\r\n }\r\n }\r\n\r\n getBackgroundColor(reasonCode: ReasonCode): string {\r\n\r\n switch (reasonCode) {\r\n case ReasonCode.Wakeup:\r\n return \"#6e6e6e\";\r\n\r\n case ReasonCode.IgnitionOn:\r\n return \"#00ea1c\";\r\n\r\n case ReasonCode.IgnitionOff:\r\n return \"#FF4136\";\r\n return \"#ef0403\"; // Previous colour\r\n\r\n // PTO\r\n case ReasonCode.Telematics:\r\n return \"rgb(228,139,84)\";\r\n\r\n case ReasonCode.JbusIgnitionOn:\r\n case ReasonCode.JbusIgnitionOff:\r\n case ReasonCode.JbusTimed:\r\n case ReasonCode.Fms:\r\n case ReasonCode.FmsEngineOn:\r\n case ReasonCode.FmsEngineOff:\r\n return \"#0295a7\";\r\n\r\n case ReasonCode.Accelerometer:\r\n case ReasonCode.Incident:\r\n case ReasonCode.IncidentAccelerometer:\r\n case ReasonCode.IncidentGPS:\r\n return \"#add8e6\";\r\n\r\n case ReasonCode.Crossing:\r\n return \"#800080\";\r\n\r\n case ReasonCode.Unknown:\r\n return \"#c2c2c2\";\r\n\r\n default: // ReasonCode.TravelSend\r\n return \"#FFDC00\";\r\n return \"#ffff00\";//\"#cccccc\"; // previous colour\r\n }\r\n }\r\n\r\n getForegroundColor(reasonCode: ReasonCode) {\r\n\r\n const lightForegroundColour = \"#eeeeee\";\r\n const darkForegroundColour = \"rgba(0,0,0,0.87)\";\r\n\r\n const backgroundColour = this.getBackgroundColor(reasonCode);\r\n const foregroundColour = this.isHexColorDark(backgroundColour)\r\n ? lightForegroundColour\r\n : darkForegroundColour;\r\n\r\n return foregroundColour;\r\n }\r\n\r\n // -------------------------\r\n\r\n private createStylesForReasonCodes() {\r\n\r\n // Create styles\r\n this.$rootScope.runtimeStyles = this.$rootScope.runtimeStyles || \"\";\r\n\r\n for (let reasonCodeLabel in ReasonCode) {\r\n // Ensure we only get the string properties - see http://stackoverflow.com/a/30654325/94278\r\n if (ReasonCode.hasOwnProperty(reasonCodeLabel) && !/^\\d+$/.test(reasonCodeLabel)) {\r\n\r\n const reasonCode = parseInt(ReasonCode[reasonCodeLabel]) as ReasonCode;\r\n\r\n const backgroundColour = this.getBackgroundColor(reasonCode);\r\n const foregroundColour = this.getForegroundColor(reasonCode);\r\n\r\n this.$rootScope.runtimeStyles += `.rc-${reasonCode}-background{background-color:${backgroundColour}!important;}`;\r\n this.$rootScope.runtimeStyles += `.rc-${reasonCode}-foreground{color:${backgroundColour}!important;}`;\r\n this.$rootScope.runtimeStyles += `.rc-${reasonCode}-text-contrast{color:${foregroundColour}!important;}`;\r\n }\r\n }\r\n }\r\n\r\n private isHexColorDark(color: string) {\r\n if (color.indexOf(\"#\") === 0) {\r\n color = color.substring(1); // strip #\r\n }\r\n\r\n const rgb = parseInt(color, 16); // convert rrggbb to decimal\r\n const r = (rgb >> 16) & 0xff; // extract red\r\n const g = (rgb >> 8) & 0xff; // extract green\r\n const b = (rgb >> 0) & 0xff; // extract blue\r\n\r\n const luma = 0.2126 * r + 0.7152 * g + 0.0722 * b; // per ITU-R BT.709\r\n\r\n if (luma < 120) {\r\n // pick a different colour\r\n return true;\r\n }\r\n else {\r\n return false;\r\n }\r\n }\r\n}\r\n","\r\nimport { IDriver } from \"@interfaces/IDriver\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { IVehicleDriverMapping } from \"@interfaces/IVehicleDriverMapping\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport * as angular from \"angular\";\r\nimport \"angular-material\";\r\nimport * as moment from \"moment\";\r\nimport { DriverAssignmentSource } from \"../enum/DriverAssignmentSource.enum\";\r\nimport { CacheService } from \"./cache.Service\";\r\nimport { DriverService } from \"./driver.service\";\r\nimport { TagsService } from \"./tags.service\";\r\nimport { IGetVehicleOptions, VehicleService } from \"./vehicle.service\";\r\nimport { VeriDate } from \"./veriDate.service\";\r\n\r\nexport class DriverAssignmentService {\r\n\r\n private driverAssignmentCacheName = \"activeDriverAssignmentCacheName\"\r\n\r\n private permanentEndDate = moment(new Date(2200, 0, 1));\r\n\r\n static $inject = [\"$q\", \"$http\", \"driverService\", \"vehicleService\", \"tagsService\", \"veriDate\", \"translationService\", \"cacheService\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $http: angular.IHttpService,\r\n private readonly driverService: DriverService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly tagsService: TagsService,\r\n private readonly veriDate: VeriDate,\r\n private readonly translationService: TranslationService,\r\n private readonly cacheService: CacheService\r\n ) {\r\n this.cacheService.createCache(this.driverAssignmentCacheName, { maxAge: 30 * 60 * 1000 });\r\n }\r\n\r\n getSourceString(assignmentSource: DriverAssignmentSource) {\r\n switch (assignmentSource) {\r\n case DriverAssignmentSource.DigiDl:\r\n return this.translationService.t(\"driverAssignmentService.tachoDigiDl\");\r\n\r\n case DriverAssignmentSource.Unit:\r\n return this.translationService.t(\"driverAssignmentService.tachoKline\");\r\n\r\n case DriverAssignmentSource.ButtonPress:\r\n return this.translationService.t(\"driverAssignmentService.buttonPress\");\r\n\r\n case DriverAssignmentSource.ManualAssignment:\r\n return this.translationService.t(\"driverAssignmentService.manual\");\r\n }\r\n\r\n return this.translationService.t(\"driverAssignmentService.unknown\");\r\n }\r\n\r\n getVehiclesWithDrivers(options?: IGetVehicleOptions): angular.IPromise {\r\n\r\n const vehiclePromise = this.vehicleService.getVehicles(options);\r\n const driversPromise = this.driverService.getDrivers({ invalidateCache: options?.invalidateCache });\r\n const assignmentPromise = this.getDriverAssignments(true, options?.invalidateCache);\r\n\r\n return this.$q\r\n .all([vehiclePromise, driversPromise, assignmentPromise])\r\n .then(([vehicles, drivers, assignments]) => {\r\n this.mapDriversToVehicles(drivers, assignments, vehicles);\r\n return vehicles;\r\n });\r\n }\r\n\r\n getDriversWithVehicles(): angular.IPromise {\r\n\r\n const vehiclePromise = this.vehicleService.getVehicles({ includePeripheralMappings: true });\r\n const driversPromise = this.driverService.getDrivers();\r\n const assignmentPromise = this.getDriverAssignments(true);\r\n\r\n return this.$q\r\n .all([vehiclePromise, driversPromise, assignmentPromise])\r\n .then(([vehicles, drivers, assignments]) => {\r\n this.mapDriversToVehicles(drivers, assignments, vehicles);\r\n\r\n return drivers;\r\n });\r\n }\r\n\r\n\r\n getDriverAssignments(activeOnly: boolean, invalidateCache = false): angular.IPromise {\r\n return this.cacheService.getOrRetrieveData(this.driverAssignmentCacheName, () => this.getDriverAssignmentsFromDB(), invalidateCache).then(assignments => {\r\n if (activeOnly) {\r\n assignments = assignments.filter(mapping => this.veriDate.createMoment(mapping.EndUtc).isAfter(this.veriDate.createMoment(new Date())));\r\n }\r\n\r\n return assignments;\r\n });\r\n }\r\n\r\n getDriverAssignmentsFromDB(): angular.IPromise {\r\n return this\r\n .$http({\r\n url: \"/api/driverassignment/latest\",\r\n method: \"GET\",\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => response.data);\r\n }\r\n\r\n getActiveAssignmentsForVehicleFromDB(vehicleId: number): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/driverassignment/vehicles/${vehicleId}/active`,\r\n method: \"GET\",\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => response.data);\r\n }\r\n\r\n getDriverAssignmentsByDriverForTimeRange(driverId: number, from: moment.Moment, to: moment.Moment): angular.IPromise {\r\n let url = `/api/driverassignment/driver/${driverId}?from=${from.toISOString()}&to=${to.toISOString()}`;\r\n\r\n return this\r\n .$http({\r\n url: url,\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 10 }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getAssignmentByDriverForTime(driverId: number, time: moment.Moment, logging = false): angular.IPromise {\r\n\r\n let url = `/api/driverassignment/driver/${driverId}?from=${time.toISOString()}`;\r\n\r\n var driverSpecificAssignmentsPromise = this\r\n .$http({\r\n url: url,\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 60 }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n\r\n var vehiclePromise = this.vehicleService.getVehicles({ includePeripheralMappings: true });\r\n\r\n return this.$q\r\n .all([vehiclePromise, driverSpecificAssignmentsPromise])\r\n .then(([vehicles, driverAssignments]) => {\r\n\r\n if (logging) {\r\n console.log(driverAssignments);\r\n }\r\n\r\n const mapping = this.findAssignmentByDriverForTime(driverId, time, driverAssignments);\r\n\r\n if (!mapping) {\r\n return null;\r\n }\r\n\r\n return this.vehicleService.findVehicle(vehicles, mapping.VehicleId);\r\n });\r\n }\r\n\r\n getIntersectingAssignmentsByVehicle(vehicleId: number, start: moment.Moment, end: moment.Moment) {\r\n const url = `/api/driverassignment/vehicle/${vehicleId}/intersecting`;\r\n\r\n return this\r\n .$http({\r\n url: url,\r\n method: \"GET\",\r\n cache: true,\r\n params: {\r\n minsToLive: 60,\r\n start: start.toISOString(),\r\n end: end.toISOString()\r\n }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n this.formatAssignments(response.data);\r\n\r\n return response.data;\r\n });\r\n\r\n }\r\n\r\n getAssignmentsByVehicleForTime(vehicleId: number, time?: moment.Moment): angular.IPromise {\r\n\r\n let url = `/api/driverassignment/vehicle/${vehicleId}`;\r\n if (time && !moment.isMoment(time)) {\r\n time = moment(time);\r\n }\r\n\r\n if (time) {\r\n url += `?time=${time.toISOString()}`;\r\n }\r\n\r\n return this\r\n .$http({\r\n url: url,\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 60 }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n\r\n this.formatAssignments(response.data);\r\n\r\n return response.data;\r\n });\r\n }\r\n\r\n getVehicleDriverAssignmentsForDateRange(vehicleId: number, start: moment.Moment, end: moment.Moment): angular.IPromise {\r\n\r\n return this\r\n .getAssignmentsByVehicleForTime(vehicleId, null)\r\n .then((assignments) => {\r\n const filteredAssignments: IVehicleDriverMapping[] = [];\r\n\r\n if (assignments) {\r\n for (let i = 0; i < assignments.length; i++) {\r\n const assignment = assignments[i];\r\n\r\n // Check for overlap\r\n var overlapped = assignment.StartUtc.isSameOrBefore(end) && assignment.EndUtc.isSameOrAfter(start);\r\n\r\n if (overlapped) {\r\n filteredAssignments.push(assignment);\r\n }\r\n }\r\n }\r\n\r\n return filteredAssignments;\r\n });\r\n }\r\n\r\n getIntersectingDriverAssignmentsForVehicle(vehicleId: number, start: moment.Moment, end: moment.Moment): angular.IPromise<[IDriver[], IVehicleDriverMapping[]]> {\r\n\r\n const driversPromise = this.driverService.getDrivers();\r\n const vehicleSpecificAssignmentsPromise = this.getIntersectingAssignmentsByVehicle(vehicleId, start, end);\r\n\r\n return this.$q.all([driversPromise, vehicleSpecificAssignmentsPromise]);\r\n }\r\n\r\n getDriverAssignmentsForVehicle(vehicleId: number, time?: moment.Moment): angular.IPromise<[IDriver[], IVehicleDriverMapping[]]> {\r\n\r\n const driversPromise = this.driverService.getDrivers();\r\n const vehicleSpecificAssignmentsPromise = this.getAssignmentsByVehicleForTime(vehicleId, time);\r\n\r\n return this.$q.all([driversPromise, vehicleSpecificAssignmentsPromise]);\r\n }\r\n\r\n getDriverAssignmentForTime(vehicleId: number, time: moment.Moment | string | Date): angular.IPromise {\r\n let timeMoment = this.veriDate.createMoment(time);\r\n\r\n return this.getDriverAssignmentsForVehicle(vehicleId, timeMoment)\r\n .then(([drivers, vehicleAssignments/*, allAssignments*/]) => {\r\n const mapping = this.findAssignmentByVehicleForTime(vehicleId, timeMoment, vehicleAssignments);\r\n\r\n if (!mapping) {\r\n return null;\r\n }\r\n\r\n return this.driverService.findDriver(drivers, mapping.DriverId);\r\n });\r\n }\r\n\r\n saveDriverAssignment(driverAssignment: IVehicleDriverMapping): angular.IPromise {\r\n\r\n const promise = this.$http(\r\n {\r\n method: \"POST\",\r\n url: \"/api/driverassignment\",\r\n data: driverAssignment\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n\r\n this.cacheService.addOrUpdateItem(this.driverAssignmentCacheName, driverAssignment, (i1, i2) => i1.Id == i2.Id);\r\n\r\n return result;\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n endDriverAssignment(driverAssignment: IVehicleDriverMapping): angular.IPromise {\r\n\r\n var promise = this.$http(\r\n {\r\n method: \"POST\",\r\n url: \"/api/driverassignment/endassignment\",\r\n data: driverAssignment\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n // since it's an active assignments cache - ended assignment must be deleted\r\n this.cacheService.deleteItem(this.driverAssignmentCacheName, driverAssignment, (i1, i2) => i1.Id == i2.Id);\r\n\r\n return result;\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n updateDriver(driver: IDriver) {\r\n\r\n const promise = this.$http(\r\n {\r\n method: \"POST\",\r\n url: \"/api/drivers\",\r\n data: driver\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n mapDriversToVehicles(drivers: IDriver[], mappings: IVehicleDriverMapping[], vehicles: IVehicle[]) {\r\n for (let mappingIndex = 0; mappingIndex < mappings.length; mappingIndex++) {\r\n\r\n const mapping = mappings[mappingIndex];\r\n\r\n const driver = drivers.find(driver => driver.Id == mapping.DriverId);\r\n const vehicle = vehicles.find(vehicle => vehicle.Id == mapping.VehicleId);\r\n\r\n if (driver) {\r\n if (!driver.VehicleDriverMapping) {\r\n driver.VehicleDriverMapping = [];\r\n }\r\n\r\n driver.VehicleDriverMapping.push(mapping);\r\n\r\n if (vehicle) {\r\n vehicle.Driver = driver;\r\n driver.vehicle = vehicle;\r\n }\r\n }\r\n\r\n if (vehicle && !driver) {\r\n vehicle.unkownDriver = true;\r\n }\r\n }\r\n }\r\n\r\n findAssignmentByDriverId(mappings: IVehicleDriverMapping[], driverId: number): IVehicleDriverMapping {\r\n for (let i = 0; i < mappings.length; i++) {\r\n const mapping = mappings[i];\r\n\r\n if (mapping.DriverId === driverId) {\r\n return mapping;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n findAssignmentByVehicleId(mappings: IVehicleDriverMapping[], vehicleId: number): IVehicleDriverMapping {\r\n for (let i = 0; i < mappings.length; i++) {\r\n const mapping = mappings[i];\r\n\r\n if (mapping.VehicleId === vehicleId) {\r\n return mapping;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n findAssignmentByVehicleForTime(vehicleId: number, time: moment.Moment, assignments: IVehicleDriverMapping[]): IVehicleDriverMapping {\r\n if (assignments) {\r\n for (let i = 0; i < assignments.length; i++) {\r\n const assignment = assignments[i];\r\n\r\n if (assignment.VehicleId == vehicleId && time && time.isSameOrAfter(assignment.StartUtc) && time.isSameOrBefore(assignment.EndUtc)) {\r\n return assignment;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n findAssignmentByDriverForTime(driverId: number, time: moment.Moment, assignments: IVehicleDriverMapping[]): IVehicleDriverMapping {\r\n if (assignments) {\r\n for (let i = 0; i < assignments.length; i++) {\r\n const assignment = assignments[i];\r\n\r\n if (assignment.DriverId == driverId && time && time.isSameOrAfter(assignment.StartUtc) && time.isSameOrBefore(assignment.EndUtc)) {\r\n return assignment;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n getAssignmentPermanentDate(safe = true): moment.Moment {\r\n\r\n // Little performance improvement if we dont need to be safe\r\n if (!safe) {\r\n return this.permanentEndDate;\r\n }\r\n\r\n return this.permanentEndDate.clone();\r\n }\r\n\r\n assignmentsAreSame(currentAssignment: IVehicleDriverMapping, currentAssignmentCopy: IVehicleDriverMapping): boolean {\r\n\r\n if (currentAssignment == currentAssignmentCopy) {\r\n return true;\r\n }\r\n\r\n if (currentAssignment && !currentAssignmentCopy || !currentAssignment && currentAssignmentCopy) {\r\n return false;\r\n }\r\n\r\n if (currentAssignment.DriverId != currentAssignmentCopy.DriverId) {\r\n return false;\r\n }\r\n\r\n if (currentAssignment.VehicleId != currentAssignmentCopy.VehicleId) {\r\n return false;\r\n }\r\n\r\n if (currentAssignment.AssignmentSource != currentAssignmentCopy.AssignmentSource) {\r\n return false;\r\n }\r\n\r\n if (!moment(currentAssignment.StartUtc).isSame(currentAssignmentCopy.StartUtc)) {\r\n return false;\r\n }\r\n\r\n if (!moment(currentAssignment.EndUtc).isSame(currentAssignmentCopy.EndUtc)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n assignmentIsPermanent(mapping: IVehicleDriverMapping): boolean {\r\n if (!mapping) {\r\n return false;\r\n }\r\n\r\n return moment(mapping.EndUtc).isSame(this.getAssignmentPermanentDate(false), \"d\");\r\n }\r\n\r\n getAssignmentEndLabel(mapping: IVehicleDriverMapping): string {\r\n if (!mapping) {\r\n return \"\";\r\n }\r\n\r\n if (this.assignmentIsPermanent(mapping)) {\r\n return this.translationService.t(\"driverAssignmentService.noEndDate\");\r\n }\r\n\r\n return this.veriDate.formatDate(mapping.EndUtc, \"date\");\r\n }\r\n\r\n // ---\r\n\r\n private formatAssignments(assignments: IVehicleDriverMapping[]) {\r\n assignments.forEach(assignment => {\r\n assignment.StartUtc = moment(assignment.StartUtc);\r\n assignment.EndUtc = moment(assignment.EndUtc);\r\n });\r\n }\r\n}\r\n","export enum VideoStreamType {\r\n Main,\r\n Sub\r\n}\r\n","import { ITag } from \"@app/interfaces/ITag\";\r\nimport { VeriSearchBoxComponent } from \"@directives/_veri/veriSearchBox/veriSearchBox.directive\";\r\nimport { ResourceType } from \"@enums/ResourceType\";\r\nimport { SortDirection } from \"@enums/SortDirection\";\r\nimport { SortType } from \"@enums/SortType\";\r\nimport { IComboBox } from \"@interfaces/IComboBox\";\r\nimport { IDriver } from \"@interfaces/IDriver\";\r\nimport { IGeofence } from \"@interfaces/IGeofences\";\r\nimport { IUser } from \"@interfaces/IUser\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { IGroup } from \"@interfaces/IVehicleGroup\";\r\nimport { IGroupFilter } from \"@interfaces/filters/IGroupFilter\";\r\nimport { ITagFilter } from \"@interfaces/filters/ITagFilter\";\r\nimport { ChartType } from \"@services/charts.service\";\r\nimport { ConstantsService } from \"@services/constantsService\";\r\nimport { GroupService } from \"@services/group.service.ajs\";\r\nimport { HTMLService } from \"@services/htmlService.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport * as angular from \"angular\";\r\nimport { IVeriPillNavLabel } from \"../veriSimpleNav/veriSimpleNav.component\";\r\nimport \"./veriTable.scss\";\r\nimport { IVeriTableContainer } from \"./veriTableContainer/veriTableContainer.component\";\r\n\r\nexport enum VeriTableRowStatus {\r\n OK,\r\n OkDash,\r\n OkChecked,\r\n Warning,\r\n Error\r\n}\r\n\r\nexport interface IVeriTableHeader {\r\n id?: string;\r\n title?: string;\r\n width?: number;\r\n className?: string;\r\n sortable?: boolean;\r\n excludeFromSearch?: boolean;\r\n sortType?: SortType;\r\n alignRight?: boolean;\r\n sortDirection?: SortDirection;\r\n templateUrl?: string;\r\n template?: string;\r\n hide?: boolean;\r\n excludeFromExport?: boolean;\r\n\r\n hideOnMobile?: boolean;\r\n hideIfNoData?: boolean;\r\n includeInSummary?: boolean;\r\n\r\n graphOptions?: IVeriTableCellGraphOptions;\r\n}\r\n\r\nexport interface IVeriTableCellGraphOptions {\r\n show: boolean;\r\n chartType: ChartType;\r\n\r\n groupBy?: string | IVeriTableHeader | number;\r\n maxSeries?: number;\r\n\r\n title?: string;\r\n\r\n toggleShowGraph?: () => void;\r\n\r\n stacked?: boolean;\r\n dateColumn?: number;\r\n}\r\n\r\nexport interface IVeriTableRow {\r\n cells?: IVeriTableRowCell[];\r\n data?: T;\r\n\r\n searchString?: string;\r\n rowClassName?: string;\r\n\r\n customRowStyle?: string;\r\n\r\n dropDownFilterValues?: number[];\r\n navPillFilterValues?: number[];\r\n\r\n rowWarningStatus?: VeriTableRowStatus;\r\n\r\n title?: string;\r\n\r\n isInGroup?: (data: T, group: IGroup) => boolean;\r\n\r\n children?: IVeriTableRow[];\r\n eventSummaryColour?: string;\r\n}\r\n\r\nexport interface IVeriTableRowCell {\r\n contents?: string;\r\n sortData?: any;\r\n data?: any;\r\n className?: string;\r\n hasNoData?: boolean;\r\n sanitize?: boolean;\r\n\r\n createSearchCallback?: (data: any) => string;\r\n\r\n exportData?: string;\r\n exportDataMethod?: () => angular.IPromise;\r\n excludeFromExport?: boolean;\r\n\r\n header?: IVeriTableHeader;\r\n summaryIcon?: string;\r\n summaryLabel?: string;\r\n summarySubLabel?: string;\r\n summaryColour?: string;\r\n excludeFromSummary?: boolean;\r\n\r\n graphLabel?: string;\r\n showTooltip?: boolean;\r\n}\r\n\r\nexport interface IVeriTableBindings {\r\n headers: IVeriTableHeader[];\r\n rows: IVeriTableRow[];\r\n displayRows: IVeriTableRow[];\r\n\r\n setFilterRows(rows: IVeriTableRow[]);\r\n\r\n loading: boolean;\r\n\r\n highlightSelectedItems: boolean;\r\n selectedItem: any;\r\n selectedItemIdentifier: string;\r\n sortColumn: number;\r\n sortDirection: SortDirection;\r\n\r\n showStatusColumn: boolean;\r\n showSearch: boolean;\r\n showRows: boolean;\r\n graphOptionsAvailable?: boolean;\r\n clickable: boolean;\r\n downloadable: boolean;\r\n withoutGroups: boolean;\r\n\r\n maxRows: number;\r\n searchPlaceholder: string;\r\n searchString: string;\r\n searchBox: VeriSearchBoxComponent;\r\n searchRows: (forceDigest: boolean) => void;\r\n\r\n showTagFilter: boolean;\r\n\r\n showGroupFilter: boolean;\r\n dropDownFilterOptions: IComboBox[];\r\n selectedDropDownFilterOption: number;\r\n\r\n navPillFilterOptions: IVeriPillNavLabel[];\r\n selectedNavPillFilterOption: number;\r\n\r\n exportAsLandscape: boolean;\r\n exportTitle: string;\r\n hideExport: boolean;\r\n\r\n veriTableContainer: IVeriTableContainer;\r\n\r\n lastAvailableDataDate: string;\r\n\r\n allUserGroupIds: number[];\r\n allGeofenceGroupIds: number[];\r\n allVehicleGroupIds: number[];\r\n allDriverGroupIds: number[];\r\n\r\n onGetLastAvailableData: () => void;\r\n onRowsUpdated: (args: { rows: IVeriTableRow[] }) => void;\r\n onRowClicked: (args: { row: IVeriTableRow, $event: MouseEvent }) => void;\r\n onRowRightClicked: (args: { row: IVeriTableRow, $event: MouseEvent }) => void;\r\n onRowHighlighted: (args: { row: IVeriTableRow, $event: MouseEvent }) => void;\r\n}\r\n\r\nclass VeriTableComponentController implements angular.IComponentController, IVeriTableBindings {\r\n\r\n parentVeriTable: IVeriTableBindings;\r\n veriTableContainer: IVeriTableContainer;\r\n\r\n headers: IVeriTableHeader[];\r\n rows: IVeriTableRow[];\r\n\r\n loading: boolean;\r\n\r\n displayRows: IVeriTableRow[];\r\n filterRows: IVeriTableRow[];\r\n\r\n highlightSelectedItems: boolean;\r\n selectedItem: any;\r\n selectedItemIdentifier: string;\r\n selectedItemIndex: number;\r\n ignoreNextSelectedItemChange: boolean;\r\n\r\n highlightedRow: IVeriTableRow;\r\n\r\n maxRows: number;\r\n sortColumn: number;\r\n sortDirection: SortDirection;\r\n\r\n showStatusColumn: boolean;\r\n showRows: boolean;\r\n showSearch: boolean;\r\n clickable: boolean;\r\n downloadable: boolean = true;\r\n withoutGroups: boolean = false;\r\n\r\n searchString: string;\r\n searchBox: VeriSearchBoxComponent;\r\n searchPlaceholder: string;\r\n\r\n showTagFilter: boolean;\r\n showGraphOptions: boolean;\r\n showGroupFilter: boolean;\r\n selectedGroupRowCount: number;\r\n\r\n dropDownFilterOptions: IComboBox[];\r\n selectedDropDownFilterOption: number;\r\n\r\n navPillFilterOptions: IVeriPillNavLabel[];\r\n selectedNavPillFilterOption: number;\r\n\r\n showResourceFilter: boolean;\r\n hasEmptyState: boolean;\r\n\r\n tagResourceType: string;\r\n\r\n resourceCount: number;\r\n\r\n exportAsLandscape: boolean;\r\n exportTitle: string;\r\n hideExport: boolean;\r\n\r\n lastAvailableDataDate: string;\r\n\r\n showCompactFilters: boolean = false;\r\n\r\n allUserGroupIds: number[];\r\n allGeofenceGroupIds: number[];\r\n allVehicleGroupIds: number[];\r\n allDriverGroupIds: number[];\r\n\r\n\r\n onGetLastAvailableData: () => void;\r\n onRowsUpdated: (args: { rows: IVeriTableRow[] }) => void;\r\n onRowClicked: (args: { row: IVeriTableRow, $event: MouseEvent }) => void;\r\n onRowRightClicked: (args: { row: IVeriTableRow, $event: MouseEvent }) => void;\r\n onRowHighlighted: (args: { row: IVeriTableRow, $event: MouseEvent }) => void;\r\n\r\n // ----\r\n\r\n private rowType: ResourceType;\r\n private selectedGroup: IGroup;\r\n private selectedTag: ITag;\r\n private hasPreparedRowsForSearchAndSort = false;\r\n\r\n static $inject = [\"$scope\", \"$element\", \"$transclude\", \"$timeout\", \"$templateCache\", \"$sanitize\", \"groupService\", \"veriDate\", \"constantsService\", \"translationService\", \"htmlService\"];\r\n\r\n constructor(\r\n private readonly $scope: angular.IScope,\r\n private readonly $element: JQuery,\r\n private readonly $transclude: angular.ITranscludeFunction,\r\n private readonly $timeout: angular.ITimeoutService,\r\n private readonly $templateCache: angular.ITemplateCacheService,\r\n private readonly $sanitize, // sanitizer does not come with a type\r\n private readonly groupService: GroupService,\r\n private readonly veriDate: VeriDate,\r\n private readonly constantsService: ConstantsService,\r\n private readonly translationService: TranslationService,\r\n private readonly htmlService: HTMLService\r\n ) {\r\n }\r\n\r\n $onInit(): void {\r\n this.setDefaults();\r\n this.showResourceFilter = this.$transclude.isSlotFilled(\"filters\");\r\n this.hasEmptyState = this.$transclude.isSlotFilled(\"emptyState\");\r\n\r\n this.updateRowType();\r\n\r\n // Ensures nested tables dont register with a parent veri table container\r\n if (this.veriTableContainer && !this.parentVeriTable) {\r\n this.veriTableContainer.registerChild(this);\r\n }\r\n\r\n if (!this.withoutGroups) {\r\n this.getGroups();\r\n }\r\n\r\n\r\n this.$timeout(() => {\r\n this.checkForCompactMode();\r\n }, 0);\r\n }\r\n\r\n getGroups() {\r\n this.groupService.getGroups().then(groups => {\r\n this.allUserGroupIds = groups?.flatMap(groups => groups.UserIds);\r\n this.allGeofenceGroupIds = groups?.flatMap(groups => groups.GeofenceIds);\r\n this.allVehicleGroupIds = groups?.flatMap(groups => groups.VehicleIds);\r\n this.allDriverGroupIds = groups?.flatMap(groups => groups.DriverIds);\r\n })\r\n }\r\n\r\n sanitize(value: string): string {\r\n return this.$sanitize(value);\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n this.setDefaults();\r\n\r\n var sortRows = false;\r\n var searchRows = false;\r\n\r\n if (onChangesObj[\"dropDownFilterOptions\"] && this.dropDownFilterOptions && this.dropDownFilterOptions[0] && !this.selectedDropDownFilterOption) {\r\n this.selectedDropDownFilterOption = this.dropDownFilterOptions[0].Value;\r\n }\r\n\r\n if (onChangesObj[\"navPillFilterOptions\"] && this.navPillFilterOptions && this.navPillFilterOptions[0] && !this.selectedNavPillFilterOption) {\r\n this.selectedNavPillFilterOption = this.navPillFilterOptions.findIndex(p => p.highlighted);\r\n }\r\n\r\n if (onChangesObj[\"headers\"] && this.headers) {\r\n this.prepareHeaders();\r\n\r\n sortRows = true;\r\n }\r\n\r\n if (onChangesObj[\"rows\"] && this.rows) {\r\n\r\n this.prepareRows();\r\n this.hasPreparedRowsForSearchAndSort = false;\r\n\r\n sortRows = true;\r\n searchRows = !onChangesObj[\"rows\"].isFirstChange();\r\n }\r\n\r\n if (onChangesObj[\"searchString\"]) {\r\n searchRows = true;\r\n }\r\n\r\n if (onChangesObj[\"selectedItem\"] && onChangesObj[\"selectedItem\"].currentValue != onChangesObj[\"selectedItem\"].previousValue) {\r\n if (!this.ignoreNextSelectedItemChange) {\r\n this.calculateSelectedItemIndex();\r\n }\r\n }\r\n\r\n if (searchRows && this.searchString || this.selectedGroup) {\r\n this.searchRows();\r\n }\r\n else if (sortRows) {\r\n this.sortRows();\r\n }\r\n\r\n if (this.maxRows !== undefined && this.maxRows > 0) {\r\n this.displayRows = this.displayRows.slice(0, this.maxRows);\r\n }\r\n\r\n // Ensure we only send updates for row changes\r\n if (onChangesObj[\"rows\"] && this.veriTableContainer) {\r\n this.veriTableContainer.onRowsUpdated();\r\n }\r\n\r\n this.showHideColumnsWithNoData();\r\n\r\n this.resourceCount = this.displayRows?.length;\r\n }\r\n\r\n showHideColumnsWithNoData() {\r\n\r\n if (!this.headers || !this.rows) {\r\n return;\r\n }\r\n\r\n var expectedArrayLength = this.headers.length;\r\n if (this.rows.length && this.rows[0].cells) {\r\n expectedArrayLength = Math.max(this.rows[0].cells.length, this.headers.length);\r\n }\r\n\r\n var columnHasNoDataArray = this.rows.map(r => r.cells.map(r => (r.hasNoData ? 1 : 0) as number));\r\n var columnHasNoDataMap = columnHasNoDataArray.reduce((sum, current) => {\r\n var summedArray: number[] = [];\r\n\r\n sum.forEach((s, index) => {\r\n summedArray.push(s + current[index]);\r\n });\r\n\r\n\r\n return summedArray;\r\n }, new Array(expectedArrayLength).fill(0));\r\n\r\n this.headers.forEach((h, i) => {\r\n if (h.hideIfNoData) {\r\n\r\n // Else show / hide it if we have no data\r\n if (columnHasNoDataMap) {\r\n h.hide = isNaN(columnHasNoDataMap[i]) || columnHasNoDataMap[i] == this.rows.length;\r\n h.excludeFromExport = h.hide;\r\n\r\n //console.log(\"hidey\", columnHasNoDataMap, i, columnHasNoDataMap[i], columnHasNoDataArray);\r\n }\r\n }\r\n\r\n // If we are in mobile view, and we have said to hide, then lets honour it\r\n if (h.hideOnMobile && this.constantsService.getIsMobile()) {\r\n h.hide = true;\r\n }\r\n });\r\n }\r\n\r\n setFilterRows(rows: IVeriTableRow[]) {\r\n //debugger;\r\n this.filterRows = rows;\r\n this.searchRows(true);\r\n }\r\n\r\n onSearch() {\r\n this.$scope.$applyAsync();\r\n this.searchRows();\r\n\r\n if (this.veriTableContainer) {\r\n this.veriTableContainer.onRowsUpdated();\r\n }\r\n }\r\n\r\n headerClicked(header: IVeriTableHeader, $index: number) {\r\n if (!header.sortable) {\r\n return;\r\n }\r\n\r\n if (this.sortColumn == $index) {\r\n if (this.sortDirection == SortDirection.Ascending) {\r\n this.sortDirection = SortDirection.Descending;\r\n }\r\n else {\r\n this.sortDirection = SortDirection.Ascending;\r\n }\r\n }\r\n else {\r\n this.sortColumn = $index;\r\n this.sortDirection = SortDirection.Ascending;\r\n }\r\n\r\n this.sortRows();\r\n }\r\n\r\n rowClicked(row: IVeriTableRow, $event: MouseEvent) {\r\n if (!this.clickable) {\r\n return;\r\n }\r\n\r\n this.ignoreNextSelectedItemChange = true;\r\n\r\n if (this.onRowClicked) {\r\n this.onRowClicked({ row: row, $event: $event });\r\n }\r\n\r\n if (this.highlightSelectedItems) {\r\n if (this.selectedItem && this.selectedItem === row.data) {\r\n this.selectedItem = null;\r\n }\r\n else {\r\n this.selectedItem = row.data;\r\n }\r\n }\r\n }\r\n\r\n rowRightClicked(row: IVeriTableRow, $event: MouseEvent) {\r\n if (this.onRowRightClicked) {\r\n this.onRowRightClicked({ row: row, $event: $event });\r\n }\r\n }\r\n\r\n rowHighlighted(row: IVeriTableRow, $event: MouseEvent) {\r\n if (!this.onRowHighlighted || this.highlightedRow == row) {\r\n return;\r\n }\r\n\r\n this.highlightedRow = row;\r\n\r\n this.onRowHighlighted({ row: row, $event: $event });\r\n }\r\n\r\n onDropDownFilterOptionChanged() {\r\n // Bindings happen as a string, we we need this to be a number for filtering to work\r\n this.selectedDropDownFilterOption = Number(this.selectedDropDownFilterOption);\r\n this.searchRows();\r\n }\r\n\r\n onNavLabelClicked($label: IVeriPillNavLabel) {\r\n this.selectedNavPillFilterOption = this.navPillFilterOptions.indexOf($label);\r\n this.searchRows();\r\n }\r\n\r\n onGroupFilterChanged(filter: IGroupFilter) {\r\n this.selectedGroup = filter.group;\r\n\r\n this.searchRows();\r\n }\r\n\r\n onTagFilterChanged(filter: ITagFilter) {\r\n this.selectedTag = filter.tag;\r\n\r\n this.searchRows();\r\n }\r\n\r\n toggleGraphOptionsDialog() {\r\n this.showGraphOptions = !this.showGraphOptions;\r\n }\r\n\r\n // ---------------------------------------------------\r\n\r\n private prepareHeaders() {\r\n if (this.showStatusColumn) {\r\n this.addStatusHeader();\r\n }\r\n\r\n // Add padding to front and end columns\r\n if (this.headers && this.headers.length) {\r\n const paddingToAdd = 5;\r\n\r\n if (this.headers[0].width) {\r\n this.headers[0].width += paddingToAdd;\r\n }\r\n\r\n // This is to avoid us setting variable width columns to 5, as opposed to adding 5\r\n var lastHeaderWidth = this.headers[this.headers.length - 1].width;\r\n if (!isNaN(lastHeaderWidth) && lastHeaderWidth > 0) {\r\n this.headers[this.headers.length - 1].width += paddingToAdd;\r\n }\r\n }\r\n\r\n this.headers.forEach(header => {\r\n if (header.width) {\r\n if (!header.className) {\r\n header.className = \"\";\r\n }\r\n\r\n header.className += ` width-${header.width}`;\r\n }\r\n\r\n if (header.alignRight) {\r\n header.className += \" text-right\";\r\n }\r\n\r\n // Validate header has sort type set, if sortable is set\r\n //console.log(header.sortable, header.sortType);\r\n //if (header.sortable && header.sortType === undefined) {\r\n // console.warn(\"VeriTable Header Error: Sortable requires SortType\", header);\r\n //}\r\n\r\n if (!header.sortType) {\r\n header.sortType = SortType.String;\r\n }\r\n\r\n if (header.templateUrl) {\r\n header.template = this.$templateCache.get(header.templateUrl);\r\n }\r\n });\r\n }\r\n\r\n private prepareRows() {\r\n\r\n this.displayRows = this.rows;\r\n\r\n this.updateRowType();\r\n\r\n this.rows.forEach(row => {\r\n if (!row.cells) {\r\n return;\r\n }\r\n\r\n if (!this.showStatusColumn && row.rowWarningStatus !== undefined) {\r\n //console.warn(\"showStatusColumn is false but rowWarningStatus is defined\");\r\n this.showStatusColumn = true;\r\n this.addStatusHeader(true);\r\n }\r\n\r\n if (this.showStatusColumn) {\r\n this.addStatusCell(row);\r\n }\r\n\r\n for (var cellIndex = 0; cellIndex < row.cells.length; cellIndex++) {\r\n const cell = row.cells[cellIndex];\r\n\r\n cell.header = this.headers[cellIndex];\r\n\r\n cell.className = cell.className || \"\";\r\n\r\n // This doesnt work as we think it does\r\n // Todo fix\r\n if (this.sortColumn == cellIndex) {\r\n cell.className += \" sorted\";\r\n }\r\n\r\n if (cell.header.template) {\r\n cell.contents = cell.header.template;\r\n }\r\n\r\n\r\n if (cell.header.sortable) {\r\n\r\n if (cell.sortData === undefined) {\r\n cell.sortData = cell.contents;\r\n }\r\n\r\n if (cell.header.sortType == SortType.String && cell.sortData) {\r\n try {\r\n cell.sortData = cell.sortData.toLocaleLowerCase();\r\n }\r\n catch (ex) {\r\n console.error(`Failed to create sort cells for column #${cellIndex} ${cell.header.title}, likely due to bad data or through not setting correct Header.SortType`, cell, ex);\r\n }\r\n }\r\n }\r\n };\r\n });\r\n\r\n this.updateCounts();\r\n }\r\n\r\n private prepareRowsForSearchAndSort() {\r\n\r\n if (this.hasPreparedRowsForSearchAndSort) {\r\n return;\r\n }\r\n\r\n this.hasPreparedRowsForSearchAndSort = true;\r\n\r\n for (var rowIndex = 0; rowIndex < this.rows.length; rowIndex++) {\r\n const row = this.rows[rowIndex];\r\n\r\n if (!row.cells) {\r\n continue;\r\n }\r\n\r\n // Search\r\n row.searchString = row.searchString || \"\";\r\n\r\n for (var cellIndex = 0; cellIndex < row.cells.length; cellIndex++) {\r\n const cell = row.cells[cellIndex];\r\n\r\n if (cell.header?.excludeFromSearch) {\r\n continue;\r\n }\r\n\r\n row.searchString += \"||||\" + (cell.sortData || cell.contents);\r\n\r\n if (!cell.createSearchCallback) {\r\n continue;\r\n }\r\n\r\n const customSearchString = cell.createSearchCallback(cell.data);\r\n\r\n row.searchString += customSearchString;\r\n };\r\n\r\n row.searchString = row.searchString.toLocaleLowerCase();\r\n };\r\n }\r\n\r\n private updateCounts() {\r\n this.updateDropDownFilterCount();\r\n this.updateSimpleNavFilterCount();\r\n }\r\n\r\n private updateDropDownFilterCount() {\r\n if (!this.dropDownFilterOptions || this.dropDownFilterOptions.length == 0) {\r\n return;\r\n }\r\n\r\n this.dropDownFilterOptions.forEach(option => { option.Count = 0; });\r\n\r\n for (var i = 0; i < this.rows.length; i++) {\r\n const row = this.rows[i];\r\n\r\n if (!row.dropDownFilterValues) {\r\n continue;\r\n }\r\n\r\n for (var j = 0; j < this.dropDownFilterOptions.length; j++) {\r\n const option = this.dropDownFilterOptions[j];\r\n\r\n if (option.Value <= 0 || row.dropDownFilterValues.indexOf(option.Value) >= 0) {\r\n option.Count++;\r\n }\r\n }\r\n }\r\n }\r\n\r\n private updateSimpleNavFilterCount() {\r\n if (!this.navPillFilterOptions || this.navPillFilterOptions.length == 0) {\r\n return;\r\n }\r\n\r\n this.navPillFilterOptions.forEach(option => { option.count = 0; });\r\n\r\n for (var i = 0; i < this.rows.length; i++) {\r\n const row = this.rows[i];\r\n\r\n if (!row.navPillFilterValues) {\r\n continue;\r\n }\r\n\r\n row.navPillFilterValues.forEach(index => {\r\n this.navPillFilterOptions[index].count++;\r\n });\r\n }\r\n }\r\n\r\n searchRows(forceDigest = false) {\r\n this.selectedGroupRowCount = 0;\r\n this.displayRows = [];\r\n\r\n if (!this.rows) {\r\n return;\r\n }\r\n\r\n this.prepareRowsForSearchAndSort();\r\n\r\n const safeSearchString = this.searchString ? this.searchString.trim().toLocaleLowerCase() : null;\r\n const useRowsFilters = this.filterRows && this.filterRows.length;\r\n\r\n if (!safeSearchString &&\r\n !useRowsFilters &&\r\n !this.selectedGroup &&\r\n !this.dropDownFilterOptions &&\r\n !this.navPillFilterOptions &&\r\n !this.selectedTag) {\r\n\r\n this.displayRows = this.rows;\r\n }\r\n else {\r\n\r\n for (let ri = 0; ri < this.rows.length; ri++) {\r\n const row = this.rows[ri];\r\n\r\n let rowMatchedSearchString = false;\r\n let rowMatchedGroup = true;\r\n\r\n if (!safeSearchString || row.searchString.indexOf(safeSearchString) >= 0) {\r\n rowMatchedSearchString = true;\r\n }\r\n\r\n if (useRowsFilters && !this.filterRows.find(r => r.data.Id ? r.data.Id == row.data.Id : r.data == row.data)) {\r\n continue;\r\n }\r\n\r\n if (this.dropDownFilterOptions && this.selectedDropDownFilterOption > 0 && row.dropDownFilterValues) {\r\n rowMatchedGroup = row.dropDownFilterValues.indexOf(this.selectedDropDownFilterOption) >= 0;\r\n }\r\n\r\n if (this.navPillFilterOptions && this.navPillFilterOptions.length && row.navPillFilterValues) {\r\n rowMatchedGroup = row.navPillFilterValues.indexOf(this.selectedNavPillFilterOption) >= 0;\r\n }\r\n\r\n if (this.selectedGroup) {\r\n rowMatchedGroup = row.isInGroup && row.isInGroup(row.data, this.selectedGroup) || !row.isInGroup && this.isRowInGroup(row.data, this.selectedGroup);\r\n }\r\n\r\n if (rowMatchedGroup) {\r\n this.selectedGroupRowCount++;\r\n }\r\n\r\n const tagIds = row.data && (row.data.TagIds || row.data.tagIds);\r\n\r\n if (!!this.selectedTag && !tagIds?.find(id => id === this.selectedTag.Id)) {\r\n continue;\r\n }\r\n\r\n if (rowMatchedGroup && rowMatchedSearchString) {\r\n this.displayRows.push(row);\r\n }\r\n }\r\n }\r\n\r\n this.sortRows();\r\n\r\n // Hammer to crack a angular nut (only needed when linking from Angular component)\r\n if (forceDigest) {\r\n this.$scope.$applyAsync();\r\n }\r\n }\r\n\r\n clearSearch() {\r\n if (this.searchBox) {\r\n this.searchBox.clearSearchTerm();\r\n }\r\n }\r\n\r\n private isRowInGroup(data: T, group: IGroup): boolean {\r\n if (group == null) {\r\n return true;\r\n }\r\n\r\n switch (this.rowType) {\r\n case ResourceType.Vehicle:\r\n const vehicle = data as IVehicle;\r\n return group.Id === 0\r\n ? !this.allVehicleGroupIds.includes(vehicle.Id)\r\n : group.VehicleIds.indexOf(vehicle.Id) >= 0;\r\n\r\n case ResourceType.Geofence:\r\n const geofence = data as IGeofence;\r\n return group.Id === 0\r\n ? !this.allGeofenceGroupIds.includes(geofence.Id)\r\n : group.GeofenceIds.indexOf(geofence.Id) >= 0;\r\n\r\n case ResourceType.Driver:\r\n const driver = data as IDriver;\r\n return group.Id === 0\r\n ? !this.allDriverGroupIds.includes(driver.Id)\r\n : group.DriverIds.indexOf(driver.Id) >= 0;\r\n\r\n case ResourceType.User:\r\n const user = data as any;\r\n return group.Id === 0\r\n ? !this.allUserGroupIds.includes(user.Id)\r\n : group.UserIds.indexOf(user.Id) >= 0;\r\n }\r\n\r\n console.error(\"Could not determinte object type\");\r\n return false;\r\n }\r\n\r\n private updateRowType() {\r\n if (!this.rows || !this.rows.length) {\r\n return;\r\n }\r\n\r\n const data = this.rows[0].data;\r\n\r\n if (!data) {\r\n return;\r\n }\r\n\r\n const vehicle: IVehicle = 'ShortReg' in data || 'VehicleType' in data ? data : null;\r\n const driver: IDriver = 'Name' in data || data.driver ? data : null;\r\n const user: IUser = 'Username' in data || data.user ? data : null;\r\n const geofence: IGeofence = 'GeofenceType' in data || data.geofence ? data : null;\r\n\r\n if (vehicle) {\r\n this.rowType = ResourceType.Vehicle;\r\n }\r\n else if (geofence) {\r\n this.rowType = ResourceType.Geofence;\r\n }\r\n else if (driver) {\r\n this.rowType = ResourceType.Driver;\r\n }\r\n else if (user) {\r\n this.rowType = ResourceType.User;\r\n }\r\n\r\n if (this.rowType !== undefined || this.rows[0].isInGroup) {\r\n if (this.showGroupFilter === undefined) {\r\n this.showGroupFilter = true;\r\n }\r\n\r\n if (this.showTagFilter === undefined && this.rowType != ResourceType.User) {\r\n this.showTagFilter = true;\r\n }\r\n }\r\n\r\n this.tagResourceType = ResourceType[this.rowType];\r\n }\r\n\r\n private sortRows() {\r\n window.performance.mark(\"veriTable.sortRows\");\r\n\r\n const header = this.headers[this.sortColumn];\r\n\r\n if (!header || !this.displayRows || !header.sortable) {\r\n return;\r\n }\r\n\r\n this.displayRows.sort((row1, row2) => {\r\n\r\n const cell1 = row1.cells[this.sortColumn];\r\n const cell2 = row2.cells[this.sortColumn];\r\n\r\n if (cell1.sortData == cell2.sortData) {\r\n return 0;\r\n }\r\n // keep equality (i.e. dont replace with ===) as this will also catch undefined\r\n else if (cell1.sortData == null) {\r\n return this.sortDirection === SortDirection.Ascending ? -1 : 1\r\n }\r\n else if (cell2.sortData == null) {\r\n return this.sortDirection === SortDirection.Ascending ? 1 : -1\r\n }\r\n else if (header.sortType === SortType.Date) {\r\n return this.veriDate.sort(cell1.sortData, cell2.sortData, this.sortDirection);\r\n }\r\n else if (header.sortType === SortType.Number) {\r\n const direction = this.sortDirection === SortDirection.Ascending ? -1 : 1;\r\n\r\n return cell1.sortData < cell2.sortData ? 1 * direction : -1 * direction;\r\n }\r\n else {\r\n return this.sortDirection === SortDirection.Ascending\r\n ? cell1.sortData.localeCompare(cell2.sortData)\r\n : cell2.sortData.localeCompare(cell1.sortData);\r\n }\r\n });\r\n\r\n // CJE removed during a test for better null handling, nulls should now appear at the bottom of a list\r\n //if (this.sortDirection === SortDirection.Descending && columnContainsNulls) {\r\n // this.displayRows.reverse();\r\n //}\r\n\r\n window.performance.measure(\"veriTable.sortRows\");\r\n\r\n this.rowsUpdated();\r\n }\r\n\r\n private checkForCompactMode() {\r\n\r\n const filterBar = this.$element[0].getElementsByClassName('filters')[0];\r\n\r\n if (filterBar) {\r\n let filterbarWidth = filterBar.getBoundingClientRect().width;\r\n let veriTableWidth = this.$element[0].getBoundingClientRect().width;\r\n\r\n if (filterbarWidth > ((veriTableWidth / 100) * 65)) {\r\n this.showCompactFilters = true;\r\n }\r\n }\r\n }\r\n\r\n private setDefaults() {\r\n if (this.showRows === undefined) {\r\n this.showRows = true;\r\n }\r\n\r\n if (this.sortColumn === undefined) {\r\n this.sortColumn = 0;\r\n }\r\n\r\n if (this.sortDirection === undefined) {\r\n this.sortDirection = SortDirection.Ascending;\r\n }\r\n\r\n this.selectedItemIdentifier = this.selectedItemIdentifier || \"Id\";\r\n }\r\n\r\n private rowsUpdated() {\r\n if (this.onRowsUpdated) {\r\n this.onRowsUpdated({ rows: this.displayRows });\r\n }\r\n }\r\n\r\n private calculateSelectedItemIndex() {\r\n if (!this.displayRows) {\r\n return;\r\n }\r\n\r\n this.displayRows.forEach((row, i) => {\r\n if (this.selectedItem && this.selectedItem[this.selectedItemIdentifier] == row.data[this.selectedItemIdentifier]) {\r\n this.selectedItemIndex = i;\r\n }\r\n });\r\n }\r\n\r\n private addStatusHeader(updateSortColumnPosition = false) {\r\n if (this.constantsService.getIsMobile()) {\r\n return;\r\n }\r\n\r\n this.headers.unshift({\r\n title: \"warning\",\r\n excludeFromExport: true,\r\n width: 35,\r\n sortable: true,\r\n sortType: SortType.Number,\r\n className: \"border-spacer width-35\" //width-X here is a hack\r\n });\r\n\r\n if (updateSortColumnPosition) {\r\n // We do this because the user didnt SPECIFY they wanted this column, we are auto adding it\r\n this.sortColumn++;\r\n }\r\n }\r\n\r\n private addStatusCell(row: IVeriTableRow) {\r\n\r\n if (!this.constantsService.getIsMobile()) {\r\n\r\n var warningCell: IVeriTableRowCell = {\r\n contents: \"\",\r\n sortData: row.rowWarningStatus,\r\n excludeFromExport: true\r\n };\r\n\r\n switch (row.rowWarningStatus) {\r\n case VeriTableRowStatus.Warning:\r\n warningCell.className = \"warning\";\r\n warningCell.contents = \"warning\";\r\n break;\r\n\r\n case VeriTableRowStatus.Error:\r\n warningCell.className = \"error\";\r\n warningCell.contents = \"warning\";\r\n break;\r\n\r\n case VeriTableRowStatus.OkChecked:\r\n warningCell.className = \"text-muted\";\r\n warningCell.contents = \"check\";\r\n break;\r\n\r\n case VeriTableRowStatus.OkDash:\r\n warningCell.className = \"text-muted\";\r\n warningCell.contents = \"remove\";\r\n break;\r\n }\r\n\r\n warningCell.className += \" pl-10\";\r\n\r\n row.cells.unshift(warningCell);\r\n }\r\n\r\n row.rowClassName += \" \" + this.getClassForStatus(row.rowWarningStatus);\r\n }\r\n\r\n private getClassForStatus(status: VeriTableRowStatus) {\r\n switch (status) {\r\n case VeriTableRowStatus.Error:\r\n return \"error\";\r\n\r\n case VeriTableRowStatus.Warning:\r\n return \"warning\";\r\n\r\n default:\r\n case VeriTableRowStatus.OK:\r\n return \"ok\";\r\n }\r\n }\r\n\r\n getLastData(): void {\r\n if (this.onGetLastAvailableData) {\r\n this.onGetLastAvailableData();\r\n }\r\n }\r\n}\r\n\r\nexport class VeriTableComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n require: { [index: string]: string; };\r\n controller: any;\r\n template: string;\r\n transclude: { [slot: string]: string } | boolean;\r\n\r\n constructor() {\r\n\r\n this.require = {\r\n parentVeriTable: \"?^^veriTable\",\r\n veriTableContainer: \"?^veriTableContainer\"\r\n };\r\n\r\n this.bindings = {\r\n headers: \"<\",\r\n rows: \"<\",\r\n\r\n loading: \"<\",\r\n\r\n highlightSelectedItems: \"<\",\r\n selectedItem: \"<\",\r\n selectedItemIdentifier: \"@\",\r\n sortColumn: \"<\",\r\n sortDirection: \"<\",\r\n\r\n showStatusColumn: \"<\",\r\n showRows: \"<\",\r\n showSearch: \"<\",\r\n\r\n clickable: \"<\",\r\n downloadable: \"();\r\n downloadVideoCountUpdated$ = this.downloadVideoCountUpdatedSubject.asObservable();\r\n\r\n private videoUpdateSubject = new Subject();\r\n videoUpdate$ = this.videoUpdateSubject.asObservable();\r\n\r\n private apiUrl: string;\r\n\r\n constructor(\r\n private readonly httpClient: HttpClient,\r\n private readonly constantsService: ConstantsService,\r\n private readonly dateService: DateService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly translationService: TranslationService,\r\n private readonly unitConversionService: UnitConversionService,\r\n private readonly driverService: DriverService,\r\n private readonly driverAssignmentService: DriverAssignmentService,\r\n private readonly currentUserService: CurrentUserService,\r\n private readonly usersService: UsersService,\r\n private readonly videoReviewStatusService: VideoReviewStatusService,\r\n private readonly cameraStatusService: CameraStatusService,\r\n private readonly plotService: PlotService\r\n ) {\r\n this.apiUrl = this.constantsService.getApiUrl();\r\n }\r\n\r\n async getExtensionData(videoEntry: IVideoEntry, invalidateCache = false): Promise {\r\n const options = getOptionsQueryParams({ minsToLive: 60, invalidateCache, VideoEventId: videoEntry.Id, ExternalId: videoEntry.ExternalId });\r\n\r\n const result = await lastValueFrom(this.httpClient\r\n .get(`/api/cameras/entries/extensiondata`, options));\r\n\r\n const resultGForce = this.unitConversionService.convertExtensionDataIntoGForce(videoEntry, result);\r\n\r\n return resultGForce;\r\n }\r\n\r\n async getVideosEntriesWithMappings(startTime: Date, endTime: Date, options?: IGetVideoEntryOptions): Promise {\r\n const [videos, channelMedia, vehicles, drivers, driverAssignments, currentUser, users] = await Promise.all([\r\n this.getAllVideosEntries(startTime, endTime, options),\r\n this.getAllChannelVideos(startTime, endTime, true),\r\n this.vehicleService.getVehicles({ includePeripheralMappings: true, includeAllVehicles: true }) as Promise,\r\n this.driverService.getDrivers() as Promise,\r\n this.driverAssignmentService.getDriverAssignments(false) as Promise,\r\n this.currentUserService.getCurrentUser() as Promise,\r\n this.usersService.getUsers({ includeAdmins: true }) as Promise\r\n ]);\r\n return this.mapVideoEntries(videos, channelMedia, vehicles, drivers, driverAssignments, currentUser, users);\r\n }\r\n\r\n async getVideoThumbnails(videoEntryId: number): Promise {\r\n const options = getOptionsQueryParams({ minsToLive: 60 });\r\n\r\n const result = await lastValueFrom(this.httpClient\r\n .get(`/api/camera/thumbnails/${videoEntryId}`, options));\r\n\r\n return result.map(thumbnail => {\r\n const thumbnailUrl = this.getMediaURL(thumbnail.FileGuid);\r\n return { ...thumbnail, thumbnailUrl };\r\n })\r\n }\r\n\r\n async getVideoEntriesRequestedWithMappings(options: IGetVideoEntryOptions = {}): Promise {\r\n if (!options?.startTime || !options?.endTime) {\r\n const now = new Date();\r\n\r\n options.endTime = now;\r\n options.startTime = this.dateService.addOrSubtractTime(now, -1, DateUnit.Month);\r\n }\r\n\r\n const [videos, channelMedia, vehicles, drivers, driverAssignments, currentUser, users] = await Promise.all([\r\n this.getVideoEntriesRequested(options),\r\n this.getAllChannelVideos(options?.startTime, options?.endTime, options.invalidateCache, true),\r\n this.vehicleService.getVehicles({ includePeripheralMappings: true }) as Promise,\r\n this.driverService.getDrivers() as Promise,\r\n this.driverAssignmentService.getDriverAssignments(false) as Promise,\r\n this.currentUserService.getCurrentUser() as Promise,\r\n this.usersService.getUsers({ includeAdmins: true }) as Promise\r\n ]);\r\n\r\n return this.mapVideoEntries(videos, channelMedia, vehicles, drivers, driverAssignments, currentUser, users);\r\n }\r\n\r\n async getVideosEntriesForVehicle(vehicleId: number, startTime: Date, endTime: Date, options?: IGetVideoEntryOptions): Promise {\r\n const videos = await this.getAllVideosEntriesFromDatabase(startTime, endTime);\r\n\r\n let videosForDisplay = videos\r\n .filter(v => v.VehicleId === vehicleId)\r\n .map(v => this.getVideoEntryForDisplay(v));\r\n\r\n if (options?.processEntries || options?.createFileUrls) {\r\n videosForDisplay = this.getVideoEntriesWithFileUrls(videosForDisplay);\r\n }\r\n\r\n\r\n return this.getVideosFiltered(videosForDisplay, options?.vehicleFilter, options?.driverFilter, options?.groupFilter);\r\n }\r\n\r\n async getVideoEntryByProductGroupIdAndExternalId(productGroupId: number, videoExternalId: string): Promise {\r\n return await lastValueFrom(this.httpClient\r\n .get(`/api/cameras/entry/${productGroupId}/${videoExternalId}`));\r\n }\r\n\r\n async getVideoEntry(entryId: number, invalidateCache = false): Promise {\r\n const options = getOptionsQueryParams({ minsToLive: 60, invalidateCache });\r\n\r\n let videoEntry = await lastValueFrom(this.httpClient\r\n .get(`/api/cameras/entry/${entryId}`, options));\r\n\r\n videoEntry.driver = await this.driverAssignmentService.getDriverAssignmentForTime(videoEntry.VehicleId, videoEntry.VideoStartTime);\r\n videoEntry.vehicle = await this.vehicleService.getVehicle(videoEntry.VehicleId, { includePeripheralMappings: true });\r\n\r\n videoEntry = this.getVideoEntryForDisplay(videoEntry);\r\n\r\n return videoEntry;\r\n }\r\n\r\n async updateVideoEntry(videoEntry: IVideoEntry): Promise {\r\n const videoEntryCopy: IVideoEntry = {\r\n ...videoEntry,\r\n vehicle: null,\r\n driver: null,\r\n eventCategory: null,\r\n markerModel: null\r\n };\r\n\r\n const apiResult = await lastValueFrom(this.httpClient.post(\"/api/cameras\", videoEntryCopy));\r\n const result = {...videoEntry, ...apiResult};\r\n \r\n this.downloadVideoCountUpdatedSubject.next();\r\n this.videoUpdateSubject.next(result);\r\n\r\n return result;\r\n }\r\n\r\n async getVideoEntriesRequested(options?: IGetVideoEntryOptions): Promise {\r\n if (!options?.startTime || !options?.endTime) {\r\n const now = new Date();\r\n\r\n options.endTime = now;\r\n options.startTime = this.dateService.addOrSubtractTime(now, -1, DateUnit.Month);\r\n }\r\n\r\n const videos = await this.getVideoEntriesRequestedFromDatabase(options?.startTime, options?.endTime);\r\n\r\n const videosForDisplay = videos.map(video => this.getVideoEntryForDisplay(video));\r\n return this.getVideosFiltered(videosForDisplay, options?.vehicleFilter, options?.driverFilter, options?.groupFilter, options?.excludeMediaDeleted);\r\n }\r\n\r\n async getAllVideosEntries(startTime: Date, endTime: Date, options?: IGetVideoEntryOptions): Promise {\r\n let videos = await this.getAllVideosEntriesFromDatabase(startTime, endTime);\r\n\r\n if (!options?.includeArchived) {\r\n videos = videos.filter(v => v.Status != VideoStatus.Archived);\r\n }\r\n\r\n if (options?.downloadedOnly) {\r\n videos = videos.filter(v => v.Status == VideoStatus.Downloaded || v.Status == VideoStatus.PartiallyDownloaded);\r\n }\r\n\r\n if (options?.processEntries) {\r\n videos = videos\r\n .map(v => this.getVideoEntryForDisplay(v))\r\n .map(v => this.getVideoWithMetadataFormattedForDisplay(v, null));\r\n }\r\n\r\n if (options?.processEntries || options?.createFileUrls) {\r\n videos = this.getVideoEntriesWithFileUrls(videos);\r\n }\r\n\r\n const setVideoPositionPromises = videos\r\n .filter(v => v.Longitude == 0 && v.Latitude == 0 && v.Status == VideoStatus.Downloaded)\r\n .map(v => this.setVideoPosition(v));\r\n\r\n const updatedVideos = await Promise.all(setVideoPositionPromises);\r\n\r\n videos = videos.map(video => {\r\n const updatedVideo = updatedVideos.find(x => x.Id === video.Id);\r\n\r\n if (updatedVideo) {\r\n video.Longitude = updatedVideo.Longitude;\r\n video.Latitude = updatedVideo.Latitude;\r\n }\r\n\r\n return video;\r\n });\r\n\r\n return this.getVideosFiltered(videos, options?.vehicleFilter, options?.driverFilter, options?.groupFilter);\r\n }\r\n\r\n private async getVideoEntriesRequestedFromDatabase(startTime: Date, endTime: Date): Promise {\r\n const options = getOptionsQueryParams({ startTime, endTime });\r\n\r\n return await lastValueFrom(this.httpClient\r\n .get(\"/api/cameras/entries/requested\", options));\r\n }\r\n \r\n async requestVideoUpload(videoRequest: IVideoRequest): Promise {\r\n if (!videoRequest.Latitude || !videoRequest.Longitude) {\r\n videoRequest = await this.getLatLngForVideoRequest(videoRequest);\r\n }\r\n\r\n await lastValueFrom(this.httpClient.post(`/api/cameras/request`, videoRequest));\r\n this.downloadVideoCountUpdatedSubject.next();\r\n }\r\n\r\n async getLatLngForVideoRequest(videoRequest: IVideoRequest): Promise {\r\n return lastValueFrom(this.plotService.getPlotNearestToTime(videoRequest.VehicleId, videoRequest.VideoStartTime)).then(plot => {\r\n videoRequest.Latitude = plot?.Latitude;\r\n videoRequest.Longitude = plot?.Longitude;\r\n return videoRequest;\r\n });\r\n }\r\n\r\n async setVideoPosition(videoEntry: IVideoEntry): Promise {\r\n return await lastValueFrom(this.httpClient\r\n .post(\"/api/cameras/entry/setPosition\", videoEntry));\r\n }\r\n\r\n private mapVideoEntries(\r\n videos: IVideoEntry[],\r\n channelMedia: IVideoChannelMedia[],\r\n vehicles: IVehicle[],\r\n drivers: IDriver[],\r\n driverAssignments: IVehicleDriverMapping[],\r\n currentUser: IUser,\r\n users: IUser[]\r\n ): IVideoEntry[] {\r\n const mappedEntries = videos.map(video => {\r\n if (!video.channelMedia) {\r\n video.channelMedia = [];\r\n }\r\n\r\n video.channelMedia.push(...channelMedia.filter(m => m.VideoEntryId === video.Id));\r\n\r\n video.channelMedia = this.removeDuplicateChannels(video.channelMedia);\r\n\r\n if (video.Status == VideoStatus.Downloaded && !video.Mp4VideoFileGuid && video.channelMedia.any()) {\r\n video.channelMedia = video.channelMedia.filter(media => !!media.Mp4VideoFileGuid);\r\n\r\n if (video.channelMedia.length) {\r\n video.Mp4VideoFileGuid = video.channelMedia[0].Mp4VideoFileGuid;\r\n video.ThumbnailFileGuid = video.channelMedia[0].ThumbnailFileGuid;\r\n video.StoryboardFileGuid = video.channelMedia[0].StoryboardFileGuid;\r\n video.WebmVideoFileGuid = video.channelMedia[0].WebmVideoFileGuid;\r\n video.channelMedia[0].mainChannel = true;\r\n }\r\n }\r\n\r\n video.displayEventCode = this.getEventLabel(video);\r\n\r\n if (video.VehicleId) {\r\n video.vehicle = this.vehicleService.findVehicle(vehicles, video.VehicleId);\r\n\r\n if (video.vehicle?.TagIds) {\r\n video.tagIds = [];\r\n video.tagIds = video.tagIds?.concat(video.vehicle.TagIds);\r\n }\r\n const assignmentAtTimeOfVideo = driverAssignments.find(assignment => {\r\n return assignment.VehicleId === video.VehicleId &&\r\n this.dateService.dateIsBetweenDates(video.EventTimeUtc, String(assignment.StartUtc), String(assignment.EndUtc))\r\n });\r\n\r\n if (assignmentAtTimeOfVideo) {\r\n video.driver = drivers.find(driver => driver.Id === assignmentAtTimeOfVideo.DriverId);\r\n }\r\n }\r\n\r\n if (video.DriverId && !video.driver) {\r\n video.driver = this.driverService.findDriver(drivers, video.DriverId);\r\n }\r\n\r\n if (video.RequestedBy) {\r\n video.requestedByUser = this.usersService.findUser(users, video.RequestedBy);\r\n }\r\n\r\n video = this.getVideoWithMetadataFormattedForDisplay(video, currentUser);\r\n\r\n return video;\r\n })\r\n\r\n mappedEntries.sort((a, b) => this.dateService.sort(a.EventTimeUtc, b.EventTimeUtc));\r\n\r\n return this.getVideoEntriesWithFileUrls(mappedEntries);\r\n }\r\n \r\n private removeDuplicateChannels(channelMedia: IVideoChannelMedia[]): IVideoChannelMedia[] {\r\n const uniqueChannels: IVideoChannelMedia[] = [];\r\n\r\n for (const media of channelMedia) {\r\n let unique = true;\r\n\r\n for (const compare of uniqueChannels) {\r\n if (compare.ChannelId === media.ChannelId) {\r\n unique = false;\r\n break;\r\n }\r\n }\r\n\r\n if (unique) {\r\n uniqueChannels.push(media);\r\n }\r\n }\r\n\r\n return uniqueChannels;\r\n }\r\n\r\n private async getAllVideosEntriesFromDatabase(startTime: Date, endTime: Date): Promise {\r\n const options = getOptionsQueryParams({ startTime, endTime });\r\n\r\n return await lastValueFrom(this.httpClient\r\n .get(\"/api/cameras/entries\", options));\r\n }\r\n\r\n private getVideoEntryForDisplay(videoEntry: IVideoEntry): IVideoEntry {\r\n const displayEventCode = this.getEventLabel(videoEntry);\r\n const displayStatus = this.cameraStatusService.getVideoDisplayStatus(videoEntry);\r\n const placeName = videoEntry.PlaceName || this.translationService.t(\"cameraService.locationUnavailable\");\r\n\r\n const channelMedia = this.getVideoChannelMediaForDisplay([{\r\n ChannelId: 0, // Aka primary\r\n thumbnailUrl: videoEntry.thumbnailUrl,\r\n ThumbnailFileGuid: videoEntry.ThumbnailFileGuid,\r\n mp4VideoUrl: videoEntry.mp4VideoUrl,\r\n Mp4VideoFileGuid: videoEntry.Mp4VideoFileGuid,\r\n mainChannel: true\r\n }]);\r\n\r\n const displayEventType = videoEntry.Mp4VideoFileGuid\r\n ? this.translationService.t(\"cameraService.video\")\r\n : this.translationService.t(\"cameraService.event\");\r\n\r\n const ms = this.dateService.getDiff(videoEntry.VideoStartTime, videoEntry.VideoEndTime, DateUnit.Ms);\r\n const duration = ms === 0\r\n ? \"10s\"\r\n : Math.round(ms / 1000) + \"s\";\r\n\r\n const videoEntryForDisplay: IVideoEntry = {\r\n ...videoEntry,\r\n displayEventCode,\r\n displayStatus,\r\n PlaceName: placeName,\r\n channelMedia,\r\n displayEventType,\r\n duration,\r\n MetaData: {\r\n ...videoEntry.MetaData,\r\n DownloadProgress: videoEntry.Status == VideoStatus.Downloaded ? 100 : videoEntry.MetaData.DownloadProgress\r\n },\r\n VideoExtensionData: this.unitConversionService.convertExtensionDataIntoGForce(videoEntry, videoEntry.VideoExtensionData)\r\n }\r\n\r\n return videoEntryForDisplay;\r\n }\r\n\r\n private getVideoEntriesWithFileUrls(videoEntries: IVideoEntry[]): IVideoEntry[] {\r\n return videoEntries.map(videoEntry => {\r\n if (videoEntry.ThumbnailFileGuid) {\r\n videoEntry.thumbnailUrl = this.getMediaURL(videoEntry.ThumbnailFileGuid);\r\n }\r\n\r\n if (videoEntry.Mp4VideoFileGuid) {\r\n videoEntry.mp4VideoUrl = this.getMediaURL(videoEntry.Mp4VideoFileGuid);\r\n }\r\n\r\n if (videoEntry.StoryboardFileGuid) {\r\n videoEntry.storyboardUrl = this.getMediaURL(videoEntry.StoryboardFileGuid);\r\n }\r\n\r\n return videoEntry;\r\n })\r\n }\r\n\r\n private getEventLabel(videoEvent: IVideoEntry): string {\r\n if (videoEvent.MetaData.Label &&\r\n videoEvent.EventCode !== VideoEventCode.Button &&\r\n videoEvent.EventCode !== VideoEventCode.Sensor) {\r\n return videoEvent.MetaData.Label.trim();\r\n }\r\n\r\n return videoEvent.EventCode != null\r\n ? this.translationService.translateEnum(VideoEventCode, \"VideoEventCode\", videoEvent.EventCode)\r\n : this.translationService.translateEnum(VideoEventCode, \"VideoEventCode\", VideoEventCode.Unknown);\r\n }\r\n\r\n private getVideosFiltered(\r\n videos: IVideoEntry[],\r\n vehicleFilter: IVehicleFilter,\r\n driverFilter: IDriverFilter,\r\n groupFilter: IGroupFilter,\r\n excludeMediaDeleted?: boolean\r\n ): IVideoEntry[] {\r\n videos = videos.filter(video => {\r\n if (!video.MetaData || !video.MetaData.Label) {\r\n return true;\r\n }\r\n\r\n const labelLower = video.MetaData.Label.toLowerCase();\r\n\r\n if (labelLower.indexOf(\"sensor\") >= 0) {\r\n return false;\r\n }\r\n\r\n if (labelLower === \"left\" || labelLower === \"right\" || labelLower === \"reverse\") {\r\n return false;\r\n }\r\n\r\n return true;\r\n });\r\n\r\n if (excludeMediaDeleted) {\r\n videos = videos.filter(video => video.Status !== VideoStatus.MediaDeleted);\r\n }\r\n\r\n if ((!vehicleFilter || !vehicleFilter.vehicle) && (!driverFilter || !driverFilter.driver) && (!groupFilter || !groupFilter.group)) {\r\n return videos;\r\n }\r\n\r\n if (vehicleFilter && vehicleFilter.vehicle) {\r\n videos = videos.filter(v => v.VehicleId === vehicleFilter.vehicle.Id);\r\n }\r\n\r\n if (driverFilter && driverFilter.driver) {\r\n videos = videos.filter(v => v.DriverId === driverFilter.driver.Id);\r\n }\r\n\r\n if (groupFilter && groupFilter.group) {\r\n videos = this.filterVideoByGroup(videos, groupFilter);\r\n }\r\n\r\n return videos;\r\n }\r\n\r\n private getVideoChannelMediaForDisplay(channelMedia: IVideoChannelMedia[]): IVideoChannelMedia[] {\r\n return channelMedia.map(media => {\r\n if (media.ThumbnailFileGuid) {\r\n media.thumbnailUrl = this.getMediaURL(media.ThumbnailFileGuid);\r\n }\r\n\r\n if (media.Mp4VideoFileGuid) {\r\n media.mp4VideoUrl = this.getMediaURL(media.Mp4VideoFileGuid);\r\n }\r\n\r\n return media;\r\n });\r\n }\r\n\r\n private filterVideoByGroup(videosToFilter: IVideoEntry[], filter: IGroupFilter): IVideoEntry[] {\r\n const filteredVideos: IVideoEntry[] = [];\r\n\r\n videosToFilter.forEach(v => {\r\n const alreadyAdded = filteredVideos.some(fv => fv.Id === v.Id);\r\n\r\n if (!alreadyAdded) {\r\n const driverIncluded = filter.group.DriverIds.includes(v.DriverId);\r\n const vehicleIncluded = filter.group.VehicleIds.includes(v.VehicleId);\r\n\r\n if (driverIncluded || vehicleIncluded) {\r\n filteredVideos.push(v);\r\n }\r\n }\r\n });\r\n\r\n return filteredVideos;\r\n }\r\n\r\n private getMediaURL(guid: string, uriRedirect = false): string {\r\n let url = `${this.apiUrl}/api/cameras/media/${guid}`;\r\n\r\n if (uriRedirect) {\r\n url += \"/uri/redirect\";\r\n }\r\n\r\n return url;\r\n }\r\n\r\n private getVideoWithMetadataFormattedForDisplay(videoEntry: IVideoEntry, currentUser: IUser): IVideoEntry {\r\n if (!videoEntry.MetaData) {\r\n return videoEntry;\r\n }\r\n\r\n const watched = this.videoSeen(videoEntry);\r\n const lastNote = this.getVideoLastNote(videoEntry);\r\n const reviewStatus = lastNote.Status;\r\n const reviewSubStatus = lastNote.ReviewStatus;\r\n const coachingStatus = lastNote.CoachingStatus;\r\n const reviewStatusDisplayValue = this.videoReviewStatusService.getVideoReviewStatusDisplayValue(videoEntry);\r\n\r\n const formattedVideo: IVideoEntry = {\r\n ...videoEntry,\r\n watched,\r\n reviewStatus,\r\n reviewSubStatus,\r\n coachingStatus,\r\n reviewStatusDisplayValue\r\n }\r\n\r\n if (currentUser != null) {\r\n formattedVideo.reviewed = videoEntry.MetaData.Authorised.some(userAction => currentUser.Id === userAction.UserId);\r\n formattedVideo.favourite = videoEntry.MetaData.Favourite.some(f => f.UserId === currentUser.Id);\r\n formattedVideo.companyFavourite = videoEntry.MetaData.Favourite.length > 0;\r\n }\r\n\r\n formattedVideo.MetaData.VideoObservations.sort((a, b) => {\r\n if (VideoObservation[a] < VideoObservation[b]) {\r\n return -1;\r\n }\r\n\r\n if (VideoObservation[a] > VideoObservation[b]) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n });\r\n\r\n return formattedVideo;\r\n }\r\n\r\n private videoSeen(v: IVideoEntry): boolean {\r\n return v.Status == VideoStatus.Downloaded && v.MetaData && v.MetaData.Watched.length > 0;\r\n }\r\n\r\n private getVideoLastNote(v: IVideoEntry): IUserAction {\r\n if (!v.MetaData || !v.MetaData.Notes || v.MetaData.Notes.length === 0) {\r\n return {\r\n Status: VideoReviewStatus.NeedsReview,\r\n ReviewStatus: VideoReviewSubStatus.None,\r\n CoachingStatus: VideoCoachingStatus.None,\r\n };\r\n }\r\n\r\n return v.MetaData.Notes[v.MetaData.Notes.length - 1];\r\n }\r\n\r\n private async getAllChannelVideos(\r\n startTime: Date,\r\n endTime: Date,\r\n invalidateCache: boolean = false,\r\n useRequestedTime: boolean = false\r\n ): Promise {\r\n const channels = await this.getAllChannelVideosFromDatabase(startTime, endTime, useRequestedTime);\r\n\r\n return this.getVideoChannelMediaForDisplay(channels);\r\n }\r\n\r\n private async getAllChannelVideosFromDatabase(startTime: Date, endTime: Date, useRequestedTime: boolean = false): Promise {\r\n const options = getOptionsQueryParams({ startTime, endTime, useRequestedTime });\r\n\r\n return await lastValueFrom(this.httpClient\r\n .get(\"/api/cameras/channels/videos\", options));\r\n }\r\n}\r\n","import { CommonModule } from \"@angular/common\";\r\nimport { NgModule } from \"@angular/core\";\r\nimport { ReactiveFormsModule } from \"@angular/forms\";\r\nimport { CoreDirectivesModule } from \"@app/directives/_core/_core.directives.module\";\r\nimport { FormsDirectivesModule } from \"@app/directives/_forms/_form.directives.module\";\r\nimport { VTableModule } from \"@app/directives/_layout/v-table/v-table.module\";\r\nimport { LayoutDirectivesModule } from \"@app/directives/_layout/_layout.directives.module\";\r\nimport { MapDirectivesModule } from \"@app/directives/_map/_map.directives.module\";\r\nimport { MiscDirectivesModule } from \"@app/directives/_misc/_misc.directives.module\";\r\nimport { GroupButtonFilterComponent } from \"@app/directives/_resourceFilters/filter-bar/group-button-filter/group-button-filter.component\";\r\nimport { ResourceFiltersDirectivesModule } from \"@app/directives/_resourceFilters/_resourceFilters.directives.module\";\r\nimport { GroupAutocompleteComponent } from \"@app/directives/_veri/group-autocomplete/group-autocomplete.component\";\r\nimport { VeriDirectivesModule } from \"@app/directives/_veri/_veri.directives.module\";\r\nimport { PipesModule } from \"@app/_pipes/_pipes.module\";\r\nimport { GroupDetailComponent } from \"./group-editor/group-details/group-details.component\";\r\nimport { GroupEditorComponent } from \"./group-editor/group-editor.component\";\r\nimport { GroupResourcesComponent } from \"./group-editor/group-resources/group-resources.component\";\r\nimport { GroupHierarchyComponent2 } from \"./group-hierarchy/group-hierarchy.component\";\r\nimport { GroupsListComponent } from \"./groups-list/groups-list.component\";\r\n\r\nconst privateComponents: any[] = [\r\n\r\n];\r\n\r\nconst publicComponents: any[] = [\r\n GroupsListComponent,\r\n GroupEditorComponent,\r\n GroupDetailComponent,\r\n GroupResourcesComponent,\r\n GroupHierarchyComponent2,\r\n GroupButtonFilterComponent,\r\n GroupAutocompleteComponent,\r\n];\r\n\r\nconst declarations: any[] = [\r\n];\r\n\r\nconst providers: any[] = [\r\n];\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n VeriDirectivesModule,\r\n LayoutDirectivesModule,\r\n PipesModule,\r\n CoreDirectivesModule,\r\n MiscDirectivesModule,\r\n FormsDirectivesModule,\r\n ReactiveFormsModule,\r\n VTableModule,\r\n ResourceFiltersDirectivesModule,\r\n MapDirectivesModule\r\n \r\n ],\r\n providers: providers,\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents, ...declarations],\r\n exports: [...publicComponents, ...declarations],\r\n schemas: []\r\n})\r\nexport class GroupsModule {\r\n constructor() {\r\n }\r\n}\r\n","export enum RouteStatus {\r\n Planned,\r\n Started,\r\n Completed,\r\n CompletedWithMissing,\r\n Cancelled,\r\n Expired,\r\n Incomplete,\r\n UserExpired,\r\n Draft,\r\n Closed\r\n}\r\n","// Make interface?\r\nexport class CoordsModel {\r\n\r\n latitude: number;\r\n longitude: number;\r\n\r\n constructor(lat?: number, lng?: number) {\r\n\r\n if (lat) {\r\n this.latitude = lat;\r\n }\r\n\r\n if (lng) {\r\n this.longitude = lng;\r\n }\r\n }\r\n}\n","import { AfterViewInit, Component, ElementRef, EventEmitter, HostBinding, HostListener, Injector, Input, OnChanges, OnDestroy, Output, SimpleChanges, ViewChild } from \"@angular/core\";\r\nimport { AbstractControl, ControlValueAccessor, NgControl, ValidationErrors, Validator, Validators } from \"@angular/forms\";\r\nimport { ComponentUtility } from \"@app/class/ComponentUtility\";\r\nimport { UnitConversionType } from \"@services/unitConversion.service\";\r\nimport { fromEvent, Subscription } from \"rxjs\";\r\nimport { debounceTime, distinctUntilChanged, filter, tap } from \"rxjs/operators\";\r\nimport { DropdownContainer } from \"../dropdown-container/dropdown-container\";\r\nimport { FormValidationService } from \"../form-validation.service\";\r\nimport \"./v-input.component.scss\";\r\n\r\nexport enum VButtonStatus {\r\n Default,\r\n Success,\r\n Error\r\n}\r\n\r\n@Component({\r\n selector: \"v-input\",\r\n template: require('./v-input.component.html'),\r\n providers: [\r\n ComponentUtility.createValueAccessorProvider(VInputComponent),\r\n ComponentUtility.createValidatorProvider(VInputComponent)\r\n ]\r\n})\r\nexport class VInputComponent extends DropdownContainer implements OnChanges, AfterViewInit, OnDestroy, ControlValueAccessor, Validator {\r\n @Input() label: string;\r\n @Input() name: string;\r\n @Input() value: string | number;\r\n @Input() type: \"text\" | \"email\" | \"number\" | \"time\" | \"password\" | \"tel\" | \"url\";\r\n @HostBinding(\"class.required\") @Input() required = false;\r\n\r\n @Input() placeholder: string;\r\n @Input() helpText: string;\r\n @Input() icon: string;\r\n @Input() loading = false;\r\n @Input() debounceTime = 300;\r\n\r\n @Input() showCopyButton = false;\r\n\r\n @HostBinding(\"class.disabled\") @Input() disabled: boolean;\r\n @HostBinding(\"class.readonly\") @Input() readonly = false;\r\n\r\n @Input() status = VButtonStatus.Default;\r\n @Input() autofocus = false;\r\n\r\n @Input() suffix: string | number;\r\n @Input() uom: UnitConversionType;\r\n\r\n @Input() minValue: number;\r\n @Input() maxValue: number;\r\n\r\n @Input() stepValue: number = 1;\r\n\r\n @HostBinding(\"class.control-error\") @Input() showErrors: boolean;\r\n\r\n @Output() focus: EventEmitter = new EventEmitter();\r\n @Output() blur: EventEmitter = new EventEmitter();\r\n @Output() enterPress: EventEmitter = new EventEmitter();\r\n\r\n @Output() valueChange: EventEmitter = new EventEmitter();\r\n @Output() clear: EventEmitter = new EventEmitter();\r\n\r\n @ViewChild('input', { static: false }) input: ElementRef;\r\n\r\n @HostListener('mouseenter') onMouseEnter() { this.mouseOver = true; this.showHideClearButton(); }\r\n @HostListener('mouseleave') onMouseLeave() { this.mouseOver = false; this.showHideClearButton(); }\r\n\r\n // ---\r\n\r\n showClearButton = false;\r\n validateOnType = false;\r\n fontAwesome = false;\r\n justCopied = false;\r\n\r\n private focused = false;\r\n private mouseOver = false;\r\n\r\n private lastValueEmitted: any;\r\n\r\n subscriptions = new Subscription();\r\n\r\n constructor(\r\n protected readonly injector: Injector,\r\n protected readonly formValidationService: FormValidationService) {\r\n super();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.subscriptions.unsubscribe();\r\n this.subscriptions = null;\r\n }\r\n\r\n // --- Control Value Accessor\r\n\r\n onChange: (value: any) => void;\r\n onTouched: () => void;\r\n control: NgControl;\r\n\r\n registerOnChange(callback: (value: any) => void): void {\r\n this.onChange = callback;\r\n }\r\n\r\n registerOnTouched(callback: () => void): void {\r\n this.onTouched = callback;\r\n }\r\n\r\n writeValue(value: string): void {\r\n this.value = value;\r\n }\r\n\r\n setDisabledState(state: boolean) {\r\n this.disabled = state;\r\n }\r\n\r\n markAsTouched(): void {\r\n if (!this.onTouched || !this.control || this.control.touched) {\r\n return;\r\n }\r\n\r\n this.onTouched();\r\n }\r\n\r\n // Validator\r\n\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n this.control = this.injector.get(NgControl);\r\n\r\n if (!this.name && this.control.name) {\r\n this.name = `${this.control.name}`;\r\n }\r\n\r\n this.required = control.hasValidator(Validators.required);\r\n\r\n this.checkIfErrorsToShow();\r\n\r\n return null;\r\n }\r\n\r\n // --\r\n\r\n ngAfterViewInit(): void {\r\n // server-side search\r\n if (!this.input) {\r\n return;\r\n }\r\n\r\n this.emitNewValue();\r\n\r\n this.subscriptions.add(fromEvent(this.input.nativeElement, 'keyup')\r\n .pipe(\r\n filter(Boolean),\r\n tap((event: KeyboardEvent) => {\r\n this.runChangeValidation();\r\n this.showHideClearButton();\r\n this.checkIfErrorsToShow();\r\n\r\n // Escape\r\n if (event.keyCode == 27) {\r\n this.clearInput();\r\n }\r\n\r\n // Enter\r\n if (event.keyCode == 13) {\r\n this.enterPress.emit();\r\n }\r\n }),\r\n debounceTime(this.debounceTime),\r\n distinctUntilChanged(),\r\n tap((event: KeyboardEvent) => {\r\n this.emitNewValue(this.validateOnType);\r\n })\r\n )\r\n .subscribe());\r\n }\r\n\r\n ngOnChanges(simpleChanges: SimpleChanges) {\r\n this.autoSetIcon();\r\n this.autoSetPlaceholder();\r\n\r\n if (this.icon?.indexOf(\"fa-\") == 0) {\r\n this.fontAwesome = true;\r\n }\r\n }\r\n\r\n onBlur(): void {\r\n this.checkIfErrorsToShow();\r\n\r\n this.blur.emit();\r\n\r\n this.validateOnType = true;\r\n this.focused = false;\r\n\r\n this.showHideClearButton();\r\n this.emitNewValue(this.validateOnType);\r\n }\r\n\r\n onTimePickerChange(newValue: string): void {\r\n this.value = newValue;\r\n\r\n this.onValueChange();\r\n }\r\n\r\n onValueChange(): void {\r\n this.emitNewValue(this.validateOnType);\r\n }\r\n\r\n clearInput(): void {\r\n this.value = null;\r\n this.input?.nativeElement?.focus();\r\n\r\n this.validateOnType = true;\r\n this.onValueChange();\r\n\r\n this.showHideClearButton();\r\n this.clear.emit();\r\n }\r\n\r\n onFocus(): void {\r\n this.focus.emit();\r\n this.focused = true;\r\n\r\n this.showHideClearButton();\r\n }\r\n\r\n emitNewValue(runFormChange = false): void {\r\n\r\n // Test with aways on\r\n runFormChange = true;\r\n\r\n if (this.type === \"number\" && !!this.value) {\r\n this.validateNumber();\r\n this.value = +this.value;\r\n }\r\n\r\n this.valueChange.emit(this.value);\r\n this.runChangeValidation();\r\n }\r\n\r\n async copyInputValue() {\r\n try {\r\n await navigator.clipboard.writeText(this.value.toString());\r\n this.justCopied = true;\r\n } catch (error) {\r\n console.error(\"Failed to copy text:\", error);\r\n }\r\n }\r\n\r\n\r\n // ---\r\n\r\n private validateNumber(): void {\r\n if (!this.maxValue && !this.minValue) {\r\n return;\r\n }\r\n\r\n if (this.value > this.maxValue) {\r\n this.value = this.maxValue;\r\n }\r\n\r\n if (this.value < this.minValue) {\r\n this.value = this.minValue;\r\n }\r\n }\r\n\r\n private updateLastValueEmitted(value: any): void {\r\n this.lastValueEmitted = value;\r\n }\r\n\r\n private runChangeValidation() {\r\n if (this.lastValueEmitted === this.value) {\r\n return;\r\n }\r\n\r\n // Template-driven and reactive forms\r\n this.onChange?.(this.value);\r\n this.updateLastValueEmitted(this.value);\r\n }\r\n\r\n private autoSetIcon(): void {\r\n if (this.icon) {\r\n return;\r\n }\r\n\r\n switch (this.type) {\r\n case \"email\":\r\n this.icon = \"email\";\r\n break;\r\n\r\n case \"password\":\r\n this.icon = \"lock\";\r\n break;\r\n }\r\n }\r\n\r\n private autoSetPlaceholder(): void {\r\n if (this.placeholder) {\r\n return;\r\n }\r\n\r\n switch (this.type) {\r\n case \"email\":\r\n this.placeholder = \"you@example.com\";\r\n break;\r\n\r\n case \"password\":\r\n break;\r\n }\r\n }\r\n\r\n private showHideClearButton(): void {\r\n if (this.type == \"time\" || this.type == \"number\" || this.readonly || this.disabled) {\r\n this.showClearButton = false;\r\n return;\r\n }\r\n\r\n if (!this.mouseOver && !this.focused) {\r\n this.showClearButton = false;\r\n return;\r\n }\r\n\r\n this.showClearButton = (this.value as string)?.length > 0;\r\n }\r\n\r\n private checkIfErrorsToShow(): void {\r\n this.showErrors = (this.control?.errors && !!Object.keys(this.control?.errors).length);\r\n }\r\n}\r\n","\r\nexport class ReportsNavigationModule {\r\n //static get ReportsV2(): string { return \"app.reports2\"; }\r\n static get ReportList(): string { return `${ReportsNavigationModule.ParentRoot}.list`; }\r\n static get ViewReport(): string { return `${ReportsNavigationModule.ReportList}.view`; }\r\n static get ReportSchedules(): string { return `${ReportsNavigationModule.ParentRoot}.schedules`; }\r\n static get Expenses(): string { return `${ReportsNavigationModule.ParentRoot}.expenses`; }\r\n static get History(): string { return `${ReportsNavigationModule.ParentRoot}.history`; }\r\n\r\n static get Default(): string { return ReportsNavigationModule.ParentRoot; }\r\n\r\n static get ParentRoot(): string { return \"app.reports2\"; }\r\n}\r\n","import { IDriver } from \"@app/interfaces/IDriver\";\r\nimport { ITag, ITagDriverMapping, ITagDriverMappingQueryOptions, ITagGeofenceMapping, ITagGeofenceMappingQueryOptions, ITagQueryOptions, ITagVehicleMapping, ITagVehicleMappingQueryOptions } from \"@app/interfaces/ITag\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { Colour, IGeofence } from \"@interfaces/IGeofences\";\r\nimport { CacheService } from '@services/cache.Service';\r\nimport * as angular from \"angular\";\r\nimport { copy } from \"angular\";\r\nimport { ColourService } from \"./colour.service\";\r\n\r\nexport enum TagResourceType {\r\n Vehicle,\r\n Driver,\r\n Geofence\r\n}\r\n\r\nexport type TagResourceMapping = ITagVehicleMapping | ITagDriverMapping | ITagGeofenceMapping;\r\nexport type TagResource = IVehicle | IDriver | IGeofence;\r\nexport type TagMappingQueryOptions = ITagVehicleMappingQueryOptions | ITagDriverMappingQueryOptions | ITagGeofenceMappingQueryOptions;\r\n\r\nexport class TagsService {\r\n\r\n tagsServiceCache = \"tagsServiceCache\";\r\n\r\n static $inject = [\"$q\", \"$http\", \"colourService\", \"cacheService\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $http: angular.IHttpService,\r\n private readonly colourService: ColourService,\r\n private readonly cacheService: CacheService) {\r\n this.cacheService.createCache(this.tagsServiceCache, { maxAge: 5 * 60 * 1000 });\r\n }\r\n\r\n postTag(tag: ITag): angular.IPromise {\r\n return this.$http({\r\n url: \"/api/tags\",\r\n method: \"POST\",\r\n data: tag\r\n }).then((result: angular.IHttpPromiseCallbackArg) => {\r\n this.cacheService.addOrUpdateItem(this.tagsServiceCache, tag, (v1, v2) => v1.Id == v2.Id);\r\n\r\n return result.data;\r\n });\r\n }\r\n\r\n getTags(queryOptions: ITagQueryOptions = {}): angular.IPromise {\r\n\r\n queryOptions.Active = true;\r\n\r\n return this.cacheService.getOrRetrieveData(this.tagsServiceCache, () => this.getTagsFromDatabase(queryOptions), queryOptions?.invalidateCache);\r\n }\r\n\r\n getTagsFromDatabase(queryOptions: ITagQueryOptions = {}): angular.IPromise {\r\n return this\r\n .$http({\r\n url: \"/api/tags\",\r\n method: \"GET\",\r\n cache: false,\r\n params: queryOptions\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n result.data.forEach(tag => {\r\n if (tag.Colour === Colour.None) {\r\n return;\r\n }\r\n\r\n this.colourService.tagColours.forEach(colour => {\r\n if (tag.Colour === colour.colourEnum) {\r\n tag.ColourObject = colour;\r\n }\r\n });\r\n });\r\n\r\n return result.data;\r\n })\r\n .catch(() => {\r\n return [];\r\n });\r\n }\r\n\r\n getTag(tagId: number, invalidateCache: boolean = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/tags/mappings/vehicle/${tagId}`,\r\n method: \"GET\",\r\n params: { invalidateCache }\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n getTagVehicleMappings(queryOptions: ITagVehicleMappingQueryOptions = {}, invalidateCache?: boolean): angular.IPromise {\r\n return this\r\n .$http({\r\n url: \"/api/tags/mappings/vehicle\",\r\n method: \"GET\",\r\n cache: invalidateCache,\r\n params: { invalidateCache, ...queryOptions }\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n })\r\n .catch(() => {\r\n return [];\r\n });\r\n }\r\n\r\n getTagDriverMappings(queryOptions: ITagDriverMappingQueryOptions = {}, invalidateCache: boolean = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: \"/api/tags/mappings/driver\",\r\n method: \"GET\",\r\n cache: invalidateCache,\r\n params: { invalidateCache, ...queryOptions }\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n })\r\n .catch(() => {\r\n return [];\r\n });\r\n }\r\n\r\n getTagGeofenceMappings(queryOptions: ITagGeofenceMappingQueryOptions = {}, invalidateCache: boolean = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: \"/api/tags/mappings/geofence\",\r\n method: \"GET\",\r\n cache: invalidateCache,\r\n params: { invalidateCache, ...queryOptions }\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n })\r\n .catch(() => {\r\n return [];\r\n });\r\n }\r\n\r\n addTagMapping(mapping: TagResourceMapping, mappingType: TagResourceType): angular.IPromise {\r\n\r\n const endpoint = TagResourceType[mappingType].toLowerCase();\r\n\r\n return this.$http({\r\n url: `/api/tags/mappings/${endpoint}`,\r\n method: \"POST\",\r\n data: mapping\r\n }).then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n deleteTagMapping(mapping: TagResourceMapping, mappingType: TagResourceType): angular.IPromise {\r\n\r\n const endpoint = TagResourceType[mappingType].toLowerCase();\r\n\r\n return this.$http({\r\n url: `/api/tags/mappings/${endpoint}/${mapping.Id}`,\r\n method: \"DELETE\"\r\n });\r\n }\r\n\r\n saveResourceTags(resource: TagResource, resourceType: TagResourceType): angular.IPromise {\r\n\r\n if (!resource) {\r\n console.warn(\"No resource, returning\");\r\n resource.TagIds = [];\r\n\r\n return this.$q.resolve();\r\n }\r\n\r\n const resourceProperty: string = this.getMappingPropertyForResourceType(resourceType);\r\n const pendingTagIds: number[] = (resource.TagIds?.length) ? copy(resource.TagIds) : [];\r\n\r\n const queryOptions: TagMappingQueryOptions = {};\r\n\r\n queryOptions[resourceProperty] = resource.Id;\r\n\r\n let tagMappingsPromise;\r\n\r\n if (resourceType === TagResourceType.Driver) {\r\n tagMappingsPromise = this.getTagDriverMappings(queryOptions)\r\n\r\n } else if (resourceType === TagResourceType.Geofence) {\r\n tagMappingsPromise = this.getTagGeofenceMappings(queryOptions)\r\n\r\n } else if (resourceType === TagResourceType.Vehicle) {\r\n tagMappingsPromise = this.getTagVehicleMappings(queryOptions)\r\n }\r\n\r\n let existingTagMappings: TagResourceMapping[] = [];\r\n\r\n return tagMappingsPromise.then(response => {\r\n\r\n existingTagMappings = [...response];\r\n\r\n // find the difference\r\n const tagIdsToAdd: number[] = pendingTagIds.filter(pendingTagId => !existingTagMappings.find(existingTagMapping => existingTagMapping.TagId === pendingTagId));\r\n const tagMappingsToRemove: TagResourceMapping[] = existingTagMappings.filter(existingTagMapping => !pendingTagIds.find(pendingTagId => pendingTagId === existingTagMapping.TagId));\r\n\r\n const removePromises: any[] = [];\r\n const addPromises: any[] = [];\r\n\r\n\r\n tagIdsToAdd?.forEach(newTag => {\r\n const newTagMapping: TagResourceMapping = {\r\n Id: 0,\r\n TagId: newTag\r\n };\r\n\r\n newTagMapping[resourceProperty] = resource.Id;\r\n\r\n const newTagMappingPromise = this.addTagMapping(newTagMapping, resourceType);\r\n\r\n addPromises.push(newTagMappingPromise);\r\n });\r\n\r\n tagMappingsToRemove?.forEach(mappingToRemove => {\r\n const newTagMappingPromise = this.deleteTagMapping(mappingToRemove, resourceType);\r\n\r\n removePromises.push(newTagMappingPromise);\r\n });\r\n\r\n return this.$q.all([...removePromises, ...addPromises]).then(() => {\r\n resource.TagIds = [...pendingTagIds];\r\n });\r\n });\r\n }\r\n\r\n mapTagMappingsToResources(mappings: TagResourceMapping[], resources: TagResource[], resourceType: TagResourceType): void {\r\n const resourcesMap = new Map(resources.map(r => [r.Id, r]));\r\n\r\n if (!mappings?.length || !resources?.length || !TagResourceType[resourceType]) {\r\n return;\r\n }\r\n\r\n const resourceProperty: string = this.getMappingPropertyForResourceType(resourceType);\r\n\r\n mappings.forEach(mapping => {\r\n const matchingResource = resourcesMap.get(mapping[resourceProperty]);\r\n\r\n if (!matchingResource) {\r\n return;\r\n }\r\n\r\n if (!matchingResource?.TagIds) {\r\n matchingResource.TagIds = [];\r\n }\r\n\r\n matchingResource.TagIds.push(mapping.TagId);\r\n })\r\n\r\n }\r\n\r\n private getMappingPropertyForResourceType(resourceType: TagResourceType): string {\r\n switch (resourceType) {\r\n case TagResourceType.Driver: return \"DriverId\";\r\n case TagResourceType.Geofence: return \"GeofenceId\";\r\n case TagResourceType.Vehicle: return \"VehicleId\";\r\n default: return \"\";\r\n }\r\n }\r\n\r\n private getTagMappingCallForResourceType(resourceType: TagResourceType): any {\r\n switch (resourceType) {\r\n case TagResourceType.Driver: return () => this.getTagDriverMappings;\r\n case TagResourceType.Geofence: return () => this.getTagGeofenceMappings;\r\n case TagResourceType.Vehicle: return () => this.getTagVehicleMappings;\r\n default: return null;\r\n }\r\n }\r\n}\r\n","\r\nimport * as angular from \"angular\";\r\nimport * as moment from \"moment\";\r\nimport { DriverDecisionSupportType } from \"../enum/DriverDecisionSupportType\";\r\nimport { IDriver } from \"@interfaces/IDriver\";\r\nimport { DriverService } from \"./driver.service\";\r\nimport { DriverAssignmentService } from \"./driverAssignment.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { DateService, DateUnit } from \"./date.service\";\r\n\r\nexport interface ITachoModePeriod {\r\n Mode: DriverTachoMode;\n ModeEnumString: string;\n\r\n ModeString: string;\r\n StartTime: moment.Moment;\r\n EndTime: moment.Moment;\r\n\r\n DurationString?: string;\r\n DurationMins?: number;\r\n\r\n DurationPercentage?: number;\n\n StringDescription?: string;\r\n}\r\n\r\nexport enum DriverTachoMode {\r\n Break, // Break within work hours\r\n POA, // Available\r\n Work, // Other work i.e. not driving\r\n Drive, // Driving \r\n\r\n //Rest // Calculated\r\n Unknown = 999\r\n}\r\n\r\nexport enum DriverInfringementStatus {\r\n Ok,\r\n Prewarning,\r\n Warning\r\n}\r\n\r\nexport interface IDriverTachoDisplay {\r\n status: DriverInfringementStatus;\r\n statusClass: string;\r\n statusMessage: string;\r\n modeMessage: string;\r\n sourceMessage: string;\r\n}\r\n\r\nexport interface IDriverTachoHours {\r\n\r\n ContinuousDrive?: number; // continuous drive of a driver since last break\r\n DailyDrive?: number;\r\n WeeklyDrive?: number;\r\n TwoWeekDrive?: number;\r\n\r\n MaximumDailyDrive?: number;\r\n MaximumWeeklyDrive?: number;\r\n RemainingDrive?: number;\r\n\r\n CardNumber?: string;\r\n\r\n CumulativeBreak?: number;\r\n BreakRestTaken?: number;\n\r\n DriverId?: number;\r\n DriverTachoDisplay?: IDriverTachoDisplay;\r\n Duration?: number;\r\n\r\n Id?: number;\r\n\r\n Mode?: DriverTachoMode;\r\n Packet?: string;\r\n\r\n TimeRelatedStates?: DriverInfringementStatus;\r\n\r\n EventTime?: string;\r\n\r\n //Name?: string;\r\n Driver?: IDriver;\r\n\r\n DriverDecisionSupportType?: DriverDecisionSupportType;\r\n}\r\n\r\nexport interface ITachoDay {\r\n date: Date;\r\n periods: ITachoModePeriod[];\r\n rawData: IDriverTachoHours[];\r\n\r\n modeSummary: ITachoModePeriod[];\r\n}\r\n\r\nexport interface ITachoModeSummary {\n Label: string;\n Mode: DriverTachoMode;\n ModeEnumString: string;\n\r\n DurationMins: number;\r\n DurationString: string;\r\n}\r\n\r\nexport class TachoService {\r\n tachoStatusMessages: [string, DriverInfringementStatus][];\r\n\r\n static $inject = [\"$q\", \"$http\", \"dateService\", \"driverService\", \"driverAssignmentService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $http: angular.IHttpService,\r\n private readonly dateService: DateService,\r\n private readonly driverService: DriverService,\r\n private readonly driverAssignmentService: DriverAssignmentService,\n private readonly translationService: TranslationService) {\r\n\r\n this.createStatusMessages();\r\n }\r\n\r\n getCurrentTachoForAllDrivers(mapDriversAndVehicles: boolean): angular.IPromise {\r\n\r\n const driverPromise = mapDriversAndVehicles ? this.driverAssignmentService.getDriversWithVehicles() : this.$q.when([]);\r\n const tachoPromise = this.driverService.getDriversTacho();\r\n\r\n return this.$q\r\n .all([driverPromise, tachoPromise])\r\n .then(([driverList, driverTachoList]) => {\r\n\r\n this.mapDriversToTachoObjects(driverTachoList, driverList);\r\n\r\n driverTachoList.forEach(driverTacho => {\r\n this.processDriverTachoDisplay(driverTacho);\r\n });\r\n\r\n return driverTachoList;\r\n });\r\n }\r\n\r\n getTachoDaysForDriver(driverId: number, startDate: Date, endDate: Date): angular.IPromise {\n startDate = this.dateService.getStartOfDay(startDate);\n endDate = this.dateService.getStartOfDay(endDate);\n\n var daysDiff = Math.ceil(this.dateService.getDiff(startDate, endDate, DateUnit.Day));\n\n return this.getHistoricalTachoForDriver(driverId, startDate, endDate).then(tachoData => {\n const tachoDays: ITachoDay[] = [];\n\n for (var i = 0; i < daysDiff; i++) {\n var periodStart = this.dateService.getStartOfDay(this.dateService.addOrSubtractTime(startDate, i, DateUnit.Day));\n\n var periodEnd = this.dateService.getEndOfDay(periodStart);\n\r\n var modePeriods = this.calculateTachoModePeriods(tachoData.filter(d => this.dateService.dateIsBetweenDates(d.EventTime, periodStart, periodEnd, true, true)));\n\r\n var tachoDay: ITachoDay = {\r\n date: periodStart,\r\n periods: modePeriods,\r\n rawData: tachoData,\r\n modeSummary: this.calculateModeSummary(modePeriods),\r\n };\n\n tachoDays.push(tachoDay);\n }\r\n\r\n return tachoDays;\r\n });\r\n }\n\n private createModeSummary(mode: DriverTachoMode): ITachoModeSummary {\n\n var label = this.getModeMessage(mode);\n\n if (mode == 1000) { label = \"Total\"; }\n\n return {\n Mode: mode,\n Label: label,\n ModeEnumString: DriverTachoMode[mode],\n\n DurationMins: 0,\n DurationString: \"N/A\",\n }\n }\n\r\n createModeSummaryMins(tachoDays: ITachoDay[]): ITachoModeSummary[] {\r\n const errorMinuteValue = 65535;\n\n var modes = [DriverTachoMode.Break, DriverTachoMode.Work, DriverTachoMode.POA, DriverTachoMode.Drive, DriverTachoMode.Unknown, 1000];\n var modeSummaryMins: ITachoModeSummary[] = [];\n modes.forEach(mode => {\n modeSummaryMins[mode] = this.createModeSummary(mode);\n });\r\n\n var tachoHours = tachoDays.reduce((current, d) => current.concat(d.periods), []) as ITachoModePeriod[];\n\r\n tachoHours.forEach(tachoHour => {\r\n modeSummaryMins[tachoHour.Mode].DurationMins += tachoHour.DurationMins;\r\n });\r\n\r\n modeSummaryMins[1000].DurationMins = modeSummaryMins[DriverTachoMode.Work].DurationMins + modeSummaryMins[DriverTachoMode.Drive].DurationMins;\r\n\r\n modeSummaryMins.forEach(summary => {\r\n const d = moment.duration(summary.DurationMins, \"m\");\r\n\r\n summary.DurationString = (d as any).format(\"h [hours], m [mins]\");\r\n });\n\n modeSummaryMins = modeSummaryMins.filter(n => n);\n\n return modeSummaryMins;\r\n }\r\n\r\n calculateTachoModePeriods(rawTachoData: IDriverTachoHours[]): ITachoModePeriod[] {\n\r\n if (!rawTachoData || rawTachoData.length == 0) {\r\n return [];\r\n }\r\n\r\n var previousTachoHours: IDriverTachoHours = null;\r\n\r\n // Pre process data, look for huge gaps and insert a -1 tacho mode\r\n var processedHistoricalData: IDriverTachoHours[] = [];\r\n rawTachoData.forEach(data => {\r\n // If current mode is same as previous, count towards continuous block\r\n // If mode changes, create new status\r\n // If mode lasts for more than 5 minutes assume\r\n if (previousTachoHours) {\r\n var timeGapBetweenItems = moment(data.EventTime).diff(previousTachoHours.EventTime, \"m\");\r\n\r\n //TODO: Increase GAP as this will cater for any data delays... but i think the UTC value here is received, and not the tacho event time\r\n if (timeGapBetweenItems > 15) {\r\n previousTachoHours.Mode = DriverTachoMode.Unknown;\r\n }\r\n }\r\n\r\n processedHistoricalData.push(data);\r\n previousTachoHours = data;\r\n });\r\n\r\n previousTachoHours = null;\r\n var modeArray: ITachoModePeriod[] = [];\r\n var previousTachoModePeriod: ITachoModePeriod = {\r\n Mode: DriverTachoMode.Unknown,\n ModeEnumString: DriverTachoMode[DriverTachoMode.Unknown],\r\n ModeString: this.getModeMessage(DriverTachoMode.Unknown),\r\n StartTime: moment(this.dateService.getStartOfDay(rawTachoData[0].EventTime)),\r\n EndTime: null\r\n };\r\n\n processedHistoricalData.forEach(data => {\r\n // Mode Switch\r\n if (!previousTachoModePeriod || previousTachoModePeriod.Mode != data.Mode) {\r\n if (previousTachoModePeriod) {\r\n\r\n previousTachoModePeriod.EndTime = moment(data.EventTime);\r\n\r\n this.closeTachoModePeriod(previousTachoModePeriod);\r\n }\r\n\n var modeString = this.getModeMessage(data.Mode);\n\r\n previousTachoModePeriod = {\r\n Mode: data.Mode,\n ModeEnumString: DriverTachoMode[data.Mode],\r\n ModeString: modeString,\r\n StartTime: previousTachoModePeriod?.EndTime || moment(this.dateService.getStartOfDay(data.EventTime)),\r\n EndTime: moment(data.EventTime)\r\n }\n\n modeArray.push(previousTachoModePeriod);\r\n }\r\n else {\r\n previousTachoModePeriod.EndTime = moment(data.EventTime);\r\n }\r\n });\r\n\r\n if (previousTachoModePeriod) {\r\n this.closeTachoModePeriod(previousTachoModePeriod);\r\n }\r\n\r\n this.addStartAndEndRestPeriods(modeArray, rawTachoData);\r\n\r\n if (modeArray.length > 0) {\r\n // Create percentages\r\n var startTime = modeArray[0].StartTime;\r\n var endTime = modeArray[modeArray.length - 1].EndTime;\r\n var totalMins = endTime.diff(startTime, \"m\");\r\n var percentagePerMin = 100 / totalMins;\r\n\r\n modeArray.forEach(row => {\r\n row.DurationPercentage = row.DurationMins * percentagePerMin;\r\n });\r\n }\r\n\r\n return modeArray;\r\n }\r\n\r\n private calculateModeSummary(modePeriods: ITachoModePeriod[]): ITachoModePeriod[] {\r\n var modeSummary: ITachoModePeriod[] = [];\r\n\r\n modePeriods.forEach(modePeriod => {\r\n var summaryPeriod = modeSummary[modePeriod.Mode];\r\n\r\n if (!summaryPeriod) {\r\n summaryPeriod = {\r\n Mode: modePeriod.Mode,\n ModeEnumString: DriverTachoMode[modePeriod.Mode],\r\n ModeString: this.getModeMessage(modePeriod.Mode),\r\n StartTime: null,\r\n EndTime: null,\r\n\r\n DurationMins: 0,\r\n DurationPercentage: 0\r\n };\r\n\r\n modeSummary[modePeriod.Mode] = summaryPeriod;\r\n }\r\n\r\n summaryPeriod.DurationMins += modePeriod.DurationMins;\r\n summaryPeriod.DurationPercentage += modePeriod.DurationPercentage;\r\n });\r\n\r\n // Remove emptys\r\n modeSummary = modeSummary.filter(ms => ms);\r\n\r\n modeSummary.forEach(mode => {\r\n this.calculateTachoModePeriodDuration(mode);\r\n });\r\n\r\n return modeSummary;\r\n }\r\n\r\n addStartAndEndRestPeriods(modePeriods: ITachoModePeriod[], rawTachoData: IDriverTachoHours[]) {\r\n\r\n // If we dont receive data for first minute, then also insert an unknown state from midnight to the first packet\r\n var firstPacketTime = moment(rawTachoData[0].EventTime);\r\n var startOfDay = firstPacketTime.clone().startOf(\"d\");\r\n var timeToFirstPacket = firstPacketTime.diff(startOfDay, \"m\");\r\n\r\n if (timeToFirstPacket > 1) {\r\n var startPeriod: ITachoModePeriod = {\r\n DurationMins: timeToFirstPacket,\r\n Mode: DriverTachoMode.Unknown,\n ModeEnumString: DriverTachoMode[DriverTachoMode.Unknown],\r\n ModeString: this.getModeMessage(DriverTachoMode.Unknown),\r\n StartTime: startOfDay,\r\n EndTime: firstPacketTime\r\n };\r\n\r\n modePeriods.unshift(startPeriod);\r\n this.closeTachoModePeriod(startPeriod);\r\n }\r\n\r\n // If our last packet is before the end of the day, also insert unknown state for the remaining time of day\r\n var lastPacketTime = moment(rawTachoData[rawTachoData.length - 1].EventTime);\r\n var endOfDay = firstPacketTime.clone().endOf(\"d\");\r\n var timeToEndOfDay = endOfDay.diff(lastPacketTime, \"m\");\r\n\r\n if (timeToEndOfDay > 1) {\r\n var endPeriod: ITachoModePeriod = {\r\n DurationMins: timeToEndOfDay,\r\n Mode: DriverTachoMode.Unknown,\n ModeEnumString: DriverTachoMode[DriverTachoMode.Unknown],\r\n ModeString: this.getModeMessage(DriverTachoMode.Unknown),\r\n StartTime: lastPacketTime,\r\n EndTime: endOfDay\r\n };\r\n\r\n modePeriods.push(endPeriod);\r\n this.closeTachoModePeriod(endPeriod);\r\n }\r\n }\n\n closeTachoModePeriod(tachoModePeriod: ITachoModePeriod) {\n this.calculateTachoModePeriodDuration(tachoModePeriod);\n\n tachoModePeriod.StringDescription = `\n ${tachoModePeriod.ModeString}:\n ${this.dateService.formatDate(tachoModePeriod.StartTime.toDate(), { timeOnly: true })} to\n ${this.dateService.formatDate(tachoModePeriod.EndTime.toDate(), { timeOnly: true })}`;\n }\r\n\r\n calculateTachoModePeriodDuration(tachoModePeriod: ITachoModePeriod) {\n\r\n if (!tachoModePeriod.DurationMins) {\n if (!tachoModePeriod.EndTime) {\n tachoModePeriod.EndTime = moment();\n }\n\r\n tachoModePeriod.DurationMins = tachoModePeriod.EndTime.diff(tachoModePeriod.StartTime, \"s\") / 60;\r\n }\r\n\r\n const d = moment.duration(tachoModePeriod.DurationMins, \"m\");\r\n tachoModePeriod.DurationString = (d as any).format(\"h[h], m[m]\");\r\n }\r\n\r\n getHistoricalTachoForDriver(driverId: number, startDate: Date, endDate: Date): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/drivers/${driverId}/tacho/history`,\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 5, startDate: this.dateService.getStartOfDay(startDate).toISOString(), endDate: this.dateService.getEndOfDay(endDate).toISOString() }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getModeMessage(mode: DriverTachoMode): string {\r\n\r\n if (mode == DriverTachoMode.Unknown) {\r\n return this.translationService.t(\"tachoService.Rest\");\r\n }\r\n\r\n if (mode === DriverTachoMode.Work) {\r\n return this.translationService.t(\"tachoService.otherWork\");\r\n }\r\n\r\n if (mode === DriverTachoMode.Break) {\r\n return this.translationService.t(\"tachoService.break\");\r\n }\r\n\r\n return DriverTachoMode[mode];\r\n }\r\n\r\n processDriverTachoDisplay(driverTacho: IDriverTachoHours) {\r\n const status = this.getStatusMessage(driverTacho.TimeRelatedStates);\r\n\r\n driverTacho.DriverTachoDisplay = {\r\n status: status[1],\r\n statusClass: \"\",\r\n statusMessage: status[0],\r\n modeMessage: this.getModeMessage(driverTacho.Mode),\r\n sourceMessage: this.getSourceMessage(driverTacho.DriverDecisionSupportType)\r\n };\r\n\r\n if (status[1] === DriverInfringementStatus.Prewarning) {\r\n driverTacho.DriverTachoDisplay.statusClass = \"orange-color\";\r\n }\r\n else if (status[1] === DriverInfringementStatus.Warning) {\r\n driverTacho.DriverTachoDisplay.statusClass = \"red-color\";\r\n }\r\n }\r\n\r\n getCurrentTachoForDriver(driverId: number): angular.IPromise {\r\n return this.driverService.getCurrentTachoForDriver(driverId);\r\n }\r\n\r\n getModeImage(driverTachoMode: DriverTachoMode): string {\r\n // Status images\r\n // Rest,\r\n // Available,\r\n // Work,\r\n // Drive\r\n switch (driverTachoMode) {\r\n case DriverTachoMode.POA:\r\n return \"/assets/images/icons/tacho/poa_new.png\";\r\n\r\n case DriverTachoMode.Work:\r\n return \"/assets/images/icons/tacho/other_work_new.png\";\r\n\r\n case DriverTachoMode.Drive:\r\n return \"/assets/images/icons/tacho/driving_mode_new.png\";\r\n\r\n case DriverTachoMode.Break:\r\n case DriverTachoMode.Unknown: // Aka REST\r\n return \"/assets/images/icons/tacho/rest_new.png\";\r\n\r\n default:\r\n return \"unknown.jpg\";\r\n }\r\n }\r\n\r\n getStatusMessage(timeRelatedStates: number) {\r\n\r\n return this.tachoStatusMessages[timeRelatedStates];\r\n }\r\n\r\n mapDriversToTachoObjects(driverTachoList: IDriverTachoHours[], driverList: IDriver[]) {\r\n driverList.forEach(driver => {\r\n this.mapDriverToTachoObjects(driver, driverTachoList);\r\n });\r\n }\r\n\r\n mapDriverToTachoObjects(driver: IDriver, driverTachoList: IDriverTachoHours[]) {\r\n for (let i = 0; i < driverTachoList.length; i++) {\r\n const driverTacho = driverTachoList[i];\r\n\r\n // This MAY cause a infinite loop during serialization, bear this in mind if problems occur in the future\r\n if (driver && driver.Id === driverTacho.DriverId) {\r\n driverTacho.Driver = driver;\r\n driver.tacho = driverTacho;\r\n\r\n return;\r\n }\r\n }\r\n }\r\n\r\n private createStatusMessages() {\r\n this.tachoStatusMessages = [/*[\"\", 0]*/];\r\n\r\n this.tachoStatusMessages[0] = [this.translationService.t(\"tachoService.noTimeWarning\"), DriverInfringementStatus.Ok];\r\n this.tachoStatusMessages[1] = [this.translationService.t(\"tachoService.continuousDrivingWarning\"), DriverInfringementStatus.Prewarning];\r\n this.tachoStatusMessages[2] = [this.translationService.t(\"tachoService.continuousDrivingExceeded\"), DriverInfringementStatus.Warning];\r\n this.tachoStatusMessages[3] = [this.translationService.t(\"tachoService.dailyDrivingWarning\"), DriverInfringementStatus.Prewarning];\r\n this.tachoStatusMessages[4] = [this.translationService.t(\"tachoService.dailyDrivingAlert\"), DriverInfringementStatus.Warning];\r\n this.tachoStatusMessages[5] = [this.translationService.t(\"tachoService.restWarning\"), DriverInfringementStatus.Prewarning];\r\n this.tachoStatusMessages[6] = [this.translationService.t(\"tachoService.restAlert\"), DriverInfringementStatus.Warning];\r\n this.tachoStatusMessages[7] = [this.translationService.t(\"tachoService.weeklyDrivingWarning\"), DriverInfringementStatus.Prewarning];\r\n this.tachoStatusMessages[8] = [this.translationService.t(\"tachoService.weeklyDrivingAlert\"), DriverInfringementStatus.Warning];\r\n this.tachoStatusMessages[9] = [this.translationService.t(\"tachoService.twoWeekWarning\"), DriverInfringementStatus.Prewarning];\r\n this.tachoStatusMessages[10] = [this.translationService.t(\"tachoService.twoWeekAlert\"), DriverInfringementStatus.Warning];\r\n this.tachoStatusMessages[11] = [this.translationService.t(\"tachoService.cardExpiryWarning\"), DriverInfringementStatus.Warning];\r\n this.tachoStatusMessages[12] = [this.translationService.t(\"tachoService.cardDownloadError\"), DriverInfringementStatus.Warning];\r\n this.tachoStatusMessages[13] = [this.translationService.t(\"tachoService.other\"), DriverInfringementStatus.Warning];\r\n }\r\n\r\n private getSourceMessage(driverDecisionSupportType: DriverDecisionSupportType): string {\r\n\r\n switch (driverDecisionSupportType) {\r\n //case DriverDecisionSupportType.DigiDL:\r\n // return \"Tacho DDS\";\r\n //case DriverDecisionSupportType.KLine:\r\n // return \"KLine - Interpreted\";\r\n case DriverDecisionSupportType.DigiDL:\r\n return \"DDS\";\r\n\r\n case DriverDecisionSupportType.KLine:\r\n return \"KLine\";\r\n }\r\n\r\n return \"\";\r\n }\r\n}\r\n","import { CameraOnlineStatus } from '@app/main/components/videos/models/camera-online-status';\r\nimport { IVehicleOnlineStatus } from '@app/main/components/videos/models/IVehicleOnlineStatus';\r\nimport { DateService, DateUnit } from '@app/services/date.service';\r\nimport { IDriverTachoHours } from '@app/services/tacho.service';\r\nimport { AccountFeatures } from '@enums/account/AccountFeature';\r\nimport { IAccountUnitMappingExtended } from '@interfaces/IAccountUnitMappingExtended';\r\nimport { IKeyValuePair } from '@interfaces/IKeyValuePair';\r\nimport { IPeripheral, IUnit } from '@interfaces/IPeripheral';\r\nimport { IPlot } from '@interfaces/IPlot';\r\nimport { IBasicProductModel } from '@interfaces/IProductUiViewModel';\r\nimport { ISensorData } from '@interfaces/ISensorData';\r\nimport { IVehicle } from '@interfaces/IVehicle';\r\nimport { IVehiclePeripheralMapping, IVehicleUnitMapping } from '@interfaces/IVehiclePeripheralMapping';\r\nimport { IVehicleUnitMappingExtended } from '@interfaces/IVehicleUnitMappingExtended';\r\nimport { EnumService } from '@services/enum.service';\r\nimport { ProductService } from '@services/product.service';\r\nimport { VeriDate } from '@services/veriDate.service';\r\nimport * as moment from \"moment\";\r\nimport { formatBytes } from '../../../../filters/formatBytes.filter';\r\nimport { ProductVendor } from '../../../components/videos/enums/CameraProductType';\r\nimport { ISerialSearchResponse } from '../_models/ISerialSearchResponse';\r\n\r\n\r\nexport enum UnitConfigAndFirmwareStatus {\r\n Unknown,\r\n Completed,\r\n Pending,\r\n OtaSent,\r\n InProgress,\r\n Partial,\r\n Timeout,\r\n Error,\r\n Cancelled,\r\n Created,\r\n Discovered,\r\n}\r\n\r\nexport interface IConfigMappings {\r\n Identifier: string;\r\n Description: string;\r\n IsActive: boolean;\r\n Id: number;\r\n Serial: string;\r\n UnitConfigId: number;\r\n StartUtc: string;\r\n EndUtc: string | null;\r\n UnitConfigStatus: number;\r\n}\r\n\r\nexport interface IFirmwareMappings {\r\n Id: number;\r\n Serial: string;\r\n StartUtc: string;\r\n EndUtc: string | null;\r\n UnitFirmwareId: number;\r\n UnitFirmwareStatus: number;\r\n Identifier: string;\r\n Description: string;\r\n IsActive: boolean;\r\n}\r\nexport interface ITele2SimSessionDetails {\r\n iccid: string;\r\n ipAddress: string;\r\n\r\n dateSessionStarted: string;\r\n dateSessionEnded: string;\r\n}\r\n\r\nexport interface ITele2Sim extends ITele2BasicSim {\r\n imsi: string;\r\n msisdn: string;\r\n imei: string;\r\n}\r\n\r\nexport interface ITele2BasicSim {\r\n iccid: string;\r\n status: string;\r\n ratePlan: string;\r\n communicationPlan: string;\r\n errorMessage: string;\r\n}\r\n\r\nexport interface ITele2SimUsage extends ITele2Sim {\r\n ctdDataUsage: number;\r\n\r\n dataUsageFormatted: string;\r\n simUsage: number;\r\n voiceUsage: number;\r\n sessionCount: number;\r\n overageLimitReached: boolean;\r\n overageLimitOverride: string;\r\n}\r\n\r\nexport interface ISimStatusInfo {\r\n Sim: /*Sim*/any;\r\n\r\n SessionDetails: ITele2SimSessionDetails;\r\n\r\n Usage: ITele2SimUsage;\r\n}\r\n\r\nexport class FoundationPeripheralService {\r\n\r\n static $inject = [\"$q\", \"$http\", \"veriDate\", \"productService\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $http: angular.IHttpService,\r\n private readonly veriDate: VeriDate,\r\n private readonly productService: ProductService) { }\r\n\r\n // any peripherals not matching a feature / has issue, dump in peripherals array\r\n\r\n getAllPeripherals(invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/foundation/peripherals/`,\r\n method: \"GET\",\r\n params: { minsToLive: 60, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return this.getProductsAndMap(response.data);\r\n });\r\n }\r\n\r\n getPeripherals(vehicleId: number, invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/foundation/peripherals/${vehicleId}`,\r\n method: \"GET\",\r\n params: { minsToLive: 60, invalidateCache: invalidateCache, plotOption: \"WithFeatures\" }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return this.getProductsAndMap(response.data);\r\n });\r\n }\r\n\r\n getPeripheralMappings(peripheralSerial: string, invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/foundation/peripheral/mapping/current/${peripheralSerial}`,\r\n method: \"GET\",\r\n params: { minsToLive: 60, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getSimInfo(serial: string, invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/foundation/units/${serial}/simstatus`,\r\n method: \"GET\",\r\n params: { minsToLive: 60, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n\r\n if (response.data.Usage) {\r\n response.data.Usage.dataUsageFormatted = formatBytes()(response.data.Usage.ctdDataUsage);\r\n }\r\n\r\n return response.data;\r\n });\r\n }\r\n\r\n updateSim(serial: string, iccid: string, invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/foundation/units/${serial}/updatesim`,\r\n method: \"GET\",\r\n params: { minsToLive: 60, invalidateCache: invalidateCache, iccid }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n\r\n return response.data;\r\n });\r\n }\r\n\r\n getPlotsByImei(imei: string, startTime: moment.Moment, endTime: moment.Moment, invalidateCache = false): angular.IPromise {\r\n\r\n return this\r\n .$http({\r\n url: `/api/foundation/units/${imei}/plots`,\r\n method: \"GET\",\r\n params: {\r\n minsToLive: 1,\r\n start: startTime.toISOString(),\r\n end: endTime.toISOString(),\r\n invalidateCache: invalidateCache\r\n }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getExtendedPlotsByImei(imei: string, jobItemVehicleId?: number, invalidateCache = false): angular.IPromise {\r\n\r\n return this\r\n .$http({\r\n url: `/api/foundation/units/${imei}/extendedPlots`,\r\n method: \"GET\",\r\n params: {\r\n minsToLive: 1,\r\n jobItemVehicleId: jobItemVehicleId,\r\n invalidateCache: invalidateCache\r\n }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getLatestPlotsByImei(imei: string, amount: number = 10, invalidateCache = false): angular.IPromise {\r\n\r\n return this\r\n .$http({\r\n url: `/api/foundation/units/${imei}/latestplots`,\r\n method: \"GET\",\r\n params: {\r\n minsToLive: 1,\r\n amount: amount,\r\n invalidateCache: invalidateCache\r\n }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getSensorDataByImei(imei: string, startTime: moment.Moment, endTime: moment.Moment, invalidateCache = false): angular.IPromise {\r\n\r\n return this\r\n .$http({\r\n url: `/api/foundation/units/${imei}/sensordata`,\r\n method: \"GET\",\r\n params: {\r\n minsToLive: 5,\r\n invalidateCache: invalidateCache,\r\n start: startTime.toISOString(),\r\n end: endTime.toISOString()\r\n }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getUnitData(unitId: string, invalidateCache = false): angular.IPromise {\r\n\r\n return this\r\n .$http({\r\n url: `/api/foundation/units/${unitId}/unitData`,\r\n method: \"GET\",\r\n params: { minsToLive: 5, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n\r\n\r\n // This matches previous data architecture\r\n response.data.Unit.Product = response.data.Product;\r\n\r\n return response.data;\r\n });\r\n }\r\n\r\n getConfigMappings(serial: string, invalidateCache = false): angular.IPromise {\r\n\r\n return this\r\n .$http({\r\n url: `/api/foundation/units/${serial}/configmappings`,\r\n method: \"GET\",\r\n params: { minsToLive: 5, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getFirmwareMappings(serial: string, invalidateCache = false): angular.IPromise {\r\n\r\n return this\r\n .$http({\r\n url: `/api/foundation/units/${serial}/firmwaremappings`,\r\n method: \"GET\",\r\n params: { minsToLive: 5, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getUnitOrPeripheralBySerial(serial: string, invalidateCache = false): angular.IPromise {\r\n\r\n if (serial?.length < 6) {\r\n return this.$q.when(null);\r\n }\r\n\r\n return this\r\n .$http({\r\n url: `/api/foundation/units/${serial}`,\r\n method: \"GET\",\r\n params: { minsToLive: 60, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n var searchResponse = response.data;\r\n\r\n var commonProperties: IUnit = searchResponse.Unit || searchResponse.Peripheral;\r\n\r\n if (commonProperties) {\r\n searchResponse.Id = commonProperties.Id;\r\n searchResponse.ProductId = commonProperties.ProductId;\r\n searchResponse.Serial = commonProperties.Serial;\r\n searchResponse.SimId = commonProperties.SimId;\r\n searchResponse.Imei = commonProperties.Imei;\r\n\r\n searchResponse.vendorString = ProductVendor[searchResponse.Product.GroupId];\r\n }\r\n\r\n return searchResponse;\r\n });\r\n }\r\n\r\n getAllPeripheralMappings(invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/foundation/vehicles/peripheralmappings`,\r\n method: \"GET\",\r\n params: { minsToLive: 60, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n\r\n return response.data;\r\n });\r\n }\r\n\r\n getUnitMappings(vehicleId: number, invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/foundation/vehicles/${vehicleId}/unitmappings`,\r\n method: \"GET\",\r\n params: { minsToLive: 60, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n\r\n return response.data;\r\n });\r\n }\r\n\r\n getVehicleMappings(serial: string, invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/foundation/units/${serial}/vehiclemappings`,\r\n method: \"GET\",\r\n params: { minsToLive: 60, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n\r\n return response.data;\r\n });\r\n }\r\n\r\n getAccountMappings(serial: string, invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/foundation/units/${serial}/accountmappings`,\r\n method: \"GET\",\r\n params: { minsToLive: 60, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n\r\n return response.data;\r\n });\r\n }\r\n\r\n getUnit(vehicleId: number, invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/foundation/vehicles/${vehicleId}/unit`,\r\n method: \"GET\",\r\n params: { minsToLive: 60, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n\r\n return response.data;\r\n });\r\n }\r\n\r\n getAllUnits(invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/foundation/units`,\r\n method: \"GET\",\r\n params: { minsToLive: 60, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return this.getProductsAndMap(response.data);\r\n });\r\n }\r\n\r\n getAllUnitMappings(invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/foundation/vehicles/unitmappings`,\r\n method: \"GET\",\r\n params: { minsToLive: 60, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n\r\n return response.data;\r\n });\r\n }\r\n\r\n getTachoRecordsForPeripheral(peripheralString: string, start: Date, end: Date, invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/foundation/peripherals/tacho/${peripheralString}`,\r\n method: \"GET\",\r\n params: {\r\n minsToLive: 60,\r\n start: start.toISOString(),\r\n end: end.toISOString(),\r\n invalidateCache: invalidateCache\r\n }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getSingleFeatureForPeripheral(peripheral: IPeripheral): AccountFeatures {\r\n\r\n if (!AccountFeatures[peripheral?.Product?.Features]) {\r\n return AccountFeatures.Default;\r\n }\r\n\r\n const features = this.findFeaturesFromFeaturesEnum(peripheral.Product.Features);\r\n\r\n if (features.indexOf(AccountFeatures.Camera) > -1) {\r\n return AccountFeatures.Camera;\r\n }\r\n\r\n return (features?.length) ? features[0] : null;\r\n }\r\n\r\n findFeaturesFromFeaturesEnum(value: number): AccountFeatures[] {\r\n const features: IKeyValuePair[] = EnumService.enumToArray(\"AccountFeatures\", AccountFeatures);\r\n const includedFeatures: AccountFeatures[] = [];\r\n\r\n if (!features.length) {\r\n return includedFeatures;\r\n }\r\n\r\n features.sort((feature1: IKeyValuePair, feature2: IKeyValuePair) => {\r\n return (+feature2.value) - (+feature1.value)\r\n });\r\n\r\n features.forEach((feature, index) => {\r\n const enumValue: number = +feature.value;\r\n\r\n if (value == enumValue || value / enumValue >= 1) {\r\n includedFeatures.push(enumValue);\r\n value -= enumValue;\r\n }\r\n });\r\n\r\n return includedFeatures;\r\n }\r\n\r\n setMetaDataOnPeripheral(peripheral: IPeripheral, feature?: AccountFeatures) {\r\n if (!peripheral) {\r\n console.error(\"No peripheral specified\");\r\n return;\r\n }\r\n\r\n peripheral.primaryFeature = this.getSingleFeatureForPeripheral(peripheral);\r\n peripheral.productVendorString = this.productService.getProductVendorString(peripheral.Product);\r\n\r\n\r\n peripheral.name = `${peripheral.productVendorString ? peripheral.productVendorString : ''} ${peripheral.Product?.Description}`;\r\n peripheral.icon = this.getIconForPeripheral(peripheral);\r\n }\r\n\r\n createInstalledPeripheralList(peripherals: IPeripheral[]): { installed: IPeripheral[], notInstalled: IPeripheral[] } {\r\n const featuresEnumArray: IKeyValuePair[] = EnumService.enumToArray(\"AccountFeatures\", AccountFeatures);\r\n\r\n var peripheralsCurrentlyInstalled: IPeripheral[] = [];\r\n var peripheralsNotInstalled: IPeripheral[] = [];\r\n\r\n featuresEnumArray.forEach(featureEnum => {\r\n const feature: AccountFeatures = +featureEnum.value;\r\n const peripheral = this.findInstalledPeripheralForFeature(feature, peripherals, peripheralsCurrentlyInstalled);\r\n\r\n if (peripheral) {\r\n this.setMetaDataOnPeripheral(peripheral, feature);\r\n peripheralsCurrentlyInstalled.push(peripheral);\r\n }\r\n else {\r\n peripheralsNotInstalled.push(peripheral);\r\n }\r\n });\r\n\r\n return {\r\n installed: peripheralsCurrentlyInstalled,\r\n notInstalled: peripheralsNotInstalled\r\n };\r\n }\r\n\r\n getProductsAndMap(units: IUnit[]): angular.IPromise {\r\n return this.productService.getProductUiViewModels().then(products => {\r\n this.mapProductsToUnits(units, products);\r\n\r\n return units;\r\n });\r\n }\r\n\r\n mapProductsToUnits(units: IUnit[], products: IBasicProductModel[]) {\r\n units.forEach(unit => {\r\n unit.Product = products.find(product => product.ProductId === unit.ProductId);\r\n\r\n this.setMetaDataOnPeripheral(unit);\r\n });\r\n }\r\n\r\n getPeripheralsAndMapToVehicles(vehicles: IVehicle[], invalidateCache: boolean = false): angular.IPromise {\r\n const peripheralPromise = this.getAllPeripherals(invalidateCache);\r\n const peripheralMappingPromise = this.getAllPeripheralMappings(invalidateCache);\r\n\r\n return this.$q.all([peripheralPromise, peripheralMappingPromise]).then(([peripherals, peripheralMappings]) => {\r\n\r\n vehicles.forEach(vehicle => {\r\n const now = new Date();\r\n const mappings = peripheralMappings.filter(mapping => mapping.VehicleId === vehicle.Id);\r\n const relevantPeriperals: IPeripheral[] = [];\r\n\r\n mappings.forEach(mapping => relevantPeriperals.push(...peripherals.filter(peripheral => {\r\n if (this.veriDate.date1IsBeforeDate2(mapping.EndUtc, now)) {\r\n return false;\r\n }\r\n\r\n return peripheral.Serial === mapping.Serial;\r\n })));\r\n\r\n vehicle.peripherals = relevantPeriperals;\r\n });\r\n });\r\n }\r\n\r\n mapPeripheralsAndVehicles(\r\n vehicles: IVehicle[], \r\n peripherals: IPeripheral[], \r\n peripheralMappings: IVehiclePeripheralMapping[],\r\n onlineStatuses: CameraOnlineStatus[]\r\n ): void {\r\n\r\n const mappingsByVehicleId: { [vehicleId: number]: IVehiclePeripheralMapping[] } = {};\r\n peripheralMappings.forEach(mapping => {\r\n if (!mappingsByVehicleId[mapping.VehicleId]) {\r\n mappingsByVehicleId[mapping.VehicleId] = [];\r\n }\r\n mappingsByVehicleId[mapping.VehicleId].push(mapping);\r\n });\r\n\r\n const now = new Date();\r\n vehicles.forEach(vehicle => {\r\n const mappings = mappingsByVehicleId[vehicle.Id] || [];\r\n const relevantPeriperals: IPeripheral[] = [];\r\n\r\n mappings.forEach(mapping => relevantPeriperals.push(...peripherals.filter(peripheral => {\r\n \r\n if (peripheral.Serial !== mapping.Serial) {\r\n return false;\r\n }\r\n\r\n return !this.veriDate.date1IsBeforeDate2(mapping.EndUtc, now);\r\n })));\r\n\r\n vehicle.peripherals = relevantPeriperals;\r\n vehicle.onlineStatus = this.findAndGetOnlineStatus(vehicle, onlineStatuses)\r\n vehicle.hasCamera = relevantPeriperals.some(peripheral => peripheral.Product?.IsCameraProduct);\r\n });\r\n }\r\n\r\n getOnlineStatus(vehicle: IVehicle, onlineStatus: CameraOnlineStatus) : IVehicleOnlineStatus {\r\n if (!onlineStatus) {\r\n return {\r\n lastOnlineTime: null,\r\n online: false,\r\n hasStreaming: false,\r\n sortingTime: null\r\n }\r\n }\r\n\r\n const lastOnlineTime = new Date(onlineStatus.LastOnlineTime);\r\n \r\n const hasStreaming = vehicle.peripherals.some(p => \r\n p.Serial === onlineStatus.Serial && \r\n p.Product?.ProductMetadata?.CameraFeatures?.LiveStream\r\n );\r\n\r\n return {\r\n lastOnlineTime,\r\n online: onlineStatus.Online,\r\n hasStreaming,\r\n sortingTime: this.veriDate.createMoment(lastOnlineTime).add(1, 's').toDate()\r\n } \r\n }\r\n\r\n private findAndGetOnlineStatus(vehicle: IVehicle, onlineStatuses: CameraOnlineStatus[]) : IVehicleOnlineStatus {\r\n const onlineStatus = onlineStatuses.find(x => x.VehicleId === vehicle.Id);\r\n\r\n if (!onlineStatus) {\r\n return {\r\n lastOnlineTime: null,\r\n online: false,\r\n hasStreaming: false,\r\n sortingTime: null\r\n }\r\n }\r\n\r\n return this.getOnlineStatus(vehicle, onlineStatus);\r\n }\r\n\r\n isAnyPeripheralCamera(peripherals: IPeripheral[]): boolean {\r\n return peripherals.some(p => this.getCameraProductVendors().includes(p.Product?.GroupId));\r\n }\r\n\r\n // ---\r\n\r\n private getCameraProductVendors(): ProductVendor[] {\r\n return [\r\n ProductVendor.IntelligentTelematics,\r\n ProductVendor.AAMP,\r\n ProductVendor.Streamax,\r\n ProductVendor.VisionTrack,\r\n ProductVendor.RTL\r\n ];\r\n }\r\n\r\n private findInstalledPeripheralForFeature(featureIndex: number, peripherals, peripheralsCurrentlyInstalled): IPeripheral {\r\n if (!peripherals?.length) {\r\n return null;\r\n }\r\n\r\n let chosenPeripheral: IPeripheral;\r\n\r\n peripherals.forEach(peripheral => {\r\n const peripheralFeatures = this.findFeaturesFromFeaturesEnum(peripheral.Product.Features);\r\n\r\n if (!peripheralFeatures?.length || !!chosenPeripheral) {\r\n return;\r\n }\r\n\r\n for (var i = 0; i < peripheralFeatures.length; i++) {\r\n const feature = peripheralFeatures[i];\r\n const alreadyAddedPeripheral = peripheralsCurrentlyInstalled.find(installedPeripheral => installedPeripheral.Serial === peripheral.Serial);\r\n\r\n if (feature === featureIndex && !alreadyAddedPeripheral) {\r\n chosenPeripheral = peripheral;\r\n\r\n break;\r\n }\r\n }\r\n });\r\n\r\n return chosenPeripheral;\r\n }\r\n\r\n getIconForPeripheral(peripheral: IPeripheral): string {\r\n if (!peripheral) {\r\n return;\r\n }\r\n\r\n return this.getIconForFeature(peripheral.primaryFeature);\r\n }\r\n\r\n getIconForFeature(feature: AccountFeatures) {\r\n switch (feature) {\r\n case AccountFeatures.Camera:\r\n return `videocam`;\r\n\r\n case AccountFeatures.GPS:\r\n return `near_me`;\r\n\r\n default:\r\n return `token`;\r\n }\r\n }\r\n}\r\n","export enum TimeFilterType {\r\n Unset = 0,\r\n None = 1,\r\n Range = 2,\r\n Daily = 3\r\n}\r\n","import { UserAccessPermissions } from \"@enums/UserAccessPermissions\";\r\nimport { UserStatus, UserType, AccountUserType } from \"@enums/UserType\";\r\nimport { IRunBlockRootScope } from \"@interfaces/IRunBlockRootScope\";\r\nimport { IUser, UserPlatform } from \"@interfaces/IUser\";\r\nimport { StateService } from \"@uirouter/angularjs\";\r\nimport * as angular from \"angular\";\r\nimport { AccountUserMappingService } from \"./accountUserMapping.service.ajs\";\r\nimport { CacheService } from \"./cache.Service\";\r\nimport { CurrentUserService } from \"./currentUser.service\";\r\nimport { UserMappingsService } from \"./userMappings.service\";\r\n\r\nexport interface IGetUsersOptions {\r\n includeMappings?: boolean;\r\n includeAdmins?: boolean;\r\n}\r\n\r\nexport class UsersService {\r\n\r\n private cacheName = \"usersCache\";\r\n\r\n\r\n static $inject = [\"$q\", \"$http\", \"$rootScope\", \"$state\", \"currentUserService\", \"accountUserMappingService\", \"cacheService\",\"userMappingsService\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $http: angular.IHttpService,\r\n private readonly $rootScope: IRunBlockRootScope,\r\n private readonly $state: StateService,\r\n private readonly currentUserService: CurrentUserService,\r\n private readonly accountUserMappingService: AccountUserMappingService,\r\n private readonly cacheService: CacheService,\n private readonly userMappingsService: UserMappingsService) {\r\n\r\n this.cacheService.createCache(this.cacheName, {\r\n deleteOnExpire: \"passive\",\r\n maxAge: 60 * 60 * 1000, // 60min default\r\n });\r\n }\r\n\r\n createDefaultUserModel(accountId: number = 0): IUser {\n const newUser: IUser = {\r\n Id: 0,\n Type: UserType.Fleet,\r\n DriverIds: [],\r\n VehicleIds: [],\r\n GeofenceIds: [],\r\n GroupIds: [],\r\n CurrentAccountUserMapping: {\r\n AccountId: accountId,\r\n Status: UserStatus.Active,\r\n Type: AccountUserType.User,\r\n AccessMask: UserAccessPermissions.None,\n ReadFeatures: 0,\n ManageFeatures: 0,\n SpecialUserPermissions: 0\r\n },\n newUserLanguageCode: localStorage.getItem('userSelectedLanguageCode')??'en'\r\n }\n\n return newUser;\n }\n\n updateOrInsertUserCache(user: IUser): void {\r\n this.cacheService.addOrUpdateItem(this.cacheName, user, (v1, v2) => v1.Id == v2.Id);\r\n }\r\n\r\n getUsers(getUsersOptions?: IGetUsersOptions, invalidateCache = false, unsafe = false): angular.IPromise {\r\n return this.cacheService.getOrRetrieveData(this.cacheName, () => this.getUsersFromDatabase(getUsersOptions, invalidateCache), invalidateCache, unsafe);\r\n }\r\n\r\n getUsersFromDatabase(getUsersOptions?: IGetUsersOptions, invalidateCache = false): angular.IPromise {\r\n\r\n var accountMappingPromise = this.accountUserMappingService.getAccountUserMappings(invalidateCache);\n\r\n var groupMappingPromise = this.userMappingsService.getGroupMappings(invalidateCache);\r\n\r\n var usersPromise = this.getUsersPromise(getUsersOptions, invalidateCache);\r\n\r\n var currentUserPromise = this.currentUserService.getCurrentUser(invalidateCache);\r\n\r\n return this.$q.all([accountMappingPromise, usersPromise, currentUserPromise, groupMappingPromise]).then(([accountMappings, users, currentUser, groupMappings]) => {\r\n\r\n users.forEach(user => {\r\n user.AccountUserMappings = accountMappings.filter(mapping => mapping.UserId == user.Id);\n\n user.GroupIds = groupMappings.filter(mapping => mapping.UserId == user.Id).map(m => { return m.GroupId;});\r\n\r\n var currentMappings = user.AccountUserMappings.filter(mapping => mapping.AccountId == currentUser.CurrentAccountUserMapping.AccountId)\r\n\r\n user.CurrentAccountUserMapping = currentMappings.length > 0 ? currentMappings[0] : null;\r\n })\r\n\r\n if (!getUsersOptions.includeAdmins) {\r\n return this.filterNonAdmins(users);\r\n }\r\n\r\n return users;\r\n });\r\n }\r\n\r\n private getUsersPromise(getUsersOptions?: IGetUsersOptions, invalidateCache = false): angular.IPromise {\r\n\r\n return this.$http({\r\n url: \"/api/users/\",\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 30, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpResponse) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n save(user: IUser): angular.IPromise {\r\n return this\r\n .$http({\r\n method: \"POST\",\r\n url: \"/api/users/\",\r\n data: user,\r\n params: { userLanguage: user.newUserLanguageCode }\r\n })\r\n .then((response: angular.IHttpResponse) => {\r\n return response.data;\r\n });\r\n }\n\n deactivateUser(user: IUser): angular.IPromise {\r\n return this.$http({\r\n method: \"POST\",\r\n url: \"/api/users/deactivate\",\r\n data: user\r\n });\r\n }\n\r\n reactivateUser(user: IUser): angular.IPromise {\r\n return this.$http({\r\n method: \"POST\",\r\n url: \"/api/users/reactivate\",\r\n data: user.Id\r\n });\r\n }\r\n\r\n emailExists(emailAddress: string): angular.IPromise {\r\n return this.$http(\r\n {\r\n url: `/api/users/emailexists`,\r\n method: \"GET\",\r\n params: { emailAddress: emailAddress }\r\n })\r\n .then((result: angular.IHttpResponse) => {\r\n return result.data;\r\n });\r\n }\n\n getLoginToken(userId: number): angular.IPromise {\n return this\r\n .$http({\r\n url: `/api/users/token/${userId}/`,\r\n method: \"GET\",\r\n })\r\n .then((result: angular.IHttpResponse) => {\r\n return result.data;\r\n });\r\n }\n\n getPrimaryUserLoginToken(accountId: number): angular.IPromise {\n return this\r\n .$http({\r\n url: `/api/users/token/primary/${accountId}/`,\r\n method: \"GET\",\r\n })\r\n .then((result: angular.IHttpResponse) => {\r\n return result.data;\r\n });\r\n }\n\n emailBelongsToAccount(emailAddress: string, customerId: number): angular.IPromise {\r\n return this.$http(\r\n {\r\n url: `/api/users/emailBelongsToAccount`,\r\n method: \"GET\",\r\n params: { emailAddress: emailAddress, customerId: customerId }\r\n })\r\n .then((result: angular.IHttpResponse) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n isCurrentUserInternal(): boolean {\r\n const currentUser: IUser = this.$rootScope.currentUser;\r\n\r\n return currentUser?.Type == UserType.InternalUser;\r\n }\r\n\r\n isCurrentUserOnFoundationPlatform(): boolean {\n const user: IUser = this.$rootScope.currentUser;\n\r\n if (!user) {\n return false;\r\n }\r\n\r\n return user.platform === UserPlatform.Foundation;\r\n }\n\n isInternalOrFoundation(): boolean {\n return this.isCurrentUserOnFoundationPlatform() || this.isCurrentUserInternal();\r\n }\n\r\n findUser(users: IUser[], userId): IUser {\r\n for (let i = 0; i < users.length; i++) {\r\n const user = users[i];\r\n\r\n if (user.Id === userId) {\r\n return user;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n verifyCurrentPassword(password: string) {\r\n return this.$http({\r\n method: \"GET\",\r\n url: \"/api/users/verifycurrentpassword\",\r\n params: { password: password }\r\n })\r\n .then((result: angular.IHttpResponse) => {\r\n return result.data;\r\n });\r\n }\n\r\n // ----------------------------------------------\r\n\r\n private filterNonAdmins(users: IUser[]) {\r\n const newList: IUser[] = [];\r\n\r\n users.forEach(user => {\r\n if (user.CurrentAccountUserMapping && user.CurrentAccountUserMapping.Type !== AccountUserType.Admin) {\r\n newList.push(user);\r\n }\r\n });\r\n\r\n return newList;\r\n }\r\n}\r\n","export enum CameraLocation {\r\n OtherLocation,\r\n Forward,\r\n Rear,\r\n Internal,\r\n Cargo,\r\n Left,\r\n Right\r\n}\r\n","export enum VideoObservation {\r\n Collision,\r\n Witness,\r\n Turning,\r\n Braking,\r\n Acceleration,\r\n Stationary,\r\n Reversing,\r\n Pedestrians,\r\n Awareness,\r\n Impatience,\r\n Perception,\r\n Preventable,\r\n NonPreventable,\r\n ReactionTime,\r\n Speeding,\r\n FollowingDistance \r\n}\r\n","\r\nexport enum VideoReviewSubStatus {\r\n None,\r\n NoActionRequired,\r\n ActionRequired\r\n}\r\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { ICameraChannel } from \"@app/main/components/videos/models/ICameraChannel\";\r\nimport { ConstantsService } from \"@app/services/constantsService\";\r\nimport { Observable } from \"rxjs\";\r\nimport { IProcessResult } from \"../../foundation/foundation.interfaces\";\r\n\r\nexport interface IVideoChannelQueryOptions {\r\n Id?: number;\r\n ChannelId?: number;\r\n VehicleId?: number;\r\n AccountId?: number;\r\n IsActive?: boolean;\r\n}\r\n\r\nexport interface IChannelThumbnail {\r\n\r\n Guid?: string;\r\n ChannelId?: number;\r\n Time?: Date;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CameraChannelService {\r\n apiUrl: string\r\n\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly constantsService: ConstantsService\r\n ) {}\r\n\r\n getCameraChannels(options: IVideoChannelQueryOptions = {}): Observable {\r\n return this.http.get(`/api/cameras/channels`, { params: options as HttpParams });\r\n }\r\n\r\n updateCameraChannels(channels: ICameraChannel[]): Observable {\r\n return this.http.post(`/api/cameras/channels`, channels)\r\n }\r\n\r\n getChannelThumbnails(vehicleId: number): Observable {\r\n return this.http.get(`/api/cameras/channels/thumbnails/${vehicleId}`);\r\n }\r\n\r\n getCommissionChannels(peripheralSerial: string, vehicleId: number): Observable {\r\n return this.http.get(`/api/cameras/channels/commissioncamerachannels`, { params: { peripheralSerial, vehicleId } })\r\n }\r\n\r\n saveCommissionChannels(channels: ICameraChannel[]): Observable {\r\n return this.http.post(`/api/cameras/channels/commissioncamerachannels`, channels);\r\n }\r\n\r\n createMediaGuidUrl(guid: string): string {\r\n if (!guid) {\r\n return null;\r\n }\r\n\r\n return `${this.constantsService.getApiUrl()}/api/cameras/media/${guid}`;\r\n }\r\n}\r\n","import { Component, ContentChild, EventEmitter, forwardRef, HostBinding, Inject, Input, OnChanges, OnDestroy, OnInit, Optional, Output, SimpleChanges, TemplateRef } from \"@angular/core\";\r\nimport \"./v-tab.component.scss\";\r\nimport { VTabsComponent, VTabStepperState } from \"./v-tabs.component\";\r\n\r\n@Component({\r\n selector: 'v-tab',\r\n template: require(\"./v-tab.component.html\"),\r\n})\r\nexport class VTabComponent implements OnChanges, OnDestroy {\r\n\r\n @Input() tabTitle: string;\r\n @Input() tabId: string;\r\n @Input() icon: string;\r\n @Input() iconClass: string;\r\n @Input() count: number;\r\n\r\n @Input() stepperComplete: boolean;\r\n @Input() disabled: boolean;\r\n @Input() disableNext: boolean;\r\n @Input() disablePrev: boolean;\r\n @Input() nextLabel: string = \"Next\";\r\n @Input() nextIcon: string = \"chevron_right\";\r\n\r\n @Input() hideIfNoData: boolean;\r\n @Input() hide: boolean;\r\n @Input() selected: any;\r\n @Input() hideOnMobile: boolean;\r\n\r\n @Input() error: boolean;\r\n\r\n @Output() onTabSelected: EventEmitter = new EventEmitter();\r\n\r\n // used in angular only - https://stackoverflow.com/questions/41453727/is-it-possible-to-prevent-child-components-from-being-created-if-ng-content-is-n\r\n @Input() @ContentChild(TemplateRef) templateRef!: TemplateRef;\r\n\r\n // ---\r\n\r\n @HostBinding(\"hidden\") private hidden = true;\r\n stepperState = VTabStepperState.Todo;\r\n tabIndex: number;\r\n\r\n clickable = true;\r\n\r\n constructor(@Optional() @Inject(forwardRef(() => VTabsComponent)) private parent: VTabsComponent) {\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.hide) {\r\n return;\r\n }\r\n\r\n this.parent.tabs.push(this);\r\n this.parent.registerTab(this);\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes[\"stepperComplete\"] && this.stepperComplete) {\r\n this.stepperState = VTabStepperState.Complete;\r\n this.parent.onTabStepperStateChanged(this);\r\n }\r\n\r\n if (changes[\"selected\"] && this.selected) {\r\n this.parent.selectTab(this);\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.parent.tabs = this.parent.tabs.filter(t => t != this);\r\n this.parent.unregisterTab(this);\r\n }\r\n\r\n showTab() {\r\n this.hidden = false;\r\n this.onTabSelected.emit();\r\n }\r\n\r\n hideTab() {\r\n this.hidden = true;\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { AbstractControl, ValidationErrors, ValidatorFn } from \"@angular/forms\";\r\nimport { IKeyValuePair } from \"@app/interfaces/IKeyValuePair\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { IVehicleUnitMapping } from \"@app/interfaces/IVehiclePeripheralMapping\";\r\nimport { copy } from \"angular\";\r\nimport { lastValueFrom, Observable, Subject } from \"rxjs\";\r\nimport { tap } from \"rxjs/operators\";\r\nimport { DataCacheService } from \"./caching/data-cache.service\";\r\nimport { EnumService } from \"./enum.service\";\r\nimport { TranslationService } from \"./translation.service\";\r\n\r\nexport enum DeviceParameterType {\r\n OverRev,\r\n GreenBandLower,\r\n GreenBandUpper,\r\n SweetSpotLower,\r\n SweetSpotUpper\r\n}\r\n\r\nexport interface IDeviceParameterProfileQueryOptions {\r\n MaterialisationOptions?: DeviceParameterProfileMaterialisationOptions;\r\n Id?: number;\r\n AccountId?: number;\r\n Active?: boolean;\r\n}\r\n\r\nexport interface ILatestDeviceParameterProfileQueryOptions {\r\n Serial?: string;\r\n DeviceParameterRecordId?: number;\r\n}\r\n\r\nexport enum DeviceParameterProfileMaterialisationOptions {\r\n All = -1,\r\n Basic = 0,\r\n WithMappings = 1\r\n}\r\n\r\nexport interface IDeviceParameterProfile {\r\n Id: number;\r\n AccountId?: number;\r\n Name: string;\r\n ParameterMap: DeviceParameterMap;\r\n Active: boolean;\r\n CreatedTime?: Date;\r\n UpdatedTime?: Date;\r\n UnitDeviceParameterProfileMappings: IDeviceParameterProfileMapping[];\r\n\r\n // ---\r\n\r\n parametersSetLabel?: string;\r\n appliesToLabel?: string;\r\n}\r\n\r\nexport interface IDeviceParameterRecord {\r\n Id: number;\r\n Serial: string;\r\n PlotId: number;\r\n EventTime: Date;\r\n ParameterMap: DeviceParameterMap;\r\n CreatedTime: Date;\r\n}\r\n\r\nexport interface ILatestDeviceParameterRecordQueryOptions {\r\n Serial?: string;\r\n DeviceParameterRecordId?: number;\r\n}\r\n\r\nexport interface IDeviceParameterProfileMapping {\r\n Id: number;\r\n VehicleId: number;\r\n DeviceParameterProfileId: number;\r\n CreatedTime?: Date;\r\n UpdatedTime?: Date;\r\n DeviceParameterProfile?: IDeviceParameterProfile;\r\n\r\n // ---\r\n\r\n validationError?: string;\r\n}\r\n\r\nexport interface IDeviceParameterComparisonResult {\r\n Comparisons: IDeviceParameterComparison[];\r\n IsCorrect: boolean;\r\n\r\n // ---\r\n\r\n vehicleHasUnit?: boolean;\r\n hasAssignedProfile?: boolean;\r\n}\r\n\r\nexport interface IDeviceParameterComparison {\r\n DeviceParameterType: DeviceParameterType;\r\n ProfileValue?: number;\r\n DeviceValue?: number;\r\n DeviceSupported: boolean;\r\n IsCorrect: boolean;\r\n}\r\n\r\nexport enum DeviceComparisonStatus {\r\n NoProfileAssigned,\r\n NoUnitInstalled,\r\n IncompatibleUnit,\r\n Synchronized,\r\n AwaitingSync,\r\n}\r\n\r\nexport type DeviceParameterComparisonResultMap = { [key: number]: IDeviceParameterComparisonResult }; // key: VehicleId\r\nexport type DeviceParameterMap = { [key: number]: number }; // key: DeviceParameterType\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DeviceProfileService {\r\n readonly deviceParameterDefaults = {\r\n [DeviceParameterType.GreenBandLower]: 600,\r\n [DeviceParameterType.SweetSpotLower]: 1000,\r\n [DeviceParameterType.SweetSpotUpper]: 1400,\r\n [DeviceParameterType.GreenBandUpper]: 1800,\r\n [DeviceParameterType.OverRev]: 2200,\r\n };\r\n\r\n private deviceProfilesSubject: Subject = new Subject();\r\n deviceProfilesUpdated = this.deviceProfilesSubject.asObservable();\r\n\r\n private profilesCache: string = 'activeDeviceProfilesCache';\r\n\r\n constructor(\r\n private readonly httpClient: HttpClient,\r\n private readonly dataCacheService: DataCacheService,\r\n private readonly translationService: TranslationService\r\n ) { }\r\n\r\n getComparisonsForAllVehicles(invalidateCache: boolean = false): Promise {\r\n\r\n const options = { params: {} as HttpParams }\r\n\r\n options.params[\"minsToLive\"] = 30;\r\n options.params[\"invalidateCache\"] = invalidateCache;\r\n\r\n return lastValueFrom(this.httpClient.get(`/api/deviceparameters/comparisons`, options));\r\n }\r\n\r\n getComparisonForVehicle(vehicle: IVehicle, invalidateCache: boolean = false): Promise {\r\n\r\n const options = { params: {} as HttpParams }\r\n\r\n options.params[\"minsToLive\"] = 30;\r\n options.params[\"invalidateCache\"] = invalidateCache;\r\n\r\n return lastValueFrom(this.httpClient.get(`/api/deviceparameters/comparison/${vehicle.Id}`, options)).then(comparison => {\r\n\r\n if (!comparison) {\r\n return {\r\n Comparisons: [],\r\n IsCorrect: false,\r\n vehicleHasUnit: vehicle.HasUnit\r\n }\r\n }\r\n\r\n comparison.vehicleHasUnit = vehicle.HasUnit;\r\n\r\n return comparison;\r\n });\r\n }\r\n\r\n getProfiles(profileQueryOptions: IDeviceParameterProfileQueryOptions = {}, invalidateCache: boolean = false): Observable {\r\n if (profileQueryOptions.Id || profileQueryOptions.AccountId) {\r\n return this.getProfilesFromDb(profileQueryOptions);\r\n }\r\n\r\n return this.dataCacheService.getOrRequest(this.profilesCache, () => this.getProfilesFromDb(profileQueryOptions), { invalidateCache });\r\n }\r\n\r\n getProfilesFromDb(profileQueryOptions: IDeviceParameterProfileQueryOptions = {}): Observable {\r\n const options = { params: profileQueryOptions as HttpParams }\r\n\r\n return this.httpClient.get(`/api/deviceparameters/profiles`, options);\r\n }\r\n\r\n getProfileForVehicle(vehicleId: number, invalidateCache: boolean = false): Promise {\r\n const options = { params: new HttpParams() };\r\n\r\n options.params.set(\"minsToLive\", 30);\r\n options.params.set(\"invalidateCache\", invalidateCache);\r\n\r\n return lastValueFrom(this.httpClient.get(`/api/deviceparameters/profile/${vehicleId}`, options));\r\n }\r\n\r\n getDeviceParameterRecords(profileQueryOptions: IDeviceParameterProfileQueryOptions = {}, invalidateCache: boolean = false): Promise {\r\n const options = { params: profileQueryOptions as HttpParams };\r\n\r\n options.params[\"minsToLive\"] = 30;\r\n options.params[\"invalidateCache\"] = invalidateCache;\r\n\r\n return lastValueFrom(this.httpClient.get(`/api/deviceparameters/records`, options));\r\n }\r\n\r\n getLatestDeviceParameterRecords(profileQueryOptions: ILatestDeviceParameterProfileQueryOptions = {}, invalidateCache: boolean = false): Promise {\r\n const options = { params: profileQueryOptions as HttpParams };\r\n\r\n options.params[\"minsToLive\"] = 30;\r\n options.params[\"invalidateCache\"] = invalidateCache;\r\n\r\n return lastValueFrom(this.httpClient.get(`/api/deviceparameters/records/latest`, options));\r\n }\r\n\r\n getLatestRecords(latestParameterRecordQueryOptions: ILatestDeviceParameterRecordQueryOptions = {}, invalidateCache: boolean = false): Promise {\r\n const options = { params: latestParameterRecordQueryOptions as HttpParams }\r\n\r\n options.params[\"minsToLive\"] = 30;\r\n options.params[\"invalidateCache\"] = invalidateCache;\r\n\r\n return lastValueFrom(this.httpClient.get(`/api/deviceparameters/profile/latest`, options));\r\n }\r\n\r\n addUpdateProfile(deviceParameterProfile: IDeviceParameterProfile, invalidateCache: boolean = false): Promise {\r\n const options = { params: new HttpParams() };\r\n\r\n options.params.set(\"minsToLive\", 30);\r\n options.params.set(\"invalidateCache\", invalidateCache);\r\n\r\n return lastValueFrom(this.httpClient.post(`/api/deviceparameters/profile`, deviceParameterProfile, options).pipe(\r\n tap((profile: IDeviceParameterProfile) => {\r\n if (!deviceParameterProfile.CreatedTime) {\r\n profile.CreatedTime = profile.UpdatedTime = new Date();\r\n }\r\n this.dataCacheService.addOrUpdateItem(profile, this.profilesCache);\r\n })\r\n ));\r\n }\r\n\r\n deleteProfile(deviceParameterProfile: IDeviceParameterProfile, invalidateCache: boolean = false): Promise {\r\n const deleteModel = copy(deviceParameterProfile);\r\n\r\n deleteModel.Active = false;\r\n deleteModel.UnitDeviceParameterProfileMappings = [];\r\n\r\n return this.addUpdateProfile(deleteModel, invalidateCache);\r\n }\r\n\r\n addMapping(deviceProfileMapping: IDeviceParameterProfileMapping, invalidateCache: boolean = false): Promise {\r\n const options = { params: new HttpParams() };\r\n\r\n options.params.set(\"minsToLive\", 30);\r\n options.params.set(\"invalidateCache\", invalidateCache);\r\n\r\n return lastValueFrom(this.httpClient.post(`/api/deviceparameters/mapping`, deviceProfileMapping, options));\r\n }\r\n\r\n deleteMapping(deviceProfileMapping: IDeviceParameterProfileMapping, invalidateCache: boolean = false): Promise {\r\n const options = {\r\n params: new HttpParams(),\r\n body: deviceProfileMapping\r\n };\r\n\r\n options.params.set(\"minsToLive\", 30);\r\n options.params.set(\"invalidateCache\", invalidateCache);\r\n\r\n return lastValueFrom(this.httpClient.delete(`/api/deviceparameters/mapping`, options));\r\n }\r\n\r\n createDeviceParameterProfileTemplate(): IDeviceParameterProfile {\r\n const newProfileTemplate: IDeviceParameterProfile = {\r\n Id: 0,\r\n Name: \"\",\r\n ParameterMap: this.createDeviceParameterMap(),\r\n Active: true,\r\n UnitDeviceParameterProfileMappings: []\r\n }\r\n\r\n return newProfileTemplate;\r\n }\r\n\r\n createDeviceParameterMap(): DeviceParameterMap {\r\n const deviceParameterTypes: IKeyValuePair[] = EnumService.enumToArray(\"DeviceParameterType\", DeviceParameterType);\r\n deviceParameterTypes.sort((deviceParameterType1, deviceParameter2) => (deviceParameterType1.value > deviceParameter2.value) ? 1 : -1);\r\n\r\n const newDeviceParameterMap: DeviceParameterMap = {};\r\n\r\n deviceParameterTypes.forEach(kvp => {\r\n newDeviceParameterMap[kvp.name] = this.deviceParameterDefaults[+kvp.value];\r\n });\r\n\r\n return newDeviceParameterMap;\r\n }\r\n\r\n uniqueDeviceProfileNameValidator(deviceProfile: IDeviceParameterProfile, deviceProfiles: IDeviceParameterProfile[]): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n\r\n if (!deviceProfiles?.length || !control.value) {\r\n return null;\r\n }\r\n\r\n const isDuplicate = this.deviceProfileNameInUse(deviceProfile, deviceProfiles);\r\n\r\n return isDuplicate ? { customMessage: this.translationService.t(\"DeviceProfileEditor.UniqueStyleNameWarning\") } : null;\r\n };\r\n }\r\n\r\n deviceProfileNameInUse(deviceProfile: IDeviceParameterProfile, deviceProfiles: IDeviceParameterProfile[]): boolean {\r\n if (!deviceProfile?.Name || !deviceProfiles?.length) {\r\n return false;\r\n }\r\n\r\n const matchingStyles = deviceProfiles.filter(existingDrivingStyle => {\r\n\r\n return existingDrivingStyle.Name.toLowerCase() === deviceProfile.Name.toLowerCase()\r\n && existingDrivingStyle.Id !== deviceProfile.Id;\r\n });\r\n\r\n return matchingStyles?.length > 0;\r\n }\r\n\r\n getParameterLabelForProfile(deviceProfile: IDeviceParameterProfile): string {\r\n let parameterLabel = \"\";\r\n\r\n if (!deviceProfile?.ParameterMap) {\r\n return parameterLabel;\r\n }\r\n\r\n const parameterKeys: string[] = Object.keys(deviceProfile?.ParameterMap);\r\n\r\n if (!parameterKeys?.length) {\r\n return parameterLabel;\r\n }\r\n\r\n return `${parameterKeys.length}`;\r\n }\r\n\r\n createMappingPillsForDeviceProfile(deviceProfile: IDeviceParameterProfile): void {\r\n\r\n if (!deviceProfile) {\r\n return;\r\n }\r\n\r\n deviceProfile.appliesToLabel = \"\";\r\n\r\n if (!deviceProfile.UnitDeviceParameterProfileMappings?.length) {\r\n return;\r\n }\r\n\r\n if (this.hasAllResourcesMapping(deviceProfile)) {\r\n deviceProfile.appliesToLabel = this.translationService.t(\"DeviceProfileEditor.AllResourcesMapping\");\r\n\r\n return;\r\n }\r\n\r\n deviceProfile.appliesToLabel = this.translationService.t(\"DeviceProfileEditor.TotalVehicleMappings\", deviceProfile.UnitDeviceParameterProfileMappings.length);\r\n }\r\n\r\n hasAllResourcesMapping(deviceProfile: IDeviceParameterProfile): boolean {\r\n if (!deviceProfile.UnitDeviceParameterProfileMappings?.length) {\r\n false;\r\n }\r\n\r\n return deviceProfile.UnitDeviceParameterProfileMappings.length === 1\r\n && !deviceProfile.UnitDeviceParameterProfileMappings[0].VehicleId;\r\n }\r\n\r\n hasVehicleIdMapping(deviceProfile: IDeviceParameterProfile, vehicleId: number): boolean {\r\n if (!deviceProfile.UnitDeviceParameterProfileMappings?.length) {\r\n false;\r\n }\r\n\r\n return !!deviceProfile.UnitDeviceParameterProfileMappings.find(mapping => mapping.VehicleId === vehicleId);\r\n }\r\n\r\n mapDeviceProfilesToVehicles(deviceProfiles: IDeviceParameterProfile[], vehicles: IVehicle[]): void {\r\n\r\n if (!deviceProfiles?.length || !vehicles?.length) {\r\n console.warn(\"Can't map device profiles due to missing resources\");\r\n return;\r\n }\r\n\r\n const allResourcesProfile = deviceProfiles.find(profile => this.hasAllResourcesMapping(profile));\r\n\r\n vehicles.forEach(vehicle => {\r\n vehicle.deviceProfile = allResourcesProfile;\r\n\r\n const matchingProfile = deviceProfiles.find(profile => this.hasVehicleIdMapping(profile, vehicle.Id));\r\n\r\n if (matchingProfile) {\r\n vehicle.deviceProfile = matchingProfile;\r\n }\r\n });\r\n }\r\n\r\n mapDeviceEventTimeToVehicles(latestDeviceParameterRecords: IDeviceParameterRecord[], unitMappings: IVehicleUnitMapping[], vehicles: IVehicle[]) {\r\n vehicles.forEach(vehicle => {\r\n if (!vehicle.PlotId) {\r\n return;\r\n }\r\n\r\n const unitMapping = unitMappings.find(mapping => mapping.VehicleId == vehicle.Id);\r\n\r\n if (!unitMapping) {\r\n return;\r\n }\r\n\r\n const latestRecord = latestDeviceParameterRecords.find(record => record.Serial == unitMapping.Serial);\r\n\r\n if (latestRecord) {\r\n vehicle.deviceLastSynced = latestRecord.EventTime;\r\n }\r\n })\r\n }\r\n\r\n mapDeviceParameterComparisonResultsToVehicles(deviceParameterComparisonResultMap: DeviceParameterComparisonResultMap, vehicles: IVehicle[]): void {\r\n if (!Object.keys(deviceParameterComparisonResultMap)?.length || !vehicles?.length) {\r\n console.warn(\"Can't map device profiles due to missing resources\");\r\n return;\r\n }\r\n\r\n vehicles.forEach(vehicle => {\r\n if (!deviceParameterComparisonResultMap[vehicle.Id]) {\r\n vehicle.deviceParameterComparisonResult = {\r\n Comparisons: [],\r\n IsCorrect: false,\r\n vehicleHasUnit: vehicle.HasUnit,\r\n hasAssignedProfile: !!vehicle.deviceProfile\r\n }\r\n\r\n return;\r\n }\r\n\r\n vehicle.deviceParameterComparisonResult = deviceParameterComparisonResultMap[vehicle.Id];\r\n vehicle.deviceParameterComparisonResult.vehicleHasUnit = vehicle.HasUnit;\r\n vehicle.deviceParameterComparisonResult.hasAssignedProfile = !!vehicle.deviceProfile;\r\n });\r\n }\r\n\r\n getDeviceParameterComparisonResultDisplayStatus(result: IDeviceParameterComparisonResult, translate: boolean = false): string {\r\n const status: DeviceComparisonStatus = this.getDeviceParameterComparisonResultStatus(result);\r\n\r\n return (translate)\r\n ? this.translationService.tEnum(DeviceComparisonStatus, \"DeviceComparisonStatus\", status)\r\n : DeviceComparisonStatus[status];\r\n }\r\n\r\n getDeviceParameterComparisonResultStatus(result: IDeviceParameterComparisonResult): DeviceComparisonStatus { \r\n if (result && !result.vehicleHasUnit) {\r\n return DeviceComparisonStatus.NoUnitInstalled;\r\n }\r\n\r\n if (!result || (!result?.Comparisons?.length && result?.vehicleHasUnit)) {\r\n return DeviceComparisonStatus.IncompatibleUnit;\r\n }\r\n\r\n if (!result.IsCorrect && !result.hasAssignedProfile) {\r\n return DeviceComparisonStatus.NoProfileAssigned\r\n }\r\n\r\n if (!result.IsCorrect) {\r\n return DeviceComparisonStatus.AwaitingSync;\r\n }\r\n\r\n return DeviceComparisonStatus.Synchronized;\r\n }\r\n\r\n getDeviceParameterComparisonResultStatusLabel(result: IDeviceParameterComparisonResult): string {\r\n const status = this.getDeviceParameterComparisonResultStatus(result);\r\n\r\n switch (status) {\r\n case DeviceComparisonStatus.NoUnitInstalled: return this.translationService.t(\"DeviceProfileService.NoUnitInstalledLabel\");\r\n case DeviceComparisonStatus.IncompatibleUnit: return this.translationService.t(\"DeviceProfileService.IncompatibleUnitLabel\");\r\n case DeviceComparisonStatus.AwaitingSync: return this.translationService.t(\"DeviceProfileService.AwaitingSyncLabel\");\r\n case DeviceComparisonStatus.Synchronized: return this.translationService.t(\"DeviceProfileService.SynchronizedLabel\");\r\n default: return undefined;\r\n }\r\n }\r\n\r\n getDescriptiveDeviceParameterComparisonResultLabel(result: IDeviceParameterComparisonResult): string {\r\n\r\n if (!result) {\r\n return \"\";\r\n }\r\n\r\n if (!result?.Comparisons?.length) {\r\n return \"\";\r\n }\r\n\r\n let totalAwaitingSync = 0;\r\n\r\n result.Comparisons.forEach(comparison => {\r\n if (!comparison.IsCorrect) {\r\n totalAwaitingSync++;\r\n }\r\n });\r\n\r\n const outOfSyncLabel = (totalAwaitingSync === result.Comparisons.length)\r\n ? this.translationService.t(\"DeviceProfileService.AllParametersOutOfSyncLabel\")\r\n : this.translationService.t(\"DeviceProfileService.XParametersOutOfSync\", [result.Comparisons.length - totalAwaitingSync, result.Comparisons.length]);\r\n\r\n const inSyncLabel = ``;\r\n\r\n return (totalAwaitingSync > 0) ? outOfSyncLabel : inSyncLabel;\r\n }\r\n}\r\n","import { DecimalPipe } from \"@angular/common\";\r\nimport { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { AbstractControl, ValidationErrors, ValidatorFn } from \"@angular/forms\";\r\nimport { IPill } from \"@app/directives/_veri/v-pills/v-pills.component\";\r\nimport { VehicleType } from \"@app/enum/VehicleType.enum\";\r\nimport { IKeyValuePair } from \"@app/interfaces/IKeyValuePair\";\r\nimport { IGroup } from \"@app/interfaces/IVehicleGroup\";\r\nimport { EnumService } from \"@app/services/enum.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { copy } from \"angular\";\r\nimport { lastValueFrom } from \"rxjs\";\r\nimport { DrivingStyleMetric, DrivingStyleMetricCategory, DrivingStyleMetricDenominator, DrivingStyleWeightingType, MetricMappingWeightingLevel } from \"./driving-styles.enums\";\r\nimport { DrivingStyleMetricDenominatorMap, IDrivingPerformanceSummary, IDrivingStyle, IDrivingStyleAssociation, IDrivingStyleMetricDescriptionDetails, IDrivingStyleMetricMapping, IJourneysWithAssociatedDrivingStyle } from \"./driving-styles.interfaces\";\r\n\r\nexport interface IMetricMappingWeightingLevelDetail {\r\n level: MetricMappingWeightingLevel;\r\n value: number;\r\n icon?: string;\r\n isDefault?: boolean;\r\n hideFromDropdown?: boolean;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DrivingStylesService {\r\n\r\n VehicleType = VehicleType;\r\n\r\n constructor(\r\n private readonly httpClient: HttpClient,\r\n private readonly translationService: TranslationService\r\n ) { }\r\n\r\n getDrivingStyles(invalidateCache: boolean = false, includeDefaultDrivingStyle: boolean = false): Promise {\r\n\r\n const options = { params: {} as HttpParams }\r\n\r\n options.params[\"minsToLive\"] = 30;\r\n options.params[\"invalidateCache\"] = invalidateCache;\r\n\r\n return lastValueFrom(this.httpClient.get(`/api/drivingstyles/styles/${includeDefaultDrivingStyle}`, options));\r\n }\r\n\r\n getDefaultDrivingStyle(invalidateCache: boolean = false): Promise {\r\n const options = { params: {} as HttpParams }\r\n\r\n options.params[\"minsToLive\"] = 30;\r\n options.params[\"invalidateCache\"] = invalidateCache;\r\n\r\n return lastValueFrom(this.httpClient.get(`/api/drivingstyles/defaultstyle`, options));\r\n }\r\n\r\n getDrivingStyleForVehicle(vehicleId: number, invalidateCache: boolean = false): Promise {\r\n\r\n const options = { params: {} as HttpParams }\r\n\r\n options.params[\"minsToLive\"] = 30;\r\n options.params[\"invalidateCache\"] = invalidateCache;\r\n options.params[\"vehicleId\"] = vehicleId;\r\n\r\n return lastValueFrom(this.httpClient.get(`/api/drivingstyles/styleforvehicle`, options));\r\n }\r\n\r\n saveDrivingStyle(drivingStyle: IDrivingStyle, invalidateCache: boolean = false): Promise {\r\n\r\n const options = { params: {} as HttpParams }\r\n\r\n options.params[\"minsToLive\"] = 30;\r\n options.params[\"invalidateCache\"] = invalidateCache;\r\n\r\n return lastValueFrom(this.httpClient.post(`/api/drivingstyles/style`, drivingStyle, options));\r\n }\r\n\r\n deleteDrivingStyleById(drivingStyleId: number, invalidateCache: boolean = false): Promise {\r\n\r\n const options = { params: {} as HttpParams }\r\n\r\n options.params[\"minsToLive\"] = 30;\r\n options.params[\"invalidateCache\"] = invalidateCache;\r\n\r\n return lastValueFrom(this.httpClient.delete(`/api/drivingstyles/style/${drivingStyleId}`, options));\r\n }\r\n\r\n async getDrivingStyleMetricDescriptionDetails(invalidateCache: boolean = false): Promise {\r\n\r\n const metricDenominatorMap = await this.getDrivingStyleMetricsWithDenominations(invalidateCache);\r\n\r\n if (!metricDenominatorMap) {\r\n console.warn(\"Couldn't get metrics denominators\");\r\n return;\r\n }\r\n\r\n const denominatorKeys = Object.keys(metricDenominatorMap);\r\n\r\n if (!denominatorKeys?.length) {\r\n console.warn(\"No metrics denominators in map\");\r\n return;\r\n }\r\n\r\n const descriptions: IDrivingStyleMetricDescriptionDetails[] = [];\r\n\r\n denominatorKeys.forEach(key => {\r\n const metricMapping: DrivingStyleMetric = DrivingStyleMetric[key];\r\n const denominator: DrivingStyleMetricDenominator = metricDenominatorMap[key];\r\n\r\n descriptions.push({\r\n DrivingStyleMetric: metricMapping,\r\n Description: this.createMetricDescription(metricMapping, denominator),\r\n Denominator: denominator\r\n });\r\n });\r\n\r\n return descriptions;\r\n }\r\n\r\n calculateDrivingScore(drivingStyle: IDrivingStyle, invalidateCache: boolean = false): Promise {\r\n\r\n const options = { params: {} as HttpParams }\r\n\r\n options.params[\"minsToLive\"] = 30;\r\n options.params[\"invalidateCache\"] = invalidateCache;\r\n\r\n const testJourneys: any[] = this.createScoringJourneys();\r\n\r\n const styleWithJourneys: IJourneysWithAssociatedDrivingStyle = {\r\n Journeys: testJourneys,\r\n DrivingStyle: drivingStyle\r\n };\r\n\r\n return lastValueFrom(this.httpClient.post(`/api/drivingstyles/calculateDrivingScoreForJourneys`, styleWithJourneys, options)).then(response => {\r\n this.translateCalculationDescriptions(response);\r\n\r\n return response;\r\n });\r\n }\r\n\r\n calculateDrivingScoreForJourneys(journeysWithAssociatedDrivingStyle: IJourneysWithAssociatedDrivingStyle, invalidateCache: boolean = false): Promise {\r\n\r\n const options = { params: {} as HttpParams }\r\n\r\n options.params[\"minsToLive\"] = 30;\r\n options.params[\"invalidateCache\"] = invalidateCache;\r\n\r\n return lastValueFrom(this.httpClient.post(`/api/drivingstyles/calculateDrivingScoreForJourneys`, journeysWithAssociatedDrivingStyle, options)).then(response => {\r\n this.translateCalculationDescriptions(response);\r\n\r\n return response;\r\n });\r\n }\r\n\r\n getDrivingStyleMetricsWithDenominations(invalidateCache: boolean = false): Promise {\r\n\r\n const options = { params: {} as HttpParams }\r\n\r\n options.params[\"minsToLive\"] = 30;\r\n options.params[\"invalidateCache\"] = invalidateCache;\r\n\r\n return lastValueFrom(this.httpClient.get(`/api/drivingstyles/styleMetricWithDenominations`, options)).then(response => {\r\n return response;\r\n });\r\n }\r\n\r\n getMetricMappingWeightingLevelDetails(): IMetricMappingWeightingLevelDetail[] {\r\n const metricMappingWeightingLevelDetails: IMetricMappingWeightingLevelDetail[] = [\r\n { level: MetricMappingWeightingLevel.Low, value: 10, icon: \"expand_more\" },\r\n { level: MetricMappingWeightingLevel.Medium, value: 25, icon: \"horizontal_rule\", isDefault: true },\r\n { level: MetricMappingWeightingLevel.High, value: 45, icon: \"expand_less\" },\r\n { level: MetricMappingWeightingLevel.Critical, value: 60, icon: \"keyboard_double_arrow_up\" },\r\n { level: MetricMappingWeightingLevel.Custom, value: 1, icon: \"\", hideFromDropdown: true }\r\n ];\r\n\r\n return metricMappingWeightingLevelDetails;\r\n }\r\n\r\n createDefaultDrivingStyle(): IDrivingStyle {\r\n const newDrivingStyle: IDrivingStyle = {\r\n Id: 0,\r\n Name: \"\",\r\n DrivingStyleAssociations: [],\r\n DrivingStyleMetricMappings: [],\r\n UpperRagBound: 0,\r\n LowerRagBound: 0,\r\n WeightingType: DrivingStyleWeightingType.Even\r\n };\r\n\r\n return newDrivingStyle;\r\n }\r\n\r\n createDefaultDrivingStyleAssociation(): IDrivingStyleAssociation {\r\n const newDrivingStyleAssociation: IDrivingStyleAssociation = {\r\n Id: 0,\r\n DrivingStyleId: 0\r\n }\r\n\r\n return newDrivingStyleAssociation;\r\n }\r\n\r\n createDrivingStyleMetricMapping(drivingStyleMetric: DrivingStyleMetric, drivingStyleId: number = -1): IDrivingStyleMetricMapping {\r\n const newDrivingStyleMetricMapping: IDrivingStyleMetricMapping = {\r\n Id: 0,\r\n DrivingStyleId: drivingStyleId,\r\n DrivingStyleMetric: drivingStyleMetric,\r\n LowerRagBound: 40,\r\n UpperRagBound: 70,\r\n HighScoreValue: 0,\r\n LowScoreValue: 10,\r\n Created: \"\",\r\n Updated: \"\"\r\n }\r\n\r\n // temporary until default style includes this new metric\r\n if (drivingStyleMetric === DrivingStyleMetric.CruiseDuration) {\r\n newDrivingStyleMetricMapping.HighScoreValue = 10;\r\n newDrivingStyleMetricMapping.LowScoreValue = 0;\r\n }\r\n\r\n return newDrivingStyleMetricMapping;\r\n }\r\n\r\n addWeightingLevelDetailsToMetricMappings(metricMappings: IDrivingStyleMetricMapping[] = []): void {\r\n const weightingLevelDetails: IMetricMappingWeightingLevelDetail[] = this.getMetricMappingWeightingLevelDetails();\r\n\r\n if (!metricMappings?.length || !weightingLevelDetails?.length) {\r\n return;\r\n }\r\n\r\n metricMappings.forEach(metricMapping => this.updateMetricWithWeightingLevelDetails(metricMapping, weightingLevelDetails));\r\n }\r\n\r\n addDrivingStyleMetricDefaults(metricMappings: IDrivingStyleMetricMapping[] = [], defaultDrivingStyle: IDrivingStyle): void {\r\n if (!metricMappings?.length || !defaultDrivingStyle?.DrivingStyleMetricMappings?.length) {\r\n return;\r\n }\r\n\r\n metricMappings.forEach(metricMapping => this.addDrivingStyleMetricDefault(metricMapping, defaultDrivingStyle));\r\n }\r\n\r\n addDrivingStyleMetricDefault(metricMapping: IDrivingStyleMetricMapping, defaultDrivingStyle: IDrivingStyle): void {\r\n const matchingDefaultMetric = defaultDrivingStyle.DrivingStyleMetricMappings.find(defaultMapping => defaultMapping.DrivingStyleMetric === metricMapping.DrivingStyleMetric);\r\n\r\n if (!matchingDefaultMetric) {\r\n console.warn(`Couldn't find metric defaults for `, metricMapping);\r\n return;\r\n }\r\n\r\n metricMapping.defaults = copy(matchingDefaultMetric);\r\n }\r\n\r\n addDrivingStyleMetricDescriptionDetails(metricMappings: IDrivingStyleMetricMapping[] = [], metricDescriptions: IDrivingStyleMetricDescriptionDetails[]): void {\r\n if (!metricMappings?.length || !metricDescriptions) {\r\n return;\r\n }\r\n\r\n metricMappings.forEach(metricMapping => this.addDrivingStyleMetricDescription(metricMapping, metricDescriptions));\r\n }\r\n\r\n addDrivingStyleMetricDescription(metricMapping: IDrivingStyleMetricMapping, metricDescriptionDetails: IDrivingStyleMetricDescriptionDetails[]): IDrivingStyleMetricMapping {\r\n metricMapping.isTotal = false;\r\n\r\n const descriptionDetail = metricDescriptionDetails.find(descriptionDetail => descriptionDetail.DrivingStyleMetric === metricMapping.DrivingStyleMetric);\r\n\r\n metricMapping.drivingStyleMetricDescription = descriptionDetail.Description;\r\n metricMapping.drivingStyleMetricName = this.translationService.tEnum(DrivingStyleMetric, \"DrivingStyleMetric\", metricMapping.DrivingStyleMetric);\r\n\r\n if (metricMapping.DrivingStyleMetric === DrivingStyleMetric.Total) {\r\n metricMapping.isTotal = true;\r\n metricMapping.drivingStyleMetricName = this.translationService.t(\"DrivingStylesService.OverallDrivingStyleMetricName\");\r\n metricMapping.drivingStyleMetricDescription = this.translationService.t(\"DrivingStylesService.OverallDrivingStyleMetricDescription\");\r\n\r\n return metricMapping;\r\n }\r\n\r\n metricMapping.unit = this.getUnitForMetricDenominatorLabel(descriptionDetail.Denominator);\r\n metricMapping.category = DrivingStyleMetricCategory.Accelerometer;\r\n\r\n const accelerometerMetrics: DrivingStyleMetric[] = [\r\n DrivingStyleMetric.HarshBrakingAccelerometerEvents,\r\n DrivingStyleMetric.HarshAccelerationAccelerometerEvents,\r\n DrivingStyleMetric.HarshCorneringAccelerometerEvents\r\n ];\r\n\r\n metricMapping.category = (accelerometerMetrics.includes(metricMapping.DrivingStyleMetric))\r\n ? DrivingStyleMetricCategory.Accelerometer\r\n : DrivingStyleMetricCategory.CAN;\r\n\r\n return metricMapping;\r\n }\r\n\r\n uniqueDrivingStyleNameValidator(drivingStyle: IDrivingStyle, drivingStyles: IDrivingStyle[]): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n\r\n if (!drivingStyles?.length || !control.value) {\r\n return null;\r\n }\r\n\r\n const isDuplicate = this.drivingStyleNameInUse(drivingStyle, drivingStyles);\r\n\r\n return isDuplicate ? { customMessage: this.translationService.t(\"DrivingStyleEditor.UniqueStyleNameWarning\") } : null;\r\n };\r\n }\r\n\r\n drivingStyleNameInUse(drivingStyle: IDrivingStyle, drivingStyles: IDrivingStyle[]): boolean {\r\n if (!drivingStyle?.Name || !drivingStyles?.length) {\r\n return false;\r\n }\r\n\r\n const matchingStyles = drivingStyles.filter(existingDrivingStyle => {\r\n\r\n return existingDrivingStyle.Name.toLowerCase() === drivingStyle.Name.toLowerCase()\r\n && existingDrivingStyle.Id !== drivingStyle.Id;\r\n });\r\n\r\n return matchingStyles?.length > 0;\r\n }\r\n\r\n setWeightingLevelDetailOnMetric(weightingLevelDetail: IMetricMappingWeightingLevelDetail, metricMapping: IDrivingStyleMetricMapping): void {\r\n metricMapping.weightingLevelDetails = weightingLevelDetail;\r\n }\r\n\r\n addWeightingLevelDetailsToMetric(metricMapping: IDrivingStyleMetricMapping, weightingType: DrivingStyleWeightingType): void {\r\n const metricMappingWeightlingLevelDetails = this.getMetricMappingWeightingLevelDetails();\r\n const matchingWeightingLevelDetail = metricMappingWeightlingLevelDetails.find(detail => detail.value === metricMapping.Weighting);\r\n\r\n if (weightingType === DrivingStyleWeightingType.Custom) {\r\n metricMapping.weightingLevelDetails = metricMappingWeightlingLevelDetails.find(detail => detail.level === MetricMappingWeightingLevel.Custom);\r\n return;\r\n }\r\n\r\n metricMapping.weightingLevelDetails = matchingWeightingLevelDetail;\r\n }\r\n\r\n createAssociationPillsForDrivingStyle(drivingStyle: IDrivingStyle, groups: IGroup[]): void {\r\n\r\n if (!drivingStyle) {\r\n return;\r\n }\r\n\r\n drivingStyle.displayPillsForAssociations = [];\r\n\r\n if (!drivingStyle.DrivingStyleAssociations?.length) {\r\n return;\r\n }\r\n\r\n drivingStyle.DrivingStyleAssociations.forEach(association => {\r\n if (this.isAllResourcesAssociation(association)) {\r\n\r\n drivingStyle.displayPillsForAssociations.push({\r\n label: this.translationService.t(\"DrivingStylesManager.AllResourcesAssociation\"),\r\n icon: \"checklist_rtl\",\r\n data: association\r\n });\r\n\r\n return;\r\n }\r\n\r\n const groupPill = this.getGroupPillFromAssociation(association, groups);\r\n const vehicleTypeLabel = this.getVehicleTypePillFromAssociation(association);\r\n\r\n if (groupPill && vehicleTypeLabel) {\r\n drivingStyle.displayPillsForAssociations.push(this.combinePills(groupPill, vehicleTypeLabel));\r\n return;\r\n }\r\n\r\n if (groupPill) {\r\n drivingStyle.displayPillsForAssociations.push(groupPill);\r\n }\r\n\r\n if (vehicleTypeLabel) {\r\n drivingStyle.displayPillsForAssociations.push(vehicleTypeLabel);\r\n }\r\n });\r\n\r\n drivingStyle.displayPillsForAssociations = this.stripDuplicateAssociations(drivingStyle.displayPillsForAssociations);\r\n }\r\n\r\n getDrivingStyleWeightingTypes(): IKeyValuePair[] {\r\n const weightingTypes = EnumService.getItemsForSelect(DrivingStyleWeightingType);\r\n\r\n weightingTypes.forEach(type => {\r\n type.displayName = this.translationService.translateEnum(DrivingStyleWeightingType, \"DrivingStyleWeightingType\", type.value as any);\r\n });\r\n\r\n weightingTypes.sort((weightingType1, weightingType2) => weightingType1.value - weightingType2.value);\r\n\r\n return weightingTypes;\r\n }\r\n\r\n updateCustomWeightingsError(drivingStyle: IDrivingStyle): void {\r\n\r\n drivingStyle.metricMappingsError = null;\r\n\r\n let totalWeighting = this.getTotalWeightingOnStyle(drivingStyle);\r\n\r\n if (drivingStyle) {\r\n drivingStyle.totalWeighting = totalWeighting;\r\n }\r\n\r\n if (drivingStyle.WeightingType !== DrivingStyleWeightingType.Custom) {\r\n drivingStyle.metricMappingsError = null;\r\n return;\r\n }\r\n\r\n const metricWithWeightingProblem = drivingStyle.DrivingStyleMetricMappings.find(mapping => mapping.Weighting === 0 || mapping.Weighting > 100);\r\n const hasIndividualWeightingError: boolean = !!metricWithWeightingProblem;\r\n\r\n if (hasIndividualWeightingError) {\r\n const metricTranslation: string = this.translationService.tEnum(DrivingStyleMetric, \"DrivingStyleMetric\", metricWithWeightingProblem.DrivingStyleMetric);\r\n drivingStyle.metricMappingsError = this.translationService.t(\"DrivingStylesService.CustomWeightingIssue\", metricTranslation);\r\n return;\r\n }\r\n\r\n if (totalWeighting !== 100) {\r\n drivingStyle.metricMappingsError = this.translationService.t(\"DrivingStylesService.AllCustomWeightingsMustEqual100\", totalWeighting);\r\n }\r\n }\r\n\r\n getTotalWeightingOnStyle(drivingStyle: IDrivingStyle): number {\r\n let totalWeighting = 0;\r\n\r\n if (!drivingStyle?.DrivingStyleMetricMappings?.length) {\r\n return totalWeighting;\r\n }\r\n\r\n drivingStyle.DrivingStyleMetricMappings.forEach(mapping => {\r\n totalWeighting += mapping.Weighting;\r\n });\r\n\r\n return totalWeighting;\r\n }\r\n\r\n // ---\r\n\r\n private createMetricDescription(metric: DrivingStyleMetric, denominator: DrivingStyleMetricDenominator): string {\r\n let metricTranslation = this.translationService.tEnum(DrivingStyleMetric, \"DrivingStyleMetricEnum\", metric);\r\n let denominatorTranslation = this.translationService.tEnum(DrivingStyleMetricDenominator, \"DrivingStyleMetricDenominator\", denominator);\r\n\r\n return `${metricTranslation} ${denominatorTranslation}`;\r\n }\r\n\r\n private getUnitForMetricDenominatorLabel(denominator: DrivingStyleMetricDenominator): string {\r\n switch (denominator) {\r\n case DrivingStyleMetricDenominator.PerHundredKm: return this.translationService.t(\"DrivingStylesService.Events\");\r\n case DrivingStyleMetricDenominator.DurationEngineOn: return \"%\";\r\n case DrivingStyleMetricDenominator.DurationDriving: return \"%\";\r\n default: return \"\";\r\n }\r\n }\r\n\r\n private createScoringJourneys(): any[] {\r\n const scoringJourneys: any[] = [];\r\n\r\n scoringJourneys.push({\r\n Id: 1,\r\n Name: \"Journey1\",\r\n VehicleId: 1,\r\n EngineOnDuration: 12000,\r\n OverRevDuration: 300,\r\n CoastingDuration: 0,\r\n OverIdlingDuration: 120,\r\n BrakeApplicationsOverThreshold: 5,\r\n DistanceKmCan: 100,\r\n JourneyType: 1,\r\n DrivingDuration: 6000,\r\n AccelerationCountGps: 5,\r\n DecelerationCountGps: 5,\r\n CorneringCountGps: 5,\r\n OverAccelerationDuration: 300,\r\n BadAnticipationCount: 5,\r\n ContextualSpeedingEventCount: 5,\r\n CruiseDuration: 1500,\r\n GreenBandDurationLowThreshold: 2000,\r\n SweetSpotDurationLowThreshold: 1000,\r\n CruiseWhileInTopGearDuration: 1000\r\n });\r\n\r\n return scoringJourneys;\r\n }\r\n\r\n private translateCalculationDescriptions(performanceSummary: IDrivingPerformanceSummary): void {\r\n if (!performanceSummary?.CalculationResult?.DrivingStyleMetricScoreMetadataItems?.length) {\r\n console.warn(\"No calculation result metadata items provided for driving style\");\r\n return;\r\n }\r\n\r\n performanceSummary.CalculationResult.DrivingStyleMetricScoreMetadataItems.forEach(metadataItem => {\r\n const score: number = +(metadataItem.ProportionOfTotalScore ?? 0).toFixed(2);\r\n const decimalPipe = new DecimalPipe(\"en\");\r\n\r\n metadataItem.calculationDescription = this.translationService.t(\"DrivingStylesService.WeightingOfTotalScoreLabel\", decimalPipe.transform(score, \"1.0-1\"));\r\n });\r\n }\r\n\r\n private getGroupPillFromAssociation(association: IDrivingStyleAssociation, groups: IGroup[]): IPill {\r\n if (!association.GroupId && association.GroupId !== 0) {\r\n return;\r\n }\r\n\r\n if (!groups?.length) {\r\n console.warn(\"No groups to produce group names from\");\r\n return;\r\n }\r\n\r\n const matchingGroup = groups.find(group => group.Id === association.GroupId);\r\n\r\n if (!matchingGroup) {\r\n console.warn(\"No matching group to produce group names from\");\r\n return;\r\n }\r\n\r\n return {\r\n label: matchingGroup.Name,\r\n icon: matchingGroup.IsDepot ? \"home\" : \"folder_open\",\r\n data: association\r\n };\r\n }\r\n\r\n private getVehicleTypePillFromAssociation(association: IDrivingStyleAssociation): IPill {\r\n if (!VehicleType[association.VehicleType] || association.VehicleType === -1) {\r\n return;\r\n }\r\n\r\n return {\r\n label: this.translationService.tEnum(VehicleType, \"VehicleType\", association.VehicleType),\r\n icon: this.getIconForVehicleType(association.VehicleType),\r\n data: association\r\n };\r\n }\r\n\r\n private getIconForVehicleType(vehicleType: VehicleType): string {\r\n switch (vehicleType) {\r\n case VehicleType.Trailer: return \"rv_hookup\";\r\n case VehicleType.Car: return \"directions_car\";\r\n case VehicleType.BusOrPSV: return \"airport_shuttle\";\r\n case VehicleType.HgvLessThan12T:\r\n case VehicleType.Hgv12Tto22T:\r\n case VehicleType.HgvGreaterThan22T:\r\n case VehicleType.Lcv: return \"local_shipping\";\r\n case VehicleType.Motorcycle: return \"two_wheeler\";\r\n default: return;\r\n }\r\n }\r\n\r\n private stripDuplicateAssociations(tableCellPills: IPill[]): IPill[] {\r\n return tableCellPills.filter((pill, index, self) => self.findIndex((target) => target.label === pill.label) === index);\r\n }\r\n\r\n private isAllResourcesAssociation(association: IDrivingStyleAssociation): boolean {\r\n return !VehicleType[association.VehicleType] && !association.GroupId && association.GroupId !== 0;\r\n }\r\n\r\n private combinePills(pill1: IPill, pill2: IPill): IPill {\r\n return {\r\n label: `${pill1.label} & ${pill2.label}`,\r\n icon: \"link\",\r\n data: pill1.data\r\n }\r\n }\r\n\r\n private updateMetricWithWeightingLevelDetails(metricMapping: IDrivingStyleMetricMapping, metricMappingWeightingLevelDetails: IMetricMappingWeightingLevelDetail[]): void {\r\n if (!metricMapping.Weighting || metricMapping.Weighting < 1) {\r\n return;\r\n }\r\n\r\n const matchingWeightingLevelDetails = metricMappingWeightingLevelDetails.find(detail => detail.value === metricMapping.Weighting);\r\n\r\n if (matchingWeightingLevelDetails) {\r\n metricMapping.weightingLevelDetails = matchingWeightingLevelDetails;\r\n return;\r\n }\r\n\r\n metricMapping.weightingLevelDetails = metricMappingWeightingLevelDetails.find(detail => detail.level === MetricMappingWeightingLevel.Custom);\r\n }\r\n}\r\n","\r\nexport enum AccountStatus {\r\n Disabled = 0,\r\n Active = 1,\r\n Barred = 2,\r\n Prospective = 3\r\n}\r\n\r\nexport enum AvailableAccountStatus {\r\n Disabled = 0,\r\n Active = 1,\r\n Barred = 2\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { SettingsName } from '@app/class/SettingsName';\r\nimport { ConstantsService } from '@app/services/constantsService';\r\nimport * as signalR from '@microsoft/signalr';\r\nimport { HubConnectionState } from '@microsoft/signalr';\r\nimport { Subject } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\n\r\nexport class SignalRService {\r\n hubConnection: signalR.HubConnection;\r\n\r\n private apiUrl: string;\r\n\r\n constructor(private constantService: ConstantsService) {\r\n this.apiUrl = this.constantService.getApiUrl();\r\n }\r\n\r\n private joinedGroups = new Set();\r\n\r\n public joinDeviceGroup(deviceSerial: string): void {\r\n if (this.joinedGroups.has(deviceSerial)) {\r\n return;\r\n }\r\n\r\n this.hubConnection.invoke(WebSocketCommands.JoinDeviceGroup, deviceSerial)\r\n .then(() => {\r\n this.joinedGroups.add(deviceSerial);\r\n })\r\n .catch((err) => console.error(`Error while joining Device group: ${err}`));\r\n }\r\n\r\n public initialise(): Promise {\r\n if (this.hubConnection != null && this.hubConnection.state !== HubConnectionState.Disconnected) {\r\n return Promise.resolve();\r\n }\r\n\r\n this.hubConnection = new signalR.HubConnectionBuilder()\r\n .withUrl(\r\n `${this.apiUrl}/valkyrieHub`,\r\n {\r\n skipNegotiation: true,\r\n transport: signalR.HttpTransportType.WebSockets,\r\n accessTokenFactory: () => window.sessionStorage.getItem(SettingsName.AccessToken.toString())\r\n }\r\n ).withAutomaticReconnect()\r\n\r\n .configureLogging(signalR.LogLevel.Information)\r\n .build();\r\n\r\n return this.startConnection();\r\n }\r\n\r\n public registerEvents(event: string, subject: Subject, ) {\r\n this.hubConnection.on(event, (data: T) => {\r\n subject.next(data);\r\n });\r\n }\r\n\r\n private startConnection(): Promise {\r\n return this.hubConnection\r\n .start()\r\n .then(() => {\r\n console.log('Connection started');\r\n })\r\n .catch((err) => console.log(`Error while starting connection: ${err}`));\r\n }\r\n}\r\n\r\nexport const enum WebSocketCommands {\r\n JoinDeviceGroup = \"JoinDeviceGroup\"\r\n}\r\n\r\nexport const enum WebSocketEvents {\r\n LogMessage = \"LogMessage\",\r\n Pulse = \"Pulse\",\r\n CameraCommand = \"CameraCommand\",\r\n Tacho = \"Tacho\",\r\n VideoUpdate = \"VideoUpdate\",\r\n LogRequestUpdate = \"LogRequestUpdate\",\r\n ApplicationRequestUpdate = \"ApplicationRequestUpdate\",\r\n ConfigRequestUpdate = \"ConfigRequestUpdate\",\r\n DeviceMessageCommandUpdate = \"DeviceMessageCommandUpdate\",\r\n DiagnosticPacketUpdate = \"DiagnosticPacketUpdate\"\r\n}\r\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { Observable } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DeviceDataValidationService {\r\n\r\n constructor(private readonly http: HttpClient) { }\r\n\r\n getValidationCategories(serial: string): Observable {\r\n return this.http.get(`/api/foundation/devicevalidation/${serial}`);\r\n }\r\n\r\n getValidationResults(validationRequestParameters: ValidationRequestParameters): Observable {\r\n return this.http.get(`/api/foundation/devicevalidation/run/`, { params: validationRequestParameters as HttpParams });\r\n }\r\n}\r\n\r\nexport interface ValidationRequestParameters {\r\n Serial?: string,\r\n CheckType?: ValidationCheckType,\r\n StartTime?: string,\r\n EndTime?: string,\r\n ParentTrackerImei?: string,\r\n IncludeTemperatureModule?: boolean,\r\n IncludePtoTest?: boolean\r\n}\r\n\r\nexport interface ValidationCheck {\r\n ValidationCheckType?: ValidationCheckType\r\n ValidationResults?: ValidationTestResult[],\r\n TestData?: any[],\r\n ValidationResultDatabaseId?: number\r\n}\r\n\r\nexport interface ValidationTestResult {\r\n Status: ValidationStatus,\r\n TestResponseString: string,\r\n InfoMessageString: string\r\n}\r\n\r\nexport enum ValidationStatus {\r\n NotRun,\r\n Pass,\r\n Fail,\r\n Warning,\r\n Info\r\n}\r\n\r\nexport enum ValidationCheckType {\r\n Plot,\r\n SensorData,\r\n Core,\r\n Temperature,\r\n AddsecureCamera,\r\n FtCloud,\r\n DigiDl,\r\n Sim,\r\n Ceiba\r\n}\r\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { ValidationCheckType, ValidationStatus, ValidationTestResult } from \"@app/main/modules/foundation/_services/device-data-validation.service\";\r\nimport { IDateQueryOptions } from \"@app/services/accelerometerRecord.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { Observable, Subject } from \"rxjs\";\r\nimport { map, tap } from \"rxjs/operators\";\r\n\r\nexport enum StringSearchType {\r\n Match,\r\n Contains,\r\n EndsWith,\r\n StartsWith,\r\n}\r\n\r\nexport interface IStringSearchOption {\r\n Value: string\r\n Type: StringSearchType\r\n}\r\n\r\nexport interface IVehicleValidationCheckRecordQueryOptions extends IDateQueryOptions {\r\n CommissionId?: number;\r\n VehicleId?: number;\r\n Serial?: IStringSearchOption;\r\n LatestByValidationCheckType?: boolean;\r\n}\r\n\r\nexport interface IVehicleValidationCheckRecord {\r\n Id?: number;\r\n ValidationCheckType: ValidationCheckType;\r\n EventTime?: Date;\r\n UserId?: number;\r\n VehicleId?: number;\r\n Serial?: string;\r\n CommissionId?: number;\r\n ValidationCheckResultJson?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class VehicleValidationCheckRecordService {\r\n checkRecordListSubject = new Subject<{ [key: number]: IVehicleValidationCheckRecord[] }>();\r\n\r\n private checkRecordsList: { [key: number]: IVehicleValidationCheckRecord[] } = {};\r\n\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly translationService: TranslationService\r\n ) { }\r\n\r\n getVehicleValidationCheckRecords(queryOptions: IVehicleValidationCheckRecordQueryOptions = {}): Observable {\r\n const params = this.constructHttpParams(queryOptions);\r\n\r\n return this.http.get(`/api/foundation/vehiclevalidationcheck`, { params: params as HttpParams })\r\n .pipe(tap(checkRecords => {\r\n checkRecords.forEach(checkRecord => {\r\n this.addCheckRecordToCachedJobItemList(checkRecord);\r\n });\r\n this.checkRecordListSubject.next(this.checkRecordsList);\r\n }));\r\n }\r\n\r\n addVehicleValidationCheckRecords(vehicleValidationCheckRecord: IVehicleValidationCheckRecord): Observable {\r\n return this.http.post(`/api/foundation/vehiclevalidationcheck`, vehicleValidationCheckRecord)\r\n .pipe(tap(checkRecord => {\r\n const newCheckRecord = checkRecord;\r\n this.addCheckRecordToCachedJobItemList(newCheckRecord);\r\n this.checkRecordListSubject.next(this.checkRecordsList);\r\n }));\r\n }\r\n\r\n associateVehicleValidationCheckRecordsToCommission(checkRecordIds: number[], commissionId: number): Observable {\r\n return this.http.post('/api/foundation/vehiclevalidationcheck/associate', checkRecordIds, { params: { commissionId } });\r\n }\r\n\r\n getRecordResultsForTable(commission): Observable {\r\n return this.getVehicleValidationCheckRecords({\r\n CommissionId: commission.Id\r\n }).pipe(\r\n map(records => {\r\n let { passCount, failCount, warningCount } = this.getRecordStatistics(records);\r\n\r\n if (!passCount && !failCount && !warningCount) {\r\n return this.translationService.t(\"Foundation.NoTestsRun\");\r\n }\r\n\r\n return this.translationService.t(\"Foundation.XPassedXFailedXWarning\", [passCount, failCount, warningCount]);\r\n })\r\n );\r\n }\r\n\r\n // ------------------------------\r\n\r\n private constructHttpParams(queryOptions: IVehicleValidationCheckRecordQueryOptions = {}): HttpParams {\r\n let params = new HttpParams();\r\n\r\n for (const key in queryOptions) {\r\n if (queryOptions.hasOwnProperty(key)) {\r\n const value = queryOptions[key];\r\n if (typeof value === 'object') {\r\n // Handle nested objects\r\n for (const nestedKey in value) {\r\n if (value.hasOwnProperty(nestedKey)) {\r\n params = params.append(`${key}.${nestedKey}`, value[nestedKey]);\r\n }\r\n }\r\n } else {\r\n params = params.append(key, value);\r\n }\r\n }\r\n }\r\n\r\n return params;\r\n }\r\n\r\n private addCheckRecordToCachedJobItemList(checkRecord: IVehicleValidationCheckRecord): void {\r\n const checkRecords = this.getCachedCheckRecordsForVehicle(checkRecord.VehicleId);\r\n\r\n if (!checkRecords?.length) {\r\n this.checkRecordsList[checkRecord.VehicleId] = [checkRecord];\r\n return;\r\n }\r\n\r\n const existing = checkRecords.findIndex(cr => cr.Id === checkRecord.Id);\r\n if (existing < 0) {\r\n checkRecords.push(checkRecord);\r\n return;\r\n }\r\n\r\n checkRecords.splice(existing, 1);\r\n checkRecords.push(checkRecord);\r\n }\r\n\r\n private getCachedCheckRecordsForVehicle(vehicleId: number): IVehicleValidationCheckRecord[] {\r\n return this.checkRecordsList[vehicleId];\r\n }\r\n\r\n private getRecordStatistics(records: IVehicleValidationCheckRecord[]): { passCount: number, failCount: number, warningCount: number } {\r\n let passCount = 0;\r\n let failCount = 0;\r\n let warningCount = 0;\r\n\r\n records.forEach(record => {\r\n const parsedResults = JSON.parse(record.ValidationCheckResultJson);\r\n\r\n parsedResults.forEach(parsedResult => {\r\n if (!parsedResult['Status']) {\r\n return;\r\n }\r\n switch (parsedResult['Status']) {\r\n case ValidationStatus.Pass:\r\n passCount++;\r\n break;\r\n case ValidationStatus.Fail:\r\n failCount++;\r\n break;\r\n case ValidationStatus.Warning:\r\n warningCount++;\r\n break;\r\n }\r\n\r\n })\r\n })\r\n\r\n return {\r\n passCount,\r\n failCount,\r\n warningCount\r\n }\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { UserType } from \"@app/enum/UserType\";\r\nimport { IUser } from \"@app/interfaces/IUser\";\r\nimport { DataCacheService } from \"@app/services/caching/data-cache.service\";\r\nimport { LoginHistoryService } from \"@app/services/login-history.service\";\r\nimport { combineLatest, Observable } from \"rxjs\";\r\nimport { map, mergeMap } from \"rxjs/operators\";\r\nimport { UserService } from \"./user.service\";\r\nimport { FoundationUserResellerMappingService } from \"./userResellerMapping.service\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class EngineerService {\r\n\r\n private engineerCacheName: string = \"foundationEngineerCache\";\r\n constructor(\r\n private readonly dataCacheService: DataCacheService,\r\n private readonly loginHistoryService: LoginHistoryService,\r\n private readonly userService: UserService,\r\n private readonly userResellerMappingService: FoundationUserResellerMappingService,\r\n ) { }\r\n\r\n\r\n getEngineersWithMappings(): Observable {\r\n return combineLatest([\r\n this.getEngineers(),\r\n this.loginHistoryService.getLatestLoginHistories()\r\n ]).pipe(\r\n map(([engineers, loginHistory]) => {\r\n engineers.forEach(engineer => {\r\n const engineerLoginHistory = loginHistory.find(history => history.UserId === engineer.Id);\r\n engineer.lastLoggedIn = engineerLoginHistory?.CreatedTime;\r\n });\r\n\r\n return engineers;\r\n }))\r\n }\r\n\r\n getEngineers(invalidateCache = false): Observable {\r\n return this.dataCacheService.getOrRequest(this.engineerCacheName, () => this.getEngineersFromDb(), { invalidateCache });\r\n }\r\n\r\n getEngineersFromDb(): Observable {\r\n return this.userService.getUsers({ Type: UserType.Engineer });\r\n }\r\n\r\n getEngineersForAccount(accountId: number): Observable {\r\n return this.userService.getUsersForAccount(accountId).pipe(map(users => users.filter(user => user.Type === UserType.Engineer)));\r\n }\r\n\r\n engineerSearchPredicate(engineer: IUser, value?: any): boolean {\r\n return engineer.Email.toLowerCase().includes(value.toLowerCase());\r\n }\r\n\r\n saveEngineer(engineer: IUser): Observable {\r\n return this.userService.saveUser(engineer).pipe(\r\n mergeMap(userId => {\r\n this.dataCacheService.addOrUpdateItem(engineer, this.engineerCacheName);\r\n return this.userResellerMappingService.updateMappings(engineer);\r\n })\r\n ); \r\n }\r\n\r\n addCsvImportedEngineersToCache(engineers: IUser[]): void {\r\n engineers.forEach(e => {\r\n this.dataCacheService.addOrUpdateItem(e, this.engineerCacheName);\r\n })\r\n }\r\n\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { IAccount } from \"@app/services/account.service\";\r\nimport { DataCacheService } from \"@app/services/caching/data-cache.service\";\r\nimport { DateService, DateUnit } from \"@app/services/date.service\";\r\nimport { combineLatest, Observable, of } from \"rxjs\";\r\nimport { map, tap } from \"rxjs/operators\";\r\nimport { EngineerJobStatus, IEngineerJob, IEngineerJobBooking, IEngineerJobBookingWithEngineerMappings } from \"../foundation.interfaces\";\r\nimport { EngineerJobBookingService } from \"./engineer-job-booking.service\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class EngineerJobService {\r\n private jobsCacheName: string = \"engineerJobsCache\";\r\n \r\n constructor(private readonly http: HttpClient,\r\n private readonly dataCacheService: DataCacheService,\r\n private readonly dateService: DateService,\r\n private readonly engineerJobBookingService: EngineerJobBookingService) { }\r\n\r\n getEngineerJob(jobId: number): Observable {\r\n return combineLatest([\r\n this.getEngineerJobById(jobId),\r\n this.engineerJobBookingService.getEngineeringJobBookingsWithMappings({ JobId: jobId })\r\n ]).pipe(map(([job, bookings]) => {\r\n job.jobBooking = bookings[0];\r\n\r\n return job;\r\n }))\r\n }\r\n\r\n getEngineerJobs(invalidateCache = false): Observable {\r\n return this.dataCacheService.getOrRequest(this.jobsCacheName, () => this.getEngineerJobsFromDb(), { invalidateCache })\r\n }\r\n\r\n getEngineerJobsFromDb(): Observable {\r\n return this.http.get(`/api/foundation/engineerJobs/`);\r\n }\r\n\r\n getEngineerJobsForAccount(accountId: number): Observable {\r\n return this.http.get(`/api/foundation/engineerJobs/account/${accountId}`);\r\n }\r\n\r\n getEngineerJobById(jobId: number): Observable {\r\n const cachedJob = this.dataCacheService.getSingleValue(jobId, this.jobsCacheName);\r\n\r\n if (!!cachedJob) {\r\n return of(cachedJob);\r\n }\r\n\r\n return this.http.get(`/api/foundation/engineerJobs/${jobId}`)\r\n }\r\n\r\n createUpdateEngineerJob(engineerJob: IEngineerJob): Observable {\r\n return this.http.post(`/api/foundation/engineerJobs/`, engineerJob).pipe(tap(job => {\r\n this.dataCacheService.addOrUpdateItem(job, this.jobsCacheName);\r\n }));\r\n }\r\n\r\n getEngineeringJobBookings(dateFrom: Date, dateTo: Date): Observable {\r\n const params = {\r\n from: this.dateService.getStartOfDay(dateFrom).toISOString(),\r\n to: this.dateService.getEndOfDay(dateTo).toISOString()\r\n }\r\n\r\n return this.http.get(`/api/foundation/engineers/bookings/`, { params });\r\n\r\n }\r\n\r\n getEngineeringJobBookingsById(jobId: number): Observable {\r\n return this.http.get(`/api/foundation/engineerbookings/jobId/${jobId}`);\r\n }\r\n\r\n closeJob(jobId: number): Observable {\r\n const job = this.dataCacheService.getSingleValue(jobId, this.jobsCacheName);\r\n job.Status = EngineerJobStatus.Completed;\r\n\r\n return this.createUpdateEngineerJob(job);\r\n }\r\n\r\n mapAccountsToJobs(jobs: IEngineerJob[], accounts: IAccount[]): IEngineerJob[] {\r\n if (!jobs?.length || !accounts?.length) {\r\n return;\r\n }\r\n\r\n jobs.forEach(job => {\r\n job.account = accounts.find(account => account.Id === job.AccountId);\r\n });\r\n\r\n return jobs;\r\n }\r\n\r\n mapBookingsToJobs(jobs: IEngineerJob[], bookings: IEngineerJobBookingWithEngineerMappings[]): void {\r\n if (!jobs?.length || !bookings?.length) {\r\n return;\r\n }\r\n\r\n jobs.forEach(job => {\r\n job.jobBooking = bookings.find(booking => booking.JobId === job.Id);\r\n })\r\n }\r\n\r\n getCompanyNameForJob(job: IEngineerJob, accounts: IAccount[]): string {\r\n const account = accounts.find(account => account.Id === job.AccountId);\r\n if (!account) {\r\n return;\r\n }\r\n\r\n return account.CompanyName;\r\n }\r\n\r\n\r\n jobIsClosed(job: IEngineerJob): boolean {\r\n if (job.Status === EngineerJobStatus.Cancelled || job.Status === EngineerJobStatus.Completed) {\r\n return true;\r\n }\r\n }\r\n\r\n createNewJob(): IEngineerJob {\r\n return {\r\n Id: 0,\r\n Status: EngineerJobStatus.Open,\r\n CreatedDate: new Date(),\r\n Description: \"\",\r\n CustomerInstruction: \"\",\r\n EngineerInstruction: \"\",\r\n AccountId: null,\r\n DealId: null,\r\n jobBooking: {\r\n StartUtc: new Date(),\r\n EndUtc: this.dateService.addOrSubtractTime(new Date(), 7, DateUnit.Day),\r\n }\r\n }\r\n }\r\n}\r\n","import { AfterViewInit, Component, ElementRef, EventEmitter, Input, Output, ViewChild } from \"@angular/core\";\r\nimport { MapService } from \"@services/map.service\";\r\nimport \"./v-map.component.scss\";\r\n\r\nexport interface ICommonMapComponent {\r\n readonly mapInitialisedPromise: angular.IPromise;\r\n\r\n getMap(): google.maps.Map;\r\n fitMap(latLngs: google.maps.LatLng[] | google.maps.LatLngLiteral[]);\r\n}\r\n\r\n@Component({\r\n selector: \"v-map\",\r\n template: require(\"./v-map.component.html\")\r\n})\r\nexport class VMapComponent implements AfterViewInit, ICommonMapComponent {\r\n\r\n @Input() greyscale: boolean;\r\n @Input() center: google.maps.LatLng;\r\n @Input() zoom = 14;\r\n\r\n @Output() mapInitialised = new EventEmitter();\r\n\r\n @ViewChild(\"googleMapContainer\", { static: false }) googleMapContainer: ElementRef;\r\n\r\n // ---\r\n\r\n private mapReadyPromise: angular.IPromise;\r\n mapInitialisedPromise: angular.IPromise;\r\n\r\n private mapInitialisedPromiseResolve: (value: google.maps.Map | PromiseLike) => void;\r\n\r\n private map: google.maps.Map;\r\n private mapOffset: google.maps.Point;\r\n\r\n constructor(private readonly host: ElementRef, private readonly mapService: MapService) {\r\n this.mapInitialisedPromise = new Promise((resolve, reject) => { this.mapInitialisedPromiseResolve = resolve; }) as any;\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.initialiseMap();\r\n }\r\n\r\n getMap(): google.maps.Map {\r\n return this.map;\r\n }\r\n\r\n // Copied from veriMap - needs \r\n fitMap(latLngs: google.maps.LatLng[]) {\r\n\r\n if (!this.map) {\r\n\r\n // If the map is not available then wait until it is\r\n this.mapInitialisedPromise\r\n .then(() => { this.fitMap(latLngs); })\r\n .catch(e => { console.error(\"mapReady error\", e); });\r\n\r\n return;\r\n }\r\n\r\n if (latLngs == null || latLngs.length == 0) {\r\n return;\r\n }\r\n\r\n this.mapService.setMapBoundsWithOffset(this.map, latLngs, this.getMapOffset());\r\n }\r\n\r\n // ---\r\n\r\n private initialiseMap() {\r\n\r\n // This looks complicated, but it allows child components to wait on this promise before everything is setup\r\n // Note we stack this as the new naming is BETTER but I didnt want to change 100 files that rely on the previous naming\r\n\r\n this.mapReadyPromise = this.mapService.getMapAPIReadyPromise();\r\n this.mapReadyPromise.then(() => {\r\n\r\n var options: google.maps.MapOptions = {\r\n center: this.center || this.mapService.getDefaultMapLocation(),\r\n zoom: this.zoom,\r\n controlSize: 24,\r\n styles: this.getMapStyle()\r\n };\r\n\r\n this.mapService.createMap(this.googleMapContainer.nativeElement, options).then(map => {\r\n this.map = map;\r\n this.mapInitialisedPromiseResolve(map);\r\n this.mapInitialised.emit(map);\r\n });\r\n });\r\n }\r\n\r\n private getMapOffset() {\r\n let offset = new google.maps.Point(0, 0);\r\n\r\n // CJE removed 7.6.21 - Unsure if this is needed anymore?\r\n //if (!this.disableDefaultUi) {\r\n // offset.y = -60;\r\n //}\r\n\r\n if (this.mapOffset) {\r\n offset.x = this.mapOffset.x || offset.x;\r\n offset.y = this.mapOffset.y || offset.y;\r\n }\r\n\r\n return offset;\r\n }\r\n\r\n private getMapStyle(): google.maps.MapTypeStyle[] {\r\n if (!this.greyscale) {\r\n return null;\r\n }\r\n\r\n return [\r\n { \"featureType\": \"administrative\", \"elementType\": \"geometry\", \"stylers\": [{ \"color\": \"#a7a7a7\" }] },\r\n { \"featureType\": \"administrative\", \"elementType\": \"labels.text.fill\", \"stylers\": [{ \"visibility\": \"on\" }, { \"color\": \"#737373\" }] },\r\n { \"featureType\": \"landscape\", \"elementType\": \"geometry.fill\", \"stylers\": [{ \"visibility\": \"on\" }, { \"color\": \"#efefef\" }] },\r\n { \"featureType\": \"poi\", \"elementType\": \"geometry.fill\", \"stylers\": [{ \"visibility\": \"on\" }, { \"color\": \"#dadada\" }] },\r\n { \"featureType\": \"poi\", \"elementType\": \"labels\", \"stylers\": [{ \"visibility\": \"off\" }] },\r\n { \"featureType\": \"poi\", \"elementType\": \"labels.icon\", \"stylers\": [{ \"visibility\": \"off\" }] },\r\n { \"featureType\": \"road\", \"elementType\": \"labels.text.fill\", \"stylers\": [{ \"color\": \"#696969\" }, { \"visibility\": \"on\" }] },\r\n { \"featureType\": \"road\", \"elementType\": \"labels.icon\", \"stylers\": [{ \"visibility\": \"off\" }] },\r\n { \"featureType\": \"road.highway\", \"elementType\": \"geometry.fill\", \"stylers\": [{ \"color\": \"#ffffff\" }, { \"visibility\": \"on\" }] },\r\n { \"featureType\": \"road.highway\", \"elementType\": \"geometry.stroke\", \"stylers\": [{ \"visibility\": \"on\" }, { \"color\": \"#b3b3b3\" }] },\r\n { \"featureType\": \"road.highway\", \"elementType\": \"labels.text.fill\", \"stylers\": [{ \"invert_lightness\": true }] },\r\n { \"featureType\": \"road.highway\", \"elementType\": \"labels.text.stroke\", \"stylers\": [{ \"invert_lightness\": true }, { \"visibility\": \"off\" }, { \"saturation\": -100 }] },\r\n { \"featureType\": \"road.highway.controlled_access\", \"elementType\": \"labels.icon\", \"stylers\": [{ \"visibility\": \"on\" }, { \"saturation\": -100 }] },\r\n { \"featureType\": \"road.arterial\", \"elementType\": \"geometry.fill\", \"stylers\": [{ \"color\": \"#ffffff\" }] },\r\n { \"featureType\": \"road.arterial\", \"elementType\": \"geometry.stroke\", \"stylers\": [{ \"color\": \"#d6d6d6\" }] },\r\n { \"featureType\": \"road.arterial\", \"elementType\": \"labels.text.fill\", \"stylers\": [{ \"visibility\": \"on\" }, { \"hue\": \"#ff0000\" }] },\r\n { \"featureType\": \"road.local\", \"elementType\": \"geometry.fill\", \"stylers\": [{ \"visibility\": \"on\" }, { \"color\": \"#ffffff\" }, { \"weight\": 1.8 }] },\r\n { \"featureType\": \"road.local\", \"elementType\": \"geometry.stroke\", \"stylers\": [{ \"color\": \"#d7d7d7\" }] },\r\n { \"featureType\": \"transit\", \"elementType\": \"all\", \"stylers\": [{ \"color\": \"#808080\" }, { \"visibility\": \"off\" }] },\r\n { \"featureType\": \"water\", \"elementType\": \"geometry.fill\", \"stylers\": [{ \"color\": \"#d3d3d3\" }] }\r\n ];\r\n }\r\n}\r\n","\r\nimport { IJourney } from \"@interfaces/IJourney\";\r\nimport { IPlot } from \"@interfaces/IPlot\";\r\nimport { ISensorData } from \"@interfaces/ISensorData\";\r\nimport * as angular from \"angular\";\r\nimport * as moment from \"moment\";\r\nimport { IPlannedRoute } from \"src/app/main/components/planning/interfaces/IPlannedRoute\";\r\nimport { ReasonCode } from \"../enum/ReasonCode\";\r\nimport { SpecialUserPermissions } from \"../enum/SpecialUserPermissions\";\r\nimport { AccountFeatureService } from \"./accountFeature.service\";\r\nimport { ConstantsService } from \"./constantsService\";\r\nimport { GoogleMarkerService } from \"./googleMarker.service\";\r\nimport { MapService } from \"./map.service\";\r\nimport { ReasonCodeService } from \"./reasonCode.service\";\r\nimport { UsersService } from \"./users.service\";\r\nimport { VeriDate } from \"./veriDate.service\";\r\n\r\nexport class PlotService {\r\n\r\n private directionArray: string[] = [\"North\", \"North East\", \"East\", \"South East\", \"South\", \"South West\", \"West\", \"North West\"];\r\n isDemoSite: boolean;\r\n\r\n static $inject = [\"$q\", \"$http\", \"$log\", \"$filter\", \"veriDate\", \"reasonCodeService\", \"googleMarkerService\", \"usersService\", \"accountFeatureService\", \"mapService\", \"constantsService\"];\r\n\r\n constructor(\r\n private $q: angular.IQService,\r\n private $http: angular.IHttpService,\r\n private $log: angular.ILogService,\r\n private $filter: angular.IFilterService,\r\n private veriDate: VeriDate,\r\n private reasonCodeService: ReasonCodeService,\r\n private googleMarkerService: GoogleMarkerService,\n private readonly usersService: UsersService,\n private readonly accountFeatureService: AccountFeatureService,\r\n private readonly mapService: MapService,\r\n private readonly constantsService: ConstantsService\r\n ) {\r\n this.isDemoSite = this.constantsService.getIsDemoSite();\r\n }\r\n\r\n getPlotsForRoute(route: IPlannedRoute): angular.IPromise {\r\n if (!this.usersService.isCurrentUserOnFoundationPlatform() && !this.accountFeatureService.doesCurrentUserHaveSpecialPermission(SpecialUserPermissions.ShowHistoricalPlots)) {\r\n return this.$q.reject();\r\n }\r\n\n if (route.VehicleId) {\n return this.getPlotsForDateRange(route.VehicleId, this.veriDate.createMoment(route.PlannedStartTime).subtract(\"h\", 4), this.veriDate.createMoment(route.PlannedEndTime).add(\"h\", 4));\r\n }\n\r\n if (route.DriverId) {\n return this.getPlotsForDateRangeByDriver(route.DriverId, this.veriDate.createMoment(route.PlannedStartTime).subtract(\"h\", 4), this.veriDate.createMoment(route.PlannedEndTime).add(\"h\", 4));\r\n }\r\n }\r\n\r\n getPlotsForJourney(vehicleId: number, journey: IJourney): angular.IPromise {\r\n if (!this.usersService.isCurrentUserOnFoundationPlatform() && !this.accountFeatureService.doesCurrentUserHaveSpecialPermission(SpecialUserPermissions.ShowHistoricalPlots)) {\r\n return this.$q.reject();\r\n }\r\n\r\n return this.getPlotsForDateRange(vehicleId, moment(journey.StartUtc), moment(journey.EndUtc).add(1, \"second\"));\r\n }\r\n\r\n getPlotsForDate(vehicleId: number, date: moment.Moment | Date): angular.IPromise {\n let newDate: moment.Moment = moment(date);\n\r\n const startDate = newDate.clone();\r\n const endDate = newDate.clone();\r\n\r\n startDate.startOf(\"day\");\r\n endDate.add(1, \"day\").startOf(\"day\");\n\r\n return this.getPlotsForDateRange(vehicleId, startDate, endDate);\r\n }\r\n\r\n getPlotNearestToTime(vehicleId: number, start: moment.Moment): angular.IPromise {\r\n\r\n const startTime = start.clone();\r\n const endTime = start.clone();\r\n\r\n startTime.startOf(\"hour\");\r\n endTime.add(1, \"hour\").startOf(\"hour\");\r\n\r\n return this.getPlotsForDateRange(vehicleId, startTime, endTime)\r\n .then(plots => { return plots[0] });\r\n }\r\n\r\n getPlotsForDateRange(vehicleId: number, start: moment.Moment | Date, end: moment.Moment | Date): angular.IPromise {\n if (!this.usersService.isCurrentUserOnFoundationPlatform() && !this.accountFeatureService.doesCurrentUserHaveSpecialPermission(SpecialUserPermissions.ShowHistoricalPlots)) {\r\n return this.$q.reject();\r\n }\n\r\n return this\r\n .$http({\r\n method: \"GET\",\r\n url: `/api/vehicles/${vehicleId}/plots?plotOption=Basic&start=${start.toISOString()}&end=${end.toISOString()}`\r\n })\r\n .then((result: angular.IHttpResponse) => {\r\n\r\n this.preparePlotsForMap(result.data);\r\n\r\n return result.data;\r\n });\r\n }\r\n\n getPlotsForDateRangeByDriver(driverId: number, start: moment.Moment, end: moment.Moment): angular.IPromise {\n return this\n .$http({\n method: \"GET\",\n url: `/api/drivers/${driverId}/plots?plotOption=Basic&start=${start.toISOString()}&end=${end.toISOString()}`\r\n }).then((result: angular.IHttpResponse) => {\n this.preparePlotsForMap(result.data);\r\n\r\n return result.data;\r\n });\n\r\n }\n\r\n getSensorsData(vehicleId: number, start: moment.Moment, end: moment.Moment): angular.IPromise {\r\n\r\n return this.$http({\r\n method: \"GET\",\r\n url: `/api/sensorData/${vehicleId}?start=${start.toISOString()}&end=${end.toISOString()}`,\r\n }).then((result: angular.IHttpResponse) => {\r\n // this.preparePlotsForMap(result.data);\r\n\r\n return result.data;\r\n });\r\n }\r\n\r\n getLatestPlots(): angular.IPromise {\r\n var params: any = {\r\n /*minsToLive: 1 */\r\n plotOption: \"Basic\",\r\n };\r\n\r\n // Removed for now as it was causing issues\r\n //if (excludePlotsBefore) {\r\n // params.excludePlotsBefore = excludePlotsBefore.toISOString();\r\n //}\r\n\r\n return this\r\n .$http({\r\n method: \"GET\",\r\n url: `/api/vehicles/plots/latest`,\r\n params: params\r\n })\r\n .then((result: angular.IHttpResponse) => {\r\n this.preparePlotsForMap(result.data, true);\r\n\r\n return result.data;\r\n });\r\n }\r\n\r\n getLatestPlotForVehicle(vehicleId: number): angular.IPromise {\r\n return this.$http({\r\n method: \"GET\",\r\n url: `/api/vehicles/${vehicleId}/plots/latest?plotOption=Basic`\r\n }).then((result: angular.IHttpResponse) => {\r\n if (!result.data) {\r\n return null;\r\n }\r\n\r\n this.preparePlotsForMap([result.data], true);\r\n\r\n return result.data;\r\n });\r\n }\r\n\r\n getPlot(vehicleId: number, plotId: number): angular.IPromise {\r\n var params: any = { minsToLive: 60, plotOption: \"Basic\" };\r\n\r\n return this\r\n .$http({\r\n method: \"GET\",\r\n url: `/api/vehicles/${vehicleId}/plots/${plotId}`,\r\n params: params\r\n })\r\n .then((result: angular.IHttpResponse) => {\r\n this.preparePlotForMap(result.data);\r\n\r\n return result.data;\r\n });\r\n }\r\n\r\n isPlotUtilised(reasonCode: ReasonCode): boolean {\r\n\r\n const notUtilised = reasonCode === ReasonCode.IgnitionOff || reasonCode === ReasonCode.Wakeup;\r\n return !notUtilised;\r\n }\r\n\r\n getUtilisationColor(utilised: boolean): string {\r\n return utilised ? \"#039be5\" : \"#cccccc\";\r\n }\r\n\r\n simplifyPlots(plots: IPlot[], includePlot?: IPlot, tolerance = 0.0001): IPlot[] {\r\n\r\n // Convert our plots into number[][] format\r\n const locationArray: number[][] = [];\r\n for (var i = 0; i < plots.length; i++) {\r\n const plot = plots[i];\r\n locationArray.push([plot.Latitude, plot.Longitude, plot.Id]);\r\n }\r\n\r\n const simplifiedArray = this.mapService.simplifyRoute(locationArray, tolerance, true);\r\n //console.log(locationArray.length, \">\", simplifiedArray.length, tolerance);\r\n\r\n var newPlotList: IPlot[] = [];\r\n let simplifiedArrayIndex = 0;\r\n\r\n for (var i = 0; i < plots.length; i++) {\r\n const p = plots[i];\r\n\r\n if (p.Id === simplifiedArray[simplifiedArrayIndex][2]) {\r\n newPlotList.push(p);\r\n simplifiedArrayIndex++;\r\n }\r\n }\r\n\r\n return newPlotList;\r\n }\r\n\r\n getVisisblePlotsBasedOnZoomLevel(plots: IPlot[], map: google.maps.Map, selectedPlot?: IPlot): angular.IPromise {\r\n if (!plots || !map) {\r\n return this.$q.when([]);\r\n }\r\n\r\n performance.mark(\"getVisisblePlotsBasedOnZoomLevel\");\r\n const newPlotList: IPlot[] = [];\r\n\r\n var markerWidth = 30;\r\n\r\n var projection = map.getProjection();\r\n var lastPoint: google.maps.Point = null;\r\n\r\n var scale = Math.pow(2, map.getZoom());\r\n var nw = new google.maps.LatLng(map.getBounds().getNorthEast().lat(), map.getBounds().getSouthWest().lng());\r\n var worldCoordinateNW = projection.fromLatLngToPoint(nw);\r\n\r\n plots.forEach(plot => {\r\n var worldCoordinate = projection.fromLatLngToPoint(new google.maps.LatLng(plot.Latitude, plot.Longitude));\r\n var pixelOffset = new google.maps.Point(\r\n Math.floor((worldCoordinate.x - worldCoordinateNW.x) * scale),\r\n Math.floor((worldCoordinate.y - worldCoordinateNW.y) * scale)\r\n );\r\n\r\n var recordLastPoint = !lastPoint;\r\n\r\n if (lastPoint != null) {\r\n var xPixels = pixelOffset.x - lastPoint.x;\r\n var yPixels = pixelOffset.y - lastPoint.y;\r\n\r\n var pixelsDifference = Math.sqrt(xPixels * xPixels + yPixels * yPixels);\r\n\r\n if (pixelsDifference > markerWidth) {\r\n recordLastPoint = true;\r\n }\r\n }\r\n\r\n if (recordLastPoint) {\r\n newPlotList.push(plot);\r\n lastPoint = pixelOffset;\r\n }\r\n });\r\n\r\n performance.measure(\"getVisisblePlotsBasedOnZoomLevel\");\r\n\r\n var promiseArray: angular.IPromise[] = [];\r\n\r\n for (var i = 0; i < newPlotList.length; i++) {\r\n const plot = newPlotList[i];\r\n\r\n var promise = this.googleMarkerService.generateGoogleMapsMarkerOptionsForPlot(plot, plot == selectedPlot).then(options => {\r\n plot.markerModel.options = options;\r\n });\r\n\r\n promiseArray.push(promise);\r\n }\r\n\r\n return this.$q.all(promiseArray).then(() => {\r\n return newPlotList;\r\n });\r\n }\r\n\r\n findPlotClosestToLatLng(plots: IPlot[], latLng: google.maps.LatLng) {\r\n if (!plots) {\r\n return null;\r\n }\r\n\r\n // Find closest point\r\n var closestPlot: IPlot;\r\n var closestPlotDistance = Number.MAX_VALUE;\r\n\r\n for (var i = 0; i < plots.length; i++) {\r\n const p = plots[i];\r\n\r\n var plotLatLng = new google.maps.LatLng(p.Latitude, p.Longitude);\r\n var distance = google.maps.geometry.spherical.computeDistanceBetween(latLng, plotLatLng);\r\n\r\n if (distance < closestPlotDistance) {\r\n closestPlot = p;\r\n closestPlotDistance = distance;\r\n }\r\n }\r\n\r\n return closestPlot;\r\n }\r\n\r\n findPlotClosestToTime(time: moment.Moment, plots: IPlot[]) {\r\n\r\n var closestPlot: IPlot;\r\n\r\n for (var i = 0; i < plots.length; i++) {\r\n var plot = plots[i];\r\n\r\n if (closestPlot && plot.UtcMoment.isAfter(time)) {\r\n if (plot.UtcMoment.diff(time, \"s\") < closestPlot.UtcMoment.diff(time, \"s\")) {\r\n closestPlot = plot;\r\n }\r\n\r\n break;\r\n }\r\n\r\n closestPlot = plot;\r\n }\r\n\r\n return closestPlot;\r\n }\r\n\r\n findPlotById(id: number, plots: IPlot[]) {\r\n for (var i = 0; i < plots.length; i++) {\r\n var plot = plots[i];\r\n\r\n if (plot.Id == id) {\r\n return plot;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n arePlotsCloserThan(plot1: IPlot, plot2: IPlot, minDistance: number): boolean {\r\n //Decimal Places Aprox.Distance Say What?\r\n //1 10 kilometers 6.2 miles\r\n //2 1 kilometer 0.62 miles\r\n //3 100 meters About 328 feet\r\n //4 10 meters About 33 feet\r\n //5 1 meter About 3 feet\r\n //6 10 centimeters About 4 inches\r\n //7 1.0 centimeter About ½ an inch\r\n //8 1.0 millimeter The width of paperclip wire.\r\n //9 0.1 millimeter The width of a strand of hair.\r\n //10 10 microns A speck of pollen.\r\n //11 1.0 micron A piece of cigarette smoke.\r\n //12 0.1 micron You're doing virus-level mapping at this point.\r\n //13 10 nanometers Does it matter how big this is?\r\n //14 1.0 nanometer Your fingernail grows about this far in one second.\r\n //15 0.1 nanometer An atom.An atom! What are you mapping?\r\n //var minDifference = 0.001; // 100 metre\r\n\r\n return (Math.abs(plot1.Latitude - plot2.Latitude) < minDistance && Math.abs(plot1.Longitude - plot2.Longitude) < minDistance);\r\n }\r\n\r\n getColorForSpeed(speedMph: number): string {\r\n\r\n var colour: string = \"red\";\r\n\r\n var speedKph = speedMph * 1.60934;\r\n\r\n if (speedKph <= 40) {\r\n //25 mph\r\n colour = \"darkgrey\";\r\n }\r\n\r\n else if (speedKph <= 50) {\r\n //31 mph\r\n colour = \"darkgrey\";\r\n }\r\n\r\n else if (speedKph <= 60) {\r\n //37 mph\r\n colour = \"green\";\r\n }\r\n\r\n else if (speedKph <= 80) {\r\n // 50 mph\r\n colour = \"darkorange\";\r\n }\r\n\r\n else if (speedKph <= 100) {\r\n // 62 mph\r\n colour = \"red\";\r\n }\r\n\r\n return colour;\r\n }\r\n\r\n slicePlotArrayByTime(plots: IPlot[], startDate?: string, endDate?: string): IPlot[] {\r\n if (!(startDate && endDate)) {\r\n return plots;\r\n }\r\n\r\n const plotList: IPlot[] = [];\r\n\r\n const startDateMoment = this.veriDate.createMoment(startDate);\r\n const endDateMoment = this.veriDate.createMoment(endDate);\r\n\r\n for (let i = 0; i < plots.length; i++) {\r\n const plot = plots[i];\r\n\r\n var dateValue = plot.UtcMoment.valueOf();\r\n const pointInRange = dateValue >= startDateMoment.valueOf() && dateValue <= endDateMoment.valueOf();\r\n\r\n if (pointInRange) {\r\n plotList.push(plot);\r\n }\r\n }\r\n\r\n return plotList;\r\n }\r\n\r\n convertDirectionToWords(degrees: number): string {\r\n\r\n const maxDirectionArrows = 8;\r\n const simpleNumber = (degrees / (360 / maxDirectionArrows));\r\n const val = Math.floor(simpleNumber + 0.5);\r\n\r\n const index = val % maxDirectionArrows;\r\n const arrayIndex = parseInt(index.toString(), 0);\r\n const compaseDirection = this.directionArray[arrayIndex];\r\n\r\n return compaseDirection;\r\n }\r\n\r\n setPlotSelectedClass(plot: IPlot, selected: boolean) {\r\n if (plot.markerModel.options == null) {\r\n console.error(\"No options object found on Plot\", plot);\r\n return;\r\n }\r\n\r\n // Todo: Remove\r\n plot.markerModel.options.labelClass = \"marker-labels\";\r\n if (selected) {\r\n plot.markerModel.options.labelClass += \" selected\";\r\n plot.markerModel.options.optimized = false;\r\n }\r\n }\r\n\r\n //setPlotSelectionClass(model: any, modelId: number, plot: IPlot, selected: boolean, control: any) {\r\n // if (!plot) {\r\n // return;\r\n // }\r\n\r\n // plot.selected = selected;\r\n\r\n // if (!model || !plot || !plot.options) {\r\n // return;\r\n // }\r\n\r\n // this.setPlotSelectedClass(plot, selected);\r\n\r\n // if (control == null) {\r\n // console.error(\"setPlotSelectionClass > 'control' not defined\", model, modelId, plot, selected);\r\n // return;\r\n // }\r\n\r\n // const markerModel = this.updateMapMarkerModel(model, modelId, control);\r\n // if (markerModel) {\r\n // const clusterer = markerModel.gManager.clusterer;\r\n\r\n // this.setClusterSelectionClass(clusterer, modelId, selected);\r\n // }\r\n //}\r\n\r\n setClusterSelectionClass(clusterer: any, modelId: number, selected: boolean) {\r\n if (!clusterer) {\r\n return;\r\n }\r\n\r\n clusterer\r\n .getClusters()\r\n .forEach(c => {\r\n var markers = c.getMarkers();\r\n if (markers.length > 0) {\r\n if (markers.get(modelId) && c.clusterIcon_.div_) {\r\n // Found marker in cluster\r\n c.clusterIcon_.div_.className = \"cluster\";\r\n\r\n if (selected) {\r\n c.clusterIcon_.div_.className += \" selected\";\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n isMoving(plot: IPlot): boolean {\r\n let isMoving = false;\r\n\r\n if (plot.Velocity !== 0 && plot.Reason != ReasonCode.Wakeup) {\r\n isMoving = true;\r\n }\r\n\r\n return isMoving;\r\n }\r\n\r\n //getMapMarkerModel(id: number, imarkermodel): IMarkerModelMap {\r\n // if (this.mode) {\r\n // //console.error(\"getMapMarkerModel failed as no control is set\", control);\r\n // return null;\r\n // }\r\n\r\n // const marker = control.getPlurals().get(id);\r\n // return marker;\r\n //}\r\n\r\n //private updateMapMarkerModel(model: any, id: number, control: any): any {\r\n // if (model) {\r\n // const marker = this.getMapMarkerModel(id, control);\r\n\r\n // if (marker) {\r\n // marker.updateModel(model);\r\n // return marker;\r\n // }\r\n // }\r\n\r\n // return null;\r\n //}\r\n\r\n preparePlotForMap(plot: IPlot) {\r\n if (!plot) {\r\n return;\r\n }\r\n\r\n //plot.coords = new CoordsModel(plot.Latitude, plot.Longitude);\r\n plot.markerModel = {\r\n id: plot.Id,\r\n options: this.googleMarkerService.createEventMarkerOptions({ label: \"\", position: { lat: plot.Latitude, lng: plot.Longitude } })\r\n }\r\n\r\n if (this.isDemoSite && plot.LocationInformation?.GeofenceIds?.length > 0) {\r\n plot.LocationInformation.LocationDescription = \"Demo Geofence\";\r\n }\r\n\r\n // Temp for testing\r\n //if (!dontCreateOptions) {\r\n // plot.options = this.veriMarkerService.generateMarkerOptions(plot);\r\n //}\r\n\r\n //plot.options.title = plot.FormattedDate;\r\n\r\n // This data is useful for side navigation display\r\n if (plot.Utc) {\r\n // Small optimisation because we know plot Utcs come down in ISO format i.e. \"2017-09-04T09:30:09Z\"\r\n plot.UtcMoment = this.veriDate.createMoment(plot.Utc);\r\n plot.FormattedDate = this.veriDate.formatDate(plot.UtcMoment);\r\n }\r\n else {\r\n console.warn(`Plot for ${plot.VehicleId} has no Utc '${plot.Utc}'`);\r\n }\r\n\r\n // Filter out 999 temp plots\r\n //if (plot.TemperatureRecords) {\r\n // for (var i = 0; i < plot.TemperatureRecords.length; i++) {\r\n // const temp = plot.TemperatureRecords[i];\r\n // temp.invalid = temp.Validity != 0 || temp.Temperature === 999 || temp.Temperature === 85;\r\n // }\r\n //}\r\n }\r\n\r\n findPlot(plots: IPlot[], plotId: number): IPlot {\r\n for (let i = 0; i < plots.length; i++) {\r\n const plot = plots[i];\r\n\r\n if (plot.Id === plotId) {\r\n return plot;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n findMatchingPlot(startTime: moment.Moment, endTime: moment.Moment, plots: IPlot[]): IPlot {\r\n let matchingPlot: IPlot;\r\n\r\n let lastPlot: IPlot;\r\n\r\n for (let i = 0; i < plots.length; i++) {\r\n const plot = plots[i];\r\n\r\n if (!lastPlot) {\r\n lastPlot = plot;\r\n continue;\r\n }\r\n\r\n if (startTime.isBetween(lastPlot.UtcMoment, plot.UtcMoment)) {\r\n\r\n const lastDiff = startTime.diff(lastPlot.UtcMoment);\r\n const nextDiff = plot.UtcMoment.diff(endTime);\r\n\r\n if (lastDiff < nextDiff) {\r\n matchingPlot = lastPlot;\r\n }\r\n else {\r\n matchingPlot = plot;\r\n }\r\n\r\n break;\r\n }\r\n\r\n lastPlot = plot;\r\n }\r\n\r\n return matchingPlot;\r\n }\r\n\r\n\r\n preparePlotsForMap(plots: IPlot[], dontCreateOptions = false): void {\r\n\r\n if (!plots) {\r\n return;\r\n }\r\n\r\n for (let i = 0; i < plots.length; i++) {\r\n const plot = plots[i];\r\n plot.ReasonText = this.reasonCodeService.getReasonCodeLabel(plot.Reason);\r\n //plot.FormattedAddress = null;\r\n\r\n this.preparePlotForMap(plot);\r\n }\r\n\r\n // Plots are out of order, reverse for highcharts and display in correct (ascending time) order\r\n plots.sort((a, b) => { return a.UtcMoment.valueOf() - b.UtcMoment.valueOf(); });\r\n //plots.sort((a, b) => { return a.UtcMoment.valueOf() < b.UtcMoment.valueOf() ? -1 : 1; });\r\n }\r\n\r\n private removeSimilarPoints(plots: IPlot[]): IPlot[] {\r\n var filteredPlots: IPlot[] = [];\r\n\r\n const speedDifference = 5;\r\n var latLngDifference = 0.05;\r\n\r\n var previousIncludedPlot: IPlot = null;\r\n\r\n for (var i = 0; i < plots.length; i++) {\r\n const plot = plots[i];\r\n\r\n var includePlot = false;\r\n\r\n if (previousIncludedPlot) {\r\n if (plot.Reason !== previousIncludedPlot.Reason) {\r\n includePlot = true;\r\n }\r\n else if (Math.abs(plot.Velocity - previousIncludedPlot.Velocity) > speedDifference) {\r\n includePlot = true;\r\n }\r\n else if (Math.abs(plot.Latitude - previousIncludedPlot.Latitude) > latLngDifference) {\r\n includePlot = true;\r\n }\r\n else if (Math.abs(plot.Longitude - previousIncludedPlot.Longitude) > latLngDifference) {\r\n includePlot = true;\r\n }\r\n }\r\n else {\r\n includePlot = true;\r\n }\r\n\r\n if (includePlot) {\r\n filteredPlots.push(plot);\r\n previousIncludedPlot = plot;\r\n }\r\n }\r\n\r\n return filteredPlots;\r\n }\r\n\r\n //myPaths: google.maps.Polyline[];\r\n\r\n //private ProcessColouredPlotData(vm: IVmPanelPlot, vehicle: IVehicle): void {\r\n\r\n // $(`WHAT`).appendTo(\"#map_canvas\");\r\n\r\n // var mouseover = () => { };\r\n\r\n // this.myPaths = [];\r\n\r\n // console.log(\"ProcessPlotData\");\r\n\r\n // var gMap = vm.map.control.getGMap();\r\n\r\n // // Setup map style\r\n\r\n // var styles = [\r\n // {\r\n // \"featureType\": \"administrative\",\r\n // \"elementType\": \"labels.text.fill\",\r\n // \"stylers\": [{ \"color\": \"#6195a0\" }]\r\n // }, { \"featureType\": \"landscape\", \"elementType\": \"all\", \"stylers\": [{ \"color\": \"#f2f2f2\" }] },\r\n // {\r\n // \"featureType\": \"landscape\",\r\n // \"elementType\": \"geometry.fill\",\r\n // \"stylers\": [{ \"color\": \"#ffffff\" }]\r\n // },\r\n // { \"featureType\": \"poi\", \"elementType\": \"all\", \"stylers\": [{ \"visibility\": \"off\" }] },\r\n // {\r\n // \"featureType\": \"poi.park\",\r\n // \"elementType\": \"geometry.fill\",\r\n // \"stylers\": [{ \"color\": \"#e6f3d6\" }, { \"visibility\": \"on\" }]\r\n // }, {\r\n // \"featureType\": \"road\",\r\n // \"elementType\": \"all\",\r\n // \"stylers\": [{ \"saturation\": -100 }, { \"lightness\": 45 }, { \"visibility\": \"simplified\" }]\r\n // }, {\r\n // \"featureType\": \"road.highway\",\r\n // \"elementType\": \"all\",\r\n // \"stylers\": [{ \"visibility\": \"simplified\" }]\r\n // }, {\r\n // \"featureType\": \"road.highway\",\r\n // \"elementType\": \"geometry.fill\",\r\n // \"stylers\": [{ \"color\": \"#f4d2c5\" }, { \"visibility\": \"simplified\" }]\r\n // }, {\r\n // \"featureType\": \"road.highway\",\r\n // \"elementType\": \"labels.text\",\r\n // \"stylers\": [{ \"color\": \"#4e4e4e\" }]\r\n // }, {\r\n // \"featureType\": \"road.arterial\",\r\n // \"elementType\": \"geometry.fill\",\r\n // \"stylers\": [{ \"color\": \"#f4f4f4\" }]\r\n // }, {\r\n // \"featureType\": \"road.arterial\",\r\n // \"elementType\": \"labels.text.fill\",\r\n // \"stylers\": [{ \"color\": \"#787878\" }]\r\n // }, {\r\n // \"featureType\": \"road.arterial\",\r\n // \"elementType\": \"labels.icon\",\r\n // \"stylers\": [{ \"visibility\": \"off\" }]\r\n // }, { \"featureType\": \"transit\", \"elementType\": \"all\", \"stylers\": [{ \"visibility\": \"off\" }] },\r\n // {\r\n // \"featureType\": \"water\",\r\n // \"elementType\": \"all\",\r\n // \"stylers\": [{ \"color\": \"#eaf6f8\" }, { \"visibility\": \"on\" }]\r\n // }, {\r\n // \"featureType\": \"water\",\r\n // \"elementType\": \"geometry.fill\",\r\n // \"stylers\": [{ \"color\": \"#eaf6f8\" }]\r\n // }\r\n // ];\r\n\r\n // gMap.setOptions({\r\n // styles: styles\r\n // });\r\n\r\n // var pathLatLng: Model.CoordsModel[] = [];\r\n\r\n // var previousPlot: IPlot = null;\r\n\r\n // var currentPath: google.maps.LatLng[] = [];\r\n\r\n // for (var i = 0; i < vm.plots.length; i++) {\r\n\r\n // var plot = vm.plots[i];\r\n\r\n // if (plot) {\r\n // plot.color = this.plotHelper.getColorForSpeed(plot.Velocity);\r\n\r\n // if (previousPlot && plot.color !== previousPlot.color) {\r\n\r\n // var p: google.maps.PolylineOptions = {\r\n // path: currentPath,\r\n // strokeColor: previousPlot.color || plot.color, // i.e. not set\r\n // strokeWeight: 7,\r\n // strokeOpacity: 0.5,\r\n // map: gMap\r\n // };\r\n\r\n // var polyline = new google.maps.Polyline(p);\r\n\r\n // const createHandler = (polyline, plot, mouseover) => {\r\n // return (x, y, z) => {\r\n // polyline.setOptions({\r\n // strokeOpacity: mouseover ? 1 : 0.5\r\n // });\r\n\r\n // var projection = gMap.getProjection();\r\n // var point = projection.fromLatLngToPoint(plot.pathCoords);\r\n // console.log(point);\r\n\r\n // if (mouseover) {\r\n // $(\"#map-tooltip\").show().html(`
${plot.VelocityMph}
`);\r\n // $(\"#map-tooltip\")\r\n // .css({\r\n // \"z-index\": 1000,\r\n // position: \"absolute\",\r\n // top: point.y,\r\n // left: point.x\r\n // });\r\n // } else {\r\n // $(\"#map-tooltip\").hide();\r\n\r\n // }\r\n // }\r\n // };\r\n\r\n // polyline.addListener(\"mouseover\", createHandler(polyline, plot, true));\r\n // polyline.addListener(\"mouseout\", createHandler(polyline, plot, false));\r\n\r\n // this.myPaths.push(polyline);\r\n\r\n // //polyline.setMap(gMap);\r\n\r\n // currentPath = [];\r\n // if (previousPlot) {\r\n // currentPath.push(new google.maps.LatLng(previousPlot.Latitude, previousPlot.Longitude));\r\n // }\r\n // }\r\n\r\n // var coords = new CoordsModel(plot.Latitude, plot.Longitude);\r\n\r\n // plot.pathCoords = new google.maps.LatLng(plot.Latitude, plot.Longitude);\r\n\r\n // currentPath.push(plot.pathCoords);\r\n\r\n // // this is for normal\r\n // pathLatLng.push(coords);\r\n\r\n // plot.coords = angular.copy(coords);\r\n // plot.color = this.plotHelper.getColorForSpeed(plot.VelocityMph);\r\n // //plot.options = this.getVehicleMarkerOptions(plot, vehicle, vm);\r\n\r\n // plot.ID = i; //use the to keep the map markers directive happy\r\n // }\r\n\r\n // previousPlot = plot;\r\n // }\r\n\r\n // console.log(this.myPaths);\r\n\r\n // //this.DisplaySelectedVehicleRouteOnMap(vm, pathLatLng);\r\n\r\n\r\n // //var latLngList = this.convertPlotsToGoogleLatLng(pathLatLngList);\r\n\r\n\r\n // //var options: google.maps.PolylineOptions = {\r\n // // path: latLngList,\r\n // // strokeColor: \"#7D7BF2\",\r\n // // strokeWeight: 5,\r\n // // strokeOpacity: 0.8\r\n // //};\r\n\r\n // //var polyline: google.maps.Polyline = new google.maps.Polyline(options);\r\n\r\n // //return polyline;\r\n\r\n //}\r\n}\r\n","import * as angular from \"angular\";\r\nimport { ConstantsService } from \"./constantsService\";\r\n\r\nexport interface IDialogOptionsJson {\n title?: string;\n afterTitle?: string;\n dialogHTML: string;\n dialogId: string;\n bindings?: any;\n escapeToClose?: boolean;\n clickOutsideToClose?: boolean;\n event?: MouseEvent;\n preventFocusOnOpen?: boolean;\n customClass?: string;\n multiple?: boolean;\r\n fullScreen?: boolean;\n preventFullScreenOnMobile?: boolean;\n hideXCloseButton?: boolean;\n}\n\r\nexport class DisplayService {\r\n\r\n static $inject = [\"$mdDialog\", \"$mdToast\", \"constantsService\"];\r\n\r\n constructor(\r\n private readonly $mdDialog: angular.material.IDialogService,\r\n private readonly $mdToast: angular.material.IToastService,\r\n private readonly constantsService: ConstantsService) {\n }\r\n\r\n showMessage(message: string, position?: string, hideDelay?: number): void {\r\n if (!position) {\r\n position = \"bottom right\";\r\n }\n\r\n if (hideDelay !== 0) {\r\n hideDelay = 3000;\r\n }\r\n\r\n this.$mdToast.show(\r\n this.$mdToast.simple()\r\n .textContent(message)\r\n .position(position)\r\n .hideDelay(hideDelay)\r\n );\r\n }\r\n\r\n showMessageWithTemplate(template: string, hideDelay: number, position: string, parent: string): void {\r\n\r\n this.$mdToast.show({\r\n template: template,\r\n hideDelay: hideDelay,\r\n position: position,\r\n parent: parent\r\n });\r\n }\r\n\r\n showDialog(dialogOptionsJson: IDialogOptionsJson): angular.IPromise {\n const controller = ($mdDialog) => {\n\n dialogOptionsJson.bindings = dialogOptionsJson.bindings || {};\n dialogOptionsJson.bindings.hide = () => { $mdDialog.hide(); };\n\r\n return dialogOptionsJson.bindings;\r\n };\r\n\r\n controller.$inject = [\"$mdDialog\"];\r\n\r\n const dialogOptions: angular.material.IDialogOptions = {\r\n focusOnOpen: !dialogOptionsJson?.preventFocusOnOpen,\r\n targetEvent: dialogOptionsJson?.event,\r\n escapeToClose: dialogOptionsJson?.escapeToClose,\r\n multiple: dialogOptionsJson?.multiple,\r\n clickOutsideToClose: dialogOptionsJson?.clickOutsideToClose,\r\n template: this.createDialogWrapper(dialogOptionsJson),\n fullscreen: dialogOptionsJson.fullScreen,\r\n controller: controller,\r\n controllerAs: \"$ctrl\"\r\n };\r\n\n\r\n return this.$mdDialog.show(dialogOptions);\r\n }\n\r\n createDialogWrapper(dialogOptionsJson: IDialogOptionsJson) {\n const isMobile = this.constantsService.getIsMobile();\n let customClass = dialogOptionsJson?.customClass || '';\r\n\r\n if (dialogOptionsJson.fullScreen) {\r\n customClass += \" fullscreen\";\r\n }\n\n const mobileClass = (!dialogOptionsJson.preventFullScreenOnMobile && isMobile) ? 'mobile' : '';\n const hideXCloseButton = dialogOptionsJson?.hideXCloseButton;\n\r\n return `\r\n \r\n
\r\n

${dialogOptionsJson.title}

\r\n\r\n ${dialogOptionsJson.afterTitle || \"\"}\r\n\r\n \r\n \r\n clear\r\n \r\n
\r\n
\r\n\r\n ${dialogOptionsJson.dialogHTML}\r\n
`;\r\n }\r\n}\r\n","import { SettingsName } from \"@app/class/SettingsName\";\r\nimport { AccountService, IAccount } from \"@services/account.service\";\r\nimport { NavigationService } from \"@services/navigation.service\";\r\nimport * as angular from \"angular\";\r\nimport { ConstantsService } from \"./constantsService\";\r\nimport { CurrentUserService } from \"./currentUser.service\";\r\nimport { SessionService } from \"./session.service\";\r\n\r\nexport interface IProcessResult {\r\n IsSuccess?: boolean;\r\n ExceptionMessage?: string;\r\n Value?: any;\r\n}\r\n\r\nexport interface ILoginResponse {\r\n\r\n // case sensitive, MUST be all lowercase\r\n\r\n access_token: string;\r\n accountSettings: string;\r\n\r\n expires_in: number;\r\n refresh_token: string;\r\n token_type: string;\r\n}\r\n\r\nexport class LoginService {\r\n tokenUrl: string;\r\n\r\n static $inject = [\"$http\", \"$q\", \"sessionService\", \"currentUserService\", \"constantsService\", \"accountService\", \"navigationService\"];\r\n\r\n constructor(\r\n private readonly $http: angular.IHttpService,\r\n private readonly $q: angular.IQService,\r\n private readonly sessionService: SessionService,\r\n private readonly currentUserService: CurrentUserService,\r\n private readonly constantsService: ConstantsService,\r\n private readonly accountService: AccountService,\r\n private readonly navigationService: NavigationService) {\r\n\r\n this.tokenUrl = this.constantsService.getTokenUrl();\r\n }\r\n\r\n sendForgotPasswordEmail(email: string): angular.IPromise {\r\n return this\r\n .$http({\r\n url: \"/api/forgottenpassword\",\r\n method: \"POST\",\r\n data: JSON.stringify(email)\r\n });\r\n }\r\n\r\n loginWithToken(token: string, flushExistingSession = false): angular.IPromise {\r\n return this.login(\"---\", token, flushExistingSession);\r\n }\r\n\r\n login(username: string, password: string, flushExistingSession = false): angular.IPromise {\r\n if (flushExistingSession) {\r\n // Flush any existing session\r\n this.sessionService.clearAllCachesAndSessions();\r\n }\r\n\r\n const encodedUsername = encodeURIComponent(username);\r\n\r\n return this.$http(\r\n {\r\n url: this.tokenUrl,\r\n method: \"POST\",\r\n data: `grant_type=password&username=${encodedUsername}&password=${encodeURIComponent(password)}`,\r\n headers: {\r\n \"Content-Type\": \"application/x-www-form-urlencoded\"\r\n }\r\n })\r\n .then((response: angular.IHttpResponse) => {\r\n this.storeLoginSession(response.data);\r\n\r\n return response.data;\r\n });\r\n }\r\n\r\n loginSaml(username: string, flushExistingSession = false): void {\r\n if (flushExistingSession) {\r\n // Flush any existing session\r\n this.sessionService.clearAllCachesAndSessions();\r\n }\r\n\r\n window.location.href = `${this.tokenUrl}/sso/Login?userName=${username}`\r\n }\r\n\r\n isSSOEnabled(username: string): angular.IPromise {\r\n return this.$http(\r\n {\r\n url: `${this.tokenUrl}/sso/enabled`,\r\n method: \"POST\",\r\n data: `username=${username}`,\r\n headers: {\r\n \"Content-Type\": \"application/x-www-form-urlencoded\"\r\n }\r\n })\r\n .then((response: angular.IHttpResponse) => {\r\n return response.data; \r\n });\r\n }\r\n\r\n switchAccount(accountId: number, reloadOnSuccess = false): angular.IPromise {\r\n return this.sessionService.switchAccount(accountId)\r\n .finally(() => {\r\n this.currentUserService.getCurrentUser(true).then(() => {\r\n this.accountRedirect(reloadOnSuccess);\r\n });\r\n });\r\n }\r\n\r\n switchToInternal(): angular.IPromise {\r\n this.sessionService.removeItem(SettingsName.AccountUserMappings);\r\n\r\n return this.sessionService.switchToInternal()\r\n .finally(() => {\r\n this.currentUserService.getCurrentUser(true).then(() => {\r\n this.accountRedirect(true).catch((error) => {\r\n this.navigationService.reloadBrowserLocation();\r\n });\r\n })\r\n });\r\n }\r\n\r\n accountRedirect(reload = false): angular.IPromise {\r\n return this.getAllUserAndAccountSettings(true).then((accountData) => {\r\n this.navigationService.goToDefaultPage(accountData, reload);\r\n });\r\n }\r\n\r\n getAllUserAndAccountSettings(invalidateCache = true): angular.IPromise {\r\n return this.currentUserService.getCurrentUser().then(currentUser => {\r\n // We chain these, as we need current user BEFORE we get account data\r\n return this.accountService.getAccountData(invalidateCache)\r\n .then(accountData => {\r\n\r\n return this.sessionService.getAllUserAndAccountSettings()\r\n .then(() => {\r\n return accountData;\r\n })\r\n .finally(() => {\r\n return accountData;\r\n });\r\n })\r\n .finally(() => {\r\n this.currentUserService.performUserValidationChecks();\r\n });\r\n });\r\n }\r\n\r\n // ---\r\n\r\n private storeLoginSession(loginResponse: ILoginResponse) {\r\n if (loginResponse != null && loginResponse.access_token.length > 0) {\r\n this.sessionService.setStorage(loginResponse);\r\n }\r\n else {\r\n console.warn(\"Didnt store login response...\");\r\n }\r\n }\r\n}\r\n","export class CameraModule {\r\n static get Dashboard(): string { return 'app.cameras.dashboard'; }\r\n static get Videos(): string { return 'app.cameras.videos'; }\r\n static get Events(): string { return 'app.cameras.events'; }\r\n static get EventView(): string { return 'app.cameras.events.view'; }\r\n static get History(): string { return 'app.cameras.history';}\r\n static get Vehicles(): string { return 'app.cameras.vehicles'; }\r\n static get VehicleView(): string { return `${CameraModule.Vehicles}.view`; }\r\n static get Drivers(): string { return 'app.cameras.drivers'; }\r\n static get Coaching(): string { return 'app.cameras.coaching'; }\r\n static get Downloads(): string { return 'app.cameras.downloads'; }\r\n\r\n static get Default(): string { return this.Dashboard; }\r\n static get ParentRoot(): string { return \"app.cameras\"; }\r\n}\r\n","export enum VTableSelectionType {\r\n None,\r\n Single,\r\n Multi\r\n}\r\n","\r\nexport enum TemperatureProbeCategory {\r\n Supply,\r\n Return,\r\n Evaporator,\r\n Ambient\r\n}\r\n","import * as angular from \"angular\";\n\nexport interface IPieDataSeries {\n label?: string;\n value: number;\n color: string;\n}\n\nexport class CanvasService {\n\n private singleUseCanvasStore = new Map();\n private imageCanvasStore = new Map();\n\n private blobCache = new Map();\n private blobPromiseCache = new Map>();\r\n\r\n static $inject = [\"$q\", \"$window\"];\r\n\r\n constructor(\n private readonly $q: angular.IQService,\n private readonly $window: angular.IWindowService\n ) {\r\n }\n\n getBlobCache(uniqueCacheCode: string): string {\n return this.blobCache.get(uniqueCacheCode);\n }\n\n getBlobCachePromise(uniqueCacheCode: string): angular.IPromise {\n return this.blobPromiseCache.get(uniqueCacheCode);\n }\n\n getBlobUrlPromise(canvas: HTMLCanvasElement, uniqueCacheCode: string = null): angular.IPromise {\n var url = \"\";\n var defer = this.$q.defer();\n\n //console.log(\"blub uetlet\");\n\n this.blobPromiseCache.set(uniqueCacheCode, defer.promise);\n\n canvas.toBlob(blob => {\n url = URL.createObjectURL(blob);\n\n if (uniqueCacheCode) {\n if (this.blobCache.has(uniqueCacheCode)) {\n console.log(\"Cache already exists for\", uniqueCacheCode, this.blobCache.get(uniqueCacheCode))\n }\n\n this.blobCache.set(uniqueCacheCode, url);\n }\n\n defer.resolve(url);\n });\n\n return defer.promise;\n }\n\n rotateContext(context: CanvasRenderingContext2D, angle: number) {\n context.rotate(angle * (Math.PI / 180));\n }\n\n drawRoundRect(ctx: CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number | { tl: number, tr: number, bl: number, br: number }) {\r\n if (typeof radius === 'undefined') {\r\n radius = 5;\r\n }\r\n\n if (typeof radius === 'number') {\r\n radius = { tl: radius, tr: radius, br: radius, bl: radius };\r\n }\n else {\r\n var defaultRadius = { tl: 0, tr: 0, br: 0, bl: 0 };\r\n for (var side in defaultRadius) {\r\n radius[side] = radius[side] || defaultRadius[side];\r\n }\r\n }\n\r\n ctx.beginPath();\r\n ctx.moveTo(x + radius.tl, y);\r\n ctx.lineTo(x + width - radius.tr, y);\n ctx.arcTo(x + width, y, x + width, y + radius.tr, radius.tr);\r\n ctx.lineTo(x + width, y + height - radius.br);\n ctx.arcTo(x + width, y + height, x + width - radius.br, y + height, radius.br);\r\n ctx.lineTo(x + radius.bl, y + height);\r\n ctx.arcTo(x, y + height, x, y + height - radius.bl, radius.bl);\r\n ctx.lineTo(x, y + radius.tl);\r\n ctx.arcTo(x, y, x + radius.tl, y, radius.tl);\r\n ctx.closePath();\r\n }\n\n getCachedImageCanvas(width: number, height: number, ...identifiers: string[]): HTMLCanvasElement {\n const identifier = this.createCachedImageIdentifier(width, height, ...identifiers);\n\n //console.log(\"gcic\", identifier, this.imageCanvasStore.length);\n\n if (this.imageCanvasStore.has(identifier)) {\n return this.imageCanvasStore.get(identifier);\r\n }\n\n return null;\n }\n\n createCachedImageCanvas(width: number, height: number, ...identifiers: string[]): HTMLCanvasElement {\n const identifier = this.createCachedImageIdentifier(width, height, ...identifiers);\n\n var canvas = this.createHiDPICanvas(width, height);\n this.imageCanvasStore.set(identifier, canvas);\n\n return canvas;\n }\n\n destroyCachedImageCanvases() {\n this.imageCanvasStore.forEach((canvas) => {\n canvas.remove();\n });\n\n this.imageCanvasStore.clear();\n }\n\n getSingleUseCanvas(width: number, height: number): HTMLCanvasElement {\n const arrayPosition = `${width}-${height}`;\n\n if (this.singleUseCanvasStore.has(arrayPosition)) {\n var cachedCanvas = this.singleUseCanvasStore.get(arrayPosition);\n\n const context = cachedCanvas.getContext(\"2d\");\n context.clearRect(0, 0, width, height);\n\n return cachedCanvas;\n }\n\n var canvas = this.createHiDPICanvas(width, height);\n\n this.singleUseCanvasStore.set(arrayPosition, canvas);\n\n return canvas;\n }\n\n createHiDPICanvas(width: number, height: number/*, devicePixelRatio?: number*/): HTMLCanvasElement {\r\n\r\n var canvas = document.createElement(\"canvas\");\n var context = canvas.getContext(\"2d\");\n\n this.setCanvasDimensions(canvas, context, width, height);\n\r\n return canvas;\r\n }\n\n setCanvasDimensions(canvas: HTMLCanvasElement, context: CanvasRenderingContext2D, width: number, height: number) {\n if (!canvas) {\n return;\n }\n\n var devicePixelRatio = this.getDevicePixelRatio();\n // 3 ratios seem to misbehave\n if (devicePixelRatio >= 3) {\n devicePixelRatio = 1;\n }\n\n canvas.width = width * devicePixelRatio;\r\n canvas.height = height * devicePixelRatio;\n\r\n canvas.style.width = width + \"px\";\r\n canvas.style.height = height + \"px\";\n\n context.scale(devicePixelRatio, devicePixelRatio);\n }\n\n getDevicePixelRatio(): number {\n return this.$window.devicePixelRatio || 1;\r\n }\n\n getPieCanvas(width: number, dataSeries: IPieDataSeries[]): HTMLCanvasElement {\r\n var canvas = this.createHiDPICanvas(width, width);\n this.drawPieChart(canvas, dataSeries, 9);\r\n\n return canvas;\r\n }\n\n getPieImage(width: number, dataSeries: IPieDataSeries[]): string {\n var canvas = this.getPieCanvas(width, dataSeries);\r\n\n return canvas.toDataURL();\n }\n\n drawPieChart(canvas: HTMLCanvasElement, data: IPieDataSeries[], padding = 0) {\r\n var ctx = canvas.getContext(\"2d\");\n\n var width = canvas.width / this.getDevicePixelRatio();\n var height = canvas.height / this.getDevicePixelRatio();\n\r\n var centerX = width / 2;\r\n var centerY = height / 2;\n var radius = (width / 2) - padding;\n\n var degrees90 = this.degreeToRadians(90);\n\n ctx.strokeStyle = \"rgba(0,0,0,0.6)\";\n\r\n var total = this.getTotal(data);\r\n\r\n for (var i = 0; i < data.length; i++) {\r\n var color = data[i].color;\r\n var startAngle = this.calculateStart(data, i, total) - degrees90;\r\n var endAngle = this.calculateEnd(data, i, total) - degrees90;\r\n\r\n ctx.beginPath();\r\n ctx.fillStyle = color;\r\n ctx.moveTo(centerX, centerY);\r\n ctx.arc(centerX, centerY, radius, startAngle, endAngle);\r\n ctx.fill();\n\n //var isFullSize = startAngle == 0 && endAngle == this.degreeToRadians(360);\n //if (!isFullSize || true) {\n ctx.stroke();\n //}\r\n //ctx.rect(canvas.width - 200, y - i * 30, 12, 12);\r\n //ctx.fill();\r\n //ctx.font = \"13px sans-serif\";\r\n //ctx.fillText(data[i].label + \" - \" + data[i].value + \" (\" + calculatePercent(data[i].value, total) + \"%)\", canvas.width - 200 + 20, y - i * 30 + 10);\r\n }\r\n\r\n ctx.fillStyle = \"white\";\r\n ctx.moveTo(centerX, centerY);\r\n ctx.beginPath();\r\n //ctx.arc(x, y, (y - padding) * 0.758, 0, 2 * Math.PI);\n ctx.arc(centerX, centerY, radius * 0.7, 0, 2 * Math.PI);\r\n ctx.fill();\n ctx.stroke();\r\n }\r\n\r\n calculatePercent(value, total) {\r\n return ((value / total) * 100).toFixed(2);\r\n }\r\n\r\n getTotal(data) {\r\n var sum = 0;\r\n for (var i = 0; i < data.length; i++) {\r\n sum += data[i].value;\r\n }\r\n\r\n return sum;\r\n }\r\n\r\n calculateStart(data, index, total) {\r\n if (index === 0) {\r\n return 0;\r\n }\r\n\r\n return this.calculateEnd(data, index - 1, total);\r\n }\r\n\r\n calculateEndAngle(data, index, total) {\r\n var angle = ((data[index].value / total) * 360);\r\n var inc = index === 0 ? 0 : this.calculateEndAngle(data, index - 1, total);\r\n\r\n return angle + inc;\r\n }\r\n\r\n calculateEnd(data, index, total) {\r\n return this.degreeToRadians(this.calculateEndAngle(data, index, total));\r\n }\r\n\r\n degreeToRadians(angle) {\r\n return (angle * Math.PI) / 180;\r\n }\n\n getTextWidth(text: string, font: string): number {\r\n var canvas = this.getSingleUseCanvas(100, 100);\r\n var context = canvas.getContext(\"2d\");\r\n context.font = font;\n\r\n var metrics = context.measureText(text);\r\n\n return metrics.width;\r\n }\n\n // ---\n\n private createCachedImageIdentifier(width: number, height: number, ...identifiers: string[]) {\n const identifier = `${width}-${height}-${identifiers.join(\"-\")}`;\n return identifier;\n }\r\n}\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { getOptionsQueryParams } from \"@app/class/Utilities\";\r\nimport { IPlot } from \"@app/interfaces/IPlot\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { IStreamaxExtendedDeviceInfo } from \"@app/main/modules/foundation/_routes/hardware/_models/IStreamaxExtendedDeviceInfo\";\r\nimport { FoundationPeripheralService } from \"@app/main/modules/foundation/_services/peripheral.service.ajs\";\r\nimport { PlotService } from \"@app/services/plot.service\";\r\nimport { ReasonCodeService } from \"@app/services/reasonCode.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { forkJoin, from, lastValueFrom, Observable, Subject, timer } from \"rxjs\";\r\nimport { map, switchMap } from \"rxjs/operators\";\r\nimport { VideoStatus } from \"../enums/VideoStatus\";\r\nimport { CameraConfigUrlDto } from \"../models/camera-config-url-dto\";\r\nimport { ICameraChannel } from \"../models/ICameraChannel\";\r\nimport { IVideoEntry } from \"../models/IVideoEntry\";\r\nimport { RefreshOnlineStatusData } from \"../models/refresh-online-status.data\";\r\nimport { VideoEntryUtils } from \"../utils/video-entry-utils\";\r\nimport { CameraOnlineHistoryService } from \"./camera-online-history.service\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CameraStatusService {\r\n private forceStatusUpdateSubject = new Subject();\r\n forceStatusUpdate$ = this.forceStatusUpdateSubject.asObservable();\r\n\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly plotService: PlotService,\r\n private readonly cameraOnlineHistoryService: CameraOnlineHistoryService,\r\n private readonly foundationPeripheralService: FoundationPeripheralService,\r\n private readonly translationService: TranslationService,\r\n private readonly reasonCodeService: ReasonCodeService\r\n ) { }\r\n\r\n getDeviceInfo(serial: string): Observable {\r\n const result = this.http.get(`/api/ftcloudapi/${serial}/deviceinfo`);\r\n return result;\r\n }\r\n\r\n getCameraConfigPageUrl(serial: string, supplierCode: string): Observable {\r\n return this.http.get(`/api/ftcloudapi/${serial}/configurl`, { params: { supplierCode } });\r\n }\r\n\r\n forceStatusUpdate(): void {\r\n this.forceStatusUpdateSubject.next();\r\n }\r\n\r\n createOnlineStatusObservable(vehicle: IVehicle, intervalMs: number = 60_000): Observable {\r\n return timer(0, intervalMs).pipe(\r\n switchMap(() => forkJoin([\r\n from(this.plotService.getLatestPlotForVehicle(vehicle.Id) as Promise),\r\n from(this.getVideoChannels(vehicle.Id)),\r\n from(this.cameraOnlineHistoryService.getCameraOnlineStatus(vehicle.Id)),\r\n ])),\r\n map(([plot, streamingChannels, onlineStatus]) => {\r\n return {\r\n plot,\r\n streamingChannels,\r\n onlineStatus: this.foundationPeripheralService.getOnlineStatus(vehicle, onlineStatus)\r\n }\r\n }),\r\n )\r\n }\r\n\r\n async getVideoChannels(vehicleId: number): Promise {\r\n const options = getOptionsQueryParams({ VehicleId: vehicleId });\r\n\r\n const result = await lastValueFrom(this.http\r\n .get(`/api/cameras/channels`, options));\r\n\r\n return result;\r\n }\r\n\r\n getVideoDownloadStatusLabel(videoEntry: IVideoEntry): string {\r\n if (VideoEntryUtils.hasNoFootage(videoEntry)) {\r\n return this.translationService.t(\"VideoStatusEnum.NoFootageAvailable\");\r\n }\r\n\r\n if (!videoEntry.vehicle?.onlineStatus?.online && VideoEntryUtils.isRequested(videoEntry)) {\r\n return this.translationService.t(\"cameraService.CameraOffline\");\r\n }\r\n\r\n if (VideoEntryUtils.isRequested(videoEntry)) {\r\n return this.translationService.t(\"cameraService.Requested\");\r\n }\r\n\r\n if (VideoEntryUtils.isDownloading(videoEntry)) {\r\n return this.translationService.t(\"cameraService.Downloading\");\r\n }\r\n\r\n if (VideoEntryUtils.isDownloaded(videoEntry)) {\r\n return this.translationService.t(\"cameraService.Downloaded\");\r\n }\r\n\r\n if (VideoEntryUtils.isFaceblurring(videoEntry)) {\r\n return this.translationService.t(\"cameraService.Processing\");\r\n }\r\n\r\n return this.translationService.tEnum(VideoStatus, \"VideoStatus\", videoEntry.Status);\r\n }\r\n\r\n getVideoDisplayStatus(videoEntry: IVideoEntry): string {\r\n if (videoEntry.Status == VideoStatus.EventOnly &&\r\n videoEntry.MetaData.Authorised &&\r\n videoEntry.MetaData.Authorised.length !== 0) {\r\n return this.translationService.t(\"cameraService.noActionRequired\");\r\n }\r\n\r\n const displayName = this.translationService.tEnum(VideoStatus, \"VideoStatus\", videoEntry.Status);\r\n\r\n return displayName || VideoStatus[videoEntry.Status];\r\n }\r\n\r\n getVideoRequestStatus(videoEvent: IVideoEntry): string {\r\n const statuses = [\r\n VideoStatus.Downloaded,\r\n VideoStatus.Error,\r\n VideoStatus.Cancelled,\r\n VideoStatus.NoFootageAvailable,\r\n VideoStatus.NoFilesAvailable,\r\n VideoStatus.Restricted,\r\n VideoStatus.Expired,\r\n VideoStatus.HardwareDeleted,\r\n ];\r\n\r\n if (statuses.includes(videoEvent.Status)) {\r\n return this.getVideoDisplayStatus(videoEvent);\r\n }\r\n\r\n const plot = videoEvent.vehicle.Plot;\r\n const isIgnitionOn = this.reasonCodeService.isIgnitionOn(plot.Reason);\r\n const channelsLength = videoEvent.vehicle.videoChannels?.length;\r\n\r\n if (plot && !isIgnitionOn || (channelsLength)) {\r\n return this.translationService.t(\"cameraService.Offline\");\r\n }\r\n\r\n return this.getVideoDisplayStatus(videoEvent);\r\n }\r\n}\r\n","export enum AlcolockEventCode {\r\n Unknown = 0,\r\n PowerUp = 1,\r\n InitialSampleFailed = 2,\r\n RandomSampleFailed = 3,\r\n InitialSamplePassed = 4,\r\n RandomSamplePassed = 5,\r\n PossiblePushStart = 6,\r\n OverridePeriodStarted = 7,\r\n OverridePeriodEnded = 8,\r\n EmergencyOverridePeriodStarted = 9,\r\n ForcedSampleRequest = 10,\r\n RandomSampleRequest = 11,\r\n CallTimeExpired = 12,\r\n CircumventionBreathRelated = 13,\r\n CircumventionSuckBack = 14,\r\n CircumventionBlowingTooHard = 15,\r\n SystemRearmedStartTimeExpired = 16,\r\n SystemRearmedRestartTimeExpired = 17,\r\n TabConnected = 18,\r\n DriverChangeRequest = 19,\r\n DriverChangePassed = 20,\r\n DriverChangeFailed = 21,\r\n DriverChangeCallExpired = 22,\r\n ManualSample = 23,\r\n PassedAfterRandomCallExpired = 24,\r\n PassedAfterDriverChangeCallExpired = 25,\r\n FailedAfterRandomCallExpired = 26,\r\n FailedAfterDriverChangeCallExpired = 27,\r\n CircumventionInsufficientSample = 28,\r\n DoorOpened = 29,\r\n IgnitionOn = 30,\r\n IgnitionOff = 31,\r\n DatabaseDeleted = 32, \r\n ServiceReminder = 33,\r\n ServiceExpired = 34\r\n}\n\nexport enum AlcolockRecordType {\r\n AlcoholMeasurement,\r\n Calibration\r\n}\n\nexport enum AlcolockEventGroup {\n Other = 0,\r\n Fail = 1,\r\n Circumvention = 2,\r\n Pass = 3,\r\n SignificantEvent = 4\r\n}\n\nexport enum RingStatus {\r\n OK,\r\n Warning,\r\n Error,\n NoData\r\n}\n","export enum ReportDataFunction\r\n{\r\n Sum,\r\n Min,\r\n Max,\r\n Average,\r\n Median,\r\n Range,\r\n Count,\r\n First,\r\n Last,\r\n List,\r\n Percent\r\n}\r\n","\r\nimport { ColourService } from \"@services/colour.service\";\r\nimport * as angular from \"angular\";\r\nimport Highcharts, { Gradient } from \"highcharts\";\r\n\r\nexport type ChartType = \"line\" | \"areaspline\" | \"pie\" | \"bar\" | \"column\" | \"xrange\" | \"Combination chart\" | \"polar\";\r\nexport type PointEventType = \"click\" | \"mouseOver\" | \"mouseOut\" | \"drag\" | \"dragStart\" | \"drop\" | \"remove\";\n\nexport interface IHighchartsDataSeries {\n name: string;\n data: T[];\n color?: string;\n}\n\r\nexport class ChartService {\r\n\r\n static $inject = [\"$q\", \"$timeout\", \"colourService\"];\r\n\r\n constructor(\r\n private $q: angular.IQService,\r\n private $timeout: angular.ITimeoutService,\n private readonly colourService: ColourService) {\r\n }\r\n\r\n getAllChartsOnPage(): Highcharts.ChartObject[] {\r\n return window[\"Highcharts\"].charts;\r\n }\r\n\r\n reflowAllCharts() {\r\n this.$timeout(() => {\r\n window.dispatchEvent(new Event('resize'));\r\n }, 50);\r\n }\r\n\r\n setXAxisType(axisOptions: Highcharts.AxisOptions | Highcharts.AxisOptions[], type: \"datetime\") {\r\n axisOptions = this.getAxisOptions(axisOptions);\r\n\r\n axisOptions.type = type;\r\n }\n\n addOrUpdateChartCrossHairFromMouseX(xaxis: any, mouseXPosition: number) {\r\n var x: number = xaxis.toValue(mouseXPosition, false);\n this.addOrUpdateChartCrossHair(xaxis, x);\r\n }\r\n\r\n addOrUpdateChartCrossHair(xaxis: any, xValue: number) {\r\n\r\n xaxis.removePlotLine('plot-line-x');\n\r\n if (xValue) {\r\n xaxis.addPlotLine({\r\n value: xValue,\r\n color: 'rgba(180,180,180,0.5)',\r\n width: 1,\r\n id: 'plot-line-x',\r\n zIndex: 5\r\n });\r\n }\r\n }\r\n\r\n setChartXAxisExtremes(chart: Highcharts.Options, max: number, min: number) {\r\n\r\n var xAxis = chart.xAxis as any;\r\n\r\n xAxis.max = max;\r\n xAxis.min = min;\r\n }\r\n\r\n setAxisLabelFormatter(axisOptions: Highcharts.AxisOptions | Highcharts.AxisOptions[], callBackFn: () => string) {\r\n var axisArray = axisOptions as Highcharts.AxisOptions[];\r\n\r\n if (!Array.isArray(axisOptions)) {\r\n axisArray = [axisOptions as Highcharts.AxisOptions];\r\n }\r\n\r\n axisArray.forEach(axisOption => {\r\n axisOption.labels = axisOption.labels || {};\r\n axisOption.labels.formatter = callBackFn;\r\n });\r\n }\r\n\r\n getAxisOptions(axisOptions: Highcharts.AxisOptions | Highcharts.AxisOptions[]): Highcharts.AxisOptions {\r\n if (Array.isArray(axisOptions)) {\r\n console.error(\"Dont send arrays into this function\");\r\n }\r\n\r\n return axisOptions as Highcharts.AxisOptions;\r\n }\r\n\r\n setLegendOptions(options: Highcharts.Options, legend: Highcharts.LegendOptions) {\r\n options.legend = legend;\r\n }\r\n\r\n addYAxis(options: Highcharts.Options, newAxis: Highcharts.AxisOptions): any {\r\n if (!options.yAxis) {\r\n options.yAxis = [];\r\n }\r\n\r\n if (!options.yAxis) {\r\n console.error(\"No yAxis provided\");\r\n return;\r\n }\r\n\r\n if (!newAxis.id) {\r\n newAxis.id = `yAxis${Math.round(Math.random() * 1000)}`;\r\n }\r\n\r\n (options.yAxis as Highcharts.AxisOptions[]).push(newAxis);\r\n }\r\n\r\n subscribeToMouseEvents(options: Highcharts.Options, eventName: PointEventType, callback: (x: number, clientX: number, event?: MouseEvent) => void) {\r\n var chartTypes = [\"line\", \"spline\", \"areaspline\", \"xrange\", \"Combination chart\"];\r\n\r\n chartTypes.forEach(chartType => {\r\n //if (!options.plotOptions[chartType]) {\r\n // return;\r\n //}\r\n\r\n options.plotOptions[chartType] = options.plotOptions[chartType] || {};\r\n options.plotOptions[chartType].point = options.plotOptions[chartType].point || {};\r\n options.plotOptions[chartType].point.events = options.plotOptions[chartType].point.events || {};\r\n\r\n options.plotOptions[chartType].point.events[eventName] = function () {\r\n callback(this.x, this.clientX, this);\r\n }\r\n });\r\n }\r\n\r\n createDashboardChartOptions(chartType: ChartType): Highcharts.Options {\r\n\r\n var options = this.createChartOptions(chartType);\r\n\r\n // Remove xAxis\r\n var xAxis = options.xAxis as Highcharts.AxisOptions;\r\n xAxis.visible = false;\r\n xAxis.endOnTick = false;\r\n xAxis.minPadding = 0;\r\n\r\n var yAxis = options.yAxis as Highcharts.AxisOptions;\r\n yAxis.visible = false;\r\n yAxis.endOnTick = false;\r\n\r\n // Remove spacing\r\n options.chart.marginTop = 0;\r\n options.chart.marginLeft = 0;\r\n options.chart.spacing = [0, 0, 0, 0];\r\n options.chart.plotBorderWidth = 0;\r\n options.chart.alignTicks = false;\r\n\r\n return options;\r\n }\r\n\r\n setOnLoadCallback(options: Highcharts.Options, callback: (object: Highcharts.ChartObject, event: Event) => void) {\r\n\r\n options.chart = options.chart || {};\r\n options.chart.events = options.chart.events || {};\r\n\r\n options.chart.events.load = function (event: Event) {\r\n callback(this, event);\r\n }\r\n }\r\n\r\n createBaseChartOptions(chartType: ChartType): Highcharts.Options {\r\n var options: Highcharts.Options = {\r\n credits: {\r\n enabled: false\r\n },\r\n exporting: {\r\n enabled: false\r\n },\r\n title: null,\n tooltip: {},\r\n legend:\r\n {\r\n enabled: false\r\n },\r\n plotOptions: {},\r\n chart: {\r\n type: chartType,\r\n backgroundColor: \"transparent\",\r\n resetZoomButton: {\r\n theme: {\r\n display: \"none\"\r\n }\r\n }\r\n }\r\n };\r\n\r\n return options;\r\n }\r\n\r\n createChartOptions(chartType: ChartType): Highcharts.Options {\r\n switch (chartType) {\r\n case \"line\":\r\n case \"areaspline\":\r\n return this.createLineChartOptions();\r\n\r\n case \"column\":\r\n return this.createColumnChartOptions();\n\n case 'polar':\n return this.createPolarChartOptions();\r\n\r\n case \"pie\":\r\n return this.createPieChartOptions();\r\n\r\n default:\r\n return this.createBaseChartOptions(chartType);\r\n }\r\n }\n\n createPolarChartOptions(): Highcharts.Options {\n var options: Highcharts.Options = {\r\n credits: {\r\n enabled: false\r\n },\r\n exporting: {\r\n enabled: false\r\n },\r\n title: null,\r\n legend:\r\n {\r\n enabled: false\r\n },\r\n plotOptions: {},\r\n chart: {\r\n polar: true,\r\n type: 'line',\r\n backgroundColor: \"transparent\",\n borderWidth: 0,\n borderColor: 'transparent',\r\n resetZoomButton: {\r\n theme: {\r\n display: \"none\"\r\n }\r\n }\r\n }\r\n };\r\n\r\n return options;\r\n }\n\n createSparklineOptions(): Highcharts.Options {\n return {\r\n chart: {\r\n //renderTo: (options.chart && options.chart.renderTo) || (hasRenderToArg && a),\r\n backgroundColor: null,\r\n borderWidth: 0,\r\n type: 'area',\r\n margin: [2, 0, 2, 0],\r\n width: 120,\r\n height: 20,\r\n style: {\r\n overflow: 'visible'\r\n },\r\n // small optimalization, saves 1-2 ms each sparkline\r\n //skipClone: true\r\n },\r\n title: {\r\n text: ''\r\n },\r\n credits: {\r\n enabled: false\r\n },\r\n xAxis: {\r\n labels: {\r\n enabled: false\r\n },\r\n title: {\r\n text: null\r\n },\r\n startOnTick: false,\r\n endOnTick: false,\r\n tickPositions: []\r\n },\r\n yAxis: {\r\n endOnTick: false,\r\n startOnTick: false,\r\n labels: {\r\n enabled: false\r\n },\r\n title: {\r\n text: null\r\n },\r\n tickPositions: [0]\r\n },\r\n legend: {\r\n enabled: false\r\n },\r\n tooltip: {\r\n hideDelay: 0,\r\n outside: true,\r\n shared: true\r\n },\r\n plotOptions: {\r\n series: {\r\n animation: false,\r\n lineWidth: 1,\r\n shadow: false,\r\n states: {\r\n hover: {\r\n lineWidth: 1\r\n }\r\n },\r\n marker: {\r\n radius: 1,\r\n states: {\r\n hover: {\r\n radius: 2\r\n }\r\n }\r\n },\r\n //fillOpacity: 0.25\r\n },\r\n column: {\r\n negativeColor: '#910000',\r\n borderColor: 'silver'\r\n }\r\n }\n }\n }\r\n\r\n createPieChartOptions(): Highcharts.Options {\r\n\r\n var options = this.createBaseChartOptions(\"pie\");\r\n\r\n options.plotOptions.pie = {\r\n borderColor: 'rgba(0,0,0,0.5)',\r\n innerSize: '65%',\r\n dataLabels: {\r\n enabled: false, // hide on small charts\r\n format: '{point.name}: {point.percentage:.1f} %',\r\n style: {\r\n color: /*(Highcharts.theme && Highcharts.theme.contrastTextColor) ||*/ 'black'\r\n }\r\n },\r\n showInLegend: true\r\n };\r\n\r\n options.chart.marginLeft = 10;\r\n\r\n return options;\r\n }\r\n\r\n createLineChartOptions(): Highcharts.Options {\r\n\r\n var options = this.createBaseChartOptions(\"line\");\r\n\r\n options.chart.spacing = [0, 0, 5, 0];\r\n options.chart.plotBackgroundColor = \"#fff\";\r\n options.chart.plotBorderWidth = 0;\r\n options.chart.plotBorderColor = \"rgba(0,0,0,0.12)\";\r\n options.chart.zoomType = \"x\";\r\n\r\n options.tooltip = {\r\n crosshairs: true,\r\n shared: true\r\n };\r\n\r\n options.xAxis = {\r\n id: `xAxis${Math.round(Math.random() * 1000)}`,\r\n minPadding: 0,\r\n maxPadding: 0,\r\n type: \"datetime\",\r\n plotBands: [],\r\n startOnTick: true,\r\n endOnTick: true,\r\n minRange: 3600000\r\n };\r\n\r\n options.yAxis = {\r\n id: `yAxis${Math.round(Math.random() * 1000)}`,\r\n title: null,\r\n labels: {\r\n enabled: true,\r\n align: \"left\",\r\n x: 3,\r\n y: 15,\r\n reserveSpace: false,\r\n style: {\r\n color: \"rgba(0,0,0,0.4)\"\r\n }\r\n }\r\n };\r\n\r\n options.plotOptions.line = this.getDefaultLineChartConfig();\r\n options.plotOptions.spline = options.plotOptions.line;\r\n options.plotOptions.areaspline = this.getDefaultAreaChartConfig();\r\n\r\n return options;\r\n }\r\n\r\n createColumnChartOptions(): Highcharts.Options {\r\n\r\n var options = this.createBaseChartOptions(\"column\");\r\n\r\n //options.chart.spacing = [0, 0, 5, 0];\r\n options.chart.spacingLeft = 0;\r\n options.chart.spacingBottom = 0;\r\n\r\n //options.chart.plotBackgroundColor = \"#fff\";\r\n //options.chart.plotBorderWidth = 0;\r\n options.chart.plotBorderColor = \"rgba(0,0,0,0.12)\";\r\n //options.chart.zoomType = \"x\";\r\n\r\n options.tooltip = {\r\n crosshairs: true,\r\n shared: true\r\n };\r\n\r\n options.xAxis = {\r\n id: `xAxis${Math.round(Math.random() * 1000)}`,\r\n //minPadding: 0,\r\n //maxPadding: 0,\r\n type: \"datetime\",\r\n plotBands: [],\r\n //minRange: 3600000\r\n };\r\n\r\n options.yAxis = {\r\n id: `yAxis${Math.round(Math.random() * 1000)}`,\r\n title: null,\r\n labels: {\r\n enabled: true,\r\n //align: \"left\",\r\n //x: 3,\r\n //y: 15,\r\n //reserveSpace: false,\r\n style: {\r\n color: \"rgba(0,0,0,0.4)\"\r\n }\r\n }\r\n };\r\n\r\n //options.plotOptions.line = this.getDefaultLineChartConfig();\r\n //options.plotOptions.spline = options.plotOptions.line;\r\n //options.plotOptions.areaspline = this.getDefaultAreaChartConfig();\r\n\r\n return options;\r\n }\r\n\r\n //createBaseChartConfig(options: Highcharts.Options, series: Highcharts.IndividualSeriesOptions[], onLoadPromise: angular.IDeferred = null): HighChartsNGConfig {\r\n\r\n // var config: HighChartsNGConfig = {\r\n // options: options,\r\n // series: series,\r\n // loading: false,\r\n // func: (chart: ChartObject) => {\r\n // if (onLoadPromise) {\r\n // onLoadPromise.resolve(chart);\r\n // }\r\n\r\n // //chart.redraw();\r\n // },\r\n // size: {}\r\n // };\r\n\r\n // return config;\r\n //}\r\n\r\n roundValue(value: number, precision = 1): number {\r\n var multiplier = Math.pow(10, precision);\r\n\r\n value = value * multiplier;\r\n value = Math.round(value);\r\n value /= multiplier\r\n\r\n return value;\r\n }\r\n\r\n createBasicXRangeChart(xrangeSeries: any): Highcharts.Options {\r\n\r\n var config = this.createXRangeChartOptions();\r\n config.series = xrangeSeries;\r\n\r\n return config;\r\n }\r\n\r\n createXRangeChartOptions() {\r\n var options: any = {\r\n chart: {\r\n type: 'xrange',\r\n spacing: [0, 0, 5, 0],\r\n backgroundColor: \"transparent\",\r\n plotBackgroundColor: \"#fff\",\r\n plotBorderWidth: 0,\r\n plotBorderColor: \"rgba(0,0,0,0.12)\",\r\n zoomType: \"x\",\r\n resetZoomButton: {\r\n position: {\r\n align: \"right\",\r\n verticalAlign: \"bottom\",\r\n x: -5,\r\n y: 3\r\n }\r\n }\r\n },\r\n credits: {\r\n enabled: false\r\n },\r\n plotOptions: {\r\n series: {\r\n turboThreshold: 0,\r\n }\r\n },\r\n tooltip: {\r\n enabled: false\r\n },\r\n title: {\r\n text: null\r\n },\r\n xAxis: {\r\n type: 'datetime',\r\n minPadding: 0,\r\n maxPadding: 0,\r\n startOnTick: true,\r\n crosshairs: {\r\n enabled: true,\r\n shared: true\r\n }\r\n },\r\n yAxis: {\r\n title: {\r\n text: '',\r\n },\r\n labels: {\r\n align: 'right',\r\n x: -19,\r\n y: 5,\r\n distance: 20,\r\n reserveSpace: true,\r\n style: {\r\n color: 'rgba(0,0,0,0.8)',\r\n },\r\n },\r\n categories: [\"category 1\", \"category 2\", \"category 3\", \"category 4\",],\r\n reversed: true,\r\n },\r\n };\r\n\r\n return options;\r\n }\r\n\r\n getDefaultAreaChartConfig(lineWidth = 1): Highcharts.AreaChart {\r\n var defaultAreaLineChartConfig = this.getDefaultLineChartConfig(lineWidth);\r\n\r\n //window[\"Highcharts\"].getOptions().colors[0];\r\n var primaryColour = window[\"Highcharts\"].getOptions().colors[1];\r\n primaryColour = \"rgba(55, 175, 234,1)\";\r\n primaryColour = \"rgba(0,0,0,0.05)\";\r\n\r\n defaultAreaLineChartConfig.fillColor = this.getGradientFade(primaryColour);\r\n\r\n defaultAreaLineChartConfig.lineWidth = 2;\r\n\r\n return defaultAreaLineChartConfig;\r\n }\r\n\r\n getGradientFade(colour: string, initialOpacity = 0.08): Highcharts.Gradient {\r\n var highChartsColor = window[\"Highcharts\"].Color(colour) as Gradient;\r\n var stop1Colour = highChartsColor.setOpacity(initialOpacity).get('rgba');\r\n var stop2Colour = highChartsColor.setOpacity(initialOpacity / 5).get('rgba');\r\n\r\n return {\r\n linearGradient: {\r\n x1: 0,\r\n y1: 0,\r\n x2: 0,\r\n y2: 1\r\n },\r\n stops: [\r\n //#37afea / 55, 175, 234\r\n [0, stop1Colour],\r\n [1, stop2Colour]\r\n ]\r\n }\r\n }\n\n useVigetColours(config: Highcharts.Options, numDimensions = this.colourService.vigetColours.length) {\n if (!config.colors) {\n config.colors = [];\n }\n\n for (var i = 0; i < numDimensions; i++) {\r\n\r\n const colour = this.colourService.getVigetColor(i, numDimensions/*, colourOffset*/);\r\n\r\n config.colors.push(colour);\r\n }\n }\r\n\r\n // ----------------------\r\n\r\n private getDefaultLineChartConfig(lineWidth = 1): Highcharts.AreaChart {\r\n return {\r\n marker:\r\n {\r\n enabled: false, // disable for simplified view\r\n radius: 2\r\n },\r\n states: {\r\n hover: {\r\n lineWidth: lineWidth\r\n }\r\n },\r\n lineWidth: lineWidth,\r\n zoneAxis: \"x\",\r\n zones: []\r\n };\r\n }\r\n\r\n // Fancy tooltip html\r\n\r\n // tooltip: {\r\n // crosshairs: true,\r\n // shared: true,\r\n // //backgroundColor: null,\r\n // formatter: () => { return false; } // disables tooltip but keeps crosshair\r\n // //useHTML: true,\r\n // //positioner: function (boxWidth, boxHeight, point) {\r\n // // var x = point.plotX + this.chart.plotLeft - (boxWidth / 2);\r\n\r\n // // var tooltipMinX = 20;\r\n // // var tooltipMaxX = this.chart.plotLeft + this.chart.plotSizeX - boxWidth + 20;\r\n\r\n // // if (x < tooltipMinX) {\r\n // // x = tooltipMinX;\r\n // // }\r\n\r\n // // if (x > tooltipMaxX) {\r\n // // x = tooltipMaxX;\r\n // // }\r\n\r\n // // var y = -boxHeight-20 /*+ 60*/;\r\n\r\n // // return { x: x, y: y };\r\n // //},\r\n // //borderRadius: 0,\r\n // //hideDelay: 30 * 1000,\r\n // //padding: 0,\r\n // //borderWidth: 0,\r\n // //shadow: false,\r\n // //formatter: function () {\r\n // // if (controller.lastGraphTooltipX === this.x && controller.lastGraphTooltip && controller.lastGraphTooltip.length) {\r\n // // console.log(\"hide one\");\r\n // // return controller.lastGraphTooltip;\r\n // // }\r\n\r\n // // controller.lastGraphTooltipX = this.x;\r\n\r\n // // var speedingClass = controller.highlightedPlot.VelocityMph >\r\n // // controller.highlightedPlot.SpeedLimit ? \"speeding\" : \"\";\r\n\r\n // // // Header\r\n // // var tooltip = `
\r\n // //
\r\n // // ${controller.veridate.formatDate(this.x)}\r\n // // \r\n\r\n // //
${controller.highlightedPlot.VelocityMph}
\r\n // //
${controller.highlightedPlot.SpeedLimit}
\r\n // //
`;\r\n\r\n // // // Body\r\n // // tooltip += `
`;\r\n\r\n // // controller.events.forEach(event => {\r\n // // if (event.plot === controller.highlightedPlot) {\r\n // // console.log(event.options.labelContent);\r\n // // tooltip += `
${event.options.labelContent}
`;\r\n // // }\r\n // // });\r\n\r\n // // tooltip += `
place ${controller.highlightedPlot.FormattedAddress}

`;\r\n // // tooltip += `
Axle Weight: 0
`;\r\n // // tooltip += `
% Time Over Torque: 0
`;\r\n // // tooltip += `
% Time Over Revving: 0
`;\r\n // // tooltip += `
Elevation: 0
`;\r\n\r\n // // tooltip += `
`;\r\n\r\n // // tooltip += `
`;\r\n\r\n // // controller.lastGraphTooltip = tooltip;\r\n\r\n // // return tooltip;\r\n\r\n // //}\r\n // },\r\n\r\n\r\n\r\n\r\n\r\n\r\n //usePercentageTooltipFormatter(options: Highcharts.Options) {\r\n // options.tooltip.formatter = function () {\r\n // console.log(\"formatter\", this);\r\n // //const minutes = $ctrl.$filter(\"minutesToDuration\")(this.y / 1000);\r\n\r\n // //this.percentage\r\n\r\n // if (this.points) {\r\n // var output = \"\";\r\n\r\n // this.points.forEach(point => {\r\n // output += `${point.series.name}: ${Math.round(point.y)}`;\r\n // });\r\n\r\n // return output;\r\n // }\r\n\r\n // return `

${this.key} (${Math.round(this.y)}%)

`;\r\n // };\r\n\r\n // options.tooltip.useHTML = true;\r\n //}\r\n}\r\n","export enum CameraChannelType {\r\n Standard,\r\n ADASSensor,\r\n DMSSensor,\r\n BlindSpotSensor\r\n}\r\n","\r\nexport enum VideoCoachingStatus {\r\n None,\r\n DriverTrained,\r\n Praise\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule, NO_ERRORS_SCHEMA, Type } from '@angular/core';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { VTableModule } from '@app/directives/_layout/v-table/v-table.module';\r\nimport { VisualisationsModule } from '@app/directives/_visualisations/visualisations.module';\r\nimport { CoreDirectivesModule } from '@directives/_core/_core.directives.module';\r\nimport { FormsDirectivesModule } from '@directives/_forms/_form.directives.module';\r\nimport { LayoutDirectivesModule } from '@directives/_layout/_layout.directives.module';\r\nimport { MapDirectivesModule } from '@directives/_map/_map.directives.module';\r\nimport { MiscDirectivesModule } from '@directives/_misc/_misc.directives.module';\r\nimport { ResourceFiltersDirectivesModule } from '@directives/_resourceFilters/_resourceFilters.directives.module';\r\nimport { TranslationDirectivesModule } from '@directives/_translations/_translations.directives.module';\r\nimport { VehicleDirectivesModule } from '@directives/_vehicle/_vehicle.directives.module';\r\nimport { VeriDirectivesModule } from '@directives/_veri/_veri.directives.module';\r\nimport { providerCreator } from '@services/_services.module';\r\nimport { StateParams } from '@uirouter/angularjs';\r\nimport { PipesModule } from 'src/app/_pipes/_pipes.module';\r\nimport { AccountSettingsManagerComponent } from './account-settings/account-settings-manager.component';\r\nimport { AccountSettingsSaveWarningComponent } from './account-settings/account-settings-save-warning/account-settings-save-warning.component';\r\nimport { AutoDownloadConfigurationComponent } from './cameras/camera-channels-editor/auto-download-configuration/auto-download-configuration.component';\r\nimport { AutoDownloadConfigurationEditorComponent } from './cameras/camera-channels-editor/auto-download-configuration/editor/auto-download-configuration-editor.component';\r\nimport { CameraChannelsEditorComponent } from './cameras/camera-channels-editor/camera-channels-editor.component';\r\nimport { ChannelThumbnailComponent } from './cameras/camera-channels-editor/channel-thumbnail/channel-thumbnail.component';\r\nimport { CameraVehiclesManagerComponent } from './cameras/camera-vehicles-manager/camera-vehicles-manager.component';\r\nimport { ContextualSpeedingByRoadComponent } from './contextual-speeding-settings-manager/contextual-speeding-by-road/contextual-speeding-by-road.component';\r\nimport { ContextualSpeedingByVehicleComponent } from './contextual-speeding-settings-manager/contextual-speeding-by-vehicle/contextual-speeding-by-vehicle.component';\r\nimport { ContextualSpeedingRoadEditorComponent } from './contextual-speeding-settings-manager/contextual-speeding-road-editor/contextual-speeding-road-editor.component';\r\nimport { ContextualSpeedingSettingsManagerComponent } from './contextual-speeding-settings-manager/contextual-speeding-settings-manager.component';\r\nimport { ContextualSpeedingVehicleEditorComponent } from './contextual-speeding-settings-manager/contextual-speeding-vehicle-editor/contextual-speeding-vehicle-editor.component';\r\nimport { DeviceProfileComparisonStatusLabelComponent } from './device-profiles-manager/device-profile-comparison-status-label/device-profile-comparison-status-label.component';\r\nimport { DeviceProfileEditorComponent } from './device-profiles-manager/device-profile-editor/device-profile-editor.component';\r\nimport { DeviceProfileVehiclePreviewComponent } from './device-profiles-manager/device-profile-vehicle-preview/device-profile-vehicle-preview.component';\r\nimport { DeviceProfileVehicleViewComponent } from './device-profiles-manager/device-profile-vehicle-view/device-profile-vehicle-view.component';\r\nimport { DeviceProfilesManagerComponent } from './device-profiles-manager/device-profiles-manager.component';\r\nimport { DrivingStyleAssociationsManagerComponent } from './driving-styles-manager/driving-style-associations-manager/driving-style-associations-manager.component';\r\nimport { DrivingStyleEditorComponent } from './driving-styles-manager/driving-style-editor/driving-style-editor.component';\r\nimport { DrivingStyleMetricEditorComponent } from './driving-styles-manager/driving-style-metric-editor/driving-style-metric-editor.component';\r\nimport { DrivingStyleMetricSelectorComponent } from './driving-styles-manager/driving-style-metric-selector/driving-style-metric-selector.component';\r\nimport { DrivingStyleMetricWeightingLabelComponent } from './driving-styles-manager/driving-style-metric-weighting-label/driving-style-metric-weighting-label.component';\r\nimport { DrivingStyleVehiclePreviewComponent } from './driving-styles-manager/driving-style-vehicle-preview/driving-style-vehicle-preview.component';\r\nimport { DrivingStylesManagerComponent } from './driving-styles-manager/driving-styles-manager.component';\r\nimport { GroupsModule } from './groups/groups.module';\r\nimport { SamlConfigurationComponent } from \"./users/saml-configuration/saml-configuration.component\";\r\nimport { UserEditorComponent } from './users/userEditor/user-editor.component';\r\nimport { TemperatureZonesComponent } from './vehicles/temperatureProbes/temperature-zones-edit/temperature-zones-edit.component';\r\n\r\nconst privateComponents: Type[] = [\r\n];\r\n\r\nconst publicComponents: Type[] = [\r\n DrivingStylesManagerComponent,\r\n DrivingStyleEditorComponent,\r\n DrivingStyleAssociationsManagerComponent,\r\n DrivingStyleMetricEditorComponent,\r\n DrivingStyleMetricSelectorComponent,\r\n DrivingStyleMetricWeightingLabelComponent,\r\n DrivingStyleVehiclePreviewComponent,\r\n\r\n TemperatureZonesComponent,\r\n DeviceProfilesManagerComponent,\r\n DeviceProfileEditorComponent,\r\n DeviceProfileVehicleViewComponent,\r\n DeviceProfileVehiclePreviewComponent,\r\n DeviceProfileComparisonStatusLabelComponent,\r\n CameraChannelsEditorComponent,\r\n CameraVehiclesManagerComponent,\r\n UserEditorComponent,\r\n\r\n ChannelThumbnailComponent,\r\n\r\n AccountSettingsManagerComponent,\r\n AccountSettingsSaveWarningComponent,\r\n ContextualSpeedingSettingsManagerComponent,\r\n ContextualSpeedingByVehicleComponent,\r\n ContextualSpeedingByRoadComponent,\r\n ContextualSpeedingRoadEditorComponent,\r\n ContextualSpeedingVehicleEditorComponent,\r\n SamlConfigurationComponent,\r\n AutoDownloadConfigurationComponent,\r\n AutoDownloadConfigurationEditorComponent\r\n];\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n VeriDirectivesModule,\r\n TranslationDirectivesModule,\r\n MiscDirectivesModule,\r\n ReactiveFormsModule,\r\n VTableModule,\r\n\r\n LayoutDirectivesModule,\r\n PipesModule,\r\n ResourceFiltersDirectivesModule,\r\n VehicleDirectivesModule,\r\n FormsDirectivesModule,\r\n CoreDirectivesModule,\r\n MapDirectivesModule,\r\n\r\n FormsModule,\r\n VisualisationsModule,\r\n GroupsModule\r\n ],\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents],\r\n exports: [...publicComponents],\r\n providers: [\r\n providerCreator(StateParams, \"$stateParams\")\r\n ],\r\n schemas: [NO_ERRORS_SCHEMA]\r\n})\r\nexport class ResourceManagementModule {\r\n constructor() {}\r\n}\r\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { VehicleType } from \"@app/enum/VehicleType.enum\";\r\nimport { StreamaxRecordOverwrite } from \"@app/main/modules/foundation/_enums/camera-configs/CameraConfigEnums\";\r\nimport { ILocalTimeSettings } from \"@app/main/modules/foundation/_models/_camera-configs/CameraConfigModels\";\r\nimport { DataCacheService } from \"@app/services/caching/data-cache.service\";\r\nimport { ITimeZoneInfo } from \"@app/userPreferences/model/ITimeZoneInfo\";\r\nimport { Observable } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class StreamaxCameraProfileService {\r\n\r\n private streamaxCameraProfilesCache: string = \"streamaxCameraProfilesCache\";\r\n\r\n constructor(\r\n private readonly dataCacheService: DataCacheService,\r\n private readonly http: HttpClient\r\n ) { }\r\n\r\n getProfiles(invalidateCache = false): Observable {\r\n return this.dataCacheService.getOrRequest(this.streamaxCameraProfilesCache, () => this.getProfilesFromDb(), { invalidateCache });\r\n }\r\n\r\n getProfilesFromDb(): Observable {\r\n return this.http.get(`/api/cameras/profiles`);\r\n }\r\n\r\n postProfile(profile: IStreamaxCameraProfile): Observable {\r\n return this.http.post(`/api/cameras/profiles/basic`, profile);\r\n }\r\n\r\n postTriggerOverride(profileId: number, customTriggers: ITriggerMetricsOverride): Observable {\r\n return this.http.post(`/api/cameras/profiles/${profileId}/triggeroverride`, customTriggers);\r\n }\r\n\r\n deleteTriggerOverride(profileId: number, vehicleType: VehicleType): Observable {\r\n return this.http.delete(`/api/cameras/profiles/${profileId}/triggeroverride/${vehicleType}`);\r\n }\r\n\r\n postActiveSetUpdate(profileId: number, activeSet: boolean): Observable {\r\n return this.http.post(`/api/cameras/profiles/${profileId}/active`, activeSet);\r\n }\r\n\r\n convertStreamaxTimezoneId(streamaxTimezoneId: string): Observable<{ timezoneId: string }> {\r\n return this.http.get<{ timezoneId: string }>(`/api/cameras/profiles/streamaxtimezoneid/convert`, {\r\n params: { streamaxTimezoneId }\r\n });\r\n }\r\n\r\n convertTimezoneInfoIdToStreamaxModel(timezoneInfoId: string): Observable {\r\n return this.http.get(`/api/cameras/profiles/internaltimezoneid/convert`, { params: { timezoneInfoId } });\r\n }\r\n\r\n getTriggerDefaults(vehicleType: VehicleType): Observable {\r\n return this.http.get(`/api/cameras/profiles/triggerdefaults/${vehicleType}`)\r\n }\r\n\r\n updateProfileToCache(profile: IStreamaxCameraProfile): void {\r\n this.dataCacheService.addOrUpdateItem(profile, this.streamaxCameraProfilesCache);\r\n }\r\n}\r\n\r\nexport interface IStreamaxCameraProfile {\r\n AccountId: number;\r\n CreatedTime?: Date;\r\n UpdatedTime?: Date;\r\n Name?: string;\r\n IsActive: boolean;\r\n Id: number;\r\n CameraDeviceParameterProfileSettings: ICameraDeviceParameterProfileSettings;\r\n}\r\n\r\nexport interface ICameraDeviceParameterProfileSettings {\r\n AudioEnabled: boolean;\r\n IgnitionDelay: number;\r\n CameraCoveredAlarm: boolean;\r\n VideoLossAlarm: boolean;\r\n RecordOverwrite: StreamaxRecordOverwrite;\r\n TimeSettings: ILocalTimeSettings;\r\n AlarmProfileMap: IAlarmProfileMap;\r\n\r\n // -----\r\n\r\n internalTimezoneInfo?: ITimeZoneInfo;\r\n updatedTimezoneInfo?: ITimeZoneInfo;\r\n}\r\n\r\nexport interface IAlarmProfileMap {\r\n AlarmEnabled: boolean;\r\n HarshBrakingTriggerEnabled: boolean;\r\n HardAccelerationTriggerEnabled: boolean;\r\n HarshRightTurnTriggerEnabled: boolean;\r\n HarshLeftTurnTriggerEnabled: boolean;\r\n TriggerMetricOverrides?: ITriggerMetricsOverride[];\r\n}\r\n\r\nexport interface ITriggerMetricsOverride {\r\n VehicleType: VehicleType;\r\n TriggerMetricsMap: ITriggerMetricsMap;\r\n}\r\n\r\nexport interface ITriggerMetricsMap {\r\n HarshBrakingTriggerMetrics: ITriggerMetrics;\r\n HarshAccelerationTriggerMetrics: ITriggerMetrics;\r\n LeftTurnTriggerMappings: ITriggerMetrics;\r\n RightTurnTriggerMappings: ITriggerMetrics;\r\n GyroTriggers: IGyroTriggers;\r\n}\r\n\r\nexport interface ITriggerMetrics {\r\n StartSpeed: number;\r\n EndSpeed: number;\r\n Offset: number;\r\n ReAlertTimeSeconds: number;\r\n}\r\n\r\nexport interface IGyroTriggers {\r\n XTrigger: number;\r\n YTrigger: number;\r\n ZTrigger: number;\r\n}\r\n","import { CommonModule } from \"@angular/common\";\r\nimport { NgModule } from \"@angular/core\";\r\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\nimport { VTableModule } from \"@app/directives/_layout/v-table/v-table.module\";\r\nimport { ResourceFiltersDirectivesModule } from \"@app/directives/_resourceFilters/_resourceFilters.directives.module\";\r\nimport { CoreDirectivesModule } from \"@directives/_core/_core.directives.module\";\r\nimport { FormsDirectivesModule } from \"@directives/_forms/_form.directives.module\";\r\nimport { LayoutDirectivesModule } from \"@directives/_layout/_layout.directives.module\";\r\nimport { MiscDirectivesModule } from \"@directives/_misc/_misc.directives.module\";\r\nimport { VeriTableService } from \"@directives/_veri/veriTable/veriTable.service\";\r\nimport { VeriDirectivesModule } from \"@directives/_veri/_veri.directives.module\";\r\nimport { CustomerNameComponent } from \"@foundation/_components/customer-name/customer-name.component\";\r\nimport { FoundationNotesListComponent } from \"@foundation/_components/foundation-notes-list/foundation-notes-list.component\";\r\nimport { SimStatusInfoComponent } from \"@foundation/_components/simStatusInfo/simStatusInfo.component\";\r\nimport { providerCreator } from \"@services/_services.module\";\r\nimport { PipesModule } from \"src/app/_pipes/_pipes.module\";\r\nimport { SimDataComponent } from \"../_routes/hardware/sim/sim-data/sim-data.component\";\r\nimport { SimStatusComponent } from \"../_routes/hardware/sim/sim-status/sim-status.component\";\r\nimport { FoundationPeripheralService } from \"../_services/peripheral.service.ajs\";\r\nimport { BarcodeScannerLivestreamComponent } from \"./barcode-scanner/barcode-scanner-livestream.component\";\r\nimport { BarcodeScannerComponent } from \"./barcode-scanner/barcode-scanner.component\";\r\nimport { CommandSenderComponent } from \"./commandSender/commandSender.component\";\r\nimport { CommissionCheckComponent } from \"./commissionCheck/commission-check.component\";\r\nimport { ConfigSwitcherComponent } from \"./configSwitcher/config-switcher.component\";\r\nimport { DeviceInstallValidatorComponent } from \"./device-install-validator/device-install-validator.component\";\r\nimport { DeviceSummaryComponent } from \"./device-summary/device-summary.component\";\r\nimport { DeviceValidationSummaryComponent } from \"./device-validation-summary/device-validation-summary.component\";\r\nimport { Commission4gCheckComponent } from \"./diagnostics4G/commission4gCheck/commission-4g-check.component\";\r\nimport { Diagnostics4gComponent } from \"./diagnostics4G/diagnostics-4g.component\";\r\nimport { FoundationAuditNotesListComponent } from \"./notesAuditList/notes-audit-list.component\";\r\nimport { ResellerNameComponent } from \"./reseller-name/reseller-name.component\";\r\nimport { ValidationCheckContainerComponent } from \"./validation-check-container/validation-check-container.component\";\r\n\r\nconst privateComponents: any[] = [\r\n\r\n];\r\n\r\nconst publicComponents: any[] = [\r\n SimStatusInfoComponent,\r\n CustomerNameComponent,\r\n ResellerNameComponent,\r\n FoundationNotesListComponent,\r\n BarcodeScannerComponent,\r\n BarcodeScannerLivestreamComponent,\r\n CommandSenderComponent,\r\n ConfigSwitcherComponent,\r\n Diagnostics4gComponent,\r\n Commission4gCheckComponent,\r\n FoundationAuditNotesListComponent,\r\n DeviceSummaryComponent,\r\n SimDataComponent,\r\n SimStatusComponent,\r\n DeviceValidationSummaryComponent,\r\n DeviceInstallValidatorComponent,\r\n ValidationCheckContainerComponent,\r\n CommissionCheckComponent\r\n];\r\n\r\nconst declarations: any[] = [\r\n];\r\n\r\nconst providers: any[] = [\r\n providerCreator(VeriTableService, \"veriTableService\"),\r\n providerCreator(FoundationPeripheralService, \"foundationPeripheralService\")\r\n];\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n BrowserAnimationsModule,\r\n PipesModule,\r\n MiscDirectivesModule,\r\n LayoutDirectivesModule,\r\n VeriDirectivesModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n CoreDirectivesModule,\r\n FormsDirectivesModule,\r\n VTableModule,\r\n ResourceFiltersDirectivesModule\r\n ],\r\n providers: providers,\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents, ...declarations],\r\n exports: [...publicComponents, ...declarations]\r\n})\r\nexport class FoundationComponentsModule {\r\n constructor() {\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { getOptionsQueryParams } from \"@app/class/Utilities\";\r\nimport { formatBytes } from \"@app/filters/formatBytes.filter\";\r\nimport { ISim, SimType } from \"@app/interfaces/ISim\";\r\nimport { Observable } from \"rxjs\";\r\nimport { map } from \"rxjs/operators\";\r\nimport { ISimStatus } from \"../_models/ISimStatus\";\r\nimport { ISimQueryOptions } from \"../_routes/hardware/_models/ISimQueryOptions\";\r\nimport { ISimStatusInfo } from \"./peripheral.service.ajs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SimService {\r\n constructor(private readonly http: HttpClient) { }\r\n\r\n getSims(options: ISimQueryOptions = {}): Observable {\r\n const params = getOptionsQueryParams(options);\r\n\r\n return this.http.get(`/api/sims/`, params);\r\n }\r\n\r\n getSim(simId: number): Observable {\r\n return this.getSims({ Id: simId }).pipe(map(sims => {\r\n if (sims.length) {\r\n return sims[0];\r\n }\r\n }))\r\n }\r\n\r\n getSimInfo(serial: string): Observable {\r\n return this.http.get(`/api/foundation/units/${serial}/simstatus`);\r\n }\r\n\r\n getSimByIccid(iccid: string): Observable {\r\n return this.getSims({ Iccid: iccid }).pipe(map(sims => {\r\n if (sims?.length) {\r\n return sims[0];\r\n }\r\n }));\r\n }\r\n\r\n getSimStatusByIccid(iccid: string, type: SimType): Observable {\r\n return this.http.get(`/api/sims/status`, {\r\n params: {\r\n iccid,\r\n type\r\n }\r\n }).pipe(map(simStatus => {\r\n\r\n if (simStatus.DataUsage != null) {\r\n simStatus.dataUsageFormatted = formatBytes()(simStatus.DataUsage);\r\n }\r\n return simStatus;\r\n }))\r\n } \r\n\r\n updateSim(sim: ISim): Observable {\r\n return this.http.post('/api/sims', sim);\r\n }\r\n}\r\n","export interface ICameraApp {\r\n Id: number;\r\n FileGuid: string;\r\n CameraAppType: CameraAppType;\r\n Name: string;\r\n Description: string;\r\n State: CameraApplicationState;\r\n Version: string;\r\n IsActive: boolean;\r\n}\r\n\r\nexport enum CameraAppType {\r\n Updater,\r\n Telematics,\r\n Firmware\r\n}\r\n\r\nexport enum CameraApplicationState {\r\n Beta,\r\n Development,\r\n Production\r\n}\r\n","export interface ILatestSensorDataValues extends Record\r\n{\r\n}\r\n\r\nexport class LatestSensorDataValues {\r\n constructor(values: ILatestSensorDataValues ) {\r\n this.values = values;\r\n\r\n if (!this.values[SensorDataValueType.VehicleId]) {\r\n return;\r\n }\r\n\r\n this.vehicleId = this.values[SensorDataValueType.VehicleId].Value;\r\n }\r\n\r\n public getValue(sensorDataType: SensorDataValueType): type {\r\n\r\n var sensorDataValue = this.values[sensorDataType];\r\n\r\n if (!sensorDataValue) {\r\n return null;\r\n }\r\n\r\n return sensorDataValue.Value as type;\r\n }\r\n\r\n values: ILatestSensorDataValues;\r\n\r\n vehicleId: number\r\n}\r\n\r\nexport interface ISensorDataValue {\r\n EventTime: Date;\r\n Value: any;\r\n}\r\n\r\nexport enum SensorDataValueType {\r\n AdBlueLevel = 0,\r\n BatteryLevel = 1,\r\n CruiseActive = 2,\r\n EngineRpm = 3,\r\n Odometer = 4,\r\n OdometerKm = 5,\r\n Velocity = 6,\r\n Kpl = 7,\r\n FuelLevel = 8,\r\n OdometerKmCan = 9,\r\n PtoActive = 10,\r\n TachoSlot1Driver = 11,\r\n TachoSlot1WorkState = 12,\r\n TachoSlot1TimeState = 13,\r\n TachoSlot1DrivingTime = 14,\r\n TachoSlot2Driver = 15,\r\n TachoSlot2WorkState = 16,\r\n TachoSlot2TimeState = 17,\r\n TachoSlot2DrivingTime = 18,\r\n ThrottlePosition = 19,\r\n TotalWeight = 20,\r\n TrailerId = 21,\r\n TrailerConnected = 22,\r\n VehicleIdentificationNumber = 23,\r\n VelocityCan = 24,\r\n Header = 25,\r\n Profile = 26,\r\n ExtendedInfo = 27,\r\n TotalDuration = 28,\r\n Axle1Weight = 30,\r\n Axle2Weight = 31,\r\n Axle3Weight = 32,\r\n Axle4Weight = 33,\r\n BrakeApplications = 34,\r\n BrakeLowSpeedApplications = 35,\r\n BrakeMedSpeedApplications = 36,\r\n BrakeHighSpeedApplications = 37,\r\n BrakeApplicationsOverThreshold = 38,\r\n BrakeDistance = 39,\r\n BadAnticipationCount = 40,\r\n CoastingDuration = 41,\r\n CoastingDistance = 42,\r\n CruiseDuration = 43,\r\n CruiseDistance = 44,\r\n CruisePotentialDistance = 45,\r\n CruiseWhileInTopGearDistance = 46,\r\n DrivingDuration = 51,\r\n EcoRollDistance = 52,\r\n EmptyRunningDistance = 53,\r\n EmptyRunningFuelUsed = 54,\r\n EngineOnDuration = 55,\r\n EngineBrakeApplications = 56,\r\n EngineBrakeLowTorqueDuration = 57,\r\n EngineBrakeMedTorqueDuration = 58,\r\n EngineBrakeHighTorqueDuration = 59,\r\n FuelUsedCruise = 60,\r\n FuelUsedDriving = 61,\r\n FuelUsedIdle = 62,\r\n FuelUsedIdleExclusive = 63,\r\n FuelUsedPto = 64,\r\n FuelUsedTotal = 65,\r\n FuelType = 66,\r\n IdlingDuration = 67,\r\n IdlingDurationExclusive = 68,\r\n OverAccelerationDuration = 69,\r\n OverAccelerationDurationLowThreshold = 70,\r\n OverAccelerationDurationHighThreshold = 71,\r\n OverIdlingDuration = 72,\r\n OverIdlingDurationLowThreshold = 73,\r\n OverIdlingDurationMedThreshold = 74,\r\n OverIdlingDurationHighThreshold = 75,\r\n OverIdlingCount = 76,\r\n OverRevDuration = 77,\r\n OverRevDurationLowThreshold = 78,\r\n OverRevDurationMedThreshold = 79,\r\n OverRevDurationHighThreshold = 80,\r\n OverRevDistance = 81,\r\n OverRevDistanceLowThreshold = 82,\r\n OverRevDistanceMedThreshold = 83,\r\n OverRevDistanceHighThreshold = 84,\r\n OverSpeedDuration = 85,\r\n OverTorqueDuration = 86,\r\n OverTorqueDistance = 87,\r\n PtoDuration = 88,\r\n PtoActiveDuration = 89,\r\n TopGearDistance = 90,\r\n TravelStopEventCount = 91,\r\n PrimaryAuxEngineSource = 92,\r\n PrimaryAuxEngineOnDuration = 93,\r\n PrimaryAuxElectricOnDuration = 94,\r\n PrimaryAuxStandbyOnDuration = 95,\r\n PrimaryAuxEngineFuelLevel = 96,\r\n PrimaryAuxBatteryVoltage = 97,\r\n VehicleId = 98,\r\n CoastingInclusiveDuration = 99,\r\n CoastingInclusiveDistance = 100,\r\n CruiseWhileInTopGearDuration = 101,\r\n GreenBandDistanceLowThreshold = 102,\r\n GreenBandDistanceMedThreshold = 103,\r\n GreenBandDistanceHighThreshold = 104,\r\n GreenBandDurationLowThreshold = 105,\r\n GreenBandDurationMedThreshold = 106,\r\n GreenBandDurationHighThreshold = 107,\r\n SweetSpotDistanceLowThreshold = 108,\r\n SweetSpotDistanceMedThreshold = 109,\r\n SweetSpotDistanceHighThreshold = 110,\r\n SweetSpotDurationLowThreshold = 111,\r\n SweetSpotDurationMedThreshold = 112,\r\n SweetSpotDurationHighThreshold = 113,\r\n RolloverStabilityControlMinorCount = 114,\r\n RolloverStabilityControlMinorDuration = 115,\r\n RolloverStabilityControlMajorCount = 116,\r\n RolloverStabilityControlMajorDuration = 117,\r\n AverageVelocity = 118,\r\n Distance = 119,\r\n DistanceKm = 120,\r\n OdometerKmStart = 121,\r\n OdometerKmEnd = 122,\r\n MaxVelocity = 123,\r\n DistanceKmCan = 124,\r\n FuelLevelStart = 125,\r\n FuelLevelEnd = 126,\r\n OdometerKmCanStart = 127,\r\n OdometerKmCanEnd = 128,\r\n CommonEventCount = 129,\r\n}\r\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { ILatestSensorDataValuesQueryOptions } from \"@app/interfaces/ILatestSensorDataValuesQueryOptions\";\r\nimport { ISensorData } from \"@app/interfaces/ISensorData\";\r\nimport { ILatestSensorDataValues, LatestSensorDataValues, SensorDataValueType } from \"@app/interfaces/ISensorDataValue\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { VehicleService } from \"@app/services/vehicle.service\";\r\nimport { lastValueFrom } from \"rxjs\";\r\nimport { IVehicleWithSensorDataValues } from \"./_models/IVehicleWithSensorData\";\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class SensorDataService {\r\n constructor(\r\n private readonly httpClient: HttpClient,\r\n private readonly vehicleService: VehicleService\r\n ) { }\r\n\r\n getLatestSensorData(invalidateCache = false): Promise {\r\n const options = { params: {} as HttpParams }\r\n\r\n options.params[\"minsToLive\"] = 30;\r\n options.params[\"invalidateCache\"] = invalidateCache;\r\n\r\n return lastValueFrom(this.httpClient.get(\"/api/sensorData/latest\", options));\r\n }\r\n\r\n getLatestSensorDataByVehicle(vehicleId: number, invalidateCache = false): Promise {\r\n const options = { params: {} as HttpParams }\r\n\r\n options.params[\"minsToLive\"] = 30;\r\n options.params[\"invalidateCache\"] = invalidateCache;\r\n\r\n return lastValueFrom(this.httpClient.get(`/api/sensorData/latest/${vehicleId}`, options));\r\n }\r\n\r\n getLatestSensorDataValues(queryOptions: ILatestSensorDataValuesQueryOptions = {}): Promise {\r\n const options = { params: {} as HttpParams }\r\n\r\n options.params[\"minsToLive\"] = queryOptions.minsToLive;\r\n options.params[\"invalidateCache\"] = queryOptions.invalidateCache;\r\n options.params[\"VehicleId\"] = queryOptions.VehicleId;\r\n\r\n return lastValueFrom(this.httpClient\r\n .get(`/api/sensorData/latest/values`, options))\r\n .then(data => data\r\n .filter(value => value && value[SensorDataValueType.VehicleId])\r\n .map(value => new LatestSensorDataValues(value)));\r\n }\r\n\r\n getSensorData(vehicleId: number, start: Date, end: Date, invalidateCache = false): Promise {\r\n const options = { params: {} as HttpParams }\r\n\r\n options.params[\"minsToLive\"] = 30;\r\n options.params[\"invalidateCache\"] = invalidateCache;\r\n options.params[\"start\"] = start.toISOString();\r\n options.params[\"end\"] = end.toISOString();\r\n\r\n return lastValueFrom(this.httpClient.get(`/api/sensorData/${vehicleId}`, options));\r\n }\r\n\r\n getLatestVehiclesSensorData(invalidateCache = false): Promise {\r\n const vehiclesPromise = this.vehicleService.getVehicles({ includePeripheralMappings: true, invalidateCache }) as Promise;\r\n const sensorDataPromise = this.getLatestSensorDataValues({ invalidateCache });\r\n\r\n return Promise\r\n .all([vehiclesPromise, sensorDataPromise])\r\n .then(([vehicles, sensorData]) => {\r\n return vehicles\r\n .map(vehicle => {\r\n const matchingSensorData = sensorData.find(s => s.vehicleId === vehicle.Id);\r\n\r\n return matchingSensorData\r\n ? { ...vehicle, latestSensorDataValues: matchingSensorData } as IVehicleWithSensorDataValues\r\n : null;\r\n })\r\n .filter((vehicle) => vehicle !== null)\r\n })\r\n }\r\n}\r\n","\r\nimport { CoordsModel } from \"@components/livemap/model/CoordsModel\";\r\nimport { ICommonMapComponent } from \"@directives/_map/v-map/v-map/v-map.component\";\r\nimport { BroadcastEvent } from \"@enums/BroadcastEvent\";\r\nimport { ICombinedPreferences } from \"@interfaces/ICombinedPreferences\";\r\nimport { IGeofence } from \"@interfaces/IGeofences\";\r\nimport { AccountFeatureService, UserRole } from \"@services/accountFeature.service\";\r\nimport { FullScreenService } from \"@services/fullscreen.service\";\r\nimport { MapService } from \"@services/map.service\";\r\nimport { SessionService } from \"@services/session.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport * as angular from \"angular\";\r\nimport { SettingsName } from \"src/app/class/SettingsName\";\r\nimport \"./veriMap.scss\";\r\n\r\nexport enum MapPopupType {\r\n Cluster,\r\n Vehicle,\r\n Plot,\r\n Geofence,\r\n RightClick,\r\n Custom\r\n}\r\n\r\nexport interface IVeriMapChildComponent {\r\n getLatLngsForFitMap?(): google.maps.LatLng[];\r\n\r\n onMapLoad?(): void;\r\n onMapIdle?(): void;\r\n onMouseMove?(position: google.maps.LatLng, event: Event): boolean;\r\n}\r\n\r\nexport interface IVeriMapComponent extends ICommonMapComponent {\r\n //getMap(): google.maps.Map;\r\n getMapOffsetCenter(): google.maps.LatLng;\r\n //fitMap(latLngs: google.maps.LatLng[] | google.maps.LatLngLiteral[]);\r\n fitMapToAll();\r\n panMap(latLng: google.maps.LatLng);\r\n setCenter(latLng: google.maps.LatLng);\r\n smoothPanAndZoomTo(latLng: google.maps.LatLng, targetZoom: number): angular.IPromise;\r\n clearData(): void;\r\n\r\n registerChildComponent(childComponent: IVeriMapChildComponent);\r\n deregisterChildComponent(childComponent: IVeriMapChildComponent);\r\n\r\n showPopup(popupType: MapPopupType, position: google.maps.LatLng, model: any, hideControls?: boolean);\r\n hidePopup(popupType: MapPopupType, immediate: boolean);\r\n setPopupPosition(position: google.maps.LatLng);\r\n\r\n mapOffset: google.maps.Point;\r\n userOptions: ICombinedPreferences;\r\n\r\n mapInitialised: boolean;\r\n mapInitialisedPromise: angular.IPromise;\r\n\r\n greyscale: boolean;\r\n disablePopup: boolean;\r\n\r\n disableDefaultUi: boolean;\r\n showControlsOnRight: boolean;\r\n}\r\n\r\ninterface IVeriMapBindings {\r\n mapCenter: CoordsModel;\r\n mapZoom: number;\r\n mapOffset: google.maps.Point;\r\n updateMapSize: any;\r\n updateMapSizeAndFit: any;\r\n\r\n showFullScreen: boolean;\r\n showSearch: boolean;\r\n includeVehicleSearch: boolean;\r\n hideGeofences: boolean;\r\n\r\n showResourceToggle: boolean;\r\n showIgnitionOffToggle: boolean;\r\n ignitionOffCount: number;\r\n\r\n onPopupClick: () => void;\r\n onEditGeofenceClick: (args: { geofence: IGeofence }) => void;\r\n onMapLoaded: (args: { veriMap: IVeriMapComponent }) => void;\r\n onMapUnloaded: (args: { veriMap: IVeriMapComponent }) => void;\r\n onMapIdle(args: { veriMap: IVeriMapComponent });\r\n onMapBoundsChanged: (args: { veriMap: IVeriMapComponent }) => void;\r\n onShowPopup: (args: { position: google.maps.LatLng, model?: any }) => void;\r\n onGeofenceClicked: (args: { geofence: IGeofence }) => void;\r\n onToggleResource: (args: { show: boolean }) => void;\r\n onToggleIgnitionOff: (args: { show: boolean }) => void;\r\n}\r\n\r\nclass VeriMapComponentController implements angular.IComponentController, IVeriMapBindings, IVeriMapComponent {\r\n\r\n popupHideControls: boolean;\r\n popupType: MapPopupType;\r\n popupLatLng: google.maps.LatLng;\r\n popupPosition: google.maps.Point;\r\n popupModel: any;\r\n //popupAboutToClose: boolean;\r\n\r\n mapObject: google.maps.Map;\r\n mapCenter: CoordsModel;\r\n mapZoom: number;\r\n mapOffset: google.maps.Point;\r\n updateMapSize: any;\r\n updateMapSizeAndFit: any;\r\n\r\n showFullScreen: boolean;\r\n showResourceToggle: boolean;\r\n showIgnitionOffToggle: boolean;\r\n showResource: boolean = true;\r\n showIgnitionOff: boolean = false;\r\n ignitionOffCount: number;\r\n showSearch: boolean;\r\n includeVehicleSearch: boolean;\r\n hideGeofences: boolean;\r\n greyscale: boolean;\r\n disablePopup: boolean;\r\n disableDefaultUi: boolean = false;\r\n showControlsOnRight: boolean;\r\n\r\n userDoesntHaveManageGeofencesPermission: boolean;\r\n\r\n mapInitialised: boolean;\r\n mapInitialisedPromise: angular.IPromise;\r\n\r\n onPopupClick: () => void;\r\n onEditGeofenceClick: (args: { geofence: IGeofence }) => void;\r\n onMapLoaded: (args: { veriMap: IVeriMapComponent }) => void;\r\n onMapUnloaded: (args: { veriMap: IVeriMapComponent }) => void;\r\n onMapIdle: (args: { veriMap: IVeriMapComponent }) => void;\r\n onMapBoundsChanged: (args: { veriMap: IVeriMapComponent }) => void;\r\n onShowPopup: (args: { position: google.maps.LatLng, model?: any }) => void;\r\n onGeofenceClicked: (args: { geofence: IGeofence }) => void;\r\n onToggleResource: (args: { show: boolean }) => void;\r\n onToggleIgnitionOff: (args: { show: boolean }) => void;\r\n\r\n userOptions: ICombinedPreferences;\r\n clusteringEnabled = true;\r\n\r\n //lastFitMapLatLngs: google.maps.LatLng[] = [];\r\n\r\n childComponents: IVeriMapChildComponent[] = [];\r\n\r\n mapOptions: google.maps.MapOptions;\r\n trafficLayer: google.maps.TrafficLayer;\r\n\r\n private currentMouseLatLng: google.maps.LatLng;\r\n private currentMouseEvent: Event;\r\n private debouncedMapMouseMove: (mouseEvent: google.maps.MouseEvent) => void;\r\n\r\n static $inject = [\"$q\", \"$element\", \"$timeout\", \"$transclude\", \"$scope\", \"sessionService\", \"mapService\", \"fullScreenService\", \"translationService\", \"$throttle\", \"accountFeatureService\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $element: JQuery,\r\n private readonly $timeout: angular.ITimeoutService,\r\n private readonly $transclude: angular.ITranscludeFunction,\r\n private readonly $scope: angular.IScope,\r\n private readonly sessionService: SessionService,\r\n private readonly mapService: MapService,\r\n private readonly fullScreenService: FullScreenService,\r\n private readonly translationService: TranslationService,\r\n private readonly $throttle: any,\r\n private readonly accountFeatureService: AccountFeatureService\r\n ) {\r\n\r\n this.initialiseMap();\r\n }\r\n\r\n $onInit() {\r\n if (!this.accountFeatureService.currentUserHasRole([UserRole.ManageGeofences])) {\r\n this.userDoesntHaveManageGeofencesPermission = true;\r\n }\r\n\r\n this.userOptions = this.sessionService.getItem(SettingsName.UserOptions);\r\n\r\n this.debouncedMapMouseMove = this.$throttle(event => { this.mapMouseMove(event); }, 25);\r\n }\r\n\r\n $onDestroy() {\r\n // Clear our event listeners for the map\r\n if (this.mapOptions && this.mapObject) {\r\n google.maps.event.clearInstanceListeners(this.mapObject);\r\n }\r\n\r\n if (this.onMapUnloaded) {\r\n this.onMapUnloaded({ veriMap: this });\r\n }\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n if (!this.mapInitialised) {\r\n\r\n this.mapInitialisedPromise.then(() => {\r\n this.$onChanges(onChangesObj);\r\n this.translateGoogleButtons();\r\n });\r\n\r\n return\r\n }\r\n\r\n if (onChangesObj[\"greyscale\"] && this.greyscale) {\r\n this.updateMapStyle();\r\n }\r\n\r\n if (onChangesObj[\"updateMapSize\"] && this.mapObject) {\r\n // This is in a timeout to allow the maps object to actually resize before we update the maps notion of its size\r\n this.$timeout(() => {\r\n this.mapService.updateMapSize(this.mapObject);\r\n });\r\n }\r\n\r\n if (onChangesObj[\"updateMapSizeAndFit\"] && this.mapObject) {\r\n // This is in a timeout to allow the maps object to actually resize before we update the maps notion of its size\r\n this.$timeout(() => {\r\n this.mapService.updateMapSize(this.mapObject);\r\n this.fitMapToAll();\r\n });\r\n }\r\n\r\n if (onChangesObj[\"mapOffset\"]) {\r\n //this.fitMapToLastPosition();\r\n //this.mapService.updateMapSize(this.mapOptions.gMapObject);\r\n }\r\n\r\n if (onChangesObj[\"mapCenter\"] && this.mapCenter) {\r\n\r\n if (this.mapCenter instanceof google.maps.LatLng) {\r\n this.mapObject.setCenter(this.mapCenter);\r\n }\r\n else if (this.mapCenter.latitude && this.mapCenter.longitude) {\r\n var latLng = new google.maps.LatLng(this.mapCenter.latitude, this.mapCenter.longitude);\r\n this.mapObject.setCenter(latLng);\r\n }\r\n }\r\n\r\n if (onChangesObj[\"mapZoom\"] && this.mapZoom) {\r\n //console.log(\"map zoom\", this.mapZoom);\r\n this.mapOptions.zoom = this.mapZoom;\r\n if (this.mapObject) {\r\n //console.log(\"yo\");\r\n this.mapObject.setZoom(this.mapZoom);\r\n }\r\n }\r\n }\r\n\r\n registerChildComponent(childComponent: IVeriMapChildComponent) {\r\n this.childComponents.push(childComponent);\r\n }\r\n\r\n editGeofenceClick(geofence: IGeofence) {\r\n this.$scope.$broadcast(BroadcastEvent.openGeofenceEditor, geofence);\r\n\r\n if (this.onEditGeofenceClick) {\r\n this.onEditGeofenceClick({ geofence });\r\n }\r\n }\r\n\r\n deregisterChildComponent(childComponent: IVeriMapChildComponent) {\r\n var index = this.childComponents.indexOf(childComponent);\r\n this.childComponents.splice(index, 1);\r\n }\r\n\r\n getMap(): google.maps.Map {\r\n return this.mapObject;\r\n }\r\n\r\n getMapOffsetCenter(): google.maps.LatLng {\r\n const gmap = this.getMap();\r\n\r\n if (!this.mapOffset) {\r\n return gmap.getCenter();\r\n }\r\n\r\n return this.mapService.offsetLatLng(gmap, gmap.getCenter(), this.mapOffset.x, this.mapOffset.y);\r\n }\r\n\r\n panMap(latLng: google.maps.LatLng) {\r\n this.mapService.setOffsetCenter(this.mapObject, latLng, this.mapOffset);\r\n }\r\n\r\n setCenter(latLng: google.maps.LatLng) {\r\n this.mapService.setCenter(this.mapObject, latLng, this.mapOffset);\r\n }\r\n\r\n smoothPanAndZoomTo(latLng: google.maps.LatLng, targetZoom: number): angular.IPromise {\r\n return this.mapService.smoothPanAndZoomTo(this.getMap(), latLng, targetZoom);\r\n }\r\n\r\n fitMap(latLngs: google.maps.LatLng[]) {\r\n if (!this.mapInitialised) {\r\n\r\n // If the map is not available then wait until it is\r\n this.mapInitialisedPromise\r\n .then(() => { this.fitMap(latLngs); })\r\n .catch(e => { console.error(\"mapReady error\", e); });\r\n\r\n return;\r\n }\r\n\r\n if (latLngs == null || latLngs.length == 0) {\r\n return;\r\n }\r\n\r\n this.mapService.setMapBoundsWithOffset(this.mapObject, latLngs, this.getMapOffset());\r\n\r\n }\r\n\r\n fitMapToAll() {\r\n if (!this.childComponents) {\r\n return;\r\n }\r\n\r\n var latLngs: google.maps.LatLng[] = [];\r\n this.childComponents.forEach(child => {\r\n if (!child.getLatLngsForFitMap) {\r\n return;\r\n }\r\n\r\n var childLatLngs = child.getLatLngsForFitMap();\r\n\r\n if (childLatLngs) {\r\n childLatLngs.forEach(latlng => {\r\n latLngs.push(latlng);\r\n });\r\n }\r\n });\r\n\r\n if (!latLngs.length) {\r\n return;\r\n }\r\n\r\n this.fitMap(latLngs);\r\n }\r\n\r\n toggleTrafficLayerVisibility() {\r\n if (this.trafficLayer) {\r\n this.trafficLayer.setMap(null);\r\n this.trafficLayer = null;\r\n return;\r\n }\r\n\r\n this.trafficLayer = new google.maps.TrafficLayer();\r\n this.trafficLayer.setMap(this.getMap());\r\n }\r\n\r\n toggleFullScreen() {\r\n this.fullScreenService.toggleAll();\r\n }\r\n\r\n showPopup(popupType: MapPopupType, position: google.maps.LatLng, model: any, hideControls?: boolean) {\r\n this.popupType = popupType;\r\n this.popupLatLng = position;\r\n this.popupModel = model;\r\n this.popupHideControls = hideControls;\r\n\r\n this.popupPosition = this.mapService.convertLatLngToPoint(position, this.getMap(), true);\r\n\r\n if (this.onShowPopup) {\r\n this.onShowPopup({ position: position, model: model });\r\n }\r\n\r\n this.$scope.$applyAsync(); \r\n }\r\n\r\n hidePopup(popupType: MapPopupType, immediate: boolean) {\r\n if (!this.popupLatLng || this.popupType !== popupType) {\r\n return;\r\n }\r\n\r\n if (immediate) {\r\n this.$scope.$broadcast(BroadcastEvent.hidePopup);\r\n }\r\n else {\r\n this.$scope.$digest();\r\n }\r\n\r\n this.popupLatLng = null;\r\n this.popupPosition = null;\r\n }\r\n\r\n setPopupPosition(position: google.maps.LatLng): void {\r\n this.popupLatLng = position;\r\n this.popupPosition = this.mapService.convertLatLngToPoint(position, this.getMap(), true);\r\n }\r\n\r\n geofenceClicked(geofence: IGeofence) {\r\n if (this.onGeofenceClicked) {\r\n this.onGeofenceClicked({ geofence: geofence });\r\n }\r\n }\r\n\r\n mapZoomTest() {\r\n this.mapService.smoothPanAndZoomTo(this.mapObject, new google.maps.LatLng(52.23637, -0.935009), 16);\r\n }\r\n\r\n changeResource() {\r\n this.showResource = !this.showResource;\r\n\r\n if (this.onToggleResource) {\r\n this.onToggleResource({ show: this.showResource });\r\n }\r\n }\r\n\r\n changeIgnitionOffToggle() {\r\n this.showIgnitionOff = !this.showIgnitionOff;\r\n\r\n if (this.onToggleIgnitionOff) {\r\n this.onToggleIgnitionOff({ show: this.showIgnitionOff });\r\n }\r\n }\r\n\r\n clearData(): void {\r\n this.getMap().data.forEach((feature) => {\r\n this.getMap().data.remove(feature);\r\n });\r\n }\r\n\r\n // -----------------------------------------\r\n\r\n private initialiseMap() {\r\n\r\n // This looks complicated, but it allows child components to wait on this promise before everything is setup\r\n var mapDefer = this.$q.defer();\r\n this.mapInitialisedPromise = mapDefer.promise;\r\n\r\n this.mapService.getMapAPIReadyPromise().then(() => {\r\n\r\n var container = this.$element.children(\".google-map-container\").first() as JQLite;\r\n\r\n this.setMapOptions();\r\n\r\n this.mapService.createMap(container[0], this.mapOptions).then(map => {\r\n this.mapObject = map;\r\n\r\n this.onMapInitialised(map);\r\n\r\n mapDefer.resolve(map);\r\n });\r\n });\r\n }\r\n\r\n private setMapOptions() {\r\n this.mapOptions = {\r\n center: new google.maps.LatLng(51.397, 0.644),\r\n zoom: 12,\r\n controlSize: 24,\r\n mapTypeId: google.maps.MapTypeId.ROADMAP,\r\n scaleControl: true,\r\n streetViewControl: true,\r\n fullscreenControl: false,\r\n streetViewControlOptions: { position: google.maps.ControlPosition.LEFT_TOP },\r\n scaleControlOptions: {},\r\n zoomControlOptions: { position: google.maps.ControlPosition.LEFT_TOP },\r\n mapTypeControlOptions: { position: google.maps.ControlPosition.TOP_LEFT }\r\n //styles: this.greyMapStyle\r\n };\r\n\r\n if (this.disableDefaultUi) {\r\n this.mapOptions.disableDefaultUI = true;\r\n this.mapOptions.fullscreenControl = false;\r\n this.mapOptions.mapTypeControl = false;\r\n this.mapOptions.panControl = false;\r\n this.mapOptions.rotateControl = false;\r\n this.mapOptions.scaleControl = false;\r\n this.mapOptions.streetViewControl = false;\r\n this.mapOptions.zoomControl = false;\r\n }\r\n\r\n this.updateMapStyle();\r\n\r\n if (this.showControlsOnRight) {\r\n this.mapOptions.mapTypeControlOptions.position = google.maps.ControlPosition.TOP_RIGHT;\r\n\r\n this.mapOptions.zoomControlOptions.position = google.maps.ControlPosition.RIGHT_TOP;\r\n this.mapOptions.streetViewControlOptions.position = google.maps.ControlPosition.RIGHT_TOP;\r\n }\r\n }\r\n\r\n private translateGoogleButtons() {\r\n this.mapObject.mapTypes[\"roadmap\"].name = this.translationService.t('veriMap.MapLabel');\r\n this.mapObject.mapTypes[\"satellite\"].name = this.translationService.t('veriMap.SatelliteLabel');\r\n this.mapObject.mapTypes[\"terrain\"].name = this.translationService.t('veriMap.TerrainLabel');\r\n this.mapObject.setOptions({ 'mapTypeControl': true });\r\n\r\n }\r\n\r\n private updateMapStyle() {\r\n this.mapOptions.styles = [];\r\n const currentMapType = this.mapObject?.getMapTypeId();\r\n\r\n if (this.greyscale && currentMapType != \"satellite\" && currentMapType != \"hybrid\") {\r\n this.mapOptions.styles = this.greyMapStyle;\r\n }\r\n\r\n if (this.mapObject) {\r\n this.mapObject.setOptions({\r\n styles: this.mapOptions.styles\r\n });\r\n }\r\n }\r\n\r\n private getMapOffset() {\r\n\r\n let offset = new google.maps.Point(0, 0);\r\n\r\n // CJE removed 7.6.21 - Unsure if this is needed anymore?\r\n //if (!this.disableDefaultUi) {\r\n // offset.y = -60;\r\n //}\r\n\r\n if (this.mapOffset) {\r\n offset.x = this.mapOffset.x || offset.x;\r\n offset.y = this.mapOffset.y || offset.y;\r\n }\r\n\r\n return offset;\r\n }\r\n\r\n private mapMouseMove(mouseEvent: google.maps.MouseEvent) {\r\n var stopPropogation = false;\r\n\r\n var keys = Object.keys(mouseEvent);\r\n for (var i = 0; i < keys.length; i++) {\r\n if (MouseEvent.prototype.isPrototypeOf(mouseEvent[keys[i]])) {\r\n this.currentMouseEvent = mouseEvent[keys[i]];\r\n }\r\n }\r\n\r\n this.currentMouseLatLng = mouseEvent.latLng;\r\n\r\n this.childComponents.forEach(child => {\r\n if (child.onMouseMove && !stopPropogation) {\r\n stopPropogation = child.onMouseMove(this.currentMouseLatLng, this.currentMouseEvent);\r\n }\r\n });\r\n }\r\n\r\n private onMapInitialised(map: google.maps.Map) {\r\n this.mapInitialised = true;\r\n\r\n if (this.onMapLoaded) {\r\n this.onMapLoaded({ veriMap: this });\r\n\r\n this.childComponents.forEach(child => {\r\n if (child.onMapLoad) {\r\n child.onMapLoad();\r\n }\r\n });\r\n }\r\n\r\n map.addListener(\"idle\", () => {\r\n if (this.onMapIdle) {\r\n this.onMapIdle({ veriMap: this });\r\n }\r\n\r\n this.childComponents.forEach(child => {\r\n if (child.onMapIdle) {\r\n child.onMapIdle();\r\n }\r\n })\r\n });\r\n\r\n // Perhaps need to rename \"onMapBoundsChanged\" later\r\n map.addListener(\"dragstart\", () => {\r\n if (this.onMapBoundsChanged) {\r\n this.onMapBoundsChanged({ veriMap: this });\r\n }\r\n });\r\n\r\n map.addListener(\"click\", () => {\r\n this.hidePopup(MapPopupType.Geofence, true);\r\n this.hidePopup(MapPopupType.Vehicle, true);\r\n this.hidePopup(MapPopupType.Custom, true);\r\n });\r\n\r\n map.addListener(\"mousemove\", (mouseEvent: google.maps.MouseEvent) => {\r\n\r\n this.debouncedMapMouseMove(mouseEvent);\r\n });\r\n\r\n map.addListener(\"bounds_changed\", (mouseEvent: google.maps.MouseEvent) => {\r\n if (this.popupType) {\r\n this.hidePopup(this.popupType, true);\r\n }\r\n });\r\n\r\n map.addListener(\"maptypeid_changed\", (mouseEvent: google.maps.MouseEvent) => {\r\n if (this.mapOptions.mapTypeId != this.mapObject.getMapTypeId()) {\r\n this.mapOptions.mapTypeId = this.mapObject.getMapTypeId();\r\n this.updateMapStyle();\r\n }\r\n });\r\n\r\n map.addListener(\"rightclick\", (event: google.maps.MouseEvent) => {\r\n if (this.$transclude.isSlotFilled(\"rightClickPopup\")) {\r\n this.showPopup(MapPopupType.RightClick, event.latLng, null);\r\n\r\n this.$scope.$digest();\r\n }\r\n });\r\n\r\n this.mapService.enablePOI(map);\r\n\r\n // Needs to be done here when google has been loaded\r\n //this.mapOptions.streetViewControlOptions.position = google.maps.ControlPosition.LEFT_TOP;\r\n //this.mapOptions.zoomControlOptions.position = google.maps.ControlPosition.LEFT_TOP;\r\n }\r\n\r\n // https://snazzymaps.com/editor/customize/132\r\n greyMapStyle: google.maps.MapTypeStyle[] = [\r\n { \"featureType\": \"administrative\", \"elementType\": \"geometry\", \"stylers\": [{ \"color\": \"#a7a7a7\" }] },\r\n { \"featureType\": \"administrative\", \"elementType\": \"labels.text.fill\", \"stylers\": [{ \"visibility\": \"on\" }, { \"color\": \"#737373\" }] },\r\n { \"featureType\": \"landscape\", \"elementType\": \"geometry.fill\", \"stylers\": [{ \"visibility\": \"on\" }, { \"color\": \"#efefef\" }] },\r\n { \"featureType\": \"poi\", \"elementType\": \"geometry.fill\", \"stylers\": [{ \"visibility\": \"on\" }, { \"color\": \"#dadada\" }] },\r\n { \"featureType\": \"poi\", \"elementType\": \"labels\", \"stylers\": [{ \"visibility\": \"off\" }] },\r\n { \"featureType\": \"poi\", \"elementType\": \"labels.icon\", \"stylers\": [{ \"visibility\": \"off\" }] },\r\n { \"featureType\": \"road\", \"elementType\": \"labels.text.fill\", \"stylers\": [{ \"color\": \"#696969\" }, { \"visibility\": \"on\" }] },\r\n { \"featureType\": \"road\", \"elementType\": \"labels.icon\", \"stylers\": [{ \"visibility\": \"off\" }] },\r\n { \"featureType\": \"road.highway\", \"elementType\": \"geometry.fill\", \"stylers\": [{ \"color\": \"#ffffff\" }, { \"visibility\": \"on\" }] },\r\n { \"featureType\": \"road.highway\", \"elementType\": \"geometry.stroke\", \"stylers\": [{ \"visibility\": \"on\" }, { \"color\": \"#b3b3b3\" }] },\r\n { \"featureType\": \"road.highway\", \"elementType\": \"labels.text.fill\", \"stylers\": [{ \"invert_lightness\": true }] },\r\n { \"featureType\": \"road.highway\", \"elementType\": \"labels.text.stroke\", \"stylers\": [{ \"invert_lightness\": true }, { \"visibility\": \"off\" }, { \"saturation\": -100 }] },\r\n { \"featureType\": \"road.highway.controlled_access\", \"elementType\": \"labels.icon\", \"stylers\": [{ \"visibility\": \"on\" }, { \"saturation\": -100 }] },\r\n { \"featureType\": \"road.arterial\", \"elementType\": \"geometry.fill\", \"stylers\": [{ \"color\": \"#ffffff\" }] },\r\n { \"featureType\": \"road.arterial\", \"elementType\": \"geometry.stroke\", \"stylers\": [{ \"color\": \"#d6d6d6\" }] },\r\n { \"featureType\": \"road.arterial\", \"elementType\": \"labels.text.fill\", \"stylers\": [{ \"visibility\": \"on\" }, { \"hue\": \"#ff0000\" }] },\r\n { \"featureType\": \"road.local\", \"elementType\": \"geometry.fill\", \"stylers\": [{ \"visibility\": \"on\" }, { \"color\": \"#ffffff\" }, { \"weight\": 1.8 }] },\r\n { \"featureType\": \"road.local\", \"elementType\": \"geometry.stroke\", \"stylers\": [{ \"color\": \"#d7d7d7\" }] },\r\n { \"featureType\": \"transit\", \"elementType\": \"all\", \"stylers\": [{ \"color\": \"#808080\" }, { \"visibility\": \"off\" }] },\r\n { \"featureType\": \"water\", \"elementType\": \"geometry.fill\", \"stylers\": [{ \"color\": \"#d3d3d3\" }] }\r\n ];\r\n}\r\n\r\nexport class VeriMapComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n transclude: { [slot: string]: string };\r\n\r\n constructor() {\r\n this.bindings = {\r\n mapCenter: \"<\",\r\n mapZoom: \"<\",\r\n mapOffset: \"<\",\r\n updateMapSize: \"<\",\r\n updateMapSizeAndFit: \"<\",\r\n\r\n showFullScreen: \"@\",\r\n showSearch: \"<\",\r\n includeVehicleSearch: \"<\",\r\n hideGeofences: \"<\",\r\n hideFitMap: \"<\",\r\n greyscale: \"@\",\r\n disablePopup: \" {\r\n const geofencePromise = this.geofenceService.getGeofences();\r\n const routeTemplatePromise = this\r\n .$http({\r\n url: \"/api/tms/routetemplates\",\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 30, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n var templateList: IRouteTemplate[] = [];\r\n\r\n var templateIndexVersionCount: { templateIndex: number, currentVersion: number }[] = [];\r\n\r\n response.data.forEach(template => {\r\n var found = false;\r\n\r\n templateIndexVersionCount.forEach(version => {\r\n if (version.templateIndex === template.AccountTemplateIndex) {\r\n template.version = version.currentVersion;\r\n version.currentVersion++;\r\n found = true;\r\n }\r\n });\r\n\r\n if (!found) {\r\n const version = { templateIndex: template.AccountTemplateIndex, currentVersion: 1 };\r\n template.version = version.currentVersion;\r\n templateIndexVersionCount.push(version);\r\n }\r\n });\r\n\r\n // Hide deleted templates\r\n if (hideDeleteTemplates) {\r\n response.data.forEach(template => {\r\n if (!template.Deleted) {\r\n templateList.push(template);\r\n }\r\n });\r\n } else {\r\n templateList = response.data;\r\n }\r\n\r\n return templateList;\r\n });\r\n\r\n return this\r\n .$q\r\n .all([routeTemplatePromise, geofencePromise])\r\n .then(([routeTemplates, geofences]) => {\r\n routeTemplates.forEach(template => {\r\n this.formatTemplateForFrontEnd(template, geofences);\r\n });\r\n\r\n return routeTemplates;\r\n });\r\n }\r\n\r\n getRouteTemplate(templateId: number) {\r\n const geofencePromise = this.geofenceService.getGeofences();\r\n const routeTemplatePromise = this\r\n .$http({\r\n url: `/api/tms/routetemplates/${templateId}`,\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 30 }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n\r\n return this\r\n .$q\r\n .all([routeTemplatePromise, geofencePromise])\r\n .then(([template, geofences]) => {\r\n this.formatTemplateForFrontEnd(template, geofences);\r\n\r\n template.RouteStops.sort((a, b) => {\r\n return a.RouteVisitPosition > b.RouteVisitPosition ? 1 : -1;\r\n });\r\n\r\n return template;\r\n });\r\n }\r\n\r\n convertRouteTemplatesToAutoCompleteMatches(routes: IRouteTemplate[]): IAutocompleteMatch[] {\r\n var matches: IAutocompleteMatch[] = [];\r\n\r\n if (routes.length > 0) {\r\n routes.forEach(route => {\r\n matches.push({\r\n label: `#${route.AccountTemplateIndex} ${route.Name}`,\r\n objectId: route.Id,\r\n object: route,\r\n icon: \"navigation\",\r\n });\r\n });\r\n }\r\n\r\n return matches;\r\n }\r\n\r\n convertTimeSpanToMins(timespan: string): number {\r\n\r\n const a = timespan.split(\":\"); // split it at the colons\r\n\r\n // minutes are worth 60 seconds. Hours are worth 60 minutes.\r\n const seconds = ((+a[0]) * 60 * 60) + ((+a[1]) * 60) + (+a[2]);\r\n\r\n return Math.round(seconds / 60);\r\n }\r\n\r\n convertMinsToTimeSpan(totalMins: number): string {\r\n const hours = Math.floor(totalMins / 60);\r\n\r\n totalMins %= 60;\r\n const minutes = Math.round(totalMins);\r\n //const seconds = totalMins % 60;\r\n\r\n return `${hours}:${minutes}`;//:${seconds}\r\n }\r\n\r\n createDisplayLabel(stop: IRouteStop) {\r\n stop.displayLabel = \"Unknown\";\r\n\r\n if (stop.GeocodedAddress) {\r\n stop.displayLabel = stop.GeocodedAddress.FormattedAddress;\r\n }\r\n else if (stop.Geofence) {\r\n stop.displayLabel = stop.Geofence.Description;\r\n }\r\n }\r\n\r\n saveRouteTemplate(routeTemplate: IRouteTemplate): angular.IPromise {\r\n // Sanity checks\r\n\r\n let fail = false;\r\n\r\n if (!routeTemplate.RouteStops.length) {\r\n console.warn(\"No route visits\");\r\n fail = true;\r\n }\r\n\r\n routeTemplate.RouteStops.forEach((stop, i) => {\r\n\r\n if (!stop.onSiteTimeMins) {\r\n console.warn(\"No on site time\", stop);\r\n fail = true;\r\n }\r\n\r\n if (i > 0 && !stop.TravelDistanceMetres || i > 0 && !stop.travelTimeMins) {\r\n console.warn(\"No travel time\", stop);\r\n fail = true;\r\n }\r\n\r\n stop.OnSiteTime = this.convertMinsToTimeSpan(stop.onSiteTimeMins);\r\n stop.TravelTime = this.convertMinsToTimeSpan(stop.travelTimeMins);\r\n\r\n stop.OnSiteTimeBuffer = this.convertMinsToTimeSpan(stop.onSiteTimeBufferMins);\r\n stop.TravelTimeBuffer = this.convertMinsToTimeSpan(stop.travelTimeBufferMins);\r\n });\r\n\r\n if (fail) {\r\n console.error(\"Rejecting route\", routeTemplate);\r\n return this.$q.reject();\r\n }\r\n\r\n return this.$http({\r\n url: \"/api/tms/routetemplate\",\r\n method: \"POST\",\r\n data: routeTemplate\r\n }).then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n deleteRouteTemplate(routeTemplate: IRouteTemplate) {\r\n return this.$http({\r\n url: `/api/tms/routetemplate/${routeTemplate.Id}`,\r\n method: \"DELETE\",\r\n //data: routeTemplate\r\n });\r\n }\r\n\r\n createRouteMarker(routeStop: IRouteStop, index: number, max: number): IGoogleMapsMarker {\r\n const startPosition = routeStop.LinePoints[0];\r\n\r\n const options = this.createRouteMarkerOptions(routeStop, index, max);\r\n options.position = { lat: startPosition[0], lng: startPosition[1] };\r\n\r\n return {\r\n id: index,\r\n options: options,\r\n };\r\n }\r\n\r\n createRouteMarkerOptions(routeStop: IRouteStop, index: number, max: number): IGoogleMapsMarkerOptions {\r\n\r\n let icon = \"---\";\r\n\r\n let markerType = \"marker-event-pause\";\r\n //let label = `Waypoint ${index}`;\r\n let label = routeStop.displayLabel;\r\n\r\n if (index === 0) {\r\n icon = \"play_arrow\";\r\n label = `Start: ${label}`;\r\n markerType = \"marker-event-start\";\r\n }\r\n else if (index === max - 1) {\r\n icon = \"stop\"; //flag\r\n label = `End: ${label}`;\r\n markerType = \"marker-event-end\";\r\n }\r\n\r\n const options = this.googleMarkerService.createEventMarkerOptions({ label: label, markerClass: markerType, subIcon: icon, showLabel: true });\r\n\r\n // Bit hacky\r\n if (icon === \"---\") {\r\n options.labelContent = options.labelContent.replace(`${icon}`, `${index}`);\r\n }\r\n\r\n options.visible = true;\r\n options.draggable = true;\r\n\r\n return options;\r\n }\r\n\r\n addPlannedRoute(plannedRoute: IPlannedRoute): angular.IPromise {\r\n return this\r\n .$http({\r\n url: \"/api/tms/plannedroute\",\r\n method: \"POST\",\r\n data: plannedRoute\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n cancelPlannedRoute(plannedRoute: IPlannedRoute): angular.IPromise<{}> {\r\n plannedRoute.vehicle = null;\r\n plannedRoute.driver = null;\r\n\r\n return this.$http({\r\n url: `/api/tms/plannedroute/cancel`,\r\n method: \"POST\",\r\n data: plannedRoute\r\n });\r\n }\r\n\r\n getTMSJobs(start: moment.Moment, end: moment.Moment, includeMappings = false, invalidateCache = false): angular.IPromise {\r\n\r\n const tmsJobsPromise = this\r\n .$http({\r\n url: `/api/tms/jobs?start=${start.toISOString()}&end=${end.toISOString()}`,\r\n method: \"GET\",\r\n params: { minsToLive: 30, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n\r\n if (!includeMappings) {\r\n return tmsJobsPromise;\r\n }\r\n\r\n const vehiclesPromise = this.vehicleService.getVehicles({ includePeripheralMappings: true });\r\n const driversPromise = this.driverService.getDrivers();\r\n const geofencePromise = this.geofenceService.getGeofences();\r\n\r\n return this.$q\r\n .all([tmsJobsPromise, vehiclesPromise, driversPromise, geofencePromise])\r\n .then(([tmsJobs, vehicles, drivers, geofences]) => {\r\n tmsJobs.forEach(job => {\r\n job.driver = this.driverService.findDriver(drivers, job.DriverId);\r\n job.vehicle = this.vehicleService.findVehicle(vehicles, job.VehicleId);\r\n job.geofence = this.geofenceService.findGeofence(geofences, job.GeofenceId);\r\n\r\n job.displayStatus = this.getTMSJobLabelStatus(job.PlanningStatus);\r\n\r\n if (job.SignatureFileGuid) {\r\n job.signatureUrl = this.getMediaURL(job.SignatureFileGuid);\r\n }\r\n\r\n if (job.PhotoFileGuid) {\r\n job.photoUrl = this.getMediaURL(job.PhotoFileGuid);\r\n }\r\n });\r\n\r\n return tmsJobs;\r\n });\r\n }\r\n\r\n getMediaURL(guid: string): string {\r\n return `${this.apiUrl}/api/tms/jobs/media/${guid}`;\r\n }\r\n\r\n mapRoutesToJobs(routes: IPlannedRoute[], jobs: ITMSJob[]) {\r\n jobs.forEach(job => {\r\n job.plannedRoute = routes.find(r => r.Id == job.PlannedRouteId);\r\n\r\n if (job.plannedRoute) {\r\n // Prevent circular json reference\r\n job.plannedRoute.vehicle = null;\r\n job.plannedRoute.driver = null;\r\n\r\n job.plannedRouteStop = job.plannedRoute.PlannedVisits ? job.plannedRoute.PlannedVisits.find(s => s.Id == job.PlannedRouteStopId) : null;\r\n }\r\n });\r\n }\r\n\r\n getTMSJobLabelStatus(jobStatus: TMSJobPlanningStatus): string {\r\n if (jobStatus == TMSJobPlanningStatus.Imported) {\r\n return \"Failed to plan\";\r\n }\r\n\r\n if (jobStatus == TMSJobPlanningStatus.Planned) {\r\n return \"Pending\";\r\n }\r\n\r\n return TMSJobPlanningStatus[jobStatus];\r\n }\r\n\r\n getPlannedRoutes(start: moment.Moment, end: moment.Moment, mapLinkedElements = false, invalidateCache = false): angular.IPromise {\r\n // For now invalidate every call\r\n invalidateCache = true;\r\n\r\n let plannedRoutePromise = this\r\n .$http({\r\n url: `/api/tms/plannedroutes?start=${start.toISOString()}&end=${end.toISOString()}`,\r\n method: \"GET\",\r\n params: { minsToLive: 30, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n\r\n if (!mapLinkedElements) {\r\n return plannedRoutePromise\r\n }\r\n\r\n return this.getLinkedElementsForPlannedRoutes(plannedRoutePromise).then(plannedRoutes => {\r\n return this.filterOutCancelledPlannedRoutes(plannedRoutes);\r\n });\r\n }\r\n\r\n getPlannedRoute(routeId: number, invalidateCache = false): angular.IPromise {\r\n let plannedRoutePromise = this\r\n .$http({\r\n url: `/api/tms/plannedroutes/${routeId}`,\r\n method: \"GET\",\r\n params: { minsToLive: 30, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n this.convertPlannedRouteIntoFrontEndRoute(response.data);\r\n return response.data;\r\n });\r\n\r\n plannedRoutePromise = this.getLinkedElementsForPlannedRoute(plannedRoutePromise);\r\n\r\n return plannedRoutePromise;\r\n }\r\n\r\n getPlannedRouteByExternalReference(externalReference: string): angular.IPromise {\r\n let plannedRoutePromise = this\r\n .$http({\r\n url: `/api/tms/plannedroutes/ref/${externalReference}`,\r\n method: \"GET\",\r\n params: { minsToLive: 30 }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n\r\n if (response.data) {\r\n this.convertPlannedRouteIntoFrontEndRoute(response.data);\r\n }\r\n\r\n return response.data;\r\n });\r\n\r\n plannedRoutePromise = this.getLinkedElementsForPlannedRoute(plannedRoutePromise);\r\n\r\n return plannedRoutePromise;\r\n }\r\n\r\n getPlannedRoutesForTemplate(start: moment.Moment, end: moment.Moment, templateId: number) {\r\n let plannedRoutePromise: angular.IPromise = this\r\n .$http({\r\n url: `/api/tms/plannedroutes/templates/${templateId}?start=${start.toISOString()}&end=${end.toISOString()}`,\r\n method: \"GET\",\r\n params: { minsToLive: 30 }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n\r\n return this.getLinkedElementsForPlannedRoutes(plannedRoutePromise).then(plannedRoutes => {\r\n return this.filterOutCancelledPlannedRoutes(plannedRoutes);\r\n });\r\n }\r\n\r\n filterOutNoneActiveRoutes(plannedRoutes: IPlannedRoute[]) {\r\n var activePlannedRoutes: IPlannedRoute[] = [];\r\n\r\n plannedRoutes.forEach(route => {\r\n if ((route.Status === PlannedRouteStatus.Planned || route.Status === PlannedRouteStatus.Started)) {\r\n activePlannedRoutes.push(route);\r\n }\r\n });\r\n\r\n return activePlannedRoutes;\r\n }\r\n\r\n createOrEditRouteSchedule(plannedRoute: IPlannedRoute, date: Date, $event: MouseEvent) {\r\n const controller = ($mdDialog) => {\r\n return {\r\n hide: () => { $mdDialog.hide(false); },\r\n route: plannedRoute,\r\n date: date\r\n }\r\n };\r\n\r\n controller.$inject = [\"$mdDialog\"];\r\n\r\n const dialogOptions: angular.material.IDialogOptions = {\r\n targetEvent: $event,\r\n escapeToClose: true,\r\n clickOutsideToClose: true,\r\n template: require(\"./tmsWeeklyPlanner/tmsPlanRoute.dialog.html\"), // Use scope\r\n controller: controller,\r\n controllerAs: \"$ctrl\"\r\n };\r\n\r\n return this.$mdDialog.show(dialogOptions);\r\n }\r\n\r\n replayRouteById(plannedRouteId: number, updateDatabase: boolean): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/tmsreplay/`,\r\n method: \"POST\",\r\n params: { updateDatabase: updateDatabase },\r\n data: plannedRouteId\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n\r\n var replay = response.data;\r\n\r\n this.formatPlannedRouteForFrontEnd(replay.Route);\r\n\r\n replay.Audits.forEach((log) => { this.formatRouteAuditLog(log, replay.Route) });\r\n\r\n return response.data;\r\n });\r\n }\r\n\r\n\r\n replayRoute(plannedRoute: IPlannedRoute, updateDatabase: boolean): angular.IPromise {\r\n return this.replayRouteById(plannedRoute.Id, updateDatabase);\r\n }\r\n\r\n private formatRouteAuditLog(auditLog: IPlannedRouteAudit, route: IPlannedRoute) {\r\n auditLog.RouteStatusString = PlannedRouteStatus[auditLog.RouteStatus];\r\n this.applyIsVisitAuditProperty(auditLog);\r\n\r\n let lastVisit: IPlannedRouteVisit;\r\n let currentVisit: IPlannedRouteVisit;\r\n let nextVisit: IPlannedRouteVisit;\r\n\r\n for (let i = 0; i < route.PlannedVisits.length; i++) {\r\n const visit = route.PlannedVisits[i];\r\n console.log(auditLog);\r\n console.log(visit);\r\n if (auditLog.PlannedVisitId && auditLog.PlannedVisitId == visit.Id) {\r\n if (auditLog.RouteVisitStatus === RouteVisitStatus.Planned) {\r\n lastVisit = route.PlannedVisits[i - 1];\r\n nextVisit = visit;\r\n \r\n }\r\n\r\n if (auditLog.RouteVisitStatus === RouteVisitStatus.Arrived) {\r\n lastVisit = route.PlannedVisits[i - 1];\r\n currentVisit = visit;\r\n nextVisit = route.PlannedVisits[i + 1]\r\n }\r\n\r\n if (auditLog.RouteVisitStatus === RouteVisitStatus.Departed) {\r\n lastVisit = visit;\r\n nextVisit = route.PlannedVisits[i + 1];\r\n }\r\n }\r\n \r\n this.createDisplayLabel(visit);\r\n this.setStopStatusLabel(visit);\r\n }\r\n\r\n auditLog.LastStop = lastVisit;\r\n auditLog.CurrentStop = currentVisit;\r\n auditLog.NextStop = nextVisit;\r\n }\r\n\r\n private applyIsVisitAuditProperty(auditLog: IPlannedRouteAudit) {\r\n auditLog.isVisitAudit = auditLog.PlannedVisitId ? false : true;\r\n }\r\n\r\n private filterOutCancelledPlannedRoutes(plannedRoutes: IPlannedRoute[]) {\r\n var activePlannedRoutes: IPlannedRoute[] = [];\r\n\r\n plannedRoutes.forEach(route => {\r\n if (route.Status !== PlannedRouteStatus.Cancelled) {\r\n activePlannedRoutes.push(route);\r\n }\r\n });\r\n\r\n this.convertPlannedRoutesIntoFrontEndRoute(activePlannedRoutes);\r\n\r\n // Match up tings\r\n return activePlannedRoutes;\r\n }\r\n\r\n private getLinkedElementsForPlannedRoutes(plannedRoutePromise: angular.IPromise): angular.IPromise {\r\n const assignmentsPromise = this.driverAssignmentService.getDriverAssignments(true);\r\n const driversPromise = this.driverService.getDrivers();\r\n const vehiclesPromise = this.vehicleService.getVehicles({ includePeripheralMappings: true });\r\n const geofencesPromise = this.geofenceService.getGeofences();\r\n\r\n return this.$q\r\n .all([plannedRoutePromise, assignmentsPromise, driversPromise, vehiclesPromise, geofencesPromise])\r\n .then(([plannedRoutes, assignments, drivers, vehicles, geofences]) => {\r\n\r\n\r\n this.driverAssignmentService.mapDriversToVehicles(drivers, assignments, vehicles);\r\n\r\n this.mapLinkedElementsToPlannedRoutes(plannedRoutes, assignments, drivers, vehicles, geofences);\r\n\r\n plannedRoutes.forEach(route => {\r\n this.formatPlannedRouteForFrontEnd(route);\r\n });\r\n\r\n return plannedRoutes;\r\n });\r\n }\r\n\r\n private getLinkedElementsForPlannedRoute(plannedRoutePromise: angular.IPromise): angular.IPromise {\r\n const assignmentsPromise = this.driverAssignmentService.getDriverAssignments(true);\r\n const driversPromise = this.driverService.getDrivers();\r\n const vehiclesPromise = this.driverAssignmentService.getVehiclesWithDrivers({ includePeripheralMappings: true });\r\n const geofencesPromise = this.geofenceService.getGeofences();\r\n\r\n return this.$q\r\n .all([plannedRoutePromise, assignmentsPromise, driversPromise, vehiclesPromise, geofencesPromise])\r\n .then(([route, assignments, drivers, vehicles, geofences]) => {\r\n\r\n if (!route) {\r\n return null;\r\n }\r\n\r\n this.mapVehicleToRoute(route, vehicles);\r\n this.mapDriverToRoute(route, drivers);\r\n this.mapGeofencesToRouteStops(route, geofences);\r\n this.formatPlannedRouteForFrontEnd(route);\r\n\r\n return route;\r\n });\r\n }\r\n\r\n addPlannedRouteNotes(route: IPlannedRoute, note: IPlannedRouteNotes) {\r\n return this\r\n .$http({\r\n url: `/api/tms/plannedroutes/${route.Id}/notes`,\r\n method: \"POST\",\r\n data: note,\r\n cache: true,\r\n })\r\n .then(userResponse => {\r\n return userResponse.data;\r\n });\r\n }\r\n\r\n getPlannedRouteNotes(route: IPlannedRoute): angular.IPromise {\r\n const plannedRouteNotesPromise = this\r\n .$http({\r\n url: `/api/tms/plannedroutes/${route.Id}/notes`,\r\n method: \"GET\"\r\n //params: { minsToLive: 30, invalidateCache: invalidateCache }\r\n })\r\n .then((userResponse: angular.IHttpPromiseCallbackArg) => {\r\n return userResponse.data;\r\n });\r\n\r\n const usersPromise = this.usersService.getUsers({ includeAdmins: true });\r\n\r\n return this.$q\r\n .all([plannedRouteNotesPromise, usersPromise])\r\n .then(([notes, users]) => {\r\n this.mapUsersToNotes(notes, users);\r\n\r\n return notes;\r\n });\r\n }\r\n\r\n plannedRouteToRouteTemplate(plannedRoute: IPlannedRoute): IRouteTemplate {\r\n\r\n const template: IRouteTemplate = {\r\n Name: plannedRoute.Name,\r\n RouteStops: this.plannedRouteStopsToRouteStops(plannedRoute.PlannedVisits),\r\n totalDistanceKm: 0,\r\n totalDurationMins: 0,\r\n totalOnSiteTimeMins: 0,\r\n totalTravelTimeMins: 0\r\n };\r\n\r\n template.RouteStops.forEach(stop => {\r\n this.updateTemplateDurationAndDistance(template, stop);\r\n });\r\n\r\n return template;\r\n }\r\n\r\n plannedRouteStopsToRouteStops(plannedRouteStops: IPlannedRouteVisit[]): IRouteStop[] {\r\n var routeStops: IRouteStop[] = [];\r\n\r\n plannedRouteStops.forEach(plannedRouteStop => {\r\n routeStops.push({\r\n RouteVisitPosition: plannedRouteStop.RouteVisitPosition,\r\n GeofenceId: plannedRouteStop.GeofenceId,\r\n Geofence: plannedRouteStop.Geofence,\r\n TravelTime: plannedRouteStop.TravelTime,\r\n OnSiteTime: plannedRouteStop.OnSiteTime,\r\n TravelTimeBuffer: plannedRouteStop.TravelTimeBuffer,\r\n OnSiteTimeBuffer: plannedRouteStop.OnSiteTimeBuffer,\r\n TravelDistanceMetres: plannedRouteStop.TravelDistanceMetres,\r\n LinePoints: plannedRouteStop.LinePoints,\r\n displayLabel: plannedRouteStop.displayLabel,\r\n Id: plannedRouteStop.Id,\r\n disableEdit: plannedRouteStop.Status !== RouteVisitStatus.Planned\r\n });\r\n });\r\n\r\n return routeStops;\r\n }\r\n\r\n syncPlannedRouteStopsToRouteStops(plannedRouteStops: IPlannedRouteVisit[], routeStops: IRouteStop[]) {\r\n plannedRouteStops.forEach(plannedRouteStop => {\r\n routeStops.forEach(routeStop => {\r\n if (routeStop.RouteVisitPosition === plannedRouteStop.RouteVisitPosition) {\r\n routeStop.disableEdit = plannedRouteStop.Status !== RouteVisitStatus.Planned;\r\n }\r\n });\r\n });\r\n }\r\n\r\n // apologies for naming :D\r\n convertPlannedRoutesIntoFrontEndRoute(routes: IPlannedRoute[]) {\r\n routes.forEach(route => {\r\n this.convertPlannedRouteIntoFrontEndRoute(route);\r\n });\r\n }\r\n\r\n convertPlannedRouteIntoFrontEndRoute(route: IPlannedRoute) {\r\n route.routeStartTime = this.veriDate.createMoment(route.PlannedStartTime);\r\n this.setPlannedRouteEditable(route);\r\n\r\n // Notes\r\n route.PlannedRouteNotes = route.PlannedRouteNotes || [];\r\n\r\n route.PlannedRouteNotes.forEach(note => {\r\n note.utcMoment = moment(note.Utc);\r\n });\r\n\r\n this.updateRouteStops(route);\r\n\r\n route.firstStop = route.PlannedVisits[0];\r\n route.lastStop = route.PlannedVisits[route.PlannedVisits.length - 1];\r\n route.timeTillStartMins = moment.duration(route.routeStartTime.diff(moment())).asMinutes();\r\n\r\n this.setRouteDisplayStatus(route);\r\n\r\n route.tagIds = [];\r\n if (route.vehicle && route.vehicle.TagIds) {\r\n route.tagIds = route.tagIds.concat(route.vehicle.TagIds);\r\n }\r\n if (route.driver && route.driver.TagIds) {\r\n route.tagIds = route.tagIds.concat(route.driver.TagIds);\r\n }\r\n }\r\n\r\n setPlannedRouteEditable(route: IPlannedRoute) {\r\n if (route.Status === PlannedRouteStatus.Started || route.Status === PlannedRouteStatus.Planned) {\r\n route.editingDisabledReason = RouteEditingDisabledReason.Start;\r\n route.editingDisabled = false;\r\n }\r\n\r\n if (route.Status === PlannedRouteStatus.Completed || route.Status === PlannedRouteStatus.CompletedWithMissing || route.Status === PlannedRouteStatus.Expired || route.Status === PlannedRouteStatus.Cancelled || route.Status === PlannedRouteStatus.Incomplete) {\r\n route.editingDisabledReason = RouteEditingDisabledReason.Status;\r\n route.editingDisabled = true;\r\n }\r\n }\r\n\r\n filterPlannedRoutes(routes: IPlannedRoute[], searchString: string): IPlannedRoute[] {\r\n if (!routes) {\r\n return;\r\n }\r\n\r\n if (!searchString || searchString.length === 0) {\r\n return routes;\r\n }\r\n\r\n searchString = searchString.toLowerCase();\r\n\r\n const filteredRoutes: IPlannedRoute[] = [];\r\n\r\n routes.forEach(route => {\r\n let showRoute = false;\r\n\r\n if (route.Name?.toLowerCase().indexOf(searchString) >= 0 ||\r\n (route.vehicle && route.vehicle.Reg.toLowerCase().indexOf(searchString) >= 0) ||\r\n (route.driver && route.driver.Name.toLowerCase().indexOf(searchString) >= 0)) {\r\n showRoute = true;\r\n }\r\n else {\r\n route.PlannedVisits.forEach(stop => {\r\n showRoute = showRoute || stop.displayLabel.toLowerCase().indexOf(searchString) >= 0;\r\n });\r\n }\r\n\r\n if (showRoute) {\r\n filteredRoutes.push(route);\r\n }\r\n });\r\n\r\n return filteredRoutes;\r\n }\r\n\r\n showRouteDetails(route: IPlannedRoute, stop: IPlannedRouteVisit, $event: MouseEvent, historyMode = false): angular.IPromise {\r\n console.warn(\"showRouteDetails\", stop);\r\n const controller = ($mdDialog) => {\r\n return {\r\n selectedRoute: route,\r\n selectedStop: stop,\r\n historyMode: historyMode,\r\n hide: () => {\r\n $mdDialog.hide();\r\n }\r\n }\r\n };\r\n\r\n controller.$inject = [\"$mdDialog\"];\r\n\r\n const dialogOptions: angular.material.IDialogOptions = {\r\n targetEvent: $event,\r\n escapeToClose: true,\r\n clickOutsideToClose: true,\r\n template: require(\"./jobDetails/jobDetails.dialog.html\"), // Use scope\r\n locals: {\r\n selectedRoute: route,\r\n selectedStop: stop\r\n },\r\n controller: controller,\r\n controllerAs: \"$ctrl\"\r\n };\r\n\r\n return this.$mdDialog.show(dialogOptions);\r\n }\r\n\r\n showTMSJobDialog(job: ITMSJob, $event: MouseEvent) {\r\n var dialogHTML = ``;\r\n\r\n const dialogOptions: IDialogOptionsJson = {\r\n title: this.translationService.t('Tms.TmsJob'),\r\n dialogHTML: dialogHTML,\r\n dialogId: `tmsJobDialog`,\r\n bindings: { job },\r\n event: $event\r\n };\r\n\r\n this.displayService.showDialog(dialogOptions);\r\n }\r\n\r\n defaultOnSiteTimeMins = 10;\r\n defaultTravelTimeMinsBuffer = 10;\r\n defaultOnsiteTimeMinsBuffer = 10;\r\n\r\n private setRouteDisplayStatus(route: IPlannedRoute) {\r\n route.routeDisplayStatus = \"\";\r\n\r\n if (route.firstStop == null) {\r\n console.warn(\"First Stop Null\");\r\n route.routeDisplayStatus = \"No Planned Visits\";\r\n return;\r\n }\r\n\r\n switch (route.Status) {\r\n\r\n case PlannedRouteStatus.Planned:\r\n const ms = route.firstStop.PlannedArrivalTime.diff(moment());\r\n const d = moment.duration(ms);\r\n const duration = (d as any).format(\"h[hr], m[min]\");\r\n if (d.valueOf() > 0) {\r\n route.routeDisplayStatus = `Starts in ${duration}`;\r\n }\r\n else {\r\n route.routeDisplayStatus = `Overdue`;\r\n }\r\n\r\n break;\r\n\r\n case PlannedRouteStatus.Started:\r\n if (route.nextStop == null) {\r\n route.routeDisplayStatus = \"Started...\";\r\n }\r\n else {\r\n var visitCount = route.PlannedVisits.filter(s => s.Status == RouteVisitStatus.Arrived || s.Status == RouteVisitStatus.Departed).length;\r\n route.routeDisplayStatus = `Visited ${visitCount} of ${route.PlannedVisits.length}`;\r\n }\r\n\r\n break;\r\n\r\n case PlannedRouteStatus.CompletedWithMissing:\r\n route.routeDisplayStatus = \"Partially Completed\";\r\n\r\n break;\r\n\r\n default:\r\n route.routeDisplayStatus = PlannedRouteStatus[route.Status];\r\n break;\r\n }\r\n }\r\n\r\n private updateRouteStops(route: IPlannedRoute) {\r\n\r\n var lastStop: IPlannedRouteVisit;\r\n\r\n route.PlannedVisits.forEach((stop, i) => {\r\n const isFirstStop = i === 0;\r\n const isFinalStop = i === route.PlannedVisits.length - 1;\r\n\r\n this.updateRouteStopTimes(stop, lastStop, isFirstStop, isFinalStop);\r\n this.updateRouteStopState(stop, lastStop, route, isFinalStop);\r\n\r\n if (i === 0) {\r\n stop.displayArrivalLabel = \"--\";\r\n }\r\n else if (stop.ActualArrivalTime) {\r\n stop.displayArrivalLabel = this.veriDate.formatDate(stop.ActualArrivalTime, \"time\");\r\n }\r\n else {\r\n stop.displayArrivalLabel = stop.status || \"Planned\";\r\n }\r\n\r\n if (i === route.PlannedVisits.length - 1) {\r\n stop.displayDepartureLabel = \"--\";\r\n }\r\n else if (stop.ActualDepartureTime) {\r\n stop.displayDepartureLabel = this.veriDate.formatDate(stop.ActualDepartureTime, \"time\");\r\n }\r\n else {\r\n stop.displayDepartureLabel = stop.status || \"Planned\";\r\n }\r\n\r\n lastStop = stop;\r\n });\r\n }\r\n\r\n private updateRouteStopTimes(stop: IPlannedRouteVisit, lastStop: IPlannedRouteVisit, isFirstStop: boolean, isFinalStop: boolean) {\r\n if (stop.ArrivalEta) {\r\n stop.ArrivalEta = moment(stop.ArrivalEta);\r\n }\r\n\r\n if (stop.ActualArrivalTime) {\r\n stop.ActualArrivalTime = moment(stop.ActualArrivalTime);\r\n }\r\n\r\n if (stop.ActualDepartureTime) {\r\n stop.ActualDepartureTime = moment(stop.ActualDepartureTime);\r\n }\r\n\r\n if (stop.PlannedDepartureTime) {\r\n stop.PlannedDepartureTime = moment(stop.PlannedDepartureTime);\r\n }\r\n\r\n if (stop.PlannedArrivalTime) {\r\n stop.PlannedArrivalTime = moment(stop.PlannedArrivalTime);\r\n }\r\n\r\n if (stop.PlannedDepartureTime) {\r\n stop.PlannedDepartureTime = moment(stop.PlannedDepartureTime);\r\n }\r\n\r\n if (stop.ActualArrivalTime && stop.PlannedArrivalTime.diff(stop.ActualArrivalTime, \"m\") !== 0) {\r\n stop.arrivalTimeDiff = stop.PlannedArrivalTime.from(stop.ActualArrivalTime, true);\r\n }\r\n\r\n if (stop.ActualDepartureTime && stop.PlannedDepartureTime.diff(stop.ActualDepartureTime, \"m\") !== 0) {\r\n stop.departureTimeDiff = stop.PlannedDepartureTime.from(stop.ActualDepartureTime, true);\r\n }\r\n\r\n if ((stop.ActualArrivalTime || stop.ArrivalEta) && !isFirstStop) {\r\n stop.arrivalLate = this.isArrivalLate(stop);\r\n stop.arrivalEarly = this.isArrivalEarly(stop);\r\n }\r\n\r\n if (stop.ActualDepartureTime || stop.ActualArrivalTime || stop.ArrivalEta) {\r\n stop.departureLate = this.isDepartureLate(stop);\r\n stop.departureEarly = this.isDepartureEarly(stop);\r\n }\r\n\r\n const plannedStopMins = stop.PlannedDepartureTime.diff(stop.PlannedArrivalTime, \"m\");\r\n\r\n stop.displayArrivalTime = stop.ActualArrivalTime || stop.ArrivalEta || stop.PlannedArrivalTime;\r\n\r\n if (stop.ActualDepartureTime) {\r\n stop.displayDepartureTime = stop.ActualDepartureTime;\r\n }\r\n else {\r\n if (stop.ActualArrivalTime) {\r\n stop.displayDepartureTime = stop.ActualArrivalTime.clone().add(plannedStopMins, \"m\");\r\n }\r\n else if (stop.ArrivalEta) {\r\n stop.displayDepartureTime = stop.ArrivalEta.clone().add(plannedStopMins, \"m\");\r\n } else {\r\n stop.displayDepartureTime = stop.PlannedDepartureTime;\r\n }\r\n }\r\n\r\n if (lastStop && !lastStop.ActualDepartureTime && !stop.ActualArrivalTime) {\r\n stop.displayArrivalTime = lastStop.displayDepartureTime.clone().add(stop.travelTimeMins, \"m\");\r\n }\r\n\r\n if (isFirstStop) {\r\n stop.displayArrivalTime = stop.displayDepartureTime.clone().add(-plannedStopMins, \"m\");\r\n }\r\n else if (isFinalStop) {\r\n stop.displayDepartureTime = stop.displayArrivalTime.clone().add(plannedStopMins, \"m\");\r\n }\r\n }\r\n\r\n private isArrivalLate(stop: IPlannedRouteVisit): boolean {\r\n const expectedArrivalTime = (stop.ActualArrivalTime || stop.ArrivalEta).clone();\r\n const bufferedArrivalTime = expectedArrivalTime.clone().add(-stop.travelTimeBufferMins, \"m\");\r\n\r\n return stop.PlannedArrivalTime.isSameOrBefore(bufferedArrivalTime);\r\n }\r\n\r\n private isArrivalEarly(stop: IPlannedRouteVisit): boolean {\r\n const expectedArrivalTime = (stop.ActualArrivalTime || stop.ArrivalEta).clone();\r\n const bufferedArrivalTime = expectedArrivalTime.clone().add(stop.travelTimeBufferMins, \"m\");\r\n\r\n return stop.PlannedArrivalTime.isSameOrAfter(bufferedArrivalTime);\r\n }\r\n\r\n private isDepartureLate(stop: IPlannedRouteVisit): boolean {\r\n let departureTime: moment.Moment;\r\n if (stop.ActualDepartureTime) {\r\n departureTime = stop.ActualDepartureTime.clone();\r\n }\r\n else {\r\n departureTime = (stop.ActualArrivalTime || stop.ArrivalEta).clone().add(stop.onSiteTimeMins, \"m\");\r\n }\r\n const bufferedDepartureTime = stop.PlannedDepartureTime.clone().add(stop.onSiteTimeBufferMins, \"m\");\r\n\r\n return departureTime.isSameOrAfter(bufferedDepartureTime);\r\n }\r\n\r\n private isDepartureEarly(stop: IPlannedRouteVisit): boolean {\r\n let departureTime: moment.Moment;\r\n\r\n if (stop.ActualDepartureTime) {\r\n departureTime = stop.ActualDepartureTime.clone();\r\n }\r\n else {\r\n departureTime = (stop.ActualArrivalTime || stop.ArrivalEta).clone().add(stop.onSiteTimeMins, \"m\");\r\n }\r\n\r\n const bufferedDepartureTime = stop.PlannedDepartureTime.clone().add(-stop.onSiteTimeBufferMins, \"m\");\r\n\r\n return departureTime.isSameOrBefore(bufferedDepartureTime);\r\n }\r\n\r\n private updateRouteStopState(stop: IPlannedRouteVisit,\r\n lastStop: IPlannedRouteVisit,\r\n route: IPlannedRoute,\r\n isFinalStop: boolean) {\r\n stop.className = \"\";\r\n\r\n stop.nextStop = lastStop && lastStop.Status === RouteVisitStatus.Departed;\r\n\r\n if (stop.nextStop) {\r\n route.nextStop = stop;\r\n }\r\n\r\n if (route.Status === PlannedRouteStatus.Started || route.Status === PlannedRouteStatus.Completed || route.Status === PlannedRouteStatus.CompletedWithMissing) {\r\n this.addClass(stop, \"route-started\");\r\n }\r\n\r\n this.setStopStatusLabel(stop);\r\n\r\n if (stop.Status === RouteVisitStatus.Departed ||\r\n stop.Status === RouteVisitStatus.Missed ||\r\n stop.Status === RouteVisitStatus.Arrived && isFinalStop) {\r\n this.addClass(stop, \"stop-completed\");\r\n }\r\n\r\n if (stop.arrivalLate) {\r\n this.addClass(stop, \"stop-late\");\r\n stop.arrivalClassName = \"stop-eta-red\";\r\n }\r\n else {\r\n this.addClass(stop, \"stop-ontime\");\r\n }\r\n\r\n if (stop.arrivalEarly) {\r\n stop.arrivalClassName = \"stop-eta-green\";\r\n }\r\n\r\n if (stop.departureLate) {\r\n this.addClass(stop, \"stop-late\");\r\n stop.departureClassName = \"stop-eta-red\";\r\n }\r\n else {\r\n this.addClass(stop, \"stop-ontime\");\r\n }\r\n\r\n if (stop.departureEarly) {\r\n stop.departureClassName = \"stop-eta-green\";\r\n }\r\n }\r\n\r\n private setStopStatusLabel(stop: IPlannedRouteVisit) {\r\n if (stop.Status === RouteVisitStatus.Arrived) {\r\n stop.status = \"Arrived\";\r\n this.addClass(stop, \"stop-arrived\");\r\n }\r\n\r\n if (stop.Status === RouteVisitStatus.Departed) {\r\n stop.status = \"Departed\";\r\n this.addClass(stop, \"stop-departed\");\r\n }\r\n\r\n if (stop.Status === RouteVisitStatus.Missed) {\r\n stop.status = \"Missed\";\r\n this.addClass(stop, \"stop-missed\");\r\n }\r\n\r\n if (stop.Status === RouteVisitStatus.Planned && stop.nextStop) {\r\n stop.status = \"En-Route\";\r\n this.addClass(stop, \"stop-enroute\");\r\n }\r\n }\r\n\r\n private addClass(stop: IPlannedRouteVisit, className: string): void {\r\n stop.className += ` ${className}`;\r\n }\r\n\r\n private mapGeofenceToRouteTemplate(routeStop: IRouteStop, geofences: IGeofence[]) {\r\n for (let i = 0; i < geofences.length; i++) {\r\n const geofence = geofences[i];\r\n\r\n if (geofence.Id === routeStop.GeofenceId) {\r\n routeStop.Geofence = geofence;\r\n return;\r\n }\r\n }\r\n }\r\n\r\n private formatTemplateForFrontEnd(template: IRouteTemplate, geofences: IGeofence[]) {\r\n this.resetTemplateDistanceAndTime(template);\r\n\r\n template.displayName = `#${template.AccountTemplateIndex}: ${template.Name}`;\r\n\r\n template.RouteStops.sort((a, b) => {\r\n return a.RouteVisitPosition - b.RouteVisitPosition;\r\n });\r\n\r\n template.RouteStops.sort((a, b) => {\r\n return a.RouteVisitPosition - b.RouteVisitPosition;\r\n });\r\n\r\n template.RouteStops.forEach(stop => {\r\n this.mapGeofenceToRouteTemplate(stop, geofences);\r\n this.createDisplayLabel(stop);\r\n\r\n this.updateTemplateDurationAndDistance(template, stop);\r\n });\r\n }\r\n\r\n private formatPlannedRouteForFrontEnd(plannedRoute: IPlannedRoute) {\r\n plannedRoute.totalDistanceKm = 0;\r\n plannedRoute.totalDurationMins = 0;\r\n plannedRoute.totalOnSiteTimeMins = 0;\r\n plannedRoute.totalTravelTimeMins = 0;\r\n plannedRoute.routeDisplayName = plannedRoute.ExternalReference ? plannedRoute.ExternalReference : plannedRoute.Name;\r\n\r\n plannedRoute.PlannedVisits.forEach(stop => {\r\n this.createDisplayLabel(stop);\r\n\r\n this.updatePlannedRouteDurationAndDistance(plannedRoute, stop);\r\n });\r\n }\r\n\r\n private updatePlannedRouteDurationAndDistance(plannedRoute: IPlannedRoute, stop: IPlannedRouteVisit) {\r\n stop.travelTimeMins = this.convertTimeSpanToMins(stop.TravelTime);\r\n stop.onSiteTimeMins = this.convertTimeSpanToMins(stop.OnSiteTime);\r\n\r\n stop.travelTimeBufferMins = this.convertTimeSpanToMins(stop.TravelTimeBuffer);\r\n stop.onSiteTimeBufferMins = this.convertTimeSpanToMins(stop.OnSiteTimeBuffer);\r\n\r\n this.updatePlannedRouteTotals(plannedRoute, stop);\r\n }\r\n\r\n private updatePlannedRouteTotals(plannedRoute: IPlannedRoute, stop: IPlannedRouteVisit) {\r\n var stopIndex = plannedRoute.PlannedVisits.indexOf(stop);\r\n var isStartOrEndStop = stopIndex == 0 || stopIndex == plannedRoute.PlannedVisits.length - 1;\r\n\r\n plannedRoute.totalTravelTimeMins += stop.travelTimeMins;\r\n plannedRoute.totalOnSiteTimeMins += stop.onSiteTimeMins;\r\n plannedRoute.totalDistanceKm += stop.TravelDistanceMetres / 1000;\r\n\r\n plannedRoute.totalDurationMins += stop.travelTimeMins\r\n if (!isStartOrEndStop) {\r\n plannedRoute.totalDurationMins += stop.onSiteTimeMins;\r\n }\r\n }\r\n\r\n private updateTemplateDurationAndDistance(template: IRouteTemplate, stop: IRouteStop) {\r\n stop.travelTimeMins = this.convertTimeSpanToMins(stop.TravelTime);\r\n stop.onSiteTimeMins = this.convertTimeSpanToMins(stop.OnSiteTime);\r\n\r\n stop.travelTimeBufferMins = this.convertTimeSpanToMins(stop.TravelTimeBuffer);\r\n stop.onSiteTimeBufferMins = this.convertTimeSpanToMins(stop.OnSiteTimeBuffer);\r\n\r\n this.updateTemplateTotals(template, stop);\r\n }\r\n\r\n createPlannedRouteStops(template: IRouteTemplate, startTime: moment.Moment): IPlannedRouteVisit[] {\r\n var plannedRouteStops: IPlannedRouteVisit[] = [];\r\n var previousPlannedStop: IPlannedRouteVisit;\r\n\r\n var stopPosition = 0;\r\n template.RouteStops.forEach(routeStop => {\r\n var plannedRouteStop: IPlannedRouteVisit = {\r\n ActualDistanceTraveled: 0,\r\n Status: RouteVisitStatus.Planned,\r\n RouteVisitPosition: stopPosition++,\r\n TravelTime: routeStop.TravelTime,\r\n OnSiteTime: routeStop.OnSiteTime,\r\n TravelTimeBuffer: routeStop.TravelTimeBuffer,\r\n OnSiteTimeBuffer: routeStop.OnSiteTimeBuffer,\r\n TravelDistanceMetres: routeStop.TravelDistanceMetres !== undefined ? routeStop.TravelDistanceMetres : 0,\r\n LinePoints: routeStop.LinePoints,\r\n RouteStopId: routeStop.Id,\r\n GeofenceId: routeStop.GeofenceId,\r\n travelTimeBufferMins: routeStop.travelTimeBufferMins,\r\n onSiteTimeBufferMins: routeStop.onSiteTimeBufferMins,\r\n travelTimeMins: routeStop.travelTimeMins,\r\n onSiteTimeMins: routeStop.onSiteTimeMins\r\n };\r\n\r\n if (previousPlannedStop) {\r\n plannedRouteStop.PlannedArrivalTime = moment(previousPlannedStop.PlannedDepartureTime).add(\"m\", plannedRouteStop.travelTimeMins);\r\n plannedRouteStop.PlannedDepartureTime = moment(previousPlannedStop.PlannedDepartureTime).add(\"m\", plannedRouteStop.travelTimeMins + plannedRouteStop.onSiteTimeMins);\r\n } else {\r\n plannedRouteStop.PlannedArrivalTime = moment(startTime);\r\n plannedRouteStop.PlannedDepartureTime = moment(startTime).add(\"m\", plannedRouteStop.onSiteTimeMins);\r\n }\r\n\r\n plannedRouteStops.push(plannedRouteStop);\r\n\r\n previousPlannedStop = plannedRouteStop;\r\n });\r\n\r\n return plannedRouteStops;\r\n }\r\n\r\n syncChnagedRouteStopsWithTemplate($routeStops: IRouteStop[], template: IRouteTemplate): IRouteStop[] {\r\n this.resetTemplateDistanceAndTime(template);\r\n\r\n template.RouteStops.forEach(stop => {\r\n stop.hit = false;\r\n });\r\n\r\n $routeStops.forEach((newStop) => {\r\n template.RouteStops.forEach((oldStop) => {\r\n if (newStop.waypoint.label === oldStop.waypoint.label &&\r\n !newStop.hit && !oldStop.hit) {\r\n newStop.hit = true;\r\n oldStop.hit = true;\r\n newStop.travelTimeBufferMins = oldStop.travelTimeBufferMins;\r\n\r\n newStop.onSiteTimeBufferMins = oldStop.onSiteTimeBufferMins;\r\n newStop.onSiteTimeMins = oldStop.onSiteTimeMins;\r\n return;\r\n }\r\n });\r\n });\r\n\r\n template.RouteStops = $routeStops;\r\n\r\n template.RouteStops.forEach((stop, index) => {\r\n if (!stop.travelTimeMins) {\r\n stop.travelTimeMins = 0;\r\n }\r\n\r\n stop.travelTimeMins = Math.ceil(stop.travelTimeMins);\r\n stop.TravelTime = this.convertMinsToTimeSpan(stop.travelTimeMins);\r\n\r\n stop.onSiteTimeBufferMins = stop.onSiteTimeBufferMins || this.defaultOnsiteTimeMinsBuffer;\r\n stop.OnSiteTimeBuffer = this.convertMinsToTimeSpan(stop.onSiteTimeBufferMins);\r\n\r\n stop.travelTimeBufferMins = stop.travelTimeBufferMins || this.defaultTravelTimeMinsBuffer;\r\n stop.travelTimeBufferMins = Math.round(stop.travelTimeBufferMins); // Round so we dont get 9.777777 mins etc\r\n stop.TravelTimeBuffer = this.convertMinsToTimeSpan(stop.travelTimeBufferMins);\r\n\r\n if (index !== 0 && !stop.onSiteTimeMins) {\r\n stop.onSiteTimeMins = this.defaultOnSiteTimeMins;\r\n }\r\n else if (!stop.onSiteTimeMins && !stop.travelTimeMins) {\r\n stop.travelTimeMins = 0;\r\n stop.onSiteTimeMins = 3; // Min minutes on site\r\n }\r\n\r\n stop.OnSiteTime = this.convertMinsToTimeSpan(stop.onSiteTimeMins);\r\n stop.TravelDistanceMetres = stop.TravelDistanceMetres !== undefined ? stop.TravelDistanceMetres : 0;\r\n\r\n this.updateTemplateTotals(template, stop);\r\n });\r\n\r\n return $routeStops;\r\n }\r\n\r\n updateTemplateTotals(template: IRouteTemplate, stop: IRouteStop): void {\r\n template.totalTravelTimeMins += stop.travelTimeMins;\r\n template.totalOnSiteTimeMins += stop.onSiteTimeMins;\r\n template.totalDurationMins += stop.travelTimeMins + stop.onSiteTimeMins;\r\n template.totalDistanceKm += stop.TravelDistanceMetres / 1000;\r\n }\r\n\r\n resetTemplateDistanceAndTime(template: IRouteTemplate): void {\r\n template.totalDistanceKm = 0;\r\n template.totalDurationMins = 0;\r\n template.totalOnSiteTimeMins = 0;\r\n template.totalTravelTimeMins = 0;\r\n }\r\n\r\n private mapLinkedElementsToPlannedRoutes(routes: IPlannedRoute[],\r\n mappings: IVehicleDriverMapping[],\r\n drivers: IDriver[],\r\n vehicles: IVehicle[],\r\n geofences: IGeofence[]) {\r\n\r\n routes.forEach(route => {\r\n this.mapVehicleToRoute(route, vehicles);\r\n this.mapDriverToRoute(route, drivers);\r\n this.mapGeofencesToRouteStops(route, geofences);\r\n });\r\n }\r\n\r\n private mapGeofencesToRouteStops(route: IPlannedRoute, geofences: IGeofence[]) {\r\n window.performance.mark(\"mapGeofencesToRouteStops\");\r\n\r\n route.PlannedVisits.forEach(stop => {\r\n stop.displayLabel = \"Unknown\";\r\n\r\n stop.Geofence = geofences.find(g => g.Id == stop.GeofenceId);\r\n if (stop.Geofence) {\r\n stop.displayLabel = stop.Geofence.Description;\r\n }\r\n });\r\n\r\n window.performance.measure(\"mapGeofencesToRouteStops\");\r\n }\r\n\r\n private mapDriverToRoute(route: IPlannedRoute, drivers: IDriver[]) {\r\n route.driver = this.driverService.findDriver(drivers, route.DriverId);\r\n\r\n route.PlannedVisits.forEach(stop => {\r\n stop.actualDriver = this.driverService.findDriver(drivers, stop.ActualDriverId);\r\n });\r\n }\r\n\r\n private mapVehicleToRoute(route: IPlannedRoute, vehicles: IVehicle[]) {\r\n route.vehicle = this.vehicleService.findVehicle(vehicles, route.VehicleId);\r\n }\r\n\r\n private mapUsersToNotes(notes: IPlannedRouteNotes[], users: IUser[]) {\r\n if (!notes) {\r\n return;\r\n }\r\n\r\n notes.forEach(note => {\r\n for (let i = 0; i < users.length; i++) {\r\n const user = users[i];\r\n\r\n note.utcMoment = moment(note.Utc);\r\n\r\n if (user.Id === note.UserId) {\r\n note.user = user;\r\n return;\r\n }\r\n }\r\n });\r\n }\r\n\r\n //private mapTemplateToRoute(route: IPlannedRoute, templates: IRouteTemplate[]) {\r\n // for (let i = 0; i < templates.length; i++) {\r\n // if (route.RouteTemplateId === templates[i].Id) {\r\n // route.RouteTemplate = templates[i];\r\n\r\n // return;\r\n // }\r\n // }\r\n //}\r\n\r\n createHistoryTableHeaders(): IVeriTableHeader[] {\r\n return [\r\n {\r\n title: \"Route\",\r\n sortType: SortType.String,\r\n sortable: true\r\n },\r\n {\r\n title: \"Driver / Vehicle\",\r\n sortType: SortType.String,\r\n sortable: true\r\n },\r\n {\r\n title: \"Start\",\r\n width: 140,\r\n sortType: SortType.Date,\r\n sortable: true\r\n },\r\n {\r\n title: \"Est. Duration\",\r\n width: 120,\r\n sortType: SortType.Number,\r\n sortable: true\r\n },\r\n {\r\n title: \"Visits\",\r\n width: 50,\r\n sortType: SortType.Number,\r\n sortable: true\r\n },\r\n {\r\n title: \"Distance\",\r\n width: 80,\r\n sortType: SortType.Number,\r\n sortable: true\r\n },\r\n {\r\n title: \"Status\",\r\n width: 130,\r\n sortType: SortType.String,\r\n sortable: true,\r\n includeInSummary: true\r\n }\r\n ];\r\n }\r\n\r\n createHistoryTableRows(routes: IPlannedRoute[]): IVeriTableRow[] {\r\n const tableRows: IVeriTableRow[] = [];\r\n\r\n routes.forEach(route => {\r\n tableRows.push({\r\n data: route,\r\n cells: this.createTableCells(route),\r\n isInGroup: (data, group) => {\r\n return group.VehicleIds.indexOf(data.VehicleId) >= 0 || group.DriverIds.indexOf(data.DriverId) >= 0;\r\n },\r\n searchString: `${route.Name}${route.vehicle ? route.vehicle.ShortReg + route.vehicle.Reg : \"\"}${route.driver ? route.driver.Name : \"\"}${this.veriDate.formatDate(route.PlannedStartTime)}`\r\n });\r\n });\r\n\r\n return tableRows;\r\n }\r\n\r\n private createTableCells(route: IPlannedRoute): IVeriTableRowCell[] {\r\n const cells: IVeriTableRowCell[] = [\r\n {\r\n contents: route.routeDisplayName\r\n },\r\n this.veriTableService.createDriverSummaryPanelCell(route.driver || route.firstStop.actualDriver, route.vehicle, null, route.firstStop.Status == 0, \"p-0\"),\r\n { contents: this.veriDate.formatDate(route.PlannedStartTime), sortData: route.PlannedStartTime },\r\n { contents: this.veriDate.formatDurationMs(route.totalDurationMins * 60 * 1000), sortData: route.totalDurationMins },\r\n { contents: route.PlannedVisits.length.toString() },\r\n { contents: this.unitConversionService.convertUnitWithSuffix(route.totalDistanceKm, UnitConversionType.Distance) },\r\n { contents: route.routeDisplayStatus, summaryIcon: this.getTMSStatusIcon(route) }\r\n ];\r\n\r\n return cells;\r\n }\r\n\r\n private getTMSStatusIcon(route: IPlannedRoute): string {\r\n switch (route.Status) {\r\n case PlannedRouteStatus.Cancelled:\r\n case PlannedRouteStatus.Expired:\r\n return \"highlight_off\";\r\n\r\n case PlannedRouteStatus.Completed:\r\n return \"check\"\r\n\r\n case PlannedRouteStatus.CompletedWithMissing:\r\n return \"rule\"\r\n //return \"playlist_add_check\"\r\n\r\n case PlannedRouteStatus.Planned:\r\n return \"history_toggle_off\"\r\n\r\n case PlannedRouteStatus.Incomplete:\r\n return \"help_outline\"\r\n }\r\n\r\n return \"work\";\r\n }\r\n}\r\n","export enum DistanceMeasurement {\r\n Kilometres,\r\n Miles\r\n}\r\n","export class ResourceManagementNavigationModule {\r\n\r\n static get GroupsManagement(): string { return `${ResourceManagementNavigationModule.ParentRoot}.groups`; }\r\n static get VehiclesManagement(): string { return `${ResourceManagementNavigationModule.ParentRoot}.vehicles`; }\r\n static get DriversManagement(): string { return `${ResourceManagementNavigationModule.ParentRoot}.drivers`; }\r\n static get UsersManagement(): string { return `${ResourceManagementNavigationModule.ParentRoot}.users`; }\r\n\r\n static get CameraManagement(): string { return `${ResourceManagementNavigationModule.ParentRoot}.cameras` }\r\n static get Settings(): string { return `${ResourceManagementNavigationModule.ParentRoot}.settings`; }\r\n static get ContextualSpeedingSettings(): string { return `${ResourceManagementNavigationModule.ParentRoot}.contextualspeedingsettings`; }\r\n\r\n static get DeviceProfilesManagement(): string { return `${ResourceManagementNavigationModule.ParentRoot}.driveprofiles`; }\r\n static get EditDeviceProfile(): string { return `${ResourceManagementNavigationModule.DeviceProfilesManagement}.edit`; }\r\n static get NewDeviceProfile(): string { return `${ResourceManagementNavigationModule.DeviceProfilesManagement}.new`; }\r\n\r\n static get DrivingStylesManagement(): string { return `${ResourceManagementNavigationModule.ParentRoot}.drivingstyles`; }\r\n static get EditDrivingStyle(): string { return `${ResourceManagementNavigationModule.DrivingStylesManagement}.edit`; }\r\n static get NewDrivingStyle(): string { return `${ResourceManagementNavigationModule.DrivingStylesManagement}.new`; }\r\n\r\n static get Default(): string { return ResourceManagementNavigationModule.GroupsManagement; }\r\n static get ParentRoot(): string { return \"app.resourceManagement\"; }\r\n}\r\n","export enum DayOfWeek {\r\n Monday = 1,\r\n Tuesday = 2,\r\n Wednesday = 3,\r\n Thursday = 4,\r\n Friday = 5,\r\n Saturday = 6,\r\n Sunday = 0\r\n}\n","\nimport * as angular from \"angular\";\n\r\nexport class FullScreenService {\r\n document: any;\r\n\r\n static $inject = [\"$rootScope\", \"$document\"];\r\n\r\n constructor(\r\n private $rootScope: angular.IRootScopeService,\r\n private $document: angular.IDocumentService) {\r\n this.document = $document[0];\r\n }\r\n\r\n all() {\n this.enable(this.document.documentElement);\r\n }\n\n toggle(el: Element): boolean {\n\n if (this.isEnabled()) {\n this.cancel();\n return false;\r\n }\n\r\n this.enable(el);\n return true;\n }\r\n\r\n enable(el: Element) {\n\n var element = el as any;\n\n if (element.requestFullscreen) {\r\n element.requestFullscreen();\r\n }\r\n else if (element.mozRequestFullScreen) {\r\n element.mozRequestFullScreen();\r\n }\r\n else if (element.webkitRequestFullscreen) {\r\n element.webkitRequestFullscreen();\r\n }\r\n else if (element.msRequestFullscreen) {\r\n element.msRequestFullscreen();\r\n }\r\n }\r\n\r\n cancel() {\r\n if (this.document.cancelFullScreen) {\r\n this.document.cancelFullScreen();\r\n }\r\n else if (this.document.mozCancelFullScreen) {\r\n this.document.mozCancelFullScreen();\r\n }\r\n else if (this.document.webkitExitFullscreen) {\r\n this.document.webkitExitFullscreen();\r\n }\r\n else if (this.document.msExitFullscreen) {\r\n this.document.msExitFullscreen();\r\n }\r\n }\r\n\r\n isEnabled() {\r\n const fullscreenElement = this.document.fullscreenElement || this.document.mozFullScreenElement || this.document.webkitFullscreenElement || this.document.msFullscreenElement;\r\n return fullscreenElement ? true : false;\r\n }\r\n\r\n toggleAll() {\r\n this.isEnabled() ? this.cancel() : this.all();\r\n }\r\n\r\n isSupported() {\r\n const docElm = this.document.documentElement;\r\n const requestFullscreen = docElm.requestFullScreen || docElm.mozRequestFullScreen || docElm.webkitRequestFullscreen || docElm.msRequestFullscreen;\r\n\r\n return requestFullscreen ? true : false;\r\n }\r\n}\n","export enum VorRecordStatus {\r\n Active,\r\n Completed,\r\n Pending\r\n}\r\n\r\nexport interface IVorRecord {\r\n Id: number;\r\n\r\n VehicleId: number;\r\n\r\n StartDate: Date;\r\n\r\n EndDate?: Date;\r\n\r\n Description: string;\r\n\r\n InPast?: boolean;\r\n\r\n vorStatus?: string;\r\n status?: VorRecordStatus;\r\n}\r\n","import { Component, EventEmitter, Input, OnInit, Output } from \"@angular/core\";\r\nimport \"./v-pills.component.scss\";\r\n\r\nexport interface IPill {\r\n label: string;\r\n icon?: string;\r\n data?: T;\r\n status?: 'error' | 'warning' | 'success';\r\n\r\n hovering?: boolean;\r\n tooltip?: string;\r\n}\r\n\r\n@Component({\r\n selector: \"v-pills\",\r\n template: require(\"./v-pills.component.html\")\r\n})\r\nexport class VPillsComponent {\r\n\r\n @Input() pills: IPill[];\r\n @Output() pillRemoveClick = new EventEmitter>();\r\n\r\n @Input() allowRemove: boolean;\r\n\r\n @Input() tooltip?: string;\r\n hovering: boolean;\r\n readonly removeIcon: string = \"close\";\r\n\r\n constructor() { }\r\n\r\n onClickedRemovePill(pill: IPill): void {\r\n if (!this.allowRemove) {\r\n return;\r\n }\r\n\r\n this.pillRemoveClick.emit(pill);\r\n }\r\n\r\n onMouseEnter(pill: IPill): void {\r\n pill.hovering = true;\r\n }\r\n\r\n onMouseLeave(pill: IPill): void {\r\n pill.hovering = false;\r\n }\r\n}\r\n","export enum DrivingStyleMetric {\r\n Total = -1,\r\n HarshBrakingAccelerometerEvents,\r\n HarshAccelerationAccelerometerEvents,\r\n HarshCorneringAccelerometerEvents,\r\n OverIdlingDuration,\r\n OverTorqueDuration,\r\n OverAccelerationDuration,\r\n HarshBrakingEvents,\r\n CoastingInclusiveDuration,\r\n OverRevDuration,\r\n BadAnticipationEvents,\r\n ContextualSpeedingEvents,\r\n CruiseDuration,\r\n CruiseInTopGearDuration,\r\n GreenBandDuration,\r\n SweetSpotDuration,\r\n CoastingExclusiveDuration\r\n}\r\n\r\nexport enum DrivingStyleMetricDenominator {\r\n None = 0,\r\n PerHundredKm = 1,\r\n DurationEngineOn = 2,\r\n DurationDriving = 3\r\n}\r\n\r\nexport enum DrivingStyleWeightingType {\r\n Even,\r\n Simple,\r\n Custom\r\n}\r\n\r\nexport enum DrivingStyleMetricCategory {\r\n CAN,\r\n Accelerometer,\r\n Other\r\n}\r\n\r\nexport enum MetricMappingWeightingLevel {\r\n None,\r\n Low,\r\n Medium,\r\n High,\r\n Critical,\r\n Custom\r\n}\r\n","\r\nexport enum Platform {\r\n None = 0,\r\n Verilocation = 1,\r\n Isotrak = 2,\r\n Seven = 3,\r\n Alcolock = 4,\r\n RTL = 5\r\n}\r\n","export enum MultiStateInputCategory {\r\n ReeferInterfaceStatus = 0,\r\n ReeferOperatingMode = 1,\r\n ReeferEngineSpeedMode = 2,\r\n ReeferEngineMode = 3,\r\n ReeferZoneOperatingMode = 4\r\n}\r\n","export enum StreamaxRecordOverwrite {\r\n ByDays = 0,\r\n ByCapacity = 1,\r\n Disabled = 2,\r\n ByMinutes = 4\r\n}\r\n\r\nexport enum FtCloudConfigExceptionError {\r\n RecordOverwrite,\r\n IgnitionDelay,\r\n CameraCoveredAlarmToggle,\r\n CameraCoveredAlarmTrigger,\r\n VideoLossAlarmToggle,\r\n VideoLossAlarmTrigger,\r\n AcceleratorAlarmToggle,\r\n HarshBrakingTrigger,\r\n HardAccelerationTrigger,\r\n HarshRightTurnTrigger,\r\n HarshLeftTurnTrigger,\r\n HarshBrakingTriggerMetrics,\r\n HardAccelerationTriggerMetrics,\r\n HarshRightTurnTriggerMetrics,\r\n HarshLeftTurnTriggerMetrics,\r\n GyroMetrics,\r\n Timezone,\r\n DaylightSavingsToggle,\r\n DaylightSavingsOffset,\r\n AudioToggle,\r\n Uncollected\r\n}\r\n\r\nexport enum CameraCoveredAlarmSensitivity {\r\n High,\r\n Medium,\r\n Low\r\n}\r\n\r\nexport enum ChannelFlag {\r\n None = 0,\r\n Channel1 = 1,\r\n Channel2 = 2,\r\n Channel3 = 4,\r\n Channel4 = 8,\r\n Channel5 = 16,\r\n Channel6 = 32,\r\n Channel7 = 64,\r\n Channel8 = 128,\r\n Channel9 = 256,\r\n Channel10 = 512,\r\n Channel11 = 1024,\r\n Channel12 = 2048,\r\n Channel13 = 4096,\r\n Channel14 = 8192,\r\n Channel15 = 16384,\r\n Channel16 = 32768\r\n}\r\n\r\nexport enum DSTOffsetMonth {\r\n January,\r\n February,\r\n March,\r\n April,\r\n May,\r\n June,\r\n July,\r\n August,\r\n September,\r\n October,\r\n November,\r\n December\r\n}\r\n\r\nexport enum DSTOffsetWeek {\r\n FirstWeekOfMonth,\r\n SecondWeekOfMonth,\r\n ThirdWeekOfMonth,\r\n FourthWeekOfMonth,\r\n LastWeekOfMonth\r\n}\r\n\r\nexport enum DSTOffsetDay {\r\n Sunday,\r\n Monday,\r\n Tuesday,\r\n Wednesday,\r\n Thursday,\r\n Friday,\r\n Saturday\r\n}\r\n\r\nexport enum CalcType {\r\n DeviceComms,\r\n TotalErrors,\r\n TotalSync\r\n}\r\n\r\nexport enum SegmentClass {\r\n Positive,\r\n Negative,\r\n Uncollected\r\n}\r\n","export interface ISim {\r\n Id?: number;\r\n\r\n Iccid: string;\r\n Imsi: string;\r\n Msisdn: string;\r\n Status: SimStatus;\r\n Type: SimType;\r\n SimSubType?: SimSubType;\r\n LastUsageUpdate?: Date;\r\n LastDetailsUpdate?: Date;\r\n\r\n}\r\n\r\n\r\nexport enum SimStatus {\r\n\r\n Active = 0,\r\n AwaitingCancellation = 1,\r\n Cancelled = 2,\r\n ActiveRoaming = 3,\r\n ActiveVoice = 4,\r\n Inactive = 5,\r\n Barred = 6,\r\n ActiveTest = 7,\r\n ActiveReady = 8,\r\n Unknown = 100\r\n}\r\n\r\nexport enum SimType {\r\n\r\n Unknown = -1,\r\n WirelessLogic,\r\n Aeris,\r\n Isotrak,\r\n Arkessa,\r\n TM,\r\n Tele2\r\n}\r\n\r\nexport enum SimSubType {\r\n\r\n Fusion\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 { DataCacheService } from \"@app/services/caching/data-cache.service\";\r\nimport { Observable } from \"rxjs\";\r\nimport { tap } from \"rxjs/operators\";\r\nimport { CameraApplicationState, CameraAppType, ICameraApp } from \"../_models/ICameraApp\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CameraAppService {\r\n \r\n private cameraApplicationsCacheName: string = \"cameraAppCache\";\r\n\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly dataCacheService: DataCacheService\r\n ) { }\r\n\r\n getApplicationFiles(invalidateCache = false): Observable {\r\n return this.dataCacheService.getOrRequest(this.cameraApplicationsCacheName, () => this.getApplicationFilesFromDb(), { invalidateCache });\r\n }\r\n\r\n getApplicationFilesFromDb(): Observable {\r\n return this.http.get(`/api/cameras/commserver/applications`);\r\n }\r\n\r\n updateApp(app: ICameraApp): Observable {\r\n return this.http.post(`/api/cameras/commserver/applications/update`, app);\r\n }\r\n\r\n saveApp(formData: FormData): Observable {\r\n return this.http.post(`/api/cameras/commserver/applications`, formData, {\r\n headers: new HttpHeaders({\r\n 'enctype': 'multipart/form-data'\r\n })\r\n }).pipe(\r\n tap(app => {\r\n this.dataCacheService.addOrUpdateItem(app, this.cameraApplicationsCacheName)\r\n })\r\n )\r\n }\r\n\r\n downloadFile(guid: string): Observable {\r\n return this.http.get(`/commserver/api/assets/app/${guid}`, { responseType: 'blob' });\r\n }\r\n\r\n createNewApp(): ICameraApp {\r\n return {\r\n Id: 0,\r\n FileGuid: \"\",\r\n CameraAppType: CameraAppType.Updater,\r\n Name: \"\",\r\n Description: \"\",\r\n State: CameraApplicationState.Beta,\r\n Version: \"\",\r\n IsActive: true\r\n }\r\n }\r\n\r\n getAppType(appId: number, cameraApplications: ICameraApp[]): CameraAppType {\r\n return cameraApplications.find(a => a.Id == appId).CameraAppType;\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { PeripheralService } from \"@foundation/_services/peripheral.service\";\r\nimport { IPlot } from \"@interfaces/IPlot\";\r\nimport { ISensorData } from \"@interfaces/ISensorData\";\r\nimport { Observable } from \"rxjs\";\r\nimport { IEngineerCommission } from \"../../foundation.interfaces\";\r\nimport { IEngineerCommissionQueryOptions } from \"../../_models/IEngineerCommissionQueryOptions\";\r\nimport { ISerialSearchResponse } from \"../../_models/ISerialSearchResponse\";\r\nimport { FoundationSensorDataService } from \"../../_services/sensor-data.service\";\r\nimport { UnitsService } from \"../../_services/unit.service\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CommissionService {\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly peripheralService: PeripheralService,\r\n private readonly sensorDataService: FoundationSensorDataService,\r\n private readonly unitService: UnitsService) {\r\n }\r\n\r\n getEngineerCommissions(params: IEngineerCommissionQueryOptions): Observable {\r\n if (params.Start) {\r\n params.Start = new Date(params.Start).toISOString();\r\n }\r\n\r\n if (params.End) {\r\n params.End = new Date(params.End).toISOString();\r\n }\r\n\r\n return this.http.get(`/api/foundation/engineerCommissions/`, { params: params as HttpParams })\r\n\r\n }\r\n\r\n getUnitOrPeripheralBySerial(serial: string): Observable {\r\n return this.unitService.getUnitBySerial(serial);\r\n }\r\n\r\n createUnitLabel(searchResponse: ISerialSearchResponse): string {\r\n if (!searchResponse) {\r\n return \"\";\r\n }\r\n\r\n if (searchResponse.Product) {\r\n return `${searchResponse.vendorString ? searchResponse.vendorString:''} ${searchResponse.Product.Description}`;\r\n }\r\n\r\n return \"Product Information Unavailable\";\r\n }\r\n\r\n getPlotsByImei(imei: string, jobItemVehicleId?: number): Observable {\r\n return this.peripheralService.getExtendedPlotsByImei(imei, jobItemVehicleId);\r\n }\r\n\r\n getSensorDataByImei(imei: string, startTime: Date): Observable {\r\n return this.sensorDataService.getSensorDataByImei(imei, startTime, new Date());\r\n }\r\n}\r\n","import { AccountStatus } from '@enums/account/AccountStatus';\r\nimport { Platform } from '@enums/account/Platform';\r\nimport { IAccount } from '@services/account.service';\r\nimport { CurrentUserService } from '@services/currentUser.service';\r\nimport { DisplayService, IDialogOptionsJson } from '@services/display.service';\r\nimport { TranslationService } from '@services/translation.service';\r\nimport { IReseller } from '../_models/IReseller';\r\n\r\nexport interface IAccountSummary {\r\n ManualNoteCount: number;\r\n\r\n AutomaticNoteCount: number;\r\n\r\n TicketCount: number;\r\n\r\n VehicleCount: number;\r\n\r\n JobCount: number;\r\n\r\n CommissionCount: number;\r\n\r\n UserCount: number;\r\n}\r\n\r\nexport class FoundationAccountService {\r\n\r\n static $inject = [\"$q\", \"$http\", \"$mdDialog\", \"displayService\", \"currentUserService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $http: angular.IHttpService,\r\n private readonly $mdDialog: angular.material.IDialogService,\r\n private readonly displayService: DisplayService,\r\n private readonly currentUserService: CurrentUserService,\r\n private readonly translationService: TranslationService\r\n ) {\r\n }\r\n\r\n getCustomerAccounts(invalidateCache = false): angular.IPromise {\r\n return this.$http({\r\n url: `/api/foundation/accounts/`,\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 30, invalidateCache: invalidateCache }\r\n }).then(response => {\r\n // For now lets hide any none active accounts\r\n return response.data.filter(a => a.Status != AccountStatus.Prospective);\r\n });\r\n }\r\n\r\n getCustomerAccount(accountId: number, invalidateCache = false): angular.IPromise {\r\n return this.getCustomerAccounts(invalidateCache).then(accounts => {\r\n return accounts.find(a => a.Id == accountId);\r\n });\r\n }\r\n\r\n getCustomerAccountsExtended(): angular.IPromise {\r\n return this.$http({\r\n url: `/api/foundation/accounts/extendedinfo/`,\r\n method: \"GET\",\r\n cache: true\r\n }).then(response => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getCustomerAccountImage(accountId: number, invalidateCache = false): angular.IPromise {\r\n return this.$http({\r\n url: `/api/foundation/accounts/${accountId}/image`,\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 30, invalidateCache: invalidateCache }\r\n }).then(response => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getAccountSummary(accountId: number): angular.IPromise {\r\n //return this.getCustomerAccount(accountId)\r\n // .then(accountSummary => {\r\n // return {\r\n // commissionCount: 1234,\r\n // jobCount: 1234,\r\n // noteCount: 1234,\r\n // ticketCount: 1234,\r\n // vehicleCount: 1234\r\n // };\r\n // });\r\n return this.$http({\r\n url: `/api/foundation/accounts/${accountId}/summary`,\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 30 }\r\n }).then(response => {\r\n\r\n return response.data;\r\n });\r\n }\r\n\r\n updateCustomerFeatures(accountId: number): angular.IPromise {\r\n return this\r\n .$http({\r\n method: \"POST\",\r\n url: \"/api/foundation/accounts/updatefeatures\",\r\n data: accountId\r\n });\r\n }\r\n\r\n save(account: IAccount): angular.IPromise {\r\n if (!account) {\r\n return this.$q.reject(\"No account provided\");\r\n }\r\n\r\n // Validate model\r\n\r\n account.Website = account.Website || \"\";\r\n account.Platform = account.Platform || Platform.Verilocation;\r\n\r\n return this\r\n .$http({\r\n method: \"POST\",\r\n url: \"/api/foundation/accounts/\",\r\n data: account\r\n }).then(response => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getResellers(): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/foundation/accounts/resellers`,\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 30 }\r\n })\r\n .then(response => {\r\n return response.data;\r\n })\r\n .catch(() => {\r\n return [];\r\n });\r\n }\r\n\r\n getResellerName(resellers: IReseller[], resellerId: number): string {\r\n if (resellerId) {\r\n var resellerAccount = resellers.find(r => r.Id == resellerId);\r\n return resellerAccount?.Description || \"Unknown\";\r\n }\r\n\r\n return `AddSecure UK`;\r\n }\r\n\r\n createAccountMap(accounts: IAccount[]): Map {\r\n return new Map(accounts.map(a => [a.Id, a]));\r\n }\r\n\r\n\r\n showCustomerImageDialog(event?: MouseEvent, accountId?: number) {\r\n return this.$mdDialog.show({\r\n template: require(\"../../../components/companyImage/companyImage.html\"),\r\n targetEvent: event,\r\n multiple: true,\r\n escapeToClose: true,\r\n clickOutsideToClose: true,\r\n controller: \"companyImageController\",\r\n controllerAs: \"$ctrl\",\r\n locals: { accountId: accountId }\r\n });\r\n }\r\n\r\n showEditAccountDialog($event: MouseEvent, account: IAccount = null) {\r\n\r\n const controller = ($mdDialog: angular.material.IDialogService) => {\r\n return {\r\n hide: (requiresUpdate: boolean) => { $mdDialog.hide(requiresUpdate); },\r\n selectedAccount: account,\r\n }\r\n };\r\n\r\n controller.$inject = [\"$mdDialog\"];\r\n\r\n const editTitle = `${this.translationService.t(\"Common.Edit\")}: ${account?.CompanyName}`;\r\n const addTitle = this.translationService.t(\"Foundation.AddCustomer\");\r\n\r\n const dialogTitle = (account) ? editTitle : addTitle;\r\n var dialogHTML = ``;\r\n\r\n const options: IDialogOptionsJson = {\r\n title: dialogTitle,\r\n dialogHTML: dialogHTML,\r\n dialogId: \"editFoundationAccountDialog\"\r\n };\r\n\r\n const dialogOptions: angular.material.IDialogOptions = {\r\n targetEvent: $event,\r\n escapeToClose: true,\r\n clickOutsideToClose: true,\r\n multiple: true,\r\n template: this.displayService.createDialogWrapper(options),\r\n controller: controller,\r\n controllerAs: \"$ctrl\"\r\n };\r\n\r\n return this.$mdDialog.show(dialogOptions).then((requiresUpdate: boolean) => {\r\n return requiresUpdate;\r\n });\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { DataCacheService } from \"@app/services/caching/data-cache.service\";\r\nimport { Observable, Subject } from \"rxjs\";\r\nimport { map, tap } from \"rxjs/operators\";\r\nimport { IUserGroup } from \"../_models/IUserGroup\";\r\nimport { IUserGroupQueryOptions } from \"../_models/IUserGroupQueryOptions\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UserGroupService {\r\n userGroupSubject = new Subject();\r\n private cacheName: string = \"userGroupsCache\";\r\n\r\n constructor(private readonly http: HttpClient,\r\n private readonly dataCacheService: DataCacheService) { }\r\n\r\n getUserGroups(options: IUserGroupQueryOptions = {}, invalidateCache = false): Observable {\r\n if (options) {\r\n return this.getUserGroupsFromDb(options);\r\n }\r\n\r\n return this.dataCacheService.getOrRequest(this.cacheName, () => this.getUserGroupsFromDb(), { invalidateCache }).pipe(map(groups => this.sortGroupsByDescription(groups)));\r\n }\r\n\r\n getUserGroupsFromDb(options: IUserGroupQueryOptions = {}): Observable {\r\n return this.http.get('/api/usergroup', { params: options as HttpParams }).pipe(map(groups => this.sortGroupsByDescription(groups)));\r\n }\r\n\r\n saveUserGroup(group: IUserGroup): Observable {\r\n return this.http.post('/api/usergroup', group).pipe(\r\n tap(group => {\r\n this.dataCacheService.addOrUpdateItem(group, this.cacheName);\r\n }));\r\n }\r\n\r\n private sortGroupsByDescription(groups: IUserGroup[]): IUserGroup[] {\r\n groups.sort((a, b) => a.Description < b.Description ? -1 : 1);\r\n return groups;\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { IUser } from \"@app/interfaces/IUser\";\r\nimport { DateService, DateUnit } from \"@app/services/date.service\";\r\nimport { combineLatest, forkJoin, Observable, of, Subject } from \"rxjs\";\r\nimport { map, switchMap, take, tap } from \"rxjs/operators\";\r\nimport { IEngineerJobBooking, IEngineerJobBookingWithEngineerMappings } from \"../foundation.interfaces\";\r\nimport { IEngineerJobBookingQueryOptions } from \"../_models/IEngineerJobBookingQueryOptions\";\r\nimport { EngineerJobBookingMappingService } from \"./engineer-job-booking-mapping.service\";\r\nimport { EngineerService } from \"./engineer.service\";\r\nimport { UserGroupService } from \"./user-group.service\";\r\n\r\ninterface IAccountSite {\r\n Id: number;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class EngineerJobBookingService {\r\n\r\n\r\n selectedJobBookingUpdated = new Subject()\r\n jobBookings = new Subject();\r\n\r\n #selectedJobBooking: IEngineerJobBookingWithEngineerMappings;\r\n private allJobBookings: IEngineerJobBookingWithEngineerMappings[];\r\n\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly dateService: DateService,\r\n private readonly engineerService: EngineerService,\r\n private readonly engineerJobBookingMappingService: EngineerJobBookingMappingService,\r\n private readonly userGroupService: UserGroupService) { }\r\n\r\n getEngineeringJobBookings(options: IEngineerJobBookingQueryOptions = {}): Observable {\r\n return this.http.get(`/api/foundation/engineerbookings/`, { params: options as HttpParams });\r\n }\r\n\r\n getEngineeringJobBookingsWithMappings(options: IEngineerJobBookingQueryOptions = {}): Observable {\r\n return combineLatest([\r\n this.getEngineeringJobBookings(options),\r\n this.engineerJobBookingMappingService.getEngineerJobBookingMappings(),\r\n this.engineerService.getEngineers(),\r\n this.userGroupService.getUserGroups()\r\n ]).pipe(\r\n map(([jobBookings, mappings, engineers, userGroups]) => {\r\n const bookings: IEngineerJobBookingWithEngineerMappings[] = jobBookings;\r\n bookings.forEach((booking) => {\r\n booking.mappings = mappings.filter(mapping => mapping.EngineerJobBookingId === booking.Id);\r\n booking.assignedEngineers = [];\r\n if (!booking.mappings.length) {\r\n return;\r\n }\r\n if (booking.mappings.some(mapping => !!mapping.UserGroupId)) {\r\n const groupId = booking.mappings.find(mapping => !!mapping.UserGroupId).UserGroupId;\r\n booking.assignedGroupId = groupId;\r\n booking.assignedGroup = userGroups.find(group => group.Id === groupId);\r\n }\r\n else {\r\n booking.mappings.forEach(mapping => {\r\n const engineer = engineers.find(eng => eng.Id === mapping.UserId);\r\n if (engineer) {\r\n booking.assignedEngineers.push(engineer);\r\n }\r\n })\r\n }\r\n })\r\n if (!options.JobBookingId && !options.JobId) {\r\n this.allJobBookings = bookings;\r\n this.jobBookings.next(this.allJobBookings);\r\n }\r\n return bookings;\r\n }))\r\n }\r\n\r\n\r\n\r\n createUpdateEngineeringJobBooking(booking: IEngineerJobBookingWithEngineerMappings, accountId: number): Observable {\r\n\r\n return this.http.get(`/api/foundation/sites/${accountId}`).pipe(\r\n take(1),\r\n switchMap((sites: IAccountSite[]) => {\r\n if (sites && sites.length > 0) {\r\n booking.SiteId = sites[0].Id;\r\n } else {\r\n booking.SiteId = 30793;\r\n }\r\n\r\n booking.Description = \"Created for Job Access\";\r\n\r\n return this.http.post(`/api/foundation/engineerbookings/`, booking).pipe(tap(newBooking => {\r\n booking.Id = newBooking.Id;\r\n this.updateAllJobBookings(booking);\r\n }));\r\n })\r\n );\r\n }\r\n\r\n getAssignedEngineersForJobBooking(jobBookingId): Observable {\r\n return combineLatest([\r\n this.engineerService.getEngineers(),\r\n this.engineerJobBookingMappingService.getEngineerJobBookingMappings({ EngineerJobBookingId: jobBookingId })\r\n ]).pipe(map(([users, mappings]) => {\r\n if (!mappings.length) {\r\n return [];\r\n }\r\n\r\n let engineers = mappings.map(mapping => {\r\n return users.find(user => user.Id === mapping.UserId);\r\n })\r\n\r\n return engineers;\r\n\r\n }))\r\n }\r\n\r\n getLatestEngineeringJobBookings(): Observable {\r\n const options: IEngineerJobBookingQueryOptions = {\r\n Start: this.dateService.addOrSubtractTime(new Date(), -28, DateUnit.Day),\r\n End: this.dateService.addOrSubtractTime(new Date(), 28, DateUnit.Day)\r\n }\r\n return this.getEngineeringJobBookings(options);\r\n }\r\n\r\n getSelectedJobBooking(jobId: number): Observable {\r\n if (this.#selectedJobBooking?.JobId === jobId) {\r\n return of(this.#selectedJobBooking);\r\n }\r\n\r\n return this.getEngineeringJobBookingsWithMappings({ JobId: jobId }).pipe(map(bookings => bookings[0]));\r\n }\r\n\r\n setSelectedJobBooking(jobBooking: IEngineerJobBookingWithEngineerMappings): void {\r\n this.#selectedJobBooking = jobBooking;\r\n this.selectedJobBookingUpdated.next(this.#selectedJobBooking);\r\n }\r\n\r\n private updateAllJobBookings(booking: IEngineerJobBookingWithEngineerMappings): void {\r\n const existing = this.allJobBookings.findIndex(bk => bk.Id === booking.Id);\r\n if (existing < 0) {\r\n this.allJobBookings.push(booking);\r\n this.jobBookings.next(this.allJobBookings);\r\n return;\r\n }\r\n\r\n this.allJobBookings.splice(existing, 1, booking);\r\n this.jobBookings.next(this.allJobBookings);\r\n }\r\n}\r\n","import { HybridServiceAccessor } from \"@app/common/hybrid-service-accessor\";\r\nimport { ReasonCode } from \"@enums/ReasonCode\";\r\nimport { IPlot, IPlotEvent } from \"@interfaces/IPlot\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { ColourService } from \"@services/colour.service\";\r\nimport { DisplayService, IDialogOptionsJson } from \"@services/display.service\";\r\nimport { GoogleService } from \"@services/google.service\";\r\nimport { GoogleMarkerService, MarkerAnchorPosition } from \"@services/googleMarker.service\";\r\nimport { MapService } from \"@services/map.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport { IPolyline } from \"@typings/google.maps.angular\";\r\nimport * as moment from \"moment\";\r\nimport { VideoStatus } from \"./enums/VideoStatus\";\r\nimport { IVideoEntry } from \"./models/IVideoEntry\";\r\nimport { VideoPlayerResult } from \"./models/video-player-result\";\r\nimport { IAvailableVideoFootageSection } from \"./requestVideo/requestVideo.service\";\r\nimport { VideoEntryService } from \"./services/video-entry.service\";\r\n\r\nexport interface IRequestVideoDialogOptions {\r\n vehicle: IVehicle;\r\n requestVideoTime: moment.Moment;\r\n requestLengthInSeconds?: number;\r\n\r\n onRequestVideoCancelled?: () => void;\r\n onRequestVideoSent?: () => void;\r\n}\r\n\r\nexport class CameraDisplayService {\r\n private readonly videoEntryService = new HybridServiceAccessor(\"videoEntryService\", this.$injector);\r\n\r\n static $inject = [\"$q\", \"$mdDialog\", \"$mdToast\", \"googleMarkerService\", \"displayService\", \"googleService\", \"mapService\", \"colourService\", \"veriDate\", \"translationService\", \"$injector\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $mdDialog: angular.material.IDialogService,\r\n private readonly $mdToast: angular.material.IToastService,\r\n private readonly googleMarkerService: GoogleMarkerService,\r\n private readonly displayService: DisplayService,\r\n private readonly googleService: GoogleService,\r\n private readonly mapService: MapService,\r\n private readonly colourService: ColourService,\r\n private readonly veriDate: VeriDate,\r\n private readonly translationService: TranslationService,\r\n private readonly $injector: angular.auto.IInjectorService,) {\r\n }\r\n\r\n createEventFromVideo(videoEntry: IVideoEntry): IPlotEvent {\r\n const plotEvent = this.googleMarkerService.createEventMarker(\r\n this.createPlotFromGpsData(videoEntry),\r\n {\r\n label: this.translationService.t(`cameraDisplayService.videoEventLabel`, videoEntry.displayEventCode),\r\n markerClass: \"marker-event-video\",\r\n subIcon: \"videocam\",\r\n showLabel: false,\r\n imageUrl: videoEntry.Status === VideoStatus.Downloaded ? videoEntry.thumbnailUrl : null,\r\n anchorPosition: MarkerAnchorPosition.Top,\r\n }, videoEntry);\r\n\r\n return plotEvent;\r\n }\r\n\r\n showVideoPlayerById(entryId: number, $event: MouseEvent): angular.IPromise {\r\n const promise = this.videoEntryService.service.getVideoEntry(entryId) as angular.IPromise;\r\n\r\n return promise.then(entry => {\r\n return this.showVideoPlayer(entry, $event).then(x => x.requiresUpdate || x.statusChanged);\r\n });\r\n }\r\n\r\n showVideoPlayer(videoEntry: IVideoEntry, $event: MouseEvent = null, showCoaching = false): angular.IPromise {\r\n let statusChanged = false;\r\n\r\n const controller = ($mdDialog: angular.material.IDialogService) => {\r\n return {\r\n hide: (requiresUpdate: boolean) => { $mdDialog.hide(requiresUpdate); },\r\n onStatusUpdate: () => { statusChanged = true },\r\n selectedVideo: videoEntry,\r\n showCoaching: showCoaching\r\n }\r\n };\r\n\r\n controller.$inject = [\"$mdDialog\"];\r\n\r\n const dialogHTML = `\r\n \r\n `;\r\n\r\n const dialogTitle = `${this.veriDate.formatDate(videoEntry?.VideoStartTime)}`;\r\n\r\n const eventDescription = videoEntry?.mp4VideoUrl \r\n ? this.translationService.t(\"cameraDisplayService.video\") \r\n : this.translationService.t(\"cameraDisplayService.event\");\r\n\r\n const vehicleVideoCard =\r\n `${videoEntry?.displayEventCode} ${eventDescription}\r\n \r\n `;\r\n\r\n const options: IDialogOptionsJson = {\r\n title: dialogTitle,\r\n dialogHTML: dialogHTML,\r\n dialogId: \"playVideoDialog\",\r\n afterTitle: vehicleVideoCard\r\n };\r\n\r\n const dialogOptions: angular.material.IDialogOptions = {\r\n targetEvent: $event,\r\n escapeToClose: true,\r\n clickOutsideToClose: true,\r\n multiple: true,\r\n template: this.displayService.createDialogWrapper(options), // Use scope\r\n controller: controller,\r\n controllerAs: \"$ctrl\"\r\n };\r\n\r\n return this.$mdDialog.show(dialogOptions).then((requiresUpdate: boolean) => {\r\n return { requiresUpdate, statusChanged };\r\n });\r\n }\r\n\r\n showRequestVideoDialog($event: MouseEvent, options: IRequestVideoDialogOptions) {\r\n const dialogOptions: IDialogOptionsJson = {\r\n title: this.translationService.t(`Videos.RequestVideo`),\r\n dialogHTML: ``,\r\n dialogId: `requestVideo2Dialog`,\r\n bindings: {\r\n vehicle: options?.vehicle,\r\n requestVideoTime: options?.requestVideoTime,\r\n requestLengthInSeconds: options?.requestLengthInSeconds,\r\n onRequestVideoCancelled: () => {\r\n options?.onRequestVideoCancelled();\r\n },\r\n onRequestVideoSent: () => {\r\n options?.onRequestVideoSent();\r\n },\r\n },\r\n event: $event,\r\n customClass: `request-video-dialog`\r\n };\r\n\r\n this.displayService.showDialog(dialogOptions);\r\n }\r\n\r\n showNewVideoToast(videoEntry: IVideoEntry) {\r\n const controller = () => {\r\n return {\r\n playVideo: (video: IVideoEntry, $event: MouseEvent) => {\r\n this.$mdToast.hide();\r\n this.showVideoPlayer(video, $event);\r\n },\r\n video: videoEntry\r\n }\r\n };\r\n\r\n var options: angular.material.IToastOptions = {\r\n controller: controller,\r\n controllerAs: \"$ctrl\",\r\n hideDelay: /*5 **/ 20 * 1000,\r\n position: \"bottom right\",\r\n template: require(\"./videoToast.html\")\r\n };\r\n\r\n this.$mdToast.show(options);\r\n }\r\n\r\n createPolylinesFromPlots(plots: IPlot[] = [], addSnapping = true): angular.IPromise {\r\n const createdPolyline = this.mapService.createPolylineFromPlots(plots);\r\n\r\n if (addSnapping) {\r\n return this.addSnapping(createdPolyline);\r\n }\r\n\r\n return this.$q.resolve(createdPolyline);\r\n }\r\n\r\n setFootagePercentages(footage: IAvailableVideoFootageSection[]) {\r\n if (!footage?.length) {\r\n return;\r\n }\r\n\r\n footage.forEach(footage => {\r\n var startP = this.getFootagePositionFromTime(footage.startTime);\r\n var endP = this.getFootagePositionFromTime(footage.endTime);\r\n\r\n footage.startPercentage = startP;\r\n footage.widthPercentage = endP - startP;\r\n\r\n // Ensure we cannot go below 0% left\r\n if (footage.startPercentage < 0) {\r\n footage.startPercentage = 0;\r\n }\r\n\r\n // Ensure that we cannot go over 100%\r\n if (footage.startPercentage + footage.widthPercentage > 100) {\r\n footage.widthPercentage -= footage.startPercentage + footage.widthPercentage - 100;\r\n }\r\n });\r\n }\r\n\r\n private getFootagePositionFromTime(time: moment.Moment): number {\r\n const percentPerMinute = 100 / (24 * 60);\r\n\r\n let position = this.veriDate.getMinuteOfDayFromMoment(time) * percentPerMinute;\r\n\r\n position = Math.max(0, position);\r\n position = Math.min(100, position);\r\n\r\n return position;\r\n }\r\n\r\n private addSnapping(polyline: IPolyline): angular.IPromise {\r\n\r\n if (polyline.path.length > 5) {\r\n polyline.path = [polyline.path[0], polyline.path[polyline.path.length - 1]];\r\n }\r\n\r\n return this.googleService.snapAndInterpolatePath(polyline.path).then(path => {\r\n polyline.path = path;\r\n return polyline;\r\n }).catch(() => {\r\n console.error(\"Unable to snap to road use return default\");\r\n return polyline;\r\n });\r\n }\r\n\r\n private createPolyline(plots: IPlot[]): IPolyline {\r\n const lineColor = this.colourService.redColor;\r\n const latLngArray = this.mapService.convertPlotsToGoogleLatLng(plots);\r\n const newPolyline = this.mapService.createPolyline(0, latLngArray, lineColor, null, false); //!relevant\r\n this.mapService.addDirectionArrows(newPolyline, lineColor);\r\n\r\n return newPolyline;\r\n }\r\n\r\n private createPlotFromGpsData(videoEntry: IVideoEntry): IPlot {\r\n let heading = 0;\r\n let velocity = 0;\r\n\r\n if (videoEntry.VideoExtensionData && videoEntry.VideoExtensionData.VideoGpsData && videoEntry.VideoExtensionData.VideoGpsData.length !== 0) {\r\n heading = videoEntry.VideoExtensionData.VideoGpsData[0].Heading;\r\n velocity = videoEntry.VideoExtensionData.VideoGpsData[0].Speed;\r\n }\r\n\r\n return {\r\n Direction: heading,\r\n Latitude: videoEntry.Latitude,\r\n Longitude: videoEntry.Longitude,\r\n Reason: ReasonCode.CameraEvent,\r\n Velocity: velocity,\r\n Utc: moment(videoEntry.EventTimeUtc).toString(),\r\n UtcMoment: moment(videoEntry.EventTimeUtc),\r\n Id: Math.floor(Math.random() * 1000),\r\n LocationInformation: {\r\n LocationDescription: videoEntry.PlaceName,\r\n GeofenceIds: [],\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 { IApiMigrationDevice } from \"@app/main/modules/foundation/_routes/rv-lite/commserver-migration/commserver-migration.component\";\r\nimport { DataCacheService } from \"@app/services/caching/data-cache.service\";\r\nimport { Observable, Subject } from \"rxjs\";\r\nimport { tap } from \"rxjs/operators\";\r\nimport { ICameraConfiguration } from \"../_models/ICameraConfiguration\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ConfigManagerService {\r\n private configFileCacheName: string = \"configFilesCache\";\r\n\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly dataCacheService: DataCacheService) { }\r\n\r\n getConfigs(invalidateCache = false): Observable {\r\n return this.dataCacheService.getOrRequest(this.configFileCacheName, () => this.getConfigsFromDb(), { invalidateCache });\r\n }\r\n\r\n saveConfig(config: ICameraConfiguration): Observable {\r\n return this.http.post(`/api/cameras/commserver/configurations`, config).pipe(tap(config => {\r\n this.dataCacheService.addOrUpdateItem(config, this.configFileCacheName);\r\n }))\r\n }\r\n\r\n getMigrationConfigIds(): Observable {\r\n return this.http.get(`/api/cameras/commserver/migration/configids`);\r\n }\r\n\r\n applyMigration(migrationDevices: IApiMigrationDevice[]): Observable {\r\n return this.http.post(`/api/cameras/commserver/migration`, migrationDevices);\r\n }\r\n\r\n private getConfigsFromDb(): Observable {\r\n return this.http.get(`/api/cameras/commserver/configurations`);\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { VehicleService } from \"@app/services/vehicle.service\";\r\nimport { lastValueFrom } from \"rxjs\";\r\nimport { IDiagnosticRecord } from \"./_models/IDiagnosticRecord\";\r\nimport { IDiagnosticTroubleCode } from \"./_models/IDiagnosticTroubleCode\";\r\nimport { IVehicleDiagnosticRecords } from \"./_models/IVehicleDiagnosticRecords\";\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class FaultCodesService {\r\n constructor(\r\n private readonly httpClient: HttpClient,\r\n private readonly vehicleService: VehicleService\r\n ) { }\r\n\r\n getDiagnosticTroubleCodes(): Promise {\r\n const options = { params: {} as HttpParams }\r\n\r\n options.params[\"minsToLive\"] = 60 * 24;\r\n\r\n return lastValueFrom(this.httpClient.get(\"/api/vehiclediagnostics/codes\", options));\r\n }\r\n\r\n getReeferDiagnosticTroubleCodes(): Promise {\r\n const options = { params: {} as HttpParams }\r\n\r\n options.params[\"minsToLive\"] = 60 * 24;\r\n\r\n return lastValueFrom(this.httpClient.get(\"/api/vehiclediagnostics/codes/reefer\", options));\r\n }\r\n\r\n getLastDiagnosticRecords(invalidateCache = false): Promise {\r\n const options = { params: {} as HttpParams }\r\n\r\n options.params[\"minsToLive\"] = 30;\r\n options.params[\"invalidateCache\"] = invalidateCache;\r\n\r\n return lastValueFrom(this.httpClient.get(\"/api/vehiclediagnostics/last\", options));\r\n }\r\n\r\n\r\n getActiveDiagnosticRecords(invalidateCache = false): Promise {\r\n const options = { params: {} as HttpParams }\r\n\r\n options.params[\"minsToLive\"] = 30;\r\n options.params[\"invalidateCache\"] = invalidateCache;\r\n\r\n return lastValueFrom(this.httpClient.get(\"/api/vehiclediagnostics/active\", options));\r\n }\r\n\r\n getActiveDiagnosticRecordsForVehicle(vehicleId: number, invalidateCache = false): Promise {\r\n const options = { params: {} as HttpParams }\r\n\r\n options.params[\"minsToLive\"] = 30;\r\n options.params[\"invalidateCache\"] = invalidateCache;\r\n\r\n return lastValueFrom(this.httpClient.get(`/api/vehiclediagnostics/active/${vehicleId}`, options));\r\n }\r\n\r\n getDiagnosticRecordsForVehicle(vehicleId: number, invalidateCache = false): Promise {\r\n const options = { params: {} as HttpParams }\r\n\r\n options.params[\"minsToLive\"] = 30;\r\n options.params[\"invalidateCache\"] = invalidateCache;\r\n\r\n return lastValueFrom(this.httpClient.get(`/api/vehiclediagnostics/${vehicleId}`, options));\r\n }\r\n\r\n getLastAndActiveDiagnosticRecords(invalidateCache = false): Promise {\r\n const vehiclePromise = this.vehicleService.getVehicles({ includePeripheralMappings: true }) as Promise;\r\n const activeRecordsPromise = this.getActiveDiagnosticRecords(invalidateCache);\r\n const lastRecordsPromise = this.getLastDiagnosticRecords(invalidateCache);\r\n\r\n return Promise\r\n .all([vehiclePromise, activeRecordsPromise, lastRecordsPromise])\r\n .then(([vehicles, activeRecords, lastRecords]) => {\r\n const vehicleDiagnosticRecords: IVehicleDiagnosticRecords[] = [];\r\n\r\n vehicles.forEach(vehicle => {\r\n let vehicleRecord = vehicleDiagnosticRecords.find(x => x.vehicle.Id === vehicle.Id)\r\n\r\n if (!vehicleRecord) {\r\n vehicleRecord = this.getEmptyDiagnosticRecords(vehicle)\r\n vehicleDiagnosticRecords.push(vehicleRecord);\r\n }\r\n\r\n this.findAndAddRecordsForVehicle(vehicleRecord, activeRecords);\r\n this.findAndAssignLastRecord(vehicleRecord, lastRecords)\r\n });\r\n\r\n return vehicleDiagnosticRecords;\r\n })\r\n }\r\n\r\n getLastAndActiveDiagnosticRecordsForVehicle(vehicleId: number, invalidateCache = false): Promise {\r\n const vehiclePromise = this.vehicleService.getVehicle(vehicleId, { includePeripheralMappings: true }) as Promise;\r\n const activeRecordsPromise = this.getActiveDiagnosticRecords(invalidateCache);\r\n const lastRecordsPromise = this.getLastDiagnosticRecords(invalidateCache);\r\n\r\n return Promise\r\n .all([vehiclePromise, activeRecordsPromise, lastRecordsPromise])\r\n .then(([vehicle, activeRecords, lastRecords]) => {\r\n const vehicleRecord = this.getEmptyDiagnosticRecords(vehicle);\r\n\r\n this.findAndAddRecordsForVehicle(vehicleRecord, activeRecords);\r\n this.findAndAssignLastRecord(vehicleRecord, lastRecords)\r\n\r\n return vehicleRecord;\r\n })\r\n }\r\n\r\n getVehicleDiagnosticRecords(vehicleId: number, invalidateCache = false): Promise {\r\n const codesPromise = this.getDiagnosticTroubleCodes();\r\n const recordPromise = this.getDiagnosticRecordsForVehicle(vehicleId, invalidateCache);\r\n\r\n return Promise\r\n .all([codesPromise, recordPromise])\r\n .then(([codes, records]) =>\r\n records.map(record => {\r\n const code = codes.find(x => x.Id == record.DiagnosticTroubleCodeId);\r\n record.description = code ? code.Description : null;\r\n\r\n return record;\r\n })\r\n );\r\n }\r\n\r\n private getEmptyDiagnosticRecords(vehicle: IVehicle): IVehicleDiagnosticRecords {\r\n return {\r\n Id: vehicle.Id,\r\n vehicle,\r\n activeRecords: [],\r\n lastRecord: null,\r\n tagIds: []\r\n }\r\n }\r\n\r\n private findAndAddRecordsForVehicle(item: IVehicleDiagnosticRecords, activeRecords: IDiagnosticRecord[]): void {\r\n const activeRecordsForVehicle = activeRecords.filter(x => x.VehicleId === item.Id);\r\n item.activeRecords.push(...activeRecordsForVehicle);\r\n }\r\n\r\n private findAndAssignLastRecord(item: IVehicleDiagnosticRecords, lastRecords: IDiagnosticRecord[]): void {\r\n const matchingRecords = lastRecords.filter(x => x.VehicleId === item.Id);\r\n\r\n if (matchingRecords.length > 0) {\r\n item.lastRecord = matchingRecords[matchingRecords.length - 1];\r\n }\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { MultiStateInputCategory } from \"@temperature/_enums/reefer/MultiStateInputCategory.enum\";\r\nimport { ReeferEngineModeCategory } from \"@temperature/_enums/reefer/ReeferEngineModeCategory.enum\";\r\nimport { ReeferEngineSpeedModeCategory } from \"@temperature/_enums/reefer/ReeferEngineSpeedModeCategory.enum\";\r\nimport { ReeferInterfaceStatusCategory } from \"@temperature/_enums/reefer/ReeferInterfaceStatusCategory.enum\";\r\nimport { ReeferOperatingModeCategory } from \"@temperature/_enums/reefer/ReeferOperatingModeCategory.enum\";\r\nimport { ReeferZoneOperatingModeCategory } from \"@temperature/_enums/reefer/ReeferZoneOperatingModeCategory.enum\";\r\nimport { ILatestMultiStateInputRecordQueryOptions } from \"@temperature/_models/multiStateInputs/ILatestMultiStateInputRecordQueryOptions\";\r\nimport { IMultiStateInput, IMultiStateInputWithHistories } from \"@temperature/_models/multiStateInputs/IMultiStateInput\";\r\nimport { IMultiStateInputHistory } from \"@temperature/_models/multiStateInputs/IMultiStateInputHistory\";\r\nimport { IMultiStateInputHistoryQueryOptions } from \"@temperature/_models/multiStateInputs/IMultiStateInputHistoryQueryOptions\";\r\nimport { IMultiStateInputQueryOptions } from \"@temperature/_models/multiStateInputs/IMultiStateInputQueryOptions\";\r\nimport { IMultiStateInputRecord } from \"@temperature/_models/multiStateInputs/IMultiStateInputRecord\";\r\nimport { Observable } from \"rxjs\";\r\nimport { IReeferWithMappings } from \"../_models/reefer/IReeferWithMappings\";\r\nimport { ReeferService } from \"./reefer.service\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MultiStateInputService {\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly reeferService: ReeferService,\r\n private readonly translationService: TranslationService) {\r\n }\r\n\r\n getMultiStateInputHistories(queryOptions: IMultiStateInputHistoryQueryOptions = {}): Observable {\r\n return this.http.get(`/api/multistateinputs/history`, { params: queryOptions as HttpParams });\r\n }\r\n\r\n getMultiStateInputs(queryOptions: IMultiStateInputQueryOptions = {}): Observable {\r\n return this.http.get(`/api/multistateinputs`, { params: queryOptions as HttpParams });\r\n }\r\n\r\n getLatestMultiStateInputRecords(queryOptions: ILatestMultiStateInputRecordQueryOptions = {}): Observable {\r\n return this.http.get(`/api/multistateinputs/records/latest`, { params: queryOptions as HttpParams });\r\n }\r\n\r\n getVehicleMultiStateInputHistory(vehicleId: number, inputHistory: IMultiStateInputRecord[]): IMultiStateInputRecord[] {\r\n if (!inputHistory || !inputHistory.length) {\r\n return;\r\n }\r\n\r\n const history = inputHistory.filter(item => {\r\n return item.VehicleId === vehicleId;\r\n });\r\n\r\n return history;\r\n }\r\n\r\n getTriggerStateName(triggerState: number, multiStateInputCategory: MultiStateInputCategory): string {\r\n if (!triggerState || !multiStateInputCategory && multiStateInputCategory != 0) {\r\n return;\r\n }\r\n\r\n switch (multiStateInputCategory) {\r\n case MultiStateInputCategory.ReeferEngineMode:\r\n return this.translationService.tEnum(ReeferEngineModeCategory, 'ReeferEngineModeCategory', triggerState);\r\n\r\n case MultiStateInputCategory.ReeferEngineSpeedMode:\r\n return this.translationService.tEnum(ReeferEngineSpeedModeCategory, 'ReeferEngineSpeedModeCategory', triggerState);\r\n\r\n case MultiStateInputCategory.ReeferInterfaceStatus:\r\n return this.translationService.tEnum(ReeferInterfaceStatusCategory, 'ReeferInterfaceStatusCategory', triggerState);\r\n\r\n case MultiStateInputCategory.ReeferOperatingMode:\r\n return this.translationService.tEnum(ReeferOperatingModeCategory, 'ReeferOperatingModeCategory', triggerState);\r\n\r\n case MultiStateInputCategory.ReeferZoneOperatingMode:\r\n return this.translationService.tEnum(ReeferZoneOperatingModeCategory, 'ReeferZoneOperatingModeCategory', triggerState);\r\n }\r\n }\r\n\r\n mapHistoriesToInputs(inputs: IMultiStateInputWithHistories[], histories: IMultiStateInputHistory[]): void {\r\n if (!inputs || !histories) {\r\n return;\r\n }\r\n inputs.forEach(input => {\r\n input.histories = histories.filter(history => history.MultiStateInputId == input.Id);\r\n })\r\n }\r\n\r\n getModes(reeferUnit: IReeferWithMappings, multiStateInputRecords: IMultiStateInputRecord[]) {\r\n const hardwareSource = this.reeferService.getHardwareSource(reeferUnit.Make);\r\n reeferUnit.operatingMode = multiStateInputRecords.find(record => record.Category == MultiStateInputCategory.ReeferOperatingMode && record.Source == hardwareSource)?.State;\r\n reeferUnit.engineMode = multiStateInputRecords.find(record => record.Category == MultiStateInputCategory.ReeferEngineMode && record.Source == hardwareSource)?.State;\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { ITimelineEntryWithData } from \"@app/directives/_veri/v-timeline/v-timeline.component\";\r\nimport { LatestSensorDataValues, SensorDataValueType } from \"@app/interfaces/ISensorDataValue\";\r\nimport { IDiagnosticRecord } from \"@app/main/components/maintenance/faultCodes/_models/IDiagnosticRecord\";\r\nimport { IDiagnosticTroubleCode } from \"@app/main/components/maintenance/faultCodes/_models/IDiagnosticTroubleCode\";\r\nimport { IVehicleWithSensorDataValues } from \"@app/main/components/maintenance/sensorData/_models/IVehicleWithSensorData\";\r\nimport { DateService } from \"@app/services/date.service\";\r\nimport { HardwareSource } from \"@interfaces/IVehicleInput\";\r\nimport { NavigationService } from \"@services/navigation.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { MultiStateInputCategory } from \"@temperature/_enums/reefer/MultiStateInputCategory.enum\";\r\nimport { ReeferMake } from \"@temperature/_enums/reefer/ReeferMake.enum\";\r\nimport { IMultiStateInput, IMultiStateInputWithHistories } from \"@temperature/_models/multiStateInputs/IMultiStateInput\";\r\nimport { IMultiStateInputHistory } from \"@temperature/_models/multiStateInputs/IMultiStateInputHistory\";\r\nimport { IReefer } from \"@temperature/_models/reefer/IReefer\";\r\nimport { IReeferQueryOptions } from \"@temperature/_models/reefer/IReeferQueryOptions\";\r\nimport { IZoneWithProbes } from \"@temperature/_models/temperature/ITemperatureZone\";\r\nimport { DiagnosticTroubleCodeCategory } from \"@temperature/_models/troubleCodes/IReeferTroubleCodeHistory\";\r\nimport { Observable } from \"rxjs\";\r\nimport { IReeferWithMappings } from \"../_models/reefer/IReeferWithMappings\";\r\nimport { ITemperatureRecord } from \"../_models/temperature/ITemperatureRecord\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ReeferService {\r\n\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly dateService: DateService,\r\n private readonly navigationService: NavigationService,\r\n private readonly translationService: TranslationService) {\r\n }\r\n\r\n getReeferData(queryOptions: IReeferQueryOptions = {}): Observable {\r\n return this.http.get('/api/reefer', { params: queryOptions as HttpParams });\r\n }\r\n\r\n santitiseReeferSerialNumber(reeferUnit: IReefer) {\r\n if (!reeferUnit.SerialNumber) {\r\n return;\r\n }\r\n\r\n reeferUnit.SerialNumber = reeferUnit.SerialNumber.replace(/[^a-zA-Z0-9 -]/g, \"\").trim();\r\n\r\n const allOne = str => /^(.)\\1*$/.test(str)\r\n\r\n if (allOne(reeferUnit.SerialNumber)) {\r\n reeferUnit.SerialNumber = null;\r\n }\r\n }\r\n\r\n openReeferDetailsDialogById(vehicleId: number, parentStateName = \"app.temperature.reefer\"): void {\r\n this.navigationService.go(`${parentStateName}.view`, { vehicleId: vehicleId });\r\n }\r\n\r\n openReeferDetailsDialog(vehicleId: number, parentStateName = \"app.temperature.reefer\"): void {\r\n this.openReeferDetailsDialogById(vehicleId, parentStateName);\r\n }\r\n\r\n getLatestReeferMode(inputHistories: IMultiStateInputHistory[], multiStateInputs: IMultiStateInput[], modeType: MultiStateInputCategory, source: HardwareSource): number {\r\n if (!inputHistories || !inputHistories.length) {\r\n return;\r\n }\r\n\r\n const input = multiStateInputs.find(input => input.Category === modeType && input.Source === source);\r\n\r\n if (!input) {\r\n return;\r\n }\r\n\r\n const latestHistory = inputHistories.find(history => history.MultiStateInputId === input.Id);\r\n\r\n return latestHistory?.TriggerState;\r\n }\r\n\r\n getLastUpdated(zones: IZoneWithProbes[], diagnosticRecords: IDiagnosticRecord[]): Date {\r\n if (!zones?.length) {\r\n return;\r\n }\r\n\r\n const latestUpdates = [];\r\n zones.forEach(zone => {\r\n zone.probes.forEach(probe => {\r\n probe.latestRecord && latestUpdates.push(new Date(probe.latestRecord?.Timestamp).getTime());\r\n })\r\n });\r\n\r\n if (diagnosticRecords?.length) {\r\n diagnosticRecords.forEach(record => {\r\n latestUpdates.push(new Date(record.DateReceived).getTime());\r\n })\r\n }\r\n\r\n if (latestUpdates.length > 0) {\r\n return new Date(Math.max(...latestUpdates));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n filterReeferErrorCodes(diagnosticRecords: IDiagnosticRecord[]): IDiagnosticRecord[] {\r\n return diagnosticRecords.filter(record => {\r\n return record.Category === DiagnosticTroubleCodeCategory.Carrier || record.Category === DiagnosticTroubleCodeCategory.Ibox;\r\n })\r\n }\r\n\r\n getActiveReeferErrors(diagnosticRecords: IDiagnosticRecord[], troubleCodes: IDiagnosticTroubleCode[]): IDiagnosticTroubleCode[] {\r\n if (!diagnosticRecords?.length || !troubleCodes?.length) {\r\n return [];\r\n }\r\n\r\n const currentReeferActiveRecords = this.filterReeferErrorCodes(diagnosticRecords);\r\n if (!currentReeferActiveRecords.length) {\r\n return [];\r\n }\r\n\r\n const currentActiveTroubleCodes: IDiagnosticTroubleCode[] = [];\r\n\r\n currentReeferActiveRecords.forEach(record => {\r\n const errorCode = troubleCodes.find(code => code.Id === record.DiagnosticTroubleCodeId);\r\n if (!errorCode) {\r\n return;\r\n }\r\n\r\n errorCode.dateRaised = record.DateReceived;\r\n if (!errorCode.Description) {\r\n errorCode.Description = this.translationService.t('ReeferList.UnknownError');\r\n }\r\n\r\n currentActiveTroubleCodes.push(errorCode);\r\n })\r\n\r\n currentActiveTroubleCodes.sort((a, b) => {\r\n return b.AlarmLevel - a.AlarmLevel;\r\n })\r\n\r\n return currentActiveTroubleCodes;\r\n }\r\n\r\n getHardwareSource(make: ReeferMake): HardwareSource {\r\n if (!make) {\r\n return;\r\n }\r\n\r\n switch (make) {\r\n case ReeferMake.IBOX:\r\n return HardwareSource.Ibox;\r\n\r\n case ReeferMake.Carrier:\r\n return HardwareSource.Carrier\r\n }\r\n }\r\n\r\n getOperatingModeForTemperatureRecord(record: ITemperatureRecord, multiStateInputs: IMultiStateInputWithHistories[], zoneId: number): IMultiStateInputHistory {\r\n if (!multiStateInputs || !record) {\r\n return;\r\n }\r\n const input = multiStateInputs.find(input => input.ZoneId === zoneId);\r\n\r\n const historiesAtTime = input.histories.filter(history => {\r\n return new Date(history.StartTime).getTime() < new Date(record.Timestamp).getTime();\r\n });\r\n\r\n historiesAtTime.sort((a, b) => {\r\n return new Date(b.StartTime).getTime() - new Date(a.StartTime).getTime();\r\n })\r\n\r\n if (historiesAtTime[0]?.EndTime && new Date(historiesAtTime[0]?.EndTime).getTime() < new Date(record.Timestamp).getTime()) {\r\n return;\r\n }\r\n\r\n return historiesAtTime[0];\r\n }\r\n\r\n setupSensorDataForReefer(reeferUnit: IReeferWithMappings, vehicle: IVehicleWithSensorDataValues, sensorDataValues: LatestSensorDataValues[]): void {\r\n reeferUnit.vehicle = vehicle;\r\n reeferUnit.vehicle.latestSensorDataValues = sensorDataValues.find(data => data.vehicleId === reeferUnit.VehicleId);\r\n reeferUnit.fuelLevel = Math.round(reeferUnit.vehicle.latestSensorDataValues?.getValue(SensorDataValueType.PrimaryAuxEngineFuelLevel));\r\n if (reeferUnit.fuelLevel > 100) {\r\n reeferUnit.fuelLevel = null; // Units without fuel sensors give an error code, usually 127.5\r\n }\r\n reeferUnit.voltage = Math.round(reeferUnit.vehicle.latestSensorDataValues?.getValue(SensorDataValueType.PrimaryAuxBatteryVoltage));\r\n reeferUnit.engineHours = Math.round(reeferUnit.vehicle.latestSensorDataValues?.getValue(SensorDataValueType.PrimaryAuxEngineOnDuration)) / 3600;\r\n reeferUnit.electricHours = Math.round(reeferUnit.vehicle.latestSensorDataValues?.getValue(SensorDataValueType.PrimaryAuxElectricOnDuration)) / 3600;\r\n reeferUnit.standbyDuration = Math.round(reeferUnit.vehicle.latestSensorDataValues?.getValue(SensorDataValueType.PrimaryAuxStandbyOnDuration)) / 3600;\r\n }\r\n\r\n createTimelineEntriesForDiagnosticErrors(diagnosticRecords: IDiagnosticRecord[], historyStartTime: Date): ITimelineEntryWithData[] {\r\n const timelineEntries: ITimelineEntryWithData[] = [];\r\n\r\n diagnosticRecords.forEach(record => {\r\n if (this.dateService.date1IsAfterDate2(record.DateReceived, historyStartTime)) {\r\n timelineEntries.push({\r\n icon: \"error\",\r\n date: record.DateReceived as any,\r\n largeDetails: {\r\n title: this.translationService.t(\"ReeferDetail.ErrorRaised\"),\r\n text: record.description\r\n }\r\n });\r\n\r\n if (record.DateCleared) {\r\n timelineEntries.push({\r\n icon: \"check\",\r\n date: record.DateCleared as any,\r\n largeDetails: {\r\n title: this.translationService.t(\"ReeferDetail.ErrorCleared\"),\r\n text: record.description\r\n }\r\n });\r\n }\r\n }\r\n });\r\n\r\n return timelineEntries;\r\n }\r\n}\r\n","import { DateService } from \"@app/services/date.service\";\r\nimport { IUser } from \"@interfaces/IUser\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { IDateQueryOptions } from \"@services/accelerometerRecord.service\";\r\nimport { CacheService } from \"@services/cache.Service\";\r\nimport { MessageDialogService } from \"@services/messageDialog.service\";\r\nimport { NavigationService } from \"@services/navigation.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport { TemperatureService } from \"@temperature/_services/temperature.service\";\r\nimport { Subject } from \"rxjs\";\r\nimport { AlertReviewStatus } from \"src/app/main/modules/alerts/_enums/AlertReviewStatus.enums\";\r\nimport { AlertCategory } from \"src/app/main/modules/alerts/_enums/alerts.enums\";\r\nimport { IAlertRule, IAlertRuleRecord } from \"src/app/main/modules/alerts/_models/alerts.interfaces\";\r\nimport { IAlertReviewEvent } from \"src/app/main/modules/alerts/_models/IAlertReviewEvent\";\r\nimport { IAlertReviewHistory } from \"src/app/main/modules/alerts/_models/IAlertReviewHistory\";\r\n\r\nexport interface IReviewHistoryQueryOptions extends IDateQueryOptions {\r\n Id?: number;\r\n AlertRecordId?: number;\r\n AlertRuleId?: number;\r\n VehicleId?: number;\r\n}\r\n\r\nexport interface IReviewEventQueryOptions extends IDateQueryOptions {\r\n Id?: number;\r\n AlertReviewHistoryId?: number;\r\n VehicleId?: number;\r\n UserId?: number;\r\n}\r\n\r\nexport class AlertReviewService {\r\n\r\n alertReviewHistoryUpdated = new Subject();\r\n alertReviewHistoryUpdated$ = this.alertReviewHistoryUpdated.asObservable();\r\n\r\n private alertReviewHistoryCache = \"alertReviewHistoryCache\";\r\n private alertEventsCache = \"alertEventsCache\";\r\n\r\n static $inject = [\"$http\", \"$q\", \"cacheService\", \"messageDialogService\", \"navigationService\", \"temperatureService\", \"translationService\", \"vehicleService\", \"dateService\"];\r\n\r\n constructor(\r\n private readonly $http: angular.IHttpService,\r\n private readonly $q: angular.IQService,\r\n private readonly cacheService: CacheService,\r\n private readonly messageDialogService: MessageDialogService,\r\n private readonly navigationService: NavigationService,\r\n private readonly temperatureService: TemperatureService,\r\n private readonly translationService: TranslationService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly dateService: DateService\r\n ) {\r\n this.cacheService.createCache(this.alertReviewHistoryCache, { maxAge: 30 * 60 * 1000 });\r\n this.cacheService.createCache(this.alertEventsCache, { maxAge: 30 * 60 * 1000 });\r\n }\r\n\r\n emitAlertReviewHistoryUpdate(alertReviewHistory: IAlertReviewHistory): void {\r\n this.alertReviewHistoryUpdated.next(alertReviewHistory);\r\n }\r\n\r\n getAlertReviewHistory(queryOptions?: IReviewHistoryQueryOptions): angular.IPromise {\r\n return this.cacheService.getOrRetrieveData(this.alertReviewHistoryCache, () => this.getAlertReviewHistoryFromDatabase(queryOptions), queryOptions?.invalidateCache);\r\n }\r\n\r\n getAlertReviewHistoryFromDatabase(queryOptions?: IReviewHistoryQueryOptions): angular.IPromise {\r\n if (queryOptions.Start) {\r\n queryOptions.Start = new Date(queryOptions.Start).toISOString();\r\n }\r\n\r\n if (queryOptions.End) {\r\n queryOptions.End = new Date(queryOptions.End).toISOString();\r\n }\r\n return this.$http({\r\n url: `/api/alertreview/histories`,\r\n method: \"GET\",\r\n params: queryOptions\r\n }).then((response: angular.IHttpResponse) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getAlertReviewEvents(queryOptions: IReviewEventQueryOptions): angular.IPromise {\r\n\r\n return this.cacheService.getOrRetrieveData(this.alertEventsCache, () => this.getAlertReviewEventsFromDatabase(queryOptions), queryOptions.invalidateCache);\r\n }\r\n\r\n getAlertReviewEventsFromDatabase(queryOptions: IReviewEventQueryOptions): angular.IPromise {\r\n if (queryOptions.Start) {\r\n queryOptions.Start = new Date(queryOptions.Start).toISOString();\r\n }\r\n\r\n if (queryOptions.End) {\r\n queryOptions.End = new Date(queryOptions.End).toISOString();\r\n }\r\n\r\n return this.$http({\r\n url: `/api/alertreview/events`,\r\n method: \"GET\",\r\n params: queryOptions\r\n }).then((response: angular.IHttpResponse) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n addAlertReviewEvent(event: IAlertReviewEvent): angular.IPromise {\r\n return this.$http({\r\n url: `/api/alertreview/events`,\r\n method: \"POST\",\r\n data: event\r\n }).then((response: angular.IHttpResponse) => {\r\n this.cacheService.addOrUpdateItem(this.alertEventsCache, response.data, (v1, v2) => v1.Id == v2.Id);\r\n return response.data;\r\n });\r\n }\r\n\r\n exportAlertDetailMethod(historyItem: IAlertReviewHistory) {\r\n const metadata = historyItem.AlertRecord.alertMetadata;\r\n if (metadata.TemperatureAlarmRecordId) {\r\n const alarmRecordPromise = this.temperatureService.getTemperatureAlarmRecord(metadata.TemperatureAlarmRecordId);\r\n const histPromise = this.temperatureService.getVehicleTemperatureOutOfBoundsHistoryByAlarmRecord(metadata.TemperatureAlarmRecordId);\r\n return this.$q.all([alarmRecordPromise, histPromise]).then(([alarm, history]) => {\r\n return `${history?.TemperatureExtreme} (${alarm?.LowerBound} - ${alarm?.UpperBound})`;\r\n });\r\n }\r\n else if (metadata.TemperatureProfileId && metadata.TemperatureOutOfBoundsHistoryId) {\r\n const profilePromise = this.temperatureService.getTemperatureProfiles().then((temperatureProfiles) => {\r\n return temperatureProfiles.find(profile => profile.Id === metadata.TemperatureProfileId);\r\n });\r\n const histPromise = this.temperatureService.getVehicleTemperatureOutOfBoundsHistory(historyItem.AlertRecord.alertMetadata.TemperatureOutOfBoundsHistoryId);\r\n return this.$q.all([profilePromise, histPromise]).then(([profile, history]) => {\r\n return `${history?.TemperatureExtreme} (${profile?.LowerBound} - ${profile?.UpperBound})`;\r\n });\r\n }\r\n return;\r\n }\r\n\r\n openIncidentDetailsDialogById(incident: IAlertReviewHistory, parentStateName = 'app.alerts.review') {\r\n this.navigationService.go(`${parentStateName}.view`, { incidentId: incident.Id, incident: incident });\r\n }\r\n\r\n openIncidentDetailsDialog(incident: IAlertReviewHistory, parentStateName = 'app.alerts.review') {\r\n this.openIncidentDetailsDialogById(incident, parentStateName);\r\n }\r\n\r\n mapVehicleToHistory(historyItem: IAlertReviewHistory, vehicles: IVehicle[]): void {\r\n historyItem.Vehicle = this.vehicleService.findVehicle(vehicles, historyItem.VehicleId);\r\n }\r\n\r\n mapEventsToHistory(historyItem: IAlertReviewHistory, events: IAlertReviewEvent[]): void {\r\n historyItem.AlertReviewEvents = events.filter(event => {\r\n return event.AlertReviewHistoryId === historyItem.Id;\r\n });\r\n historyItem.AlertReviewEvents.sort((a, b) => {\r\n return new Date(a.CreatedTime).getTime() - new Date(b.CreatedTime).getTime();\r\n });\r\n }\r\n\r\n\r\n mapAlertRecordToHistory(historyItem: IAlertReviewHistory, records: IAlertRuleRecord[]): void {\r\n historyItem.AlertRecord = records.find(record => {\r\n return record.Id === historyItem.AlertRecordId;\r\n });\r\n }\r\n\r\n mapUsersToEvents(historyItem: IAlertReviewHistory, users: IUser[]) {\r\n if (!historyItem.AlertReviewEvents) {\r\n return;\r\n }\r\n historyItem.AlertReviewEvents.forEach(event => {\r\n if (!event.UserId) {\r\n return;\r\n }\r\n const eventUser = users.find(u => {\r\n return u.Id === event.UserId;\r\n });\r\n if (eventUser) {\r\n event.User = eventUser;\r\n return;\r\n }\r\n });\r\n }\r\n\r\n getAlertRuleCategory(historyItem: IAlertReviewHistory, alertRules: IAlertRule[]): AlertCategory {\r\n return alertRules.find(rule => rule.Id === historyItem.AlertRuleId).Category;\r\n }\r\n\r\n getAlertRuleSubCategory(historyItem: IAlertReviewHistory, alertRules: IAlertRule[]): any {\r\n return alertRules.find(rule => rule.Id === historyItem.AlertRuleId).SubCategory;\r\n }\r\n\r\n setMostRecentEvent(historyItem: IAlertReviewHistory): IAlertReviewEvent {\r\n if (historyItem.LatestAlertReviewEvent && !historyItem.AlertReviewEvents.length) {\r\n\r\n historyItem.latestAlertReviewEvent = historyItem.LatestAlertReviewEvent;\r\n\r\n return historyItem.latestAlertReviewEvent;\r\n }\r\n\r\n if (!historyItem.AlertReviewEvents.length) {\r\n return;\r\n }\r\n\r\n if (historyItem.LatestAlertReviewEventId) {\r\n historyItem.latestAlertReviewEvent = historyItem.AlertReviewEvents.find(event => event.Id === historyItem.LatestAlertReviewEventId);\r\n\r\n } else {\r\n historyItem.latestAlertReviewEvent = historyItem.AlertReviewEvents.slice(-1)[0];\r\n }\r\n\r\n return historyItem.latestAlertReviewEvent;\r\n }\r\n\r\n getCurrentStatusOfHistoryItem(historyItem: IAlertReviewHistory): AlertReviewStatus {\r\n\r\n this.setMostRecentEvent(historyItem);\r\n\r\n if (historyItem.LatestAlertReviewEvent) {\r\n historyItem.currentStatus = historyItem.LatestAlertReviewEvent.Status;\r\n }\r\n else if (historyItem.latestAlertReviewEvent) {\r\n historyItem.currentStatus = historyItem.latestAlertReviewEvent.Status;\r\n }\r\n else {\r\n historyItem.currentStatus = AlertReviewStatus.Open;\r\n }\r\n return historyItem.currentStatus;\r\n }\r\n\r\n getResolvingUser(historyItem: IAlertReviewHistory) {\r\n if (this.getCurrentStatusOfHistoryItem(historyItem) !== AlertReviewStatus.Closed) {\r\n return;\r\n }\r\n\r\n const user: IUser = historyItem?.latestAlertReviewEvent?.User;\r\n\r\n const username = user?.CurrentAccountUserMapping?.Name ? user.CurrentAccountUserMapping.Name : this.translationService.t(\"Common.UnknownUser\");\r\n\r\n return username;\r\n }\r\n\r\n getResolutionCode(historyItem: IAlertReviewHistory): number {\r\n this.setMostRecentEvent(historyItem);\r\n if (!historyItem.latestAlertReviewEvent) {\r\n return;\r\n }\r\n if (historyItem.latestAlertReviewEvent.ResolutionCodeId) {\r\n return historyItem.latestAlertReviewEvent.ResolutionCodeId;\r\n }\r\n\r\n }\r\n\r\n getAlertEndTime(historyItem: IAlertReviewHistory): Date | string {\r\n return historyItem.AlertRecord.ClosedAtDataTime;\r\n }\r\n\r\n\r\n getResolvedTime(historyItem: IAlertReviewHistory): Date | string {\r\n if (!historyItem.latestAlertReviewEvent) {\r\n this.setMostRecentEvent(historyItem);\r\n };\r\n if (this.getCurrentStatusOfHistoryItem(historyItem) !== AlertReviewStatus.Closed) {\r\n return null;\r\n }\r\n\r\n return historyItem.EndTime || historyItem.latestAlertReviewEvent.CreatedTime;\r\n }\r\n\r\n getResolutionComment(historyItem: IAlertReviewHistory): string {\r\n this.setMostRecentEvent(historyItem);\r\n if (this.getCurrentStatusOfHistoryItem(historyItem) !== AlertReviewStatus.Closed) {\r\n return null;\r\n }\r\n\r\n return historyItem.latestAlertReviewEvent.Notes;\r\n }\r\n\r\n getDurationToResolveAlertMs(historyItem: IAlertReviewHistory): number | null {\r\n if (historyItem.latestAlertReviewEvent?.Status !== AlertReviewStatus.Closed) {\r\n return;\r\n }\r\n const startTime = new Date(historyItem.StartTime);\r\n const endTime = new Date(historyItem.EndTime);\r\n\r\n return endTime.getTime() - startTime.getTime();\r\n }\r\n\r\n getDurationToResolveAlert(historyItem: IAlertReviewHistory) {\r\n if (!historyItem.latestAlertReviewEvent || historyItem.latestAlertReviewEvent?.Status !== AlertReviewStatus.Closed) {\r\n return;\r\n }\r\n const startTime = new Date(historyItem.StartTime);\r\n const endTime = new Date(historyItem.EndTime);\r\n return this.dateService.formatDuration(startTime, endTime);\r\n }\r\n\r\n\r\n getDurationInAlarmMs(historyItem: IAlertReviewHistory): number | null {\r\n if (!historyItem.AlertRecord?.TriggeredAtDataTimestamp && !historyItem.AlertRecord?.ClosedAtDataTime) {\r\n return null;\r\n }\r\n\r\n const startTime = new Date(historyItem.AlertRecord?.TriggeredAtDataTimestamp);\r\n const endTime = new Date(historyItem.AlertRecord?.ClosedAtDataTime);\r\n return endTime.getTime() - startTime.getTime();\r\n }\r\n\r\n\r\n getDurationInAlarm(historyItem: IAlertReviewHistory): string {\r\n if (!historyItem.AlertRecord?.ClosedAtDataTime) {\r\n return null;\r\n }\r\n const startTime = new Date(historyItem.AlertRecord.TriggeredAtDataTimestamp);\r\n const endTime = new Date(historyItem.AlertRecord.ClosedAtDataTime);\r\n return this.dateService.formatDuration(startTime, endTime);\r\n }\r\n\r\n getStartAndEndDates(historyItem: IAlertReviewHistory): { startTime: Date, endTime: Date } {\r\n\r\n const status = this.getCurrentStatusOfHistoryItem(historyItem);\r\n const startTime = new Date(historyItem.StartTime);\r\n let endTime: Date;\r\n\r\n if (status === AlertReviewStatus.Closed) {\r\n endTime = new Date(historyItem.EndTime);\r\n }\r\n else {\r\n endTime = new Date(); // Alert review is still ongoing\r\n }\r\n\r\n return {\r\n startTime,\r\n endTime\r\n };\r\n }\r\n\r\n getOpenDuration(historyItem: IAlertReviewHistory): number {\r\n let { startTime, endTime } = this.getStartAndEndDates(historyItem);\r\n\r\n const duration = endTime.getTime() - startTime.getTime();\r\n\r\n return duration;\r\n }\r\n\r\n updateAlertReviewHistoryItem(existingAlertHistory: IAlertReviewHistory[], alertHistory: IAlertReviewHistory): void {\r\n\r\n if (!existingAlertHistory?.length) {\r\n return;\r\n }\r\n\r\n if (!alertHistory?.Id) {\r\n return;\r\n }\r\n\r\n const indexOfExistingItem = existingAlertHistory.findIndex(history => history.Id === alertHistory.Id);\r\n\r\n if (indexOfExistingItem === -1) {\r\n return;\r\n }\r\n\r\n existingAlertHistory[indexOfExistingItem] = alertHistory;\r\n }\r\n}\r\n","export enum AlertReviewStatus {\r\n //// Dummy Values\r\n Open, Closed\r\n}\r\n\r\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { DialogService } from \"@app/directives/_layout/v-dialog/v-dialog.service\";\r\nimport { IReseller } from \"@app/main/modules/foundation/_models/IReseller\";\r\nimport { FoundationAccountService } from \"@app/main/modules/foundation/_services/account.service.ajs\";\r\nimport { IAccount } from \"@app/services/account.service\";\r\nimport { ColourService } from \"@app/services/colour.service\";\r\nimport { CurrentUserService } from \"@app/services/currentUser.service\";\r\nimport { lastValueFrom, Observable } from \"rxjs\";\r\nimport { NPSRaterComponent } from \"./nps-rater.component\";\r\n\r\nexport interface INPSEntry {\r\n\r\n PlatformId: string;\r\n CustomerId: string;\r\n UserId: string;\r\n UserDescription: string;\r\n Score: number;\r\n Comments: string;\r\n DateTime?: string;\r\n\r\n // ---\r\n\r\n customer?: IAccount;\r\n color?: string;\r\n scoreLabel?: string;\r\n}\r\n\r\nexport interface ICalculatedNPSScore {\r\n score?: number;\r\n\r\n promoter?: INPSCalculatedMetrics;\r\n passive?: INPSCalculatedMetrics;\r\n detractor?: INPSCalculatedMetrics;\r\n}\r\n\r\nexport interface INPSCalculatedScore extends INPSCalculatedMetrics {\r\n score: number;\r\n}\r\n\r\nexport interface INPSCalculatedMetrics {\r\n count: number;\r\n percentage: number;\r\n color: string;\r\n}\r\n\r\nexport interface INPSAggregatedScore {\r\n description: string;\r\n\r\n ratings: INPSEntry[];\r\n score: ICalculatedNPSScore;\r\n}\r\n\r\nexport interface IGetRatingsOptions {\r\n platformId?: string;\r\n customerId?: string;\r\n userId?: string;\r\n start?: Date;\r\n end?: Date;\r\n populateCustomers?: boolean;\r\n hideInternal?: boolean;\r\n hideCustomers?: boolean;\r\n}\r\n\r\n@Injectable()\r\nexport class NPSService {\r\n constructor(\r\n private readonly currentUserService: CurrentUserService,\r\n private readonly vDialogService: DialogService,\r\n private readonly http: HttpClient,\r\n private readonly colourService: ColourService,\r\n private readonly foundationAccountService: FoundationAccountService) {\r\n }\r\n\r\n showNPSRater(): Promise {\r\n\r\n const p = new Promise(resolve => {\r\n const ref = this.vDialogService.open(NPSRaterComponent, null);\r\n\r\n ref.afterClosed$.subscribe(res => {\r\n\r\n resolve(res.data);\r\n });\r\n });\r\n\r\n return p;\r\n }\r\n\r\n getLatestRating(options?: IGetRatingsOptions): Observable {\r\n\r\n const params = this.createHttpParams(options);\r\n\r\n var response = this.http.get('/api/nps/latest', { params: params });\r\n\r\n return response;\r\n }\r\n\r\n submitRating(entry: INPSEntry): Observable {\r\n\r\n const headers = { 'content-type': 'application/json' }\r\n const body = JSON.stringify(entry);\r\n\r\n var response = this.http.post('/api/nps/submit', body, { 'headers': headers });\r\n\r\n return response;\r\n }\r\n\r\n getRatings(options?: IGetRatingsOptions): Promise {\r\n const params = this.createHttpParams(options);\r\n\r\n var npsEntries = lastValueFrom(this.http.get(\"/api/nps/get\", { params: params }));\r\n if (!options.populateCustomers) {\r\n return npsEntries;\r\n }\r\n\r\n const customerPromise = this.foundationAccountService.getCustomerAccounts() as Promise;\r\n const resellersPromise = this.foundationAccountService.getResellers() as Promise;\r\n\r\n return Promise.all([npsEntries, customerPromise, resellersPromise]).then(([npsEntries, accounts, resellers]) => {\r\n npsEntries = this.filterRatingsByReseller(npsEntries, accounts);\r\n\r\n accounts.forEach(account => {\r\n account.resellerName = this.foundationAccountService.getResellerName(resellers, account.ResellerId);\r\n });\r\n\r\n var accountMap = new Map(accounts.map(account => [account.Id, account]))\r\n\r\n npsEntries.forEach(entry => {\r\n entry.customer = accountMap.get(Number(entry.CustomerId));\r\n });\r\n\r\n if (options?.hideInternal) {\r\n npsEntries = npsEntries.filter(entry => {\r\n return entry.CustomerId !== \"37\" && entry.CustomerId !== \"30442\";\r\n })\r\n }\r\n\r\n if (options?.hideCustomers) {\r\n npsEntries = npsEntries.filter(entry => {\r\n return entry.CustomerId == \"37\" || entry.CustomerId == \"30442\";\r\n })\r\n }\r\n\r\n return npsEntries;\r\n });\r\n }\r\n\r\n filterRatingsByReseller(ratings: INPSEntry[], accounts: IAccount[]): INPSEntry[] {\r\n\r\n const user = this.currentUserService.getCurrentUserFromCache();\r\n if (!user.IsReseller) {\r\n return ratings;\r\n }\r\n\r\n return ratings.filter(r => {\r\n var account = accounts.find(account => account.Id.toString() == r.CustomerId);\r\n if (!account) {\r\n return false;\r\n }\r\n\r\n if (!user.IsReseller) {\r\n return true;\r\n }\r\n\r\n return user.ResellerIds?.some(r => r === account.ResellerId) ?? false;\r\n });\r\n }\r\n\r\n prepareNPSEntriesForDisplay(entries: INPSEntry[]) {\r\n entries.forEach(e => {\r\n e.color = this.getColor(e.Score);\r\n\r\n switch (true) {\r\n case (e.Score >= 9):\r\n e.scoreLabel = \"Promoter\";\r\n break;\r\n\r\n case (e.Score >= 7):\r\n e.scoreLabel = \"Passive\";\r\n break;\r\n\r\n default:\r\n e.scoreLabel = \"Detractor\";\r\n break;\r\n }\r\n })\r\n }\r\n\r\n calculateNPSScore(entries: INPSEntry[]): ICalculatedNPSScore {\r\n\r\n var score: ICalculatedNPSScore = {};\r\n\r\n var detractors = entries.filter(e => this.isDetractor(e)),\r\n promoters = entries.filter(e => this.isPromoter(e));\r\n\r\n score.promoter = this.createCalculatedMetrics(promoters.length, entries.length, this.getColor(10));\r\n score.passive = this.createCalculatedMetrics(entries.length - detractors.length - promoters.length, entries.length, this.getColor(7));\r\n score.detractor = this.createCalculatedMetrics(detractors.length, entries.length, this.getColor(0));\r\n\r\n score.score = Math.round(score.promoter.percentage - score.detractor.percentage);\r\n\r\n return score;\r\n }\r\n\r\n isPromoter(entry: INPSEntry) {\r\n return entry.Score >= 9;\r\n }\r\n\r\n isDetractor(entry: INPSEntry) {\r\n return entry.Score <= 6;\r\n }\r\n\r\n calculateScoreHistogram(entries: INPSEntry[]): INPSCalculatedScore[] {\r\n\r\n var scoreHistogram: INPSCalculatedScore[] = [];\r\n\r\n // Create bins\r\n for (var i = 0; i <= 10; i++) {\r\n scoreHistogram.push({\r\n color: this.getColor(i),\r\n count: 0,\r\n percentage: 0,\r\n score: i\r\n });\r\n }\r\n\r\n // Populate\r\n var highestCount = 0;\r\n entries.forEach(entry => {\r\n var matchingHistogram = scoreHistogram[entry.Score];\r\n\r\n highestCount = Math.max(highestCount, ++matchingHistogram.count);\r\n });\r\n\r\n // Calculate percentages\r\n scoreHistogram.forEach(h => {\r\n h.percentage = h.count * 100 / highestCount;\r\n });\r\n\r\n return scoreHistogram;\r\n }\r\n\r\n getColor(rating: number) {\r\n if (rating >= 9) {\r\n return this.colourService.greenColor;\r\n }\r\n\r\n if (rating >= 7) {\r\n return this.colourService.orangeColor;\r\n }\r\n\r\n return this.colourService.redColor;\r\n }\r\n\r\n calculateAggregatedScoresByCustomer(entries: INPSEntry[]): INPSAggregatedScore[] {\r\n var customers: Map = new Map();\r\n\r\n entries.forEach(entry => {\r\n var customer = customers.get(Number(entry.CustomerId));\r\n\r\n if (!customer) {\r\n customer = {\r\n description: entry.customer.CompanyName,\r\n ratings: [],\r\n score: {}\r\n };\r\n\r\n customers.set(Number(entry.CustomerId), customer);\r\n }\r\n\r\n customer.ratings.push(entry);\r\n });\r\n\r\n // Now calculate scores\r\n customers.forEach(customer => {\r\n customer.score = this.calculateNPSScore(customer.ratings);\r\n });\r\n\r\n return Array.from(customers.values());\r\n }\r\n\r\n calculateAggregatedScoresByReseller(entries: INPSEntry[]): INPSAggregatedScore[] {\r\n var resellers: Map = new Map();\r\n\r\n entries.forEach(entry => {\r\n var reseller = resellers.get(Number(entry.customer.ResellerId));\r\n\r\n if (!reseller) {\r\n reseller = {\r\n description: entry.customer.resellerName,\r\n ratings: [],\r\n score: {}\r\n };\r\n\r\n resellers.set(Number(entry.customer.ResellerId), reseller);\r\n }\r\n\r\n reseller.ratings.push(entry);\r\n });\r\n\r\n // Now calculate scores\r\n resellers.forEach(reseller => {\r\n reseller.score = this.calculateNPSScore(reseller.ratings);\r\n });\r\n\r\n return Array.from(resellers.values());\r\n }\r\n\r\n // ---\r\n\r\n private createHttpParams(options?: IGetRatingsOptions): HttpParams {\r\n let params = new HttpParams();\r\n\r\n if (!options) {\r\n return params;\r\n }\r\n\r\n if (options.platformId) {\r\n params = params.set(\"platformId\", options.platformId);\r\n }\r\n\r\n if (options.customerId) {\r\n params = params.set(\"customerId\", options.customerId);\r\n }\r\n\r\n if (options.userId) {\r\n params = params.set(\"userId\", options.userId);\r\n }\r\n\r\n if (options.start) {\r\n params = params.set(\"start\", options.start?.toISOString());\r\n }\r\n\r\n if (options.end) {\r\n params = params.set(\"end\", options.end?.toISOString());\r\n }\r\n\r\n return params;\r\n }\r\n\r\n private createCalculatedMetrics(count: number, totalEntries: number, color: string): INPSCalculatedMetrics {\r\n var metrics = {\r\n count: count,\r\n percentage: /*Math.round*/(count * 100 / totalEntries),\r\n color: color\r\n }\r\n\r\n return metrics;\r\n }\r\n}\r\n","\r\nexport enum VisitOnTimeStatus {\r\n Early,\r\n OnTime,\r\n Late,\r\n Missed\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport { RouteVisitStatus } from \"@tms/_enums/RouteVisitStatus\";\r\nimport { IPlannedRouteVisit } from \"@tms/_models/IPlannedRouteVisit\";\r\nimport { IPlannedRouteDetail } from \"./planned-route.service\";\r\n\r\nexport interface IRouteDetailDisplay extends IPlannedRouteDetail {\r\n displayPlannedVisits: IRouteDetailVisitDisplay[];\r\n nextVisit?: IRouteDetailVisitDisplay;\r\n currentVisit?: IPlannedRouteVisit;\r\n hasVisibleVisits?: boolean;\r\n hasVisibleStops?: boolean;\r\n\r\n startTimeWindowPosition: number;\r\n endTimeWindowPosition: number;\r\n}\r\n\r\nexport interface IRouteDetailVisitDisplay extends IPlannedRouteVisit {\r\n startPixelPosition?: number;\r\n endPixelPosition?: number;\r\n pixelWidth?: number;\r\n classSize?: string;\r\n actualPixelsTravelled?: number;\r\n pixelsToNextStop?: number;\r\n isVisible?: boolean;\r\n isLeftOfScreen?: boolean;\r\n\r\n status?: string;\r\n arrivalTimeDiff?: string;\r\n departureTimeDiff?: string;\r\n departureLate?: boolean;\r\n departureEarly?: boolean;\r\n nextVisit?: boolean;\r\n}\r\n\r\n@Injectable()\r\nexport class ActiveRoutesService {\r\n constructor(private veriDate: VeriDate) {\r\n }\r\n\r\n filterRouteByTextPredicate(route: IRouteDetailDisplay, searchString: string) {\r\n if (route.routeDisplayName?.toLowerCase().indexOf(searchString) >= 0 ||\r\n (route.vehicle && route.vehicle.Reg.toLowerCase().indexOf(searchString) >= 0) ||\r\n (route.driver && route.driver.Name.toLowerCase().indexOf(searchString) >= 0)) {\r\n return true;\r\n }\r\n\r\n return route.PlannedVisits.some(visit => visit.displayLabel.toLowerCase().indexOf(searchString) >= 0);\r\n }\r\n\r\n filterPlannedRoutes(routes: IRouteDetailDisplay[], searchString: string): IRouteDetailDisplay[] {\r\n if (!routes) {\r\n return;\r\n }\r\n\r\n if (!searchString || searchString.length === 0) {\r\n return routes;\r\n }\r\n\r\n searchString = searchString.toLowerCase();\r\n\r\n const filteredRoutes: IRouteDetailDisplay[] = [];\r\n\r\n routes.forEach(route => {\r\n if (this.filterRouteByTextPredicate(route, searchString)) {\r\n filteredRoutes.push(route);\r\n }\r\n });\r\n\r\n return filteredRoutes;\r\n }\r\n\r\n createDisplayPlannedVisitsOnRoute(route: IRouteDetailDisplay): IRouteDetailVisitDisplay[] {\r\n const updatedVisits = [...route.PlannedVisits];\r\n\r\n updatedVisits.forEach((visit, index) => {\r\n if (visit.Status === RouteVisitStatus.Arrived) {\r\n route.currentVisit = visit;\r\n route.nextVisit = route.PlannedVisits[index + 1];\r\n }\r\n });\r\n\r\n return updatedVisits;\r\n }\r\n\r\n isArrivalEarly(visit: IRouteDetailVisitDisplay): boolean {\r\n if (!visit) {\r\n return false;\r\n }\r\n\r\n const expectedArrivalTime = (this.veriDate.createMoment(visit.ActualArrivalTime) || this.veriDate.createMoment(visit.ArrivalEta)).clone();\r\n const bufferedArrivalTime = this.veriDate.createMoment(expectedArrivalTime).clone().add(visit.travelTimeBufferMins, \"m\");\r\n\r\n return this.veriDate.createMoment(visit.PlannedArrivalTime).isSameOrAfter(bufferedArrivalTime);\r\n }\r\n\r\n isArrivalLate(visit: IRouteDetailVisitDisplay): boolean {\r\n if (!visit) {\r\n return false;\r\n }\r\n\r\n const expectedArrivalTime = (this.veriDate.createMoment(visit.ActualArrivalTime) || this.veriDate.createMoment(visit.ArrivalEta)).clone();\r\n const bufferedArrivalTime = this.veriDate.createMoment(expectedArrivalTime).clone().add(-visit.travelTimeBufferMins, \"m\");\r\n\r\n return this.veriDate.createMoment(visit.PlannedArrivalTime).isSameOrBefore(bufferedArrivalTime);\r\n }\r\n\r\n // ---\r\n\r\n private isDepartureLate(visit: IRouteDetailVisitDisplay): boolean {\r\n let departureTime: moment.Moment;\r\n if (visit.ActualDepartureTime) {\r\n departureTime = this.veriDate.createMoment(visit.ActualDepartureTime).clone();\r\n }\r\n else {\r\n departureTime = (this.veriDate.createMoment(visit.ActualArrivalTime) || this.veriDate.createMoment(visit.ArrivalEta)).clone().add(visit.onSiteTimeMins, \"m\");\r\n }\r\n const bufferedDepartureTime = this.veriDate.createMoment(visit.PlannedDepartureTime).clone().add(visit.onSiteTimeBufferMins, \"m\");\r\n\r\n return departureTime.isSameOrAfter(bufferedDepartureTime);\r\n }\r\n\r\n private isDepartureEarly(visit: IRouteDetailVisitDisplay): boolean {\r\n let departureTime: moment.Moment;\r\n\r\n if (visit.ActualDepartureTime) {\r\n departureTime = this.veriDate.createMoment(visit.ActualDepartureTime).clone();\r\n }\r\n else {\r\n departureTime = (this.veriDate.createMoment(visit.ActualArrivalTime) || this.veriDate.createMoment(visit.ArrivalEta)).clone().add(visit.onSiteTimeMins, \"m\");\r\n }\r\n\r\n const bufferedDepartureTime = this.veriDate.createMoment(visit.PlannedDepartureTime).clone().add(-visit.onSiteTimeBufferMins, \"m\");\r\n\r\n return departureTime.isSameOrBefore(bufferedDepartureTime);\r\n }\r\n\r\n updateRouteVisits(route: IRouteDetailDisplay) {\r\n\r\n var lastVisit: IRouteDetailVisitDisplay;\r\n\r\n route.displayPlannedVisits.forEach((visit, i) => {\r\n const isFirstVisit = i === 0;\r\n const isFinalVisit = i === route.PlannedVisits.length - 1;\r\n\r\n this.updateRouteVisitTimes(visit, lastVisit, isFirstVisit, isFinalVisit);\r\n this.updateRouteVisitState(visit, lastVisit, route, isFinalVisit);\r\n\r\n if (i === 0) {\r\n visit.displayArrivalLabel = \"--\";\r\n }\r\n else if (visit.ActualArrivalTime) {\r\n visit.displayArrivalLabel = this.veriDate.formatDate(visit.ActualArrivalTime, \"time\");\r\n }\r\n else {\r\n visit.displayArrivalLabel = visit.status || \"Planned\";\r\n }\r\n\r\n if (i === route.PlannedVisits.length - 1) {\r\n visit.displayDepartureLabel = \"--\";\r\n }\r\n else if (visit.ActualDepartureTime) {\r\n visit.displayDepartureLabel = this.veriDate.formatDate(visit.ActualDepartureTime, \"time\");\r\n }\r\n else {\r\n visit.displayDepartureLabel = visit.status || \"Planned\";\r\n }\r\n\r\n lastVisit = visit;\r\n });\r\n }\r\n\r\n private updateRouteVisitTimes(visit: IRouteDetailVisitDisplay, lastVisit: IRouteDetailVisitDisplay, isFirstVisit: boolean, isFinalVisit: boolean) {\r\n\r\n const visitActualArrival = this.veriDate.createMoment(visit.ActualArrivalTime);\r\n const visitPlannedArrival = this.veriDate.createMoment(visit.PlannedArrivalTime);\r\n if (visit.ActualArrivalTime && visitPlannedArrival.diff(visitActualArrival, \"m\") !== 0) {\r\n visit.arrivalTimeDiff = visitPlannedArrival.from(visitActualArrival, true);\r\n }\r\n\r\n const visitActualDeparture = this.veriDate.createMoment(visit.ActualDepartureTime);\r\n const visitPlannedDeparture = this.veriDate.createMoment(visit.PlannedDepartureTime);\r\n\r\n\r\n if (visit.ActualDepartureTime && visitPlannedDeparture.diff(visitActualDeparture, \"m\") !== 0) {\r\n visit.departureTimeDiff = visitPlannedDeparture.from(visitActualDeparture, true);\r\n }\r\n\r\n //if ((visit.ActualArrivalTime || visit.ArrivalEta) && !isFirstVisit) {\r\n // visit.arrivalLate = this.isArrivalLate(visit);\r\n // visit.arrivalEarly = this.isArrivalEarly(visit);\r\n //}\r\n\r\n if (visit.ActualDepartureTime || visit.ActualArrivalTime || visit.ArrivalEta) {\r\n visit.departureLate = this.isDepartureLate(visit);\r\n visit.departureEarly = this.isDepartureEarly(visit);\r\n }\r\n\r\n //const plannedStopMins = this.veriDate.createMoment(visit.PlannedDepartureTime).diff(visit.PlannedArrivalTime, \"m\");\r\n\r\n //visit.displayArrivalTime = visit.ActualArrivalTime || visit.ArrivalEta || visit.PlannedArrivalTime; // Use actual arrival time if stop has been visited, expected if on way and planned if not yet in progress\r\n\r\n //if (visit.ActualDepartureTime) {\r\n // visit.displayDepartureTime = visit.ActualDepartureTime; // Use actual departure time if stop has been visited and departed\r\n //}\r\n //else {\r\n // if (visit.ActualArrivalTime && !visit.ActualDepartureTime) {\r\n // //If vehicle is currently visiting stop, displayed planned departure should be updated to match\r\n // visit.displayDepartureTime = this.veriDate.createMoment(visit.ActualArrivalTime).clone().add(plannedStopMins, \"m\").toDate();\r\n // }\r\n // else if (visit.ArrivalEta) {\r\n // visit.displayDepartureTime = this.veriDate.createMoment(visit.ArrivalEta).clone().add(plannedStopMins, \"m\").toDate();\r\n // } else {\r\n // visit.displayDepartureTime = visit.PlannedDepartureTime;\r\n // }\r\n //}\r\n\r\n\r\n //if (isFirstVisit && !visit.displayArrivalTime) {\r\n // visit.displayArrivalTime = this.veriDate.createMoment(visit.displayDepartureTime).clone().add(-plannedStopMins, \"m\").toDate();\r\n //}\r\n //else if (isFinalVisit && !visit.displayDepartureTime) {\r\n // visit.displayDepartureTime = this.veriDate.createMoment(visit.displayArrivalTime).clone().add(plannedStopMins, \"m\").toDate();\r\n //}\r\n }\r\n\r\n private updateRouteVisitState(visit: IRouteDetailVisitDisplay,\r\n lastVisit: IRouteDetailVisitDisplay,\r\n route: IRouteDetailDisplay,\r\n isFinalVisit: boolean) {\r\n\r\n visit.nextVisit = lastVisit && lastVisit.Status === RouteVisitStatus.Departed;\r\n\r\n if (visit.nextVisit) {\r\n route.nextVisit = visit;\r\n }\r\n\r\n //if (route.Status === RouteStatus.Started || route.Status === RouteStatus.Completed || route.Status === RouteStatus.CompletedWithMissing) {\r\n // this.addClass(visit, \"route-started\");\r\n //}\r\n\r\n //this.setVisitStatusLabel(visit);\r\n\r\n //if (visit.Status === RouteVisitStatus.Departed ||\r\n // visit.Status === RouteVisitStatus.Missed ||\r\n // visit.Status === RouteVisitStatus.Arrived && isFinalVisit) {\r\n // this.addClass(visit, \"visit-completed\");\r\n //}\r\n\r\n //if (visit.arrivalLate) {\r\n // this.addClass(visit, \"visit-late\");\r\n // visit.arrivalClassName = \"visit-eta-red\";\r\n //}\r\n //else {\r\n // this.addClass(visit, \"visit-ontime\");\r\n //}\r\n\r\n //if (visit.arrivalEarly) {\r\n // visit.arrivalClassName = \"visit-eta-green\";\r\n //}\r\n\r\n //if (visit.departureLate) {\r\n // this.addClass(visit, \"visit-late\");\r\n // visit.departureClassName = \"visit-eta-red\";\r\n //}\r\n //else {\r\n // this.addClass(visit, \"visit-ontime\");\r\n //}\r\n\r\n //if (visit.departureEarly) {\r\n // visit.departureClassName = \"visit-eta-green\";\r\n //}\r\n }\r\n\r\n //private addClass(visit: IRouteDetailVisitDisplay, className: string): void {\r\n // visit.className += ` ${className}`;\r\n //}\r\n\r\n //private setVisitStatusLabel(visit: IRouteDetailVisitDisplay) {\r\n // if (visit.Status === RouteVisitStatus.Arrived) {\r\n // visit.status = \"Arrived\";\r\n // this.addClass(visit, \"visit-arrived\");\r\n // }\r\n\r\n // if (visit.Status === RouteVisitStatus.Departed) {\r\n // visit.status = \"Departed\";\r\n // this.addClass(visit, \"visit-departed\");\r\n // }\r\n\r\n // if (visit.Status === RouteVisitStatus.Missed) {\r\n // visit.status = \"Missed\";\r\n // this.addClass(visit, \"visit-missed\");\r\n // }\r\n\r\n // if (visit.Status === RouteVisitStatus.Planned && visit.nextVisit) {\r\n // visit.status = \"En-Route\";\r\n // this.addClass(visit, \"visit-enroute\");\r\n // }\r\n //}\r\n\r\n getVisitClass(visit: IRouteDetailVisitDisplay): string {\r\n let className = \"\";\r\n\r\n if (visit.Status === RouteVisitStatus.Missed) {\r\n return \"missed\";\r\n }\r\n\r\n if (visit.Status === RouteVisitStatus.Planned && visit.nextVisit) {\r\n className += \"enroute\";\r\n }\r\n\r\n if (this.isArrivalEarly(visit) || this.isDepartureEarly(visit)) {\r\n className += \"early\";\r\n }\r\n\r\n if (this.isArrivalLate(visit) || this.isDepartureLate(visit)) {\r\n className += \"late\";\r\n }\r\n\r\n if (this.isArrivalLate(visit) || this.isDepartureLate(visit)) {\r\n className += \"late\";\r\n }\r\n\r\n return className;\r\n }\r\n}\r\n","\r\nimport * as angular from \"angular\";\r\nimport * as moment from \"moment\";\r\nimport { IDriver } from \"@interfaces/IDriver\";\r\nimport { IJourney } from \"@interfaces/IJourney\";\r\nimport { IPlotEvent } from \"@interfaces/IPlot\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport \"./journeySummary.scss\";\r\n\r\nexport enum EventAction {\r\n Selected,\r\n Hover\r\n}\r\n\r\ninterface IJourneySummaryComponentBindings {\r\n\r\n showIntervalAbove: boolean;\r\n journey: IJourney;\r\n vehicle: IVehicle;\r\n driver: IDriver;\r\n\r\n onClick: (args: { journey: IJourney }) => void;\r\n onMouseover: (args: { journey: IJourney }) => void;\r\n onEventAction: (args: { journey: IJourney, event: IPlotEvent, mouseAction: EventAction }) => void;\r\n}\r\n\r\n// Todo: Rename to journey-card ?\r\nclass JourneySummaryComponentController implements angular.IComponentController, IJourneySummaryComponentBindings {\r\n\r\n showIntervalAbove: boolean;\r\n journey: IJourney;\r\n vehicle: IVehicle;\r\n driver: IDriver;\r\n\r\n journeyEvents: IPlotEvent[];\r\n\r\n onClick: (args: { journey: IJourney }) => void;\r\n onMouseover: (args: { journey: IJourney }) => void;\r\n onEventAction: (args: { journey: IJourney, event: IPlotEvent, mouseAction: EventAction, mouseEvent: MouseEvent }) => void;\r\n\r\n hasMultipleEvents: boolean;\r\n hideEvents: boolean;\r\n\r\n static $inject = [];\r\n\r\n constructor() {\r\n }\r\n\r\n $onInit() {\r\n this.hideEvents = true;\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n this.hideEvents = true;\r\n\r\n if (onChangesObj[\"journey\"]) {\r\n this.journey.events = this.journey.events || [];\r\n\r\n this.journey.events.sort((a, b) => {\r\n return moment(a.plot.UtcMoment).isBefore(b.plot.UtcMoment) ? -1 : 1;\r\n });\r\n\r\n this.hasMultipleEvents = this.journey.events.length > 2;\r\n this.hideEvents = this.hasMultipleEvents;\r\n\r\n this.updateEvents();\r\n }\r\n }\r\n\r\n toggleHideEvents() {\r\n this.hideEvents = !this.hideEvents;\r\n\r\n this.updateEvents();\r\n }\r\n\r\n journeyClicked() {\r\n if (this.onClick) {\r\n this.onClick({ journey: this.journey });\r\n }\r\n }\r\n\r\n journeyMouseOver() {\r\n if (this.onMouseover) {\r\n this.onMouseover({ journey: this.journey });\r\n }\r\n }\r\n\r\n eventClicked(event: IPlotEvent, $event: MouseEvent) {\r\n if (this.onEventAction) {\r\n this.onEventAction({ journey: this.journey, event: event, mouseAction: EventAction.Selected, mouseEvent: $event });\r\n }\r\n }\r\n\r\n eventMouseHover(event: IPlotEvent, $event: MouseEvent) {\r\n if (this.onEventAction) {\r\n this.onEventAction({ journey: this.journey, event: event, mouseAction: EventAction.Hover, mouseEvent: $event });\r\n }\r\n }\r\n\r\n // ----------------\r\n\r\n private updateEvents() {\r\n this.journeyEvents = [];\r\n\r\n this.journey.events.forEach((event, i) => {\r\n if (!this.hideEvents || i == 0 || i == this.journey.events.length - 1) {\r\n this.journeyEvents.push(event);\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport class JourneySummaryComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n template: string;\r\n controller: any;\r\n\r\n constructor() {\r\n this.bindings = {\r\n vehicle: \"<\",\r\n driver: \"<\",\r\n journey: \"<\",\r\n\r\n selected: \"<\",\r\n\r\n showIntervalAbove: \"<\",\r\n\r\n onClick: \"&\",\r\n onEventAction: \"&\",\r\n onMouseover: \"&\"\r\n };\r\n\r\n this.controller = JourneySummaryComponentController;\r\n\r\n this.template = require(\"./journeySummary.html\");\r\n }\r\n}\r\n","export enum FieldType {\r\n String,\r\n Date,\r\n Integer,\r\n PositiveDouble,\r\n Double,\r\n DateOrInteger,\r\n Boolean\r\n}\r\n","import { Injectable, Renderer2, RendererFactory2 } from \"@angular/core\";\r\n\r\nexport interface ITooltipPosition {\r\n left: number;\r\n top: number;\r\n direction?: string\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class TooltipService {\r\n\r\n private renderer: Renderer2;\r\n\r\n constructor(rendererFactory: RendererFactory2) {\r\n this.renderer = rendererFactory.createRenderer(null, null);\r\n }\r\n\r\n create(title: string, position?: ITooltipPosition): HTMLElement {\r\n var tooltip = this.renderer.createElement('div');\r\n\r\n this.renderer.appendChild(\r\n tooltip,\r\n this.renderer.createText(title) // textNode\r\n );\r\n\r\n this.renderer.appendChild(document.body, tooltip);\r\n this.renderer.addClass(tooltip, 'angular-tooltip');\r\n\r\n if (position) {\r\n this.setPosition(tooltip, position);\r\n }\r\n\r\n return tooltip;\r\n }\r\n\r\n show(tooltip: HTMLElement) {\r\n this.renderer.addClass(tooltip, 'angular-tooltip-fade-in');\r\n }\r\n\r\n remove(tooltip: HTMLElement) {\r\n if (!tooltip) {\r\n return;\r\n }\r\n\r\n tooltip.remove();\r\n }\r\n\r\n setPosition(tooltip: HTMLElement, position: ITooltipPosition, boundingElement?: HTMLElement) {\r\n this.setDirectionAdjustedPosition(tooltip, position);\r\n\r\n tooltip.classList.add('angular-tooltip-' + position.direction);\r\n tooltip.style.left = Math.round(position.left) + \"px\";\r\n tooltip.style.top = Math.round(position.top) + \"px\";\r\n }\r\n\r\n // ---\r\n\r\n private setDirectionAdjustedPosition(tooltip: HTMLElement, pos: ITooltipPosition) {\r\n const arrow_padding = 12;\r\n var tooltipBounding = tooltip.getBoundingClientRect();\r\n pos.direction = pos.direction || \"top\";\r\n\r\n var scrollLeft = 0;\r\n var scrollTop = 0;\r\n\r\n if (this.stringStartsWith(pos.direction, 'left')) {\r\n pos.left = pos.left - tooltipBounding.width - (arrow_padding / 2) + scrollLeft;\r\n }\r\n else if (this.stringStartsWith(pos.direction, 'right')) {\r\n pos.left = pos.left + (arrow_padding / 2) + scrollLeft;\r\n }\r\n else if (this.stringContains(pos.direction, 'left')) {\r\n pos.left = pos.left - tooltipBounding.width + arrow_padding + scrollLeft;\r\n }\r\n else if (this.stringContains(pos.direction, 'right')) {\r\n pos.left = pos.left - arrow_padding + scrollLeft;\r\n }\r\n else {\r\n pos.left = pos.left - (tooltipBounding.width / 2) + scrollLeft;\r\n }\r\n\r\n // calculate the top position\r\n if (this.stringStartsWith(pos.direction, 'top')) {\r\n pos.top = pos.top - tooltipBounding.height - (arrow_padding / 2) + scrollTop;\r\n }\r\n else if (this.stringStartsWith(pos.direction, 'bottom')) {\r\n pos.top = pos.top + (arrow_padding / 2) + scrollTop;\r\n }\r\n else if (this.stringContains(pos.direction, 'top')) {\r\n pos.top = pos.top - tooltipBounding.height + arrow_padding + scrollTop;\r\n }\r\n else if (this.stringContains(pos.direction, 'bottom')) {\r\n pos.top = pos.top - arrow_padding + scrollTop;\r\n }\r\n else {\r\n pos.top = pos.top + (tooltipBounding.height / 2) - (tooltipBounding.height / 2) + scrollTop;\r\n }\r\n }\r\n\r\n private getToolipPositionFromBoundingElement(tooltip: HTMLElement, position: ITooltipPosition, boundingElement?: HTMLElement): ITooltipPosition {\r\n //this.setDirection();\r\n\r\n position.direction = position.direction || \"top\";\r\n\r\n var tooltipBounding = tooltip.getBoundingClientRect();\r\n var elBounding = boundingElement ? boundingElement.getBoundingClientRect() : { x: 0, y: 0, width: 0, height: 0, left: 0, top: 0 };\r\n var scrollLeft = window.scrollX || document.documentElement.scrollLeft;\r\n var scrollTop = window.scrollY || document.documentElement.scrollTop;\r\n var arrow_padding = 12;\r\n var pos: ITooltipPosition = { left: 0, top: 0 };\r\n var newDirection = null;\r\n\r\n // calculate the left position\r\n if (this.stringStartsWith(position.direction, 'left')) {\r\n pos.left = elBounding.left - tooltipBounding.width - (arrow_padding / 2) + scrollLeft;\r\n }\r\n else if (this.stringStartsWith(position.direction, 'right')) {\r\n pos.left = elBounding.left + elBounding.width + (arrow_padding / 2) + scrollLeft;\r\n }\r\n else if (this.stringContains(position.direction, 'left')) {\r\n pos.left = elBounding.left - tooltipBounding.width + arrow_padding + scrollLeft;\r\n }\r\n else if (this.stringContains(position.direction, 'right')) {\r\n pos.left = elBounding.left + elBounding.width - arrow_padding + scrollLeft;\r\n }\r\n else {\r\n pos.left = elBounding.left + (elBounding.width / 2) - (tooltipBounding.width / 2) + scrollLeft;\r\n }\r\n\r\n // calculate the top position\r\n if (this.stringStartsWith(position.direction, 'top')) {\r\n pos.top = elBounding.top - tooltipBounding.height - (arrow_padding / 2) + scrollTop;\r\n }\r\n else if (this.stringStartsWith(position.direction, 'bottom')) {\r\n pos.top = elBounding.top + elBounding.height + (arrow_padding / 2) + scrollTop;\r\n }\r\n else if (this.stringContains(position.direction, 'top')) {\r\n pos.top = elBounding.top - tooltipBounding.height + arrow_padding + scrollTop;\r\n }\r\n else if (this.stringContains(position.direction, 'bottom')) {\r\n pos.top = elBounding.top + elBounding.height - arrow_padding + scrollTop;\r\n }\r\n else {\r\n pos.top = elBounding.top + (elBounding.height / 2) - (tooltipBounding.height / 2) + scrollTop;\r\n }\r\n\r\n // Todo?\r\n // check if the tooltip is outside the bounds of the window\r\n //if (this.fixedPosition) {\r\n // if (pos.left < scrollLeft) {\r\n // newDirection = this.direction.replace('left', 'right');\r\n // }\r\n // else if ((pos.left + tooltipBounding.width) > (window.innerWidth + scrollLeft)) {\r\n // newDirection = this.direction.replace('right', 'left');\r\n // }\r\n\r\n // if (pos.top < scrollTop) {\r\n // newDirection = this.direction.replace('top', 'bottom');\r\n // }\r\n // else if ((pos.top + tooltipBounding.height) > (window.innerHeight + scrollTop)) {\r\n // newDirection = this.direction.replace('bottom', 'top');\r\n // }\r\n\r\n // if (newDirection) {\r\n // //return this.calculatePosition(this.tooltip, newDirection);\r\n // }\r\n //}\r\n\r\n //pos.left += 'px';\r\n //pos.top += 'px';\r\n //pos.direction = this.direction;\r\n\r\n return pos;\r\n }\r\n\r\n private stringStartsWith(searchString, findString): boolean {\r\n if (!searchString) {\r\n console.warn(\"stringStartsWith searchString null\", searchString, findString);\r\n return false;\r\n }\r\n\r\n return searchString.substr(0, findString.length) === findString;\r\n }\r\n\r\n private stringContains(searchString, findString): boolean {\r\n return searchString.indexOf(findString) !== -1;\r\n }\r\n}\r\n","import { AfterViewInit, Component, ElementRef, EventEmitter, HostBinding, Input, OnInit, Output, ViewChild } from \"@angular/core\";\r\nimport \"./v-toggle.component.scss\";\r\n\r\n@Component({\r\n selector: \"v-toggle\",\r\n template: require(\"./v-toggle.component.html\")\r\n})\r\nexport class VToggleComponent implements OnInit, AfterViewInit {\r\n\r\n @Input() value: boolean;\r\n\r\n @Output() valueChange = new EventEmitter();\r\n @Output() onChanged = new EventEmitter();\r\n\r\n @HostBinding(\"class.disabled\") @Input() disabled: boolean;\r\n @ViewChild('labelContainer', { static: true }) labelContainer: ElementRef;\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void { }\r\n\r\n ngAfterViewInit() {\r\n this.removeElementsIfEmpty();\r\n }\r\n\r\n toggle(event?: MouseEvent): void {\r\n event?.stopPropagation();\r\n\r\n if (this.disabled) {\r\n return;\r\n }\r\n\r\n this.value = !this.value;\r\n\r\n this.valueChange.emit(this.value);\r\n this.onChanged.emit(this.value);\r\n }\r\n\r\n // ---\r\n\r\n private removeElementsIfEmpty(): void {\r\n if (!this.labelContainer?.nativeElement?.innerHTML) {\r\n this.labelContainer.nativeElement.remove();\r\n }\r\n }\r\n}\r\n","import { Component, Input, OnChanges, SimpleChanges } from \"@angular/core\";\r\nimport \"./depotName.component.scss\";\r\n\r\n@Component({\r\n selector: \"depot\",\r\n template: `home {{name}}`\r\n})\r\nexport class DepotNameComponent implements OnChanges {\r\n @Input() name: string;\r\n\r\n constructor() { }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n }\r\n}\r\n","\r\nexport class TemperatureNavigationModule {\r\n static get TemperatureCompliance(): string { return \"app.temperature.compliance\"; }\r\n static get Reefer(): string { return \"app.temperature.reefer\"; }\r\n static get Default(): string { return this.TemperatureCompliance; }\r\n static get ParentRoot(): string { return \"app.temperature\"; }\r\n}\r\n","import { Component, Input } from \"@angular/core\";\r\nimport { Observable } from \"rxjs\";\r\n\r\n@Component({\r\n selector: 'async-observable',\r\n template: require('./async-observable.component.html')\r\n})\r\nexport class AsyncObservableComponent {\r\n @Input() observable$: Observable;\r\n @Input() useLoading: boolean;\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n }\r\n}\r\n","\r\nexport enum VTableHeaderType {\r\n Default,\r\n Status,\r\n Text,\r\n Number,\r\n Date,\r\n Vehicle,\r\n Checkbox\r\n}\r\n","\r\nexport enum InputState {\r\n Low = 0,\r\n High = 1\r\n}\r\n\r\nexport enum HardwareSource {\r\n Tracker = 0,\r\n Transcan = 1,\r\n SecureSeal = 2,\r\n Ibox = 3,\r\n Carrier = 4\r\n}\r\n\r\nexport enum InputStateDescription {\r\n OnOff,\r\n OpenClosed,\r\n ActiveInactive,\r\n ConnectedDisconnected,\r\n}\r\n\r\nexport interface IVehicleInput {\r\n Id: number,\r\n Position: number,\r\n \r\n VehicleId: number,\r\n Source: HardwareSource;\r\n ActiveState: InputState;\r\n InputStateDescription: InputStateDescription;\r\n InputTypeId?: number;\r\n\r\n ZoneId?: number;\r\n\r\n // ---\r\n\r\n inputSourceString: string;\r\n name: string,\r\n}\r\n","import { Component, HostBinding, Input, OnChanges, SimpleChanges } from \"@angular/core\";\r\nimport { TemperatureService } from \"@temperature/_services/temperature.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { UnitConversionService, UnitConversionType } from \"@services/unitConversion.service\";\r\nimport { Moment } from \"moment\";\r\nimport { ITemperatureRecord } from \"@temperature/_models/temperature/ITemperatureRecord\";\r\nimport './temperatureReading.scss';\r\nimport { TemperatureProbeCategory } from \"@temperature/_enums/temperature/TemperatureProbeCategory.enum\";\r\nimport { ITemperatureProbe } from \"@temperature/_models/temperature/ITemperatureProbe\";\r\nimport { TemperatureProbeService } from \"@temperature/_services/temperature-probe.service\";\r\n\r\n@Component({\r\n selector: 'temperature-reading',\r\n template: require('./temperatureReading.html')\r\n})\r\n\r\nexport class TemperatureReadingComponent implements OnChanges {\r\n\r\n @Input() temperatureRecordId: number;\r\n @Input() temperatureProbe: ITemperatureProbe;\r\n @Input() temperatureDate: Moment;\r\n @Input() temperatureReading: number;\r\n @Input() isDateWarn = false;\r\n @Input() reefer = false;\r\n @Input() probeName: string;\r\n\r\n @HostBinding('class.text-muted') mutedClass = false;\r\n\r\n debounceTimeout: any;\r\n label: string = '';\r\n\r\n updating = false;\r\n\r\n temperatureRecord: ITemperatureRecord;\r\n\r\n constructor(\r\n private readonly temperatureService: TemperatureService,\r\n private readonly temperatureProbeService: TemperatureProbeService,\r\n private readonly translationService: TranslationService,\r\n private readonly unitConversionService: UnitConversionService) { }\r\n\r\n ngOnInit(): void {\r\n this.render();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n this.render();\r\n }\r\n\r\n private render(): void {\r\n // We want a small debounce here, this protects us against fast scrolling - no point updating a temperature if we have just scrolled past it\r\n if (this.debounceTimeout) {\r\n clearTimeout(this.debounceTimeout);\r\n }\r\n\r\n this.debounceTimeout = setTimeout(() => {\r\n this.updateLabel(true);\r\n this.debounceTimeout = null;\r\n }, 100);\r\n }\r\n\r\n private updateLabel(showUpdatingText: boolean) {\r\n if (this.temperatureReading !== null && !isNaN(this.temperatureReading)) {\r\n this.setLabel();\r\n }\r\n else {\r\n this.updating = true;\r\n this.getTemperatureRecord();\r\n }\r\n }\r\n\r\n private setLabel() {\r\n if (this.temperatureReading == null) {\r\n this.label = this.translationService.t('TemperatureReading.NoRecordFound');;\r\n this.updating = false;\r\n this.mutedClass = false;\r\n return;\r\n }\r\n this.setProbeName();\r\n this.label = `${this.unitConversionService.smartConvert(this.temperatureReading, UnitConversionType.Temperature, { precision: 1 })}`;\r\n this.updating = false;\r\n this.mutedClass = false;\r\n }\r\n\r\n private getTemperatureRecord(): Promise {\r\n if (this.updating) {\r\n this.mutedClass = true;\r\n this.label = this.translationService.t('TemperatureReading.Updating');\r\n }\r\n\r\n if (!this.temperatureRecordId) {\r\n this.mutedClass = true;\r\n this.label = \"--\";\r\n return;\r\n }\r\n\r\n return new Promise((resolve) => {\r\n this.temperatureService.getTemperatureRecord(this.temperatureRecordId)\r\n .then((temperatureRecord) => {\r\n if (!temperatureRecord) {\r\n return;\r\n }\r\n this.temperatureRecord = temperatureRecord;\r\n this.temperatureReading = temperatureRecord.Temperature;\r\n this.setLabel();\r\n !this.temperatureProbe && this.getProbe();\r\n this.setProbeName();\r\n resolve(temperatureRecord);\r\n }).catch(error => {\r\n this.label = \"--\";\r\n });\r\n });\r\n }\r\n\r\n private setProbeName() {\r\n if (!this.temperatureProbe || this.probeName) {\r\n return;\r\n }\r\n\r\n if (!this.reefer) {\r\n this.probeName = this.temperatureProbe.cleanName;\r\n }\r\n else {\r\n this.probeName = `${TemperatureProbeCategory[this.temperatureProbe.Category]}`;\r\n }\r\n }\r\n\r\n private getProbe() {\r\n this.temperatureProbeService.getTemperatureProbesForVehicle(this.temperatureRecord.VehicleId).subscribe(probes => {\r\n this.temperatureProbe = probes.find(p => p.Id === this.temperatureRecord.TemperatureProbeId);\r\n this.setProbeName();\r\n });\r\n }\r\n}\r\n","import { IPlotTemperatureRecord } from \"@interfaces/IPlot\";\r\nimport { IProfileQueryOptions } from \"@temperature/_models/temperature/IProfileQueryOptions\";\r\nimport { ITemperatureAlarmRecord } from \"@temperature/_models/temperature/ITemperatureAlarmRecord\";\r\nimport { ITemperatureOutOfBoundsHistory } from \"@temperature/_models/temperature/ITemperatureOutOfBoundsHistory\";\r\nimport { ITemperatureProbeWithTemperatureData } from \"@temperature/_models/temperature/ITemperatureProbe\";\r\nimport { ITemperatureProfile } from \"@temperature/_models/temperature/ITemperatureProfile\";\r\nimport { ITemperatureRecord } from \"@temperature/_models/temperature/ITemperatureRecord\";\r\nimport * as angular from \"angular\";\r\n\r\n\r\nexport class TemperatureService {\r\n\r\n static $inject = [\"$http\"];\r\n\r\n constructor(\r\n private $http: angular.IHttpService\r\n ) {\r\n }\r\n\r\n getTemperatureProfiles(invalidateCache = false, queryOptions?: IProfileQueryOptions): angular.IPromise {\r\n // Angular version in TemperatureProfileService\r\n return this\r\n .$http({\r\n url: `/api/temperature/profiles`,\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 5, invalidateCache: invalidateCache, queryOptions: queryOptions }\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n saveTemperatureProfile(profile: ITemperatureProfile): angular.IPromise {\r\n // Angular version in TemperatureProfileService\r\n return this\r\n .$http({\r\n url: `/api/temperature/profiles`,\r\n method: \"POST\",\r\n cache: true,\r\n data: profile\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n getActiveVehicleTemperatureOutOfBoundsHistories(invalidateCache = false): angular.IPromise {\r\n // Angular version in TemperatureOutOfBoundsService\r\n return this\r\n .$http({\r\n url: `/api/temperature/outOfBoundsHistories/active`,\r\n method: \"GET\",\r\n cache: true,\r\n params: {\r\n minsToLive: 5,\r\n invalidateCache: invalidateCache\r\n }\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n getVehicleTemperatureOutOfBoundsHistories(vehicleId: number, startMoment: moment.Moment, endMoment: moment.Moment, invalidateCache = false): angular.IPromise {\r\n // Angular version in TemperatureOutOfBoundsService\r\n return this\r\n .$http({\r\n url: `/api/temperature/outOfBoundsHistories`,\r\n method: \"GET\",\r\n cache: true,\r\n params: {\r\n id: vehicleId,\r\n start: startMoment.toISOString(),\r\n end: endMoment.toISOString(),\r\n minsToLive: 5,\r\n invalidateCache: invalidateCache\r\n }\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n getVehicleTemperatureOutOfBoundsHistory(historyId: number): angular.IPromise {\r\n // Angular version in TemperatureOutOfBoundsService\r\n return this\r\n .$http({\r\n url: `/api/temperature/outOfBoundsHistory/${historyId}`,\r\n method: \"GET\"\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n getVehicleTemperatureOutOfBoundsHistoryByAlarmRecord(alarmId: number): angular.IPromise {\r\n // Angular version in TemperatureOutOfBoundsService\r\n return this\r\n .$http({\r\n url: `/api/temperature/outOfBoundsHistoryByAlarm/${alarmId}`,\r\n method: \"GET\"\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n getAllVehicleTemperatureOutOfBoundsHistories(startMoment: moment.Moment, endMoment: moment.Moment, invalidateCache = false): angular.IPromise {\r\n // Angular version in TemperatureOutOfBoundsService\r\n return this\r\n .$http({\r\n url: `/api/temperature/outOfBoundsHistories`,\r\n method: \"GET\",\r\n cache: true,\r\n params: {\r\n start: startMoment.toISOString(),\r\n end: endMoment.toISOString(),\r\n minsToLive: 5,\r\n invalidateCache: invalidateCache\r\n }\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n getTemperatureRecord(id: number): angular.IPromise {\r\n // Angular version in TemperatureRecordService\r\n return this\r\n .$http({\r\n url: `/api/temperature/records/${id}`,\r\n method: \"GET\",\r\n cache: true\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n getTemperatureAlarmRecord(id: number): angular.IPromise {\r\n // Angular version in TemperatureRecordService\r\n return this\r\n .$http({\r\n url: `/api/temperaturealarm/${id}`,\r\n method: \"GET\",\r\n cache: true\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n\r\n mapTemperatureRecordsToProbes(records: IPlotTemperatureRecord[], probes: ITemperatureProbeWithTemperatureData[]) {\r\n records.sort((a, b) => {\r\n return new Date(b.Timestamp).getTime() - new Date(a.Timestamp).getTime();\r\n });\r\n\r\n probes.forEach(probe => {\r\n probe.records = [];\r\n\r\n records.forEach(record => {\r\n if (record.TemperatureProbeId === probe.Id) {\r\n probe.records.push(record);\r\n }\r\n });\r\n\r\n probe.latestRecord = records.find(rec => rec.TemperatureProbeId === probe.Id)\r\n });\r\n\r\n return probes;\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from \"@angular/core\";\r\nimport { IVehicleOnlineStatus } from \"@app/main/components/videos/models/IVehicleOnlineStatus\";\r\nimport { CameraStatusService } from \"@app/main/components/videos/services/camera-status.service\";\r\nimport { DateService } from \"@app/services/date.service\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { Subscription } from \"rxjs\";\r\nimport \"./vehicle-online-status.component.scss\";\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: \"vehicle-online-status\",\r\n template: require(\"./vehicle-online-status.component.html\")\r\n})\r\nexport class VehicleOnlineStatusComponent implements OnChanges {\r\n\r\n @Input() vehicle: IVehicle;\r\n @Input() live: boolean;\r\n @Input() showContext: boolean;\r\n\r\n @Output() statusChange = new EventEmitter();\r\n\r\n get online(): boolean {\r\n return this.vehicle?.onlineStatus?.online;\r\n }\r\n\r\n get hasStreaming(): boolean {\r\n return this.vehicle?.onlineStatus?.hasStreaming;\r\n }\r\n\r\n // --\r\n\r\n displayText: string;\r\n\r\n // --\r\n\r\n onlineStatusSubscription: Subscription;\r\n\r\n constructor(\r\n private readonly dateService: DateService,\r\n private readonly translationService: TranslationService,\r\n private readonly cameraStatusService: CameraStatusService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.subscribeToOnlineStatus();\r\n this.subscribeToForceOnlineStatus();\r\n this.render();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.onlineStatusSubscription?.unsubscribe();\r\n this.onlineStatusSubscription = null;\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[\"vehicle\"]) {\r\n this.render();\r\n this.subscribeToOnlineStatus();\r\n }\r\n\r\n if (this.live && this.vehicle) {\r\n this.subscribeToOnlineStatus();\r\n }\r\n }\r\n\r\n // ---\r\n\r\n private subscribeToOnlineStatus(): void {\r\n this.onlineStatusSubscription?.unsubscribe();\r\n\r\n if (!this.live) {\r\n return;\r\n }\r\n\r\n this.onlineStatusSubscription = this.cameraStatusService\r\n .createOnlineStatusObservable(this.vehicle)\r\n .subscribe((data) => {\r\n this.vehicle.Plot = data.plot;\r\n this.vehicle.videoChannels = data.streamingChannels\r\n this.vehicle.onlineStatus = data.onlineStatus\r\n\r\n this.render();\r\n });\r\n }\r\n\r\n private render(): void {\r\n this.displayText = this.translationService.t(`VehicleOnlineStatus.CameraOffline`);\r\n\r\n if (!this.vehicle) {\r\n this.displayText = this.translationService.t(`VehicleOnlineStatus.UnknownVehicle`);\r\n return;\r\n }\r\n\r\n if (!this.vehicle.onlineStatus) {\r\n return;\r\n }\r\n\r\n if (this.live) {\r\n this.emitUpdatedStatus(this.vehicle.onlineStatus);\r\n }\r\n\r\n if (this.vehicle.onlineStatus.online) {\r\n this.displayText = this.translationService.t(`VehicleOnlineStatus.CameraOnline`);\r\n return;\r\n }\r\n\r\n if (this.vehicle.onlineStatus.lastOnlineTime) {\r\n const lastOnlineTime = this.dateService.relativeTime(this.vehicle.onlineStatus.lastOnlineTime);\r\n this.displayText = lastOnlineTime;\r\n\r\n if (this.showContext) {\r\n this.displayText = this.translationService.t(\"VehicleOnlineStatus.LastOnlineX\", lastOnlineTime)\r\n }\r\n\r\n return;\r\n }\r\n }\r\n\r\n private emitUpdatedStatus(newStatus: IVehicleOnlineStatus): void {\r\n this.statusChange.emit(newStatus);\r\n }\r\n \r\n private subscribeToForceOnlineStatus(): void {\r\n this.cameraStatusService.forceStatusUpdate$.pipe(untilDestroyed(this)).subscribe(() => {\r\n this.subscribeToOnlineStatus();\r\n });\r\n }\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { lastValueFrom } from \"rxjs\";\r\nimport { map } from \"rxjs/operators\";\r\nimport { CameraOnlineStatus } from \"../models/camera-online-status\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CameraOnlineHistoryService {\r\n constructor(\r\n private readonly httpClient: HttpClient\r\n ) {}\r\n\r\n getCameraOnlineStatuses(): Promise {\r\n return lastValueFrom(this.httpClient\r\n .get(\"/api/cameras/onlinehistory/statuses/\"));\r\n }\r\n\r\n getCameraOnlineStatus(vehicleId: number): Promise {\r\n return lastValueFrom(this.httpClient\r\n .get(`/api/cameras/onlinehistory/statuses?vehicleId=${vehicleId}`)\r\n .pipe(map((statuses) => {\r\n return statuses?.length >= 0\r\n ? statuses[0]\r\n : null\r\n })));\r\n }\r\n}\r\n","import { AccelerometerInfoType } from \"../enum/AccelerometerInfoType\";\r\nimport { ReasonCode } from \"../enum/ReasonCode\";\r\nimport { IPlot, IVeriMarkerOptions } from \"@interfaces/IPlot\";\r\nimport { CanvasService } from \"./canvas.service\";\r\nimport { ColourService } from \"./colour.service\";\r\nimport { UnitConversionService, UnitConversionType } from \"./unitConversion.service\";\r\nimport { ReasonCodeService } from \"./reasonCode.service\";\r\n\r\nexport class VeriMarkerService {\r\n\r\n //private markerWidth = 24 + 12;\r\n //private markerHeight = 24 + 12;\r\n\r\n readonly defaultMarkerBuffer = 12;\r\n readonly defaultMarkerWidth = 20 + this.defaultMarkerBuffer;\r\n readonly defaultMarkerHeight = 20 + this.defaultMarkerBuffer;\r\n\r\n static $inject = [\"unitConversionService\", \"reasonCodeService\", \"canvasService\", \"colourService\"];\r\n\r\n constructor(\r\n private readonly unitConversionService: UnitConversionService,\r\n private readonly reasonCodeService: ReasonCodeService,\r\n private readonly canvasService: CanvasService,\r\n private readonly colourService: ColourService) {\r\n }\r\n\r\n getDefaultMarkerWidth() {\r\n return this.defaultMarkerWidth;\r\n }\r\n\r\n generateColorPip(color: string, width: number): string {\r\n const lineWidth = Math.floor(width / 10);\r\n let adjustedWidth = width - (lineWidth * 2);\r\n\r\n width += 1;\r\n\r\n //width += 4; // To allow for outer stroke\r\n\r\n var canvas = this.canvasService.getCachedImageCanvas(width, width, \"marker.pip\", color);\r\n if (!canvas) {\r\n canvas = this.canvasService.createCachedImageCanvas(width, width, \"marker.pip\", color);\r\n\r\n const context = canvas.getContext(\"2d\");\r\n\r\n context.translate(0.5, 0.5);\r\n context.fillStyle = color;\r\n\r\n context.lineWidth = lineWidth * 3;\r\n context.strokeStyle = \"white\";\r\n this.canvasService.drawRoundRect(context, 1, 1, adjustedWidth, adjustedWidth, adjustedWidth / 2);\r\n context.fill();\r\n context.stroke();\r\n\r\n adjustedWidth += 2;\r\n context.lineWidth = lineWidth;\r\n context.strokeStyle = \"rgba(0,0,0,.7)\";\r\n this.canvasService.drawRoundRect(context, 0, 0, adjustedWidth, adjustedWidth, adjustedWidth / 2);\r\n context.stroke();\r\n\r\n context.translate(-0.5, -0.5);\r\n }\r\n else {\r\n //console.log(\"cache hit\");\r\n }\r\n\r\n return canvas.toDataURL();\r\n }\r\n\r\n generatePip(reasonCode: ReasonCode, width: number): string {\r\n const lineWidth = 2;\r\n const adjustedWidth = width - (lineWidth * 2);\r\n\r\n var canvas = this.canvasService.getCachedImageCanvas(width, width, \"marker.pip\", reasonCode.toString());\r\n if (!canvas) {\r\n canvas = this.canvasService.createCachedImageCanvas(width, width, \"marker.pip\", reasonCode.toString());\r\n\r\n const context = canvas.getContext(\"2d\");\r\n\r\n context.translate(0.5, 0.5);\r\n context.fillStyle = this.reasonCodeService.getBackgroundColor(reasonCode);\r\n context.lineWidth = lineWidth;\r\n context.strokeStyle = \"rgba(0,0,0,.5)\";\r\n this.canvasService.drawRoundRect(context, 1, 1, adjustedWidth, adjustedWidth, adjustedWidth / 2);\r\n context.fill();\r\n context.stroke();\r\n context.translate(-0.5, -0.5);\r\n }\r\n\r\n return canvas.toDataURL();\r\n }\r\n\r\n createVeriMarkerOptions(plot: IPlot, selected?: boolean): IVeriMarkerOptions {\r\n\r\n const markerOptions: IVeriMarkerOptions = {\r\n selected: selected,\r\n selectedColor: plot && plot.color || \"rgba(0,0,0,.5)\" || \"rgba(0,145,234,.6)\",\r\n reason: ReasonCode.Unknown,\r\n markerContents: \"?\",\r\n zIndex: selected ? 1 : 2\r\n };\r\n\r\n if (plot) {\r\n markerOptions.angle = plot.Direction;\r\n markerOptions.markerContents = plot.Velocity > 0 ? this.unitConversionService.convertToUserUnit(plot.Velocity, UnitConversionType.Speed).toString() : \"0\";\r\n markerOptions.reason = plot.Reason;\r\n markerOptions.time = plot.UtcMoment;\r\n\r\n if (plot.Reason === ReasonCode.Accelerometer && plot.AccelerometerInfo) {\r\n switch (plot.AccelerometerInfo.Direction) {\r\n case AccelerometerInfoType.Acceleration:\r\n markerOptions.markerContents = \"A\";\r\n break;\r\n\r\n case AccelerometerInfoType.Deceleration:\r\n markerOptions.markerContents = \"D\";\r\n break;\r\n\r\n case AccelerometerInfoType.Cornering:\r\n markerOptions.markerContents = \"C\";\r\n break;\r\n }\r\n }\r\n\r\n plot.veriMarkerOptions = markerOptions;\r\n }\r\n\r\n return markerOptions;\r\n }\r\n\r\n private createUniqueMarkerCode(veriMarkerOptions: IVeriMarkerOptions): string {\r\n var width = veriMarkerOptions.width || this.defaultMarkerWidth;\r\n var height = veriMarkerOptions.height || this.defaultMarkerHeight;\r\n\r\n var angle = this.drawAngle(veriMarkerOptions) ? veriMarkerOptions.angle : null;\r\n var backgroundColor = this.reasonCodeService.getBackgroundColor(veriMarkerOptions.reason);\r\n\r\n return `${width}-${height}-${angle}-${veriMarkerOptions.markerContents}-${backgroundColor}-${veriMarkerOptions.selected}`;\r\n }\r\n\r\n getMarkerSize(veriMarkerOptions: IVeriMarkerOptions): number {\r\n return veriMarkerOptions.width || this.defaultMarkerWidth;\r\n }\r\n\r\n generateMarkerImageCanvas(veriMarkerOptions: IVeriMarkerOptions, canvas?: HTMLCanvasElement): HTMLCanvasElement {\r\n\r\n var width = this.getMarkerSize(veriMarkerOptions);/*veriMarkerOptions.width || this.defaultMarkerWidth*/;\r\n var height = this.getMarkerSize(veriMarkerOptions);/*veriMarkerOptions.height || this.defaultMarkerHeight*/;\r\n\r\n var markerXPos = width / 2;\r\n var markerYPos = Math.min(height, this.defaultMarkerHeight) / 2;\r\n\r\n var canvas = canvas || this.canvasService.getSingleUseCanvas(width, height);\r\n var context = canvas.getContext(\"2d\");\r\n\r\n context.clearRect(0, 0, width, height);\r\n\r\n //if (veriMarkerOptions.label) {\r\n // this.drawRegistration(context, veriMarkerOptions.label, veriMarkerOptions.labelIsReg, width, height);\r\n //}\r\n\r\n //console.log(height, this.markerHeight);\r\n\r\n this.drawMarker(context, veriMarkerOptions, markerXPos, markerYPos);\r\n\r\n return canvas;\r\n }\r\n\r\n generateMarkerImageUrl(veriMarkerOptions: IVeriMarkerOptions): angular.IPromise {\r\n var markerCode = this.createUniqueMarkerCode(veriMarkerOptions);\r\n\r\n var existingBlobPromise = this.canvasService.getBlobCachePromise(markerCode);\r\n\r\n if (existingBlobPromise) {\r\n return existingBlobPromise;\r\n }\r\n\r\n var canvas = this.generateMarkerImageCanvas(veriMarkerOptions);\r\n\r\n return this.canvasService.getBlobUrlPromise(canvas, markerCode);\r\n\r\n //var dataURI = canvas.toDataURL();\r\n //return dataURI;\r\n }\r\n\r\n private drawAngle(veriMarkerOptions: IVeriMarkerOptions) {\r\n const isNumeric = !isNaN(parseFloat(veriMarkerOptions.markerContents)) && isFinite(veriMarkerOptions.markerContents as any);\r\n const drawAngle = veriMarkerOptions.markerContents != \"0\" && isNumeric && veriMarkerOptions.reason != ReasonCode.Unknown;\r\n\r\n return drawAngle;\r\n }\r\n\r\n drawMarker(context: CanvasRenderingContext2D, veriMarkerOptions: IVeriMarkerOptions, x: number, y: number) {\r\n window.performance.mark(\"drawMarker\");\r\n var markerDiameter = 24;\r\n var markerRadius = markerDiameter / 2;\r\n\r\n const drawAngle = this.drawAngle(veriMarkerOptions);\r\n const angle = veriMarkerOptions.angle + 45;\r\n\r\n // Draw reason code colour\r\n this.drawMarkerShape(context, x, y, markerDiameter, drawAngle, angle);\r\n\r\n // Shadow\r\n context.lineWidth = veriMarkerOptions.selected ? 6 : 4;\r\n //var transparentColor = this.colourService.createTransparentColor(veriMarkerOptions.selectedColor, 0.7);\r\n context.strokeStyle = veriMarkerOptions.selected ? /*transparentColor*/veriMarkerOptions.selectedColor : \"rgba(0,0,0,.1)\";\r\n //context.strokeStyle = veriMarkerOptions.selected ? transparentColor : \"rgba(255,255,255,.99)\";\r\n context.stroke();\r\n\r\n // Fill\r\n context.fillStyle = this.reasonCodeService.getBackgroundColor(veriMarkerOptions.reason);\r\n context.fill();\r\n\r\n // Border\r\n context.lineWidth = 1;\r\n context.strokeStyle = veriMarkerOptions.selected ? \"#555\" : \"rgba(0,0,0,.5)\";\r\n context.stroke();\r\n\r\n context.font = \"400 11px Roboto\";\r\n context.textAlign = \"center\";\r\n context.fillStyle = this.reasonCodeService.getForegroundColor(veriMarkerOptions.reason);\r\n\r\n const textToFill = veriMarkerOptions.markerContents || \"--\";\r\n context.fillText(textToFill, x, y + 4);\r\n\r\n //if (!plotMarkerOptions.markerContents) {\r\n // //console.error(textToFill, plotMarkerOptions);\r\n // console.error(\"plotMarkerOptions.markerContents\", plotMarkerOptions.markerContents);\r\n //}\r\n window.performance.measure(\"drawMarker\");\r\n }\r\n\r\n drawMarkerShape(context: CanvasRenderingContext2D, x: number, y: number, width: number, drawAngle: boolean, angle: number) {\r\n\r\n const drawingX = - (width / 2);\r\n const drawingY = - (width / 2);\r\n\r\n if (drawAngle) {\r\n context.translate(x, y);\r\n this.canvasService.rotateContext(context, angle);\r\n\r\n const cornerRadius = Math.ceil(width / 2);\r\n this.canvasService.drawRoundRect(context, drawingX, drawingY, width, width, { tl: drawAngle ? 0 : cornerRadius, tr: cornerRadius, bl: cornerRadius, br: cornerRadius });\r\n\r\n this.canvasService.rotateContext(context, -angle);\r\n context.translate(-x, -y);\r\n }\r\n else {\r\n const radius = width / 2;\r\n context.beginPath();\r\n context.arc(x, y, radius, 0, Math.PI * 2, false);\r\n context.closePath();\r\n }\r\n }\r\n\r\n drawRegistration(context: CanvasRenderingContext2D, label: string, labelIsReg: boolean, width: number, height: number) {\r\n var regHeight = 18;\r\n var maxRegLength = 12;\r\n\r\n let canvas = this.canvasService.getCachedImageCanvas(width, regHeight, \"registration\", labelIsReg.toString());\r\n if (!canvas) {\r\n canvas = this.canvasService.createCachedImageCanvas(width, regHeight, \"registration\", labelIsReg.toString());\r\n const registrationContext = canvas.getContext(\"2d\");\r\n registrationContext.translate(0.5, 0.5);\r\n\r\n registrationContext.fillStyle = labelIsReg ? \"#ffdd21\" : \"#ffffff\";\r\n registrationContext.strokeStyle = \"rgba(0, 0, 0, 0.4)\";\r\n registrationContext.lineWidth = 1;\r\n this.canvasService.drawRoundRect(registrationContext, 0, 0, width - 1, regHeight - 1, 3);\r\n\r\n registrationContext.fill();\r\n registrationContext.stroke();\r\n\r\n registrationContext.translate(-0.5, -0.5);\r\n }\r\n\r\n context.drawImage(canvas, 0, 0, canvas.width, canvas.height, 0, height - regHeight - 1, width, regHeight);\r\n\r\n if (label && label.length > maxRegLength) {\r\n label = label.substr(0, maxRegLength - 3) + \"...\";\r\n }\r\n\r\n context.font = \"500 12px Roboto\";\r\n context.textAlign = \"center\";\r\n context.fillStyle = \"#333\";\r\n context.fillText(label.toUpperCase(), width / 2, height - 6);\r\n }\r\n\r\n //generateClusterImage(width: number, percentage: number, colour1: string = null, colour2: string = null): string {\r\n // var utilisationColor = colour1 || \"red\";\r\n // var nonUtilisationColor = colour2 || \"grey\";\r\n\r\n // const canvas = this.canvasService.getSingleUseCanvas(width, width);\r\n // const context = canvas.getContext(\"2d\");\r\n\r\n // //context.fillStyle = \"rgb(220,220,220)\";\r\n // //context.fillRect(0, 0, width, width);\r\n\r\n // context.translate(0.5, 0.5);\r\n // context.fillStyle = \"white\";\r\n // context.lineWidth = 2;\r\n // context.strokeStyle = \"#555\";\r\n\r\n // var x = width / 2;\r\n // var y = width / 2;\r\n // //var adjustedWidth = width - 30;\r\n // var adjustedWidth = 33;\r\n // var adjustedRadius = adjustedWidth / 2;\r\n\r\n // // White background\r\n // //context.beginPath();\r\n // //context.arc(x, y, adjustedRadius, 0, Math.PI * 2, false);\r\n // //context.closePath();\r\n\r\n // //context.fill();\r\n // //context.stroke();\r\n\r\n // var max = 2 * Math.PI;\r\n // var radiusModifier = max / 100;\r\n\r\n // //console.log(percentage * radiusModifier, utilisationColor);\r\n\r\n // var utilisationArcStart = 0;\r\n // var utilisationArcEnd = percentage * radiusModifier;\r\n // var nonUtilisationArcStart = utilisationArcEnd;\r\n // var nontUtilisationArcEnd = max;\r\n\r\n // // Outer border\r\n // this.strokeArc(context, x, y, adjustedRadius + 4, \"#555\", 0, max);\r\n\r\n // // Utilisation arcs\r\n // this.strokeArc(context, x, y, adjustedRadius + 3, utilisationColor, utilisationArcStart, utilisationArcEnd);\r\n\r\n // // Non utilisation arc\r\n // this.strokeArc(context, x, y, adjustedRadius + 3, nonUtilisationColor, nonUtilisationArcStart, nontUtilisationArcEnd);\r\n\r\n // // Reset canvas\r\n // context.translate(-0.5, -0.5);\r\n\r\n // return canvas.toDataURL();\r\n //}\r\n\r\n //private strokeArc(context: CanvasRenderingContext2D, x: number, y: number, radius: number, color: string, startAngle: number, endAngle: number) {\r\n // context.beginPath();\r\n // context.lineWidth = 4;\r\n // context.strokeStyle = color;\r\n // context.arc(x, y, radius, startAngle, endAngle, false);\r\n // context.stroke();\r\n //}\r\n}\r\n","import { AfterViewInit, Component, ContentChild, ElementRef, EventEmitter, HostBinding, HostListener, Injector, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild } from \"@angular/core\";\r\nimport { AbstractControl, ControlValueAccessor, NgControl, ValidationErrors, Validator, Validators } from \"@angular/forms\";\r\nimport { ComponentUtility } from \"@app/class/ComponentUtility\";\r\nimport { FileReaderService } from \"@services/fileReader.service\";\r\nimport { HTMLService } from \"@services/htmlService.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport \"./fileUpload.scss\";\r\n\r\nexport interface IFileUploadDetails {\r\n file: File;\r\n fileString: string;\r\n}\r\n\r\n@Component({\r\n selector: 'file-upload',\r\n template: require('./fileUpload.html'),\r\n providers: [\r\n ComponentUtility.createValueAccessorProvider(FileUploadComponent),\r\n ComponentUtility.createValidatorProvider(FileUploadComponent)\r\n ]\r\n})\r\nexport class FileUploadComponent implements OnInit, OnChanges, AfterViewInit, ControlValueAccessor, Validator {\r\n @Input() file: File;\r\n @Input() fileString: string;\r\n @Input() isImage: boolean;\r\n @Input() uploadMessage: string;\r\n @Input() showClear: boolean;\r\n @Input() showChange: boolean;\r\n @Input() whiteBackground: boolean;\r\n @Input() maxFileSizeMb: number;\r\n\r\n @Output() onFileChanged: EventEmitter = new EventEmitter();\r\n @Output() onFileCleared: EventEmitter = new EventEmitter();\r\n\r\n @ViewChild(\"fileInput\", { static: false }) fileInput: ElementRef;\r\n\r\n @HostListener(\"drop\", [\"$event\"]) onDropFile(event: DragEvent): void {\r\n event.preventDefault();\r\n this.processNewFile(event.dataTransfer.files[0]);\r\n }\r\n\r\n @HostListener('dragover', ['$event']) onDragOver(event: DragEvent): void {\r\n event.preventDefault();\r\n this.setDraggingState(true);\r\n }\r\n\r\n @HostListener('dragleave', ['$event']) onDragLeave(event: DragEvent): void {\r\n event.preventDefault();\r\n this.setDraggingState(false);\r\n }\r\n\r\n @HostBinding(\"class.required\") @Input() required = false;\r\n\r\n value: any;\r\n inputId: string;\r\n showMessage: boolean;\r\n\r\n hasFile: boolean;\r\n hasProjectedContent: boolean;\r\n hasFileChanged: boolean;\r\n fileSizeLabel: string;\r\n dragging: boolean;\r\n\r\n fileTooLarge = false;\r\n maxFileSize = 5 * 1024 * 1024; // 5mb\r\n maxFileSizeLabel: string;\r\n\r\n constructor(\r\n protected readonly injector: Injector,\r\n private readonly elementRef: ElementRef,\r\n private readonly fileReaderService: FileReaderService,\r\n private readonly htmlService: HTMLService\r\n ) {\r\n }\r\n\r\n ngOnInit() {\r\n if (!this.file) {\r\n this.file = null;\r\n }\r\n\r\n this.inputId = `fileinputid-${Math.floor(Math.random() * 1000)}`;\r\n this.maxFileSizeLabel = this.fileReaderService.fileSizeAsString(this.maxFileSize);\r\n }\r\n\r\n ngAfterViewInit() {\r\n var ngContent = this.htmlService.findNearest(this.elementRef.nativeElement, \".ng-content\")\r\n this.hasProjectedContent = ngContent?.childElementCount > 0;\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['file'] && this.file) {\r\n this.onFileUpdated();\r\n }\r\n\r\n if (changes[\"fileString\"]) {\r\n this.onFileStringUpdated();\r\n }\r\n\r\n if (changes['maxFileSizeMb']) {\r\n this.maxFileSize = this.maxFileSizeMb * 1024 * 1024;\r\n }\r\n }\r\n\r\n onInputFileChanged(event: Event) {\r\n this.file = (event.target as HTMLInputElement).files[0];\r\n\r\n this.processNewFile(this.file);\r\n }\r\n\r\n changeFile(event: Event): void {\r\n event.preventDefault();\r\n this.fileInput.nativeElement.click();\r\n }\r\n\r\n clearFile() {\r\n this.fileInput.nativeElement.value = \"\";\r\n this.file = null;\r\n this.fileString = null;\r\n this.showMessage = true;\r\n this.setDraggingState(false);\r\n\r\n this.updateHasFile();\r\n\r\n if (this.onFileCleared) {\r\n this.onFileCleared.emit();\r\n }\r\n }\r\n\r\n // --- Control Value Accessor\r\n\r\n onChange: (value: any) => void;\r\n onTouched: () => void;\r\n control: NgControl;\r\n\r\n registerOnChange(callback: (value: any) => void): void {\r\n this.onChange = callback;\r\n }\r\n\r\n registerOnTouched(callback: () => void): void {\r\n this.onTouched = callback;\r\n }\r\n\r\n writeValue(value: any): void {\r\n this.value = value;\r\n }\r\n\r\n markAsTouched(): void {\r\n if (!this.onTouched || !this.control || this.control.touched) {\r\n return;\r\n }\r\n\r\n this.onTouched();\r\n }\r\n\r\n // Validator\r\n\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n this.control = this.injector.get(NgControl);\r\n\r\n this.required = control.hasValidator(Validators.required);\r\n\r\n return null;\r\n }\r\n // -----------------------------\r\n\r\n private processNewFile(file: File): void {\r\n if (!file) {\r\n this.clearFile();\r\n return;\r\n }\r\n\r\n this.file = file;\r\n this.hasFileChanged = true;\r\n this.fileTooLarge = false;\r\n this.setDraggingState(false);\r\n\r\n this.onFileUpdated().then(() => {\r\n this.onFileChanged.emit({ file: this.file, fileString: this.fileString });\r\n });\r\n }\r\n\r\n private setDraggingState(state: boolean): void {\r\n this.dragging = state;\r\n }\r\n\r\n private onFileStringUpdated() {\r\n this.updateHasFile();\r\n\r\n if (!this.fileString) {\r\n return;\r\n }\r\n\r\n this.showMessage = false;\r\n }\r\n\r\n private onFileUpdated(): Promise {\r\n return new Promise((resolve, reject) => {\r\n\r\n this.updateHasFile();\r\n\r\n if (!this.file) {\r\n reject(\"No file provided\");\r\n }\r\n\r\n if (this.file.size > this.maxFileSize) {\r\n this.clearFile();\r\n this.fileTooLarge = true;\r\n\r\n reject(\"File too large\");\r\n }\r\n\r\n this.fileSizeLabel = this.fileReaderService.fileSizeAsString(this.file.size);\r\n\r\n this.fileReaderService\r\n .readAsDataUrl(this.file)\r\n .then((result) => {\r\n this.fileString = \"\";\r\n\r\n // Don't create fileString if its not an image\r\n if (this.fileReaderService.fileIsImage(this.file)) {\r\n this.fileString = result;\r\n }\r\n\r\n this.updateHasFile();\r\n\r\n resolve(\"File updated\");\r\n }).catch((error: string) => {\r\n reject(`Error updating file ${error}`);\r\n });\r\n });\r\n }\r\n\r\n private updateHasFile() {\r\n if (this.isImage) {\r\n this.hasFile = !!this.fileString;\r\n }\r\n else {\r\n this.hasFile = !!this.file;\r\n }\r\n }\r\n}\r\n","import { Component, EventEmitter, HostBinding, Injector, Input, Output, SimpleChanges, TemplateRef } from \"@angular/core\";\r\nimport { AbstractControl, ControlValueAccessor, NgControl, ValidationErrors, Validator, Validators } from \"@angular/forms\";\r\nimport { ComponentUtility } from \"@app/class/ComponentUtility\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { DropdownContainer } from \"../dropdown-container/dropdown-container\";\r\nimport { VSelectOptionComponent } from \"./v-select-option/v-select-option.component\";\r\nimport \"./v-select.component.scss\";\r\n\r\n@Component({\r\n selector: \"v-select\",\r\n template: require(\"./v-select.component.html\"),\r\n providers: [\r\n ComponentUtility.createValueAccessorProvider(VSelectComponent),\r\n ComponentUtility.createValidatorProvider(VSelectComponent)\r\n ]\r\n})\r\nexport class VSelectComponent extends DropdownContainer implements ControlValueAccessor, Validator {\r\n\r\n @Input() selectedValue: any;\r\n @Output() selectedValueChange = new EventEmitter();\r\n\r\n @Input() label: string;\r\n @Input() disabled: boolean;\r\n @Input() icon: string;\r\n @Input() itemTemplate: TemplateRef;\r\n\r\n @Input() showTooltip: boolean;\r\n\r\n // Create v-select-enum-option that handles this logic\r\n @Input() enum: any;\r\n @Input() enumName: string;\r\n\r\n // ---\r\n\r\n showDropdown = false;\r\n\r\n selectedOption: VSelectOptionComponent;\r\n children: VSelectOptionComponent[] = [];\r\n\r\n constructor(\r\n protected readonly injector: Injector,\r\n protected readonly translationService: TranslationService) {\r\n super();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[\"selectedValue\"]) {\r\n this.setSelectedValue();\r\n }\r\n }\r\n\r\n\r\n toggleDropdown(event: MouseEvent) {\r\n event?.stopPropagation();\r\n\r\n if (this.disabled) {\r\n this.showDropdown = false;\r\n return;\r\n }\r\n\r\n this.showDropdown = !this.showDropdown;\r\n }\r\n\r\n clearChildren(): void {\r\n this.children = [];\r\n }\r\n\r\n registerSelectOption(option: VSelectOptionComponent): void {\r\n this.children.push(option);\r\n\r\n if (option.selected || (this.selectedValue != null && this.selectedValue == option.value)) {\r\n this.selectedOption = option;\r\n option.selected = true;\r\n }\r\n }\r\n\r\n deregisterSelectOption(option: VSelectOptionComponent): void {\r\n const indexOfChild: number = this.children.indexOf(option);\r\n\r\n if (indexOfChild === -1) {\r\n return;\r\n }\r\n\r\n this.children.splice(indexOfChild, 1);\r\n }\r\n\r\n itemClicked(item: VSelectOptionComponent) {\r\n this.showDropdown = false;\r\n\r\n if (this.disabled) {\r\n return;\r\n }\r\n\r\n this.selectedOption = item;\r\n\r\n this.clearSelectedValue();\r\n\r\n this.selectedOption.selected = true;\r\n\r\n this.selectedValueChange.emit(this.selectedOption.value);\r\n\r\n if (this.onChange) {\r\n this.onChange(this.selectedOption.value);\r\n }\r\n }\r\n\r\n onClosed($event: MouseEvent) {\r\n setTimeout(() => {\r\n this.showDropdown = false;\r\n });\r\n }\r\n\r\n // --- Control Value Accessor\r\n\r\n onChange: (value: any) => void;\r\n onTouched: () => void;\r\n control: NgControl;\r\n \r\n registerOnChange(callback: (value: any) => void): void {\r\n this.onChange = callback;\r\n }\r\n\r\n registerOnTouched(callback: () => void): void {\r\n this.onTouched = callback;\r\n }\r\n\r\n writeValue(value: string): void {\r\n this.selectedValue = value;\r\n this.setSelectedValue();\r\n }\r\n\r\n setDisabledState(state: boolean) {\r\n this.disabled = state;\r\n }\r\n\r\n markAsTouched(): void {\r\n if (!this.onTouched || !this.control || this.control.touched) {\r\n return;\r\n }\r\n\r\n this.onTouched();\r\n }\r\n // Validator\r\n\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n this.control = this.injector.get(NgControl);\r\n\r\n return null;\r\n }\r\n\r\n\r\n // ---\r\n\r\n private setSelectedValue(): void {\r\n this.clearSelectedValue();\r\n\r\n const matchingValue = this.children.find(option => option.value === this.selectedValue);\r\n\r\n if (matchingValue) {\r\n matchingValue.selected = true;\r\n return;\r\n }\r\n\r\n delete this.selectedOption;\r\n }\r\n\r\n private clearSelectedValue(): void {\r\n this.children.forEach(option => option.selected = false);\r\n }\r\n}\r\n","import { Component, EventEmitter, HostBinding, Injector, Input, OnChanges, Output, SimpleChanges } from '@angular/core';\r\nimport { AbstractControl, NgControl, ValidationErrors, Validators } from '@angular/forms';\r\nimport { ComponentUtility } from '@app/class/ComponentUtility';\r\nimport { IRadioButtonCard } from '../radio-button-cards/radio-button-cards.component';\r\nimport { IRadioButtonSmallCard } from '../radio-button-small-cards/radio-button-small-cards.component';\r\nimport \"./radio-button-base.component.scss\";\r\n\r\nexport interface IRadioButton {\r\n label: string;\r\n description?: string;\r\n value: T;\r\n disabled?: boolean;\r\n hidden?: boolean;\r\n selected?: boolean;\r\n\r\n highlightColor?: string;\r\n}\r\n\r\ntype RadioButton = IRadioButton | IRadioButtonCard | IRadioButtonSmallCard;\r\n\r\n@Component({\r\n selector: 'v-radio-button-base',\r\n template: require('./radio-button-base.component.html'),\r\n providers: [\r\n ComponentUtility.createValueAccessorProvider(RadioButtonBaseComponent),\r\n ComponentUtility.createValidatorProvider(RadioButtonBaseComponent)\r\n ]\r\n})\r\nexport class RadioButtonBaseComponent implements OnChanges {\r\n\r\n @Input() buttons: RadioButton[];\r\n @Input() allowMultiple: boolean;\r\n @Input() allowNone: boolean = true;\r\n @Input() layout: \"column\" | \"row\" = \"row\";\r\n @Input() inlineText: boolean;\r\n\r\n @Input() selected: RadioButton | RadioButton[];\r\n @Output() selectedChange = new EventEmitter();\r\n\r\n @HostBinding(\"class.layout-row\") get row() { return this.layout === \"row\" };\r\n @HostBinding(\"class.layout-column\") get column() { return this.layout === \"column\" };\r\n\r\n @HostBinding(\"class.required\") @Input() required: boolean;\r\n @HostBinding(\"class.disabled\") @Input() disabled: boolean;\r\n\r\n constructor(\r\n protected readonly injector: Injector\r\n ) {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[\"buttons\"] && this.allowMultiple) {\r\n this.selected = this.buttons.filter((button: IRadioButton) => button.selected);\r\n }\r\n\r\n if (changes[\"selected\"] && !!this.selected && !Array.isArray(this.selected) && !this.allowMultiple) {\r\n this.selectButtonByValue(this.selected.value);\r\n }\r\n }\r\n\r\n onClickRadioButton(button: RadioButton): void {\r\n\r\n if (button.disabled) {\r\n return;\r\n }\r\n\r\n if (this.allowMultiple) {\r\n this.handleMultipleClick(button);\r\n return;\r\n }\r\n\r\n this.handleStandardClick(button);\r\n }\r\n\r\n // --- Control Value Accessor\r\n\r\n onChange: (value: any) => void;\r\n onTouched: () => void;\r\n control: NgControl;\r\n\r\n registerOnChange(callback: (value: any) => void): void {\r\n this.onChange = callback;\r\n }\r\n\r\n registerOnTouched(callback: () => void): void {\r\n this.onTouched = callback;\r\n }\r\n\r\n writeValue(button: RadioButton): void {\r\n this.selectButtonByValue(button?.value);\r\n\r\n this.onChange?.(button?.value);\r\n }\r\n\r\n setDisabledState(state: boolean) {\r\n this.disabled = state;\r\n }\r\n\r\n markAsTouched(): void {\r\n if (!this.onTouched || !this.control || this.control.touched) {\r\n return;\r\n }\r\n\r\n this.onTouched();\r\n }\r\n\r\n // Validator\r\n\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n this.control = this.injector.get(NgControl);\r\n\r\n this.required = control.hasValidator(Validators.required);\r\n\r\n return null;\r\n }\r\n\r\n // ---\r\n\r\n private handleMultipleClick(button: RadioButton): void {\r\n\r\n const clickedButton = (button as IRadioButton);\r\n\r\n if (!Array.isArray(this.selected) || !this.selected) {\r\n this.selected = [];\r\n }\r\n\r\n const indexOfButton = this.selected.indexOf(clickedButton);\r\n\r\n if (indexOfButton > -1 && !this.canRemoveLastButton()) {\r\n return;\r\n }\r\n\r\n if (indexOfButton > -1 && clickedButton.selected) {\r\n clickedButton.selected = false;\r\n this.selected.splice(indexOfButton, 1);\r\n } else {\r\n clickedButton.selected = true;\r\n this.selected.push(button);\r\n }\r\n\r\n this.selectedChange.emit(this.selected);\r\n this.onChange?.(this.selected.map(selected => selected.value));\r\n }\r\n\r\n private canRemoveLastButton(): boolean {\r\n if (!this.allowNone && Array.isArray(this.selected) && this.selected.length == 1) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private handleStandardClick(button: RadioButton): void {\r\n if (this.selected === button) {\r\n return;\r\n }\r\n\r\n this.clearSelected();\r\n\r\n (button as IRadioButton).selected = true;\r\n\r\n this.selected = button;\r\n this.selectedChange.emit(button);\r\n this.onChange?.(button.value);\r\n }\r\n\r\n private clearSelected(): void {\r\n this.selected = null;\r\n this.buttons?.find((button: IRadioButton) => button.selected = false);\r\n }\r\n\r\n private selectButtonByValue(value: any): void {\r\n\r\n if (typeof value === \"undefined\" || value === null) {\r\n this.clearSelected();\r\n\r\n return;\r\n }\r\n\r\n this.selected = this.buttons?.find(button => button.value === value);\r\n (this.selected as IRadioButton).selected = true;\r\n }\r\n}\r\n","import { BroadcastEvent } from \"@enums/BroadcastEvent\";\r\nimport { ConstantsService } from \"@services/constantsService\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { StateObject, StateService, Transition } from \"@uirouter/angularjs\";\r\nimport { IWindowService } from \"angular\";\r\n\r\nexport interface IBreadcrumb {\r\n name: string;\r\n state?: StateObject;\r\n}\r\n\r\nexport interface IBreadcrumbNameResolver {\r\n [key: string]: string | number;\r\n // key example: peripheralNameBreadcrumbKey - uniquePartCommonPart\r\n}\r\n\r\nexport class BreadcrumbService {\r\n\r\n static $inject = [\"$rootScope\", \"$state\", \"$window\", \"$transitions\", \"translationService\", \"constantsService\"];\r\n\r\n stateCallbacks: (() => void)[] = [];\r\n breadcrumbNameResolvers: IBreadcrumbNameResolver | {} = {};\r\n\r\n constructor(\r\n private readonly $rootScope: angular.IScope,\r\n private readonly $state: StateService,\r\n private readonly $window: IWindowService,\r\n private readonly $transitions: Transition,\r\n private readonly translationService: TranslationService,\r\n private readonly constantsService: ConstantsService) {\r\n\r\n $transitions.onSuccess({}, () => {\r\n this.fireCallbacks();\r\n });\r\n\r\n\r\n $rootScope.$on(BroadcastEvent.UpdateBreadcrumbs, () => {\r\n this.fireCallbacks();\r\n });\r\n }\r\n\r\n registerStateCallback(callback: () => void) {\r\n this.stateCallbacks.push(callback);\r\n }\r\n\r\n getPageTitle(): string {\r\n const breadcrumbs = this.getBreadcrumbs();\r\n\r\n return breadcrumbs[breadcrumbs.length - 1]?.name || \"Unnamed Page\";\r\n }\r\n\r\n getPageSubtitle() {\r\n const breadcrumbs = this.getBreadcrumbs();\r\n\r\n const stateData = breadcrumbs[breadcrumbs.length - 1]?.state?.data;\r\n\r\n if (stateData?.subtitleTranslationKey) {\r\n return this.translationService.t(stateData.subtitleTranslationKey);\r\n }\r\n\r\n return stateData?.Subtitle || stateData?.subtitle;\r\n }\r\n\r\n updateDocumentTitle() {\r\n var pageTitle = \"\";\r\n var breadcrumbs = this.getBreadcrumbs();\r\n\r\n if (breadcrumbs) {\r\n //$window.document.title += translationService.t(toState.data?.translation);\r\n breadcrumbs.reverse().forEach(b => {\r\n if (pageTitle) {\r\n pageTitle += \" - \";\r\n }\r\n\r\n pageTitle += b.name;\r\n });\r\n\r\n if (pageTitle) {\r\n pageTitle += \" - \";\r\n }\r\n }\r\n\r\n pageTitle += \"AddSecure\";\r\n\r\n const subDomain = window.location.hostname.split(\".\")[0]\r\n if (!this.constantsService.getIsFleet()) {\r\n pageTitle = `[${subDomain}] ${pageTitle}`;\r\n }\r\n\r\n this.$window.document.title = pageTitle;\r\n }\r\n\r\n getBreadcrumbs(): IBreadcrumb[] {\r\n let breadcrumbs: IBreadcrumb[] = [];\r\n\r\n this.$state.$current.path.forEach((state: StateObject) => {\r\n let name = \"\";\r\n\r\n if (state) {\r\n if (state.data) {\r\n // Allow us to ignore certain routes at certain times\r\n if (state.abstract && this.constantsService.getIsMobile()) {\r\n return;\r\n }\r\n\r\n if (state.data.displayName || state.data.title) {\r\n name = state.data.displayName || state.data.title;\r\n }\r\n else if (state.data.translation) {\r\n name = this.translationService.t(state.data.translation);\r\n }\r\n\r\n if (state.data.hasOwnProperty(\"breadcrumbNameResolverKey\") &&\r\n this.breadcrumbNameResolvers[state.data.breadcrumbNameResolverKey]) {\r\n name = this.breadcrumbNameResolvers[state.data.breadcrumbNameResolverKey];\r\n }\r\n }\r\n\r\n if (!name) {\r\n name = state.self?.params?.title;\r\n }\r\n }\r\n\r\n if (name && state.navigable) {\r\n breadcrumbs.push({\r\n name: name,\r\n state: state\r\n });\r\n }\r\n });\r\n\r\n if (this.$state.current.params?.subTitle) {\r\n breadcrumbs.push({\r\n name: this.$state.current.params.subTitle,\r\n state: null\r\n });\r\n }\r\n\r\n return breadcrumbs;\r\n }\r\n\r\n updateNameResolver(nameResolver: IBreadcrumbNameResolver) {\r\n Object.assign(this.breadcrumbNameResolvers, nameResolver);\r\n\r\n this.updateDocumentTitle();\r\n }\r\n\r\n // ---\r\n\r\n private fireCallbacks() {\r\n\r\n this.stateCallbacks.forEach(callback => { callback(); })\r\n }\r\n}\r\n","import { IReportHistory } from \"@app/main/components/reports/models/IDynamicReportLog\";\r\nimport { IVeriTableHeader, IVeriTableRow, IVeriTableRowCell } from \"@directives/_veri/veriTable/veriTable.component\";\r\nimport { IJourney } from \"@interfaces/IJourney\";\r\nimport { IPlot, IPlotEvent } from \"@interfaces/IPlot\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { DynamicReportService, ExportType, IStandardColumns } from \"@reports/_services/dynamicReports.service\";\r\nimport { ColumnDataType } from \"@reports/enums/ColumnDataType\";\r\nimport { IColumnHeader } from \"@reports/models/IColumnHeader\";\r\nimport { IReportDefinition } from \"@reports/models/IReportDefinition\";\r\nimport { ReportParameterType } from \"@reports/models/IReportParameters\";\r\nimport { IReportRow } from \"@reports/models/IReportRow\";\r\nimport { IReportRowCell } from \"@reports/models/IReportRowCell\";\r\nimport { IReportTableDefinition } from \"@reports/models/IReportTableDefinition\";\r\nimport copy from \"fast-copy/dist/fast-copy.esm.js\";\r\n\r\nexport interface IExportTableParams {\r\n headers: IVeriTableHeader[];\r\n rows: IVeriTableRow[];\r\n\r\n exportType: ExportType;\r\n exportTitle: string;\r\n\r\n exportAsLandscape?: boolean;\r\n\r\n reportDefinition?: IReportDefinition;\r\n}\r\n\r\n\r\nexport class LegacyExportService {\r\n static $inject = [\"$q\", \"$mdDialog\", \"$window\", \"dynamicReportService\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $mdDialog: angular.material.IDialogService,\r\n private readonly $window: angular.IWindowService,\r\n private readonly dynamicReportService: DynamicReportService) {\r\n }\r\n\r\n showExportJourneysDialog(journeys: IJourney[], $event: MouseEvent, vehicle: IVehicle = null) {\r\n return this.$mdDialog.show(this.createDialogOptions($event, \"journeysExport\", journeys, vehicle));\r\n }\r\n\r\n showExportEventsDialog(events: IPlotEvent[], $event: MouseEvent) {\r\n return this.$mdDialog.show(this.createDialogOptions($event, \"eventsExport\", events));\r\n }\r\n\r\n showExportPlotsDialog(plots: IPlot[], $event: MouseEvent, vehicle: IVehicle = null) {\r\n return this.$mdDialog.show(this.createDialogOptions($event, \"plotsExport\", plots, vehicle));\r\n }\r\n\r\n downloadOldTableAsReport(params: IExportTableParams): angular.IPromise {\r\n return this.createReportDefinitionForExport(params).then(reportDefinition => {\r\n reportDefinition.TableDefinition.Rows?.forEach(row => delete row.veriTableRow);\r\n return this.downloadReportExport(reportDefinition, params.exportType);\r\n });\r\n }\r\n \r\n downloadReport(type: ExportType, reportLog: IReportHistory): void {\r\n let documentUrl;\r\n\r\n switch (type) {\r\n case ExportType.CSV:\r\n documentUrl = reportLog.csvUrl;\r\n break;\r\n\r\n case ExportType.Excel:\r\n documentUrl = reportLog.excelUrl;\r\n break;\r\n\r\n case ExportType.PDF:\r\n documentUrl = reportLog.pdfUrl;\r\n break;\r\n\r\n }\r\n\r\n this.$window.open(documentUrl);\r\n }\r\n\r\n // VeriTable\r\n\r\n private createReportDefinitionForExport(params: IExportTableParams): angular.IPromise {\r\n if (params.reportDefinition) {\r\n return this.$q.when(params.reportDefinition);\r\n }\r\n\r\n var headers: IVeriTableHeader[]\r\n var rows: IVeriTableRow[]\r\n\r\n if (params.headers && params.rows) {\r\n headers = params.headers;\r\n rows = params.rows;\r\n }\r\n\r\n if (!headers || !rows) {\r\n console.warn(\"No headers or rows to export\");\r\n return this.$q.when(null);\r\n }\r\n\r\n return this.dynamicReportService.getStandardColumns().then(standardColumns => {\r\n\r\n return this.createReportTableFromVeriTable(headers, rows, standardColumns.stringColumn).then(tableDefinition => {\r\n\r\n var reportDefinition: IReportDefinition = {\r\n Title: params.exportTitle,\r\n TableDefinition: tableDefinition,\r\n Parameters: {\r\n CustomParameters: [\r\n {\r\n Value: true,\r\n Active: true,\r\n ParameterType: ReportParameterType.HideParameterList\r\n }]\r\n },\r\n Portrait: !params.exportAsLandscape\r\n }\r\n\r\n return reportDefinition;\r\n });\r\n });\r\n }\r\n\r\n private createReportTableFromVeriTable(headers: IVeriTableHeader[], rows: IVeriTableRow[], stringColumn: IColumnHeader): angular.IPromise {\r\n\r\n return this.createVeriTableReportRows(headers, rows, stringColumn).then(reportRows => {\r\n const report: IReportTableDefinition = {\r\n Headers: this.createVeriTableReportHeaders(headers, stringColumn),\r\n Rows: reportRows,\r\n };\r\n\r\n return report;\r\n });\r\n }\r\n\r\n private createVeriTableReportHeaders(headers: IVeriTableHeader[], stringColumn: IColumnHeader): IColumnHeader[] {\r\n const reportHeaders: IColumnHeader[] = [];\r\n\r\n headers.forEach((header: IVeriTableHeader) => {\r\n if (header.excludeFromExport) {\r\n return;\r\n }\r\n\r\n const reportHeader = copy(stringColumn);\r\n\r\n reportHeader.Title = header.title;\r\n reportHeader.Width = header.width ? header.width : undefined;\r\n\r\n reportHeaders.push(reportHeader);\r\n });\r\n\r\n return reportHeaders;\r\n }\r\n\r\n private createVeriTableReportRows(headers: IVeriTableHeader[], veriTableRows: IVeriTableRow[], stringColumn: IColumnHeader): angular.IPromise {\r\n const rowPromises: angular.IPromise[] = [];\r\n const reportRows: IReportRow[] = [];\r\n\r\n veriTableRows.forEach((row: IVeriTableRow, index) => {\r\n var rowPromise = this.createVeriTableReportCells(headers, row.cells, stringColumn).then(cells => {\r\n\r\n var reportRow: IReportRow = {\r\n Parameters: null,\r\n Cells: cells,\r\n HasData: true,\r\n veriTableRow: row\r\n };\r\n\r\n if (row.children) {\r\n var subRowPromise = this.createVeriTableReportRows(headers, row.children, stringColumn).then(subRows => {\r\n\r\n reportRow.ChildRows = subRows;\r\n });\r\n\r\n rowPromises.push(subRowPromise);\r\n }\r\n\r\n reportRows.push(reportRow);\r\n });\r\n\r\n rowPromises.push(rowPromise);\r\n });\r\n\r\n return this.$q.all(rowPromises).then(rows => {\r\n reportRows.sort((a, b) => {\r\n return veriTableRows.indexOf(a.veriTableRow) - veriTableRows.indexOf(b.veriTableRow);\r\n });\r\n\r\n return reportRows;\r\n });\r\n }\r\n\r\n private createVeriTableReportCells(headers: IVeriTableHeader[], cells: IVeriTableRowCell[], stringColumn: IColumnHeader): angular.IPromise {\r\n const cellPromises: angular.IPromise[] = [];\r\n\r\n cells.forEach((cell: IVeriTableRowCell, index) => {\r\n const header = headers[index];\r\n if (cell.excludeFromExport || header.excludeFromExport) {\r\n return;\r\n }\r\n\r\n cellPromises.push(this.createReportCellFromVeriTable(cell, stringColumn));\r\n });\r\n\r\n return this.$q.all(cellPromises).then(cells => {\r\n return cells;\r\n });\r\n }\r\n\r\n private createReportCellFromVeriTable(cell: IVeriTableRowCell, stringColumn: IColumnHeader): angular.IPromise {\r\n\r\n const reportCell: IReportRowCell = {\r\n Data: cell.exportData || cell.contents || cell.data,\r\n Contents: cell.exportData || cell.contents || cell.data,\r\n CellDataType: ColumnDataType.String,\r\n DataSourceType: stringColumn.DataSourceType,\r\n DataSourceValue: stringColumn.DataSourceValue,\r\n };\r\n\r\n if (cell.exportDataMethod) {\r\n return cell.exportDataMethod().then(exportData => {\r\n reportCell.Data = exportData;\r\n reportCell.Contents = exportData;\r\n\r\n return reportCell;\r\n });\r\n }\r\n\r\n return this.$q.when(reportCell);\r\n }\r\n\r\n private downloadReportExport(reportDefinition: IReportDefinition, exportType: ExportType) {\r\n const documentUrl = this.getDocumentUrl(reportDefinition, exportType);\r\n\r\n if (documentUrl) {\r\n this.$window.open(documentUrl);\r\n return;\r\n }\r\n\r\n return this.dynamicReportService.generate(reportDefinition, exportType);\r\n }\r\n\r\n private getDocumentUrl(reportDefinition: IReportDefinition, exportType: ExportType) {\r\n switch (exportType) {\r\n case ExportType.PDF:\r\n return reportDefinition.reportPdfUrl;\r\n\r\n case ExportType.CSV:\r\n return reportDefinition.reportCsvUrl;\r\n\r\n case ExportType.Excel:\r\n return reportDefinition.reportExcelUrl;\r\n }\r\n }\r\n\r\n private createDialogOptions($event: MouseEvent, exportFileName: string, exportData: any, additionalData: any = null): angular.material.IDialogOptions {\r\n const controller = ($mdDialog) => {\r\n return {\r\n hide: (reload: boolean) => { $mdDialog.hide(reload); },\r\n exportData: exportData,\r\n additionalData: additionalData\r\n }\r\n };\r\n\r\n controller.$inject = [\"$mdDialog\"];\r\n\r\n return {\r\n targetEvent: $event,\r\n escapeToClose: true,\r\n clickOutsideToClose: true,\r\n template: require(`./${exportFileName}/${exportFileName}.dialog.html`),\r\n controller: controller,\r\n controllerAs: \"$ctrl\"\r\n }\r\n }\r\n}\r\n","export enum SchedulingFrequency {\r\n Daily,\r\n Weekly,\r\n Monthly,\r\n CurrentMonth,\r\n Weekend,\r\n Overnight\r\n}\r\n","import { ProductVendor } from \"@components/videos/enums/CameraProductType\";\r\nimport { IProduct } from \"@interfaces/IProduct\";\r\nimport { IBasicProductModel } from \"@interfaces/IProductUiViewModel\";\r\n\r\nexport class ProductService {\r\n\r\n static $inject = [\"$http\"];\r\n\r\n constructor(private readonly $http: angular.IHttpService) {\r\n\r\n }\r\n\r\n getProducts(): angular.IPromise {\r\n return this\r\n .$http({\r\n url: \"/api/products\",\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 60/*, invalidateCache: invalidateCache */}\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getProductByPeripheral(serial: string, invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/products/peripheral/${serial}`,\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 60 }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getProductByUnit(serial: string, invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/products/unit/${serial}`,\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 60 }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getProductsByVehicle(id: number, invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/products/vehicle/${id}`,\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 60 }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getProductUiViewModels(): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/products/basic`,\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 60 }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getProductVendorString(product: IBasicProductModel): string {\r\n if (!product) {\r\n return \"No product found\";\r\n }\r\n\r\n return ProductVendor[product?.GroupId] || \"Unknown\";\r\n }\r\n\r\n sortProductsByGroup(products: IProduct[]) {\r\n products.sort((a, b) => {\r\n // First, compare GroupId\r\n if (a.GroupId && b.GroupId) {\r\n if (String(ProductVendor[a.GroupId]) < String(ProductVendor[b.GroupId])) return -1;\r\n if (String(ProductVendor[a.GroupId]) > String(ProductVendor[b.GroupId])) return 1;\r\n } else if (a.GroupId) {\r\n return -1;\r\n } else if (b.GroupId) {\r\n return 1;\r\n }\r\n\r\n // If GroupId is the same, compare Description\r\n if (a.Description && b.Description) {\r\n return a.Description.localeCompare(b.Description);\r\n } else if (a.Description) {\r\n return -1;\r\n } else if (b.Description) {\r\n return 1;\r\n }\r\n\r\n // If both GroupId and Description are missing or equal, maintain original order\r\n return 0;\r\n });\r\n }\r\n}\r\n","import { AfterViewInit, Component, ComponentRef, ContentChild, ElementRef, Input, OnChanges, OnInit, Sanitizer, SimpleChanges, ViewChild } from \"@angular/core\";\r\nimport { DateRange } from \"@enums/DateRange.enum\";\r\nimport { TimeFilterType } from \"@reports/enums/TimeFilterType\";\r\nimport { DateService } from \"@services/date.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport { Subscription } from \"rxjs\";\r\nimport { IVButtonDropDownItem } from \"../../_core/v-button/v-button.component\";\r\nimport { VCalendarComponent } from \"../v-calendar/v-calendar.component\";\r\nimport { VTimeFiltersComponent } from \"../v-time-filters/v-time-filters.component\";\r\nimport \"./v-date-selector.component.scss\";\r\n\r\ninterface IQuickDate {\r\n label: string;\r\n dateRange: DateRange;\r\n selected?: boolean;\r\n}\r\n\r\ninterface ITimeRestrictionOption {\r\n label: string;\r\n id: number;\r\n}\r\n\r\n// Design inspo\r\n// https://dribbble.com/shots/18808665-Trade-history-Untitled-UI\r\n\r\n@Component({\r\n selector: \"v-date-selector\",\r\n template: require(\"./v-date-selector.component.html\")\r\n})\r\nexport class VDateSelectorComponent extends VCalendarComponent implements OnInit, OnChanges, AfterViewInit {\r\n @Input() dateRange: DateRange;\r\n\r\n @Input() mobile = false;\r\n @Input() showQuickDates = true;\r\n @Input() vertical: boolean;\r\n @Input() showTimeFilter: boolean;\r\n\r\n @ViewChild(VCalendarComponent) calendar: VCalendarComponent;\r\n @ContentChild(VTimeFiltersComponent) timeFilters: ComponentRef;\r\n\r\n // --\r\n\r\n TimeFilterType = TimeFilterType;\r\n\r\n quickDates: IQuickDate[] = [];\r\n\r\n selectedTimeRestrictionOption: IVButtonDropDownItem;\r\n timeRestrictionOptions: IVButtonDropDownItem[] = [];\r\n showTimeFilterOptions: boolean = false;\r\n disableTimeFilterToggle: boolean;\r\n\r\n timeFiltersSubscription: Subscription;\r\n\r\n protected defaultTimeFilterStart: string = \"08:00\";\r\n protected defaultTimeFilterEnd: string = \"17:00\";\r\n\r\n // ---\r\n\r\n constructor(\r\n private readonly elementRef: ElementRef,\r\n private readonly veriDate: VeriDate,\r\n translationService: TranslationService,\r\n dateService: DateService,\r\n sanitizer: Sanitizer) {\r\n super(sanitizer, dateService, translationService);\r\n\r\n this.timeRestrictionOptions.push({ label: \"Start & End Time\", id: 1 });\r\n this.timeRestrictionOptions.push({ label: \"Time Filter\", id: 2 });\r\n\r\n this.selectedTimeRestrictionOption = this.timeRestrictionOptions[0];\r\n }\r\n\r\n ngOnInit() {\r\n this.createQuickDates();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n this.createQuickDates();\r\n\r\n // Handy setting for mobile view\r\n if (changes[\"mobile\"] && this.mobile) {\r\n this.setMobileView();\r\n }\r\n\r\n if (changes[\"dateRange\"]) {\r\n var matchingRange = this.quickDates.find(qd => qd.dateRange == this.dateRange);\r\n if (matchingRange) {\r\n this.quickDateClicked(matchingRange);\r\n }\r\n else {\r\n console.warn(\"Unsupported date range specified\");\r\n }\r\n }\r\n\r\n if (changes[\"date\"] || changes[\"endDate\"]) {\r\n this.updateQuickDateSelectionFromDates(new Date(this.date), new Date(this.endDate));\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n\r\n setTimeout(() => {\r\n this.autoSetVertical();\r\n });\r\n }\r\n\r\n ngAfterContentInit(): void {\r\n if (this.timeFilters) {\r\n this.setUpTimeFiltersView();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.timeFiltersSubscription?.unsubscribe();\r\n }\r\n\r\n onDateChanged(date: Date) {\r\n this.date = this.endDate = date;\r\n this.dateChanged.emit(date);\r\n\r\n this.updateQuickDateSelectionFromDates(this.date, this.date);\r\n }\r\n\r\n onDateRangeChanged(dates: Date[]) {\r\n this.date = dates[0];\r\n this.endDate = dates[1];\r\n\r\n this.updateQuickDateSelectionFromDates(this.date, this.endDate);\r\n\r\n this.dateRangeChanged.emit(dates);\r\n }\r\n\r\n quickDateClicked(quickDate: IQuickDate) {\r\n\r\n var range = this.veriDate.dateRangeFromEnum(quickDate.dateRange);\r\n this.date = range.start;\r\n this.endDate = this._endDate = range.end;\r\n\r\n this.quickDates.forEach(q => q.selected = false);\r\n quickDate.selected = true;\r\n\r\n this.dateRangeChanged.emit([this.date, this.endDate]);\r\n }\r\n\r\n timeRestrictionOptionChanged(option: IVButtonDropDownItem) {\r\n this.selectedTimeRestrictionOption = option;\r\n }\r\n\r\n toggleTimeFilterOptions() {\r\n this.showTimeFilterOptions = !this.showTimeFilterOptions;\r\n }\r\n\r\n // ---\r\n\r\n private setMobileView() {\r\n this.showQuickDates = false;\r\n this.monthsToShow = 1;\r\n }\r\n\r\n private setUpTimeFiltersView(): void {\r\n this.disableTimeFilterToggle = this.showTimeFilterOptions = this.timeFilters['timeFilterType'] !== TimeFilterType.None;\r\n\r\n this.timeFiltersSubscription = this.timeFilters['timeFilterTypeChange'].subscribe(type => {\r\n this.disableTimeFilterToggle = type !== TimeFilterType.None;\r\n })\r\n }\r\n\r\n private updateQuickDateSelectionFromDates(startDate: Date, endDate?: Date) {\r\n if (!this.date) {\r\n return;\r\n }\r\n\r\n var dateRange = this.veriDate.dateRangeIntoEnum({ start: new Date(startDate), end: new Date(endDate) });\r\n\r\n this.quickDates.forEach(q => q.selected = q.dateRange == dateRange);\r\n }\r\n\r\n private createQuickDates() {\r\n if (this.quickDates?.length) {\r\n return;\r\n }\r\n\r\n this.quickDates = [];\r\n\r\n if (this.direction == \"today-future\" || this.direction == \"today-past\") {\r\n this.quickDates.push({ label: \"\", dateRange: DateRange.Today, selected: true });\r\n }\r\n\r\n this.quickDates.push({ label: \"\", dateRange: DateRange.Yesterday });\r\n\r\n if (this.maxDays >= 7) {\r\n this.quickDates.push({ label: \"\", dateRange: DateRange.Last7Days });\r\n this.quickDates.push({ label: \"\", dateRange: DateRange.LastWeek });\r\n }\r\n\r\n if (this.maxDays >= 31) {\r\n this.quickDates.push({ label: \"\", dateRange: DateRange.ThisMonth });\r\n this.quickDates.push({ label: \"\", dateRange: DateRange.LastMonth });\r\n }\r\n\r\n this.quickDates.forEach(qd => {\r\n qd.label = this.translationService.tEnum(DateRange, \"DateRange\", qd.dateRange)\r\n });\r\n }\r\n\r\n private autoSetVertical() {\r\n if (this.vertical == null) {\r\n var width = this.elementRef.nativeElement.getBoundingClientRect().width;\r\n if (width < 350) {\r\n this.vertical = true;\r\n }\r\n }\r\n }\r\n}\r\n","import { CommonModule } from \"@angular/common\";\r\nimport { NgModule, Type } from \"@angular/core\";\r\nimport { CoreDirectivesModule } from \"../_core/_core.directives.module\";\r\nimport { MiscDirectivesModule } from \"../_misc/_misc.directives.module\";\r\nimport { VeriDirectivesModule } from \"../_veri/_veri.directives.module\";\r\nimport { ActiveRangeBarChartComponent } from \"./activeRangeBarChart/active-range-bar-chart.component\";\r\n\r\n\r\nconst privateComponents: Type[] = [\r\n\r\n];\r\n\r\nconst publicComponents: Type[] = [\r\n ActiveRangeBarChartComponent\r\n];\r\n\r\nconst providers: any[] = [\r\n\r\n];\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n VeriDirectivesModule,\r\n CoreDirectivesModule,\r\n MiscDirectivesModule\r\n ],\r\n providers: providers,\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents],\r\n exports: [...publicComponents]\r\n})\r\nexport class VisualisationsModule {\r\n constructor() {\r\n }\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { AccountFeatures } from \"@app/enum/account/AccountFeature\";\r\nimport { IAccountUnitMappingExtended } from \"@app/interfaces/IAccountUnitMappingExtended\";\r\nimport { IUnit } from \"@app/interfaces/IPeripheral\";\r\nimport { IBasicProductModel } from \"@app/interfaces/IProductUiViewModel\";\r\nimport { IVehicleUnitMapping } from \"@app/interfaces/IVehiclePeripheralMapping\";\r\nimport { IVehicleUnitMappingExtended } from \"@app/interfaces/IVehicleUnitMappingExtended\";\r\nimport { AccountFeatureService } from \"@app/services/accountFeature.service\";\r\nimport { DateService } from \"@app/services/date.service\";\r\nimport { ProductsService } from \"@app/services/products.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { Observable } from \"rxjs\";\r\nimport { map } from \"rxjs/operators\";\r\nimport { IConfigMappings, IFirmwareMappings } from \"../../../_services/peripheral.service.ajs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class HardwareMappingService {\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly accountFeatureService: AccountFeatureService,\r\n private readonly dateService: DateService,\r\n private readonly productsService: ProductsService,\r\n private readonly translationService: TranslationService) { }\r\n\r\n\r\n getAccountMappings(serial: string): Observable {\r\n return this.http.get(`/api/foundation/units/${serial}/accountmappings`);\r\n }\r\n\r\n getConfigMappings(serial: string): Observable {\r\n return this.http.get(`/api/foundation/units/${serial}/configmappings`);\r\n }\r\n\r\n getFirmwareMappings(serial: string): Observable {\r\n return this.http.get(`/api/foundation/units/${serial}/firmwaremappings`);\r\n }\r\n\r\n getVehicleMappings(serial: string): Observable {\r\n return this.http.get(`/api/foundation/units/${serial}/vehiclemappings`);\r\n }\r\n\r\n applyVehicleMappingsToUnits(units: IUnit[], mappings: Map): IUnit[] {\r\n return units.map(unit => ({\r\n ...unit,\r\n vehicleMapping: mappings.get(unit.Serial)\r\n }));\r\n }\r\n\r\n\r\n getProductsAndMap(peripherals: IUnit[]): Observable {\r\n return this.productsService.getProductUiViewModels().pipe(map(products => {\r\n this.mapProductsToUnits(peripherals, products);\r\n\r\n return peripherals;\r\n }))\r\n }\r\n\r\n mapProductsToUnits(units: IUnit[], products: IBasicProductModel[]): void {\r\n units.forEach(unit => {\r\n unit.Product = products.find(product => product.ProductId === unit.ProductId);\r\n\r\n this.setMetaDataOnUnit(unit);\r\n });\r\n }\r\n\r\n setMetaDataOnUnit(unit: IUnit, feature?: AccountFeatures): void {\r\n if (!unit) {\r\n console.error(\"No unit specified\");\r\n return;\r\n }\r\n\r\n unit.primaryFeature = this.getSingleFeatureForUnit(unit);\r\n unit.productVendorString = this.productsService.getProductVendorString(unit.Product);\r\n\r\n\r\n unit.name = `${unit.productVendorString ? unit.productVendorString : ''} ${unit.Product?.Description}`;\r\n unit.icon = this.getIconForUnit(unit);\r\n }\r\n\r\n\r\n getSingleFeatureForUnit(unit: IUnit): AccountFeatures {\r\n\r\n if (!AccountFeatures[unit?.Product?.Features]) {\r\n return AccountFeatures.Default;\r\n }\r\n\r\n const features = this.accountFeatureService.findFeaturesFromFeaturesEnum(unit.Product.Features);\r\n\r\n if (features.indexOf(AccountFeatures.Camera) > -1) {\r\n return AccountFeatures.Camera;\r\n }\r\n\r\n return (features?.length) ? features[0] : null;\r\n }\r\n\r\n getIconForUnit(unit: IUnit): string {\r\n if (!unit) {\r\n return;\r\n }\r\n\r\n return this.accountFeatureService.getIconForFeature(unit.primaryFeature);\r\n }\r\n\r\n getDateDescription(date: string): string {\r\n switch (true) {\r\n case date && date === \"0001-01-01T00:00:00Z\":\r\n return this.translationService.t(\"FoundationHardware.Preexisting\");\r\n case !date || date === \"2200-01-01T00:00:00Z\":\r\n return this.translationService.t(\"FoundationHardware.Current\");\r\n default:\r\n return this.dateService.formatDate(date, {dateTime: true});\r\n }\r\n }\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { IDriver } from \"@app/interfaces/IDriver\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { IGroup } from \"@app/interfaces/IVehicleGroup\";\r\nimport { Observable } from \"rxjs\";\r\nimport { map, take, tap } from \"rxjs/operators\";\r\nimport { DataCacheService } from \"../caching/data-cache.service\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class GroupService {\r\n groupsCacheBasic: string = \"groupCacheBasic\";\r\n groupsCacheNames: string = \"groupCacheNames\";\r\n groupsCacheFull: string = \"groupCacheFull\";\r\n \r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly dataCacheService: DataCacheService) { }\r\n\r\n getGroupsWithMappings(invalidateCache?: boolean): Observable {\r\n return this.dataCacheService.getOrRequest(this.groupsCacheFull, () => this.getGroupsFromDatabase(\"full\"), { invalidateCache }).pipe(\r\n map(groups => {\r\n return this.sortGroups(groups);\r\n })\r\n );\r\n }\r\n\r\n getGroupNames(invalidateCache?: boolean): Observable {\r\n return this.dataCacheService.getOrRequest(this.groupsCacheFull, () => this.getGroupsFromDatabase(\"names\"), { invalidateCache });\r\n }\r\n\r\n getGroupsBasic(invalidateCache?: boolean): Observable {\r\n return this.dataCacheService.getOrRequest(this.groupsCacheFull, () => this.getGroupsFromDatabase(\"basic\"), { invalidateCache });\r\n }\r\n\r\n deleteGroup(group: IGroup): Observable {\r\n return this.http.delete(`/api/groups/${group.Id}`).pipe(\r\n tap(() => {\r\n this.removeChildGroupsFromCache(group);\r\n this.dataCacheService.deleteItem(group, this.groupsCacheFull);\r\n })\r\n );\r\n }\r\n\r\n saveGroup(group: IGroup): Observable {\r\n const copiedGroup = { ...group };\r\n\r\n // Prevent circular json references\r\n if (copiedGroup) {\r\n if (copiedGroup.children) {\r\n copiedGroup.children = null;\r\n }\r\n\r\n if (copiedGroup.parent) {\r\n copiedGroup.ParentId = copiedGroup.parent.Id;\r\n copiedGroup.parent = null;\r\n }\r\n }\r\n\r\n return this.http.post(`/api/groups`, copiedGroup).pipe(map(\r\n groupId => {\r\n copiedGroup.Id = groupId;\r\n this.dataCacheService.addOrUpdateItem(copiedGroup, this.groupsCacheFull);\r\n return copiedGroup;\r\n }));\r\n }\r\n\r\n findGroup(groups: IGroup[], groupId: number): IGroup {\r\n return groups.find(group => group.Id === groupId);\r\n }\r\n\r\n setGroupParents(groups: IGroup[]): IGroup[] {\r\n groups.forEach(g => {\r\n if (g.ParentId) {\r\n var parent = this.findGroup(groups, g.ParentId);\r\n this.setGroupsRelations(g, parent);\r\n }\r\n });\r\n\r\n return groups;\r\n }\r\n\r\n sortGroups(groups: IGroup[]): IGroup[] {\r\n const sortedGroups = groups.sort((x, y) => {\r\n if (x.children && !y.children) {\r\n return -1;\r\n }\r\n else if (y.children && !x.children) {\r\n return 1;\r\n }\r\n\r\n const textA = x.Name.toUpperCase();\r\n const textB = y.Name.toUpperCase();\r\n\r\n return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;\r\n });\r\n\r\n return sortedGroups;\r\n }\r\n \r\n countResourceTotals(\r\n group: IGroup,\r\n groupPropertyName: 'GroupVehicleMappings' | 'GroupDriverMappings' | 'GroupGeofenceMappings'\r\n ): number {\r\n\r\n let fullList: number[] = [];\r\n\r\n if (group[groupPropertyName]) {\r\n fullList = group[groupPropertyName].slice().map(a => a.ResourceId);\r\n }\r\n\r\n group.children?.forEach(g => {\r\n if (g[groupPropertyName]) {\r\n fullList.concat([...g[groupPropertyName].slice().map(a => a.ResourceId)]);\r\n }\r\n });\r\n\r\n const distinctValues = [...new Set(fullList)];\r\n return distinctValues.length;\r\n }\r\n\r\n sumParents(group: IGroup, acc = 1): number {\r\n if (!group) return 0;\r\n\r\n return !group.parent ? acc : this.sumParents(group.parent, ++acc);\r\n }\r\n \r\n private getGroupsFromDatabase(type: \"full\" | \"basic\" | \"names\"): Observable {\r\n return this.http.get(`/api/groups/${type}`).pipe(map(groups => {\r\n const uniqueGroups = this.removeDuplicatesFromGroups(groups);\r\n const groupsWithParents = this.setGroupParents(uniqueGroups);\r\n const sortedGroups = this.sortGroups(groupsWithParents);\r\n return sortedGroups;\r\n }));\r\n\r\n }\r\n\r\n private removeDuplicatesFromGroups(groups: IGroup[]) {\r\n for (let i = 0; i < groups.length; i++) {\r\n const group = groups[i];\r\n\r\n group.VehicleIds = this.removeDuplicates(group.VehicleIds, group.Name);\r\n group.DriverIds = this.removeDuplicates(group.DriverIds, group.Name);\r\n group.GeofenceIds = this.removeDuplicates(group.GeofenceIds, group.Name);\r\n };\r\n\r\n return groups;\r\n }\r\n\r\n private removeDuplicates(ids: number[], groupName: string) {\r\n\r\n const obj = {};\r\n const dedupedIds = [];\r\n\r\n for (let i = 0; i < ids.length; i++) {\r\n obj[ids[i]] = 0;\r\n }\r\n\r\n for (let i in obj) {\r\n dedupedIds.push(Number(i));\r\n }\r\n\r\n return dedupedIds;\r\n }\r\n\r\n private setGroupsRelations(child: IGroup, parent: IGroup, groups?: IGroup[]) {\r\n\r\n if (!parent) return;\r\n\r\n if (child.parent && parent.children) {\r\n const parentIndex = parent.children.findIndex((kid) => kid.Id === child.Id);\r\n parentIndex > -1 && parent.children.splice(parentIndex, 1);\r\n }\r\n\r\n child.parent = parent;\r\n child.ParentId = parent.Id;\r\n \r\n if (!parent.children) {\r\n parent.children = [];\r\n }\r\n\r\n parent.children.push(child);\r\n\r\n if (groups) {\r\n this.addOrUpdateGroup(child);\r\n this.addOrUpdateGroup(parent);\r\n }\r\n\r\n if (parent.parent && groups) {\r\n // in case parent has parent it need to be updated as well\r\n const grandParent = this.findGroup(groups, parent.parent.Id);\r\n\r\n if (grandParent) {\r\n this.setGroupsRelations(parent, grandParent, groups);\r\n }\r\n }\r\n\r\n }\r\n\r\n private addOrUpdateGroup(group: IGroup): void {\r\n this.dataCacheService.addOrUpdateItem(group, this.groupsCacheFull);\r\n }\r\n\r\n private removeChildGroupsFromCache(group: IGroup): void {\r\n this.unsetGroupRelations(group).subscribe({\r\n next: groups => {\r\n const listForRemoval: IGroup[] = this.gatherAllGroupsForCacheRemoval(group, groups, []);\r\n listForRemoval.forEach(grp => this.removeGroupFromCache(grp));\r\n }\r\n })\r\n }\r\n\r\n private gatherAllGroupsForCacheRemoval(group: IGroup, groups: IGroup[], listForRemoval: IGroup[]): IGroup[] {\r\n const childGroups = groups.filter(g => g.ParentId === group.Id);\r\n\r\n childGroups.forEach(g => {\r\n listForRemoval.push(g);\r\n this.gatherAllGroupsForCacheRemoval(g, groups, listForRemoval);\r\n });\r\n\r\n return listForRemoval;\r\n }\r\n\r\n private removeGroupFromCache(group: IGroup): void {\r\n this.dataCacheService.deleteItem(group, this.groupsCacheFull);\r\n }\r\n \r\n private unsetGroupRelations(group: IGroup): Observable {\r\n\r\n return this.getGroupsWithMappings().pipe(take(1), tap((groups) => {\r\n\r\n const parent = groups.find(g => g.children?.some((child) => child.Id === group.Id));\r\n\r\n if (parent) {\r\n const groupIndex = parent.children.findIndex((child) => child.Id === group.Id);\r\n\r\n if (groupIndex > -1) {\r\n parent.children.splice(groupIndex, 1);\r\n }\r\n\r\n if (parent.parent && groups) {\r\n // in case parent has parent it need to be updated as well\r\n const grandParent = this.findGroup(groups, parent.parent.Id);\r\n\r\n if (grandParent) {\r\n this.setGroupsRelations(parent, grandParent, groups);\r\n }\r\n } else {\r\n this.addOrUpdateGroup(parent);\r\n }\r\n }\r\n }))\r\n }\r\n\r\n}\r\n","\r\nexport enum NoteType {\r\n Automatic,\r\n Manual,\r\n}\r\n","\r\nexport enum ResourceType {\r\n Account = 0,\r\n Contact = 1,\r\n Deal = 2,\r\n EngineerJob = 3,\r\n EngineerJobBooking = 4,\r\n Package = 5,\r\n Peripheral = 6,\r\n Product = 7,\r\n ProductGroup = 8,\r\n Sim = 9,\r\n Site = 10,\r\n Unit = 11,\r\n Vehicle = 12,\r\n Ticket = 13,\r\n Stock = 14,\r\n Engineer = 15,\r\n SoftwareLog = 16,\r\n Driver = 17,\r\n Trailer = 18,\r\n VerilocationUser = 19,\r\n Announcement = 20,\r\n Plot = 21,\r\n User = 22,\r\n DriverDecisionSupport = 23,\r\n GeocodedAddress = 24,\r\n Geofence = 25,\r\n Group = 26,\r\n Journey = 27,\r\n Message = 28,\r\n OutboundQueue = 29,\r\n RfidData = 30,\r\n DigiDl = 31,\r\n AlertRecord = 32,\r\n ReportSchedule = 33,\r\n Log = 34,\r\n Test = 35,\r\n MaintenanceType = 36,\r\n StirlingJob = 37,\r\n DigiDlPacket = 38,\r\n EngineerCommission = 39\r\n}\r\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { ISimMapping } from \"@app/interfaces/ISimMapping\";\r\nimport { Observable } from \"rxjs\";\r\nimport { ICombinedSimMappingQueryOptions } from \"../_routes/hardware/_models/ICombinedSimMappingQueryOptions\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SimMappingService {\r\n constructor(\r\n private readonly http: HttpClient) { }\r\n\r\n endSimMapping(simMapping: ISimMapping): Observable {\r\n return this.http.post(`/api/sims/mappings/end`, simMapping);\r\n }\r\n\r\n addSimMapping(simMapping: ISimMapping): Observable {\r\n return this.http.post(`/api/sims/mappings`, simMapping);\r\n }\r\n\r\n getSimMappings(options: ICombinedSimMappingQueryOptions): Observable {\r\n return this.http.get(`/api/sims/mappings`, { params: options as HttpParams });\r\n }\r\n}\r\n","\r\nexport enum CommServerRequestState {\r\n Pending,\r\n Requested,\r\n Completed,\r\n Expired,\r\n Cancelled\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { getOptionsQueryParams } from \"@app/class/Utilities\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { IConfigurationFile, IConfigurationUpdate, IConfigurationUpdateRequest, IDeviceInfo, ISetAutoUpdateModeRequest } from \"../cameraCommunicationServer.service\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CameraCommunicationServerService {\r\n constructor(\r\n private readonly http: HttpClient\r\n ) { }\r\n\r\n getDeviceInfo(serial: string): Observable {\r\n if (!serial) {\r\n return of(null);\r\n }\r\n\r\n return this.http.get(`/api/communicationServer/device/${serial}/info`);\r\n }\r\n\r\n getConfigurationUpdateHistory(deviceId: number): Observable {\r\n return this.http.get(`/api/communicationServer/device/${deviceId}/configHistory`);\r\n }\r\n\r\n\r\n postConfigUpdate(update: IConfigurationUpdateRequest): Observable {\r\n return this.http.post(`/api/communicationServer/config`, update);\r\n }\r\n\r\n setAutoUpdateMode(request: ISetAutoUpdateModeRequest): Observable {\r\n return this.http.post(`/api/communicationServer/autoUpdateMode`, request);\r\n }\r\n\r\n getAvailableConfigFiles(deviceTypeId: number, includeArchived: boolean): Observable {\r\n const params = getOptionsQueryParams({ includeArchived });\r\n\r\n return this.http.get(`/api/communicationServer/config/${deviceTypeId}/files`, params)\r\n\r\n }\r\n\r\n}\r\n","import { CommonModule } from \"@angular/common\";\r\nimport { NgModule } from \"@angular/core\";\r\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\nimport { VTableModule } from \"@app/directives/_layout/v-table/v-table.module\";\r\nimport { ResourceFiltersDirectivesModule } from \"@app/directives/_resourceFilters/_resourceFilters.directives.module\";\r\nimport { VehicleDirectivesModule } from \"@app/directives/_vehicle/_vehicle.directives.module\";\r\nimport { FoundationCsvImporterComponent } from \"@app/main/modules/foundation/_components/foundation-csv-importer/foundation-csv-importer.component\";\r\nimport { CoreDirectivesModule } from \"@directives/_core/_core.directives.module\";\r\nimport { FormsDirectivesModule } from \"@directives/_forms/_form.directives.module\";\r\nimport { LayoutDirectivesModule } from \"@directives/_layout/_layout.directives.module\";\r\nimport { MiscDirectivesModule } from \"@directives/_misc/_misc.directives.module\";\r\nimport { VeriDirectivesModule } from \"@directives/_veri/_veri.directives.module\";\r\nimport { ManualTestContainerComponent } from \"@foundation/_components/manual-test-container/manual-test-container.component\";\r\nimport { DeviceInstallEditor } from \"@foundation/_routes/commissions/commissionEditor/components/deviceInstallEditor/device-install-editor.component\";\r\nimport { PipesModule } from \"src/app/_pipes/_pipes.module\";\r\nimport { FoundationComponentsModule } from \"../../_components/components.modules\";\r\nimport { CommissionDetailComponent } from \"./commission-detail/commission-detail.component\";\r\nimport { CommissionSummaryComponent } from \"./commission-detail/commission-summary/commission-summary.component\";\r\nimport { CommissionListComponent } from \"./commission-list.component\";\r\nimport { VCommissionEditorComponent } from \"./commissionEditor/commission-editor.component\";\r\nimport { AddVehicleComponent } from \"./commissionEditor/components/add-vehicle/add-vehicle.component\";\r\nimport { NewCommissionDetailComponent } from \"./commissionEditor/components/new-commission-detail/new-commission-detail.component\";\r\n\r\nconst privateComponents: any[] = [\r\n\r\n];\r\n\r\nconst publicComponents: any[] = [\r\n DeviceInstallEditor,\r\n ManualTestContainerComponent,\r\n CommissionListComponent,\r\n CommissionDetailComponent,\r\n VCommissionEditorComponent,\r\n NewCommissionDetailComponent,\r\n CommissionSummaryComponent,\r\n AddVehicleComponent,\r\n FoundationCsvImporterComponent\r\n];\r\n\r\nconst declarations: any[] = [\r\n];\r\n\r\nconst providers: any[] = [\r\n];\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n BrowserAnimationsModule,\r\n PipesModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n FormsDirectivesModule,\r\n VeriDirectivesModule,\r\n FoundationComponentsModule,\r\n MiscDirectivesModule,\r\n LayoutDirectivesModule,\r\n CoreDirectivesModule,\r\n VTableModule,\r\n VehicleDirectivesModule,\r\n ResourceFiltersDirectivesModule\r\n ],\r\n providers: providers,\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents, ...declarations],\r\n exports: [...publicComponents, ...declarations],\r\n schemas: [/*NO_ERRORS_SCHEMA*/]\r\n})\r\nexport class CommissionModule {\r\n constructor() {\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { Observable } from \"rxjs\";\r\nimport { map } from \"rxjs/operators\";\r\nimport { EngineerJobItemType } from \"../foundation.enums\";\r\nimport { IEngineerCommission, IProcessResult } from \"../foundation.interfaces\";\r\nimport { IEngineerCommissionQueryOptions } from \"../_models/IEngineerCommissionQueryOptions\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class EngineerCommissionService {\r\n\r\n constructor(private readonly http: HttpClient) { }\r\n\r\n getEngineerCommissions(options: IEngineerCommissionQueryOptions = {}): Observable {\r\n return this.http.get(`/api/foundation/engineerCommissions/`, { params: options as HttpParams });\r\n }\r\n\r\n\r\n getEngineerCommission(commissionId: number): Observable {\r\n return this.http.get(`/api/foundation/engineerCommissions/${commissionId}`).pipe(map(commission => {\r\n commission.VisitReason = EngineerJobItemType[commission.VisitReasonId] ?? null;\r\n return commission;\r\n })); \r\n }\r\n\r\n getEngineerCommissionsForCustomer(customerId: number, dateFrom: Date, dateTo: Date): Observable {\r\n const params: IEngineerCommissionQueryOptions = {\r\n Start: dateFrom.toISOString(),\r\n End: dateTo.toISOString(),\r\n AccountId: customerId\r\n }\r\n return this.http.get(`/api/foundation/engineerCommissions/`, { params: params as HttpParams });\r\n }\r\n\r\n createUpdateEngineerCommission(engineerCommission: IEngineerCommission): Observable {\r\n return this.http.post(`/api/foundation/engineerCommissions/`, engineerCommission);\r\n }\r\n\r\n processCommissionMappings(engineerCommission: IEngineerCommission): Observable {\r\n return this.http.post(`/api/foundation/engineerCommissions/processmappings/`, engineerCommission).pipe(map(mappingResult => {\r\n\r\n\r\n return mappingResult;\r\n }));\r\n }\r\n\r\n}\r\n","import { IPulseRecordPayload } from \"./IPulseRecordPayload\";\r\n\r\nexport enum PulseMessageConsoleDisplayType {\r\n Record,\r\n Response\r\n}\r\n\r\nexport interface IPulseMessage {\r\n Id: number;\r\n\r\n //----\r\n\r\n consoleDisplayType: PulseMessageConsoleDisplayType;\r\n}\r\n\r\nexport interface IPulseRecord extends IPulseMessage {\r\n \r\n Payload: string;\r\n VehicleId?: number;\r\n Serial: string;\r\n UpdatedTime: Date;\r\n CreatedTime: Date;\r\n CameraCommandType: CameraCommandType\r\n\r\n //--\r\n\r\n parsedPayload?: IPulseRecordPayload;\r\n}\r\n\r\nexport interface IPulseResponse extends IPulseMessage {\r\n CommandJson: string;\r\n CameraCommandType: CameraCommandType;\r\n PulseRecordId: number;\r\n}\r\n\r\nexport enum CameraCommandType {\r\n None = 0,\r\n RequestLog = 1,\r\n ConfigUpdate = 2,\r\n AppUpdate = 4,\r\n SendCommand = 8,\r\n RequestVideo = 0x10\r\n}\r\n\r\nexport interface IPulseRecordQueryOptions {\r\n Id?: number;\r\n Serial?: string;\r\n VehicleId?: number;\r\n Start?: Date;\r\n End?: Date;\r\n}\r\n\r\nexport interface ILatestPulseRecordQueryOptions {\r\n Serial?: string;\r\n VehicleId?: number;\r\n}\r\n","import { VideoObservation } from \"../main/components/videos/enums/VideoObservation\";\r\nimport { IVideoEntry } from \"../main/components/videos/models/IVideoEntry\";\r\nimport { ColourService } from \"./colour.service\";\r\nimport { TranslationService } from \"./translation.service\";\r\n\r\nexport interface IObservationCategory {\r\n label: string;\r\n translation?: string;\r\n count?: number;\r\n\r\n observation: VideoObservation;\r\n}\r\n\r\nexport class ObservationsService {\r\n static $inject = [\"colourService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly colourService: ColourService,\r\n private readonly translationService: TranslationService\r\n ) {\r\n }\r\n\r\n getObservations(eventsToGetObservationsBy?: IVideoEntry[]): IObservationCategory[] {\r\n if (!eventsToGetObservationsBy) {\r\n eventsToGetObservationsBy = [];\r\n }\r\n\r\n let i = 100;\r\n let observationsToReturn: IObservationCategory[] = [];\r\n\r\n for (let observation in VideoObservation) {\r\n if (!isNaN(Number(observation))) {\r\n continue;\r\n }\r\n\r\n var observationEnum: VideoObservation = VideoObservation[observation] as any;\r\n\r\n observationsToReturn.push({\r\n label: observation,\r\n translation: this.translationService.tEnum(VideoObservation, \"VideoObservation\", observationEnum),\r\n count: 0,\r\n observation: observationEnum\r\n });\r\n }\r\n\r\n const observationsToFilter = this.createAvailableObservationsToFilterBy(eventsToGetObservationsBy);\r\n\r\n observationsToReturn.forEach(obs => {\r\n obs.count = observationsToFilter.filter(obsToFilter => obsToFilter == obs.label).length;\r\n });\r\n\r\n observationsToReturn.sort((o1, o2) => o1.label.localeCompare(o2.label));\r\n\r\n return observationsToReturn;\r\n }\r\n\r\n getObservationsColour(index: number) {\r\n return this.colourService.getVigetColor(index, Object.keys(VideoObservation).length, 2);\r\n }\r\n\r\n setObservationTitleForDisplay(observation: VideoObservation): string {\r\n return this.translationService.t(`VideoObservationEnum.${VideoObservation[observation]}`);\r\n }\r\n\r\n //------\r\n\r\n private createAvailableObservationsToFilterBy(videoEvents: IVideoEntry[]): string[] {\r\n const observations: string[] = [];\r\n\r\n videoEvents.forEach(videoEvent => {\r\n if (videoEvent.MetaData?.VideoObservations) {\r\n videoEvent.MetaData?.VideoObservations.forEach(vc => {\r\n if (!observations.find(obs => obs == VideoObservation[vc])) {\r\n observations.push(VideoObservation[vc]);\r\n }\r\n });\r\n }\r\n });\r\n\r\n return observations;\r\n }\r\n}\r\n","import { Component, Input, OnChanges, OnInit, SimpleChange, SimpleChanges } from \"@angular/core\";\r\nimport { ILocationInformation } from \"@app/interfaces/ILocationInformation\";\r\nimport { GeocodeService } from \"@services/geocode.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { IVideoEntry } from \"../../../../components/videos/models/IVideoEntry\";\r\nimport './video-address.component.scss';\r\n\r\n// Todo : Move to cameras module?\r\n@Component({\r\n selector: 'video-address',\r\n template: require('./video-address.component.html')\r\n})\r\nexport class VideoAddressComponent implements OnInit, OnChanges {\r\n @Input() hideEllipsis: boolean = false;\r\n @Input() videoEntry: IVideoEntry;\r\n @Input() small: boolean = false;\r\n\r\n debounceTimeout: any;\r\n\r\n label: string = '';\r\n\r\n constructor(\r\n private geocodeService: GeocodeService,\r\n private translationService: TranslationService) { }\r\n\r\n ngOnInit() {\r\n this.initialise();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n\r\n if (!changes[\"videoEntry\"] || this.videoEntryIsSameLocation(changes[\"videoEntry\"])) {\r\n return;\r\n }\r\n\r\n this.initialise();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.debounceTimeout) {\r\n clearTimeout(this.debounceTimeout);\r\n }\r\n }\r\n\r\n initialise() {\r\n // We want a small debounce here, this protects us against fast scrolling - no point updating an address if we have just scrolled past it\r\n if (this.debounceTimeout) {\r\n clearTimeout(this.debounceTimeout);\r\n }\r\n\r\n if (!this.videoEntry) {\r\n return;\r\n }\r\n\r\n this.debounceTimeout = setTimeout(() => {\r\n this.updateLabel();\r\n this.debounceTimeout = null;\r\n }, 200);\r\n }\r\n\r\n // ---\r\n\r\n private updateLabel() {\r\n this.label = '';\r\n\r\n if (this.videoEntry) {\r\n this.setLabel(true);\r\n }\r\n else {\r\n this.setNoPlotLabel();\r\n }\r\n }\r\n\r\n private setNoPlotLabel() {\r\n this.label = 'N/A';\r\n }\r\n\r\n private setLabel(showUpdatingText: boolean = false): void {\r\n if (showUpdatingText) {\r\n this.label = this.translationService.t('LocationInformation.Updating');\r\n }\r\n\r\n var videoEntry = this.videoEntry;\r\n\r\n if (!videoEntry.GeocodedAddressId && videoEntry.Latitude != 0 && videoEntry.Longitude != 0) {\r\n this.geocodeService.getLocationInformationFromVideo(videoEntry.Id).then((address: ILocationInformation) => {\r\n this.label = address.LocationDescription;\r\n });\r\n }\r\n else {\r\n this.label = this.videoEntry.PlaceName;\r\n }\r\n }\r\n \r\n private videoEntryIsSameLocation(videoEntryChange: SimpleChange): boolean {\r\n if (!videoEntryChange.previousValue) {\r\n return false;\r\n }\r\n\r\n return videoEntryChange.currentValue['Latitude'] == videoEntryChange.previousValue['Latitude'] &&\r\n videoEntryChange.currentValue['Longitude'] == videoEntryChange.previousValue['Longitude'];\r\n }\r\n\r\n}\r\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { getOptionsQueryParams } from \"@app/class/Utilities\";\r\nimport { Observable, Subject } from \"rxjs\";\r\nimport { map } from \"rxjs/operators\";\r\nimport { SignalRService, WebSocketEvents } from \"../../../developerConsole/signalr.service\";\r\nimport { ICameraCommand } from \"../../_models/ICameraCommand\";\r\nimport { ILatestPulseRecordQueryOptions, IPulseRecord, IPulseRecordQueryOptions } from \"../../_models/IPulseRecord\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PulseService {\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly signalRService: SignalRService) { }\r\n\r\n\r\n pulseMessageReceived = new Subject();\r\n\r\n getPulseMessages(serial: string): Observable {\r\n this.signalRService.initialise().then(() => {\r\n this.signalRService.joinDeviceGroup(serial);\r\n this.signalRService.registerEvents(WebSocketEvents.Pulse, this.pulseMessageReceived);\r\n })\r\n return this.pulseMessageReceived;\r\n }\r\n\r\n getHistoricalPulseMessages(options: IPulseRecordQueryOptions = {}): Observable {\r\n const getParams = getOptionsQueryParams(options);\r\n return this.http.get('/api/cameras/commserver/pulserecords', getParams);\r\n }\r\n\r\n getLatestPulseMessage(options: ILatestPulseRecordQueryOptions = {}): Observable {\r\n return this.http.get('/api/cameras/commserver/pulserecords/latest', { params: options as HttpParams });\r\n }\r\n\r\n getPulseResponse(pulseId: number): Observable {\r\n return this.http.get(`/api/cameras/commserver/pulserecords/${pulseId}/response`).pipe(\r\n map(response => {\r\n if (!response.length) {\r\n return;\r\n }\r\n\r\n const responseJson = response[0].CommandJson;\r\n response[0].parsedCommand = responseJson ? JSON.parse(responseJson) : null;\r\n return response[0];\r\n })\r\n );\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from \"@angular/core\";\r\nimport { VTableRowStatus } from \"@app/directives/_layout/v-table/_enums/VTableRowStatus.enum\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { IUser } from \"@app/interfaces/IUser\";\r\nimport { UserService } from \"@app/main/modules/foundation/_services/user.service\";\r\nimport { DateService } from \"@app/services/date.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { SchedulingFrequency } from \"@reports/enums/SchedulingFrequency\";\r\nimport { IDynamicReportSchedule } from \"@reports/models/IDynamicReportSchedule\";\r\nimport { IReportDefinition } from \"@reports/models/IReportDefinition\";\r\nimport { DynamicReportService } from \"@reports/_services/dynamicReports.service\";\r\nimport { lastValueFrom, Observable } from \"rxjs\";\r\nimport \"./report-schedules.component.scss\";\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: \"report-schedules\",\r\n template: require(\"./report-schedules.component.html\")\r\n})\r\nexport class ReportSchedulesComponent implements OnChanges, OnInit {\r\n @Input() reportId: number;\r\n @Input() update: Observable;\r\n\r\n @Output() scheduleClick = new EventEmitter();\r\n @Output() createScheduleClick = new EventEmitter();\r\n\r\n // ---\r\n\r\n schedules: IDynamicReportSchedule[];\r\n selectedSchedule: IDynamicReportSchedule;\r\n\r\n SchedulingFrequency = SchedulingFrequency;\r\n\r\n reports: IReportDefinition[];\r\n users: IUser[];\r\n\r\n //// #Tables\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n loading: boolean;\r\n\r\n // ---\r\n\r\n constructor(private readonly dynamicReportService: DynamicReportService,\r\n private readonly translationService: TranslationService,\r\n private readonly userService: UserService,\r\n private readonly vTableService: VTableService,\r\n private readonly dateService: DateService) {\r\n this.loadReportSchedules();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.createTable();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n\r\n if (changes[\"update\"] && this.update) {\r\n this.update.pipe(untilDestroyed(this)).subscribe(() => this.loadReportSchedules(true));\r\n }\r\n }\r\n\r\n onRowClicked(row: IVTableRow) {\r\n this.selectedSchedule = row.data;\r\n this.scheduleClick.emit(row.data);\r\n }\r\n\r\n onCreateScheduleClicked(): void {\r\n this.createScheduleClick.emit();\r\n }\r\n\r\n reloadSchedules(): void {\r\n this.loadReportSchedules(true);\r\n }\r\n\r\n scheduleSaved(schedule: IDynamicReportSchedule) {\r\n const existingIndex = this.schedules.findIndex(s => s.Id == schedule.Id);\r\n\r\n if (existingIndex >= 0) {\r\n this.schedules[existingIndex] = schedule;\r\n } else {\r\n this.schedules.push(schedule);\r\n }\r\n\r\n this.mapEntitiesToSchedules()\r\n this.tableRows = this.vTableService.createTableRows(this.schedules, this.tableColumns);\r\n }\r\n\r\n scheduleDeleted(schedule: IDynamicReportSchedule) {\r\n this.schedules.splice(this.schedules.findIndex(s => s.Id == schedule.Id), 1);\r\n this.recreateSchedulesTable();\r\n }\r\n\r\n recreateSchedulesTable(): void {\r\n this.mapEntitiesToSchedules();\r\n\r\n this.tableRows = this.vTableService.createTableRows(this.schedules, this.tableColumns);\r\n }\r\n\r\n // ---\r\n\r\n private async loadReportSchedules(invalidateCache = false) {\r\n invalidateCache = true; // clearing cache for now, need to rethink - main reports-list-page can have an affect on the report schedules available\r\n this.loading = true;\r\n\r\n try {\r\n const [schedules, reports, users] = await Promise.all([\r\n this.dynamicReportService.getReportSchedules({ invalidateCache: invalidateCache, IsActiveSchedule: true }) as Promise,\r\n this.dynamicReportService.getReports() as Promise,\r\n lastValueFrom(this.userService.getUsers())\r\n ]);\r\n\r\n this.reports = reports;\r\n this.users = users;\r\n this.schedules = schedules;\r\n\r\n this.mapEntitiesToSchedules()\r\n\r\n if (this.reportId) {\r\n this.schedules = this.schedules.filter(s => s.ReportDefinitionId == this.reportId);\r\n }\r\n\r\n this.tableRows = this.vTableService.createTableRows(this.schedules, this.tableColumns);\r\n\r\n } finally {\r\n this.loading = false;\r\n }\r\n }\r\n\r\n private mapEntitiesToSchedules() {\r\n this.schedules.forEach(s => {\r\n s.reportDefinition = this.reports.find(r => r.Id == s.ReportDefinitionId);\r\n s.User = this.users.find(u => u.Id == s.UserId);\r\n });\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createStatusTableHeader({ sorted: false }),\r\n createCellFunction: (schedule) => this.vTableService.createStatusCell(this.getScheduleTableStatus(schedule))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Name\" }),\r\n createCellFunction: (schedule) => this.vTableService.createTableCell(schedule.Name),\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Reports.Report\" }),\r\n createCellFunction: (schedule) => this.vTableService.createTableCell(schedule.reportDefinition?.Title),\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"ReportSchedules.Frequency\", minTableWidth: 920 }),\r\n createCellFunction: (schedule) => {\r\n return this.vTableService.createTableCell(this.translationService.tEnum(SchedulingFrequency, \"SchedulingFrequency\", schedule.Frequency))\r\n },\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Reports.LastRan\", minTableWidth: 920 }),\r\n createCellFunction: (schedule) => this.vTableService.createDateCell(schedule.LastScheduledQueueTime, { dateTime: true }),\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"ReportSchedules.NextRun\", sorted: true, sortDirection: SortDirection.Ascending, sortType: SortType.Date }),\r\n createCellFunction: (schedule) => {\r\n let nextRunDate: Date = new Date(schedule.NextScheduledQueueTime);\r\n\r\n if (this.getScheduleTableStatus(schedule) == VTableRowStatus.Error) {\r\n nextRunDate = undefined;\r\n }\r\n\r\n return this.vTableService.createDateCell(nextRunDate, { dateTime: true })\r\n },\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"ReportSchedules.NextParameters\", minTableWidth: 920 }),\r\n createCellFunction: (schedule) => {\r\n if (!schedule.Parameters) {\r\n this.dynamicReportService.parseScheduleParametersJson(schedule);\r\n }\r\n\r\n var formattedValue = `${this.dateService.formatDate(schedule.Parameters.Start, { dateTime: true })} - ${this.dateService.formatDate(schedule.Parameters.End, { dateTime: true })}`\r\n\r\n return this.vTableService.createTableCell(formattedValue)\r\n },\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Status\", minTableWidth: 1040 }),\r\n createCellFunction: (schedule) => this.vTableService.createTableCell(this.getScheduleStatus(schedule)),\r\n }\r\n ];\r\n }\r\n\r\n private getScheduleTableStatus(schedule: IDynamicReportSchedule): VTableRowStatus {\r\n switch (true) {\r\n case schedule.RetryCount >= 50:\r\n return VTableRowStatus.Error;\r\n case schedule.RetryCount > 0:\r\n return VTableRowStatus.Warning;\r\n default:\r\n return VTableRowStatus.Info;\r\n }\r\n }\r\n\r\n private getScheduleStatus(schedule: IDynamicReportSchedule): string {\r\n let status: string;\r\n\r\n if (schedule.RetryCount > 0) {\r\n status = this.translationService.t(\"ReportSchedules.ScheduleFailedXTimes\", schedule.RetryCount);\r\n }\r\n\r\n return status;\r\n }\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { getNestedQueryOptionsParams } from \"@app/class/Utilities\";\r\nimport { DataCacheService } from \"@app/services/caching/data-cache.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { Observable, Subject } from \"rxjs\";\r\nimport { map } from \"rxjs/operators\";\r\nimport { IReportHistory } from \"../models/IDynamicReportLog\";\r\nimport { IReportParameter, IReportParameters, ReportParameterType } from \"../models/IReportParameters\";\r\nimport { ReportHistoryQueryOptions } from \"../models/ReportHistoryQueryOptions\";\r\nimport { DynamicReportService } from \"./dynamicReports.service\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ReportHistoryService {\r\n private reportHistoriesCacheName: string = \"reportHistoriesCache\";\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly dataCacheService: DataCacheService,\r\n private readonly dynamicReportService: DynamicReportService,\r\n private readonly translationService: TranslationService\r\n ) {\r\n }\r\n\r\n getLatestReportHistory(invalidateCache = false): Observable {\r\n return this.dataCacheService.getOrRequest(this.reportHistoriesCacheName, () => this.getLatestReportHistoryFromDb(), { invalidateCache }).pipe(map((logs: IReportHistory[]) => {\r\n\r\n const successfulLogs: IReportHistory[] = this.setupLogs(logs);\r\n\r\n return successfulLogs;\r\n }));\r\n\r\n }\r\n\r\n getReportHistory(options: ReportHistoryQueryOptions = {}): Observable {\r\n const params = getNestedQueryOptionsParams(options);\r\n\r\n return this.http.get(`/api/reports/logs`, params)\r\n .pipe(map((reportLogs: IReportHistory[]) => {\r\n return this.setupLogs(reportLogs);\r\n }));\r\n }\r\n \r\n createParameterString(reportLog: IReportHistory): string {\r\n let paramsString = \"\";\r\n let paramsArr = [];\r\n\r\n const params = reportLog.Parameters;\r\n const customParams = params.CustomParameters;\r\n\r\n const customParamsString = this.getCustomParamsAsString(customParams);\r\n customParamsString && paramsArr.push(customParamsString);\r\n\r\n const groupParamsString = this.getGroupParamsAsString(params);\r\n groupParamsString && paramsArr.push(groupParamsString)\r\n\r\n paramsString = paramsArr.join(\", \");\r\n return paramsString;\r\n }\r\n\r\n getSingleReportHistory(historyId: number): Observable {\r\n return this.getReportHistory({ Id: historyId }).pipe(\r\n map(history => {\r\n return history[0]\r\n })\r\n )\r\n }\r\n\r\n private getGroupParamsAsString(params: IReportParameters): string {\r\n if (!params) {\r\n return;\r\n }\r\n\r\n let paramsArr = [];\r\n\r\n if (params.DriverGroupId) {\r\n paramsArr.push(this.translationService.t(\"ReportHistory.DriversInGroup\", params.DriverGroupId));\r\n }\r\n\r\n if (params.VehicleGroupId) {\r\n paramsArr.push(this.translationService.t(\"ReportHistory.VehiclesInGroup\", params.VehicleGroupId));\r\n }\r\n\r\n if (params.GeofenceGroup) {\r\n paramsArr.push(this.translationService.t(\"ReportHistory.GeofencesInGroup\", params.GeofenceGroupId));\r\n }\r\n\r\n if (!paramsArr.length) {\r\n return;\r\n }\r\n\r\n return paramsArr.join(\", \");\r\n }\r\n\r\n private getCustomParamsAsString(params: IReportParameter[]): string {\r\n let paramsArr = [];\r\n\r\n if (!params?.length) {\r\n return;\r\n }\r\n\r\n params.forEach(param => {\r\n if (param.Value !== null && param.Active) {\r\n paramsArr.push(this.translationService.t(`Reports.${ReportParameterType[param.ParameterType]}`));\r\n }\r\n })\r\n\r\n if (!paramsArr.length) {\r\n return;\r\n }\r\n\r\n return paramsArr.join(\", \");\r\n }\r\n\r\n private getLatestReportHistoryFromDb(): Observable {\r\n return this\r\n .http.get(\"/api/reports/logs/latest\"); \r\n }\r\n\r\n private setupLogs(logs: IReportHistory[]): IReportHistory[] {\r\n const successfulLogs: IReportHistory[] = [];\r\n logs.forEach(reportLog => {\r\n if (!reportLog.Success) {\r\n return;\r\n }\r\n\r\n this.dynamicReportService.formatReportLog(reportLog);\r\n\r\n successfulLogs.push(reportLog);\r\n });\r\n\r\n successfulLogs.sort((x, y) => {\r\n return y.Id - x.Id;\r\n });\r\n\r\n return successfulLogs;\r\n }\r\n \r\n}\r\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { ITimelineEntryWithData } from \"@app/directives/_veri/v-timeline/v-timeline.component\";\r\nimport { DateService } from \"@app/services/date.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UnitConversionService, UnitConversionType } from \"@app/services/unitConversion.service\";\r\nimport { SortDirection } from \"@enums/SortDirection\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport { ITemperatureSetpointWithHistories } from \"@temperature/_components/tempGraph/temperature-graph.component\";\r\nimport { ITemperatureRecord } from \"@temperature/_models/temperature/ITemperatureRecord\";\r\nimport { ITemperatureSetpoint } from \"@temperature/_models/temperature/ITemperatureSetpoint\";\r\nimport { ITemperatureSetpointHistory } from \"@temperature/_models/temperature/ITemperatureSetpointHistory\";\r\nimport { ITemperatureSetpointHistoryQueryOptions } from \"@temperature/_models/temperature/ITemperatureSetpointHistoryQueryOptions\";\r\nimport { ITemperatureSetpointQueryOptions } from \"@temperature/_models/temperature/ITemperatureSetpointQueryOptions\";\r\nimport { lastValueFrom, Observable } from \"rxjs\";\r\nimport { IZoneWithProbes } from \"../_models/temperature/ITemperatureZone\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class TemperatureSetpointService {\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly veriDate: VeriDate,\r\n private readonly dateService: DateService,\r\n private readonly translationService: TranslationService,\r\n private readonly unitConversionService: UnitConversionService) {\r\n \r\n }\r\n\r\n getTemperatureSetpoints(queryOptions: ITemperatureSetpointQueryOptions = {}): Observable {\r\n return this.http.get('/api/setpoints', { params: queryOptions as HttpParams });\r\n }\r\n\r\n getTemperatureSetpointHistories(queryOptions: ITemperatureSetpointHistoryQueryOptions = {}) {\r\n return this.http.get(`/api/setpoints/history`, { params: queryOptions as HttpParams })\r\n }\r\n\r\n loadSetpoints(vehicleId: number, start: Date | string, end: Date | string): Promise {\r\n const setpointPromises: Promise[] = [];\r\n setpointPromises.push(lastValueFrom(this.getTemperatureSetpoints({ VehicleId: vehicleId })));\r\n setpointPromises.push(lastValueFrom(this.getTemperatureSetpointHistories({ VehicleId: vehicleId, Start: start, End: end })));\r\n\r\n\r\n return Promise.all(setpointPromises).then(([setpoints, setpointHistories]: [ITemperatureSetpointWithHistories[], ITemperatureSetpointHistory[]]) => {\r\n setpointHistories.sort((a, b) => {\r\n return this.veriDate.sort(a.StartTime, b.StartTime, SortDirection.Ascending);\r\n });\r\n\r\n setpoints.forEach(setpoint => {\r\n setpoint.histories = setpointHistories.filter(h => h.TemperatureSetpointId == setpoint.Id)\r\n });\r\n return setpoints;\r\n });\r\n\r\n }\r\n\r\n getSetpointForTemperatureRecord(record: ITemperatureRecord, temperatureSetpoints: ITemperatureSetpointWithHistories[], zoneId: number): ITemperatureSetpointHistory {\r\n if (!temperatureSetpoints || !record) {\r\n return;\r\n }\r\n const setpoint = temperatureSetpoints.find(setpoint => {\r\n return setpoint.ZoneId == zoneId;\r\n });\r\n const setpointsAtTime = setpoint.histories.filter(setpoint => {\r\n return new Date(setpoint.StartTime).getTime() < new Date(record.Timestamp).getTime();\r\n });\r\n setpointsAtTime.sort((a, b) => {\r\n return new Date(b.StartTime).getTime() - new Date(a.StartTime).getTime();\r\n })\r\n\r\n return setpointsAtTime[0];\r\n }\r\n\r\n mapHistoriesToSetPoints(temperatureSetpoints: ITemperatureSetpointWithHistories[], temperatureSetpointHistories: ITemperatureSetpointHistory[]) {\r\n temperatureSetpointHistories.sort((a, b) => {\r\n return new Date(b.StartTime).getTime() - new Date(a.StartTime).getTime();\r\n })\r\n\r\n temperatureSetpoints.forEach(setpoint => {\r\n setpoint.histories = temperatureSetpointHistories.filter(history => history.TemperatureSetpointId === setpoint.Id)\r\n });\r\n }\r\n\r\n createTimelineEntriesForSetpointChanges(zones: IZoneWithProbes[], historyStartTime: Date): ITimelineEntryWithData[] {\r\n const timelineEntries: ITimelineEntryWithData[] = [];\r\n\r\n zones.forEach(zone => {\r\n const recentHistories = zone.setpoint?.histories?.filter(history => {\r\n return this.dateService.date1IsAfterDate2(history.StartTime, historyStartTime);\r\n });\r\n\r\n if (!recentHistories || !recentHistories.length) {\r\n return timelineEntries;\r\n }\r\n\r\n\r\n recentHistories.forEach(history => {\r\n timelineEntries.push({\r\n icon: \"device_thermostat\",\r\n date: history.StartTime as any,\r\n largeDetails: {\r\n title: this.buildSetpointChangeTimelineTitle(zone, history)\r\n },\r\n data: zone.Id\r\n });\r\n })\r\n });\r\n\r\n return timelineEntries;\r\n }\r\n\r\n private buildSetpointChangeTimelineTitle(zone: IZoneWithProbes, history: ITemperatureSetpointHistory): string {\r\n let title: string = \"\";\r\n\r\n const zoneName = this.translationService.t(\"ReeferDetail.Zone\") + \" \" + zone.Position;\r\n\r\n title += this.translationService.t(\"ReeferDetail.SetPointChange\", zone.Name ? zone.Name : zoneName) + \" \";\r\n\r\n title += this.translationService.t(\"ReeferDetail.To\") + \" \";\r\n\r\n title += this.unitConversionService.convertUnitWithSuffix(history.SetpointValue, UnitConversionType.Temperature);\r\n\r\n return title;\r\n }\r\n}\r\n","\r\nimport { IInputType } from \"@interfaces/IInputType\";\r\nimport { IPlot } from \"@interfaces/IPlot\";\r\nimport { HardwareSource, InputStateDescription, IVehicleInput } from \"@interfaces/IVehicleInput\";\r\nimport { InputTypeService } from \"@services/inputType.service\";\r\nimport { ReeferInputType } from \"@temperature/_enums/reefer/ReeferInputType.enum\";\r\nimport * as angular from \"angular\";\r\nimport { CacheService } from \"./cache.Service\";\r\n\r\nexport interface IVehicleInputRecordHistory {\r\n\r\n Id: number;\r\n VehicleId: number;\r\n InputId: number;\r\n StartUtc: Date;\r\n EndUtc: Date;\r\n StartPlotId: number;\r\n EndPlotId: number;\r\n TriggerInputState: InputState;\n\n // ---\n\r\n inputName: string;\n\n inputStateDescription: InputStateDescription;\n\r\n startAddress: string;\r\n endAddress: string;\n\n startPlot?: IPlot;\n endPlot?: IPlot;\r\n}\n\nexport interface IVehicleInputRecord {\n Id: number;\n PlotId: number;\n VehicleId?: number;\n InputId?: number;\n ActiveState: InputState;\n Utc: Date;\n Position: number;\n Source: HardwareSource;\n ZoneId?: number;\n Type?: ReeferInputType;\n ZonePosition?: number;\r\n}\r\n\r\nexport enum InputState {\r\n Low = 0,\r\n High = 1\r\n}\r\n\r\nexport class VehicleInputService {\r\n\r\n private vehicleInputsCache = \"vehicleInputsCache\";\n\n static $inject = [\"$http\", \"inputTypeService\", \"cacheService\"];\n\r\n constructor(\n private $http: angular.IHttpService,\n private inputTypeService: InputTypeService,\r\n private readonly cacheService: CacheService\r\n ) {\r\n\n this.cacheService.createCache(this.vehicleInputsCache, { maxAge: 60 * 60 * 1000 });\r\n }\n\n getVehicleInputs(vehicleId: number = null, invalidateCache: boolean = false): angular.IPromise {\r\n return this.getOrRetrieveVehicleInputs(vehicleId, invalidateCache)\r\n .then((inputs: IVehicleInput[]) => {\r\n inputs.forEach(input => {\r\n input.inputSourceString = HardwareSource[input.Source];\r\n\r\n });\r\n return this.inputTypeService.getInputTypes().then(types => {\r\n this.mapInputTypesToInputs(inputs, types);\n\r\n if (vehicleId) {\r\n return inputs.filter(input => input.VehicleId == vehicleId);\r\n }\r\n\r\n return inputs;\r\n });\r\n });\n }\r\n\r\n getVehicleInputsFromDatabase(vehicleId: number): angular.IPromise {\n return this\r\n .$http({\r\n url: \"/api/inputs\",\r\n method: \"GET\",\r\n })\r\n .then((response: angular.IHttpResponse) => {\n\r\n return response.data;\r\n });\r\n }\r\n\r\n getVehicleInputHistory(vehicleId: number, start: Date, end: Date, includeOverlapping: boolean = true, invalidateCache: boolean = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/inputs/${vehicleId}/history`,\r\n method: \"GET\",\r\n cache: true,\r\n params: {\r\n start: start,\r\n end: end,\r\n includeOverlapping: includeOverlapping,\r\n minsToLive: 5,\r\n invalidateCache: invalidateCache\r\n }\r\n })\r\n .then((result: angular.IHttpResponse) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n getVehicleInputHistoryById(id: number): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/inputs/history/${id}`,\r\n method: \"GET\",\r\n cache: false\r\n })\r\n .then((result: angular.IHttpResponse) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n saveInputs(vehicleId: number, inputs: IVehicleInput[] = []): angular.IPromise {\r\n return this\r\n .$http({\r\n url: \"/api/inputs/update\",\r\n method: \"POST\",\r\n data: inputs\r\n })\r\n .then(x => {\r\n inputs.forEach(input => {\n this.cacheService.addOrUpdateItem(this.vehicleInputsCache, input, (v1, v2) => v1.Id == v2.Id);\r\n });\r\n\r\n return this.getVehicleInputs(vehicleId);\r\n });\r\n }\r\n\r\n getInputForVehicle(vehicleId: number, inputs: IVehicleInput[]): IVehicleInput {\r\n for (let i = 0; i < inputs.length; i++) {\r\n const input = inputs[i];\r\n\r\n if (input.VehicleId === vehicleId) {\r\n return input;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\n // ---\n\n private getOrRetrieveVehicleInputs(vehicleId: number, invalidateCache: boolean = false, unsafe = false): angular.IPromise {\n return this.cacheService.getOrRetrieveData(this.vehicleInputsCache, () => this.getVehicleInputsFromDatabase(vehicleId), invalidateCache, unsafe);\n }\r\n\n private mapInputTypesToInputs(inputs: IVehicleInput[], inputTypes: IInputType[]) {\r\n inputs.forEach(input => {\n\n var matchingInputType = inputTypes.find(type => type.Id === input.InputTypeId);\n\n if (matchingInputType) {\n input.InputStateDescription = matchingInputType.InputStateDescription\n input.name = matchingInputType.Name\r\n }\r\n\r\n if (!input.name) {\r\n input.name = `Unknown Input ${HardwareSource[input.Source]} ${input.Position}`;\r\n }\r\n });\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { DateService } from \"@services/date.service\";\r\nimport { ITemperatureAlarmRecord } from \"@temperature/_models/temperature/ITemperatureAlarmRecord\";\r\nimport { ITemperatureRecord } from \"@temperature/_models/temperature/ITemperatureRecord\";\r\nimport { Observable } from \"rxjs\";\r\nimport { tap } from \"rxjs/operators\";\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class TemperatureRecordService {\r\n constructor(private readonly http: HttpClient,\r\n private readonly dateService: DateService) { }\r\n\r\n getTemperatureRecord(id: number): Observable {\r\n return this.http.get(`/api/temperature/records/${id}`);\r\n }\r\n\r\n getTemperatureAlarmRecord(id: number): Observable {\r\n return this.http.get(`/api/temperaturealarm/${id}`);\r\n }\r\n\r\n getLatestTemperatureRecords(ignoreOldData = true): Observable {\r\n return this.http.get(`/api/temperature/latest`).pipe(tap(records => {\r\n if (!ignoreOldData) {\r\n return records;\r\n }\r\n return records.filter(record => this.recordIsToday(record))\r\n }))\r\n }\r\n\r\n getLatestTemperatureRecordsForVehicle(vehicleId: number): Observable {\r\n return this.http.get(`/api/temperature/${vehicleId}/latest`);\r\n }\r\n\r\n getTemperatureRecordsForVehicle(vehicleId: number, startDate: Date, endDate: Date): Observable {\r\n const options = { params: new HttpParams().set(\"startDate\", startDate.toISOString()).set(\"endDate\", endDate.toISOString()) };\r\n\r\n return this.http.get(`/api/temperature/${vehicleId}`, options).pipe(tap(records => {\r\n records.sort((a, b) => a.Id - b.Id);\r\n return records;\r\n }));\r\n }\r\n\r\n getTemperatureRecordsByParentTrackerImei(imei: string, startDate: Date, endDate: Date): Observable {\r\n const options = { params: new HttpParams().set(\"startDate\", startDate.toISOString()).set(\"endDate\", endDate.toISOString()) };\r\n \r\n return this.http.get(`/api/temperature/records/trackingDevice/${imei}`, options);\r\n }\r\n\r\n private recordIsToday(record: ITemperatureRecord): boolean {\r\n const recordTime = new Date(record.Timestamp);\r\n const today = new Date();\r\n return this.dateService.isSameDate(recordTime, today);\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { ITimelineEntryWithData } from \"@app/directives/_veri/v-timeline/v-timeline.component\";\r\nimport { DateService } from \"@app/services/date.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { ITemperatureOutOfBoundsHistory } from \"@temperature/_models/temperature/ITemperatureOutOfBoundsHistory\";\r\nimport { ITemperatureProbeWithTemperatureData } from \"@temperature/_models/temperature/ITemperatureProbe\";\r\nimport { Observable } from \"rxjs\";\r\nimport { IZoneWithProbes } from \"../_models/temperature/ITemperatureZone\";\r\nimport { IZoneTemperatureOutOfBoundsHistory } from \"../_models/temperature/ITemperatureZoneOutOfBoundsHistory\";\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class TemperatureOutOfBoundsHistoryService {\r\n constructor(private readonly http: HttpClient,\r\n private readonly dateService: DateService,\r\n private readonly translationService: TranslationService) { }\r\n\r\n getActiveVehicleTemperatureOutOfBoundsHistories(): Observable {\r\n return this.http.get(`/api/temperature/outOfBoundsHistories/active`);\r\n }\r\n\r\n getVehicleTemperatureOutOfBoundsHistories(vehicleId: number, start: Date | string, end: Date | string): Observable {\r\n const params = {\r\n vehicleId: vehicleId,\r\n start: new Date(start).toISOString(),\r\n end: new Date(end).toISOString(),\r\n }\r\n return this.http.get(`/api/temperature/outOfBoundsHistories/${vehicleId}`, { params: params });\r\n }\r\n\r\n getVehicleTemperatureOutOfBoundsHistory(historyId: number): Observable {\r\n return this.http.get(`/api/temperature/outOfBoundsHistory/${historyId}`);\r\n }\r\n\r\n getVehicleTemperatureOutOfBoundsHistoryByAlarmRecord(alarmId: number): Observable {\r\n return this.http.get(`/api/temperature/outOfBoundsHistoryByAlarm/${alarmId}`);\r\n }\r\n\r\n getAllVehicleTemperatureOutOfBoundsHistories(start: Date | string, end: Date | string): Observable {\r\n const params = {\r\n start: new Date(start).toISOString(),\r\n end: new Date(end).toISOString(),\r\n }\r\n return this.http.get(`/api/temperature/outOfBoundsHistories`, { params: params });\r\n }\r\n\r\n mapHistoriesToProbe(outOfBoundsHistories: ITemperatureOutOfBoundsHistory[], probe: ITemperatureProbeWithTemperatureData) {\r\n probe.outOfBoundsHistories = outOfBoundsHistories.filter(history => history.TemperatureProbeId === probe.Id);\r\n }\r\n\r\n createTimelineEntriesForOutOfBoundsHistory(outOfBoundsHistory: IZoneTemperatureOutOfBoundsHistory[], zones: IZoneWithProbes[], historyStartTime: Date): ITimelineEntryWithData[] {\r\n const timelineEntries: ITimelineEntryWithData[] = [];\r\n\r\n outOfBoundsHistory.forEach(history => {\r\n const zoneNumber = zones.find(zone => zone.Id === history.ZoneId)?.Position;\r\n if (this.dateService.date1IsAfterDate2(history.StartTime, historyStartTime)) {\r\n timelineEntries.push({\r\n icon: \"warning\",\r\n date: history.StartTime as any,\r\n largeDetails: {\r\n title: this.translationService.t(\"ReeferDetail.ZoneOutOfBounds\", zoneNumber)\r\n },\r\n data: history.ZoneId\r\n });\r\n }\r\n\r\n if (history.EndTime) {\r\n timelineEntries.push({\r\n icon: \"check\",\r\n date: history.EndTime as any,\r\n largeDetails: {\r\n title: this.translationService.t(\"ReeferDetail.ZoneBackInBounds\", zoneNumber)\r\n },\r\n data: history.ZoneId\r\n });\r\n }\r\n })\r\n\r\n return timelineEntries;\r\n }\r\n}\r\n","import angular, { IPromise } from \"angular\";\r\nimport { IAxleWeightProfile } from \"@interfaces/IAxleWeightProfile\";\r\nimport { IAxleWeightOutOfBoundsHistory, ProfileBound, VehicleAxle } from \"@interfaces/IAxleWeightOutOfBoundsHistory\";\r\nimport { IAlertRuleRecord } from \"src/app/main/modules/alerts/_models/alerts.interfaces\";\r\nimport { AxleWeightService } from \"@services/axleWeight.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\n\r\nexport interface IAxleWeightAlertDetailData {\r\n profile?: IAxleWeightProfile;\r\n history?: IAxleWeightOutOfBoundsHistory;\r\n lowerBound?: number;\r\n upperBound?: number;\r\n weightDiffExtreme?: number;\r\n weightDiffMessageExtreme?: string;\r\n}\r\n\r\nexport class AxleWeightAlertDetailService {\r\n static $inject = [\"$q\", \"translationService\", \"axleWeightService\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly translationService: TranslationService,\r\n private readonly axleWeightService: AxleWeightService) {\r\n }\r\n\r\n getAlertExport(record: IAlertRuleRecord): IPromise {\r\n return this.getAlertData(record).then((data) => {\r\n return `[${data.history?.VehicleAxle}] ${this.createAlertLabel(data)}`;\r\n }).catch((error) => {\r\n console.error(\"Error retrieving axle weight alert detail: \", error);\r\n\r\n return null\r\n });\r\n }\r\n\r\n createAlertLabel(data: IAxleWeightAlertDetailData): string {\r\n return `${data.history?.AxleWeightExtreme} (${data.lowerBound} - ${data.upperBound})`;\r\n }\r\n\r\n getAlertData(record: IAlertRuleRecord): IPromise {\r\n const promises = [];\r\n const data: IAxleWeightAlertDetailData = {};\r\n\r\n promises.push(this.getAxleWeightProfile(record, data));\r\n promises.push(this.getAxleWeightHistory(record, data));\r\n\r\n return this.$q.all(promises).then(() => {\r\n data.lowerBound = this.getBound(data.profile, ProfileBound.Lower, data.history.VehicleAxle);\r\n data.upperBound = this.getBound(data.profile, ProfileBound.Upper, data.history.VehicleAxle);\r\n\r\n if (data.history.AxleWeightExtreme < data.lowerBound) {\r\n data.weightDiffExtreme = Math.abs(data.history.AxleWeightExtreme - data.lowerBound);\r\n data.weightDiffMessageExtreme = this.translationService.t('Alerts.BelowLowerBounds');\r\n } else {\r\n data.weightDiffExtreme = data.history.AxleWeightExtreme - data.upperBound;\r\n data.weightDiffMessageExtreme = this.translationService.t('Alerts.AboveUpperBounds');;\r\n }\r\n\r\n return data;\r\n });\r\n }\r\n\r\n private getAxleWeightProfile(record: IAlertRuleRecord, data: IAxleWeightAlertDetailData) : angular.IPromise {\r\n if (!record.alertMetadata.AxleWeightProfileId) {\r\n return this.$q.resolve();\r\n }\r\n\r\n return this.axleWeightService.getAxleWeightProfile(record.alertMetadata.AxleWeightProfileId).then(profile => {\r\n data.profile = profile;\r\n });\r\n }\r\n\r\n private getAxleWeightHistory(record: IAlertRuleRecord, data: IAxleWeightAlertDetailData): angular.IPromise {\r\n if (!record.alertMetadata.AxleWeightOutOfBoundsHistoryId) {\r\n return this.$q.resolve();\r\n }\r\n\r\n return this.axleWeightService\r\n .getAxleWeightOutOfBoundsHistory(record.alertMetadata.AxleWeightOutOfBoundsHistoryId).then(history => {\r\n data.history = history;\r\n });\r\n }\r\n\r\n private getBound(profile: IAxleWeightProfile, bound: ProfileBound, axle: VehicleAxle) :number {\r\n switch (axle) {\r\n case VehicleAxle.Total:\r\n return bound === ProfileBound.Upper ? profile.TotalUpperBound : profile.TotalLowerBound;\r\n case VehicleAxle.Axle1:\r\n return bound === ProfileBound.Upper ? profile.Axle1UpperBound : profile.Axle1LowerBound;\r\n case VehicleAxle.Axle2:\r\n return bound === ProfileBound.Upper ? profile.Axle2UpperBound : profile.Axle2LowerBound;\r\n case VehicleAxle.Axle3:\r\n return bound === ProfileBound.Upper ? profile.Axle3UpperBound : profile.Axle3LowerBound;\r\n case VehicleAxle.Axle4:\r\n return bound === ProfileBound.Upper ? profile.Axle4UpperBound : profile.Axle4LowerBound;\r\n default:\r\n return null;\r\n }\r\n }\r\n}\r\n","import { VehicleService } from \"@services/vehicle.service\";\r\nimport angular, { IPromise } from \"angular\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { IAlertRuleRecord } from \"../../../_models/alerts.interfaces\";\r\nimport { IGeofence } from \"@interfaces/IGeofences\";\r\nimport { GeofenceService } from \"@services/geofence.service\";\r\n\r\nexport interface IGeofenceAlertDetailData {\r\n geofence?: IGeofence;\r\n vehicle?: IVehicle;\r\n}\r\n\r\nexport class GeofenceAlertDetailService {\r\n\r\n static $inject = [\"$q\", \"geofenceService\", \"vehicleService\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly geofenceService: GeofenceService,\r\n private readonly vehicleService: VehicleService) {\r\n }\r\n\r\n getAlertExport(record: IAlertRuleRecord): IPromise {\r\n return this.getAlertData(record).then((data) => {\r\n return `${this.createAlertLabel(data)}`;\r\n }).catch((error) => {\r\n console.error(\"Error retrieving geofence alert detail: \", error);\r\n\r\n return null\r\n });\r\n }\r\n\r\n createAlertLabel(data: IGeofenceAlertDetailData): string {\r\n return `${data.geofence?.Description}`;\r\n }\r\n\r\n getAlertData(record: IAlertRuleRecord): IPromise {\r\n const promises = [];\r\n const data: IGeofenceAlertDetailData = {};\r\n\r\n promises.push(this.getGeofence(record, data));\r\n promises.push(this.getVehicle(record, data));\r\n\r\n return this.$q.all(promises).then(() => {\r\n return data;\r\n });\r\n }\r\n\r\n private getGeofence(record: IAlertRuleRecord, data: IGeofenceAlertDetailData): IPromise {\r\n if (!record.alertMetadata.GeofenceId) {\r\n return this.$q.resolve();\r\n }\r\n\r\n return this.geofenceService.getGeofenceById(record.alertMetadata.GeofenceId).then(geofence => {\r\n data.geofence = geofence;\r\n });\r\n }\r\n\r\n private getVehicle(record: IAlertRuleRecord, data: IGeofenceAlertDetailData): IPromise {\r\n if (!record.VehicleId) {\r\n return this.$q.resolve();\r\n }\r\n\r\n return this.vehicleService.getVehicles({ includePeripheralMappings: true })\r\n .then((vehicles) => {\r\n data.vehicle = vehicles.find(v => v.Id === record.VehicleId);\r\n });\r\n }\r\n}\r\n","import angular, { IPromise } from \"angular\";\r\nimport { IVehicleInput } from \"@interfaces/IVehicleInput\";\r\nimport { VehicleInputService, IVehicleInputRecordHistory } from \"@services/vehicleInput.service\";\r\nimport { IAlertRuleRecord } from \"src/app/main/modules/alerts/_models/alerts.interfaces\";\r\nimport { InputTypeService } from \"@services/inputType.service\";\r\nimport { IInputType } from \"@interfaces/IInputType\";\r\n\r\nexport interface IInputAlertDetailData {\r\n input?: IVehicleInput;\r\n inputHistory?: IVehicleInputRecordHistory;\r\n inputType?: IInputType;\r\n inputTypes?: IInputType[];\r\n}\r\n\r\nexport class InputAlertDetailService {\r\n static $inject = [\"$q\", \"inputTypeService\", \"vehicleInputService\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly inputTypeService: InputTypeService,\r\n private readonly vehicleInputService: VehicleInputService) {\r\n }\r\n\r\n getAlertExport(record: IAlertRuleRecord): IPromise {\r\n return this.getAlertData(record).then((data) => {\r\n return `${this.createAlertLabel(data)}`;\r\n }).catch((error) => {\r\n console.error(\"Error retrieving input alert detail: \", error);\r\n\r\n return null\r\n });\r\n }\r\n\r\n createAlertLabel(data: IInputAlertDetailData) {\r\n return `${data.input.name} (${data.inputHistory?.inputStateDescription})`;\r\n }\r\n\r\n getAlertData(record: IAlertRuleRecord): IPromise {\r\n const promises = [];\r\n const data: IInputAlertDetailData = {};\r\n\r\n promises.push(this.getInput(record, data));\r\n promises.push(this.getInputHistory(record, data));\r\n promises.push(this.getInputTypes(data));\r\n\r\n return this.$q.all(promises).then(() => {\r\n data.inputType = data.inputTypes.find(i => i.Id === data.input.InputTypeId);\r\n return data;\r\n });\r\n }\r\n\r\n private getInput(record: IAlertRuleRecord, data: IInputAlertDetailData) {\r\n if (!record.alertMetadata.InputId) {\r\n return this.$q.resolve();\r\n }\r\n\r\n return this.vehicleInputService.getVehicleInputs(record.VehicleId).then(inputs => {\r\n data.input = inputs.find(i => i.Id === record.alertMetadata.InputId);\r\n });\r\n }\r\n\r\n private getInputHistory(record: IAlertRuleRecord, data: IInputAlertDetailData) {\r\n if (!record.alertMetadata.InputRecordHistoryId) {\r\n return this.$q.resolve();\r\n }\r\n\r\n return this.vehicleInputService.getVehicleInputHistoryById(record.alertMetadata.InputRecordHistoryId).then(\r\n history => {\r\n data.inputHistory = history;\r\n });\r\n }\r\n\r\n private getInputTypes(data: IInputAlertDetailData) {\r\n return this.inputTypeService.getInputTypes().then(types => {\r\n data.inputTypes = types;\r\n });\r\n }\r\n}\r\n","import angular, { IPromise } from \"angular\";\r\nimport { IAlertRuleRecord } from \"src/app/main/modules/alerts/_models/alerts.interfaces\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { IPowerLossHistory } from \"@interfaces/IPowerLossHistory\";\r\nimport { PowerLossHistoryService } from \"@services/powerLossHistory.service\";\r\n\r\nexport interface IPowerLossAlertDetailData {\r\n history?: IPowerLossHistory;\r\n}\r\n\r\nexport class PowerLossAlertDetailService {\r\n static $inject = [\"$q\", \"translationService\", \"powerLossHistoryService\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly translationService: TranslationService,\r\n private readonly powerLossHistoryService: PowerLossHistoryService) {\r\n }\r\n\r\n getAlertExport(record: IAlertRuleRecord): IPromise {\r\n return this.getAlertData(record).then((data) => {\r\n return `${this.createAlertLabel(data)}`;\r\n }).catch((error) => {\r\n console.error(\"Error retrieving power loss alert detail: \", error);\r\n\r\n return null\r\n });\r\n }\r\n\r\n createAlertLabel(data: IPowerLossAlertDetailData): string {\r\n return `${data.history?.Source} ${this.translationService.t('Alerts.LostPower')}`;\r\n }\r\n\r\n getAlertData(record: IAlertRuleRecord): IPromise {\r\n const promises = [];\r\n const data: IPowerLossAlertDetailData = {};\r\n\r\n promises.push(this.getPowerLossHistory(record, data));\r\n\r\n return this.$q.all(promises).then(() => {\r\n return data;\r\n });\r\n }\r\n\r\n private getPowerLossHistory(record: IAlertRuleRecord, data: IPowerLossAlertDetailData): angular.IPromise {\r\n if (!record.alertMetadata.PowerLossHistoryId) {\r\n return this.$q.resolve();\r\n }\r\n\r\n return this.powerLossHistoryService.getPowerLossHistory(record.alertMetadata.PowerLossHistoryId).then(\r\n history => {\r\n data.history = history;\r\n });\r\n }\r\n}\r\n","import angular, { IPromise } from \"angular\";\r\nimport { IAlertRuleRecord } from \"src/app/main/modules/alerts/_models/alerts.interfaces\";\r\n\r\nexport interface ITollAlertDetailData {\r\n\r\n}\r\n\r\nexport class TollAlertDetailService {\r\n static $inject = [\"$q\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService) {\r\n }\r\n\r\n getAlertExport(record: IAlertRuleRecord): IPromise {\r\n return this.getAlertData(record).then((data) => {\r\n return `${this.createAlertLabel(data)}`;\r\n }).catch((error) => {\r\n console.error(\"Error retrieving toll alert detail: \", error);\r\n\r\n return null\r\n });\r\n }\r\n\r\n createAlertLabel(data: ITollAlertDetailData) {\r\n return ``;\r\n }\r\n\r\n getAlertData(record: IAlertRuleRecord): IPromise {\r\n const promises = [];\r\n var data: ITollAlertDetailData = {};\r\n\r\n // promises.push(this.getToll(record, data));\r\n\r\n return this.$q.all(promises).then(() => {\r\n return data;\r\n });\r\n }\r\n\r\n \r\n}\r\n","import angular, { IPromise } from \"angular\";\r\nimport { IAlertRuleRecord } from \"src/app/main/modules/alerts/_models/alerts.interfaces\";\r\n\r\nexport interface ITyreRecordAlertDetailData {\r\n\r\n}\r\n\r\nexport class TyreRecordAlertDetailService {\r\n static $inject = [\"$q\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService) {\r\n }\r\n\r\n getAlertExport(record: IAlertRuleRecord): IPromise {\r\n return this.getAlertData(record).then((data) => {\r\n return `${this.createAlertLabel(data)}`;\r\n }).catch((error) => {\r\n console.error(\"Error retrieving tyre record alert detail: \", error);\r\n\r\n return null\r\n });\r\n }\r\n\r\n createAlertLabel(data: ITyreRecordAlertDetailData) {\r\n return ``;\r\n }\r\n\r\n getAlertData(record: IAlertRuleRecord): IPromise {\r\n const promises = [];\r\n var data: ITyreRecordAlertDetailData = {};\r\n\r\n // promises.push(this.getTyreRecord(record, data));\r\n\r\n return this.$q.all(promises).then(() => {\r\n return data;\r\n });\r\n }\r\n\r\n\r\n}\r\n","import angular, { IPromise } from \"angular\";\r\nimport { IAlertRuleRecord } from \"src/app/main/modules/alerts/_models/alerts.interfaces\";\r\n\r\nexport interface IVehicleDiagnosticAlertDetailData {\r\n\r\n}\r\n\r\nexport class VehicleDiagnosticAlertDetailService {\r\n static $inject = [\"$q\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService) {\r\n }\r\n\r\n getAlertExport(record: IAlertRuleRecord): IPromise {\r\n return this.getAlertData(record).then((data) => {\r\n return `${this.createAlertLabel(data)}`;\r\n }).catch((error) => {\r\n console.error(\"Error retrieving vehicle diagnostic alert detail: \", error);\r\n\r\n return null\r\n });\r\n }\r\n\r\n createAlertLabel(data: IVehicleDiagnosticAlertDetailData) {\r\n return ``;\r\n }\r\n\r\n getAlertData(record: IAlertRuleRecord): IPromise {\r\n const promises = [];\r\n var data: IVehicleDiagnosticAlertDetailData = {};\r\n\r\n // promises.push(this.getVehicleDiagnosticRecord(record, data));\r\n\r\n return this.$q.all(promises).then(() => {\r\n return data;\r\n });\r\n }\r\n\r\n\r\n}\r\n","import angular, { IPromise } from \"angular\";\r\nimport { IAlertRuleRecord } from \"src/app/main/modules/alerts/_models/alerts.interfaces\";\r\n\r\nexport interface IVideoAlertDetailData {\r\n\r\n}\r\n\r\nexport class VideoAlertDetailService {\r\n static $inject = [\"$q\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService) {\r\n }\r\n\r\n getAlertExport(record: IAlertRuleRecord): IPromise {\r\n return this.getAlertData(record).then((data) => {\r\n return `${this.createAlertLabel(data)}`;\r\n }).catch((error) => {\r\n console.error(\"Error retrieving video alert detail: \", error);\r\n\r\n return null\r\n });\r\n }\r\n\r\n createAlertLabel(data: IVideoAlertDetailData) {\r\n return ``;\r\n }\r\n\r\n getAlertData(record: IAlertRuleRecord): IPromise {\r\n var data: IVideoAlertDetailData = {};\r\n\r\n return this.$q.resolve(data)\r\n }\r\n\r\n\r\n}\r\n","import { SortDirection } from \"@enums/SortDirection\";\r\nimport { IFilterOptions } from \"@interfaces/filters/IFilterOptions\";\r\nimport { ICombinedPreferences } from \"@interfaces/ICombinedPreferences\";\r\nimport { IRunBlockRootScope } from \"@interfaces/IRunBlockRootScope\";\r\nimport { DynamicReportService } from \"@reports/_services/dynamicReports.service\";\r\nimport { ColumnDataType } from \"@reports/enums/ColumnDataType\";\r\nimport { ReportDataFunction } from \"@reports/enums/ReportDataFunction\";\r\nimport { ReportTableRowDataSource } from \"@reports/enums/ReportTableRowDataSource\";\r\nimport { IColumnHeader } from \"@reports/models/IColumnHeader\";\r\nimport { IDataDefinition } from \"@reports/models/IReportDefinition\";\r\nimport { ReportParameterType } from \"@reports/models/IReportParameters\";\r\nimport { IReportRow } from \"@reports/models/IReportRow\";\r\nimport { IHighchartsDataSeries } from \"@services/charts.service\";\r\nimport { ColourService } from \"@services/colour.service\";\r\nimport { DisplayService, IDialogOptionsJson } from \"@services/display.service\";\r\nimport { FilterOptionsService } from \"@services/filterOptions.service\";\r\nimport { SessionService } from \"@services/session.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport * as angular from \"angular\";\r\nimport copy from \"fast-copy/dist/fast-copy.esm.js\";\r\nimport * as moment from \"moment\";\r\nimport { SettingsName } from \"src/app/class/SettingsName\";\r\nimport { IDashboardWidget } from \"./widgets/models/IDashboardWidget\";\r\n\r\nexport interface IDashboard {\r\n Id: number;\r\n Title: string;\r\n Widgets: IDashboardWidget[];\r\n WidgetsJson: string;\r\n AccountId: number;\r\n WidgetColumnTitleTranslations: number[];\r\n url: string;\r\n}\r\n\r\nexport interface IChartSeries {\r\n date: moment.Moment;\r\n value: T;\r\n}\r\n\r\nexport interface IPooledRequest {\r\n id: number;\r\n widgets: IDashboardWidget[];\r\n\r\n combinedDefinition?: IDataDefinition;\r\n promise?: angular.IPromise;\r\n responseDataDefinition?: IDataDefinition;\r\n\r\n completed?: boolean;\r\n}\r\n\r\nexport class DashboardServiceV2 {\r\n\r\n timeout: angular.IPromise;\r\n private userPrefs: ICombinedPreferences;\r\n\r\n static SyncGraphToolHoverEvent: string = \"syncGraphToolHover\";\r\n\r\n static $inject = [\"$rootScope\", \"$q\", \"$http\", \"dynamicReportService\", \"veriDate\", \"colourService\", \"sessionService\", \"filterOptionsService\", \"translationService\", \"displayService\"];\r\n\r\n constructor(\r\n private readonly $rootScope: IRunBlockRootScope,\r\n private readonly $q: angular.IQService,\r\n private readonly $http: angular.IHttpService,\r\n private readonly dynamicReportService: DynamicReportService,\r\n private readonly veriDate: VeriDate,\r\n private readonly colourService: ColourService,\r\n private readonly sessionService: SessionService,\r\n private readonly filterOptionsService: FilterOptionsService,\r\n private readonly translationService: TranslationService,\r\n private readonly displayService: DisplayService) {\r\n this.userPrefs = this.sessionService.getItem(SettingsName.UserOptions);\r\n }\r\n\r\n translateDashboard(dashboard: IDashboard): void {\r\n dashboard.Title = this.translationService.t(`DashboardWidgetTitles.${dashboard.Title}`);\r\n\r\n const dashboardWidgets: IDashboardWidget[] = dashboard.Widgets;\r\n\r\n dashboardWidgets?.forEach(widget => {\r\n this.translateDashboardWidget(widget, dashboard.WidgetColumnTitleTranslations);\r\n });\r\n }\r\n\r\n translateDashboards(dashboards: IDashboard[]): void {\r\n dashboards?.forEach(dashboard => this.translateDashboard(dashboard));\r\n }\r\n\r\n translateDashboardWidget(widget: IDashboardWidget, translationDictionary: number[]): void {\r\n widget.Title = this.translationService.t(`DashboardWidgetTitles.${widget.Title.replace(/[^A-Z0-9)(]/ig, \"\").replace(/[()]/g, \"\")}`)\r\n\r\n widget.DataWidgetParameters.DataSource.forEach(header => {\r\n header.ColumnDefinition.TranslatedTitle = translationDictionary[header.Title];\r\n });\r\n }\r\n\r\n showWidgetTable(widget: IDashboardWidget, $event: MouseEvent, filterOptions: IFilterOptions, initialDrillRow?: IReportRow) {\r\n var dialogHTML = ``;\r\n widget.dataDefinition[\"Title\"] = widget.Title;\r\n\r\n const dialogOptions: IDialogOptionsJson = {\r\n title: `${widget.Title} - ${this.translationService.t(\"Common.DataView\")}`,\r\n dialogHTML: dialogHTML,\r\n dialogId: `reportTableDialog`,\r\n bindings: {\r\n widgetTable: widget,\r\n initialDrillRow: initialDrillRow,\r\n filterOptions: filterOptions\r\n },\r\n event: $event\r\n };\r\n\r\n return this.displayService.showDialog(dialogOptions);\r\n }\r\n\r\n sendGraphHoverEvent(event: Event, x: number) {\r\n\r\n this.$rootScope.$broadcast(DashboardServiceV2.SyncGraphToolHoverEvent, event, x);\r\n }\r\n\r\n isWidgetCovered(widget: HTMLElement): boolean {\r\n const rect = widget.getBoundingClientRect();\r\n\r\n return !this.isPointCoveringElement(rect.left, rect.top, widget)\r\n || !this.isPointCoveringElement(rect.right - 1, rect.top, widget);\r\n }\r\n\r\n isPointCoveringElement(x: number, y: number, element: HTMLElement) {\r\n\r\n let elementAtPosition = document.elementFromPoint(x, y);\r\n\r\n do {\r\n if (elementAtPosition.isSameNode(element)) {\r\n return true;\r\n }\r\n\r\n elementAtPosition = elementAtPosition.parentNode as Element;\r\n }\r\n while (elementAtPosition.parentNode);\r\n\r\n return false;\r\n }\r\n\r\n dataSourceToWidgetDataDefinition(widget: IDashboardWidget) {\r\n if (!widget.dataDefinition) {\r\n widget.dataDefinition = {};\r\n }\r\n\r\n if (widget.DataWidgetParameters.RowDataSource) {\r\n widget.dataDefinition.RowDataSource = widget.DataWidgetParameters.RowDataSource;\r\n } else {\r\n widget.dataDefinition.RowDataSource = ReportTableRowDataSource.Day;\r\n }\r\n\r\n widget.dataDefinition.TableDefinition = {\r\n Headers: copy(widget.DataWidgetParameters.DataSource)\r\n };\r\n }\r\n\r\n aggregateData(data: number[], dataFunction: ReportDataFunction, round = true) {\r\n switch (dataFunction) {\r\n case ReportDataFunction.First:\r\n return data[0];\r\n\r\n case ReportDataFunction.Last:\r\n return data[data.length - 1];\r\n\r\n case ReportDataFunction.Count:\r\n return data.length;\r\n }\r\n\r\n const sum = data.reduce((x, y) => isNaN(y) ? x : x + y, 0);\r\n\r\n switch (dataFunction) {\r\n\r\n case ReportDataFunction.Average:\r\n const average = sum / data.length;\r\n\r\n return round ? Math.round(average) : average;\r\n\r\n // Default is sum\r\n case ReportDataFunction.Sum:\r\n default:\r\n return sum;\r\n }\r\n }\r\n\r\n aggregateChartSeries(series: IChartSeries[], dataFunction: ReportDataFunction, round = true): number {\r\n return this.aggregateData(series.map(s => s.value), dataFunction, round);\r\n }\r\n\r\n convertDataDefinitionToMetricSeries(dataDefinition: IDataDefinition, useTotalsRow = false): IChartSeries[] {\r\n var dataSeries: IChartSeries[] = [];\r\n\r\n if (!dataDefinition.TableDefinition.Rows) {\r\n return [];\r\n }\r\n\r\n dataDefinition.TableDefinition.Rows.forEach(row => {\r\n if (!row.HasData) {\r\n return;\r\n }\r\n\r\n if (row.Cells.length < 2) {\r\n return;\r\n }\r\n\r\n dataSeries.push(this.createChartSeries(dataDefinition, row));\r\n });\r\n\r\n return dataSeries;\r\n }\r\n\r\n private createChartSeries(dataDefinition: IDataDefinition, row: IReportRow): IChartSeries {\r\n const header = dataDefinition.TableDefinition.Headers[0];\r\n const value = this.convertDataValue(row.Cells[1].Data, header);\r\n\r\n return {\r\n date: moment(row.Cells[0].Data).startOf(\"d\"),\r\n value: value\r\n };\r\n }\r\n\r\n convertDataDefinitionToChartSeries(dataDefinition: IDataDefinition, hideEmptySeries: boolean, useTotals: boolean): IHighchartsDataSeries[] {\r\n var dataSeries: IHighchartsDataSeries[] = [];\r\n\r\n var headers = copy(dataDefinition.TableDefinition.Headers);\r\n\r\n headers.forEach((header, index) => {\r\n index = index - 1;\r\n if (index < 0) {\r\n return;\r\n }\r\n\r\n dataSeries.push({ name: header.ColumnDefinition?.TranslatedTitle ?? header.Title, data: [], color: this.colourService.getColour(index, false).solidColour });\r\n });\r\n\r\n if (useTotals) {\r\n this.processDataDefinitionRow(dataDefinition.TableDefinition.TotalsRow, headers, dataSeries);\r\n }\r\n else if (dataDefinition.TableDefinition.Rows) {\r\n dataDefinition.TableDefinition.Rows.forEach(row => {\r\n this.processDataDefinitionRow(row, headers, dataSeries);\r\n });\r\n }\r\n\r\n if (hideEmptySeries) {\r\n dataSeries = dataSeries.filter(s => { return s.data.reduce((x, y) => x + y[1], 0) != 0; });\r\n }\r\n\r\n return dataSeries;\r\n }\r\n\r\n convertDataValue(value: any, header: IColumnHeader): any {\r\n\r\n if (value === undefined) {\r\n value = 0;\r\n }\r\n\r\n switch (header.ColumnDefinition.Type) {\r\n case ColumnDataType.Double:\r\n case ColumnDataType.Int:\r\n case ColumnDataType.Score:\r\n if (value && header.ColumnDefinition.Format.RoundTo) {\r\n value = Math.round((value + Number.EPSILON) * 100) / 100;\r\n }\r\n //return Math.round(value * 100) / 100;\r\n return value;\r\n\r\n // Timespans are formatted oddly so require specific attention\r\n case ColumnDataType.Duration:\r\n return this.veriDate.parseTimeSpan(value);\r\n }\r\n\r\n return value;\r\n }\r\n\r\n getColumnHeaders(): angular.IPromise {\r\n return this.dynamicReportService.getDisplayColumnHeaders();\r\n }\r\n\r\n findColumn(dataSource: string, columns: IColumnHeader[], dataSourceType?: string): IColumnHeader {\r\n dataSource = dataSource.toLowerCase();\r\n dataSourceType = dataSourceType.toLowerCase();\r\n\r\n var foundColumn: IColumnHeader;\r\n\r\n let columnsToSearch = columns;\r\n\r\n if (dataSourceType) {\r\n columnsToSearch = columns.filter(column => { return column.DataSourceType.toLowerCase().indexOf(dataSourceType) !== -1 });\r\n }\r\n\r\n columnsToSearch.forEach(header => {\r\n if (header.DataSourceValue.toLowerCase() === dataSource || header.Title.toLowerCase() == dataSource) {\r\n foundColumn = header;\r\n }\r\n });\r\n\r\n if (!foundColumn) {\r\n console.error(\"Couldnt find column\", dataSource, dataSourceType);\r\n }\r\n\r\n return copy(foundColumn);\r\n }\r\n\r\n getRandomNumber(from: number, to: number): number {\r\n //return Math.floor(Math.random() * (max + 1));\r\n return Math.floor(Math.random() * (to - from + 1) + from);\r\n }\r\n\r\n filtersToDefinition(filterOptions: IFilterOptions, definition: IDataDefinition) {\r\n this.dynamicReportService.filtersToDefinition(filterOptions, definition);\r\n }\r\n\r\n populateDataDefinition(dataDefinition: IDataDefinition): angular.IPromise {\r\n // Set the correct measurements, i.e. miles, gallons etc\r\n dataDefinition.DistanceMeasurement = this.userPrefs.DistanceMeasurement.Value;\r\n dataDefinition.VolumeMeasurement = this.userPrefs.VolumeMeasurement.Value;\r\n dataDefinition.TemperatureMeasurement = this.userPrefs.TemperatureMeasurement.Value;\r\n\r\n this.dynamicReportService.formatParametersToUTCTimezone(dataDefinition.Parameters)\r\n\r\n return this.$http(\r\n {\r\n method: \"POST\",\r\n url: `/api/analytical/populate`,\r\n data: dataDefinition,\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n var report = result.data;\r\n\r\n this.dynamicReportService.formatParametersToLocalTimezone(report.Parameters)\r\n // Do timing validation\r\n this.checkAndLogReportTimings(report);\r\n\r\n\r\n\r\n return report;\r\n });\r\n }\r\n\r\n poolRequests(widgets: IDashboardWidget[], filterOptions: IFilterOptions, loadingUpdateCallback?: (pooledRequest: IPooledRequest) => void): angular.IPromise {\r\n // First step, pool requests into compatible lists\r\n var compatibleWidgetLists = this.createCompatibleWidgetLists(widgets);\r\n\r\n // Combine widget list into single definition\r\n var pooledRequests: IPooledRequest[] = [];\r\n var pooledRequestPromises: angular.IPromise[] = [];\r\n\r\n compatibleWidgetLists.forEach(compatibleWidgets => {\r\n var pooledRequest = this.createPooledRequest(compatibleWidgets, filterOptions);\r\n\r\n pooledRequest.widgets.forEach(w => { w.loading = true; });\r\n loadingUpdateCallback && loadingUpdateCallback(pooledRequest);\r\n\r\n pooledRequest.promise.finally(() => {\r\n pooledRequest.completed = true;\r\n\r\n pooledRequest.widgets.forEach(w => { w.loading = false; });\r\n loadingUpdateCallback && loadingUpdateCallback(pooledRequest);\r\n });\r\n\r\n pooledRequests.push(pooledRequest);\r\n pooledRequestPromises.push(pooledRequest.promise);\r\n });\r\n\r\n return this.$q.all(pooledRequestPromises).then(() => { });\r\n }\r\n\r\n getDashboards(): angular.IPromise {\r\n\r\n return this\r\n .$http({\r\n url: `/api/dashboard`,\r\n method: \"GET\"\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n var dashboards = response.data;\r\n\r\n dashboards.forEach(d => {\r\n d.url = d.Title.replace(\" \", \"-\");\r\n\r\n d.Widgets = JSON.parse(d.WidgetsJson) as IDashboardWidget[];\r\n });\r\n\r\n return dashboards;\r\n });\r\n }\r\n\r\n // ---\r\n\r\n private createPooledRequest(compatibleWidgets: IDashboardWidget[], filterOptions: IFilterOptions): IPooledRequest {\r\n var pooledRequest: IPooledRequest = {\r\n id: this.getRandomNumber(0, 1000),\r\n widgets: compatibleWidgets,\r\n combinedDefinition: this.combineDefinitions(compatibleWidgets)\r\n };\r\n\r\n // Note that this will always overwrite parameters, worth beearing in mind\r\n pooledRequest.combinedDefinition.Parameters = this.filterOptionsService.createReportParameters(filterOptions);\r\n\r\n pooledRequest.combinedDefinition.Parameters.CustomParameters = [\r\n {\r\n ParameterType: ReportParameterType.InclusiveGroupFiltering,\r\n Active: true,\r\n Value: true\r\n },\r\n {\r\n ParameterType: ReportParameterType.ExcludeGpsJourneys,\r\n Active: true,\r\n Value: true\r\n }\r\n ];\r\n\r\n compatibleWidgets.forEach(widget => {\r\n widget.DataWidgetParameters?.CustomParameters?.forEach(cp => {\r\n pooledRequest.combinedDefinition.Parameters.CustomParameters.push(cp);\r\n });\r\n });\r\n\r\n //console.log(\"pooledRequest.combinedDefinition\", pooledRequest.combinedDefinition);\r\n\r\n pooledRequest.promise = this.populateDataDefinition(pooledRequest.combinedDefinition).then(dataDefinition => {\r\n pooledRequest.responseDataDefinition = dataDefinition;\r\n this.splitDefinitions(pooledRequest);\r\n });\r\n\r\n return pooledRequest;\r\n }\r\n\r\n private combineDefinitions(compatibleWidgets: IDashboardWidget[]) {\r\n var definition = copy(compatibleWidgets[0].dataDefinition) as IDataDefinition;\r\n\r\n definition.TableDefinition.Rows = [];\r\n definition.TableDefinition.TotalsRow = null;\r\n definition.TableDefinition.SummarySections = [];\r\n\r\n compatibleWidgets.forEach((widget, i) => {\r\n if (i == 0) {\r\n return;\r\n }\r\n\r\n definition.TableDefinition.Headers = [\r\n ...definition.TableDefinition.Headers,\r\n ...copy(widget.dataDefinition.TableDefinition.Headers)\r\n ];\r\n });\r\n\r\n return definition;\r\n }\r\n\r\n private splitDefinitions(pooledRequest: IPooledRequest) {\r\n var currentHeaderIndex = 1;\r\n\r\n pooledRequest.widgets.forEach(widget => {\r\n const headerLengthEnd = currentHeaderIndex + widget.dataDefinition.TableDefinition.Headers.length;\r\n\r\n widget.dataDefinition.TableDefinition.Headers.unshift(pooledRequest.responseDataDefinition.TableDefinition.Headers[0])\r\n\r\n widget.dataDefinition.TableDefinition.Rows = copy(pooledRequest.responseDataDefinition.TableDefinition.Rows);\r\n widget.dataDefinition.TableDefinition.TotalsRow = copy(pooledRequest.responseDataDefinition.TableDefinition.TotalsRow);\r\n\r\n widget.dataDefinition.TableDefinition.Rows.forEach(row => {\r\n row.Cells = [row.Cells[0], ...row.Cells.slice(currentHeaderIndex, headerLengthEnd)];\r\n });\r\n\r\n // Once rows are created and copied, attempt to sort based on the column type\r\n this.sortDefinitionRows(widget);\r\n\r\n if (widget.dataDefinition.TableDefinition.TotalsRow) {\r\n const row = widget.dataDefinition.TableDefinition.TotalsRow;\r\n row.Cells = row.Cells = [/*row.Cells[0],*/ ...row.Cells.slice(currentHeaderIndex, headerLengthEnd)];\r\n }\r\n\r\n currentHeaderIndex = headerLengthEnd;\r\n });\r\n }\r\n\r\n private sortDefinitionRows(widget: IDashboardWidget) {\r\n const params = widget.DataWidgetParameters;\r\n // We had + 1 as the return data set has the row title in position 0\r\n let sortHeaderIndex = 0;\r\n let sortType = ColumnDataType.Date;\r\n const sortDirection = params.DataSourceSortDirection || SortDirection.Ascending;\r\n\r\n if (params.DataSourceSortIndex !== undefined) {\r\n sortHeaderIndex = params.DataSourceSortIndex;\r\n const sortHeader = widget.dataDefinition.TableDefinition.Headers[sortHeaderIndex];\r\n sortType = sortHeader.ColumnDefinition.Type;\r\n\r\n //sortHeader.Sorted = true;\r\n //sortHeader.SortAscending = sortDirection == SortDirection.Ascending;\r\n\r\n // We add one here, as our row cells have the row title at the first position\r\n //sortHeaderIndex++;\r\n }\r\n\r\n //this.sortDefinitionRowsAsDate(widget.dataDefinition.TableDefinition.Rows, sortHeaderIndex, sortDirection);\r\n\r\n switch (sortType) {\r\n case ColumnDataType.Double:\r\n case ColumnDataType.Int:\r\n case ColumnDataType.Score:\r\n this.sortDefinitionRowsAsNumber(widget.dataDefinition.TableDefinition.Rows, sortHeaderIndex, sortDirection);\r\n break;\r\n\r\n case ColumnDataType.Date:\r\n this.sortDefinitionRowsAsDate(widget.dataDefinition.TableDefinition.Rows, sortHeaderIndex, sortDirection);\r\n break;\r\n\r\n default:\r\n console.warn(\"Unable to sort \", ColumnDataType[sortType]);\r\n }\r\n }\r\n\r\n private sortDefinitionRowsAsNumber(rows: IReportRow[], sortIndex: number, sortDirection: SortDirection) {\r\n rows.sort((r1, r2) => {\r\n var r1num = parseFloat(r1.Cells[sortIndex].Data);\r\n var r2num = parseFloat(r2.Cells[sortIndex].Data);\r\n\r\n return sortDirection == SortDirection.Ascending\r\n ? r1num - r2num\r\n : r2num - r1num;\r\n });\r\n }\r\n\r\n private sortDefinitionRowsAsDate(rows: IReportRow[], sortIndex: number, sortDirection: SortDirection) {\r\n rows.sort((r1, r2) => {\r\n return this.veriDate.sort(r1.Cells[sortIndex].Data, r2.Cells[sortIndex].Data, sortDirection);\r\n });\r\n }\r\n\r\n private createCompatibleWidgetLists(widgets: IDashboardWidget[]): IDashboardWidget[][] {\r\n var compatibleWidgetLists: IDashboardWidget[][] = [];\r\n\r\n widgets.forEach(widget => {\r\n this.dataSourceToWidgetDataDefinition(widget);\r\n\r\n // Check in all lists to find compatible widgets, \r\n var addedToList = false;\r\n compatibleWidgetLists.forEach(compatibleWidgetList => {\r\n if (addedToList) {\r\n return;\r\n }\r\n\r\n var compatible = true;\r\n compatibleWidgetList.forEach(compatibleWidget => {\r\n compatible = compatible && this.definitionsAreCompatible(widget, compatibleWidget);\r\n });\r\n\r\n if (compatible) {\r\n addedToList = true;\r\n compatibleWidgetList.push(widget);\r\n }\r\n });\r\n\r\n // if we dont find one, add a new list\r\n if (!addedToList) {\r\n compatibleWidgetLists.push([widget]);\r\n }\r\n });\r\n\r\n return compatibleWidgetLists;\r\n }\r\n\r\n private definitionsAreCompatible(newWidget: IDashboardWidget, existingWidget: IDashboardWidget): boolean {\r\n const newDefinition = newWidget.dataDefinition;\r\n const existingDefinition = existingWidget.dataDefinition;\r\n\r\n if (newDefinition.RowDataSource != existingDefinition.RowDataSource) {\r\n return false;\r\n }\r\n\r\n if (newDefinition.SubRowDataSource != existingDefinition.SubRowDataSource) {\r\n return false;\r\n }\r\n\r\n if (!angular.equals(newDefinition.Parameters, existingDefinition.Parameters)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private checkAndLogReportTimings(report: IDataDefinition) {\r\n this.checkAndLogTimings(report.DataCollectionTime, \"DataCollectionTime\", report);\r\n this.checkAndLogTimings(report.PopulateRowTime, \"PopulateRowTime\", report);\r\n this.checkAndLogTimings(report.RowCreationTime, \"RowCreationTime\", report);\r\n }\r\n\r\n private checkAndLogTimings(timespan: string, title: string, report: IDataDefinition) {\r\n var seconds = this.veriDate.parseTimeSpan(timespan);\r\n\r\n if (seconds > 5) {\r\n console.warn(`${title} time exceeded`, seconds, report);\r\n }\r\n }\r\n\r\n private processDataDefinitionRow(row: IReportRow, headers: IColumnHeader[], dataSeries: IHighchartsDataSeries[]) {\r\n if (!row || !row.HasData) {\r\n return;\r\n }\r\n\r\n var dateMoment = this.veriDate.createMoment(row.Cells[0].Data);\r\n\r\n row.Cells.forEach((cell, index) => {\r\n // Adjust - first cell is date cell\r\n index = index - 1;\r\n if (index < 0) {\r\n return;\r\n }\r\n\r\n var date: any;\r\n\r\n if (false /*||widget.params.chartType === \"pie\"*/) {\r\n date = this.veriDate.formatDate(dateMoment, \"date\");\r\n }\r\n else {\r\n date = dateMoment.valueOf();\r\n }\r\n\r\n const header = headers[index];\r\n const value = this.convertDataValue(cell.Data, header);\r\n\r\n dataSeries[index].data.push([date, value]);\r\n });\r\n }\r\n}\r\n","import { Component } from \"@angular/core\";\r\nimport { DashboardServiceV2 } from \"../../dashboardV2/dashboard.service\";\r\nimport { ReportTableRowDataSource } from \"../../reports/enums/ReportTableRowDataSource\";\r\nimport { IDataDefinition } from \"../../reports/models/IReportDefinition\";\r\nimport \"./driver-behaviour-comparison.component.scss\"; import * as moment from \"moment\";\r\nimport { IColumnHeader } from \"../../reports/models/IColumnHeader\";\r\nimport { IReportRow } from \"../../reports/models/IReportRow\";\r\n\r\n\r\nexport interface IDriverScore {\r\n title: string,\r\n score: number;\r\n\r\n lowerRagBound: number;\r\n upperRagBound: number;\r\n}\r\n\r\nexport interface IDriverComparison extends IDriverScore {\r\n subscores: IDriverScore[];\r\n\r\n otherMetrics: { title: string, value: string }[];\r\n}\r\n\r\n@Component({\r\n selector: \"driver-behaviour-comparison\",\r\n template: require(\"./driver-behaviour-comparison.component.html\")\r\n})\r\nexport class DriverBehaviourComparisonComponent {\r\n drivers: IDriverComparison[] = [];\r\n\r\n constructor(private dashboardService: DashboardServiceV2) {\r\n this.addDriver();\r\n }\r\n\r\n addDriver() {\r\n \r\n\r\n this.createReport().then(definition => {\r\n var top3 = definition.TableDefinition.Rows.slice(0, 3);\r\n top3.forEach(driver => {\r\n\r\n });\r\n });\r\n }\r\n\r\n remove(driver: IDriverComparison) {\r\n this.drivers = this.drivers.filter(d => d != driver);\r\n }\r\n\r\n // ---\r\n\r\n private createRandomScore() {\r\n var min = 1;\r\n var max = 100;\r\n return Math.floor(Math.random() * (max - min + 1) + min);\r\n }\r\n\r\n loading = false;\r\n private createReport(): angular.IPromise {\r\n var dataDefinition: IDataDefinition = {\r\n TableDefinition: { Headers: [] },\r\n RowDataSource: ReportTableRowDataSource.Driver,\r\n Parameters: {\r\n \r\n Start: moment().startOf(\"day\").add(-1, \"d\").toDate(),\r\n End: moment().endOf(\"day\").toDate()\r\n }\r\n };\r\n\r\n this.loading = true;\r\n return this.dashboardService.getColumnHeaders()\r\n .then(headers => {\r\n\r\n\r\n const journeyHeaders = headers.filter(h => h.ReportType == \"Journey\");\r\n journeyHeaders.forEach(j => console.log(j));\r\n\r\n const totalScoreColumn = this.dashboardService.findColumn(\"Total Score\", headers, \"Journey\");\r\n const drivingFuelColumn = this.dashboardService.findColumn(\"Driving Scores\", headers, \"Journey\");\r\n\r\n dataDefinition.TableDefinition.Headers.push(totalScoreColumn);\r\n dataDefinition.TableDefinition.Headers.push(drivingFuelColumn);\r\n\r\n const journeyCount = this.dashboardService.findColumn(\"Number Of Journeys\", headers, \"Journey\");\r\n dataDefinition.TableDefinition.Headers.push(journeyCount);\r\n\r\n const maxSpeed = this.dashboardService.findColumn(\"Max Speed\", headers, \"Journey\");\r\n dataDefinition.TableDefinition.Headers.push(maxSpeed);\r\n\r\n const idleColumn = this.dashboardService.findColumn(\"Duration Idle\", headers, \"Journey\");\r\n dataDefinition.TableDefinition.Headers.push(idleColumn);\r\n\r\n const durationInJourneyColumn = this.dashboardService.findColumn(\"Duration In Journey\", headers, \"Journey\");\r\n dataDefinition.TableDefinition.Headers.push(durationInJourneyColumn);\r\n\r\n const distanceColumn = this.dashboardService.findColumn(\"Distance\", headers, \"Journey\");\r\n dataDefinition.TableDefinition.Headers.push(distanceColumn);\r\n\r\n const fuelUsedColumn = this.dashboardService.findColumn(\"Fuel Used\", headers, \"Journey\");\r\n dataDefinition.TableDefinition.Headers.push(fuelUsedColumn);\r\n\r\n\r\n\r\n return this.dashboardService.populateDataDefinition(dataDefinition).then(dataDefinition => {\r\n\r\n\r\n this.mapDriverReportToScoreDefinition(dataDefinition);\r\n\r\n return dataDefinition;\r\n });\r\n })\r\n .finally(() => {\r\n this.loading = false;\r\n });\r\n }\r\n\r\n private mapDriverReportToScoreDefinition(dataDefinition: IDataDefinition) {\r\n\r\n var driver = dataDefinition.TableDefinition.Rows[this.drivers.length + 1];\r\n \r\n\r\n this.drivers.push(this.createDriverScoreDefinition(driver, dataDefinition.TableDefinition.Headers));\r\n }\r\n\r\n private createDriverScoreDefinition(driverRow: IReportRow, headers: IColumnHeader[],): IDriverComparison {\r\n const subscores: IDriverScore[] = [];\r\n const otherMetrics: { title: string, value: string }[] = [];\r\n\r\n let lastScoreIndex = 0;\r\n for (var i = 2; i < headers.length; i++) {\r\n const cell = driverRow.Cells[i];\r\n\r\n if (!cell.MetaData || headers[i].Title.indexOf(\"Score\") < 0) {\r\n continue;\r\n }\r\n\r\n lastScoreIndex = i;\r\n\r\n subscores.push({\r\n title: headers[i].Title.replace(\" Score\", \"\"),\r\n score: cell.Data,\r\n\r\n lowerRagBound: cell.MetaData.LowerRagBound,\r\n upperRagBound: cell.MetaData.UpperRagBound\r\n })\r\n }\r\n\r\n for (i = lastScoreIndex + 1; i < headers.length; i++) {\r\n const cell = driverRow.Cells[i];\r\n\r\n otherMetrics.push({\r\n title: headers[i].Title,\r\n value: cell.Data\r\n });\r\n }\r\n\r\n\r\n\r\n return {\r\n title: driverRow.Cells[0].Data,\r\n score: driverRow.Cells[1].Data,\r\n lowerRagBound: driverRow.Cells[1].MetaData.LowerRagBound,\r\n upperRagBound: driverRow.Cells[1].MetaData.UpperRagBound,\r\n\r\n otherMetrics: otherMetrics,\r\n\r\n subscores: subscores\r\n };\r\n }\r\n}\r\n","import { AfterViewInit, Component, ElementRef, Input, OnChanges, OnInit } from \"@angular/core\";\r\nimport { IPlannedRouteVisit } from \"@tms/_models/IPlannedRouteVisit\";\r\nimport { IPlannedRouteDetail, PlannedRouteService, selectMany } from \"@tms/_services/planned-route.service\";\r\nimport { VisitOnTimeStatus } from \"../../_enums/VisitOnTimeStatus\";\r\nimport \"./route-performance-bar.component.scss\";\r\n\r\nexport interface IBarSegment {\r\n count: number;\r\n percentage: number;\r\n label: string;\r\n className: string;\r\n\r\n showText: boolean;\r\n showNumber: boolean;\r\n showPercentage: boolean;\r\n\r\n tooltip?: string;\r\n\r\n\r\n}\r\n\r\n@Component({\r\n selector: \"route-performance-bar\",\r\n template: require(\"./route-performance-bar.component.html\")\r\n})\r\nexport class RoutePerformanceBarComponent implements OnChanges, OnInit, AfterViewInit {\r\n\r\n @Input() route: IPlannedRouteDetail;\r\n @Input() routes: IPlannedRouteDetail[];\r\n\r\n // ---\r\n\r\n segments: IBarSegment[] = [];\r\n\r\n\r\n\r\n minWidthNumber = 15;\r\n minWidthText = 30;\r\n\r\n constructor(private readonly host: ElementRef, private readonly plannedRouteService: PlannedRouteService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.setupProgressBar();\r\n }\r\n\r\n ngOnChanges() {\r\n this.setupProgressBar();\r\n }\r\n\r\n setupProgressBar() {\r\n if (!this.route?.PlannedVisits && !this.routes) {\r\n return;\r\n }\r\n\r\n const routeVisits = this.route\r\n ? this.route.PlannedVisits\r\n : selectMany(this.routes, r => r.PlannedVisits);\r\n\r\n this.calculatePercentages(routeVisits);\r\n }\r\n\r\n ngAfterViewInit() {\r\n const maxComponentWidth = (this.host.nativeElement as HTMLElement).clientWidth;\r\n\r\n this.minWidthNumber = 50 * 100 / maxComponentWidth;\r\n this.minWidthText = 100 * 100 / maxComponentWidth;\r\n }\r\n\r\n // ---\r\n\r\n private calculatePercentages(visits: IPlannedRouteVisit[]) {\r\n\r\n const s1 = this.createSegment(visits, VisitOnTimeStatus.Early, \"early\");\r\n const s2 = this.createSegment(visits, VisitOnTimeStatus.OnTime, \"on time\");\r\n const s3 = this.createSegment(visits, VisitOnTimeStatus.Late, \"late\");\r\n const s4 = this.createSegment(visits, VisitOnTimeStatus.Missed, \"missed\");\r\n\r\n this.segments = [s1, s2, s3, s4];\r\n }\r\n\r\n private createSegment(visits: IPlannedRouteVisit[], status: VisitOnTimeStatus, label: string): IBarSegment {\r\n // This is not efficient... May need to reconsider on large pages\r\n const count = visits.filter(v => this.plannedRouteService.getArrivalVisitOnTimeStatus(v) == status).length;\r\n const totalVisitCount = visits.filter(v => this.plannedRouteService.getArrivalVisitOnTimeStatus(v) != null).length;\r\n\r\n const percentage = count * 100 / totalVisitCount;\r\n\r\n const segment: IBarSegment = {\r\n count: count,\r\n label: label,\r\n className: VisitOnTimeStatus[status].toLowerCase(),\r\n percentage: percentage,\r\n showNumber: percentage > this.minWidthNumber,\r\n showText: percentage > this.minWidthText,\r\n showPercentage: true\r\n };\r\n\r\n if (!segment.showNumber || !segment.showText) {\r\n const percentageString = (segment.percentage / 100).toLocaleString(undefined, { style: 'percent', maximumFractionDigits: 0 });\r\n segment.tooltip = `${percentageString} ${segment.label}`;\r\n }\r\n\r\n return segment;\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { Subject, Observable, of } from \"rxjs\";\r\nimport {\r\n IPlannedRouteDetail,\r\n PlannedRouteService,\r\n} from \"./planned-route.service\";\r\nimport { IPlannedRouteOptions } from \"../_models/IPlannedRouteOptions\";\r\nimport { HttpClient } from \"@angular/common/http\";\r\nimport { tap } from \"rxjs/operators\";\r\nimport { UnplannedStopService } from \"./unplanned-stop.service\";\r\nimport { VehicleService } from \"@app/services/vehicle.service\";\r\nimport { DriverService } from \"@app/services/driver.service\";\r\nimport { DriverAssignmentService } from \"@app/services/driverAssignment.service\";\r\nimport { GeofenceService } from \"@app/services/geofence.service\";\r\nimport { VeriDate } from \"@app/services/veriDate.service\";\r\nimport { IGeofence } from \"@app/interfaces/IGeofences\";\r\nimport { RouteStatus } from \"../_enums/RouteStatus\";\r\n\r\n@Injectable({\r\n providedIn: \"root\",\r\n})\r\nexport class PlannedRouteService2 {\r\n plannedRoutesSubject = new Subject();\r\n private plannedRoutes: IPlannedRouteDetail[];\r\n\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly unplannedStopService: UnplannedStopService,\r\n private readonly plannedRouteService: PlannedRouteService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly driverService: DriverService,\r\n private readonly driverAssignmentService: DriverAssignmentService,\r\n private readonly geofenceService: GeofenceService,\r\n private readonly veriDate: VeriDate\r\n ) { }\r\n\r\n requestPlannedRoutes(start: Date, end: Date, options: IPlannedRouteOptions): Observable {\r\n return this.http\r\n .get(\r\n `/api/tms/plannedroutes?start=${start.toISOString()}&end=${end.toISOString()}`\r\n )\r\n .pipe(\r\n tap(async (routes) => {\r\n this.plannedRoutes = await this.getRouteDependencies(start, end, routes, options);\r\n\r\n this.plannedRoutesSubject.next(this.plannedRoutes);\r\n\r\n return this.plannedRoutes;\r\n })\r\n );\r\n }\r\n\r\n async getRouteDependencies(start: Date, end: Date, plannedRoutes: IPlannedRouteDetail[], options: IPlannedRouteOptions): Promise {\r\n let unplannedStops = options.getUnplannedStops ? await this.unplannedStopService.getUnplannedStopsForRoutes(this.veriDate.createMoment(start), this.veriDate.createMoment(end), true) : [];\r\n let vehicles = options.mapVehicles ? await this.vehicleService.getVehicles() : [];\r\n let drivers = options.mapDrivers ? await this.driverService.getDrivers() : [];\r\n let assignments = options.mapVehicles && options.mapDrivers ? await this.driverAssignmentService.getDriverAssignments(true) : [];\r\n let geofences = options.mapGeofences ? await this.geofenceService.getGeofences() : [];\r\n\r\n const updatedPlannedRoutes: IPlannedRouteDetail[] = [];\r\n plannedRoutes.forEach(async (route, index) => {\r\n if (options.startedRoutesOnly) {\r\n if (route.Status === RouteStatus.Planned || route.Status === RouteStatus.Started) {\r\n return;\r\n }\r\n }\r\n\r\n const updatedRoute: IPlannedRouteDetail = route;\r\n updatedPlannedRoutes.push(updatedRoute);\r\n\r\n if (!options.getCancelledVisits) {\r\n this.plannedRouteService.filterOutCancelledVisits(route);\r\n }\r\n\r\n if (options.groupPlannedAndUnplannedVisits) {\r\n this.plannedRouteService.groupPlannedAndUnplannedVisits(updatedRoute, unplannedStops, options);\r\n }\r\n\r\n if (options.mapVehicles || options.mapDrivers) {\r\n this.driverAssignmentService.mapDriversToVehicles(drivers, assignments, vehicles);\r\n this.plannedRouteService.assignVehicleToRoute(updatedRoute, vehicles);\r\n this.plannedRouteService.assignDriverToRoute(updatedRoute, drivers);\r\n }\r\n\r\n this.formatRouteForDisplay(updatedRoute, geofences, options);\r\n\r\n if (options.formatPlannedVisitsForDisplay) {\r\n this.plannedRouteService.formatPlannedVisitsForDisplay(route, geofences);\r\n }\r\n\r\n if (options.parseRouteRules) {\r\n this.parseRouteRules(route);\r\n }\r\n\r\n if (options.groupPlannedAndUnplannedVisits) {\r\n this.plannedRouteService.groupPlannedAndUnplannedVisits(updatedRoute, unplannedStops, options);\r\n }\r\n });\r\n\r\n if (options.filterRoutes) {\r\n this.plannedRoutes = this.plannedRouteService.filterRoutes(this.plannedRoutes, options);\r\n }\r\n\r\n return updatedPlannedRoutes;\r\n }\r\n\r\n formatRouteForDisplay(route: IPlannedRouteDetail, geofences: IGeofence[], options: IPlannedRouteOptions): void {\r\n route.totalPlannedDistanceKm = 0;\r\n this.plannedRouteService.setFirstAndLastVisit(route);\r\n\r\n if (options.editableStatus) {\r\n this.plannedRouteService.setEditableStatus(route);\r\n }\r\n\r\n if (options.deletableStatus) {\r\n this.plannedRouteService.setDeletableStatus(route);\r\n }\r\n\r\n if (options.mapGeofences) {\r\n this.plannedRouteService.mapGeofenceToVisit(route.firstVisit, geofences);\r\n this.plannedRouteService.mapGeofenceToVisit(route.lastVisit, geofences);\r\n }\r\n\r\n if (options.displayLabelForPlannedVisit) {\r\n this.plannedRouteService.setDisplayLabelForPlannedVisit(route.lastVisit);\r\n this.plannedRouteService.setDisplayLabelForPlannedVisit(route.firstVisit);\r\n }\r\n\r\n if (options.routeDisplayName) {\r\n this.plannedRouteService.setRouteDisplayName(route);\r\n }\r\n\r\n if (options.routeDuration) {\r\n this.plannedRouteService.setRouteDisplayDuration(route);\r\n }\r\n\r\n if (options.routeDisplayPlannedDistance) {\r\n this.plannedRouteService.setRouteDisplayPlannedDistance(route);\r\n }\r\n\r\n if (options.routeDisplayStatus) {\r\n this.plannedRouteService.setRouteDisplayStatus(route);\r\n }\r\n\r\n if (options.totalPlannedVisits) {\r\n this.plannedRouteService.setTotalPlannedVisits(route);\r\n }\r\n }\r\n\r\n private parseRouteRules(route: IPlannedRouteDetail): void {\r\n if (!route.TmsRouteRulesJson) {\r\n return;\r\n }\r\n\r\n route.TmsRouteRules = JSON.parse(route.TmsRouteRulesJson);\r\n }\r\n\r\n updatePlannedRouteCache(plannedRoute: IPlannedRouteDetail): void {\r\n if (!this.plannedRoutes?.length) {\r\n return;\r\n }\r\n\r\n const routeIndexToUpdate = this.plannedRoutes.findIndex(\r\n (route) => route.Id == plannedRoute.Id\r\n );\r\n\r\n if(routeIndexToUpdate !== -1){\r\n this.plannedRoutes[routeIndexToUpdate] = plannedRoute;\r\n this.plannedRoutesSubject.next(this.plannedRoutes);\r\n }\r\n }\r\n}\r\n","export enum ImportSource {\r\n Geofence = 0,\r\n RouteTemplate = 1\r\n}\r\n","module.exports = \"
{{'csvImporter.startOfWeekDate' | translate}}
help_outline {{$ctrl.helpInfoText}}
{{'csvImporter.selectStartDate' | translate}}
{{'csvImporter.forExample' | translate}}

{{headerCol}}
{{rowCol}}

view_comfy
0\\\" flex=none> {{'csvImporter.invalidRoutes' | translate : $ctrl.invalidRouteCount}}
{{'csvImporter.successfulRoutes' | translate : $ctrl.successCount}}
{{'csvImporter.failedToImport' | translate : $ctrl.failedCount}}
0 && $ctrl.validationErrors.length < 1 && !$ctrl.loading\\\" flex headers=$ctrl.tableHeaders rows=$ctrl.tableRows search-placeholder=\\\"{{'csvImporter.routes' | translate}}\\\" show-search=true sort-column=0>
{{'csvImporter.importColumn' | translate}}
{{'csvImporter.dataType' | translate}}
{{'csvImporter.isRequired' | translate}}
{{'csvImporter.isMapped' | translate}}
{{'csvImporter.mappingField' | translate}}
{{columnOption.displayName}}
{{'csvImporter.' + $ctrl.getFieldType(columnOption.fieldType).charAt(0).toLowerCase() + $ctrl.getFieldType(columnOption.fieldType).slice(1) | translate}}
{{ importOption }}

{{'csvImporter.dataImportError' | translate}}

{{'csvImporter.row' | translate}}
{{'csvImporter.column' | translate}}
{{'csvImporter.fieldName' | translate}}
{{'csvImporter.fieldValue' | translate}}
{{'csvImporter.validationError' | translate}}
{{row.rowNumber}}
{{row.colNumber}}
{{row.fieldName}}
{{row.fieldValue}}
{{row.text}}
{{'Common.Cancel' | translate}} {{'Common.Back' | translate}}
{{'csvImporter.importFile' | translate : $ctrl.importFile.name}}
0 || $ctrl.loading\\\" ng-disabled=$ctrl.submitted ng-click=$ctrl.submit()>{{'Common.Submit' | translate}}
0 || $ctrl.loading\\\" class=m-r-80>
\";","\r\nimport { IJourney } from \"@interfaces/IJourney\";\r\nimport { IPlot, IPlotEvent } from \"@interfaces/IPlot\";\r\nimport { EventType } from \"@interfaces/ISensorData\";\r\nimport { IVehicleDriverMapping } from \"@interfaces/IVehicleDriverMapping\";\r\nimport { IVehicleInput } from \"@interfaces/IVehicleInput\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { CameraDisplayService } from \"@videos/cameraDisplay.service\";\r\nimport * as moment from \"moment\";\r\nimport { AccelerometerInfoType } from \"../enum/AccelerometerInfoType\";\r\nimport { ReasonCode } from \"../enum/ReasonCode\";\r\nimport { VideoStatus } from \"../main/components/videos/enums/VideoStatus\";\r\nimport { IVideoEntry } from \"../main/components/videos/models/IVideoEntry\";\r\nimport { DriverService } from \"./driver.service\";\r\nimport { GoogleMarkerService } from \"./googleMarker.service\";\r\nimport { PlotService } from \"./plot.service\";\r\n\r\nexport class PlotEventService {\r\n\r\n static $inject = [\"googleMarkerService\", \"driverService\", \"cameraDisplayService\", \"plotService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly googleMarkerService: GoogleMarkerService,\r\n private readonly driverService: DriverService,\r\n private readonly cameraDisplayService: CameraDisplayService,\r\n private readonly plotService: PlotService,\r\n private readonly translationService: TranslationService\r\n ) {\r\n }\r\n\r\n createJourneyStartStopEvent(plot: IPlot, label: \"Start\" | \"Stop\"): IPlotEvent {\r\n var anchorPosition = this.googleMarkerService.getEventMarkerAnchorPosition();\r\n return this.googleMarkerService.createEventMarker(\r\n plot,\r\n {\r\n label: this.translationService.t(`plotEventService.${label.toLowerCase()}`),// this will be start or stop, convert it with translation service\r\n markerClass: label == \"Start\" ? \"marker-event-start\" : \"marker-event-end\",\r\n subIcon: label == \"Start\" ? \"play_arrow\" : \"stop\",\r\n showLabel: true,\r\n anchorPosition: anchorPosition\r\n });\r\n }\r\n\r\n //createJourneyStartEvent(plot: IPlot, journey: IJourney): IPlotEvent {\r\n // var marker = this.veriMarkerService.createEventMarker(plot, \"Journey Start\", \"marker-event-end\", \"play_arrow\", true);\r\n // marker.journey = journey;\r\n // return marker;\r\n //}\r\n\r\n //createJourneyEndEvent(plot: IPlot, journey: IJourney): IPlotEvent {\r\n // var marker = this.veriMarkerService.createEventMarker(plot, \"Journey End\", \"marker-event-end\", \"stop\", true);\r\n // marker.journey = journey;\r\n // return marker;\r\n //}\r\n\r\n hasCANPTOEvents(plots: IPlot[]) {\r\n for (let i = 0; i < plots.length; i++) {\r\n const plot = plots[i];\r\n\r\n if (plot.Reason === ReasonCode.Fms && plot.SensorData) {\r\n const eventType = plot.SensorData.EventType;\r\n\r\n if (eventType === EventType.Pto) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n setJourneyEvents(events: IPlotEvent[], journey: IJourney): void {\r\n\r\n if (!events || !journey) {\r\n return;\r\n }\r\n\r\n journey.events = [];\r\n\r\n const startDateMoment = moment(journey.StartUtc);\r\n const endDateMoment = moment(journey.EndUtc);\r\n\r\n for (let i = 0; i < events.length; i++) {\r\n const event = events[i];\r\n\r\n const pointInRange = event.plot.UtcMoment && event.plot.UtcMoment.isBetween(startDateMoment, endDateMoment, null, \"[]\");\r\n\r\n if (pointInRange) {\r\n event.journey = journey;\r\n if (event.plot && !event.plot.color || !event.lineColor) {\r\n event.plot.color = journey.lineColor;\r\n event.lineColor = journey.lineColor;\r\n }\r\n\r\n event.options = event.buildOptions();\r\n\r\n journey.events.push(event);\r\n }\r\n }\r\n }\r\n\r\n parsePlotEvents(plots: IPlot[], driverAssignments: IVehicleDriverMapping[], vehicleInputs: IVehicleInput[], videos: IVideoEntry[], includeTelematicsPTO: boolean, startDate?: moment.Moment, endDate?: moment.Moment): IPlotEvent[] {\r\n\r\n const events: IPlotEvent[] = [];\r\n\r\n const journeyStartPlot = plots[0];\r\n const journeyEndPlot = plots[plots.length - 1];\r\n\r\n var adjustedStartDate = journeyStartPlot ? journeyStartPlot.UtcMoment : startDate || moment().startOf(\"day\");\r\n var adjustedEndDate = journeyEndPlot ? journeyEndPlot.UtcMoment : endDate || moment().endOf(\"day\");\r\n\r\n videos.forEach(videoEntry => {\r\n if (videoEntry.Status !== VideoStatus.Downloaded && moment().add(-7, \"days\").isAfter(videoEntry.EventTimeUtc)) {\r\n return true;\r\n }\r\n\r\n if (adjustedStartDate.isSameOrBefore(videoEntry.EventTimeUtc) && adjustedEndDate.isSameOrAfter(videoEntry.EventTimeUtc)) {\r\n if (videoEntry.Latitude === 0 && videoEntry.Longitude === 0) {\r\n const matchingPlot = this.plotService.findMatchingPlot(moment(videoEntry.VideoStartTime), moment(videoEntry.VideoEndTime), plots);\r\n\r\n if (matchingPlot) {\r\n videoEntry.Latitude = matchingPlot.Latitude;\r\n videoEntry.Longitude = matchingPlot.Longitude;\r\n videoEntry.PlaceName = matchingPlot.LocationInformation?.LocationDescription;\r\n }\r\n }\r\n\r\n const plotEvent = this.cameraDisplayService.createEventFromVideo(videoEntry);\r\n\r\n plotEvent.video = videoEntry;\r\n\r\n events.push(plotEvent);\r\n }\r\n });\r\n\r\n driverAssignments.forEach(assignment => {\r\n\r\n var label = \"\";\r\n var eventTime: moment.Moment;\r\n\r\n var driver = this.driverService.getCachedDriver(assignment.DriverId);\r\n if (driver) {\r\n\r\n // Assignment\r\n if (assignment.StartUtc.isBetween(adjustedStartDate, adjustedEndDate, null, \"[]\")) {\r\n eventTime = assignment.StartUtc;\r\n label = this.translationService.t('plotEventService.driverLogon' , driver.Name);\r\n } else if (assignment.EndUtc.isBetween(adjustedStartDate, adjustedEndDate, null, \"[]\")) {\r\n eventTime = assignment.EndUtc;\r\n label = this.translationService.t('plotEventService.driverLogoff', driver.Name);\r\n }\r\n\r\n if (label) {\r\n // Find nearest plot to the assignment\r\n var nearestPlot = journeyStartPlot;\r\n for (var i = 0; i < plots.length; i++) {\r\n const plot = plots[i];\r\n if (plot.UtcMoment.isSameOrAfter(eventTime)) {\r\n nearestPlot = plot;\r\n break;\r\n }\r\n }\r\n\r\n if (nearestPlot) {\r\n events.push(this.googleMarkerService.createEventMarker(nearestPlot, {\r\n label: label,\r\n markerClass: \"marker-event-driver-changed\",\r\n subIcon: \"person\"\r\n }));\r\n }\r\n\r\n }\r\n }\r\n });\r\n\r\n for (let i = 0; i < plots.length; i++) {\r\n const plot = plots[i];\r\n if (!plot) {\r\n continue;\r\n }\r\n\r\n if (adjustedStartDate && adjustedEndDate && !plot.UtcMoment.isBetween(adjustedStartDate, adjustedEndDate, null, \"[]\")) {\r\n continue;\r\n }\r\n\r\n //console.log(plot.UtcMoment.format(), \"Plot.DriverID\", plot.DriverId);\r\n\r\n //var anchorPosition = this.googleMarkerService.getEventMarkerPosition(plot, journeyStartPlot, journeyEndPlot);\r\n\r\n //if (plot.Reason !== ReasonCode.Fms) {\r\n // this.speedData.push([plot.UtcMoment.valueOf(), this.kphToUserUnitService.convertUnit(plot.Velocity)]);\r\n //}\r\n\r\n if (plot.Reason === ReasonCode.IgnitionOn) {\r\n events.push(this.createJourneyStartStopEvent(plot, \"Start\"));\r\n }\r\n else if (plot.Reason === ReasonCode.IgnitionOff) {\r\n events.push(this.createJourneyStartStopEvent(plot, \"Stop\"));\r\n }\r\n else if (plot.Reason === ReasonCode.FmsEngineOn) {\r\n //this.parseTimedCANEvent(plot);\r\n //events.push(this.veriMarkerService.createEventMarker(\r\n // plot,\r\n // \"Engine On\",\r\n // \"marker-event-pause\",\r\n // \"settings_input_svideo\"));\r\n }\r\n else if (plot.Reason === ReasonCode.FmsEngineOff) {\r\n //events.push(this.veriMarkerService.createEventMarker(\r\n // plot,\r\n // \"Engine Off\",\r\n // \"marker-event-pause\",\r\n // \"settings_input_svideo\"));\r\n }\r\n else if (plot.Reason == ReasonCode.Accelerometer && plot.AccelerometerInfo) {\r\n var eventText = \"\";\r\n\r\n switch (plot.AccelerometerInfo.Direction) {\r\n case AccelerometerInfoType.Acceleration:\r\n eventText = this.translationService.t(\"plotEventService.acceleration\");\r\n break;\r\n\r\n case AccelerometerInfoType.Deceleration:\r\n eventText = this.translationService.t(\"plotEventService.deceleration\");\r\n break;\r\n\r\n case AccelerometerInfoType.Cornering:\r\n eventText = this.translationService.t(\"plotEventService.cornering\");\r\n break;\r\n }\r\n\r\n events.push(this.googleMarkerService.createEventMarker(\r\n plot,\r\n {\r\n label: eventText,\r\n markerClass: \"marker-event-bad-anticipation\",\r\n subIcon: \"local_car_wash\"\r\n }));\r\n }\r\n //else if (plot.Reason === ReasonCode.ThermoKing /*|| plot.Reason === ReasonCode.Reportz*/) {\r\n\r\n // if (plot.Temperatures) {\r\n // plot.Temperatures.forEach(temp => {\r\n // var probePos = temp.Position - 1;\r\n\r\n // if (!this.tempData[probePos]) {\r\n // this.tempData[probePos] = [];\r\n // }\r\n\r\n // this.tempData[probePos].push([plot.UtcMoment.valueOf(), temp.Temperature]);\r\n // });\r\n // }\r\n //}\r\n else if (plot.Reason === ReasonCode.Fms && plot.SensorData) {\r\n //if (plot.CanParams.EventCode) {\r\n //} else {\r\n // this.parseTimedCANEvent(plot, extensionArray);\r\n //}\r\n\r\n if (plot.SensorData.Header === \"K0 03 041\") {\r\n //this.parseTimedCANEvent(plot);\r\n }\r\n else if (plot.SensorData.Header === \"$EVT\") {\r\n const eventType = plot.SensorData.EventType;\r\n\r\n //if (!eventArray[eventType]) {\r\n // eventArray[eventType] = 0;\r\n //}\r\n\r\n //eventArray[eventType]++;\r\n\r\n if (eventType === EventType.OverRpm) { // RPM\r\n //this.events.push(this.createEventMarker(\r\n // plot,\r\n // \"RPMOn\",\r\n // \"marker-event-high-rpm\",\r\n // \"location_on\",\r\n // \"network_check\"));\r\n }\r\n else if (eventType === EventType.OverTorque) { // Torque\r\n //this.events.push(this.createEventMarker(\r\n // plot,\r\n // \"TorqueOn\",\r\n // \"marker-event-high-torque\",\r\n // \"location_on\",\r\n // \"new_releases\"));\r\n }\r\n else if (eventType === EventType.Pto) { // PTO\r\n let plotEvent: IPlotEvent;\r\n\r\n const ptoLabel = (plot.SensorData.EventFlag === 1) ? this.translationService.t(\"plotEventService.ptoOn\") : this.translationService.t(\"plotEventService.ptoOff\");\r\n const ptoClass = (plot.SensorData.EventFlag === 1) ? \"marker-event-pto\" : \"marker-event-pto pto-off\";\r\n\r\n plotEvent = this.googleMarkerService.createEventMarker(\r\n plot,\r\n {\r\n label: ptoLabel,\r\n markerClass: ptoClass,\r\n subIcon: \"build\"\r\n });\r\n\r\n events.push(plotEvent);\r\n }\r\n else if (eventType === EventType.Idling) { // Idling\r\n if (plot.SensorData.EventFlag === 1) {\r\n events.push(this.googleMarkerService.createEventMarker(\r\n plot,\r\n {\r\n label: this.translationService.t(\"plotEventService.idling\"),\r\n markerClass: \"marker-event-idling\",\r\n subIcon: \"pause\"\r\n }));\r\n }\r\n }\r\n //else if (eventType === Verilocation.App.PlotExtensionEventType.HarshBraking && extensionArray[2] !== \"1\") {\r\n //}\r\n else if (eventType === EventType.HarshBraking && plot.SensorData.EventFlag === 1) {\r\n // Harsh brake\r\n const plotEvent = this.googleMarkerService.createEventMarker(\r\n plot,\r\n {\r\n label: this.translationService.t(\"plotEventService.harshBrake\"),\r\n markerClass: \"marker-event-harsh-brake\",\r\n subIcon: \"warning\"\r\n });\r\n\r\n events.push(plotEvent);\r\n }\r\n else if (eventType === EventType.OverAcceleration && plot.SensorData.EventFlag === 1) { // over acceleration\r\n //this.events.push(this.createEventMarker(\r\n // plot,\r\n // \"OverAcceleration\",\r\n // \"marker-event-over-acceleration\",\r\n // \"location_on\",\r\n // \"fast_forward\"));\r\n }\r\n else if (eventType === EventType.BadAnticipation) { // Bad anticipation\r\n if (plot.SensorData.EventFlag === 1) {\r\n const plotEvent = this.googleMarkerService.createEventMarker(\r\n plot,\r\n {\r\n label: this.translationService.t(\"plotEventService.badAnticipation\"),\r\n markerClass: \"marker-event-bad-anticipation\",\r\n subIcon: \"local_car_wash\"\r\n });\r\n\r\n events.push(plotEvent);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Now removed, replaced with input triggers\r\n //if (includeTelematicsPTO && plot.Reason === ReasonCode.Telematics && plot.Telematics) {\r\n // const input = this.vehicleInputService.getInputForVehicle(plot.VehicleId, vehicleInputs);\r\n // if (input) {\r\n // plot.Telematics.forEach(telematics => {\r\n // const ptoLabel = (telematics.State === input.ActiveState) ? `${input.Name} On (Telematics)` : `${input.Name} Off (Telematics)`;\r\n // const ptoClass = (telematics.State === input.ActiveState) ? \"marker-event-pto\" : \"marker-event-pto pto-off\";\r\n\r\n // const plotEvent = this.googleMarkerService.createEventMarker(\r\n // plot,\r\n // ptoLabel,\r\n // ptoClass,\r\n // \"build\");\r\n\r\n // events.push(plotEvent);\r\n // });\r\n // }\r\n //}\r\n }\r\n\r\n //console.timeEnd(\"parsePlotEvents\");\r\n\r\n return events;\r\n }\r\n}\r\n","import { Component, Input, Output, OnChanges, EventEmitter } from \"@angular/core\";\r\nimport { VNavBarService } from \"@directives/_core/v-nav-bar/v-nav-bar.service.ts\";\r\nimport './v-nav-item.component.scss';\r\n\r\n@Component({\r\n selector: 'v-nav-item',\r\n template: require('./v-nav-item.component.html')\r\n})\r\nexport class VNavItemComponent implements OnChanges {\r\n @Input() label: string;\r\n @Input() selected: boolean;\r\n\r\n constructor(\r\n private readonly navBarService: VNavBarService) { }\r\n\r\n ngOnChanges(): void {\r\n }\r\n\r\n itemClick() {\r\n this.navBarService.navItemChange(this);\r\n }\r\n\r\n}\r\n","import { AfterViewInit, ChangeDetectorRef, Component, ElementRef, EventEmitter, HostBinding, HostListener, Input, OnChanges, Output, SimpleChanges } from \"@angular/core\";\r\nimport \"./v-button.component.scss\";\r\n\r\nexport interface IVButtonDropDownItem {\r\n id?: any;\r\n icon?: string;\r\n label: string;\r\n\r\n data?: T;\r\n\r\n disabled?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'v-button',\r\n template: require('./v-button.component.html')\r\n})\r\nexport class VButtonComponent implements AfterViewInit, OnChanges {\r\n @Input() icon: string;\r\n @Input() iconPosition: \"left\" | \"right\";\r\n @Input() hovered: boolean;\r\n\r\n @Input() contentAlign: \"left\" | \"center\" | \"right\" = \"left\";\r\n @Input() dropDownItems: IVButtonDropDownItem[];\r\n @Input() dropDownPosition: \"bottom-left\" | \"top-right\" = \"bottom-left\";\r\n @Input() showDropDown: boolean;\r\n @Input() showNextPrev: boolean;\r\n @Input() disableNext: boolean;\r\n @Input() disablePrev: boolean;\r\n @Input() disabled: boolean;\r\n @Input() @HostBinding(\"class.loading\") loading: boolean;\r\n @Input() isDropdown: boolean;\r\n\r\n @Input() iconOnly: boolean;\r\n\r\n @Output() onClick: EventEmitter = new EventEmitter();\r\n @Output() onNextClick: EventEmitter = new EventEmitter();\r\n @Output() onPrevClick: EventEmitter = new EventEmitter();\r\n @Output() onItemClick: EventEmitter = new EventEmitter();\r\n\r\n // ---\r\n\r\n isFontAwesome = false;\r\n dropdownIsFontAwesome = false;\r\n\r\n constructor(\r\n private readonly cd: ChangeDetectorRef,\r\n private readonly elementRef: ElementRef) {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[\"showDropDown\"] || changes[\"dropDownItems\"]) {\r\n this.isDropdown = this.showDropDown || !!this.dropDownItems;\r\n this.dropdownIsFontAwesome = this.dropDownItems?.some(item => item.icon.indexOf(\"fa-\") == 0);\r\n }\r\n\r\n if (changes[\"icon\"]) {\r\n this.isFontAwesome = this.icon.indexOf(\"fa-\") == 0;\r\n\r\n // Auto add fa-solid if not set\r\n if (this.isFontAwesome && this.icon.split(\"fa-\").length == 2) {\r\n this.icon += \" fa-solid\";\r\n };\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n var button = this.elementRef.nativeElement.querySelector(\"button\");\r\n var span = button.querySelector(\"span\");\r\n\r\n if (typeof this.iconOnly == undefined && this.icon && !this.showNextPrev && span?.textContent == \"\") {\r\n\r\n this.iconOnly = true;\r\n }\r\n\r\n this.cd.detectChanges();\r\n }\r\n\r\n @HostListener('document:mousedown', ['$event'])\r\n onGlobalClick(event: MouseEvent): void {\r\n // If we are inside this element, then do nothing\r\n if (this.elementRef.nativeElement.contains(event.target as any)) {\r\n return;\r\n }\r\n\r\n // If we are outside the element then close drop down, if its open\r\n if (this.showDropDown) {\r\n this.showDropDown = false;\r\n event.cancelBubble = true;\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n onButtonClicked($event: MouseEvent) {\r\n this.onClick.emit($event);\r\n\r\n if (this.dropDownItems) {\r\n this.showDropDown = !this.showDropDown;\r\n }\r\n\r\n $event.preventDefault();\r\n }\r\n\r\n dropDownItemClicked(dropDownItem: IVButtonDropDownItem) {\r\n this.onItemClick.emit(dropDownItem);\r\n this.showDropDown = false;\r\n }\r\n\r\n // ---\r\n\r\n}\r\n\r\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild } from \"@angular/core\";\r\nimport { VToggleComponent } from \"../../_forms/v-toggle/v-toggle.component\";\r\nimport './v-flag-toggle.component.scss';\r\n\r\n@Component({\r\n selector: \"v-flag-toggle\",\r\n template: require(\"./v-flag-toggle.component.html\")\r\n})\r\nexport class VFlagToggleComponent implements OnInit, OnChanges {\r\n\r\n //bindings\r\n @Input() flag: any;\r\n @Input() disabled: boolean;\r\n @Input() currentFlags: any;\r\n @Output() currentFlagsChange = new EventEmitter();\r\n @Output() onChanged = new EventEmitter();\r\n\r\n @ViewChild(VToggleComponent) toggleComponent: VToggleComponent;\r\n\r\n // state\r\n hasFlag: boolean;\r\n\r\n constructor() {}\r\n\r\n ngOnInit(): void {\r\n this.updateFlagState();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n this.updateFlagState();\r\n }\r\n\r\n toggle(): void {\r\n this.toggleComponent?.toggle();\r\n }\r\n\r\n onToggled(enabled: boolean): void {\r\n if (enabled) {\r\n this.addFlag();\r\n } else {\r\n this.removeFlag();\r\n }\r\n\r\n this.updateFlagState();\r\n this.currentFlagsChange.emit(this.currentFlags);\r\n this.onChanged.emit(this.hasFlag);\r\n }\r\n\r\n // ---\r\n\r\n private updateFlagState(): void {\r\n this.hasFlag = (this.currentFlags & this.flag) === this.flag;\r\n }\r\n\r\n private addFlag(): void {\r\n this.currentFlags = this.currentFlags | this.flag;\r\n }\r\n\r\n private removeFlag(): void {\r\n this.currentFlags = this.currentFlags & ~this.flag;\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnInit, Output } from \"@angular/core\";\r\nimport { DisplayService, IDialogOptionsJson } from \"@services/display.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport './delete-confirm.component.scss';\r\n\r\n@Component({\r\n selector: 'delete-confirmation',\r\n template: require('./delete-confirm.component.html')\r\n})\r\nexport class DeleteConfirmationComponent {\r\n\r\n @Input() inlineConfirm: boolean;\r\n @Input() small: boolean;\r\n @Input() isDisabled: boolean;\r\n @Input() loading: boolean;\r\n\r\n @Input() subjectName: string;\r\n @Input() subjectVerb: string;\r\n @Input() reference: string;\r\n @Input() label: string;\r\n @Input() icon: string = \"delete\";\r\n\r\n @Input() cancelVerb: string = this.translationService.t(\"Common.Cancel\");\r\n\r\n @Output() onConfirm = new EventEmitter();\r\n\r\n showDeleteConfirm = false;\r\n\r\n constructor(\r\n protected readonly displayService: DisplayService,\r\n protected readonly translationService: TranslationService) { }\r\n\r\n\r\n onDeleteClick($event) {\r\n if (this.inlineConfirm) {\r\n this.showDeleteConfirm = true;\r\n }\r\n else {\r\n this.showDeleteDialog($event);\r\n }\r\n }\r\n\r\n showDeleteDialog($event) {\r\n let dialogHTML = `
${this.translationService.t('DeleteConfirm.AreYouSure', [this.subjectVerb.toLowerCase(), this.subjectName.toLowerCase()])}
${this.cancelVerb}${this.subjectVerb}
`;\r\n\r\n const dialogOptions: IDialogOptionsJson = {\r\n title: `${this.subjectVerb} ${this.subjectName}?`,\r\n dialogHTML: dialogHTML,\r\n dialogId: `deleteConfirmDialog`,\r\n bindings: {\r\n onConfirmDialog: (confirmation: boolean) => { this.onConfirmDialog(confirmation); }\r\n },\r\n event: $event,\r\n multiple: true,\r\n clickOutsideToClose: true,\r\n escapeToClose: true\r\n };\r\n\r\n this.displayService.showDialog(dialogOptions);\r\n\r\n }\r\n\r\n onConfirmDialog(confirmation: boolean) {\r\n this.onConfirm.emit(confirmation);\r\n }\r\n\r\n}\r\n","\r\nexport class AlertsNavigationModule {\r\n static get AlertHistory(): string { return \"app.alerts.history\"; }\r\n static get ReviewAlerts(): string { return \"app.alerts.review\"; }\r\n static get Compliance(): string { return \"app.alerts.compliance\"; }\r\n static get ManageAlerts(): string { return \"app.alerts.all\"; }\r\n static get IncidentDetail(): string { return 'app.alerts.incident'; }\r\n\r\n static get Default(): string { return this.AlertHistory; }\r\n static get ParentRoot(): string { return \"app.alerts\"; }\r\n}\r\n","\nimport * as angular from \"angular\";\r\nimport { CanvasService } from \"./canvas.service\";\r\n\r\nexport class AvatarService {\n\n //private colours = [\r\n // \"#1abc9c\", \"#2ecc71\", \"#3498db\", \"#9b59b6\", \"#34495e\", \"#16a085\", \"#27ae60\", \"#2980b9\", \"#8e44ad\", \"#2c3e50\",\r\n // \"#f1c40f\", \"#e67e22\", \"#e74c3c\", \"#ecf0f1\", \"#95a5a6\", \"#f39c12\", \"#d35400\", \"#c0392b\", \"#bdc3c7\", \"#7f8c8d\"\r\n //];\n\n // If we only pick one we should pick \"#757D75\"\n //private greyColours = [\"#757D75\", \"#6c7a89\", /*\"#bdc3c7\",*/ \"#95a5a6\", /*\"#dadfe1\",*/ /*\"#abb7b7\", \"#bfbfbf\"*/];\n //private greyColours = [\"#757D75\", \"#6c7a89\", \"rgb(107,107,107)\", \"rgb(125,125,125)\", \"rgb(135,135,135)\", \"rgb(73,73,73)\", \"rgb(91,91,91)\", \"rgb(106,106,106)\", \"rgb(113,113,113)\", \"rgb(105,105,105)\", \"rgb(134,134,134)\"];\n //private greyColours = [\"rgb(125,125,125)\"];\n private greyColours = [\"rgb(135,135,135)\"];\n\n private avatarCache: string[] = [];\r\n\r\n static $inject = [\"$q\", \"canvasService\"];\r\n\r\n constructor(\n private readonly $q: angular.IQService,\n private readonly canvasService: CanvasService) {\r\n }\n\n getAvatar(name: string, singleLetter = false, size = 60): angular.IPromise {\n var defer = this.$q.defer();\n\n const nameSplit = name.toUpperCase().replace(/[^\\w\\s]/gi, '').split(' ');\n var initials = \"\";\n\n if (nameSplit.length == 1 || singleLetter) {\r\n initials = nameSplit[0] ? nameSplit[0].charAt(0) : \"?\";\r\n }\n else {\r\n initials = nameSplit[0].charAt(0) + nameSplit[1].charAt(0);\r\n }\n\n const cacheKey = `${initials}-${size}`;\n\n if (this.avatarCache[cacheKey]) {\n defer.resolve(this.avatarCache[cacheKey]);\n return defer.promise;\n }\n\n var charIndex = (initials == '?' ? 72 : initials.charCodeAt(0)) - 64;\r\n var colourIndex = charIndex % this.greyColours.length;\n\r\n var canvas = this.canvasService.getSingleUseCanvas(size, size);\n var context = canvas.getContext(\"2d\");\r\n\r\n context.fillStyle = this.greyColours[colourIndex];\r\n context.fillRect(0, 0, size, size);\r\n context.font = Math.ceil(size / 2) + \"px Roboto\";\r\n context.textAlign = \"center\";\r\n context.fillStyle = \"#FFF\";\r\n context.fillText(initials, size / 2, size / 1.5);\n\r\n var dataURI: string;\n\n canvas.toBlob(blob => {\n dataURI = URL.createObjectURL(blob);\n this.avatarCache[cacheKey] = dataURI;\n\n defer.resolve(this.avatarCache[cacheKey]);\n });\n\n return defer.promise;\n }\r\n}\n","import { Component, ElementRef, EventEmitter, Input, Output, SimpleChanges, ViewChild } from \"@angular/core\";\r\nimport { VideoStreamService } from \"@app/directives/_veri/veriVideo/v-stream-collection/stream.service\";\r\nimport { FlvPlayerMediaInfo, FlvPlayer, FlvPlayerStatisticsInfo } from \"@app/interfaces/IStreamPlayer\";\r\nimport { IVideoStreamError } from \"@app/interfaces/IVideoStreamError\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport './flv-player.component.scss';\r\n\r\ndeclare const flvjs;\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'v-flv-player',\r\n template: require('./flv-player.component.html')\r\n})\r\nexport class VFlvPlayer {\r\n @Input() sourceUrl: string;\r\n @Input() hasAudio: boolean;\r\n @Input() streamTimeout: number;\r\n @Input() timeoutOnMouseIdle: boolean;\r\n\r\n @Output() error = new EventEmitter<{ type: string, message: string, details: IVideoStreamError }>();\r\n @Output() receivedMedia = new EventEmitter<{ mediaInfo: FlvPlayerMediaInfo }>();\r\n @Output() streamTimeEnded = new EventEmitter();\r\n @Output() videoPlaybackNotSupported = new EventEmitter();\r\n @Output() receivedMetaData = new EventEmitter<{ metadata: any }>();\r\n @Output() receivedScriptData = new EventEmitter<{ data: any }>();\r\n @Output() statisics = new EventEmitter<{ statisticsInfo: FlvPlayerStatisticsInfo }>();\r\n @Output() ready = new EventEmitter();\r\n @Output() seeked = new EventEmitter();\r\n @Output() resumed = new EventEmitter();\r\n @Output() paused = new EventEmitter();\r\n @Output() closed = new EventEmitter();\r\n\r\n @ViewChild('video') htmlVideoElement: ElementRef;\r\n\r\n player: FlvPlayer = null;\r\n previousSourceUrl = \"\";\r\n\r\n displayTimer: number;\r\n\r\n streamTimeoutTimer: ReturnType;\r\n streamTimeoutInterval: ReturnType;\r\n\r\n constructor(\r\n private readonly streamService: VideoStreamService) { }\r\n\r\n ngOnInit(): void {\r\n this.setupListener();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['sourceUrl']) {\r\n this.updatePlayer();\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.updatePlayer();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroyPlayer();\r\n this.unloadHtmlElement();\r\n this.removeHtmlElement();\r\n this.removeTimers();\r\n }\r\n\r\n\r\n //--\r\n\r\n private removeTimers(): void {\r\n clearTimeout(this.streamTimeoutTimer);\r\n this.streamTimeoutTimer = null;\r\n }\r\n\r\n private updatePlayer(): void {\r\n this.player = this.setupPlayer();\r\n }\r\n\r\n private setupPlayer(): FlvPlayer {\r\n\r\n this.destroyPlayer();\r\n\r\n const featureList = flvjs.getFeatureList();\r\n\r\n if (!featureList.mseFlvPlayback || !featureList.mseLiveFlvPlayback) {\r\n this.videoPlaybackNotSupported.emit();\r\n return null;\r\n }\r\n\r\n if (!this.sourceUrl) {\r\n return null;\r\n }\r\n\r\n const player = this.loadMedia();\r\n this.setupEvents(player);\r\n\r\n return player;\r\n }\r\n\r\n private destroyPlayer(): void {\r\n if (!this.player) {\r\n this.unloadHtmlElement();\r\n return;\r\n }\r\n\r\n try {\r\n this.player.pause();\r\n this.player.unload();\r\n this.player.detachMediaElement();\r\n this.player.destroy();\r\n }\r\n catch (ex) {\r\n console.warn(\"Error at FlvPlayer.destroyPlayer\", ex);\r\n }\r\n\r\n\r\n this.player = null;\r\n }\r\n\r\n private unloadHtmlElement(): void {\r\n if (!this.htmlVideoElement) {\r\n return;\r\n }\r\n\r\n this.htmlVideoElement.nativeElement.pause();\r\n this.htmlVideoElement.nativeElement.removeAttribute('src');\r\n this.htmlVideoElement.nativeElement.load();\r\n }\r\n\r\n private removeHtmlElement(): void {\r\n this.htmlVideoElement.nativeElement.remove();\r\n }\r\n\r\n private loadMedia(): FlvPlayer {\r\n if (!this.htmlVideoElement) {\r\n return;\r\n }\r\n\r\n const mediaSource = {\r\n type: \"flv\",\r\n isLive: true,\r\n hasAudio: this.hasAudio,\r\n hasVideo: true,\r\n withCredentials: false,\r\n url: this.sourceUrl\r\n };\r\n const player = flvjs.createPlayer(mediaSource, {\r\n enableWorker: true,\r\n lazyLoadMaxDuration: 3 * 60,\r\n seekType: \"range\",\r\n });\r\n\r\n player.attachMediaElement(this.htmlVideoElement.nativeElement);\r\n player.load();\r\n \r\n flvjs.LoggingControl.enableAll = false;\r\n\r\n return player;\r\n }\r\n\r\n private setupEvents(player: FlvPlayer): void {\r\n if (!player) {\r\n return;\r\n }\r\n\r\n player.on(flvjs.Events.ERROR, (type: string, message: string, details: IVideoStreamError) => {\r\n this.error.emit({ type, message, details });\r\n });\r\n\r\n player.on(flvjs.Events.MEDIA_INFO, (mediaInfo: FlvPlayerMediaInfo) => {\r\n this.receivedMedia.emit({ mediaInfo });\r\n\r\n this.startTimer();\r\n });\r\n\r\n player.on(flvjs.Events.META_DATA_ARRIVED, (metadata: any) => {\r\n this.receivedMetaData.emit({ metadata });\r\n });\r\n\r\n player.on(flvjs.Events.SCRIPTDATA_ARRIVED, (data: any) => {\r\n this.receivedScriptData.emit({ data });\r\n });\r\n\r\n player.on(flvjs.Events.STATISTICS_INFO, (statisticsInfo: FlvPlayerStatisticsInfo) => {\r\n this.statisics.emit({ statisticsInfo });\r\n });\r\n\r\n player.on(flvjs.Events.READY, () => {\r\n this.ready.emit();\r\n });\r\n\r\n player.on(flvjs.Events.SEEKED, () => {\r\n this.seeked.emit();\r\n });\r\n\r\n player.on(flvjs.Events.RESUMED, () => {\r\n this.startTimer();\r\n this.resumed.emit();\r\n });\r\n\r\n player.on(flvjs.Events.PAUSED, () => {\r\n clearInterval(this.streamTimeoutInterval);\r\n this.paused.emit();\r\n });\r\n\r\n player.on(flvjs.Events.CLOSED, () => {\r\n this.closed.emit();\r\n });\r\n }\r\n\r\n private startTimer(): void {\r\n if (this.timeoutOnMouseIdle) {\r\n this.startMouseIdleTimer();\r\n return;\r\n }\r\n\r\n if (!this.streamTimeout || this.streamTimeout <= 0) {\r\n this.streamTimeout = 5;\r\n }\r\n\r\n clearTimeout(this.streamTimeoutTimer);\r\n\r\n this.streamTimeoutTimer = setTimeout(() => {\r\n\r\n try {\r\n if (this.player) {\r\n this.player.pause();\r\n this.player.unload();\r\n }\r\n }\r\n catch (x) {\r\n }\r\n\r\n this.streamTimeEnded.emit({ player: this.player });\r\n\r\n }, this.streamTimeout * 60000);\r\n }\r\n\r\n private startMouseIdleTimer(): void {\r\n clearTimeout(this.streamTimeoutTimer);\r\n clearInterval(this.streamTimeoutInterval);\r\n\r\n this.streamTimeoutTimer = setTimeout(() => {\r\n\r\n clearInterval(this.streamTimeoutInterval);\r\n this.displayTimer = 0;\r\n\r\n try {\r\n if (this.player) {\r\n this.player.pause();\r\n this.player.unload();\r\n }\r\n }\r\n catch (x) {\r\n }\r\n\r\n this.streamTimeEnded.emit({ player: this.player });\r\n\r\n }, 30_000);\r\n\r\n let timer = 29;\r\n\r\n this.streamTimeoutInterval = setInterval(() => {\r\n this.displayTimer = timer;\r\n timer--;\r\n }, 1000)\r\n\r\n\r\n }\r\n\r\n\r\n private resetMouseIdleTimeout(): void {\r\n if (!this.timeoutOnMouseIdle || this.htmlVideoElement?.nativeElement?.paused) {\r\n clearInterval(this.streamTimeoutInterval);\r\n return;\r\n }\r\n\r\n this.displayTimer = 30;\r\n this.startMouseIdleTimer();\r\n }\r\n\r\n\r\n private setupListener(): void {\r\n this.streamService.streamResetTrigger.pipe(untilDestroyed(this)).subscribe(() => {\r\n this.resetMouseIdleTimeout();\r\n })\r\n }\r\n}\r\n","import { Component, Input, OnChanges, OnInit, SimpleChanges } from \"@angular/core\";\r\nimport { ILocationInformation } from \"@app/interfaces/ILocationInformation\";\r\nimport { IPlot } from \"@app/interfaces/IPlot\";\r\nimport { LocationInformationService } from \"@app/services/location-information/location-information.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { Subscription } from \"rxjs\";\r\nimport { debounceTime, take } from \"rxjs/operators\";\r\nimport './location-information.component.scss';\r\n\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'location-information',\r\n template: require('./location-information.component.html')\r\n})\r\nexport class LocationInformationComponent implements OnInit, OnChanges {\r\n\r\n @Input() plot: IPlot;\r\n @Input() small: boolean = false;\r\n @Input() showGeofenceIcon: boolean;\r\n @Input() hideEllipsis: boolean = false;\r\n @Input() showAddressWithGeofence: boolean = false;\r\n @Input() latLng: google.maps.LatLng;\r\n @Input() locationInformation: ILocationInformation;\r\n\r\n isGeofence: boolean;\r\n label: string = \"\";\r\n\r\n plotLocationSubscription: Subscription;\r\n\r\n constructor(\r\n private readonly locationInformationService: LocationInformationService,\r\n private readonly translationService: TranslationService) { }\r\n\r\n ngOnInit(): void {\r\n this.setLabel();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n this.plotLocationSubscription?.unsubscribe();\r\n\r\n if (changes['plot'] || changes['locationInformation']) {\r\n this.setLabel();\r\n }\r\n\r\n if (changes['latLng']) {\r\n this.setLocationInformationFromLatLng();\r\n }\r\n }\r\n\r\n //--\r\n\r\n private async setLabel(): Promise {\r\n this.label = this.translationService.t(\"LocationInformation.Updating\");\r\n\r\n if (this.latLng && !this.locationInformation) {\r\n this.setLocationInformationFromLatLng();\r\n return;\r\n }\r\n\r\n if (!this.plot && !this.locationInformation) {\r\n this.label = \"N/A\";\r\n return;\r\n }\r\n\r\n const locationInformation = this.plot?.LocationInformation || this.locationInformation;\r\n\r\n if (this.plot?.Id && !locationInformation) {\r\n this.setPlotLocation();\r\n return;\r\n }\r\n\r\n if (!locationInformation) {\r\n this.label = \"N/A\";\r\n return;\r\n }\r\n\r\n if (locationInformation.GeofenceIds?.length) {\r\n this.label = await this.locationInformationService.getGeofenceNamesString(locationInformation, this.showAddressWithGeofence);\r\n this.isGeofence = true;\r\n return;\r\n }\r\n\r\n this.isGeofence = false;\r\n\r\n this.label = locationInformation.LocationDescription;\r\n }\r\n\r\n private setPlotLocation(): void {\r\n if (!this.plot) {\r\n this.setLabel();\r\n return;\r\n }\r\n\r\n this.plotLocationSubscription = this.locationInformationService.getPlotLocation(this.plot.Id).pipe(\r\n debounceTime(500),\r\n untilDestroyed(this))\r\n .subscribe({\r\n next: async location => {\r\n this.plot.LocationInformation = location;\r\n await this.setLabel();\r\n }\r\n })\r\n }\r\n\r\n private setLocationInformationFromLatLng(): void {\r\n if (!this.latLng || this.locationInformation) {\r\n return;\r\n }\r\n\r\n this.locationInformationService.getLocationInformationFromLatLng(this.latLng).pipe(take(1)).subscribe({\r\n next: async locationInformation => {\r\n this.locationInformation = locationInformation;\r\n await this.setLabel();\r\n }\r\n })\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { IGeofence } from \"@app/interfaces/IGeofences\";\r\nimport { ILocationInformation } from \"@app/interfaces/ILocationInformation\";\r\nimport { from, Observable } from \"rxjs\";\r\nimport { map } from \"rxjs/operators\";\r\nimport { GeocodeService } from \"../geocode.service\";\r\nimport { GeofenceService } from \"../geofence.service\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LocationInformationService {\r\n\r\n constructor(\r\n private readonly geocodeService: GeocodeService,\r\n private readonly geofenceService: GeofenceService) {\r\n }\r\n\r\n getAllGeofences(): Promise {\r\n return this.geofenceService.getGeofences({ unsafe: true }) as Promise;\r\n }\r\n\r\n async getGeofenceName(id: number, includeAddress?: boolean): Promise {\r\n const geofences = await this.getAllGeofences();\r\n const geofence: IGeofence = geofences.find(geofence => geofence.Id === id);\r\n\r\n if (!geofence) {\r\n return \"N/A\";\r\n }\r\n\r\n let geofenceName = includeAddress ?\r\n `${geofence.Description} - ${geofence.Addr1}, ${geofence.Addr2}` :\r\n geofence.Description;\r\n\r\n return await geofenceName;\r\n }\r\n\r\n async getGeofenceNamesString(locationInformation: ILocationInformation, includeAddress = false): Promise {\r\n if (!locationInformation?.GeofenceIds?.length) {\r\n return \"N/A\";\r\n }\r\n\r\n const geofenceNamePromises = locationInformation.GeofenceIds.map(gId =>\r\n this.getGeofenceName(gId, includeAddress)\r\n );\r\n\r\n const geofenceNames = await Promise.all(geofenceNamePromises);\r\n\r\n return geofenceNames.join(', ');\r\n }\r\n\r\n getPlotLocation(plotId: number): Observable {\r\n return from(this.geocodeService.getLocationInformationFromPlotId(plotId) as Promise).pipe(\r\n map((locationInformation: ILocationInformation) => {\r\n if (!locationInformation) {\r\n return {\r\n GeofenceIds: [],\r\n LocationDescription: \"N/A\"\r\n }\r\n }\r\n return locationInformation;\r\n }))\r\n }\r\n\r\n getLocationInformationFromLatLng(latLng: google.maps.LatLng): Observable {\r\n return from(this.geocodeService.getLocationInformationFromLatLong(latLng)).pipe(\r\n map((locationInformation: ILocationInformation) => {\r\n if (!locationInformation) {\r\n return {\r\n GeofenceIds: [],\r\n LocationDescription: \"N/A\"\r\n }\r\n }\r\n return locationInformation;\r\n })\r\n )\r\n }\r\n}\r\n","import { Component, Input } from \"@angular/core\";\r\nimport \"./video-download-status.component.scss\";\r\n\r\n@Component({\r\n selector: \"video-download-status\",\r\n template: require(\"./video-download-status.component.html\")\r\n})\r\n\r\nexport class VideoDownloadStatusComponent {\r\n\r\n @Input() label: string;\r\n @Input() autoDownload: boolean;\r\n}\r\n\r\n","import { Component, ElementRef, HostBinding, HostListener, Injector, Input, OnChanges, Renderer2, SimpleChanges } from \"@angular/core\";\r\nimport { FoundationNavigationModule } from \"@app/main/modules/foundation/foundation.navigation\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { NavigationService } from \"@services/navigation.service\";\r\nimport { PopupService } from \"@services/popup.service\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport \"./vehicleReg.component.scss\";\r\n\r\n@Component({\r\n selector: \"vehicle-reg\",\r\n template: require(\"./vehicleReg.component.html\")\r\n})\r\nexport class VehicleRegComponent implements OnChanges {\r\n\r\n @Input() vehicle: IVehicle;\r\n @Input() vehicleId: number;\r\n @Input() allowNonDatabaseVehicle: boolean = false;\r\n\r\n @HostBinding(\"class.clickable\") @Input() clickable = false;\r\n @HostListener(\"click\", [\"$event\"]) onClick() { this.navigateToVehicle(); };\r\n\r\n // ---\r\n\r\n private appliedTrailerClass: boolean;\r\n private appliedNoVehicleClass: boolean;\r\n\r\n private primaryPlateText: string;\r\n private tooltipText: string;\r\n\r\n constructor(\r\n private readonly renderer: Renderer2,\r\n private readonly elementRef: ElementRef,\r\n private readonly popupService: PopupService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly navigationService: NavigationService\r\n ) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.loadVehicle();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n this.loadVehicle();\r\n }\r\n\r\n showVehiclePopup($event: MouseEvent) {\r\n // Removed via MT request\r\n //this.showPopup($event);\r\n }\r\n\r\n hideVehiclePopup() {\r\n //this.showPopup();\r\n }\r\n\r\n // ---\r\n\r\n private loadVehicle(): void {\r\n if (!!this.vehicleId) {\r\n this.vehicle = {\r\n ShortReg: \"...\",\r\n Reg: \"...\"\r\n };\r\n\r\n this.vehicleService.getVehicleFromDatabase(this.vehicleId).then(vehicle => {\r\n this.vehicle = vehicle;\r\n this.vehicleUpdated();\r\n });\r\n }\r\n else {\r\n this.vehicleUpdated();\r\n }\r\n }\r\n\r\n private vehicleUpdated() {\r\n this.updateClasses();\r\n this.updateTextStrings();\r\n }\r\n\r\n private updateClasses() {\r\n if (this.vehicle?.Id || this.allowNonDatabaseVehicle) {\r\n var shouldApplyTrailerClass = this.vehicleService.isNonDrivableVehicleType(this.vehicle);\r\n\r\n this.applyTrailerClass(shouldApplyTrailerClass);\r\n this.applyNoVehicleClass(false);\r\n }\r\n else {\r\n this.vehicle = {\r\n ShortReg: \"N/A\",\r\n Reg: \"N/A\"\r\n };\r\n\r\n this.applyNoVehicleClass(true);\r\n this.applyTrailerClass(false);\r\n }\r\n }\r\n\r\n private applyTrailerClass(shouldApplyTrailerClass: boolean) {\r\n if (shouldApplyTrailerClass && !this.appliedTrailerClass) {\r\n this.addClass(\"trailer\");\r\n }\r\n else if (!shouldApplyTrailerClass && this.appliedTrailerClass) {\r\n this.removeClass(\"trailer\");\r\n }\r\n\r\n this.appliedTrailerClass = shouldApplyTrailerClass;\r\n }\r\n\r\n private applyNoVehicleClass(shouldApplyNoVehicleClass: boolean) {\r\n if (shouldApplyNoVehicleClass && !this.appliedNoVehicleClass) {\r\n this.addClass(\"no-vehicle\");\r\n }\r\n else if (!shouldApplyNoVehicleClass && this.appliedNoVehicleClass) {\r\n this.removeClass(\"no-vehicle\");\r\n }\r\n\r\n this.appliedNoVehicleClass = shouldApplyNoVehicleClass;\r\n }\r\n\r\n private addClass(className: string) {\r\n this.renderer.addClass(this.elementRef.nativeElement, className);\r\n }\r\n\r\n private removeClass(className: string,) {\r\n this.renderer.removeClass(this.elementRef.nativeElement, className);\r\n }\r\n\r\n private updateTextStrings() {\r\n // Set tooltips & plates\r\n this.primaryPlateText = this.vehicle.Reg;\r\n\r\n // If reg's are similar, then dont show both\r\n //console.log(this.vehicle.Reg, this.vehicle.ShortReg);\r\n if (this.vehicle.Reg.indexOf(this.vehicle.ShortReg) >= 0 || this.vehicle.ShortReg?.indexOf(this.vehicle.Reg) >= 0) {\r\n this.tooltipText = this.vehicle.Reg.length > this.vehicle.ShortReg.length\r\n ? this.vehicle.Reg\r\n : this.vehicle.ShortReg;\r\n\r\n if (this.tooltipText.length < 10) {\r\n this.tooltipText = null;\r\n }\r\n }\r\n else {\r\n this.tooltipText = \"\";\r\n if (this.primaryPlateText.length > 10) {\r\n this.tooltipText = `${this.vehicle.Reg} // `;\r\n }\r\n\r\n this.tooltipText += this.vehicle.ShortReg || \"\";\r\n }\r\n }\r\n \r\n private navigateToVehicle() {\r\n if (!this.clickable || !this.vehicle.Id) {\r\n return;\r\n }\r\n\r\n this.navigationService.go(FoundationNavigationModule.VehicleView, { vehicleId: this.vehicle.Id });\r\n }\r\n}\r\n","import { IPopupBindings, PopupComponent } from \"@directives/_misc/popup/popup.directive\";\r\nimport * as angular from \"angular\";\r\n\r\nexport interface IPopupOptionsJson {\r\n}\r\n\r\nexport class PopupService {\r\n\r\n static $inject = [\"$rootScope\", \"$compile\"];\r\n\r\n constructor(\r\n private readonly $rootScope: angular.IRootScopeService,\r\n private readonly $compile: angular.ICompileService\r\n ) { }\r\n\r\n showPopup(template: string, $event: MouseEvent, bindings?: any) {\r\n\r\n var insertedPopup = this.$compile(``)(this.$rootScope.$new(false)) as any;\r\n angular.element(\"popup-wrapper\").append(insertedPopup);\r\n\r\n const insertedElementScope = this.$rootScope.$new(false);\r\n Object.assign(insertedElementScope, bindings);\r\n var insertedTemplate = this.$compile(template)(insertedElementScope) as any;\r\n insertedPopup.append(insertedTemplate);\r\n\r\n const popupScope: any = insertedPopup.length && (insertedPopup.isolateScope() || insertedPopup.scope());\r\n const popupComponent: IPopupBindings = popupScope.$ctrl;\r\n\r\n const pixelsToRightOfScreen = window.innerWidth - $event.x;\r\n const pixelsToBottomOfScreen = window.innerHeight - $event.y;\r\n\r\n popupComponent.showOnRight = pixelsToRightOfScreen > 500;\r\n //popupComponent.arrowPosition = \"bottom\";\r\n popupComponent.mouseEvent = $event;\r\n popupComponent.$onChanges({});\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output } from \"@angular/core\";\r\nimport './checkbox-cell.component.scss';\r\n\r\n@Component({\r\n selector: 'checkbox-cell',\r\n template: require('./checkbox-cell.component.html'),\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class CheckboxCell {\r\n @Input() data: boolean;\r\n @Input() disabled: boolean;\r\n @Output() cellClick = new EventEmitter();\r\n\r\n @HostListener('click', ['$event'])\r\n onClick(event: PointerEvent): void {\r\n this.cellClick.emit(event);\r\n }\r\n\r\n constructor() { }\r\n}\r\n","import { ChangeDetectionStrategy, Component, Input, OnInit } from \"@angular/core\";\r\nimport './v-enum-cell.component.scss';\r\n\r\n@Component({\r\n selector: 'v-enum-cell',\r\n template: '{{ enumValue | enumAsString : enumType : enumName }}',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class EnumCellComponent implements OnInit {\r\n\r\n @Input() enumType: T;\r\n @Input() enumName: string;\r\n @Input() enumValue: number;\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component, Input, OnChanges, OnInit, SimpleChanges } from \"@angular/core\";\r\nimport './percentage-bar-cell.component.scss';\r\n\r\nexport interface PercentageBarModel {\r\n positiveSegment?: PercentageBarSegment;\r\n neutralSegment?: PercentageBarSegment;\r\n negativeSegment?: PercentageBarSegment;\r\n mainText?: string;\r\n}\r\n\r\nexport interface PercentageBarSegment {\r\n count: number;\r\n tooltip?: string;\r\n}\r\n\r\ninterface PercentageBarDisplaySegment extends PercentageBarSegment {\r\n className: string;\r\n percentage: number;\r\n}\r\n\r\n@Component({\r\n selector: 'percentage-bar-cell',\r\n template: require('./percentage-bar-cell.component.html'),\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PercentageBarCellComponent implements OnInit, OnChanges {\r\n private totalItems: number;\r\n\r\n @Input() model: PercentageBarModel;\r\n\r\n displaySegments: PercentageBarDisplaySegment[] = [];\r\n\r\n ngOnInit(): void {\r\n this.computeValues();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n this.computeValues();\r\n }\r\n\r\n private computeValues(): void {\r\n this.totalItems = this.getTotalItems();\r\n\r\n this.displaySegments = [\r\n this.buildDisplaySegment(this.model.negativeSegment, 'negative'),\r\n this.buildDisplaySegment(this.model.neutralSegment, 'neutral'),\r\n this.buildDisplaySegment(this.model.positiveSegment, 'positive'),\r\n ].filter(x => !!x);\r\n }\r\n\r\n private buildDisplaySegment(segment: PercentageBarSegment, className: string) : PercentageBarDisplaySegment | null {\r\n if (!segment) {\r\n return null;\r\n }\r\n\r\n const percentage = (segment.count || 0) / this.totalItems * 100;\r\n const percentageString = (percentage / 100).toLocaleString(undefined, { style: 'percent', maximumFractionDigits: 0 });\r\n\r\n const tooltip = !!segment.tooltip \r\n ? `${percentageString} ${segment.tooltip} - (${segment.count})` \r\n : `${percentageString} - (${segment.count})`;\r\n\r\n return {\r\n ...segment,\r\n tooltip,\r\n className,\r\n percentage\r\n };\r\n }\r\n\r\n private getTotalItems(): number {\r\n return this.getSegments()\r\n .filter(x => !!x)\r\n .map(x => x.count || 0)\r\n .reduce((sum, current) => sum += current, 0);\r\n }\r\n\r\n private getSegments(): (PercentageBarSegment | null)[] {\r\n return [\r\n this.model.negativeSegment,\r\n this.model.neutralSegment,\r\n this.model.positiveSegment\r\n ]\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\nimport './rag-cell.component.scss';\r\n\r\nexport interface RagCellBehavior {\r\n redFn?: (item: T) => boolean;\r\n amberFn?: (item: T) => boolean;\r\n greenFn?: (item: T) => boolean;\r\n grayFn?: (item: T) => boolean;\r\n noneFn?: (item: T) => boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'rag-cell',\r\n template: require('./rag-cell.component.html'),\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class RagCellComponent {\r\n @Input() behavior: RagCellBehavior;\r\n @Input() item: T;\r\n @Input() displayData: any;\r\n}\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit } from \"@angular/core\";\r\nimport { DateService } from \"@app/services/date.service\";\r\nimport './date-cell.component.scss';\r\n\r\n@Component({\r\n selector: 'date-cell',\r\n template: require('./date-cell.component.html'),\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class DateCell implements OnInit {\r\n @Input() date: Date;\r\n @Input() showErrorIfBeforeDate: Date;\r\n @Input() showWarningIfBeforeDate: Date;\r\n @Input() showRelativeTime: boolean;\r\n @Input() dateTime: boolean = true;\r\n\r\n // ---\r\n\r\n error: boolean;\r\n warning: boolean;\r\n\r\n constructor(private readonly dateService: DateService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.showErrorIfBeforeDate && this.dateService.date1IsAfterDate2(this.showErrorIfBeforeDate, this.date)) {\r\n this.error = true;\r\n }\r\n\r\n if (this.showWarningIfBeforeDate && this.dateService.date1IsAfterDate2(this.showWarningIfBeforeDate, this.date) && !this.error) {\r\n this.warning = true;\r\n }\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component, Input } from \"@angular/core\";\r\nimport { VTableRowStatus } from \"../../../_enums/VTableRowStatus.enum\";\r\nimport './status-cell.component.scss';\r\n\r\n@Component({\r\n selector: 'status-cell',\r\n template: require('./status-cell.component.html'),\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class StatusCell {\r\n @Input() data: VTableRowStatus;\r\n @Input() classes: string;\r\n\r\n VTableRowStatus = VTableRowStatus;\r\n\r\n constructor() { }\r\n\r\n ngOnInit() {\r\n }\r\n}\r\n","import { Component, ElementRef, EventEmitter, forwardRef, HostBinding, Inject, Input, OnDestroy, OnInit, Optional, Output } from \"@angular/core\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { ResponsiveService } from \"@app/services/responsive.service\";\r\nimport { Subject } from \"rxjs\";\r\nimport { takeUntil } from \"rxjs/operators\";\r\nimport { VTableHeaderType } from \"../../../_enums/VTableHeaderType.enum\";\r\nimport { VTableComponent } from \"../../v-table.component\";\r\nimport './v-table-header.component.scss';\r\n\r\n@Component({\r\n selector: 'v-table-header',\r\n template: require('./v-table-header.component.html')\r\n})\r\nexport class VTableHeader implements OnInit, OnDestroy {\r\n @Input() title: string;\r\n @Input() type: VTableHeaderType;\r\n @Input() classes: string;\r\n @Input() allRowsSelected = false;\r\n @Input() sortable: boolean;\r\n @Input() sorted: boolean;\r\n @Input() sortDirection: SortDirection;\r\n @Input() minTableWidth: number;\r\n\r\n @Output() selectRows = new EventEmitter();\r\n //--\r\n\r\n VTableHeaderType = VTableHeaderType;\r\n SortDirection = SortDirection;\r\n\r\n @HostBinding(\"style.display\") display: string;\r\n\r\n private destroy$ = new Subject();\r\n\r\n constructor(\r\n @Optional() @Inject(forwardRef(() => VTableComponent)) private table: VTableComponent,\r\n readonly el: ElementRef,\r\n private readonly responsiveService: ResponsiveService) {\r\n\r\n }\r\n\r\n ngOnInit(): void {\r\n this.setDisplay();\r\n this.responsiveService.currentWindowWidth.pipe(takeUntil(this.destroy$)).subscribe(() => {\r\n this.setDisplay();\r\n })\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.unsubscribe();\r\n }\r\n\r\n selectAllRows(): void {\r\n this.selectRows.emit(this.allRowsSelected);\r\n }\r\n\r\n //--\r\n\r\n private setDisplay(): void {\r\n if (!this.minTableWidth) {\r\n return;\r\n }\r\n\r\n this.display = this.responsiveService.shouldDisplayUsingMinWidth(this.minTableWidth, this.table.getWidth()) ? null : \"none\";\r\n }\r\n}\r\n","interface FormatBytesParams {\r\n inputUnit?: string;\r\n}\r\n\r\nexport function formatBytes() {\r\n\r\n return (rawInput: string | number, params?: FormatBytesParams): string => {\r\n const units = [\"bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"];\r\n const inputUnit: string = params?.inputUnit || \"bytes\";\r\n const input: number = Number(rawInput);\r\n\r\n if (isNaN(input) || input === 0) {\r\n return `0 ${(params?.inputUnit) ? params.inputUnit : 'MB'}`;\r\n }\r\n\r\n const indexOfUnit: number = units.findIndex(value => value?.toLowerCase() == inputUnit?.toLowerCase());\r\n const bytes: number = input * Math.pow(1024, indexOfUnit);\r\n\r\n\r\n // below used from https://stackoverflow.com/a/39906526\r\n\r\n let l = 0;\r\n let n = bytes || 0;\r\n\r\n while (n >= 1024 && ++l) {\r\n n = n / 1024;\r\n }\r\n\r\n return (n.toFixed(n < 10 && l > 0 ? 1 : 0) + ' ' + units[l]);\r\n }\r\n}\r\n","import { CommonModule } from \"@angular/common\";\r\nimport { NgModule, Type } from \"@angular/core\";\r\nimport { FormsModule } from \"@angular/forms\";\r\nimport { LanguageSelectorComponent } from \"./languageSelector/languageSelector.component\";\r\nimport { TranslateDirective } from \"./translate/translate.directive\";\r\n\r\nconst privateComponents: Type[] = [\r\n\r\n];\r\n\r\nconst publicComponents: Type[] = [\r\n LanguageSelectorComponent\r\n];\r\n\r\nconst publicDirectives: Type[] = [\r\n TranslateDirective\r\n];\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n FormsModule\r\n ],\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents, ...publicDirectives],\r\n exports: [...publicComponents, ...publicDirectives]\r\n})\r\nexport class TranslationDirectivesModule {\r\n constructor() {\r\n }\r\n}\r\n","import * as angular from \"angular\";\n\nexport interface ICSVParsingOptions {\n ignoreHeaderLine?: boolean;\n ignoreEmptyLines?: boolean;\n normaliseWhitespace?: boolean;\n}\n\r\n// Source http://plnkr.co/edit/y5n16v?p=preview\r\nexport class FileReaderService {\r\n\r\n static $inject = [\"$q\", \"$timeout\"];\r\n\r\n constructor(\r\n private $q: angular.IQService,\r\n private $timeout: angular.ITimeoutService) {\r\n }\r\n\r\n readAsDataUrl(file: File): angular.IPromise {\r\n const deferred = this.$q.defer();\n\n const reader = this.getReader(deferred);\n reader.readAsDataURL(file);\n\n return deferred.promise;\n }\n\n readAsText(file: File): angular.IPromise {\n const deferred = this.$q.defer();\n\n const reader = this.getReader(deferred);\n reader.readAsText(file);\n\n return deferred.promise;\n }\n\n readCSV(input: string, options?: ICSVParsingOptions): string[][] {\n const parsedArray: string[][] = [];\n const lines = input.split(/\\r?\\n|\\r/);\n\n lines.forEach((line, index) => {\n if (index == 0 && options?.ignoreHeaderLine) {\n return;\n }\n\n if (options?.normaliseWhitespace) {\n line = line.replace(/\\s\\s+/g, ' ').trim();\n }\n\n const cells = line.split(\",\");\n\n if (options?.ignoreEmptyLines) {\n if (!cells.some(c => c.length > 0)) {\n return;\n }\n }\n\n parsedArray.push(cells);\n });\n\n return parsedArray;\n }\n\n fileSizeAsString(fileSize: number): string {\n var i = 0;\n var size = fileSize;\n\n // This always make it into Kb\n while (size > 1024 || i == 0) {\n i++;\n size = size / 1024;\n }\n\n size = Math.round(size * 100) / 100;\n\n var sizeLabelArray = [\"b\", \"Kb\", \"Mb\", \"Gb\"];\n\n return `${size} ${sizeLabelArray[i]}`;\n }\n\n fileIsImage(file: File) {\n return file['type'].includes('image');\n }\n\n // -----------------------------\r\n\r\n private getReader(deferred: angular.IDeferred) {\n const reader = new FileReader();\n\n reader.onload = () => { deferred.resolve(reader.result); };\n reader.onerror = () => { deferred.reject(reader.result); };\n reader.onprogress = (event) => { deferred.notify(event); };\n\n return reader;\n };\n}\n","export function enumNames() {\r\n\r\n return (input: any) => {\r\n if (!input) {\r\n return [\"\"];\r\n }\r\n\r\n const keys = Object.keys(input);\r\n return keys.filter((key) => !Number.isInteger(key));\r\n }\r\n}\r\n","\nimport * as angular from \"angular\";\nimport { UserPreferencesService } from \"../userPreferences/service/userpreferences.service\";\n\nexport interface IAutocompleteResponse {\n results: IAutoCompleteResult[];\n}\n\nexport interface IAutoCompleteResult {\n formatted: string;\n geometry: IMapzenAutoCompleteGeometry;\n}\n\nexport interface IMapzenAutoCompleteGeometry {\n lat: number;\n lng: number;\n}\n\nexport class MapzenService {\n\n static $inject = [\"$http\", \"userPreferencesService\"];\n\n constructor(\n private readonly $http: angular.IHttpService,\n private readonly userPreferencesService: UserPreferencesService) {\n }\n\n autocomplete(text: string, countryCode: string): angular.IPromise {\n\n if (!countryCode) {\n countryCode = \"GB\";\n }\n\n if (text.length > 1) {\n return this\n .$http({\n url: `/api/map/autocomplete/${encodeURIComponent(text)}/${countryCode}`,\n method: \"GET\",\n cache: true,\n params: { minsToLive: 60 }\n })\n .then((response: angular.IHttpPromiseCallbackArg) => {\n return response.data;\n });\r\n }\n\n }\n}\n","export enum ReportTypesNavLabels {\r\n All,\r\n User,\r\n Shared,\r\n System\r\n}\r\n","import { OverlayRef } from '@angular/cdk/overlay';\r\nimport { TemplateRef, Type } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\n\r\nexport interface OverlayCloseEvent {\r\n type: 'backdropClick' | 'close';\r\n data: R;\r\n}\r\n\r\n// R = Response Data Type, T = Data passed to Modal Type\r\nexport class VDialogRef {\r\n afterClosed$ = new Subject>();\r\n\r\n constructor(\r\n public overlay: OverlayRef,\r\n public content: string | TemplateRef | Type,\r\n public data: T // pass data to modal i.e. FormData\r\n ) {\r\n overlay.backdropClick().subscribe(() => this._close('backdropClick', null));\r\n }\r\n\r\n close(data?: R): void {\r\n this._close('close', data);\r\n }\r\n\r\n private _close(type: 'backdropClick' | 'close', data: R): void {\r\n this.overlay.dispose();\r\n this.afterClosed$.next({\r\n type,\r\n data\r\n });\r\n\r\n this.afterClosed$.complete();\r\n }\r\n}\r\n","import { ConstantsService } from \"@services/constantsService\";\r\n\r\nexport interface IDeviceInfo {\r\n DeviceId: number;\r\n IMEI: string;\r\n SerialNumber: string;\r\n ICCID: string;\r\n DeviceTypeId: number;\r\n DeviceTypeName: string;\r\n IsAutoDeployment: boolean;\r\n FirmwareName: string;\r\n FirstConnected: Date;\r\n LastConnected: Date;\r\n FootageStart: Date;\r\n LastIgnitionChangeTime: Date;\r\n SDCardLabel: string;\r\n SDCardModel: string;\r\n SDCardSerial: string;\r\n SDCardSizeMB: number;\r\n SDCardAvailableMB: number;\r\n InternalMemoryMB: number;\r\n InternalMemoryAvailableMB: number;\r\n NetworkOperator: string;\r\n NetworkAccessPoint: string;\r\n Lat: number;\r\n Lon: number;\r\n Speed: number;\r\n Heading: number;\r\n SatCount: number;\r\n GPSAccuracy: number;\r\n SupportedChannelCount: number;\r\n AvailableChannels: string;\r\n CameraLatestVideos: IS3VideoFile[];\r\n UpdaterId: number;\r\n UpdaterVersion: string;\r\n UpdaterInstallDate: Date;\r\n TelematicsId: number;\r\n TelematicsVersion: string;\r\n TelematicsInstallDate: Date;\r\n ConfigId: number;\r\n ConfigName: string;\r\n ConfigFileInstallDate: Date;\r\n UpdaterRequestedId: number;\r\n UpdaterRequestedVersion: string;\r\n UpdaterRequestedDate: Date;\r\n UpdaterRequestedStatusId: number;\r\n UpdaterRequestedStatusName: string;\r\n UpdaterRequestorUserName: string;\r\n TelematicsRequestedId: number;\r\n TelematicsRequestedName: string;\r\n TelematicsRequestedDate: Date;\r\n TelematicsRequestedStatusId: number;\r\n TelematicsRequestedStatusName: string;\r\n TelematicsRequestorUserName: string;\r\n ConfigRequestedId: number;\r\n ConfigRequestedName: string;\r\n ConfigRequestedDate: Date;\r\n ConfigRequestedStatusId: number;\r\n ConfigRequestedStatusName: string;\r\n ConfigRequestorUserName: string;\r\n ProdUpdaterId: number;\r\n ProdUpdaterVersion: string;\r\n ProdTelematicsId: number;\r\n ProdTelematicsVersion: string\r\n}\r\n\r\nexport interface ICameraSimStatus {\r\n ICCID: string;\r\n SimPlan: string;\r\n ReportGroup: number;\r\n SimRestrictions: string;\r\n SimState: string;\r\n LastDataSessionTime: Date;\r\n IsRegistered: boolean;\r\n UsageMB: number;\r\n\r\n // ---\r\n isActive: boolean;\r\n}\r\n\r\nexport interface IConfigurationUpdateRequest {\r\n DeviceId: number;\r\n ConfigFileId: number;\r\n}\r\n\r\nexport interface IConfigurationFile {\r\n Archived: boolean;\r\n ConfigFileId: number;\r\n ConfigFileUniqueId: string;\r\n ConfigFileName: string;\r\n DeviceTypeId: number;\r\n Url: string;\r\n}\r\n\r\n\r\nexport interface IConfigurationUpdate {\r\n DeviceId: number;\r\n IMEI: string;\r\n DeviceType: string;\r\n Description: string;\r\n RequestedDate: Date;\r\n InstalledDate: Date;\r\n RequestedUserId: string;\r\n RequestedUserName: string;\r\n Status: string;\r\n}\r\n\r\nexport interface IS3VideoFile {\r\n\r\n FileName: string;\r\n PresignedUrl: string;\r\n\r\n UploadDate: string;\r\n ThumbnailUrl: string;\r\n}\r\n\r\nexport interface ISetAutoUpdateModeRequest {\r\n DeviceId: number;\r\n IsAutoDeployment: boolean;\r\n}\r\n\r\nexport class CameraCommunicationServer {\r\n\r\n apiUrl: string;\r\n\r\n static $inject = [\"$http\", \"$q\", \"constantsService\"];\r\n\r\n constructor(\r\n private readonly $http: angular.IHttpService,\r\n private readonly $q: angular.IQService,\r\n private readonly constantsService: ConstantsService\r\n ) {\r\n this.apiUrl = this.constantsService.getApiUrl();\r\n }\r\n\r\n getDeviceInfo(serial: string): angular.IPromise {\r\n if (!serial) {\r\n console.warn(\"No serial passed into getDeviceInfo\");\r\n return this.$q.when(null);\r\n }\r\n\r\n return this.$http({\r\n url: `/api/communicationServer/device/${serial}/info`,\r\n method: \"GET\",\r\n cache: false\r\n }).then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n GetSimStatus(iccid: string): angular.IPromise {\r\n return this.$http({\r\n url: `/api/communicationServer/sim/${iccid}`,\r\n method: \"GET\",\r\n cache: false\r\n }).then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getAvailableConfigFiles(deviceTypeId: number, includeArchived: boolean): angular.IPromise {\r\n return this.$http({\r\n url: `/api/communicationServer/config/${deviceTypeId}/files`,\r\n method: \"GET\",\r\n params: {\r\n includeArchived\r\n },\r\n cache: false\r\n }).then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n postConfigUpdate(update: IConfigurationUpdateRequest): angular.IPromise {\r\n return this.$http({\r\n url: `/api/communicationServer/config`,\r\n method: \"POST\",\r\n data: update,\r\n params: { minsToLive: 30 }\r\n });\r\n }\r\n\r\n setAutoUpdateMode(request: ISetAutoUpdateModeRequest): angular.IPromise {\r\n return this.$http({\r\n url: `/api/communicationServer/autoUpdateMode`,\r\n method: \"POST\",\r\n data: request,\r\n params: { minsToLive: 30 }\r\n });\r\n }\r\n\r\n getConfigurationUpdateHistory(deviceId: number): angular.IPromise {\r\n return this.$http({\r\n url: `/api/communicationServer/device/${deviceId}/configHistory`,\r\n method: \"GET\",\r\n cache: false\r\n }).then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n}\r\n","import { TransitionService } from \"@uirouter/angularjs\";\r\n\r\nexport interface IThemeDefinition {\r\n name: string;\r\n\r\n accentColourLightest: string;\r\n accentColourLighter: string;\r\n accentColour: string;\r\n accentColourDarker: string;\r\n accentColourDarkest: string;\r\n\r\n bodyClass?: string;\r\n favIcon?: string;\r\n}\r\n\r\nexport class ThemeService {\r\n\r\n currentTheme: IThemeDefinition;\r\n private themes: IThemeDefinition[] = [];\r\n readonly defaultThemeName = \"default\";\r\n\r\n static $inject = [\"$document\", \"$transitions\"];\r\n\r\n constructor(private readonly $document: angular.IDocumentService, private readonly $transitions: TransitionService) {\r\n\r\n $transitions.onEnter({}, (transition, state) => {\r\n if (state.data) {\r\n\r\n this.setTheme(state.data.theme);\r\n }\r\n });\r\n\r\n this.createThemes();\r\n this.setTheme(null);\r\n }\r\n\r\n // ---\r\n\r\n private setTheme(themeName = this.defaultThemeName) {\r\n var newTheme = this.themes.find(t => t.name == themeName) || this.themes[0];\r\n\r\n var previousTheme = this.currentTheme;\r\n this.currentTheme = newTheme;\r\n\r\n if (previousTheme?.bodyClass) {\r\n this.$document[0].body.classList.remove(previousTheme.bodyClass);\r\n }\r\n\r\n if (this.$document) {\r\n\r\n this.$document[0].body.style.setProperty(\"--accent-color-lightest\", this.currentTheme.accentColourLightest);\r\n this.$document[0].body.style.setProperty(\"--accent-color-lighter\", this.currentTheme.accentColourLighter);\r\n this.$document[0].body.style.setProperty(\"--accent-color\", this.currentTheme.accentColour); // rgb(255,110,64)\r\n this.$document[0].body.style.setProperty(\"--accent-color-darker\", this.currentTheme.accentColourDarker);\r\n this.$document[0].body.style.setProperty(\"--accent-color-darkest\", this.currentTheme.accentColourDarkest);\r\n\r\n if (this.currentTheme.bodyClass) {\r\n this.$document[0].body.classList.add(this.currentTheme.bodyClass);\r\n }\r\n }\r\n\r\n this.changeFavicon(newTheme.favIcon || \"/assets/images/logos/addsecure-favicon-32.ico\");\r\n }\r\n\r\n private createThemes() {\r\n var defaultTheme: IThemeDefinition = {\r\n name: this.defaultThemeName,\r\n accentColourLightest: \"rgba(255,110,64 ,.5)\",\r\n accentColourLighter: \"rgba(255,110,64,.7)\",\r\n accentColour: \"rgb(255,110,64)\",\r\n accentColourDarker: \"#ff5620\",\r\n accentColourDarkest: \"#ff3e00\",\r\n bodyClass: \"valkyrie\"\r\n }\r\n\r\n var addSecureTheme: IThemeDefinition = {\r\n name: \"AddSecure\",\r\n accentColourLightest: \"rgba(0, 76, 147 ,.5)\",\r\n accentColourLighter: \"rgba(0, 76, 147,.7)\",\r\n accentColour: \"rgb(0, 76, 147)\",\r\n accentColourDarker: \"#004484\",\r\n accentColourDarkest: \"#003d76\",\r\n bodyClass: \"foundation\",\r\n favIcon: \"/assets/images/logos/addsecure-favicon-32.ico\"\r\n }\r\n\r\n // Default theme now uses AST colours\r\n defaultTheme.accentColourLightest = addSecureTheme.accentColourLightest;\r\n defaultTheme.accentColourLighter = addSecureTheme.accentColourLighter;\r\n defaultTheme.accentColour = addSecureTheme.accentColour;\r\n defaultTheme.accentColourDarker = addSecureTheme.accentColourDarker;\r\n defaultTheme.accentColourDarkest = addSecureTheme.accentColourDarkest;\r\n\r\n this.themes.push(defaultTheme);\r\n this.themes.push(addSecureTheme);\r\n\r\n // https://mdigi.tools/darken-color/#004c93\r\n // https://www.colorhexa.com/004c93\r\n }\r\n\r\n private changeFavicon(faviconUrl: string) {\r\n const link = document.createElement('link');\r\n\r\n const oldLinks = document.querySelectorAll('link[rel=\"icon\"]');\r\n oldLinks.forEach(e => e.parentNode.removeChild(e));\r\n\r\n link.id = 'dynamic-favicon';\r\n link.rel = 'icon';\r\n link.href = faviconUrl;\r\n document.head.appendChild(link);\r\n }\r\n\r\n private changeFaviconUsingCanvas(text) {\r\n //this.changeFavicon('❤️');\r\n const canvas = document.createElement('canvas');\r\n canvas.height = 64;\r\n canvas.width = 64;\r\n const ctx = canvas.getContext('2d');\r\n ctx.font = '64px serif';\r\n ctx.fillText(text, 0, 64);\r\n\r\n const link = document.createElement('link');\r\n const oldLinks = document.querySelectorAll('link[rel=\"shortcut icon\"]');\r\n oldLinks.forEach(e => e.parentNode.removeChild(e));\r\n link.id = 'dynamic-favicon';\r\n link.rel = 'shortcut icon';\r\n link.href = canvas.toDataURL();\r\n document.head.appendChild(link);\r\n }\r\n}\r\n","import { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport * as angular from \"angular\";\r\nimport * as moment from \"moment\";\r\nimport { DataValidationStatus, IVehicleData } from \"./IVehicleData\";\r\n\r\nexport class VehicleDataService {\r\n\r\n static $inject = [\"$http\",\"veriDate\"];\r\n\r\n constructor(private $http: angular.IHttpService, private readonly veriDate: VeriDate) {\r\n }\r\n\r\n getVehicleData(): angular.IPromise {\r\n return this.$http(\r\n {\r\n method: \"GET\",\r\n url: \"/api/vehicledata/\"\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\n }\r\n\r\n getDataForVehicle(id: number): angular.IPromise {\r\n return this.$http(\r\n {\r\n method: \"GET\",\r\n url: `/api/vehicledata/${id}`\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n //updateFleetData(): angular.IPromise {\r\n // return this.$http(\r\n // {\r\n // method: \"GET\",\r\n // url: \"/api/vehicledata/update\"\r\n // })\r\n // .then(() => {\r\n // return;\r\n // });\r\n //}\r\n\r\n findVehicleData(vehicleId: number, vehicleData: IVehicleData[]): IVehicleData {\r\n for (var i = 0; i < vehicleData.length; i++) {\r\n const data = vehicleData[i];\r\n\r\n if (data.VehicleId == vehicleId) {\r\n return data;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n calculateMOTAndTaxStatus(vehicle: IVehicle, vehicleData: IVehicleData): any {\n if (!vehicleData) {\n return;\n }\r\n\n vehicle.vehicleData = vehicleData;\r\n\r\n var threeWeeksFromNow = moment().add(3, \"weeks\");\r\n\r\n vehicle.vehicleData.motExpirationStatus = DataValidationStatus.NoDetailsFound;\r\n vehicle.vehicleData.taxExpirationStatus = DataValidationStatus.NoDetailsFound;\r\n\r\n if (vehicle.vehicleData.MotExpiry) {\r\n\r\n var motExpiryMoment = this.veriDate.createMoment(vehicle.vehicleData.MotExpiry);\r\n \r\n if (moment().isAfter(motExpiryMoment)) {\r\n vehicle.vehicleData.motExpirationStatus = DataValidationStatus.Expired;\r\n }\r\n else if (threeWeeksFromNow.isAfter(motExpiryMoment)) {\r\n vehicle.vehicleData.motExpirationStatus = DataValidationStatus.DueSoon;\r\n }\r\n else {\r\n vehicle.vehicleData.motExpirationStatus = DataValidationStatus.Valid;\r\n }\r\n }\r\n\r\n if (vehicle.vehicleData.TaxExpiry) {\r\n\r\n var taxExpiryMoment = this.veriDate.createMoment(vehicle.vehicleData.TaxExpiry);\r\n\r\n if (moment().isAfter(taxExpiryMoment)) {\r\n vehicle.vehicleData.taxExpirationStatus = DataValidationStatus.Expired;\r\n }\r\n else if (threeWeeksFromNow.isAfter(taxExpiryMoment)) {\r\n vehicle.vehicleData.taxExpirationStatus = DataValidationStatus.DueSoon;\r\n }\r\n else {\r\n vehicle.vehicleData.taxExpirationStatus = DataValidationStatus.Valid;\r\n }\r\n }\r\n }\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { Observable } from \"rxjs\";\r\n\r\nexport interface ISamlConfiguration {\r\n UserId?: number;\r\n AccountId?: number;\r\n\r\n Domain: string;\r\n Endpoint: string;\r\n EntityId: string;\r\n Certificate: string;\r\n\r\n VerificationStatus?: SamlConfigurationVerificationStatus;\r\n Status?: SamlConfigurationStatus;\r\n VerificationIdentifier?: string;\r\n VerificationTime?: Date;\r\n AssertionConsumerUrl?: string;\r\n}\r\n\r\nexport enum SamlConfigurationStatus {\r\n Testing,\r\n Active,\r\n Inactive\r\n}\r\n\r\nexport enum SamlConfigurationVerificationStatus {\r\n Requested,\r\n Verified\r\n}\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class SamlService {\r\n\r\n constructor(\r\n private readonly http: HttpClient) {\r\n }\r\n\r\n getConfiguration(): Observable {\r\n return this.http.get(`/api/sso/configuration`);\r\n }\r\n\r\n saveConfiguration(config: ISamlConfiguration): Observable {\r\n\r\n if (!config.VerificationIdentifier) {\r\n return this.createInitialConfiguration(config);\r\n }\r\n\r\n return this.http.post(`/api/sso/configuration`, config);\r\n }\r\n\r\n validateTXTRecord(domain: string): Observable {\r\n const formData = new FormData()\r\n formData.append(\"domain\", domain);\r\n\r\n return this.http.post(\"/api/sso/configuration/verify\", formData);\r\n }\r\n\r\n private createInitialConfiguration(config: ISamlConfiguration): Observable {\r\n return this.http.post(`/api/sso/configuration`, config);\r\n }\r\n}\r\n","import { IGeofence } from \"@interfaces/IGeofences\";\r\nimport { IJourney } from \"@interfaces/IJourney\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { IGroup } from \"@interfaces/IVehicleGroup\";\r\nimport { GeofenceService, IGeofenceVisit } from \"@services/geofence.service\";\r\nimport { GroupService } from \"@services/group.service.ajs\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport * as moment from \"moment\";\r\n\r\nexport interface IVehicleUtilisationRecord {\r\n vehicle?: IVehicle;\r\n\r\n homeGeofence?: IGeofence;\r\n geofenceVisits?: IGeofenceVisit[];\r\n\r\n journeys?: IJourney[];\r\n\r\n utilisationRecords: IVehicleUtilisationPeriod[];\r\n utilisationPercentage: number;\r\n}\r\n\r\ninterface IDatedPeriod {\r\n Id: number;\r\n StartUtc: string;\r\n EndUtc: string;\r\n}\r\n\r\nexport interface IVehicleUtilisationPeriod {\r\n id: number;\r\n left: number;\r\n width: number;\r\n color: string;\r\n tooltip: string;\r\n startMoment: moment.Moment;\r\n endMoment: moment.Moment;\r\n}\r\n\r\nexport class UtilisationService {\r\n static $inject = [\"geofenceService\", \"groupService\", \"veriDate\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly geofenceService: GeofenceService,\r\n private readonly groupService: GroupService,\r\n private readonly veriDate: VeriDate,\r\n private readonly translationService: TranslationService\r\n ) {\r\n }\r\n\r\n createUtilisationRecordsForJourneys(startDate: Date, endDate: Date, vehicles: IVehicle[], journeys: IJourney[]): IVehicleUtilisationRecord[] {\r\n var vehicleUtilisationRecords: IVehicleUtilisationRecord[] = [];\r\n\r\n vehicles.forEach(v => {\r\n const utilisationRecord = this.createJourneyUtilisationRecordForVehicle(startDate, endDate, v, journeys);\r\n vehicleUtilisationRecords.push(utilisationRecord);\r\n });\r\n\r\n this.orderUtilisationRecords(vehicleUtilisationRecords);\r\n\r\n return vehicleUtilisationRecords;\r\n }\r\n\r\n createUtilisationRecordsForDepots(startDate: Date, endDate: Date, groups: IGroup[], vehicles: IVehicle[], geofenceVisits: IGeofenceVisit[], geofences: IGeofence[]): IVehicleUtilisationRecord[] {\r\n var vehicleUtilisationRecords: IVehicleUtilisationRecord[] = [];\r\n\r\n const depotsWithHomeLocations = this.groupService.findDepotsWithHomeLocations(groups);\r\n const visitsToDepotsOrHomeLocations = this.geofenceService.findGeofenceVisitsToDepotsOrHomeLocations(geofenceVisits, depotsWithHomeLocations);\r\n\r\n vehicles.forEach(v => {\r\n\r\n const utilisationRecord = this.createDepotUtilisationRecordForVehicle(startDate, endDate, v, visitsToDepotsOrHomeLocations);\r\n const vehicleDepots = this.groupService.findGroupIdsAssetBelongsTo(depotsWithHomeLocations, v.Id, \"VehicleIds\");\r\n\r\n // Specify geofence\r\n if (utilisationRecord.vehicle.GeofenceId) {\r\n utilisationRecord.homeGeofence = this.geofenceService.findGeofence(geofences, utilisationRecord.vehicle.GeofenceId);\r\n }\r\n else if (vehicleDepots.length > 0) {\r\n const vehicleDepot = this.groupService.findGroup(depotsWithHomeLocations, vehicleDepots[0]);\r\n utilisationRecord.homeGeofence = this.geofenceService.findGeofence(geofences, vehicleDepot.GeofenceId);\r\n }\r\n else {\r\n // If we have no depot or home location set, clear the list\r\n utilisationRecord.utilisationRecords = [];\r\n utilisationRecord.utilisationPercentage = 0;\r\n }\r\n\r\n vehicleUtilisationRecords.push(utilisationRecord);\r\n });\r\n\r\n this.orderUtilisationRecords(vehicleUtilisationRecords);\r\n\r\n return vehicleUtilisationRecords;\r\n }\r\n\r\n orderUtilisationRecords(vehicleUtilisationRecords: IVehicleUtilisationRecord[]) {\r\n\r\n // Show most utilised first\r\n vehicleUtilisationRecords.sort((x, y) => {\r\n var totalWidth1 = x.utilisationRecords.reduce((prev, cur) => prev + cur.width, 0);\r\n var totalWidth2 = y.utilisationRecords.reduce((prev, cur) => prev + cur.width, 0);\r\n\r\n return totalWidth2 - totalWidth1;\r\n });\r\n }\r\n\r\n // ---\r\n\r\n private createJourneyUtilisationRecordForVehicle(startDate: Date, endDate: Date, vehicle: IVehicle, journeys: IJourney[]): IVehicleUtilisationRecord {\r\n const vehicleJourneys = journeys.filter(journey => journey.VehicleId == vehicle.Id && this.validateJourney(journey));\r\n\r\n const vu: IVehicleUtilisationRecord = {\r\n vehicle: vehicle,\r\n journeys: vehicleJourneys,\r\n utilisationRecords: [],\r\n utilisationPercentage: 0\r\n };\r\n\r\n var startOfRange = this.veriDate.createMoment(startDate);\r\n var endOfRange = this.veriDate.createMoment(endDate);\r\n var minutesInRange = endOfRange.diff(startOfRange, \"minutes\");\r\n\r\n\r\n var previousJourney: IJourney = null;\r\n vehicleJourneys.forEach(journey => {\r\n\r\n this.createAndUpdateUtilisationRecord(vu, previousJourney, journey, startOfRange, endOfRange, minutesInRange);\r\n\r\n previousJourney = journey;\r\n });\r\n\r\n return vu;\r\n }\r\n\r\n private createDepotUtilisationRecordForVehicle(startDate: Date, endDate: Date, vehicle: IVehicle, geofenceVisits: IGeofenceVisit[]): IVehicleUtilisationRecord {\r\n const vehicleGeofenceVisits = geofenceVisits.filter(geofenceVisit => geofenceVisit.VehicleId == vehicle.Id && this.validateGeofenceVisit(geofenceVisit));\r\n\r\n var vu: IVehicleUtilisationRecord = {\r\n vehicle: vehicle,\r\n geofenceVisits: vehicleGeofenceVisits,\r\n utilisationRecords: [],\r\n utilisationPercentage: 0\r\n };\r\n\r\n const startOfRange = this.veriDate.createMoment(startDate);\r\n const endOfRange = this.veriDate.createMoment(endDate);\r\n const minutesInRange = endOfRange.diff(startOfRange, \"minutes\");\r\n\r\n var previousGeofenceVisit: IGeofenceVisit = null;\r\n vehicleGeofenceVisits.forEach(geofenceVisit => {\r\n\r\n this.createAndUpdateUtilisationRecord(vu, previousGeofenceVisit, geofenceVisit, startOfRange, endOfRange, minutesInRange, true);\r\n\r\n previousGeofenceVisit = geofenceVisit;\r\n });\r\n\r\n if (!previousGeofenceVisit || endOfRange.isAfter(previousGeofenceVisit.EndUtc)) {\r\n\r\n this.createAndUpdateUtilisationRecord(vu, previousGeofenceVisit, null, startOfRange, endOfRange, minutesInRange, true);\r\n }\r\n\r\n return vu;\r\n }\r\n\r\n private createAndUpdateUtilisationRecord(vu: IVehicleUtilisationRecord, previousPeriod: IDatedPeriod, datedPeriod: IDatedPeriod, startOfRange: moment.Moment, endOfRange: moment.Moment, minutesInRange: number, reverse = false) {\r\n\r\n if (!previousPeriod && !datedPeriod) {\r\n return;\r\n }\r\n\r\n let startMoment: moment.Moment;\r\n let endMoment: moment.Moment;\r\n\r\n if (reverse) {\r\n if (previousPeriod && previousPeriod.EndUtc) {\r\n startMoment = this.veriDate.createMoment(previousPeriod.EndUtc);\r\n }\r\n else {\r\n startMoment = previousPeriod ? endOfRange : startOfRange;\r\n }\r\n\r\n if (datedPeriod && this.veriDate.createMoment(datedPeriod.StartUtc).isBefore(startOfRange)) {\r\n endMoment = startOfRange;\r\n }\r\n else {\r\n endMoment = datedPeriod ? this.veriDate.createMoment(datedPeriod.StartUtc) : endOfRange;\r\n }\r\n }\r\n else {\r\n startMoment = this.veriDate.createMoment(datedPeriod.StartUtc);\r\n endMoment = this.veriDate.createMoment(datedPeriod.EndUtc);\r\n }\r\n\r\n // Clamp to end of range\r\n if (endMoment.isAfter(endOfRange)) {\r\n endMoment = endOfRange.clone();\r\n }\r\n\r\n const jobToleranceWidth = 0.05;\r\n const period = this.createUtilisationRecord(startMoment, endMoment, startOfRange, minutesInRange, datedPeriod ? datedPeriod.Id : -1);\r\n if (period.width >= jobToleranceWidth) {\r\n\r\n vu.utilisationRecords.push(period);\r\n }\r\n\r\n vu.utilisationPercentage += period.width;\r\n }\r\n\r\n private createUtilisationRecord(startMoment: moment.Moment, endMoment: moment.Moment, startOfRange: moment.Moment, minutesInRange: number, id?: number): IVehicleUtilisationPeriod {\r\n const diffMinutesStart = startMoment.diff(startOfRange, 'minutes');\r\n const diffMinutesEnd = endMoment.diff(startOfRange, 'minutes');\r\n const diffMinutesWidth = diffMinutesEnd - diffMinutesStart;\r\n\r\n const left = diffMinutesStart / minutesInRange * 100;\r\n let width = diffMinutesWidth / minutesInRange * 100;\r\n\r\n if (left + width > 100) {\r\n width -= left + width - 100;\r\n }\r\n\r\n if (width < 0) {\r\n width = 0;\r\n }\r\n\r\n const period: IVehicleUtilisationPeriod = {\r\n id: id,\r\n left: left,\r\n width: width,\r\n color: \"blue\",\r\n tooltip: this.translationService.t('utilisationService.utilised', [this.veriDate.formatDate(startMoment), this.veriDate.formatDate(endMoment)]),\r\n startMoment: startMoment,\r\n endMoment: endMoment\r\n };\r\n\r\n return period;\r\n }\r\n\r\n private validateGeofenceVisit(geofenceVisit: IGeofenceVisit): boolean {\r\n\r\n const startTime = new Date(geofenceVisit.StartUtc);\r\n const endTime = geofenceVisit.EndUtc ? new Date(geofenceVisit.EndUtc) : new Date();\r\n return endTime.getTime() - startTime.getTime() >= 0;\r\n }\r\n\r\n private validateJourney(journey: IJourney): boolean {\r\n\r\n const startTime = new Date(journey.StartUtc);\r\n const endTime = journey.EndUtc ? new Date(journey.EndUtc) : new Date();\r\n return endTime.getTime() - startTime.getTime() >= 0;\r\n }\r\n}\r\n","import { Component, ElementRef, EventEmitter, HostBinding, HostListener, Input, OnChanges, OnDestroy, OnInit, Output, QueryList, SimpleChanges, ViewChildren } from \"@angular/core\";\r\nimport { VVehicleVideoStreamComponent } from \"@app/directives/_vehicle/VehicleVideoStream/v-vehicle-video-stream.component\";\r\nimport { CameraLocation } from \"@app/main/components/videos/enums/CameraLocation\";\r\nimport { VideoStreamType } from \"@app/main/components/videos/enums/VideoStreamType\";\r\nimport { FtCloudStreamType, ICameraChannel, IVideoStream } from \"@app/main/components/videos/models/ICameraChannel\";\r\nimport { IVideoAccelerometerData } from \"@app/main/components/videos/models/IVideoAccelerometerData\";\r\nimport { CameraService } from \"@app/main/components/videos/services/camera.service\";\r\nimport { ConstantsService } from \"@app/services/constantsService\";\r\nimport { DateService, DateUnit } from \"@app/services/date.service\";\r\nimport { FullScreenService } from \"@app/services/fullscreen.service\";\r\nimport { animFadeInOut } from \"@app/styles/animations/fade-in-fade-out.animation\";\r\nimport { UntilDestroy } from \"@ngneat/until-destroy\";\r\nimport { Subject } from \"rxjs\";\r\nimport { VideoStreamService } from \"./stream.service\";\r\nimport './v-stream-collection.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'v-stream-collection',\r\n template: require('./v-stream-collection.component.html'),\r\n animations: [animFadeInOut]\r\n})\r\nexport class VStreamCollectionComponent implements OnInit, OnChanges, OnDestroy {\r\n @Input() channels: IVideoStream[];\r\n @Input() highQuality: boolean;\r\n @Input() vehicleId: number;\r\n @Input() availableStreamQualities: VideoStreamType[];\r\n @Input() timeoutOnMouseIdle: boolean;\r\n @Input() streamTime: Date;\r\n @Input() isPreview = true;\r\n @Input() hideSkipControls = false;\r\n\r\n @Output() videoPlayStateChange = new EventEmitter();\r\n @Output() videoTimedOut = new EventEmitter();\r\n @Output() videoMediaReceived = new EventEmitter();\r\n @Output() cameraUnavailable = new EventEmitter();\r\n @Output() restartStreams = new EventEmitter();\r\n @Output() timeChanged = new EventEmitter();\r\n\r\n @ViewChildren('videoStream') vStreamComponents: QueryList;\r\n @HostListener('mousemove', ['$event'])\r\n\r\n mousemove($event): void {\r\n this.streamService.resetStreamTimeout();\r\n }\r\n\r\n //--\r\n\r\n allPreviewStreams: IVideoStream[];\r\n playbackStreams: IVideoStream[];\r\n\r\n streamUpdated = new Subject();\r\n\r\n fitToFrame = false;\r\n isZoomed = false;\r\n\r\n showPlaybackSpeedOptions = false;\r\n vertical = false;\r\n fullscreen = false;\r\n ignore = false;\r\n\r\n isPlaying = false;\r\n firstPlaybackStarted: boolean;\r\n videoErrored: boolean;\r\n videoHasTimedOut: boolean;\r\n\r\n cameraChannels: ICameraChannel[];\r\n\r\n currentAccelerometerData: IVideoAccelerometerData;\r\n\r\n CameraLocation = CameraLocation;\r\n\r\n @HostBinding('class.is-mobile') isMobile: boolean;\r\n\r\n rafNumber: number;\r\n lastMedianPlayTime: number;\r\n animateCallCount = 0;\r\n actualAnimationCount = 0;\r\n\r\n showVideoControls: boolean;\r\n\r\n previewStreamType: FtCloudStreamType;\r\n\r\n controlsTimeout: ReturnType;\r\n ignoreTimeout: ReturnType;\r\n\r\n loadingStreams: boolean;\r\n\r\n constructor(\r\n private readonly el: ElementRef,\r\n private readonly constantsService: ConstantsService,\r\n private readonly cameraService: CameraService,\r\n private readonly dateService: DateService,\r\n private readonly fullScreenService: FullScreenService,\r\n private readonly streamService: VideoStreamService) { }\r\n\r\n ngOnDestroy(): void {\r\n this.clearAllTimeouts();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.initialise();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n \r\n if (changes['channels']) {\r\n this.setVisibleChannelsForLiveView();\r\n this.setMainChannel();\r\n this.matchChannelsToStreams();\r\n }\r\n\r\n if (changes['channels'] && !changes['channels'].firstChange && this.isPlaying && this.channelAdded(changes['channels'].previousValue, changes['channels'].currentValue) && this.isPreview) {\r\n this.restart();\r\n }\r\n\r\n if (this.playbackStreams && changes[\"highQuality\"] && changes[\"highQuality\"].currentValue != changes[\"highQuality\"].previousValue) {\r\n this.updateStreamQuality();\r\n }\r\n\r\n if (changes['streamTime']) {\r\n this.seekPreview();\r\n }\r\n }\r\n\r\n showFullscreen(): void {\r\n this.fullscreen = this.fullScreenService.toggle(this.el.nativeElement);\r\n }\r\n\r\n onVideoTimedOut(): void {\r\n this.videoHasTimedOut = true;\r\n this.videoTimedOut.emit();\r\n }\r\n\r\n onVideoReceivedMedia(data: any): void {\r\n this.videoErrored = false;\r\n this.showVideoControls = true;\r\n this.videoMediaReceived.emit(data);\r\n this.emitIsPlaying(this.isPlaying);\r\n }\r\n\r\n onCameraUnavailable(camera: IVideoStream): void {\r\n this.playbackStreams.find(stream => stream == camera).errored = true;\r\n\r\n const remainingStreams = this.playbackStreams.filter(stream => {\r\n return stream !== camera && !stream.errored;\r\n });\r\n\r\n if (!remainingStreams.length) {\r\n this.videoErrored = true;\r\n }\r\n\r\n this.cameraUnavailable.emit(camera);\r\n }\r\n\r\n getNewUrl(channel: IVideoStream): void {\r\n if (!this.vehicleId) {\r\n throw new Error(\"No VehicleId provided to component.\");\r\n }\r\n\r\n const streamType = this.highQuality\r\n ? FtCloudStreamType.Mainstream\r\n : FtCloudStreamType.Substream;\r\n\r\n this.cameraService.getLiveStreamUrls(this.vehicleId, { StreamType: streamType })\r\n .then((channels) => {\r\n this.streamUpdated.next(channels.find(c => c.ChannelId == channel.ChannelId));\r\n })\r\n }\r\n\r\n focusStream(channel: IVideoStream): void {\r\n this.playbackStreams.forEach(c => {\r\n c.focused = false;\r\n });\r\n\r\n channel.focused = true;\r\n }\r\n\r\n emitIsPlaying(isPlaying: boolean): void {\r\n this.firstPlaybackStarted = true;\r\n this.isPlaying = isPlaying;\r\n\r\n this.videoPlayStateChange.emit(isPlaying);\r\n }\r\n\r\n startPreviewClicked(): void {\r\n if (this.allPreviewStreams?.length || !this.isPreview) {\r\n this.play();\r\n return;\r\n }\r\n\r\n this.getHistoricalStreamUrls();\r\n }\r\n\r\n play(): void {\r\n if (!this.vStreamComponents || this.ignore) {\r\n return;\r\n }\r\n\r\n this.vStreamComponents.toArray().forEach(video => {\r\n video.play();\r\n });\r\n\r\n this.isPlaying = true;\r\n this.setIgnore();\r\n }\r\n\r\n pause(): void {\r\n if (!this.vStreamComponents) {\r\n return;\r\n }\r\n\r\n let playerExists = false;\r\n\r\n this.vStreamComponents.toArray().forEach(video => {\r\n if (!video.flvPlayer.player) {\r\n return;\r\n }\r\n\r\n playerExists = true;\r\n video.flvPlayer.player.pause();\r\n });\r\n\r\n if (!playerExists) {\r\n return;\r\n }\r\n\r\n this.isPlaying = false;\r\n this.setIgnore();\r\n }\r\n\r\n async skip(time: number): Promise {\r\n if (!this.playbackStreams?.length || this.ignore) {\r\n return;\r\n }\r\n\r\n this.showVideoControls = false;\r\n\r\n this.setIgnore(2000);\r\n\r\n this.streamTime = this.dateService.addOrSubtractTime(this.streamTime, time, DateUnit.Sec);\r\n\r\n this.timeChanged.emit(this.streamTime);\r\n }\r\n\r\n restart(): void {\r\n this.videoErrored = false;\r\n this.playbackStreams.forEach(stream => stream.errored = false);\r\n this.showVideoControls = false;\r\n this.playbackStreams = [];\r\n this.getHistoricalStreamUrls();\r\n this.restartStreams.emit();\r\n }\r\n\r\n // ---\r\n\r\n private channelAdded(previousCameraChannels: ICameraChannel[], currentCameraChannels: ICameraChannel[]): boolean {\r\n return previousCameraChannels.length < currentCameraChannels.length;\r\n }\r\n\r\n private async seekPreview(): Promise {\r\n if (!this.playbackStreams?.length) {\r\n return;\r\n }\r\n\r\n await this.restart();\r\n }\r\n\r\n private getHistoricalStreamUrls(): void {\r\n this.videoErrored = false;\r\n\r\n if (!this.isPreview) {\r\n return;\r\n }\r\n\r\n this.loadingStreams = true;\r\n\r\n this.previewStreamType = (this.availableStreamQualities?.includes(VideoStreamType.Sub))\r\n ? FtCloudStreamType.Substream\r\n : FtCloudStreamType.Mainstream;\r\n\r\n this.cameraService.getPlaybackUrls(this.vehicleId, { Length: 120 * 60, Start: this.streamTime, StreamType: this.previewStreamType }).then(streams => {\r\n if (!streams?.length) {\r\n console.error(\"No streams found for vehicle\");\r\n return;\r\n }\r\n\r\n if (!this.channels?.length) {\r\n console.error(\"No active channels found for vehicle\", this.channels);\r\n return;\r\n }\r\n\r\n this.allPreviewStreams = this.cameraService.filterDuplicateVideoStreams(streams).filter(stream => stream.IsActive);\r\n\r\n this.matchChannelsToStreams()\r\n this.setMainChannel();\r\n\r\n this.play();\r\n this.loadingStreams = false;\r\n });\r\n }\r\n\r\n private matchChannelsToStreams() {\r\n if (!this.allPreviewStreams?.length || !this.isPreview) {\r\n return;\r\n }\r\n\r\n this.playbackStreams = [];\r\n\r\n this.channels.forEach(channel => {\r\n const matchingStream = this.allPreviewStreams.find(s => s.ChannelId == channel.ChannelId)\r\n\r\n if (!matchingStream) {\r\n return;\r\n }\r\n\r\n channel.loaded = true;\r\n channel.StreamUrl = matchingStream.StreamUrl;\r\n channel.PlaybackSession = matchingStream.PlaybackSession;\r\n this.playbackStreams.push(channel);\r\n });\r\n }\r\n\r\n private setIgnore(timeout = 10): void {\r\n this.ignore = true;\r\n\r\n this.ignoreTimeout = setTimeout(() => {\r\n this.ignore = false;\r\n }, timeout);\r\n }\r\n\r\n private initialise(): void {\r\n this.isMobile = this.constantsService.getIsMobile();\r\n\r\n // This allows us to ensure we have been created for at least 300ms before we try to play\r\n setTimeout(() => {\r\n this.vertical = this.el.nativeElement.offsetWidth / this.el.nativeElement.offsetHeight < 1.4;\r\n if (!this.isPreview) {\r\n this.setVisibleChannelsForLiveView();\r\n this.play();\r\n }\r\n }, 300);\r\n }\r\n\r\n private setMainChannel(): void {\r\n if (!this.playbackStreams?.length) {\r\n return;\r\n }\r\n\r\n const primaryChannel = this.cameraService.getPrimaryChannel(this.playbackStreams);\r\n\r\n if (primaryChannel) {\r\n this.focusStream(primaryChannel);\r\n }\r\n else {\r\n //Sets a main channel if none is found in the selection when viewing multiple channels eg. viewing Internal and Nearside but not Forward\r\n this.focusStream(this.playbackStreams[0]);\r\n }\r\n }\r\n\r\n private updateStreamQuality(): void {\r\n this.vStreamComponents.forEach(videoStream => {\r\n videoStream.toggleHighQuality(this.highQuality);\r\n });\r\n }\r\n\r\n private setVisibleChannelsForLiveView(): void {\r\n if (this.isPreview) {\r\n return;\r\n }\r\n\r\n this.playbackStreams = this.channels;\r\n }\r\n\r\n private clearAllTimeouts(): void {\r\n clearTimeout(this.controlsTimeout);\r\n clearTimeout(this.ignoreTimeout);\r\n }\r\n}\r\n","import { animate, style, transition, trigger } from '@angular/animations';\r\n\r\nexport const animFadeInOut = trigger('animFadeInOut', [\r\n transition(':enter', [\r\n style({ opacity: '0' }),\r\n animate('300ms ease-out', style({ opacity: '1' }))\r\n ]),\r\n transition(':leave', [\r\n style({ opacity: '1' }),\r\n animate('300ms ease-out', style({ opacity: '0' }))\r\n ])\r\n]);\r\n","import { AfterViewInit, Component, EventEmitter, Input, OnChanges, Output, Sanitizer, SimpleChanges } from \"@angular/core\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { DateService, DateUnit } from \"@services/date.service\";\r\nimport \"./v-calendar.component.scss\";\r\n\r\nexport interface IVCalendarMonth {\r\n date: Date;\r\n\r\n name: string;\r\n year: number;\r\n\r\n startingDay: number;\r\n daysInMonth: number;\r\n\r\n dayHeaders: string[],\r\n days: IVCalenderDay[];\r\n}\r\n\r\nexport interface IVCalenderDay {\r\n day: number;\r\n date: Date;\r\n\r\n selected?: boolean;\r\n disabled?: boolean;\r\n today?: boolean;\r\n loading?: boolean;\r\n\r\n startOfRange?: boolean;\r\n endOfRange?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: \"v-calendar\",\r\n template: require(\"./v-calendar.component.html\")\r\n})\r\nexport class VCalendarComponent implements AfterViewInit, OnChanges {\r\n @Input() monthsToShow = 1;\r\n @Input() maxDays = 31; // Max selectable days\r\n @Input() direction: \"past\" | \"today-past\" | \"any\" | \"today-future\" | \"future\" = \"today-past\";\r\n\r\n @Input() date: Date;\r\n @Input() endDate: Date;\r\n @Input() allowedDates: Date[];\r\n\r\n @Input() loading: boolean;\r\n @Input() dayLoading: boolean;\r\n\r\n @Output() dateChanged: EventEmitter = new EventEmitter();\r\n @Output() dateRangeChanged: EventEmitter = new EventEmitter();\r\n\r\n // ---\r\n\r\n // new\r\n @Input() locale: string;\r\n\r\n months: IVCalendarMonth[];\r\n\r\n _startDate: Date;\r\n _endDate: Date;\r\n\r\n canNavigateForwards: boolean;\r\n canNavigateBackwards: boolean;\r\n\r\n allowRangeUpdateOnHover = false;\r\n\r\n invalidSelection: boolean;\r\n error: string = '';\r\n\r\n constructor(\r\n private readonly sanitizer: Sanitizer,\r\n protected readonly dateService: DateService,\r\n protected readonly translationService: TranslationService) {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes[\"date\"] && changes[\"date\"].isFirstChange) {\r\n this.initVCalendar();\r\n }\r\n\r\n let updateDayStates = false;\r\n if (changes[\"date\"] || changes[\"endDate\"]) {\r\n this.setDates(this.date, this.endDate);\r\n updateDayStates = true;\r\n }\r\n\r\n if (changes[\"dayLoading\"]) {\r\n updateDayStates = true;\r\n }\r\n\r\n if (changes[\"direction\"]) {\r\n this.updateDirectionStates();\r\n }\r\n\r\n if (updateDayStates) {\r\n this.updateDayStateForAllMonths();\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n }\r\n\r\n navigate(direction: number) {\r\n var date = this.getNextMonth(this.months[0].date, direction);\r\n\r\n this.createVCalendar(date);\r\n this.updateDirectionStates();\r\n }\r\n\r\n hoverDay(day: IVCalenderDay) {\r\n\r\n if (!this._startDate || !this.allowRangeUpdateOnHover) {\r\n return;\r\n }\r\n\r\n this._endDate = day.date;\r\n\r\n // If our date range is too long, then adjust to our maxDays\r\n while (Math.floor(this.dateService.getDiff(this._startDate, this._endDate, DateUnit.Day)) > this.maxDays) {\r\n this._endDate = this.dateService.addOrSubtractTime(this._startDate, 1, DateUnit.Day);\r\n }\r\n\r\n while (this.dateService.getDiff(this._startDate, this._endDate, DateUnit.Day) < -this.maxDays) {\r\n this._endDate = this.dateService.addOrSubtractTime(this._startDate, -1, DateUnit.Day);\r\n }\r\n\r\n this.updateDayStateForAllMonths();\r\n }\r\n\r\n dayClicked(day: IVCalenderDay) {\r\n\r\n this.dateChanged.emit(day.date);\r\n\r\n if (this.maxDays === 1 && this._startDate) {\r\n this._endDate = this.dateService.getEndOfDay(day.date);\r\n\r\n this.updateDayStateForAllMonths();\r\n return;\r\n }\r\n\r\n if (!this.allowRangeUpdateOnHover && (this._endDate || !this._startDate)) {\r\n this._startDate = day.date;\r\n this._endDate = null;\r\n\r\n this.allowRangeUpdateOnHover = true;\r\n }\r\n else {\r\n // Set end date to now if selected day today and should not be able to select future dates, else set end date to end of selected day\r\n if (this.dateService.isSameDate(day.date, new Date()) && !this.canNavigateForwards) {\r\n this._endDate = new Date();\r\n }\r\n else {\r\n this._endDate = this.dateService.getEndOfDay(day.date);\r\n }\r\n\r\n this.checkDateRangeIsValid();\r\n\r\n this.allowRangeUpdateOnHover = false;\r\n }\r\n\r\n this.checkIfSelectionIsInvalid();\r\n this.dateRangeChanged.emit([this._startDate, this._endDate]);\r\n this.updateDayStateForAllMonths();\r\n }\r\n\r\n private checkIfSelectionIsInvalid(date?: Date): void {\r\n this.invalidSelection = false;\r\n this.error = undefined;\r\n if (this._startDate && !this._endDate) {\r\n this.invalidSelection = true;\r\n this.error = this.translationService.t(\"DateButtonFilter.PleaseSelectEnd\");\r\n }\r\n\r\n // Note the floor is here to account for months with an odd number of hours, e.g. when clocks go back in October\r\n if (Math.floor(this.dateService.getDiff(this._startDate, this._endDate, DateUnit.Day)) > this.maxDays) {\r\n this.invalidSelection = true;\r\n this.error = this.translationService.t(\"DateButtonFilter.RangeGtThanAllowed\", this.maxDays);\r\n }\r\n }\r\n\r\n private setDates(startDate: Date, endDate?: Date) {\r\n if (!endDate) {\r\n endDate = startDate;\r\n }\r\n\r\n this._startDate = new Date(startDate);\r\n this._endDate = new Date(endDate);\r\n\r\n this._datesChanged();\r\n }\r\n\r\n private initVCalendar() {\r\n this.createVCalendar(new Date());\r\n }\r\n\r\n private createVCalendar(date: Date) {\r\n var thisMonth = this.createCalendarForMonth(date);\r\n\r\n this.months = [thisMonth];\r\n\r\n var weekAgo = new Date();\r\n weekAgo.setDate(date.getDate() - 6);\r\n }\r\n\r\n private getNextMonth(date: Date, direction: number): Date {\r\n var adjustedDate = new Date(date);\r\n adjustedDate.setMonth(date.getMonth() + direction);\r\n\r\n return adjustedDate;\r\n }\r\n\r\n private createOrderedTimeRange(from: Date, to: Date): { from: Date, to: Date } {\r\n if (this.dateService.date1IsAfterDate2(from, to)) {\r\n return { from: to, to: from }\r\n }\r\n\r\n return { from: from, to: to }\r\n }\r\n\r\n private createCalendarForMonth(date: Date): IVCalendarMonth {\r\n // sanitize date to first day of month\r\n date.setDate(1);\r\n\r\n var daysInMonth = this.getDaysInMonth(date);\r\n var monthStartingDay = this.getStartingDayOfMonth(date);\r\n\r\n var calendarMonth: IVCalendarMonth = {\r\n date: date,\r\n name: date.toLocaleDateString(this.locale, { month: \"long\" }),\r\n year: date.getFullYear(),\r\n\r\n daysInMonth: daysInMonth,\r\n startingDay: monthStartingDay,\r\n\r\n dayHeaders: [],\r\n days: []\r\n };\r\n\r\n this.createDayHeaders(calendarMonth);\r\n this.createDays(calendarMonth);\r\n\r\n return calendarMonth;\r\n }\r\n\r\n private getDaysInMonth(date: Date): number {\r\n return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();\r\n }\r\n\r\n private getStartingDayOfMonth(date: Date): number {\r\n const startingDayOfMonth = new Date(date.getFullYear(), date.getMonth(), 1).getDay();\r\n if (startingDayOfMonth === 0) {\r\n // Calendar week starts on a Monday so we want to put Sunday at the end\r\n return 7;\r\n }\r\n return startingDayOfMonth;\r\n }\r\n\r\n private createDayHeaders(calendarMonth: IVCalendarMonth) {\r\n\r\n var startingDayOfWeek = 1;\r\n var dow = startingDayOfWeek;\r\n while (calendarMonth.dayHeaders.length < 7) {\r\n\r\n calendarMonth.dayHeaders.push(this.getDayOfWeekString(dow));\r\n\r\n if (++dow >= 7) {\r\n dow = 0;\r\n }\r\n }\r\n }\r\n\r\n private getDayOfWeekString(dayOfWeek: number): string {\r\n var date = new Date();\r\n\r\n while (date.getDay() != dayOfWeek) {\r\n date.setDate(date.getDate() + 1);\r\n }\r\n\r\n return date.toLocaleDateString(this.locale, { weekday: \"short\" });\r\n }\r\n\r\n private createDays(calendarMonth: IVCalendarMonth) {\r\n\r\n for (var d = 1; d <= calendarMonth.daysInMonth; d++) {\r\n var date = this.dateService.getStartOfDay(calendarMonth.date);\r\n date.setDate(d);\r\n\r\n var day = { day: d, date: date };\r\n\r\n this.updateDayState(day);\r\n calendarMonth.days.push(day);\r\n }\r\n }\r\n\r\n private _datesChanged() {\r\n\r\n this.updateDayStateForAllMonths();\r\n\r\n const displayedDate = (this.dateService.allDatesAreValid([this._endDate])) ? this._endDate : this._startDate;\r\n\r\n // Ensure start of first month of selected days is visible\r\n while (this.months[0].date.getMonth() < displayedDate.getMonth()) {\r\n this.navigate(1);\r\n }\r\n\r\n while (this.months[0].date.getMonth() > displayedDate.getMonth() || this.months[0].date.getFullYear() > displayedDate.getFullYear()) {\r\n this.navigate(-1);\r\n }\r\n }\r\n\r\n private updateDayStateForAllMonths() {\r\n this.months.forEach(month => {\r\n month.days.forEach(day => {\r\n this.updateDayState(day);\r\n });\r\n });\r\n }\r\n\r\n private updateDayState(day: IVCalenderDay) {\r\n day.today = this.dateService.isSameDate(day.date, new Date());\r\n day.loading = day.selected && this.dayLoading;\r\n day.disabled = this.dayLoading || !this.isDayEnabled(day.date);\r\n\r\n this.updateDaySelection(day);\r\n }\r\n\r\n private updateDaySelection(day: IVCalenderDay) {\r\n\r\n if (!this._startDate || !this._endDate) {\r\n return;\r\n }\r\n\r\n var { from, to } = this.createOrderedTimeRange(this._startDate, this._endDate);\r\n day.startOfRange = this.dateService.isSameDate(from, day.date);\r\n day.endOfRange = this.dateService.isSameDate(to, day.date);\r\n day.selected = day.startOfRange\r\n || day.endOfRange\r\n || this.dateService.dateIsBetweenDates(day.date, from, to);\r\n }\r\n\r\n private isDayEnabled(date: Date): boolean {\r\n\r\n var today = new Date();\r\n\r\n if (this.allowedDates?.length) {\r\n return this.allowedDates.some(allowedDate => this.dateService.isSameDate(date, allowedDate));\r\n }\r\n\r\n switch (this.direction) {\r\n case \"any\":\r\n return true;\r\n\r\n case \"today-past\":\r\n return this.dateService.isSameDate(date, today) || this.dateService.date1IsAfterDate2(today, date);\r\n\r\n case \"past\":\r\n return this.dateService.date1IsAfterDate2(today, date);\r\n\r\n case \"today-future\":\r\n return this.dateService.isSameDate(date, today) || this.dateService.date1IsAfterDate2(date, today);\r\n\r\n case \"future\":\r\n return this.dateService.date1IsAfterDate2(date, today);\r\n }\r\n }\r\n\r\n private updateDirectionStates() {\r\n\r\n this.canNavigateForwards = false;\r\n this.canNavigateBackwards = false;\r\n\r\n if (this.direction == \"any\") {\r\n this.canNavigateForwards = true;\r\n this.canNavigateBackwards = true;\r\n }\r\n else if (this.direction == \"future\" || this.direction == \"today-future\") {\r\n this.canNavigateForwards = true;\r\n const nextMonth = this.getNextMonth(this.months[0].date, -1);\r\n this.canNavigateBackwards = nextMonth > new Date() || this.dateService.isSameMonth(nextMonth, new Date());\r\n }\r\n else if (this.direction == \"past\" || this.direction == \"today-past\") {\r\n this.canNavigateForwards = this.getNextMonth(this.months[0].date, 1) < new Date();\r\n this.canNavigateBackwards = true;\r\n }\r\n\r\n this.updateDayStateForAllMonths();\r\n }\r\n\r\n private checkDateRangeIsValid() {\r\n\r\n if (this.dateService.date1IsAfterDate2(this._startDate, this._endDate)) {\r\n const tempStartDate = this._startDate;\r\n\r\n this._startDate = this.dateService.getStartOfDay(this._endDate);\r\n this._endDate = this.dateService.getEndOfDay(tempStartDate);\r\n }\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnInit, Output, SimpleChanges } from \"@angular/core\";\r\nimport { DateRange } from \"@enums/DateRange.enum\";\r\nimport { TimeFilterType } from \"@reports/enums/TimeFilterType\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { IVButtonDropDownItem } from \"../../_core/v-button/v-button.component\";\r\nimport \"./v-time-filters.component.scss\";\r\n\r\ninterface IQuickDate {\r\n label: string;\r\n dateRange: DateRange;\r\n selected?: boolean;\r\n}\r\n\r\ninterface ITimeRestrictionOption {\r\n label: string;\r\n id: number;\r\n}\r\n\r\n@Component({\r\n selector: \"v-time-filters\",\r\n template: require(\"./v-time-filters.component.html\")\r\n})\r\nexport class VTimeFiltersComponent implements OnInit {\r\n @Input() showRangeFilter = true;\r\n @Input() showDailyFilter = true;\r\n\r\n @Input() timeFilterStart: string;\r\n @Input() timeFilterEnd: string;\r\n @Input() timeFilterType: TimeFilterType;\r\n\r\n @Input() increments: number = 30;\r\n\r\n @Output() timeFilterStartChange = new EventEmitter();\r\n @Output() timeFilterEndChange = new EventEmitter();\r\n @Output() timeFilterTypeChange = new EventEmitter();\r\n\r\n // --\r\n\r\n TimeFilterType = TimeFilterType;\r\n\r\n selectedTimeRestrictionOption: IVButtonDropDownItem;\r\n timeRestrictionOptions: IVButtonDropDownItem[] = [];\r\n\r\n protected defaultTimeFilterStart: string = \"08:00\";\r\n protected defaultTimeFilterEnd: string = \"17:00\";\r\n\r\n // ---\r\n\r\n get enabledTimeFilterStart(): string {\r\n return (!!this.timeFilterStart) ? this.timeFilterStart : this.defaultTimeFilterStart;\r\n }\r\n\r\n get enabledTimeFilterEnd(): string {\r\n return (!!this.timeFilterEnd) ? this.timeFilterEnd : this.defaultTimeFilterEnd;\r\n }\r\n\r\n get enableRangeFilter(): boolean {\r\n return this.timeFilterType === TimeFilterType.Range;\r\n }\r\n\r\n get enableDailyFilter(): boolean {\r\n return this.timeFilterType === TimeFilterType.Daily;\r\n }\r\n\r\n constructor(\r\n private readonly translationService: TranslationService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.timeRestrictionOptions.push({ label: this.translationService.t(\"TimeFilters.StartEndTimeLabel\"), id: 1 });\r\n this.timeRestrictionOptions.push({ label: this.translationService.t(\"TimeFilters.TimeFilterLabel\"), id: 2 });\r\n\r\n this.selectedTimeRestrictionOption = this.timeRestrictionOptions[0];\r\n }\r\n\r\n ngOnChanges(): void {\r\n if (this.enableDailyFilter) {\r\n this.timeFilterStartChange.emit(this.enabledTimeFilterStart);\r\n this.timeFilterEndChange.emit(this.enabledTimeFilterEnd);\r\n }\r\n }\r\n\r\n onTimeFilterStartChanged(value: string, updateModel: boolean): void {\r\n if (!updateModel) {\r\n return;\r\n }\r\n\r\n this.changeStartTimeFilter(value);\r\n }\r\n\r\n onTimeFilterEndChanged(value: string, updateModel: boolean): void {\r\n if (!updateModel) {\r\n return;\r\n }\r\n\r\n this.changeEndTimeFilter(value);\r\n }\r\n\r\n onEnabledTimeFilterChanged(enabled: boolean, type: TimeFilterType): void {\r\n this.onTimeFilterStartChanged((enabled) ? (this.timeFilterStart || this.defaultTimeFilterStart) : null, true);\r\n this.onTimeFilterEndChanged((enabled) ? (this.timeFilterEnd ||this.defaultTimeFilterEnd) : null, true);\r\n\r\n this.changeFilterType((enabled) ? type : TimeFilterType.None);\r\n }\r\n\r\n // ---\r\n\r\n private changeFilterType(newType: TimeFilterType): void {\r\n\r\n if (newType === this.timeFilterType) {\r\n return;\r\n }\r\n\r\n this.timeFilterType = newType;\r\n this.timeFilterTypeChange.emit(this.timeFilterType);\r\n }\r\n\r\n private changeStartTimeFilter(value: string): void {\r\n if (value === this.timeFilterStart) {\r\n return;\r\n }\r\n\r\n this.timeFilterStart = value;\r\n this.timeFilterStartChange.emit(value);\r\n }\r\n\r\n private changeEndTimeFilter(value: string): void {\r\n\r\n if (value === this.timeFilterEnd) {\r\n return;\r\n }\r\n\r\n this.timeFilterEnd = value;\r\n this.timeFilterEndChange.emit(value);\r\n }\r\n\r\n}\r\n","import { AfterViewInit, Component, ElementRef, Input, OnInit } from \"@angular/core\";\r\nimport { ResourceFilterBarComponentController } from \"@directives/_resourceFilters/newResourceFilterBar.component\";\r\nimport { VeriSearchBoxComponent } from \"@directives/_veri/veriSearchBox/veriSearchBox.directive\";\r\nimport { IVeriTableBindings } from \"@directives/_veri/veriTable/veriTable.component\";\r\nimport { HTMLService } from \"@services/htmlService.service\";\r\nimport \"./page-actions.component.scss\";\r\n\r\n@Component({\r\n selector: \"page-actions\",\r\n template: require(\"./page-actions.component.html\")\r\n})\r\nexport class PageActionsComponent implements OnInit, AfterViewInit {\r\n\r\n @Input() veriTable: IVeriTableBindings;\r\n @Input() showRouteTitle: boolean;\r\n @Input() noexport: boolean;\r\n\r\n // ---\r\n\r\n searchBox: VeriSearchBoxComponent;\r\n\r\n constructor(\r\n private readonly elementRef: ElementRef,\r\n private readonly htmlService: HTMLService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.findAndRegisterTable();\r\n this.findAndRegisterFilterBar();\r\n\r\n this.removeIfEmpty(\".search-row\");\r\n }\r\n\r\n registerSearchBox(searchBox: VeriSearchBoxComponent) {\r\n if (this.searchBox) {\r\n return;\r\n }\r\n\r\n this.searchBox = searchBox;\r\n\r\n this.searchBox.onChange.subscribe(event => {\r\n if (!this.veriTable) {\r\n return;\r\n }\r\n\r\n this.veriTable.searchBox = this.searchBox;\r\n this.veriTable.searchString = event;\r\n this.veriTable.searchRows(true);\r\n });\r\n }\r\n\r\n // ---\r\n\r\n private findAndRegisterTable() {\r\n var nearest = this.htmlService.findNearest(this.elementRef.nativeElement, \"veri-table\");\r\n this.veriTable = this.htmlService.getAngularJSComponentFromElement(nearest);\r\n\r\n if (this.veriTable) {\r\n\r\n var existingCallback = this.veriTable.onRowsUpdated;\r\n this.veriTable.onRowsUpdated = (args) => {\r\n if (this.searchBox) {\r\n this.searchBox.placeholderCount = args.rows.length\r\n this.searchBox.updatePlaceholderTranslation();\r\n }\r\n\r\n if (existingCallback) {\r\n existingCallback(args);\r\n }\r\n };\r\n }\r\n }\r\n\r\n private findAndRegisterFilterBar() {\r\n if (!this.veriTable) {\r\n return;\r\n }\r\n\r\n var nearest = this.htmlService.findNearest(this.elementRef.nativeElement, \"new-resource-filter-bar\");\r\n var filterBar = this.htmlService.getAngularJSComponentFromElement(nearest);\r\n\r\n if (filterBar) {\r\n\r\n filterBar.veriTable = this.veriTable;\r\n }\r\n }\r\n\r\n private removeIfEmpty(selector: string) {\r\n const nearest = this.htmlService.findNearest(this.elementRef.nativeElement, selector, null, { stopTagNames: [\"default-layout\"] });\r\n if (!nearest) {\r\n return;\r\n }\r\n\r\n let isEmpty = true;\r\n\r\n nearest.childNodes.forEach(child => {\r\n if (!isEmpty) {\r\n return;\r\n }\r\n\r\n if ((child.nodeName != \"#comment\" && child.textContent.trim() != '') || child.childNodes.length > 0) {\r\n isEmpty = false;\r\n }\r\n });\r\n\r\n if (isEmpty) {\r\n nearest.remove();\r\n }\r\n }\r\n}\r\n","import { AfterContentInit, AfterViewInit, Component, Input, OnInit } from \"@angular/core\";\r\nimport \"./default-layout.component.scss\";\r\n\r\n@Component({\r\n selector: \"default-layout\",\r\n template: require(\"./default-layout.component.html\")\r\n})\r\nexport class DefaultLayoutComponent implements OnInit, AfterContentInit, AfterViewInit {\r\n\r\n @Input() loading: boolean;\r\n\r\n constructor() {\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n ngAfterContentInit() {\r\n }\r\n\r\n ngAfterViewInit() {\r\n }\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { SpecialUserPermissions } from \"@app/enum/SpecialUserPermissions\";\r\nimport { IPlot } from \"@app/interfaces/IPlot\";\r\nimport { FoundationSensorDataService } from \"@app/main/modules/foundation/_services/sensor-data.service\";\r\nimport { forkJoin, Observable, of } from \"rxjs\";\r\nimport { map } from \"rxjs/operators\";\r\nimport { AccountFeatureService } from \"../accountFeature.service\";\r\nimport { ConstantsService } from \"../constantsService\";\r\nimport { DateService, DateUnit } from \"../date.service\";\r\nimport { GoogleMarkerService } from \"../googleMarker.service\";\r\nimport { ReasonCodeService } from \"../reasonCode.service\";\r\nimport { TranslationService } from \"../translation.service\";\r\nimport { UsersService } from \"../users.service\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PlotService {\r\n constructor(private readonly http: HttpClient,\r\n private readonly accountFeatureService: AccountFeatureService,\r\n private readonly constantsService: ConstantsService,\r\n private readonly dateService: DateService,\r\n private readonly googleMarkerService: GoogleMarkerService,\r\n private readonly reasonCodeService: ReasonCodeService,\r\n private readonly sensorDataService: FoundationSensorDataService,\r\n private readonly translationService: TranslationService,\r\n private readonly usersService: UsersService) { }\r\n\r\n\r\n getLatestPlots(): Observable {\r\n return this.http.get('/api/vehicles/plots/latest');\r\n }\r\n\r\n getPlotsForDate(vehicleId: number, date: Date): Observable {\r\n const startDate = this.dateService.getStartOfDay(date);\r\n const endDate = this.dateService.getEndOfDay(date);\r\n\r\n return this.getPlotsForDateRange(vehicleId, startDate, endDate);\r\n }\r\n\r\n getPlotsForDateRange(vehicleId: number, start: moment.Moment | Date, end: moment.Moment | Date): Observable {\r\n if (!this.userCanAccessPlots()) {\r\n return of([]);\r\n }\r\n\r\n return this.http.get(`/api/vehicles/${vehicleId}/plots?plotOption=Basic&start=${start.toISOString()}&end=${end.toISOString()}`).pipe(map(plots => {\r\n const preparedPlots = this.preparePlotsForMap(plots);\r\n return preparedPlots;\r\n }));\r\n }\r\n\r\n getPlotsWithSensorData(vehicleId: number, start: Date, end: Date): Observable {\r\n return forkJoin({\r\n plots: this.getPlotsForDateRange(vehicleId, start, end),\r\n sensorData: this.sensorDataService.getSensorDataForVehicle(vehicleId, start, end)\r\n }).pipe(map(data => {\r\n const sensorDataMap = new Map(data.sensorData.map(data => [data.PlotId, data]));\r\n data.plots.forEach(plot => {\r\n plot.SensorData = sensorDataMap.get(plot.Id)\r\n });\r\n\r\n return data.plots;\r\n }))\r\n\r\n }\r\n\r\n getPlotNearestToTime(vehicleId: number, start: Date): Observable {\r\n\r\n const startTime = new Date(start);\r\n const endTime = this.dateService.addOrSubtractTime(startTime, 1, DateUnit.Hour);\r\n\r\n\r\n return this.getPlotsForDateRange(vehicleId, startTime, endTime).pipe(\r\n map(plots => {\r\n return plots[0];\r\n })\r\n );\r\n }\r\n\r\n convertDirectionToWords(degrees: number): string {\r\n const directionArray: string[] = [\r\n this.translationService.t('Common.North'),\r\n this.translationService.t('Common.NorthEast'),\r\n this.translationService.t('Common.East'),\r\n this.translationService.t('Common.SouthEast'),\r\n this.translationService.t('Common.South'),\r\n this.translationService.t('Common.SouthWest'),\r\n this.translationService.t('Common.West'),\r\n this.translationService.t('Common.NorthWest')\r\n ]\r\n\r\n const maxDirectionArrows = 8;\r\n const simpleNumber = (degrees / (360 / maxDirectionArrows));\r\n const val = Math.floor(simpleNumber + 0.5);\r\n\r\n const index = val % maxDirectionArrows;\r\n const arrayIndex = parseInt(index.toString(), 0);\r\n const compassDirection = directionArray[arrayIndex];\r\n\r\n return compassDirection;\r\n }\r\n\r\n private userCanAccessPlots(): boolean {\r\n return this.usersService.isCurrentUserOnFoundationPlatform() || this.accountFeatureService.doesCurrentUserHaveSpecialPermission(SpecialUserPermissions.ShowHistoricalPlots);\r\n }\r\n\r\n private preparePlotsForMap(plots: IPlot[], dontCreateOptions = false): IPlot[] {\r\n\r\n if (!plots) {\r\n return [];\r\n }\r\n\r\n for (let i = 0; i < plots.length; i++) {\r\n const plot = plots[i];\r\n plot.ReasonText = this.reasonCodeService.getReasonCodeLabel(plot.Reason);\r\n this.preparePlotForMap(plot);\r\n }\r\n\r\n // Plots are out of order, reverse for highcharts and display in correct (ascending time) order\r\n plots.sort((a, b) => { return new Date(a.Utc).getTime() - new Date(b.Utc).getTime(); });\r\n\r\n return plots;\r\n }\r\n\r\n private preparePlotForMap(plot: IPlot) {\r\n if (!plot) {\r\n return;\r\n }\r\n\r\n plot.markerModel = {\r\n id: plot.Id,\r\n options: this.googleMarkerService.createEventMarkerOptions({ label: \"\", position: { lat: plot.Latitude, lng: plot.Longitude } })\r\n }\r\n\r\n if (this.constantsService.getIsDemoSite() && plot.LocationInformation?.GeofenceIds?.length > 0) {\r\n plot.LocationInformation.LocationDescription = \"Demo Geofence\";\r\n }\r\n\r\n // This data is useful for side navigation display\r\n if (plot.Utc) {\r\n // Small optimisation because we know plot Utcs come down in ISO format i.e. \"2017-09-04T09:30:09Z\"\r\n plot.FormattedDate = this.dateService.formatDate(plot.Utc);\r\n }\r\n else {\r\n console.warn(`Plot for ${plot.VehicleId} has no Utc '${plot.Utc}'`);\r\n }\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { VideoCoachingStatus } from \"../enums/VideoCoachingStatus.enum\";\r\nimport { VideoReviewStatus } from \"../enums/VideoReviewStatus.enum\";\r\nimport { VideoReviewSubStatus } from \"../enums/VideoReviewSubStatus.enum\";\r\nimport { IVideoEntry } from \"../models/IVideoEntry\";\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class VideoReviewStatusService {\r\n constructor(private readonly translationService: TranslationService) {}\r\n\r\n getVideoReviewStatusDisplayValue(video: IVideoEntry): string {\r\n return this.getReviewStatusDisplayValue(video.reviewStatus, video.reviewSubStatus, video.coachingStatus)\r\n }\r\n\r\n getReviewDisplayStatus(reviewStatus: VideoReviewStatus, reviewedSubStatus?: VideoReviewSubStatus): string {\r\n switch (reviewStatus) {\r\n case VideoReviewStatus.NeedsReview:\r\n return this.translationService.translateEnum(VideoReviewStatus, \"VideoReviewStatus\", reviewStatus);\r\n\r\n case VideoReviewStatus.Coached:\r\n return this.translationService.t(\"cameraService.Completed\");\r\n\r\n case VideoReviewStatus.Reviewed:\r\n return reviewedSubStatus == VideoReviewSubStatus.NoActionRequired\r\n ? this.translationService.t(\"cameraService.Completed\")\r\n : this.translationService.t(\"cameraService.InProgress\");\r\n\r\n default:\r\n return this.translationService.t(\"cameraService.InProgress\");\r\n }\r\n }\r\n\r\n getReviewSubDisplayStatus(reviewSubStatus: VideoReviewSubStatus, ignoreNone = false): string {\r\n if (reviewSubStatus === VideoReviewSubStatus.ActionRequired) {\r\n return this.translationService.t(\"cameraService.pending\");\r\n } \r\n \r\n if (reviewSubStatus === VideoReviewSubStatus.NoActionRequired) {\r\n return this.translationService.tEnum(VideoReviewSubStatus, \"VideoReviewSubStatus\", VideoReviewSubStatus.NoActionRequired);\r\n } \r\n\r\n return ignoreNone\r\n ? \"\"\r\n : this.translationService.tEnum(VideoReviewSubStatus, \"VideoReviewSubStatus\", VideoReviewSubStatus.None);\r\n \r\n }\r\n\r\n getCoachingDisplayStatus(coachingStatus: VideoCoachingStatus, ignoreNone = false): string {\r\n switch (coachingStatus) {\r\n case VideoCoachingStatus.DriverTrained:\r\n case VideoCoachingStatus.Praise:\r\n return this.translationService.translateEnum(VideoCoachingStatus, \"VideoCoachingStatus\", coachingStatus);\r\n default:\r\n return ignoreNone\r\n ? \"\"\r\n : this.translationService.translateEnum(VideoCoachingStatus, \"VideoCoachingStatus\", VideoCoachingStatus.None);\r\n }\r\n }\r\n\r\n getReviewStatusDisplayValue(reviewStatus: VideoReviewStatus, reviewSubStatus: VideoReviewSubStatus, coachingStatus: VideoCoachingStatus): string {\r\n var reviewDisplayStatus = this.getReviewDisplayStatus(reviewStatus, reviewSubStatus);\r\n\r\n if (reviewStatus === VideoReviewStatus.NeedsReview) {\r\n return reviewDisplayStatus;\r\n }\r\n\r\n if (reviewStatus === VideoReviewStatus.Reviewed) {\r\n const reviewSubStatusString = this.getReviewSubDisplayStatus(Number(reviewSubStatus), true);\r\n\r\n if (reviewSubStatusString) {\r\n reviewDisplayStatus += ` (${reviewSubStatusString})`;\r\n }\r\n }\r\n\r\n if (reviewStatus === VideoReviewStatus.Coached) {\r\n const coachingStatusString = this.getCoachingDisplayStatus(Number(coachingStatus), true);\r\n \r\n if (coachingStatusString) {\r\n reviewDisplayStatus += ` (${coachingStatusString})`;\r\n }\r\n }\r\n return reviewDisplayStatus;\r\n }\r\n\r\n}\r\n","import { Component, Input, OnChanges, OnInit, SimpleChanges } from \"@angular/core\";\r\nimport { IGeofence } from \"@app/interfaces/IGeofences\";\r\nimport { IDriver } from \"@interfaces/IDriver\";\r\nimport { IUser } from \"@interfaces/IUser\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { IGroup } from \"@interfaces/IVehicleGroup\";\r\nimport { GroupService } from \"@services/group.service.ajs\";\r\nimport \"./resourceGroupDisplay.scss\";\r\n\r\n@Component({\r\n selector: \"resource-group-display\",\r\n template: require(\"./resourceGroupDisplay.html\")\r\n})\r\nexport class ResourceGroupDisplayComponent implements OnInit, OnChanges {\r\n\r\n // Bindings\r\n\r\n @Input() groups: IGroup[];\r\n @Input() vehicle: IVehicle;\r\n @Input() driver: IDriver;\r\n @Input() geofence: IGeofence;\r\n @Input() user: IUser;\r\n @Input() max: number;\r\n\r\n // Internal\r\n\r\n displayGroups: IGroup[] = [];\r\n hiddenGroups: IGroup[] = [];\r\n tooltipLabel: string;\r\n\r\n constructor(private groupService: GroupService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.loadGroups();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (!changes) {\r\n return;\r\n }\r\n\r\n this.loadGroups();\r\n }\r\n\r\n // ----------------------------------\r\n\r\n private loadGroups(): void {\r\n if (this.groups) {\r\n this.mapGroups();\r\n }\r\n else {\r\n this.groupService.getGroups(false, true).then(groups => {\r\n this.groups = groups;\r\n\r\n this.mapGroups();\r\n });\r\n }\r\n }\r\n\r\n private mapGroups(): void {\r\n this.displayGroups = [];\r\n this.hiddenGroups = []\r\n\r\n if (!this.groups) {\r\n return;\r\n }\r\n\r\n this.tooltipLabel = \"\";\r\n\r\n this.groups.forEach(group => {\r\n if (!this.user) {\r\n this.populateGroup(group, \"Vehicle\");\r\n this.populateGroup(group, \"Driver\");\r\n }\r\n else {\r\n this.populateGroupUsers(group);\r\n }\r\n });\r\n }\r\n\r\n private populateGroup(group: IGroup, resourceName: \"Driver\" | \"Vehicle\"): void {\r\n\r\n if (resourceName == \"Driver\" && !this.driver || resourceName == \"Vehicle\" && !this.vehicle) {\r\n return;\r\n }\r\n\r\n const property = `${resourceName}Ids`;\r\n const ids: number[] = group[property];\r\n\r\n let idToFind = -1;\r\n\r\n switch (resourceName) {\r\n case \"Driver\":\r\n idToFind = this.driver.Id;\r\n break;\r\n\r\n case \"Vehicle\":\r\n idToFind = this.vehicle.Id;\r\n break;\r\n }\r\n\r\n if (ids.indexOf(idToFind) >= 0) {\r\n this.addGroup(group);\r\n }\r\n }\r\n \r\n\r\n private isAtMaxLimit(): boolean {\r\n if (!this.max) {\r\n return false;\r\n }\r\n\r\n return this.max <= this.displayGroups.length;\r\n }\r\n\r\n private populateGroupUsers(group: IGroup) {\r\n for (let i = 0; i < this.user.GroupIds.length; i++) {\r\n const groupId = this.user.GroupIds[i];\r\n\r\n if (groupId == group.Id) {\r\n this.addGroup(group);\r\n break;\r\n }\r\n } \r\n }\r\n\r\n private addGroup(group: IGroup): void {\r\n // Sometimes we have duplicates, this helps avoid that\r\n if (this.groupService.findGroup(this.displayGroups, group.Id)) {\r\n return;\r\n }\r\n\r\n if (this.isAtMaxLimit()) {\r\n this.hiddenGroups.push(group);\r\n this.addGroupToTooltip(group);\r\n }\r\n else {\r\n this.displayGroups.push(group);\r\n }\r\n }\r\n\r\n private addGroupToTooltip(group: IGroup): void {\r\n\r\n if (this.tooltipLabel.length != 0) {\r\n this.tooltipLabel += \", \";\r\n }\r\n\r\n this.tooltipLabel += group.Name;\r\n }\r\n}\r\n","import { AfterViewInit, Component, forwardRef, HostBinding, Inject, Input, OnChanges, OnDestroy, OnInit, Optional, SimpleChanges } from \"@angular/core\";\r\nimport { PageTitleComponent } from \"../page-title/page-title.component\";\r\nimport \"./page-title-pill.component.scss\";\r\n\r\n@Component({\r\n selector: \"page-title-pill\",\r\n template: require(\"./page-title-pill.component.html\")\r\n})\r\nexport class PageTitlePillComponent implements OnInit, OnChanges, AfterViewInit, OnDestroy {\r\n\r\n @Input() icon: string;\r\n @Input() valid: boolean;\r\n @Input() warning: boolean;\r\n\r\n // ---\r\n\r\n @HostBinding(\"class.valid\") validClass = false;\r\n @HostBinding(\"class.invalid\") invalidClass = false;\r\n @HostBinding(\"class.warning\") warningClass = false;\r\n\r\n fontAwesome = false;\r\n\r\n constructor(@Optional() @Inject(forwardRef(() => PageTitleComponent)) private parent: PageTitleComponent) {\r\n }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes[\"valid\"] || changes[\"warning\"]) {\r\n this.setValidClass();\r\n }\r\n\r\n if (this.icon?.indexOf(\"fa-\") == 0) {\r\n this.fontAwesome = true;\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.parent?.onPillAdded(this);\r\n }\r\n\r\n ngOnDestroy() {\r\n this.parent?.onPillRemoved(this);\r\n }\r\n\r\n // ---\r\n\r\n private setValidClass() {\r\n this.validClass = false;\r\n this.invalidClass = false;\r\n\r\n if (this.valid) {\r\n this.validClass = true;\r\n }\r\n else if (this.valid === false) {\r\n this.invalidClass = true;\r\n }\r\n\r\n this.warningClass = this.warning;\r\n }\r\n}\r\n","import { AfterContentInit, AfterViewInit, Component, ElementRef, Input, OnChanges, OnInit } from \"@angular/core\";\r\nimport { ConstantsService } from \"@app/services/constantsService\";\r\nimport { NavigationService } from \"@app/services/navigation.service\";\r\nimport { BreadcrumbService, IBreadcrumb } from \"@services/breadcrumb.service\";\r\nimport { Transition } from \"@uirouter/angularjs\";\r\nimport { PageTitlePillComponent } from \"../page-title-pill/page-title-pill.component\";\r\nimport \"./page-title.component.scss\";\r\n\r\n@Component({\r\n selector: \"page-title\",\r\n template: require(\"./page-title.component.html\"),\r\n})\r\nexport class PageTitleComponent implements OnInit, OnChanges, AfterViewInit, AfterContentInit {\r\n @Input() icon: string;\r\n\r\n @Input() useRoute: boolean;\r\n @Input(\"subtitle\") originalSubtitle: string;\r\n \r\n // ---\r\n\r\n pills: PageTitlePillComponent[] = [];\r\n\r\n routeTitle: string;\r\n subtitle: string;\r\n hideSubtitle: boolean;\r\n\r\n showBackButton = false;\r\n parentState: IBreadcrumb;\r\n\r\n isMobile: boolean;\r\n\r\n constructor(\r\n private readonly el: ElementRef,\r\n private readonly navigationService: NavigationService,\r\n private readonly breadcrumbService: BreadcrumbService,\r\n private readonly transition: Transition,\r\n private readonly constantsService: ConstantsService\r\n ) {\r\n this.transition.onSuccess({}, () => this.updateRouteTitle());\r\n this.breadcrumbService.registerStateCallback(() => this.updateBreadcrumbs());\r\n this.isMobile = this.constantsService.getIsMobile();\r\n }\r\n\r\n ngOnChanges() {\r\n this.updateRouteTitle();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.updateRouteTitle();\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.updateRouteTitle();\r\n }\r\n\r\n ngAfterContentInit() {\r\n this.trimTitle();\r\n }\r\n\r\n onPillAdded(pill: PageTitlePillComponent) {\r\n this.pills.push(pill);\r\n\r\n this.onPillChanged();\r\n }\r\n\r\n onPillRemoved(pill: PageTitlePillComponent) {\r\n this.pills = this.pills.filter(p => p != pill);\r\n\r\n this.onPillChanged();\r\n }\r\n\r\n toggleMobileNavigation() {\r\n const nav = document.getElementsByTagName(\"module-navigation\")[0];\r\n nav.classList.toggle(\"collapse-nav\");\r\n }\r\n\r\n goToParent() {\r\n this.navigationService.goToParent();\r\n }\r\n\r\n // ---\r\n\r\n private updateRouteTitle() {\r\n this.subtitle = this.originalSubtitle;\r\n\r\n if (!this.useRoute) {\r\n return;\r\n }\r\n\r\n this.routeTitle = this.breadcrumbService.getPageTitle(); \r\n this.subtitle = this.breadcrumbService.getPageSubtitle() || this.originalSubtitle;\r\n\r\n this.updateBreadcrumbs();\r\n }\r\n\r\n private onPillChanged() {\r\n this.hideSubtitle = this.pills?.length > 0;\r\n }\r\n\r\n private updateBreadcrumbs() {\r\n this.showBackButton = false;\r\n const breadcrumbs = this.breadcrumbService.getBreadcrumbs();\r\n\r\n if (breadcrumbs.length <= 1) {\r\n return;\r\n }\r\n\r\n // If our parent state ISNT abstract, then show \"Back to X\"\r\n const currentBreadcrumb = breadcrumbs[breadcrumbs.length - 1];\r\n this.parentState = breadcrumbs[breadcrumbs.length - 2];\r\n\r\n if (currentBreadcrumb.state && !this.parentState.state.abstract && !this.parentState.state.data.preventBreadcrumbBack) {\r\n this.showBackButton = true;\r\n }\r\n }\r\n\r\n private trimTitle(recursionCount = 0) {\r\n let success = false;\r\n const titleElement = this.el.nativeElement.querySelector(\".title\");\r\n\r\n titleElement.childNodes.forEach((node) => {\r\n if (node.nodeType === Node.TEXT_NODE) {\r\n const text = node.textContent.trim();\r\n\r\n if (text) {\r\n node.replaceWith(document.createTextNode(text));\r\n success = true;\r\n }\r\n }\r\n });\r\n\r\n if (!success && recursionCount < 10) {\r\n setTimeout(() => { this.trimTitle(recursionCount + 1); }, 50);\r\n }\r\n }\r\n}\r\n","import { Component, Input, OnChanges, SimpleChanges } from \"@angular/core\";\r\nimport { VehicleType } from \"@enums/VehicleType.enum\";\r\nimport { IDriver } from \"@interfaces/IDriver\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { DriverService } from \"@services/driver.service\";\r\nimport { DriverAssignmentService } from \"@services/driverAssignment.service\";\r\nimport { TachoService } from \"@services/tacho.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport * as moment from \"moment\";\r\nimport \"./driverSummaryPanel.component.scss\";\r\n\r\n@Component({\r\n selector: 'driver-summary-panel',\r\n template: require('./driverSummaryPanel.component.html')\r\n})\r\nexport class DriverSummaryPanelComponent implements OnChanges {\r\n @Input('driver') originalDriver: IDriver;\r\n @Input('vehicle') originalVehicle: IVehicle;\r\n @Input() time: moment.Moment;\r\n @Input() compactView = false;\r\n @Input() hideVehicleReg: boolean = false;\r\n @Input() showTbcs: boolean;\r\n @Input() showPhone = false;\r\n @Input() showTacho = false;\r\n @Input() lightText = false;\r\n\r\n driver: IDriver;\r\n vehicle: IVehicle;\r\n\r\n vehicleAssignedFromBinding: boolean;\r\n\r\n vehicleTBC = false;\r\n logging = false;\r\n\r\n constructor(private vehicleService: VehicleService,\r\n private driverService: DriverService,\r\n private driverAssignmentService: DriverAssignmentService,\r\n private tachoService: TachoService,\r\n private translationService: TranslationService) {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes.originalDriver) {\r\n this.driver = this.originalDriver;\r\n }\r\n\r\n if (changes.originalVehicle) {\r\n this.vehicle = this.originalVehicle;\r\n }\r\n\r\n // Passing specifically null in means \"use now\", undefined means dont use time\r\n if (this.time === null) {\r\n if (this.logging) {\r\n console.log(\"time null\");\r\n }\r\n\r\n this.time = moment();\r\n }\r\n\r\n if (this.time) {\r\n if (typeof this.time == \"string\") {\r\n this.time = moment(this.time);\r\n }\r\n\r\n var timeChanged = changes.time && changes.time.currentValue != changes.time.previousValue;\r\n\r\n if (timeChanged) {\r\n this.updateDriver();\r\n this.updateVehicle();\r\n }\r\n }\r\n else {\r\n if (!this.isRealDriver(this.driver)) {\r\n const label = this.vehicle && this.vehicleService.isNonDrivableVehicleType(this.vehicle)\r\n ? this.translationService.translateEnum(VehicleType, \"VehicleType\", this.vehicle.VehicleType)\r\n : this.translationService.t('DriverSummaryPanel.NoDriver') /*+ this.vehicle.VehicleType*/;\r\n\r\n this.setDriverLabel(label);\r\n }\r\n\r\n // Added by CJE 24.8.2018 to address \"Blank reg\" problem\r\n if (this.vehicle == null) {\r\n this.setVehicleLabel(\"TBC\");\r\n }\r\n }\r\n\r\n this.updateDriverTacho();\r\n }\r\n\r\n //------------\r\n\r\n private updateDriverTacho() {\r\n const timeCopy = this.time ? this.time.clone() : moment();\r\n\r\n if (!this.showTacho || !this.driver || !this.vehicle || !timeCopy.isSame(moment(), \"d\")) {\r\n\r\n return;\r\n }\r\n\r\n this.driverService\r\n .getDriversTacho()\r\n .then(tacho => {\r\n this.tachoService.mapDriverToTachoObjects(this.driver, tacho);\r\n });\r\n }\r\n\r\n private updateDriver() {\r\n\r\n if (this.originalDriver) {\r\n this.driver = this.originalDriver;\r\n return;\r\n }\r\n\r\n var sanitizedTime = this.time || moment();\r\n\r\n if (this.showTbcs) {\r\n this.setDriverLabel(\"TBC\");\r\n return;\r\n }\r\n\r\n if (!this.vehicle || !this.vehicle.Id) {\r\n this.setDriverLabel(\"Unkno-1\");\r\n return;\r\n }\r\n\r\n this.driverAssignmentService\r\n .getDriverAssignmentForTime(this.originalVehicle.Id, sanitizedTime)\r\n .then(historicalDriver => {\r\n this.driver = historicalDriver;\r\n\r\n this.setDriverLabel(this.translationService.t('DriverSummaryPanel.NoDriver'));\r\n\r\n this.updateDriverTacho();\r\n });\r\n }\r\n\r\n private updateVehicle() {\r\n\r\n if (this.originalVehicle) {\r\n\r\n this.vehicle = this.originalVehicle;\r\n return;\r\n }\r\n\r\n var sanitizedTime = this.time || moment();\r\n\r\n if (this.showTbcs) {\r\n this.setVehicleLabel(\"TBC\");\r\n return;\r\n }\r\n\r\n if (!this.originalDriver || !this.originalDriver.Id || this.vehicleAssignedFromBinding) {\r\n this.setVehicleLabel(\"---\");\r\n return;\r\n }\r\n\r\n if (this.logging) {\r\n console.warn(\"updateVehicleForTime - nigel wood\", this.originalDriver.Id, sanitizedTime.toISOString(), this.time.toISOString());\r\n }\r\n\r\n this.driverAssignmentService\r\n .getAssignmentByDriverForTime(this.originalDriver.Id, sanitizedTime, this.logging)\r\n .then(historicalVehicle => {\r\n\r\n this.vehicle = historicalVehicle;\r\n\r\n if (!this.vehicle) {\r\n\r\n this.vehicle = { Reg: this.translationService.t('Common.Unknown'), ShortReg: this.translationService.t('Common.Unknown') };\r\n }\r\n });\r\n }\r\n\r\n private formatTime(): void {\r\n if (this.time) {\r\n this.time = moment(this.time);\r\n }\r\n else {\r\n this.time = moment();\r\n }\r\n }\r\n\r\n private setDriverLabel(label: string) {\r\n if (this.isRealDriver(this.driver)) {\r\n return;\r\n }\r\n\r\n this.driver = { Id: 0, Name: label };\r\n }\r\n\r\n private setVehicleLabel(label: string) {\r\n if (this.vehicle) {\r\n return;\r\n }\r\n\r\n this.vehicle = { Reg: label, ShortReg: label };\r\n }\r\n\r\n private isRealDriver(driver: IDriver) {\r\n return driver && driver.Id > 0;\r\n }\r\n}\r\n","import { Component, OnInit } from \"@angular/core\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { IAutoDownloadSetting } from \"@app/interfaces/IAutoDownloadSetting\";\r\nimport { CameraLocation } from \"@app/main/components/videos/enums/CameraLocation\";\r\nimport { VideoEventCodeSimplified } from \"@app/main/components/videos/enums/VideoEventCodeSimplified\";\r\nimport { AutoDownloadSettingService } from \"@app/services/autoDownloadSetting.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport './auto-download-configuration.component.scss';\r\n\r\n@Component({\r\n selector: 'auto-download-configuration',\r\n template: require('./auto-download-configuration.component.html')\r\n})\r\nexport class AutoDownloadConfigurationComponent implements OnInit {\r\n\r\n settings: IAutoDownloadSetting[];\r\n selectedSetting: IAutoDownloadSetting;\r\n\r\n columns: IVTableColumn[];\r\n rows: IVTableRow[] = [];\r\n filter: VideoEventCodeSimplified[] = [];\r\n\r\n loading: boolean;\r\n deleting: boolean;\r\n\r\n constructor(\r\n private readonly translationService: TranslationService,\r\n private readonly vTableService: VTableService,\r\n private readonly autoDownloadSettingService: AutoDownloadSettingService\r\n ) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.createColumns();\r\n this.getData();\r\n }\r\n\r\n createNewSetting(): void {\r\n this.selectedSetting = this.autoDownloadSettingService.createDefaultSetting();\r\n }\r\n\r\n onRowClicked(row: IVTableRow): void {\r\n if (row?.data) {\r\n this.selectSetting(row.data);\r\n }\r\n }\r\n\r\n onCloseForm(): void {\r\n this.clearSelectedSetting();\r\n }\r\n\r\n onSettingSaved(): void {\r\n this.reset();\r\n }\r\n\r\n reset(): void {\r\n this.clearSelectedSetting();\r\n\r\n setTimeout(() => this.getData(), 1000); \r\n }\r\n\r\n private getData(): void {\r\n this.settings = [];\r\n\r\n if (this.loading) {\r\n return;\r\n }\r\n\r\n this.loading = true;\r\n\r\n this.autoDownloadSettingService.getData().subscribe({\r\n next: (data: IAutoDownloadSetting[]) => {\r\n this.settings = data;\r\n this.createRows();\r\n this.createFilter();\r\n },\r\n complete: () => {\r\n this.loading = false;\r\n }\r\n });\r\n }\r\n\r\n private createColumns(): void {\r\n this.columns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"AutoDownloadConfiguration.CameraEventType\", sorted: true }),\r\n createCellFunction: record => this.vTableService.createTableCell(this.translationService.tEnum(VideoEventCodeSimplified, \"VideoEventCodeSimplified\", record.EventType))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"AutoDownloadConfiguration.Channel\" }),\r\n createCellFunction: record => {\r\n const locations = record.Channels.map(location => this.translationService.tEnum(CameraLocation, \"CameraLocation\", location)).join(\", \");\r\n return this.vTableService.createTableCell(locations);\r\n }\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"AutoDownloadConfiguration.VideoDuration\" }),\r\n createCellFunction: record => { \r\n return this.vTableService.createTableCell(`${record.VideoDuration}s`);\r\n }\r\n },\r\n\r\n /*\r\n\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"AutoDownloadConfiguration.DownloadQuality\" }),\r\n createCellFunction: record => {\r\n const label = record.IsHighDefinition ? this.translationService.t(\"AutoDownloadConfiguration.HdLabel\") : this.translationService.t(\"AutoDownloadConfiguration.SdLabel\");\r\n return this.vTableService.createTableCell(label);\r\n }\r\n },\r\n */\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"AutoDownloadConfiguration.LastUpdated\", width: 150 }),\r\n createCellFunction: record => this.vTableService.createDateCell(new Date(record.UpdatedTime))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"AutoDownloadConfiguration.Created\", width: 150 }),\r\n createCellFunction: record => this.vTableService.createDateCell(new Date(record.CreatedTime))\r\n }\r\n ]\r\n }\r\n\r\n private createRows(): void {\r\n this.rows = this.vTableService.createTableRows(this.settings, this.columns);\r\n }\r\n\r\n private createFilter(): void {\r\n this.filter = [];\r\n\r\n this.settings.forEach(setting => {\r\n this.filter.push(setting.EventType);\r\n });\r\n }\r\n\r\n private selectSetting(setting: IAutoDownloadSetting): void { \r\n this.selectedSetting = JSON.parse(JSON.stringify(setting));\r\n }\r\n\r\n private clearSelectedSetting(): void {\r\n this.selectedSetting = null;\r\n }\r\n\r\n}","import { Component, OnDestroy, OnInit, ViewChild } from \"@angular/core\";\r\nimport { IVTableCell } from \"@app/directives/_layout/v-table/_models/IVTableCell\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { UserType } from \"@app/enum/UserType\";\r\nimport { IUser } from \"@app/interfaces/IUser\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { CameraChannelType } from \"@app/main/components/videos/enums/CameraChannelType\";\r\nimport { ICameraChannel } from \"@app/main/components/videos/models/ICameraChannel\";\r\nimport { CameraChannelService } from \"@app/main/modules/cameras/_services/camera-channels.service\";\r\nimport { FoundationPeripheralService } from \"@app/main/modules/foundation/_services/peripheral.service.ajs\";\r\nimport { CurrentUserService } from \"@app/services/currentUser.service\";\r\nimport { VehicleService } from \"@app/services/vehicle.service\";\r\nimport { Subject } from \"rxjs\";\r\nimport { takeUntil } from \"rxjs/operators\";\r\nimport { AutoDownloadConfigurationComponent } from \"../camera-channels-editor/auto-download-configuration/auto-download-configuration.component\";\r\nimport './camera-vehicles-manager.component.scss';\r\n\r\nexport interface IVehicleWithCameraMappings extends IVehicle {\r\n cameraChannels?: ICameraChannel[];\r\n}\r\n\r\n@Component({\r\n selector: 'camera-vehicles-manager',\r\n template: require('./camera-vehicles-manager.component.html')\r\n})\r\nexport class CameraVehiclesManagerComponent implements OnInit, OnDestroy {\r\n @ViewChild(AutoDownloadConfigurationComponent) autoDownloadComponent!: AutoDownloadConfigurationComponent;\r\n\r\n vehicles: IVehicleWithCameraMappings[];\r\n cameraChannels: ICameraChannel[];\r\n selectedVehicle: IVehicleWithCameraMappings;\r\n\r\n tableColumns: IVTableColumn[] = [];\r\n tableRows: IVTableRow[] = [];\r\n\r\n cameraChannelTypes = Object.keys(CameraChannelType).filter(s => !isNaN(Number(s))).map(s => Number(s));\r\n\r\n loading: boolean;\r\n\r\n firstLoad = true;\r\n isAutoDownloadSelected = true;\r\n\r\n user: IUser;\r\n get isInternalUser(): boolean {\r\n return this.user?.Type === UserType.InternalUser;\r\n }\r\n\r\n private destroy$ = new Subject();\r\n constructor(\r\n private readonly cameraChannelService: CameraChannelService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly vTableService: VTableService,\r\n private readonly foundationPeripheralService: FoundationPeripheralService,\r\n private readonly currentUserService: CurrentUserService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.load();\r\n this.createTable();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.unsubscribe();\r\n }\r\n\r\n selectVehicle(tableRow: IVTableRow): void {\r\n this.selectedVehicle = tableRow.data;\r\n }\r\n\r\n clearSelectedVehicle(): void {\r\n this.selectedVehicle = null;\r\n }\r\n\r\n vehicleSaved(): void {\r\n this.createTableRows();\r\n this.clearSelectedVehicle();\r\n }\r\n\r\n onTabSelected(value: boolean): void {\r\n this.isAutoDownloadSelected = value;\r\n }\r\n\r\n createNewSetting(): void {\r\n this.autoDownloadComponent.createNewSetting();\r\n }\r\n\r\n //--\r\n\r\n private load(): void {\r\n this.loading = true;\r\n this.getVehicles().then(() => {\r\n this.getData();\r\n }).finally(() => {\r\n this.loading = false;\r\n });\r\n\r\n this.currentUserService.getCurrentUser().then(currentUser => { \r\n this.user = currentUser; \r\n });\r\n }\r\n\r\n private getVehicles(): Promise {\r\n return this.vehicleService.getVehicles({ includeAllVehicles: true }).then(vehicles => {\r\n return this.foundationPeripheralService.getPeripheralsAndMapToVehicles(vehicles).then(() => {\r\n this.vehicles = vehicles.filter(v => this.foundationPeripheralService.isAnyPeripheralCamera(v.peripherals));\r\n });\r\n }) as Promise;\r\n }\r\n\r\n private createTable(): void {\r\n const cameraChannelTypeColumns: IVTableColumn[] = [];\r\n this.cameraChannelTypes.forEach(type => {\r\n cameraChannelTypeColumns.push({\r\n header: this.vTableService.createTableHeader({ tKey: `CameraChannelTypeEnum.${CameraChannelType[type]}`, width: 125, sortType: SortType.Number }),\r\n createCellFunction: (vehicle) => this.getChannelTypeCountCell(vehicle, type)\r\n })\r\n })\r\n\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createVehicleTableHeader(),\r\n createCellFunction: (vehicle) => this.vTableService.createVehicleRegCell(vehicle)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"CameraManagement.ActiveChannels\", width: 150, sorted: true, sortType: SortType.Number, sortDirection: SortDirection.Descending }),\r\n createCellFunction: (vehicle) => this.createChannelsCell(vehicle, true)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"CameraManagement.InactiveChannels\", width: 150 }),\r\n createCellFunction: (vehicle) => this.createChannelsCell(vehicle, false)\r\n },\r\n ...cameraChannelTypeColumns\r\n ]\r\n }\r\n\r\n private createTableRows(): void {\r\n this.tableRows = this.vTableService.createTableRows(this.vehicles, this.tableColumns);\r\n }\r\n\r\n private getData(): void {\r\n this.cameraChannelService.getCameraChannels().pipe(takeUntil(this.destroy$)).subscribe(channels => {\r\n this.cameraChannels = channels;\r\n this.vehicles.forEach(vehicle => vehicle.cameraChannels = channels.filter(channel => channel.VehicleId === vehicle.Id));\r\n this.createTableRows();\r\n this.firstLoad = false;\r\n })\r\n }\r\n\r\n private createChannelsCell(vehicle: IVehicleWithCameraMappings, active: boolean): IVTableCell {\r\n const vehicleChannels = vehicle.cameraChannels?.filter(channel => channel.IsActive === active);\r\n return this.vTableService.createTableCell(vehicleChannels?.length || 0);\r\n }\r\n\r\n private getChannelTypeCountCell(vehicle: IVehicleWithCameraMappings, type: CameraChannelType): IVTableCell {\r\n if (!vehicle.cameraChannels?.length) {\r\n return this.vTableService.createTableCell(null);\r\n }\r\n const channelTypeList = vehicle.cameraChannels.filter(channel => channel.CameraChannelType === type);\r\n const value = channelTypeList.length || null; // We want table fallback value i.e. N/A when count is 0;\r\n const classes = channelTypeList.length ? \"\" : \"text-muted\";\r\n\r\n return this.vTableService.createTableCell(value, {classes});\r\n }\r\n}\r\n","import { Component } from '@angular/core';\r\nimport { VTableService } from '@app/directives/_layout/v-table/_services/v-table.service';\r\nimport { SortDirection } from '@app/enum/SortDirection';\r\nimport { ContextualSpeedingOverrideService } from '@app/services/contextual-speeding-override.service';\r\nimport { UnitConversionService, UnitConversionType } from '@app/services/unitConversion.service';\r\nimport { ContextualSpeedingTab } from '../base/contextual-speeding-tab';\r\nimport { ContextualSpeedingRoadEditorComponent } from '../contextual-speeding-road-editor/contextual-speeding-road-editor.component';\r\nimport { ContextualSpeedingOverride } from '../models/contextual-speeding-override';\r\nimport './contextual-speeding-by-road.component.scss';\r\n\r\n@Component({\r\n selector: 'contextual-speeding-by-road',\r\n template: require('./contextual-speeding-by-road.component.html')\r\n})\r\nexport class ContextualSpeedingByRoadComponent \r\n extends ContextualSpeedingTab {\r\n constructor(\r\n public readonly vTableService: VTableService,\r\n private readonly overrideService: ContextualSpeedingOverrideService,\r\n private readonly unitConversionService: UnitConversionService,\r\n ) {\r\n super(vTableService); \r\n }\r\n\r\n async loadData(): Promise {\r\n return await this.overrideService.getContextualSpeedingOverrides();\r\n }\r\n\r\n async deleteItem(item: ContextualSpeedingOverride): Promise {\r\n await this.overrideService.deleteContextualSpeedingOverride(item.Id);\r\n }\r\n\r\n createTable(): void {\r\n this.columns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"ContextualSpeedingByRoad.Name\"}),\r\n createCellFunction: item => this.vTableService.createTableCell(item.Name)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"ContextualSpeedingByRoad.ReportedSpeedLimit\", width: 170 }),\r\n createCellFunction: item => this.vTableService.createTableCell(this.getSpeedFormatted(item.ReportedSpeedKph))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"ContextualSpeedingByRoad.OverriddenSpeedLimit\", width: 170 }),\r\n createCellFunction: item => this.vTableService.createTableCell(this.getSpeedFormatted(item.OverrideSpeedKph))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"ContextualSpeedingByRoad.Address\" }),\r\n createCellFunction: item => this.vTableService.createTableCell(item.Address)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"ContextualSpeedingByRoad.LastUpdated\", sorted: true, sortDirection: SortDirection.Descending }),\r\n createCellFunction: item => this.vTableService.createDateCell(item.UpdatedTime)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"ContextualSpeedingByRoad.Created\" }),\r\n createCellFunction: item => this.vTableService.createDateCell(item.CreatedTime)\r\n },\r\n ]\r\n }\r\n\r\n private getSpeedFormatted(speed?: number): string {\r\n if (!speed || speed <= 0) {\r\n return \"-\";\r\n }\r\n\r\n return this.unitConversionService.convertToUserUnitWithLabel(\r\n speed, \r\n UnitConversionType.Speed\r\n )\r\n }\r\n}","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { IGoogleMapsMarker } from \"@app/interfaces/IGoogleMapsMarkerOptions\";\r\nimport { ContextualSpeedingOverride } from \"@app/main/components/resourceManagement/contextual-speeding-settings-manager/models/contextual-speeding-override\";\r\nimport { HereRouteData } from \"@app/main/components/resourceManagement/contextual-speeding-settings-manager/models/here-route-data\";\r\nimport { IPolyline } from \"@typings/google.maps.angular\";\r\nimport { lastValueFrom } from \"rxjs\";\r\nimport { GeocodeService } from \"./geocode.service\";\r\nimport { GoogleMarkerService } from \"./googleMarker.service\";\r\nimport { TranslationService } from \"./translation.service\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ContextualSpeedingOverrideService {\r\n constructor(\r\n private readonly httpClient: HttpClient,\r\n private readonly geocodeService: GeocodeService,\r\n private readonly translationService: TranslationService,\r\n private readonly googleMarkerService: GoogleMarkerService\r\n ) { }\r\n\r\n async getContextualSpeedingOverrides(): Promise {\r\n return await lastValueFrom(this.httpClient.get(`/api/speeding/override`));\r\n }\r\n\r\n async getPointsForContextualSpeedingOverride(overrideId: number): Promise<[number, number][]> {\r\n return await lastValueFrom(this.httpClient.get<[number, number][]>(`/api/speeding/override/${overrideId}/points`));\r\n }\r\n\r\n async getContextualSpeedingOverrideRoute(points: [number, number][]): Promise {\r\n return await lastValueFrom(this.httpClient.post(`/api/speeding/override/route`, points));\r\n }\r\n\r\n async addContextualSpeedingOverride(override: ContextualSpeedingOverride): Promise {\r\n return await lastValueFrom(this.httpClient.post(`/api/speeding/override`, override));\r\n }\r\n\r\n async updateContextualSpeedingOverride(override: ContextualSpeedingOverride): Promise {\r\n return await lastValueFrom(this.httpClient.post(`/api/speeding/override/${override.Id}`, override));\r\n }\r\n\r\n async deleteContextualSpeedingOverride(thresholdId: number): Promise {\r\n return await lastValueFrom(this.httpClient.delete(`/api/speeding/override/${thresholdId}`));\r\n }\r\n\r\n async getAddressForMarker(marker: IGoogleMapsMarker): Promise {\r\n if (!marker?.options?.position?.lat || !marker?.options?.position?.lng) {\r\n return;\r\n }\r\n\r\n const latLngs = new google.maps.LatLng({\r\n lat: marker?.options?.position?.lat,\r\n lng: marker?.options?.position?.lng\r\n });\r\n\r\n const response = await this.geocodeService.getAddressFromPoint(latLngs);\r\n\r\n if (!response?.LocationDescription) {\r\n return;\r\n }\r\n\r\n return response.LocationDescription;\r\n }\r\n\r\n createPolyline(points: google.maps.LatLng[]): IPolyline {\r\n return {\r\n id: points.length,\r\n path: points,\r\n options: {\r\n stroke: {\r\n color: \"#000000\",\r\n weight: 4,\r\n opacity: 1\r\n }\r\n }\r\n };\r\n }\r\n\r\n createMapMarker(point: [number, number], type: 'start' | 'end'): IGoogleMapsMarker {\r\n const translationKey = type === 'start'\r\n ? 'ContextualSpeedingRoadEditor.Start'\r\n : 'ContextualSpeedingRoadEditor.End'\r\n\r\n return this.googleMarkerService.createLabeledMarker({\r\n label: this.translationService.t(translationKey),\r\n id: type === 'start' ? 1 : 2,\r\n lat: point[0],\r\n lng: point[1],\r\n icon: type === 'start' ? \"play_arrow\" : \"stop\",\r\n });\r\n }\r\n}\r\n","import { Component } from '@angular/core';\r\nimport { VTableService } from '@app/directives/_layout/v-table/_services/v-table.service';\r\nimport { SortDirection } from '@app/enum/SortDirection';\r\nimport { VehicleType } from '@app/enum/VehicleType.enum';\r\nimport { IKeyValuePair } from '@app/interfaces/IKeyValuePair';\r\nimport { ContextualSpeedingThresholdService } from '@app/services/contextual-speeding-threshold.service';\r\nimport { UnitConversionService, UnitConversionType } from '@app/services/unitConversion.service';\r\nimport { ContextualSpeedingTab } from '../base/contextual-speeding-tab';\r\nimport { ContextualSpeedingVehicleEditorComponent } from '../contextual-speeding-vehicle-editor/contextual-speeding-vehicle-editor.component';\r\nimport { ContextualSpeedingThreshold } from '../models/contextual-speeding-threshold';\r\nimport './contextual-speeding-by-vehicle.component.scss';\r\n\r\n@Component({\r\n selector: 'contextual-speeding-by-vehicle',\r\n template: require('./contextual-speeding-by-vehicle.component.html')\r\n})\r\nexport class ContextualSpeedingByVehicleComponent \r\n extends ContextualSpeedingTab {\r\n vehicleTypes: IKeyValuePair[] = [];\r\n\r\n constructor(\r\n public readonly vTableService: VTableService,\r\n private readonly thresholdService: ContextualSpeedingThresholdService,\r\n private readonly unitConversionService: UnitConversionService\r\n ) {\r\n super(vTableService);\r\n this.vehicleTypes = this.thresholdService.getAdjustedVehicleTypes();\r\n }\r\n\r\n async loadData(): Promise {\r\n return await this.thresholdService.getContextualSpeedingThresholds();\r\n }\r\n\r\n async deleteItem(item: ContextualSpeedingThreshold): Promise {\r\n await this.thresholdService.deleteContextualSpeedingOverride(item.Id);\r\n }\r\n\r\n createTable(): void {\r\n this.columns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"ContextualSpeedingByVehicle.VehicleType\" }),\r\n createCellFunction: item => this.vTableService.createTableCell(this.getVehicleTypeName(item.VehicleType))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"ContextualSpeedingByVehicle.Calculation\" }),\r\n createCellFunction: item => this.vTableService.createTableCell(this.getCalculationFormatted(item))\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: 'ContextualSpeedingByVehicle.LastUpdated', sorted: true, sortDirection: SortDirection.Descending }),\r\n createCellFunction: item => this.vTableService.createDateCell(item.UpdatedTime)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: 'ContextualSpeedingByVehicle.Created' }),\r\n createCellFunction: profile => this.vTableService.createDateCell(profile.CreatedTime)\r\n },\r\n ]\r\n }\r\n\r\n // VehicleType name for Unknown is overriden, this is why\r\n // we dont use TranslationService.tEnum\r\n private getVehicleTypeName(type: VehicleType): string {\r\n const vehicleType = this.vehicleTypes.find(x => x.value === type);\r\n return vehicleType.displayName;\r\n }\r\n\r\n private getCalculationFormatted(item: ContextualSpeedingThreshold): string {\r\n const speedThresholdAllowance = this.unitConversionService.convertToUserUnitWithLabel(\r\n item.SpeedThresholdAllowanceKph, \r\n UnitConversionType.Speed\r\n );\r\n\r\n const speedThresholdAllowanceNoWhitespace = speedThresholdAllowance.replace(\" \", \"\");\r\n \r\n return `${item.SpeedPercentThreshold}% + ${speedThresholdAllowanceNoWhitespace}`;\r\n }\r\n}","import { Component, Input, OnChanges, OnInit } from \"@angular/core\";\r\nimport { DeviceComparisonStatus, DeviceProfileService, IDeviceParameterComparisonResult } from \"@app/services/device-profile.service\";\r\nimport './device-profile-comparison-status-label.component.scss';\r\n\r\n@Component({\r\n selector: 'device-profile-comparison-status-label',\r\n template: require('./device-profile-comparison-status-label.component.html')\r\n})\r\nexport class DeviceProfileComparisonStatusLabelComponent implements OnInit, OnChanges {\r\n\r\n @Input() comparisonResult: IDeviceParameterComparisonResult;\r\n\r\n status: DeviceComparisonStatus;\r\n\r\n DeviceComparisonStatus = DeviceComparisonStatus;\r\n\r\n constructor(\r\n private readonly deviceProfileService: DeviceProfileService\r\n ) { }\r\n\r\n ngOnInit() {\r\n this.render();\r\n }\r\n\r\n ngOnChanges() {\r\n this.render();\r\n }\r\n\r\n // ---\r\n\r\n private render(): void {\r\n this.status = this.deviceProfileService.getDeviceParameterComparisonResultStatus(this.comparisonResult);\r\n }\r\n\r\n}\r\n","import { AfterViewInit, ChangeDetectorRef, Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, TemplateRef, ViewChild } from \"@angular/core\";\r\nimport { AbstractControl, FormBuilder, FormControl, FormGroup, ValidationErrors, Validators } from \"@angular/forms\";\r\nimport { timeout } from \"@app/class/Utilities\";\r\nimport { CustomFormValidators } from \"@app/directives/_forms/form-validation.service\";\r\nimport { VAutocompleteComponent } from \"@app/directives/_forms/v-autocomplete/v-autocomplete.component\";\r\nimport { VDialogRef } from \"@app/directives/_layout/v-dialog/v-dialog-ref\";\r\nimport { DialogService } from \"@app/directives/_layout/v-dialog/v-dialog.service\";\r\nimport { IKeyValuePair } from \"@app/interfaces/IKeyValuePair\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { DeviceComparisonStatus, DeviceParameterProfileMaterialisationOptions, DeviceParameterType, DeviceProfileService, IDeviceParameterProfile, IDeviceParameterProfileMapping } from \"@app/services/device-profile.service\";\r\nimport { EnumService } from \"@app/services/enum.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { copy } from \"@uirouter/angularjs\";\r\nimport './device-profile-editor.component.scss';\r\n\r\nexport interface IDisplayParameter {\r\n type: DeviceParameterType;\r\n value: number;\r\n enabled: boolean;\r\n}\r\n\r\nexport interface IDisplayDeviceParameterProfileMapping {\r\n mapping: IDeviceParameterProfileMapping;\r\n vehicle: IVehicle;\r\n}\r\n\r\n@Component({\r\n selector: 'device-profile-editor',\r\n template: require('./device-profile-editor.component.html')\r\n})\r\nexport class DeviceProfileEditorComponent implements AfterViewInit {\r\n\r\n @Input() vehicles: IVehicle[];\r\n @Input() deviceProfile: IDeviceParameterProfile;\r\n @Output() save = new EventEmitter();\r\n @ViewChild(\"vehiclesAutocomplete\", { static: false }) vehiclesAutocomplete: VAutocompleteComponent;\r\n @ViewChild(\"badVehicleRemovalTemplate\") badVehicleRemovalTemplate: TemplateRef;\r\n\r\n dirtyDeviceProfile: IDeviceParameterProfile;\r\n\r\n displayParameters: IDisplayParameter[];\r\n displayDeviceParameterProfileMappings: IDisplayDeviceParameterProfileMapping[];\r\n mappingsRequiringRemoval: IDisplayDeviceParameterProfileMapping[];\r\n mappingRemovalDialog: VDialogRef;\r\n\r\n existingDeviceProfiles: IDeviceParameterProfile[];\r\n displayVehicles: IVehicle[];\r\n\r\n availableDeviceParameterTypes: IKeyValuePair[];\r\n DeviceParameterType = DeviceParameterType;\r\n\r\n deviceProfileForm: FormGroup;\r\n mappingsInvalid: boolean;\r\n\r\n saving: boolean;\r\n savedChanges: boolean;\r\n\r\n hasAllResourcesAssociation: boolean;\r\n allResourcesAssociationError: string;\r\n\r\n cachedMappings: IDeviceParameterProfileMapping[];\r\n\r\n get formInvalid(): boolean {\r\n return this.mappingsInvalid || this.deviceProfileForm?.invalid || !!this.allResourcesAssociationError;\r\n }\r\n\r\n constructor(\r\n private readonly cd: ChangeDetectorRef,\r\n private readonly formBuilder: FormBuilder,\r\n private readonly deviceProfileService: DeviceProfileService,\r\n private readonly translationService: TranslationService,\r\n private readonly dialogService: DialogService\r\n ) {\r\n this.setupParametersEnum();\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.getData();\r\n }\r\n\r\n onDisplayParamaterToggled(displayParameter: IDisplayParameter): void {\r\n this.dirtyDeviceProfile.ParameterMap[displayParameter.type] = (displayParameter.enabled) ? 0 : null;\r\n\r\n this.refreshDisplayParameters();\r\n }\r\n\r\n onDisplayParameterValueChanged(displayParameter: IDisplayParameter, value: number): void {\r\n this.dirtyDeviceProfile.ParameterMap[displayParameter.type] = value;\r\n\r\n if (!value && value !== 0) {\r\n return;\r\n }\r\n\r\n this.refreshDisplayParameters();\r\n }\r\n\r\n onDisplayParameterInputBlur(displayParameter: IDisplayParameter): void {\r\n const currentValue = this.dirtyDeviceProfile.ParameterMap[displayParameter.type];\r\n\r\n if (!!currentValue || currentValue === 0) {\r\n return;\r\n }\r\n\r\n this.refreshDisplayParameters();\r\n }\r\n\r\n onVehicleSelected(vehicle: IVehicle): void {\r\n this.vehiclesAutocomplete.clearInput();\r\n\r\n if (this.dirtyDeviceProfile.UnitDeviceParameterProfileMappings.find(mapping => mapping.VehicleId === vehicle.Id)) {\r\n return;\r\n }\r\n\r\n this.dirtyDeviceProfile.UnitDeviceParameterProfileMappings.push({\r\n Id: 0,\r\n DeviceParameterProfileId: this.dirtyDeviceProfile.Id,\r\n VehicleId: vehicle.Id\r\n });\r\n\r\n this.refresh();\r\n }\r\n\r\n async saveDeviceProfile(silent: boolean = false): Promise {\r\n\r\n this.saving = !silent;\r\n\r\n const savedProfile: IDeviceParameterProfile = await this.deviceProfileService.addUpdateProfile(this.dirtyDeviceProfile);\r\n\r\n this.savedChanges = !!savedProfile?.Id;\r\n\r\n const promise = (silent) ? Promise.resolve() : timeout(2000).then(() => this.save.emit(savedProfile));\r\n\r\n promise.finally(() => {\r\n this.saving = false;\r\n })\r\n }\r\n\r\n close(): void {\r\n\r\n }\r\n\r\n vehicleFilter = (vehicle: IVehicle, text: string): boolean => {\r\n return this.vehicleFilterSearchPredicate(vehicle, text);\r\n }\r\n\r\n vehicleFilterSearchPredicate(vehicle: IVehicle, text: string): boolean {\r\n const alreadyAdded: boolean = !!this.dirtyDeviceProfile.UnitDeviceParameterProfileMappings?.find(mapping => mapping.VehicleId === vehicle.Id);\r\n const matchesName: boolean = vehicle.ShortReg.toLowerCase().includes(text.toLowerCase());\r\n const hasError: boolean = vehicle.deviceParameterComparisonResult?.hasAssignedProfile;\r\n\r\n return !hasError && !alreadyAdded && matchesName;\r\n }\r\n\r\n removeVehicleMappingById(vehicleId: number, refresh: boolean = true): void {\r\n const indexOfExistingMapping = this.dirtyDeviceProfile.UnitDeviceParameterProfileMappings.findIndex(mapping => mapping.VehicleId === vehicleId);\r\n\r\n if (indexOfExistingMapping === -1) {\r\n return;\r\n }\r\n\r\n this.dirtyDeviceProfile.UnitDeviceParameterProfileMappings.splice(indexOfExistingMapping, 1);\r\n\r\n if (!refresh) {\r\n return;\r\n }\r\n\r\n this.refresh();\r\n }\r\n\r\n onApplyToAllResourcesChanged(value: boolean): void {\r\n\r\n if (value) {\r\n this.cacheMappings();\r\n this.dirtyDeviceProfile.UnitDeviceParameterProfileMappings = [this.createAllResourcesAssociation()];\r\n } else {\r\n this.recoverCachedMappings();\r\n }\r\n\r\n this.refresh();\r\n }\r\n\r\n onParameterTypeValueChanged(parameterType: DeviceParameterType, value: number): void {\r\n this.dirtyDeviceProfile.ParameterMap[DeviceParameterType[parameterType]] = value;\r\n\r\n Object.keys(this.deviceProfileForm.controls)?.forEach(key => {\r\n this.deviceProfileForm.get(key)?.updateValueAndValidity();\r\n });\r\n }\r\n\r\n onClickAcknowledgeRemoval(): void {\r\n this.mappingRemovalDialog?.close();\r\n this.mappingsRequiringRemoval = [];\r\n }\r\n\r\n //--\r\n\r\n private setupParametersEnum(): void {\r\n const parameterTypesArray: IKeyValuePair[] = EnumService.enumToArray(\"DeviceParameterType\", DeviceParameterType);\r\n\r\n this.availableDeviceParameterTypes = [\r\n parameterTypesArray.find(item => +item.value === DeviceParameterType.OverRev),\r\n parameterTypesArray.find(item => +item.value === DeviceParameterType.GreenBandUpper),\r\n parameterTypesArray.find(item => +item.value === DeviceParameterType.SweetSpotUpper),\r\n parameterTypesArray.find(item => +item.value === DeviceParameterType.SweetSpotLower),\r\n parameterTypesArray.find(item => +item.value === DeviceParameterType.GreenBandLower)\r\n ];\r\n }\r\n\r\n\r\n private refresh(): void {\r\n this.validateMappings(this.dirtyDeviceProfile.UnitDeviceParameterProfileMappings);\r\n this.refreshDisplayMappings();\r\n this.refreshDisplayVehicles();\r\n }\r\n\r\n private getData(): void {\r\n this.mappingsRequiringRemoval = [];\r\n\r\n\r\n this.deviceProfileService.getProfiles({ Active: true, MaterialisationOptions: DeviceParameterProfileMaterialisationOptions.WithMappings }).pipe(untilDestroyed(this)).subscribe({\r\n next: deviceProfiles => {\r\n\r\n this.existingDeviceProfiles = deviceProfiles;\r\n this.prepareModel();\r\n this.determineAllResourcesAssociation();\r\n this.buildForm();\r\n }\r\n })\r\n \r\n }\r\n\r\n private refreshDisplayVehicles(): void {\r\n if (!this.vehicles?.length) {\r\n return;\r\n }\r\n\r\n this.displayVehicles = this.vehicles.filter(vehicle => {\r\n\r\n const vehicleDeviceComparisonStatus: DeviceComparisonStatus = this.deviceProfileService.getDeviceParameterComparisonResultStatus(vehicle?.deviceParameterComparisonResult);\r\n const incompatibleUnit = vehicleDeviceComparisonStatus === DeviceComparisonStatus.IncompatibleUnit || vehicleDeviceComparisonStatus === DeviceComparisonStatus.NoUnitInstalled;\r\n\r\n const matchingDeviceProfileMapping = this.dirtyDeviceProfile.UnitDeviceParameterProfileMappings?.find(mapping => mapping.VehicleId === vehicle.Id);\r\n const hasAssignedProfile = vehicle?.deviceParameterComparisonResult?.hasAssignedProfile;\r\n\r\n const existingMatchingMapping = this.existingDeviceProfiles.find(existingDeviceProfile => {\r\n return existingDeviceProfile.Id !== this.deviceProfile.Id\r\n && this.mappingsContainVehicleId(existingDeviceProfile.UnitDeviceParameterProfileMappings, vehicle.Id);\r\n });\r\n\r\n return !existingMatchingMapping && !hasAssignedProfile && !incompatibleUnit && !matchingDeviceProfileMapping;\r\n });\r\n }\r\n\r\n private buildForm(): void {\r\n this.deviceProfileForm = this.formBuilder.group({\r\n Name: [this.dirtyDeviceProfile.Name ?? \"\", [\r\n Validators.required,\r\n Validators.minLength(3),\r\n Validators.maxLength(100),\r\n CustomFormValidators.emptyWhiteSpace,\r\n this.deviceProfileService.uniqueDeviceProfileNameValidator(this.dirtyDeviceProfile, this.existingDeviceProfiles)\r\n ]]\r\n });\r\n\r\n this.availableDeviceParameterTypes.forEach(deviceParameterType => {\r\n this.deviceProfileForm.addControl(deviceParameterType.name, new FormControl(this.dirtyDeviceProfile.ParameterMap[deviceParameterType.name], [\r\n Validators.required,\r\n Validators.min(0),\r\n Validators.max(20000),\r\n CustomFormValidators.number,\r\n this.validateFormParameter(deviceParameterType)\r\n ]))\r\n })\r\n\r\n this.cd.detectChanges();\r\n }\r\n\r\n private validateFormParameter = (deviceParameterType: IKeyValuePair) => (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value && control?.value !== 0) {\r\n return null;\r\n }\r\n\r\n const parameterIndex = this.availableDeviceParameterTypes.findIndex(availableParamType => +availableParamType.value === +deviceParameterType.value);\r\n const parameterAbove: IKeyValuePair = this.availableDeviceParameterTypes[parameterIndex + 1];\r\n\r\n if (parameterIndex === 0) {\r\n if (control.value <= this.dirtyDeviceProfile.ParameterMap[parameterAbove.name]) {\r\n return { \"customMessage\": this.translationService.t(\"DeviceProfileEditor.ParameterValidationWarningTooLow\") }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n const parameterBelow: IKeyValuePair = this.availableDeviceParameterTypes[parameterIndex - 1];\r\n\r\n if (parameterIndex === this.availableDeviceParameterTypes?.length - 1) {\r\n if (control.value >= this.dirtyDeviceProfile.ParameterMap[parameterBelow.name]) {\r\n return { \"customMessage\": this.translationService.t(\"DeviceProfileEditor.ParameterValidationWarningTooHigh\") }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n if (control.value <= this.dirtyDeviceProfile.ParameterMap[parameterAbove.name]) {\r\n return { \"customMessage\": this.translationService.t(\"DeviceProfileEditor.ParameterValidationWarningTooLow\") }\r\n }\r\n\r\n if (control.value >= this.dirtyDeviceProfile.ParameterMap[parameterBelow.name]) {\r\n return { \"customMessage\": this.translationService.t(\"DeviceProfileEditor.ParameterValidationWarningTooHigh\") }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private prepareModel(): void {\r\n\r\n this.dirtyDeviceProfile = (!this.deviceProfile?.Id)\r\n ? this.deviceProfileService.createDeviceParameterProfileTemplate()\r\n : copy(this.deviceProfile);\r\n\r\n if (this.deviceProfile.ParameterMap) {\r\n this.dirtyDeviceProfile.ParameterMap = copy(this.deviceProfile.ParameterMap);\r\n }\r\n\r\n if (this.deviceProfile.UnitDeviceParameterProfileMappings?.length) {\r\n this.dirtyDeviceProfile.UnitDeviceParameterProfileMappings = [...this.deviceProfile.UnitDeviceParameterProfileMappings];\r\n }\r\n\r\n this.cacheMappings();\r\n\r\n this.refreshDisplayParameters();\r\n this.refresh();\r\n }\r\n\r\n private refreshDisplayParameters(): void {\r\n this.displayParameters = (this.displayParameters?.length) ? this.displayParameters : [];\r\n\r\n if (!this.dirtyDeviceProfile?.ParameterMap) {\r\n return;\r\n }\r\n\r\n Object.keys(this.dirtyDeviceProfile.ParameterMap).forEach((key, index) => {\r\n\r\n if (!DeviceParameterType[key]) {\r\n return;\r\n }\r\n\r\n const existingDisplayParameter = this.displayParameters.find(displayParameter => displayParameter.type === +key);\r\n const value: number = this.dirtyDeviceProfile.ParameterMap[key];\r\n const enabled: boolean = this.dirtyDeviceProfile.ParameterMap[key] === 0 || this.dirtyDeviceProfile.ParameterMap[key] > 0;\r\n\r\n if (existingDisplayParameter) {\r\n existingDisplayParameter.value = value;\r\n existingDisplayParameter.enabled = enabled;\r\n return;\r\n }\r\n\r\n this.displayParameters.push({\r\n type: +key,\r\n value: value,\r\n enabled: enabled\r\n });\r\n });\r\n }\r\n\r\n private refreshDisplayMappings(): void {\r\n\r\n const hasMappingsRequiringRemoval: boolean = !!this.mappingsRequiringRemoval?.length;\r\n\r\n this.displayDeviceParameterProfileMappings = [];\r\n\r\n if (!this.dirtyDeviceProfile.UnitDeviceParameterProfileMappings?.length) {\r\n return;\r\n }\r\n\r\n this.dirtyDeviceProfile.UnitDeviceParameterProfileMappings.forEach(mapping => {\r\n const matchingVehicle = this.vehicles.find(vehicle => vehicle.Id === mapping.VehicleId);\r\n\r\n if (!matchingVehicle) {\r\n return;\r\n }\r\n\r\n if (mapping.validationError === this.translationService.t(\"DeviceProfileService.IncompatibleUnitTooltip\") && !hasMappingsRequiringRemoval) {\r\n this.mappingsRequiringRemoval.push({\r\n vehicle: matchingVehicle,\r\n mapping: mapping\r\n });\r\n }\r\n\r\n const newDisplayMapping: IDisplayDeviceParameterProfileMapping = {\r\n vehicle: matchingVehicle,\r\n mapping: mapping\r\n };\r\n\r\n this.displayDeviceParameterProfileMappings.push(newDisplayMapping);\r\n });\r\n\r\n if (this.mappingsRequiringRemoval.length && !hasMappingsRequiringRemoval) {\r\n this.mappingRemovalDialog = this.dialogService.open(this.badVehicleRemovalTemplate, null);\r\n this.removeMappingsAndSave(this.mappingsRequiringRemoval);\r\n }\r\n }\r\n\r\n private removeMappingsAndSave(mappings: IDisplayDeviceParameterProfileMapping[]): Promise {\r\n if (!mappings?.length) {\r\n return;\r\n }\r\n\r\n mappings.forEach((mapping, index) => this.removeVehicleMappingById(mapping.vehicle.Id, index === mappings.length - 1));\r\n\r\n return this.saveDeviceProfile(true);\r\n }\r\n\r\n private determineAllResourcesAssociation(): void {\r\n this.hasAllResourcesAssociation = false;\r\n\r\n if (!this.dirtyDeviceProfile.UnitDeviceParameterProfileMappings?.length) {\r\n return;\r\n }\r\n\r\n const allResourcesAssociation = this.dirtyDeviceProfile.UnitDeviceParameterProfileMappings.find(association => !association.VehicleId);\r\n\r\n if (!allResourcesAssociation) {\r\n return;\r\n }\r\n\r\n this.hasAllResourcesAssociation = true;\r\n }\r\n\r\n private createAllResourcesAssociation(): IDeviceParameterProfileMapping {\r\n const newAssociation: IDeviceParameterProfileMapping = {\r\n Id: 0,\r\n VehicleId: null,\r\n DeviceParameterProfileId: 0\r\n };\r\n\r\n return newAssociation;\r\n }\r\n\r\n private validateMappings(mappings: IDeviceParameterProfileMapping[]): void {\r\n this.mappingsInvalid = false;\r\n this.allResourcesAssociationError = null;\r\n\r\n if (!mappings?.length) {\r\n return;\r\n }\r\n\r\n this.determineAllResourcesAssociation();\r\n\r\n mappings.forEach(mapping => this.validateMapping(mapping));\r\n }\r\n\r\n private validateMapping(mapping: IDeviceParameterProfileMapping): void {\r\n\r\n const vehicleId: number = mapping.VehicleId;\r\n\r\n if (this.hasAllResourcesAssociation) {\r\n this.validateAllResourceAssociation(mapping);\r\n return;\r\n }\r\n\r\n const vehicle = this.vehicles.find(vehicle => vehicle.Id === mapping.VehicleId);\r\n const vehicleDeviceComparisonStatus: DeviceComparisonStatus = this.deviceProfileService.getDeviceParameterComparisonResultStatus(vehicle?.deviceParameterComparisonResult);\r\n\r\n if (vehicleDeviceComparisonStatus === DeviceComparisonStatus.IncompatibleUnit\r\n || vehicleDeviceComparisonStatus === DeviceComparisonStatus.NoUnitInstalled) {\r\n mapping.validationError = this.translationService.t(\"DeviceProfileService.IncompatibleUnitTooltip\");\r\n\r\n this.mappingsInvalid = true;\r\n }\r\n\r\n const existingMatchingMapping = this.existingDeviceProfiles.find(existingDeviceProfile => {\r\n return existingDeviceProfile.Id !== this.deviceProfile.Id\r\n && this.mappingsContainVehicleId(existingDeviceProfile.UnitDeviceParameterProfileMappings, vehicleId)\r\n });\r\n\r\n if (existingMatchingMapping) {\r\n const profileName = this.existingDeviceProfiles.find(existingDeviceProfile => existingDeviceProfile.Id === existingMatchingMapping.Id)?.Name ?? \"Unknown\";\r\n\r\n mapping.validationError = this.translationService.t(\"DeviceProfileEditor.AlreadyAssignedVehicleWarning\", profileName);\r\n\r\n this.mappingsInvalid = true;\r\n }\r\n }\r\n\r\n private validateAllResourceAssociation(mapping: IDeviceParameterProfileMapping): void {\r\n const existingMatchingMapping = this.existingDeviceProfiles.find(existingDeviceProfile => {\r\n return existingDeviceProfile.Id !== this.deviceProfile.Id\r\n && this.mappingsContainsAllResourcesMapping(existingDeviceProfile.UnitDeviceParameterProfileMappings)\r\n });\r\n\r\n if (existingMatchingMapping) {\r\n const profileName = this.existingDeviceProfiles.find(existingDeviceProfile => existingDeviceProfile.Id === existingMatchingMapping.Id)?.Name ?? \"Unknown\";\r\n\r\n this.allResourcesAssociationError = this.translationService.t(\"DeviceProfileEditor.AlreadyAssignedAllWarning\", profileName);\r\n }\r\n }\r\n\r\n private mappingsContainsAllResourcesMapping(mappings: IDeviceParameterProfileMapping[]): boolean {\r\n if (!mappings?.length) {\r\n return false;\r\n }\r\n\r\n for (const mapping of mappings) {\r\n if (!mapping.VehicleId) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private mappingsContainVehicleId(mappings: IDeviceParameterProfileMapping[], vehicleId: number): boolean {\r\n if (!mappings?.length || !vehicleId) {\r\n return false;\r\n }\r\n\r\n for (const mapping of mappings) {\r\n if (mapping.VehicleId === vehicleId) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private cacheMappings(): void {\r\n this.determineAllResourcesAssociation();\r\n\r\n if (this.hasAllResourcesAssociation) {\r\n this.cachedMappings = [];\r\n return;\r\n }\r\n\r\n this.cachedMappings = [...this.dirtyDeviceProfile.UnitDeviceParameterProfileMappings];\r\n }\r\n\r\n private recoverCachedMappings(): void {\r\n this.dirtyDeviceProfile.UnitDeviceParameterProfileMappings = [...this.cachedMappings];\r\n }\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { IProduct } from \"@app/interfaces/IProduct\";\r\nimport { IBasicProductModel } from \"@app/interfaces/IProductUiViewModel\";\r\nimport { ProductVendor } from \"@app/main/components/videos/enums/CameraProductType\";\r\nimport { Observable } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ProductsService {\r\n constructor(private readonly http: HttpClient) { }\r\n\r\n getProducts(): Observable {\r\n return this.http.get(`/api/products`);\r\n }\r\n\r\n getProductUiViewModels(): Observable {\r\n return this.http.get(`/api/products/basic`);\r\n }\r\n\r\n getProductVendorString(product: IBasicProductModel): string {\r\n if (!product) {\r\n return \"No product found\";\r\n }\r\n\r\n return ProductVendor[product?.GroupId] || \"Unknown\";\r\n }\r\n\r\n sortProductsByGroup(products: IProduct[]) {\r\n products.sort((a, b) => {\r\n // First, compare GroupId\r\n if (a.GroupId && b.GroupId) {\r\n if (String(ProductVendor[a.GroupId]) < String(ProductVendor[b.GroupId])) return -1;\r\n if (String(ProductVendor[a.GroupId]) > String(ProductVendor[b.GroupId])) return 1;\r\n } else if (a.GroupId) {\r\n return -1;\r\n } else if (b.GroupId) {\r\n return 1;\r\n }\r\n\r\n // If GroupId is the same, compare Description\r\n if (a.Description && b.Description) {\r\n return a.Description.localeCompare(b.Description);\r\n } else if (a.Description) {\r\n return -1;\r\n } else if (b.Description) {\r\n return 1;\r\n }\r\n\r\n // If both GroupId and Description are missing or equal, maintain original order\r\n return 0;\r\n });\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from \"@angular/core\";\r\nimport { AbstractControl, FormBuilder, FormGroup, ValidationErrors, ValidatorFn, Validators } from \"@angular/forms\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { VProgressBar } from \"@app/directives/_misc/v-progress-bar/v-progress-bar.component\";\r\nimport { SortType } from \"@enums/SortType\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { DrivingStyleMetric, DrivingStyleWeightingType, MetricMappingWeightingLevel } from \"../driving-styles.enums\";\r\nimport { IDrivingStyle, IDrivingStyleMetricMapping } from \"../driving-styles.interfaces\";\r\nimport { DrivingStylesService, IMetricMappingWeightingLevelDetail } from \"../driving-styles.service\";\r\nimport './driving-style-metric-editor.component.scss';\r\n\r\ninterface IDisplayMetricMapping {\r\n metric: DrivingStyleMetric;\r\n label: string;\r\n count: number;\r\n data: IDrivingStyleMetricMapping;\r\n}\r\n\r\n@Component({\r\n selector: 'driving-style-metric-editor',\r\n template: require('./driving-style-metric-editor.component.html')\r\n})\r\nexport class DrivingStyleMetricEditorComponent implements OnInit, OnChanges {\r\n\r\n @Input() drivingStyle: IDrivingStyle;\r\n @Input() weightingType: DrivingStyleWeightingType;\r\n @Input() metricMapping: IDrivingStyleMetricMapping;\r\n @Output() metricMappingChange = new EventEmitter();\r\n @Output() alterativeMetricClick = new EventEmitter(); \r\n\r\n metricMappingWeightingLevelDetails: IMetricMappingWeightingLevelDetail[];\r\n defaultMetricMappingWeightingLevelDetail: IMetricMappingWeightingLevelDetail;\r\n selectedWeightingLevelDetail: IMetricMappingWeightingLevelDetail;\r\n\r\n enableCustomWeighting: boolean;\r\n\r\n MetricMappingWeightingLevel = MetricMappingWeightingLevel;\r\n\r\n metricForm: FormGroup;\r\n\r\n highScoreIsBad: boolean;\r\n\r\n displayMetricMappings: IDisplayMetricMapping[];\r\n sliderValues: number[];\r\n SortType = SortType;\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n get virtualHighScoreValue(): AbstractControl {\r\n return this.metricForm?.get(\"VirtualHighScoreValue\");\r\n }\r\n\r\n get upperRagBoundControl(): AbstractControl {\r\n return this.metricForm?.get(\"UpperRagBound\");\r\n }\r\n\r\n get lowerRagBoundControl(): AbstractControl {\r\n return this.metricForm?.get(\"LowerRagBound\");\r\n }\r\n\r\n get customWeightingControl(): AbstractControl {\r\n return this.metricForm?.get(\"CustomWeighting\");\r\n }\r\n\r\n constructor(\r\n private readonly translationService: TranslationService,\r\n private readonly drivingStylesService: DrivingStylesService,\r\n private readonly formBuilder: FormBuilder,\r\n private readonly vTableService: VTableService\r\n ) {\r\n\r\n }\r\n\r\n ngOnInit(): void {\r\n this.prepare();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n this.prepare();\r\n }\r\n\r\n onWeightingToggleChanged(value: boolean): void {\r\n if (value && this.defaultMetricMappingWeightingLevelDetail) {\r\n this.metricMapping.Weighting = this.defaultMetricMappingWeightingLevelDetail.value;\r\n this.selectWeightingLevelDetail(this.metricMapping.Weighting);\r\n } else {\r\n this.metricMapping.Weighting = null;\r\n }\r\n\r\n this.emitChange();\r\n }\r\n\r\n onWeightingLevelDetailSelectChange(selectedWeightingLevelDetail: IMetricMappingWeightingLevelDetail): void {\r\n this.metricMapping.Weighting = +selectedWeightingLevelDetail.value;\r\n this.selectWeightingLevelDetail(this.metricMapping.Weighting);\r\n\r\n this.emitChange();\r\n }\r\n\r\n onCustomWeightingChanged(newCustomWeighting: number): void {\r\n this.metricMapping.Weighting = +newCustomWeighting;\r\n\r\n this.customWeightingControl.setValue(this.metricMapping.Weighting);\r\n this.customWeightingControl.updateValueAndValidity();\r\n this.drivingStylesService.updateCustomWeightingsError(this.drivingStyle);\r\n\r\n this.emitChange();\r\n }\r\n\r\n onHighScoreValueChanged(): void {\r\n this.virtualHighScoreValue.setValue(this.metricMapping.HighScoreValue);\r\n this.virtualHighScoreValue.updateValueAndValidity();\r\n\r\n this.emitChange();\r\n }\r\n\r\n onLowScoreValueChanged(): void {\r\n this.virtualHighScoreValue.updateValueAndValidity();\r\n this.emitChange();\r\n }\r\n\r\n onSliderValuesChanged(values: number[]): void {\r\n this.metricMapping.LowerRagBound = Math.round(values[0]);\r\n this.metricMapping.UpperRagBound = Math.round(values[1]);\r\n\r\n this.upperRagBoundControl.setValue(this.metricMapping.UpperRagBound);\r\n this.lowerRagBoundControl.setValue(this.metricMapping.LowerRagBound);\r\n\r\n this.upperRagBoundControl.updateValueAndValidity();\r\n this.lowerRagBoundControl.updateValueAndValidity();\r\n }\r\n\r\n updateDisplayMetricMappings(): void {\r\n this.displayMetricMappings = [];\r\n\r\n this.drivingStyle.DrivingStyleMetricMappings.forEach((metricMapping, index) => {\r\n\r\n const weightingCount = this.weightingType === DrivingStyleWeightingType.Simple\r\n ? +(metricMapping.metricMetadataItem?.ProportionOfTotalScore ?? 0).toFixed(2)\r\n : metricMapping.Weighting;\r\n\r\n const displayMetricMapping: IDisplayMetricMapping = {\r\n metric: metricMapping.DrivingStyleMetric,\r\n label: metricMapping.drivingStyleMetricName,\r\n count: weightingCount,\r\n data: metricMapping,\r\n };\r\n\r\n this.displayMetricMappings.push(displayMetricMapping);\r\n });\r\n }\r\n\r\n //--\r\n\r\n private prepare(): void {\r\n this.createTable();\r\n this.determineScoreDirection();\r\n this.updateMetricMappingWeightingLevelDetail();\r\n this.selectWeightingLevelDetail(+this.metricMapping.Weighting);\r\n this.updateSliderValues();\r\n\r\n this.buildForm();\r\n this.updateDisplayMetricMappings();\r\n this.drivingStylesService.updateCustomWeightingsError(this.drivingStyle);\r\n this.tableRows = this.vTableService.createTableRows(this.displayMetricMappings, this.tableColumns);\r\n }\r\n\r\n private updateSliderValues(): void {\r\n this.sliderValues = [this.metricMapping.LowerRagBound, this.metricMapping.UpperRagBound];\r\n }\r\n\r\n private emitChange(): void {\r\n this.updateDisplayMetricMappings();\r\n\r\n if (this.metricForm.invalid) {\r\n return;\r\n }\r\n\r\n this.metricMappingChange.emit(this.metricMapping);\r\n }\r\n\r\n private updateMetricMappingWeightingLevelDetail(): void {\r\n this.metricMappingWeightingLevelDetails = this.drivingStylesService.getMetricMappingWeightingLevelDetails().filter(detail => !detail.hideFromDropdown);\r\n\r\n this.defaultMetricMappingWeightingLevelDetail = this.metricMappingWeightingLevelDetails.find(option => option.isDefault);\r\n }\r\n\r\n\r\n private selectWeightingLevelDetail(weighting: number): void {\r\n if (this.weightingType === DrivingStyleWeightingType.Custom) {\r\n return;\r\n }\r\n\r\n this.selectedWeightingLevelDetail = this.metricMappingWeightingLevelDetails.find(detail => detail.value === +weighting);\r\n\r\n if (!this.selectedWeightingLevelDetail) {\r\n return;\r\n }\r\n\r\n this.drivingStylesService.setWeightingLevelDetailOnMetric(this.selectedWeightingLevelDetail, this.metricMapping);\r\n this.updateDisplayMetricMappings();\r\n }\r\n\r\n private buildForm(): void {\r\n this.metricForm = this.formBuilder.group({\r\n VirtualHighScoreValue: [this.metricMapping.HighScoreValue, [Validators.required, Validators.min(0), Validators.max(100), this.validateScoreValue()]],\r\n UpperRagBound: [this.metricMapping.UpperRagBound, [Validators.required, Validators.min(0), Validators.max(100), this.validateRagBound()]],\r\n LowerRagBound: [this.metricMapping.LowerRagBound, [Validators.required, Validators.min(0), Validators.max(100), this.validateRagBound()]],\r\n CustomWeighting: [this.metricMapping.Weighting ?? 1, [Validators.min(1), Validators.max(100)]]\r\n });\r\n }\r\n\r\n private validateScoreValue(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n\r\n if (!this.metricForm || !this.metricMapping) {\r\n return null;\r\n }\r\n\r\n const HighScoreValue: number = this.metricMapping.HighScoreValue;\r\n const LowScoreValue: number = this.metricMapping.LowScoreValue;\r\n\r\n if (HighScoreValue <= LowScoreValue && !this.highScoreIsBad) {\r\n return { customMessage: this.translationService.t(\"DrivingStyleMetricEditor.BadScoreMustBeLowerValidationFail\") }\r\n\r\n } else if (HighScoreValue >= LowScoreValue && this.highScoreIsBad) {\r\n return { customMessage: this.translationService.t(\"DrivingStyleMetricEditor.BadScoreMustBeHigherValidationFail\") }\r\n }\r\n\r\n return null;\r\n }\r\n }\r\n\r\n private validateRagBound(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n\r\n if (!this.metricForm) {\r\n return null;\r\n }\r\n\r\n const upperRagBoundValue: number = this.upperRagBoundControl?.value;\r\n const lowerRagBoundValue: number = this.lowerRagBoundControl?.value;\r\n\r\n if (upperRagBoundValue <= lowerRagBoundValue) {\r\n return { customMessage: this.translationService.t(\"DrivingStyleEditor.UpperRagBoundValidationFail\") }\r\n }\r\n\r\n return null;\r\n };\r\n }\r\n\r\n private determineScoreDirection(): void {\r\n this.highScoreIsBad = false;\r\n\r\n if (!this.metricMapping.defaults) {\r\n console.warn(\"No defaults mapped to metric mapping\", { metricMapping: this.metricMapping });\r\n return;\r\n }\r\n\r\n this.highScoreIsBad = this.metricMapping.defaults.HighScoreValue < this.metricMapping.defaults.LowScoreValue;\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'Common.Metric', sorted: true, width: 320 }),\r\n createCellFunction: mapping => this.vTableService.createTableCell(mapping.label)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'Common.Weighting', sortType: SortType.Number }),\r\n createCellFunction: mapping => this.vTableService.createTableCell(mapping.count, {\r\n component: VProgressBar,\r\n componentInputs: {\r\n percentage: mapping.count,\r\n roundNumber: false,\r\n grayscale: mapping.data !== this.metricMapping\r\n }\r\n })\r\n }\r\n ]\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from \"@angular/core\";\r\nimport { IAggregateFilterEvent, IFilterBarTab } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { copy } from \"angular\";\r\nimport { DrivingStyleMetric, DrivingStyleMetricCategory, DrivingStyleWeightingType } from \"../driving-styles.enums\";\r\nimport { IDrivingStyle, IDrivingStyleMetricMapping } from \"../driving-styles.interfaces\";\r\nimport { DrivingStylesService, IMetricMappingWeightingLevelDetail } from \"../driving-styles.service\";\r\nimport './driving-style-metric-selector.component.scss';\r\n\r\ninterface IDisplayDrivingStyleMetricMapping extends IDrivingStyleMetricMapping {\r\n selected?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'driving-style-metric-selector',\r\n template: require('./driving-style-metric-selector.component.html')\r\n})\r\nexport class DrivingStyleMetricSelectorComponent implements OnInit, OnChanges {\r\n\r\n @Input() drivingStyle: IDrivingStyle;\r\n @Input() maxAllowedMetrics: number = 0;\r\n @Input() weightingType: DrivingStyleWeightingType;\r\n @Input() availableMetricMappings: IDrivingStyleMetricMapping[];\r\n @Input() currentMetricMappings: IDrivingStyleMetricMapping[];\r\n @Output() currentMetricMappingsChange = new EventEmitter();\r\n\r\n @Output() metricMappingClick = new EventEmitter();\r\n\r\n displayMetricMappings: IDisplayDrivingStyleMetricMapping[];\r\n filteredMetricMappings: IDisplayDrivingStyleMetricMapping[];\r\n\r\n metricMappingWeightingLevelDetails: IMetricMappingWeightingLevelDetail[];\r\n\r\n filterTabs: IFilterBarTab[] = [];\r\n\r\n constructor(\r\n private readonly translationService: TranslationService,\r\n private readonly drivingStylesService: DrivingStylesService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.prepare();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n this.prepare();\r\n }\r\n\r\n prepare(): void {\r\n this.metricMappingWeightingLevelDetails = this.drivingStylesService.getMetricMappingWeightingLevelDetails();\r\n\r\n this.createDisplayMetricMappings();\r\n this.createFilterTabs();\r\n }\r\n\r\n metricMappingsSearchPredicate(metricMapping: IDisplayDrivingStyleMetricMapping, text: string): boolean {\r\n\r\n if (metricMapping.drivingStyleMetricName.toLocaleLowerCase().indexOf(text) >= 0) {\r\n return true;\r\n }\r\n\r\n if (metricMapping.drivingStyleMetricDescription.toLocaleLowerCase().indexOf(text) >= 0) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n onFilterBarChange(event: IAggregateFilterEvent) {\r\n if (!event.trigger) {\r\n return;\r\n }\r\n\r\n this.filteredMetricMappings = event.filteredData;\r\n\r\n this.sortFilteredMetricMappings();\r\n }\r\n\r\n onClickToggleMetricMapping(metricMapping: IDisplayDrivingStyleMetricMapping): void {\r\n if (this.currentMetricMappings?.length >= this.maxAllowedMetrics && !metricMapping.selected) {\r\n return;\r\n }\r\n\r\n metricMapping.selected = !metricMapping.selected;\r\n\r\n this.onToggleMetricMapping(metricMapping);\r\n }\r\n\r\n onToggleMetricMapping(metricMapping: IDisplayDrivingStyleMetricMapping): void {\r\n\r\n if (metricMapping.selected) {\r\n this.addMetricMappingToCurrent(metricMapping);\r\n return;\r\n }\r\n\r\n this.removeMetricMappingFromCurrent(metricMapping);\r\n }\r\n\r\n onClickMetricMapping(mouseEvent: MouseEvent, metricMapping: IDisplayDrivingStyleMetricMapping): void {\r\n mouseEvent.stopPropagation();\r\n\r\n if (!metricMapping.selected) {\r\n return;\r\n }\r\n\r\n this.metricMappingClick.emit(metricMapping);\r\n }\r\n\r\n //--\r\n\r\n private createDisplayMetricMappings(): void {\r\n const newDisplayMetricMappings: IDisplayDrivingStyleMetricMapping[] = [].concat(this.currentMetricMappings);\r\n\r\n newDisplayMetricMappings.forEach(newDisplayMetricMappings => newDisplayMetricMappings.selected = true);\r\n\r\n this.availableMetricMappings?.forEach(availableMetricMapping => {\r\n if (newDisplayMetricMappings.find(newDisplayMetricMapping => newDisplayMetricMapping.DrivingStyleMetric === availableMetricMapping.DrivingStyleMetric)) {\r\n return;\r\n }\r\n\r\n newDisplayMetricMappings.push(copy(availableMetricMapping));\r\n })\r\n\r\n this.displayMetricMappings = newDisplayMetricMappings;\r\n }\r\n\r\n private createFilterTabs(): void {\r\n this.filterTabs = [];\r\n\r\n this.createTabDefinition(this.translationService.t(\"Common.All\"), (r) => true);\r\n\r\n const usedMetricMappingCategories: DrivingStyleMetricCategory[] = [];\r\n\r\n if (!this.availableMetricMappings.length) {\r\n return;\r\n }\r\n\r\n this.availableMetricMappings.forEach(metricMapping => {\r\n if (usedMetricMappingCategories.includes(metricMapping.category) || metricMapping.DrivingStyleMetric === DrivingStyleMetric.Total) {\r\n return;\r\n }\r\n\r\n usedMetricMappingCategories.push(metricMapping.category);\r\n });\r\n\r\n if (!usedMetricMappingCategories.length) {\r\n return;\r\n }\r\n\r\n usedMetricMappingCategories.forEach(usedMetricMappingCategory => {\r\n this.createTabDefinition(this.translationService.tEnum(DrivingStyleMetricCategory, \"DrivingStyleMetricCategory\", usedMetricMappingCategory), (metricMapping) => metricMapping.category === usedMetricMappingCategory);\r\n });\r\n }\r\n\r\n private createTabDefinition(translationString: string, callback: (metricMapping: IDrivingStyleMetricMapping) => boolean): void {\r\n this.filterTabs.push({ title: translationString, predicate: callback });\r\n }\r\n\r\n private removeMetricMappingFromCurrent(metricMapping: IDisplayDrivingStyleMetricMapping): void {\r\n if (!this.currentMetricMappings?.length) {\r\n return;\r\n }\r\n\r\n const indexOfMetricMapping = this.currentMetricMappings.findIndex(currentMetricMapping => currentMetricMapping.DrivingStyleMetric === metricMapping.DrivingStyleMetric);\r\n\r\n if (indexOfMetricMapping === -1) {\r\n return;\r\n }\r\n\r\n metricMapping.selected = false;\r\n\r\n this.currentMetricMappings.splice(indexOfMetricMapping, 1);\r\n this.emitChange();\r\n }\r\n\r\n private addMetricMappingToCurrent(metricMapping: IDisplayDrivingStyleMetricMapping): void {\r\n if (this.currentMetricMappings.find(currentMetricMapping => currentMetricMapping.DrivingStyleMetric === metricMapping.DrivingStyleMetric)) {\r\n return;\r\n }\r\n\r\n const defaultMetricMappingPriorityOptions = this.metricMappingWeightingLevelDetails.find(option => option.isDefault);\r\n\r\n metricMapping.selected = true;\r\n metricMapping.Weighting = (this.weightingType > 0) ? defaultMetricMappingPriorityOptions.value : 0;\r\n metricMapping.HighScoreValue = metricMapping.defaults.HighScoreValue;\r\n metricMapping.LowScoreValue = metricMapping.defaults.LowScoreValue;\r\n\r\n this.currentMetricMappings.push(metricMapping);\r\n this.emitChange();\r\n }\r\n\r\n private emitChange(): void {\r\n this.currentMetricMappings?.forEach(metricMapping => this.drivingStylesService.addWeightingLevelDetailsToMetric(metricMapping, this.weightingType));\r\n this.currentMetricMappingsChange.emit(this.currentMetricMappings);\r\n }\r\n\r\n private sortFilteredMetricMappings(): void {\r\n if (!this.filteredMetricMappings?.length) {\r\n return;\r\n }\r\n\r\n this.filteredMetricMappings.sort((metricMapping1, metricMapping2) => metricMapping1.drivingStyleMetricName.localeCompare(metricMapping2.drivingStyleMetricName));\r\n }\r\n}\r\n","\r\nexport enum AlertRuleStatus {\r\n Active,\r\n Deleted,\r\n Paused\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output } from \"@angular/core\";\r\nimport { FormControl, FormGroup, Validators } from \"@angular/forms\";\r\nimport { getValuesFromEnum } from \"@app/class/Utilities\";\r\nimport { CustomFormValidators } from \"@app/directives/_forms/form-validation.service\";\r\nimport { SpecialUserPermissions } from \"@app/enum/SpecialUserPermissions\";\r\nimport { AccountUserType } from \"@app/enum/UserType\";\r\nimport { IUser } from \"@app/interfaces/IUser\";\r\nimport { AccountFeatureService, IAccountFeatureDescription, ISpecialUserPermissionDescriptionMap } from \"@app/services/accountFeature.service\";\r\nimport { UserService } from \"@app/services/users/user.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport copy from \"fast-copy\";\r\nimport { Observable } from \"rxjs\";\r\nimport './user-editor.component.scss';\r\nimport { UserEditorService } from \"./user-editor.service\";\r\nimport { AccountFeatures } from \"@app/enum/account/AccountFeature\";\r\nimport { LoginService } from \"@app/services/login.service\";\r\nimport { switchMap } from \"rxjs/operators\";\r\nimport { ILoginResponse } from \"@app/services/login.service.ajs\";\r\nimport { IPhoneNumberOutput } from \"@app/directives/_forms/smsInput/smsInput.interfaces\";\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'user-editor',\r\n template: require('./user-editor.component.html')\r\n})\r\nexport class UserEditorComponent implements OnInit, OnChanges {\r\n @Input() user: IUser;\r\n @Input() users: IUser[];\r\n @Output() userSave = new EventEmitter();\r\n\r\n amendedUser: IUser;\r\n\r\n userForm: FormGroup;\r\n\r\n AccountUserType = AccountUserType;\r\n SpecialUserPermission = SpecialUserPermissions;\r\n userTypes = getValuesFromEnum(AccountUserType);\r\n\r\n accountFeatureDescriptions$: Observable;\r\n specialUserPermissionsDescriptionsMap: ISpecialUserPermissionDescriptionMap;\r\n\r\n currentUserOnFoundationPlatform: boolean;\r\n\r\n loading: boolean;\r\n\r\n constructor(\r\n private readonly accountFeatureService: AccountFeatureService,\r\n private readonly loginService: LoginService,\r\n private readonly userEditorService: UserEditorService,\r\n private readonly userService: UserService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.currentUserOnFoundationPlatform = this.userService.isCurrentUserOnFoundationPlatform();\r\n this.accountFeatureDescriptions$ = this.userEditorService.getFeatureDescriptions(this.user.CurrentAccountUserMapping.AccountId);\r\n this.specialUserPermissionsDescriptionsMap = this.accountFeatureService.getSpecialUserPermissionsDescriptionsMap();\r\n }\r\n\r\n ngOnChanges(): void {\r\n this.createForm();\r\n };\r\n\r\n onAllowAllVehiclesToggled(): void {\r\n this.amendedUser.VehicleIds = (this.amendedUser.CurrentAccountUserMapping.AllowAllVehicles) ? [] : this.user.VehicleIds;\r\n }\r\n\r\n onAllowAllDriversToggled(): void {\r\n this.amendedUser.DriverIds = (this.amendedUser.CurrentAccountUserMapping.AllowAllDrivers) ? [] : this.user.DriverIds;\r\n }\r\n\r\n onAllowAllGeofencesToggled(): void {\r\n this.amendedUser.GeofenceIds = (this.amendedUser.CurrentAccountUserMapping.AllowAllGeofences) ? [] : this.user.GeofenceIds;\r\n }\r\n\r\n onReadFeatureChanged(accountFeature: AccountFeatures, enabled: boolean): void {\r\n if (enabled) { \r\n this.amendedUser.CurrentAccountUserMapping.ReadFeatures = this.amendedUser.CurrentAccountUserMapping.ReadFeatures | accountFeature;\r\n }\r\n else {\r\n this.amendedUser.CurrentAccountUserMapping.ReadFeatures = this.amendedUser.CurrentAccountUserMapping.ReadFeatures & ~accountFeature;\r\n }\r\n }\r\n\r\n onManageFeatureChanged(accountFeature: AccountFeatures, enabled: boolean): void {\r\n if (enabled) {\r\n this.amendedUser.CurrentAccountUserMapping.ManageFeatures = this.amendedUser.CurrentAccountUserMapping.ManageFeatures | accountFeature; \r\n }\r\n else {\r\n this.amendedUser.CurrentAccountUserMapping.ManageFeatures = this.amendedUser.CurrentAccountUserMapping.ManageFeatures & ~accountFeature; \r\n }\r\n }\r\n\r\n onSmsOutputChanged(output: IPhoneNumberOutput): void {\r\n if (!output.isValid) {\r\n return;\r\n }\r\n this.userForm.get('Phone').setValue(output.internationalized);\r\n }\r\n\r\n onCombinedManageFeatureChanged(accountFeature: AccountFeatures, enabled: boolean): void {\r\n this.onReadFeatureChanged(accountFeature, enabled);\r\n this.onManageFeatureChanged(accountFeature, enabled);\r\n }\r\n\r\n saveUser(): void {\r\n this.loading = true;\r\n this.userService.saveUserWithAccountMapping(this.amendedUser).pipe(untilDestroyed(this)).subscribe(userMapping => {\r\n if (this.amendedUser.Id === 0) {\r\n this.amendedUser.Id = userMapping.UserId;\r\n this.amendedUser.CurrentAccountUserMapping = userMapping;\r\n }\r\n\r\n this.userSave.emit(this.amendedUser);\r\n this.loading = false;\r\n });\r\n }\r\n\r\n loginAs(): void {\r\n this.loading = true;\r\n if (!this.currentUserOnFoundationPlatform) {\r\n this.loading = false;\r\n return;\r\n }\r\n\r\n this.userService.getLoginToken(this.user.Id)\r\n .pipe(\r\n untilDestroyed(this),\r\n switchMap((token: string) => {\r\n return this.loginService.loginWithToken(token, true)\r\n }))\r\n .subscribe((response: ILoginResponse) => {\r\n this.loginService.switchAccount(this.user.CurrentAccountUserMapping.AccountId, true).then((loginResponse) => {\r\n this.loading = false;\r\n })\r\n });\r\n }\r\n\r\n //--\r\n\r\n private setAmendedUser(): void {\r\n this.amendedUser = copy(this.user);\r\n this.amendedUser.newUserLanguageCode = localStorage.getItem('userSelectedLanguageCode') ?? 'en';\r\n }\r\n\r\n private createForm(): void {\r\n const emailValidators = [Validators.required, CustomFormValidators.emptyWhiteSpace, Validators.email];\r\n if (this.user?.Id <= 0) {\r\n emailValidators.push(CustomFormValidators.duplicateEmail(this.users))\r\n }\r\n\r\n this.userForm = new FormGroup({\r\n \"Name\": new FormControl(this.user.CurrentAccountUserMapping?.Name || \"\", [Validators.required, CustomFormValidators.emptyWhiteSpace]),\r\n \"Email\": new FormControl(this.user.Email || \"\", emailValidators),\r\n \"Phone\": new FormControl(this.user.CurrentAccountUserMapping?.Phone || \"\", [CustomFormValidators.emptyWhiteSpace])\r\n })\r\n\r\n this.setAmendedUser();\r\n\r\n this.userForm.statusChanges.pipe(untilDestroyed(this)).subscribe(changes => {\r\n\r\n this.amendedUser = {\r\n ...this.amendedUser,\r\n Email: this.userForm.value.Email,\r\n CurrentAccountUserMapping: {\r\n ...this.amendedUser.CurrentAccountUserMapping,\r\n Name: this.userForm.value.Name,\r\n Phone: this.userForm.value.Phone\r\n }\r\n }\r\n })\r\n }\r\n\r\n}\r\n","export enum ReeferZoneOperatingModeCategory {\r\n Unknown = -1,\r\n PowerOff = 0,\r\n Heating = 1,\r\n Cooling = 2,\r\n Idle = 3,\r\n Defrost = 4,\r\n Pretrip = 5,\r\n Sleep = 6\r\n}\r\n","export enum ZoneStatus {\r\n Active,\r\n Inactive\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { getOptionsQueryParams } from \"@app/class/Utilities\";\r\nimport { ICameraRequestUpdateMessage } from \"@app/main/modules/foundation/_routes/developerConsole/log-message.model\";\r\nimport { SignalRService, WebSocketEvents } from \"@app/main/modules/foundation/_routes/developerConsole/signalr.service\";\r\nimport { IConfigCameraRequest, IConfigurationRequestQueryOptions } from \"@app/main/modules/foundation/_routes/rv-lite/camera-config/camera-configuration.models\";\r\nimport { Observable, Subject } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CameraConfigurationRequestService {\r\n\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly signalRService: SignalRService) { }\r\n\r\n configRequestUpdateReceived = new Subject();\r\n\r\n getConfigurationRequests(queryOptions: IConfigurationRequestQueryOptions): Observable {\r\n const params = getOptionsQueryParams(queryOptions);\r\n return this.http.get(`/api/cameras/commserver/configurations/requests`, params);\r\n }\r\n\r\n postConfigurationRequest(configRequest: IConfigCameraRequest): Observable {\r\n return this.http.post(`/api/cameras/commserver/configurations/requests`, configRequest);\r\n }\r\n\r\n getConfigurationRequestUpdates(serial: string): Observable {\r\n this.signalRService.initialise().then(() => {\r\n this.signalRService.joinDeviceGroup(serial);\r\n this.signalRService.registerEvents(WebSocketEvents.LogRequestUpdate, this.configRequestUpdateReceived);\r\n });\r\n\r\n return this.configRequestUpdateReceived;\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { Observable } from \"rxjs\";\r\nimport { IUser } from \"../../../../interfaces/IUser\";\r\nimport { IUserResellerMapping } from \"../_models/IUserResellerMapping\";\r\nimport { IUserResellerMappingQueryOptions } from \"../_models/IUserResellerMappingQueryOptions\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FoundationUserResellerMappingService {\r\n constructor(private readonly http: HttpClient) {}\r\n\r\n getMappings(options: IUserResellerMappingQueryOptions = {}): Observable {\r\n return this.http.get(\"/api/foundation/userResellerMappings\", { params: options as HttpParams });\r\n }\r\n\r\n getCurrentUserMappings(): Observable {\r\n return this.http.get(\"/api/foundation/userResellerMappings/current\");\r\n }\r\n\r\n updateMappings(user: IUser): Observable {\r\n return this.http.post(`/api/foundation/userResellerMappings/update/${user.Id}`, user.ResellerIds);\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, Output } from \"@angular/core\";\r\nimport { ReasonCode } from \"@app/enum/ReasonCode\";\r\nimport { IPlot } from \"@app/interfaces/IPlot\";\r\nimport { IVideoEntry } from \"@app/main/components/videos/models/IVideoEntry\";\r\nimport { VideoEntryService } from \"@app/main/components/videos/services/video-entry.service\";\r\nimport { CameraCommunicationServer, IDeviceInfo } from \"@app/services/cameraCommunicationServer.service\";\r\nimport { DateService, DateUnit } from \"@app/services/date.service\";\r\nimport { PlotService } from \"@app/services/plot.service\";\r\nimport { ICheck } from \"../../_models/ICheck\";\r\nimport './diagnostics-4g.component.scss';\r\n\r\n@Component({\r\n selector: 'diagnostics-4g',\r\n template: require('./diagnostics-4g.component.html')\r\n})\r\nexport class Diagnostics4gComponent implements OnChanges {\r\n @Input() serial: string;\r\n @Input() vehicleId: number;\r\n\r\n plot: IPlot;\r\n valkVideoEntry: IVideoEntry;\r\n device: IDeviceInfo;\r\n checks: { string: ICheck } | {};\r\n\r\n processing: boolean;\r\n diagnosticsFailed: boolean = false;\r\n\r\n roadview = /ROADVIEW/i;\r\n connexas = /CONNEXAS/i;\r\n uat = /UAT/i;\r\n dev = /DEV/i;\r\n\r\n @Output() processingChanged = new EventEmitter();\r\n\r\n constructor(\r\n private readonly cameraCommunicationServer: CameraCommunicationServer,\r\n private readonly videoEntryService: VideoEntryService,\r\n private readonly dateService: DateService,\r\n private readonly plotService: PlotService) { }\r\n\r\n \r\n ngOnChanges(): void {\r\n this.refreshDiagnosticsTests();\r\n }\r\n\r\n refreshDiagnosticsTests(){\r\n if (!this.serial) return;\r\n\r\n this.checks = {};\r\n\r\n this.processing = true;\r\n this.setCheckLabels(\"Checking\");\r\n\r\n this.processingChanged.emit(this.processing);\r\n this.getData();\r\n }\r\n\r\n private getData() {\r\n (this.cameraCommunicationServer\r\n .getDeviceInfo(this.serial) as Promise)\r\n .then((deviceInfo: IDeviceInfo) => {\r\n if (!deviceInfo) {\r\n this.diagnosticsFailed = true;\r\n }\r\n else {\r\n this.device = deviceInfo;\r\n\r\n return Promise.all([\r\n this.plotService.getLatestPlotForVehicle(this.vehicleId) as Promise,\r\n this.getValkVideoEntry(75, this.parseExternalId(this.device.CameraLatestVideos.length != 0 ? this.device.CameraLatestVideos[0].FileName : \"\")) as Promise,\r\n ]);\r\n }\r\n })\r\n .then(([plot, valkVideoEntry]) => {\r\n this.plot = plot\r\n this.valkVideoEntry = valkVideoEntry;\r\n })\r\n .catch((error) => {\r\n this.diagnosticsFailed = true;\r\n })\r\n .finally(() => {\r\n this.processing = false;\r\n\r\n this.processingChanged.emit(this.processing)\r\n\r\n if (this.device) {\r\n this.validate4Gdevice();\r\n }\r\n else {\r\n this.checks = {};\r\n }\r\n });\r\n }\r\n\r\n private setCheckLabels(action: \"Check\" | \"Checking\"): void {\r\n\r\n [\r\n [\"pulsePacket\", \"Diagnostics data\"],\r\n [\"gpsAccuracy\", \"GPS accuracy\"],\r\n [\"receivingDelay\", \"Receiving delay\"],\r\n [\"lastIgnition\", \"Last ignition\"],\r\n [\"operator\", \"Operator\"],\r\n [\"sdCard\", \"SD card\"],\r\n [\"camerasCount\", \"Cameras count\"],\r\n [\"videos\", \"Videos\"],\r\n [\"firmware\", \"Firmware\"],\r\n [\"config\", \"Config\"],\r\n ].forEach((label) => {\r\n this.checks[label[0]] = {\r\n loadingLabel: `${action} ${label[1]}`,\r\n };\r\n });\r\n }\r\n\r\n private validate4Gdevice(): void {\r\n this.checks = {\r\n pulsePacket: this.processPulsePacket(this.device, this.plot),\r\n gpsAccuracy: this.processGPSAccuracy(this.device),\r\n receivingDelay: this.processReceivingDelay(this.plot),\r\n lastIgnition: this.processLastIgnitionData(this.device, this.plot),\r\n operator: this.processOperator(this.device),\r\n sdCard: this.processSDcard(this.device),\r\n camerasCount: this.processCamerasCount(this.device),\r\n videos: this.processVideo(this.valkVideoEntry, this.device),\r\n firmware: this.processFirmware(this.device),\r\n config: this.processConfig(this.device),\r\n };\r\n }\r\n\r\n private processPulsePacket(device: IDeviceInfo, plot: IPlot): ICheck {\r\n if (!device.LastConnected) {\r\n return {\r\n failedLabel: \"No data\"\r\n };\r\n }\r\n\r\n const packetDelayMinutes = this.dateService.getDiff(new Date(), device.LastConnected, DateUnit.Min);\r\n const plotDelayMinutes = plot ? this.dateService.getDiff(new Date(), plot.Utc, DateUnit.Min) : false;\r\n\r\n switch (true) {\r\n case packetDelayMinutes > 35:\r\n return {\r\n warningLabel: `Diagnostics data last received ${this.dateService.formatDate(device.LastConnected)}`,\r\n subText: `Possible causes: Camera is offline, SIM is blocked, updater crashed`,\r\n };\r\n\r\n case packetDelayMinutes < 35 && plotDelayMinutes && plotDelayMinutes > 90:\r\n return {\r\n subText: \"Telematic app is crashed or API is down\"\r\n };\r\n\r\n case packetDelayMinutes < 35 && plotDelayMinutes && plotDelayMinutes < 90 && plot.Reason === ReasonCode.Wakeup:\r\n this.dateService.getDiff(plot.Utc, device.LastIgnitionChangeTime, DateUnit.Hour);\r\n if ((this.dateService.getDiff(plot.Utc, device.LastIgnitionChangeTime, DateUnit.Hour)) > 12) {\r\n return {\r\n failedLabel: \"Diagnostics data is outdated\",\r\n subText: `Possible issues: wrong camera installation, ignition wire is connected directly to the battery`,\r\n }\r\n }\r\n }\r\n\r\n return {\r\n successLabel: \"Diagnostics data is up to date\",\r\n subText: `Diagnostics data last received ${this.dateService.formatDate(device.LastConnected)}`\r\n }\r\n }\r\n\r\n private processGPSAccuracy(device: IDeviceInfo): ICheck {\r\n if (device.SatCount < 4 || !device.GPSAccuracy || device.GPSAccuracy > 15 || (!device.Lat || !device.Lon)) {\r\n\r\n return {\r\n failedLabel: \"GPS is inaccurate\",\r\n subText: `Poor signal: ${device.SatCount} satellites, ${device.GPSAccuracy}m accuracy`\r\n }\r\n }\r\n\r\n if (device.SatCount < 5 || !device.GPSAccuracy || device.GPSAccuracy > 10 || (!device.Lat || !device.Lon)) {\r\n return {\r\n warningLabel: \"GPS potentially inaccurate\",\r\n subText: `${device.SatCount} satellites, ${device.GPSAccuracy}m accuracy`\r\n }\r\n }\r\n\r\n return {\r\n successLabel: \"GPS is accurate\"\r\n }\r\n }\r\n\r\n private processReceivingDelay(plot: IPlot): ICheck {\r\n if (!plot) {\r\n return {\r\n failedLabel: \"Plot data missing\",\r\n subText: \"Plot data missing on Verilocation\"\r\n }\r\n }\r\n \r\n const delay = this.dateService.getDiff(plot.UtcHost, plot.Utc, DateUnit.Sec);\r\n\r\n switch (true) {\r\n case delay <= (2.5 * 60): // 150 seconds/2.5 minutes\r\n return {\r\n successLabel: \"Plot data delay\",\r\n subText: \"Less than 2.5 minutes\"\r\n }\r\n\r\n case delay >= (2.5 * 60) && delay <= (5 * 60):\r\n return {\r\n warningLabel: \"Plot data delay\",\r\n subText: \"More than 2.5 minutes\"\r\n };\r\n\r\n case delay > (5 * 60):\r\n return {\r\n failedLabel: \"Plot data delay\",\r\n subText: \"More than 5 minutes\"\r\n };\r\n }\r\n }\r\n\r\n private processLastIgnitionData(device: IDeviceInfo, plot: IPlot): ICheck {\r\n\r\n switch (true) {\r\n \r\n \r\n case plot && device.LastIgnitionChangeTime && (!plot.IsIgnitionOn || this.dateService.getDiff(plot.Utc, device.LastIgnitionChangeTime, DateUnit.Hour) <= 12):\r\n return {\r\n successLabel: `Ignition OK`,\r\n subText: `Last went ${plot.IsIgnitionOn ? 'on' : 'off'} - ${this.dateService.relativeTime(plot.Utc)}`\r\n }\r\n \r\n case plot && !!plot.IsIgnitionOn && this.dateService.getDiff(plot.Utc, device.LastIgnitionChangeTime, DateUnit.Hour) > 12:\r\n return {\r\n failedLabel: `Ignition: possible wiring issue`,\r\n subText: `Last went ${plot.IsIgnitionOn ? 'on' : 'off'} - more than 12 hours ago`\r\n }\r\n\r\n default:\r\n return {\r\n warningLabel: \"Ignition status unknown\",\r\n subText: `Some data is missing that is required for a complete check. Last seen ignition change was ${this.dateService.relativeTime(device.LastIgnitionChangeTime || plot?.Utc)}`\r\n }\r\n }\r\n }\r\n\r\n private processOperator(device: IDeviceInfo): ICheck {\r\n if (!device.NetworkOperator) {\r\n return {\r\n infoLabel: `No network data`\r\n };\r\n }\r\n\r\n return {\r\n infoLabel: `Operator: ${device.NetworkOperator}`\r\n };\r\n }\r\n\r\n private processSDcard(device: IDeviceInfo): ICheck {\r\n const { SDCardSerial, SDCardAvailableMB, SDCardSizeMB, SDCardLabel } = device;\r\n\r\n switch (true) {\r\n case !SDCardSerial:\r\n return {\r\n failedLabel: \"SD card not detected\",\r\n subText: \"Make sure an SD card is installed.\",\r\n };\r\n\r\n case !SDCardLabel.includes(\"128\") && !SDCardLabel.includes(\"256\"):\r\n return {\r\n failedLabel: `${SDCardLabel} card installed`,\r\n subText: \"Required SD card capacity is 128GB or 256GB\",\r\n };\r\n\r\n case SDCardAvailableMB <= SDCardSizeMB * 0.02:\r\n return {\r\n warningLabel: \"SD card: available space is below 2%\",\r\n subText: \"Please send a reboot command to free space\",\r\n };\r\n\r\n\r\n default:\r\n return {\r\n successLabel: `SD card: ${this.device.SDCardLabel} (${Math.round(100 / this.device.SDCardSizeMB * this.device.SDCardAvailableMB)}% free)`,\r\n };\r\n }\r\n }\r\n\r\n private processCamerasCount(device: IDeviceInfo): ICheck {\r\n if (!device.AvailableChannels) {\r\n return { failedLabel: \"No cameras detected\" };\r\n }\r\n\r\n const camCount = device.AvailableChannels.split(\",\").length;\r\n\r\n if (camCount == 0) {\r\n return {\r\n warningLabel: \"0 cameras channels found\",\r\n subText: \"The camera requires at least 1 active channel\"\r\n }\r\n }\r\n const infoLabel = camCount == 1 ? \"1 camera\" : `${camCount} cameras`;\r\n\r\n return {\r\n infoLabel\r\n }\r\n }\r\n\r\n private processVideo(videoEntry: null | IVideoEntry, device: IDeviceInfo): ICheck {\r\n if (videoEntry !== null && videoEntry.Status == 7) { // 7 - downloaded\r\n return {\r\n successLabel: \"Videos\",\r\n subText: \"Latest video available on Verilocation\"\r\n }\r\n }\r\n if (videoEntry === null) {\r\n\r\n if (device.CameraLatestVideos.length > 0) {\r\n return {\r\n warningLabel: \"Videos\",\r\n subText: `No uploaded videos found on Verilocation, ${this.checkProdConfigName(device.ConfigName) ? \"Camera is pointed to Production\" : \"Camera isn't pointed to Production\"}`\r\n }\r\n }\r\n else {\r\n return {\r\n failedLabel: \"Videos\",\r\n subText: \"Camera did not upload any video\"\r\n }\r\n }\r\n\r\n }\r\n\r\n return {\r\n failedLabel: \"Videos\",\r\n subText: \"Latest video isn't uploaded on Verilocation\"\r\n }\r\n }\r\n\r\n private parseExternalId(fileNameWithExtension: string): string {\r\n let [fileName, extension] = fileNameWithExtension.split('.');\r\n let [fileNameWOChannelSuffix] = fileName.split('_CH');\r\n return fileNameWOChannelSuffix;\r\n }\r\n\r\n private checkProdConfigName(deviceConfigName: string): boolean {\r\n\r\n return deviceConfigName.includes(\"ProdLive\");\r\n }\r\n\r\n private getValkVideoEntry(productGroupId: number, externalId: string): angular.IPromise {\r\n return this.videoEntryService\r\n .getVideoEntryByProductGroupIdAndExternalId(productGroupId, externalId)\r\n .then((videos) => {\r\n return videos;\r\n }) as angular.IPromise;\r\n }\r\n\r\n private processFirmware(device: IDeviceInfo): ICheck {\r\n const {\r\n ProdUpdaterId,\r\n ProdTelematicsId,\r\n UpdaterId,\r\n TelematicsId,\r\n TelematicsRequestedId,\r\n UpdaterRequestedId,\r\n IsAutoDeployment,\r\n } = device;\r\n\r\n switch (true) {\r\n case !UpdaterId && !UpdaterRequestedId && !TelematicsId && !TelematicsRequestedId:\r\n return {\r\n failedLabel: \"Firmware is missing\",\r\n };\r\n\r\n case !IsAutoDeployment && !!UpdaterId && !TelematicsId:\r\n return {\r\n failedLabel: \"Telematics is missing\",\r\n };\r\n\r\n case !IsAutoDeployment && !UpdaterId && !!TelematicsId:\r\n return {\r\n failedLabel: \"Updater is missing\",\r\n };\r\n\r\n case !IsAutoDeployment && !!UpdaterId && !!TelematicsId:\r\n return {\r\n successLabel: \"Firmware is installed\",\r\n };\r\n\r\n case !!IsAutoDeployment &&\r\n UpdaterId === ProdUpdaterId &&\r\n TelematicsId === ProdTelematicsId:\r\n return {\r\n successLabel: \"Firmware is up to date\",\r\n };\r\n\r\n case !!IsAutoDeployment && UpdaterId !== ProdUpdaterId && TelematicsId !== ProdTelematicsId:\r\n return {\r\n warningLabel: \"Firmware is obsolete\",\r\n };\r\n\r\n case !!IsAutoDeployment && UpdaterId === ProdUpdaterId && TelematicsId !== ProdTelematicsId:\r\n return {\r\n warningLabel: \"Telematics is obsolete\",\r\n };\r\n\r\n case !!IsAutoDeployment && UpdaterId !== ProdUpdaterId && TelematicsId === ProdTelematicsId:\r\n return {\r\n warningLabel: \"Updater is obsolete\",\r\n };\r\n }\r\n }\r\n\r\n private processConfig(device: IDeviceInfo): ICheck {\r\n const { ConfigId, ConfigName } = device;\r\n\r\n switch (true) {\r\n case !ConfigId:\r\n return { failedLabel: \"Config is missing\" };\r\n\r\n case (!this.roadview.test(ConfigName) && !this.connexas.test(ConfigName)) || this.uat.test(ConfigName) || this.dev.test(ConfigName):\r\n return {\r\n warningLabel: \"Config is invalid\",\r\n };\r\n\r\n default:\r\n return { successLabel: \"Config is valid\" };\r\n }\r\n }\r\n}\r\n","import { IVehicle } from '@interfaces/IVehicle';\r\nimport { CacheService } from '@services/cache.Service';\r\nimport { IVehiclePeripheralMapping } from '@interfaces/IVehiclePeripheralMapping';\r\n\r\nexport class FoundationVehicleService {\r\n\r\n foundationVehiclesCache = \"foundationVehiclesCache\";\r\n foundationActiveVehiclesCache = \"foundationActiveVehiclesCache\";\r\n\r\n static $inject = [\"$http\", \"cacheService\"];\r\n\r\n constructor(\r\n private readonly $http: angular.IHttpService,\r\n private readonly cacheService: CacheService) {\r\n\r\n this.cacheService.createCache(this.foundationVehiclesCache, { maxAge: 5 * 60 * 1000 });\r\n this.cacheService.createCache(this.foundationActiveVehiclesCache, { maxAge: 5 * 60 * 1000 });\r\n }\r\n\r\n createUpdateVehicle(vehicle: IVehicle): angular.IPromise {\r\n return this.$http({\r\n url: `/api/foundation/vehicles/`,\r\n data: vehicle,\r\n method: \"POST\"\r\n }).then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n updateVehicleData(vehicle: IVehicle): angular.IPromise {\r\n return this.$http({\r\n url: `/api/foundation/vehicles/updatevehicledata`,\r\n data: vehicle,\r\n method: \"POST\"\r\n }).then((result: angular.IHttpResponse) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n createVehicle(): angular.IPromise {\r\n return this.$http({\r\n url: `/api/foundation/vehicles/`,\r\n method: \"GET\",\r\n cache: false\r\n }).then(response => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getVehicle(vehicleId: number, invalidateCache = false): angular.IPromise {\r\n return this.$http({\r\n url: `/api/foundation/vehicles/${vehicleId}`,\r\n method: \"GET\",\r\n cache: false\r\n }).then(response => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getVehicles(invalidateCache = false): angular.IPromise {\r\n return this.cacheService.getOrRetrieveData(this.foundationVehiclesCache, () => this.getVehiclesFromDatabase(), invalidateCache);\r\n }\r\n\r\n getActiveVehicles(invalidateCache = false): angular.IPromise {\r\n return this.cacheService.getOrRetrieveData(this.foundationActiveVehiclesCache, () => this.getVehiclesFromDatabase(true), invalidateCache);\r\n }\r\n\r\n getVehiclesExtended(): angular.IPromise {\r\n return this.$http({\r\n url: `/api/foundation/vehicles/extendedinfo/`,\r\n method: \"GET\",\r\n cache: false\r\n }).then(response => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getPeripheralMapping(serial: string): angular.IPromise {\r\n return this.$http({\r\n url: `/api/foundation/vehicles/peripheral/${serial}`,\r\n method: \"GET\",\r\n cache: false\r\n }).then(response => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getVehicleUnitLocation(vehicleId: number): angular.IPromise {\r\n return this.$http({\r\n url: `/api/foundation/vehicles/${vehicleId}/unitlocation`,\r\n method: \"GET\",\r\n cache: false\r\n }).then(response => {\r\n return response.data;\r\n })\r\n }\r\n\r\n createVehicleMap(vehicles: IVehicle[]): Map {\r\n return new Map(vehicles.map(a => [a.Id, a]));\r\n }\r\n\r\n // ---\r\n\r\n private getVehiclesFromDatabase(activeVehiclesOnly: boolean = false) {\r\n return this.$http({\r\n url: `/api/foundation/vehicles/`,\r\n method: \"GET\",\r\n cache: false,\r\n params: { activeVehiclesOnly }\r\n }).then(response => {\r\n\r\n response.data.forEach(v => {\r\n\r\n\r\n });\r\n return response.data;\r\n });\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { NonTestableDevices } from \"@foundation/foundation.enums\";\r\nimport { IManualValidationCheckCategory } from \"@foundation/foundation.interfaces\";\r\n\r\nexport enum ManualTests {\r\n DvsAlarm,\r\n DvsNearsideCamera,\r\n LightsWork,\r\n SpinningTest\r\n}\r\n@Injectable()\r\nexport class ManualDeviceValidationCheckService {\r\n\r\n\r\n createPeripheralTestCategories(peripheralType: NonTestableDevices): IManualValidationCheckCategory {\r\n switch (peripheralType) {\r\n case NonTestableDevices.DVS:\r\n return {\r\n name: \"DVS Validation\", section: NonTestableDevices.DVS ,checks: [\r\n { name: \"DVS Alarm\", assertion: \"Does the alarm sound when left turn initiated?\", test: ManualTests.DvsAlarm },\r\n { name: \"DVS Nearside Camera\", assertion: \"Does the Nearside camera show when left turn initiated?\", test: ManualTests.DvsNearsideCamera }]\r\n }\r\n case NonTestableDevices.Transcan:\r\n return {\r\n name: \"Transcan Validation\", section: NonTestableDevices.Transcan, checks: [\r\n { name: \"Lights Work\", assertion: \"Do the Lights flash?\", test: ManualTests.LightsWork },\r\n { name: \"Spinning Test\", assertion: \"Does the unit spin like it's being dragged into a hellish vortex?\", test: ManualTests.SpinningTest }\r\n ]\r\n }\r\n default:\r\n return;\r\n }\r\n }\r\n}\r\n","import { Component, Input, OnChanges, OnInit } from \"@angular/core\";\r\nimport { getValuesFromEnum } from \"@app/class/Utilities\";\r\nimport { DeviceCommunicationType } from \"@app/enum/deviceMessage/DeviceCommunicationType\";\r\nimport { DistanceMeasurement } from \"@app/enum/measurements/DistanceMeasurement.enum\";\r\nimport { IDeviceCommand, IDeviceCommunicationCommand } from \"@app/interfaces/IDeviceMessage\";\r\nimport { UnitLocation } from \"@app/main/modules/foundation/_enums/UnitLocations\";\r\nimport { ISerialSearchResponse } from \"@app/main/modules/foundation/_models/ISerialSearchResponse\";\r\nimport { ValidationCheckType } from \"@app/main/modules/foundation/_services/device-data-validation.service\";\r\nimport { DeviceMessageService } from \"@app/main/modules/foundation/_services/deviceMessage.service\";\r\nimport { FoundationVehicleService } from \"@app/main/modules/foundation/_services/vehicle.service.ajs\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { ProductVendor } from \"@components/videos/enums/CameraProductType\";\r\nimport { VButtonStatus } from \"@directives/_forms/v-input/v-input.component\";\r\nimport { AccountFeatures } from \"@enums/account/AccountFeature\";\r\nimport { CommissionDurationPeriods, EngineerJobItemType, NonTestableDevices, ValidationResult } from \"@foundation/foundation.enums\";\r\nimport { IDeviceToAdd, IEngineerCommission, IValidationResultCategory, IValidationResults } from \"@foundation/foundation.interfaces\";\r\nimport { CommissionService } from \"@foundation/_routes/commissions/commission.service\";\r\nimport { ManualDeviceValidationCheckService } from \"@foundation/_services/manual-device-validation-check.service\";\r\nimport { FoundationPeripheralService } from \"@foundation/_services/peripheral.service.ajs\";\r\nimport { IKeyValuePair } from \"@interfaces/IKeyValuePair\";\r\nimport { IUnit, SavedState } from \"@interfaces/IPeripheral\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { EnumService } from \"@services/enum.service\";\r\nimport { Observable, Subscription } from \"rxjs\";\r\nimport { take, tap } from \"rxjs/operators\";\r\nimport \"./device-install-editor.component.scss\";\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: \"foundation-device-install-editor\",\r\n template: require('./device-install-editor.component.html')\r\n})\r\nexport class DeviceInstallEditor implements OnInit, OnChanges {\r\n\r\n // bindings\r\n\r\n @Input() commission: IEngineerCommission;\r\n\r\n // internal\r\n\r\n loading = false;\r\n\r\n serial: string;\r\n devicesUpdated: boolean = false;\r\n deviceToAdd: IDeviceToAdd;\r\n devicesInstalled: IDeviceToAdd[];\r\n\r\n existingDeviceToValidate: IDeviceToAdd;\r\n existingDeviceUnitToValidate: IUnit;\r\n\r\n pendingUnitChanges: IUnit[];\r\n\r\n allowAddButton = false;\r\n allowRemoveButton = false;\r\n showAddDevice = false;\r\n showBarcodeScanner = false;\r\n showExistingHardwareValidation = false;\r\n\r\n checkResults: IValidationResultCategory[] = [];\r\n\r\n ptoActive: boolean = false;\r\n peripheralNoTrackerError = false;\r\n unitSupportsTemperatureProbes: boolean = false;\r\n includeTemperatureTests: boolean = false;\r\n\r\n nonTestableDevice: boolean = false;\r\n nonTestableDeviceTypesAdded: NonTestableDevices = NonTestableDevices.DVS;\r\n\r\n // enums\r\n DurationPeriod = CommissionDurationPeriods;\r\n NonTestableDevices: IKeyValuePair[] = [];\r\n\r\n validationResults: IValidationResults;\r\n requiresUnitLocation: boolean = false;\r\n\r\n editGpsOdo: boolean = false;\r\n\r\n currentOdoKm: number = 0;\r\n currentOdoMiles: number = 0;\r\n DistanceMeasurement = DistanceMeasurement;\r\n distanceMeasurementOptions = Object.keys(DistanceMeasurement).filter(s => !isNaN(Number(s))).map(s => Number(s));\r\n distanceMeasurement: DistanceMeasurement = DistanceMeasurement.Miles;\r\n distanceRaw: number = 0;\r\n distanceInMetres: number = 0;\r\n odoSetCommand: IDeviceCommunicationCommand;\r\n milesConversionConstant = 1609.344;\r\n kilometreConversionConstant = 1000;\r\n\r\n serialSearch: Subscription;\r\n preselectableLocations = getValuesFromEnum(UnitLocation).map(value => this.translationService.tEnum(UnitLocation, \"UnitLocation\", value));\r\n UnitLocation = UnitLocation;\r\n\r\n constructor(\r\n private readonly manualDeviceValidationCheckService: ManualDeviceValidationCheckService,\r\n private readonly commissionService: CommissionService,\r\n private readonly foundationPeripheralService: FoundationPeripheralService,\r\n private readonly foundationVehicleService: FoundationVehicleService,\r\n private readonly translationService: TranslationService,\r\n private readonly deviceMessageService: DeviceMessageService) {\r\n\r\n this.resetDeviceToAdd();\r\n }\r\n\r\n // Todo\r\n // Add temp to all tracking units (not obd?), not gl500\r\n // Check box on next page confirming everything, so tick for all?\r\n\r\n ngOnInit(): void {\r\n this.createnonTestDeviceTypes();\r\n }\r\n\r\n ngOnChanges(): void {\r\n this.resetDeviceToAdd();\r\n this.getSelectedVehiclePeripherals();\r\n\r\n switch (this.commission.VisitReasonId) {\r\n case EngineerJobItemType.Install:\r\n case EngineerJobItemType.Reinstall:\r\n this.allowAddButton = true;\r\n this.allowRemoveButton = false;\r\n break;\r\n\r\n case EngineerJobItemType.Uninstall:\r\n this.allowRemoveButton = true;\r\n this.allowAddButton = false;\r\n break;\r\n\r\n case EngineerJobItemType.ServiceCall:\r\n this.allowAddButton = true;\r\n this.allowRemoveButton = true;\r\n\r\n default:\r\n this.allowAddButton = true;\r\n this.allowRemoveButton = true;\r\n }\r\n\r\n if (!this.commission.Peripherals) {\r\n this.commission.Peripherals = [];\r\n }\r\n\r\n }\r\n\r\n get canRunTemperatureTests(): boolean {\r\n return !!this.deviceToAdd?.searchResponse?.Unit;\r\n }\r\n\r\n get showGpsOdo(): boolean {\r\n return this.deviceToAdd?.searchResponse?.Product?.IsTracker;\r\n }\r\n\r\n get isServiceCall(): boolean {\r\n return this.commission.VisitReasonId == EngineerJobItemType.ServiceCall;\r\n }\r\n\r\n get disableAdd(): boolean {\r\n return this.deviceToAdd?.buttonStatus != VButtonStatus.Success || (!this.commission.vehicle?.UnitLocation?.length && this.deviceToAdd.searchResponse?.Product?.IsTracker);\r\n }\r\n\r\n get removedDevicesExist(): boolean {\r\n return this.commission.pendingCommissionChanges.some(d => d.Unit.savedState == SavedState.RemovedRequiresSave);\r\n }\r\n\r\n get formIsValid(): boolean {\r\n return (!this.commission.Chargeable\r\n || (this.commission.Chargeable && this.commission.ChargeReason?.length > 0))\r\n && this.devicesUpdated;\r\n }\r\n\r\n onDevicechanged(deviceType: string): void {\r\n this.nonTestableDeviceTypesAdded = NonTestableDevices[deviceType];\r\n }\r\n\r\n onSimUpdated(simId: number): void {\r\n this.devicesUpdated = true;\r\n }\r\n\r\n addNonTestableDevice(peripheral: NonTestableDevices): void {\r\n this.deviceToAdd = {\r\n serial: \"\",\r\n inputStatus: VButtonStatus.Default,\r\n buttonStatus: VButtonStatus.Default\r\n };\r\n\r\n this.deviceToAdd.manualCategories = (this.manualDeviceValidationCheckService.createPeripheralTestCategories(peripheral));\r\n }\r\n\r\n serialChanged(serial: string): void {\r\n if (this.deviceToAdd.serial == serial) {\r\n return;\r\n }\r\n\r\n this.deviceToAdd.buttonStatus = VButtonStatus.Default;\r\n this.deviceToAdd.serial = serial;\r\n\r\n if (this.deviceToAdd.serial == null) {\r\n this.deviceToAdd.searchResponse = null;\r\n return;\r\n }\r\n\r\n if (!this.deviceToAdd.searchResponse) {\r\n this.deviceToAdd.searchResponse = { parentTrackerImei: this.commission?.Imei }\r\n return;\r\n }\r\n\r\n this.deviceToAdd.searchResponse.parentTrackerImei = this.commission?.Imei;\r\n }\r\n\r\n onBarcodeSelected(barcode): void {\r\n this.showBarcodeScanner = false;\r\n this.serial = barcode;\r\n this.serialChanged(this.serial);\r\n }\r\n\r\n onBarcodeScanned(barcode): void {\r\n this.serialSearch?.unsubscribe();\r\n\r\n this.serialSearch = this.searchForSerial(barcode).pipe(\r\n untilDestroyed(this),\r\n tap(response => {\r\n if (!response || Object.keys(response).length === 0) {\r\n return;\r\n }\r\n\r\n this.onBarcodeSelected(barcode)\r\n })).subscribe();\r\n }\r\n\r\n onUnitLocationChange(location: string): void {\r\n this.commission.vehicle.UnitLocation = location;\r\n this.commission.UnitLocation = location;\r\n }\r\n\r\n onValidationComplete(validationResult: IValidationResults): void {\r\n this.validationResults = validationResult;\r\n\r\n this.validationResults.checksRun.forEach(cr => {\r\n this.commission.deviceValidationCheckRecordIds.push(cr.ValidationResultDatabaseId);\r\n });\r\n\r\n this.deviceToAdd.buttonStatus = validationResult.result === ValidationResult.Fail ? VButtonStatus.Error : VButtonStatus.Success;\r\n\r\n const plotCheck = this.validationResults.checksRun.find(c => c.ValidationCheckType == ValidationCheckType.Plot);\r\n\r\n if (!plotCheck || !plotCheck.TestData || (this.deviceToAdd.buttonStatus == VButtonStatus.Error)) {\r\n return;\r\n }\r\n\r\n this.currentOdoKm = +(plotCheck.TestData[plotCheck.TestData.length - 1].Odometer / this.kilometreConversionConstant).toFixed(1);\r\n this.currentOdoMiles = +(plotCheck.TestData[plotCheck.TestData.length - 1].Odometer / this.milesConversionConstant).toFixed(1);\r\n\r\n if (!!this.deviceToAdd?.searchResponse?.Unit) {\r\n this.deviceMessageService.getDeviceCommunicationCommands(this.deviceToAdd.searchResponse.Unit.Serial, false).pipe(take(1), tap(deviceCommands => {\r\n this.odoSetCommand = deviceCommands.find(m => m.Item2 == DeviceCommunicationType.SetOdometer) ?? null;\r\n }));\r\n }\r\n }\r\n\r\n validatePreAssociatedDevice(unit: IUnit): void {\r\n\r\n this.existingDeviceToValidate = {\r\n serial: unit.Serial,\r\n buttonStatus: VButtonStatus.Default,\r\n inputStatus: VButtonStatus.Default,\r\n searchResponse: { parentTrackerImei: this.commission.Imei }\r\n }\r\n this.showExistingHardwareValidation = true;\r\n\r\n this.existingDeviceUnitToValidate = unit;\r\n }\r\n\r\n toggleRemovePeripheral(unit: IUnit): void {\r\n\r\n if (unit.savedState == SavedState.NoSaveRequired) {\r\n unit.savedState = SavedState.RemovedRequiresSave;\r\n this.addUnitChangedComment(unit, \"Removed\");\r\n }\r\n else if (unit.savedState == SavedState.AddedRequiresSave) {\r\n\r\n this.commission.pendingCommissionChanges = this.commission.pendingCommissionChanges.filter(u => u.Unit != unit);\r\n\r\n unit.savedState = SavedState.NoSaveRequired;\r\n }\r\n else {\r\n unit.savedState = SavedState.NoSaveRequired;\r\n }\r\n\r\n if (unit.savedState == SavedState.NoSaveRequired) {\r\n this.removeUnitChangedComment(unit);\r\n }\r\n\r\n if (unit.Serial == this.commission.Serial) {\r\n this.commission.Serial = \"\";\r\n this.commission.UnitLocation = \"\";\r\n }\r\n\r\n if (unit.savedState == SavedState.RemovedRequiresSave && unit.Serial == this.commission.CameraId) {\r\n\r\n this.commission.dirtyCameraId = this.commission.CameraId;\r\n this.commission.CameraId = \"\";\r\n }\r\n\r\n if (unit.savedState == SavedState.NoSaveRequired && (unit.Serial == this.commission.CameraId || unit.Serial == this.commission.dirtyCameraId)) {\r\n\r\n this.commission.CameraId = this.commission.dirtyCameraId;\r\n this.commission.dirtyCameraId = '';\r\n }\r\n\r\n this.commission.Peripherals = this.commission.Peripherals.filter(p => p != unit.Serial);\r\n this.setAnyDevicesUpdated();\r\n this.updateInstallationState();\r\n }\r\n\r\n toggleEditGpsOdo(event: boolean): void {\r\n if (!event) {\r\n this.distanceRaw = 0;\r\n }\r\n this.editGpsOdo = event;\r\n }\r\n\r\n onSetDistanceMeasurement(event: any): void {\r\n this.distanceMeasurement = event;\r\n }\r\n\r\n setGpsOdo(): void {\r\n const deviceCommand: IDeviceCommand = {\r\n CommandValue: (Math.round(this.distanceRaw * (this.distanceMeasurement == DistanceMeasurement.Kilometres ? this.kilometreConversionConstant : this.milesConversionConstant))).toString(),\r\n CommunicationMethod: this.odoSetCommand.Item1,\r\n CommunicationType: this.odoSetCommand.Item2\r\n } \r\n\r\n this.deviceMessageService.sendDeviceCommunicationCommands(this.deviceToAdd.serial, deviceCommand);\r\n }\r\n\r\n togglePtoActive(): void {\r\n this.ptoActive = !this.ptoActive;\r\n }\r\n\r\n toggleAddDeviceView(): void {\r\n this.showAddDevice = !this.showAddDevice;\r\n }\r\n\r\n back(): void {\r\n if (this.showBarcodeScanner) {\r\n this.showBarcodeScanner = false;\r\n } else if (this.deviceToAdd.manualCategories) {\r\n this.deviceToAdd.manualCategories = null;\r\n } else if (this.nonTestableDevice) {\r\n this.nonTestableDevice = false;\r\n } else if (this.showExistingHardwareValidation) {\r\n this.showExistingHardwareValidation = false;\r\n this.resetDeviceToAdd();\r\n } else {\r\n this.resetDeviceToAdd();\r\n }\r\n }\r\n\r\n resetDeviceToAdd(): void {\r\n this.showAddDevice = false;\r\n this.nonTestableDevice = false;\r\n this.deviceToAdd = {\r\n serial: \"\",\r\n inputStatus: VButtonStatus.Default,\r\n buttonStatus: VButtonStatus.Default,\r\n manualCategories: null\r\n };\r\n this.existingDeviceToValidate = null;\r\n this.validationResults = null;\r\n this.editGpsOdo = false;\r\n this.distanceRaw = 0;\r\n\r\n if (!!this.commission?.Metadata) {\r\n this.commission.Metadata.NoFaultFound = false;\r\n }\r\n\r\n\r\n }\r\n\r\n addDevice(): void {\r\n\r\n if (this.deviceToAdd.serial) { // Any automated checks should run through this\r\n var newPeripheral = this.createUnitFromSerial(this.deviceToAdd.serial, this.deviceToAdd.searchResponse.Unit?.Imei ?? this.deviceToAdd.searchResponse.Peripheral?.Imei, this.deviceToAdd.searchResponse.primaryFeature);\r\n\r\n if (this.deviceToAdd.searchResponse.Unit) {\r\n this.commission.Serial = this.deviceToAdd.searchResponse.Unit.Serial;\r\n this.commission.Imei = this.deviceToAdd.searchResponse.Unit.Imei;\r\n\r\n }\r\n else {\r\n\r\n var features = this.foundationPeripheralService.findFeaturesFromFeaturesEnum(this.deviceToAdd.searchResponse.Product.Features);\r\n\r\n if (features.indexOf(AccountFeatures.Camera) > -1) {\r\n this.commission.dirtyCameraId = this.commission.CameraId;\r\n this.commission.CameraId = this.deviceToAdd.searchResponse.Serial;\r\n }\r\n\r\n if (this.deviceToAdd.searchResponse.Product.GroupId === ProductVendor.Squarell) {\r\n this.commission.CanbusId = this.deviceToAdd.serial;\r\n }\r\n\r\n this.commission.Peripherals.push(this.deviceToAdd.searchResponse.Peripheral.Serial);\r\n }\r\n\r\n this.addUnitChangedComment(newPeripheral, \"Added\");\r\n\r\n\r\n\r\n this.commission.pendingCommissionChanges.push({\r\n Unit: newPeripheral,\r\n //CommissionResults: this.checkResults,\r\n faultFlagged: this.deviceToAdd.faultRecorded,\r\n faultComments: this.deviceToAdd.faultComments,\r\n isCamera: features?.indexOf(AccountFeatures.Camera) > -1\r\n });\r\n } else { // These are units that are not connected to Verilocation, but need documenting as installed (Standalone units).\r\n this.commission.Peripherals.push(\"DVS\");\r\n\r\n this.commission.pendingCommissionChanges.push({\r\n Unit: {\r\n name: `${NonTestableDevices[this.deviceToAdd.manualCategories.section]} - No Remote Connection`,\r\n icon: \"link_off\",\r\n savedState: SavedState.AddedRequiresSave\r\n },\r\n //CommissionResults: this.checkResults,\r\n faultFlagged: !!this.deviceToAdd.manualCategories.faultComments,\r\n faultComments: this.deviceToAdd.manualCategories.faultComments\r\n });\r\n this.commission.Comments += `Standalone ${NonTestableDevices[this.deviceToAdd.manualCategories.section]} unit Added \\r\\n`;\r\n }\r\n\r\n this.resetDeviceToAdd();\r\n this.setupUnits();\r\n this.setAnyDevicesUpdated();\r\n this.updateInstallationState();\r\n }\r\n\r\n\r\n updateInstallationState(): void {\r\n const hasAdded = this.commission.pendingCommissionChanges.some(p => p.Unit.savedState == SavedState.AddedRequiresSave);\r\n const hasRemoved = this.commission.pendingCommissionChanges.some(p => p.Unit.savedState == SavedState.RemovedRequiresSave);\r\n\r\n this.devicesUpdated = (hasAdded || hasRemoved) || (this.commission.Metadata?.NoFaultFound && this.commission.existingHardwareAcquired);\r\n }\r\n\r\n onNoFaultFoundChecked(event: any): void {\r\n if (!this.commission.Metadata) {\r\n this.commission.Metadata = {}\r\n }\r\n\r\n this.commission.Metadata.NoFaultFound = event;\r\n this.allowAddButton = this.allowRemoveButton = !event;\r\n\r\n this.updateInstallationState();\r\n }\r\n\r\n onIncludeTemperatureProbeChange(event: any): void {\r\n this.includeTemperatureTests = event;\r\n }\r\n\r\n // ---\r\n\r\n private createnonTestDeviceTypes(): void {\r\n\r\n this.NonTestableDevices = EnumService.enumToArray(\"NonTestableDevices\", NonTestableDevices);\r\n\r\n this.NonTestableDevices.sort((type1, type2) => (type1.name > type2.name) ? 1 : -1);\r\n }\r\n\r\n private setAnyDevicesUpdated(): void {\r\n this.devicesUpdated = this.commission.pendingCommissionChanges.some(change => change.Unit.savedState != SavedState.NoSaveRequired);\r\n }\r\n\r\n\r\n private createUnitFromSerial(serial: string, imei: string, primaryFeature = AccountFeatures.GPS): IUnit {\r\n const unit: IUnit = {\r\n Serial: serial,\r\n icon: this.foundationPeripheralService.getIconForFeature(primaryFeature),\r\n savedState: SavedState.AddedRequiresSave,\r\n primaryFeature: primaryFeature,\r\n Imei: imei\r\n };\r\n\r\n return unit;\r\n }\r\n\r\n\r\n private convertQPromiseIntoNativePromise(ajsPromise: angular.IPromise): Promise {\r\n const promise = new Promise((resolve, reject) => {\r\n\r\n ajsPromise.then(data => { resolve(data); })\r\n ajsPromise.catch(error => { reject(error); });\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n private getSelectedVehiclePeripherals(): angular.IPromise {\r\n this.commission.pendingCommissionChanges = [];\r\n if (!this.commission.VehicleId) {\r\n return;\r\n }\r\n\r\n const peripheralPromise = this.foundationPeripheralService.getPeripherals(this.commission.VehicleId, true);\r\n const unitPromise = this.foundationPeripheralService.getUnit(this.commission.VehicleId, true);\r\n const unitLocationPromise = this.foundationVehicleService.getVehicleUnitLocation(this.commission.VehicleId)\r\n\r\n Promise.all([this.convertQPromiseIntoNativePromise(peripheralPromise), this.convertQPromiseIntoNativePromise(unitPromise), this.convertQPromiseIntoNativePromise(unitLocationPromise)])\r\n .then(([peripherals, unitPromise, unitLocation]) => {\r\n\r\n if (unitPromise) {\r\n\r\n this.commission.Serial = unitPromise.Serial;\r\n this.commission.Imei = unitPromise.Imei;\r\n const unit = this.createUnitFromSerial(this.commission.Serial, unitPromise.Imei);\r\n unit.savedState = SavedState.NoSaveRequired;\r\n unit.Id = unitPromise.Id;\r\n unit.primaryFeature = AccountFeatures.TrackingDevice;\r\n unit.unitLocation = unitLocation.trim().length ? unitLocation : null;\r\n\r\n this.commission.pendingCommissionChanges.push({ Unit: unit });\r\n }\r\n\r\n peripherals.forEach(peripheral => this.commission.pendingCommissionChanges.push({\r\n Unit: peripheral\r\n }));\r\n\r\n peripherals.forEach(p => {\r\n const features = this.foundationPeripheralService.findFeaturesFromFeaturesEnum(p.Product.Features);\r\n if (features.indexOf(AccountFeatures.Camera) > -1) {\r\n this.commission.CameraId = p.Serial;\r\n }\r\n });\r\n\r\n this.commission.Peripherals = peripherals.map(p => p.Serial);\r\n this.commission.existingHardwareAcquired = true;\r\n this.commission.UnitLocation = unitLocation;\r\n this.requiresUnitLocation = (!this.commission.UnitLocation && !this.commission.vehicle.UnitLocation) && !!this.commission.Serial;\r\n this.updateInstallationState();\r\n })\r\n .finally(() => {\r\n this.setupUnits();\r\n });\r\n }\r\n\r\n private setupUnits(): void {\r\n\r\n this.commission.pendingCommissionChanges.forEach(u => {\r\n if (!u.Unit.savedState) {\r\n u.Unit.savedState = SavedState.NoSaveRequired;\r\n }\r\n });\r\n }\r\n\r\n private addUnitChangedComment(unit: IUnit, verb: \"Added\" | \"Removed\"): void {\r\n if (this.commission.Comments.lastIndexOf(\"\\n\") + 1 < this.commission.Comments.length) {\r\n this.commission.Comments += \"\\n\";\r\n }\r\n\r\n this.commission.Comments += `${verb} ${unit.name || ''}: ${unit.Serial}\\r\\n`\r\n }\r\n\r\n private removeUnitChangedComment(unit: IUnit): void {\r\n let lines = this.commission.Comments.split(\"\\n\");\r\n\r\n if (unit.Serial) {\r\n lines = lines.filter(l => (l.indexOf(unit.Serial)) < 0);\r\n } else {\r\n lines = lines.filter(l => l.indexOf(unit.name.substring(0, unit.name.indexOf(' '))) < 0);\r\n }\r\n\r\n this.commission.Comments = lines.join(\"\\n\");\r\n }\r\n\r\n private searchForSerial(serial: string, showLoader = true): Observable {\r\n\r\n this.loading = showLoader;\r\n\r\n return this.commissionService.getUnitOrPeripheralBySerial(serial);\r\n }\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { getOptionsQueryParams, getValuesFromEnum } from \"@app/class/Utilities\";\r\nimport { IVerticalFilterListItem } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { IBasicProductModel } from \"@app/interfaces/IProductUiViewModel\";\r\nimport { ProductVendor } from \"@app/main/components/videos/enums/CameraProductType\";\r\nimport { IAccount } from \"@app/services/account.service\";\r\nimport { ProductsService } from \"@app/services/products.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { Observable, combineLatest, firstValueFrom, forkJoin, of } from \"rxjs\";\r\nimport { filter, map, switchMap } from \"rxjs/operators\";\r\nimport { AccountService } from \"../../_services/account.service\";\r\nimport { DeviceHealthRecordType } from \"./enums/device-health-record-type\";\r\nimport { DeviceHealthRecordHelper } from \"./helpers/device-health-record-helper\";\r\nimport { DeviceHealthRecord } from \"./models/device-health-record\";\r\nimport { DeviceHealthRecordQueryOptions } from \"./models/device-health-record-query-options\";\r\nimport { DeviceHealthRecordsByVehicle } from \"./models/device-health-records-by-vehicle\";\r\nimport { DeviceHealthSimpleSummary, DeviceHealthTypeSummary } from \"./models/device-health-simple-summary\";\r\nimport { DeviceHealthVehicleDurationSummary } from \"./models/device-health-vehicle-duration-summary\";\r\nimport { IMinMaxValues } from \"./models/minMaxValues\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DeviceHealthService {\r\n constructor(\r\n private readonly httpClient: HttpClient,\r\n private readonly translationService: TranslationService,\r\n private readonly productsService: ProductsService,\r\n private readonly accountService: AccountService,\r\n ) { }\r\n\r\n getRecords(queryOptions: DeviceHealthRecordQueryOptions = {}): Observable {\r\n const options = getOptionsQueryParams(queryOptions);\r\n return this.httpClient.get('/api/devicehealth/records', options);\r\n }\r\n\r\n getSummariesWithCompany(): Observable {\r\n return combineLatest([\r\n this.accountService.getCustomerAccounts(),\r\n this.getAllSummaries()\r\n ]).pipe(map(([accounts, summaries]) => {\r\n return this.combineAndGetSummariesWithAccounts(accounts, summaries);\r\n }));\r\n } \r\n\r\n getAllSummaries(): Observable {\r\n return this.httpClient.get('/api/devicehealth/summaries');\r\n }\r\n\r\n getAllActiveAndHistoricalRecords(vehicleId: number, startDate?: Date, endDate?: Date): Observable {\r\n return forkJoin({\r\n records: this.getRecords({ VehicleId: vehicleId, Start: startDate, End: endDate, IncludeAllIntersecting: true }), \r\n activeRecords: this.getRecords({ VehicleId: vehicleId, Active: true }), \r\n }).pipe(\r\n map(data => {\r\n const mergedRecords = data.records;\r\n\r\n data.activeRecords.forEach(activeRecord => {\r\n const recordAlreadyInArray = mergedRecords.some(m => m.Type === activeRecord.Type && m.Serial === activeRecord.Serial);\r\n \r\n if (!recordAlreadyInArray) {\r\n mergedRecords.push(activeRecord);\r\n }\r\n })\r\n\r\n return mergedRecords;\r\n }),\r\n filter(mergedRecords => mergedRecords.length > 0),\r\n switchMap(mergedRecords => {\r\n return forkJoin({\r\n products: this.productsService.getProductUiViewModels(), \r\n account: this.accountService.getCustomerAccount(mergedRecords[0].AccountId),\r\n records: of(mergedRecords)\r\n })\r\n }),\r\n map(data => {\r\n const records = this.mapProductNameToRecords(data.records, data.products);\r\n return new DeviceHealthRecordsByVehicle(records, data.account); \r\n })\r\n )\r\n }\r\n\r\n private getProperRecordTypesFromSummary(\r\n summary: DeviceHealthVehicleDurationSummary, \r\n type: 'telematics' | 'camera'\r\n ): DeviceHealthRecordType[] {\r\n switch (type) {\r\n case 'camera':\r\n return summary.cameraRecordTypes;\r\n case 'telematics':\r\n return summary.telematicsRecordTypes;\r\n }\r\n }\r\n\r\n getRecordTypeFiltersForVehicleSummaries(\r\n data: DeviceHealthVehicleDurationSummary[], \r\n type: 'telematics' | 'camera'\r\n ): IVerticalFilterListItem[] {\r\n const filters: IVerticalFilterListItem[] = [];\r\n\r\n const enumValues = getValuesFromEnum(DeviceHealthRecordType)\r\n .filter(value => value != DeviceHealthRecordType.None);\r\n\r\n enumValues.forEach(value => {\r\n if (!data.some(summary => this.getProperRecordTypesFromSummary(summary, type).includes(value))) {\r\n return;\r\n }\r\n\r\n const filter: IVerticalFilterListItem = {\r\n name: this.translateRecordType(value),\r\n predicate: (summary) => {\r\n return this.getProperRecordTypesFromSummary(summary, type).includes(value);\r\n },\r\n };\r\n\r\n filter.count = data.filter(d => filter.predicate(d)).length;\r\n filter.key = value;\r\n \r\n filters.push(filter);\r\n })\r\n\r\n return filters;\r\n }\r\n\r\n async getResellerFiltersForVehicleSummaries(\r\n data: DeviceHealthVehicleDurationSummary[]\r\n ): Promise[]> {\r\n const accounts = await firstValueFrom(this.accountService.getCustomerAccounts());\r\n const resellers = await firstValueFrom(this.accountService.getResellers());\r\n\r\n const accountsIdsWithReseller = accounts\r\n .filter(x => !!x.ResellerId)\r\n .map(x => x.Id);\r\n\r\n\r\n const filters: IVerticalFilterListItem[] = [];\r\n\r\n resellers.forEach(reseller => {\r\n const resellerAccounts = accounts.filter(account => account.ResellerId === reseller.Id);\r\n\r\n const isResellerPresent = data.some(summary => \r\n resellerAccounts.some(account => account.Id === summary.accountId)\r\n );\r\n\r\n if (!isResellerPresent) {\r\n return;\r\n }\r\n\r\n const filter: IVerticalFilterListItem = {\r\n name: reseller.Description,\r\n predicate: (summary) => {\r\n if (!accountsIdsWithReseller.includes(summary.accountId)) {\r\n return false;\r\n }\r\n\r\n const account = accounts.find(x => x.Id === summary.accountId)!;\r\n const summaryReseller = resellers.find(x => x.Id === account.ResellerId);\r\n\r\n return summaryReseller.Id === reseller.Id;\r\n },\r\n };\r\n\r\n filter.count = data.filter(d => filter.predicate(d)).length;\r\n filter.key = reseller.Id;\r\n \r\n filters.push(filter);\r\n });\r\n\r\n return filters;\r\n }\r\n\r\n getFiltersForVehicleDetails(records: DeviceHealthRecord[]): IVerticalFilterListItem[] {\r\n const filters: IVerticalFilterListItem[] = [];\r\n\r\n const enumValues = getValuesFromEnum(DeviceHealthRecordType)\r\n .filter(value => value != DeviceHealthRecordType.None);\r\n\r\n enumValues.forEach(value => {\r\n if (!records.some(record => record.Type === value)) {\r\n return;\r\n }\r\n\r\n const filter: IVerticalFilterListItem = {\r\n name: this.translateRecordType(value),\r\n predicate: (record) => record.Type === value,\r\n };\r\n\r\n filter.count = records.filter(d => filter.predicate(d)).length;\r\n filter.key = value;\r\n \r\n filters.push(filter);\r\n });\r\n\r\n return filters;\r\n }\r\n\r\n getScoreForRecord(record: DeviceHealthVehicleDurationSummary, minMaxValues: IMinMaxValues): number {\r\n const { minRecords, maxRecords, minDuration, maxDuration } = minMaxValues;\r\n const normalizedRecords = (record.recordsCount - minRecords) / (maxRecords - minRecords);\r\n const normalizedDuration = (record.totalDuration - minDuration) / (maxDuration - minDuration);\r\n return 0.5 * normalizedRecords + 0.5 * normalizedDuration;\r\n }\r\n\r\n getMinAndMaxValues(vehicles: DeviceHealthVehicleDurationSummary[]): IMinMaxValues {\r\n if (!vehicles.length) {\r\n return;\r\n }\r\n\r\n return vehicles.reduce((acc, vehicle) => {\r\n acc.minRecords = Math.min(acc.minRecords, vehicle.recordsCount);\r\n acc.maxRecords = Math.max(acc.maxRecords, vehicle.recordsCount);\r\n acc.minDuration = Math.min(acc.minDuration, vehicle.totalDuration);\r\n acc.maxDuration = Math.max(acc.maxDuration, vehicle.totalDuration);\r\n return acc;\r\n }, {\r\n minRecords: Infinity,\r\n maxRecords: -Infinity,\r\n minDuration: Infinity,\r\n maxDuration: -Infinity\r\n });\r\n }\r\n\r\n private mapProductNameToRecords(records: DeviceHealthRecord[], products: IBasicProductModel[]): DeviceHealthRecord[] {\r\n return records.map(record => {\r\n const product = products.find(product => product.ProductId === record.ProductId);\r\n\r\n const productName = product\r\n ? `${ProductVendor[product?.GroupId]} ${product?.Description}`\r\n : null;\r\n\r\n return { ...record, productName };\r\n })\r\n }\r\n\r\n private combineAndGetSummariesWithAccounts(\r\n accounts: IAccount[], \r\n summaries: DeviceHealthSimpleSummary[] \r\n ): DeviceHealthVehicleDurationSummary[] {\r\n const accountsMap = this.accountService.createAccountMap(accounts);\r\n const summariesByVehicle = this.groupSummariesByVehicleId(summaries);\r\n\r\n const result: DeviceHealthVehicleDurationSummary[] = Object\r\n .keys(summariesByVehicle)\r\n .map((key) => {\r\n const summaries = summariesByVehicle[Number(key)];\r\n const summaryResult = this.buildDeviceHealthVehicleDurationSummary(accountsMap, summaries);\r\n\r\n return summaryResult;\r\n });\r\n\r\n return this.getVehicleSummariesWithScores(result);\r\n }\r\n\r\n private buildDeviceHealthVehicleDurationSummary(\r\n accountsMap: Map,\r\n summaries: DeviceHealthSimpleSummary[]\r\n ): DeviceHealthVehicleDurationSummary {\r\n const firstSummary = summaries[0]; // to get props that are the same for all\r\n const allDaySummaries = summaries.map(x => x.DaySummaries).flat();\r\n const allTypeSummaries = allDaySummaries.map(x => x.TypeSummaries).flat();\r\n\r\n const account = accountsMap.get(firstSummary.AccountId);\r\n const recordsCount = this.getRecordsCountFromAllDays(allTypeSummaries);\r\n\r\n const cameraRecordTypes = this.getRecordTypes(allTypeSummaries, 'camera');\r\n const cameraRecordTypesDesc = this.getRecordTypesDesc(cameraRecordTypes);\r\n\r\n const telematicsRecordTypes = this.getRecordTypes(allTypeSummaries, 'telematics');\r\n const telematicsRecordTypesDesc = this.getRecordTypesDesc(telematicsRecordTypes);\r\n\r\n const totalDuration = this.getTotalDuration(allTypeSummaries);\r\n\r\n return {\r\n vehicleId: firstSummary.VehicleId,\r\n reg: firstSummary.VehicleRegistration,\r\n accountId: firstSummary.AccountId,\r\n companyName: account?.CompanyName,\r\n recordsCount,\r\n cameraRecordTypes,\r\n cameraRecordTypesDesc,\r\n telematicsRecordTypes,\r\n telematicsRecordTypesDesc,\r\n totalDuration,\r\n score: 0,\r\n serial: firstSummary.Serial\r\n }\r\n }\r\n\r\n private groupSummariesByVehicleId(\r\n summaries: DeviceHealthSimpleSummary[]\r\n ): { [key: number]: DeviceHealthSimpleSummary[] } {\r\n const summariesByVehicle = summaries.reduce((acc, current) => {\r\n if (!current.VehicleId) {\r\n return acc;\r\n }\r\n\r\n const vehicleId = current.VehicleId;\r\n\r\n acc[vehicleId] = acc[vehicleId] || [];\r\n acc[vehicleId].push(current);\r\n\r\n return acc;\r\n }, {} as {[key: number]: DeviceHealthSimpleSummary[]})\r\n\r\n return summariesByVehicle;\r\n }\r\n\r\n private getVehicleSummariesWithScores(vehicles: DeviceHealthVehicleDurationSummary[]): DeviceHealthVehicleDurationSummary[] {\r\n const { minRecords, maxRecords, minDuration, maxDuration } = this.getMinAndMaxValues(vehicles);\r\n\r\n vehicles.forEach(vehicle => {\r\n\r\n const normalizedRecords = (vehicle.recordsCount - minRecords) / (maxRecords - minRecords);\r\n const normalizedDuration = (vehicle.totalDuration - minDuration) / (maxDuration - minDuration);\r\n vehicle.score = 0.5 * normalizedRecords + 0.5 * normalizedDuration;\r\n });\r\n\r\n return vehicles;\r\n }\r\n\r\n private getTotalDuration(allTypeSummaries: DeviceHealthTypeSummary[]):number {\r\n const durations = allTypeSummaries.map(summary => summary.DurationSec);\r\n\r\n return durations.reduce((acc, current) => {\r\n return acc + current\r\n }, 0);\r\n }\r\n\r\n private getRecordTypesDesc(recordTypes: DeviceHealthRecordType[]): string {\r\n return recordTypes\r\n .sort()\r\n .map(recordType => {\r\n return this.translateRecordType(recordType)\r\n }).join(', ');\r\n }\r\n\r\n private getRecordsCountFromAllDays(allTypeSummaries: DeviceHealthTypeSummary[]): number {\r\n return allTypeSummaries.map(summary => summary.Count).reduce((acc, current) => {\r\n return acc + current;\r\n }, 0);\r\n }\r\n\r\n private getRecordTypes(allTypeSummaries: DeviceHealthTypeSummary[], type: 'telematics' | 'camera'): DeviceHealthRecordType[] {\r\n const recordTypesUnique = new Set(allTypeSummaries.map(x => x.Type));\r\n const result = [...recordTypesUnique];\r\n\r\n switch (type) {\r\n case 'camera':\r\n return result.filter(x => DeviceHealthRecordHelper.isCamera(x));\r\n case 'telematics':\r\n return result.filter(x => DeviceHealthRecordHelper.isTelematic(x));\r\n }\r\n }\r\n\r\n private translateRecordType(recordType: DeviceHealthRecordType): string {\r\n return this.translationService.tEnum(DeviceHealthRecordType, \"DeviceHealthRecordType\", recordType);\r\n }\r\n}\r\n","export enum DeviceHealthRecordType { \r\n None = 0,\r\n BadSatFix = 1,\r\n MessageSpam = 2,\r\n MissingOdometer = 3,\r\n LocationSnapped = 4,\r\n CameraVideoLoss = 5,\r\n CameraMemoryFault = 6,\r\n CameraStorageFailure = 7,\r\n CameraLowVoltage = 8,\r\n CameraPowerLoss = 9,\r\n CameraGPSLoss = 10\r\n}","import { Component, OnInit } from '@angular/core';\r\nimport { VTableRowStatus } from '@app/directives/_layout/v-table/_enums/VTableRowStatus.enum';\r\nimport { IVTableColumn } from '@app/directives/_layout/v-table/_models/IVTableColumn';\r\nimport { IVTableRow } from '@app/directives/_layout/v-table/_models/IVTableRow';\r\nimport { VTableService } from '@app/directives/_layout/v-table/_services/v-table.service';\r\nimport { IVerticalFilterListItem } from '@app/directives/_resourceFilters/filter-bar/filter-bar.models';\r\nimport { SortDirection } from '@app/enum/SortDirection';\r\nimport { SortType } from '@app/enum/SortType';\r\nimport { IReseller } from '@app/main/modules/foundation/_models/IReseller';\r\nimport { AccountService } from '@app/main/modules/foundation/_services/account.service';\r\nimport { FoundationNavigationModule } from '@app/main/modules/foundation/foundation.navigation';\r\nimport { IAccount } from '@app/services/account.service';\r\nimport { DateUnit } from '@app/services/date.service';\r\nimport { NavigationService } from '@app/services/navigation.service';\r\nimport { TranslationService } from '@app/services/translation.service';\r\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\r\nimport { from, switchMap, take } from 'rxjs';\r\nimport { DeviceHealthService } from '../../device-health.service';\r\nimport { DeviceHealthRecordType } from '../../enums/device-health-record-type';\r\nimport { DeviceHealthRecentVehicleSummary } from '../../models/device-health-recent-vehicle-summary';\r\nimport { DeviceHealthVehicleDurationSummary } from '../../models/device-health-vehicle-duration-summary';\r\nimport './device-health-vehicles.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'device-health-vehicles',\r\n template: require('./device-health-vehicles.component.html')\r\n})\r\nexport class DeviceHealthVehiclesComponent implements OnInit {\r\n loading = false;\r\n\r\n tableColumns: IVTableColumn[] = [];\r\n tableRows: IVTableRow[] = [];\r\n data: DeviceHealthVehicleDurationSummary[] = [];\r\n cameraRecordTypeFilterItems: IVerticalFilterListItem[] = [];\r\n telematicsRecordTypeFilterItems: IVerticalFilterListItem[] = [];\r\n resellerFilterItems: IVerticalFilterListItem[] = [];\r\n selectedRecordTypes: DeviceHealthRecordType[] = [];\r\n\r\n accounts: IAccount[] = [];\r\n resellers: IReseller[] = [];\r\n\r\n selectedAccount?: IAccount;\r\n\r\n worstTenPercentMap = new Map();\r\n\r\n exportTitle = this.translationService.t('DeviceHealth.Vehicles');\r\n\r\n constructor(\r\n private readonly navigationService: NavigationService,\r\n private readonly deviceHealthService: DeviceHealthService,\r\n private readonly vTableService: VTableService,\r\n private readonly accountService: AccountService,\r\n private readonly translationService: TranslationService,\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.createTable();\r\n this.loadData();\r\n this.getAccounts();\r\n }\r\n\r\n selectSummary(row: IVTableRow): void {\r\n const data: { [key: string]: string | number } = { \r\n vehicleId: row.data.vehicleId,\r\n }\r\n\r\n if (this.selectedRecordTypes.length > 0) {\r\n data.filterBy = this.selectedRecordTypes.join(',');\r\n }\r\n\r\n this.navigationService.go(FoundationNavigationModule.DeviceHealthVehicleView, data); \r\n }\r\n\r\n onRecordTypeChange(items: IVerticalFilterListItem[]): void {\r\n this.selectedRecordTypes = items.map(item => item.key);\r\n }\r\n\r\n filterSummaryByAccount(summary: DeviceHealthRecentVehicleSummary, account: IAccount): boolean {\r\n return summary.accountId === account.Id;\r\n }\r\n\r\n accountSearchPredicate(account: IAccount, searchText: string): boolean {\r\n return account.CompanyName.toLowerCase().indexOf(searchText) >= 0;\r\n }\r\n\r\n selectAccount(account: IAccount): void {\r\n this.selectedAccount = this.accounts.find(x => x.Id === account.Id);\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createStatusTableHeader(),\r\n createCellFunction: summary => {\r\n let status = VTableRowStatus.Info;\r\n\r\n if (this.worstTenPercentMap.get(summary.vehicleId)) {\r\n status = VTableRowStatus.Error;\r\n }\r\n\r\n return this.vTableService.createStatusCell(status, {sortData: summary.score});\r\n }\r\n },\r\n {\r\n header: this.vTableService.createVehicleTableHeader(),\r\n createCellFunction: summary => this.vTableService.createVehicleRegCell({ Id: summary.vehicleId, Reg: summary.reg })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Account\", sortable: false }),\r\n createCellFunction: (summary) => this.vTableService.createTableCell(summary.companyName, { tooltip: true })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"DeviceHealth.RecordsCount\", sortable: true, sortType: SortType.Number, sortDirection: SortDirection.Descending, width: 160 }),\r\n createCellFunction: summary => this.vTableService.createTableCell(summary.recordsCount)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"DeviceHealth.CameraRecordTypes\" }),\r\n createCellFunction: (summary) => this.vTableService.createTableCell(summary.cameraRecordTypesDesc, { tooltip: true })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"DeviceHealth.TelematicsRecordTypes\" }),\r\n createCellFunction: (summary) => this.vTableService.createTableCell(summary.telematicsRecordTypesDesc, { tooltip: true })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"DeviceHealth.TotalDuration\", sortType: SortType.Number, width: 160}),\r\n createCellFunction: (summary) => this.vTableService.createDurationCell(summary.totalDuration, DateUnit.Sec)\r\n },\r\n ]\r\n }\r\n\r\n \r\n private loadData(): void {\r\n this.loading = true;\r\n\r\n this.deviceHealthService.getSummariesWithCompany()\r\n .pipe(\r\n untilDestroyed(this),\r\n take(1),\r\n switchMap(data => {\r\n this.data = data.sort((a, b) => a.score - b.score);\r\n this.getWorstTenPercent();\r\n this.createTableRows();\r\n this.createRecordTypeFilterItems();\r\n \r\n return from(this.createResellerFilterItems());\r\n })\r\n ).subscribe(() => {\r\n this.loading = false;\r\n });\r\n }\r\n\r\n private getWorstTenPercent() {\r\n const worstTenPercent = [...this.data.slice(this.data.length * 0.9)];\r\n\r\n this.worstTenPercentMap = new Map(worstTenPercent.map(veh => [veh.vehicleId, veh]));\r\n }\r\n\r\n private createTableRows(): void {\r\n this.tableRows = this.vTableService.createTableRows(this.data, this.tableColumns);\r\n }\r\n\r\n private createRecordTypeFilterItems(): void {\r\n this.cameraRecordTypeFilterItems = this.deviceHealthService.getRecordTypeFiltersForVehicleSummaries(this.data, 'camera');\r\n this.telematicsRecordTypeFilterItems = this.deviceHealthService.getRecordTypeFiltersForVehicleSummaries(this.data, 'telematics');\r\n }\r\n\r\n private async createResellerFilterItems(): Promise {\r\n this.resellerFilterItems = await this.deviceHealthService.getResellerFiltersForVehicleSummaries(this.data);\r\n }\r\n\r\n private getAccounts(): void {\r\n this.accountService.getCustomerAccounts().pipe(untilDestroyed(this))\r\n .subscribe(accounts => {\r\n this.accounts = accounts;\r\n });\r\n }\r\n}\r\n","import { CommonModule } from \"@angular/common\";\r\nimport { CUSTOM_ELEMENTS_SCHEMA, NgModule } from \"@angular/core\";\r\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\r\nimport { CoreDirectivesModule } from \"@app/directives/_core/_core.directives.module\";\r\nimport { FormsDirectivesModule } from \"@app/directives/_forms/_form.directives.module\";\r\nimport { VTableModule } from \"@app/directives/_layout/v-table/v-table.module\";\r\nimport { LayoutDirectivesModule } from \"@app/directives/_layout/_layout.directives.module\";\r\nimport { MiscDirectivesModule } from \"@app/directives/_misc/_misc.directives.module\";\r\nimport { ResourceFiltersDirectivesModule } from \"@app/directives/_resourceFilters/_resourceFilters.directives.module\";\r\nimport { VehicleDirectivesModule } from \"@app/directives/_vehicle/_vehicle.directives.module\";\r\nimport { PipesModule } from \"@app/_pipes/_pipes.module\";\r\nimport { JobCompletionComponent } from \"./job-completion/job-completion.component\";\r\nimport { JobListComponent } from \"./job-list.component\";\r\nimport { JobDetailsComponent } from \"./job-details/job-details.component\";\r\nimport { JobItemEditorComponent } from \"./job-item-editor/job-item-editor.component\";\r\nimport { JobEditorComponent } from \"./job-editor/job-editor.component\";\r\nimport { JobItemListComponent } from \"./job-item-list/job-item-list.component\";\r\nimport { VeriDirectivesModule } from \"@app/directives/_veri/_veri.directives.module\";\r\nimport { EngineerSelectComponent } from \"./engineer-select/engineer-select.component\";\r\nimport { CommissionModule } from \"../commissions/commission.module\";\r\nimport { VisitFailureFormComponent } from \"../visit-failure-form/visit-failure-form.component\";\r\nimport { FoundationComponentsModule } from \"../../_components/components.modules\";\r\n\r\nconst privateComponents: any[] = [\r\n\r\n];\r\n\r\nconst publicComponents: any[] = [\r\n JobListComponent,\r\n JobDetailsComponent,\r\n JobEditorComponent,\r\n JobItemListComponent,\r\n JobCompletionComponent,\r\n JobItemEditorComponent,\r\n EngineerSelectComponent,\r\n VisitFailureFormComponent\r\n];\r\n\r\nconst declarations: any[] = [];\r\n\r\nconst providers: any[] = [];\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n PipesModule,\r\n MiscDirectivesModule,\r\n FormsDirectivesModule,\r\n VeriDirectivesModule,\r\n ResourceFiltersDirectivesModule,\r\n VTableModule,\r\n LayoutDirectivesModule,\r\n CoreDirectivesModule,\r\n FormsModule,\r\n VehicleDirectivesModule,\r\n CommissionModule,\r\n FoundationComponentsModule\r\n ],\r\n providers: providers,\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents, ...declarations],\r\n exports: [...publicComponents, ...declarations],\r\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\r\n})\r\nexport class FoundationJobsModule {\r\n constructor() {\r\n }\r\n}\r\n","import { Component, EventEmitter, Injector, Input, OnChanges, Output, ViewChild } from \"@angular/core\";\r\nimport { FoundationCsvImporterComponent } from \"@app/main/modules/foundation/_components/foundation-csv-importer/foundation-csv-importer.component\";\r\nimport { NavigationService } from \"@app/services/navigation.service\";\r\nimport { EngineerJobItemStatus, ImportStrategyReference } from \"@foundation/foundation.enums\";\r\nimport { EngineerJobStatus, IEngineerJob, IEngineerJobBookingWithEngineerMappings, IEngineerJobItem } from \"@foundation/foundation.interfaces\";\r\nimport { JobEditorComponent } from \"@foundation/_routes/jobs/job-editor/job-editor.component\";\r\nimport { AccountService } from \"@foundation/_services/account.service\";\r\nimport { EngineerJobBookingService } from \"@foundation/_services/engineer-job-booking.service\";\r\nimport { EngineerJobItemService } from \"@foundation/_services/engineer-job-item.service\";\r\nimport { EngineerJobService } from \"@foundation/_services/engineer-job.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { combineLatest, Subscription } from \"rxjs\";\r\nimport { FoundationNavigationModule } from \"../../../foundation.navigation\";\r\nimport './job-details.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: \"job-details\",\r\n template: require(\"./job-details.component.html\")\r\n})\r\nexport class JobDetailsComponent implements OnChanges {\r\n @Input() jobId: number;\r\n @Output() newJobItem = new EventEmitter();\r\n\r\n //--\r\n\r\n loading: boolean;\r\n\r\n job: IEngineerJob;\r\n jobBooking: IEngineerJobBookingWithEngineerMappings;\r\n\r\n jobItems: IEngineerJobItem[];\r\n\r\n jobItemsLength: number = 0;\r\n jobItemsCompleted: number = 0;\r\n\r\n engineerJobStatus = EngineerJobStatus;\r\n\r\n selectedTabIndex: number;\r\n\r\n jobIsClosed: boolean = false;\r\n saving: boolean = false;\r\n\r\n showImportSideBar: boolean = false;\r\n importStrategyRef: ImportStrategyReference = ImportStrategyReference.JobItem;\r\n @ViewChild('jobEditor') jobEditor: JobEditorComponent;\r\n @ViewChild(\"foundationCsvImporter\") foundationCsvImporter: FoundationCsvImporterComponent;\r\n\r\n dataSubscription: Subscription;\r\n\r\n constructor(\r\n private readonly injector: Injector,\r\n private readonly accountService: AccountService,\r\n private readonly engineerJobBookingService: EngineerJobBookingService,\r\n private readonly engineerJobService: EngineerJobService,\r\n private readonly engineerJobItemService: EngineerJobItemService\r\n ) { };\r\n\r\n ngOnChanges(): void {\r\n this.jobId = Number(this.injector.get(NavigationService).getRouteParam('jobId'));\r\n\r\n this.loadJob();\r\n }\r\n\r\n addJobItem(): void {\r\n this.newJobItem.emit();\r\n }\r\n\r\n saveJob(): void {\r\n this.saving = true;\r\n\r\n if (!this.jobEditor) {\r\n this.saving = false;\r\n return;\r\n }\r\n\r\n this.jobEditor.saveJob();\r\n }\r\n\r\n jobSaved(job: IEngineerJob): void {\r\n if (job.Status === EngineerJobStatus.Cancelled || job.Status === EngineerJobStatus.Completed) {\r\n this.injector.get(NavigationService).go(FoundationNavigationModule.Jobs, null, false);\r\n return;\r\n }\r\n this.job = job;\r\n this.saving = false;\r\n }\r\n\r\n jobBookingSaved(jobBooking: IEngineerJobBookingWithEngineerMappings): void {\r\n this.jobBooking = jobBooking;\r\n this.job.jobBooking = jobBooking;\r\n this.engineerJobBookingService.setSelectedJobBooking(this.jobBooking);\r\n }\r\n\r\n cancelChanges(): void {\r\n this.jobEditor?.reset();\r\n }\r\n\r\n closeJob(cancel: boolean, complete = false): void {\r\n if (!cancel || !this.jobEditor) {\r\n return;\r\n }\r\n\r\n this.jobEditor.amendedJob.Status = complete ? EngineerJobStatus.Completed : EngineerJobStatus.Cancelled;\r\n this.cancelJobItems();\r\n this.saveJob();\r\n }\r\n\r\n onLastJobItemCancelled(): void {\r\n this.closeJob(true, true);\r\n }\r\n\r\n toggleJobItemImport(): void {\r\n this.showImportSideBar = !this.showImportSideBar\r\n }\r\n\r\n //--\r\n\r\n private loadJob(): void {\r\n this.loading = true;\r\n\r\n if (this.dataSubscription) {\r\n this.dataSubscription.unsubscribe();\r\n }\r\n\r\n this.dataSubscription = new Subscription();\r\n\r\n this.dataSubscription.add(combineLatest([\r\n this.engineerJobService.getEngineerJob(this.jobId),\r\n this.engineerJobBookingService.getSelectedJobBooking(this.jobId),\r\n this.engineerJobItemService.getEngineerJobItems({ JobId: this.jobId }),\r\n this.accountService.getCustomerAccounts()\r\n ]).pipe(untilDestroyed(this)).subscribe(([job, booking, jobItems, accounts]) => {\r\n this.job = job;\r\n this.jobBooking = booking;\r\n this.job.account = accounts.find(acc => acc.Id === this.job.AccountId);\r\n this.jobItems = jobItems;\r\n\r\n this.checkJobStatus();\r\n this.checkJobItemCompletion();\r\n this.loading = false;\r\n }))\r\n\r\n this.dataSubscription.add(this.engineerJobBookingService.selectedJobBookingUpdated.pipe(untilDestroyed(this)).subscribe(booking => {\r\n this.jobBooking = { ...booking };\r\n }));\r\n }\r\n\r\n private checkJobStatus(): void {\r\n this.jobIsClosed = false;\r\n\r\n if (this.job.Status !== EngineerJobStatus.Open) {\r\n this.jobIsClosed = true;\r\n }\r\n\r\n }\r\n\r\n private checkJobItemCompletion(): void {\r\n this.jobItemsCompleted = this.jobItemsLength = 0;\r\n\r\n if (!this.jobItems?.length) {\r\n return;\r\n }\r\n\r\n this.jobItemsCompleted = [...this.jobItems].filter(jobItem => jobItem.Status === EngineerJobItemStatus.Complete).length;\r\n this.jobItemsLength = [...this.jobItems].filter(jobItem => jobItem.Status !== EngineerJobItemStatus.Failed && jobItem.Status !== EngineerJobItemStatus.Cancelled).length;\r\n }\r\n\r\n private cancelJobItems(): void {\r\n this.jobItems?.forEach(jobItem => {\r\n this.engineerJobItemService.closeEngineerJobItem(jobItem).subscribe();\r\n })\r\n }\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { getOptionsQueryParams } from \"@app/class/Utilities\";\r\nimport { IPeripheral } from \"@app/interfaces/IPeripheral\";\r\nimport { lastValueFrom } from \"rxjs\";\r\nimport { ProductVendor } from \"../enums/CameraProductType\";\r\nimport { IAvailableDailyFootage } from \"../models/IAvailableDailyFootage\";\r\nimport { IAvailableFootageCalendar } from \"../models/IAvailableFootageCalendar\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CameraFootageService {\r\n constructor(private readonly httpClient: HttpClient) { } \r\n\r\n async getLatestCalendarFootageHistory(\r\n peripheralSerial: string,\r\n concatenated = false,\r\n date: Date = null,\r\n invalidateCache = false\r\n ): Promise {\r\n const options = getOptionsQueryParams({ minsToLive: 60, invalidateCache, concatenated, date });\r\n\r\n return await lastValueFrom(this.httpClient\r\n .get(`/api/cameras/${peripheralSerial}/calendar`, options));\r\n }\r\n\r\n async getFootageHistoryForDay(peripheralSerial: string, date: Date, invalidateCache = false): Promise {\r\n const options = getOptionsQueryParams({ minsToLive: 60, invalidateCache, date });\r\n\r\n return await lastValueFrom(this.httpClient\r\n .get(`/api/cameras/${peripheralSerial}/history`, options));\r\n }\r\n\r\n getMaxRequestFootageLength(camera: IPeripheral): number {\r\n return camera.Product?.ProductMetadata?.CameraFeatures?.VideoRequest?.MaxRequestLength;\r\n }\r\n\r\n isFootageFunctionalityAvailable(peripherals: IPeripheral[]): boolean {\r\n return peripherals.some(peripheral => {\r\n const isVisionTrack = peripheral.Product.GroupId === ProductVendor.VisionTrack;\r\n const cameraIsNotLiveStream = !peripheral.isLiveStreamCam;\r\n const cameraHasVideoRequest = peripheral.Product.ProductMetadata?.CameraFeatures?.VideoRequest != null;\r\n\r\n return (isVisionTrack && cameraIsNotLiveStream) || cameraHasVideoRequest;\r\n })\r\n }\r\n\r\n isFootageLengthFunctionalityAvailable(peripherals: IPeripheral[]): boolean {\r\n return peripherals.some(peripheral => peripheral.Product?.ProductMetadata?.CameraFeatures?.VideoRequest?.MaxRequestLength > 0);\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, Output } from \"@angular/core\";\r\nimport { ProgressColourPalette } from \"@app/directives/_misc/v-progress-bar/v-progress-bar.component\";\r\nimport { VideoStatus } from \"@app/main/components/videos/enums/VideoStatus\";\r\nimport { IVideoEntry } from \"@app/main/components/videos/models/IVideoEntry\";\r\nimport { VideoEntryUtils } from \"@app/main/components/videos/utils/video-entry-utils\";\r\nimport { Subject, timer } from \"rxjs\";\r\nimport { takeUntil } from \"rxjs/operators\";\r\nimport './video-download-progress.component.scss';\r\n\r\nexport enum RequestStep {\r\n Requested = 1,\r\n Retrieving = 2,\r\n Downloading = 3,\r\n Complete = 4,\r\n Faceblurring = 5,\r\n Error = 6,\r\n}\r\n\r\n@Component({\r\n selector: 'video-download-progress',\r\n template: require('./video-download-progress.component.html')\r\n})\r\nexport class VideoDownloadProgressComponent {\r\n @Input() videoEntry: IVideoEntry;\r\n @Input() showSteps: boolean;\r\n @Output() statusChange: EventEmitter = new EventEmitter();\r\n\r\n palette: ProgressColourPalette = ProgressColourPalette.GreenOnly;\r\n percentage: number = 0;\r\n currentStep: RequestStep = RequestStep.Requested;\r\n\r\n VideoStatus = VideoStatus;\r\n RequestStep = RequestStep\r\n\r\n private latestOfflineProgressRetrieved: boolean = false;\r\n private downloadCompleted: boolean;\r\n private endTimer$: Subject = new Subject();\r\n\r\n constructor(\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.loadProgress();\r\n timer(0, 10_000)\r\n .pipe(takeUntil(this.endTimer$))\r\n .subscribe(() => this.loadProgress());\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.endTimer$.next();\r\n }\r\n\r\n //--\r\n\r\n private loadProgress(): void {\r\n\r\n if (this.downloadCompleted) {\r\n return;\r\n }\r\n\r\n this.currentStep = this.currentStep || RequestStep.Requested;\r\n\r\n if (VideoEntryUtils.isDownloadFailed(this.videoEntry)) {\r\n // Video download is completed but there are no videos to view\r\n this.handleDownloadFailed();\r\n return;\r\n }\r\n\r\n if (VideoEntryUtils.isDownloaded(this.videoEntry)) {\r\n // Video download is successfully completed\r\n this.handleDownloadSuccessful();\r\n return;\r\n }\r\n\r\n if (VideoEntryUtils.isFaceblurring(this.videoEntry)) {\r\n this.handleFaceblurring();\r\n return;\r\n }\r\n\r\n if (this.videoEntry.Status == VideoStatus.Uploaded) {\r\n // Video is uploaded but not yet received on platform\r\n this.handleVideoUploaded();\r\n return;\r\n }\r\n\r\n\r\n if (!this.videoEntry.vehicle?.onlineStatus?.online && this.latestOfflineProgressRetrieved) {\r\n // Camera is offline\r\n return;\r\n }\r\n\r\n if (!!this.videoEntry.ExternalId) {\r\n this.percentage = this.percentage || 0;\r\n }\r\n\r\n\r\n }\r\n\r\n private handleDownloadFailed(): void {\r\n this.percentage = 0;\r\n this.currentStep = RequestStep.Error;\r\n this.statusChange.emit(this.currentStep);\r\n this.endTimer$.next();\r\n }\r\n\r\n private handleDownloadSuccessful(): void {\r\n this.percentage = 100;\r\n this.currentStep = RequestStep.Complete;\r\n\r\n if (!this.downloadCompleted) {\r\n this.statusChange.emit(this.currentStep);\r\n }\r\n\r\n this.downloadCompleted = true;\r\n\r\n this.endTimer$.next();\r\n }\r\n\r\n private handleVideoUploaded(): void {\r\n this.percentage = 75;\r\n this.currentStep = RequestStep.Downloading;\r\n this.statusChange.emit(this.currentStep);\r\n }\r\n\r\n private handleFaceblurring(): void {\r\n this.percentage = 90;\r\n this.currentStep = RequestStep.Faceblurring;\r\n this.statusChange.emit(this.currentStep);\r\n }\r\n}\r\n","import { Component, Input, OnInit } from \"@angular/core\";\r\nimport { IDriver } from \"@app/interfaces/IDriver\";\r\nimport { IVideoEntry } from \"@app/main/components/videos/models/IVideoEntry\";\r\nimport { DriverAssignmentService } from \"@app/services/driverAssignment.service\";\r\n\r\n@Component({\r\n selector: 'video-driver-assignment',\r\n template: require('./video-driver-assignment.component.html')\r\n})\r\nexport class VideoDriverAssignmentComponent implements OnInit {\r\n\r\n @Input() videoEntry: IVideoEntry;\r\n\r\n driver: IDriver;\r\n loading: boolean;\r\n constructor(private readonly driverAssignmentService: DriverAssignmentService) { }\r\n\r\n ngOnInit(): void {\r\n this.getDriverAssignment();\r\n }\r\n\r\n //--\r\n\r\n private getDriverAssignment(): void {\r\n if (this.videoEntry?.driver) {\r\n this.driver = this.videoEntry.driver;\r\n return;\r\n }\r\n\r\n this.loading = true;\r\n\r\n this.driverAssignmentService.getDriverAssignmentForTime(this.videoEntry.VehicleId, this.videoEntry.VideoStartTime).then(\r\n driver => {\r\n this.driver = driver; \r\n }\r\n ).finally(() => {\r\n this.loading = false;\r\n })\r\n }\r\n}\r\n","\r\nexport enum VideoEventRisk {\r\n None,\r\n Low,\r\n Medium,\r\n High,\r\n Urgent\r\n}\r\n","\r\nexport enum CreationCode {\r\n Debug = 0,\r\n VehicleMovingOverTime = 1,\r\n VehicleMovingOverDistance = 2,\r\n VehicleIdling = 3,\r\n KeyON = 4,\r\n KeyOFF = 5,\r\n HeadingChange = 10,\r\n TwentyFourHour = 24,\r\n GPSGot = 25,\r\n GPSLost = 26,\r\n VehicleStartMoving = 29,\r\n MotionOnKeyOff = 42,\r\n MotionStopOnKeyOff = 43,\r\n CameraButton = 55,\r\n DriverLogon = 61,\r\n DriverLogoff = 62,\r\n EngineON = 74,\r\n EngineOFF = 75,\r\n Error = 91,\r\n GPSQualityFix = 94,\r\n GPSQualityLost = 95,\r\n Heartbeat = 100,\r\n WakeupOnMotion = 101,\r\n VehicleStationary = 123,\r\n GPSModemRestart = 200,\r\n FileManagerSuccess = 400,\r\n FileManagerFailure = 401,\r\n HarshUnknownHigh = 435,\r\n HarshDecelHigh = 436,\r\n HarshAccelHigh = 437,\r\n HarshCornerHigh = 438,\r\n RSPST1Video = 455,\r\n RSPST2Video = 456,\r\n HarshUnknownLow = 457,\r\n HarshUnknownMedium = 458,\r\n VideoRequestedEvent = 459,\r\n VideoUploadComplete = 460,\r\n AppbootupUpdater = 470,\r\n AppbootupTelematics = 471,\r\n LaneDepartureLeft = 480,\r\n LaneDepartureRight = 481,\r\n PedestrianCollisionWarning = 482,\r\n VehicleTooCloseWarning = 483,\r\n VehicleCollisionWarning = 484,\r\n CameraCovered = 485,\r\n DriverLogoutAbnormality = 486,\r\n DriverLogin = 487,\r\n EyesCovered = 488,\r\n EyesClosed = 489,\r\n FatigueBlinking = 490,\r\n Yawning = 491,\r\n StaringLeftRight = 492,\r\n GlancingLeftRight = 493,\r\n LookingUpDown = 494,\r\n PhoneCalling = 495,\r\n PhoneWatching = 496,\r\n Smoking = 497,\r\n LowMedvideoRequestedEvent = 500\r\n}\r\n","import { Component } from \"@angular/core\";\r\nimport { getValuesFromEnum } from \"@app/class/Utilities\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { IFilterBarTab } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { FilterBarService } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.service\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { Observable } from \"rxjs\";\r\nimport { finalize, tap } from \"rxjs/operators\";\r\nimport { ICameraApp, CameraApplicationState, CameraAppType } from \"../../_models/ICameraApp\";\r\nimport { CameraAppService } from \"../../_services/camera-app.service\";\r\nimport './application-manager.component.scss';\r\n\r\n@Component({\r\n selector: 'application-manager',\r\n template: require('./application-manager.component.html')\r\n})\r\nexport class ApplicationManagerComponent {\r\n\r\n cameraApps: ICameraApp[];\r\n selectedApp: ICameraApp;\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n filterTabs: IFilterBarTab[];\r\n\r\n CameraApplicationState = CameraApplicationState;\r\n CameraAppType = CameraAppType;\r\n typesList: { translatedString: string, value: CameraAppType }[];\r\n statesList: { translatedString: string, value: CameraApplicationState }[];\r\n\r\n loading: boolean;\r\n errorMessage: string;\r\n\r\n constructor(\r\n private readonly cameraAppService: CameraAppService,\r\n private readonly filterBarService: FilterBarService,\r\n private readonly translationService: TranslationService,\r\n private readonly vTableService: VTableService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.createTabs();\r\n this.createTable();\r\n this.loadData();\r\n }\r\n\r\n archiveApp(confirm: boolean): void {\r\n if (!confirm) {\r\n return;\r\n }\r\n\r\n this.selectedApp.IsActive = false;\r\n\r\n this.updateApp();\r\n }\r\n\r\n unarchiveApp(): void {\r\n this.selectedApp.IsActive = true;\r\n\r\n this.updateApp();\r\n }\r\n\r\n updateApp(): void {\r\n this.clearError();\r\n\r\n this.saveApp(this.selectedApp);\r\n\r\n this.tableRows = this.vTableService.createTableRows(this.cameraApps, this.tableColumns);\r\n\r\n this.selectedApp = null;\r\n }\r\n\r\n filterAppByType(app: ICameraApp, type: { translatedString: string, value: CameraAppType }): boolean {\r\n return app.CameraAppType == type.value;\r\n }\r\n\r\n typeSearchPredicate(type: CameraAppType, searchText: string): boolean {\r\n const translatedType = this.translationService.tEnum(CameraAppType, \"CameraAppType\", type);\r\n return translatedType.toLowerCase().indexOf(searchText.toLowerCase()) >= 0;\r\n }\r\n\r\n filterAppByState(app: ICameraApp, type: { translatedString: string, value: CameraApplicationState }): boolean {\r\n return app.State == type.value;\r\n }\r\n\r\n stateSearchPredicate(state: CameraApplicationState, searchText: string): boolean {\r\n const translatedState = this.translationService.tEnum(CameraApplicationState, \"CameraApplicationState\", state);\r\n return translatedState.toLowerCase().indexOf(searchText.toLowerCase()) >= 0;\r\n }\r\n\r\n onRowClicked(tableRow: IVTableRow): void {\r\n this.selectedApp = tableRow.data;\r\n }\r\n\r\n addNewApp(): void {\r\n this.selectedApp = this.cameraAppService.createNewApp();\r\n }\r\n\r\n clearSelectedApp(): void {\r\n this.selectedApp = null;\r\n this.errorMessage = \"\";\r\n }\r\n\r\n onAppSaved(formData: FormData): void {\r\n this.loading = true;\r\n\r\n let saveMethod: Observable = this.cameraAppService.saveApp(formData);\r\n\r\n if (this.selectedApp.Id > 0) {\r\n saveMethod = this.cameraAppService.updateApp(this.selectedApp);\r\n }\r\n\r\n saveMethod.pipe(\r\n untilDestroyed(this)\r\n ).subscribe({\r\n next : app => {\r\n this.cameraApps.push(app);\r\n this.tableRows = this.vTableService.createTableRows(this.cameraApps, this.tableColumns);\r\n },\r\n complete: () => {\r\n this.clearSelectedApp();\r\n this.loading = false;\r\n },\r\n error: () => {\r\n this.errorMessage = this.translationService.t(\"AppManagement.ErrorSaving\");\r\n this.loading = false;\r\n }\r\n });\r\n }\r\n\r\n onFormUpdated(): void {\r\n this.clearError();\r\n }\r\n\r\n //--\r\n\r\n private loadData(): void {\r\n this.cameraAppService.getApplicationFiles().pipe(\r\n untilDestroyed(this),\r\n tap(apps => {\r\n this.cameraApps = apps;\r\n this.createFilters();\r\n this.tableRows = this.vTableService.createTableRows(this.cameraApps, this.tableColumns);\r\n })\r\n ).subscribe();\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'RVLite.Version', sortType: SortType.Number, width: 150 }),\r\n createCellFunction: (app) => this.vTableService.createTableCell(app.Version)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'Common.Name' }),\r\n createCellFunction: (app) => this.vTableService.createTableCell(app.Name)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'Common.Description' }),\r\n createCellFunction: (app) => this.vTableService.createTableCell(app.Description)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'AppManagement.AppType' }),\r\n createCellFunction: (app) => this.vTableService.createEnumCell(CameraAppType, \"CameraAppType\", app.CameraAppType)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'AppManagement.State' }),\r\n createCellFunction: (app) => this.vTableService.createEnumCell(CameraApplicationState, \"CameraApplicationState\", app.State)\r\n }\r\n ]\r\n }\r\n\r\n private saveApp(app: ICameraApp): void {\r\n this.loading = true;\r\n\r\n this.cameraAppService.updateApp(app).pipe(\r\n untilDestroyed(this),\r\n finalize(() => {\r\n this.loading = false;\r\n })).subscribe();\r\n }\r\n\r\n private createFilters(): void {\r\n this.typesList = this.createFilterItems(CameraAppType, \"CameraAppType\");\r\n this.statesList = this.createFilterItems(CameraApplicationState, \"CameraApplicationState\");\r\n }\r\n\r\n private createFilterItems(enumType: T, enumName: string): any {\r\n\r\n const enumValues = getValuesFromEnum(enumType);\r\n\r\n return enumValues.map(value => {\r\n return {\r\n translatedString: this.translationService.tEnum(enumType, enumName, value),\r\n value: value\r\n }\r\n });\r\n }\r\n\r\n private createTabs(): void {\r\n this.filterTabs = [];\r\n\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"Common.Active\", this.isActivePredicate));\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"Common.Archived\", this.isInactivePredicate));\r\n }\r\n\r\n private isActivePredicate = (app) => {\r\n return app.IsActive;\r\n }\r\n\r\n private isInactivePredicate = (app) => {\r\n return !app.IsActive;\r\n }\r\n\r\n private clearError(): void {\r\n this.errorMessage = \"\";\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges, ViewChild } from \"@angular/core\";\r\nimport { IGeofence } from \"@app/interfaces/IGeofences\";\r\nimport { IVehicleQueryOptions } from \"@app/interfaces/IVehicleQueryOptions\";\r\nimport { DynamicReportService } from \"@app/main/components/reports/_services/dynamicReports.service\";\r\nimport { DateService } from \"@app/services/date.service\";\r\nimport { DateRange } from \"@enums/DateRange.enum\";\r\nimport { ICombinedPreferences } from \"@interfaces/ICombinedPreferences\";\r\nimport { IDriver } from \"@interfaces/IDriver\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { IGroup } from \"@interfaces/IVehicleGroup\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { TimeFilterType } from \"@reports/enums/TimeFilterType\";\r\nimport { IReportDefinition } from \"@reports/models/IReportDefinition\";\r\nimport { SessionService } from \"@services/session.service\";\r\nimport { Subject } from \"rxjs\";\r\nimport { debounceTime } from \"rxjs/operators\";\r\nimport { SettingsName } from \"src/app/class/SettingsName\";\r\nimport { IColumnHeader } from \"../../models/IColumnHeader\";\r\nimport { ReportInternationalisationOptionsComponent } from \"../report-internationalisation-options/report-internationalisation-options.component\";\r\nimport { ReportParametersComponent } from \"../report-parameters/report-parameters.component\";\r\nimport { IRowDataSourceChange } from \"../row-data-source-selector2/row-data-source-selector2.component\";\r\nimport \"./report-filters.component.scss\";\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: \"report-filters\",\r\n template: require(\"./report-filters.component.html\")\r\n})\r\nexport class ReportFiltersComponent implements OnChanges {\r\n\r\n @Input() report: IReportDefinition;\r\n @Output() reportChange = new EventEmitter();\r\n\r\n @Input() reportId: number;\r\n @Input() hideDate: boolean;\r\n\r\n @ViewChild(\"reportParameters\") reportParameters: ReportParametersComponent;\r\n @ViewChild(\"reportInternationalisationOptions\") reportInternationalisationOptions: ReportInternationalisationOptionsComponent;\r\n\r\n // ---\r\n\r\n reportChangeDebounce$ = new Subject();\r\n\r\n TimeFilterType = TimeFilterType;\r\n\r\n startDateRange = DateRange.Today;\r\n\r\n loading = false;\r\n userTZMatch = true;\r\n timeZone: string;\r\n\r\n showParameterOptions: boolean;\r\n showTemperatureChartCheckBox: boolean;\r\n showGeofenceFilters: boolean;\r\n\r\n requireSingleResource: boolean;\r\n vehicleQueryOptions: IVehicleQueryOptions;\r\n\r\n maxDays: number = 92;\r\n isValid: boolean = true;\r\n\r\n constructor(\r\n private readonly dateService: DateService,\r\n private readonly dynamicReportService: DynamicReportService,\r\n private readonly sessionService: SessionService,\r\n ) {\r\n this.setupChangeDebounce();\r\n }\r\n\r\n get selectedResource(): boolean {\r\n return !!this.report.Parameters.VehicleId || !!this.report.Parameters.DriverId;\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['report']) {\r\n this.showParameterOptions = this.dynamicReportService.getCustomParameterDefinitions(this.report).length > 0;\r\n this.showGeofenceFilters = this.dynamicReportService.shouldShowGeofenceFilters(this.report);\r\n this.checkShouldHideDateFilter();\r\n this.checkForTemperatureChartColumns();\r\n }\r\n\r\n this.resourceChecks();\r\n }\r\n\r\n ngOnInit() {\r\n this.createTimezoneOffsetWarning();\r\n }\r\n\r\n onReportParametersChanged(): void {\r\n this.triggerModelChange();\r\n }\r\n\r\n onReportI18OptionsUpdated(report: IReportDefinition): void {\r\n this.reportParameters?.processI18nOptionsChange();\r\n this.triggerModelChange();\r\n }\r\n\r\n onDateChanged(date: Date) {\r\n this.report.Parameters.Start = date;\r\n\r\n this.triggerModelChange();\r\n }\r\n\r\n onDateRangeChanged(dates: [Date, Date]) {\r\n if (!this.datesAreValid(dates)) {\r\n this.isValid = false;\r\n return;\r\n }\r\n\r\n this.isValid = true;\r\n\r\n this.report.Parameters.Start = dates[0];\r\n this.report.Parameters.End = dates[1];\r\n\r\n this.triggerModelChange();\r\n }\r\n\r\n onVehicleSelected(vehicle: IVehicle) {\r\n\r\n const vehicleId = vehicle?.Id;\r\n const vehicleIdChanged = vehicleId !== this.report.Parameters.VehicleId;\r\n\r\n this.report.Parameters.VehicleId = vehicleId;\r\n\r\n if (vehicleIdChanged) {\r\n this.reportParameters?.processVehicleChange();\r\n }\r\n\r\n this.triggerModelChange();\r\n }\r\n\r\n onVehicleCleared(): void {\r\n this.report.Parameters.VehicleId = null;\r\n\r\n this.reportParameters?.processVehicleChange();\r\n\r\n this.triggerModelChange();\r\n }\r\n\r\n onVehicleGroupSelected(group: IGroup) {\r\n this.report.Parameters.VehicleGroupId = group.Id;\r\n\r\n this.triggerModelChange();\r\n }\r\n\r\n onVehicleGroupCleared() {\r\n this.report.Parameters.VehicleGroupId = null;\r\n\r\n this.triggerModelChange();\r\n }\r\n\r\n onDriverSelected(driver: IDriver) {\r\n this.report.Parameters.DriverId = driver.Id;\r\n\r\n this.triggerModelChange();\r\n }\r\n\r\n onDriverCleared(): void {\r\n this.report.Parameters.DriverId = null;\r\n\r\n this.triggerModelChange();\r\n }\r\n\r\n onDriverGroupSelected(group: IGroup): void {\r\n this.report.Parameters.DriverGroupId = group.Id;\r\n\r\n this.triggerModelChange();\r\n }\r\n\r\n onDriverGroupCleared() {\r\n this.report.Parameters.DriverGroupId = null;\r\n\r\n this.triggerModelChange();\r\n }\r\n\r\n onGeofenceSelected(geofence: IGeofence): void {\r\n this.report.Parameters.GeofenceId = geofence.Id;\r\n\r\n this.triggerModelChange();\r\n }\r\n\r\n onGeofenceCleared(): void {\r\n this.report.Parameters.GeofenceId = null;\r\n\r\n this.triggerModelChange();\r\n }\r\n\r\n onSelectedTagsChanged(tagIds: number[]): void {\r\n this.report.Parameters.TagIds = tagIds;\r\n }\r\n\r\n onRowDataSourceChanged(change: IRowDataSourceChange): void {\r\n if (!this.report) {\r\n return;\r\n }\r\n\r\n const rowDataSourceChanged = this.report.RowDataSource !== change.row;\r\n\r\n this.report.RowDataSource = change.row;\r\n this.report.SubRowDataSource = change.subRow;\r\n\r\n if (!rowDataSourceChanged) {\r\n return;\r\n }\r\n\r\n let rowTitleHeader: IColumnHeader;\r\n\r\n this.dynamicReportService.getDisplayColumnHeaders().then(columnHeaders => {\r\n rowTitleHeader = this.dynamicReportService.findRowTitleColumn(columnHeaders);\r\n this.dynamicReportService.setReportDefinitionRowTitle(this.report, rowTitleHeader);\r\n });\r\n\r\n\r\n this.updateSortedHeader();\r\n this.triggerModelChange();\r\n }\r\n\r\n // ---\r\n\r\n private datesAreValid(dates: [Date, Date]): boolean {\r\n if (dates.some(date => isNaN(date?.getTime()))) {\r\n return false;\r\n }\r\n\r\n const diff = this.dateService.getDaysDifference(dates[0], dates[1]);\r\n if (diff > this.maxDays) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private triggerModelChange(): void {\r\n this.reportChangeDebounce$.next(this.report);\r\n }\r\n\r\n private setupChangeDebounce(): void {\r\n this.reportChangeDebounce$.pipe(debounceTime(50), untilDestroyed(this)).subscribe((report) => {\r\n this.reportChange.emit(report);\r\n });\r\n }\r\n\r\n private createTimezoneOffsetWarning() {\r\n this.dynamicReportService.isMachineAndUserTZSame().then(result => {\r\n this.userTZMatch = result;\r\n\r\n if (!this.userTZMatch) {\r\n\r\n let userOptions = this.sessionService.getItem(SettingsName.UserOptions);\r\n this.timeZone = userOptions.Timezone.Value;\r\n }\r\n });\r\n }\r\n\r\n private checkForTemperatureChartColumns(): void {\r\n this.showTemperatureChartCheckBox = this.dynamicReportService.findColumn(\"ProbeTemperatures\", \"Temperature\", this.report.TableDefinition.Headers) != null;\r\n }\r\n\r\n private updateSortedHeader(): void {\r\n if (!this.report?.TableDefinition?.Headers?.length) {\r\n return;\r\n }\r\n\r\n const sortSettings = this.dynamicReportService.getSortSettings(this.report);\r\n\r\n this.report.TableDefinition.Headers.forEach(header => {\r\n header.Sorted = header.Id === sortSettings.headerId;\r\n\r\n if (header.Sorted) {\r\n header.SortAscending = sortSettings.ascending;\r\n }\r\n });\r\n }\r\n\r\n private checkShouldHideDateFilter(): void {\r\n if (this.hideDate) {\r\n return;\r\n }\r\n\r\n this.hideDate = !this.dynamicReportService.requiresDateSelector(this.report);\r\n }\r\n\r\n private resourceChecks(): void {\r\n this.requireSingleResource = this.dynamicReportService.restrictReportToSingleResource(this.report);\r\n\r\n if (this.dynamicReportService.isTemperatureReport(this.report)) {\r\n this.vehicleQueryOptions = {\r\n HasTemperatureProbeInstalled: true\r\n }\r\n }\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from \"@angular/core\";\r\nimport { UnitConversionService, UnitConversionType } from \"@app/services/unitConversion.service\";\r\nimport { DynamicReportService } from \"@reports/_services/dynamicReports.service\";\r\nimport { IReportDefinition } from \"@reports/models/IReportDefinition\";\r\nimport { IReportParameter, IReportParameterDefinition, ReportParameterType, ReportParameterValueType } from \"@reports/models/IReportParameters\";\r\nimport { ITemperatureProbe } from \"@temperature/_models/temperature/ITemperatureProbe\";\r\nimport { TemperatureProbeService } from \"@temperature/_services/temperature-probe.service\";\r\nimport \"./report-parameters.component.scss\";\r\nimport { lastValueFrom } from \"rxjs\";\r\n\r\ninterface IDisplayTemperatureProbeParameter {\r\n displayName: string;\r\n source: number;\r\n position: number;\r\n enabled?: boolean;\r\n}\r\n\r\ninterface ITemperatureProbeParamaterValue {\r\n Source: number;\r\n Position: number;\r\n}\r\n\r\n@Component({\r\n selector: \"report-parameters\",\r\n template: require(\"./report-parameters.component.html\")\r\n})\r\nexport class ReportParametersComponent implements OnChanges {\r\n\r\n @Input() report: IReportDefinition;\r\n @Output() reportChange = new EventEmitter();\r\n\r\n // ---\r\n\r\n customParameterDefinitions: IReportParameterDefinition[];\r\n ReportParameterValueType = ReportParameterValueType;\r\n ReportParameterType = ReportParameterType;\r\n UnitConversionType = UnitConversionType;\r\n\r\n probes: ITemperatureProbe[] = [];\r\n probesForVehicle: ITemperatureProbe[] = [];\r\n displayProbes: IDisplayTemperatureProbeParameter[] = [];\r\n\r\n cachedVehicleId: number;\r\n completedFirstChange: boolean;\r\n\r\n constructor(\r\n private readonly dynamicReportService: DynamicReportService,\r\n private readonly temperatureProbeService: TemperatureProbeService,\r\n private readonly unitConversionService: UnitConversionService\r\n ) {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[\"report\"]) {\r\n this.setupParametersFromReport();\r\n }\r\n }\r\n\r\n processI18nOptionsChange(): void {\r\n\r\n if (!this.customParameterDefinitions?.length) {\r\n return;\r\n }\r\n\r\n this.customParameterDefinitions.forEach(paramDefinition => {\r\n\r\n if (paramDefinition.valueType !== ReportParameterValueType.Number) {\r\n return;\r\n }\r\n\r\n if (!paramDefinition.conversionType && paramDefinition.conversionType !== 0) {\r\n paramDefinition.conversionType = UnitConversionType.Unknown;\r\n }\r\n\r\n const newConversionLabel = this.unitConversionService.getConversionLabel(paramDefinition.conversionType, this.report.cachedCustomPreferences);\r\n const labelIsMetric = this.unitConversionService.isLabelMetric(paramDefinition.conversionLabel);\r\n\r\n paramDefinition.conversionLabel = newConversionLabel;\r\n paramDefinition.Value = (labelIsMetric) ? paramDefinition.displayValue : this.unitConversionService.convert(paramDefinition.displayValue, paramDefinition.conversionType, 0, true, -1, this.report.cachedCustomPreferences);\r\n\r\n this.onCustomParameterChanged(paramDefinition);\r\n })\r\n }\r\n\r\n processVehicleChange(): void {\r\n this.clearCachedProbes();\r\n this.clearProbeParameters();\r\n\r\n this.processVehicle();\r\n }\r\n\r\n onNumberParameterChanged(newValue: number | string, paramDefinition: IReportParameterDefinition): void {\r\n\r\n if (typeof newValue !== \"undefined\" && newValue !== \"\") {\r\n paramDefinition.displayValue = +newValue;\r\n }\r\n\r\n const labelIsMetric = this.unitConversionService.isLabelMetric(paramDefinition.conversionLabel);\r\n paramDefinition.Value = (labelIsMetric) ? paramDefinition.displayValue : this.unitConversionService.convert(paramDefinition.displayValue, paramDefinition.conversionType, 0, true, -1, this.report.cachedCustomPreferences);\r\n\r\n this.onCustomParameterChanged(paramDefinition);\r\n }\r\n\r\n onSelectParameterChanged(newValue: any, definition: IReportParameterDefinition): void {\r\n definition.Value = newValue;\r\n\r\n this.onCustomParameterChanged(definition);\r\n }\r\n\r\n onTemperatureProbeChanged(definition: IReportParameterDefinition): void {\r\n\r\n definition.Value = [];\r\n\r\n if (!this.displayProbes?.length) {\r\n return;\r\n }\r\n\r\n this.displayProbes.forEach(displayProbe => {\r\n if (displayProbe.enabled) {\r\n return;\r\n }\r\n\r\n const newValue: ITemperatureProbeParamaterValue = {\r\n Position: displayProbe.position,\r\n Source: displayProbe.source\r\n }\r\n\r\n definition.Value.push(newValue);\r\n });\r\n\r\n this.onCustomParameterChanged(definition);\r\n }\r\n\r\n onCustomParameterChanged(changedParameter: IReportParameterDefinition): void {\r\n\r\n if (changedParameter.valueType === ReportParameterValueType.Boolean) {\r\n changedParameter.Value = changedParameter.Active;\r\n }\r\n\r\n this.updateCustomParameters();\r\n this.emitChange();\r\n }\r\n\r\n // ---\r\n\r\n private setupParametersFromReport(): void {\r\n this.customParameterDefinitions = this.dynamicReportService.getCustomParameterDefinitions(this.report);\r\n this.prepare();\r\n }\r\n\r\n private updateCustomParameters(): void {\r\n if (!this.customParameterDefinitions?.length) {\r\n return;\r\n }\r\n \r\n this.customParameterDefinitions.forEach(def => {\r\n const existingIndex = this.report.Parameters.CustomParameters.findIndex(p => p.ParameterType === def.ParameterType);\r\n\r\n if (def.Active) {\r\n const newParam: IReportParameter = {\r\n ParameterType: def.ParameterType,\r\n Value: def.Value,\r\n Active: def.Active\r\n };\r\n\r\n existingIndex > -1 ?\r\n this.report.Parameters.CustomParameters[existingIndex] = newParam :\r\n this.report.Parameters.CustomParameters.push(newParam);\r\n\r\n } else if (existingIndex > -1) {\r\n this.report.Parameters.CustomParameters.splice(existingIndex, 1);\r\n } \r\n });\r\n }\r\n\r\n private fixParameterDefinitions(customParameterDefinitions: IReportParameterDefinition[]): void {\r\n if (!customParameterDefinitions?.length) {\r\n return;\r\n }\r\n\r\n // set missing value based on default value\r\n customParameterDefinitions.forEach(customParameterDefinition => {\r\n if (!customParameterDefinition.Active && typeof customParameterDefinition.Value === \"undefined\") {\r\n customParameterDefinition.Value = customParameterDefinition.Value || customParameterDefinition.defaultValue;\r\n }\r\n\r\n if (customParameterDefinition.Value) {\r\n customParameterDefinition.displayValue = this.unitConversionService.convert(customParameterDefinition.Value, customParameterDefinition.conversionType);\r\n }\r\n });\r\n }\r\n\r\n private emitChange(): void {\r\n this.reportChange.emit(this.report);\r\n }\r\n\r\n private clearCachedProbes(): void {\r\n this.probesForVehicle = [];\r\n this.displayProbes = [];\r\n }\r\n\r\n private clearProbeParameters(): void {\r\n const temperatureProbeParamDefinition = this.customParameterDefinitions.find(paramDefinition => paramDefinition.valueType === ReportParameterValueType.TemperatureProbes);\r\n\r\n if (!temperatureProbeParamDefinition) {\r\n return;\r\n }\r\n\r\n temperatureProbeParamDefinition.Value = [];\r\n\r\n this.onCustomParameterChanged(temperatureProbeParamDefinition);\r\n }\r\n\r\n private prepare(): void {\r\n this.fixParameterDefinitions(this.customParameterDefinitions);\r\n this.processVehicle();\r\n }\r\n\r\n private async processVehicle(): Promise {\r\n this.clearCachedProbes();\r\n\r\n const vehicleId: number = this.report?.Parameters?.VehicleId;\r\n\r\n if (!vehicleId && vehicleId !== 0 && vehicleId !== this.cachedVehicleId) {\r\n console.warn(\"No vehicle id, bailing\");\r\n return;\r\n }\r\n\r\n this.cachedVehicleId = vehicleId;\r\n\r\n await this.processTemperatureProbes();\r\n }\r\n\r\n private async processTemperatureProbes(): Promise {\r\n const temperatureProbeParamDefinition = this.customParameterDefinitions.find(paramDefinition => paramDefinition.valueType === ReportParameterValueType.TemperatureProbes);\r\n\r\n if (!temperatureProbeParamDefinition) {\r\n return;\r\n }\r\n\r\n if (!this.probes?.length) {\r\n this.probes = await lastValueFrom(this.temperatureProbeService.getTemperatureProbes());\r\n }\r\n\r\n this.probesForVehicle = this.probes?.filter(probe => probe.VehicleId === this.report.Parameters.VehicleId) ?? [];\r\n\r\n this.setDisplayProbes(temperatureProbeParamDefinition);\r\n }\r\n\r\n private setDisplayProbes(temperatureProbeParamDefinition: IReportParameterDefinition): void {\r\n\r\n this.displayProbes = [];\r\n\r\n if (!this.probesForVehicle?.length) {\r\n return;\r\n }\r\n\r\n this.probesForVehicle.forEach(probe => {\r\n const matchingProbe: ITemperatureProbeParamaterValue = this.findProbeInDefinition(temperatureProbeParamDefinition, probe);\r\n\r\n const newMapping: IDisplayTemperatureProbeParameter = {\r\n displayName: probe.Name || probe.Code,\r\n source: probe.Source,\r\n position: probe.Position,\r\n enabled: !matchingProbe\r\n }\r\n\r\n this.displayProbes.push(newMapping);\r\n });\r\n }\r\n\r\n private findProbeInDefinition(temperatureProbeParamDefinition: IReportParameterDefinition, probe: ITemperatureProbe): ITemperatureProbeParamaterValue {\r\n\r\n if (!temperatureProbeParamDefinition?.Value?.length) {\r\n return;\r\n }\r\n\r\n const values: ITemperatureProbeParamaterValue[] = temperatureProbeParamDefinition.Value;\r\n\r\n return values.find(value => value.Position === probe.Position && value.Source === probe.Source);\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from \"@angular/core\";\r\nimport { VTableRowStatus } from \"@app/directives/_layout/v-table/_enums/VTableRowStatus.enum\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { FallbackCellType, VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { IAggregateFilterEvent } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { LegacyExportService } from \"@app/directives/_veri/export/legacyExport.service\";\r\nimport { DateRange } from \"@app/enum/DateRange.enum\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { AccountService, IAccount } from \"@app/services/account.service\";\r\nimport { AccountFeatureService } from \"@app/services/accountFeature.service\";\r\nimport { DateService } from \"@app/services/date.service\";\r\nimport { GroupService } from \"@app/services/group.service.ajs\";\r\nimport { NavigationService } from \"@app/services/navigation.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { forkJoin, from } from \"rxjs\";\r\nimport { ReportRunProgressState } from \"../../enums/ReportRunProgressState.enum\";\r\nimport { IReportHistory } from \"../../models/IDynamicReportLog\";\r\nimport { IReportDefinition } from \"../../models/IReportDefinition\";\r\nimport { IReportParameter, ReportParameterType } from \"../../models/IReportParameters\";\r\nimport { ReportHistoryQueryOptions } from \"../../models/ReportHistoryQueryOptions\";\r\nimport { ReportsNavigationModule } from \"../../reports.navigation\";\r\nimport { DynamicReportService, ExportType } from \"../../_services/dynamicReports.service\";\r\nimport { ReportHistoryService } from \"../../_services/report-history.service\";\r\nimport \"./report-history-page.component.scss\";\r\nimport { reportParameterMappings } from \"./report-parameter-mappings\";\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: \"report-history-page\",\r\n template: require(\"./report-history-page.component.html\")\r\n})\r\nexport class ReportHistoryPageComponent implements OnInit, OnDestroy {\r\n @Input() reportId: number;\r\n @Output() reportHistorySelected = new EventEmitter();\r\n loading: boolean;\r\n reports: IReportDefinition[];\r\n histories: IReportHistory[];\r\n\r\n selectedHistory: IReportHistory;\r\n groupParams: { title: string, groupName: string }[];\r\n\r\n defaultDateRange: DateRange = DateRange.ThisMonth;\r\n startDate: Date;\r\n endDate: Date;\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n showReportStatus: boolean;\r\n updateInterval: ReturnType;\r\n\r\n ReportRunProgressState = ReportRunProgressState;\r\n ExportType = ExportType;\r\n ReportParameterType = ReportParameterType;\r\n\r\n constructor(\r\n private readonly legacyExportService: LegacyExportService,\r\n private readonly vTableService: VTableService,\r\n private readonly reportService: DynamicReportService,\r\n private readonly reportHistoryService: ReportHistoryService,\r\n private readonly accountService: AccountService,\r\n private readonly accountFeatureService: AccountFeatureService,\r\n private readonly groupService: GroupService,\r\n private readonly dateService: DateService,\r\n private readonly navigationService: NavigationService,\r\n private readonly translationService: TranslationService\r\n ) {\r\n }\r\n\r\n ngOnInit() {\r\n this.createDefaultDates();\r\n this.updateHistory(true, true);\r\n this.createTable();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n clearInterval(this.updateInterval);\r\n }\r\n\r\n paramIsObject(paramType: any): boolean {\r\n return typeof paramType === 'object';\r\n }\r\n\r\n onRowClicked(row: IVTableRow) {\r\n this.selectedHistory = row.data;\r\n this.openReportStatus();\r\n }\r\n\r\n openReportStatus(): void {\r\n this.getGroupParams();\r\n this.showReportStatus = true;\r\n }\r\n\r\n hideReportStatus(): void {\r\n this.clearSelectedHistory();\r\n this.showReportStatus = false;\r\n }\r\n\r\n reloadHistory(): void {\r\n this.updateHistory(false, true);\r\n }\r\n\r\n viewReport(): void {\r\n if (this.reportId) {\r\n this.reportHistorySelected.emit(this.selectedHistory);\r\n return;\r\n }\r\n\r\n this.navigationService.go(ReportsNavigationModule.ViewReport, { historyId: this.selectedHistory.Id, reportId: this.selectedHistory.ReportDefinitionId });\r\n }\r\n\r\n onFilterChanged(filterEvent: IAggregateFilterEvent): void {\r\n if (!filterEvent.trigger) {\r\n return;\r\n }\r\n\r\n if (filterEvent.trigger == \"date\") {\r\n this.startDate = filterEvent.date[0];\r\n this.endDate = filterEvent.date[1];\r\n this.updateHistory(true);\r\n }\r\n }\r\n\r\n hasValidStartAndEndDates(): boolean {\r\n return !this.noDateParams(this.selectedHistory);\r\n }\r\n\r\n download(fileType: ExportType): void {\r\n this.legacyExportService.downloadReport(fileType, this.selectedHistory);\r\n }\r\n\r\n getUnitConversionType(paramType: ReportParameterType): string {\r\n let unitType: string;\r\n\r\n switch (paramType) {\r\n case ReportParameterType.MinimumDistance:\r\n unitType = \"distance\";\r\n break;\r\n case ReportParameterType.MinimumDurationOverWeight:\r\n case ReportParameterType.MinimumEventTime:\r\n case ReportParameterType.MinimumIdleTime:\r\n unitType = \"time\";\r\n break;\r\n case ReportParameterType.MinimumFuelLevelChange:\r\n case ReportParameterType.MinimumFuelUsed:\r\n unitType = \"capacity\";\r\n break;\r\n case ReportParameterType.InProgressGeofenceVisits:\r\n unitType = \"none\";\r\n break;\r\n default:\r\n unitType = \"speed\";\r\n break;\r\n }\r\n\r\n return unitType;\r\n }\r\n\r\n paramIsEnum(paramType: ReportParameterType): boolean {\r\n const enums: ReportParameterType[] = [\r\n ReportParameterType.ReasonCode,\r\n ReportParameterType.RoadType,\r\n ReportParameterType.VehicleType,\r\n ReportParameterType.GeofenceCategory,\r\n ReportParameterType.ShowOnlyAlcolockEventGroup,\r\n ReportParameterType.FilterVehicleRowsByVehicleType\r\n ];\r\n\r\n return enums.includes(paramType);\r\n }\r\n\r\n getEnumValue(param: IReportParameter): string {\r\n const mappings = reportParameterMappings(this.translationService);\r\n\r\n let mapping = mappings.find(mapping => mapping.parameterType === param.ParameterType);\r\n\r\n return mapping.values.find(val => val.Value === param.Value).Name;\r\n }\r\n // ---\r\n\r\n\r\n private updateHistory(showSpinner = false, invalidateCache = false): void {\r\n\r\n const options: ReportHistoryQueryOptions = {\r\n Created: { After: new Date(this.startDate).toISOString(), Before: new Date(this.endDate).toISOString() },\r\n invalidateCache: invalidateCache\r\n };\r\n\r\n if (this.reportId) {\r\n options.ReportDefinitionId = this.reportId;\r\n }\r\n\r\n this.loading = showSpinner;\r\n\r\n forkJoin({\r\n definitions: from(this.reportService.getReports(invalidateCache) as Promise),\r\n history: this.reportHistoryService.getReportHistory(options),\r\n account: from(this.accountService.getAccountData() as Promise)\r\n }).pipe(\r\n untilDestroyed(this)\r\n ).subscribe({\r\n next: data => {\r\n this.reports = data.definitions.filter(definition => this.accountFeatureService.isReportFeatureEnabledOnAccount(data.account, definition));\r\n\r\n this.histories = data.history;\r\n\r\n if (this.selectedHistory) {\r\n this.selectedHistory = this.histories.find(h => h.Id == this.selectedHistory.Id);\r\n }\r\n\r\n this.createReportRows();\r\n\r\n this.checkForUpdatesRequired();\r\n },\r\n complete: () => this.loading = false\r\n })\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createStatusTableHeader({ sorted: false }),\r\n createCellFunction: (log) => this.vTableService.createStatusCell(this.getReportRowStatus(log))\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"Common.Date\", sortDirection: SortDirection.Descending, sorted: true }),\r\n createCellFunction: (log) => this.vTableService.createDateCell(log.CreatedTime),\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Name\" }),\r\n createCellFunction: (log) => this.vTableService.createTableCell(log.ReportTitle),\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"ReportHistory.Source\", width: 180 }),\r\n createCellFunction: (log) => {\r\n const scheduledString = this.translationService.t(\"ReportHistory.Scheduled\");\r\n const manualString = this.translationService.t(\"ReportHistory.RunByUser\");\r\n return this.vTableService.createTableCell(log.ReportScheduleId ? scheduledString : manualString);\r\n }\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Status\", width: 180 }),\r\n createCellFunction: log => this.vTableService.createEnumCell(ReportRunProgressState, \"ReportRunProgressState\", log.ProgressState)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"ReportSchedules.NextParameters\", minTableWidth: 920 }),\r\n createCellFunction: (log) => {\r\n if (this.noDateParams(log)) {\r\n return this.vTableService.createDateCell(undefined, { fallbackCellType: FallbackCellType.NA });\r\n }\r\n\r\n const formattedValue = `${this.dateService.formatDate(log.Parameters.Start, { dateTime: true })} - ${this.dateService.formatDate(log.Parameters.End, { dateTime: true })}`\r\n\r\n return this.vTableService.createTableCell(formattedValue)\r\n },\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"ReportHistory.Parameters\", minTableWidth: 920 }),\r\n createCellFunction: (log) => {\r\n let formattedValue = this.reportHistoryService.createParameterString(log);\r\n\r\n\r\n return this.vTableService.createTableCell(formattedValue, { tooltip: true })\r\n },\r\n },\r\n ];\r\n }\r\n\r\n private checkForUpdatesRequired(): void {\r\n //If a report is currently running, we want to check for updates until it has completed.\r\n\r\n clearInterval(this.updateInterval);\r\n\r\n if (!this.histories?.some(history => history.ProgressState !== ReportRunProgressState.Finished)) {\r\n return;\r\n }\r\n\r\n this.updateInterval = setInterval(() => {\r\n this.updateHistory(false, true);\r\n }, 30_000)\r\n }\r\n\r\n private getReportRowStatus(log: IReportHistory): VTableRowStatus {\r\n\r\n if (log.ProgressState) {\r\n if (log.Success) {\r\n return VTableRowStatus.Success;\r\n }\r\n else {\r\n return VTableRowStatus.Error;\r\n }\r\n }\r\n\r\n return VTableRowStatus.Pending;\r\n }\r\n\r\n private getReportDurationInMinutes(log: IReportHistory): number {\r\n var t1 = this.dateService.getDurationFromTimeSpan(log.DataCollectionTime);\r\n var t2 = this.dateService.getDurationFromTimeSpan(log.RowCreationTime);\r\n var t3 = this.dateService.getDurationFromTimeSpan(log.PopulateRowTime);\r\n var t4 = this.dateService.getDurationFromTimeSpan(log.DocumentCreationTime);\r\n\r\n var minutes = 0;\r\n minutes += (t1.hours + t2.hours + t3.hours + t4.hours) * 60;\r\n minutes += (t1.minutes + t2.minutes + t3.minutes + t4.minutes);\r\n minutes += (t1.seconds + t2.seconds + t3.seconds + t4.seconds) / 60;\r\n\r\n return minutes;\r\n }\r\n\r\n private createReportRows() {\r\n this.tableRows = this.vTableService.createTableRows(this.histories, this.tableColumns);\r\n }\r\n\r\n private noDateParams(log: IReportHistory): boolean {\r\n return (new Date(log.Parameters.Start)).getFullYear() < 2000;\r\n }\r\n\r\n private createDefaultDates(): void {\r\n const dateRange = this.dateService.dateRangeFromEnum(this.defaultDateRange);\r\n this.startDate = dateRange.start;\r\n this.endDate = dateRange.end;\r\n }\r\n\r\n private clearSelectedHistory(): void {\r\n this.selectedHistory = null;\r\n }\r\n\r\n private getGroupParams(): void {\r\n this.groupParams = [];\r\n\r\n if (!this.selectedHistory) {\r\n return;\r\n }\r\n\r\n if (this.selectedHistory.Parameters.VehicleGroupId) {\r\n this.groupService.getGroup(this.selectedHistory.Parameters.VehicleGroupId).then(group => {\r\n this.groupParams.push({\r\n title: this.translationService.t(\"ReportHistory.VehicleGroup\"),\r\n groupName: group.Name\r\n })\r\n })\r\n }\r\n\r\n if (this.selectedHistory.Parameters.DriverGroupId) {\r\n this.groupService.getGroup(this.selectedHistory.Parameters.DriverGroupId).then(group => {\r\n this.groupParams.push({\r\n title: this.translationService.t(\"ReportHistory.DriverGroup\"),\r\n groupName: group.Name\r\n })\r\n })\r\n }\r\n\r\n if (this.selectedHistory.Parameters.GeofenceGroupId) {\r\n this.groupService.getGroup(this.selectedHistory.Parameters.GeofenceGroupId).then(group => {\r\n this.groupParams.push({\r\n title: this.translationService.t(\"ReportHistory.GeofenceGroup\"),\r\n groupName: group.Name\r\n })\r\n })\r\n }\r\n }\r\n}\r\n","export class AudioService {\r\n\r\n audioPlayer: HTMLAudioElement;\r\n\r\n constructor() {\r\n this.audioPlayer = new Audio(\"assets/sounds/solemn.mp3\");\r\n }\r\n\r\n public soundAlarm() {\r\n // if this sends before first user interaction it will throw exception\r\n try {\r\n this.audioPlayer.play();\r\n }\r\n catch (e) {\r\n }\r\n }\r\n}\r\n","export enum ReeferEngineModeCategory {\r\n Unknown = -1,\r\n Diesel = 0,\r\n Electric = 1\r\n}\r\n","export enum ReeferMake {\r\n Unknown,\r\n Carrier,\r\n IBOX\r\n}\r\n","export enum ReeferOperatingModeCategory {\r\n Unknown = -1,\r\n StartStop = 0,\r\n Continuous = 1,\r\n CycleSentry = 2\r\n}\r\n","import { Component, Input, OnChanges, SimpleChanges } from \"@angular/core\";\r\nimport { DateService } from \"@services/date.service\";\r\nimport { ReeferZoneOperatingModeCategory } from \"@temperature/_enums/reefer/ReeferZoneOperatingModeCategory.enum\";\r\nimport { IMultiStateInputRecord } from \"@temperature/_models/multiStateInputs/IMultiStateInputRecord\";\r\nimport { IZoneWithProbes } from \"@temperature/_models/temperature/ITemperatureZone\";\r\nimport { ZoneService } from \"@temperature/_services/zone.service\";\r\nimport './zone-operating-mode-widget.component.scss';\r\n\r\n@Component({\r\n selector: 'zone-operating-mode-widget',\r\n template: require('./zone-operating-mode-widget.component.html')\r\n})\r\nexport class ZoneOperatingModeWidget implements OnChanges {\r\n @Input() category: ReeferZoneOperatingModeCategory;\r\n @Input() showText: boolean;\r\n @Input() zones: IZoneWithProbes[];\r\n @Input() zonePosition: number;\r\n @Input() record: IMultiStateInputRecord;\r\n\r\n // ---\r\n\r\n displayText: string;\r\n tooltip: string;\r\n\r\n className: string;\r\n icon: string;\r\n\r\n constructor(\r\n private readonly zoneService: ZoneService,\r\n private readonly dateService: DateService\r\n ) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.render();\r\n }\r\n ngOnChanges(changes: SimpleChanges): void {\r\n this.render();\r\n }\r\n\r\n // ---\r\n\r\n private render(): void {\r\n this.reset();\r\n\r\n if (typeof this.zones === \"string\") {\r\n return;\r\n }\r\n\r\n if (!ReeferZoneOperatingModeCategory[this.category]) {\r\n this.updateCategory();\r\n }\r\n\r\n this.updateDisplayText();\r\n this.updateClassName();\r\n this.updateIcon();\r\n }\r\n\r\n private reset(): void {\r\n this.displayText = null;\r\n this.className = null;\r\n this.icon = null;\r\n }\r\n\r\n private updateCategory(): void {\r\n if (!this.zones && this.category) {\r\n return;\r\n }\r\n\r\n this.category = this.zoneService.getZoneAtPosition(this.zones, this.zonePosition)?.operatingMode;\r\n }\r\n\r\n private updateClassName(): void {\r\n this.className = this.zoneService.getOperatingModeColourClass(this.category);\r\n }\r\n\r\n private updateIcon(): void { \r\n this.icon = this.zoneService.getOperatingModeIcon(this.category);\r\n }\r\n\r\n private updateDisplayText(): void {\r\n this.displayText = this.zoneService.getOperatingModeTranslation(this.category);\r\n\r\n if (this.record) {\r\n this.tooltip = this.dateService.formatDate(this.record.EventTime, { dateTime: true });\r\n }\r\n }\r\n}\r\n","import { Component, Input } from \"@angular/core\";\r\nimport './stacked-probe-reading.component.scss';\r\nexport interface IStackedProbeReadingData {\r\n probeName?: string;\r\n temperature?: string;\r\n outOfBounds?: boolean;\r\n outOfDate?: boolean;\r\n lastUpdated?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'stacked-probe-reading',\r\n template: require('./stacked-probe-reading.component.html')\r\n})\r\nexport class StackedProbeReadingComponent {\r\n @Input() data: IStackedProbeReadingData;\r\n\r\n constructor() { }\r\n}\r\n","import { Component, Input } from \"@angular/core\";\r\nimport './alert-category.component.scss';\r\n\r\n@Component({\r\n selector: 'alert-category',\r\n template: require('./alert-category.component.html')\r\n})\r\nexport class AlertCategoryComponent {\r\n @Input() category: string;\r\n @Input() subCategory: string;\r\n\r\n constructor() { }\r\n}\r\n","import { Component, Input, OnChanges, SimpleChanges } from \"@angular/core\";\r\nimport { IAlertRuleRecord } from \"src/app/main/modules/alerts/_models/alerts.interfaces\";\r\nimport { GeofenceAlertDetailService, IGeofenceAlertDetailData } from\r\n \"src/app/main/modules/alerts/components/alert-detail/geofence-alert-detail/geofence-alert-detail.service\";\r\n\r\n@Component({\r\n selector: \"geofence-alert-detail\",\r\n template: require(\"./geofence-alert-detail.component.html\")\r\n})\r\nexport class GeofenceAlertDetailComponent implements OnChanges {\r\n\r\n @Input() record: IAlertRuleRecord;\r\n @Input() tableMode: boolean = false;\r\n\r\n updating: boolean;\r\n\r\n alertDetailData: IGeofenceAlertDetailData;\r\n tableModeLabel: string;\r\n\r\n debounceTimeout: any;\r\n\r\n constructor(\r\n private readonly alertDetailService: GeofenceAlertDetailService) {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (this.debounceTimeout) {\r\n clearTimeout(this.debounceTimeout);\r\n }\r\n\r\n this.debounceTimeout = setTimeout(() => {\r\n this.getGeofenceData();\r\n this.debounceTimeout = null;\r\n }, 100);\r\n }\r\n\r\n private getGeofenceData(): angular.IPromise {\r\n this.updating = true;\r\n\r\n return this.alertDetailService.getAlertData(this.record)\r\n .then((data: IGeofenceAlertDetailData) => {\r\n this.alertDetailData = data;\r\n this.tableModeLabel = this.alertDetailService.createAlertLabel(this.alertDetailData);\r\n }).finally(() => {\r\n this.updating = false;\r\n });\r\n }\r\n}\r\n","import { Component, Input, OnChanges, SimpleChanges } from \"@angular/core\";\r\nimport { IAlertRuleRecord } from \"src/app/main/modules/alerts/_models/alerts.interfaces\";\r\nimport { TemperatureAlertDetailService } from \"./temperature-alert-detail.service\";\r\nimport { ITemperatureAlertDetailData } from \"./ITemperatureAlertDetailData\";\r\n\r\n@Component({\r\n selector: \"temperature-alert-detail\",\r\n template: require(\"./temperature-alert-detail.component.html\")\r\n})\r\nexport class TemperatureAlertDetailComponent implements OnChanges {\r\n\r\n @Input() record: IAlertRuleRecord;\r\n @Input() tableMode?: boolean = false;\r\n\r\n updating = false;\r\n\r\n alertDetailData: ITemperatureAlertDetailData\r\n tableModeLabel: string;\r\n\r\n debounceTimeout: any;\r\n\r\n constructor(\r\n private readonly temperatureAlertDetailService: TemperatureAlertDetailService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.load();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n this.load();\r\n }\r\n\r\n private load(): void {\r\n if (this.debounceTimeout) {\r\n clearTimeout(this.debounceTimeout);\r\n }\r\n\r\n this.debounceTimeout = setTimeout(() => {\r\n this.getTemperatureData();\r\n this.debounceTimeout = null;\r\n }, 100);\r\n }\r\n\r\n private getTemperatureData(): any {\r\n this.updating = true;\r\n this.temperatureAlertDetailService.getAlertData(this.record).subscribe(data => {\r\n this.alertDetailData = data;\r\n this.tableModeLabel = this.temperatureAlertDetailService.createAlertLabel(this.alertDetailData)\r\n this.updating = false;\r\n });\r\n }\r\n}\r\n","import { Component, Injector, Optional } from \"@angular/core\";\r\nimport { VDialogRef } from \"@app/directives/_layout/v-dialog/v-dialog-ref\";\r\nimport { ColourService } from \"@app/services/colour.service\";\r\nimport { CurrentUserService } from \"@app/services/currentUser.service\";\r\nimport \"./nps-rater.component.scss\";\r\nimport { INPSEntry, NPSService } from \"./nps.service\";\r\n\r\n@Component({\r\n selector: \"nps-rater\",\r\n template: require(\"./nps-rater.component.html\"),\r\n})\r\nexport class NPSRaterComponent {\r\n\r\n selectedRating: number;\r\n comments: string;\r\n saving: boolean;\r\n showThankYou: boolean;\r\n\r\n constructor(\r\n private readonly injector: Injector,\r\n @Optional() private ref: VDialogRef,\r\n private readonly currentUserService: CurrentUserService,\r\n private readonly colourService: ColourService) {\r\n }\r\n\r\n selectRating(rating: number) {\r\n this.selectedRating = rating;\r\n }\r\n\r\n getColor(rating: number) {\r\n if (rating >= 9) {\r\n return this.colourService.greenColor;\r\n }\r\n\r\n if (rating >= 7) {\r\n return this.colourService.orangeColor;\r\n }\r\n\r\n return this.colourService.redColor;\r\n }\r\n\r\n submitEntry() {\r\n const userDescription = this.currentUserService.cachedUser.CurrentAccountUserMapping.Name || this.currentUserService.cachedUser.Email;\r\n const entry: INPSEntry = {\r\n PlatformId: \"AST-Verilocation\",\r\n CustomerId: this.currentUserService.cachedUser.CurrentAccountUserMapping.AccountId.toString(),\r\n\r\n UserDescription: userDescription,\r\n UserId: this.currentUserService.cachedUser.Id.toString(),\r\n\r\n Score: this.selectedRating,\r\n Comments: this.comments\r\n };\r\n\r\n this.saving = true;\r\n\r\n const npsService = this.injector.get(NPSService);\r\n npsService.submitRating(entry).subscribe(x => {\r\n this.saving = false;\r\n this.showThankYou = true;\r\n\r\n setTimeout(() => {\r\n this.ref?.close(entry);\r\n }, 2_000)\r\n });\r\n }\r\n}\r\n","import { Component, HostBinding, Input, OnChanges, OnInit } from \"@angular/core\";\r\nimport { RouteStatus } from \"@tms/_enums/RouteStatus\";\r\nimport { RouteVisitStatus } from \"@tms/_enums/RouteVisitStatus\";\r\nimport { IRouteDetailDisplay } from \"@tms/_services/active-routes.service\";\r\nimport \"./active-route-progress.component.scss\";\r\n\r\n@Component({\r\n selector: \"active-route-progress\",\r\n template: require('./active-route-progress.component.html')\r\n})\r\nexport class ActiveRouteProgressComponent implements OnChanges, OnInit {\r\n @Input() route: IRouteDetailDisplay;\r\n @Input() autohide: boolean;\r\n\r\n // --\r\n\r\n @HostBinding('class') class = \"\";\r\n @HostBinding('class.hide') hide = false;\r\n\r\n progress = 0;\r\n\r\n constructor() {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.updateRouteProgress();\r\n }\r\n\r\n ngOnChanges() {\r\n this.updateRouteProgress();\r\n }\r\n\r\n // ---\r\n\r\n private updateRouteProgress() {\r\n this.updateElementVisibility();\r\n this.calculateRouteProgress();\r\n this.updateClasses();\r\n }\r\n\r\n private updateElementVisibility() {\r\n if (!this.autohide) {\r\n return;\r\n }\r\n\r\n switch (this.route.Status) {\r\n case RouteStatus.Completed:\r\n case RouteStatus.Started:\r\n case RouteStatus.CompletedWithMissing:\r\n case RouteStatus.Incomplete:\r\n this.hide = false;\r\n break;\r\n\r\n default:\r\n this.hide = true;\r\n }\r\n }\r\n\r\n private updateClasses() {\r\n\r\n switch (this.route.Status) {\r\n case RouteStatus.Cancelled:\r\n case RouteStatus.Expired:\r\n case RouteStatus.UserExpired:\r\n case RouteStatus.Incomplete:\r\n this.class = \"error\";\r\n break;\r\n\r\n case RouteStatus.Completed:\r\n case RouteStatus.Started:\r\n this.class = \"ok\";\r\n break;\r\n\r\n case RouteStatus.CompletedWithMissing:\r\n this.class = \"warning\";\r\n break;\r\n\r\n default:\r\n this.class = \"\";\r\n }\r\n }\r\n\r\n private calculateRouteProgress() {\r\n this.progress = this.tableExportDataDelegate(this.route)\r\n }\r\n\r\n tableExportDataDelegate(plannedRoute: IRouteDetailDisplay) : number {\r\n if (!plannedRoute?.PlannedVisits) {\r\n return 0;\r\n }\r\n\r\n // Note, this should probably use ETA or distance to show how far through we are\r\n var progress = 0;\r\n\r\n const numCompletedVisits = plannedRoute.PlannedVisits.filter(v => v.Status == RouteVisitStatus.Arrived || v.Status == RouteVisitStatus.Departed).length;\r\n progress = Math.round(numCompletedVisits * 100 / plannedRoute.PlannedVisits.length);\r\n\r\n return progress;\r\n }\r\n}\r\n","import { CacheService } from \"@services/cache.Service\";\r\nimport { IUnplannedStop } from \"@tms/_models/IUnplannedStop\";\r\n\r\nexport class UnplannedStopService {\r\n\r\n unplannedStopsServiceCache = 'unplannedStopsServiceCache';\r\n\r\n static $inject = [\"$http\", \"cacheService\"];\r\n\r\n constructor(\r\n private readonly $http: angular.IHttpService,\r\n private readonly cacheService: CacheService\r\n ) {\r\nthis.cacheService.createCache(this.unplannedStopsServiceCache, { maxAge: 30 * 60 * 1000 });\r\n }\r\n\r\n getUnplannedStopsForRoute(routeId: number): angular.IPromise {\r\n return this.$http({\r\n url: `/api/unplannedstops/${routeId}`,\r\n method: \"GET\"\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getUnplannedStopsForRoutes(start: moment.Moment, end: moment.Moment, invalidateCache=false, unsafe=false): angular.IPromise {\r\n return this.cacheService.getOrRetrieveData(this.unplannedStopsServiceCache, () => this.getUnplannedStopsForRoutesFromDatabase(start, end), invalidateCache, unsafe);\r\n }\r\n\r\n getUnplannedStopsForRoutesFromDatabase(start: moment.Moment, end: moment.Moment): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/unplannedstops/plannedroutes?start=${start.toISOString()}&end=${end.toISOString()}`,\r\n method: \"GET\"\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n}\r\n","import { IVeriMapComponent } from \"@directives/_map/veriMap/veriMapComponent/veriMap.component\";\r\nimport { IVeriTableHeader, IVeriTableRow, IVeriTableRowCell } from \"@directives/_veri/veriTable/veriTable.component\";\r\nimport { VeriTableService } from \"@directives/_veri/veriTable/veriTable.service\";\r\nimport { SortType } from \"@enums/SortType\";\r\nimport { ICombinedPreferences } from \"@interfaces/ICombinedPreferences\";\r\nimport { IGroup } from \"@interfaces/IVehicleGroup\";\r\nimport { MapService } from \"@services/map.service\";\r\nimport { PreferencesService } from \"@services/preferences.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { UnitConversionService, UnitConversionType } from \"@services/unitConversion.service\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport { RouteEndCondition } from \"@tms/_enums/RouteEndCondition\";\r\nimport { RouteStartCondition } from \"@tms/_enums/RouteStartCondition\";\r\nimport { RouteStatus } from \"@tms/_enums/RouteStatus\";\r\nimport { RouteVisitStatus } from \"@tms/_enums/RouteVisitStatus\";\r\nimport { VisitMatchOptions } from \"@tms/_enums/VisitMatchOptions\";\r\nimport { IPlannedRoute } from \"@tms/_models/IPlannedRoute\";\r\nimport { IPlannedRouteVisit } from \"@tms/_models/IPlannedRouteVisit\";\r\nimport { IRouteExpiryRules, IRouteMatchingRules, ITmsRouteRules, IVisitMatchingRules } from \"@tms/_models/ITmsRouteRules\";\r\nimport { IPlannedRouteDetail } from \"@tms/_services/planned-route.service\";\r\nimport { ILatLngLiteral, IPolyline } from \"../../../../../../scripts/typings/google.maps.angular\";\r\n\r\nexport type RouteMatchingRuleLabels = Record;\r\n\r\nexport interface IPlannedRouteVisitListValidation {\r\n valid: boolean;\r\n reasonMap: { [reason: number]: boolean };\r\n}\r\n\r\nexport enum PlannedRouteVisitListValidationReason {\r\n NoVisits,\r\n VisitMissingLocation,\r\n VisitArrivalTimeBeforePrevious,\r\n VisitSameLocationAsPrevious,\r\n NoArrivalTime,\r\n NoDepartureTime,\r\n NoArrivalAndDepartureTime\r\n}\r\n\r\nexport class SchedulingService {\r\n\r\n preferences: ICombinedPreferences;\r\n\r\n static $inject = [\"veriDate\", \"mapService\", \"veriTableService\", \"translationService\", \"unitConversionService\", \"preferencesService\"];\r\n\r\n constructor(\r\n private readonly veriDate: VeriDate,\r\n private readonly mapService: MapService,\r\n private readonly veriTableService: VeriTableService,\r\n private readonly translationService: TranslationService,\r\n private readonly unitConversionService: UnitConversionService,\r\n private readonly preferencesService: PreferencesService) {\r\n\r\n this.preferencesService.getAllPreferences().then(preferences => {\r\n\r\n this.preferences = preferences;\r\n });\r\n }\r\n\r\n getStartRouteMatchingRuleLabels(): RouteMatchingRuleLabels {\r\n return {\r\n [\"StartRouteOnJourneyStart\"]: this.translationService.t(\"SchedulingService.StartRouteOnJourneyStart\"),\r\n [\"StartRouteOnDepartAnyVisitLocation\"]: this.translationService.t(\"SchedulingService.StartRouteOnDepartAnyVisitLocation\"),\r\n [\"StartRouteOnDepartStartingLocation\"]: this.translationService.t(\"SchedulingService.StartRouteOnDepartStartingLocation\")\r\n }\r\n }\r\n\r\n getEndRouteMatchingRuleLabels(): RouteMatchingRuleLabels {\r\n return {\r\n [\"EndRouteOnAllVisitsArrived\"]: this.translationService.t(\"SchedulingService.EndRouteOnAllVisitsArrived\"),\r\n [\"EndRouteOnArriveAtEndingLocation\"]: this.translationService.t(\"SchedulingService.EndRouteOnArriveAtEndingLocation\")\r\n }\r\n }\r\n\r\n createDefaultTmsRouteRules(): ITmsRouteRules {\r\n const newRules: ITmsRouteRules = {\r\n VisitMatchingRules: this.createDefaultVisitMatchingRules(),\r\n RouteMatchingRules: this.createDefaultRouteMatchingRules(),\r\n RouteExpiryRules: this.createDefaultRouteExpiryRules()\r\n };\r\n\r\n return newRules;\r\n }\r\n\r\n createDefaultRouteMatchingRules(): IRouteMatchingRules {\r\n const newRules: IRouteMatchingRules = {\r\n StartRouteOnDepartStartingLocation: false,\r\n StartRouteOnArriveAnyVisitLocation: false,\r\n StartRouteOnDepartAnyVisitLocation: false,\r\n StartRouteOnJourneyStart: false,\r\n EndRouteOnAllVisitsArrived: false,\r\n EndRouteOnAllVisitsDeparted: false,\r\n EndRouteOnArriveAtEndingLocation: false,\r\n EndRouteOnDepartAtEndingLocation: false,\r\n MinimumStartTime: null\r\n };\r\n\r\n this.setStartRulesFromPreferences(newRules);\r\n this.setEndRulesFromPreferences(newRules);\r\n\r\n return newRules;\r\n }\r\n\r\n setStartRulesFromPreferences(newRules: IRouteMatchingRules): void {\r\n newRules.StartRouteOnJourneyStart = false;\r\n newRules.StartRouteOnArriveAnyVisitLocation = false;\r\n newRules.StartRouteOnDepartAnyVisitLocation = false;\r\n newRules.StartRouteOnDepartStartingLocation = false;\r\n\r\n switch (this.preferences.RouteStartCondition.Value) {\r\n case RouteStartCondition.JourneyStart:\r\n newRules.StartRouteOnJourneyStart = true;\r\n break;\r\n case RouteStartCondition.DepartFromAnyVisit:\r\n newRules.StartRouteOnDepartAnyVisitLocation = true;\r\n break;\r\n case RouteStartCondition.DepartStartLocation:\r\n newRules.StartRouteOnDepartStartingLocation = true;\r\n break;\r\n }\r\n }\r\n\r\n setEndRulesFromPreferences(newRules: IRouteMatchingRules): void {\r\n newRules.EndRouteOnArriveAtEndingLocation = false;\r\n newRules.EndRouteOnAllVisitsArrived = false;\r\n newRules.EndRouteOnAllVisitsDeparted = false;\r\n newRules.EndRouteOnDepartAtEndingLocation = false;\r\n\r\n switch (this.preferences.RouteEndCondition.Value) {\r\n case RouteEndCondition.ArriveAllVisits:\r\n newRules.EndRouteOnAllVisitsArrived = true;\r\n break;\r\n case RouteEndCondition.ArriveEndLocation:\r\n newRules.EndRouteOnArriveAtEndingLocation = true;\r\n break;\r\n }\r\n }\r\n\r\n createDefaultVisitMatchingRules(): IVisitMatchingRules {\r\n const newRules: IVisitMatchingRules = {\r\n ArriveOn: this.preferences.VisitMatchCondition.Value,\r\n DepartOn: VisitMatchOptions.OnLocation,\r\n RecordUnplannedVisits: this.preferences.RecordUnplannedVisits.Value,\r\n CanMatchOnMissedVisits: this.preferences.CanMatchOnMissedVisits.Value,\r\n RecordVisitsAsMissedIfVisitedOutOfOrder: this.preferences.RecordVisitsAsMissedIfVisitedOutOfOrder.Value,\r\n ArriveOnTimeResidingInLocation: this.veriDate.convertMinsToTimeSpan(this.preferences.ArriveOnTimeResidingInLocation.Value, true),\r\n RestartRouteOnReturnToStartingLocation: this.preferences.RestartRouteOnReturnToStartingLocation.Value,\r\n MaximumTimeToRestartRoute: this.veriDate.convertMinsToTimeSpan(this.preferences.MaximumTimeToRestartRoute.Value, true),\r\n };\r\n\r\n return newRules;\r\n }\r\n\r\n createDefaultRouteExpiryRules(): IRouteExpiryRules {\r\n const newRules: IRouteExpiryRules = {\r\n MaximumLateTimeAllowed: this.veriDate.convertMinsToTimeSpan(this.preferences.MaximumLateTimeAllowed.Value, true),\r\n MaximumExpiryTime: null,\r\n MaximumStartTime: null\r\n };\r\n\r\n return newRules;\r\n }\r\n\r\n validateVisitList(visits: IPlannedRouteVisit[]): IPlannedRouteVisitListValidation {\r\n const validation: IPlannedRouteVisitListValidation = {\r\n valid: false,\r\n reasonMap: {}\r\n }\r\n\r\n if (visits?.filter(visit => visit.Status !== RouteVisitStatus.Cancelled)?.length < 2) {\r\n validation.reasonMap[PlannedRouteVisitListValidationReason.NoVisits] = true;\r\n\r\n return validation;\r\n }\r\n\r\n let previousLatLng: ILatLngLiteral;\r\n\r\n visits.forEach((visit, index) => {\r\n visit.validationError = null;\r\n visit.showFollowingDayLabel = false;\r\n\r\n const previousVisit = visits[index - 1];\r\n\r\n const plannedArrivalDate = new Date(visit.PlannedArrivalTime);\r\n const plannedArrivalDateString = this.veriDate.formatDate(plannedArrivalDate);\r\n const plannedArrivalTime = new Date(visit.PlannedArrivalTime).getTime();\r\n\r\n let previousVisitDepartureDateString;\r\n let previousVisitDepartureTime;\r\n\r\n if (previousVisit) {\r\n const previousVisitDepartureDate = new Date(previousVisit.PlannedDepartureTime);\r\n previousVisitDepartureDateString = this.veriDate.formatDate(previousVisitDepartureDate);\r\n previousVisitDepartureTime = new Date(previousVisit.PlannedDepartureTime).getTime();\r\n\r\n if (previousVisitDepartureTime > plannedArrivalTime) {\r\n visit.validationError = this.translationService.t(\"SchedulingService.VisitValidationError_ArrivalTime\", [plannedArrivalDateString, previousVisitDepartureDateString]);\r\n\r\n validation.reasonMap[PlannedRouteVisitListValidationReason.VisitArrivalTimeBeforePrevious] = true;\r\n } else {\r\n visit.showFollowingDayLabel = plannedArrivalDate.getDate() > previousVisitDepartureDate.getDate();\r\n }\r\n }\r\n\r\n if (!visit.RouteStopLocation) {\r\n previousLatLng = null;\r\n\r\n visit.validationError = this.translationService.t(\"SchedulingService.VisitValidationError_ValidLocation\");\r\n\r\n validation.reasonMap[PlannedRouteVisitListValidationReason.VisitMissingLocation] = true;\r\n return;\r\n }\r\n\r\n if (previousLatLng\r\n && visit.RouteStopLocation.Latitude === previousLatLng.latitude\r\n && visit.RouteStopLocation.Longitude === previousLatLng.longitude) {\r\n visit.validationError = this.translationService.t(\"SchedulingService.VisitValidationError_SameLocation\");\r\n\r\n validation.reasonMap[PlannedRouteVisitListValidationReason.VisitSameLocationAsPrevious] = true;\r\n }\r\n\r\n previousLatLng = {\r\n latitude: visit.RouteStopLocation.Latitude,\r\n longitude: visit.RouteStopLocation.Longitude\r\n };\r\n\r\n if (!visit.PlannedDepartureTime) {\r\n visit.validationError = this.translationService.t(\"SchedulingService.VisitValidationError_NoDepartureTime\");\r\n\r\n validation.reasonMap[PlannedRouteVisitListValidationReason.NoDepartureTime] = true;\r\n }\r\n\r\n if (!visit.PlannedArrivalTime) {\r\n visit.validationError = this.translationService.t(\"SchedulingService.VisitValidationError_NoArrivalTime\");\r\n\r\n validation.reasonMap[PlannedRouteVisitListValidationReason.NoArrivalTime] = true;\r\n }\r\n\r\n if (!visit.PlannedDepartureTime && !visit.PlannedArrivalTime) {\r\n visit.validationError = this.translationService.t(\"SchedulingService.VisitValidationError_NoArrivalAndDepartureTime\");\r\n\r\n validation.reasonMap[PlannedRouteVisitListValidationReason.NoArrivalAndDepartureTime] = true;\r\n }\r\n });\r\n\r\n const totalErroredVisits = visits.filter(visit => !!visit.validationError)?.length;\r\n\r\n validation.valid = totalErroredVisits === 0;\r\n\r\n return validation;\r\n }\r\n\r\n setVisitsAsDirty(visits: IPlannedRouteVisit[]): void {\r\n visits?.forEach(visit => this.setVisitAsDirty(visit));\r\n }\r\n\r\n setVisitAsDirty(visit: IPlannedRouteVisit): void {\r\n visit.showValidationError = true;\r\n }\r\n\r\n setVisitAsNotDirty(visit: IPlannedRouteVisit): void {\r\n visit.showValidationError = false;\r\n }\r\n\r\n getActiveStartOptionProperty(rules: ITmsRouteRules): string {\r\n if (!rules?.RouteMatchingRules) {\r\n return;\r\n }\r\n\r\n const startOptions = Object.keys(this.getStartRouteMatchingRuleLabels());\r\n let activeStartOptionProperty;\r\n\r\n for (let i = 0; i < startOptions.length; i++) {\r\n const property = startOptions[i];\r\n\r\n if (rules.RouteMatchingRules[property]) {\r\n activeStartOptionProperty = property;\r\n break;\r\n }\r\n }\r\n\r\n return activeStartOptionProperty;\r\n }\r\n\r\n getActiveEndOptionProperty(rules: ITmsRouteRules): string {\r\n if (!rules?.RouteMatchingRules) {\r\n return;\r\n }\r\n\r\n const endOptions = Object.keys(this.getEndRouteMatchingRuleLabels());\r\n let activeEndOptionProperty: string;\r\n\r\n for (let i = 0; i < endOptions.length; i++) {\r\n const property = endOptions[i];\r\n\r\n if (rules.RouteMatchingRules[property]) {\r\n activeEndOptionProperty = property;\r\n break;\r\n }\r\n }\r\n\r\n return activeEndOptionProperty;\r\n }\r\n\r\n isFirstVisitMatchingDepot(visits: IPlannedRouteVisit[] = [], depot: IGroup): boolean {\r\n if (!visits.length || !visits[0] || !depot) {\r\n return false;\r\n }\r\n\r\n return visits[0].GeofenceId === depot.GeofenceId;\r\n }\r\n\r\n isLastVisitMatchingDepot(visits: IPlannedRouteVisit[] = [], depot: IGroup): boolean {\r\n if (!visits.length || !visits[visits.length - 1] || !depot) {\r\n return false;\r\n }\r\n\r\n return visits[visits.length - 1].GeofenceId === depot.GeofenceId;\r\n }\r\n\r\n createPolylineForVisit(visit: IPlannedRouteVisit, id: number = 0): IPolyline {\r\n const lineColor = \"#242527\";\r\n const latLngs: google.maps.LatLng[] = [];\r\n\r\n visit.LinePoints?.forEach((latLng: number[]) => {\r\n latLngs.push(new google.maps.LatLng(latLng[0], latLng[1]));\r\n });\r\n\r\n const newPolyline = this.mapService.createPolyline(0, latLngs, lineColor, null, false);\r\n newPolyline.id = id;\r\n\r\n this.mapService.addDirectionArrows(newPolyline, lineColor);\r\n\r\n return newPolyline;\r\n }\r\n\r\n createPolylineForVisits(visits: IPlannedRouteVisit[]): IPolyline {\r\n const lineColor = \"#242527\";\r\n const latLngs: google.maps.LatLng[] = [];\r\n\r\n visits.forEach((visit) => {\r\n visit.LinePoints?.forEach((latLng: number[]) => {\r\n latLngs.push(new google.maps.LatLng(latLng[0], latLng[1]));\r\n });\r\n });\r\n\r\n const newPolyline = this.mapService.createPolyline(0, latLngs, lineColor, null, false);\r\n this.mapService.addDirectionArrows(newPolyline, lineColor);\r\n\r\n return newPolyline;\r\n }\r\n\r\n createRouteTemplate(): IPlannedRoute {\r\n const plannedRouteTemplate: IPlannedRoute = {\r\n Id: -1,\r\n AccountId: null,\r\n RouteTemplateId: null,\r\n Name: null,\r\n VehicleId: null,\r\n DriverId: null,\r\n CreationDateTime: null,\r\n LastUpdateDateTime: null,\r\n CreatedBy: null,\r\n ExternalReference: null,\r\n ActualStartTime: null,\r\n StartPlotId: null,\r\n StartPlot: null,\r\n ActualEndTime: null,\r\n EndPlotId: null,\r\n EndPlot: null,\r\n PlannedStartTime: null,\r\n PlannedEndTime: null,\r\n Status: null,\r\n TrackingMode: null,\r\n PlannedVisits: [],\r\n PlannedRouteNotes: [],\r\n TmsRouteRulesJson: null,\r\n TmsRouteRules: null\r\n };\r\n return plannedRouteTemplate;\r\n }\r\n\r\n createPlannedVisitTemplate(): IPlannedRouteVisit {\r\n const plannedVisitTemplate: IPlannedRouteVisit = {\r\n Id: Math.floor(Math.random() * -1000),\r\n RouteVisitPosition: null,\r\n Geofence: null,\r\n GeocodedAddress: null,\r\n TravelTime: null,\r\n TravelTimeBuffer: this.veriDate.convertMinsToTimeSpan(this.preferences.TravelBufferTime.Value, true),\r\n OnSiteTimeBuffer: this.veriDate.convertMinsToTimeSpan(this.preferences.OnSiteBufferTime.Value, true),\r\n TravelDistanceMetres: null,\r\n PointsEncoded: null,\r\n LinePoints: null,\r\n PlannedRouteId: null,\r\n ArrivalPlot: null,\r\n DeparturePlot: null,\r\n ActualDistanceTraveled: null,\r\n PlannedArrivalTime: null,\r\n PlannedDepartureTime: null,\r\n Status: null,\r\n RouteStopLocationJson: null,\r\n RouteStopLocation: null,\r\n Name: null,\r\n Address: null,\r\n OnSiteTime: \"00:05:00\",\r\n onSiteTimeMins: 5\r\n };\r\n\r\n return plannedVisitTemplate;\r\n }\r\n\r\n createHistoryTableHeaders(): IVeriTableHeader[] {\r\n return [\r\n this.veriTableService.createDateHeader(\"Start\"),\r\n {\r\n title: this.translationService.t(\"SchedulingService.Route\"),\r\n sortType: SortType.String,\r\n sortable: true\r\n },\r\n {\r\n title: this.translationService.t(\"Common.DriverVehicle\"),\r\n sortType: SortType.String,\r\n sortable: true\r\n },\r\n {\r\n title: this.translationService.t(\"SchedulingService.EstDuration\"),\r\n width: 120,\r\n sortType: SortType.Number,\r\n sortable: true\r\n },\r\n {\r\n title: this.translationService.t(\"SchedulingService.Visits\"),\r\n width: 50,\r\n sortType: SortType.Number,\r\n sortable: true\r\n },\r\n {\r\n title: this.translationService.t(\"SchedulingService.Distance\"),\r\n width: 80,\r\n sortType: SortType.Number,\r\n sortable: true\r\n },\r\n {\r\n title: this.translationService.t(\"SchedulingService.Status\"),\r\n width: 130,\r\n sortType: SortType.String,\r\n sortable: true,\r\n includeInSummary: true\r\n }\r\n ];\r\n }\r\n\r\n createHistoryTableRows(routes: IPlannedRouteDetail[]): IVeriTableRow[] {\r\n const tableRows: IVeriTableRow[] = [];\r\n\r\n routes.forEach(route => {\r\n tableRows.push({\r\n data: route,\r\n cells: this.createTableCells(route),\r\n isInGroup: (data, group) => {\r\n return group.VehicleIds.indexOf(data.VehicleId) >= 0 || group.DriverIds.indexOf(data.DriverId) >= 0;\r\n },\r\n searchString: `${route.Name}${route.vehicle ? route.vehicle.ShortReg + route.vehicle.Reg : \"\"}${route.driver ? route.driver.Name : \"\"}${this.veriDate.formatDate(route.PlannedStartTime)}`\r\n });\r\n });\r\n\r\n return tableRows;\r\n }\r\n\r\n fitMapToVisits(map: IVeriMapComponent, visits: IPlannedRouteVisit[]): void {\r\n if (!map || !visits?.length) {\r\n return;\r\n }\r\n\r\n const relavantVisits = visits.filter(visit => visit.RouteStopLocation?.Latitude && visit.RouteStopLocation?.Longitude);\r\n const latLngs: google.maps.LatLng[] = [];\r\n\r\n relavantVisits.forEach((visit) => {\r\n latLngs.push(new google.maps.LatLng(visit.RouteStopLocation.Latitude, visit.RouteStopLocation.Longitude));\r\n });\r\n\r\n if (!latLngs?.length) {\r\n return;\r\n }\r\n\r\n map.fitMap(latLngs);\r\n }\r\n\r\n // ---\r\n\r\n private createTableCells(route: IPlannedRouteDetail): IVeriTableRowCell[] {\r\n const cells: IVeriTableRowCell[] = [\r\n this.veriTableService.createDateTimeCell(route.PlannedStartTime),\r\n {\r\n contents: route.routeDisplayName\r\n },\r\n this.veriTableService.createDriverSummaryPanelCell(route.driver || route.firstVisit.driver, route.vehicle, null, route.firstVisit.Status == 0, \"p-0\"),\r\n { contents: this.veriDate.formatDurationMs(route.totalDurationMins * 60 * 1000), sortData: route.totalDurationMins },\r\n { contents: route.PlannedVisits.length.toString() },\r\n { contents: this.unitConversionService.convertUnitWithSuffix(route.totalPlannedDistanceKm, UnitConversionType.Distance) },\r\n { contents: route.routeDisplayStatus, summaryIcon: this.getTMSStatusIcon(route) }\r\n ];\r\n\r\n return cells;\r\n }\r\n\r\n private getTMSStatusIcon(route: IPlannedRoute): string {\r\n switch (route.Status) {\r\n case RouteStatus.Cancelled:\r\n\r\n case RouteStatus.Expired:\r\n return \"highlight_off\";\r\n\r\n case RouteStatus.Completed:\r\n return \"check\";\r\n\r\n case RouteStatus.CompletedWithMissing:\r\n return \"rule\";\r\n\r\n case RouteStatus.Planned:\r\n return \"history_toggle_off\";\r\n\r\n case RouteStatus.Incomplete:\r\n return \"help_outline\";\r\n }\r\n\r\n return \"work\";\r\n }\r\n}\r\n","\r\nexport class ExploreNavigationModule {\r\n static get FleetHistory(): string { return 'app.explore.fleethistory'; }\r\n static get FleetUtilisation(): string { return 'app.explore.fleetutilisation'; }\r\n static get FleetEvents(): string { return 'app.explore.fleetevents'; }\r\n static get FindNearest(): string { return 'app.explore.findnearest'; }\r\n static get DepotCompliance(): string { return 'app.explore.depotcompliance'; }\r\n static get DriverBehaviour(): string { return 'app.explore.driverbehaviour'; }\r\n\r\n static get Default(): string { return this.FleetHistory; }\r\n static get ParentRoot(): string { return \"app.explore\"; }\r\n}\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 = 787;","window[\"GAUGES_NO_AUTO_INIT\"] = true;\r\n\r\n//import 'highcharts';\r\n//(window).Highcharts = Highcharts;\r\n//console.log((window).Highcharts);\r\n//import \"highcharts-ng\";\r\nimport { StaticProvider } from \"@angular/core\";\r\nimport { platformBrowserDynamic } from \"@angular/platform-browser-dynamic\";\r\nimport { downgradeModule } from \"@angular/upgrade/static\";\r\nimport \"@uirouter/angularjs\";\r\nimport \"@uirouter/angularjs/release/stateEvents\"; // this polyfills old transition events\r\nimport \"@uirouter/sticky-states\";\r\nimport * as angular from \"angular\";\r\nimport \"angular-animate\";\r\nimport \"angular-aria\";\r\nimport \"angular-cache\";\r\nimport \"angular-material\";\r\nimport \"angular-messages\";\r\nimport \"angular-sanitize\";\r\nimport \"highcharts-ng\";\r\nimport { NgAppModule } from \"src/app/app.module\";\r\nimport \"./directives/directives.module.ajs\";\r\nimport \"./filters/filters.module\";\r\nimport { Config } from \"./index.config\";\r\nimport \"./index.constants\";\r\nimport { RouteConfig } from \"./index.route\";\r\n//import \"../app.js\";\r\nimport { RunBlock } from \"./index.run\";\r\nimport \"./main/components/components.modules.ajs\";\r\nimport \"./main/components/resourceManagement/resourceManagement.module.ajs\";\r\nimport \"./main/modules/foundation/foundation.module.ajs\";\r\nimport \"./main/modules/help/help.module.ajs\";\r\nimport \"./main/navigation/navigation.module\";\r\nimport \"./main/modules/tms/tms.module.ajs\";\r\nimport \"./main/modules/fleet/fleet.module.ajs\";\r\nimport \"./main/pages/auth/login/login.module\";\r\nimport \"./services/_services.module.ajs\";\r\n//import \"angular-translate\";\r\n//import \"pascalprecht-translate\";\r\nimport \"./styles/global.scss\";\r\nimport \"./userPreferences/userpreferences.module\";\r\nimport \"./main/modules/alerts/alerts.module.ajs\";\r\nimport \"./main/modules/foundation/foundation.module.ajs\";\r\nimport \"./main/modules/temperature/temperature.module.ajs\";\r\n\r\nconst ng2BootstrapFn = (extraProviders: StaticProvider[]) => platformBrowserDynamic(extraProviders).bootstrapModule(NgAppModule);\r\n\r\nexport class AppModule {\r\n}\r\n\r\nconst MODULE_NAME = 'veriApp';\r\n\r\nexport default MODULE_NAME;\r\n\r\n/**\r\n * Main application\r\n */\r\nangular\r\n .module(MODULE_NAME, [\r\n \"constants\",\r\n // External modules\r\n \"ngSanitize\",\r\n \"ngMaterial\",\r\n \"highcharts-ng\",\r\n \"ngAnimate\",\r\n \"ui.router\",\r\n //\"ct.ui.router.extras.sticky\",\r\n \"ui.router.state.events\",\r\n\r\n // App modules\r\n //\"app.core\",\r\n \"app.userpreferences\",\r\n \"app.navigation\",\r\n \"app.pages.auth.login\",\r\n \"app.foundation\",\r\n //\"app.pages.coming-soon\",\r\n //\"app.pages.error-404\",\r\n //\"app.pages.error-500\",\r\n \"app.components\",\r\n \"app.components.util.api\",\r\n \"app.filters\",\r\n \"app.directives\",\r\n \"app.tms\",\r\n \"app.help\",\r\n \"app.fleet\",\r\n \"app.resourceManagement\",\r\n \"app.temperature\",\r\n \"app.alerts\",\r\n downgradeModule(ng2BootstrapFn)\r\n ])\r\n .config(RouteConfig)\r\n .config(Config)\r\n .run(RunBlock);\r\n\r\n// Done this way to prevent type errors\r\nwindow[\"Highcharts\"].setOptions({\r\n chart: {\r\n style: {\r\n fontFamily: \"Inter, Roboto\"\r\n }\r\n },\r\n global: {\r\n useUTC: false\r\n },\r\n lang: {\r\n thousandsSep: \",\"\r\n }\r\n});\r\n","import { HTTP_INTERCEPTORS } from \"@angular/common/http\";\r\nimport { enableProdMode, NgModule } from '@angular/core';\r\nimport { BrowserModule } from '@angular/platform-browser';\r\nimport { DirectivesModule } from '@directives/directives.module';\r\nimport { FoundationModule } from '@foundation/foundation.module';\r\nimport { ReportsModule } from \"@reports/reports.module\";\r\nimport { ServicesModule } from '@services/_services.module';\r\nimport { TemperatureModule } from \"@temperature/temperature.module\";\r\n//import { RaygunErrorHandler } from 'src/app/app.raygun.setup';\r\nimport { AlertsModule } from \"src/app/main/modules/alerts/alerts.module\";\r\nimport { AuthInterceptor } from \"./authInterceptor\";\r\nimport { VisualisationsModule } from \"./directives/_visualisations/visualisations.module\";\r\nimport { ComponentsModule } from './main/components/components.modules';\r\nimport { MaintenanceModule } from \"./main/components/maintenance/maintenance.module\";\r\nimport { TachoModule } from './main/components/tacho/_tacho.module';\r\nimport { CameraModule } from \"./main/modules/cameras/camera.module\";\r\nimport { FleetModule } from './main/modules/fleet/fleet.module';\r\nimport { FoundationJobsModule } from \"./main/modules/foundation/_routes/jobs/jobs.module\";\r\nimport { HelpModule } from \"./main/modules/help/help.module\";\r\nimport { TmsModule } from './main/modules/tms/tms.module';\r\nimport { RequestInterceptor } from \"./request.interceptor\";\r\nimport { PipesModule } from \"./_pipes/_pipes.module\";\r\n\r\n// Prevents veriTable from going very slowly... May result in poor error messages?\r\nenableProdMode();\r\n\r\n@NgModule({\r\n imports: [\r\n //Foundation\r\n FoundationModule,\r\n FoundationJobsModule,\r\n\r\n //Valkyrie\r\n BrowserModule,\r\n ServicesModule,\r\n DirectivesModule,\r\n PipesModule,\r\n ComponentsModule,\r\n DirectivesModule,\r\n VisualisationsModule,\r\n ReportsModule,\r\n MaintenanceModule,\r\n FleetModule,\r\n TmsModule,\r\n CameraModule,\r\n HelpModule,\r\n AlertsModule,\r\n TemperatureModule,\r\n TachoModule\r\n ],\r\n declarations: [],\r\n entryComponents: [],\r\n exports: [],\r\n providers: [\r\n //{\r\n // provide: ErrorHandler,\r\n // useClass: RaygunErrorHandler\r\n //},\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: AuthInterceptor,\r\n multi: true\r\n },\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: RequestInterceptor,\r\n multi: true\r\n }]\r\n //providers: [{ provide: ErrorHandler, useFactory: errorHandlerFactory }]\r\n //schemas: [NO_ERRORS_SCHEMA] // https://scotch.io/tutorials/angular-2-transclusion-using-ng-content - Unhandled Promise rejection: Template parse errors: 'card-body' is not a known elemen\r\n})\r\nexport class NgAppModule {\r\n constructor() {\r\n }\r\n\r\n ngDoBootstrap() {\r\n }\r\n}\r\n","import { Component, ElementRef, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Optional, Output, SimpleChanges } from \"@angular/core\";\r\nimport { TooltipService } from \"@directives/_misc/tooltip/tooltip.service\";\r\nimport { IGoogleMapsMarker, IGoogleMapsMarkerOptions } from \"@interfaces/IGoogleMapsMarkerOptions\";\r\nimport { MapService } from \"@services/map.service\";\r\nimport * as angular from \"angular\";\r\nimport { ICommonMapComponent, VMapComponent } from \"../v-map/v-map/v-map.component\";\r\n\r\ndeclare var MarkerWithLabel: any;\r\ndeclare var MarkerClusterer: any;\r\n\r\nexport interface IMarkerModelMap {\r\n id: any;\r\n model: any,\r\n googleMarker: google.maps.Marker\r\n}\r\n\r\n@Component({\r\n selector: \"ui-gmap-markers\",\r\n template: \"\"\r\n})\r\nexport class UIGmapMarkersComponent implements OnInit, OnChanges, OnDestroy {\r\n\r\n @Input() models: IGoogleMapsMarker[];\r\n @Output() onMarkersUpdated: EventEmitter = new EventEmitter();\r\n\r\n @Input() idkey: string;\r\n @Input() coords: string;\r\n @Input() options: string;\r\n\r\n @Input() events: any;\r\n @Input() type: string;\r\n @Input() typeoptions: any;\r\n @Input() typeevents: any;\r\n\r\n @Input() showOutOfBoundsIndicator: boolean = false; // prototype functionality\r\n\r\n // ---\r\n\r\n // https://github.com/angular/angular/issues/24846#issuecomment-404452079\r\n\r\n veriMap: ICommonMapComponent;\r\n mapZoomListener: google.maps.MapsEventListener;\r\n\r\n markerModelMap: Map;\r\n addedMarkerModelMap: Map = new Map();\r\n markerClusterer: any;\r\n\r\n constructor(\r\n @Optional() private readonly vMap: VMapComponent,\r\n private readonly elementRef: ElementRef,\r\n private readonly mapService: MapService,\r\n private readonly tooltipService: TooltipService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.veriMap = this.vMap || this.mapService.findVeriMap(this.elementRef);\r\n\r\n this.veriMap.mapInitialisedPromise.then(map => {\r\n\r\n this.mapZoomListener = this.veriMap.getMap().addListener(\"zoom_changed\", () => {\r\n this.removeTooltips();\r\n });\r\n\r\n if (this.models && this.models.length != this.addedMarkerModelMap.size) {\r\n this.createMarkers();\r\n }\r\n\r\n const addedMarkerArray = this.getMarkerMapArray();\r\n const markerList = addedMarkerArray.map(map => map.googleMarker);\r\n\r\n this.markerClusterer = new MarkerClusterer(map, markerList, this.typeoptions);\r\n this.markerClusterer.setIgnoreHidden(true);\r\n\r\n if (this.typeevents && this.typeevents.postClusterShow) {\r\n this.markerClusterer.postClusterShow = (clusterIcon) => {\r\n if (!clusterIcon.div_) {\r\n return;\r\n }\r\n\r\n this.typeevents.postClusterShow(clusterIcon);\r\n }\r\n }\r\n\r\n // Disable if not setup\r\n if (this.type != \"cluster\") {\r\n this.markerClusterer.setMaxZoom(1);\r\n this.markerClusterer.setGridSize(1);\r\n }\r\n\r\n this.addClusterEvents();\r\n });\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[\"models\"].currentValue == changes[\"models\"].previousValue) {\r\n return;\r\n }\r\n\r\n if (this.idkey || this.coords || this.options) {\r\n console.error(\"Do not pass options into UIGmapMarkers\", this.idkey, this.coords, this.options);\r\n }\r\n\r\n this.recreateMarkers();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n\r\n this.mapZoomListener?.remove();\r\n\r\n // Clear existing listeners\r\n this.addedMarkerModelMap.forEach(marker => {\r\n this.removeMarkerEvents(marker.googleMarker);\r\n this.removeMarkerTooltip(marker.googleMarker);\r\n });\r\n\r\n if (this.markerClusterer) {\r\n google.maps.event.clearInstanceListeners(this.markerClusterer);\r\n this.markerClusterer.setMap(null);\r\n this.markerClusterer.clearMarkers();\r\n }\r\n\r\n this.models = [];\r\n this.addedMarkerModelMap.clear();\r\n }\r\n\r\n // ---------------------\r\n\r\n private removeTooltips(): void {\r\n\r\n if (!this.addedMarkerModelMap?.size) {\r\n return;\r\n }\r\n\r\n this.addedMarkerModelMap.forEach(marker => {\r\n this.removeMarkerTooltip(marker.googleMarker);\r\n });\r\n }\r\n\r\n private recreateMarkers() {\r\n if (this.markerClusterer && this.createMarkers()) {\r\n this.markerClusterer.repaint();\r\n }\r\n\r\n // V Map specific\r\n if (this.vMap) {\r\n const addedMarkerArray = this.getMarkerMapArray();\r\n this.vMap.fitMap(addedMarkerArray.map(m => m.googleMarker.getPosition()));\r\n }\r\n }\r\n\r\n private addClusterEvents() {\r\n\r\n if (this.typeevents == null) {\r\n return;\r\n }\r\n\r\n Object.keys(this.typeevents).forEach(eventName => {\r\n\r\n if (this.typeevents.hasOwnProperty(eventName) && angular.isFunction(this.typeevents[eventName])) {\r\n\r\n google.maps.event.addListener(this.markerClusterer, eventName, (mouseEvent) => {\r\n this.typeevents[eventName](this.markerClusterer, eventName, mouseEvent);\r\n });\r\n }\r\n });\r\n }\r\n\r\n private addMarkerEvents(marker: google.maps.Marker, markerModel: any) {\r\n performance.mark(\"addMarkerEvents\");\r\n\r\n if (this.events == null) {\r\n return;\r\n }\r\n\r\n // We want default mouse over option?\r\n google.maps.event.addListener(marker, \"mouseover\", (mouseEvent) => {\r\n if (!marker.getTitle()) {\r\n return;\r\n }\r\n\r\n this.removeMarkerTooltip(marker);\r\n\r\n const popupPosition = this.mapService.convertLatLngToPoint(marker.getPosition(), this.veriMap.getMap(), true);\r\n popupPosition.y -= 5;\r\n const tooltip = this.tooltipService.create(marker.getTitle(), { left: popupPosition.x, top: popupPosition.y, direction: \"top\" });\r\n this.tooltipService.show(tooltip);\r\n\r\n marker.set(\"tooltip\", tooltip);\r\n });\r\n\r\n google.maps.event.addListener(marker, \"mouseout\", (mouseEvent) => {\r\n this.removeMarkerTooltip(marker);\r\n });\r\n\r\n google.maps.event.addListener(marker, \"bounds_changed\", (mouseEvent) => {\r\n this.removeMarkerTooltip(marker);\r\n });\r\n\r\n Object.keys(this.events).forEach(eventName => {\r\n if (this.events.hasOwnProperty(eventName) && angular.isFunction(this.events[eventName])) {\r\n\r\n google.maps.event.addListener(marker, eventName, (mouseEvent) => {\r\n this.events[eventName](marker, eventName, markerModel, mouseEvent);\r\n });\r\n }\r\n });\r\n\r\n performance.measure(\"addMarkerEvents\");\r\n }\r\n\r\n private removeMarkerTooltip(marker: google.maps.Marker) {\r\n const tooltip = marker.get(\"tooltip\") as HTMLElement;\r\n\r\n if (tooltip) {\r\n this.tooltipService.remove(tooltip);\r\n }\r\n }\r\n\r\n private removeMarkerEvents(marker: google.maps.Marker) {\r\n if (!marker) {\r\n return;\r\n }\r\n\r\n google.maps.event.clearInstanceListeners(marker);\r\n }\r\n\r\n private getModel(model: IGoogleMapsMarker): IGoogleMapsMarker {\r\n return model[\"markerModel\"] || model;\r\n }\r\n\r\n private createMarkers(): boolean {\r\n\r\n let numChanged = 0;\r\n\r\n this.createMarkerModelMap(this.models);\r\n\r\n performance.mark(\"createMarkers\");\r\n\r\n for (let i = 0; i < this.models.length; i++) {\r\n const originalModel = this.models[i];\r\n const model = this.getModel(originalModel);\r\n\r\n if (!model) {\r\n return;\r\n }\r\n\r\n if (!model.options) {\r\n return;\r\n }\r\n if (typeof model.id == \"undefined\") {\r\n console.error(\"Marker must specify model ID\", model);\r\n return;\r\n }\r\n\r\n if (model.options.labelAnchor) {\r\n model.options.labelAnchor = this.getLabelPositionPoint(model.options.labelAnchor) as any;\r\n }\r\n\r\n // Check for existing entry\r\n const existingMarkerMap = this.getExistingMarkerMap(model.id);\r\n\r\n if (existingMarkerMap) {\r\n\r\n if (this.markerNeedsUpdate(existingMarkerMap, model.options.position, model.options)) {\r\n\r\n existingMarkerMap.googleMarker.setOptions(model.options as any);\r\n existingMarkerMap.googleMarker.setPosition(new google.maps.LatLng(model.options.position.lat, model.options.position.lng));\r\n\r\n numChanged++;\r\n }\r\n }\r\n else {\r\n this.addMarker(model, originalModel);\r\n\r\n numChanged++;\r\n }\r\n };\r\n\r\n performance.measure(\"createMarkers\");\r\n\r\n const numRemoved = this.removeMarkers();\r\n\r\n if (this.onMarkersUpdated) {\r\n\r\n this.onMarkersUpdated.emit(this.getMarkerMapArray());\r\n }\r\n\r\n return numChanged !== 0 || numRemoved !== 0;\r\n }\r\n\r\n private markerNeedsUpdate(existingMarkerMap: IMarkerModelMap, coords: google.maps.LatLngLiteral, options: IGoogleMapsMarkerOptions): boolean {\r\n const marker = existingMarkerMap.googleMarker;\r\n\r\n // This can occasionally happen, unsure how\r\n if (!coords?.lat || !coords?.lng) {\r\n return true;\r\n }\r\n\r\n if (marker.getPosition().lat().toFixed(5) != coords.lat.toFixed(5) || marker.getPosition().lng().toFixed(5) != coords.lng.toFixed(5)) {\r\n return true;\r\n }\r\n\r\n if (marker.getVisible() != options.visible) {\r\n return true;\r\n }\r\n\r\n if (this.areIconsTheSame(marker.getIcon(), options.icon)) {\r\n return false;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private areIconsTheSame(icon1: string | google.maps.Icon | google.maps.Symbol, icon2: string | google.maps.Icon | google.maps.Symbol): boolean {\r\n\r\n if (typeof icon1 == \"string\") {\r\n return icon1 == icon2;\r\n }\r\n\r\n if ((icon1 as object).hasOwnProperty(\"url\")) {\r\n const url1 = (icon1 as google.maps.Icon).url;\r\n const url2 = (icon2 as google.maps.Icon).url;\r\n\r\n return url1 == url2;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private addMarker(model: IGoogleMapsMarker, originalModel: IGoogleMapsMarker) {\r\n const marker = new MarkerWithLabel(model.options);\r\n\r\n marker.model = originalModel || model;\r\n\r\n this.addMarkerEvents(marker, model);\r\n\r\n if (this.markerClusterer) {\r\n // True to prevent draws\r\n this.markerClusterer.addMarker(marker, true);\r\n }\r\n\r\n this.addedMarkerModelMap.set(model.id, ({ id: model.id, googleMarker: marker, model: originalModel }));\r\n }\r\n\r\n private removeMarkers(): number {\r\n performance.mark(\"removeMarkers\");\r\n\r\n const initialCount = this.addedMarkerModelMap.size;\r\n // Need to do the reverse now, find objects in our map that dont exist in polylines\r\n for (const [_, modelMap] of this.addedMarkerModelMap.entries()) {\r\n\r\n const model = this.getModelByKey(modelMap.id);\r\n\r\n if (!model) {\r\n this.markerModelMap.delete(modelMap.id);\r\n this.removeMarkerEvents(modelMap.googleMarker);\r\n this.removeMarkerTooltip(modelMap.googleMarker);\r\n this.markerClusterer?.removeMarker(modelMap.googleMarker, true);\r\n\r\n this.addedMarkerModelMap.delete(modelMap.id);\r\n }\r\n }\r\n\r\n performance.measure(\"removeMarkers\");\r\n\r\n return Math.abs(initialCount - this.addedMarkerModelMap.size);\r\n }\r\n\r\n private getModelByKey(id: any) {\r\n return this.markerModelMap.get(id);\r\n }\r\n\r\n private getExistingMarkerMap(modelId: any): IMarkerModelMap {\r\n\r\n return this.addedMarkerModelMap.get(modelId);\r\n }\r\n\r\n private getLabelPositionPoint(anchor) {\r\n\r\n if (anchor instanceof google.maps.Point) {\r\n return anchor;\r\n }\r\n\r\n let xPos, yPos;\r\n\r\n if (anchor === void 0) {\r\n return void 0;\r\n }\r\n\r\n anchor = /^([-\\d\\.]+)\\s([-\\d\\.]+)$/.exec(anchor);\r\n\r\n xPos = parseFloat(anchor[1]);\r\n yPos = parseFloat(anchor[2]);\r\n\r\n if (xPos && yPos) {\r\n return new google.maps.Point(xPos, yPos);\r\n }\r\n }\r\n\r\n private createMarkerModelMap(models: IGoogleMapsMarker[]) {\r\n this.markerModelMap = new Map(models?.map(m => {\r\n const model = this.getModel(m);\r\n return [model.id, model];\r\n }));\r\n }\r\n\r\n private getMarkerMapArray(): IMarkerModelMap[] {\r\n return Array.from(this.addedMarkerModelMap, ([_, value]) => value);\r\n }\r\n}\r\n","import { Component, ElementRef, Input, OnChanges, OnDestroy, SimpleChanges } from \"@angular/core\";\r\nimport { IVeriMapComponent } from \"@directives/_map/veriMap/veriMapComponent/veriMap.component\";\r\nimport { MapService } from \"@services/map.service\";\r\n//import { IPolygon } from \"@typings/google.maps.angular\";\r\n\r\n@Component({\r\n selector: \"ui-gmap-polygon\",\r\n template: \"\"\r\n})\r\nexport class UIGmapPolygonComponent implements OnChanges, OnDestroy{\r\n\r\n @Input() polygon: any;\r\n\r\n veriMap: IVeriMapComponent;\r\n googlePolygon: google.maps.Polygon;\r\n\r\n constructor(\r\n private readonly elementRef: ElementRef,\r\n private readonly mapService: MapService) {\r\n }\r\n\r\n ngOnChanges(onChangesObj: SimpleChanges) {\r\n if (!this.veriMap) {\r\n this.veriMap = this.mapService.findVeriMap(this.elementRef);\r\n }\r\n\r\n if (this.googlePolygon) {\r\n this.googlePolygon.setMap(null);\r\n }\r\n\r\n if (this.polygon == null) {\r\n return;\r\n }\r\n\r\n //if (this.events) {\r\n // console.warn(\"Marker doesnt support events at the moment\");\r\n //}\r\n\r\n var path: google.maps.LatLng[] = [];\r\n this.polygon.path.forEach(p => {\r\n path.push(new google.maps.LatLng(p.latitude, p.longitude));\r\n });\r\n\r\n var polygonOptions: google.maps.PolygonOptions = {\r\n paths: path,\r\n map: this.veriMap.getMap()\r\n };\r\n\r\n if (this.polygon.fill) {\r\n polygonOptions.fillColor = this.polygon.fill.color;\r\n polygonOptions.fillOpacity = this.polygon.fill.opacity;\r\n }\r\n\r\n if (this.polygon.stroke) {\r\n polygonOptions.strokeColor = this.polygon.stroke.color;\r\n polygonOptions.strokeWeight = this.polygon.stroke.weight;\r\n }\r\n\r\n this.googlePolygon = new google.maps.Polygon(polygonOptions);\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.googlePolygon) {\r\n this.googlePolygon.setMap(null);\r\n }\r\n }\r\n}\r\n","\r\nimport { Component, ElementRef, Input, OnChanges, OnDestroy, OnInit, SimpleChanges } from \"@angular/core\";\r\nimport { IVeriMapComponent } from \"@directives/_map/veriMap/veriMapComponent/veriMap.component\";\r\nimport { IGoogleMapsMarker } from \"@interfaces/IGoogleMapsMarkerOptions\";\r\nimport { IJourney } from \"@interfaces/IJourney\";\r\nimport { IPlot, IPlotEvent } from \"@interfaces/IPlot\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { GoogleMarkerService, ICreateEventMarkerOptions } from \"@services/googleMarker.service\";\r\nimport { JourneyService } from \"@services/journey.service\";\r\nimport { MapService } from \"@services/map.service\";\r\nimport { PlotService } from \"@services/plot.service\";\r\nimport { PlotEventService } from \"@services/plotEvent.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { IPolyline } from \"@typings/google.maps.angular\";\r\nimport { AccountFeatureService, UserRole } from \"@services/accountFeature.service\";\r\n\r\n@Component({\r\n selector: \"veri-map-current-journey\",\r\n template: require(\"./veriMapCurrentJourney.html\")\r\n})\r\nexport class VeriMapCurrentJourneyComponent implements OnInit, OnChanges, OnDestroy {\r\n\r\n @Input() vehicle: IVehicle;\r\n @Input() vehiclePlot: IPlot;\r\n\r\n //[x: string]: any;\r\n veriMap: IVeriMapComponent;\r\n\r\n journey: IJourney;\r\n journeyStart: IPlotEvent;\r\n showJourneyStart = false;\r\n\r\n journeyStartMarker: IGoogleMapsMarker;\r\n journeyPolyline: IPolyline;\r\n\r\n mapIdleListener: google.maps.MapsEventListener;\r\n\r\n fit: boolean;\r\n\r\n constructor(\r\n private readonly elementRef: ElementRef,\r\n private readonly plotService: PlotService,\r\n private readonly plotEventService: PlotEventService,\r\n private readonly journeyService: JourneyService,\r\n private readonly accountFeatureService: AccountFeatureService,\r\n private readonly mapService: MapService,\r\n private readonly googleMarkerService: GoogleMarkerService,\r\n private readonly translationService: TranslationService) {\r\n }\r\n\r\n ngOnChanges(onChangesObj: SimpleChanges): void {\r\n if (onChangesObj[\"vehicle\"]) {\r\n this.vehicleChanged();\r\n }\r\n\r\n if (onChangesObj[\"vehiclePlot\"]) {\r\n this.vehiclePlotChanged();\r\n }\r\n }\r\n\r\n ngOnInit(): void {\r\n this.veriMap = this.mapService.findVeriMap(this.elementRef);\r\n this.veriMap.mapInitialisedPromise.then(map => {\r\n this.mapIdleListener = map.addListener(\"idle\", () => {\r\n this.showHideJourneyStart();\r\n this.createJourneyMarker();\r\n });\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.mapIdleListener) {\r\n this.mapIdleListener.remove();\r\n }\r\n }\r\n\r\n // -------------------------------\r\n\r\n private createJourneyMarker() {\r\n const options: ICreateEventMarkerOptions = {\r\n label: this.translationService.t('veriMapCurrentJourney.journeyStart'),\r\n position: {\r\n lat: this.journey?.StartLatitude,\r\n lng: this.journey?.StartLongitude\r\n }\r\n }\r\n\r\n this.journeyStartMarker = {\r\n id: 1,\r\n options: this.googleMarkerService.createEventMarkerOptions(options)\r\n }\r\n }\r\n\r\n private vehicleChanged() {\r\n if (!this.vehicle) {\r\n return;\r\n }\r\n\r\n this.journeyPolyline = null;\r\n this.journeyStart = null;\r\n\r\n this.getCurrentJourneyWithPlots(this.vehicle.Id);\r\n }\r\n\r\n private vehiclePlotChanged() {\r\n //console.log(\"vehiclePlotChanged\", this.journey ? this.journey.plots : \"no journey yet\");\r\n if (!this.vehiclePlot || !this.journeyPolyline || !this.journey) {\r\n return;\r\n }\r\n\r\n if (!this.journey.plots) {\r\n this.journey.plots = [];\r\n }\r\n\r\n this.journey.plots.push(this.vehiclePlot);\r\n //console.log(\"vehiclePlotChanged.1\", this.journey.plots);\r\n\r\n this.journeyPolyline = this.journeyService.createJourneyPolyline(this.journey);\r\n }\r\n\r\n private getCurrentJourneyWithPlots(vehicleId: number): void{\r\n if (!this.accountFeatureService.currentUserHasRole([UserRole.History])) {\r\n return;\r\n }\r\n this.journeyService\r\n .getCurrentJourney(vehicleId)\r\n .then(journey => {\r\n\r\n this.journey = journey;\r\n\r\n if (journey) {\r\n return this.getAndMapPlotsForJourney(vehicleId, this.journey);\r\n }\r\n });\r\n }\r\n\r\n private getAndMapPlotsForJourney(vehicleId: number, journey: IJourney) {\r\n\r\n return this.plotService\r\n .getPlotsForJourney(vehicleId, journey)\r\n .then(plots => {\r\n\r\n // Remove any plots that are newer than the current vehicle position\r\n if (this.vehiclePlot && plots[plots.length - 1].Id > this.vehiclePlot.Id) {\r\n plots.pop();\r\n }\r\n\r\n journey.plots = plots;\r\n if (journey.plots.length > 1) {\r\n this.journeyStart = this.plotEventService.createJourneyStartStopEvent(journey.plots[0], this.translationService.t(\"veriMapCurrentJourney.start\") as any);\r\n }\r\n\r\n this.journeyPolyline = this.journeyService.createJourneyPolyline(journey);\r\n this.showHideJourneyStart();\r\n });\r\n }\r\n\r\n private showHideJourneyStart() {\r\n if (this.journeyPolyline == null || this.veriMap.getMap() == null) {\r\n return;\r\n }\r\n\r\n // get the extend of our journey and check how far apart it is in pixels, if its too small hide the start marker of our current journey\r\n var bounds = new google.maps.LatLngBounds();\r\n this.journeyPolyline.path.forEach(latlng => {\r\n bounds.extend(latlng);\r\n });\r\n\r\n var nePoint = this.mapService.convertLatLngToPoint(bounds.getNorthEast(), this.veriMap.getMap());\r\n var swPoint = this.mapService.convertLatLngToPoint(bounds.getSouthWest(), this.veriMap.getMap());\r\n\r\n var x = nePoint.x - swPoint.x;\r\n var y = nePoint.y - swPoint.y;\r\n\r\n var maxDifference = Math.max(x, y);\r\n this.showJourneyStart = maxDifference > 40;\r\n }\r\n}\r\n","\r\nexport enum AccelerometerInfoType {\r\n Acceleration,\r\n Deceleration, // Braking\r\n Cornering\r\n}\r\n","import { Component, ElementRef, Input, OnChanges, OnDestroy, OnInit, Optional } from \"@angular/core\";\r\nimport { IVeriMapComponent } from \"@directives/_map/veriMap/veriMapComponent/veriMap.component\";\r\nimport { IGoogleMapsMarker, IGoogleMapsMarkerOptions } from \"@interfaces/IGoogleMapsMarkerOptions\";\r\nimport { MapService } from \"@services/map.service\";\r\nimport { ICommonMapComponent, VMapComponent } from \"../v-map/v-map/v-map.component\";\r\n\r\ndeclare var MarkerWithLabel: any;\r\n\r\n@Component({\r\n selector: \"ui-gmap-marker\",\r\n template: \"\"\r\n})\r\nexport class UIGmapMarkerComponent implements OnChanges, OnDestroy, OnInit {\r\n\r\n @Input() marker: IGoogleMapsMarker;\r\n\r\n // Deprecated\r\n @Input() idkey: any;\r\n @Input() coords: any;\r\n @Input() options: any;\r\n @Input() events: any;\r\n // Deprecated end\r\n\r\n veriMap: ICommonMapComponent;\r\n\r\n googleMarker: google.maps.Marker;\r\n\r\n constructor(\r\n @Optional() private readonly vMap: VMapComponent,\r\n private elementRef: ElementRef,\r\n private readonly mapService: MapService) {\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n ngOnChanges() {\r\n if (this.idkey || this.coords || this.options) {\r\n console.error(\"Do not pass options into UIGmapMarkers\", this.idkey, this.coords, this.options);\r\n console.log(\"Use Marker instead\");\r\n }\r\n\r\n if (!this.veriMap) {\r\n this.veriMap = this.vMap || this.mapService.findVeriMap(this.elementRef);\r\n }\r\n\r\n this.veriMap.mapInitialisedPromise.then(map => {\r\n\r\n if (this.events) {\r\n console.warn(\"Marker doesnt support events at the moment\");\r\n }\r\n\r\n if (!this.marker) {\r\n return;\r\n }\r\n\r\n //debugger;\r\n if (!this.googleMarker) {\r\n this.googleMarker = new MarkerWithLabel(this.marker?.options || this.marker);\r\n this.googleMarker.setMap(this.veriMap.getMap());\r\n }\r\n else {\r\n this.googleMarker.setOptions(this.marker?.options);\r\n }\r\n\r\n // V Map specific\r\n if (this.vMap) {\r\n var position = this.marker.options?.position || (this.marker as IGoogleMapsMarkerOptions).position as any;\r\n\r\n this.vMap.fitMap([position]);\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.googleMarker) {\r\n this.googleMarker.setMap(null);\r\n }\r\n }\r\n}\r\n","import { Component, ElementRef, Input, OnChanges, OnDestroy, SimpleChanges } from \"@angular/core\";\r\nimport { IVeriMapComponent } from \"@directives/_map/veriMap/veriMapComponent/veriMap.component\";\r\nimport { MapService } from \"@services/map.service\";\r\n//import { IPolyline } from \"@typings/google.maps.angular\";\r\n\r\n@Component({\r\n selector: \"ui-gmap-polyline\",\r\n template: \"\"\r\n})\r\nexport class UIGmapPolylineComponent implements OnChanges, OnDestroy {\r\n\r\n @Input() polyline: any;\r\n\r\n veriMap: IVeriMapComponent;\r\n\r\n googlePolyline: google.maps.Polyline;\r\n\r\n constructor(\r\n private readonly elementRef: ElementRef,\r\n private readonly mapService: MapService) {\r\n }\r\n\r\n ngOnChanges(onChangesObj: SimpleChanges) {\r\n\r\n if (this.googlePolyline) {\r\n this.googlePolyline.setMap(null);\r\n }\r\n\r\n if (this.polyline == null) {\r\n return;\r\n }\r\n\r\n if (this.veriMap == null) {\r\n this.veriMap = this.mapService.findVeriMap(this.elementRef);\r\n }\r\n\r\n //if (this.events) {\r\n // console.warn(\"Marker doesnt support events at the moment\");\r\n //}\r\n\r\n var polylineOptions: google.maps.PolylineOptions = {\r\n path: this.polyline.path,\r\n geodesic: true,\r\n strokeColor: this.polyline.options.stroke.color,\r\n strokeOpacity: this.polyline.options.stroke.opacity,\r\n strokeWeight: this.polyline.options.stroke.weight,\r\n map: this.veriMap.getMap()\r\n };\r\n\r\n if (this.polyline.options.icons) {\r\n polylineOptions.icons = this.polyline.options.icons;\r\n }\r\n\r\n this.googlePolyline = new google.maps.Polyline(polylineOptions);\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.googlePolyline) {\r\n this.googlePolyline.setMap(null);\r\n }\r\n }\r\n\r\n // ---------------------\r\n\r\n}\r\n","import { Component, ElementRef, Input, OnChanges, OnDestroy, OnInit, Optional, SimpleChanges } from \"@angular/core\";\r\nimport { MapService } from \"@services/map.service\";\r\nimport { IPolyline } from \"@typings/google.maps.angular\";\r\nimport { ICommonMapComponent, VMapComponent } from \"../v-map/v-map/v-map.component\";\r\n\r\n@Component({\r\n selector: \"ui-gmap-polylines\",\r\n template: \"\"\r\n})\r\nexport class UIGmapPolylinesComponent implements OnInit, OnChanges, OnDestroy {\r\n\r\n @Input() polylines: IPolyline[] = [];\r\n\r\n veriMap: ICommonMapComponent;\r\n\r\n polylineMap: { polyline: IPolyline, googlePolyline: google.maps.Polyline }[] = [];\r\n\r\n constructor(\r\n @Optional() private readonly vMap: VMapComponent,\r\n private readonly elementRef: ElementRef,\r\n private readonly mapService: MapService) {\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n ngOnChanges(onChangesObj: SimpleChanges) {\r\n if (!this.veriMap) {\r\n this.veriMap = this.vMap || this.mapService.findVeriMap(this.elementRef);\r\n }\r\n\r\n this.veriMap.mapInitialisedPromise.then(map => {\r\n this.updatePolylines();\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n this.polylineMap.forEach(map => {\r\n map.googlePolyline.setMap(null);\r\n });\r\n\r\n this.polylineMap = [];\r\n }\r\n\r\n // ---------------------\r\n\r\n private updatePolylines() {\r\n if (!this.veriMap) {\r\n return;\r\n }\r\n\r\n if (this.polylines) {\r\n this.createPolylines();\r\n }\r\n\r\n this.removePolylines();\r\n }\r\n\r\n private createPolylines() {\r\n const gMap = this.veriMap.getMap();\r\n\r\n this.polylines.forEach(p => {\r\n\r\n var options: google.maps.PolylineOptions = {\r\n path: p.path,\r\n geodesic: true,\r\n strokeColor: p.options.stroke.color,\r\n strokeOpacity: p.options.stroke.opacity,\r\n strokeWeight: p.options.stroke.weight\r\n };\r\n\r\n if (p.options.icons) {\r\n options.icons = p.options.icons;\r\n }\r\n\r\n // Check to see if we have a map already, if so update it\r\n var existingPolylineMap = this.polylineMap.find(map => map.polyline.id == p.id);\r\n\r\n if (existingPolylineMap) {\r\n existingPolylineMap.googlePolyline.setOptions(options);\r\n\r\n return;\r\n }\r\n\r\n var polyline = new google.maps.Polyline(options);\r\n\r\n if (p.options.events) {\r\n if (p.options.events.mouseover) {\r\n polyline.addListener(\"mouseover\", (args) => {\r\n p.options.events.mouseover(polyline, \"mouseover\", null, [args]);\r\n });\r\n }\r\n }\r\n\r\n polyline.setMap(gMap);\r\n\r\n this.polylineMap.push({ polyline: p, googlePolyline: polyline });\r\n });\r\n }\r\n\r\n private removePolylines() {\r\n\r\n // Need to do the reverse now, find objects in our map that dont exist in polylines\r\n this.polylineMap.forEach(map => {\r\n var found = this.polylines.some(p => p.id == map.polyline.id);\r\n\r\n if (!found) {\r\n map.googlePolyline.setMap(null);\r\n map.googlePolyline = null;\r\n map.polyline = null;\r\n }\r\n });\r\n\r\n this.polylineMap = this.polylineMap.filter(map => map.googlePolyline);\r\n }\r\n}\r\n","import { AfterViewInit, Component, ElementRef, Input, OnChanges } from \"@angular/core\";\r\nimport { IPolyline } from \"../../../../../../scripts/typings/google.maps.angular\";\r\nimport { IJourney } from \"../../../../interfaces/IJourney\";\r\nimport { HTMLService } from \"../../../../services/htmlService.service\";\r\nimport { JourneyService } from \"../../../../services/journey.service\";\r\nimport { IVeriMapComponent } from \"../veriMapComponent/veriMap.component\";\r\n\r\n@Component({\r\n selector: \"veri-map-journeys-new\",\r\n template: require(\"./veriMapJourneysNew.component.html\")\r\n})\r\nexport class VeriMapJourneysNewComponent implements OnChanges, AfterViewInit {\r\n @Input() polylines: IPolyline[];\r\n @Input() journeys: IJourney[];\r\n\r\n // ---\r\n\r\n private veriMap: IVeriMapComponent;\r\n\r\n constructor(\r\n private readonly elementRef: ElementRef,\r\n private readonly htmlService: HTMLService,\r\n private readonly journeyService: JourneyService) { }\r\n\r\n ngAfterViewInit() {\r\n this.findAndRegisterVeriMap();\r\n }\r\n\r\n ngOnChanges() {\r\n if (this.journeys) {\r\n this.polylines = this.journeys.map(j => this.journeyService.createJourneyPolyline(j));\r\n }\r\n\r\n }\r\n\r\n // ---\r\n\r\n private findAndRegisterVeriMap() {\r\n const veriMapHTML = this.htmlService.findNearest(this.elementRef.nativeElement, \"veri-map\");\r\n this.veriMap = this.htmlService.getAngularJSComponentFromElement(veriMapHTML);\r\n\r\n console.log(this.veriMap);\r\n this.veriMap.fitMap(this.polylines[0].path);\r\n }\r\n}\r\n","import { Injectable, Pipe, PipeTransform } from \"@angular/core\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\n\r\n@Pipe({ name: 'translate' })\r\n@Injectable()\r\nexport class TranslatePipe implements PipeTransform {\r\n constructor(private translationService: TranslationService) { }\r\n\r\n transform(input: string, params?: any): string {\r\n return this.translationService.t(input, params);\r\n }\r\n}\r\n","import { Injectable, Pipe, PipeTransform } from \"@angular/core\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\n\r\n@Pipe({ name: 'veriDate' })\r\n@Injectable()\r\nexport class VeriDatePipe implements PipeTransform {\r\n constructor(private veriDate: VeriDate) { }\r\n\r\n transform(input: string, outputFormat?: string): string {\r\n return this.veriDate.formatDate(input, outputFormat);\r\n }\r\n}\r\n\r\n","export enum Currency {\r\n GBP,\r\n EUR,\r\n USD\r\n}\r\n","export enum FuelConsumptionMeasurement {\r\n MilesPerGallon,\r\n UnitedStatesMilesPerGallon,\r\n KilometresPerLitre,\r\n LitresPer100Kilometres\r\n}\r\n","export enum TemperatureMeasurement {\r\n Celsius,\r\n Fahrenheit\r\n}\r\n","export enum VolumeMeasurement {\r\n Litre,\r\n Gallon,\r\n UsGallon\r\n}\r\n","export enum MeasurementCategoryType {\r\n None,\r\n Distance,\r\n Fuel,\r\n FuelEfficiency,\r\n Temperature,\r\n Fluid,\r\n Weight,\r\n Currency,\r\n AlcoholContent,\r\n Event, \r\n Speed\r\n}\r\n","import { Component, OnDestroy } from \"@angular/core\";\r\nimport \"./splash-screen.component.scss\";\r\n\r\n@Component({\r\n selector: \"splash-screen\",\r\n template: require(\"./splash-screen.component.html\")\r\n})\r\nexport class SplashScreenComponent implements OnDestroy {\r\n\r\n timeoutHandle: number;\r\n\r\n constructor() {\r\n this.timeoutHandle = setTimeout(() => this.refreshPage(), 15_000) as any;\r\n }\r\n\r\n ngOnDestroy() {\r\n clearTimeout(this.timeoutHandle);\r\n }\r\n\r\n // ---\r\n\r\n refreshPage() {\r\n window.location.reload();\r\n }\r\n}\r\n","import { Component } from \"@angular/core\";\r\nimport \"./unauthorized-view.component.scss\";\r\n\r\n@Component({\r\n selector: \"unauthorized-view\",\r\n template: require(\"./unauthorized-view.component.html\")\r\n})\r\nexport class UnauthorizedViewComponent {\r\n\r\n}\r\n","import { Component, OnInit, QueryList, AfterContentInit, ContentChildren, OnDestroy } from \"@angular/core\";\r\nimport { VNavBarService } from \"@directives/_core/v-nav-bar/v-nav-bar.service.ts\";\r\nimport { VNavItemComponent } from \"@directives/_core/v-nav-bar/v-nav-item/v-nav-item.component\";\r\nimport { Subscription } from \"rxjs\";\r\nimport './v-nav-bar.component.scss';\r\n\r\n@Component({\r\n selector: 'v-nav-bar',\r\n template: require('./v-nav-bar.component.html'),\r\n})\r\nexport class VNavBarComponent implements OnInit, OnDestroy {\r\n\r\n @ContentChildren(VNavItemComponent) navItems: QueryList;\r\n\r\n navItemSubscription: Subscription;\r\n\r\n constructor(\r\n private readonly navBarService: VNavBarService) { }\r\n\r\n ngOnInit(): void {\r\n this.navItemSubscription = this.navBarService.navItemChanged.subscribe(clickedItem => {\r\n this.navItems.forEach(item => {\r\n item.selected = false;\r\n clickedItem.selected = true;\r\n })\r\n })\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.navItemSubscription?.unsubscribe();\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { VNavItemComponent } from \"@directives/_core/v-nav-bar/v-nav-item/v-nav-item.component\";\r\nimport { Subject } from \"rxjs\";\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class VNavBarService {\r\n navItemChanged = new Subject()\r\n\r\n constructor() { }\r\n\r\n navItemChange(item: VNavItemComponent) {\r\n this.navItemChanged.next(item);\r\n }\r\n}\r\n","import { Component, ElementRef, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from \"@angular/core\";\r\nimport { HTMLService } from \"@services/htmlService.service\";\r\nimport { fromEvent, Subscription } from \"rxjs\";\r\nimport { distinctUntilChanged, filter } from \"rxjs/operators\";\r\nimport { animDropDown } from 'src/app/animations/anim-dropdown.animations';\r\nimport \"./v-dropdown.component.scss\";\r\n\r\n\r\nexport enum VerticalDirection {\r\n Down,\r\n Up\r\n}\r\n\r\n@Component({\r\n selector: 'v-dropdown',\r\n template: require('./v-dropdown.component.html'),\r\n animations: [animDropDown]\r\n})\r\nexport class VDropdownComponent implements OnInit, OnChanges {\r\n\r\n @Input() open: boolean = false;\r\n\r\n @Input() autoSize: boolean;\r\n @Input() showMask: boolean;\r\n @Input() width: number;\r\n @Input() height: number;\r\n\r\n @Input() closeOnEsc: boolean = true;\r\n @Input() closeOnClickOutside: boolean = true;\r\n @Input() closeOnClickInside: boolean = true;\r\n\r\n @Input() direction = VerticalDirection.Down;\r\n\r\n @Input() ignoreClicksFrom: ElementRef;\r\n\r\n // Todo: naming\r\n @Output() closed = new EventEmitter();\r\n @Output() opened = new EventEmitter();\r\n\r\n // ---\r\n\r\n dropdownHeight = 1000;\r\n\r\n private showDropDown = false;\r\n private readonly maxDropDownHeight = 500;\r\n private readonly minDropDownHeight = 200;\r\n\r\n private subscriptions = new Subscription();\r\n private outsideClickSubscriptions: Subscription;\r\n\r\n constructor(\r\n private readonly elementRef: ElementRef,\r\n private readonly htmlService: HTMLService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.subscribeToEvents();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscriptions?.unsubscribe();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n\r\n if (changes[\"open\"]) {\r\n // Reset this so we dont influence the next opening\r\n this.dropdownHeight = 1000;\r\n\r\n setTimeout(() => {\r\n var previousState = this.showDropDown;\r\n this.showDropDown = this.open;\r\n this.calculateStyles();\r\n\r\n // If we were open, and now closed, then ensure we emit\r\n if (!this.showDropDown && previousState) {\r\n this.closed.emit();\r\n }\r\n });\r\n\r\n if (this.open) {\r\n setTimeout(() => {\r\n this.subscribeToOutsideClicks();\r\n }, 10);\r\n }\r\n // Only unsubscribe if we have been open previously\r\n else if (changes[\"open\"].previousValue == true) {\r\n this.unsubcribeToOutsideClicks();\r\n }\r\n }\r\n }\r\n\r\n // ---\r\n\r\n private subscribeToOutsideClicks() {\r\n\r\n this.outsideClickSubscriptions = fromEvent(document.body, 'click',\r\n {\r\n capture: true,\r\n })\r\n .subscribe((event: MouseEvent) => {\r\n this.handleClick(event);\r\n });\r\n }\r\n\r\n private unsubcribeToOutsideClicks() {\r\n if (!this.outsideClickSubscriptions) {\r\n return;\r\n }\r\n\r\n this.outsideClickSubscriptions.unsubscribe();\r\n this.outsideClickSubscriptions = null;\r\n }\r\n\r\n private subscribeToEvents(): void {\r\n\r\n this.subscriptions.add(fromEvent(document, \"keydown\").pipe(\r\n filter((event: KeyboardEvent) => event.keyCode === 27),\r\n distinctUntilChanged()\r\n ).subscribe((event: KeyboardEvent) => this.handleEscPressed(event)));\r\n }\r\n\r\n private handleEscPressed(event: KeyboardEvent): void {\r\n\r\n }\r\n\r\n private hideDropDown(event: MouseEvent) {\r\n this.unsubcribeToOutsideClicks();\r\n this.showDropDown = false;\r\n this.closed.emit(event);\r\n }\r\n\r\n // Returns true if the click is allowed to be handled by another component (e.g. to click a link)\r\n // Returns false if the click should be supressed\r\n private handleClick(event: MouseEvent): boolean {\r\n\r\n if (!this.elementRef.nativeElement || !this.showDropDown) {\r\n return;\r\n }\r\n\r\n const nodeTarget = event.target as HTMLElement;\r\n\r\n const clickedContent = !nodeTarget.classList.contains(\"mask\") && this.elementRef.nativeElement?.contains(nodeTarget);\r\n const clickedIgnoreElement = this.ignoreClicksFrom?.nativeElement?.contains(nodeTarget);\r\n\r\n if (!clickedContent && !clickedIgnoreElement) {\r\n if (this.closeOnClickOutside) {\r\n this.hideDropDown(event);\r\n }\r\n }\r\n\r\n if (!nodeTarget.classList.contains(\"mask\")) {\r\n return true;\r\n }\r\n }\r\n\r\n private calculateStyles() {\r\n this.findContentsHeight();\r\n this.direction = VerticalDirection.Down;\r\n\r\n if (!this.showDropDown) {\r\n return;\r\n }\r\n\r\n if (this.height) {\r\n this.dropdownHeight = this.height;\r\n return;\r\n }\r\n\r\n var dropdownElementBox = this.elementRef.nativeElement?.getBoundingClientRect();\r\n var scrollParent = this.htmlService.getScrollParent(this.elementRef.nativeElement, true);\r\n\r\n var minPercentage = 100 - (this.minDropDownHeight * 100 / scrollParent.scrollHeight);\r\n\r\n // If our element is too close to the bottom of our container, then open upwards (if there is space)\r\n var positionPercentage = dropdownElementBox.top * 100 / scrollParent.scrollHeight;\r\n var scaleFactor = 1;\r\n this.dropdownHeight = Math.min(this.maxDropDownHeight, (100 - positionPercentage) * scaleFactor * scrollParent.scrollHeight / 100);\r\n\r\n var heightBuffer = 20;\r\n\r\n if (positionPercentage > minPercentage && (scrollParent.getBoundingClientRect().top > this.dropdownHeight ||\r\n scrollParent.getBoundingClientRect().bottom > this.dropdownHeight)) {\r\n this.direction = VerticalDirection.Up;\r\n this.dropdownHeight = Math.min(this.maxDropDownHeight, positionPercentage * scrollParent.scrollHeight / 100);\r\n }\r\n\r\n this.dropdownHeight -= heightBuffer;\r\n }\r\n\r\n private findContentsHeight() {\r\n if (!this.showDropDown || !this.autoSize) {\r\n return;\r\n }\r\n\r\n var contentsContainer: HTMLElement = this.elementRef.nativeElement?.querySelector(\".dropdown-content-container\");\r\n var dropdownContents: HTMLElement;\r\n\r\n contentsContainer?.childNodes.forEach(node => {\r\n if (!dropdownContents && node.nodeType != 8) {\r\n dropdownContents = node as HTMLElement;\r\n }\r\n });\r\n\r\n if (!dropdownContents) {\r\n setTimeout(() => this.findContentsHeight());\r\n return;\r\n }\r\n\r\n var rect = dropdownContents.getBoundingClientRect();\r\n var targetHeight = Math.min(this.maxDropDownHeight, rect.height);\r\n targetHeight = Math.max(this.minDropDownHeight, targetHeight);\r\n\r\n contentsContainer.style.minHeight = targetHeight + \"px\";\r\n contentsContainer.style.width = rect.width + \"px\";\r\n }\r\n}\r\n","import { Component, ElementRef, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, TemplateRef, ViewChild } from \"@angular/core\";\r\nimport { Subject, Subscription } from \"rxjs\";\r\nimport \"./v-item-dropdown.component.scss\";\r\n\r\nexport interface IDropdownItem {\r\n selected: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'v-item-dropdown',\r\n template: require('./v-item-dropdown.component.html')\r\n})\r\nexport class VItemDropdownComponent implements OnInit, OnChanges {\r\n\r\n @Input() open = false;\r\n @Output() openChange = new EventEmitter();\r\n\r\n //@Input() items: IDropDownItem[];\r\n @Input() data: IDropdownItem[];\r\n @Input() selected: any;\r\n\r\n @Input() keydownListener: Subject;\r\n\r\n @Input() itemTemplate: TemplateRef;\r\n @Input() ignoreClicksFrom: HTMLElement;\r\n\r\n @Output() itemClicked = new EventEmitter();\r\n @Output() closed = new EventEmitter();\r\n\r\n @ViewChild(\"dropDown\", { read: ElementRef }) dropDown: ElementRef;\r\n\r\n itemToSelect: any;\r\n private selectedIndex = -1;\r\n private subscription = new Subscription();\r\n\r\n constructor() {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.subscribeToParentKeyPress();\r\n this.setSelectedIndex();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['data']) {\r\n // If dropdown list has changed, automatically select the first result\r\n this.selectedIndex = 0; \r\n }\r\n\r\n if (this.open) {\r\n this.scrollToSelected();\r\n }\r\n\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n\r\n itemClick(item: any, event: MouseEvent) {\r\n event?.stopPropagation();\r\n\r\n this.itemClicked.emit(item);\r\n this.open = false;\r\n }\r\n\r\n onClosed($event: MouseEvent) {\r\n this.open = false;\r\n this.openChange.emit(this.open);\r\n this.closed.emit($event);\r\n this.setSelectedIndex();\r\n }\r\n\r\n // ---\r\n\r\n private scrollToSelected(iterationCount = 5, className = \"selected\") {\r\n // Scroll selected item into view\r\n if (!this.selected && !this.data?.some(d => d.selected) && !this.itemToSelect) {\r\n return;\r\n }\r\n\r\n var children = this.dropDown.nativeElement.getElementsByClassName(className);\r\n\r\n if (children.length == 0) {\r\n setTimeout(() => {\r\n this.scrollToSelected(iterationCount, className);\r\n });\r\n\r\n return;\r\n }\r\n\r\n var selectedChild = children[0] as HTMLElement;\r\n var parent = selectedChild.parentElement;\r\n\r\n // Validate we have a scrollbar, if not retry\r\n if (iterationCount > 0 && parent.scrollHeight > parent.clientHeight) {\r\n setTimeout(() => {\r\n this.scrollToSelected(iterationCount - 1, className);\r\n });\r\n\r\n return;\r\n }\r\n\r\n // Bring child into view\r\n parent.scrollTop = selectedChild.offsetTop;\r\n\r\n }\r\n private subscribeToParentKeyPress(): void {\r\n if (!this.keydownListener) {\r\n return;\r\n }\r\n\r\n this.subscription.add(this.keydownListener?.subscribe(keyEvent => {\r\n if (keyEvent.key.length == 1 || keyEvent.key == \"Backspace\") {\r\n // key is alphanumeric meaning a search term is being entered and the data is going to change\r\n this.selectedIndex = -1;\r\n return;\r\n }\r\n\r\n switch (keyEvent.key) {\r\n case \"ArrowDown\":\r\n case \"ArrowUp\":\r\n this.handleArrowPress(keyEvent);\r\n break;\r\n case \"Enter\":\r\n this.handleEnterPress(keyEvent);\r\n break;\r\n }\r\n }))\r\n }\r\n\r\n private handleArrowPress(keyEvent: KeyboardEvent): void {\r\n if (keyEvent.key == \"ArrowDown\" && this.selectedIndex < (this.data.length - 1)) {\r\n this.selectedIndex++;\r\n\r\n }\r\n\r\n if (keyEvent.key == \"ArrowUp\" && this.selectedIndex > 0) {\r\n this.selectedIndex--;\r\n }\r\n\r\n this.itemToSelect = this.data[this.selectedIndex];\r\n\r\n this.scrollToSelected(undefined, \"highlighted\");\r\n\r\n }\r\n\r\n private handleEnterPress(keyEvent: KeyboardEvent): void {\r\n this.itemClick(this.itemToSelect, null);\r\n this.onClosed(null);\r\n }\r\n\r\n private setSelectedIndex(): void {\r\n this.selectedIndex = this.data?.findIndex(item => item.selected);\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, ViewChild } from \"@angular/core\";\r\nimport { animSlideFromTop } from \"../../../animations/slide.animations\";\r\nimport { VFlagToggleComponent } from \"../v-flag-toggle/v-flag-toggle.component\";\r\nimport './v-flag-toggle-list-item.component.scss';\r\n\r\n@Component({\r\n selector: \"v-flag-toggle-list-item\",\r\n template: require(\"./v-flag-toggle-list-item.component.html\"),\r\n animations: [animSlideFromTop]\r\n})\r\nexport class VFlagToggleListItemComponent implements OnInit, OnChanges {\r\n @Input() description: string;\r\n @Input() tiny: boolean;\r\n @Input() title: string;\r\n @Input() disabled: boolean;\r\n\r\n @Input() flag: any;\r\n @Input() currentFlags: any;\r\n @Output() currentFlagsChange = new EventEmitter();\r\n @Output() onChanged = new EventEmitter();\r\n\r\n @ViewChild(VFlagToggleComponent) toggleFlagComponent: VFlagToggleComponent;\r\n\r\n // state\r\n hasFlag: boolean;\r\n\r\n ngOnInit(): void {\r\n this.updateHasFlag();\r\n }\r\n\r\n ngOnChanges(): void {\r\n this.updateHasFlag();\r\n }\r\n\r\n toggle(): void {\r\n this.toggleFlagComponent?.toggle();\r\n }\r\n\r\n onToggled(): void {\r\n this.updateHasFlag();\r\n\r\n this.currentFlagsChange.emit(this.currentFlags);\r\n this.onChanged.emit(this.hasFlag);\r\n }\r\n\r\n // ---\r\n\r\n private updateHasFlag(): void {\r\n this.hasFlag = (this.currentFlags & this.flag) === this.flag;\r\n }\r\n}\r\n","import { HostListener } from \"@angular/core\";\r\nimport { Subject } from \"rxjs\";\r\n\r\nexport class DropdownContainer {\r\n\r\n keyPress: Subject;\r\n\r\n constructor() {\r\n this.keyPress = new Subject();\r\n }\r\n\r\n @HostListener('keydown', ['$event'])\r\n onArrowPressed($event: KeyboardEvent): void {\r\n this.keyPress.next($event);\r\n }\r\n}\r\n","import { Component, EventEmitter, HostBinding, Input, Output, ViewChild } from \"@angular/core\";\r\nimport { VToggleComponent } from \"../../_forms/v-toggle/v-toggle.component\";\r\nimport './v-toggle-list-item.component.scss';\r\n\r\n@Component({\r\n selector: \"v-toggle-list-item\",\r\n template: require(\"./v-toggle-list-item.component.html\")\r\n})\r\nexport class VToggleListItemComponent {\r\n @HostBinding(\"class.has-description\") @Input() description: string;\r\n @Input() title: string;\r\n @Input() disabled: boolean;\r\n\r\n @Input() value: boolean;\r\n @Output() valueChange = new EventEmitter();\r\n @Output() onChanged = new EventEmitter();\r\n\r\n @ViewChild(VToggleComponent) toggleComponent: VToggleComponent;\r\n\r\n constructor() { }\r\n\r\n onToggled(): void {\r\n this.valueChange.emit(this.value);\r\n this.onChanged.emit(this.value);\r\n }\r\n\r\n toggle(): void {\r\n this.toggleComponent?.toggle();\r\n }\r\n}\r\n","import { Component, Input } from \"@angular/core\";\r\nimport { DeleteConfirmationComponent } from \"@app/directives/_misc/delete-confirm/delete-confirm.component\";\r\nimport { IAlertRule, IAlertRuleGroupMapping } from \"@app/main/modules/alerts/_models/alerts.interfaces\";\r\nimport { DisplayService, IDialogOptionsJson } from \"@app/services/display.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\n\r\n@Component({\r\n selector: 'group-delete-confirmation',\r\n template: require('./../delete-confirm.component.html')\r\n})\r\nexport class GroupDeleteConfirmationComponent extends DeleteConfirmationComponent {\r\n\r\n @Input() groupAlertMapping: IAlertRuleGroupMapping;\r\n @Input() canBeDeleted: boolean = true;\r\n\r\n constructor(\r\n displayService: DisplayService,\r\n translationService: TranslationService\r\n ) { super(displayService, translationService); }\r\n\r\n showDeleteDialog($event: any): void {\r\n const dialogHTML = this.buildDialogHtmlString();\r\n const titleString = this.buildTitleString();\r\n\r\n const dialogOptions: IDialogOptionsJson = {\r\n title: titleString,\r\n dialogHTML: dialogHTML,\r\n dialogId: `deleteConfirmDialog`,\r\n bindings: {\r\n onConfirmDialog: (confirmation: boolean) => { this.onConfirmDialog(confirmation); }\r\n },\r\n event: $event,\r\n multiple: true,\r\n clickOutsideToClose: true,\r\n escapeToClose: true\r\n };\r\n\r\n this.displayService.showDialog(dialogOptions);\r\n\r\n }\r\n\r\n private buildTitleString(): string {\r\n return this.canBeDeleted ? `${this.subjectVerb} ${this.subjectName}?` : this.translationService.t('DeleteConfirm.UnableToDelete', [this.subjectVerb.toLowerCase(), this.subjectName.toLowerCase()]);\r\n }\r\n\r\n private buildDialogHtmlString(): string {\r\n let dialogHtmlStringBuilder = [];\r\n let contextString: string;\r\n\r\n if (!this.canBeDeleted && this.groupAlertMapping?.AlertRules.length === 0) {\r\n contextString = this.translationService.t('DeleteConfirm.UnableToDeleteNoAccess');\r\n } else if (!this.canBeDeleted) {\r\n contextString = this.translationService.t('DeleteConfirm.UnableToDeleteWithAccess');\r\n } else {\r\n contextString = this.translationService.t('DeleteConfirm.AreYouSure', [this.subjectVerb.toLowerCase(), this.subjectName.toLowerCase()]);\r\n }\r\n\r\n dialogHtmlStringBuilder.push(`
${contextString}
`);\r\n\r\n dialogHtmlStringBuilder.push(`
${this.cancelVerb}`);\r\n\r\n if (this.canBeDeleted) {\r\n dialogHtmlStringBuilder.push(`${this.subjectVerb}`);\r\n }\r\n\r\n dialogHtmlStringBuilder.push(`
`);\r\n\r\n return dialogHtmlStringBuilder.join(``);\r\n }\r\n}\r\n","module.exports = \" {{ label ? label : subjectVerb }}
{{'Common.No' | translate }} {{'Common.Yes' | translate }}
{{'deleteConfirm.confirmMessage' | translate : [ subjectVerb, ('deleteConfirm.this' | translate), subjectName ]}}
\";","import { Injectable } from \"@angular/core\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { fromEvent, merge, of } from \"rxjs\";\r\nimport { delay, map, switchMap } from \"rxjs/operators\";\r\n\r\n@UntilDestroy()\r\n@Injectable()\r\nexport class DelayedHoverService {\r\n constructor() { }\r\n\r\n createMouseEnterDelay(element: HTMLElement, observer: (boolean) => void, hoverDelay = 300) {\r\n const hide$ = fromEvent(element, 'mouseleave').pipe(map(_ => null));\r\n const show$ = fromEvent(element, 'mouseenter').pipe(map(_ => _));\r\n\r\n merge(hide$, show$)\r\n .pipe(\r\n untilDestroyed(this),\r\n switchMap(show => {\r\n if (!show) {\r\n return of(false);\r\n }\r\n\r\n return of(show).pipe(delay(hoverDelay));\r\n })\r\n )\r\n .subscribe(observer);\r\n }\r\n}\r\n","import { Component, Injectable, Input, OnChanges, OnInit, SimpleChanges } from \"@angular/core\";\r\nimport \"./multiStepIndicator.component.scss\";\r\n\r\nexport enum MultiStepStatus {\r\n Todo,\r\n Failed,\r\n Completed\r\n}\r\n\r\nexport interface IMultiStep {\r\n label: string;\r\n subText?: string;\r\n status: MultiStepStatus;\r\n}\r\n\r\n@Component({\r\n selector: \"multi-step-indicator\",\r\n template: require('./multiStepIndicator.component.html')\r\n})\r\n@Injectable()\r\nexport class MultiStepIndicatorComponent implements OnInit, OnChanges {\r\n\r\n @Input() steps: IMultiStep[];\r\n\r\n // ---\r\n\r\n hasSubText: boolean;\r\n\r\n constructor() {\r\n\r\n //this.steps = [];\r\n //this.steps.push({ label: \"Created\", status: MultiStepStatus.Completed, subText: \"21st July\" });\r\n //this.steps.push({ label: \"Open\", status: MultiStepStatus.Completed, subText: \"3 hours\" });\r\n //this.steps.push({ label: \"SLA Expiry\", status: MultiStepStatus.Failed, subText: \"22nd July\" });\r\n //this.steps.push({ label: \"Closed\", status: MultiStepStatus.Todo, subText: \"23rd July\" });\r\n }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n\r\n this.hasSubText = this.steps.find(s => s.subText) != null;\r\n }\r\n\r\n // --\r\n\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from \"@angular/core\";\r\nimport { IUser } from \"@interfaces/IUser\";\r\nimport { UserType } from \"@enums/UserType\";\r\nimport { AccountService, IAccount } from \"@services/account.service\";\r\nimport { CurrentUserService } from \"@services/currentUser.service\";\r\nimport { LoginService } from \"@services/login.service.ajs\";\r\nimport \"./accountSwitcher.component.scss\";\r\nimport { PreferencesService } from \"@app/services/preferences.service\";\r\nimport { NavigationService } from \"@app/services/navigation.service\";\r\n\r\n@Component({\r\n selector: \"account-switcher\",\r\n template: require(\"./accountSwitcher.component.html\")\r\n})\r\n\r\nexport class AccountSwitcherComponent implements OnChanges, OnInit {\r\n currentUser: IUser;\r\n accountList: IAccount[] = [];\r\n UserType = UserType;\r\n loading = false;\r\n\r\n @Output() onAccountSwitched: EventEmitter = new EventEmitter();\r\n\r\n // ---\r\n\r\n private currentAccount: IAccount;\r\n\r\n constructor(\r\n private readonly accountService: AccountService,\r\n private readonly loginService: LoginService,\r\n private readonly currentUserService: CurrentUserService,\r\n private readonly preferencesService: PreferencesService,\r\n private readonly navigationService: NavigationService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.currentUserService.getCurrentUser().then(currentUser => {\r\n this.currentUser = currentUser;\r\n });\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n\r\n this.accountList = [];\r\n this.loading = true;\r\n // Create account list switcher component.\r\n this.accountService.getMultiAccountUserMappings().then(accountList => {\r\n accountList.forEach(accountMapping => {\r\n this.accountList.push({\r\n Id: accountMapping.Id,\r\n CompanyName: accountMapping.CompanyName,\r\n Image: accountMapping.Image\r\n });\r\n this.loading = false;\r\n });\r\n });\r\n\r\n this.accountService.getAccountData(true).then(currentAccount => {\r\n this.currentAccount = currentAccount;\r\n });\r\n }\r\n\r\n switchToAccount(account: IAccount) {\r\n this.loading = true;\r\n\r\n this.loginService.switchAccount(account.Id, !!this.currentAccount).then(() => {\r\n this.preferencesService.reconcileLanguagesRequiresRefresh().then(() => {\r\n this.accountService.getAccountData(true).then(currentAccount => {\r\n this.currentAccount = currentAccount;\r\n this.loading = false;\r\n });\r\n this.onAccountSwitched.emit(account.Id);\r\n });\r\n });\r\n }\r\n\r\n switchToInternal() {\r\n this.loading = true;\r\n\r\n this.loginService.switchToInternal().then(() => {\r\n this.loading = false;\r\n this.onAccountSwitched.emit(null);\r\n });;\r\n }\r\n\r\n // ---\r\n\r\n //private removeClass(className: string,) {\r\n // this.renderer.removeClass(this.elementRef.nativeElement, className);\r\n //}\r\n}\r\n","import { ICountry } from \"@directives/_forms/smsInput/ICountry\";\r\nimport { IPhoneNumberOutput } from \"@directives/_forms/smsInput/smsInput.interfaces\";\r\nimport { DistanceMeasurement } from \"@enums/measurements/DistanceMeasurement.enum\";\r\nimport { AccountUserType } from \"@enums/UserType\";\r\nimport { IGenericPreference } from \"@interfaces/IGenericPreference\";\r\nimport { IHttpException } from \"@interfaces/IHttpException\";\r\nimport { IPreferencesContent } from \"@interfaces/IPreferencesContent\";\r\nimport { IRunBlockRootScope } from \"@interfaces/IRunBlockRootScope\";\r\nimport { IUser } from \"@interfaces/IUser\";\r\nimport { AccountService } from \"@services/account.service\";\r\nimport { AccountUserMappingService } from \"@services/accountUserMapping.service.ajs\";\r\nimport { JourneyCostType, PreferencesService } from \"@services/preferences.service\";\r\nimport { ITranslationLocale, TranslationService } from \"@services/translation.service\";\r\nimport { UsersService } from \"@services/users.service\";\r\nimport * as angular from \"angular\";\r\nimport copy from \"fast-copy/dist/fast-copy.esm.js\";\r\nimport { ITimeZoneInfo } from \"./model/ITimeZoneInfo\";\r\nimport \"./userpreferences.scss\";\r\n\r\nexport class UserPreferencesDirectiveController {\r\n\r\n currentPreferences: IPreferencesContent;\r\n accountPreferences: IPreferencesContent;\r\n userPreferences: IPreferencesContent;\r\n\r\n currentUser: IUser;\r\n countryCodes: ICountry[];\r\n timezones: ITimeZoneInfo[];\r\n locales: ITranslationLocale[];\r\n\r\n selectedTab: string;\r\n\r\n showMyPreferences: boolean = true;\r\n\r\n formIsValid: boolean = true;\r\n phoneIsValid: boolean = true;\r\n timezoneReadOnly: boolean;\r\n\r\n companyImage: string;\r\n\r\n saving: boolean = false;\r\n\r\n journeyCostTypeLabel: string;\r\n\r\n static $inject = [\"$rootScope\", \"$mdDialog\", \"$q\", \"$window\", \"preferencesService\", \"accountService\", \"usersService\", \"accountUserMappingService\", \"translationService\", \"defaultLanguage\"];\r\n\r\n constructor(\r\n private readonly $rootScope: IRunBlockRootScope,\r\n private readonly $mdDialog: angular.material.IDialogService,\r\n private readonly $q: angular.IQService,\r\n private readonly $window: angular.IWindowService,\r\n private readonly preferencesService: PreferencesService,\r\n private readonly accountService: AccountService,\r\n private readonly usersService: UsersService,\r\n private readonly accountUserMappingService: AccountUserMappingService,\r\n private readonly translationService: TranslationService,\r\n private readonly defaultLanguage: boolean\r\n ) {\r\n }\r\n\r\n $onInit() {\r\n this.initialise();\r\n\r\n this.currentUser = angular.copy(this.$rootScope.currentUser);\r\n if (this.defaultLanguage) {\r\n this.formIsValid = false;\r\n }\r\n }\r\n\r\n resetPreferences() {\r\n this.saving = true;\r\n\r\n this.userPreferences = {} as any;\r\n this.save();\r\n }\r\n\r\n hide(): void {\r\n this.$mdDialog.hide();\r\n }\r\n\r\n onSmsOutputChanged(output: IPhoneNumberOutput): void {\r\n if (output.input == '+44') {\r\n this.currentUser.CurrentAccountUserMapping.Phone = null;\r\n this.phoneIsValid = true;\r\n this.formIsValid = true;\r\n return;\r\n }\r\n\r\n if (output.input) {\r\n this.phoneIsValid = output.isPristine || output.isValid;\r\n this.formIsValid = this.phoneIsValid;\r\n this.currentUser.CurrentAccountUserMapping.Phone = output.internationalized;\r\n }\r\n }\r\n\r\n validateForm(valid: boolean) {\r\n if (valid) {\r\n this.formIsValid = valid;\r\n }\r\n }\r\n\r\n save() {\r\n this.saving = true;\r\n\r\n var promises = [];\r\n\r\n var userPrefToSave = copy(this.userPreferences);\r\n var accountPrefToSave = copy(this.accountPreferences);\r\n\r\n // Remove unchanged propterties to only save changed properties\r\n this.removeUnchangedProperties(userPrefToSave);\r\n\r\n promises.push(this.preferencesService.updateUserPreferences(userPrefToSave));\r\n\r\n if (this.currentUser.CurrentAccountUserMapping.Type == AccountUserType.Admin) {\r\n\r\n this.removeUnchangedProperties(accountPrefToSave);\r\n const updateAccountPrefPromise = this.preferencesService.updateAccountPreferences(accountPrefToSave);\r\n promises.push(updateAccountPrefPromise);\r\n }\r\n\r\n promises.push(this.usersService.save(this.currentUser).then(() => {\r\n return this.accountUserMappingService.postAccountUserMapping(this.currentUser.Email, this.currentUser.CurrentAccountUserMapping, null);\r\n }));\r\n\r\n var error = false;\r\n\r\n // Wait for all saving events to complete\r\n this.$q.all(promises)\r\n .catch((a: angular.IHttpPromiseCallbackArg) => {\r\n error = true;\r\n })\r\n .finally(() => {\r\n this.saving = false;\r\n if (!error) {\r\n this.$window.location.reload(true);\r\n }\r\n });\r\n }\r\n\r\n onPrefChanged(preference: IGenericPreference) {\r\n preference.savePreference = true;\r\n\r\n this.updateJourneyCostTypeLabel();\r\n }\r\n\r\n showPasswordEditor($event: MouseEvent) {\r\n this.accountService.showPasswordEditor($event);\r\n }\r\n\r\n showChangeImageDialog(event: MouseEvent) {\r\n this.accountService.showMyCompanyImageDialog(event).then(() => {\r\n this.accountService.getAccountData(true).then(accountData => {\r\n this.companyImage = accountData.Image;\r\n })\r\n });\r\n }\r\n\r\n setPreferencesToAccountPrefs() {\r\n this.currentPreferences = this.accountPreferences;\r\n this.showMyPreferences = false;\r\n }\r\n\r\n setPreferencesToUserPrefs() {\r\n this.currentPreferences = this.userPreferences;\r\n this.showMyPreferences = true;\r\n }\r\n\r\n //------------------------------------------------\r\n\r\n private initialise() {\r\n var prefPromise = this.preferencesService.getAllPreferences();\r\n var companyDataPromise = this.accountService.getAccountData();\r\n var countryCodesPromise = this.preferencesService.getCountryCodes();\r\n var timezonesPromise = this.preferencesService.getTimezones();\r\n var localePromise = this.translationService.getListOfLocales();\r\n\r\n this.$q.all([prefPromise, companyDataPromise, countryCodesPromise, timezonesPromise, localePromise])\r\n .then(([prefs, companyData, countryCodes, timezones, locales]) => {\r\n\r\n this.accountPreferences = copy({ ...prefs.Default, ...prefs.Account });\r\n\r\n this.timezoneReadOnly = (prefs.Account?.Timezone != null);\r\n\r\n\r\n this.userPreferences = copy({ ...prefs.Default, ...prefs.Account, ...prefs.User });\r\n\r\n this.setExistingPrefProperties(prefs.Account, this.accountPreferences);\r\n this.setExistingPrefProperties(prefs.User, this.userPreferences);\r\n\r\n this.companyImage = companyData.Image;\r\n this.countryCodes = countryCodes;\r\n this.timezones = timezones;\r\n this.locales = locales.filter(locale => locale.Locale != \"qa\" && locale.Locale != \"no\");\r\n })\r\n .finally(() => {\r\n this.setPreferencesToUserPrefs();\r\n this.updateJourneyCostTypeLabel();\r\n });\r\n }\r\n\r\n private updateJourneyCostTypeLabel(): void {\r\n let translationPhrase: string;\r\n\r\n if (this.currentPreferences.JourneyCostType.Value == JourneyCostType.Distance) {\r\n if (this.currentPreferences.DistanceMeasurement.Value == DistanceMeasurement.Miles) {\r\n translationPhrase = \"UserPreferences.costPerMile\";\r\n\r\n } else if (this.currentPreferences.DistanceMeasurement.Value == DistanceMeasurement.Kilometres) {\r\n translationPhrase = \"UserPreferences.costPerKilometre\";\r\n\r\n }\r\n } else if (this.currentPreferences.JourneyCostType.Value == JourneyCostType.Hourly) {\r\n translationPhrase = \"UserPreferences.costPerHour\";\r\n }\r\n\r\n this.journeyCostTypeLabel = this.translationService.t(translationPhrase);\r\n }\r\n\r\n private removeUnchangedProperties(model: IPreferencesContent): void {\r\n for (const property in model) {\r\n const preference = model[property];\r\n\r\n if (preference && model[property].savePreference) {\r\n continue;\r\n }\r\n\r\n delete model[property];\r\n }\r\n }\r\n\r\n private setExistingPrefProperties(sourceModel: IPreferencesContent, targetModel: IPreferencesContent) {\r\n for (const property in sourceModel) {\r\n\r\n const preference = targetModel[property];\r\n if (!preference) {\r\n continue;\r\n }\r\n\r\n preference.savePreference = true;\r\n }\r\n }\r\n\r\n setSelectedTab(tab: string) {\r\n this.selectedTab = tab;\r\n }\r\n}\r\n\r\nexport class UserPreferencesDirective implements angular.IDirective {\r\n restrict = \"E\";\r\n template = require(\"./userpreferences.html\");\r\n controller = UserPreferencesDirectiveController;\r\n controllerAs = \"$ctrl\";\r\n bindToController = true;\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n const directive = () => new UserPreferencesDirective();\r\n directive.$inject = [];\r\n return directive;\r\n }\r\n}\r\n","module.exports = \"

{{'UserPreferences.preferences' | translate}}

clear
{{'UserPreferences.myPreferences' | translate}} {{'UserPreferences.defaultPreferences' | translate}}
person
{{$ctrl.currentUser.CurrentAccountUserMapping.Name}}
people_alt
{{'UserPreferences.company' | translate}}

{{'UserPreferences.accountPreferences' | translate}}

{{'UserPreferences.amendAccountDetails' | translate}}
{{'UserPreferences.required' | translate}}
{{'UserPreferences.invalidEmail' | translate}}
{{'UserPreferences.required' | translate}}
{{'UserPreferences.invalidPhone' | translate}}
{{'UserPreferences.changePassword' | translate}}

{{'UserPreferences.generalPreferences' | translate}}

{{'UserPreferences.generalPreferencesSubtitle' | translate}}
{{'UserPreferences.companyDefaultPreferencesMessage' | translate}}
{{'UserPreferences.showHideDrivers' | translate}}
{{'UserPreferences.showHideNoUnit' | translate}}
{{'UserPreferences.showHideNotTracking' | translate}}
{{'UserPreferences.displayTrailers' | translate}}

{{'UserPreferences.mapPreferences' | translate}}

{{'UserPreferences.mapPreferencesSubtitle' | translate}}
{{'UserPreferences.showHideGeofences' | translate}}
{{'UserPreferences.showHideZones' | translate}}
{{'UserPreferences.showHideSystemZones' | translate}}
{{'UserPreferences.showHideGeofenceLabels' | translate}}
{{'UserPreferences.showHideVehicleClustering' | translate}}
{{'UserPreferences.showVehicleLabels' | translate}}
{{'Common.Vehicle' | translate}} ({{'UserPreferences.default' | translate}}) {{'Common.Driver' | translate}} ({{'UserPreferences.default' | translate}}) {{'UserPreferences.registration' | translate}} ({{'UserPreferences.default' | translate}}) {{'UserPreferences.displayLabel' | translate}} ({{'UserPreferences.default' | translate}})

{{'UserPreferences.costPreferences' | translate}}

{{'UserPreferences.costPreferencesSubtitle' | translate}}
{{'UserPreferences.distance' | translate}} ({{'UserPreferences.default' | translate}}) {{'UserPreferences.hourly' | translate}} ({{'UserPreferences.default' | translate}})
{{'UserPreferences.costOfJourney' | translate}}
{{'UserPreferences.accountDefault' | translate : $ctrl.accountPreferences.JourneyCost.Value}}
{{'UserPreferences.pound' | translate}} ({{'UserPreferences.default' | translate}}) {{'UserPreferences.euro' | translate}} ({{'UserPreferences.default' | translate}}) {{'UserPreferences.dollar' | translate}} ({{'UserPreferences.default' | translate}})

{{'UserPreferences.unitMeasurementPreferences' | translate}}

{{'UserPreferences.unitMeasurementPreferencesSubtitle' | translate}}
{{'UserPreferences.distanceMeasurementSubtitle' | translate}}
{{'UserPreferences.kilometres' | translate}} ({{'UserPreferences.default' | translate}}) {{'UserPreferences.miles' | translate}} ({{'UserPreferences.default' | translate}})
{{'UserPreferences.celsius' | translate}} ({{'UserPreferences.default' | translate}}) {{'UserPreferences.fahrenheit' | translate}} ({{'UserPreferences.default' | translate}}) {{'UserPreferences.litre' | translate}} ({{'UserPreferences.default' | translate}}) {{'UserPreferences.gallon' | translate}} ({{'UserPreferences.default' | translate}}) {{'UserPreferences.usGallon' | translate}} ({{'UserPreferences.default' | translate}}) {{'MPG'}} ({{'UserPreferences.default' | translate}}) {{'L/100KM'}} ({{'UserPreferences.default' | translate}}) {{'MPG (US)'}} ({{'UserPreferences.default' | translate}}) {{'KPL'}} ({{'UserPreferences.default' | translate}})

{{'UserPreferences.internationalisationPreferences' | translate}}

{{'UserPreferences.internationalisationPreferencesSubtitle' | translate}}
{{'UserPreferences.countryCodeSubtitle' | translate}}
{{'UserPreferences.accountDefault' | translate : $ctrl.accountPreferences.CountryCode.Value}}
{{item.EnglishName}} - {{item.TwoLetterISORegionName}}
{{('UserPreferences.timezoneSubtitle') | translate}}
{{'UserPreferences.AccountTimezoneWarningSubtitle' | translate}}
{{'UserPreferences.accountDefault' | translate : $ctrl.accountPreferences.Timezone.Value}}
{{item.Id}}
{{'UserPreferences.reportingSubtitle' | translate}}
{{item.Title}} - {{item.Locale}}

{{'UserPreferences.TmsPreferences' | translate}}

{{'UserPreferences.TmsPreferencesSubtitle' | translate}}
{{'UserPreferences.DepartStartLocation' | translate}} ({{'UserPreferences.default' | translate}}) {{'UserPreferences.DepartFromAnyVisit' | translate}} ({{'UserPreferences.default' | translate}}) {{'UserPreferences.JourneyStart' | translate}} ({{'UserPreferences.default' | translate}}) {{'UserPreferences.ArriveEndLocation' | translate}} ({{'UserPreferences.default' | translate}}) {{'UserPreferences.ArriveAllVisits' | translate}} ({{'UserPreferences.default' | translate}}) {{'UserPreferences.OnLocation' | translate}} ({{'UserPreferences.default' | translate}}) {{'UserPreferences.OnJourney' | translate}} ({{'UserPreferences.default' | translate}}) {{'UserPreferences.OnDwell' | translate}} ({{'UserPreferences.default' | translate}})
{{'UserPreferences.savingSettingsMessage' | translate}}
{{'Common.Save' | translate}}
\";","module.exports = \"

Company Image

clear
{{$ctrl.errorMessage}} Save
\";","import { Component, Input, OnChanges } from \"@angular/core\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport \"./batteryIndicator.scss\";\r\n\r\n@Component({\r\n selector: 'battery-indicator',\r\n template: require('./batteryIndicator.component.html')\r\n})\r\nexport class BatteryIndicatorComponent implements OnChanges {\r\n\r\n @Input() percentage: number;\r\n @Input() voltage: number;\r\n @Input() size: string = \"s24\"\r\n\r\n alert: boolean;\r\n\r\n tooltip: string = \"\";\r\n background: string = \"\";\r\n height: string = \"\";\r\n\r\n constructor(private readonly translationService: TranslationService) { }\r\n\r\n ngOnChanges(): void {\r\n this.processBatteryLevel();\r\n }\r\n\r\n private processBatteryLevel(): void {\r\n\r\n if (!this.percentage && this.voltage) {\r\n this.calculatePercentageFromVoltage();\r\n }\r\n\r\n this.alert = false;\r\n\r\n if (this.percentage <= 33) {\r\n this.alert = true;\r\n }\r\n\r\n if (!this.voltage) {\r\n this.tooltip = this.translationService.t(\"batteryIndicator.batteryLevel\", this.percentage);\r\n }\r\n\r\n this.setBackground(this.percentage);\r\n this.setHeight(this.percentage);\r\n }\r\n\r\n private calculatePercentageFromVoltage(): void {\r\n // Based on 14v battery\r\n this.percentage = 0;\r\n\r\n if (this.voltage > 12) {\r\n this.percentage = 9;\r\n }\r\n if (this.voltage > 12.5) {\r\n this.percentage = 14;\r\n }\r\n if (this.voltage > 12.8) {\r\n this.percentage = 17;\r\n }\r\n if (this.voltage > 12.9) {\r\n this.percentage = 20;\r\n }\r\n if (this.voltage > 13.0) {\r\n this.percentage = 30;\r\n }\r\n if (this.voltage > 13.1) {\r\n this.percentage = 40;\r\n }\r\n if (this.voltage > 13.2) {\r\n this.percentage = 70;\r\n }\r\n if (this.voltage > 13.3) {\r\n this.percentage = 90;\r\n }\r\n if (this.voltage > 13.4) {\r\n this.percentage = 99;\r\n }\r\n if (this.voltage > 13.6) {\r\n this.percentage = 100;\r\n }\r\n\r\n this.tooltip = `${this.voltage}V`;\r\n }\r\n\r\n private setBackground(percentage: number): void {\r\n this.background = \"red\";\r\n\r\n if (this.percentage > 35) {\r\n this.background = \"darkorange\";\r\n }\r\n\r\n if (this.percentage > 75) {\r\n this.background = \"green\";\r\n }\r\n }\r\n\r\n private setHeight(percentage: number): void {\r\n this.height = `${percentage}%`;\r\n }\r\n\r\n}\r\n","import { Component, EventEmitter, Input, Output } from \"@angular/core\";\r\nimport \"./breadcrumbs.scss\";\r\n\r\nexport interface IBreadcrumb {\r\n title: string;\r\n data?: T;\r\n}\r\n\r\n@Component({\r\n selector: \"breadcrumbs\",\r\n template: require(\"./breadcrumbs.html\")\r\n})\r\nexport class BreadcrumbsComponent{\r\n @Input() breadcrumbs: IBreadcrumb[];\r\n @Output() onClick: EventEmitter = new EventEmitter();\r\n\r\n constructor() { }\r\n\r\n emitBreadcrumb(crumb: IBreadcrumb, index: number) {\r\n this.onClick.emit({ crumb, index });\r\n }\r\n}\r\n\r\n//class Controller implements angular.IComponentController, IComponentBindings {\r\n// breadcrumbs: IBreadcrumb[];\r\n// onClick: (args: { $crumb: IBreadcrumb, $index: number }) => void;\r\n\r\n// static $inject = [];\r\n\r\n// constructor() {\r\n// }\r\n\r\n// $onChanges(onChangesObj: angular.IOnChangesObject): void {\r\n// }\r\n\r\n// // ---\r\n//}\r\n\r\n//export class BreadcrumbsComponent implements angular.IComponentOptions {\r\n// bindings: any;\r\n// template: string;\r\n// controller: any;\r\n\r\n// constructor() {\r\n// this.bindings = {\r\n// breadcrumbs: \"<\",\r\n// onClick: \"&\"\r\n// };\r\n\r\n// this.controller = Controller;\r\n\r\n// this.template = require(\"./breadcrumbs.html\");\r\n// }\r\n//}\r\n","import { Component, ElementRef, EventEmitter, Input, OnChanges, Output } from \"@angular/core\";\r\nimport { DayOfWeek } from \"@enums/DayOfWeek\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport \"./day-of-week-picker.component.scss\";\r\n\r\ninterface IDayOfWeek {\r\n dayOfWeek: DayOfWeek;\r\n firstLetter: string;\r\n translation: string;\r\n selected?: boolean;\r\n highlighted?: boolean;\r\n firstInRange?: boolean;\r\n endInRange?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: \"day-of-week-picker\",\r\n template: require(\"./day-of-week-picker.component.html\")\r\n})\r\nexport class DayOfWeekPickerComponent implements OnChanges {\r\n @Input() selectedDays: DayOfWeek[];\r\n @Input() range: boolean;\r\n\r\n @Output() selectedDaysChange = new EventEmitter();\r\n\r\n // ---\r\n\r\n dayOfWeek = DayOfWeek;\r\n dayOfWeekMap: IDayOfWeek[];\r\n\r\n locale: string; /*= \"es-SP\"*/\r\n\r\n constructor(\r\n private readonly translationService: TranslationService\r\n ) {\r\n this.createDayOfWeekMap();\r\n }\r\n\r\n ngOnChanges() {\r\n this.setEnabledDays()\r\n }\r\n\r\n toggleDay(day: IDayOfWeek) {\r\n this.removeHighlights();\r\n\r\n if (this.range) {\r\n switch (this.selectedDays.length) {\r\n case 0:\r\n this.selectSingleDay(day);\r\n break;\r\n case 1:\r\n this.setRange(day);\r\n break;\r\n default:\r\n this.selectSingleDay(day, true);\r\n break;\r\n }\r\n return;\r\n }\r\n\r\n day.selected = !day.selected;\r\n\r\n this.onSelectionChanged();\r\n }\r\n\r\n selectDays(selection: \"all\" | \"weekdays\" | \"weekends\") {\r\n this.resetSelection();\r\n\r\n switch (selection) {\r\n case \"weekdays\":\r\n this.enableWeekdays();\r\n break;\r\n\r\n case \"weekends\":\r\n this.enableWeekends();\r\n break;\r\n\r\n default:\r\n this.enableWeekdays();\r\n this.enableWeekends();\r\n }\r\n\r\n this.onSelectionChanged();\r\n }\r\n\r\n highlightDays($event): void {\r\n if (!this.range || this.selectedDays.length !== 1) {\r\n return;\r\n }\r\n\r\n this.highlightRange($event);\r\n }\r\n\r\n removeHighlights(): void {\r\n this.dayOfWeekMap.forEach(day => day.highlighted = false);\r\n }\r\n\r\n resetRange(day: IDayOfWeek): void {\r\n this.resetSelection();\r\n this.selectedDays = [];\r\n this.onSelectionChanged();\r\n }\r\n\r\n // ---\r\n\r\n private setEnabledDays(): void {\r\n this.dayOfWeekMap.forEach(day => day.selected = false);\r\n this.selectedDays.forEach(day => {\r\n this.enableDay(day);\r\n });\r\n }\r\n\r\n private highlightRange(day: IDayOfWeek): void {\r\n this.removeHighlights();\r\n\r\n if (day.dayOfWeek == this.selectedDays[0]) {\r\n return;\r\n }\r\n\r\n if (day.dayOfWeek > this.selectedDays[0]) {\r\n\r\n this.dayOfWeekMap.forEach(dow => {\r\n if (dow.dayOfWeek < day.dayOfWeek && dow.dayOfWeek > this.selectedDays[0]) {\r\n dow.highlighted = true;\r\n }\r\n })\r\n\r\n return;\r\n }\r\n\r\n this.dayOfWeekMap.forEach(dow => {\r\n if (dow.dayOfWeek < day.dayOfWeek || dow.dayOfWeek > this.selectedDays[0]) {\r\n dow.highlighted = true;\r\n }\r\n })\r\n\r\n }\r\n\r\n private setRange(clickedDay: IDayOfWeek) {\r\n if (clickedDay.dayOfWeek === this.selectedDays[0]) {\r\n return;\r\n }\r\n\r\n this.dayOfWeekMap.find(day => day.dayOfWeek === this.selectedDays[0]).firstInRange = true;\r\n clickedDay.endInRange = true;\r\n\r\n this.dayOfWeekMap.forEach((dow) => {\r\n if (clickedDay.dayOfWeek > this.selectedDays[0]) {\r\n dow.selected = dow.dayOfWeek <= clickedDay.dayOfWeek && dow.dayOfWeek >= this.selectedDays[0];\r\n return;\r\n }\r\n dow.selected = dow.dayOfWeek <= clickedDay.dayOfWeek || dow.dayOfWeek >= this.selectedDays[0];\r\n });\r\n\r\n this.onSelectionChanged();\r\n }\r\n\r\n private selectSingleDay(day: IDayOfWeek, resetSelection: boolean = false): void {\r\n resetSelection && this.resetSelection();\r\n this.selectedDays = [];\r\n\r\n day.selected = true;\r\n this.onSelectionChanged();\r\n }\r\n\r\n private createDayOfWeekMap() {\r\n this.dayOfWeekMap = [];\r\n\r\n const iterations = 7;\r\n\r\n for (var i = 0; i < iterations; i++) {\r\n const dayIndex = i < 7 ? i : i - 7;\r\n\r\n var translation = this.getTranslatedDayOfWeek(dayIndex);\r\n\r\n var dayOfWeek: IDayOfWeek = {\r\n dayOfWeek: dayIndex,\r\n firstLetter: translation[0],\r\n translation: translation\r\n };\r\n\r\n this.dayOfWeekMap.push(dayOfWeek);\r\n }\r\n\r\n // If Monday is first, then shift sunday to back of array (note this logic needs to be added to preference)\r\n var sunday = this.dayOfWeekMap.shift();\r\n this.dayOfWeekMap.push(sunday);\r\n }\r\n\r\n private getTranslatedDayOfWeek(dayOfWeek: DayOfWeek): string {\r\n\r\n var today = new Date();\r\n while (today.getDay() != dayOfWeek) {\r\n today.setDate(today.getDate() - 1);\r\n }\r\n\r\n\r\n const locale = localStorage.getItem('userSelectedLanguageCode');\r\n\r\n return today.toLocaleDateString(locale, { weekday: \"long\" });\r\n }\r\n\r\n private enableWeekdays() {\r\n this.enableDay(DayOfWeek.Monday);\r\n this.enableDay(DayOfWeek.Tuesday);\r\n this.enableDay(DayOfWeek.Wednesday);\r\n this.enableDay(DayOfWeek.Thursday);\r\n this.enableDay(DayOfWeek.Friday);\r\n }\r\n\r\n private enableWeekends() {\r\n this.enableDay(DayOfWeek.Saturday);\r\n this.enableDay(DayOfWeek.Sunday);\r\n }\r\n\r\n private enableDay(dayOfWeek: DayOfWeek) {\r\n var day = this.dayOfWeekMap.find(d => d.dayOfWeek == dayOfWeek);\r\n day.selected = true;\r\n }\r\n\r\n private onSelectionChanged() {\r\n let selectedDays: DayOfWeek[] = [];\r\n\r\n if (this.range && this.selectedDays.length != 0) {\r\n selectedDays = this.getSelectedDaysRange();\r\n this.selectedDaysChange.emit(selectedDays);\r\n return;\r\n }\r\n\r\n this.dayOfWeekMap.forEach((d, i) => {\r\n if (d.selected) {\r\n selectedDays.push(d.dayOfWeek);\r\n }\r\n });\r\n\r\n this.selectedDaysChange.emit(selectedDays);\r\n }\r\n\r\n private getSelectedDaysRange(): number[] {\r\n // Ensure range is returned in the correct order i.e. [Sat, Sun, Mon] instead of [Mon, Sat, Sun]\r\n\r\n let selectedRange: number[] = [];\r\n\r\n const firstDayInRange = this.dayOfWeekMap.find(day => day.firstInRange);\r\n\r\n if (!firstDayInRange) {\r\n return;\r\n }\r\n\r\n selectedRange.push(firstDayInRange.dayOfWeek);\r\n\r\n for (let i = firstDayInRange.dayOfWeek; i < this.dayOfWeekMap.length; i++) {\r\n if (this.dayOfWeekMap[i].selected) {\r\n\r\n if (this.dayOfWeekMap[i].dayOfWeek == 0 && selectedRange.includes(0)) {\r\n // Skip if Sunday already exists in array otherwise it will be added twice due to having a dayOfWeek of 0 and being at the end of the dayOfWeekMap array\r\n continue;\r\n }\r\n\r\n selectedRange.push(this.dayOfWeekMap[i].dayOfWeek);\r\n }\r\n }\r\n\r\n if (firstDayInRange.dayOfWeek != 0) {\r\n for (let i = 0; i < firstDayInRange.dayOfWeek - 1; i++) {\r\n if (this.dayOfWeekMap[i].selected) {\r\n selectedRange.push(this.dayOfWeekMap[i].dayOfWeek);\r\n }\r\n }\r\n\r\n }\r\n\r\n return selectedRange;\r\n }\r\n\r\n private resetSelection() {\r\n this.dayOfWeekMap.forEach(d => {\r\n d.selected = false;\r\n d.firstInRange = false;\r\n d.endInRange = false;\r\n });\r\n\r\n this.onSelectionChanged();\r\n }\r\n\r\n}\r\n","import { Component, Input, OnChanges, SimpleChanges } from \"@angular/core\";\r\nimport { IDriver } from \"@interfaces/IDriver\";\r\nimport { DriverService } from \"@services/driver.service\";\r\nimport \"./driver-name.component.scss\";\r\n\r\n@Component({\r\n selector: \"driver-name\",\r\n template: require(\"./driver-name.component.html\")\r\n})\r\nexport class DriverNameComponent implements OnChanges {\r\n @Input() id: number;\r\n @Input() driver: IDriver;\r\n\r\n constructor(private readonly driverService: DriverService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.getDriver();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['id']) {\r\n this.getDriver();\r\n }\r\n\r\n }\r\n\r\n //--\r\n\r\n private getDriver(): void {\r\n if (!this.id) {\r\n return;\r\n }\r\n\r\n this.driver = this.driverService.getCachedDriver(this.id);\r\n\r\n if (!this.driver) {\r\n this.driverService.getDrivers().then(drivers => {\r\n this.driver = drivers.find(d => d.Id == this.id);\r\n });\r\n }\r\n\r\n }\r\n}\r\n","import { Component, Input, OnChanges, OnInit } from \"@angular/core\";\r\nimport { IDriver } from \"@interfaces/IDriver\";\r\nimport { IUser } from \"@interfaces/IUser\";\r\nimport { AvatarService } from \"@services/avatar.service\";\r\nimport { ConstantsService } from \"@services/constantsService\";\r\nimport { CurrentUserService } from \"@services/currentUser.service\";\r\nimport \"./driverImage.scss\";\r\n\r\n@Component({\r\n selector: 'driver-image',\r\n template: require('./driverImage.html')\r\n})\r\n\r\n// Issues with driver image not loading!!!!\r\n\r\nexport class DriverImageComponent implements OnChanges, OnInit {\r\n @Input() driver: IDriver;\r\n @Input() small: boolean;\r\n\r\n driverImage = \"/assets/images/avatars/profile.jpg\";\r\n currentUser: IUser;\r\n apiUrl: string;\r\n\r\n constructor(\r\n private currentUserService: CurrentUserService,\r\n private avatarService: AvatarService,\r\n private constantService: ConstantsService) { }\r\n\r\n ngOnInit() {\r\n this.initialise();\r\n }\r\n\r\n ngOnChanges() {\r\n this.updateDriverImage();\r\n }\r\n\r\n // ---\r\n\r\n private updateDriverImage() {\r\n this.driverImage = \"/assets/images/avatars/profile.jpg\";\r\n\r\n if (this.driver && this.driver.Id && this.driver.Id !== -1 && this.driver.HasImage) {\r\n this.driverImage = `${this.apiUrl}/api/drivers/${this.currentUser?.CurrentAccountUserMapping.AccountId}-${this.driver.Id}/image` + '?' + this.driver.Updated;\r\n }\r\n else {\r\n var driverNameToUse = \"?\";\r\n if (this.driver && this.driver.Name && this.driver.Id > 0) {\r\n driverNameToUse = this.driver.Name;\r\n }\r\n\r\n this.avatarService\r\n .getAvatar(driverNameToUse, true, this.small ? 18 : 54)\r\n .then(imageUrl => {\r\n this.driverImage = imageUrl;\r\n });;\r\n }\r\n }\r\n\r\n private initialise() {\r\n this.currentUserService.getCurrentUser().then(currentUser => {\r\n this.currentUser = currentUser;\r\n this.apiUrl = this.constantService.getApiUrl();\r\n\r\n this.updateDriverImage();\r\n });\r\n }\r\n}\r\n\r\n//import * as angular from \"angular\";\r\n\r\n//import { AvatarService } from \"@services/avatar.service\";\r\n//import { IRunBlockRootScope } from \"@interfaces/IRunBlockRootScope\";\r\n//import { IDriver } from \"@interfaces/IDriver\";\r\n\r\n//import \"./driverImage.scss\";\r\n\r\n//interface IDriverImageBindings {\r\n// driver: IDriver;\r\n// small: boolean;\r\n//}\r\n\r\n//class DriverImageComponentController implements angular.IComponentController, IDriverImageBindings {\r\n\r\n// driver: IDriver;\r\n// small: boolean;\r\n// driverImage = \"/assets/images/avatars/profile.jpg\";\r\n\r\n// static $inject = [\"$rootScope\", \"avatarService\", \"apiUrl\"];\r\n\r\n// constructor(\r\n// private readonly $rootScope: IRunBlockRootScope,\r\n// private readonly avatarService: AvatarService,\r\n// private readonly apiUrl: string) {\r\n// }\r\n\r\n// $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n// if (onChangesObj[\"driver\"]) {\r\n// this.updateDriverImage();\r\n// }\r\n// }\r\n\r\n// private updateDriverImage() {\r\n// this.driverImage = \"/assets/images/avatars/profile.jpg\";\r\n\r\n// if (this.driver && this.driver.Id && this.driver.Id !== -1 && this.driver.HasImage) {\r\n// this.driverImage = `${this.apiUrl}/api/drivers/${this.$rootScope.currentUser.AccountId}-${this.driver.Id}/image`;\r\n// }\r\n// else {\r\n// var driverNameToUse = \"?\";\r\n// if (this.driver && this.driver.Name && this.driver.Id > 0) {\r\n// driverNameToUse = this.driver.Name;\r\n// }\r\n\r\n// this.avatarService\r\n// .getAvatar(driverNameToUse, true, this.small ? 18 : 54)\r\n// .then(imageUrl => {\r\n// this.driverImage = imageUrl;\r\n// });;\r\n// }\r\n// }\r\n//}\r\n\r\n//export class DriverImageComponent implements angular.IComponentOptions {\r\n// bindings: any;\r\n// controller: any;\r\n// template: string;\r\n\r\n// constructor() {\r\n// this.bindings = {\r\n// driver: \"<\",\r\n// small: \"<\"\r\n// };\r\n\r\n// this.controller = DriverImageComponentController;\r\n// this.template = `
`;\r\n// }\r\n//}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { Observable, Subject } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class VideoStreamService {\r\n\r\n private streamResetTriggerSubject: Subject = new Subject();\r\n streamResetTrigger: Observable = this.streamResetTriggerSubject.asObservable();\r\n constructor() { }\r\n\r\n resetStreamTimeout(): void {\r\n this.streamResetTriggerSubject.next();\r\n }\r\n}\r\n","import { Component } from \"@angular/core\";\r\nimport { FullScreenService } from \"@services/fullscreen.service\";\r\nimport \"./fullScreenButton.scss\";\r\n\r\n@Component({\r\n selector: 'full-screen-button',\r\n template: require('./fullScreenButton.html')\r\n})\r\nexport class FullScreenButtonComponent {\r\n isFullScreen: boolean = false;\r\n\r\n constructor(private fullScreenService: FullScreenService) { }\r\n\r\n toggleFullScreen(event: any) {\r\n const elementToToggle = event.target.parentNode.parentNode;\r\n this.isFullScreen = this.fullScreenService.toggle(elementToToggle);\r\n }\r\n}\r\n","import { animate, style, transition, trigger } from \"@angular/animations\";\r\nimport { ChangeDetectorRef, Component, HostBinding, Injectable, Input, OnChanges, OnInit, SimpleChanges } from \"@angular/core\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport \"./loadingIndicator.component.scss\";\r\n\r\nexport const defaultTransitionTime = \"0.3s\";\r\n\r\nconst styleFromState = style({ \"opacity\": '0', \"pointer-events\": \"none\" });\r\nconst styletoState = style({ \"opacity\": '1', \"pointer-events\": \"all\" });\r\n\r\nexport const fadeInOut = trigger(\"animFadeInOut\", [\r\n transition(':enter', [\r\n styleFromState,\r\n animate(defaultTransitionTime, styletoState)\r\n ]),\r\n transition(':leave', [\r\n styletoState,\r\n animate(defaultTransitionTime, styleFromState)\r\n ])\r\n]);\r\n\r\n@Component({\r\n selector: \"loading-indicator\",\r\n template: `
\r\n
\r\n
{{text}}
\r\n
`,\r\n animations: [fadeInOut]\r\n})\r\nexport class LoadingIndicatorComponent implements OnInit, OnChanges {\r\n @HostBinding('@animFadeInOut') animateComponent() {\r\n return \":enter\";\r\n }\r\n\r\n @Input() text: string;\r\n @Input() error: boolean;\r\n @Input() modal: boolean;\r\n @Input() supressSlowMessage: boolean;\r\n\r\n // ---\r\n\r\n slow: boolean;\r\n showSpinner: boolean;\r\n slowTimeout: number;\r\n\r\n // ---\r\n\r\n constructor(\r\n private cd: ChangeDetectorRef,\r\n private translationService: TranslationService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.toggleSpinnerTimeout();\r\n this.toggleSlowTimeout();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes[\"text\"]) {\r\n this.text = this.text || this.translationService.t(\"loadingIndicator.stillWorking\");\r\n }\r\n\r\n if (changes[\"error\"] && this.error) {\r\n this.text = this.translationService.t(\"loadingIndicator.error\");\r\n }\r\n }\r\n\r\n // --\r\n\r\n private toggleSpinnerTimeout() {\r\n this.showSpinner = false;\r\n\r\n setTimeout(() => {\r\n this.showSpinner = true;\r\n this.cd.markForCheck();\r\n }, 150);\r\n }\r\n\r\n private toggleSlowTimeout() {\r\n if (this.supressSlowMessage) {\r\n return;\r\n }\r\n\r\n if (!this.slowTimeout) {\r\n this.slowTimeout = window.setTimeout(() => { this.slow = true; }, 5000);\r\n }\r\n else {\r\n if (this.slowTimeout) {\r\n window.clearTimeout(this.slowTimeout);\r\n this.slowTimeout = null;\r\n }\r\n\r\n this.slow = false;\r\n }\r\n }\r\n}\r\n","import { EventEmitter, Output } from \"@angular/core\";\r\nimport { Component, Input, OnChanges, SimpleChanges } from \"@angular/core\";\r\nimport \"./navCount.component.scss\";\r\n\r\n@Component({\r\n selector: \"nav-count\",\r\n template: `{{suffix}}`\r\n})\r\nexport class NavCountComponent implements OnChanges {\r\n // Bindings\r\n\r\n @Input() count: number;\r\n @Input() suffix: string;\r\n\r\n @Output() onFinishedAnimation = new EventEmitter();\r\n\r\n // Internal\r\n\r\n updated = false;\r\n\r\n constructor() { }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n this.truncateLargeCount();\r\n\r\n if (changes[\"count\"].firstChange) {\r\n return;\r\n }\r\n\r\n this.updated = true;\r\n\r\n setTimeout(() => { this.updated = false; }, 5_000);\r\n\r\n setTimeout(() => { this.onFinishedAnimation.emit(); }, 300);\r\n }\r\n\r\n //--\r\n\r\n private truncateLargeCount(): void {\r\n if (!this.count) {\r\n return;\r\n }\r\n\r\n if (this.count > 9999) {\r\n this.count = Math.round(this.count / 1000);\r\n\r\n if (this.suffix?.indexOf(\"k \") == 0) {\r\n return;\r\n }\r\n\r\n this.suffix = \"k \" + (this.suffix || \"\");\r\n }\r\n }\r\n}\r\n","\r\nexport enum UnitStatus {\r\n Responding,\r\n NoResponseWithin48Hours\r\n}\n","import { HttpClient, HttpErrorResponse } from \"@angular/common/http\";\r\nimport { Component, HostBinding, HostListener, Input, OnDestroy, OnInit } from \"@angular/core\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { Subscription, timer } from \"rxjs\";\r\nimport { catchError, map, switchMap } from \"rxjs/operators\";\r\nimport \"./site-status-indicator.component.scss\";\r\n\r\nexport interface IBetterUptimeResponse {\r\n id: string;\r\n type: string;\r\n attributes: IBetterUptimeResponseAttributes;\r\n}\r\n\r\nexport interface IBetterUptimeResponseAttributes {\r\n aggregate_state: BetterUptimeStatus;\r\n announcement: string;\r\n}\r\n\r\ndeclare type BetterUptimeStatus = \"operational\" | \"degraded\" | \"downtime\";\r\n\r\n@Component({\r\n selector: \"site-status-indicator\",\r\n template: require(\"./site-status-indicator.component.html\")\r\n})\r\nexport class SiteStatusIndicatorComponent implements OnInit, OnDestroy {\r\n\r\n @Input() darkBackground: boolean;\r\n @HostBinding(\"class\") class: string;\r\n @HostListener(\"click\") onClick() { window.open(this.statusPageUrl, '_blank').focus(); }\r\n\r\n // ---\r\n\r\n status: BetterUptimeStatus;\r\n statusPageUrl = \"https://status.verilocation.com/\";\r\n statusMessage: string;\r\n statusIcon: string;\r\n announcement: string;\r\n\r\n subscriptions = new Subscription();\r\n\r\n constructor(private http: HttpClient,\r\n private readonly translationService: TranslationService) {\r\n }\r\n\r\n ngOnInit() {\r\n this.startMonitoring();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.subscriptions?.unsubscribe();\r\n }\r\n\r\n // ---\r\n\r\n private startMonitoring() {\r\n\r\n // handle data and handle error\r\n const dataObservable = this.getStatus()\r\n .pipe(map(data => this.processStatusUpdate(data)))\r\n .pipe(catchError(error => this.handleError(error)));\r\n\r\n // switch to new stream, separating the error handling on data observable\r\n const intervalObservable = timer(0, 1 * 60 * 1000)\r\n .pipe(switchMap(() => dataObservable));\r\n\r\n this.subscriptions.add(intervalObservable.subscribe());\r\n }\r\n\r\n private getStatus() {\r\n return this.http.get(\"/api/servicestatus/new\");\r\n }\r\n\r\n private processStatusUpdate(update: IBetterUptimeResponse) {\r\n this.updateStatus(update.attributes.aggregate_state);\r\n\r\n this.announcement = update.attributes.announcement;\r\n }\r\n\r\n private updateStatus(status: BetterUptimeStatus) {\r\n this.status = status;\r\n\r\n switch (this.status) {\r\n\r\n case \"operational\":\r\n this.statusMessage = this.translationService.t(\"SiteStatus.AllOnline\");\r\n this.statusIcon = \"check_circle\";\r\n break;\r\n\r\n case \"degraded\":\r\n this.statusMessage = this.translationService.t(\"SiteStatus.Issues\");\r\n this.statusIcon = \"warning\";\r\n break;\r\n\r\n case \"downtime\":\r\n this.statusMessage = this.translationService.t(\"SiteStatus.Down\");\r\n this.statusIcon = \"error\";\r\n }\r\n\r\n this.class = status;\r\n if (this.darkBackground) {\r\n this.class += \" dark-background\";\r\n }\r\n }\r\n\r\n private handleError(err: HttpErrorResponse): any[] {\r\n this.updateStatus(\"downtime\");\r\n\r\n return [];\r\n }\r\n}\r\n","import { Component, Input, OnChanges, SimpleChanges } from \"@angular/core\";\r\nimport { DriverTachoMode, TachoService } from \"@services/tacho.service\";\r\nimport \"./tachoMode.scss\";\r\n\r\ninterface ITachoModeComponentBindings {\r\n tachoMode: DriverTachoMode;\r\n}\r\n\r\n@Component({\r\n selector: \"tacho-mode\",\r\n template: ``\r\n})\r\nexport class TachoModeComponent implements OnChanges, ITachoModeComponentBindings {\r\n @Input() tachoMode: DriverTachoMode;\r\n tachoImageUrl: string;\r\n\r\n constructor(private tachoService: TachoService) { }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (!changes) {\r\n return;\r\n }\r\n\r\n this.updateModeInformation();\r\n }\r\n\r\n updateModeInformation() {\r\n if (this.tachoMode !== null) {\r\n this.tachoImageUrl = this.tachoService.getModeImage(this.tachoMode);\r\n }\r\n else {\r\n console.warn(\"No tacho mode found\", this.tachoMode);\r\n }\r\n }\r\n}\r\n\r\n@Component({\r\n selector: \"tacho-mode-status\",\r\n template: `{{status}}`\r\n})\r\nexport class TachoModeStatusComponent implements OnChanges, ITachoModeComponentBindings {\r\n @Input() tachoMode: DriverTachoMode;\r\n status: string;\r\n\r\n constructor(private tachoService: TachoService) { }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (!changes) {\r\n return;\r\n }\r\n\r\n this.updateModeInformation();\r\n }\r\n\r\n updateModeInformation() {\r\n if (this.tachoMode !== null) {\r\n this.status = this.tachoService.getModeMessage(this.tachoMode);\r\n }\r\n else {\r\n console.warn(\"No tacho mode found\", this.tachoMode);\r\n }\r\n }\r\n}\r\n","\r\nexport enum DriverDecisionSupportType {\r\n DigiDL = 0,\r\n KLine = 1\r\n}\n","import { Component, Input, OnInit } from \"@angular/core\";\r\nimport \"./trendArrow.scss\";\r\n\r\n@Component({\r\n selector: 'trend-arrow',\r\n template: require('./trendArrow.html')\r\n})\r\n\r\nexport class TrendArrowComponent {\r\n @Input() value: any;\r\n\r\n constructor() { }\r\n}\r\n","import { Component, Input, OnChanges } from \"@angular/core\";\r\nimport { UnitConversionService, UnitConversionType } from \"@services/unitConversion.service\";\r\n\r\n@Component({\r\n selector: 'unit-conversion-suffix',\r\n template: '{{outputValue}}'\r\n})\r\nexport class UnitConversionSuffixComponent implements OnChanges {\r\n\r\n @Input() distance: boolean;\r\n @Input() speed: boolean;\r\n @Input() fuel: boolean;\r\n @Input() temperature: boolean;\r\n @Input() capacity: boolean;\r\n @Input() currency: boolean;\r\n\r\n @Input() conversionType: UnitConversionType;\r\n @Input() value: number;\r\n\r\n // ---\r\n\r\n outputValue: string;\r\n conversion: string;\r\n\r\n constructor(private unitConversionService: UnitConversionService) {\r\n }\r\n\r\n ngOnChanges() {\r\n this.checkAndSetConversionType();\r\n this.createUOMString();\r\n this.setOutputValue();\r\n }\r\n\r\n private checkAndSetConversionType() {\r\n if (this.conversionType != null) {\r\n return;\r\n }\r\n\r\n this.conversionType = UnitConversionType.Distance;\r\n\r\n if (this.speed) {\r\n this.conversionType = UnitConversionType.Speed;\r\n }\r\n else if (this.fuel) {\r\n this.conversionType = UnitConversionType.FuelEfficiency;\r\n }\r\n else if (this.capacity) {\r\n this.conversionType = UnitConversionType.FuelCapacity;\r\n }\r\n else if (this.temperature) {\r\n this.conversionType = UnitConversionType.Temperature;\r\n }\r\n else if (this.currency) {\r\n this.conversionType = UnitConversionType.Currency;\r\n }\r\n }\r\n\r\n private setOutputValue() {\r\n if (this.value === undefined) {\r\n this.outputValue = this.conversion;\r\n return;\r\n }\r\n\r\n var valueString = this.value ? this.value.toLocaleString() : \"\";\r\n\r\n if (this.conversionType == UnitConversionType.Currency) {\r\n\r\n this.outputValue = this.conversion + valueString;\r\n }\r\n else {\r\n this.outputValue = valueString + \" \" + this.conversion;\r\n }\r\n }\r\n\r\n private createUOMString() {\r\n this.conversion = this.unitConversionService.getConversionLabel(this.conversionType);\r\n }\r\n}\r\n","import { Component, ElementRef, OnDestroy, OnInit } from \"@angular/core\";\r\nimport { ResponsiveService } from \"@app/services/responsive.service\";\r\nimport { CanvasService } from \"@services/canvas.service\";\r\nimport * as angular from \"angular\";\r\nimport { Subscription } from \"rxjs\";\r\nimport \"./vector-dots.component.scss\";\r\n\r\ninterface IStar {\r\n x: number;\r\n y: number;\r\n radius: number;\r\n vx: number;\r\n vy: number;\r\n}\r\n@Component({\r\n selector: 'vector-dots',\r\n template: \"\"\r\n})\r\nexport class VectorDotsComponent implements OnInit, OnDestroy {\r\n canvas: HTMLCanvasElement;\r\n ctx: CanvasRenderingContext2D;\r\n stop: boolean;\r\n\r\n stars: IStar[];\r\n FPS = 60;\r\n numStars = navigator.hardwareConcurrency * 2;\r\n mouse = { x: 0, y: 0 }\r\n\r\n width: number;\r\n height: number;\r\n\r\n private subscriptons = new Subscription();\r\n \r\n constructor(\r\n private readonly el: ElementRef,\r\n private readonly canvasService: CanvasService,\r\n private readonly responsiveService: ResponsiveService) {\r\n }\r\n\r\n ngOnInit() {\r\n this.createCanvas();\r\n this.createStars();\r\n this.animateFrame();\r\n\r\n this.subscriptons.add(this.responsiveService.currentWindowWidth$.subscribe(() => { this.createCanvas(); }));\r\n }\r\n\r\n ngOnDestroy() {\r\n this.stop = true;\r\n this.subscriptons.unsubscribe();\r\n\r\n this.canvasService.destroyCachedImageCanvases();\r\n }\r\n\r\n // ---\r\n\r\n private createCanvas() {\r\n\r\n this.canvas = this.el.nativeElement.querySelector('canvas') as HTMLCanvasElement;\r\n this.ctx = this.canvas.getContext(\"2d\");\r\n\r\n const rect = this.el.nativeElement.getBoundingClientRect();\r\n this.width = rect.width || this.canvas.width;\r\n this.height = rect.height || this.canvas.height;\r\n\r\n this.canvas.width = this.width;\r\n this.canvas.height = this.height;\r\n }\r\n\r\n private animateFrame() {\r\n if (this.stop) {\r\n return;\r\n }\r\n\r\n window.requestAnimationFrame(() => {\r\n performance.mark(\"vectorDotsAnimateFrame\");\r\n\r\n this.draw();\r\n this.update()\r\n\r\n performance.measure(\"vectorDotsAnimateFrame\");\r\n\r\n this.animateFrame();\r\n });\r\n }\r\n\r\n private draw(draw = true) {\r\n\r\n this.ctx.clearRect(0, 0, this.width, this.height);\r\n\r\n this.ctx.globalCompositeOperation = \"lighter\";\r\n\r\n for (var i = 0, x = this.stars.length; i < x; i++) {\r\n var s = this.stars[i];\r\n\r\n this.ctx.fillStyle = \"#fff\";\r\n this.ctx.beginPath();\r\n this.ctx.arc(s.x, s.y, s.radius, 0, 2 * Math.PI);\r\n this.ctx.fill();\r\n this.ctx.fillStyle = 'black';\r\n this.ctx.stroke();\r\n }\r\n\r\n this.ctx.beginPath();\r\n for (var i = 0, x = this.stars.length; i < x; i++) {\r\n var starI = this.stars[i];\r\n this.ctx.moveTo(starI.x, starI.y);\r\n\r\n if (this.distance(this.mouse, starI) < 150) {\r\n this.ctx.lineTo(this.mouse.x, this.mouse.y);\r\n }\r\n\r\n for (var j = 0, x = this.stars.length; j < x; j++) {\r\n var starII = this.stars[j];\r\n\r\n if (this.distance(starI, starII) < 150) {\r\n //ctx.globalAlpha = (1 / 150 * distance(starI, starII).toFixed(1));\r\n this.ctx.lineTo(starII.x, starII.y);\r\n }\r\n }\r\n }\r\n\r\n this.ctx.lineWidth = 0.05;\r\n this.ctx.strokeStyle = 'white';\r\n this.ctx.stroke();\r\n }\r\n\r\n private createStars(): IStar[] {\r\n this.stars = [];\r\n\r\n for (var i = 0; i < this.numStars; i++) {\r\n var velocity = 50;\r\n velocity = 25;\r\n\r\n this.stars.push({\r\n x: Math.random() * this.width,\r\n y: Math.random() * this.height,\r\n radius: Math.random() * 1 + 1,\r\n vx: Math.floor(Math.random() * velocity) - (velocity / 2),\r\n vy: Math.floor(Math.random() * velocity) - (velocity / 2)\r\n });\r\n }\r\n\r\n return this.stars;\r\n }\r\n\r\n private distance(point1, point2) {\r\n var xs = 0;\r\n var ys = 0;\r\n\r\n xs = point2.x - point1.x;\r\n xs = xs * xs;\r\n\r\n ys = point2.y - point1.y;\r\n ys = ys * ys;\r\n\r\n return Math.sqrt(xs + ys);\r\n }\r\n\r\n private update() {\r\n\r\n for (var i = 0, x = this.stars.length; i < x; i++) {\r\n var s = this.stars[i];\r\n\r\n s.x += s.vx / this.FPS;\r\n s.y += s.vy / this.FPS;\r\n\r\n if (s.x < 0 || s.x > this.width) s.vx = -s.vx;\r\n if (s.y < 0 || s.y > this.height) s.vy = -s.vy;\r\n }\r\n }\r\n}\r\n\r\n//export class VectorDotsComponent implements angular.IComponentOptions {\r\n// bindings: any;\r\n// controller: any;\r\n// template: string;\r\n\r\n// constructor() {\r\n// this.bindings = {\r\n// };\r\n\r\n// this.controller = Controller;\r\n// this.template = \"\";\r\n// }\r\n//}\r\n","import { Component, ElementRef, Input, OnChanges, Renderer2 } from \"@angular/core\";\r\nimport { IPlot } from \"@interfaces/IPlot\";\r\nimport { CanvasService } from \"@services/canvas.service\";\r\nimport { VeriMarkerService } from \"@services/veriMarker.service\";\r\nimport \"./veriMarker.scss\";\r\n\r\n@Component({\r\n selector: 'veri-marker',\r\n template: ''\r\n})\r\nexport class VeriMarkerComponent implements OnChanges {\r\n @Input() plot: IPlot;\r\n\r\n markerImage: string;\r\n canvas: HTMLCanvasElement;\r\n\r\n constructor(\r\n private element: ElementRef,\r\n private renderer: Renderer2,\r\n private readonly canvasService: CanvasService,\r\n private readonly veriMarkerService: VeriMarkerService) { }\r\n\r\n ngOnChanges() {\r\n this.updateImage();\r\n }\r\n\r\n private createCanvas() {\r\n if (this.canvas) {\r\n return;\r\n }\r\n\r\n var markerOptions = this.veriMarkerService.createVeriMarkerOptions(this.plot);\r\n var size = this.veriMarkerService.getMarkerSize(markerOptions);\r\n\r\n this.canvas = this.canvasService.createHiDPICanvas(size, size);\r\n this.renderer.appendChild(this.element.nativeElement, this.canvas);\r\n }\r\n\r\n private updateImage() {\r\n this.createCanvas();\r\n\r\n var markerOptions = this.veriMarkerService.createVeriMarkerOptions(this.plot);\r\n this.veriMarkerService.generateMarkerImageCanvas(markerOptions, this.canvas);\r\n }\r\n}\r\n","import { Component, HostBinding, HostListener, Input } from \"@angular/core\";\r\nimport \"./vertical-collapsable-divider.component.scss\";\r\n\r\n@Component({\r\n selector: \"vertical-collapsable-divider\",\r\n template: require(\"./vertical-collapsable-divider.component.html\")\r\n})\r\nexport class VerticalCollapsableDivider {\r\n @Input() @HostBinding(\"class.collapsed\") collapsed: boolean;\r\n\r\n @HostListener('click') myClick() {\r\n this.collapsed = !this.collapsed;\r\n }\r\n}\r\n","\r\nimport { Component, Input, OnInit } from '@angular/core';\r\nimport { NavigationService } from '@services/navigation.service';\r\nimport { ITranslationLocale, TranslationService } from '@services/translation.service';\r\nimport './languageSelector.component.scss';\r\n\r\n@Component({\r\n selector: \"language-selector\",\r\n template: require('./languageSelector.component.html')\r\n})\r\nexport class LanguageSelectorComponent implements OnInit {\r\n @Input() darkText: boolean = false;\r\n\r\n // ---\r\n\r\n locales: ITranslationLocale[] = [];\r\n selectedLocale: ITranslationLocale;\r\n\r\n constructor(\r\n private readonly navigationService: NavigationService,\r\n private readonly translationService: TranslationService) {\r\n }\r\n\r\n ngOnInit() {\r\n this.loadCountries().then(() => {\r\n this.getSelectedLocale();\r\n });\r\n }\r\n\r\n setLocale(localeCode: string) {\r\n const foundLocale = this.locales.find(locale => locale.Locale === localeCode);\r\n\r\n if (!foundLocale) {\r\n return;\r\n }\r\n\r\n localStorage.setItem('userSelectedLanguageCode', foundLocale.Locale);\r\n\r\n this.navigationService.reloadAll();\r\n }\r\n\r\n getSelectedLocale() {\r\n const foundUserLanguageCode = localStorage.getItem('userSelectedLanguageCode');\r\n\r\n this.selectedLocale = this.locales.find(locale => {\r\n return (foundUserLanguageCode && foundUserLanguageCode !== \"undefined\")\r\n ? locale.Locale == foundUserLanguageCode\r\n : locale.Locale == \"en\"\r\n });\r\n\r\n // Default to english\r\n if (!this.selectedLocale) {\r\n this.selectedLocale = this.locales.find(locale => locale.Locale == \"en\");\r\n }\r\n\r\n // Occasionally we cannot find english, so just use any language\r\n if (!this.selectedLocale && this.locales.length) {\r\n this.selectedLocale = this.locales[0];\r\n }\r\n }\r\n\r\n // ---------------------------------------------\r\n\r\n private loadCountries(): angular.IPromise {\r\n return this.translationService.getListOfLocales().then(locales => {\r\n this.locales = locales;\r\n this.selectedLocale = locales.find(l => l.Locale == \"en\");\r\n });\r\n }\r\n}\r\n","import { Component, EventEmitter, HostBinding, Injector, Input, OnInit, Output } from '@angular/core';\r\nimport { AbstractControl, ControlValueAccessor, NgControl, ValidationErrors, Validator } from \"@angular/forms\";\r\nimport { animZoomInOut } from \"@animations/zoom-in-out.anim\";\r\nimport { ComponentUtility } from '@app/class/ComponentUtility';\r\nimport { noop } from \"angular\";\r\nimport \"./checkbox.component.scss\";\r\n\r\n@Component({\r\n selector: 'v-checkbox',\r\n template: require('./checkbox.component.html'),\r\n animations: [animZoomInOut],\r\n providers: [\r\n ComponentUtility.createValueAccessorProvider(CheckboxComponent),\r\n ComponentUtility.createValidatorProvider(CheckboxComponent)\r\n ]\r\n})\r\nexport class CheckboxComponent implements OnInit, ControlValueAccessor, Validator {\r\n\r\n @Input() checkedValue: any;\r\n @Input() icon: string;\r\n @Input() checked: boolean;\r\n\r\n @HostBinding(\"class.disabled\") @Input() disabled: boolean;\r\n\r\n @Output() onChecked = new EventEmitter();\r\n\r\n // ---\r\n\r\n //Placeholders for the callbacks which are later provided\r\n //by the Control Value Accessor\r\n private onTouchedCallback: () => void = noop;\r\n private onChangeCallback: (_: any) => void = noop;\r\n\r\n //get accessor\r\n get value(): any {\r\n return this.checkedValue;\r\n };\r\n\r\n //set accessor including call the onchange callback\r\n set value(v: any) {\r\n if (v !== this.checkedValue) {\r\n this.checkedValue = v;\r\n this.onChangeCallback(v);\r\n }\r\n }\r\n\r\n //Set touched on blur\r\n onBlur() {\r\n this.onTouchedCallback();\r\n }\r\n\r\n // --- Control Value Accessor\r\n\r\n onChange: (value: any) => void;\r\n onTouched: () => void;\r\n control: NgControl;\r\n\r\n registerOnChange(callback: (value: any) => void): void {\r\n this.onChange = callback;\r\n }\r\n\r\n registerOnTouched(callback: () => void): void {\r\n this.onTouched = callback;\r\n }\r\n\r\n writeValue(value: string): void {\r\n this.checkedValue = value;\r\n }\r\n\r\n setDisabledState(state: boolean) {\r\n this.disabled = state;\r\n }\r\n\r\n markAsTouched(): void {\r\n if (!this.onTouched || !this.control || this.control.touched) {\r\n return;\r\n }\r\n\r\n this.onTouched();\r\n }\r\n // Validator\r\n\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n this.control = this.injector.get(NgControl);\r\n\r\n\r\n return null;\r\n }\r\n\r\n constructor(private readonly injector: Injector) { }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n ngOnDestroy(): void {\r\n }\r\n\r\n onModelChange(value: any): void {\r\n this.emitValue();\r\n }\r\n\r\n toggleChecked(): void {\r\n if (this.disabled) {\r\n return;\r\n }\r\n\r\n this.checkedValue = !this.checkedValue;\r\n\r\n this.emitValue();\r\n }\r\n\r\n // ---\r\n\r\n private emitValue(): void {\r\n this.onChecked.emit(this.value);\r\n\r\n if (this.onChange) {\r\n this.onChange(this.value);\r\n }\r\n }\r\n}\r\n","import { Component, HostBinding, Input } from \"@angular/core\";\r\nimport \"./formDetails.component.scss\";\r\n\r\n@Component({\r\n selector: \"form-details\",\r\n template: require(\"./formDetails.component.html\")\r\n})\r\nexport class FormDetailsComponent {\r\n @Input() formTitle: string;\r\n @Input() subtitle: string;\r\n @Input() removeContentPadding: boolean;\r\n @Input() transparent: boolean;\r\n @HostBinding(\"class.disabled\") @Input() disabled: boolean;\r\n\r\n constructor() {\r\n }\r\n}\r\n","import { Component, EventEmitter, Injector, Input, Output } from \"@angular/core\";\r\nimport { AbstractControl, ControlValueAccessor, NgControl, ValidationErrors, Validator, Validators } from \"@angular/forms\";\r\nimport { ComponentUtility } from \"@app/class/ComponentUtility\";\r\nimport './textarea.component.scss';\r\n\r\n@Component({\r\n selector: 'v-textarea',\r\n template: require('./textarea.component.html'),\r\n providers: [\r\n ComponentUtility.createValueAccessorProvider(TextareaComponent),\r\n ComponentUtility.createValidatorProvider(TextareaComponent)\r\n ]\r\n})\r\nexport class TextareaComponent implements ControlValueAccessor, Validator {\r\n @Input() label: string;\r\n @Input() value: string;\r\n\r\n @Input() rows: number = 4;\r\n @Input() disabled: boolean;\r\n @Input() placeholder: string = '';\r\n @Input() maxLength: number;\r\n @Input() name: string;\r\n @Input() readonly: boolean;\r\n @Input() required: boolean;\r\n\r\n @Output() valueChange = new EventEmitter();\r\n\r\n constructor(\r\n protected readonly injector: Injector\r\n ) { }\r\n\r\n valueChanged(): void {\r\n this.onChange?.(this.value);\r\n this.valueChange.emit(this.value);\r\n }\r\n\r\n // --- Control Value Accessor\r\n\r\n onChange: (value: any) => void;\r\n onTouched: () => void;\r\n control: NgControl;\r\n\r\n registerOnChange(callback: (value: any) => void): void {\r\n this.onChange = callback;\r\n }\r\n\r\n registerOnTouched(callback: () => void): void {\r\n this.onTouched = callback;\r\n }\r\n\r\n writeValue(value: string): void {\r\n this.value = value;\r\n }\r\n\r\n setDisabledState(state: boolean) {\r\n this.disabled = state;\r\n }\r\n\r\n markAsTouched(): void {\r\n if (!this.onTouched || !this.control || this.control.touched) {\r\n return;\r\n }\r\n\r\n this.onTouched();\r\n }\r\n\r\n // Validator\r\n\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n this.control = this.injector.get(NgControl);\r\n\r\n this.required = control.hasValidator(Validators.required);\r\n\r\n return null;\r\n }\r\n\r\n // --\r\n}\r\n","import { Component, Injector, Input, OnChanges, OnInit } from \"@angular/core\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { enumNames } from \"src/app/filters/enumNames.filter\";\r\nimport { VSelectComponent } from \"../v-select/v-select.component\";\r\nimport \"../v-select/v-select.component.scss\";\r\n\r\n@Component({\r\n selector: \"v-enum-select\",\r\n template: require(\"../v-select/v-select.component.html\")\r\n})\r\nexport class VEnumSelectComponent extends VSelectComponent implements OnInit, OnChanges {\r\n\r\n @Input() enum: any;\r\n @Input() enumName: string;\r\n\r\n constructor(\r\n protected readonly injector: Injector, protected readonly translationService: TranslationService) {\r\n super(injector, translationService);\r\n }\r\n\r\n ngOnInit() {\r\n this.populateItemsFromEnum();\r\n }\r\n\r\n ngOnChanges() {\r\n this.populateItemsFromEnum();\r\n }\r\n\r\n // ---\r\n\r\n private populateItemsFromEnum() {\r\n this.clearChildren();\r\n\r\n const enumNameFilter = enumNames();\r\n const filteredEnumNames = enumNameFilter(this.enum) as string[];\r\n\r\n filteredEnumNames.forEach(enumName => {\r\n this.registerSelectOption({\r\n label: this.translationService.tEnum(this.enum, this.enumName, this.enum[enumName]),\r\n value: this.enum[enumName]\r\n } as any);\r\n });\r\n }\r\n}\r\n","module.exports = \"
{{icon}} {{ label }}
{{ item?.label }}
\";","import { Component, EventEmitter, Input, OnChanges, Output } from \"@angular/core\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport \"./v-order-buttons.component.scss\";\r\n\r\n\r\n@Component({\r\n selector: 'v-order-buttons',\r\n template: require('./v-order-buttons.component.html')\r\n})\r\nexport class VOrderButtonsComponent implements OnChanges {\r\n\r\n @Input() moveUpDisabled: boolean;\r\n @Input() moveDownDisabled: boolean;\r\n\r\n @Output() moveUp = new EventEmitter(); \r\n @Output() moveDown = new EventEmitter();\r\n\r\n moveUpTooltip: string;\r\n moveDownTooltip: string;\r\n\r\n constructor(private readonly translationService: TranslationService) { }\r\n\r\n ngOnChanges(): void {\r\n this.render();\r\n }\r\n\r\n onClickMoveUp(): void {\r\n if (this.moveUpDisabled) {\r\n return;\r\n }\r\n\r\n this.moveUp.emit();\r\n }\r\n\r\n onClickMoveDown(): void {\r\n if (this.moveDownDisabled) {\r\n return;\r\n }\r\n\r\n this.moveDown.emit();\r\n }\r\n\r\n // ---\r\n\r\n render(): void {\r\n this.moveUpTooltip = (this.moveUpDisabled) ? null : this.translationService.t(\"VOrderButtons.MoveUp\");\r\n this.moveDownTooltip = (this.moveDownDisabled) ? null : this.translationService.t(\"VOrderButtons.MoveDown\");\r\n }\r\n}\r\n","import { AfterViewInit, Component, Input, OnDestroy, OnInit } from \"@angular/core\";\r\nimport { VSelectComponent } from \"../v-select.component\";\r\nimport \"./v-select-option.component.scss\";\r\n\r\n@Component({\r\n selector: \"v-select-option\",\r\n template: require(\"./v-select-option.component.html\")\r\n})\r\nexport class VSelectOptionComponent implements OnInit, OnDestroy {\r\n @Input() label: string;\r\n @Input() value: string;\r\n @Input() icon: string;\r\n @Input() selected = false;\r\n\r\n constructor(private readonly parent: VSelectComponent) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.parent.registerSelectOption(this);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.parent.deregisterSelectOption(this);\r\n }\r\n\r\n // ---\r\n\r\n}\r\n","import { AfterViewInit, Component, ElementRef, EventEmitter, HostListener, Input, OnInit, Output, ViewChild } from \"@angular/core\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport \"./v-slider.component.scss\";\r\n\r\ninterface ISliderHandle {\r\n dragging: boolean;\r\n value: number;\r\n valueIndex: number;\r\n leftPercentage: number;\r\n label?: HTMLElement;\r\n labelTop: number;\r\n maxWidth?: string;\r\n mirrored?: boolean;\r\n hideGrip?: boolean;\r\n}\r\n\r\nexport interface ISliderConfig {\r\n zoneColors: string[];\r\n zoneLabels: string[];\r\n}\r\n\r\n@Component({\r\n selector: \"v-slider\",\r\n template: require('./v-slider.component.html')\r\n})\r\nexport class VSliderComponent implements OnInit, AfterViewInit {\r\n\r\n @Input() values: number[];\r\n @Output() valuesChange = new EventEmitter();\r\n\r\n @Input() showLabels: boolean;\r\n @Input() showMinLabel: boolean;\r\n @Input() showLabelsAsRange: boolean;\r\n @Input() config: ISliderConfig;\r\n\r\n @Input() unit: number | any;\r\n\r\n @Input() min: number = 0;\r\n @Input() max: number = 100;\r\n\r\n @ViewChild(\"sliderRail\", { static: true }) sliderRail: ElementRef;\r\n @ViewChild(\"keyContainer\", { static: false }) keyContainer: ElementRef;\r\n\r\n hasActiveDrags: boolean;\r\n handles: ISliderHandle[];\r\n selectedHandle: ISliderHandle;\r\n totalZones: number = 0;\r\n readonly sliderKeyPrefix = \"v-slider-key-\";\r\n\r\n constructor(private readonly translationService: TranslationService) { }\r\n\r\n ngOnInit(): void {\r\n this.render();\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.updateHandleLabels();\r\n }\r\n\r\n @HostListener(\"document:mouseup\", [\"$event\"])\r\n onAnyMouseUp(event: MouseEvent): void {\r\n\r\n if (!this.hasActiveDrags) {\r\n this.clearSelectHandle();\r\n }\r\n\r\n this.clearAllHandleDragFlags();\r\n }\r\n\r\n @HostListener(\"document:mousemove\", [\"$event\"])\r\n onAnyMouseMove(event: MouseEvent): void {\r\n if (!this.hasActiveDrags) {\r\n return;\r\n }\r\n\r\n this.onHandleMoved(event);\r\n }\r\n\r\n @HostListener(\"document:keyup\", [\"$event\"])\r\n onKeyUp(event: KeyboardEvent): void {\r\n if (!this.selectedHandle || !event.code) {\r\n return;\r\n }\r\n\r\n switch (event.code) {\r\n case \"ArrowRight\": this.moveHandleX(this.selectedHandle, 1);\r\n break;\r\n case \"ArrowLeft\": this.moveHandleX(this.selectedHandle, -1);\r\n break;\r\n default: this.clearSelectHandle();\r\n return;\r\n }\r\n }\r\n\r\n onStartDragHandle(event: MouseEvent, handle: ISliderHandle): void {\r\n handle.dragging = true;\r\n\r\n window.getSelection()?.removeAllRanges();\r\n\r\n this.selectHandle(handle);\r\n this.detectActiveDrags();\r\n }\r\n\r\n onEndDragHandle(event: MouseEvent, handle: ISliderHandle): void {\r\n setTimeout(() => {\r\n handle.dragging = false;\r\n\r\n this.selectHandle(handle);\r\n this.detectActiveDrags();\r\n });\r\n }\r\n\r\n onHandleMoved(event: MouseEvent): void {\r\n if (!this.hasActiveDrags) {\r\n return;\r\n }\r\n\r\n this.getDraggingHandles().forEach(handle => this.processMove(event.clientX, handle));\r\n }\r\n\r\n onHandleClicked(handle: ISliderHandle): void {\r\n this.selectHandle(handle);\r\n }\r\n\r\n moveHandleX(handle: ISliderHandle, x: number): void {\r\n handle.value = Math.max(this.min, Math.min((handle.value += x), this.max));\r\n handle.leftPercentage = this.getLeftPercentageForValue(handle.value);\r\n\r\n this.updateHandleLabels();\r\n this.propagateHandleChanges();\r\n }\r\n\r\n // ---\r\n\r\n private render(): void {\r\n if (!this.values?.length) {\r\n return;\r\n }\r\n\r\n this.generateHandles();\r\n this.generateConfig();\r\n this.updateHandleLabels();\r\n }\r\n\r\n private selectHandle(handle: ISliderHandle): void {\r\n this.selectedHandle = handle;\r\n }\r\n\r\n private clearSelectHandle(): void {\r\n this.selectedHandle = null;\r\n }\r\n\r\n private generateHandles(): void {\r\n this.handles = [];\r\n\r\n if (!this.values?.length) {\r\n console.warn(\"Slider has no values passed to input\");\r\n return;\r\n }\r\n\r\n this.values.forEach((value, index) => {\r\n this.handles.push({\r\n dragging: false,\r\n value: Math.max(this.min, Math.min(value, this.max)),\r\n valueIndex: index,\r\n leftPercentage: this.getLeftPercentageForValue(value),\r\n labelTop: 0\r\n });\r\n });\r\n\r\n this.handles.unshift({\r\n dragging: false,\r\n value: this.min,\r\n valueIndex: null,\r\n leftPercentage: 0,\r\n labelTop: 0,\r\n hideGrip: true\r\n });\r\n\r\n }\r\n\r\n private getLeftPercentageForValue(value: number): number {\r\n return ((value - this.min) / (this.max - this.min)) * 100;\r\n }\r\n\r\n private processMove(x: number, handle: ISliderHandle): void {\r\n window.getSelection()?.removeAllRanges();\r\n\r\n const parentElement: HTMLElement = this.sliderRail.nativeElement as HTMLElement;\r\n const sliderRect = parentElement.getBoundingClientRect();\r\n const sliderWidth: number = parentElement.offsetWidth;\r\n\r\n const movePositionInsideSlider = x - sliderRect.left;\r\n const newLeftPercentage: number = +((movePositionInsideSlider / sliderWidth) * 100);\r\n handle.leftPercentage = Math.max(0, Math.min(newLeftPercentage, 100));\r\n\r\n const newValue = ((handle.leftPercentage / 100) * (this.max - this.min)) + this.min;\r\n handle.value = Math.max(this.min, Math.min(newValue, this.max));\r\n\r\n this.updateHandleLabels();\r\n this.propagateHandleChanges();\r\n }\r\n\r\n private clearAllHandleDragFlags(): void {\r\n if (!this.handles?.length) {\r\n return;\r\n }\r\n\r\n this.handles.forEach(handle => handle.dragging = false);\r\n this.hasActiveDrags = false;\r\n }\r\n\r\n private detectActiveDrags(): void {\r\n const activeHandles: ISliderHandle[] = this.getDraggingHandles();\r\n\r\n this.hasActiveDrags = activeHandles?.length > 0;\r\n }\r\n\r\n private getDraggingHandles(): ISliderHandle[] {\r\n return this.handles?.filter(handle => handle.dragging);\r\n }\r\n\r\n private propagateHandleChanges(): void {\r\n this.orderHandlesByValue();\r\n }\r\n\r\n private orderHandlesByValue(): void {\r\n if (!this.handles?.length) {\r\n return;\r\n }\r\n\r\n this.handles.sort((handle1, handle2) => handle1.value - handle2.value);\r\n this.handles.forEach((handle, index) => this.values[index] = handle.value);\r\n\r\n const exportValues = [...this.values];\r\n\r\n if (this.showMinLabel) {\r\n exportValues.splice(0, 1);\r\n }\r\n\r\n this.valuesChange.emit(exportValues);\r\n }\r\n\r\n private generateConfig(): void {\r\n if (!!this.config) {\r\n return;\r\n }\r\n\r\n this.config = {\r\n zoneColors: this.getDefaultColors(),\r\n zoneLabels: this.getDefaultLabels()\r\n };\r\n }\r\n\r\n private getDefaultColors(): string[] {\r\n switch (this.values.length) {\r\n case 1: return [\"#004c93\"];\r\n case 2: return [\"#eb6a6a\", \"#ebb76a\", \"#78bb5d\"];\r\n default: return [\"#004c93\"];\r\n }\r\n }\r\n\r\n private getDefaultLabels(): string[] {\r\n switch (this.values.length) {\r\n case 1: return [\r\n this.translationService.t(\"VSlider.ValueLabel\")\r\n ];\r\n case 2: return [\r\n this.translationService.t(\"VSlider.PoorLabel\"),\r\n this.translationService.t(\"VSlider.AverageLabel\"),\r\n this.translationService.t(\"VSlider.GreatLabel\")\r\n ];\r\n default: return [\r\n this.translationService.t(\"VSlider.ValueLabel\")\r\n ];\r\n }\r\n }\r\n\r\n private updateHandleLabels(): void {\r\n\r\n if (!this.keyContainer?.nativeElement) {\r\n return;\r\n }\r\n\r\n const keyElements: HTMLElement[] = Array.from(this.keyContainer.nativeElement.querySelectorAll(\".key\"));\r\n\r\n if (!keyElements?.length) {\r\n return;\r\n }\r\n\r\n for (var i = keyElements.length - 1; i >= 0; i--) {\r\n const currentElement = keyElements[i];\r\n const currentElementRect = currentElement.getBoundingClientRect();\r\n\r\n if (!this.handles[i]) {\r\n continue;\r\n }\r\n\r\n this.handles[i].maxWidth = `100%`;\r\n\r\n if (i === keyElements.length - 1) {\r\n continue;\r\n }\r\n\r\n const closestNextSibling: HTMLElement = keyElements[i + 1];\r\n const closestNextSiblingRect: DOMRect = closestNextSibling.getBoundingClientRect();\r\n\r\n const newMaxWidth = closestNextSiblingRect.x - (currentElementRect.x);\r\n\r\n this.handles[i].maxWidth = `${newMaxWidth}px`;\r\n }\r\n }\r\n}\r\n","import { Component, ElementRef, EventEmitter, HostBinding, Input, Output, ViewChild } from '@angular/core';\r\nimport \"./v-radio-button.component.scss\";\r\n\r\n@Component({\r\n selector: 'v-radio-button',\r\n template: require('./v-radio-button.component.html')\r\n})\r\nexport class VRadioButtonComponent {\r\n\r\n @Input() checkedValue: any;\r\n @Input() name:string = \"default\";\r\n @Input() option:string;\r\n @Input() title:string;\r\n @ViewChild('radiobutton') radioButton: ElementRef;\r\n\r\n @HostBinding(\"class.disabled\") @Input() disabled: boolean;\r\n @Output() onChecked = new EventEmitter();\r\n\r\n //get accessor\r\n get value(): any {\r\n return this.checkedValue;\r\n };\r\n\r\n onModelChange(value: any): void {\r\n this.emitValue();\r\n }\r\n\r\n triggerButtonClick (): void {\r\n this.radioButton.nativeElement.click();\r\n }\r\n\r\n private emitValue(): void {\r\n this.onChecked.emit(this.value);\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\r\nimport { SettingsName } from '@app/class/SettingsName';\r\nimport { ICombinedPreferences } from '@app/interfaces/ICombinedPreferences';\r\nimport { SessionService } from '@app/services/session.service';\r\nimport { CountryCode, isValidPhoneNumber } from \"libphonenumber-js/min\";\r\nimport { ICountry } from './ICountry';\r\nimport { IPhoneNumberOutput } from './smsInput.interfaces';\r\nimport './sms-input.component.scss';\r\nimport { SmsInputService } from './sms-input.service';\r\n\r\n@Component({\r\n selector: 'sms-input',\r\n template: require('./sms-input.component.html')\r\n})\r\nexport class SmsInputComponent implements OnInit, OnChanges {\r\n @Input() input: string;\r\n @Input() required: boolean = false;\r\n @Input() disabled: boolean = false;\r\n\r\n @Output() outputChange = new EventEmitter();\r\n\r\n userOptions: ICombinedPreferences;\r\n countries: ICountry[] = [];\r\n selectedCountry: ICountry;\r\n selectedIsoCode: string;\r\n selectedDialCode: number;\r\n phoneNumber: string;\r\n isValid: boolean;\r\n\r\n constructor(\r\n private readonly sessionService: SessionService,\r\n private readonly smsInputService: SmsInputService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.loadUserOptions();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (!this.countries?.length) {\r\n this.countries = this.smsInputService.getCountries();\r\n this.setDefaultCountry();\r\n }\r\n if (changes['input'] && changes['input'].firstChange) {\r\n this.setDefaultCountry();\r\n }\r\n }\r\n\r\n onCountryChanged(): void {\r\n this.selectCountryFromIsoCode(this.selectedIsoCode);\r\n\r\n this.sendOutput();\r\n }\r\n\r\n onPhoneNumberChanged(): void {\r\n if (this.dialCodeHadChanged()) {\r\n this.setDefaultCountry();\r\n return;\r\n }\r\n\r\n this.sendOutput();\r\n }\r\n\r\n clear(): void {\r\n this.input = null;\r\n this.onPhoneNumberChanged();\r\n }\r\n\r\n private dialCodeHadChanged(): boolean {\r\n const newDialCode = this.getCountryDialCodeFromPhoneNumber(this.input);\r\n\r\n return newDialCode && newDialCode !== this.selectedCountry?.dialCode;\r\n }\r\n\r\n private sendOutput(): void {\r\n const finalPhoneNumber: string = this.input || undefined\r\n\r\n const output: IPhoneNumberOutput = {\r\n input: this.input,\r\n internationalized: finalPhoneNumber,\r\n country: this.selectedCountry,\r\n isValid: finalPhoneNumber ? this.isInternationalPhoneNumberValid(finalPhoneNumber) : true,\r\n isPristine: true,\r\n isDirty: false\r\n };\r\n\r\n this.isValid = output?.isValid;\r\n this.input = output?.internationalized;\r\n this.outputChange.emit(output);\r\n }\r\n\r\n private loadUserOptions(): void {\r\n this.userOptions = this.sessionService.getItem(SettingsName.UserOptions);\r\n }\r\n\r\n private setDefaultCountry(): void {\r\n if (!this.userOptions) {\r\n this.loadUserOptions();\r\n }\r\n\r\n const dialCode = this.getCountryDialCodeFromPhoneNumber(this.input);\r\n\r\n if (!this.input || !dialCode) {\r\n this.selectCountryFromCountryCode(this.userOptions?.CountryCode?.Value || \"gb\");\r\n }\r\n else {\r\n this.selectCountryFromDialCode(dialCode);\r\n }\r\n\r\n this.onCountryChanged();\r\n }\r\n\r\n private getCountryDialCodeFromPhoneNumber(phoneNumber: string): number {\r\n if (!phoneNumber || phoneNumber.indexOf(\"+\") !== 0) {\r\n return null;\r\n }\r\n\r\n const phoneNumberWithoutPlus: string = phoneNumber.replace(/ /g, \"\").replace(/\\+/g, \"\").trim();\r\n\r\n return this.countries.find(country => phoneNumberWithoutPlus.indexOf(country.dialCode.toString()) === 0)?.dialCode;\r\n }\r\n\r\n private selectCountryFromCountryCode(countryCode: string): void {\r\n this.selectedCountry = this.countries.find(x => x.countryCode.toLowerCase() === countryCode.toLowerCase());\r\n\r\n this.onCountrySelectionUpdated();\r\n }\r\n\r\n private selectCountryFromIsoCode(isoCode: string): void {\r\n if (!isoCode) {\r\n return;\r\n }\r\n this.selectedCountry = this.countries.find(x => x.isoCode.toLowerCase() === isoCode.toLowerCase());\r\n\r\n this.onCountrySelectionUpdated();\r\n }\r\n\r\n private selectCountryFromDialCode(dialCode: number): void {\r\n this.selectedCountry = this.countries.find(x => x.dialCode === dialCode);\r\n\r\n this.onCountrySelectionUpdated();\r\n }\r\n\r\n private onCountrySelectionUpdated(): void {\r\n this.selectedIsoCode = this.selectedCountry?.isoCode;\r\n this.selectedDialCode = this.selectedCountry?.dialCode;\r\n }\r\n\r\n private isInternationalPhoneNumberValid(phoneNumber: string): boolean {\r\n return isValidPhoneNumber(phoneNumber, {\r\n defaultCountry: this.selectedCountry?.countryCode.toUpperCase() as CountryCode,\r\n defaultCallingCode: this.selectedCountry?.dialCode + '',\r\n });\r\n }\r\n}\r\n","import { Component, forwardRef, Injector, Sanitizer } from '@angular/core';\r\nimport { ComponentUtility } from '@app/class/ComponentUtility';\r\nimport { IRadioButton, RadioButtonBaseComponent } from '../radio-button-base/radio-button-base.component';\r\nimport \"./radio-button-cards.component.scss\";\r\n\r\nexport interface IRadioButtonCard extends IRadioButton {\r\n note?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'v-radio-button-cards',\r\n template: require('./radio-button-cards.component.html'),\r\n providers: [\r\n { provide: RadioButtonBaseComponent, useExisting: forwardRef(() => RadioButtonCardsComponent) },\r\n ComponentUtility.createValueAccessorProvider(RadioButtonCardsComponent),\r\n ComponentUtility.createValidatorProvider(RadioButtonCardsComponent)\r\n ]\r\n})\r\nexport class RadioButtonCardsComponent extends RadioButtonBaseComponent {\r\n\r\n constructor(\r\n private readonly sanitizer: Sanitizer,\r\n protected readonly injector: Injector\r\n ) {\r\n super(injector);\r\n }\r\n}\r\n","import { Component, forwardRef, Injector } from '@angular/core';\r\nimport { ComponentUtility } from '@app/class/ComponentUtility';\r\nimport { RadioButtonBaseComponent } from '../radio-button-base/radio-button-base.component';\r\nimport \"./radio-button-small-cards.component.scss\";\r\n\r\nexport interface IRadioButtonSmallCard {\r\n label: string;\r\n value: any;\r\n disabled?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'v-radio-button-small-cards',\r\n template: require('./radio-button-small-cards.component.html'),\r\n providers: [\r\n { provide: RadioButtonBaseComponent, useExisting: forwardRef(() => RadioButtonSmallCardsComponent) },\r\n ComponentUtility.createValueAccessorProvider(RadioButtonSmallCardsComponent),\r\n ComponentUtility.createValidatorProvider(RadioButtonSmallCardsComponent)\r\n ]\r\n})\r\nexport class RadioButtonSmallCardsComponent extends RadioButtonBaseComponent {\r\n\r\n constructor(\r\n protected readonly injector: Injector\r\n ) {\r\n super(injector);\r\n }\r\n}\r\n","import { Component, OnInit } from \"@angular/core\";\r\nimport { BreadcrumbService, IBreadcrumb } from \"@services/breadcrumb.service\";\r\nimport { NavigationService } from \"@services/navigation.service\";\r\nimport \"./route-breadcrumbs.component.scss\";\r\n\r\n@Component({\r\n selector: \"route-breadcrumbs\",\r\n template: require(\"./route-breadcrumbs.component.html\")\r\n})\r\nexport class RouteBreadcrumbsComponent implements OnInit {\r\n\r\n breadcrumbs: IBreadcrumb[] = [];\r\n\r\n showBackButton = false;\r\n backBreadcrumb: IBreadcrumb;\r\n\r\n constructor(\r\n private readonly breadcrumbService: BreadcrumbService,\r\n private readonly navigationService: NavigationService\r\n ) {\r\n this.breadcrumbService.registerStateCallback(() => this.updateBreadcrumbs());\r\n }\r\n\r\n ngOnInit() {\r\n this.updateBreadcrumbs();\r\n }\r\n\r\n breadcrumbClicked(breadcrumb: IBreadcrumb, $event: MouseEvent) {\r\n this.navigationService.go(breadcrumb.state.name, null, false);\r\n\r\n $event.preventDefault();\r\n }\r\n\r\n // ---\r\n\r\n private updateBreadcrumbs() {\r\n this.showBackButton = false;\r\n this.breadcrumbs = this.breadcrumbService.getBreadcrumbs();\r\n\r\n if (this.breadcrumbs.length <= 1) {\r\n return;\r\n }\r\n\r\n // If our parent state ISNT abstract, then show \"Back to X\"\r\n var currentBreadcrumb = this.breadcrumbs[this.breadcrumbs.length - 1];\r\n var parentBreadcrumb = this.breadcrumbs[this.breadcrumbs.length - 2];\r\n\r\n if (currentBreadcrumb.state && !parentBreadcrumb.state.abstract && !parentBreadcrumb.state.data.preventBreadcrumbBack) {\r\n this.showBackButton = true;\r\n this.backBreadcrumb = parentBreadcrumb;\r\n }\r\n }\r\n}\r\n","import { HttpErrorResponse } from \"@angular/common/http\";\r\nimport { Component, forwardRef, Inject, Input, Optional, TemplateRef, ViewChild } from \"@angular/core\";\r\nimport { VDialogRef } from \"@app/directives/_layout/v-dialog/v-dialog-ref\";\r\nimport { DialogService } from \"@app/directives/_layout/v-dialog/v-dialog.service\";\r\nimport { IVTableHeader } from \"@app/directives/_layout/v-table/_models/IVTableHeader\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { IReportHistory } from \"@app/main/components/reports/models/IDynamicReportLog\";\r\nimport { DateService } from \"@app/services/date.service\";\r\nimport { IVButtonDropDownItem } from \"@directives/_core/v-button/v-button.component\";\r\nimport { FilterBarComponent } from \"@directives/_resourceFilters/filter-bar/filter-bar.component\";\r\nimport { LegacyExportService, IExportTableParams } from \"@directives/_veri/export/legacyExport.service\";\r\nimport { IVeriTableHeader, IVeriTableRow } from \"@directives/_veri/veriTable/veriTable.component\";\r\nimport { ExportType } from \"@reports/_services/dynamicReports.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { ExportService, ITableExportParams } from \"../export.service\";\r\nimport \"./v-export-button.component.scss\";\r\n\r\n@Component({\r\n selector: 'v-export-button',\r\n template: require('./v-export-button.component.html')\r\n})\r\nexport class VExportButtonComponent {\r\n\r\n @Input() headers: IVeriTableHeader[];\r\n @Input() rows: IVeriTableRow[];\r\n\r\n @Input() vTableHeaders: IVTableHeader[];\r\n @Input() vTableRows: IVTableRow[];\r\n\r\n @Input() exportTitle: string;\r\n @Input() exportAsLandscape: boolean;\r\n @Input() iconOnly: boolean;\r\n\r\n @Input() reportLog: IReportHistory;\r\n @Input() maxRows: number = 25000;\r\n @ViewChild('exportError') errorTpl: TemplateRef;\r\n // ---\r\n\r\n exportTypes: IVButtonDropDownItem[];\r\n exporting = false;\r\n\r\n errorMessage: string = this.translationService.t(\"VExportButton.Error\");\r\n\r\n dialog: VDialogRef;\r\n constructor(\r\n @Optional() @Inject(forwardRef(() => FilterBarComponent)) public readonly filterBarComponent: FilterBarComponent,\r\n private readonly dateService: DateService,\r\n private readonly dialogService: DialogService,\r\n private readonly exportService: ExportService,\r\n private readonly legacyExportService: LegacyExportService,\r\n private readonly translationService: TranslationService\r\n ) {\r\n this.exportTypes = [];\r\n\r\n this.createExportItem(ExportType.PDF);\r\n this.createExportItem(ExportType.CSV);\r\n this.createExportItem(ExportType.Excel);\r\n }\r\n\r\n async onItemClick(item: IVButtonDropDownItem): Promise {\r\n if (this.exporting) {\r\n return Promise.resolve();\r\n }\r\n\r\n this.exporting = true;\r\n \r\n if (!!this.reportLog) {\r\n this.exportReport(item.data);\r\n return;\r\n }\r\n\r\n if (!!this.filterBarComponent?.tableRows) {\r\n return this.exportVTable(item).finally(() => {\r\n this.exporting = false;\r\n })\r\n }\r\n\r\n return this.exportVeriTable(item).finally(() => {\r\n this.exporting = false;\r\n });\r\n }\r\n\r\n closeDialog(): void {\r\n this.dialog.close();\r\n }\r\n\r\n // ---\r\n\r\n private getLabel(exportType: ExportType): string {\r\n switch (exportType) {\r\n case ExportType.CSV:\r\n return this.translationService.t(\"VExportButton.ExportToCsv\");\r\n\r\n case ExportType.Excel:\r\n return this.translationService.t(\"VExportButton.ExportToExcel\");\r\n\r\n case ExportType.PDF:\r\n return this.translationService.t(\"VExportButton.ExportToPDF\");\r\n\r\n default:\r\n return \"\";\r\n }\r\n }\r\n\r\n private createExportItem(exportType: ExportType): void {\r\n var icon = \"fa-solid fa-circle\";\r\n\r\n switch (exportType) {\r\n case ExportType.PDF:\r\n icon = \"fa-solid fa-file-pdf\";\r\n break;\r\n\r\n case ExportType.Excel:\r\n icon = \"fa-solid fa-file-excel\";\r\n break;\r\n\r\n case ExportType.CSV:\r\n icon = \"fa-solid fa-file-csv\";\r\n break;\r\n }\r\n\r\n this.exportTypes.push({\r\n label: this.getLabel(exportType),\r\n data: exportType,\r\n icon: icon\r\n });\r\n }\r\n\r\n private exportReport(exportType: ExportType): void {\r\n this.legacyExportService.downloadReport(exportType, this.reportLog);\r\n this.exporting = false;\r\n }\r\n \r\n private exportVTable(item: IVButtonDropDownItem): Promise {\r\n\r\n\r\n const params: ITableExportParams = {\r\n exportTitle: this.getExportTitle(),\r\n exportType: item.data,\r\n headers: this.vTableHeaders,\r\n rows: this.vTableRows.filter(row => !row.hide),\r\n exportAsLandscape: this.exportAsLandscape\r\n };\r\n\r\n const promise: Promise = new Promise((res, rej) => {\r\n if (params.rows.length > this.maxRows) {\r\n return rej(\r\n new HttpErrorResponse({\r\n statusText: this.translationService.t(\"VExportButton.DatasetTooLarge\", params.rows.length)\r\n })\r\n )\r\n }\r\n return res(this.exportService.downloadTableAsReport(params))\r\n })\r\n\r\n return promise\r\n .catch((error: HttpErrorResponse) => {\r\n this.handleError(error);\r\n throw error;\r\n });\r\n }\r\n\r\n private exportVeriTable(item: IVButtonDropDownItem): angular.IPromise {\r\n\r\n const params: IExportTableParams = {\r\n exportTitle: this.getExportTitle(),\r\n exportType: item.data,\r\n headers: this.headers,\r\n rows: this.rows,\r\n exportAsLandscape: this.exportAsLandscape\r\n };\r\n\r\n return this.legacyExportService.downloadOldTableAsReport(params);\r\n }\r\n\r\n private handleError(errorResponse: HttpErrorResponse): void {\r\n this.errorMessage = errorResponse.statusText;\r\n this.dialog = this.dialogService.open(this.errorTpl, false);\r\n }\r\n\r\n private getExportTitle(): string {\r\n return this.exportTitle || this.translationService.t(\"VExportButton.Export\") + \" \" + this.dateService.formatDate(new Date()); \r\n }\r\n}\r\n","import { Component, OnInit, TemplateRef, Type } from '@angular/core';\r\nimport { VDialogRef } from \"./v-dialog-ref\";\r\nimport './v-dialog.component.scss';\r\n\r\n@Component({\r\n selector: 'v-dialog',\r\n template: require('./v-dialog.component.html')\r\n})\r\nexport class VDialogComponent implements OnInit {\r\n contentType: 'template' | 'string' | 'component';\r\n content: string | TemplateRef | Type;\r\n context;\r\n\r\n constructor(private ref: VDialogRef) { }\r\n\r\n close(): void {\r\n this.ref.close(null);\r\n }\r\n\r\n ngOnInit(): void {\r\n this.content = this.ref.content;\r\n\r\n if (typeof this.content === 'string') {\r\n this.contentType = 'string';\r\n } else if (this.content instanceof TemplateRef) {\r\n this.contentType = 'template';\r\n this.context = {\r\n close: this.ref.close.bind(this.ref)\r\n };\r\n } else {\r\n this.contentType = 'component';\r\n }\r\n }\r\n}\r\n","import { ElementRef, EventEmitter } from \"@angular/core\";\r\nimport { IDynamicTabDefinition } from \"@app/directives/_layout/v-tabs/v-tabs.component\";\r\nimport { IDriver } from \"@app/interfaces/IDriver\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { IGroup } from \"@app/interfaces/IVehicleGroup\";\r\n\r\nexport interface IFilterBarChange {\r\n change: EventEmitter;\r\n}\r\n\r\nexport interface IFilterBarFilter extends IFilterBarChange {\r\n\r\n selected: T;\r\n\r\n name: string;\r\n icon: string;\r\n\r\n type: FilterTriggerType;\r\n visible?: boolean;\r\n\r\n elementRef: ElementRef;\r\n filterPredicate?: FilterBarItemPredicate;\r\n}\r\n\r\nexport interface IVerticalFilterListItem {\r\n name: string;\r\n tooltip?: string;\r\n count?: number;\r\n countAsPercentageOfMax?: number;\r\n icon?: string;\r\n color?: string;\r\n key?: any;\r\n\r\n data?: T;\r\n selected?: boolean;\r\n\r\n predicate: (value?: T) => boolean;\r\n}\r\n\r\nexport interface IFilterBarListWithCount extends IFilterBarChange {\r\n selectedItems: IVerticalFilterListItem[];\r\n items: IVerticalFilterListItem[];\r\n multiSelectMode: 'every-filter' | 'some-filter';\r\n maxListItemCount: number;\r\n\r\n updateList(data: any);\r\n}\r\n\r\nexport class FilterBarListIterable {\r\n mode: 'every-filter' | 'some-filter';\r\n selectedItems: IVerticalFilterListItem[]\r\n\r\n constructor(mode: 'every-filter' | 'some-filter', selectedItems: IVerticalFilterListItem[]) {\r\n this.mode = mode;\r\n this.selectedItems = selectedItems;\r\n }\r\n}\r\n\r\nexport type FilterTriggerType = \"sourcedata\" | \"group\" | \"vehicle\" | \"driver\" | \"tag\" | \"date\" | \"search\" | \"filter\" | \"filterlist\" | \"custom\" | \"vehicletype\";\r\n\r\nexport interface IAggregateFilterEvent extends Partial> {\r\n trigger?: FilterTriggerType;\r\n\r\n group?: IGroup;\r\n vehicle?: IVehicle;\r\n driver?: IDriver;\r\n date?: Date[];\r\n\r\n custom?: any;\r\n\r\n filter?: (item: T) => boolean;\r\n filteredData?: T[];\r\n}\r\n\r\nexport interface FilterChange {\r\n type: FilterTriggerType,\r\n event: any,\r\n options?: { customName?: string, filterData?: boolean }\r\n}\r\n\r\nexport type FilterBarItemPredicate = (item: any, value?: T) => boolean;\r\nexport type FilterBarItemSearchPredicate = (item: T, text: string) => boolean;\r\n\r\nexport interface IFilterBarTab extends IDynamicTabDefinition {\r\n predicate: (item: T) => boolean;\r\n}\r\n","import { Component, ContentChild, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, TemplateRef } from \"@angular/core\";\r\nimport { SortDirection } from \"@enums/SortDirection\";\r\nimport { SortType } from \"@enums/SortType\";\r\nimport { IComboBox } from \"@interfaces/IComboBox\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport * as moment from \"moment\";\r\nimport { IVeriPillNavLabel } from \"../veriSimpleNav/veriSimpleNav.component\";\r\nimport \"./v-list.component.scss\";\r\n\r\n\r\nexport interface IVListRow {\r\n id?: number;\r\n data?: T;\r\n searchString?: string;\r\n sortData?: any;\r\n contents?: string;\r\n filterData?: number[];\r\n className?: string;\r\n}\r\n\r\n//interface IVeriListComboBox extends IComboBox {\r\n// count?: number;\r\n//}\r\n@Component({\r\n selector: 'v-list',\r\n template: require('./v-list.component.html')\r\n})\r\nexport class VListComponent implements OnInit, OnChanges {\r\n @Input() rows: IVListRow[];\r\n\r\n @Input() selectedItem: any;\r\n @Input() sortType: SortType;\r\n @Input() sortDirection: SortDirection;\r\n @Input() filterOptions: IComboBox[];\r\n @Input() selectedFilterOption: number;\r\n @Input() selectedRowId: number;\r\n @Input() showOptionsAsNav: boolean;\r\n\r\n @Input() showSearch: boolean;\r\n\r\n @Input() clickable: boolean;\r\n @Input() loading: boolean;\r\n\r\n @Input() searchPlaceholder: string;\r\n @Input() filterPlaceholder: string;\r\n @Input() templateUrl: string;\r\n @Input() rowClassName: string;\r\n @Input() itemLabel: string;\r\n\r\n @ContentChild('innerContent', { static: false }) innerContentTemplateRef: TemplateRef;\r\n //customSorter: \"&\",\r\n\r\n @Output() onRowsUpdated = new EventEmitter[]>();\r\n @Output() onRowClicked = new EventEmitter>();\r\n @Output() onRowHover = new EventEmitter>();\r\n\r\n displayRows: IVListRow[] = [];\r\n\r\n template: TemplateRef;\r\n\r\n searchString: string;\r\n\r\n navLabels: IVeriPillNavLabel[];\r\n\r\n selectedRowIndex: number;\r\n\r\n constructor(\r\n private readonly translationService: TranslationService\r\n ) {\r\n\r\n }\r\n\r\n ngOnInit(): void {\r\n this.itemLabel = this.itemLabel;\r\n this.sortType = this.sortType || SortType.String;\r\n }\r\n\r\n ngOnChanges(onChangesObj: SimpleChanges) {\r\n let sortRows = false;\r\n let searchRows = false;\r\n\r\n if (onChangesObj[\"rows\"] && this.rows) {\r\n\r\n this.cleanRows();\r\n\r\n sortRows = true;\r\n searchRows = true;\r\n }\r\n\r\n if (onChangesObj[\"selectedRowId\"] && this.displayRows) {\r\n if (this.selectedItem &&\r\n this.selectedItem.Id &&\r\n this.selectedRowId &&\r\n this.selectedItem.Id === this.selectedRowId) {\r\n return;\r\n }\r\n this.displayRows.forEach((row, index) => {\r\n if (this.selectedRowId === row.id) {\r\n\r\n this.selectedRowIndex = index - 1;\r\n }\r\n });\r\n }\r\n\r\n if (onChangesObj[\"selectedFilterOption\"]) {\r\n this.onFilterOptionChanged();\r\n }\r\n\r\n if (sortRows) {\r\n this.sortRows();\r\n }\r\n\r\n if (searchRows) {\r\n this.searchRows();\r\n }\r\n\r\n if (this.filterOptions) {\r\n this.calculateNumFilterOptions();\r\n }\r\n }\r\n\r\n rowClicked(row: IVListRow) {\r\n\r\n this.onRowClicked.emit(row);\r\n\r\n if (this.selectedItem && this.selectedItem.data === row.data) {\r\n this.selectedItem = null;\r\n }\r\n else {\r\n this.selectedItem = row.data;\r\n }\r\n }\r\n\r\n rowMouseEnter(row: IVListRow, mouseEvent: MouseEvent) {\r\n if (this.onRowHover) {\r\n this.onRowHover.emit(row);\r\n }\r\n }\r\n\r\n mouseLeave() {\r\n if (this.onRowHover) {\r\n this.onRowHover.emit(null);\r\n }\r\n }\r\n\r\n onFilterOptionChanged() {\r\n\r\n this.selectedFilterOption = Number(this.selectedFilterOption)\r\n this.searchRows();\r\n }\r\n\r\n onNavLabelClicked($label: IVeriPillNavLabel) {\r\n this.selectedFilterOption = this.navLabels.indexOf($label);\r\n this.onFilterOptionChanged();\r\n }\r\n\r\n onSearch() {\r\n this.displayRows = this.rows.filter(row => {\r\n return row.searchString.toLowerCase().includes(this.searchString.toLowerCase());\r\n })\r\n }\r\n\r\n // ----------------------------------------------\r\n\r\n private cleanRows() {\r\n\r\n this.rows.forEach(row => {\r\n row.searchString = row.searchString || row.contents || \"\";\r\n\r\n if (!row.sortData) {\r\n row.sortData = row.contents;\r\n }\r\n\r\n if (this.sortType == SortType.String) {\r\n row.sortData = row.sortData.toLocaleLowerCase();\r\n }\r\n\r\n row.searchString += row.sortData;\r\n row.searchString = row.searchString.toLocaleLowerCase();\r\n });\r\n }\r\n\r\n private searchRows() {\r\n\r\n const safeSearchString = this.searchString ? this.searchString.trim().toLocaleLowerCase() : null;\r\n\r\n if ((safeSearchString || this.selectedFilterOption) && this.rows) {\r\n this.displayRows = [];\r\n\r\n for (let ri = 0; ri < this.rows.length; ri++) {\r\n const row = this.rows[ri];\r\n let rowMatched = false;\r\n\r\n if (safeSearchString && row.searchString.indexOf(safeSearchString) >= 0) {\r\n rowMatched = true;\r\n }\r\n else if (!safeSearchString) {\r\n rowMatched = true;\r\n }\r\n\r\n if (this.selectedFilterOption && this.selectedFilterOption != -1 && rowMatched) {\r\n rowMatched = row.filterData && row.filterData.indexOf(this.selectedFilterOption) >= 0;\r\n }\r\n\r\n if (rowMatched) {\r\n this.displayRows.push(row);\r\n }\r\n }\r\n }\r\n else {\r\n this.displayRows = this.rows;\r\n }\r\n\r\n if (this.onRowsUpdated) {\r\n this.onRowsUpdated.emit(this.displayRows);\r\n }\r\n }\r\n\r\n private sortRows() {\r\n if (!this.rows) {\r\n return;\r\n }\r\n\r\n this.sortType = this.sortType || SortType.String;\r\n\r\n if (this.sortDirection === undefined) {\r\n this.sortDirection = SortDirection.Ascending;\r\n }\r\n\r\n this.rows.sort((row1, row2) => {\r\n\r\n if (!row1.sortData || !row2.sortData) {\r\n return;\r\n }\r\n\r\n //if (this.customSorter && this.customSorter({ row1: row1, row2: row2 })) {\r\n // var response = this.customSorter({ row1: row1, row2: row2 });\r\n\r\n // // If both are the same, then allow us to continue to filter\r\n // if (response != 0) { return response; }\r\n //}\r\n\r\n if (this.sortType === SortType.Date) {\r\n return this.sortDirection === SortDirection.Ascending\r\n ? moment(row1.sortData).diff(row2.sortData, \"s\")\r\n : moment(row2.sortData).diff(row1.sortData, \"s\");\r\n }\r\n else if (this.sortType === SortType.Number) {\r\n return this.sortDirection === SortDirection.Ascending\r\n ? row1.sortData < row2.sortData ? 1 : -1\r\n : row1.sortData < row2.sortData ? -1 : 1;\r\n }\r\n else {\r\n return this.sortDirection === SortDirection.Ascending\r\n ? row1.sortData.localeCompare(row2.sortData)\r\n : row2.sortData.localeCompare(row1.sortData);\r\n }\r\n });\r\n }\r\n\r\n private calculateNumFilterOptions() {\r\n if (!this.rows) {\r\n return;\r\n }\r\n\r\n var hasAllOption = false;\r\n this.filterOptions.forEach(filterOption => {\r\n if (filterOption.Value <= 0) {\r\n hasAllOption = true;\r\n }\r\n });\r\n\r\n if (!hasAllOption) {\r\n this.filterOptions.unshift({\r\n Name: this.translationService.t(\"veriList.all\"),\r\n Value: 0\r\n });\r\n }\r\n\r\n if (!this.selectedFilterOption) {\r\n this.selectedFilterOption = this.filterOptions[0].Value;\r\n }\r\n\r\n this.filterOptions.forEach(filterOption => {\r\n filterOption.Count = 0;\r\n });\r\n\r\n for (var i = 0; i < this.rows.length; i++) {\r\n const row = this.rows[i];\r\n\r\n if (!row.filterData) {\r\n continue;\r\n }\r\n\r\n for (var j = 0; j < this.filterOptions.length; j++) {\r\n const option = this.filterOptions[j];\r\n\r\n if (option.Value <= 0 || row.filterData.indexOf(option.Value) >= 0) {\r\n option.Count++;\r\n }\r\n }\r\n }\r\n\r\n this.updateNavPillLabels();\r\n }\r\n\r\n private updateNavPillLabels() {\r\n this.navLabels = [];\r\n\r\n this.filterOptions.forEach(option => {\r\n this.navLabels.push({\r\n count: option.Count,\r\n label: option.Name\r\n });\r\n });\r\n }\r\n}\r\n\r\n\r\n\r\n////import { Component, EventEmitter, Input, OnChanges, OnInit } from \"@angular/core\";\r\n\r\n////import './v-list.component.scss';\r\n\r\n\r\n////export interface IVListRow {\r\n//// id?: number;\r\n//// data?: T;\r\n//// searchString?: string;\r\n//// sortData?: any;\r\n//// contents?: string;\r\n//// filterData?: number[];\r\n//// className?: string;\r\n////}\r\n\r\n////@Component({\r\n//// selector: 'v-list',\r\n//// template: require('./v-list.component.html')\r\n////})\r\n////export class VListComponent implements OnInit, OnChanges {\r\n\r\n//// @Input() listItems: any[];\r\n//// @Input() onRowsUpdated: EventEmitter;\r\n//// @Input() onRowClicked: EventEmitter;\r\n//// @Input() onRowHover: EventEmitter;\r\n\r\n//// constructor() {\r\n\r\n//// }\r\n//// ngOnInit() {\r\n//// }\r\n//// ngOnChanges() {\r\n//// console.log(this.listItems)\r\n//// }\r\n////}\r\n","import { AfterContentInit, Component, ElementRef, Input, OnChanges, ViewChild } from \"@angular/core\";\r\nimport { IDateFormatOptions } from \"@app/services/date.service\";\r\nimport { SortDirection } from \"@enums/SortDirection\";\r\nimport { IPlot } from \"@interfaces/IPlot\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport \"./v-timeline.component.scss\";\r\n\r\nexport interface ITimelineEntry {\r\n date: Date;\r\n icon: string;\r\n\r\n largeDetails?: ITimelineEntryLargeForm;\r\n inlineDetails?: ITimelineEntryInline;\r\n\r\n showDateFooter?: boolean;\r\n}\r\n\r\nexport interface ITimelineEntryWithData extends ITimelineEntry {\r\n data?: T;\r\n}\r\n\r\n\r\nexport interface ITimelineEntryLargeForm extends ITimelineEntryCommon {\r\n title?: string;\r\n text?: string;\r\n listItems?: { verb: string; date?: Date }[];\r\n}\r\n\r\nexport interface ITimelineEntryInline extends ITimelineEntryCommon {\r\n subject?: string; // e.g. the actor, who, what\r\n noun?: string;\r\n // Either or\r\n}\r\n\r\nexport interface ITimelineEntryCommon {\r\n verb?: string; // the action that took place \r\n\r\n text?: string;\r\n location?: IPlot;\r\n}\r\n\r\n@Component({\r\n selector: \"v-timeline\",\r\n template: require(\"./v-timeline.component.html\")\r\n})\r\nexport class VTimelineComponent implements OnChanges, AfterContentInit {\r\n\r\n @Input() entries: ITimelineEntry[] = [];\r\n\r\n @Input() showTime: boolean;\r\n\r\n @Input() dateFormat: string = 'time';\r\n\r\n @Input() dateFormatOptions: IDateFormatOptions = { dateTime: true };\r\n\r\n @Input() sortByNew: boolean;\r\n\r\n @ViewChild(\"ngcontent\", { static: true }) ngContentContainer: ElementRef;\r\n\r\n // ---\r\n\r\n hasNgContent = true;\r\n\r\n constructor(private veriDate: VeriDate) {\r\n }\r\n\r\n ngOnChanges() {\r\n // Sort incoming data\r\n if (this.entries) {\r\n this.entries.sort((x, y) => this.veriDate.sort(x.date, y.date, this.sortByNew ? SortDirection.Descending :SortDirection.Ascending));\r\n this.entries.forEach(entry => {\r\n if ((entry.largeDetails && entry.largeDetails.verb && entry.largeDetails.listItems?.some(item => item.date)) || entry.inlineDetails) {\r\n entry.showDateFooter = false;\r\n }\r\n else {\r\n entry.showDateFooter = true;\r\n }\r\n })\r\n }\r\n }\r\n\r\n ngAfterContentInit() {\r\n var element = this.ngContentContainer.nativeElement as HTMLElement;\r\n //console.log(this.ngContentContainer, element.childNodes, element.hasChildNodes(), element.innerHTML);\r\n\r\n if (element.innerHTML.trim() == '') {\r\n element.parentElement.remove();\r\n }\r\n }\r\n}\r\n","import { Component, Input, OnInit, Output, EventEmitter, NgZone } from \"@angular/core\";\r\nimport \"./veriPills.component.scss\";\r\n\r\nexport interface IVeriNavPill {\r\n title: string;\r\n count?: number;\r\n data?: T;\r\n selected?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: \"veri-nav-pills\",\r\n template: require(\"./veriPills.component.html\"),\r\n})\r\nexport class VeriNavPillsComponent implements OnInit {\r\n\r\n @Input() navPills: IVeriNavPill[];\r\n @Output() onSelected: EventEmitter = new EventEmitter();\r\n\r\n constructor() {\r\n }\r\n\r\n ngOnInit(): void { }\r\n\r\n navPillClicked(navPill: IVeriNavPill) {\r\n this.navPills.forEach(pill => pill.selected = false);\r\n navPill.selected = true;\r\n\r\n this.onSelected.emit(navPill);\r\n }\r\n}\r\n","\r\nimport * as angular from \"angular\";\r\nimport * as moment from \"moment\";\r\n\r\nimport { PlotService } from \"./plot.service\";\r\nimport { MapService } from \"./map.service\";\r\nimport { IPlot } from \"@interfaces/IPlot\";\r\nimport { IJourney } from \"@interfaces/IJourney\";\r\nimport { ConstantsService } from \"./constantsService\";\r\n\r\nexport interface IGoogleRoadDataSnappedPointLocation {\r\n lat: number;\r\n lng: number;\r\n}\r\n\r\nexport interface IGoogleRoadDataSnappedPoint {\r\n Location: IGoogleRoadDataSnappedPointLocation;\r\n OriginalIndex: number;\r\n PlaceId: string;\r\n SpeedLimit: number;\r\n}\r\n\r\nexport interface IGoogleRoadDataSpeedLimit {\r\n placeId: string;\r\n speedLimit: number;\r\n units: string;\r\n}\r\n\r\nexport interface IGoogleRoadData {\r\n snappedPoints: IGoogleRoadDataSnappedPoint[];\r\n speedLimits: IGoogleRoadDataSpeedLimit[];\r\n warningMessage: string;\r\n}\r\n\r\nexport interface IGoogleElevationData {\r\n}\r\n\r\nexport class GoogleService {\r\n apiUrl: string\r\n\r\n static $inject = [\"$http\", \"$q\", \"$document\", \"plotService\", \"mapService\", \"constantsService\"];\r\n\r\n constructor(\r\n private $http: angular.IHttpService,\r\n private $q: angular.IQService,\r\n private $document: angular.IDocumentService,\r\n private plotService: PlotService,\r\n private mapService: MapService,\r\n private readonly constantsService: ConstantsService) {\r\n this.apiUrl = this.constantsService.getApiUrl();\r\n }\r\n\r\n // There is likely a better place for this\r\n boundsGreatBritain = {\r\n ne: {\r\n lat: 60.041972430353184,\r\n lng: 7.55572621875001\r\n } as google.maps.LatLngLiteral,\r\n sw: {\r\n lat: 49.60950162107379,\r\n lng: -15.25189096874999\r\n } as google.maps.LatLngLiteral\r\n };\r\n\r\n snapToRoads(latlngs: google.maps.LatLng[]): angular.IPromise {\r\n\r\n latlngs.forEach(latlng => {\r\n console.log(`${latlng.lat()}, ${latlng.lng()}|`);\r\n });\r\n\r\n const requestArray: angular.IPromise[] = [];\r\n\r\n const closePlotsArrays: google.maps.LatLng[][] = [];\r\n closePlotsArrays.push([]);\r\n let pathIndex = 0;\r\n\r\n let previousPlot: google.maps.LatLng;\r\n\r\n for (let i = 0; latlngs.length > i; i++) {\r\n let triggerProcess = false;\r\n const currentPlot = latlngs[i];\r\n\r\n const lastIndex = latlngs.length - 1;\r\n\r\n if (previousPlot) {\r\n const distance = this.getDistanceInMetres(currentPlot, previousPlot);\r\n if (distance < 300 && i !== lastIndex) {\r\n closePlotsArrays[pathIndex].push(currentPlot);\r\n }\r\n else {\r\n triggerProcess = closePlotsArrays[pathIndex].length > 0;\r\n }\r\n }\r\n\r\n if (triggerProcess || (lastIndex === i && closePlotsArrays[pathIndex].length > 0)) {\r\n requestArray.push(this.googleSnapToRoads(angular.copy(closePlotsArrays[pathIndex])));\r\n }\r\n\r\n if (lastIndex !== i && triggerProcess) {\r\n closePlotsArrays.push([]);\r\n pathIndex++;\r\n }\r\n\r\n previousPlot = currentPlot;\r\n }\r\n\r\n return this.$q.all(requestArray).then((requests) => {\r\n for (let i = 0; requests.length > i; i++) {\r\n const closePlots = closePlotsArrays[i];\r\n const snappedPlots = requests[i];\r\n if (snappedPlots.length === 0) {\r\n continue;\r\n }\r\n const startIndex = latlngs.indexOf(closePlots[0]);\r\n const endIndex = latlngs.indexOf(closePlots[closePlots.length - 1]) + 1;\r\n\r\n latlngs.splice(startIndex, endIndex - startIndex, ...snappedPlots);\r\n }\r\n\r\n return latlngs;\r\n })\r\n .catch(e => {\r\n console.error(\"snap to roads error\", e);\r\n return latlngs;\r\n });\r\n }\r\n\r\n getPlaces(searchTerm: string): angular.IPromise {\r\n // We cannot use places for now\r\n return this.$q.resolve([]);\r\n\r\n // Place service requires a div to render to\r\n //var element = angular.element(\"
\");\r\n //const placesService = new google.maps.places.PlacesService(element[0] as HTMLDivElement);\r\n //const deferred = this.$q.defer();\r\n\r\n //// For now [until we have options that cover this] we will only specify UK results\r\n //placesService.textSearch(\r\n // {\r\n // query: `${searchTerm}`,\r\n // bounds: new google.maps.LatLngBounds(this.boundsGreatBritain.sw, this.boundsGreatBritain.ne)\r\n // },\r\n // (results, status) => {\r\n\r\n // // To prevent a leak we need to remove this element as soon as we have finished searching\r\n // element.remove();\r\n\r\n // if (status === google.maps.places.PlacesServiceStatus.OK || status === google.maps.places.PlacesServiceStatus.ZERO_RESULTS) {\r\n // deferred.resolve(results);\r\n // } else {\r\n // deferred.reject(status);\r\n // }\r\n // });\r\n\r\n //return deferred.promise;\r\n }\r\n\r\n getAutocompletePredictions(searchTerm: string): angular.IPromise {\r\n const autoCompleteService = new google.maps.places.AutocompleteService();\r\n const deferred = this.$q.defer();\r\n\r\n autoCompleteService.getQueryPredictions(\r\n { input: searchTerm },\r\n (result, status) => {\r\n if (status === google.maps.places.PlacesServiceStatus.OK) {\r\n\r\n deferred.resolve(result);\r\n } else {\r\n deferred.reject(status);\r\n }\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n\r\n snapAndInterpolatePath(points: google.maps.LatLng[]): angular.IPromise {\r\n const maxLatLngsPerRequest = 20;\r\n\r\n var interpolatedPath: google.maps.LatLng[] = [];\r\n\r\n let promiseToWaitOn: angular.IPromise = this.$q.when(null);\r\n const requestPool: angular.IPromise[] = [];\r\n\r\n // We remove 1 from the length as our end and start points need to overlap to prevent a gap\r\n const numRequests = Math.ceil((points.length - 1) / maxLatLngsPerRequest);\r\n\r\n for (let i = 0; i < numRequests; i++) {\r\n const startIndex = i * maxLatLngsPerRequest;\r\n const endIndex = startIndex + maxLatLngsPerRequest;\r\n\r\n const requestPoints = points.slice(startIndex, endIndex);\r\n promiseToWaitOn = promiseToWaitOn.then(() => {\r\n\r\n var directionsPromise = this.getDirections(\r\n requestPoints[0],\r\n requestPoints[requestPoints.length - 1],\r\n requestPoints.length > 2 ? requestPoints.slice(1, -1) : null);\r\n\r\n directionsPromise.then(result => {\r\n interpolatedPath = interpolatedPath.concat(result.routes[0].overview_path);\r\n });\r\n\r\n return directionsPromise;\r\n });\r\n\r\n requestPool.push(promiseToWaitOn);\r\n }\r\n\r\n return this.$q.all(requestPool).then(() => {\r\n return interpolatedPath;\r\n });\r\n }\r\n\r\n getDirections(from: google.maps.LatLng, to: google.maps.LatLng, wayPoints?: google.maps.LatLng[], optimizeWaypoints = false): angular.IPromise {\r\n if (!wayPoints) {\r\n return this.getDirectionsSimple(from, to);\r\n }\r\n\r\n const directionsService = new google.maps.DirectionsService();\r\n\r\n const request: google.maps.DirectionsRequest = {\r\n origin: from,\r\n destination: to,\r\n travelMode: google.maps.TravelMode.DRIVING,\r\n unitSystem: google.maps.UnitSystem.IMPERIAL,\r\n provideRouteAlternatives: true,\r\n optimizeWaypoints: optimizeWaypoints,\r\n waypoints: []\r\n };\r\n\r\n if (wayPoints) {\r\n wayPoints.forEach(waypoint => {\r\n request.waypoints.push({\r\n location: waypoint,\r\n stopover: true // true with multiple waypoints will optimise the route\r\n });\r\n });\r\n }\r\n\r\n const deferred = this.$q.defer();\r\n\r\n directionsService.route(request, (result, status) => {\r\n if (status === google.maps.DirectionsStatus.OK) {\r\n deferred.resolve(result);\r\n }\r\n else {\r\n deferred.reject(status);\r\n }\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n getDirectionsSimple(from: google.maps.LatLng, to: google.maps.LatLng): angular.IPromise {\r\n return this\r\n .$http({\r\n url: \"/api/google/getDirections\",\r\n method: \"POST\",\r\n data: { From: [from.lat(), from.lng()], To: [to.lat(), to.lng()] }\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n const directions = result.data;\r\n\r\n directions.routes.forEach(route => {\r\n route.legs.forEach(leg => {\r\n leg.steps.forEach((step: any) => {\r\n step.path = this.decodePolyline(step.polyline.points);\r\n });\r\n });\r\n });\r\n\r\n\r\n return result.data;\r\n });\r\n }\r\n\r\n private decodePolyline(encoded): google.maps.LatLng[] {\r\n if (!encoded) {\r\n return [];\r\n }\r\n const poly: google.maps.LatLng[] = [];\r\n let index = 0;\r\n const len = encoded.length;\r\n let lat = 0;\r\n let lng = 0;\r\n\r\n while (index < len) {\r\n let b;\r\n let shift = 0;\r\n let result = 0;\r\n\r\n do {\r\n b = encoded.charCodeAt(index++) - 63;\r\n result = result | ((b & 0x1f) << shift);\r\n shift += 5;\r\n } while (b >= 0x20);\r\n\r\n const dlat = (result & 1) != 0 ? ~(result >> 1) : (result >> 1);\r\n lat += dlat;\r\n\r\n shift = 0;\r\n result = 0;\r\n\r\n do {\r\n b = encoded.charCodeAt(index++) - 63;\r\n result = result | ((b & 0x1f) << shift);\r\n shift += 5;\r\n } while (b >= 0x20);\r\n\r\n const dlng = (result & 1) != 0 ? ~(result >> 1) : (result >> 1);\r\n lng += dlng;\r\n\r\n const p = new google.maps.LatLng(lat / 1e5, lng / 1e5);\r\n\r\n poly.push(p);\r\n }\r\n return poly;\r\n }\r\n\r\n flattenLegs(legs: google.maps.DirectionsLeg[]): google.maps.DirectionsLeg {\r\n //console.log(\"flattenLegs\", legs);\r\n\r\n if (!legs || legs.length === 0) {\r\n return null;\r\n }\r\n\r\n if (legs.length === 1) {\r\n return legs[0];\r\n }\r\n\r\n const returnLeg = angular.copy(legs[0]);\r\n\r\n for (let i = 1; i < legs.length; i++) {\r\n const leg = legs[i];\r\n\r\n // Todo: Flesh this out\r\n returnLeg.distance.value += leg.distance.value;\r\n returnLeg.duration.value += leg.duration.value;\r\n\r\n //console.warn(\"distance:\", returnLeg.distance.value, \"duration\", returnLeg.duration.value);\r\n }\r\n\r\n this.updateDistanceText(returnLeg.distance);\r\n this.updateDurationText(returnLeg.duration);\r\n\r\n //console.error(\"distance:\", returnLeg.distance.text, returnLeg.distance.value, \"duration\", returnLeg.duration.text, returnLeg.duration.value);\r\n\r\n return returnLeg;\r\n }\r\n\r\n updateDistanceText(distance: google.maps.Distance) {\r\n distance.text = (Math.round(distance.value * 0.000621371 * 10) / 10).toString() + \" mi\";\r\n }\r\n\r\n updateDurationText(duration: google.maps.Duration) {\r\n const durationMoment: any = moment.duration(duration.value * 1000);\r\n\r\n if (duration.value >= 60 * 1000) {\r\n duration.text = durationMoment.format(\"h [hours], m [mins]\");\r\n } else {\r\n duration.text = durationMoment.format(\"m [mins]\");\r\n }\r\n }\r\n\r\n updatePlotsElevation(plots: IPlot[]): angular.IPromise {\r\n const latLngList = this.mapService.convertPlotsToGoogleLatLng(plots);\r\n\r\n const elevationPromise = this.getElevationForLatLngs(latLngList);\r\n\r\n elevationPromise.then(elevationResults => {\r\n for (let i = 0; i < plots.length; i++) {\r\n plots[i].elevation = elevationResults[i].elevation;\r\n }\r\n });\r\n\r\n return elevationPromise;\r\n }\r\n\r\n getElevationForLatLngs(latLngs: google.maps.LatLng[]): angular.IPromise {\r\n\r\n const elevationService = new google.maps.ElevationService();\r\n\r\n // Convert our latlngs into an appropriate format for the roads\r\n const maxLatLngsPerRequest = 500; // 512\r\n const requestArray: angular.IPromise[] = [];\r\n\r\n for (let i = 0; i < Math.ceil(latLngs.length / maxLatLngsPerRequest); i++) {\r\n const requestLatLngs = latLngs.slice(i * maxLatLngsPerRequest, (i + 1) * maxLatLngsPerRequest);\r\n\r\n const deferred = this.$q.defer();\r\n\r\n const elevationRequest: google.maps.PathElevationRequest = {\r\n path: requestLatLngs,\r\n samples: requestLatLngs.length\r\n };\r\n\r\n elevationService.getElevationAlongPath(\r\n elevationRequest,\r\n (results: google.maps.ElevationResult[], status: google.maps.ElevationStatus) => {\r\n if (status === google.maps.ElevationStatus.OK) {\r\n deferred.resolve(results);\r\n } else {\r\n deferred.reject(status);\r\n }\r\n });\r\n\r\n requestArray.push(deferred.promise);\r\n }\r\n\r\n return this.$q\r\n .all(requestArray)\r\n .then(allElevationResults => {\r\n\r\n var results: google.maps.ElevationResult[] = [];\r\n\r\n allElevationResults.forEach(elevationResults => {\r\n results.push.apply(results, elevationResults);\r\n });\r\n\r\n return results;\r\n })\r\n .catch(() => {\r\n console.warn(\"Elevation request error\");\r\n return [];\r\n });\r\n }\r\n\r\n getRouteMapUrl(latlngs: google.maps.LatLng[], polylineColor: string = null): ng.IPromise {\r\n const startLat = latlngs[0].lat();\r\n const startLng = latlngs[0].lng();\r\n\r\n const endIndex = latlngs.length - 1;\r\n const endLat = latlngs[endIndex].lat();\r\n const endLng = latlngs[endIndex].lng();\r\n\r\n const markers = `markers=color:0x209058|${startLat},${startLng}&markers=color:0xcf4946|${endLat},${endLng}`;\r\n\r\n return this.getPolylineMapUrl(latlngs, polylineColor || \"0x00426aff\", markers, \"278x173\");\r\n }\r\n\r\n getPolylineMapUrl(latlngs: google.maps.LatLng[], polylineColor: string, markers: string, size = \"278x133\"): ng.IPromise {\r\n\r\n const encodedPolyline = google.maps.geometry.encoding.encodePath(latlngs as any);\r\n\r\n const path = `path=weight:3|color:${polylineColor}|enc:${encodedPolyline}`;\r\n const partialUrl = `${markers}&${path}`;\r\n\r\n return this.makeGoogleMapsImageRequest(partialUrl, size);\r\n }\r\n\r\n getMapUrl(center: google.maps.LatLng, zoom = 12, size = \"278x133\") {\r\n const partialUrl = `center=${center.lat()},${center.lng()}&zoom=${zoom}&style=feature:all|element:labels|visibility:off&style=feature:road|element:labels|visibility:on`;\r\n\r\n return this.makeGoogleMapsImageRequest(partialUrl, size);\r\n }\r\n\r\n\r\n private getDistanceInMetres(plot1: google.maps.LatLng, plot2: google.maps.LatLng): number {\r\n return this.mapService.getDistance(plot1.lat(), plot1.lng(), plot2.lat(), plot2.lng(), true);\r\n }\r\n\r\n private toRad(deg): number {\r\n return deg * (Math.PI / 180);\r\n }\r\n\r\n private googleSnapToRoads(latlngs: google.maps.LatLng[]): angular.IPromise {\r\n\r\n const requestArray = this.chunkLatLngStringRequests(latlngs, 100, (latLngString: string) => {\r\n console.log(\"googleSnapToRoads\", latLngString);\r\n return this.sendSnapToRoadsRequest(latLngString);\r\n });\r\n\r\n return requestArray.then((response) => {\r\n const snappedLatLngs: google.maps.LatLng[] = [];\r\n\r\n response.forEach(roadData => {\r\n if (roadData.snappedPoints) {\r\n roadData.snappedPoints.forEach(p => {\r\n snappedLatLngs.push(new google.maps.LatLng(p.Location.lat, p.Location.lng));\r\n });\r\n }\r\n });\r\n\r\n return snappedLatLngs;\r\n });\r\n }\r\n\r\n private makeGoogleMapsImageRequest(partialurl: string, size = \"278x133\"): ng.IPromise {\r\n const key = \"AIzaSyDhlFpGkr2YjeBNKf-GWNCUgGf-QA9XMB0\";\r\n const host = \"https://maps.googleapis.com/maps/api/staticmap\";\r\n\r\n const fullUrl = `${host}?key=${key}&size=${size}&${partialurl}`;\r\n\r\n return this.$http(\r\n {\r\n method: \"GET\",\r\n url: `/api/google/signurl?url=${encodeURIComponent(fullUrl)}`\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n private chunkLatLngRequests(latLngs: google.maps.LatLng[], maxLatLngsPerRequest: number, request: (latLngs: number[][]) => angular.IPromise): angular.IPromise {\r\n const requestArray: angular.IPromise[] = [];\r\n\r\n while (latLngs.length > 0) {\r\n const subList = latLngs.splice(0, maxLatLngsPerRequest);\r\n\r\n const latLngList: number[][] = [];\r\n for (let i = 0; i < subList.length; i++) {\r\n latLngList.push([\r\n Number(subList[i].lat().toPrecision(6)),\r\n Number(subList[i].lng().toPrecision(6))\r\n ]);\r\n }\r\n\r\n requestArray.push(request(latLngList));\r\n }\r\n\r\n return this.$q.all(requestArray);\r\n }\r\n\r\n private chunkLatLngStringRequests(latLngs: google.maps.LatLng[], maxLatLngsPerRequest: number, request: (latLngString: string) => angular.IPromise): angular.IPromise {\r\n const requestArray: angular.IPromise[] = [];\r\n\r\n while (latLngs.length > 0) {\r\n const subList = latLngs.splice(0, maxLatLngsPerRequest);\r\n let latLngString = \"\";\r\n\r\n for (let i = 0; i < subList.length; i++) {\r\n const latLng = subList[i];\r\n\r\n if (latLngString.length) {\r\n latLngString += \"|\";\r\n }\r\n\r\n latLngString += latLng.toUrlValue();\r\n }\r\n\r\n requestArray.push(request(latLngString));\r\n }\r\n\r\n return this.$q.all(requestArray);\r\n }\r\n\r\n private sendSnapToRoadsRequest(latLngString: string, interpolate: boolean = true) {\r\n return this.$http(\r\n {\r\n url: \"https://roads.googleapis.com/v1/snapToRoads\",\r\n method: \"GET\",\r\n params: {\r\n key: \"hw/iVd9EGICXMSKp1fcTl9fBdUJf7ZBwWbckurpHHdDQ0OF7X4IlcK+YQMsRn/m/=\",\r\n interpolate: interpolate,\r\n path: latLngString\r\n }\r\n })\r\n .then((roadData: angular.IHttpPromiseCallbackArg) => {\r\n return roadData.data;\r\n });\r\n }\r\n}\r\n","\r\nimport * as moment from \"moment\";\r\n\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\n\r\nexport interface IVehicleData {\r\n Id: number;\r\n\r\n LastUpdated: Date;\r\n\r\n VehicleId: number;\r\n\r\n Registration: string;\r\n\r\n Vehicle: IVehicle;\r\n\r\n Width: string;\r\n\r\n Wheelbase: string;\r\n\r\n Weight: string;\r\n\r\n Vin: string;\r\n\r\n VehicleYear: string;\r\n\r\n VehicleType: string;\r\n\r\n VehicleGrossWeight: string;\r\n\r\n Valves: string;\r\n\r\n //ValidTax: boolean;\r\n\r\n //ValidMot: boolean;\r\n\r\n VRM: string;\r\n\r\n UrbanColdMpg: string;\r\n\r\n TransmissionType: string;\r\n\r\n TrailerUnbraked: string;\r\n\r\n TrailerBraked: string;\r\n\r\n TorqueRpm: string;\r\n\r\n TorqueNm: string;\r\n\r\n TorqueLbFt: string;\r\n\r\n TaxStatus: string;\r\n\r\n TaxExpiry: Date;\r\n\r\n NumberOfSeats: string;\r\n\r\n MotStatus: string;\r\n\r\n MotExpiry: Date;\r\n\r\n ModelversionToYear: string;\r\n\r\n ModelversionToMonth: string;\r\n\r\n ModelVersionNumber: string;\r\n\r\n ModelVersionFromYear: string;\r\n\r\n ModelVersionFromMonth: string;\r\n\r\n Model: string;\r\n\r\n MaxTechMass: string;\r\n\r\n MaxSpeedMph: string;\r\n\r\n MaxNetPower: string;\r\n\r\n MassInService: string;\r\n\r\n ManufacturerVersionCode: string;\r\n\r\n Make: string;\r\n\r\n Length: string;\r\n\r\n Kw: string;\r\n\r\n ImageName: string;\r\n\r\n Height: string;\r\n\r\n Gears: string;\r\n\r\n FuelDelivery: string;\r\n\r\n Fuel: string;\r\n\r\n ExtraUrbanMpg: string;\r\n\r\n ExactCc: string;\r\n\r\n EuroStatus: string;\r\n\r\n EngineSizeDescripion: string;\r\n\r\n EngineNumber: string;\r\n\r\n EngineMake: string;\r\n\r\n EngineCode: string;\r\n\r\n EngineAlignment: string;\r\n\r\n DvlaModel: string;\r\n\r\n DvlaMake: string;\r\n\r\n DriveType: string;\r\n\r\n Doors: string;\r\n\r\n Derivative: string;\r\n\r\n DateOfRegistration: string;\r\n\r\n Cylinders: string;\r\n\r\n CountryOfOrigin: string;\r\n\r\n CombinedMpg: string;\r\n\r\n Colour: string;\r\n\r\n Co2: string;\r\n\r\n Cc: string;\r\n\r\n Bore: string;\r\n\r\n BodyStyle: string;\r\n\r\n Bhp: string;\r\n\r\n AxleName: string;\r\n\r\n AccelerationMph: string;\r\n \r\n motExpirationStatus: DataValidationStatus;\r\n taxExpirationStatus: DataValidationStatus;\r\n}\r\n\r\nexport enum DataValidationStatus {\r\n NoDetailsFound,\r\n Valid,\r\n DueSoon,\r\n Expired\r\n}\r\n","\r\nexport enum DriverAssignmentSource {\r\n DigiDl = 0,\r\n Unit = 1,\r\n ButtonPress = 2,\r\n ManualAssignment = 3\r\n}\r\n","\r\nexport enum UserAccessPermissions {\r\n None = 0,\r\n ViewHistory = 1,\r\n ManageVehicles = 2,\r\n ManageDrivers = 4,\r\n ManageGeofences = 8,\r\n ViewMessages = 16,\r\n ManageJobsAndTms = 32,\r\n ManageGroups = 64,\r\n ViewVideos = 128,\r\n ViewJobsAndTms = 256,\r\n ManageAlerts = 512,\r\n ManageReportBuilder = 1024,\r\n All = ~None\r\n}\r\n","import { IVorRecord, VorRecordStatus } from \"@components/resourceManagement/vor/vor.interfaces\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport * as angular from \"angular\";\r\nimport * as moment from \"moment\";\r\n\r\nexport class VorService {\r\n\r\n updatedVorRecord: IVorRecord = null;\r\n deletedVorId = 0;\r\n\r\n static $inject = [\"$q\", \"$http\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $http: angular.IHttpService,\r\n private readonly translationService: TranslationService) {\r\n }\r\n\r\n permanentDate = moment(new Date(2200, 0, 1));\r\n\r\n checkForOverlappingVorRecords(vorRecord: IVorRecord, vorRecords: IVorRecord[]): boolean {\r\n let isOverlapping = false;\r\n\r\n vorRecords.forEach(v => {\r\n if (v.Id === vorRecord.Id) {\r\n return;\r\n }\r\n\r\n if (v.vorStatus === 'Active' && moment(v.EndDate).isAfter(vorRecord.StartDate)) {\r\n isOverlapping = true;\r\n }\r\n\r\n if (v.vorStatus === 'Pending' && !vorRecord.EndDate) {\r\n isOverlapping = true;\r\n }\r\n\r\n if (vorRecord.EndDate && !v.EndDate && moment(vorRecord.EndDate).isAfter(v.StartDate)) {\r\n isOverlapping = true;\r\n }\r\n\r\n if (!v.EndDate && moment(vorRecord.EndDate).isAfter(v.StartDate)) {\r\n isOverlapping = true;\r\n }\r\n\r\n if (v.EndDate && moment(vorRecord.StartDate).isBetween(v.StartDate, v.EndDate)) {\r\n isOverlapping = true;\r\n }\r\n\r\n if (vorRecord.EndDate && v.EndDate && moment(vorRecord.EndDate).isBetween(v.StartDate, v.EndDate)) {\r\n isOverlapping = true;\r\n }\r\n\r\n if (vorRecord.EndDate && v.EndDate && moment(vorRecord.StartDate).isBefore(v.StartDate) && moment(vorRecord.EndDate).isAfter(v.EndDate)) {\r\n isOverlapping = true;\r\n }\r\n });\r\n\r\n return isOverlapping;\r\n }\r\n\r\n getCurrentRecords(invalidateCache = false): angular.IPromise {\r\n return this.$http({\r\n url: `/api/vor/current/`,\r\n method: \"GET\",\r\n params: { minsToLive: 30, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpResponse) => {\r\n const list: IVorRecord[] = [];\r\n\r\n response.data.forEach(r => list.push(this.mapToUi(r)));\r\n\r\n return list;\r\n });\r\n }\r\n\r\n getCurrentAndFutureVorRecords(invalidateCache = false): angular.IPromise {\r\n return this.$http({\r\n url: `/api/vor/future/`,\r\n method: \"GET\",\r\n params: { minsToLive: 30, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpResponse) => {\r\n const list: IVorRecord[] = [];\r\n\r\n response.data.forEach(r => list.push(this.mapToUi(r)));\r\n\r\n return list;\r\n });\r\n }\r\n\r\n getVehicleRecords(vehicleId: number, mapToUi = true, invalidateCache = false): angular.IPromise {\r\n return this.$http({\r\n url: `/api/vor/vehicle/${vehicleId}/`,\r\n method: \"GET\",\r\n params: { minsToLive: 30, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpResponse) => {\r\n\r\n if (!mapToUi) {\r\n return response.data;\r\n }\r\n\r\n const list: IVorRecord[] = [];\r\n\r\n response.data.forEach(r => list.push(this.mapToUi(r)));\r\n\r\n return list;\r\n });\r\n }\r\n\r\n deleteRecord(id: number): angular.IPromise {\r\n this.deletedVorId = id;\r\n this.updatedVorRecord = null;\r\n\r\n return this.$http({\r\n url: `/api/vor/delete/${id}/`,\r\n method: \"GET\"\r\n })\r\n .then(() => {\r\n return this.invalidateVorCache(id).then(() => {\r\n return true;\r\n });\r\n });\r\n }\r\n\r\n invalidateVorCache(id: number): angular.IPromise {\r\n const getAllRecordsPromise = this.getCurrentRecords(true);\r\n\r\n return this.$q.all([getAllRecordsPromise]).then(() => {\r\n return true;\r\n });\r\n }\r\n\r\n saveRecord(vorRecord: IVorRecord): angular.IPromise {\r\n return this.$http({\r\n url: `/api/vor/save/`,\r\n data: this.mapFromUi(vorRecord),\r\n method: \"POST\"\r\n })\r\n .then((response: angular.IHttpResponse) => {\r\n return this.mapToUi(response.data);\r\n })\r\n }\r\n\r\n updateOrCreateCachedRecord(index: number, vorRecords: IVorRecord[]) {\r\n if (index >= 0) {\r\n vorRecords.splice(index, 1, angular.copy(this.updatedVorRecord));\r\n } else {\r\n vorRecords.push(angular.copy(this.updatedVorRecord));\r\n }\r\n }\r\n\r\n updateCachedData(vorRecords: IVorRecord[]) {\r\n if (this.updatedVorRecord) {\r\n // extra getIndex code needed here because zero Id is returned from db on creation of Vor record\r\n const index = this.updatedVorRecord.Id > 0 ? this.getVorIndex(this.updatedVorRecord.Id, vorRecords) : this.getVorIndexOnCreate(this.updatedVorRecord, vorRecords);\r\n this.updateOrCreateCachedRecord(index, vorRecords);\r\n this.updatedVorRecord = null;\r\n }\r\n if (this.deletedVorId) {\r\n const index = this.getVorIndex(this.deletedVorId, vorRecords);\r\n if (index >= 0) {\r\n vorRecords.splice(index, 1);\r\n }\r\n this.deletedVorId = 0;\r\n }\r\n }\r\n\r\n private mapToUi(vorRecord: IVorRecord): IVorRecord {\r\n vorRecord.StartDate = moment(vorRecord.StartDate).toDate();\r\n\r\n if (moment(vorRecord.EndDate).toDate() >= this.permanentDate.toDate()) {\r\n vorRecord.EndDate = null;\r\n } else {\r\n vorRecord.EndDate = moment(vorRecord.EndDate).toDate();\r\n }\r\n this.setVorStatus(vorRecord);\r\n\r\n return vorRecord;\r\n }\r\n\r\n private mapFromUi(vorRecord: IVorRecord): IVorRecord {\r\n const recordToSave = angular.copy(vorRecord);\r\n\r\n if (!recordToSave.EndDate) {\r\n recordToSave.EndDate = this.permanentDate.toDate();\r\n }\r\n\r\n return recordToSave;\r\n }\r\n\r\n private getVorIndexOnCreate(vorRecord: IVorRecord, vorRecords: IVorRecord[]): number {\r\n for (let i = 0; i < vorRecords.length; i++) {\r\n const record = vorRecords[i];\r\n if (record.VehicleId === vorRecord.VehicleId && record.Description === vorRecord.Description) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n private getVorIndex(id: number, vorRecords: IVorRecord[]): number {\r\n for (let i = 0; i < vorRecords.length; i++) {\r\n if (vorRecords[i].Id === id) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n private setVorStatus(vorRecord: IVorRecord) {\r\n const now = moment().toDate();\r\n\r\n if (vorRecord.EndDate && vorRecord.EndDate <= now) {\r\n vorRecord.status = VorRecordStatus.Completed;\r\n vorRecord.vorStatus = this.translationService.t(\"vorService.completed\");\r\n }\r\n else if (vorRecord.StartDate > now) {\r\n vorRecord.status = VorRecordStatus.Pending;\r\n vorRecord.vorStatus = this.translationService.t(\"vorService.pending\");\r\n }\r\n else {\r\n vorRecord.status = VorRecordStatus.Active;\r\n vorRecord.vorStatus = this.translationService.t(\"vorService.active\");\r\n }\r\n }\r\n}\r\n","import { Component, EventEmitter, forwardRef, Inject, Input, Optional, Output, SimpleChanges, ViewChild } from \"@angular/core\";\r\nimport { VFlvPlayer } from \"@app/directives/_misc/flvPlayer/flv-player.component\";\r\nimport { VStreamCollectionComponent } from \"@app/directives/_veri/veriVideo/v-stream-collection/v-stream-collection.component\";\r\nimport { FlvPlayerMediaInfo, IStreamPlayer } from \"@app/interfaces/IStreamPlayer\";\r\nimport { IVideoStreamError } from \"@app/interfaces/IVideoStreamError\";\r\nimport { FtCloudStreamType, IVideoStream } from \"@app/main/components/videos/models/ICameraChannel\";\r\nimport { CameraService } from \"@app/main/components/videos/services/camera.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { combineLatest, from, Subject } from \"rxjs\";\r\nimport { filter, switchMap } from \"rxjs/operators\";\r\nimport './v-vehicle-video-stream.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'v-vehicle-video-stream',\r\n template: require('./v-vehicle-video-stream.component.html')\r\n})\r\nexport class VVehicleVideoStreamComponent {\r\n private receivedMediaSub = new Subject();\r\n private highQualitySub = new Subject();\r\n\r\n @Input() streamingChannel: IVideoStream;\r\n @Input() streamTimeout: number = 1;\r\n @Input() showRestartOnTimeout: boolean = true;\r\n @Input() timeoutOnMouseIdle: boolean;\r\n\r\n @Output() cameraUnavailable = new EventEmitter();\r\n @Output() receivedMedia = new EventEmitter<{ mediaInfo: FlvPlayerMediaInfo }>();\r\n @Output() videoTimeout = new EventEmitter();\r\n @Output() videoRestart = new EventEmitter();\r\n\r\n @ViewChild('flvPlayer') flvPlayer: VFlvPlayer;\r\n\r\n videoUrl: string;\r\n loading: boolean = true;\r\n message: string;\r\n errorMessage: string;\r\n showRestart: boolean;\r\n videoLoadSuccessful: boolean;\r\n\r\n networkTimeout: ReturnType;\r\n constructor(\r\n @Optional() @Inject(forwardRef(() => VStreamCollectionComponent)) private parent: VStreamCollectionComponent,\r\n private readonly translationService: TranslationService,\r\n private readonly cameraService: CameraService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.initStreamUpdatedSub();\r\n this.initHQToggleSub();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n this.setVideoUrl();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n clearTimeout(this.networkTimeout);\r\n }\r\n\r\n onVideoError(event: { type: string, message: string, details: IVideoStreamError }): void {\r\n console.error(this.translationService.t(\"VehicleVideoStream.liveVideoError\"), event.type, event.message, event.details);\r\n\r\n this.loading = false;\r\n\r\n if (event.details.code === 408) {\r\n this.errorMessage = this.translationService.t(\"vehicleVideoStream.cameraUnavailable\");\r\n }\r\n else {\r\n this.errorMessage = this.translationService.t(\"vehicleVideoStream.networkTimeout\");\r\n if (this.showRestartOnTimeout) {\r\n this.showRestart = true;\r\n }\r\n }\r\n this.cameraUnavailable.emit(this.streamingChannel);\r\n }\r\n\r\n onVideoReceivedMedia(event: { mediaInfo: FlvPlayerMediaInfo }): void {\r\n this.loading = false;\r\n this.videoLoadSuccessful = true;\r\n \r\n this.receivedMediaSub.next(true);\r\n this.receivedMedia.emit({ mediaInfo: event.mediaInfo });\r\n }\r\n\r\n onVideoTimeout(): void {\r\n console.error(this.translationService.t(\"VehicleVideoStream.liveVideoTimeout\"));\r\n\r\n this.message = this.translationService.t(\"vehicleVideoStream.videoStopped\");\r\n\r\n if (this.showRestartOnTimeout) {\r\n this.showRestart = true;\r\n }\r\n\r\n this.videoTimeout.emit();\r\n }\r\n\r\n onVideoPlaybackNotSupported(): void {\r\n console.error(\"VehicleVideoStream.videoPlaybackNotSupported\");\r\n this.errorMessage = this.translationService.t('vehicleVideoStream.notSupported');\r\n this.loading = false;\r\n this.showRestart = false;\r\n this.cameraUnavailable.emit(this.streamingChannel);\r\n }\r\n\r\n restartVideo($event: MouseEvent): void {\r\n $event.stopPropagation();\r\n if (!this.flvPlayer.player) {\r\n return;\r\n }\r\n\r\n this.message = \"\";\r\n this.errorMessage = \"\";\r\n this.showRestart = false;\r\n this.loading = true;\r\n\r\n this.videoUrl = null;\r\n this.videoRestart.emit(this.streamingChannel);\r\n }\r\n\r\n toggleHighQuality(hq: boolean): void {\r\n this.highQualitySub.next(hq);\r\n }\r\n\r\n play(): Promise {\r\n if (!this.flvPlayer.player) {\r\n return;\r\n }\r\n\r\n return this.flvPlayer.player.play();\r\n }\r\n\r\n pause(): void {\r\n if (!this.flvPlayer.player) {\r\n return;\r\n }\r\n\r\n this.flvPlayer.player.pause();\r\n }\r\n\r\n //--\r\n\r\n private setVideoUrl(): void {\r\n if (!this.streamingChannel) {\r\n return;\r\n }\r\n\r\n this.errorMessage = \"\";\r\n this.message = \"\";\r\n this.showRestart = false;\r\n\r\n this.videoUrl = this.streamingChannel.StreamUrl;\r\n\r\n this.networkTimeout = setTimeout(() => {\r\n if (!this.videoLoadSuccessful) {\r\n this.loading = false;\r\n this.errorMessage = this.translationService.t(\"vehicleVideoStream.networkTimeout\");\r\n this.pause();\r\n this.cameraUnavailable.emit(this.streamingChannel);\r\n }\r\n }, 10_000)\r\n\r\n }\r\n\r\n private initStreamUpdatedSub(): void {\r\n this.parent.streamUpdated.pipe(untilDestroyed(this)).subscribe(stream => {\r\n if (stream.ChannelId !== this.streamingChannel.ChannelId) {\r\n return;\r\n }\r\n \r\n this.streamingChannel = stream;\r\n this.setVideoUrl();\r\n })\r\n }\r\n\r\n private initHQToggleSub(): void {\r\n combineLatest([this.highQualitySub, this.receivedMediaSub]).pipe(\r\n untilDestroyed(this),\r\n filter(([_, receivedMedia]) => receivedMedia && !this.errorMessage && !this.message),\r\n switchMap(([highQuality, _]) => {\r\n const streamType = highQuality\r\n ? FtCloudStreamType.Mainstream\r\n : FtCloudStreamType.Substream;\r\n\r\n const streamId = this.getCurrentStreamId();\r\n return from(this.cameraService.switchStreamType(streamId, streamType));\r\n })\r\n ).subscribe();\r\n }\r\n\r\n private getCurrentStreamId(): string {\r\n const streamUrl = this.streamingChannel.StreamUrl!;\r\n const urlBySlash = streamUrl.split('/');\r\n const lastSegment = urlBySlash[urlBySlash.length - 1];\r\n const lastSegmentByDot = lastSegment.split('.');\r\n\r\n return lastSegmentByDot[0];\r\n }\r\n\r\n}\r\n","import { CameraLocation } from \"../enums/CameraLocation\";\r\nimport { CameraChannelType } from \"../enums/CameraChannelType\";\r\nimport { IMedia } from \"./IMedia\";\r\n\r\nexport interface ICameraChannel extends IMedia {\r\n Id?: number;\r\n VehicleId?: number;\r\n ChannelId?: number;\r\n IsActive?: boolean;\r\n CameraLocation?: CameraLocation;\r\n CameraChannelType?: CameraChannelType;\r\n\r\n // ------------------\r\n\r\n visible?: boolean;\r\n}\r\n\r\nexport interface IVideoStream extends IMedia {\r\n ChannelId?: number;\r\n IsActive?: boolean;\r\n CameraLocation?: CameraLocation;\r\n CameraChannelType?: CameraChannelType;\r\n StreamUrl?: string;\r\n PlaybackSession?: string;\r\n\r\n // -------------\r\n\r\n visible?: boolean;\r\n focused?: boolean;\r\n errored?: boolean;\r\n}\r\n\r\nexport enum UrlRequired {\r\n LiveStream,\r\n Historical\r\n}\r\n\r\nexport enum FtCloudStreamType {\r\n All,\r\n Mainstream,\r\n Substream\r\n}\r\n","import { Component, Input, OnInit } from \"@angular/core\";\r\nimport \"./dashboardBoxSmall.component.scss\";\r\n\r\n@Component({\r\n selector: \"dashboard-box-small\",\r\n template: require(\"./dashboardBoxSmall.component.html\")\r\n})\r\nexport class DashboardBoxSmallComponent {\r\n @Input() boxIcon: string;\r\n @Input() boxIconClass: string;\r\n @Input() boxTitle: string;\r\n @Input() boxSubtitle: string;\r\n @Input() color: string;\r\n\r\n // ---\r\n\r\n constructor() {\r\n //console.log('boxIcon', this.boxIcon);\r\n //console.log('boxIconClass', this.boxIconClass);\r\n //console.log('boxTitle', this.boxTitle);\r\n //console.log('boxSubtitle', this.boxSubtitle);\r\n }\r\n}\r\n","import { AfterViewInit, Component, ElementRef, HostBinding, Input, OnChanges, OnInit, SimpleChanges, ViewChild } from \"@angular/core\";\r\nimport \"./v-descriptive-list-item.component.scss\";\r\n\r\n\r\n@Component({\r\n selector: \"v-descriptive-list-item\",\r\n template: require(\"./v-descriptive-list-item.component.html\")\r\n})\r\nexport class VDescriptiveListItemComponent implements AfterViewInit {\r\n\r\n @Input() title: string;\r\n @Input() description: string;\r\n\r\n @Input() @HostBinding(\"class.clickable\") clickable: boolean;\r\n\r\n @ViewChild('titleStartContainer', { static: true }) titleStartContainer: ElementRef;\r\n @ViewChild('titleEndContainer', { static: true }) titleEndContainer: ElementRef;\r\n @ViewChild('titleContainer', { static: true }) titleContainer: ElementRef;\r\n @ViewChild('descriptionContainer', { static: true }) descriptionContainer: ElementRef;\r\n\r\n constructor() {}\r\n\r\n ngAfterViewInit(): void {\r\n this.removeElementsIfEmpty();\r\n }\r\n\r\n // ---\r\n\r\n private removeElementsIfEmpty(): void {\r\n if (!this.titleStartContainer?.nativeElement?.innerHTML) {\r\n this.titleStartContainer.nativeElement.remove();\r\n }\r\n\r\n if (!this.titleEndContainer?.nativeElement?.innerHTML) {\r\n this.titleEndContainer.nativeElement.remove();\r\n }\r\n\r\n if (!this.titleContainer?.nativeElement?.innerHTML) {\r\n this.titleContainer.nativeElement.remove();\r\n }\r\n\r\n if (!this.descriptionContainer?.nativeElement?.innerHTML) {\r\n this.descriptionContainer.nativeElement.remove();\r\n }\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnInit, Output } from \"@angular/core\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport \"./v-tags.component.scss\";\r\n\r\nexport interface IVeriTag {\r\n id?: number;\r\n label: string;\r\n data?: T;\r\n\r\n show?: boolean;\r\n showRemove?: boolean;\r\n accentColor?: string;\r\n clickCallback?: () => void;\r\n}\r\n\r\n@Component({\r\n selector: \"v-tags\",\r\n template: require(\"./v-tags.component.html\")\r\n})\r\nexport class VTagsComponent implements OnInit {\r\n\r\n @Input() tags: IVeriTag[] = [];\r\n @Input() showAdd: boolean = false;\r\n @Input() showRemove: boolean = true;\r\n @Input() fillVoid: boolean = false;\r\n @Input() voidLabel: string = this.translationService.t('vTags.noTags');\r\n @Input() max: number = -1;\r\n @Input() large: boolean = false;;\r\n\r\n @Output() onClickRemoveTag = new EventEmitter>();\r\n\r\n filteredTags: IVeriTag[] = [];\r\n\r\n constructor(private translationService: TranslationService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n ngOnChanges(): void {\r\n this.draw();\r\n }\r\n\r\n click(tag: any): void {\r\n // TODO\r\n if (tag?.clickCallback) {\r\n tag.clickCallback();\r\n }\r\n }\r\n\r\n remove(tag: IVeriTag): void {\r\n if (!tag) {\r\n return;\r\n }\r\n\r\n this.onClickRemoveTag.emit(tag);\r\n }\r\n\r\n // ---\r\n\r\n private draw(): void {\r\n if (this.showAdd) {\r\n const addTag = {\r\n id: -1,\r\n show: this.showAdd,\r\n label: ``,\r\n icon: `add_box`,\r\n clickCallback: null\r\n };\r\n\r\n if (this.tags.length == 0) {\r\n this.tags.push(addTag);\r\n }\r\n }\r\n\r\n this.filterTag();\r\n this.addVoidElement();\r\n }\r\n\r\n private filterTag(): void {\r\n this.filteredTags = this.tags?.filter((tags, index) => this.max === -1 || (index + 1) <= this.max);\r\n\r\n if (this.fillVoid) {\r\n\r\n }\r\n }\r\n\r\n private addVoidElement(): void {\r\n if (!this.fillVoid || this.tags?.length > 0) {\r\n return;\r\n }\r\n\r\n this.tags.push({\r\n id: -2,\r\n show: true,\r\n label: this.voidLabel,\r\n });\r\n }\r\n}\r\n","import { Component, Input } from \"@angular/core\";\r\nimport \"./veriBadge.scss\";\r\n\r\n@Component({\r\n selector: \"veri-badge\",\r\n template: require('./veriBadge.html')\r\n})\r\n\r\nexport class VeriBadgeComponent{\r\n\r\n @Input('count')count: number; \r\n\r\n constructor() {\r\n \r\n } \r\n}\r\n\r\n\r\n","import { AfterViewInit, Component, ElementRef, HostBinding, Input, OnChanges, OnInit, SimpleChanges, ViewChild } from \"@angular/core\";\r\nimport \"./veriCard.component.scss\";\r\n\r\n@Component({\r\n selector: \"veri-card\",\r\n template: require(\"./veriCard.component.html\")\r\n})\r\nexport class VeriCardComponent implements OnInit, OnChanges, AfterViewInit {\r\n @Input() cardTitle: string;\r\n @Input() compactTitle: boolean;\r\n @Input() titleCount: number;\r\n @Input() greyBackground: boolean;\r\n @Input() loading: boolean;\r\n @Input() padding: boolean;\r\n @Input() collapsed: boolean;\r\n @Input() collapsable: boolean;\r\n @Input() icon: string;\r\n\r\n //@HostBinding(\"class.flat-transparent\") @Input() flatTransparent: boolean;\r\n\r\n @ViewChild('titleContainer', { static: true }) titleContainer: ElementRef;\r\n @ViewChild('titleStart', { static: true }) titleStart: ElementRef;\r\n @ViewChild('titleEnd', { static: true }) titleEnd: ElementRef;\r\n @ViewChild('footer', { static: true }) footer: ElementRef;\r\n @ViewChild('actionFooter', { static: true }) actionFooter: ElementRef;\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {}\r\n\r\n ngAfterViewInit() { \r\n this.removeElementsIfEmpty();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (this.compactTitle == undefined) {\r\n this.compactTitle = true;\r\n }\r\n\r\n this.removeElementsIfEmpty();\r\n }\r\n\r\n toggleCollapsed(): void {\r\n if (this.collapsable) {\r\n this.collapsed = !this.collapsed;\r\n }\r\n }\r\n\r\n // ---\r\n\r\n private removeElementsIfEmpty(): void {\r\n if (!this.cardTitle && !this.titleStart?.nativeElement?.innerHTML && !this.titleEnd?.nativeElement?.innerHTML) {\r\n this.titleContainer.nativeElement.remove();\r\n }\r\n\r\n if (!this.footer?.nativeElement?.innerHTML) {\r\n this.footer.nativeElement.remove();\r\n }\r\n\r\n if (!this.actionFooter?.nativeElement?.innerHTML) {\r\n this.actionFooter.nativeElement.remove();\r\n }\r\n }\r\n}\r\n","import \"./veriColourPicker.scss\";\r\nimport { IColour } from \"@services/colour.service\";\r\nimport { Component, EventEmitter, Input, Output } from \"@angular/core\";\r\n\r\n@Component({\r\n selector: 'veri-colour-picker',\r\n template: require('./veriColourPicker.html')\r\n})\r\nexport class VeriColourPickerComponent {\r\n @Input() selectedColour: IColour;\r\n @Output() colourSelected: EventEmitter = new EventEmitter();\r\n\r\n @Input() availableColours: IColour[];\r\n\r\n constructor() { }\r\n\r\n selectColour(colour: IColour) {\r\n if (!colour || this.selectedColour && this.selectedColour.solidColour === colour.solidColour) {\r\n this.selectedColour = null;\r\n } else {\r\n this.selectedColour = colour;\r\n }\r\n\r\n this.colourSelected.emit(this.selectedColour);\r\n }\r\n}\r\n//import * as angular from \"angular\";\r\n\r\n//import \"./veriColourPicker.scss\";\r\n//import { IColour } from \"@services/colour.service\";\r\n\r\n//interface IColourPickerBindings {\r\n// avliableColours: IColour[];\r\n// selectedColour: IColour;\r\n\r\n// colourSelected: (args: { colour: IColour }) => void;\r\n//}\r\n\r\n//class ColourPickerComponentController implements angular.IComponentController, IColourPickerBindings {\r\n\r\n// avliableColours: IColour[];\r\n// selectedColour: IColour;\r\n\r\n// colourSelected: (args: { colour: IColour }) => void;\r\n \r\n// selectColour(colour: IColour) {\r\n// if (!colour || this.selectedColour && this.selectedColour.solidColour === colour.solidColour) {\r\n// this.selectedColour = null;\r\n// } else {\r\n// this.selectedColour = colour;\r\n// }\r\n\r\n// if (this.colourSelected) {\r\n// this.colourSelected({ colour: this.selectedColour });\r\n// }\r\n// }\r\n//}\r\n\r\n//export class ColourPickerComponent implements angular.IComponentOptions {\r\n// bindings: any;\r\n// controller: any;\r\n// template: string;\r\n\r\n// constructor() {\r\n// this.bindings = {\r\n// avliableColours: \"<\",\r\n// selectedColour: \"<\",\r\n\r\n// colourSelected: \"&\"\r\n// };\r\n\r\n// this.controller = ColourPickerComponentController;\r\n// this.template = require(\"./veriColourPicker.html\");\r\n\r\n// }\r\n//}\r\n","import { Component, HostBinding, Input } from \"@angular/core\";\r\nimport \"./veriInfoPanel.component.scss\";\r\n\r\n@Component({\r\n selector: \"veri-info-panel\",\r\n template: require(\"./veriInfoPanel.component.html\")\r\n})\r\nexport class VeriInfoPanelComponent {\r\n\r\n @Input() title: string;\r\n @Input() tinyMode: boolean;\r\n\r\n @HostBinding(\"class.has-icon\") @Input() icon: string;\r\n @HostBinding(\"class.warning\") @Input() warning: boolean;\r\n @HostBinding(\"class.transparent\") @Input() transparent: boolean;\r\n\r\n constructor() {\r\n }\r\n}\r\n","import { Component, EventEmitter, HostBinding, Input, OnInit, Output, SimpleChanges } from \"@angular/core\";\r\nimport \"./veriNumberField.component.scss\";\r\n\r\n@Component({\r\n selector: \"veri-number-field\",\r\n template: require(\"./veriNumberField.component.html\")\r\n})\r\nexport class VeriNumberFieldComponent implements OnInit {\r\n\r\n @Input() minValue: number;\r\n @Input() maxValue: number;\r\n @Input() disabled: boolean;\r\n @Input() value: number = 0;\r\n @Output() valueChange = new EventEmitter();\r\n @Output() onValueChanged = new EventEmitter();\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void { }\r\n\r\n increaseValue(): void {\r\n if (this.disabled) {\r\n return;\r\n }\r\n\r\n if (this.value + 1 > this.maxValue) {\r\n return;\r\n }\r\n\r\n this.value += 1;\r\n\r\n this.valueChange.emit(this.value);\r\n this.onValueChanged.emit();\r\n }\r\n\r\n decreaseValue(): void {\r\n if (this.disabled) {\r\n return;\r\n }\r\n\r\n if (this.value - 1 < this.minValue) {\r\n return;\r\n }\r\n\r\n this.value -= 1;\r\n\r\n this.valueChange.emit(this.value);\r\n this.onValueChanged.emit();\r\n }\r\n\r\n onInputValueChanged(value: number): void {\r\n if (this.disabled) {\r\n return;\r\n }\r\n\r\n this.value = +value;\r\n\r\n this.valueChange.emit(this.value);\r\n this.onValueChanged.emit();\r\n }\r\n}\r\n","import { Component, EventEmitter, forwardRef, Inject, Input, OnChanges, Optional, Output } from \"@angular/core\";\r\nimport { PageActionsComponent } from \"@directives/_layout/_page-design/page-actions/page-actions.component\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { DefaultLayoutComponent } from \"../../_layout/_page-design/_layouts/default-layout/default-layout.component\";\r\nimport \"./veriSearchBox.scss\";\r\n\r\n@Component({\r\n selector: \"veri-search-box\",\r\n template: require(\"./veriSearchBox.template.html\")\r\n})\r\nexport class VeriSearchBoxComponent implements OnChanges {\r\n @Input() search: string;\r\n\r\n @Input() placeholder: string;\r\n @Input() placeholderCount: number;\r\n @Input() greyBackground: boolean;\r\n\r\n @Output() searchChange: EventEmitter = new EventEmitter();\r\n @Output() onChange: EventEmitter = new EventEmitter();\r\n\r\n // ---\r\n\r\n translatedPlaceholder: string;\r\n\r\n constructor(\r\n @Optional() @Inject(forwardRef(() => DefaultLayoutComponent)) private parent: DefaultLayoutComponent,\r\n @Optional() @Inject(forwardRef(() => PageActionsComponent)) private pageActions: PageActionsComponent,\r\n private readonly translationService: TranslationService) {\r\n pageActions?.registerSearchBox(this);\r\n }\r\n\r\n ngOnChanges() {\r\n this.updatePlaceholderTranslation();\r\n }\r\n\r\n setSearchValue(value: string) {\r\n this.search = value;\r\n this.searchBoxChange();\r\n }\r\n\r\n searchBoxChange() {\r\n this.searchChange.emit(this.search); // Use this\r\n this.onChange.emit(this.search);\r\n }\r\n\r\n clearSearchTerm() {\r\n this.search = \"\";\r\n this.searchBoxChange();\r\n }\r\n\r\n // ---\r\n\r\n updatePlaceholderTranslation() {\r\n\r\n if (this.placeholder && this.placeholderCount) {\r\n this.translatedPlaceholder = this.translationService.t(\"VeriSearchBox.PlaceholderWithLabelAndCount\", [this.placeholder, this.placeholderCount.toLocaleString()]);\r\n }\r\n else if (this.placeholder) {\r\n this.translatedPlaceholder = this.translationService.t(\"VeriSearchBox.PlaceholderWithLabel\", this.placeholder);\r\n }\r\n else if (this.placeholderCount) {\r\n this.translatedPlaceholder = this.translationService.t(\"VeriSearchBox.PlaceholderWithCount\", this.placeholderCount.toLocaleString());\r\n }\r\n else {\r\n this.translatedPlaceholder = this.translationService.t(\"VeriSearchBox.Placeholder\");\r\n }\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from \"@angular/core\";\r\nimport \"./veriSimpleNav.scss\";\r\n\r\nexport interface IVeriPillNavLabel {\r\n label: string;\r\n count?: number;\r\n highlighted?: boolean;\r\n\r\n order?: number;\r\n icon?: string;\r\n}\r\n\r\nexport interface IVeriPillNavDataLabel extends IVeriPillNavLabel {\r\n data?: T;\r\n}\r\n\r\n@Component({\r\n selector: 'veri-simple-nav',\r\n template: require('./veriSimpleNav.html')\r\n})\r\nexport class VeriSimpleNavComponent implements OnChanges, OnInit{\r\n @Input() labels: IVeriPillNavLabel[];\r\n @Output() onLabelClicked: EventEmitter = new EventEmitter();\r\n\r\n constructor() { }\r\n\r\n ngOnInit() {\r\n this.labels.sort((a, b) => a.order - b.order);\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (this.labels && this.labels.length > 0) {\r\n let hasHighlighted = false;\r\n this.labels.forEach(label => {\r\n hasHighlighted = hasHighlighted || label.highlighted;\r\n });\r\n\r\n if (!hasHighlighted) {\r\n this.labels[0].highlighted = true;\r\n }\r\n }\r\n }\r\n\r\n labelClicked(label: IVeriPillNavLabel) {\r\n this.labels.forEach(l => {\r\n l.highlighted = false;\r\n });\r\n\r\n label.highlighted = true;\r\n\r\n if (this.onLabelClicked) {\r\n this.onLabelClicked.emit(label);\r\n }\r\n }\r\n}\r\n//import * as angular from \"angular\";\r\n\r\n//interface IVeriSimpleNavBindings {\r\n// labels: IVeriPillNavLabel[];\r\n\r\n// onLabelClicked: (args: { $label: IVeriPillNavLabel }) => void;\r\n//}\r\n\r\n//class VeriSimpleNavComponentController implements angular.IComponentController, IVeriSimpleNavBindings {\r\n\r\n// labels: IVeriPillNavLabel[];\r\n// onLabelClicked: (args: { $label: IVeriPillNavLabel }) => void;\r\n\r\n// static $inject = [];\r\n\r\n// constructor() {\r\n// }\r\n\r\n// $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n// // Set first to be the default highlight\r\n \r\n// }\r\n\r\n\r\n//}\r\n\r\n//export class VeriSimpleNavComponent implements angular.IComponentOptions {\r\n// bindings: any;\r\n// controller: any;\r\n// template: string;\r\n\r\n// constructor() {\r\n// this.bindings = {\r\n// labels: \"<\",\r\n// onLabelClicked: \"&\"\r\n// };\r\n\r\n// this.controller = VeriSimpleNavComponentController;\r\n// this.template = require(\"./veriSimpleNav.html\");\r\n// }\r\n//}\r\n","import { animate, style, transition, trigger } from \"@angular/animations\";\r\nimport { AfterViewInit, Component, ElementRef, Input, OnInit } from \"@angular/core\";\r\nimport { ChartService, ChartType, IHighchartsDataSeries } from \"@services/charts.service\";\r\nimport { ColourService } from \"@services/colour.service\";\r\nimport { ConstantsService } from \"@services/constantsService\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport { IVeriTableBindings, IVeriTableCellGraphOptions, IVeriTableHeader, IVeriTableRow } from \"../veriTable.component\";\r\nimport \"./veriTableContainer.scss\";\r\n\r\ndeclare const Highcharts: any;\r\n\r\nexport interface IVeriTableContainer {\r\n registerChild(veriTable: IVeriTableBindings);\r\n onRowsUpdated();\r\n updateNumbers();\r\n}\r\n\r\nexport interface IVeriTableChart {\r\n id: string;\r\n header: IVeriTableHeader;\r\n chartConfig: Highcharts.Options;\r\n chartObject?: Highcharts.ChartObject;\r\n title: string;\r\n seriesCount?: number;\r\n}\r\n\r\nexport const animSlideIn = trigger('animSlideIn', [\r\n transition('void => *', [\r\n style({ height: '0px', opacity: '0' }),\r\n animate('.3s', style({ height: '*', opacity: '1' })),\r\n ])\r\n]);\r\n\r\nexport const animSlideInOutFromLeft = trigger('animSlideInOutFromLeft', [\r\n transition(':enter', [\r\n style({ height: '0px', opacity: '0' }),\r\n animate('.3s', style({ height: '*', opacity: '1' })),\r\n ]),\r\n transition(':leave', [\r\n style({ height: '*', opacity: '0' }),\r\n animate('.3s', style({ height: '0', opacity: '0' })),\r\n ])\r\n]);\r\n\r\n@Component({\r\n selector: \"veri-table-container\",\r\n template: require(\"./veriTableContainer.html\"),\r\n animations: [animSlideInOutFromLeft]\r\n})\r\nexport class VeriTableContainerComponent implements OnInit, AfterViewInit, IVeriTableContainer {\r\n\r\n @Input() loading: boolean = false;\r\n @Input() maxEvents: number;\r\n\r\n childTable: IVeriTableBindings;\r\n\r\n componentLoaded = false;\r\n\r\n isMobile: boolean = false;\r\n\r\n template = `hello2 `;\r\n\r\n constructor(\r\n private readonly elementRef: ElementRef,\r\n private readonly chartService: ChartService,\r\n private readonly constantsService: ConstantsService,\r\n private readonly translationService: TranslationService,\r\n private readonly colourService: ColourService,\r\n private readonly veriDate: VeriDate) { }\r\n\r\n ngOnInit(): void {\r\n\r\n //setTimeout(() => { this.findChildTable(); }, 0);\r\n this.findChildTable();\r\n this.isMobile = this.constantsService.getIsMobile();\r\n }\r\n\r\n ngAfterViewInit() {\r\n\r\n this.componentLoaded = true;\r\n }\r\n\r\n registerChild(veriTable: IVeriTableBindings) {\r\n this.childTable = veriTable;\r\n this.childTable.veriTableContainer = this;\r\n this.childTable.headers.forEach(h => {\r\n if (!h.graphOptions) {\r\n return;\r\n }\r\n\r\n h.graphOptions.toggleShowGraph = () => {\r\n h.graphOptions.show = !h.graphOptions.show;\r\n\r\n // Now update all others to reflow\r\n this.charts.forEach(chart => { this.reflowChart(chart); });\r\n\r\n if (h.graphOptions.show) {\r\n this.createChartForHeader(h, this.childTable.displayRows);\r\n }\r\n else {\r\n\r\n // Remove all charts that have been removed\r\n const relatedChart = this.charts.find(c => c.header == h);\r\n this.removeChart(relatedChart);\r\n }\r\n };\r\n });\r\n\r\n this.onRowsUpdated();\r\n }\r\n\r\n onRowsUpdated() {\r\n\r\n // Date chart test\r\n this.buildChart(this.childTable.displayRows);\r\n }\r\n\r\n updateNumbers() {\r\n }\r\n\r\n //------\r\n\r\n private findChildTable() {\r\n // Temp solution while veritable component still requires upgrading..\r\n const veriTable = this.elementRef.nativeElement.querySelector('veri-table');\r\n const element = window.angular.element(veriTable);\r\n const scope: any = element.length && (element.isolateScope() || element.scope());\r\n\r\n if (scope) {\r\n //console.log(\"findChildTable\", element, veriTable);\r\n this.registerChild(scope.$ctrl);\r\n }\r\n else {\r\n console.error(\"Could not find veriTable in markup\");\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n\r\n // Date chart test\r\n charts: IVeriTableChart[] = [];\r\n\r\n removeChart(chart: IVeriTableChart) {\r\n if (!chart) {\r\n return;\r\n }\r\n\r\n const chartIndex = this.charts.indexOf(chart);\r\n const matchingHeader = this.childTable.headers.find(h => h == chart.header);\r\n\r\n if (matchingHeader) {\r\n matchingHeader.graphOptions.show = false;\r\n }\r\n\r\n chart.chartObject?.destroy();\r\n this.charts.splice(chartIndex, 1);\r\n\r\n this.charts.forEach(chart => {\r\n\r\n this.reflowChart(chart);\r\n });\r\n }\r\n\r\n private reflowChart(chart: IVeriTableChart) {\r\n setTimeout(() => {\r\n chart?.chartObject?.reflow();\r\n }, 0);\r\n\r\n setTimeout(() => {\r\n chart?.chartObject?.reflow();\r\n }, 300);\r\n }\r\n\r\n private buildChart(rows: IVeriTableRow[]) {\r\n this.charts = [];\r\n\r\n const graphHeaders = this.childTable.headers.filter(h => h.graphOptions?.show/* && h.sortType == SortType.Date*/);\r\n\r\n if (graphHeaders?.length == 0) {\r\n\r\n return;\r\n }\r\n\r\n this.childTable.graphOptionsAvailable = true;\r\n graphHeaders.forEach((header, index) => {\r\n this.createChartForHeader(header, rows);\r\n });\r\n }\r\n\r\n private createChartForHeader(header: IVeriTableHeader, rows: IVeriTableRow[]) {\r\n let veriTableChart = this.charts.find(c => c.header == header);\r\n\r\n if (!veriTableChart) {\r\n veriTableChart = {\r\n id: window.URL.createObjectURL(new Blob([])).split('/').pop(),\r\n header: header,\r\n title: header.graphOptions.title || header.title,\r\n chartConfig: null\r\n };\r\n\r\n if (header.graphOptions.maxSeries) {\r\n veriTableChart.title = this.translationService.t(`Common.TopX`, `${veriTableChart.title}s`); // ${header.graphOptions.maxSeries}\r\n }\r\n this.charts.push(veriTableChart);\r\n }\r\n\r\n // Timeout prevents drawing issues\r\n setTimeout(() => {\r\n veriTableChart.chartConfig = this.createChartDefinition(veriTableChart.header.graphOptions);\r\n const newSeries = this.getSeriesData(veriTableChart, rows);\r\n if (rows.length != 0) {\r\n if (veriTableChart.chartObject) {\r\n veriTableChart.chartObject.series[0].update(newSeries[0], true);\r\n }\r\n else {\r\n veriTableChart.chartConfig.series = newSeries;\r\n veriTableChart.chartObject = Highcharts.chart(veriTableChart.id, veriTableChart.chartConfig);\r\n }\r\n }\r\n if (veriTableChart.chartConfig?.series?.length) {\r\n veriTableChart.seriesCount = veriTableChart.chartConfig.series[0].data.length;\r\n }\r\n else {\r\n veriTableChart.seriesCount = 0;\r\n }\r\n this.chartService.useVigetColours(veriTableChart.chartConfig, Math.max(newSeries.length));\r\n }, 300);\r\n }\r\n\r\n private createChartDefinition(graphOptions: IVeriTableCellGraphOptions): Highcharts.Options {\r\n\r\n const chartConfig = this.chartService.createChartOptions(graphOptions.chartType);\r\n chartConfig.chart.backgroundColor = \"transparent\";\r\n chartConfig.chart.plotBackgroundColor = \"transparent\";\r\n\r\n chartConfig.plotOptions.series = chartConfig.plotOptions.series || {\r\n point: {\r\n events: {}\r\n }\r\n };\r\n\r\n switch (graphOptions.chartType) {\r\n case \"pie\":\r\n this.createPieChartConfig(chartConfig);\r\n break;\r\n\r\n case \"line\":\r\n case \"areaspline\":\r\n chartConfig.plotOptions.areaspline.lineWidth = 1;\r\n break;\r\n case \"column\":\r\n if (graphOptions.stacked) {\r\n chartConfig.plotOptions.column = {\r\n\r\n stacking: 'normal'\r\n\r\n }\r\n }\r\n break;\r\n }\r\n\r\n this.chartService.useVigetColours(chartConfig);\r\n return chartConfig;\r\n }\r\n\r\n\r\n private createPieChartConfig(chartConfig: Highcharts.Options) {\r\n\r\n\r\n chartConfig.plotOptions.pie.dataLabels.enabled = true;\r\n chartConfig.plotOptions.pie.dataLabels.style = {\r\n color: \"#555\", textOutline: \"none\"\r\n };\r\n }\r\n\r\n private getSeriesData(veriTableChart: IVeriTableChart, rows: IVeriTableRow[]): Highcharts.IndividualSeriesOptions[] {\r\n if (!veriTableChart.chartConfig.chart.type) {\r\n this.createChartDefinition(veriTableChart.header.graphOptions);\r\n }\r\n\r\n if (veriTableChart.header.graphOptions.chartType == \"pie\") {\r\n return this.convertDataToPieSeries(veriTableChart, rows);\r\n }\r\n else if (veriTableChart.header.graphOptions.chartType == \"column\" && veriTableChart.header.graphOptions.stacked) {\r\n if (!veriTableChart.header.graphOptions.dateColumn) {\r\n console.warn(\"No date column specified\");\r\n return;\r\n }\r\n return this.getSeriesForStackedChart(veriTableChart, rows);\r\n }\r\n else {\r\n return this.convertDateHeaderToSeries(veriTableChart, rows);\r\n }\r\n }\r\n\r\n private convertDataToPieSeries(veriTableChart: IVeriTableChart, rows: IVeriTableRow[]): Highcharts.IndividualSeriesOptions[] {\r\n\r\n const dataSeries: Highcharts.IndividualSeriesOptions[] = [{\r\n name: veriTableChart.header.title,\r\n data: []\r\n }];\r\n\r\n const dataMap = new Map();\r\n const columnIndex = this.getHeaderIndex(veriTableChart.header);\r\n\r\n rows.forEach(row => {\r\n const cell = row.cells[columnIndex];\r\n const cellTitle = cell.graphLabel || cell.summaryLabel || cell.contents;\r\n let matchingDataPoint = dataMap.get(cellTitle) as Highcharts.DataPoint;\r\n\r\n if (!matchingDataPoint) {\r\n matchingDataPoint = { name: cellTitle, y: 0 };\r\n dataMap.set(cellTitle, matchingDataPoint);\r\n dataSeries[0].data.push(matchingDataPoint);\r\n }\r\n\r\n matchingDataPoint.y++;\r\n });\r\n\r\n veriTableChart.seriesCount = dataSeries[0].data.length;\r\n\r\n if (veriTableChart.header.graphOptions.maxSeries) {\r\n dataSeries[0].data.sort((d1, d2) => {\r\n return (d1 as Highcharts.DataPoint).y < (d2 as Highcharts.DataPoint).y ? 1 : -1;\r\n });\r\n\r\n dataSeries[0].data.splice(veriTableChart.header.graphOptions.maxSeries);\r\n }\r\n\r\n dataSeries[0].data.forEach((d, i) => {\r\n const dp = d as Highcharts.DataPoint;\r\n dp.color = this.colourService.getVigetColor(i, dataSeries[0].data.length);\r\n });\r\n\r\n return dataSeries;\r\n }\r\n\r\n private getSeriesForStackedChart(veriTableChart: IVeriTableChart, rows: IVeriTableRow[]): IHighchartsDataSeries[] {\r\n const dataSeries: IHighchartsDataSeries[] = [];\r\n\r\n const dateColumn = veriTableChart.header.graphOptions.dateColumn;\r\n\r\n const columnIndex = this.getHeaderIndex(veriTableChart.header);\r\n\r\n const dataSet = [];\r\n\r\n rows.forEach(row => {\r\n if (!dataSet.includes(row.cells[columnIndex].sortData)) {\r\n dataSet.push(row.cells[columnIndex].sortData);\r\n }\r\n })\r\n\r\n for (let i = 0; i < dataSet.length; i++) {\r\n const datasetName = dataSet[i].charAt(0).toUpperCase() + dataSet[i].slice(1);\r\n const series = {\r\n name: datasetName,\r\n data: [],\r\n pointIntervalUnit: 'day',\r\n type: veriTableChart.header.graphOptions.chartType,\r\n color: this.colourService.getVigetColor(i, dataSet.length)\r\n };\r\n const data: [any, any][] = [];\r\n const dataByDay = this.countDataPerDayForStackedChart(rows, dateColumn, columnIndex, dataSet[i]);\r\n\r\n Object.keys(dataByDay).forEach((x, y) => {\r\n data.push([Number(x), dataByDay[x]]);\r\n });\r\n data.sort((x, y) => x[0] - y[0]);\r\n series.data = data;\r\n dataSeries.push(series);\r\n\r\n }\r\n\r\n\r\n return dataSeries;\r\n }\r\n\r\n\r\n private getHeaderIndex(header: IVeriTableHeader): number {\r\n return this.childTable.headers.indexOf(header);\r\n }\r\n\r\n private convertDateHeaderToSeries(veriTableChart: IVeriTableChart, rows: IVeriTableRow[]): IHighchartsDataSeries[] {\r\n\r\n const dataSeries: IHighchartsDataSeries[] = [];\r\n\r\n const series = {\r\n name: veriTableChart.title,\r\n data: [],\r\n pointIntervalUnit: 'day',\r\n type: veriTableChart.header.graphOptions.chartType\r\n };\r\n series.data = this.createSeriesData(veriTableChart.header, rows);\r\n dataSeries.push(series);\r\n return dataSeries;\r\n }\r\n\r\n private createSeriesData(header: IVeriTableHeader, rows: IVeriTableRow[]): [any, any][] {\r\n const data: [any, any][] = [];\r\n\r\n const columnIndex = this.getHeaderIndex(header);\r\n const dataByDay = this.countDataPerDay(rows, columnIndex);\r\n Object.keys(dataByDay).forEach((x, y) => {\r\n\r\n data.push([Number(x), dataByDay[x]]);\r\n });\r\n\r\n data.sort((x, y) => x[0] - y[0]);\r\n return data;\r\n }\r\n\r\n private countDataPerDay(rows: IVeriTableRow[], columnIndex: number): number[] {\r\n\r\n\r\n return rows.reduce((result, row) => {\r\n\r\n const dateAsMoment = row.cells[columnIndex].sortData > 0 ? this.veriDate.createMoment(row.cells[columnIndex].sortData) : null;\r\n const day = dateAsMoment ? dateAsMoment.startOf(\"day\").valueOf() as number : null;\r\n\r\n if (day) {\r\n if (!result[day]) {\r\n result[day] = 0;\r\n }\r\n result[day]++;\r\n }\r\n\r\n return result;\r\n }, []);\r\n }\r\n\r\n\r\n private countDataPerDayForStackedChart(rows: IVeriTableRow[], dateColumn: number, columnIndex: number, dataLabel: string) {\r\n return rows.reduce((result, row) => {\r\n\r\n const dateAsMoment = row.cells[dateColumn].sortData > 0 ? this.veriDate.createMoment(row.cells[dateColumn].sortData) : null;\r\n const day = dateAsMoment ? dateAsMoment.startOf(\"day\").valueOf() as number : null;\r\n if (dataLabel === row.cells[columnIndex].sortData) {\r\n\r\n if (day) {\r\n if (!result[day]) {\r\n result[day] = 0;\r\n }\r\n result[day]++;\r\n }\r\n\r\n return result;\r\n\r\n }\r\n return result;\r\n }, []);\r\n }\r\n}\r\n","import { AfterViewInit, Component, ElementRef, Input, OnInit } from \"@angular/core\";\r\nimport { HTMLService } from \"@services/htmlService.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { IVeriTableBindings, IVeriTableRow } from \"../veriTable.component\";\r\nimport \"./veriTableSummary.component.scss\";\r\n\r\nexport interface IEventSummary {\r\n id: string;\r\n label: string;\r\n subtitle: string;\r\n count: number;\r\n events: T[];\r\n icon?: string;\r\n color?: string;\r\n data?: any;\r\n}\r\n\r\nexport interface IEventSummaryConfiguration {\r\n icon: string;\r\n}\r\n\r\n@Component({\r\n selector: \"veri-table-summary\",\r\n template: require(\"./veriTableSummary.component.html\"),\r\n})\r\n\r\nexport class VeriTableSummaryComponent implements OnInit, AfterViewInit {\r\n\r\n @Input() loading: boolean = false;\r\n @Input() maxEvents: number;\r\n\r\n childTable: IVeriTableBindings;\r\n eventSummary: IEventSummary[] = [];\r\n selectedEvent: IEventSummary = null;\r\n\r\n totalPlaceholdersRequired: number;\r\n\r\n componentLoaded = false;\r\n\r\n constructor(\r\n private readonly elementRef: ElementRef,\r\n private readonly translationService: TranslationService,\r\n private readonly htmlService: HTMLService) { }\r\n\r\n ngOnInit(): void {\r\n if (!this.maxEvents) {\r\n const boxWidth = 150 + 10;\r\n this.maxEvents = Math.ceil(this.elementRef.nativeElement.getBoundingClientRect().width / boxWidth);\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n\r\n this.componentLoaded = true;\r\n\r\n var nearest = this.htmlService.findNearest(this.elementRef.nativeElement, \"veri-table\");\r\n var childTable = this.htmlService.getAngularJSComponentFromElement(nearest);\r\n this.registerChild(childTable);\r\n }\r\n\r\n registerChild(veriTable: IVeriTableBindings) {\r\n this.childTable = veriTable;\r\n this.childTable.veriTableContainer = this;\r\n\r\n this.onRowsUpdated();\r\n }\r\n\r\n onRowsUpdated() {\r\n this.selectedEvent = null;\r\n this.childTable.setFilterRows(null);\r\n\r\n this.updateNumbers()\r\n }\r\n\r\n updateNumbers() {\r\n\r\n if (this.childTable && this.childTable.headers && this.childTable.headers.some(h => h.includeInSummary)) {\r\n this.buildEventSummary(this.childTable.displayRows);\r\n }\r\n }\r\n\r\n onEventSummaryClick(event: IEventSummary) {\r\n\r\n if (!this.childTable) {\r\n return;\r\n }\r\n\r\n if (this.selectedEvent && this.selectedEvent.id === event.id) {\r\n this.selectedEvent = null;\r\n this.childTable.setFilterRows(null);\r\n\r\n return;\r\n }\r\n\r\n this.selectedEvent = event;\r\n this.childTable.setFilterRows(this.selectedEvent.events);\r\n }\r\n\r\n trackByEventSummary(index: number, item: IEventSummary) {\r\n return item.id;\r\n }\r\n\r\n //------\r\n\r\n private buildEventSummary(rows: IVeriTableRow[]) {\r\n\r\n this.eventSummary = [];\r\n\r\n let indexes: number[] = [];\r\n\r\n this.childTable.headers.forEach((header, index) => {\r\n if (header.includeInSummary) {\r\n indexes.push(index);\r\n }\r\n })\r\n\r\n\r\n indexes.forEach(index => {\r\n\r\n var headerTitle = this.childTable.headers[index].title;\r\n\r\n rows.forEach(row => {\r\n const cell = row.cells[index];\r\n\r\n if (!cell || !cell.contents || cell.excludeFromSummary) {\r\n return;\r\n }\r\n\r\n let eventLabel = cell.summaryLabel || cell.contents;\r\n\r\n var existingEventSummary = this.eventSummary.find(event => event.label == eventLabel);\r\n if (existingEventSummary) {\r\n existingEventSummary.count++;\r\n }\r\n else {\r\n existingEventSummary = {\r\n id: eventLabel,\r\n label: eventLabel,\r\n subtitle: cell.summarySubLabel || headerTitle,\r\n count: 1,\r\n icon: cell.summaryIcon,\r\n events: [],\r\n color: cell.summaryColour || row.eventSummaryColour\r\n };\r\n\r\n this.eventSummary.push(existingEventSummary);\r\n }\r\n\r\n existingEventSummary.events.push(row);\r\n });\r\n\r\n this.eventSummary.sort((x, y) => y.count - x.count);\r\n\r\n if (this.maxEvents && this.eventSummary.length > this.maxEvents) {\r\n var popped = this.eventSummary.splice(this.maxEvents - 1);\r\n var poppedCount = popped.reduce((a, b) => a + b.count, 0);\r\n\r\n this.eventSummary.push({\r\n id: \"other\",\r\n count: poppedCount,\r\n label: this.translationService.t(\"veriTableContainer.other\"),\r\n subtitle: headerTitle,\r\n icon: \"help\",\r\n events: popped.map(a => { return a.events; }).reduce((a, b) => a.concat(b))\r\n });\r\n\r\n this.eventSummary.sort((x, y) => y.count - x.count);\r\n }\r\n\r\n this.totalPlaceholdersRequired = this.eventSummary?.length;\r\n\r\n const defaultPlacedHolderCount: number = 3;\r\n if (this.eventSummary?.length == 0) {\r\n\r\n this.totalPlaceholdersRequired = Math.min(this.maxEvents, this.eventSummary.length);\r\n\r\n if (this.totalPlaceholdersRequired == 0) {\r\n this.totalPlaceholdersRequired = defaultPlacedHolderCount;\r\n }\r\n }\r\n })\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter, OnChanges, ElementRef, SimpleChanges, Optional, Inject, forwardRef, OnInit, OnDestroy } from \"@angular/core\";\r\nimport { IVideoConfigSource } from \"@app/interfaces/IVideo\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport Hls from \"hls.js\";\r\nimport { IVideoSectionLoaded } from \"./interfaces/IVideoSectionLoaded\";\r\nimport './v-video.component.scss';\r\n\r\n@Component({\r\n selector: 'v-video',\r\n template: require('./v-video.component.html')\r\n})\r\nexport class VVideoComponent implements OnChanges, OnInit, OnDestroy {\r\n @Input() sources: IVideoConfigSource[] = [];\r\n @Input() poster: string;\r\n @Input() controls: boolean;\r\n @Input() mp4VideoUrl: string;\r\n @Input() webmVideoUrl: string;\r\n @Input() m3u8VideoUrl: string;\r\n @Input() playbackSpeed = 1;\r\n @Input() videoLabel: string;\r\n @Input() currentPosition: number;\r\n @Input() autoplay: boolean;\r\n\r\n @Output() timeUpdate = new EventEmitter();\r\n @Output() load = new EventEmitter();\r\n @Output() canPlay = new EventEmitter();\r\n @Output() play = new EventEmitter();\r\n @Output() pause = new EventEmitter();\r\n @Output() seeking = new EventEmitter();\r\n @Output() seeked = new EventEmitter();\r\n @Output() sectionLoaded = new EventEmitter();\r\n @Output() error = new EventEmitter();\r\n\r\n //--\r\n\r\n loading: boolean;\r\n videoElementId: number;\r\n videoPlayer: HTMLVideoElement;\r\n streamPaused: boolean;\r\n showError: boolean;\r\n\r\n timeout: ReturnType;\r\n\r\n private hlsPlayer: Hls;\r\n constructor(\r\n private readonly el: ElementRef,\r\n private readonly translationService: TranslationService) { }\r\n\r\n ngOnInit(): void {\r\n this.createVideoElements();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (this.mp4VideoUrl) {\r\n this.addVideoSource(\"mp4\");\r\n }\r\n\r\n if (changes[\"playbackSpeed\"] && this.videoPlayer) {\r\n this.videoPlayer.playbackRate = this.playbackSpeed;\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroyPlayer();\r\n this.destroyVideoElement();\r\n clearTimeout(this.timeout);\r\n }\r\n\r\n playVideo(): void {\r\n this.streamPaused = false;\r\n this.videoPlayer.play();\r\n }\r\n\r\n pauseVideo(): void {\r\n this.streamPaused = true;\r\n this.videoPlayer.pause();\r\n\r\n if (this.hlsPlayer) {\r\n this.hlsPlayer.stopLoad();\r\n }\r\n }\r\n\r\n restartVideo(): void {\r\n this.videoPlayer.currentTime = 0;\r\n this.videoPlayer.pause();\r\n\r\n if (this.hlsPlayer) {\r\n this.hlsPlayer.startLoad();\r\n this.startPauseStreamTimer();\r\n }\r\n }\r\n\r\n seek(time: number): void {\r\n this.videoPlayer.currentTime = time;\r\n }\r\n\r\n getDuration(): number {\r\n return this.videoPlayer.duration;\r\n }\r\n\r\n isPlaying(): boolean {\r\n return !this.videoPlayer.paused;\r\n }\r\n\r\n getCurrentTime(): number {\r\n return this.videoPlayer?.currentTime;\r\n }\r\n\r\n //--\r\n\r\n private addVideoSource(contentType: string): void {\r\n this.sources.push({\r\n src: this.mp4VideoUrl,\r\n type: `video/${contentType}`,\r\n contentType: contentType\r\n })\r\n }\r\n\r\n private createVideoElements(): void {\r\n this.loading = true;\r\n\r\n this.videoElementId = Math.floor(Math.random() * 1000);\r\n this.videoPlayer = document.createElement('video');\r\n\r\n this.videoPlayer.id = String(this.videoElementId);\r\n this.videoPlayer.autoplay = this.autoplay;\r\n this.videoPlayer.controls = this.controls;\r\n this.videoPlayer.playsInline = true;\r\n this.videoPlayer.muted = true;\r\n this.videoPlayer.poster = this.poster;\r\n this.videoPlayer.innerHTML = this.translationService.t('veriVideo.browserNotSupported');\r\n\r\n if (this.sources?.length && !this.m3u8VideoUrl) {\r\n this.sources.forEach(source => {\r\n const videoSource = document.createElement('source');\r\n videoSource.src = `${source.src}/${source.contentType}`;\r\n videoSource.type = source.type;\r\n this.videoPlayer.appendChild(videoSource);\r\n });\r\n }\r\n\r\n this.el.nativeElement.appendChild(this.videoPlayer);\r\n\r\n if (this.m3u8VideoUrl) {\r\n this.setupStreamPlayer();\r\n }\r\n\r\n this.videoPlayer.onloadedmetadata = () => this.videoLoaded();\r\n this.videoPlayer.oncanplay = () => this.canPlay.emit();\r\n this.videoPlayer.onplay = () => this.play.emit();\r\n this.videoPlayer.onpause = () => this.pause.emit();\r\n this.videoPlayer.onseeked = () => this.seeked.emit(this.videoPlayer.currentTime);\r\n this.videoPlayer.onprogress = () => this.videoProgress();\r\n\r\n }\r\n\r\n private videoLoaded(): void {\r\n this.load.emit();\r\n this.loading = false;\r\n }\r\n\r\n private videoProgress(): void {\r\n const seekable: TimeRanges = (this.videoPlayer as any).buffered;\r\n const sections: IVideoSectionLoaded[] = [];\r\n\r\n for (var si = 0; si < seekable.length; si++) {\r\n var startSecond = seekable.start(si);\r\n var endSecond = seekable.end(si);\r\n\r\n sections.push({ startSecond: startSecond, endSecond: endSecond });\r\n }\r\n\r\n this.sectionLoaded.emit(sections);\r\n }\r\n\r\n private startPauseStreamTimer(): void {\r\n if (this.timeout) {\r\n clearTimeout(this.timeout);\r\n }\r\n\r\n this.timeout = setTimeout(() => {\r\n this.pauseVideo();\r\n }, 60 * 1000);\r\n }\r\n\r\n private destroyPlayer(): void {\r\n if (!this.hlsPlayer) {\r\n return;\r\n }\r\n\r\n this.hlsPlayer.detachMedia();\r\n this.hlsPlayer.destroy();\r\n\r\n this.videoPlayer = null;\r\n }\r\n\r\n private destroyVideoElement(): void {\r\n if (this.videoPlayer) {\r\n // Pause the video if it's playing\r\n if (!this.videoPlayer.paused) {\r\n this.videoPlayer.pause();\r\n }\r\n\r\n // Remove event listeners\r\n this.videoPlayer.onloadedmetadata = null;\r\n this.videoPlayer.oncanplay = null;\r\n this.videoPlayer.onplay = null;\r\n this.videoPlayer.onpause = null;\r\n this.videoPlayer.onseeked = null;\r\n this.videoPlayer.onprogress = null;\r\n\r\n // Remove the video element from the DOM\r\n if (this.videoPlayer.parentNode) {\r\n this.videoPlayer.parentNode.removeChild(this.videoPlayer);\r\n }\r\n\r\n // Nullify the reference\r\n this.videoPlayer = null;\r\n }\r\n\r\n }\r\n\r\n private setupStreamPlayer(): void {\r\n this.destroyPlayer();\r\n\r\n this.hlsPlayer = new Hls({\r\n debug: false,\r\n enableWebVTT: false,\r\n liveDurationInfinity: true,\r\n autoStartLoad: true,\r\n enableWorker: true,\r\n capLevelToPlayerSize: true,\r\n startFragPrefetch: true,\r\n fragLoadingTimeOut: 60 * 1000\r\n });\r\n\r\n this.hlsPlayer.attachMedia(this.videoPlayer);\r\n\r\n this.hlsPlayer.on(Hls.Events.MEDIA_ATTACHED, () => {\r\n this.hlsPlayer.loadSource(this.m3u8VideoUrl);\r\n });\r\n\r\n this.hlsPlayer.on(Hls.Events.MANIFEST_PARSED, (event, data) => {\r\n this.videoPlayer.play();\r\n });\r\n\r\n this.hlsPlayer.once(Hls.Events.FRAG_LOADED, () => {\r\n this.startPauseStreamTimer();\r\n });\r\n\r\n this.hlsPlayer.on(Hls.Events.ERROR, (event, data) => {\r\n if (data.fatal) {\r\n switch (data.type) {\r\n case Hls.ErrorTypes.NETWORK_ERROR:\r\n // try to recover network error\r\n console.warn(\"fatal network error encountered, try to recover\");\r\n this.hlsPlayer.startLoad();\r\n break;\r\n\r\n case Hls.ErrorTypes.MEDIA_ERROR:\r\n console.warn(\"fatal media error encountered, try to recover\");\r\n this.hlsPlayer.recoverMediaError();\r\n break;\r\n\r\n default:\r\n // cannot recover\r\n this.hlsPlayer.destroy();\r\n this.error.emit(data);\r\n\r\n console.error(\"Unrecoverable error loading video\")\r\n\r\n this.showError = true;\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n\r\n}\r\n","import { Component, ElementRef, EventEmitter, HostBinding, Input, OnChanges, OnDestroy, OnInit, Output, QueryList, SimpleChanges, ViewChildren } from \"@angular/core\";\r\nimport { CameraChannelType } from \"@app/main/components/videos/enums/CameraChannelType\";\r\nimport { CameraLocation } from \"@app/main/components/videos/enums/CameraLocation\";\r\nimport { ICameraChannel } from \"@app/main/components/videos/models/ICameraChannel\";\r\nimport { ICameraEventPeriod } from \"@app/main/components/videos/models/ICameraEventPeriod\";\r\nimport { IMedia } from \"@app/main/components/videos/models/IMedia\";\r\nimport { IVideoAccelerometerData } from \"@app/main/components/videos/models/IVideoAccelerometerData\";\r\nimport { IVideoChannelMedia } from \"@app/main/components/videos/models/IVideoChannelMedia\";\r\nimport { IVideoEntry } from \"@app/main/components/videos/models/IVideoEntry\";\r\nimport { CameraService } from \"@app/main/components/videos/services/camera.service\";\r\nimport { VideoEntryService } from \"@app/main/components/videos/services/video-entry.service\";\r\nimport { CameraChannelService } from \"@app/main/modules/cameras/_services/camera-channels.service\";\r\nimport { ConstantsService } from \"@app/services/constantsService\";\r\nimport { DateService, DateUnit } from \"@app/services/date.service\";\r\nimport { FullScreenService } from \"@app/services/fullscreen.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { animFadeInOut } from \"@app/styles/animations/fade-in-fade-out.animation\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { IVideoSectionLoaded } from \"../interfaces/IVideoSectionLoaded\";\r\nimport { VVideoComponent } from \"../v-video.component\";\r\nimport './v-video-collection.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'v-video-collection',\r\n template: require('./v-video-collection.component.html'),\r\n animations: [animFadeInOut]\r\n})\r\nexport class VVideoCollectionComponent implements OnInit, OnDestroy, OnChanges {\r\n @Input() video: IVideoEntry;\r\n @Input() vehicleId: number;\r\n\r\n @Output() closeVideos = new EventEmitter();\r\n @Output() secondsUpdate = new EventEmitter();\r\n @Output() videoPlayStateChange = new EventEmitter();\r\n\r\n @ViewChildren('videoChannel') vVideoComponents: QueryList;\r\n //--\r\n\r\n fitToFrame = false;\r\n isZoomed = false;\r\n\r\n playbackSpeed = 1;\r\n showPlaybackSpeedOptions = false;\r\n vertical = false;\r\n fullscreen = false;\r\n ignore = false;\r\n\r\n firstPlayStarted: boolean = false;\r\n isPlaying = false;\r\n secondsPlayed: number;\r\n maxVideoDuration = 0;\r\n\r\n showLargeControls = false;\r\n mouseOverTimeout: any;\r\n showPlayStateIndicator: boolean;\r\n\r\n loadedVideoSections: IVideoSectionLoaded[] = [];\r\n activityPeriods: ICameraEventPeriod[];\r\n\r\n cameraChannels: ICameraChannel[];\r\n\r\n currentAccelerometerData: IVideoAccelerometerData;\r\n\r\n CameraLocation = CameraLocation;\r\n\r\n @HostBinding('class.is-mobile') isMobile: boolean;\r\n\r\n rafNumber: number;\r\n lastMedianPlayTime: number;\r\n animateCallCount = 0;\r\n actualAnimationCount = 0;\r\n\r\n constructor(\r\n private readonly el: ElementRef,\r\n private readonly cameraChannelService: CameraChannelService,\r\n private readonly dateService: DateService,\r\n private readonly fullScreenService: FullScreenService,\r\n private readonly constantsService: ConstantsService,\r\n private readonly translationService: TranslationService,\r\n private readonly cameraService: CameraService,\r\n private readonly videoEntryService: VideoEntryService) { }\r\n\r\n ngOnInit(): void {\r\n this.initialise();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[\"video\"]) {\r\n this.getChannelNames();\r\n this.videoEntryService.getExtensionData(this.video).then(data => {\r\n if (!data) {\r\n return;\r\n }\r\n\r\n this.activityPeriods = this.cameraService.getRegionsOfAccelerometerActivity(data);\r\n });\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.checkStartPlay();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.stopAnimation();\r\n }\r\n\r\n closeVideo(): void {\r\n this.closeVideos.emit();\r\n }\r\n\r\n showFullscreen(): void {\r\n this.fullscreen = this.fullScreenService.toggle(this.el.nativeElement);\r\n }\r\n\r\n onPlayClicked(): void {\r\n this.play();\r\n // had to remove this call from original play method\r\n // since it's called by mediaLoaded method via checkStartPlay and thus\r\n // was triggering the appearance of play/pause buttons when no need to it\r\n this.temporarilyShowPlayStateIndicator();\r\n }\r\n\r\n onPauseClicked(): void {\r\n this.pause();\r\n this.temporarilyShowPlayStateIndicator();\r\n }\r\n\r\n stopPreviewClicked(): void {\r\n this.pause();\r\n this.emitIsPlaying(false);\r\n }\r\n\r\n mouseOverVideo(isHovering: boolean): void {\r\n if (this.mouseOverTimeout) {\r\n clearTimeout(this.mouseOverTimeout);\r\n this.mouseOverTimeout = null;\r\n }\r\n\r\n if (isHovering) {\r\n this.showLargeControls = true;\r\n }\r\n else {\r\n // We delay fade aways to make the UI feel nicer\r\n this.mouseOverTimeout = setTimeout(() => {\r\n this.showLargeControls = false || this.isMobile;\r\n }, 300);\r\n }\r\n }\r\n\r\n videoMouseMove(event: MouseEvent): void {\r\n\r\n // This gives you the position of the image on the page\r\n var bbox = (event.target as Element).getBoundingClientRect();\r\n\r\n // Then we measure how far into the image the mouse is in both x and y directions\r\n var mouseX = event.clientX - bbox.left;\r\n var mouseY = event.clientY - bbox.top;\r\n\r\n // Then work out how far through the image as a percentage the mouse is\r\n var xPercent = (mouseX / bbox.width) * 100;\r\n var yPercent = (mouseY / bbox.height) * 100;\r\n\r\n // Then we change the `transform-origin` css property on the image to center the zoom effect on the mouse position\r\n\r\n // It's a bit clearer in jQuery:\r\n $(event.target).css('transform-origin', (xPercent + '% ' + yPercent + '%'));\r\n }\r\n\r\n onSectionLoaded(loadedSections: IVideoSectionLoaded[]): void {\r\n this.loadedVideoSections = loadedSections;\r\n }\r\n\r\n focusChannel(channel: IVideoChannelMedia): void {\r\n let previousMainChannel: IVideoChannelMedia = null;\r\n this.video.channelMedia.forEach(c => {\r\n if (c.mainChannel) {\r\n previousMainChannel = c;\r\n }\r\n\r\n c.mainChannel = false;\r\n });\r\n\r\n channel.mainChannel = true;\r\n\r\n if (channel == previousMainChannel) {\r\n this.togglePlayPauseState();\r\n }\r\n }\r\n\r\n onSpeedChanged(speed): void {\r\n this.playbackSpeed = speed;\r\n }\r\n\r\n togglePlayPauseState(): void {\r\n if (this.isPlaying) {\r\n this.pause();\r\n }\r\n else {\r\n this.play();\r\n }\r\n }\r\n\r\n onFitToFrame(): void {\r\n this.fitToFrame = !this.fitToFrame;\r\n }\r\n\r\n onZoom(): void {\r\n this.isZoomed = !this.isZoomed;\r\n }\r\n\r\n temporarilyShowPlayStateIndicator(): void {\r\n this.showPlayStateIndicator = true;\r\n\r\n setTimeout(() => {\r\n this.showPlayStateIndicator = false;\r\n }, 300);\r\n }\r\n\r\n timeUpdate(secondsPlayed: number): boolean {\r\n if (!this.video) {\r\n return;\r\n }\r\n\r\n this.secondsPlayed = secondsPlayed;\r\n\r\n let currentVideoTime = this.video.VideoStartTime;\r\n\r\n if (this.video.VideoExtensionData?.VideoAccelerometerData?.length) {\r\n currentVideoTime = this.video.VideoExtensionData?.VideoAccelerometerData[0].Timestamp;\r\n }\r\n\r\n currentVideoTime = this.dateService.addOrSubtractTime(currentVideoTime, secondsPlayed, DateUnit.Sec);\r\n\r\n this.currentAccelerometerData = this.video?.VideoExtensionData?.VideoAccelerometerData?.find(accel => {\r\n return this.dateService.date1IsAfterDate2(accel.Timestamp, currentVideoTime);\r\n })\r\n\r\n this.secondsUpdate.emit(secondsPlayed);\r\n\r\n return true;\r\n }\r\n\r\n play(): void {\r\n if (!this.vVideoComponents || !this.vVideoComponents.toArray().length) {\r\n return;\r\n }\r\n\r\n this.firstPlayStarted = true;\r\n\r\n if (this.ignore) {\r\n return;\r\n }\r\n\r\n this.startAnimation();\r\n\r\n this.vVideoComponents.toArray().forEach(video => {\r\n video.playVideo();\r\n });\r\n\r\n this.isPlaying = true;\r\n this.setIgnore();\r\n }\r\n\r\n pause(): void {\r\n this.vVideoComponents.toArray().forEach(video => {\r\n video.pauseVideo();\r\n });\r\n\r\n this.isPlaying = false;\r\n this.stopAnimation();\r\n }\r\n\r\n seek(currentTime: number): void {\r\n if (this.ignore) {\r\n return;\r\n }\r\n\r\n this.vVideoComponents.toArray().forEach(video => {\r\n video.seek(currentTime);\r\n });\r\n }\r\n\r\n setIgnore(): void {\r\n this.ignore = true;\r\n\r\n setTimeout(() => {\r\n this.ignore = false;\r\n }, 10);\r\n }\r\n\r\n restart(): void {\r\n this.vVideoComponents.toArray().forEach(video => {\r\n video.restartVideo();\r\n });\r\n }\r\n\r\n mediaLoaded(media: IMedia): void {\r\n media.loaded = true;\r\n this.checkStartPlay();\r\n }\r\n\r\n checkPauseStates(): void {\r\n let allPaused = true;\r\n this.vVideoComponents.toArray().forEach(video => {\r\n if (video.isPlaying()) {\r\n allPaused = false;\r\n }\r\n });\r\n\r\n if (allPaused) {\r\n this.isPlaying = false;\r\n this.stopAnimation();\r\n // to display play/pause icons when source of action is video player, not the controls\r\n this.temporarilyShowPlayStateIndicator();\r\n }\r\n }\r\n\r\n emitIsPlaying(isPlaying: boolean): void {\r\n this.isPlaying = isPlaying;\r\n\r\n this.videoPlayStateChange.emit(isPlaying);\r\n }\r\n\r\n // ---\r\n\r\n private initialise(): void {\r\n this.isMobile = this.constantsService.getIsMobile();\r\n this.showLargeControls = this.isMobile;\r\n this.maxVideoDuration = 0;\r\n\r\n // This allows us to ensure we have been created for at least 300ms before we try to play\r\n setTimeout(() => {\r\n this.vertical = this.el.nativeElement.offsetWidth / this.el.nativeElement.offsetHeight < 1.4;\r\n }, 300);\r\n }\r\n\r\n private stopAnimation(): void {\r\n // Cancel animation\r\n cancelAnimationFrame(this.rafNumber);\r\n this.rafNumber = null;\r\n\r\n // Draw final frame if we are at the end\r\n this.drawVideoFrames(true);\r\n }\r\n\r\n private drawVideoFrames(forceUpdate = false): void {\r\n\r\n this.actualAnimationCount++;\r\n\r\n const playTimes: number[] = [];\r\n this.vVideoComponents.toArray().forEach(video => {\r\n playTimes.push(video.getCurrentTime());\r\n });\r\n\r\n if (playTimes.length == 0) {\r\n return;\r\n }\r\n\r\n const median = arr => {\r\n const mid = Math.floor(arr.length / 2);\r\n const nums = [...arr].sort((a, b) => a - b);\r\n\r\n // This median prefers higher numbers\r\n return nums[mid];\r\n };\r\n\r\n const medianPlayTime = median(playTimes)?.toFixed(2);\r\n\r\n if (forceUpdate || this.lastMedianPlayTime != medianPlayTime) {\r\n this.timeUpdate(medianPlayTime);\r\n\r\n if (forceUpdate || Math.floor(this.lastMedianPlayTime) != Math.floor(medianPlayTime)) {\r\n this.actualAnimationCount = 0;\r\n }\r\n\r\n this.lastMedianPlayTime = medianPlayTime;\r\n }\r\n }\r\n\r\n private startAnimation(): void {\r\n this.animate(true);\r\n }\r\n\r\n private animate(checkExisting: boolean): void {\r\n\r\n if (checkExisting) {\r\n if (this.rafNumber) {\r\n this.stopAnimation();\r\n }\r\n }\r\n\r\n this.rafNumber = requestAnimationFrame(() => { this.animate(false); });\r\n\r\n if (this.animateCallCount++ % 4 == 0) {\r\n // We skip every other frame to target 15fps\r\n return;\r\n }\r\n\r\n this.drawVideoFrames();\r\n }\r\n\r\n private checkStartPlay(): void {\r\n let startPlay = true;\r\n\r\n if (this.video && this.video.channelMedia) {\r\n this.video.channelMedia.forEach(media => {\r\n if (!media.loaded) {\r\n startPlay = false;\r\n }\r\n });\r\n }\r\n\r\n if (this.firstPlayStarted) {\r\n this.vVideoComponents?.toArray().forEach(video => {\r\n if (!video.isPlaying()) {\r\n startPlay = false;\r\n this.stopAnimation();\r\n }\r\n });\r\n }\r\n\r\n if (startPlay) {\r\n this.maxVideoDuration = this.getMaxVideoDuration();\r\n this.play();\r\n }\r\n }\r\n\r\n private getMaxVideoDuration(): number {\r\n\r\n let maxDuration = 0;\r\n\r\n this.vVideoComponents?.toArray().forEach(video => {\r\n maxDuration = Math.max(maxDuration, video.getDuration());\r\n });\r\n\r\n return maxDuration;\r\n }\r\n\r\n private getChannelNames(): void {\r\n if (!this.video.channelMedia?.length) {\r\n return;\r\n }\r\n\r\n this.cameraChannelService.getCameraChannels({ VehicleId: this.video.VehicleId }).pipe(untilDestroyed(this)).subscribe(channels => {\r\n const availableCameraChannels = channels;\r\n\r\n let unlabelledChannel: IVideoChannelMedia; // The main channel will have no ChannelID so we will save that for last\r\n\r\n this.video.channelMedia.forEach(ch => {\r\n ch.ChannelLabel = \"\";\r\n const cameraChannelIndex = availableCameraChannels.findIndex(cameraChannel => cameraChannel.ChannelId === ch.ChannelId);\r\n\r\n if (cameraChannelIndex < 0) {\r\n unlabelledChannel = ch;\r\n return;\r\n }\r\n\r\n ch.ChannelLabel = this.translationService.tEnum(CameraLocation, \"CameraLocation\", availableCameraChannels[cameraChannelIndex].CameraLocation);\r\n\r\n this.addChannelTypeToLabel(availableCameraChannels[cameraChannelIndex], ch);\r\n\r\n availableCameraChannels.splice(cameraChannelIndex, 1);\r\n })\r\n\r\n if (!availableCameraChannels.length) {\r\n return;\r\n }\r\n\r\n const remainingChannel = availableCameraChannels[0];\r\n\r\n unlabelledChannel.ChannelLabel = this.translationService.tEnum(CameraLocation, \"CameraLocation\", remainingChannel.CameraLocation);\r\n\r\n this.addChannelTypeToLabel(remainingChannel, unlabelledChannel);\r\n\r\n })\r\n }\r\n\r\n private addChannelTypeToLabel(channel: ICameraChannel, channelMedia: IVideoChannelMedia): void {\r\n if (channel.CameraChannelType === CameraChannelType.Standard) {\r\n return;\r\n }\r\n\r\n channelMedia.ChannelLabel += ` (${this.translationService.tEnum(CameraChannelType, \"CameraChannelType\", channel.CameraChannelType)})`\r\n }\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { ISensorData } from \"@app/interfaces/ISensorData\";\r\nimport { Observable } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FoundationSensorDataService {\r\n constructor(private readonly http: HttpClient) { }\r\n\r\n getSensorDataForVehicle(vehicleId: number, start: Date, end = new Date()): Observable {\r\n return this.http.get(`/api/sensorData/${vehicleId}?start=${start.toISOString()}&end=${end.toISOString()}`,\r\n {\r\n params: {\r\n start: start.toISOString(),\r\n end: end.toISOString()\r\n }\r\n })\r\n }\r\n\r\n getSensorDataByImei(imei: string, startTime: Date, endTime: Date): Observable {\r\n\r\n return this.http.get(`/api/foundation/units/${imei}/sensordata`, {\r\n params: {\r\n start: startTime.toISOString(),\r\n end: endTime.toISOString()\r\n }\r\n });\r\n }\r\n}\r\n","import { Component, EventEmitter, HostListener, Input, OnChanges, Output } from \"@angular/core\";\r\nimport { DateService } from \"@app/services/date.service\";\r\nimport './video-controls.component.scss';\r\n\r\n@Component({\r\n selector: 'v-video-controls',\r\n template: require('./video-controls.component.html')\r\n})\r\nexport class VVideoControlsComponent implements OnChanges {\r\n\r\n @Input() secondsPlayed: number;\r\n @Input() videoDuration: number;\r\n @Input() isPlaying: boolean;\r\n @Input() isTimedOut: boolean;\r\n @Input() liveStream: boolean;\r\n @Input() hideSkipControls = false;\r\n\r\n @Output() play = new EventEmitter();\r\n @Output() pause = new EventEmitter();\r\n @Output() rewind = new EventEmitter();\r\n @Output() fastForward = new EventEmitter();\r\n @Output() close = new EventEmitter();\r\n @Output() restart = new EventEmitter();\r\n @Output() fullscreen = new EventEmitter();\r\n @Output() fitToFrame = new EventEmitter<{ fit: boolean, event: MouseEvent }>();\r\n @Output() zoom = new EventEmitter<{ zoomIn: boolean, event: MouseEvent }>();\r\n @Output() speedChanged = new EventEmitter();\r\n\r\n isFullScreen: boolean;\r\n fillFrame: boolean;\r\n isZoomed: boolean;\r\n secondsPlayedString: string;\r\n videoDurationString: string;\r\n\r\n showPlaybackSpeedOptions: boolean;\r\n playbackSpeed: number = 1;\r\n playbackSpeedOptions: number[] = [2, 1.5, 1, 0.5, 0.25];\r\n\r\n showZoom = true;\r\n showFitToFrame = true;\r\n showSpeedOptions = true;\r\n showFwRw = true;\r\n showRestart = true;\r\n\r\n constructor(\r\n private readonly dateService: DateService\r\n ) { }\r\n\r\n ngOnChanges(): void {\r\n this.updateTime();\r\n this.checkButtonVisibility();\r\n }\r\n\r\n @HostListener(\"click\", [\"$event\"]) onClick(event: MouseEvent): void {\r\n event.stopPropagation();\r\n }\r\n\r\n togglePlayPause(event: MouseEvent): void {\r\n if (!this.isPlaying) {\r\n this.play.emit(event)\r\n }\r\n else {\r\n this.pause.emit(event);\r\n }\r\n\r\n this.isPlaying = !this.isPlaying;\r\n }\r\n\r\n restartAll(event: MouseEvent): void {\r\n this.isPlaying = true;\r\n this.restart.emit(event);\r\n }\r\n\r\n toggleFullScreen(event: MouseEvent): void {\r\n this.isFullScreen = !this.isFullScreen;\r\n this.fullscreen.emit(event);\r\n }\r\n\r\n toggleFitToFrame(event: MouseEvent): void {\r\n this.fillFrame = !this.fillFrame;\r\n this.fitToFrame.emit({ fit: this.fillFrame, event: event });\r\n }\r\n\r\n toggleZoom(event: MouseEvent): void {\r\n this.isZoomed = !this.isZoomed;\r\n this.zoom.emit({ zoomIn: this.isZoomed, event: event });\r\n }\r\n\r\n closeAll(event: MouseEvent): void {\r\n this.close.emit(event);\r\n }\r\n\r\n setPlaybackSpeed(event: MouseEvent, speedOption: number): void {\r\n this.playbackSpeed = speedOption;\r\n this.togglePlaybackSpeedOptions(false);\r\n this.speedChanged.emit(speedOption)\r\n }\r\n\r\n togglePlaybackSpeedOptions(show = false): void {\r\n this.showPlaybackSpeedOptions = show;\r\n }\r\n\r\n fastForwardClick(): void {\r\n this.fastForward.emit();\r\n }\r\n\r\n rewindClick(): void {\r\n this.rewind.emit();\r\n }\r\n\r\n // ---\r\n\r\n private updateTime(): void {\r\n\r\n // Current time\r\n let rounded = Math.floor(this.secondsPlayed);\r\n this.secondsPlayedString = this.dateService.formatTimeDuration(rounded);\r\n\r\n rounded = Math.floor(this.videoDuration);\r\n this.videoDurationString = this.dateService.formatTimeDuration(rounded);\r\n\r\n this.secondsPlayedString = this.secondsPlayedString || \"00:00\";\r\n this.videoDurationString = this.videoDurationString || \"00:00\";\r\n }\r\n\r\n private checkButtonVisibility(): void {\r\n this.showFitToFrame = !!this.fitToFrame.observers.length;\r\n this.showSpeedOptions = !!this.speedChanged.observers.length;\r\n this.showZoom = !!this.zoom.observers.length;\r\n this.showFwRw = !!this.rewind.observers.length && !!this.fastForward.observers.length && !this.liveStream && !this.hideSkipControls;\r\n this.showRestart = !!this.restart.observers.length && !this.liveStream;\r\n }\r\n}\r\n","import { Component, ElementRef, EventEmitter, HostListener, Input, OnChanges, OnDestroy, OnInit, Output } from \"@angular/core\";\r\nimport { ICameraEventPeriod } from \"@app/main/components/videos/models/ICameraEventPeriod\";\r\nimport { DateService } from \"@app/services/date.service\";\r\nimport { IVideoSectionLoaded } from \"../interfaces/IVideoSectionLoaded\";\r\nimport './video-progress.component.scss';\r\n\r\n@Component({\r\n selector: 'v-video-progress',\r\n template: require('./video-progress.component.html')\r\n})\r\nexport class VVideoProgressComponent implements OnInit, OnChanges, OnDestroy {\r\n @Input() secondsPlayed: number;\r\n @Input() loadedSections: IVideoSectionLoaded[];\r\n @Input() activityPeriods: ICameraEventPeriod[];\r\n @Input() maxVideoDuration: number;\r\n @Input() showLargeControls: boolean;\r\n @Input() storyboardUrl: string;\r\n\r\n @Output() seek = new EventEmitter();\r\n\r\n //--\r\n\r\n\r\n containerWidth: number;\r\n updateInterval: any;\r\n\r\n progressPercentage = 0.0;\r\n toolTipOffsetPerc = 0.0;\r\n toolTipText = \"\";\r\n periodTitle = \"\";\r\n\r\n thumbnailPosition: number;\r\n thumbnailX: number;\r\n thumbnailY: number;\r\n thumbnailClass: string;\r\n\r\n constructor(\r\n private readonly el: ElementRef,\r\n private readonly dateService: DateService) { }\r\n\r\n\r\n ngOnInit(): void {\r\n // We need to do this like this because the size may change over time, especially during rendering phase\r\n this.updateInterval = setInterval(() => {\r\n this.updateContainerWidth();\r\n }, 1000);\r\n }\r\n\r\n ngOnChanges(): void {\r\n this.updateProgressBarWidth();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n clearInterval(this.updateInterval);\r\n }\r\n\r\n @HostListener('mousemove', ['$event'])\r\n mouseMove($event): void {\r\n this.mouseOver($event);\r\n }\r\n\r\n @HostListener('mouseover', ['$event'])\r\n mouseOver($event): void {\r\n this.toolTipOffsetPerc = this.getTooltipPosition($event.offsetX);\r\n this.updateThumbnailPosition($event.offsetX);\r\n\r\n this.toolTipText = this.dateService.formatTimeDuration(this.getSecondsFromXOffset($event.offsetX));\r\n this.periodTitle = \"\";\r\n\r\n const matchingActivityPeriod = this.activityPeriods?.find(p => this.toolTipOffsetPerc >= p.startPercentage && this.toolTipOffsetPerc <= p.endPercentage);\r\n if (matchingActivityPeriod) {\r\n this.periodTitle = matchingActivityPeriod.description;\r\n }\r\n }\r\n\r\n @HostListener('click', ['$event'])\r\n progressBarClick($event): void {\r\n const seekPosition = this.getSecondsFromXOffset($event.offsetX);\r\n this.seek.emit(seekPosition);\r\n }\r\n\r\n //--\r\n private updateProgressBarWidth(): void {\r\n this.progressPercentage = this.roundUp(this.getPositionFromTime(this.secondsPlayed), 1);\r\n\r\n if (this.loadedSections) {\r\n this.loadedSections.forEach(section => {\r\n section.startPercentage = this.getPositionFromTime(section.startSecond);\r\n section.endPercentage = this.getPositionFromTime(section.endSecond);\r\n });\r\n }\r\n\r\n if (this.activityPeriods) {\r\n this.activityPeriods.forEach(section => {\r\n section.startPercentage = this.getPositionFromTime(section.startSecond);\r\n section.endPercentage = this.getPositionFromTime(section.endSecond);\r\n });\r\n\r\n }\r\n }\r\n\r\n private updateContainerWidth(): void {\r\n this.containerWidth = this.getContainerWidth();\r\n }\r\n\r\n private getContainerWidth(): number {\r\n return this.el.nativeElement.clientWidth;\r\n }\r\n\r\n private roundUp(num, precision): number {\r\n const precisionPow = Math.pow(10, precision);\r\n return Math.floor(num * precisionPow) / precisionPow;\r\n }\r\n\r\n private getPositionFromTime(seconds: number): number {\r\n if (!this.maxVideoDuration || !seconds) {\r\n return 0;\r\n }\r\n\r\n return (seconds / this.maxVideoDuration) * 100.0;\r\n }\r\n\r\n private getTooltipPosition(offsetX: number): number {\r\n\r\n // Now ensure this doesnt get above or below predefined values (so that the tooltip sticks to the edge)\r\n const tooltipRadius = this.storyboardUrl ? 90 : 40;\r\n offsetX = Math.min(offsetX, this.containerWidth - tooltipRadius);\r\n offsetX = Math.max(offsetX, tooltipRadius);\r\n\r\n const position = this.getPositionPercentage(offsetX, this.containerWidth);\r\n\r\n return position;\r\n }\r\n\r\n private getPositionPercentage(offsetX: number, totalX: number): number {\r\n let position = offsetX / totalX;\r\n\r\n position = Math.min(position, 1);\r\n position = Math.max(position, 0);\r\n\r\n return this.roundUp(position * 100, 2);\r\n }\r\n\r\n private updateThumbnailPosition(offsetX: number): void {\r\n let position = this.getPositionPercentage(offsetX, this.containerWidth);\r\n\r\n // Scale down from 100% down to 25\r\n position = position / 4;\r\n\r\n this.thumbnailPosition = Math.round(position);\r\n this.thumbnailX = this.thumbnailPosition % 5;\r\n this.thumbnailY = Math.floor(this.thumbnailPosition / 5);\r\n\r\n // Special case\r\n if (position == 25) {\r\n this.thumbnailX = 4;\r\n this.thumbnailY = 4;\r\n }\r\n\r\n this.thumbnailClass = `thumbnail-pos-${this.thumbnailX}-${this.thumbnailY}`;\r\n\r\n }\r\n\r\n private getSecondsFromXOffset(offsetX: number): number {\r\n const xPercentage = offsetX / this.containerWidth;\r\n\r\n return xPercentage * this.maxVideoDuration;\r\n }\r\n}\r\n","import { Component, Input, OnChanges, OnInit, SimpleChanges } from \"@angular/core\";\r\nimport { IVideoThumbnail } from \"../../../main/components/videos/models/IVideoThumbnail\";\r\nimport \"./veriVideoThumbnails.component.scss\";\r\n\r\n@Component({\r\n selector: \"veri-video-thumbnails\",\r\n template: require(\"./veriVideoThumbnails.component.html\")\r\n})\r\nexport class VeriVideoThumbnailsComponent implements OnInit, OnChanges {\r\n\r\n @Input() thumbnails: IVideoThumbnail[];\r\n @Input() selectedThumbnail: IVideoThumbnail;\r\n @Input() tinyMode: boolean = false;\r\n\r\n // ---\r\n\r\n primaryThumbnails: IVideoThumbnail[];\r\n secondaryThumbnails: IVideoThumbnail[];\r\n\r\n selectedSecondaryThumbnail: IVideoThumbnail;\r\n\r\n highlightPrimaryThumbnail = true;\r\n\r\n constructor() { }\r\n\r\n trackThumbnail(index: number, row: IVideoThumbnail): number { return row.Id; }\r\n\r\n ngOnInit(): void {\r\n //if (!this.tinyMode) {\r\n // this.selectThumbnail(this.thumbnails[0]);\r\n //}\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n this.primaryThumbnails = this.thumbnails;\r\n\r\n if (this.thumbnails.length >= 16) {\r\n this.primaryThumbnails = [];\r\n this.secondaryThumbnails = [];\r\n\r\n this.thumbnails.forEach((t, i) => {\r\n if (i % 2 != 0) {\r\n this.primaryThumbnails.push(t);\r\n }\r\n else {\r\n this.secondaryThumbnails.push(t);\r\n }\r\n });\r\n }\r\n\r\n this.selectThumbnail(this.primaryThumbnails[0]);\r\n }\r\n\r\n selectThumbnail(selectedThumbnail: IVideoThumbnail): void {\r\n if (!selectedThumbnail) {\r\n return;\r\n }\r\n\r\n this.selectedThumbnail = this.thumbnails.find(thumbnail => thumbnail === selectedThumbnail);\r\n\r\n if (this.secondaryThumbnails?.length) {\r\n var index = this.primaryThumbnails.findIndex(t => t == this.selectedThumbnail);\r\n this.selectedSecondaryThumbnail = this.secondaryThumbnails[index];\r\n }\r\n\r\n if (!this.highlightPrimaryThumbnail) {\r\n this.swapSelectedThumbnails();\r\n }\r\n }\r\n\r\n deselectThumbnail(): void {\r\n if (!this.tinyMode) {\r\n return;\r\n }\r\n\r\n this.selectedThumbnail = null;\r\n }\r\n\r\n swapThumbnails() {\r\n this.highlightPrimaryThumbnail = !this.highlightPrimaryThumbnail;\r\n this.swapSelectedThumbnails();\r\n }\r\n\r\n //\r\n\r\n private swapSelectedThumbnails() {\r\n\r\n const temp = this.selectedThumbnail;\r\n this.selectedThumbnail = this.selectedSecondaryThumbnail;\r\n this.selectedSecondaryThumbnail = temp;\r\n }\r\n}\r\n","import { AfterViewInit, Component, Input, OnInit } from \"@angular/core\";\r\nimport { BreadcrumbService } from \"@services/breadcrumb.service\";\r\nimport { Transition } from \"@uirouter/angularjs\";\r\nimport { AccordianEntryComponent } from \"./accordian-entry/accordian-entry.component\";\r\nimport \"./accordian.component.scss\";\r\n\r\n@Component({\r\n selector: \"accordian\",\r\n template: require(\"./accordian.component.html\"),\r\n})\r\nexport class AccordianComponent {\r\n @Input() icon: string;\r\n\r\n @Input() useRoute: boolean;\r\n\r\n // ---\r\n\r\n children: AccordianEntryComponent[]=[];\r\n\r\n registerAccordianEntry(entry: AccordianEntryComponent) {\r\n this.children.push(entry);\r\n }\r\n\r\n // ---\r\n\r\n \r\n}\r\n","import { Component, Input, OnChanges, SimpleChanges } from \"@angular/core\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport \"./empty-state.component.scss\";\r\n\r\n@Component({\r\n selector: \"empty-state\",\r\n template: require(\"./empty-state.component.html\")\r\n})\r\nexport class EmptyStateComponent implements OnChanges {\r\n @Input() icon: string;\r\n\r\n @Input() title: string;\r\n @Input() text: string;\r\n\r\n @Input() subject: string;\r\n\r\n // Add CTA text / callback\r\n\r\n // ---\r\n\r\n isFontAwesome = false;\r\n\r\n constructor(private readonly translationService: TranslationService) {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (this.subject) {\r\n this.title = this.translationService.t(\"EmptyState.DefaultTitle\", this.subject);\r\n\r\n if (!this.text) {\r\n this.text = this.translationService.t(\"EmptyState.DefaultText\", this.subject);\r\n }\r\n }\r\n\r\n if (changes[\"icon\"]) {\r\n this.isFontAwesome = this.icon.indexOf(\"fa-\") == 0;\r\n }\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from \"@angular/core\";\r\nimport \"./revealingColumns.scss\";\r\n\r\n@Component({\r\n selector: \"revealing-columns\",\r\n template: require(\"./revealingColumns.html\")\r\n})\r\nexport class RevealingColumnsComponent implements OnInit, OnChanges {\r\n\r\n // Bindings\r\n\r\n @Input() largeColumnSize: number;\r\n @Input() show: boolean;\r\n\r\n @Output() onSecondColumnClose: EventEmitter = new EventEmitter();\r\n\r\n // Internal\r\n\r\n showSecondColumn: boolean;\r\n\r\n constructor() { }\r\n\r\n ngOnInit() {\r\n this.setDefaultColumnSize();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n // When on slower machines this will render the component before animation ensuring smooth animations\r\n setTimeout(() => {\r\n this.showSecondColumn = this.show;\r\n }, 300);\r\n\r\n this.setDefaultColumnSize();\r\n }\r\n\r\n close() {\r\n this.show = false;\r\n this.showSecondColumn = false;\r\n this.onSecondColumnClose.emit();\r\n }\r\n\r\n // ---\r\n\r\n private setDefaultColumnSize() {\r\n if (!this.largeColumnSize || this.largeColumnSize <= 0) {\r\n this.largeColumnSize = 50;\r\n }\r\n }\r\n}\r\n","import { Component, HostBinding, Input, OnInit } from \"@angular/core\";\r\nimport \"./veri-panel.component.scss\";\r\n\r\n@Component({\r\n selector: \"veri-panel\",\r\n template: require(\"./veri-panel.component.html\")\r\n})\r\nexport class VeriPanelComponent implements OnInit {\r\n\r\n @HostBinding(\"class.flat-transparent\") @Input() flatTransparent: boolean;\r\n\r\n constructor() {}\r\n\r\n ngOnInit(): void {\r\n\r\n }\r\n}\r\n","import { AfterViewInit, Component, ElementRef, OnInit } from \"@angular/core\";\r\nimport { HTMLService } from \"@services/htmlService.service\";\r\nimport \"./detail-page.component.scss\";\r\n\r\n@Component({\r\n selector: \"detail-page\",\r\n template: require(\"./detail-page.component.html\")\r\n})\r\nexport class DetailPageComponent implements OnInit, AfterViewInit {\r\n\r\n // ---\r\n\r\n constructor(\r\n private readonly elementRef: ElementRef,\r\n private readonly htmlService: HTMLService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n ngAfterViewInit() {\r\n\r\n }\r\n\r\n // ---\r\n}\r\n","import { Component, EventEmitter, HostBinding, Input, OnInit, Output, SimpleChanges } from \"@angular/core\";\r\nimport { ConstantsService } from \"@app/services/constantsService\";\r\nimport { animFadeInOut } from \"src/app/styles/animations/fade-in-fade-out.animation\";\r\nimport { animSlideFromLeft } from \"src/app/styles/animations/slide-from-left.animation\";\r\nimport \"./sidebar.component.scss\";\r\n\r\n@Component({\r\n selector: \"sidebar\",\r\n template: require(\"./sidebar.component.html\"),\r\n animations: [animFadeInOut, animSlideFromLeft]\r\n})\r\nexport class SideBarComponent implements OnInit {\r\n\r\n @Input() title: string;\r\n @Input() subtitle: string;\r\n @Input() width: string = \"40%\";\r\n @Input() loading = false;\r\n @Input() message: string;\r\n @Input() messageWarning: boolean;\r\n @Input() saving = false;\r\n\r\n @Output() onClose: EventEmitter = new EventEmitter();\r\n\r\n @HostBinding('@animFadeInOut') get animFadeInOut() {\r\n return true;\r\n }\r\n\r\n @HostBinding('@animSlideFromLeft') get animateIn() {\r\n return true;\r\n }\r\n\r\n // ---\r\n\r\n isMobile: boolean;\r\n justSaved: boolean;\r\n\r\n //--\r\n\r\n constructor(private readonly constantsService: ConstantsService) {\r\n this.isMobile = this.constantsService.getIsMobile();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.width = this.isMobile ? \"100%\" : this.width;\r\n }\r\n}\r\n","import { Component, OnInit } from \"@angular/core\";\r\nimport \"./horizontal-layout.component.scss\";\r\n\r\n@Component({\r\n selector: \"horizontal-layout\",\r\n template: require(\"./horizontal-layout.component.html\")\r\n})\r\nexport class HorizontalLayoutComponent implements OnInit {\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n\r\n }\r\n}\r\n","import { Component, OnInit } from \"@angular/core\";\r\nimport \"./vertical-layout.component.scss\";\r\n\r\n@Component({\r\n selector: \"vertical-layout\",\r\n template: require(\"./vertical-layout.component.html\")\r\n})\r\nexport class VerticalLayoutComponent implements OnInit {\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n\r\n }\r\n}\r\n","import { Component, Input, OnInit } from \"@angular/core\";\r\nimport \"./vertical-map-layout.component.scss\";\r\n\r\n@Component({\r\n selector: \"vertical-map-layout\",\r\n template: require(\"./vertical-map-layout.component.html\")\r\n})\r\nexport class VerticalMapLayoutComponent implements OnInit {\r\n\r\n @Input() loading: boolean;\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n\r\n }\r\n}\r\n","import { Component, ElementRef, EventEmitter, Input, OnChanges, OnInit, Optional, Output, SimpleChanges, ViewChild } from \"@angular/core\";\r\nimport { VDateSelectorComponent } from \"@app/directives/_veri/v-date-selector/v-date-selector.component\";\r\nimport { TimeFilterType } from \"@app/main/components/reports/enums/TimeFilterType\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { VButtonDropdownComponent } from \"@directives/_core/v-dropdown/v-button-dropdown/v-button-dropdown.component\";\r\nimport { DateRange } from \"@enums/DateRange.enum\";\r\nimport { DateService } from \"@services/date.service\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport { FilterBarComponent } from \"../filter-bar.component\";\r\nimport { FilterTriggerType, IFilterBarFilter } from \"../filter-bar.models\";\r\nimport \"./date-button-filter.component.scss\";\r\n\r\n@Component({\r\n selector: \"date-button-filter\",\r\n template: require(\"./date-button-filter.component.html\")\r\n})\r\nexport class DateButtonFilterComponent implements IFilterBarFilter, OnInit, OnChanges {\r\n\r\n @Input() date: Date; // Single date will override startDate and endDate\r\n\r\n @Input() startDate: Date;\r\n @Input() endDate: Date;\r\n @Input() dateRange: DateRange;\r\n\r\n @Input() maxDays = 31;\r\n\r\n @Input() label: string;\r\n\r\n @Input() showTimeFilter: boolean;\r\n @Input() timeIncrements: number;\r\n @Input() showDailyFilter: boolean;\r\n\r\n @Input() hideFilter: boolean;\r\n\r\n @Output() change = new EventEmitter();\r\n\r\n @ViewChild(VButtonDropdownComponent) dropdown: VButtonDropdownComponent;\r\n @ViewChild(VDateSelectorComponent) dateSelector: VDateSelectorComponent;\r\n\r\n // ---\r\n\r\n selected: any; // for interface\r\n name = \"Date Range\";\r\n icon = \"today\";\r\n type: FilterTriggerType = \"date\";\r\n\r\n errorMessage: string;\r\n\r\n startTime: string;\r\n endTime: string;\r\n\r\n timeFilterType: TimeFilterType = TimeFilterType.None;\r\n\r\n private defaultLabel = \"No Date Filter\";\r\n\r\n constructor(\r\n @Optional() private parent: FilterBarComponent,\r\n readonly elementRef: ElementRef,\r\n private readonly veriDate: VeriDate,\r\n private readonly dateService: DateService,\r\n private readonly translationService: TranslationService) {\r\n this.label = this.defaultLabel;\r\n }\r\n\r\n ngOnInit(): void {\r\n // Default to today\r\n if (!this.startDate) {\r\n this.startDate = this.dateService.getStartOfDay(new Date());\r\n this.endDate = new Date();\r\n\r\n this.updateLabelText();\r\n }\r\n\r\n if (this.startDate && this.showTimeFilter) {\r\n this.setTimes();\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n if (!this.parent) {\r\n return;\r\n }\r\n\r\n this.hideFilter && this.parent.registerFilter(this);\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (this.date) {\r\n this.startDate = this.date;\r\n this.endDate = this.date;\r\n }\r\n\r\n if (changes[\"dateRange\"]) {\r\n this.createDatesFromDateRange();\r\n }\r\n\r\n if (changes[\"date\"] || changes[\"startDate\"] || changes[\"endDate\"] || changes[\"dateRange\"]) {\r\n this.emitChange();\r\n this.updateLabelText();\r\n this.setTimes();\r\n }\r\n\r\n }\r\n\r\n onDateRangeChanged(dates: Date[]): void {\r\n this.startDate = dates[0];\r\n this.endDate = dates[1];\r\n }\r\n\r\n onApply(): void {\r\n if (this.showTimeFilter) {\r\n this.applyRangeStartAndEnd();\r\n }\r\n\r\n this.emitChange();\r\n this.updateLabelText();\r\n\r\n this.onClose();\r\n }\r\n\r\n onClose(): void {\r\n this.dropdown.showDropDown = false;\r\n\r\n }\r\n\r\n // ---\r\n\r\n private emitChange(): void {\r\n var event = [this.startDate, this.endDate];\r\n this.change.emit(event);\r\n this.parent?.onFilterChange(\"date\", event);\r\n }\r\n\r\n private setTimes(): void {\r\n this.startTime = this.dateService.getTimeAsString(this.startDate);\r\n this.endTime = this.dateService.getTimeAsString(this.endDate);\r\n }\r\n\r\n private applyRangeStartAndEnd(): void {\r\n if (!this.startTime) {\r\n this.startDate = this.dateService.getStartOfDay(this.startDate);\r\n this.endDate = this.dateService.getEndOfDay(this.endDate);\r\n return;\r\n }\r\n\r\n this.startDate = this.dateService.updateTime(this.startDate, this.startTime);\r\n this.endDate = this.dateService.updateTime(this.endDate, this.endTime);\r\n }\r\n\r\n private updateLabelText() {\r\n if (!this.startDate || !this.endDate) {\r\n return;\r\n }\r\n\r\n if (this.startDate.getDate() == this.endDate.getDate() && this.startDate.getMonth() == this.endDate.getMonth()) {\r\n\r\n this.label = this.dateService.formatDate(this.startDate, { longMonth: true });\r\n return;\r\n }\r\n\r\n this.label = this.dateService.formatDate(this.startDate, { excludeYear: true })\r\n this.label += \" - \";\r\n this.label += this.dateService.formatDate(this.endDate);\r\n }\r\n\r\n private createDatesFromDateRange(): void {\r\n\r\n var startEnd = this.veriDate.dateRangeFromEnum(this.dateRange);\r\n\r\n this.startDate = startEnd.start;\r\n this.endDate = startEnd.end;\r\n }\r\n}\r\n","import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from \"@angular/core\";\r\nimport { VButtonDropdownComponent } from \"@directives/_core/v-dropdown/v-button-dropdown/v-button-dropdown.component\";\r\nimport { DriverStatus, IDriver } from \"@interfaces/IDriver\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { DriverService } from \"@services/driver.service\";\r\nimport { FilterBarComponent } from \"../filter-bar.component\";\r\nimport { FilterTriggerType, IFilterBarFilter } from \"../filter-bar.models\";\r\nimport \"./driver-button-filter.component.scss\";\r\n\r\n@Component({\r\n selector: \"driver-button-filter\",\r\n template: require(\"./driver-button-filter.component.html\")\r\n})\r\nexport class DriverButtonFilterComponent implements IFilterBarFilter {\r\n @Input() selected: IDriver;\r\n @Input() label = \"All Drivers\";\r\n @Output() change = new EventEmitter();\r\n\r\n @ViewChild(VButtonDropdownComponent) dropdown: VButtonDropdownComponent;\r\n\r\n // ---\r\n\r\n name = \"Driver\";\r\n icon = \"fa-solid fa-id-card\";\r\n type: FilterTriggerType = \"driver\";\r\n\r\n drivers: IDriver[];\r\n\r\n itemPromise: angular.IPromise;\r\n\r\n constructor(\r\n private readonly parent: FilterBarComponent,\r\n readonly elementRef: ElementRef,\r\n readonly driverService: DriverService\r\n ) {\r\n\r\n }\r\n\r\n onFilterOpen() {\r\n this.itemPromise = this.driverService.getDrivers().then(drivers => {\r\n this.drivers = drivers;\r\n\r\n // Todo: Move to driver service\r\n this.drivers.sort((d1, d2) => {\r\n if (d1.Status == DriverStatus.Active && d2.Status == DriverStatus.Inactive) {\r\n return -1;\r\n }\r\n\r\n if (d1.Status == DriverStatus.Inactive && d2.Status == DriverStatus.Active) {\r\n return 1;\r\n }\r\n\r\n return d1.DisplayName.localeCompare(d2.DisplayName);\r\n });\r\n });\r\n }\r\n\r\n filterPredicate(item: any, value?: IDriver): boolean {\r\n\r\n if (item.DriverId) {\r\n return item.DriverId == value.Id;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n searchPredicate = (item: IDriver, value?: any): boolean => {\r\n return this.driverService.driverSearchPredicate(item, value);\r\n }\r\n\r\n onDriverClick(driver: IDriver) {\r\n this.selected = driver;\r\n\r\n this.change.emit(driver);\r\n this.parent.onFilterChange(\"driver\", driver);\r\n\r\n if (this.selected) {\r\n this.label = driver.DisplayName;\r\n }\r\n else {\r\n this.label = \"All Drivers\";\r\n }\r\n\r\n if (!this.dropdown) {\r\n return;\r\n }\r\n\r\n this.dropdown.showDropDown = false;\r\n }\r\n\r\n clearSelectedDriver() {\r\n this.onDriverClick(null);\r\n }\r\n}\r\n","import { Component, ElementRef, EventEmitter, Input, OnChanges, Output, SimpleChanges, TemplateRef, ViewChild, ViewContainerRef } from \"@angular/core\";\r\nimport { FilterBarComponent } from \"../filter-bar.component\";\r\nimport { FilterBarItemPredicate, FilterBarItemSearchPredicate, FilterTriggerType, IFilterBarFilter } from \"../filter-bar.models\";\r\nimport \"./item-filter.component.scss\";\r\n\r\n@Component({\r\n selector: \"item-filter\",\r\n template: require(\"./item-filter.component.html\")\r\n})\r\nexport class ItemFilterComponent implements OnChanges, IFilterBarFilter {\r\n @Input() icon = \"\";\r\n @Input() defaultLabel = \"Custom Filter\";\r\n @Input() selected: any;\r\n @Input() name = \"\";\r\n\r\n @Input() loading = false;\r\n @Input() items: any[];\r\n @Input() itemPromise: angular.IPromise;\r\n @Input() itemDisplayProp: string;\r\n @Input() itemTemplate: TemplateRef;\r\n\r\n @Input() filterPredicate: FilterBarItemPredicate;\r\n @Input() searchPredicate: FilterBarItemSearchPredicate;\r\n\r\n @Output() open = new EventEmitter();\r\n @Output() close = new EventEmitter();\r\n @Output() change = new EventEmitter();\r\n\r\n @ViewChild(\"itemFilterButton\", { read: ElementRef }) itemFilterButtonRef: ElementRef;\r\n @ViewChild(\"defaultTemplate\", { read: ViewContainerRef }) defaultTemplateContainer: ViewContainerRef;\r\n\r\n // ---\r\n\r\n filteredItemCount = 0;\r\n filteredItems: any[];\r\n displayItems: any[];\r\n searchText: string;\r\n\r\n type: FilterTriggerType = \"custom\";\r\n showDropdown = false;\r\n visible?: boolean;\r\n\r\n constructor(protected readonly parent: FilterBarComponent, readonly elementRef: ElementRef\r\n ) {\r\n this.updateLabelText();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n this.updateLabelText();\r\n\r\n if (changes[\"itemPromise\"] && this.itemPromise) {\r\n this.loading = !this.items;\r\n\r\n this.itemPromise.finally(() => {\r\n\r\n this.loading = false;\r\n });\r\n }\r\n\r\n if (changes[\"selected\"] && this.selected) {\r\n this.visible = true;\r\n this.parent.updateFilterVisibility(this);\r\n this.parent.onFilterChange(\"custom\", this.selected, { customName: this.defaultLabel, filterData: true });\r\n }\r\n\r\n if (changes[\"items\"] && this.items || changes[\"loading\"]) {\r\n this.processNewItems();\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n\r\n this.parent.registerFilter(this);\r\n }\r\n\r\n toggleDropdown() {\r\n this.showDropdown = !this.showDropdown;\r\n\r\n if (this.showDropdown) {\r\n this.open.emit();\r\n\r\n if (this.selected && this.filteredItems.indexOf(this.selected) < 0) {\r\n this.viewAllItems();\r\n }\r\n }\r\n }\r\n\r\n closeDropdown() {\r\n this.showDropdown = false;\r\n\r\n this.parent.childClosed(this);\r\n this.close.emit();\r\n }\r\n\r\n onItemClicked(item: any, hideDropDown = true) {\r\n this.selected = item;\r\n\r\n this.change.emit(item);\r\n this.parent.onFilterChange(\"custom\", item, { customName: this.defaultLabel, filterData: true });\r\n\r\n this.updateLabelText();\r\n\r\n if (hideDropDown) {\r\n this.showDropdown = false;\r\n }\r\n }\r\n\r\n clearSelected() {\r\n this.onItemClicked(null);\r\n }\r\n\r\n onSearch(text: string) {\r\n this.searchText = text;\r\n this.searchItems();\r\n }\r\n\r\n viewAllItems() {\r\n\r\n this.filteredItemCount = 0;\r\n this.filteredItems = this.items;\r\n this.searchItems();\r\n }\r\n\r\n // ---\r\n\r\n private processNewItems() {\r\n this.prefilterDataset();\r\n this.alignSelectedItems();\r\n this.searchItems();\r\n }\r\n\r\n private prefilterDataset(): void {\r\n\r\n this.filteredItems = this.items;\r\n this.filteredItemCount = 0;\r\n\r\n if (!this.parent || !this.items?.length) {\r\n return;\r\n }\r\n\r\n this.filteredItems = this.parent.filterChildData(this, this.items);\r\n this.filteredItemCount = this.items.length - this.filteredItems.length;\r\n }\r\n\r\n private updateLabelText() {\r\n if (this.selected) {\r\n this.name = this.selected[this.itemDisplayProp] || this.selected;\r\n }\r\n else {\r\n this.name = this.defaultLabel;\r\n }\r\n }\r\n\r\n private searchItems() {\r\n if (!this.searchText) {\r\n this.displayItems = this.filteredItems;\r\n return;\r\n }\r\n\r\n this.displayItems = this.filteredItems.filter(i => {\r\n var result = this.searchPredicate(i, this.searchText);;\r\n return result;\r\n });\r\n }\r\n\r\n private alignSelectedItems() {\r\n // If we have changes, ensure our models now match\r\n if (this.selected && this.items) {\r\n var newSelected = this.items.find(i => i.Id == this.selected.Id);\r\n if (newSelected) {\r\n this.selected = newSelected;\r\n }\r\n }\r\n\r\n // If we cannot find out selected item in our filtered list, then show it in our main list\r\n if (this.selected && this.filteredItems.indexOf(this.selected) < 0) {\r\n this.viewAllItems();\r\n }\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from \"@angular/core\";\r\nimport { ThemeService } from \"@app/services/theme.service\";\r\nimport { FilterBarComponent } from \"../filter-bar/filter-bar.component\";\r\nimport { FilterChange, IAggregateFilterEvent, IFilterBarListWithCount, IVerticalFilterListItem } from \"../filter-bar/filter-bar.models\";\r\nimport \"./vertical-filter-list.component.scss\";\r\n\r\nexport type VerticalFilterItemCreationCallback = (data: T) => IVerticalFilterListItem;\r\n\r\n@Component({\r\n selector: \"vertical-filter-list\",\r\n template: require(\"./vertical-filter-list.component.html\")\r\n})\r\nexport class VerticalFilterListComponent implements OnChanges, IFilterBarListWithCount {\r\n private callbackIcon?: string;\r\n\r\n @Input() name: string;\r\n @Input() items: IVerticalFilterListItem[] = [];\r\n @Input() multiSelect = false;\r\n @Input() multiSelectMode: 'every-filter' | 'some-filter' = 'every-filter';\r\n @Input() showChart = true;\r\n @Input() minValue: number;\r\n\r\n @Input() filterBar: FilterBarComponent;\r\n @Input() itemCreationCallback: VerticalFilterItemCreationCallback;\r\n\r\n @Output() change = new EventEmitter();\r\n\r\n // ---\r\n\r\n filterEvent: IAggregateFilterEvent;\r\n\r\n get selectedItems(): IVerticalFilterListItem[] {\r\n return this.items.filter(item => item.selected);\r\n }\r\n\r\n trackByItem = (index: number, item: IVerticalFilterListItem) => item.data;\r\n maxListItemCount = 0;\r\n\r\n constructor(private readonly themeService: ThemeService) { }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[\"filterBar\"] && this.filterBar) {\r\n this.connectFilterBar();\r\n }\r\n\r\n if (changes[\"items\"]) {\r\n this.items.forEach(item => this.setIcon(item));\r\n }\r\n }\r\n\r\n selectItem(item: IVerticalFilterListItem): void {\r\n setTimeout(() => {\r\n this.onItemSelected(item);\r\n });\r\n }\r\n\r\n onItemSelected(item: IVerticalFilterListItem): void {\r\n if (item === null) {\r\n this.items.forEach((item) => item.selected = false); \r\n } else {\r\n if (this.multiSelect) {\r\n item.selected = !item.selected;\r\n } else {\r\n const previousSelectionState = item.selected;\r\n\r\n this.items.forEach((item) => item.selected = false); \r\n item.selected = !previousSelectionState;\r\n }\r\n }\r\n\r\n this.items.forEach(item => this.setIcon(item));\r\n this.change.emit(this.selectedItems);\r\n\r\n const filtersChange : FilterChange[] = this.items.map((item, index) => ({\r\n type: 'custom', \r\n event: item, \r\n options: { filterData: true, customName: `vertical-filter-list-${index}` }\r\n }));\r\n\r\n this.filterBar.onFiltersChange(filtersChange);\r\n }\r\n\r\n updateList(data: any[]): void {\r\n if (!this.itemCreationCallback) {\r\n return;\r\n }\r\n\r\n this.items = [];\r\n\r\n data.forEach(d => {\r\n // Does an item within our list match this current item, if so we already have this category, dont add it\r\n if (this.items.some(i => i.predicate(d))) {\r\n return;\r\n }\r\n\r\n const newItem = this.itemCreationCallback(d);\r\n this.callbackIcon = newItem.icon;\r\n\r\n this.setIcon(newItem);\r\n this.items.push(newItem);\r\n });\r\n\r\n }\r\n\r\n // ---\r\n\r\n private setIcon(item: IVerticalFilterListItem): void {\r\n if (!item) {\r\n return;\r\n }\r\n\r\n const unselectedIcon = this.callbackIcon || \"check_box_outline_blank\";\r\n const selectedIcon = this.callbackIcon ? \"checked\" : \"check_box\";\r\n\r\n if (item.selected) {\r\n item.icon = selectedIcon;\r\n }\r\n else {\r\n item.icon = unselectedIcon;\r\n }\r\n }\r\n\r\n private connectFilterBar(): void {\r\n this.filterBar.registerFilterBarList(this);\r\n }\r\n\r\n}\r\n","import { Component, ElementRef, EventEmitter, Input, OnInit, Output, ViewChild } from \"@angular/core\";\r\nimport { FilterBarComponent } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.component\";\r\nimport { FilterTriggerType, IFilterBarFilter } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { VButtonDropdownComponent } from \"@directives/_core/v-dropdown/v-button-dropdown/v-button-dropdown.component\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport \"./vehicle-button-filter.component.scss\";\r\n\r\n@Component({\r\n selector: \"vehicle-button-filter\",\r\n template: require(\"./vehicle-button-filter.component.html\")\r\n})\r\nexport class VehicleButtonFilterComponent implements IFilterBarFilter {\r\n @Input() selected: IVehicle;\r\n @Input() label = \"All Vehicles\";\r\n @Output() change = new EventEmitter();\r\n\r\n @ViewChild(VButtonDropdownComponent) dropdown: VButtonDropdownComponent;\r\n\r\n // ---\r\n\r\n name = \"Vehicle\";\r\n icon = \"fa-solid fa-truck\";\r\n type: FilterTriggerType = \"vehicle\";\r\n\r\n vehicles: IVehicle[];\r\n\r\n itemPromise: angular.IPromise;\r\n\r\n constructor(\r\n private readonly parent: FilterBarComponent,\r\n readonly elementRef: ElementRef,\r\n readonly vehicleService: VehicleService,\r\n private readonly veriDate: VeriDate\r\n ) {\r\n\r\n }\r\n\r\n onFilterOpen() {\r\n this.itemPromise = this.vehicleService.getVehicles({ includeLatestPlots: true, includePeripheralMappings: true }).then(vehicles => {\r\n this.vehicles = vehicles;\r\n\r\n // Now perform standard vehicle sort (todo: move to vehicle service)\r\n // General algorithm:\r\n // 1. Vehicles sorted by plot existence\r\n // 2. Vehicles sorted by plot age older than a week\r\n // 3. Vehicles sorted alphabetically\r\n var weekAgo = this.veriDate.createMoment(new Date()).add(-7, \"d\");\r\n this.vehicles.sort((v1, v2) => {\r\n // Parameterise this in service later\r\n var includePlots = true;\r\n\r\n if (includePlots) {\r\n if (v1.Plot && !v2.Plot) {\r\n return -1;\r\n }\r\n\r\n if (v2.Plot && !v1.Plot) {\r\n return 1;\r\n }\r\n\r\n if (!v1.Plot && !v2.Plot) {\r\n return 0;\r\n }\r\n }\r\n\r\n // Time period taken from vehicle-status - move to service?\r\n if (v1.Plot.UtcMoment.isAfter(weekAgo) && v2.Plot.UtcMoment.isBefore(weekAgo)) {\r\n return -1;\r\n }\r\n\r\n if (v1.Plot.UtcMoment.isBefore(weekAgo) && v2.Plot.UtcMoment.isAfter(weekAgo)) {\r\n return 1;\r\n }\r\n\r\n return v1.ShortReg.localeCompare(v2.ShortReg);\r\n });\r\n });\r\n }\r\n\r\n filterPredicate(item: any, value?: IVehicle): boolean {\r\n // Try to find vehicle id\r\n if (item.VehicleId) {\r\n return item.VehicleId == value.Id;\r\n }\r\n\r\n if (item.vehicle) {\r\n return item.vehicle.Id == value.Id;\r\n }\r\n\r\n if (item.ShortReg) {\r\n return item.Id == value.Id;\r\n }\r\n\r\n // Dont know how to cope with this\r\n return false;\r\n }\r\n\r\n searchPredicate = (item: IVehicle, value?: any): boolean => {\r\n return this.vehicleService.vehicleSearchPredicate(item, value);\r\n }\r\n\r\n onVehicleClick(vehicle: IVehicle) {\r\n this.selected = vehicle;\r\n\r\n this.change.emit(vehicle);\r\n this.parent.onFilterChange(\"vehicle\", vehicle);\r\n\r\n if (this.selected) {\r\n this.label = vehicle.ShortReg;\r\n }\r\n else {\r\n this.label = \"All Vehicles\";\r\n }\r\n }\r\n\r\n clearSelectedVehicle() {\r\n this.onVehicleClick(null);\r\n }\r\n}\r\n","import { Component, Input, OnChanges, OnInit } from \"@angular/core\";\r\nimport { DateService, DateUnit } from \"@app/services/date.service\";\r\nimport { VorRecordStatus } from \"@components/resourceManagement/vor/vor.interfaces\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { ReasonCodeService } from \"@services/reasonCode.service\";\r\nimport \"./vehicle-status.component.scss\";\r\nimport { VehicleStatusService } from \"./vehicle-status.service\";\r\n\r\n@Component({\r\n selector: \"vehicle-status\",\r\n template: require(\"./vehicle-status.component.html\")\r\n})\r\nexport class VehicleStatusComponent implements OnInit, OnChanges {\r\n\r\n @Input() vehicle: IVehicle;\r\n @Input() hideIndicator: boolean;\r\n @Input() hideReg: boolean;\r\n\r\n // ---\r\n\r\n text: string;\r\n color: string;\r\n tooltipText: string;\r\n\r\n constructor(\r\n private readonly dateService: DateService,\r\n private readonly reasonCodeService: ReasonCodeService,\r\n private readonly vehicleStatusService: VehicleStatusService\r\n ) {\r\n }\r\n\r\n ngOnInit() {\r\n this.update();\r\n }\r\n\r\n ngOnChanges() {\r\n this.update();\r\n }\r\n\r\n // ---\r\n\r\n private update(): void {\r\n var statusToolTip = this.vehicle?.Plot\r\n ? this.dateService.formatDate(this.vehicle.Plot.Utc)\r\n : \"No data received\";\r\n\r\n\r\n this.getVehiclePlot();\r\n\r\n if (!this.vehicle?.Plot) {\r\n if (!this.vehicle) {\r\n console.error(\"No vehicle specified\");\r\n }\r\n\r\n this.setStatus(\"No data received\", \"red-color\", statusToolTip);\r\n return;\r\n }\r\n\r\n if (this.vehicle.vorRecord && this.vehicle.vorRecord.status == VorRecordStatus.Active) {\r\n this.setStatus(`Vehicle Off Road`, \"grey-color\", statusToolTip);\r\n return;\r\n }\r\n\r\n const isDriving = this.reasonCodeService.isTravelling(this.vehicle.Plot.Reason);\r\n const ignitionOn = this.reasonCodeService.isIgnitionOn(this.vehicle.Plot.Reason);\r\n\r\n const activityText = isDriving ? \"Driving\" : \"Stationary\";\r\n const lastReported = this.dateService.relativeTime(this.vehicle.Plot.Utc);\r\n\r\n let statusColor = \"red-color\";\r\n const sevenDaysAgo = this.dateService.addOrSubtractTime(new Date(), -7, DateUnit.Day);\r\n const twoDaysAgo = this.dateService.addOrSubtractTime(new Date(), -2, DateUnit.Day);\r\n\r\n if (this.dateService.date1IsAfterDate2(sevenDaysAgo, this.vehicle.Plot.Utc)){\r\n // stay as red\r\n }\r\n else if (this.dateService.date1IsAfterDate2(twoDaysAgo, this.vehicle.Plot.Utc)) {\r\n statusColor = \"orange-color\";\r\n }\r\n else if (isDriving) {\r\n statusColor = \"green-color\";\r\n }\r\n else {\r\n statusColor = ignitionOn ? \"green-color\" : \"grey-color\";\r\n }\r\n\r\n var statusText = activityText;\r\n if (!isDriving) {\r\n statusText += (ignitionOn ? \" (Ignition On)\" : \" (Ignition Off)\");\r\n }\r\n\r\n statusText += ` - ${lastReported}`;\r\n\r\n this.setStatus(statusText, statusColor, statusToolTip);\r\n }\r\n\r\n private setStatus(text: string, color: string = \"grey-background\", tooltipText: string = \"\") {\r\n this.text = text;\r\n this.color = color;\r\n this.tooltipText = tooltipText;\r\n }\r\n\r\n private async getVehiclePlot(): Promise {\r\n if (this.vehicle.Plot) {\r\n return;\r\n }\r\n\r\n const plot = await this.vehicleStatusService.getLatestPlotForVehicle(this.vehicle.Id);\r\n\r\n if (plot) {\r\n this.vehicle.Plot = plot;\r\n this.update();\r\n }\r\n\r\n }\r\n}\r\n","import { Component, Input, OnChanges, SimpleChanges } from \"@angular/core\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { VehicleDataService } from \"src/app/main/components/fleetMaintenance/vehicleData.service\";\r\nimport \"./vehicleInfoCard.component.scss\";\r\n\r\n@Component({\r\n selector: \"vehicle-info-card\",\r\n template: require(\"./vehicleInfoCard.component.html\")\r\n})\r\nexport class VehicleInfoCardComponent implements OnChanges {\r\n @Input() vehicle: IVehicle;\r\n @Input() hideImage: boolean = false;\r\n\r\n loading: boolean;\r\n\r\n constructor(private vehicleDataService: VehicleDataService) {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (!this.vehicle || this.vehicle.vehicleData) {\r\n return;\r\n }\r\n\r\n this.vehicleDataService.getDataForVehicle(this.vehicle.Id).then(data => {\r\n this.vehicle.vehicleData = data;\r\n\r\n this.vehicleDataService.calculateMOTAndTaxStatus(this.vehicle, data);\r\n });\r\n }\r\n}\r\n\r\n//import { IVehicle } from \"@interfaces/IVehicle\";\r\n//import * as angular from \"angular\";\r\n//import { VehicleDataService } from \"src/app/main/components/fleetMaintenance/vehicleData.service\";\r\n//import \"./vehicleInfoCard.component.scss\";\r\n\r\n//interface IVehicleListBindings {\r\n// vehicle: IVehicle;\r\n//}\r\n//class ComponentController implements angular.IComponentController, IVehicleListBindings {\r\n\r\n// loading: boolean;\r\n\r\n// vehicle: IVehicle;\r\n\r\n// static $inject = [\"vehicleDataService\"];\r\n\r\n// constructor(\r\n// private readonly vehicleDataService: VehicleDataService) {\r\n// }\r\n\r\n// $onInit(): void {\r\n// }\r\n\r\n// $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n// if (!this.vehicle || this.vehicle.vehicleData) {\r\n// return;\r\n// }\r\n\r\n// this.vehicleDataService.getDataForVehicle(this.vehicle.Id).then(data => {\r\n// this.vehicle.vehicleData = data;\r\n\r\n// this.vehicleDataService.calculateMOTAndTaxStatus(this.vehicle, data);\r\n// });\r\n// }\r\n\r\n// // ---\r\n\r\n//}\r\n\r\n//export class VehicleInfoCardComponent implements angular.IComponentOptions {\r\n// bindings: any;\r\n// controller: any;\r\n// template: string;\r\n\r\n// constructor() {\r\n// this.bindings = {\r\n// vehicle: \"<\"\r\n// };\r\n\r\n// this.controller = ComponentController;\r\n// this.template = require(\"./vehicleInfoCard.component.html\");\r\n// }\r\n//}\r\n\r\n\r\n","import { Component, Injectable, Input } from \"@angular/core\";\r\nimport \"./vehiclePlotTime.component.scss\";\r\n\r\n@Component({\r\n selector: \"vehicle-plot-time\",\r\n template: require(\"./vehiclePlotTime.component.html\")\r\n})\r\n@Injectable()\r\nexport class VehiclePlotTimeComponent {\r\n @Input() moment: moment.Moment;\r\n\r\n // ---\r\n\r\n constructor() {\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component, Input } from \"@angular/core\";\r\n\r\n@Component({\r\n selector: 'stacked-cell',\r\n template: require('./stacked-cell.component.html'),\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class StackedCell {\r\n @Input() data: any[];\r\n @Input() classes: string;\r\n\r\n constructor() { }\r\n}\r\n","import { ChangeDetectorRef, Component, ComponentFactoryResolver, ComponentRef, forwardRef, HostBinding, Inject, Input, OnDestroy, OnInit, Optional, TemplateRef, Type, ViewChild } from \"@angular/core\";\r\nimport { ResponsiveService } from \"@app/services/responsive.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { ComponentAnchorDirective } from \"../../_directives/componentAnchor.directive\";\r\nimport { IVTableCell } from \"../../_models/IVTableCell\";\r\nimport { VTableComponent } from \"../v-table.component\";\r\nimport './v-table-cell.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'v-table-cell',\r\n template: require('./v-table-cell.component.html')\r\n})\r\nexport class VTableCell implements OnInit {\r\n @Input() cell: IVTableCell;\r\n\r\n @ViewChild(ComponentAnchorDirective) componentHost: ComponentAnchorDirective;\r\n @HostBinding(\"style.display\") display: string;\r\n @HostBinding(\"class\") classes: string;\r\n @HostBinding(\"class.sorted\") @Input() sorted: boolean;\r\n\r\n //--\r\n\r\n templateContext;\r\n componentRef: ComponentRef;\r\n\r\n constructor(\r\n @Optional() @Inject(forwardRef(() => VTableComponent)) private table: VTableComponent,\r\n private readonly changeDetectorRef: ChangeDetectorRef,\r\n private readonly ComponentFactoryResolver: ComponentFactoryResolver,\r\n private readonly responsiveService: ResponsiveService) {\r\n\r\n }\r\n\r\n ngOnInit(): void {\r\n this.initialise();\r\n }\r\n\r\n ngOnChanges(): void {\r\n if (this.cell.component && this.componentHost) {\r\n this.componentHost.viewContainerRef.clear();\r\n this.loadComponent();\r\n }\r\n\r\n this.setClassesAndStyles();\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n if (this.cell.component && this.componentHost) {\r\n this.loadComponent();\r\n }\r\n\r\n if (this.cell.template) {\r\n this.templateContext = {\r\n $implicit: this.cell.data,\r\n }\r\n\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n\r\n this.setClassesAndStyles();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.componentRef?.destroy();\r\n this.componentRef = null;\r\n this.changeDetectorRef.detach();\r\n }\r\n\r\n setClassesAndStyles(): void {\r\n this.classes = \"\";\r\n\r\n if (this.cell.header.width) {\r\n this.classes += ` width-${this.cell.header.width}`;\r\n }\r\n\r\n if (this.cell.header.minWidth) {\r\n this.classes += ` min-width-${this.cell.header.minWidth}`;\r\n }\r\n }\r\n\r\n //--\r\n\r\n private loadComponent(): void {\r\n const componentFactory = this.ComponentFactoryResolver.resolveComponentFactory(this.cell.component);\r\n this.componentHost.viewContainerRef.clear();\r\n this.componentRef = this.componentHost.viewContainerRef.createComponent(componentFactory);\r\n\r\n if (this.cell.componentInputs) {\r\n Object.keys(this.cell.componentInputs).forEach(key => {\r\n this.componentRef.instance[key] = this.cell.componentInputs[key];\r\n })\r\n }\r\n\r\n this.componentRef.changeDetectorRef.detectChanges();\r\n }\r\n\r\n private initialise(): void {\r\n this.setDisplay();\r\n this.setClassesAndStyles();\r\n\r\n this.responsiveService.currentWindowWidth.pipe(untilDestroyed(this)).subscribe(() => {\r\n this.setDisplay();\r\n })\r\n }\r\n\r\n private setDisplay(): void {\r\n if (!this.cell.header.minTableWidth) {\r\n return;\r\n }\r\n\r\n this.display = this.responsiveService.shouldDisplayUsingMinWidth(this.cell.header.minTableWidth, this.table.getWidth()) ? null : \"none\";\r\n }\r\n\r\n}\r\n","import { Directive, ViewContainerRef } from \"@angular/core\";\r\n\r\n@Directive({\r\n selector: '[componentAnchor]'\r\n})\r\nexport class ComponentAnchorDirective {\r\n constructor(\r\n public viewContainerRef: ViewContainerRef\r\n ) { }\r\n}\r\n","import { Component, EventEmitter, Input, Output } from \"@angular/core\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport './v-table-actions.component.scss';\r\n\r\n@Component({\r\n selector: 'v-table-actions',\r\n template: require('./v-table-actions.component.html')\r\n})\r\nexport class VTableActionsComponent {\r\n @Input() selectedItemsCount: number;\r\n @Input() subject: string = this.translationService.t('TableActions.Items');\r\n @Input() verb: string = this.translationService.t('TableActions.Configure');\r\n @Input() buttonString: string = \"\";\r\n @Input() disabled: boolean;\r\n @Output() apply: EventEmitter = new EventEmitter();\r\n\r\n //--\r\n\r\n label: string;\r\n\r\n constructor(\r\n private readonly translationService: TranslationService\r\n ) { }\r\n\r\n\r\n applyActions(): void {\r\n this.apply.emit();\r\n }\r\n}\r\n","import { Component } from \"@angular/core\";\r\nimport \"./v-table-layout-container.component.scss\";\r\n\r\n@Component({\r\n selector: \"v-table-layout-container\",\r\n template: require(\"./v-table-layout-container.component.html\")\r\n})\r\nexport class VTableLayoutContainer {\r\n\r\n}\r\n","import { AfterViewInit, Component, Input, OnChanges, OnDestroy, SimpleChanges } from \"@angular/core\";\r\nimport { Subscription } from \"rxjs\";\r\nimport { VTableComponent } from \"../../v-table.component\";\r\nimport \"./table-summary-box.component.scss\";\r\n\r\nexport type TableSummaryCalculatorFunction = (item: T, allItems: T[]) => number;\r\n\r\n@Component({\r\n selector: \"table-summary-box\",\r\n template: require(\"./table-summary-box.component.html\")\r\n})\r\nexport class TableSummaryBox implements OnChanges, OnDestroy, AfterViewInit {\r\n @Input() table: VTableComponent;\r\n @Input() calculator: TableSummaryCalculatorFunction;\r\n @Input() title: string;\r\n\r\n @Input() valuePrefix: string;\r\n\r\n // ---\r\n\r\n count: number;\r\n rowChangeSubscription = new Subscription();\r\n\r\n constructor() {\r\n }\r\n\r\n ngAfterViewInit() {\r\n if (!this.table) {\r\n console.error(\"table-summary-box: No table specified\");\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n\r\n if (changes[\"table\"] && this.table) {\r\n\r\n this.clearSubscriptions();\r\n\r\n this.rowChangeSubscription = this.table.tableDisplayRowsChange.subscribe(() => {\r\n this.update();\r\n });\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.clearSubscriptions();\r\n }\r\n\r\n // ---\r\n\r\n private update() {\r\n\r\n if (!this.table || !this.calculator) {\r\n console.error(\"TableSummaryBox: Cannot update aggregator, no rows or calculator function\");\r\n return;\r\n }\r\n\r\n var rows = this.table.table?.displayRows;\r\n\r\n if (!rows) {\r\n return;\r\n }\r\n\r\n this.count = rows.reduce((x, y) => x + this.calculator(y.data, rows), 0);\r\n }\r\n\r\n private clearSubscriptions() {\r\n if (!this.rowChangeSubscription) {\r\n return;\r\n }\r\n\r\n this.rowChangeSubscription.unsubscribe();\r\n this.rowChangeSubscription = null;\r\n }\r\n}\r\n","import { Component, Input, OnChanges, OnInit, SimpleChanges } from \"@angular/core\";\r\nimport { DateService } from \"@app/services/date.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport \"./active-range-bar-chart.component.scss\";\r\n\r\n@Component({\r\n selector: \"active-range-bar-chart\",\r\n template: require(\"./active-range-bar-chart.component.html\")\r\n})\r\nexport class ActiveRangeBarChartComponent implements OnInit, OnChanges {\r\n\r\n // bindings\r\n @Input() startMinuteOfDay: number;\r\n @Input() endMinuteOfDay: number;\r\n\r\n @Input() subject: string;\r\n\r\n // style\r\n isMiddleInclusive: boolean;\r\n\r\n leftSectionStart: number;\r\n leftSectionWidth: number;\r\n\r\n rightSectionStart: number;\r\n rightSectionWidth: number;\r\n\r\n rangeDescriptorHtml: string;\r\n\r\n constructor(\r\n private readonly dateService: DateService,\r\n private readonly translationService: TranslationService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.process();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n this.process();\r\n }\r\n\r\n // ---\r\n\r\n private process(): void {\r\n this.isMiddleInclusive = this.startMinuteOfDay < this.endMinuteOfDay;\r\n\r\n if (this.isMiddleInclusive) {\r\n this.leftSectionStart = this.getPercentageOfDayFromMinute(this.startMinuteOfDay);\r\n this.leftSectionWidth = this.getPercentageOfDayFromMinute(this.endMinuteOfDay - this.startMinuteOfDay);\r\n\r\n this.rightSectionStart = 0;\r\n this.rightSectionWidth = 0;\r\n }\r\n else {\r\n this.leftSectionStart = 0;\r\n this.leftSectionWidth = this.getPercentageOfDayFromMinute(this.endMinuteOfDay);\r\n\r\n this.rightSectionStart = this.getPercentageOfDayFromMinute(this.startMinuteOfDay);\r\n this.rightSectionWidth = 100 - this.getPercentageOfDayFromMinute(this.startMinuteOfDay);\r\n }\r\n\r\n this.updateRangeDescriptor();\r\n }\r\n\r\n private getPercentageOfDayFromMinute(minuteOfDay: number): number {\r\n return Math.ceil((minuteOfDay / 1440) * 100);\r\n }\r\n\r\n private updateRangeDescriptor(): void {\r\n const leadingVocabulary = this.translationService.t(`ActiveRangeBarChart.LeadingVocabulary`, this.subject);\r\n const startTimeString = this.getMinuteOfDayToTime(this.startMinuteOfDay);\r\n const endTimeString = this.getMinuteOfDayToTime(this.endMinuteOfDay);\r\n\r\n let firstRange: string = ``;\r\n let secondRange: string = ``;\r\n\r\n if (this.isMiddleInclusive) {\r\n firstRange = this.translationService.t(`ActiveRangeBarChart.XToY2`, [startTimeString, endTimeString]);\r\n } else {\r\n firstRange = this.translationService.t(`ActiveRangeBarChart.MidnightToX`, endTimeString);\r\n secondRange = this.translationService.t(`ActiveRangeBarChart.AndXToMidnight`, startTimeString);\r\n }\r\n\r\n const dateString = `(${this.dateService.getUTCOffsetLabel()} ${this.dateService.getLocalTimezone()})`;\r\n\r\n this.rangeDescriptorHtml = `${leadingVocabulary} ${firstRange} ${secondRange} ${dateString}`;\r\n }\r\n\r\n private getMinuteOfDayToTime(minuteOfDay: number): string {\r\n const minuteOfDayNumber: number = Number(minuteOfDay);\r\n\r\n const hour = Math.floor(minuteOfDayNumber / 60);\r\n const minute = Math.floor(minuteOfDayNumber % 60);\r\n\r\n const hourString = (hour < 10) ? `0${hour}` : `${hour}`;\r\n const minuteString = (minute < 10) ? `0${minute}` : `${minute}`;\r\n\r\n return `${hourString}:${minuteString}`;\r\n }\r\n}\r\n","import { Component, OnInit } from \"@angular/core\";\r\nimport { FormBuilder, FormGroup, Validators } from \"@angular/forms\";\r\nimport { AccountSettingsService, IAccountSettingsContent } from \"@app/services/account-settings.service\";\r\nimport { DisplayService, IDialogOptionsJson } from \"@app/services/display.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { copy } from \"angular\";\r\nimport './account-settings-manager.component.scss';\r\n\r\nenum AccountSettingsFormState {\r\n Loading,\r\n Loaded,\r\n Saving,\r\n Saved\r\n}\r\n\r\n@Component({\r\n selector: 'account-settings-manager',\r\n template: require('./account-settings-manager.component.html')\r\n})\r\nexport class AccountSettingsManagerComponent implements OnInit {\r\n\r\n defaultAccountSettings: IAccountSettingsContent;\r\n accountSettings: IAccountSettingsContent;\r\n\r\n accountSettingsForm: FormGroup;\r\n\r\n formChanged: boolean;\r\n formState: AccountSettingsFormState = AccountSettingsFormState.Loading;\r\n\r\n AccountSettingsFormState = AccountSettingsFormState;\r\n\r\n enableLiveView: boolean;\r\n enableNonEventDownloads: boolean;\r\n enableVideoRedaction: boolean;\r\n enableVideoMute: boolean;\r\n\r\n constructor(\r\n private readonly accountSettingsService: AccountSettingsService,\r\n private readonly formBuilder: FormBuilder,\r\n private readonly displayService: DisplayService,\r\n private readonly translationService: TranslationService\r\n ) {\r\n }\r\n\r\n ngOnInit() {\r\n this.getData();\r\n }\r\n\r\n onFormChanged(): void {\r\n this.formState = AccountSettingsFormState.Loaded;\r\n setTimeout(() => {\r\n this.formChanged = this.checkIfFormValuesChanged();\r\n });\r\n }\r\n\r\n discardChanges(): void {\r\n this.reset();\r\n }\r\n\r\n onSaveButtonClicked(event: MouseEvent): void {\r\n this.showDeleteDialog(event);\r\n }\r\n\r\n onDisableLiveViewChanged(value: boolean): void {\r\n this.enableLiveView = value;\r\n this.onFormChanged();\r\n }\r\n\r\n onDisableNonEventChanged(value: boolean): void {\r\n this.enableNonEventDownloads = value;\r\n this.onFormChanged();\r\n }\r\n\r\n onEnableVideoRedactionChanged(value: boolean): void {\r\n this.enableVideoRedaction = value;\r\n this.onFormChanged();\r\n }\r\n\r\n onEnableVideoMuteChanged(value: boolean): void {\r\n this.enableVideoMute = value;\r\n this.onFormChanged();\r\n }\r\n\r\n //--\r\n\r\n private save(): void {\r\n\r\n this.formState = AccountSettingsFormState.Saving;\r\n\r\n const dirtyAccountSettings = this.createAccountSettingsContentFromForm();\r\n\r\n this.accountSettingsService.addOrUpdateAccountSettings(dirtyAccountSettings).finally(() => {\r\n\r\n this.accountSettings = copy(dirtyAccountSettings);\r\n\r\n setTimeout(() => {\r\n this.clearFormChanged();\r\n this.formState = AccountSettingsFormState.Saved;\r\n }, 500);\r\n\r\n });\r\n }\r\n\r\n private reset(): void {\r\n this.formState = AccountSettingsFormState.Loaded;\r\n\r\n this.updateLocalValuesForCameraSettings();\r\n this.clearFormChanged();\r\n this.buildForm();\r\n }\r\n\r\n private clearFormChanged(): void {\r\n this.formChanged = false;\r\n }\r\n\r\n private async getData(): Promise {\r\n\r\n this.formState = AccountSettingsFormState.Loading;\r\n\r\n const promises: Promise[] = [\r\n this.accountSettingsService.getDefaultAccountSettings(),\r\n this.accountSettingsService.getAccountSettings()\r\n ];\r\n\r\n await Promise.all(promises).then(([defaultAccountSettings, accountSettings]) => {\r\n this.defaultAccountSettings = defaultAccountSettings;\r\n this.accountSettings = accountSettings;\r\n\r\n this.updateLocalValuesForCameraSettings();\r\n });\r\n\r\n this.buildForm();\r\n\r\n this.formState = AccountSettingsFormState.Loaded;\r\n }\r\n\r\n private updateLocalValuesForCameraSettings(): void {\r\n this.enableLiveView = !this.getInitialFormValue(\"DisableLiveView\") as boolean;\r\n this.enableNonEventDownloads = !this.getInitialFormValue(\"DisableNonEventDownloads\") as boolean;\r\n this.enableVideoRedaction = this.getInitialFormValue(\"EnableVideoRedaction\") as boolean;\r\n this.enableVideoMute = this.getInitialFormValue(\"EnableVideoMute\") as boolean;\r\n }\r\n\r\n private buildForm(): void {\r\n this.accountSettingsForm = this.formBuilder.group({\r\n videoRetentionDays: [this.getInitialFormValue(\"VideoRetentionDays\"), [Validators.required, Validators.min(1), Validators.max(365)]], //video retention\r\n enableLiveView: [this.enableLiveView],\r\n enableNonEventDownloads: [this.enableNonEventDownloads],\r\n enableVideoRedaction: [this.enableVideoRedaction],\r\n enableVideoMute: [this.enableVideoMute]\r\n });\r\n }\r\n\r\n private getInitialFormValue(key: string): any {\r\n\r\n if (this.accountSettings?.[key]) {\r\n return this.accountSettings[key].Value;\r\n }\r\n\r\n if (this.defaultAccountSettings?.[key]) {\r\n return this.defaultAccountSettings[key].Value;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n private checkIfFormValuesChanged(): boolean {\r\n\r\n const formValueString = JSON.stringify(this.createAccountSettingsContentFromForm());\r\n const originalAccountSettingsString = JSON.stringify(this.accountSettings);\r\n\r\n return formValueString !== originalAccountSettingsString;\r\n }\r\n\r\n private createAccountSettingsContentFromForm(): IAccountSettingsContent {\r\n const accountSettingsContent: IAccountSettingsContent = {\r\n VideoRetentionDays: {\r\n Value: this.accountSettingsForm.get(\"videoRetentionDays\").value \r\n },\r\n DisableLiveView: {\r\n Value: !this.enableLiveView \r\n },\r\n DisableNonEventDownloads: {\r\n Value: !this.enableNonEventDownloads\r\n },\r\n EnableVideoRedaction: {\r\n Value: this.enableVideoRedaction\r\n },\r\n EnableVideoMute: {\r\n Value: this.enableVideoMute\r\n }\r\n };\r\n\r\n return accountSettingsContent;\r\n }\r\n\r\n private showDeleteDialog($event): void {\r\n const title = this.translationService.t(\"AccountSettingsManager.SaveWarningDialogTitle\");\r\n const dialogHTML = ``\r\n\r\n const dialogOptions: IDialogOptionsJson = {\r\n title: title,\r\n dialogHTML: dialogHTML,\r\n dialogId: `accountSettingsSaveWarningDialog`,\r\n bindings: {\r\n onResponse: (confirmed: boolean) => { this.onSaveDialogResponse(confirmed); }\r\n },\r\n event: $event,\r\n multiple: true,\r\n clickOutsideToClose: true,\r\n escapeToClose: true\r\n };\r\n\r\n this.displayService.showDialog(dialogOptions);\r\n\r\n }\r\n\r\n onSaveDialogResponse(confirmed: boolean) {\r\n if (!confirmed) {\r\n return;\r\n }\r\n\r\n this.save();\r\n }\r\n\r\n}\r\n","\r\nimport { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { lastValueFrom } from \"rxjs\";\r\nimport { tap } from \"rxjs/operators\";\r\nimport { SettingsName } from \"../class/SettingsName\";\r\nimport { SessionService } from \"./session.service\";\r\n\r\nexport interface IAccountSettingsContent {\r\n VideoRetentionDays?: IIntegerSetting;\r\n DisableLiveView?: IBooleanSetting;\r\n DisableNonEventDownloads?: IBooleanSetting;\r\n DisableInternalCameras?: IBooleanSetting;\r\n EnableVideoRedaction?: IBooleanSetting;\r\n EnableVideoMute?: IBooleanSetting;\r\n}\r\n\r\nexport interface IIntegerSetting extends ValueSetting { }\r\nexport interface IBooleanSetting extends ValueSetting { }\r\n\r\ninterface ValueSetting {\r\n Value: T;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AccountSettingsService {\r\n\r\n constructor(\r\n private readonly httpClient: HttpClient,\r\n private readonly sessionService: SessionService\r\n ) { }\r\n\r\n getDefaultAccountSettings(invalidateCache: boolean = false): Promise {\r\n\r\n const options = { params: {} as HttpParams }\r\n\r\n options.params[\"minsToLive\"] = 30;\r\n options.params[\"invalidateCache\"] = invalidateCache;\r\n\r\n return lastValueFrom(this.httpClient.get(`/api/accountsettings/default`, options));\r\n }\r\n\r\n getAccountSettings(invalidateCache: boolean = false): Promise {\r\n\r\n const accountSettings = this.sessionService.getItem(SettingsName.AccountSettings)\r\n\r\n if (accountSettings) {\r\n return Promise.resolve(accountSettings)\r\n }\r\n\r\n const options = { params: {} as HttpParams }\r\n\r\n options.params[\"minsToLive\"] = 30;\r\n options.params[\"invalidateCache\"] = invalidateCache;\r\n\r\n return lastValueFrom(this.httpClient.get(`/api/accountsettings`, options).pipe(\r\n tap(settings => {\r\n this.sessionService.setItem(SettingsName.AccountSettings, settings);\r\n })\r\n ));\r\n }\r\n\r\n getAccountSettingsByAccountId(accountId: number, invalidateCache: boolean = false): Promise {\r\n\r\n const options = { params: {} as HttpParams }\r\n\r\n options.params[\"minsToLive\"] = 30;\r\n options.params[\"invalidateCache\"] = invalidateCache;\r\n options.params[\"accountId\"] = accountId;\r\n\r\n return lastValueFrom(this.httpClient.get(`/api/accountsettings`, options));\r\n }\r\n\r\n addOrUpdateAccountSettings(accountSettings: IAccountSettingsContent): Promise {\r\n\r\n const options = { params: {} as HttpParams }\r\n\r\n this.sessionService.setItem(SettingsName.AccountSettings, accountSettings)\r\n\r\n return lastValueFrom(this.httpClient.post(`/api/accountsettings`, accountSettings, options));\r\n }\r\n}\r\n","import { Component, EventEmitter, Output } from \"@angular/core\";\r\nimport './account-settings-save-warning.component.scss';\r\n\r\n@Component({\r\n selector: 'account-settings-save-warning',\r\n template: require('./account-settings-save-warning.component.html')\r\n})\r\nexport class AccountSettingsSaveWarningComponent {\r\n\r\n @Output() response = new EventEmitter();\r\n\r\n onConfirmClicked(): void {\r\n this.response.emit(true);\r\n }\r\n\r\n onCancelClicked(): void {\r\n this.response.emit(false);\r\n }\r\n\r\n}\r\n","export enum VideoEventCodeSimplified {\r\n Button = 0,\r\n Speed = 1,\r\n Acceleration = 2,\r\n Braking = 6,\r\n DriverFatigue = 13,\r\n DriverOnPhone = 14,\r\n DriverSmoking = 15,\r\n DriverDistraction = 16,\r\n Collision = 19,\r\n VehicleTooClose = 21, \r\n NoSeatBelt = 24,\r\n}\r\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { IAutoDownloadSetting } from \"@app/interfaces/IAutoDownloadSetting\";\r\nimport { Observable } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AutoDownloadSettingService {\r\n constructor(\r\n private readonly httpClient: HttpClient\r\n ) { }\r\n\r\n getData(): Observable {\r\n const options = { params: {} as HttpParams }\r\n options.params[\"isActive\"] = true;\r\n\r\n return this.httpClient.get(`/api/autodownloadsetting`, options);\r\n }\r\n\r\n getNumberOfEvents(eventCode: number): Observable {\r\n const options = { params: {} as HttpParams }\r\n\r\n options.params[\"eventCode\"] = eventCode;\r\n options.params[\"days\"] = 30;\r\n\r\n return this.httpClient.get(`/api/autodownloadsetting/numberofevents`, options);\r\n }\r\n\r\n \r\n getNumberOfVehicles(): Observable { \r\n return this.httpClient.get(`/api/autodownloadsetting/numberofvehicles`);\r\n }\r\n\r\n save(setting: IAutoDownloadSetting): Observable {\r\n return this.httpClient.post(`/api/autodownloadsetting`, setting);\r\n }\r\n\r\n\r\n delete(settingId: number): Observable {\r\n return this.httpClient.post(`/api/autodownloadsetting/delete`, settingId);\r\n }\r\n\r\n createDefaultSetting(): IAutoDownloadSetting {\r\n const newSetting: IAutoDownloadSetting = {\r\n Id: null,\r\n AccountId: null,\r\n EventType: null,\r\n VideoDuration: 10,\r\n IsHighDefinition: true,\r\n Channels: [],\r\n IsActive: true,\r\n CreatedTime: null,\r\n UpdatedTime: null\r\n }\r\n\r\n return newSetting;\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnInit, Output } from \"@angular/core\";\r\nimport { AbstractControl, FormBuilder, FormGroup, ValidationErrors, ValidatorFn, Validators } from \"@angular/forms\";\r\nimport { IAutoDownloadSetting } from \"@app/interfaces/IAutoDownloadSetting\";\r\nimport { CameraLocation } from \"@app/main/components/videos/enums/CameraLocation\";\r\nimport { VideoEventCodeSimplified } from \"@app/main/components/videos/enums/VideoEventCodeSimplified\";\r\nimport { AutoDownloadSettingService } from \"@app/services/autoDownloadSetting.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport './auto-download-configuration-editor.component.scss';\r\nimport { getValuesFromEnum } from \"@app/class/Utilities\";\r\n\r\n@Component({\r\n selector: 'auto-download-configuration-editor',\r\n template: require('./auto-download-configuration-editor.component.html')\r\n})\r\nexport class AutoDownloadConfigurationEditorComponent implements OnInit {\r\n\r\n eventTypes: { label: string, value: number }[] = [];\r\n channelsList: { label: string, value: number, isChecked: boolean }[] = [];\r\n videoDurations: { label: string, value: number }[];\r\n\r\n @Input() setting: IAutoDownloadSetting;\r\n @Input() filter: VideoEventCodeSimplified[];\r\n @Output() onSettingSaved = new EventEmitter();\r\n\r\n autoDownloadForm: FormGroup;\r\n dataUsageInformation = \"\";\r\n numberOfEvents = 0;\r\n numberOfVehiclesInFleet = 0;\r\n camerasSelected = 0;\r\n\r\n get eventType(): AbstractControl {\r\n return this.autoDownloadForm?.get(\"eventType\");\r\n }\r\n\r\n get channels(): AbstractControl {\r\n return this.autoDownloadForm?.get(\"channels\");\r\n }\r\n\r\n get areChannelsValid(): boolean {\r\n return this.autoDownloadForm.controls[\"channels\"].valid\r\n }\r\n\r\n constructor(\r\n private readonly translationService: TranslationService,\r\n private readonly autoDownloadSettingService: AutoDownloadSettingService,\r\n private readonly formBuilder: FormBuilder\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.setOptions();\r\n\r\n this.getNumberOfVehicles();\r\n this.getNumberOfEvents(this.setting.EventType);\r\n this.buildForm();\r\n }\r\n\r\n onEventTypeChange(value: number): void {\r\n this.eventType.setValue(value);\r\n this.eventType.updateValueAndValidity();\r\n\r\n this.getNumberOfEvents(value);\r\n }\r\n\r\n onChannelChecked(value: number, isChecked: boolean): void {\r\n const { Channels } = this.setting;\r\n\r\n if (isChecked) {\r\n if (!Channels.includes(value)) {\r\n Channels.push(value);\r\n this.camerasSelected++;\r\n }\r\n } else {\r\n const index = Channels.indexOf(value);\r\n if (index > -1) {\r\n Channels.splice(index, 1);\r\n this.camerasSelected--;\r\n }\r\n }\r\n\r\n this.channels.updateValueAndValidity();\r\n\r\n if (this.setting.EventType != null) {\r\n this.setDataUsageInformation();\r\n }\r\n }\r\n\r\n saveSetting(): void {\r\n this.autoDownloadForm.updateValueAndValidity();\r\n\r\n if (this.autoDownloadForm.valid) {\r\n this.autoDownloadSettingService.save(this.setting).subscribe(() => {\r\n this.onSettingSaved.emit();\r\n });\r\n }\r\n }\r\n\r\n deleteSetting(confirmed: boolean): void {\r\n if (!confirmed) {\r\n return;\r\n }\r\n\r\n if (this.setting) {\r\n this.autoDownloadSettingService.delete(this.setting.Id).subscribe(() => {\r\n this.onSettingSaved.emit();\r\n });\r\n }\r\n }\r\n\r\n private setOptions(): void {\r\n const videoEventValues = getValuesFromEnum(VideoEventCodeSimplified);\r\n videoEventValues.forEach(value => {\r\n if (!this.filter.includes(value) || value === this.setting.EventType) {\r\n this.eventTypes.push({\r\n label: this.translationService.translateEnum(VideoEventCodeSimplified, \"VideoEventCodeSimplified\", value),\r\n value\r\n });\r\n };\r\n });\r\n\r\n const channelValues = getValuesFromEnum(CameraLocation);\r\n channelValues.forEach(value => {\r\n const isChecked = this.setting.Channels.includes(value);\r\n if (isChecked) { this.camerasSelected++; }\r\n\r\n this.channelsList.push({\r\n label: this.translationService.translateEnum(CameraLocation, \"CameraLocation\", value),\r\n value,\r\n isChecked\r\n });\r\n });\r\n\r\n this.videoDurations = [];\r\n this.videoDurations.push({ label: \"10s\", value: 10 });\r\n this.videoDurations.push({ label: \"20s\", value: 20 });\r\n this.videoDurations.push({ label: \"30s\", value: 30 });\r\n }\r\n\r\n private setDataUsageInformation(): void {\r\n if (this.numberOfEvents >= 0 && this.camerasSelected > 0) {\r\n const HdDataUsage = 0.4522667; //MB per second\r\n const SdDataUsage = 0.3384889;\r\n \r\n const dataUsagePerSecond = this.setting.IsHighDefinition ? HdDataUsage : SdDataUsage;\r\n\r\n const totalDataUsage = this.numberOfVehiclesInFleet > 0 ? ((this.numberOfEvents * dataUsagePerSecond * this.camerasSelected * this.setting.VideoDuration) / this.numberOfVehiclesInFleet) : 0;\r\n \r\n const dataUsageMessage = totalDataUsage < 1 ? \"less than 1\" : totalDataUsage.toFixed(0);\r\n\r\n this.dataUsageInformation = this.numberOfEvents == 1 ?\r\n this.translationService.t(\"AutoDownloadConfiguration.DataUsageInformationSingular\", [dataUsageMessage]) : \r\n this.translationService.t(\"AutoDownloadConfiguration.DataUsageInformationPlural\", [this.numberOfEvents, dataUsageMessage]\r\n );\r\n } else {\r\n this.dataUsageInformation = \"\";\r\n }\r\n }\r\n\r\n private getNumberOfEvents(eventType: number): void {\r\n if (eventType >= 0) {\r\n this.autoDownloadSettingService.getNumberOfEvents(eventType)\r\n .subscribe(response => {\r\n this.numberOfEvents = response;\r\n this.setDataUsageInformation();\r\n });\r\n }\r\n }\r\n\r\n private getNumberOfVehicles(): void {\r\n this.autoDownloadSettingService.getNumberOfVehicles()\r\n .subscribe(response => {\r\n this.numberOfVehiclesInFleet = response;\r\n });\r\n }\r\n\r\n private buildForm(): void {\r\n this.autoDownloadForm = this.formBuilder.group({\r\n eventType: [this.setting.EventType, [Validators.required]],\r\n channels: [this.setting.Channels, [this.validateIfChannelSeleceted()]]\r\n });\r\n }\r\n\r\n private validateIfChannelSeleceted(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n\r\n if (!this.autoDownloadForm) {\r\n return null;\r\n }\r\n\r\n if (this.camerasSelected === 0) {\r\n return { customMessage: this.translationService.t(\"AutoDownloadConfiguration.ChannelsValidationFail\") }\r\n }\r\n\r\n return null;\r\n };\r\n }\r\n\r\n}","import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from \"@angular/core\";\r\nimport { CameraChannelType } from \"@app/main/components/videos/enums/CameraChannelType\";\r\nimport { CameraLocation } from \"@app/main/components/videos/enums/CameraLocation\";\r\nimport { ICameraChannel } from \"@app/main/components/videos/models/ICameraChannel\";\r\nimport { CameraChannelService, IChannelThumbnail } from \"@app/main/modules/cameras/_services/camera-channels.service\";\r\nimport { forkJoin, of, Subscription } from \"rxjs\";\r\nimport { catchError, finalize, map, take } from \"rxjs/operators\";\r\n\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { FoundationVehiclesService } from \"@app/main/modules/foundation/_services/vehicle.service\";\r\nimport { IVehicleWithCameraMappings } from \"../camera-vehicles-manager/camera-vehicles-manager.component\";\r\nimport './camera-channels-editor.component.scss';\r\n\r\nexport interface ICameraChannelWithThumbnail extends ICameraChannel {\r\n thumbnailUrl?: string;\r\n}\r\n\r\ninterface ILoadDataResponse {\r\n channels?: ICameraChannel[];\r\n thumbnails?: IChannelThumbnail[];\r\n vehicle?: IVehicle;\r\n}\r\n\r\n@Component({\r\n selector: 'camera-channels-editor',\r\n template: require('./camera-channels-editor.component.html')\r\n})\r\nexport class CameraChannelsEditorComponent implements OnChanges {\r\n\r\n @Input() vehicle: IVehicleWithCameraMappings;\r\n @Input() vehicleId: number;\r\n\r\n @Output() save = new EventEmitter();\r\n\r\n //--\r\n\r\n cameraChannels: ICameraChannelWithThumbnail[] = [];\r\n locations = Object.keys(CameraLocation).filter(s => !isNaN(Number(s))).map(s => Number(s));\r\n types = Object.keys(CameraChannelType).filter(s => !isNaN(Number(s))).map(s => Number(s));\r\n\r\n CameraLocation = CameraLocation;\r\n CameraChannelType = CameraChannelType;\r\n\r\n loading: boolean;\r\n\r\n subscriptions = new Subscription();\r\n\r\n constructor(\r\n private readonly cameraChannelService: CameraChannelService,\r\n private readonly vehicleService: FoundationVehiclesService) {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[\"vehicle\"] || changes[\"vehicleId\"]) {\r\n this.processVehicleChange();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscriptions.unsubscribe();\r\n }\r\n\r\n saveChannels(): void {\r\n this.vehicle.cameraChannels = this.cameraChannels;\r\n this.cameraChannelService.updateCameraChannels(this.cameraChannels).pipe(take(1)).subscribe(() => {\r\n this.save.emit(this.vehicle);\r\n });\r\n }\r\n\r\n //--\r\n\r\n private async processVehicleChange(): Promise {\r\n if (this.vehicle) {\r\n this.vehicleId = this.vehicle?.Id;\r\n }\r\n\r\n if (!this.vehicleId) {\r\n return;\r\n }\r\n\r\n this.loadData();\r\n }\r\n\r\n private loadData(): void {\r\n\r\n this.loading = true;\r\n\r\n const cameraChannelsObservable = this.vehicle?.cameraChannels?.length\r\n ? of(this.vehicle.cameraChannels)\r\n : this.cameraChannelService.getCameraChannels({ VehicleId: this.vehicleId });\r\n\r\n const vehicleObservable = this.vehicle\r\n ? of(this.vehicle)\r\n : this.vehicleService.getVehicle(this.vehicleId)\r\n\r\n this.subscriptions.add(forkJoin({\r\n\r\n channels: cameraChannelsObservable,\r\n thumbnails: this.cameraChannelService.getChannelThumbnails(this.vehicleId),\r\n vehicle: vehicleObservable\r\n\r\n }).pipe(\r\n map((data: ILoadDataResponse) => this.processData(data)),\r\n catchError((error) => {\r\n this.loading = false;\r\n throw error;\r\n }),\r\n finalize(() => this.loading = false)\r\n ).subscribe());\r\n }\r\n\r\n private processData(data: ILoadDataResponse): void {\r\n\r\n this.cameraChannels = data.channels;\r\n this.vehicle = data.vehicle;\r\n\r\n if (!data.thumbnails.length || !data.channels?.length) {\r\n return;\r\n }\r\n\r\n data.channels.forEach((channel: ICameraChannelWithThumbnail) => {\r\n const thumbnailForChannel: IChannelThumbnail = data.thumbnails.find(thumbnail => thumbnail.ChannelId === channel.ChannelId);\r\n\r\n if (!thumbnailForChannel?.Guid) {\r\n return;\r\n }\r\n\r\n channel.thumbnailUrl = this.cameraChannelService.createMediaGuidUrl(thumbnailForChannel.Guid);\r\n });\r\n\r\n data.channels.sort((channel1, channel2) => channel1.ChannelId - channel2.ChannelId) as ICameraChannelWithThumbnail[];\r\n }\r\n}\r\n","import { Component, HostBinding, Input } from \"@angular/core\";\r\n\r\nimport './channel-thumbnail.component.scss';\r\n\r\n@Component({\r\n selector: 'channel-thumbnail',\r\n template: require('./channel-thumbnail.component.html')\r\n})\r\nexport class ChannelThumbnailComponent {\r\n\r\n @HostBinding(\"class.has-url\") @Input() url: string;\r\n\r\n}\r\n","import { Directive, OnInit, ViewChild } from \"@angular/core\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { ContextualSpeedingEditor } from \"./contextual-speeding-editor\";\r\n\r\n@Directive()\r\nexport abstract class ContextualSpeedingTab> implements OnInit {\r\n columns: IVTableColumn[] = [];\r\n rows: IVTableRow[] = [];\r\n items: TItem[] = [];\r\n\r\n loading = false;\r\n editorVisible = false;\r\n\r\n selectedItem?: TItem;\r\n\r\n @ViewChild('editor') editor: TEditor;\r\n\r\n constructor(public readonly vTableService: VTableService) {}\r\n\r\n async ngOnInit(): Promise {\r\n this.createTable();\r\n await this.load();\r\n }\r\n\r\n async onSaveButtonClicked(): Promise {\r\n const item = await this.editor.save();\r\n this.updateData(item)\r\n this.hideEditor();\r\n }\r\n\r\n rowClicked(tableRow: IVTableRow): void {\r\n if (!tableRow.data) {\r\n return;\r\n }\r\n\r\n this.selectedItem = tableRow.data;\r\n this.showEditor();\r\n }\r\n\r\n showEditor(): void {\r\n this.editorVisible = true;\r\n }\r\n\r\n hideEditor(): void {\r\n this.editorVisible = false;\r\n this.clearSelectedItem();\r\n }\r\n\r\n clearSelectedItem(): void {\r\n this.selectedItem = null;\r\n }\r\n\r\n protected async onConfirmDeleteButton(confirm: boolean): Promise {\r\n if (!confirm) {\r\n return;\r\n }\r\n\r\n await this.deleteItem(this.selectedItem);\r\n this.deleteSelectedItem();\r\n this.hideEditor();\r\n }\r\n\r\n private async load(): Promise {\r\n this.loading = true;\r\n\r\n this.items = await this.loadData();\r\n this.rows = this.vTableService.createTableRows(this.items, this.columns)\r\n\r\n this.loading = false;\r\n }\r\n\r\n private deleteSelectedItem(): void {\r\n this.items = this.items.filter(x => x.Id !== this.selectedItem.Id);\r\n this.rows = this.vTableService.createTableRows(this.items, this.columns);\r\n }\r\n\r\n private updateData(item: TItem): void {\r\n const itemIndex = this.items.findIndex(x => x.Id === item.Id);\r\n\r\n if (itemIndex !== -1) {\r\n this.items[itemIndex] = item;\r\n } else {\r\n this.items.push(item);\r\n }\r\n\r\n this.rows = this.vTableService.createTableRows(this.items, this.columns);\r\n }\r\n\r\n abstract loadData(): Promise;\r\n abstract deleteItem(item: TItem): Promise;\r\n abstract createTable(): void;\r\n}","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { VehicleType } from \"@app/enum/VehicleType.enum\";\r\nimport { IKeyValuePair } from \"@app/interfaces/IKeyValuePair\";\r\nimport { ContextualSpeedingThreshold } from \"@app/main/components/resourceManagement/contextual-speeding-settings-manager/models/contextual-speeding-threshold\";\r\nimport { lastValueFrom } from \"rxjs\";\r\nimport { TranslationService } from \"./translation.service\";\r\nimport { VehicleService } from \"./vehicle.service\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ContextualSpeedingThresholdService {\r\n constructor(\r\n private readonly httpClient: HttpClient,\r\n private readonly vehicleService: VehicleService,\r\n private readonly translationService: TranslationService\r\n ) { }\r\n\r\n async getContextualSpeedingThresholds(): Promise {\r\n return await lastValueFrom(this.httpClient.get(`/api/speeding/threshold`));\r\n }\r\n\r\n async addContextualSpeedingThreshold(threshold: ContextualSpeedingThreshold): Promise {\r\n return await lastValueFrom(this.httpClient.post(`/api/speeding/threshold`, threshold));\r\n }\r\n\r\n async updateContextualSpeedingThreshold(threshold: ContextualSpeedingThreshold): Promise {\r\n return await lastValueFrom(this.httpClient.post(`/api/speeding/threshold/${threshold.Id}`, threshold));\r\n }\r\n\r\n async deleteContextualSpeedingOverride(thresholdId: number): Promise {\r\n return await lastValueFrom(this.httpClient.delete(`/api/speeding/threshold/${thresholdId}`));\r\n }\r\n\r\n getAdjustedVehicleTypes(): IKeyValuePair[] {\r\n const vehicleTypes = this.vehicleService\r\n .getVehicleTypes()\r\n .filter(x => x.value !== VehicleType.None);\r\n\r\n const unknownType = vehicleTypes.find(x => x.value === VehicleType.Unknown);\r\n unknownType.displayName = this.translationService.translate('Common.Default');\r\n\r\n return vehicleTypes;\r\n }\r\n}\r\n","import { ChangeDetectorRef, Component, Input, OnInit, ViewChild } from \"@angular/core\";\r\nimport { FormControl, FormGroup, Validators } from \"@angular/forms\";\r\nimport { CustomFormValidators } from \"@app/directives/_forms/form-validation.service\";\r\nimport { Place } from \"@app/directives/_forms/v-autocomplete/v-places-autocomplete/place\";\r\nimport { VMapComponent } from \"@app/directives/_map/v-map/v-map/v-map.component\";\r\nimport { IGoogleMapsMarker } from \"@app/interfaces/IGoogleMapsMarkerOptions\";\r\nimport { AccountService } from \"@app/services/account.service\";\r\nimport { ContextualSpeedingOverrideService } from \"@app/services/contextual-speeding-override.service\";\r\nimport { UnitConversionService, UnitConversionType } from \"@app/services/unitConversion.service\";\r\nimport { IPolyline } from \"@typings/google.maps.angular\";\r\nimport { ContextualSpeedingEditor } from \"../base/contextual-speeding-editor\";\r\nimport { ContextualSpeedingOverride, ContextualSpeedingOverrideSegment } from \"../models/contextual-speeding-override\";\r\nimport { HereRouteData } from \"../models/here-route-data\";\r\nimport './contextual-speeding-road-editor.component.scss';\r\n\r\n@Component({\r\n selector: 'contextual-speeding-road-editor',\r\n template: require('./contextual-speeding-road-editor.component.html')\r\n})\r\nexport class ContextualSpeedingRoadEditorComponent\r\n extends ContextualSpeedingEditor \r\n implements OnInit {\r\n @ViewChild(\"vMap\", { static: false }) vMap: VMapComponent;\r\n @Input() items: ContextualSpeedingOverride[] = [];\r\n\r\n form: FormGroup;\r\n map: google.maps.Map;\r\n markers: IGoogleMapsMarker[] = [];\r\n polylines: IPolyline[] = [];\r\n routeData: HereRouteData;\r\n speedUnit: string;\r\n\r\n get start(): IGoogleMapsMarker {\r\n return this.markers[0] || undefined;\r\n }\r\n\r\n set start(value: IGoogleMapsMarker) {\r\n this.markers[0] = value;\r\n this.markers = [...this.markers];\r\n }\r\n\r\n get end(): IGoogleMapsMarker {\r\n return this.markers[1] || undefined;\r\n }\r\n\r\n set end(value: IGoogleMapsMarker) {\r\n this.markers[1] = value;\r\n this.markers = [...this.markers];\r\n }\r\n\r\n get canSave(): boolean {\r\n return this.form.valid && this.markers.length === 2;\r\n }\r\n\r\n constructor(\r\n private readonly contextualSpeedingService: ContextualSpeedingOverrideService,\r\n private readonly changeDetectorRef: ChangeDetectorRef,\r\n private readonly accountService: AccountService,\r\n private readonly unitConversionService: UnitConversionService,\r\n ) {\r\n super();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.initiateForm();\r\n this.setSpeedUnit();\r\n this.optionallySetSelectedValues();\r\n }\r\n\r\n onPlaceSelected(place: Place): void {\r\n const latLng = new google.maps.LatLng({\r\n lat: place.lat,\r\n lng: place.lng\r\n });\r\n\r\n this.vMap.fitMap([latLng]);\r\n }\r\n\r\n onMapInitialised(map: google.maps.Map): void {\r\n this.map = map;\r\n this.map.addListener(\"click\", async (event: any) => await this.onMapClicked(event?.latLng));\r\n }\r\n\r\n private initiateForm(): void {\r\n const validationItems = this.items.filter(x => x.Id !== this.selectedItem?.Id);\r\n const validationObjectKey = 'Name' as keyof ContextualSpeedingOverride;\r\n\r\n this.form = new FormGroup({\r\n name: new FormControl('', [\r\n Validators.required, \r\n Validators.maxLength(80), \r\n CustomFormValidators.duplicateProperty(validationItems, validationObjectKey, 'roadSegmentNameDuplicated')\r\n ]),\r\n overrideSpeed: new FormControl('', [Validators.required, Validators.min(1)])\r\n });\r\n }\r\n\r\n private async onMapClicked(latLngs: google.maps.LatLng): Promise {\r\n if (!latLngs || (!!this.start && !!this.end)) {\r\n return;\r\n }\r\n\r\n const lat = latLngs.lat();\r\n const lng = latLngs.lng();\r\n\r\n if (!lat || !lng) {\r\n return;\r\n }\r\n\r\n await this.addMarker({ lat, lng });\r\n }\r\n\r\n private async addMarker(latLngs: google.maps.LatLngLiteral): Promise {\r\n const markerType = !this.start ? 'start' : 'end';\r\n const marker = this.contextualSpeedingService.createMapMarker([latLngs.lat, latLngs.lng], markerType);\r\n\r\n if (markerType === 'start') {\r\n this.start = marker;\r\n } else if (markerType === 'end') {\r\n this.end = marker;\r\n }\r\n\r\n await this.checkForPolylineUpdate();\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n\r\n private async checkForPolylineUpdate(): Promise {\r\n if (!this.start || !this.end) {\r\n return;\r\n }\r\n\r\n const points: [number, number][] = [\r\n [this.start.options.position.lat, this.start.options.position.lng],\r\n [this.end.options.position.lat, this.end.options.position.lng],\r\n ]\r\n \r\n this.routeData = await this.contextualSpeedingService.getContextualSpeedingOverrideRoute(points);\r\n\r\n const mapPoints = this.routeData.Points.map(x => new google.maps.LatLng(x[0], x[1]));\r\n const polyline = this.contextualSpeedingService.createPolyline(mapPoints);\r\n\r\n this.polylines = [polyline];\r\n\r\n this.vMap.fitMap(mapPoints);\r\n await this.adjustMarkersToPolyline(mapPoints);\r\n \r\n this.changeDetectorRef.detectChanges();\r\n }\r\n\r\n async save(): Promise {\r\n const overrideSpeed = this.form.get(\"overrideSpeed\").value;\r\n const overrideSpeedKph = this.unitConversionService.convertToDatabaseUnit(overrideSpeed, UnitConversionType.Speed);\r\n\r\n const segmentIdentifiers: ContextualSpeedingOverrideSegment[] = this.routeData.SegmentIdentifiers.map(s => {\r\n const id = this.selectedItem?.ContextualSpeedingOverrideSegments?.find(x => x.SegmentIdentifier == s.SegmentIdentifier)?.Id\r\n\r\n return { \r\n Id: id,\r\n SegmentIdentifier : s.SegmentIdentifier \r\n }\r\n });\r\n\r\n // PostedSpeedLimit is the same for every segment\r\n const reportedSpeedKph = this.routeData.SegmentIdentifiers[0].PostedSpeedLimit;\r\n\r\n const override: ContextualSpeedingOverride = {\r\n Id: this.selectedItem?.Id || 0,\r\n Name: this.form.get('name').value,\r\n StartLatitude: this.start.options.position.lat,\r\n StartLongitude: this.start.options.position.lng,\r\n EndLatitude: this.end.options.position.lat,\r\n EndLongitude: this.end.options.position.lng,\r\n EncodedPolyline: this.routeData.EncodedPolyline,\r\n OverrideSpeedKph: overrideSpeedKph,\r\n ReportedSpeedKph: reportedSpeedKph,\r\n AccountId: this.accountService.getAccountDataFromCache().Id,\r\n ContextualSpeedingOverrideSegments: segmentIdentifiers\r\n }\r\n\r\n return !!this.selectedItem\r\n ? await this.contextualSpeedingService.updateContextualSpeedingOverride(override)\r\n : await this.contextualSpeedingService.addContextualSpeedingOverride(override);\r\n }\r\n\r\n clearMarkers(): void {\r\n this.markers = [];\r\n this.polylines = [];\r\n this.routeData = undefined;\r\n\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n\r\n private async optionallySetSelectedValues(): Promise {\r\n if (!this.selectedItem) {\r\n return;\r\n }\r\n\r\n const overrideSpeed = this.unitConversionService\r\n .convertToUserUnit(this.selectedItem.OverrideSpeedKph, UnitConversionType.Speed);\r\n\r\n this.form.patchValue({\r\n name: this.selectedItem.Name,\r\n overrideSpeed: overrideSpeed\r\n });\r\n\r\n await this.setMapValuesFromSelectedItem();\r\n }\r\n\r\n private async setMapValuesFromSelectedItem(): Promise {\r\n const points = await this.contextualSpeedingService.getPointsForContextualSpeedingOverride(this.selectedItem.Id);\r\n\r\n const start = points[0];\r\n const end = points[points.length - 1];\r\n\r\n this.start = this.contextualSpeedingService.createMapMarker([start[0], start[1]], 'start');\r\n this.end = this.contextualSpeedingService.createMapMarker([end[0], end[1]], 'end');\r\n\r\n await this.checkForPolylineUpdate();\r\n }\r\n\r\n private async adjustMarkersToPolyline(mapPoints: google.maps.LatLng[]): Promise {\r\n const first = mapPoints[0];\r\n const last = mapPoints[mapPoints.length - 1];\r\n\r\n this.start = this.contextualSpeedingService.createMapMarker([first.lat(), first.lng()], 'start')\r\n this.end = this.contextualSpeedingService.createMapMarker([last.lat(), last.lng()], 'end');\r\n\r\n this.fulfillMarkersAddresses();\r\n }\r\n\r\n private fulfillMarkersAddresses(): void {\r\n this.contextualSpeedingService.getAddressForMarker(this.start).then(address => {\r\n // It causes proper HTML update. Detector fails, setTimeout fails...\r\n this.start = { ...this.start, model: address };\r\n });\r\n\r\n this.contextualSpeedingService.getAddressForMarker(this.end).then(address => {\r\n // It causes proper HTML update. Detector fails, setTimeout fails...\r\n this.end = { ...this.end, model: address };\r\n });\r\n }\r\n\r\n private setSpeedUnit(): void {\r\n this.speedUnit = this.unitConversionService.getConversionLabel(UnitConversionType.Speed);\r\n }\r\n}\r\n","import { Directive, Input } from \"@angular/core\";\r\n\r\n@Directive()\r\nexport abstract class ContextualSpeedingEditor {\r\n @Input() selectedItem?: TItem;\r\n\r\n abstract save(): Promise;\r\n}","import { Component, ViewChild } from \"@angular/core\";\r\nimport { VTabComponent } from \"@app/directives/_layout/v-tabs/v-tab.component\";\r\nimport { ContextualSpeedingByRoadComponent } from \"./contextual-speeding-by-road/contextual-speeding-by-road.component\";\r\nimport { ContextualSpeedingByVehicleComponent } from \"./contextual-speeding-by-vehicle/contextual-speeding-by-vehicle.component\";\r\nimport './contextual-speeding-settings-manager.component.scss';\r\nimport { ContextualSpeedingTab } from \"./enums/contextual-speeding-tab\";\r\nimport { ContextualSpeedingTabButton } from \"./models/contextual-speeding-tab-button\";\r\n\r\n@Component({\r\n selector: 'contextual-speeding-settings-manager',\r\n template: require('./contextual-speeding-settings-manager.component.html')\r\n})\r\nexport class ContextualSpeedingSettingsManagerComponent {\r\n Tab = ContextualSpeedingTab;\r\n selectedTab: ContextualSpeedingTab;\r\n\r\n tabButtons: ContextualSpeedingTabButton[] = [\r\n {\r\n tab: ContextualSpeedingTab.ByVehicle,\r\n displayText: 'ContextualSpeedingSettingsManager.AddVehicleType',\r\n icon: 'add',\r\n action: () => this.byVehicle.showEditor()\r\n },\r\n {\r\n tab: ContextualSpeedingTab.ByRoad,\r\n displayText: 'ContextualSpeedingSettingsManager.AddRoadSegment',\r\n icon: 'add',\r\n action: () => this.byRoad.showEditor()\r\n }\r\n ];\r\n\r\n get tabButton(): ContextualSpeedingTabButton {\r\n return this.tabButtons.find(x => x.tab == this.selectedTab);\r\n }\r\n\r\n @ViewChild('byVehicle') byVehicle: ContextualSpeedingByVehicleComponent;\r\n @ViewChild('byRoad') byRoad: ContextualSpeedingByRoadComponent;\r\n\r\n onTabSelect(tab: VTabComponent): void {\r\n this.selectedTab = tab.tabId as ContextualSpeedingTab;\r\n }\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\r\n\r\nimport { FormControl, FormGroup, Validators } from '@angular/forms';\r\nimport { VehicleType } from '@app/enum/VehicleType.enum';\r\nimport { IKeyValuePair } from '@app/interfaces/IKeyValuePair';\r\nimport { AccountService } from '@app/services/account.service';\r\nimport { ContextualSpeedingThresholdService } from '@app/services/contextual-speeding-threshold.service';\r\nimport { UnitConversionService, UnitConversionType } from '@app/services/unitConversion.service';\r\nimport { ContextualSpeedingEditor } from '../base/contextual-speeding-editor';\r\nimport { ContextualSpeedingThreshold } from '../models/contextual-speeding-threshold';\r\nimport './contextual-speeding-vehicle-editor.component.scss';\r\nimport { SpeedingExample, SpeedingExamplesCalculator } from './speeding-examples-calculator';\r\n\r\n@Component({\r\n selector: 'contextual-speeding-vehicle-editor',\r\n template: require('./contextual-speeding-vehicle-editor.component.html')\r\n})\r\nexport class ContextualSpeedingVehicleEditorComponent \r\n extends ContextualSpeedingEditor \r\n implements OnInit {\r\n vehicleTypes: IKeyValuePair[] = [];\r\n speedUnit: string;\r\n\r\n form = new FormGroup({\r\n vehicleType: new FormControl(null, Validators.required),\r\n speedPercentThreshold: new FormControl(null, [Validators.required, Validators.min(0), Validators.max(100)]),\r\n speedThresholdAllowance: new FormControl(null, [Validators.required, Validators.min(0), Validators.max(100)]),\r\n });\r\n\r\n @Input() currentItems: ContextualSpeedingThreshold[] = [];\r\n\r\n get speedingExamples(): SpeedingExample[] {\r\n const speedPercentThreshold = this.form.get('speedPercentThreshold').value;\r\n const speedThresholdAllowance = this.form.get('speedThresholdAllowance').value;\r\n\r\n return SpeedingExamplesCalculator.getExamples(speedPercentThreshold, speedThresholdAllowance, this.speedUnit);\r\n }\r\n\r\n get currentValue(): string {\r\n if (this.form.invalid) {\r\n return \"\";\r\n }\r\n\r\n const speedThresholdAllowance = this.form.get(\"speedThresholdAllowance\").value;\r\n const speedPercentThreshold = this.form.get(\"speedPercentThreshold\").value;\r\n\r\n return `${speedThresholdAllowance}${this.speedUnit} + ${speedPercentThreshold}%`\r\n }\r\n\r\n constructor(\r\n private readonly thresholdService: ContextualSpeedingThresholdService,\r\n private readonly accountService: AccountService,\r\n private readonly unitConversionService: UnitConversionService,\r\n ) {\r\n super();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.setVehicleTypes();\r\n this.setSpeedUnit();\r\n this.optionallySetFormValues();\r\n }\r\n\r\n async save(): Promise {\r\n const speedThresholdAllowance = this.form.get(\"speedThresholdAllowance\").value;\r\n\r\n const speedThresholdAllowanceKph = this.unitConversionService\r\n .convertToDatabaseUnit(speedThresholdAllowance, UnitConversionType.Speed);\r\n\r\n const data: ContextualSpeedingThreshold = {\r\n Id: this.selectedItem?.Id || 0,\r\n VehicleType: this.form.get(\"vehicleType\").value,\r\n SpeedPercentThreshold: this.form.get(\"speedPercentThreshold\").value,\r\n SpeedThresholdAllowanceKph:speedThresholdAllowanceKph,\r\n AccountId: this.accountService.getAccountDataFromCache().Id,\r\n };\r\n\r\n return !!this.selectedItem\r\n ? await this.thresholdService.updateContextualSpeedingThreshold(data)\r\n : await this.thresholdService.addContextualSpeedingThreshold(data);\r\n }\r\n\r\n private setVehicleTypes(): void {\r\n const currentlyUsedVehicleTypes = this.currentItems.map(x => x.VehicleType);\r\n\r\n this.vehicleTypes = this.thresholdService\r\n .getAdjustedVehicleTypes()\r\n .filter(type => {\r\n const typeIsNotInUse = !currentlyUsedVehicleTypes.includes(type.value);\r\n const typeIsCurrentlySelected = this.selectedItem?.VehicleType === type.value;\r\n\r\n return typeIsCurrentlySelected || typeIsNotInUse;\r\n })\r\n }\r\n\r\n private setSpeedUnit(): void {\r\n this.speedUnit = this.unitConversionService.getConversionLabel(UnitConversionType.Speed);\r\n }\r\n\r\n private optionallySetFormValues(): void {\r\n if (!this.selectedItem) {\r\n return;\r\n }\r\n\r\n const percentageValue = this.selectedItem.SpeedPercentThreshold;\r\n const vehicleType = this.selectedItem.VehicleType;\r\n\r\n const constantValue = this.unitConversionService\r\n .convertToUserUnit(this.selectedItem.SpeedThresholdAllowanceKph, UnitConversionType.Speed);\r\n\r\n this.form.patchValue({\r\n vehicleType: vehicleType,\r\n speedPercentThreshold: percentageValue,\r\n speedThresholdAllowance: constantValue\r\n })\r\n }\r\n}","import { Component, Input, OnChanges, OnInit } from \"@angular/core\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { DeviceProfileService } from \"@app/services/device-profile.service\";\r\nimport './device-profile-vehicle-preview.component.scss';\r\n\r\n@Component({\r\n selector: 'device-profile-vehicle-preview',\r\n template: require('./device-profile-vehicle-preview.component.html')\r\n})\r\nexport class DeviceProfileVehiclePreviewComponent implements OnInit, OnChanges {\r\n\r\n @Input() vehicle: IVehicle;\r\n\r\n loading: boolean;\r\n\r\n constructor(\r\n private readonly deviceProfileService: DeviceProfileService\r\n ) { }\r\n\r\n ngOnInit() {\r\n this.render();\r\n }\r\n\r\n ngOnChanges() {\r\n this.render();\r\n }\r\n\r\n //--\r\n\r\n private async render(): Promise {\r\n\r\n if (!this.vehicle) {\r\n return;\r\n }\r\n\r\n this.loading = true;\r\n\r\n const promises: Promise[] = [\r\n this.deviceProfileService.getProfileForVehicle(this.vehicle.Id),\r\n this.deviceProfileService.getComparisonForVehicle(this.vehicle)\r\n ];\r\n\r\n await Promise.all(promises).then(([profile, comparison]) => {\r\n this.vehicle.deviceProfile = profile;\r\n this.vehicle.deviceParameterComparisonResult = comparison;\r\n })\r\n\r\n this.loading = false;\r\n }\r\n}\r\n","import { Component, Input } from \"@angular/core\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { DeviceParameterType } from \"@app/services/device-profile.service\";\r\nimport './device-profile-vehicle-view.component.scss';\r\n\r\n@Component({\r\n selector: 'device-profile-vehicle-view',\r\n template: require('./device-profile-vehicle-view.component.html')\r\n})\r\nexport class DeviceProfileVehicleViewComponent {\r\n\r\n @Input() vehicle: IVehicle;\r\n\r\n DeviceParameterType = DeviceParameterType;\r\n\r\n}\r\n","import { Component, OnInit, ViewChild } from \"@angular/core\";\r\nimport { VTableComponent } from \"@app/directives/_layout/v-table/_components/v-table.component\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { IAggregateFilterEvent, IFilterBarTab } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { IVehicleUnitMapping } from \"@app/interfaces/IVehiclePeripheralMapping\";\r\nimport { UnitsService } from \"@app/main/modules/foundation/_services/unit.service\";\r\nimport { DeviceComparisonStatus, DeviceParameterComparisonResultMap, DeviceParameterProfileMaterialisationOptions, DeviceProfileService, IDeviceParameterProfile, IDeviceParameterRecord } from \"@app/services/device-profile.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { VehicleService } from \"@app/services/vehicle.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { lastValueFrom } from \"rxjs\";\r\nimport { tap } from \"rxjs/operators\";\r\nimport { DeviceProfileComparisonStatusLabelComponent } from \"./device-profile-comparison-status-label/device-profile-comparison-status-label.component\";\r\nimport { DeviceProfileEditorComponent } from \"./device-profile-editor/device-profile-editor.component\";\r\nimport './device-profiles-manager.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'device-profiles-manager',\r\n template: require('./device-profiles-manager.component.html')\r\n})\r\nexport class DeviceProfilesManagerComponent implements OnInit {\r\n @ViewChild('profilesTable') profilesTable: VTableComponent;\r\n @ViewChild('vehiclesTable') vehiclesTable: VTableComponent;\r\n @ViewChild('deviceProfileEditor', { static: false }) deviceProfileEditor: DeviceProfileEditorComponent;\r\n\r\n vehicles: IVehicle[];\r\n selectedVehicle: IVehicle;\r\n\r\n deviceParameterComparisonResultMap: DeviceParameterComparisonResultMap;\r\n deviceParameterProfiles: IDeviceParameterProfile[];\r\n selectedDeviceProfile: IDeviceParameterProfile;\r\n latestDeviceParameterRecords: IDeviceParameterRecord[];\r\n unitMappings: IVehicleUnitMapping[];\r\n\r\n loading: boolean;\r\n deleting: boolean;\r\n\r\n vehicleFilterTabs: IFilterBarTab[] = [];\r\n vehicleFilterEvent: IAggregateFilterEvent;\r\n\r\n //Tables\r\n profilesTableColumns: IVTableColumn[];\r\n profilesTableRows: IVTableRow[];\r\n\r\n vehiclesTableColumns: IVTableColumn[];\r\n vehiclesTableRows: IVTableRow[];\r\n\r\n constructor(\r\n private readonly translationService: TranslationService,\r\n private readonly deviceProfileService: DeviceProfileService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly vTableService: VTableService,\r\n private readonly unitService: UnitsService\r\n ) {\r\n }\r\n\r\n ngOnInit() {\r\n this.createTables();\r\n this.getData();\r\n this.subscribeToChanges();\r\n }\r\n\r\n onConfirmDeleteButton(confirmed: boolean): void {\r\n if (!confirmed) {\r\n return;\r\n }\r\n\r\n this.delete(this.selectedDeviceProfile);\r\n }\r\n\r\n onCloseDeviceProfileForm(): void {\r\n\r\n this.clearSelectedDeviceProfile();\r\n }\r\n\r\n onDeviceProfileSaved(deviceProfile: IDeviceParameterProfile): void {\r\n this.onCloseDeviceProfileForm();\r\n }\r\n\r\n onProfileTableRowClicked(tableRow: IVTableRow): void {\r\n if (!tableRow.data) {\r\n return;\r\n }\r\n\r\n this.selectDeviceProfile(tableRow.data);\r\n }\r\n\r\n onVehicleTableRowClicked(tableRow: IVTableRow): void {\r\n if (!tableRow.data) {\r\n return;\r\n }\r\n\r\n this.selectVehicle(tableRow.data);\r\n }\r\n\r\n createNewDeviceProfile(): void {\r\n this.selectDeviceProfile(this.deviceProfileService.createDeviceParameterProfileTemplate());\r\n }\r\n\r\n selectDeviceProfile(profile: IDeviceParameterProfile): void {\r\n this.selectedDeviceProfile = profile;\r\n }\r\n\r\n clearSelectedDeviceProfile(): void {\r\n this.selectedDeviceProfile = null;\r\n }\r\n\r\n selectVehicle(vehicle: IVehicle): void {\r\n this.selectedVehicle = vehicle;\r\n }\r\n\r\n clearSelectedVehicle(): void {\r\n this.selectedVehicle = null;\r\n }\r\n\r\n switchToEditProfile(): void {\r\n if (!this.selectedVehicle?.deviceProfile) {\r\n return;\r\n }\r\n\r\n this.selectDeviceProfile(this.selectedVehicle.deviceProfile);\r\n this.clearSelectedVehicle();\r\n }\r\n\r\n selectedTabChanged(): void {\r\n this.resetTable();\r\n }\r\n\r\n //--\r\n\r\n private async delete(deviceProfile: IDeviceParameterProfile): Promise {\r\n if (!deviceProfile?.Id) {\r\n return;\r\n }\r\n\r\n this.deleting = true;\r\n\r\n await this.deviceProfileService.deleteProfile(deviceProfile);\r\n\r\n this.clearSelectedDeviceProfile();\r\n\r\n this.deleting = false;\r\n }\r\n\r\n private async getData(invalidateCache: boolean = false): Promise {\r\n\r\n if (this.loading) {\r\n return;\r\n }\r\n\r\n this.loading = true;\r\n\r\n this.deviceProfileService.getProfiles({ Active: true, MaterialisationOptions: DeviceParameterProfileMaterialisationOptions.WithMappings }, invalidateCache).pipe(untilDestroyed(this)).subscribe({\r\n next: deviceParameterProfiles => {\r\n this.deviceParameterProfiles = deviceParameterProfiles.filter(pr => pr.Active);\r\n this.mapAndRenderData();\r\n }\r\n })\r\n\r\n const promises: Promise[] = [\r\n (this.vehicleService.getVehicles({ includePeripheralMappings: true, includeLatestPlots: true }) as Promise),\r\n this.deviceProfileService.getComparisonsForAllVehicles(),\r\n this.deviceProfileService.getLatestDeviceParameterRecords(),\r\n lastValueFrom(this.unitService.getAllUnitMappings())\r\n ];\r\n\r\n await Promise.all(promises).then(([vehicles, deviceParameterComparisonResultMap, latestDeviceParameterRecords, unitMappings]) => {\r\n this.vehicles = vehicles;\r\n this.deviceParameterComparisonResultMap = deviceParameterComparisonResultMap;\r\n this.latestDeviceParameterRecords = latestDeviceParameterRecords;\r\n this.unitMappings = unitMappings;\r\n this.mapAndRenderData();\r\n });\r\n\r\n this.loading = false;\r\n }\r\n\r\n private mapAndRenderData(): void {\r\n if (!this.deviceParameterProfiles || !this.deviceParameterComparisonResultMap) {\r\n return;\r\n }\r\n\r\n this.deviceProfileService.mapDeviceProfilesToVehicles(this.deviceParameterProfiles, this.vehicles);\r\n this.deviceProfileService.mapDeviceParameterComparisonResultsToVehicles(this.deviceParameterComparisonResultMap, this.vehicles);\r\n this.deviceProfileService.mapDeviceEventTimeToVehicles(this.latestDeviceParameterRecords, this.unitMappings, this.vehicles);\r\n\r\n this.addDecoratingDataToProfiles(this.deviceParameterProfiles);\r\n\r\n this.createTabs();\r\n this.createTableRows();\r\n }\r\n\r\n private addDecoratingDataToProfiles(deviceProfiles: IDeviceParameterProfile[]): void {\r\n if (!deviceProfiles?.length) {\r\n return;\r\n }\r\n\r\n deviceProfiles.forEach(profile => {\r\n profile.parametersSetLabel = this.deviceProfileService.getParameterLabelForProfile(profile)\r\n\r\n this.deviceProfileService.createMappingPillsForDeviceProfile(profile);\r\n });\r\n }\r\n\r\n private subscribeToChanges(): void {\r\n this.deviceProfileService.deviceProfilesUpdated.pipe(\r\n untilDestroyed(this),\r\n tap(profiles => {\r\n this.deviceParameterProfiles = profiles.filter(profile => profile.Active);\r\n this.mapAndRenderData();\r\n }))\r\n .subscribe()\r\n }\r\n\r\n private createTabs(): void {\r\n this.vehicleFilterTabs = [];\r\n\r\n this.createTabDefinition(\"Common.All\", (vehicle) => true);\r\n this.createTabDefinition(\"DeviceProfilesManager.SynchronizedTabTitle\", (vehicle) => DeviceComparisonStatus.Synchronized === this.deviceProfileService.getDeviceParameterComparisonResultStatus(vehicle.deviceParameterComparisonResult));\r\n this.createTabDefinition(\"DeviceProfilesManager.AwaitingSyncTabTitle\", (vehicle) => DeviceComparisonStatus.AwaitingSync === this.deviceProfileService.getDeviceParameterComparisonResultStatus(vehicle.deviceParameterComparisonResult));\r\n this.createTabDefinition(\"DeviceProfilesManager.IncompatibleUnitTabTitle\", (vehicle) => DeviceComparisonStatus.IncompatibleUnit === this.deviceProfileService.getDeviceParameterComparisonResultStatus(vehicle.deviceParameterComparisonResult));\r\n this.createTabDefinition(\"DeviceProfilesManager.NoUnitInstalledTabTitle\", (vehicle) => DeviceComparisonStatus.NoUnitInstalled === this.deviceProfileService.getDeviceParameterComparisonResultStatus(vehicle.deviceParameterComparisonResult));\r\n this.createTabDefinition(\"DeviceProfilesManager.NoProfileAssigned\", (vehicle) => DeviceComparisonStatus.NoProfileAssigned === this.deviceProfileService.getDeviceParameterComparisonResultStatus(vehicle.deviceParameterComparisonResult));\r\n }\r\n\r\n private createTabDefinition(translationString: string, callback: (vehicle: IVehicle) => boolean): void {\r\n this.vehicleFilterTabs.push({ title: this.translationService.t(translationString), predicate: callback });\r\n }\r\n\r\n private createTables(): void {\r\n this.createProfilesTable();\r\n this.createVehiclesTable();\r\n }\r\n\r\n private createProfilesTable(): void {\r\n this.profilesTableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"DeviceProfilesManager.TableColumnTitleName\", width: 200 }),\r\n createCellFunction: profile => this.vTableService.createTableCell(profile.Name)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"DeviceProfilesManager.TableColumnTitleAppliesTo\", width: 200 }),\r\n createCellFunction: profile => this.vTableService.createTableCell(profile.appliesToLabel)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"DeviceProfilesManager.TableColumnTitleParametersSet\", sortType: SortType.Number }),\r\n createCellFunction: profile => this.vTableService.createTableCell(profile.parametersSetLabel)\r\n },\r\n {\r\n\r\n header: this.vTableService.createDateTableHeader({ tKey: 'DeviceProfilesManager.TableColumnTitleLastUpdated' }),\r\n createCellFunction: profile => this.vTableService.createDateCell(profile.UpdatedTime)\r\n },\r\n {\r\n\r\n header: this.vTableService.createDateTableHeader({ tKey: 'DeviceProfilesManager.TableColumnTitleCreated' }),\r\n createCellFunction: profile => this.vTableService.createDateCell(profile.CreatedTime)\r\n }\r\n ]\r\n }\r\n\r\n private createVehiclesTable(): void {\r\n this.vehiclesTableColumns = [\r\n {\r\n header: this.vTableService.createVehicleTableHeader(),\r\n createCellFunction: vehicle => this.vTableService.createVehicleRegCell(vehicle)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'DeviceProfilesManager.TableColumnTitleProfileAssigned', width: 260 }),\r\n createCellFunction: vehicle => this.vTableService.createTableCell(vehicle.deviceProfile?.Name)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'DeviceProfilesManager.TableColumnTitleStatus', width: 420, sorted: true, sortDirection: SortDirection.Descending }),\r\n createCellFunction: vehicle => this.vTableService.createTableCell(vehicle.deviceParameterComparisonResult, {\r\n component: DeviceProfileComparisonStatusLabelComponent,\r\n componentInputs: {\r\n comparisonResult: vehicle.deviceParameterComparisonResult\r\n },\r\n sortData: this.deviceProfileService.getDeviceParameterComparisonResultStatus(vehicle.deviceParameterComparisonResult),\r\n exportData: this.deviceProfileService.getDeviceParameterComparisonResultStatusLabel(vehicle.deviceParameterComparisonResult),\r\n searchData: this.deviceProfileService.getDeviceParameterComparisonResultStatusLabel(vehicle.deviceParameterComparisonResult),\r\n })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'DeviceProfilesManager.TableColumnTitleParameters' }),\r\n createCellFunction: vehicle => this.vTableService.createTableCell(\r\n this.deviceProfileService.getDescriptiveDeviceParameterComparisonResultLabel(vehicle.deviceParameterComparisonResult)\r\n )\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'DeviceProfilesManager.TableColumnTitleLastConnected' }),\r\n createCellFunction: vehicle => this.vTableService.createDateCell(vehicle.Plot?.Utc)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'DeviceProfilesManager.TableColumnTitleLastSynced' }),\r\n createCellFunction: vehicle => this.vTableService.createDateCell(vehicle.deviceLastSynced)\r\n }\r\n ]\r\n }\r\n\r\n private createTableRows(): void {\r\n this.profilesTableRows = this.vTableService.createTableRows(this.deviceParameterProfiles, this.profilesTableColumns);\r\n this.vehiclesTableRows = this.vTableService.createTableRows(this.vehicles, this.vehiclesTableColumns);\r\n }\r\n\r\n private resetTable(): void {\r\n setTimeout(() => {\r\n // resolves issue with tables and cdk scroller\r\n this.profilesTable?.render();\r\n this.vehiclesTable?.render();\r\n })\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild } from \"@angular/core\";\r\nimport { AbstractControl, FormBuilder, FormGroup, ValidationErrors, ValidatorFn } from \"@angular/forms\";\r\nimport { VAutocompleteComponent } from \"@app/directives/_forms/v-autocomplete/v-autocomplete.component\";\r\nimport { IPill } from \"@app/directives/_veri/v-pills/v-pills.component\";\r\nimport { VehicleType } from \"@app/enum/VehicleType.enum\";\r\nimport { IKeyValuePair } from \"@app/interfaces/IKeyValuePair\";\r\nimport { VehicleService } from \"@app/services/vehicle.service\";\r\nimport { IGroup } from \"@interfaces/IVehicleGroup\";\r\nimport { GroupService } from \"@services/group.service.ajs\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { IDrivingStyle, IDrivingStyleAssociation } from \"../driving-styles.interfaces\";\r\nimport { DrivingStylesService } from \"../driving-styles.service\";\r\nimport './driving-style-associations-manager.component.scss';\r\n\r\nenum SelectionType {\r\n Group,\r\n VehicleType\r\n}\r\n\r\ninterface IDrivingStyleAssociationDisplay {\r\n title: string;\r\n description: string;\r\n association: IDrivingStyleAssociation;\r\n icon: string;\r\n}\r\n\r\n@Component({\r\n selector: 'driving-style-associations-manager',\r\n template: require('./driving-style-associations-manager.component.html')\r\n})\r\nexport class DrivingStyleAssociationsManagerComponent implements OnInit, OnChanges {\r\n\r\n @Input() existingDrivingStyles: IDrivingStyle[];\r\n @Input() drivingStyle: IDrivingStyle;\r\n @Output() drivingStyleChange = new EventEmitter();\r\n @Output() validate = new EventEmitter();\r\n\r\n @ViewChild(\"groupsAutocomplete\", { static: false }) groupsAutocomplete: VAutocompleteComponent;\r\n\r\n groups: IGroup[];\r\n depotGroups: IGroup[];\r\n vehicleTypeKVPs: IKeyValuePair[];\r\n\r\n remainingAllowedGroups: IGroup[];\r\n remainingAllowedVehicleTypes: any[];\r\n\r\n loading: boolean;\r\n showCreateSidebar: boolean;\r\n\r\n selectionType: SelectionType = SelectionType.Group;\r\n\r\n SelectionType = SelectionType;\r\n VehicleType = VehicleType;\r\n\r\n existingAssociations: IDrivingStyleAssociation[];\r\n selectedGroupId: number;\r\n selectedVehicleTypeKVP: IKeyValuePair;\r\n hasAllResourcesAssociation: boolean;\r\n showVehicleTypeSelect: boolean;\r\n\r\n associationForm: FormGroup;\r\n\r\n get groupIdControl(): AbstractControl {\r\n return this.associationForm?.get(\"GroupId\");\r\n }\r\n\r\n get vehicleTypeControl(): AbstractControl {\r\n return this.associationForm?.get(\"VehicleType\");\r\n }\r\n\r\n constructor(\r\n private readonly formBuilder: FormBuilder,\r\n private readonly groupService: GroupService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly translationService: TranslationService,\r\n private readonly drivingStylesService: DrivingStylesService,\r\n ) {\r\n\r\n }\r\n\r\n ngOnInit(): void {\r\n this.prepare();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n this.prepare();\r\n }\r\n\r\n addAssociation(): void {\r\n const newAssociation = this.createAssociationModel();\r\n\r\n newAssociation.GroupId = this.selectedGroupId;\r\n newAssociation.VehicleType = (this.selectedVehicleTypeKVP?.value === -1) ? null : this.selectedVehicleTypeKVP?.value;\r\n\r\n this.drivingStyle.DrivingStyleAssociations.push(newAssociation);\r\n this.updatePills();\r\n\r\n this.selectedGroupId = null;\r\n this.groupsAutocomplete.clearInput();\r\n this.setDefaultVehicleType()\r\n\r\n this.resetForm();\r\n this.emitChange();\r\n }\r\n\r\n onApplyToAllResourcesChanged(value: boolean): void {\r\n this.drivingStyle.DrivingStyleAssociations = [];\r\n\r\n if (value) {\r\n this.drivingStyle.DrivingStyleAssociations.push(this.createAllResourcesAssociation());\r\n }\r\n\r\n this.setDefaultVehicleType();\r\n this.updatePills();\r\n this.onGroupCleared();\r\n this.emitChange();\r\n }\r\n\r\n onVehicleTypeSelectChange(vehicleTypeKVP: IKeyValuePair): void {\r\n this.selectedVehicleTypeKVP = vehicleTypeKVP;\r\n this.vehicleTypeControl.setValue(vehicleTypeKVP.value);\r\n this.validateForm();\r\n }\r\n\r\n onGroupSelected(group: IGroup): void {\r\n this.selectedGroupId = group.Id;\r\n this.groupIdControl.setValue(group.Id);\r\n this.validateForm();\r\n }\r\n\r\n onGroupCleared(): void {\r\n this.selectedGroupId = null;\r\n this.groupIdControl.setValue(null);\r\n this.validateForm();\r\n }\r\n\r\n removeAssociation(associationToRemove: IDrivingStyleAssociation): void {\r\n const matchingAssociations = this.drivingStyle.DrivingStyleAssociations.filter(association => {\r\n return association.GroupId === associationToRemove.GroupId\r\n && association.VehicleType === associationToRemove.VehicleType\r\n });\r\n\r\n if (!matchingAssociations?.length) {\r\n return;\r\n }\r\n\r\n matchingAssociations.forEach(matchingAssociation => {\r\n this.drivingStyle.DrivingStyleAssociations.splice(this.drivingStyle.DrivingStyleAssociations.indexOf(matchingAssociation), 1);\r\n })\r\n\r\n this.updatePills();\r\n this.emitChange();\r\n }\r\n\r\n groupFilter = (group: IGroup, text: string): boolean => {\r\n return this.groupFilterSearchPredicate(group, text);\r\n }\r\n\r\n groupFilterSearchPredicate(group: IGroup, text: string): boolean {\r\n const alreadyAdded: boolean = !!this.drivingStyle.DrivingStyleAssociations.find(association => association.GroupId === group.Id);\r\n const matchesName: boolean = group.Name.toLowerCase().includes(text.toLowerCase());\r\n const isDepot: boolean = group.IsDepot;\r\n\r\n return !alreadyAdded && matchesName && isDepot;\r\n }\r\n\r\n onPillRemoveClick(pill: IPill): void {\r\n const matchingAssociation = this.drivingStyle.DrivingStyleAssociations.find(association => association === pill.data);\r\n\r\n if (!matchingAssociation) {\r\n return;\r\n }\r\n\r\n this.drivingStyle.DrivingStyleAssociations.splice(this.drivingStyle.DrivingStyleAssociations.indexOf(matchingAssociation), 1);\r\n\r\n this.updatePills();\r\n }\r\n\r\n //--\r\n\r\n private prepare(): void {\r\n\r\n this.existingAssociations = this.existingDrivingStyles.map(drivingStyle => drivingStyle.DrivingStyleAssociations).flat(1);\r\n\r\n this.getData().finally(() => {\r\n this.updatePills();\r\n\r\n this.setDefaultVehicleType();\r\n this.determineAllResourcesAssociation();\r\n this.setupForm();\r\n });\r\n\r\n }\r\n\r\n private setupForm(): void {\r\n this.associationForm = this.formBuilder.group({\r\n GroupId: [\"\", [this.validateAssociationField()]],\r\n VehicleType: [-1, [this.validateAssociationField()]]\r\n });\r\n\r\n this.validate.emit(this.associationForm.valid);\r\n }\r\n\r\n private validateAssociationField(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n\r\n if (!this.associationForm) {\r\n return null;\r\n }\r\n\r\n const groupIdValue: number = (!!this.groupIdControl?.value) ? this.groupIdControl.value : null;\r\n const vehicleTypeValue: number = (this.vehicleTypeControl?.value > -1) ? this.vehicleTypeControl.value : null;\r\n\r\n const existingMatchingAssociation = this.drivingStyle.DrivingStyleAssociations?.find(association => {\r\n return association.GroupId == groupIdValue && association.VehicleType == vehicleTypeValue && this.associationHasValues(association);\r\n });\r\n\r\n if (existingMatchingAssociation) {\r\n return { customMessage: `An association matching your selection already exists below` }\r\n }\r\n\r\n const existingMatchingAssociationInOtherStyles = this.existingAssociations.find(association => {\r\n return association.DrivingStyleId !== this.drivingStyle.Id\r\n && (association.GroupId == groupIdValue && association.VehicleType == vehicleTypeValue && this.associationHasValues(association)\r\n || (this.hasAllResourcesAssociation && !this.associationHasValues(association)));\r\n });\r\n\r\n if (existingMatchingAssociationInOtherStyles) {\r\n const styleName = this.existingDrivingStyles.find(drivingStyle => drivingStyle.Id === existingMatchingAssociationInOtherStyles.DrivingStyleId)?.Name ?? \"Unknown\";\r\n\r\n return { customMessage: `An association matching your selection already exists in another driving style called \"${styleName}\"` }\r\n }\r\n\r\n return null;\r\n };\r\n }\r\n\r\n private associationHasValues(association: IDrivingStyleAssociation): boolean {\r\n return (!!association.GroupId && association.GroupId !== 0) || !!VehicleType[association.VehicleType] && association.VehicleType !== -1;\r\n }\r\n\r\n private validateForm(): void {\r\n this.vehicleTypeControl.updateValueAndValidity();\r\n this.groupIdControl.updateValueAndValidity();\r\n }\r\n\r\n private resetForm(): void {\r\n this.groupIdControl.setValue(null);\r\n this.vehicleTypeControl.setValue(null);\r\n this.validateForm();\r\n }\r\n\r\n private createAssociationModel(): IDrivingStyleAssociation {\r\n const newAssociation = this.drivingStylesService.createDefaultDrivingStyleAssociation();\r\n\r\n newAssociation.AccountId = this.drivingStyle.AccountId;\r\n newAssociation.DrivingStyleId = this.drivingStyle.Id;\r\n\r\n return newAssociation;\r\n }\r\n\r\n private emitChange(): void {\r\n this.drivingStyleChange.emit(this.drivingStyle);\r\n this.validate.emit(this.associationForm.valid);\r\n }\r\n\r\n private async getData(): Promise {\r\n if (this.loading) {\r\n return;\r\n }\r\n\r\n this.loading = true;\r\n\r\n const promises: Promise[] = [\r\n (this.groupService.getGroups() as Promise)\r\n ];\r\n\r\n await Promise.all(promises).then(([groups]) => {\r\n this.groups = groups;\r\n this.depotGroups = groups?.filter(group => group.IsDepot);\r\n this.vehicleTypeKVPs = this.filterAvailableVehicleTypes(this.vehicleService.getVehicleTypes());\r\n });\r\n\r\n this.loading = false;\r\n }\r\n\r\n private updatePills(): void {\r\n this.drivingStylesService.createAssociationPillsForDrivingStyle(this.drivingStyle, this.groups);\r\n }\r\n\r\n private filterAvailableVehicleTypes(vehicleTypes: IKeyValuePair[]): IKeyValuePair[] {\r\n const availableVehicleTypes: IKeyValuePair[] = [];\r\n\r\n if (!vehicleTypes?.length) {\r\n return availableVehicleTypes;\r\n }\r\n\r\n vehicleTypes.forEach(vehicleType => availableVehicleTypes.push(vehicleType));\r\n\r\n availableVehicleTypes.sort((vehicleType1, vehicleType2) => {\r\n if (vehicleType1.value === VehicleType.None) {\r\n return -1\r\n }\r\n\r\n return (vehicleType1.displayName > vehicleType2.displayName) ? 1 : 0;\r\n });\r\n\r\n return availableVehicleTypes;\r\n }\r\n\r\n private setDefaultVehicleType(): void {\r\n if (!this.vehicleTypeKVPs?.length) {\r\n return;\r\n }\r\n\r\n this.showVehicleTypeSelect = false;\r\n\r\n this.selectedVehicleTypeKVP = this.vehicleTypeKVPs.find(vehicleTypeKVP => vehicleTypeKVP.value === VehicleType.None);\r\n\r\n setTimeout(() => {\r\n this.showVehicleTypeSelect = true;\r\n });\r\n }\r\n\r\n private determineAllResourcesAssociation(): void {\r\n this.hasAllResourcesAssociation = false;\r\n\r\n if (!this.drivingStyle.DrivingStyleAssociations?.length) {\r\n return;\r\n }\r\n\r\n const allResourcesAssociation = this.drivingStyle.DrivingStyleAssociations.find(association => !association.GroupId && !VehicleType[association.VehicleType] && association.VehicleType !== VehicleType.None);\r\n\r\n if (!allResourcesAssociation) {\r\n return;\r\n }\r\n\r\n this.hasAllResourcesAssociation = true;\r\n }\r\n\r\n private createAllResourcesAssociation(): IDrivingStyleAssociation {\r\n const newAssociation: IDrivingStyleAssociation = this.drivingStylesService.createDefaultDrivingStyleAssociation();\r\n\r\n newAssociation.DrivingStyleId = this.drivingStyle.Id;\r\n newAssociation.VehicleType = null;\r\n newAssociation.GroupId = null;\r\n\r\n return newAssociation;\r\n }\r\n}\r\n","import { ChangeDetectorRef, Component, Input, OnChanges, OnInit, SimpleChanges, ViewChild } from \"@angular/core\";\r\nimport { AbstractControl, FormBuilder, FormGroup, ValidationErrors, ValidatorFn, Validators } from \"@angular/forms\";\r\nimport { CustomFormValidators } from \"@app/directives/_forms/form-validation.service\";\r\nimport { NavigationService } from \"@app/services/navigation.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { copy, StateParams } from \"@uirouter/angularjs\";\r\nimport { ResourceManagementNavigationModule } from \"../../resourceManagement.navigation\";\r\nimport { DrivingStyleMetricEditorComponent } from \"../driving-style-metric-editor/driving-style-metric-editor.component\";\r\nimport { DrivingStyleMetricSelectorComponent } from \"../driving-style-metric-selector/driving-style-metric-selector.component\";\r\nimport { DrivingStyleMetric, DrivingStyleMetricCategory, DrivingStyleWeightingType, MetricMappingWeightingLevel } from \"../driving-styles.enums\";\r\nimport { IDrivingPerformanceSummary, IDrivingStyle, IDrivingStyleMetricDescriptionDetails, IDrivingStyleMetricMapping, IDrivingStyleMetricMetadataItem } from \"../driving-styles.interfaces\";\r\nimport { DrivingStylesService, IMetricMappingWeightingLevelDetail } from \"../driving-styles.service\";\r\nimport './driving-style-editor.component.scss';\r\n\r\n@Component({\r\n selector: 'driving-style-editor',\r\n template: require('./driving-style-editor.component.html')\r\n})\r\nexport class DrivingStyleEditorComponent implements OnInit, OnChanges {\r\n\r\n @Input() drivingStyleId: number = -1;\r\n @Input() drivingStyle: IDrivingStyle;\r\n\r\n dirtyDrivingStyle: IDrivingStyle;\r\n\r\n defaultDrivingStyle: IDrivingStyle;\r\n drivingStyles: IDrivingStyle[];\r\n drivingStyleMetricDescriptionDetails: IDrivingStyleMetricDescriptionDetails[];\r\n\r\n loading: boolean;\r\n saving: boolean;\r\n deleting: boolean;\r\n\r\n enableWeighting: boolean;\r\n associationsValid: boolean;\r\n\r\n @ViewChild(DrivingStyleMetricSelectorComponent) drivingStyleMetricSelector: DrivingStyleMetricSelectorComponent;\r\n @ViewChild(DrivingStyleMetricEditorComponent) drivingStyleMetricEditor: DrivingStyleMetricEditorComponent;\r\n\r\n selectedMetricMapping: IDrivingStyleMetricMapping;\r\n\r\n metricMappingWeightingLevelDetails: IMetricMappingWeightingLevelDetail[];\r\n\r\n get selectedMetricMappingTitle(): string {\r\n return (this.selectedMetricMapping)\r\n ? `${this.selectedMetricMapping.drivingStyleMetricName} metric configuration`\r\n : null;\r\n }\r\n\r\n get disableSaveStyle(): boolean {\r\n return !this.drivingStyleForm?.valid\r\n || !this.dirtyDrivingStyle?.DrivingStyleMetricMappings?.length\r\n || !!this.dirtyDrivingStyle?.metricMappingsError\r\n || !this.associationsValid\r\n }\r\n\r\n availableDrivingStyleMetricMappings: IDrivingStyleMetricMapping[];\r\n\r\n DrivingStyleMetricCategory = DrivingStyleMetricCategory;\r\n DrivingStyleWeightingType = DrivingStyleWeightingType;\r\n\r\n drivingStyleForm: FormGroup;\r\n\r\n readonly maxTotalAllowedMetrics: number = 8;\r\n\r\n\r\n get upperRagBoundControl(): AbstractControl {\r\n return this.drivingStyleForm?.get(\"UpperRagBound\");\r\n }\r\n\r\n get lowerRagBoundControl(): AbstractControl {\r\n return this.drivingStyleForm?.get(\"LowerRagBound\");\r\n }\r\n\r\n constructor(\r\n private readonly cd: ChangeDetectorRef,\r\n private readonly formBuilder: FormBuilder,\r\n private readonly $stateParams: StateParams,\r\n private readonly drivingStylesService: DrivingStylesService,\r\n private readonly navigationService: NavigationService,\r\n private readonly translationService: TranslationService\r\n ) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.applyRouterDrivingStyleId();\r\n\r\n this.getData();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n this.applyRouterDrivingStyleId();\r\n }\r\n\r\n async save(): Promise {\r\n this.saving = true;\r\n\r\n this.setStyleIdForMetricMappings(this.dirtyDrivingStyle);\r\n this.fixAssociatons(this.dirtyDrivingStyle);\r\n\r\n const drivingStyleId: number = await this.drivingStylesService.saveDrivingStyle(this.dirtyDrivingStyle);\r\n\r\n if (drivingStyleId < 1) {\r\n this.saving = false;\r\n console.error(\"Failed to save driving style\");\r\n return;\r\n }\r\n\r\n setTimeout(() => {\r\n this.saving = false;\r\n this.navigationService.go(ResourceManagementNavigationModule.DrivingStylesManagement);\r\n }, 1000);\r\n }\r\n\r\n async delete(): Promise {\r\n this.deleting = true;\r\n\r\n await this.drivingStylesService.deleteDrivingStyleById(this.dirtyDrivingStyle.Id);\r\n\r\n setTimeout(() => {\r\n this.deleting = false;\r\n this.navigationService.go(ResourceManagementNavigationModule.DrivingStylesManagement);\r\n }, 1000);\r\n }\r\n\r\n onConfirmDeleteButton(confirmed: boolean): void {\r\n if (!confirmed) {\r\n return;\r\n }\r\n\r\n this.delete();\r\n }\r\n\r\n close(): void {\r\n this.navigationService.go(ResourceManagementNavigationModule.DrivingStylesManagement);\r\n }\r\n\r\n clearSelectedMetricMapping(): void {\r\n this.selectedMetricMapping = null;\r\n }\r\n\r\n removeSelectedMetricMapping(): void {\r\n const indexOfSelectedMetricMapping = this.dirtyDrivingStyle.DrivingStyleMetricMappings.findIndex(mapping => mapping === this.selectedMetricMapping);\r\n\r\n if (indexOfSelectedMetricMapping === -1) {\r\n this.clearSelectedMetricMapping();\r\n return;\r\n }\r\n\r\n this.dirtyDrivingStyle.DrivingStyleMetricMappings.splice(indexOfSelectedMetricMapping, 1);\r\n this.clearSelectedMetricMapping();\r\n }\r\n\r\n onMetricMappingClicked(metricMapping: IDrivingStyleMetricMapping): void {\r\n const matchingAvailableMetricMapping = this.availableDrivingStyleMetricMappings.find(availableMetricMapping => availableMetricMapping.DrivingStyleMetric === metricMapping.DrivingStyleMetric);\r\n\r\n if (matchingAvailableMetricMapping) {\r\n matchingAvailableMetricMapping.Weighting = metricMapping.Weighting;\r\n }\r\n\r\n this.selectMetricMappingFromMetric(metricMapping.DrivingStyleMetric);\r\n this.drivingStylesService.updateCustomWeightingsError(this.dirtyDrivingStyle);\r\n }\r\n\r\n onMetricMappingChanged(metricMapping: IDrivingStyleMetricMapping): void {\r\n if (this.dirtyDrivingStyle.WeightingType === DrivingStyleWeightingType.Even) {\r\n return;\r\n }\r\n\r\n this.queryDrivingStylePerformanceSummary();\r\n this.drivingStylesService.updateCustomWeightingsError(this.dirtyDrivingStyle);\r\n }\r\n\r\n onMetricMappingsChanged(updatedMetricMappings: IDrivingStyleMetricMapping[]): void {\r\n this.drivingStylesService.updateCustomWeightingsError(this.dirtyDrivingStyle);\r\n this.queryDrivingStylePerformanceSummary();\r\n }\r\n\r\n onSliderValuesChanged(values: number[]): void {\r\n this.dirtyDrivingStyle.LowerRagBound = Math.round(values[0]);\r\n this.dirtyDrivingStyle.UpperRagBound = Math.round(values[1]);\r\n }\r\n\r\n onRagSliderDragEnd(): void {\r\n this.upperRagBoundControl.setValue(this.dirtyDrivingStyle.UpperRagBound);\r\n this.lowerRagBoundControl.setValue(this.dirtyDrivingStyle.LowerRagBound);\r\n\r\n this.upperRagBoundControl.updateValueAndValidity();\r\n this.lowerRagBoundControl.updateValueAndValidity();\r\n }\r\n\r\n onAssociationsValidation(valid: boolean): void {\r\n this.associationsValid = valid;\r\n }\r\n\r\n onAlterativeMetricClick(metric: DrivingStyleMetric): void {\r\n this.selectMetricMappingFromMetric(metric);\r\n }\r\n\r\n onWeightingTypeChange(): void {\r\n\r\n this.fixWeightingProperties();\r\n this.updateWeightingLevelDetails(this.dirtyDrivingStyle);\r\n this.drivingStylesService.updateCustomWeightingsError(this.dirtyDrivingStyle);\r\n this.queryDrivingStylePerformanceSummary();\r\n }\r\n\r\n private updateWeightingLevelDetails(drivingStyle: IDrivingStyle): void {\r\n if (!drivingStyle?.DrivingStyleMetricMappings?.length) {\r\n return;\r\n }\r\n\r\n drivingStyle.DrivingStyleMetricMappings.forEach(metricMapping => this.drivingStylesService.addWeightingLevelDetailsToMetric(metricMapping, this.dirtyDrivingStyle.WeightingType));\r\n\r\n this.setupAvailableDrivingStyleMetricMappings();\r\n }\r\n\r\n //--\r\n\r\n private async getData(): Promise {\r\n this.loading = true;\r\n\r\n const promises: Promise[] = [\r\n this.drivingStylesService.getDefaultDrivingStyle(),\r\n this.drivingStylesService.getDrivingStyles(true),\r\n this.drivingStylesService.getDrivingStyleMetricDescriptionDetails()\r\n ];\r\n\r\n await Promise.all(promises).then(([defaultDrivingStyle, drivingStyles, drivingStyleMetricDescriptionDetails]) => {\r\n\r\n this.defaultDrivingStyle = defaultDrivingStyle;\r\n this.drivingStyles = drivingStyles;\r\n this.drivingStyleMetricDescriptionDetails = drivingStyleMetricDescriptionDetails;\r\n this.metricMappingWeightingLevelDetails = this.drivingStylesService.getMetricMappingWeightingLevelDetails();\r\n\r\n this.setupAvailableDrivingStyleMetricMappings();\r\n this.prepareModel();\r\n\r\n }).finally(() => {\r\n\r\n this.queryDrivingStylePerformanceSummary();\r\n this.buildForm();\r\n this.cd.detectChanges();\r\n this.loading = false;\r\n })\r\n }\r\n\r\n private selectMetricMappingFromMetric(metric: DrivingStyleMetric): void {\r\n this.selectedMetricMapping = this.dirtyDrivingStyle.DrivingStyleMetricMappings.find(existingMetricMapping => existingMetricMapping.DrivingStyleMetric === metric);\r\n }\r\n\r\n private async queryDrivingStylePerformanceSummary(): Promise {\r\n\r\n if (this.dirtyDrivingStyle.WeightingType === DrivingStyleWeightingType.Even) {\r\n return Promise.resolve();\r\n }\r\n\r\n const calculatedDrivingStyle: IDrivingPerformanceSummary = await this.drivingStylesService.calculateDrivingScore(this.dirtyDrivingStyle, true);\r\n\r\n this.clearPerformanceSummaryOnMetricMappings(this.dirtyDrivingStyle);\r\n this.assignPerformanceSummaryOnMetricMappings(this.dirtyDrivingStyle, calculatedDrivingStyle);\r\n\r\n if (!this.selectedMetricMapping || !this.drivingStyleMetricEditor) {\r\n return;\r\n }\r\n\r\n this.drivingStyleMetricEditor.updateDisplayMetricMappings();\r\n }\r\n\r\n private clearPerformanceSummaryOnMetricMappings(drivingStyle: IDrivingStyle): void {\r\n\r\n if (!drivingStyle?.DrivingStyleMetricMappings?.length) {\r\n return;\r\n }\r\n\r\n drivingStyle.DrivingStyleMetricMappings.forEach(metricMapping => {\r\n metricMapping.metricMetadataItem = null;\r\n });\r\n }\r\n\r\n private assignPerformanceSummaryOnMetricMappings(drivingStyle: IDrivingStyle, calculatedDrivingStyle: IDrivingPerformanceSummary): void {\r\n\r\n if (!calculatedDrivingStyle?.CalculationResult?.DrivingStyleMetricScoreMetadataItems?.length) {\r\n return;\r\n }\r\n\r\n drivingStyle.DrivingStyleMetricMappings.forEach(metricMapping => {\r\n const metadataItem: IDrivingStyleMetricMetadataItem = calculatedDrivingStyle.CalculationResult.DrivingStyleMetricScoreMetadataItems.find(item => item.DrivingStyleMetric === metricMapping.DrivingStyleMetric);\r\n\r\n if (!metadataItem) {\r\n console.warn(`No metadataItem found for: ${metricMapping.DrivingStyleMetric} / ${DrivingStyleMetric[metricMapping.DrivingStyleMetric]}`);\r\n return;\r\n }\r\n\r\n metricMapping.metricMetadataItem = metadataItem;\r\n });\r\n }\r\n\r\n private prepareModel(): void {\r\n\r\n const routeParamDrivingStyleId = this.$stateParams[\"drivingStyleId\"];\r\n\r\n if (routeParamDrivingStyleId) {\r\n this.drivingStyle = this.drivingStyles.find(existingDrivingStyle => existingDrivingStyle.Id === +this.drivingStyleId);\r\n }\r\n\r\n if (!this.drivingStyle) {\r\n this.drivingStyle = this.drivingStylesService.createDefaultDrivingStyle();\r\n this.drivingStyle.UpperRagBound = (this.defaultDrivingStyle.UpperRagBound > 0) ? this.defaultDrivingStyle.UpperRagBound : 70;\r\n this.drivingStyle.LowerRagBound = (this.defaultDrivingStyle.LowerRagBound > 0) ? this.defaultDrivingStyle.LowerRagBound : 30;\r\n }\r\n\r\n this.drivingStylesService.addDrivingStyleMetricDescriptionDetails(this.drivingStyle.DrivingStyleMetricMappings, this.drivingStyleMetricDescriptionDetails);\r\n this.drivingStylesService.addDrivingStyleMetricDefaults(this.drivingStyle.DrivingStyleMetricMappings, this.defaultDrivingStyle);\r\n this.drivingStylesService.addWeightingLevelDetailsToMetricMappings(this.drivingStyle.DrivingStyleMetricMappings);\r\n\r\n this.dirtyDrivingStyle = copy(this.drivingStyle);\r\n\r\n if (this.drivingStyle.DrivingStyleAssociations) {\r\n this.dirtyDrivingStyle.DrivingStyleAssociations = [...this.drivingStyle.DrivingStyleAssociations];\r\n }\r\n\r\n if (this.drivingStyle.DrivingStyleMetricMappings) {\r\n this.dirtyDrivingStyle.DrivingStyleMetricMappings = [...this.drivingStyle.DrivingStyleMetricMappings];\r\n }\r\n\r\n this.fixWeightingProperties();\r\n this.updateWeightingLevelDetails(this.dirtyDrivingStyle);\r\n this.queryDrivingStylePerformanceSummary();\r\n }\r\n\r\n private applyRouterDrivingStyleId(): void {\r\n const routeParamDrivingStyleId = this.$stateParams[\"drivingStyleId\"];\r\n\r\n if (!routeParamDrivingStyleId) {\r\n return;\r\n }\r\n\r\n this.drivingStyleId = routeParamDrivingStyleId;\r\n }\r\n\r\n private setupAvailableDrivingStyleMetricMappings(): IDrivingStyleMetricMapping[] {\r\n this.availableDrivingStyleMetricMappings = [];\r\n\r\n if (!this.drivingStyleMetricDescriptionDetails?.length) {\r\n return;\r\n }\r\n\r\n this.drivingStyleMetricDescriptionDetails.forEach(description => {\r\n const newMetricMapping = this.drivingStylesService.createDrivingStyleMetricMapping(description.DrivingStyleMetric);\r\n\r\n if (newMetricMapping.DrivingStyleMetric === DrivingStyleMetric.Total) {\r\n return;\r\n }\r\n\r\n if (newMetricMapping.DrivingStyleMetric === DrivingStyleMetric.OverTorqueDuration) {\r\n return;\r\n }\r\n\r\n this.availableDrivingStyleMetricMappings.push(newMetricMapping);\r\n });\r\n\r\n this.drivingStylesService.addDrivingStyleMetricDescriptionDetails(this.availableDrivingStyleMetricMappings, this.drivingStyleMetricDescriptionDetails);\r\n this.drivingStylesService.addDrivingStyleMetricDefaults(this.availableDrivingStyleMetricMappings, this.defaultDrivingStyle);\r\n }\r\n\r\n private buildForm(): void {\r\n this.drivingStyleForm = this.formBuilder.group({\r\n Name: [this.dirtyDrivingStyle.Name ?? \"\", [\r\n Validators.required,\r\n Validators.minLength(3),\r\n Validators.maxLength(100),\r\n CustomFormValidators.emptyWhiteSpace,\r\n this.drivingStylesService.uniqueDrivingStyleNameValidator(this.dirtyDrivingStyle, this.drivingStyles)]\r\n ],\r\n UpperRagBound: [this.dirtyDrivingStyle.UpperRagBound, [Validators.required, Validators.min(0), Validators.max(100), this.validateRagBound()]],\r\n LowerRagBound: [this.dirtyDrivingStyle.LowerRagBound, [Validators.required, Validators.min(0), Validators.max(100), this.validateRagBound()]],\r\n WeightingType: [this.dirtyDrivingStyle.WeightingType ?? DrivingStyleWeightingType.Even, [Validators.required, Validators.min(0), Validators.max(2)]]\r\n });\r\n }\r\n\r\n private validateRagBound(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n\r\n if (!this.drivingStyleForm) {\r\n return null;\r\n }\r\n\r\n const upperRagBoundValue: number = this.upperRagBoundControl?.value;\r\n const lowerRagBoundValue: number = this.lowerRagBoundControl?.value;\r\n\r\n if (upperRagBoundValue <= lowerRagBoundValue) {\r\n return { customMessage: this.translationService.t(\"DrivingStyleEditor.UpperRagBoundValidationFail\") }\r\n }\r\n\r\n return null;\r\n };\r\n }\r\n\r\n private fixWeightingProperties(): void {\r\n if (!this.dirtyDrivingStyle?.DrivingStyleMetricMappings?.length) {\r\n return;\r\n }\r\n\r\n const defaultMetricMappingPriorityOptions = this.metricMappingWeightingLevelDetails.find(option => option.isDefault);\r\n\r\n this.dirtyDrivingStyle.DrivingStyleMetricMappings.forEach(metricMapping => {\r\n const matchingMetricMappingPriorityOptions = this.metricMappingWeightingLevelDetails.find(detail => detail.value === metricMapping.Weighting);\r\n\r\n switch (this.dirtyDrivingStyle.WeightingType) {\r\n case DrivingStyleWeightingType.Even:\r\n metricMapping.Weighting = null;\r\n break;\r\n\r\n case DrivingStyleWeightingType.Simple:\r\n metricMapping.Weighting = (matchingMetricMappingPriorityOptions && matchingMetricMappingPriorityOptions.level !== MetricMappingWeightingLevel.Custom)\r\n ? matchingMetricMappingPriorityOptions.value\r\n : defaultMetricMappingPriorityOptions.value;\r\n break;\r\n\r\n case DrivingStyleWeightingType.Custom:\r\n metricMapping.Weighting = (!!metricMapping.Weighting) ? metricMapping.Weighting : defaultMetricMappingPriorityOptions.value;\r\n break;\r\n }\r\n });\r\n }\r\n\r\n private setStyleIdForMetricMappings(drivingStyle: IDrivingStyle): void {\r\n\r\n if (!drivingStyle?.DrivingStyleMetricMappings?.length) {\r\n return;\r\n }\r\n\r\n this.dirtyDrivingStyle.DrivingStyleMetricMappings?.forEach(mapping => {\r\n mapping.DrivingStyleId = this.dirtyDrivingStyle.Id;\r\n });\r\n }\r\n\r\n private fixAssociatons(drivingStyle: IDrivingStyle): void {\r\n if (!drivingStyle?.DrivingStyleAssociations?.length) {\r\n return;\r\n }\r\n\r\n this.drivingStyle.DrivingStyleAssociations.forEach(association => {\r\n association.VehicleType = (association.VehicleType === -1) ? null : association.VehicleType;\r\n })\r\n }\r\n}\r\n","import { Component, Input } from \"@angular/core\";\r\nimport { MetricMappingWeightingLevel } from \"../driving-styles.enums\";\r\nimport { IDrivingStyleMetricMapping } from \"../driving-styles.interfaces\";\r\nimport './driving-style-metric-weighting-label.component.scss';\r\n\r\n@Component({\r\n selector: 'driving-style-metric-weighting-label',\r\n template: require('./driving-style-metric-weighting-label.component.html')\r\n})\r\nexport class DrivingStyleMetricWeightingLabelComponent {\r\n\r\n @Input() metricMapping: IDrivingStyleMetricMapping;\r\n\r\n MetricMappingWeightingLevel = MetricMappingWeightingLevel;\r\n\r\n constructor() { }\r\n}\r\n","import { Component, Input, OnChanges, OnInit } from \"@angular/core\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { DrivingStylesService } from \"../driving-styles.service\";\r\nimport './driving-style-vehicle-preview.component.scss';\r\n\r\n@Component({\r\n selector: 'driving-style-vehicle-preview',\r\n template: require('./driving-style-vehicle-preview.component.html')\r\n})\r\nexport class DrivingStyleVehiclePreviewComponent implements OnInit, OnChanges {\r\n\r\n @Input() vehicle: IVehicle;\r\n\r\n loading: boolean;\r\n\r\n constructor(\r\n private readonly drivingStylesService: DrivingStylesService\r\n ) {\r\n\r\n }\r\n\r\n ngOnInit() {\r\n this.render();\r\n }\r\n\r\n ngOnChanges() {\r\n this.render();\r\n }\r\n\r\n //--\r\n\r\n private async render(): Promise {\r\n\r\n if (!this.vehicle) {\r\n return;\r\n }\r\n\r\n this.loading = true;\r\n\r\n if (!this.vehicle.drivingStyle) {\r\n this.vehicle.drivingStyle = await this.drivingStylesService.getDrivingStyleForVehicle(this.vehicle.Id);\r\n }\r\n\r\n this.loading = false;\r\n }\r\n}\r\n","import { Component, Injector, OnInit } from \"@angular/core\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { VPillsComponent } from \"@app/directives/_veri/v-pills/v-pills.component\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { IAggregateFilterEvent, IFilterBarTab } from \"@directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { IGroup } from \"@interfaces/IVehicleGroup\";\r\nimport { GroupService } from \"@services/group.service.ajs\";\r\nimport { NavigationService } from \"@services/navigation.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { ResourceManagementNavigationModule } from \"../resourceManagement.navigation\";\r\nimport './driving-styles-manager.component.scss';\r\nimport { IDrivingStyle } from \"./driving-styles.interfaces\";\r\nimport { DrivingStylesService } from \"./driving-styles.service\";\r\n\r\n@Component({\r\n selector: 'driving-styles-manager',\r\n template: require('./driving-styles-manager.component.html')\r\n})\r\nexport class DrivingStylesManagerComponent implements OnInit {\r\n\r\n groups: IGroup[];\r\n drivingStyles: IDrivingStyle[];\r\n\r\n filterTabs: IFilterBarTab[] = [];\r\n filterEvent: IAggregateFilterEvent;\r\n\r\n loading: boolean;\r\n showCreateSidebar: boolean;\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n\r\n constructor(\r\n private readonly translationService: TranslationService,\r\n private readonly groupService: GroupService,\r\n private readonly navigationService: NavigationService,\r\n private readonly drivingStylesService: DrivingStylesService,\r\n private readonly vTableService: VTableService\r\n ) {\r\n }\r\n\r\n ngOnInit() {\r\n this.createTable();\r\n this.getData();\r\n }\r\n\r\n onTableRowClicked(tableRow: IVTableRow): void {\r\n if (!tableRow.data) {\r\n return;\r\n }\r\n\r\n this.editDrivingStyle(tableRow.data);\r\n }\r\n\r\n createNewDrivingStyle(): void {\r\n this.navigationService.go(ResourceManagementNavigationModule.NewDrivingStyle);\r\n }\r\n\r\n //--\r\n\r\n private async getData(): Promise {\r\n\r\n if (this.loading) {\r\n return;\r\n }\r\n\r\n this.loading = true;\r\n\r\n const promises: Promise[] = [\r\n (this.groupService.getGroups() as Promise),\r\n this.drivingStylesService.getDrivingStyles(true)\r\n ];\r\n\r\n await Promise.all(promises).then(([groups, drivingStyles]) => {\r\n this.groups = groups;\r\n this.drivingStyles = drivingStyles;\r\n\r\n this.addColumnDataForAssociations(this.drivingStyles);\r\n });\r\n\r\n this.createTabs();\r\n this.tableRows = this.vTableService.createTableRows(this.drivingStyles, this.tableColumns);\r\n\r\n this.loading = false;\r\n }\r\n\r\n private editDrivingStyle(drivingStyle: IDrivingStyle): void {\r\n if (!drivingStyle?.Id) {\r\n return;\r\n }\r\n\r\n this.navigationService.go(ResourceManagementNavigationModule.EditDrivingStyle, { drivingStyleId: drivingStyle.Id });\r\n }\r\n\r\n private createTabs(): void {\r\n this.filterTabs = [];\r\n\r\n this.createTabDefinition(\"Common.All\", (drivingStyle) => true);\r\n this.createTabDefinition(\"DrivingStylesManager.Associated\", (drivingStyle) => drivingStyle.DrivingStyleAssociations?.length > 0);\r\n this.createTabDefinition(\"DrivingStylesManager.Unassociated\", (drivingStyle) => !drivingStyle.DrivingStyleAssociations?.length);\r\n }\r\n\r\n private createTabDefinition(translationString: string, callback: (drivingStyle: IDrivingStyle) => boolean): void {\r\n this.filterTabs.push({ title: this.translationService.t(translationString), predicate: callback });\r\n }\r\n\r\n private addColumnDataForAssociations(drivingStyles: IDrivingStyle[]): void {\r\n if (!drivingStyles?.length) {\r\n return;\r\n }\r\n\r\n drivingStyles.forEach(drivingStyle => {\r\n this.drivingStylesService.createAssociationPillsForDrivingStyle(drivingStyle, this.groups);\r\n });\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'DrivingStylesManager.TableColumnTitleName', width: 260 }),\r\n createCellFunction: style => this.vTableService.createTableCell(style.Name)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'DrivingStylesManager.TableColumnTitleAppliesTo' }),\r\n createCellFunction: style => this.vTableService.createTableCell(this.getDataForAssociationsAsString(style), {\r\n component: VPillsComponent,\r\n componentInputs: {\r\n pills: style.displayPillsForAssociations\r\n }\r\n })\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: 'DrivingStylesManager.TableColumnTitleLastUpdated', sorted: true, sortDirection: SortDirection.Descending }),\r\n createCellFunction: style => this.vTableService.createDateCell(new Date(style.Updated))\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: 'DrivingStylesManager.TableColumnTitleCreated' }),\r\n createCellFunction: style => this.vTableService.createDateCell(new Date(style.Created))\r\n }\r\n ]\r\n }\r\n\r\n private getDataForAssociationsAsString(style: IDrivingStyle): string {\r\n let string = '';\r\n\r\n style.displayPillsForAssociations.forEach(pill => {\r\n string += ` ${pill.label}`;\r\n })\r\n\r\n return string;\r\n }\r\n}\r\n","import { AfterViewInit, Component, ElementRef, EventEmitter, Input, OnInit, Output, ViewChild } from \"@angular/core\";\r\nimport { VButtonDropdownComponent } from \"@directives/_core/v-dropdown/v-button-dropdown/v-button-dropdown.component\";\r\nimport { IGroup } from \"@interfaces/IVehicleGroup\";\r\nimport { FilterBarComponent } from \"../filter-bar.component\";\r\nimport { FilterTriggerType, IFilterBarFilter } from \"../filter-bar.models\";\r\nimport \"./group-button-filter.component.scss\";\r\n\r\n@Component({\r\n selector: \"group-button-filter\",\r\n template: require(\"./group-button-filter.component.html\")\r\n})\r\nexport class GroupButtonFilterComponent implements IFilterBarFilter, OnInit, AfterViewInit {\r\n\r\n @Input() selected: IGroup;\r\n @Input() label: string;\r\n\r\n @Output() change = new EventEmitter();\r\n\r\n @ViewChild(VButtonDropdownComponent) dropdown: VButtonDropdownComponent;\r\n\r\n // ---\r\n\r\n name = \"Group\";\r\n icon = \"fa-solid fa-folder\";\r\n type: FilterTriggerType = \"group\";\r\n\r\n searchString: string;\r\n\r\n private defaultLabel = \"Any Group\";\r\n\r\n constructor(private readonly parent: FilterBarComponent, readonly elementRef: ElementRef) {\r\n this.updateLabelText();\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.parent.registerFilter(this);\r\n }\r\n\r\n onGroupSelected(group: IGroup) {\r\n\r\n this.selected = group;\r\n this.updateLabelText();\r\n\r\n this.change.emit(group);\r\n this.parent.onFilterChange(\"group\", group);\r\n this.parent.onFilterChange(\"custom\", group, { customName: this.label, filterData: true });\r\n\r\n this.dropdown.showDropDown = false;\r\n }\r\n\r\n clearSelectedVehicle() {\r\n this.onGroupSelected(null);\r\n }\r\n\r\n onDropdownClose() {\r\n this.parent.childClosed(this);\r\n }\r\n\r\n onSearch(text: string): void {\r\n this.searchString = text;\r\n }\r\n\r\n filterPredicate(item: any, value?: IGroup): boolean {\r\n\r\n if (item.VehicleId) {\r\n return value.VehicleIds.includes(item.VehicleId);\r\n }\r\n\r\n if (item.vehicle) {\r\n return value.VehicleIds.includes(item.vehicle.Id);\r\n }\r\n\r\n if (item.ShortReg) {\r\n return value.VehicleIds.includes(item.Id);\r\n }\r\n\r\n // Dont know how to cope with this\r\n return false;\r\n }\r\n\r\n // ---\r\n\r\n private updateLabelText() {\r\n if (this.selected) {\r\n this.label = this.selected.Name;\r\n }\r\n else {\r\n this.label = this.defaultLabel;\r\n }\r\n }\r\n}\r\n","import { Component, ElementRef, EventEmitter, Input, OnChanges, Output, SimpleChanges, ViewChild } from \"@angular/core\";\r\nimport { VButtonStatus } from \"@directives/_forms/v-input/v-input.component\";\r\nimport { IGroup } from \"@interfaces/IVehicleGroup\";\r\nimport { GroupService } from \"@services/group.service.ajs\";\r\nimport \"./group-autocomplete.component.scss\";\r\n\r\n@Component({\r\n selector: \"group-autocomplete\",\r\n template: require(\"./group-autocomplete.component.html\")\r\n})\r\nexport class GroupAutocompleteComponent implements OnChanges {\r\n\r\n @Input() selectedGroup: IGroup;\r\n @Input() selectedGroupId: number;\r\n\r\n @Input() groups: IGroup[];\r\n\r\n @Input() label: string;\r\n @Input() placeholder: string;\r\n @Input() customDropdownHeight: number;\r\n\r\n @Output() groupSelected: EventEmitter = new EventEmitter();\r\n @Output() clear = new EventEmitter();\r\n @ViewChild(\"groupSearchInput\", { read: ElementRef }) groupSearchInputRef: ElementRef;\r\n // ---\r\n\r\n text: string;\r\n showDropdown = false;\r\n inputStatus = VButtonStatus.Default;\r\n loading = false;\r\n\r\n constructor(\r\n private readonly groupService: GroupService) {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (this.selectedGroupId) {\r\n this.loadGroups();\r\n }\r\n else {\r\n this.onClear();\r\n }\r\n }\r\n\r\n onFocus() {\r\n this.showDropdown = true;\r\n\r\n this.loadGroups();\r\n }\r\n\r\n onGroupSelected(group: IGroup) {\r\n if (!group) {\r\n return;\r\n }\r\n\r\n this.selectedGroup = group;\r\n this.text = group.Name;\r\n this.inputStatus = VButtonStatus.Success;\r\n\r\n this.showDropdown = false;\r\n\r\n this.groupSelected.emit(group);\r\n }\r\n\r\n onTextChanged(text: string) {\r\n if (text == this.text) {\r\n return;\r\n }\r\n\r\n this.selectedGroup = null;\r\n this.inputStatus = VButtonStatus.Default;\r\n\r\n this.text = text;\r\n\r\n this.clear.emit();\r\n }\r\n\r\n onDropdownClosed() {\r\n this.showDropdown = false;\r\n }\r\n\r\n onClear(): void {\r\n this.selectedGroup = this.selectedGroupId = null;\r\n this.text = null;\r\n this.inputStatus = VButtonStatus.Default;\r\n this.groups = null;\r\n this.loadGroups();\r\n this.clear.emit();\r\n }\r\n\r\n // ---\r\n\r\n private loadGroups() {\r\n if (this.groups) {\r\n this.selectGroup();\r\n return;\r\n }\r\n\r\n this.loading = true;\r\n\r\n this.groupService.getGroups()\r\n .then(groups => {\r\n this.groups = groups;\r\n this.selectGroup();\r\n })\r\n .finally(() => {\r\n this.loading = false;\r\n });\r\n }\r\n\r\n private selectGroup(): void {\r\n if (!this.selectedGroupId) {\r\n return;\r\n }\r\n\r\n const matchingGroup = this.groups.find(g => g.Id == this.selectedGroupId);\r\n this.onGroupSelected(matchingGroup);\r\n\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, Output, SimpleChanges } from \"@angular/core\";\r\nimport { FormControl, FormGroup, Validators } from \"@angular/forms\";\r\nimport { CustomFormValidators } from \"@app/directives/_forms/form-validation.service\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { IGeofence } from \"@app/interfaces/IGeofences\";\r\nimport { IGroup } from \"@app/interfaces/IVehicleGroup\";\r\nimport { AlertCategory } from \"@app/main/modules/alerts/_enums/alerts.enums\";\r\nimport { IAlertRule, IAlertRuleGroupMapping } from \"@app/main/modules/alerts/_models/alerts.interfaces\";\r\nimport { UserRole } from \"@app/services/accountFeature.service\";\r\nimport { GroupService } from \"@app/services/groups/group.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport './group-details.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'group-details',\r\n template: require('./group-details.component.html')\r\n})\r\nexport class GroupDetailComponent {\r\n @Input() group: IGroup;\r\n @Input() groups: IGroup[];\r\n @Input() alertRuleGroupMappings: IAlertRuleGroupMapping;\r\n\r\n @Output() groupChange = new EventEmitter();\r\n @Output() newSubGroup = new EventEmitter();\r\n @Output() depotStatusChanged = new EventEmitter();\r\n\r\n groupForm: FormGroup;\r\n unchangedGroup: IGroup;\r\n\r\n @Input() existingDepotVehicleMatchesFound: boolean;\r\n parentDepot: IGroup;\r\n selectedParentGroupId: number;\r\n childDepots: IGroup[] = [];\r\n numParents: number;\r\n selectedGeofence: IGeofence;\r\n\r\n // AlertRuleTable data\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n UserRole = UserRole;\r\n\r\n constructor(\r\n private readonly groupService: GroupService,\r\n private readonly vTableService: VTableService) { }\r\n\r\n ngOnInit(): void {\r\n this.initialise();\r\n\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (!!changes['group'] && changes['group'].currentValue.Id !== changes['group'].previousValue?.Id) {\r\n this.initialise(); \r\n }\r\n\r\n if (changes['alertRuleGroupMappings']) {\r\n this.tableRows = this.vTableService.createTableRows(this.alertRuleGroupMappings?.AlertRules, this.tableColumns);\r\n }\r\n }\r\n\r\n checkDepotValidity(): void {\r\n this.depotStatusChanged.emit();\r\n }\r\n\r\n selectParentGroup(group: IGroup): void {\r\n this.selectedParentGroupId = group?.Id || null;\r\n this.groupForm.controls.ParentId.setValue(group?.Id);\r\n }\r\n\r\n addSubGroup(): void {\r\n\r\n const group: IGroup = {\r\n Id: -1,\r\n Name: \"\",\r\n AccountId: -1,\r\n DriverIds: [],\r\n totalDrivers: 0,\r\n VehicleIds: [],\r\n totalVehicles: 0,\r\n GeofenceIds: [],\r\n GeofenceId: null,\r\n totalGeofences: 0,\r\n UserIds: [],\r\n totalUsers: 0,\r\n GroupDriverMappings: [],\r\n GroupVehicleMappings: [],\r\n GroupGeofenceMappings: []\r\n };\r\n\r\n // If a group is selected, create new additions underneath\r\n if (this.group && this.group.Id && this.groupService.sumParents(this.group) < 5 && this.group.Id > 0) {\r\n\r\n group.parent = this.group;\r\n group.ParentId = this.group.Id;\r\n }\r\n\r\n this.newSubGroup.emit(group);\r\n }\r\n\r\n onGeofenceSelected(geofence: IGeofence): void {\r\n this.selectedGeofence = geofence;\r\n this.groupForm.get('GeofenceId').setValue(geofence.Id);\r\n }\r\n \r\n groupHasChanged(): boolean {\r\n return this.groupForm.get(\"Name\").value != this.unchangedGroup.Name ||\r\n this.groupForm.get(\"IsDepot\").value != this.unchangedGroup.IsDepot ||\r\n this.groupForm.get(\"ParentId\").value != this.unchangedGroup.ParentId ||\r\n this.groupForm.get(\"GeofenceId\").value != this.unchangedGroup.GeofenceId;\r\n\r\n }\r\n\r\n get formIsValid(): boolean {\r\n return this.groupForm?.valid && !this.existingDepotVehicleMatchesFound;\r\n }\r\n //--\r\n\r\n private clearAllValues(): void {\r\n this.groupForm = null;\r\n this.parentDepot = null;\r\n this.childDepots = [];\r\n this.numParents = 0;\r\n this.selectedParentGroupId = null;\r\n }\r\n\r\n private initialise(): void {\r\n this.tableRows = [];\r\n this.clearAllValues();\r\n this.createForm();\r\n this.createTableColumns();\r\n\r\n this.unchangedGroup = { ...this.group };\r\n\r\n if (!this.group.IsDepot && this.group.parent) {\r\n this.checkParentIsDepot(this.group);\r\n }\r\n\r\n if (!this.group.IsDepot && !this.parentDepot && this.group.children) {\r\n this.childDepots = [];\r\n this.checkChildIsDepot(this.group);\r\n }\r\n\r\n this.numParents = this.groupService.sumParents(this.group);\r\n\r\n this.selectedParentGroupId = this.group.ParentId;\r\n }\r\n\r\n private createTableColumns(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Alerts.AlertName\" }),\r\n createCellFunction: (alertRule) => this.vTableService.createTableCell(alertRule.Name),\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Alerts.AlertCategory\" }),\r\n createCellFunction: (alertRule) => this.vTableService.createEnumCell(AlertCategory, \"AlertCategory\", alertRule.Category),\r\n },\r\n ]\r\n }\r\n \r\n private createForm(): void {\r\n this.groupForm = new FormGroup({\r\n Name: new FormControl(this.group.Name, {\r\n validators: [\r\n Validators.required,\r\n Validators.minLength(3),\r\n Validators.maxLength(60),\r\n CustomFormValidators.duplicateProperty(this.groups.filter(g => g.Id !== this.group.Id), 'Name', 'groupNameDuplicated')\r\n ]\r\n }),\r\n IsDepot: new FormControl(this.group.IsDepot),\r\n ParentId: new FormControl(this.group.ParentId, {\r\n validators: [\r\n CustomFormValidators.GroupCanBeUsedAsParent(this.group, this.groups)\r\n ]\r\n }),\r\n GeofenceId: new FormControl(this.group.GeofenceId)\r\n })\r\n\r\n this.groupForm.valueChanges.pipe(untilDestroyed(this)).subscribe({\r\n next: values => {\r\n\r\n this.group = {\r\n ...this.group,\r\n Name: values.Name,\r\n IsDepot: values.IsDepot,\r\n ParentId: values.ParentId,\r\n GeofenceId: values.GeofenceId\r\n }\r\n\r\n // this.group looks to be passed in by value not ref,\r\n // so if this.group.IsDepot changes to true, these aren't propogated to the validator unless we reset it\r\n this.groupForm.controls[\"ParentId\"].setValidators([CustomFormValidators.GroupCanBeUsedAsParent(this.group, this.groups)]);\r\n\r\n this.group.parent = this.groups.find(g => g.Id == values.ParentId);\r\n\r\n this.checkDepotValidity();\r\n\r\n this.groupChange.emit(this.group);\r\n }\r\n })\r\n }\r\n\r\n private checkParentIsDepot(group: IGroup) {\r\n if (group.IsDepot) {\r\n this.parentDepot = group;\r\n return;\r\n }\r\n\r\n if (group.parent) {\r\n this.checkParentIsDepot(group.parent);\r\n }\r\n }\r\n\r\n private checkChildIsDepot(group: IGroup) {\r\n if (group.IsDepot) {\r\n this.childDepots.push(group);\r\n return;\r\n }\r\n\r\n if (group.children) {\r\n group.children.forEach(child => {\r\n this.checkChildIsDepot(child);\r\n });\r\n }\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild } from \"@angular/core\";\r\nimport { ResourceType } from \"@app/enum/ResourceType\";\r\nimport { IDriver } from \"@app/interfaces/IDriver\";\r\nimport { IGeofence } from \"@app/interfaces/IGeofences\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { IGroup, IGroupMapping } from \"@app/interfaces/IVehicleGroup\";\r\nimport { IAlertRuleGroupMapping } from \"@app/main/modules/alerts/_models/alerts.interfaces\";\r\nimport { AlertsService } from \"@app/main/modules/alerts/_services/alerts.service\";\r\nimport { DriverService } from \"@app/services/driver.service\";\r\nimport { GeofenceService } from \"@app/services/geofence.service\";\r\nimport { GroupService } from \"@app/services/groups/group.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { VehicleService } from \"@app/services/vehicle.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { forkJoin, from } from \"rxjs\";\r\nimport { GroupDetailComponent } from \"./group-details/group-details.component\";\r\nimport './group-editor.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'group-editor',\r\n template: require('./group-editor.component.html')\r\n})\r\nexport class GroupEditorComponent implements OnInit, OnChanges {\r\n @Input() group: IGroup\r\n @Input() groups: IGroup[];\r\n @Input() showTitleAndFooter: boolean;\r\n @Input() saving: boolean;\r\n @Output() close = new EventEmitter();\r\n @Output() newGroup = new EventEmitter();\r\n @Output() savingGroup = new EventEmitter();\r\n @Output() groupSaved = new EventEmitter();\r\n @Output() groupDeleted = new EventEmitter();\r\n\r\n @ViewChild(GroupDetailComponent) groupDetail: GroupDetailComponent;\r\n\r\n ResourceType = ResourceType;\r\n\r\n changedGroup: IGroup;\r\n existingDepotVehicleMatchesFound: boolean;\r\n\r\n vehicles: IVehicle[];\r\n vehicleIds: number[];\r\n selectedVehicleIds: number[] = [];\r\n hiddenVehiclesCount = 0;\r\n drivers: IDriver[];\r\n driverIds: number[];\r\n selectedDriverIds: number[] = [];\r\n hiddenDriversCount = 0;\r\n geofences: IGeofence[];\r\n geofenceIds: number[];\r\n selectedGeofenceIds: number[] = [];\r\n hiddenGeofencesCount = 0;\r\n\r\n groupAlertMappings: IAlertRuleGroupMapping;\r\n\r\n title: string;\r\n\r\n\r\n constructor(\r\n private readonly driverService: DriverService,\r\n private readonly geofenceService: GeofenceService,\r\n private readonly groupService: GroupService,\r\n private readonly translationService: TranslationService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly alertService: AlertsService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.getResources();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['group']) {\r\n this.changedGroup = { ...this.group };\r\n this.title = this.group.Name?.length ? this.group.Name : this.translationService.t('groups.newGroup');\r\n\r\n this.alertService.getAlertRulesContainsGroupId(this.group.Id).then(response => {\r\n this.groupAlertMappings = response; \r\n }); \r\n }\r\n }\r\n\r\n get formIsDirty(): boolean {\r\n return this.groupDetail.groupHasChanged();\r\n }\r\n\r\n closeEditor(): void {\r\n this.close.emit();\r\n }\r\n\r\n saveGroup(): void {\r\n this.savingGroup.emit();\r\n\r\n this.setMappingsOnAllResources();\r\n\r\n this.groupService.saveGroup(this.changedGroup).pipe(untilDestroyed(this)).subscribe({\r\n next: group => this.group = this.changedGroup = group,\r\n complete: () => {\r\n this.groupSaved.emit(this.group);\r\n }\r\n })\r\n }\r\n\r\n onCreateNewGroup(group: IGroup): void {\r\n this.newGroup.emit(group);\r\n }\r\n\r\n deleteGroup(confirm: boolean): void {\r\n if (!confirm) {\r\n return;\r\n }\r\n\r\n this.savingGroup.emit();\r\n\r\n this.groupService.deleteGroup(this.group).pipe(untilDestroyed(this)).subscribe({\r\n complete: () => {\r\n this.groupDeleted.emit(this.group);\r\n }\r\n });\r\n }\r\n\r\n onSelectedVehiclesChanged(vehicleIds: number[]): void {\r\n this.selectedVehicleIds = vehicleIds;\r\n this.checkDepotValidity();\r\n }\r\n\r\n onSelectedGeofencesChanged(geofenceIds: number[]): void {\r\n this.selectedGeofenceIds = geofenceIds;\r\n }\r\n\r\n onSelectedDriversChanged(driverIds: number[]): void {\r\n this.selectedDriverIds = driverIds;\r\n }\r\n\r\n checkDepotValidity(): void {\r\n const mappings = this.selectedVehicleIds.map(vehicleId => {\r\n return {\r\n OwnedByGroup: true,\r\n ResourceId: vehicleId,\r\n GroupId: this.group.Id,\r\n OwningGroupIds: []\r\n };\r\n })\r\n\r\n this.checkForExistingDepotVehicleAssignments(mappings);\r\n }\r\n\r\n //--\r\n\r\n private getResources(): void {\r\n forkJoin({\r\n drivers: from(this.driverService.getDrivers() as Promise),\r\n geofences: from(this.geofenceService.getGeofences() as Promise),\r\n vehicles: from(this.vehicleService.getVehiclesBasic() as Promise)\r\n }).pipe(untilDestroyed(this)).subscribe({\r\n next: data => {\r\n this.drivers = data.drivers;\r\n this.driverIds = this.drivers.map(d => d.Id);\r\n this.geofences = data.geofences;\r\n this.geofenceIds = this.geofences?.map(g => g.Id);\r\n this.vehicles = data.vehicles;\r\n this.vehicleIds = this.vehicles?.map(v => v.Id);\r\n this.checkVisibleResources();\r\n }\r\n })\r\n }\r\n\r\n private setMappings(resourceType: ResourceType, resourceIds: number[]): void {\r\n const propertyName = `Group${ResourceType[resourceType]}Mappings`;\r\n const propertyIdsName = `${ResourceType[resourceType]}Ids`;\r\n\r\n resourceIds.forEach(rId => {\r\n const existingMapping: IGroupMapping = this.changedGroup[propertyName].find((mapping: IGroupMapping) => {\r\n return mapping.ResourceId === rId;\r\n })\r\n\r\n if (!existingMapping) {\r\n const newMapping: IGroupMapping = {\r\n OwnedByGroup: true,\r\n ResourceId: rId,\r\n GroupId: this.group.Id,\r\n OwningGroupIds: []\r\n };\r\n\r\n this.changedGroup[propertyName].push(newMapping);\r\n }\r\n else {\r\n existingMapping.OwnedByGroup = existingMapping.Count <= 1;\r\n }\r\n })\r\n\r\n this.changedGroup[propertyIdsName] = resourceIds;\r\n\r\n this.changedGroup[propertyName] = this.changedGroup[propertyName].filter((mapping: IGroupMapping) => {\r\n if (this.resourceIsHiddenFromUser(mapping.ResourceId, resourceType)) {\r\n return true;\r\n }\r\n\r\n return resourceIds.includes(mapping.ResourceId);\r\n });\r\n }\r\n\r\n private resourceIsHiddenFromUser(resourceId: number, resourceType: ResourceType): boolean {\r\n switch (resourceType) {\r\n case ResourceType.Vehicle:\r\n return !this.vehicleIds?.includes(resourceId);\r\n case ResourceType.Driver:\r\n return !this.driverIds?.includes(resourceId);\r\n case ResourceType.Geofence:\r\n return !this.geofenceIds?.includes(resourceId);\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n private checkVisibleResources(): void {\r\n this.hiddenVehiclesCount = this.groupService.countResourceTotals(this.group, \"GroupVehicleMappings\") - this.vehicleIds.length;\r\n this.hiddenDriversCount = this.groupService.countResourceTotals(this.group, \"GroupDriverMappings\") - this.driverIds.length;\r\n this.hiddenGeofencesCount = this.groupService.countResourceTotals(this.group, \"GroupGeofenceMappings\") - this.geofenceIds.length;\r\n }\r\n\r\n\r\n private setMappingsOnAllResources(): void {\r\n this.setMappings(ResourceType.Vehicle, this.selectedVehicleIds);\r\n this.setMappings(ResourceType.Driver, this.selectedDriverIds);\r\n this.setMappings(ResourceType.Geofence, this.selectedGeofenceIds);\r\n }\r\n\r\n private getDepots(): IGroup[] {\r\n return this.groups.filter(groupToFilter => {\r\n return groupToFilter.IsDepot &&\r\n groupToFilter.Id !== this.group.Id &&\r\n groupToFilter.Id !== this.group.parent?.Id;\r\n });\r\n }\r\n\r\n private checkForExistingDepotVehicleAssignments(mappings: IGroupMapping[] = this.group.GroupVehicleMappings): void {\r\n this.existingDepotVehicleMatchesFound = false;\r\n\r\n if (!this.changedGroup.IsDepot) {\r\n return;\r\n }\r\n\r\n if (!mappings?.length) {\r\n return;\r\n }\r\n\r\n const depots: IGroup[] = this.getDepots();\r\n\r\n if (!depots?.length) {\r\n return;\r\n }\r\n\r\n const allExistingVehicleMatchMappings: IGroupMapping[] = [];\r\n\r\n depots.forEach(depot => {\r\n const existingDepotVehicleIds: number[] = depot[\"VehicleIds\"];\r\n const existingVehicleMatchMappings: IGroupMapping[] = mappings.filter(mapping => {\r\n return !!existingDepotVehicleIds.find(existingDepotVehicleId => existingDepotVehicleId === mapping.ResourceId)\r\n });\r\n\r\n if (!existingVehicleMatchMappings?.length) {\r\n return;\r\n }\r\n\r\n allExistingVehicleMatchMappings.push(...existingVehicleMatchMappings);\r\n\r\n });\r\n\r\n if (!allExistingVehicleMatchMappings?.length) {\r\n return;\r\n }\r\n\r\n allExistingVehicleMatchMappings.forEach(mapping => {\r\n const indexOfMapping = mappings.indexOf(mapping);\r\n\r\n if (indexOfMapping === -1) {\r\n return;\r\n }\r\n\r\n this.existingDepotVehicleMatchesFound = true;\r\n });\r\n }\r\n\r\n}\r\n","import { Component, EventEmitter, HostBinding, Input, OnChanges, Output, SimpleChanges } from \"@angular/core\";\r\nimport { IAggregateFilterEvent, IFilterBarTab } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { FilterBarService } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.service\";\r\nimport { IDriver } from \"@interfaces/IDriver\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { IGroup } from \"@interfaces/IVehicleGroup\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { DriverService } from \"@services/driver.service\";\r\nimport { GroupService } from \"@services/groups/group.service\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport \"./group-hierarchy.component.scss\";\r\n\r\ninterface INestedGroup extends IGroup {\r\n open?: boolean;\r\n hide?: boolean;\r\n nestCount?: number;\r\n nestSpacers?: boolean[];\r\n}\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: \"group-hierarchy2\",\r\n template: require(\"./group-hierarchy.component.html\")\r\n})\r\nexport class GroupHierarchyComponent2 implements OnChanges {\r\n\r\n @Input() selectedGroup: INestedGroup;\r\n @Input() groups: INestedGroup[];\r\n @Input() searchString: string;\r\n\r\n @Input() autoLoadGroups = false;\r\n @Input() showCounts = false;\r\n @Input() multiSelect: boolean;\r\n\r\n @Input() showFilter: boolean;\r\n\r\n\r\n @HostBinding(\"class.readonly\") @Input() readOnly = false;\r\n\r\n @Output() groupSelected = new EventEmitter();\r\n @Output() groupsReady = new EventEmitter();\r\n\r\n // ---\r\n\r\n loading = false;\r\n\r\n parentGroups: INestedGroup[];\r\n displayGroups: INestedGroup[];\r\n filterTabs: IFilterBarTab[];\r\n\r\n constructor(\r\n private readonly filterBarService: FilterBarService,\r\n private readonly groupService: GroupService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly driverService: DriverService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.createTabs();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['groups']) {\r\n this.processGroups();\r\n }\r\n \r\n if (this.autoLoadGroups && !this.searchString) {\r\n\r\n this.loadGroups();\r\n }\r\n\r\n if (changes[\"searchString\"]) {\r\n this.search();\r\n }\r\n }\r\n\r\n onGroupClick(group: IGroup) {\r\n\r\n if (this.multiSelect) {\r\n this.setGroupSelectionStatus(group, !group.selected);\r\n return;\r\n }\r\n\r\n this.groupSelected.emit(group);\r\n\r\n this.selectedGroup = group;\r\n }\r\n\r\n onFilterChanged(filterEvent: IAggregateFilterEvent) {\r\n if (!this.groups) {\r\n return;\r\n }\r\n\r\n this.setFilteredDisplayGroups(filterEvent.filteredData);\r\n }\r\n\r\n groupSearchPredicate(g: IGroup, text: string): boolean {\r\n return g.Name.toLocaleLowerCase().indexOf(text) >= 0;\r\n }\r\n\r\n // ---\r\n\r\n private loadGroups() {\r\n\r\n this.loading = true;\r\n\r\n this.groupService.getGroupsWithMappings().pipe(untilDestroyed(this)).subscribe({\r\n next: groups => {\r\n this.groups = groups;\r\n this.processGroups();\r\n this.loading = false;\r\n this.groupsReady.emit(this.groups);\r\n }\r\n });\r\n }\r\n\r\n private processGroups() {\r\n if (!this.groups) {\r\n return;\r\n }\r\n \r\n this.createGroupHierarchy();\r\n this.updateDisplayGroups();\r\n this.calculateGroupResourceTotals();\r\n }\r\n\r\n private createGroupHierarchy() {\r\n // Create parent list\r\n this.parentGroups = [];\r\n\r\n if (this.groups) {\r\n this.groups.forEach(group => {\r\n // Note that if we are displaying a sub group, the parents may be attached but not visible in our current list\r\n // To fix this we try to find the parent in our list, if it doesnt exist we assume its a parent\r\n var hasParent = false;\r\n\r\n if (group.parent != null) {\r\n const foundGroup = this.groupService.findGroup(this.groups, group.ParentId);\r\n hasParent = foundGroup != null;\r\n }\r\n\r\n if (!hasParent) {\r\n this.parentGroups.push(group);\r\n }\r\n\r\n });\r\n }\r\n }\r\n\r\n private updateDisplayGroups() {\r\n this.displayGroups = [];\r\n\r\n if (!this.groups) {\r\n return;\r\n }\r\n\r\n this.displayGroups = this.parentGroups;\r\n }\r\n\r\n private flattenGroups(groups: INestedGroup[], parentGroup: INestedGroup = null, nesting = 0): INestedGroup[] {\r\n var flattenedGroups: INestedGroup[] = [];\r\n\r\n if (!groups) {\r\n return flattenedGroups;\r\n }\r\n\r\n groups.forEach((group, i) => {\r\n if (group.hide) {\r\n return;\r\n }\r\n\r\n flattenedGroups.push(group);\r\n\r\n group.nestCount = nesting;\r\n group.nestSpacers = [];\r\n\r\n var groupHasChildrenAndSibling = group.children && group.children.length && i < groups.length - 1;\r\n\r\n if (parentGroup) {\r\n group.nestSpacers = Array.from(parentGroup.nestSpacers);\r\n group.nestSpacers.push(groupHasChildrenAndSibling);\r\n }\r\n\r\n var childGroups = this.flattenGroups(group.children, group, nesting + 1);\r\n\r\n flattenedGroups = flattenedGroups.concat(childGroups);\r\n });\r\n\r\n return flattenedGroups;\r\n }\r\n\r\n private calculateGroupResourceTotals() {\r\n if (!this.groups) {\r\n return;\r\n }\r\n\r\n this.groups.forEach(group => {\r\n group.totalVehicles = this.groupService.countResourceTotals(group, \"GroupVehicleMappings\");\r\n group.totalDrivers = this.groupService.countResourceTotals(group, \"GroupDriverMappings\");\r\n group.totalGeofences = this.groupService.countResourceTotals(group, \"GroupGeofenceMappings\");\r\n });\r\n }\r\n\r\n private search() {\r\n if (!this.groups?.length) {\r\n return;\r\n }\r\n\r\n if (!this.searchString) {\r\n this.showAllGroups();\r\n this.updateDisplayGroups();\r\n return;\r\n }\r\n\r\n // Reset visibility & parent status\r\n this.groups.forEach(group => {\r\n group.hide = false;\r\n });\r\n\r\n var lcSearchString = this.searchString.toLocaleLowerCase();\r\n\r\n this.groups.forEach(group => {\r\n\r\n if (!this.doesGroupNameContainSearchParameter(group, lcSearchString)) {\r\n group.hide = true;\r\n }\r\n });\r\n }\r\n private setFilteredDisplayGroups(filteredGroups: IGroup[]): void {\r\n if (!filteredGroups) {\r\n return;\r\n }\r\n\r\n const displayedParents = filteredGroups.filter(group => !group.ParentId);\r\n const displayedChildren = filteredGroups.filter(group => !!group.ParentId && !filteredGroups.find(g => g.Id == group.ParentId));\r\n\r\n this.displayGroups = [...displayedParents, ...displayedChildren];\r\n }\r\n\r\n \r\n private showAllGroups(): void {\r\n if (!this.groups?.length) {\r\n return;\r\n }\r\n\r\n this.groups.forEach(group => {\r\n group.hide = false;\r\n });\r\n }\r\n\r\n private doesGroupNameContainSearchParameter(group: INestedGroup, searchString: string, shallowCheck = false): boolean {\r\n group.open = true;\r\n\r\n if (group.Name.toLocaleLowerCase().includes(searchString)) {\r\n return true;\r\n }\r\n\r\n if (!shallowCheck) {\r\n // Now search children\r\n if (group.children) {\r\n for (var i = 0; i < group.children.length; i++) {\r\n const childGroup = group.children[i];\r\n\r\n if (this.doesGroupNameContainSearchParameter(childGroup, searchString)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n // Also search parents\r\n if (group.parent && this.doesGroupNameContainSearchParameter(group.parent, searchString, true)) {\r\n return true;\r\n }\r\n }\r\n\r\n group.open = false;\r\n return false;\r\n }\r\n\r\n private setGroupSelectionStatus(group: INestedGroup, targetState: boolean) {\r\n\r\n // As our state is hierarchical, we cannot set a sub group to NOT be included when a high level group is\r\n group.selected = group.parent?.selected || targetState;\r\n\r\n // Ensure all references have same status\r\n var otherGroupReference = this.groupService.findGroup(this.groups, group.Id) as INestedGroup;\r\n if (otherGroupReference) {\r\n otherGroupReference.selected = targetState;\r\n }\r\n\r\n this.groupSelected.emit(group);\r\n\r\n if (group.children) {\r\n group.children.forEach(child => {\r\n this.setGroupSelectionStatus(child, targetState);\r\n });\r\n }\r\n }\r\n \r\n private createTabs(): void {\r\n this.filterTabs = [];\r\n\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"Common.All\", (group) => true));\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"groups.Depots\", (group) => group.IsDepot));\r\n }\r\n}\r\n","import { Component, ViewChild } from \"@angular/core\";\r\nimport { IGroup } from \"@app/interfaces/IVehicleGroup\";\r\nimport { GroupService } from \"@app/services/groups/group.service\";\r\nimport { ResponsiveService } from \"@app/services/responsive.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { Subscription } from \"rxjs\";\r\nimport { GroupEditorComponent } from \"../group-editor/group-editor.component\";\r\nimport './groups-list.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'groups-list',\r\n template: require('./groups-list.component.html')\r\n})\r\nexport class GroupsListComponent {\r\n groups: IGroup[];\r\n\r\n @ViewChild(GroupEditorComponent) groupEditor: GroupEditorComponent;\r\n\r\n selectedGroup: IGroup;\r\n\r\n showSidebar: boolean;\r\n loading: boolean;\r\n savingGroup: boolean;\r\n\r\n groupSubscription: Subscription;\r\n\r\n constructor(\r\n private readonly groupService: GroupService,\r\n private readonly responsiveService: ResponsiveService,\r\n private readonly translationService: TranslationService) { }\r\n\r\n ngOnInit(): void {\r\n this.getData();\r\n this.determineScreenWidth()\r\n }\r\n\r\n onGroupSelected(group: IGroup): void {\r\n if (this.selectedGroup && this.groupEditor?.formIsDirty && !window.confirm(this.translationService.t('groupList.ConfirmCancel'))) {\r\n return;\r\n }\r\n\r\n this.clearSelectedGroup();\r\n\r\n setTimeout(() => {\r\n this.selectedGroup = group;\r\n this.getGroupCounts(this.selectedGroup);\r\n })\r\n\r\n }\r\n\r\n clearSelectedGroup(): void {\r\n this.selectedGroup = null;\r\n }\r\n\r\n onNewGroupCreated(group: IGroup): void {\r\n this.clearSelectedGroup();\r\n this.selectedGroup = group;\r\n }\r\n\r\n addNewGroup(): void {\r\n const group: IGroup = {\r\n Id: -1,\r\n Name: \"\",\r\n AccountId: -1,\r\n DriverIds: [],\r\n totalDrivers: 0,\r\n VehicleIds: [],\r\n totalVehicles: 0,\r\n GeofenceIds: [],\r\n totalGeofences: 0,\r\n UserIds: [],\r\n totalUsers: 0,\r\n GroupDriverMappings: [],\r\n GroupVehicleMappings: [],\r\n GroupGeofenceMappings: []\r\n };\r\n\r\n this.selectedGroup = group;\r\n }\r\n\r\n onSavingGroup(): void {\r\n this.groupSubscription.unsubscribe();\r\n this.savingGroup = true;\r\n\r\n }\r\n\r\n onGroupSaved(): void {\r\n setTimeout(() => {\r\n this.getData(true, false);\r\n }, 2000)\r\n }\r\n\r\n //--\r\n\r\n private getData(invalidateCache = false, showLoading = true): void {\r\n this.loading = showLoading;\r\n\r\n this.groupSubscription = this.groupService.getGroupsWithMappings(invalidateCache).pipe(untilDestroyed(this)).subscribe({\r\n next: groups => {\r\n this.groups = groups;\r\n this.loading = false;\r\n this.savingGroup = false;\r\n this.clearSelectedGroup();\r\n }\r\n })\r\n }\r\n\r\n private getGroupCounts(group: IGroup): void {\r\n group.totalDrivers = this.groupService.countResourceTotals(group, \"GroupDriverMappings\");\r\n group.totalVehicles = this.groupService.countResourceTotals(group, \"GroupVehicleMappings\");\r\n group.totalGeofences = this.groupService.countResourceTotals(group, \"GroupGeofenceMappings\");\r\n }\r\n\r\n private determineScreenWidth(): void {\r\n this.responsiveService.currentWindowWidth$.pipe(untilDestroyed(this)).subscribe({\r\n next: width => this.showSidebar = width < 1100\r\n })\r\n }\r\n}\r\n","import { Component, EventEmitter, OnInit, Output } from \"@angular/core\";\r\nimport { FormControl, FormGroup, Validators } from \"@angular/forms\";\r\nimport { CustomFormValidators } from \"@app/directives/_forms/form-validation.service\";\r\nimport { IRadioButtonCard } from \"@app/directives/_forms/_radio-buttons/radio-button-cards/radio-button-cards.component\";\r\nimport { ISamlConfiguration, SamlConfigurationStatus, SamlConfigurationVerificationStatus, SamlService } from \"@app/services/saml.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport \"./saml-configuration.component.scss\";\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: \"saml-configuration\",\r\n template: require(\"./saml-configuration.component.html\")\r\n})\r\nexport class SamlConfigurationComponent implements OnInit {\r\n\r\n @Output() onClose = new EventEmitter();\r\n\r\n // ---\r\n\r\n loading = false;\r\n saving = false;\r\n verificationCheckLoading = false;\r\n\r\n configuration: ISamlConfiguration = {} as any;\r\n configurationForm: FormGroup;\r\n\r\n ssoEnforcementSettings: IRadioButtonCard[];\r\n SamlConfigurationVerificationStatus = SamlConfigurationVerificationStatus;\r\n\r\n constructor(\r\n private readonly samlService: SamlService,\r\n private readonly translationService: TranslationService) {\r\n }\r\n\r\n ngOnInit() {\r\n this.loadConfigData();\r\n }\r\n\r\n validateTxtRecord() {\r\n this.verificationCheckLoading = true;\r\n\r\n this.samlService.validateTXTRecord(this.configuration.Domain).pipe(untilDestroyed(this))\r\n .subscribe({\r\n next: () => {\r\n this.configuration.VerificationStatus = SamlConfigurationVerificationStatus.Verified;\r\n },\r\n error: () => this.configuration.VerificationStatus = SamlConfigurationVerificationStatus.Requested,\r\n complete: () => this.verificationCheckLoading = false\r\n });\r\n }\r\n\r\n save() {\r\n this.saving = true;\r\n\r\n this.configuration.Domain = this.configurationForm.get(\"Domain\").value;\r\n this.configuration.EntityId = this.configurationForm.get(\"EntityId\").value;\r\n this.configuration.Endpoint = this.configurationForm.get(\"Endpoint\").value;\r\n this.configuration.Certificate = this.configurationForm.get(\"Certificate\").value;\r\n this.configuration.Status = this.configurationForm.get(\"SSOEnforcementSettings\").value;\r\n\r\n this.samlService.saveConfiguration(this.configuration).pipe(untilDestroyed(this))\r\n .subscribe({\r\n complete: () => {\r\n this.saving = false;\r\n this.closeEditor();\r\n\r\n setTimeout(() => {\r\n this.loadConfigData();\r\n }, 500);\r\n }\r\n });\r\n }\r\n\r\n closeEditor(): void {\r\n this.onClose.emit();\r\n }\r\n\r\n // ---\r\n\r\n private loadConfigData() {\r\n this.loading = true;\r\n\r\n this.samlService.getConfiguration()\r\n .pipe(untilDestroyed(this))\r\n .subscribe({\r\n next: data => {\r\n this.configuration = data;\r\n },\r\n complete: () => {\r\n this.loading = false;\r\n\r\n this.configuration = this.configuration || {} as any;\r\n\r\n this.createFormGroup();\r\n }\r\n });\r\n }\r\n\r\n private createFormGroup() {\r\n if (this.configurationForm) {\r\n return;\r\n }\r\n\r\n this.createRadioButtons();\r\n const selectedEnforcementSetting = this.ssoEnforcementSettings.find(s => s.value == this.configuration.Status) || this.ssoEnforcementSettings[0];\r\n\r\n this.configurationForm = new FormGroup({\r\n \"Domain\": new FormControl(this.configuration.Domain || \"\", [Validators.required, CustomFormValidators.emptyWhiteSpace]),\r\n \"EntityId\": new FormControl(this.configuration.EntityId || \"\", [Validators.required, CustomFormValidators.emptyWhiteSpace]),\r\n \"Endpoint\": new FormControl(this.configuration.Endpoint || \"\", [Validators.required, CustomFormValidators.emptyWhiteSpace]),\r\n \"Certificate\": new FormControl(this.configuration.Certificate || \"\", [Validators.required, CustomFormValidators.emptyWhiteSpace]),\r\n\r\n \"SSOEnforcementSettings\": new FormControl(selectedEnforcementSetting, [Validators.required])\r\n });\r\n }\r\n\r\n private createRadioButtons() {\r\n\r\n this.ssoEnforcementSettings = [\r\n { label: this.translationService.t(\"Common.Disabled\"), description: this.translationService.t(\"SamlConfig.DisabledMessage\"), value: SamlConfigurationStatus.Inactive },\r\n { label: this.translationService.t(\"SamlConfig.Hybrid\"), description: this.translationService.t(\"SamlConfig.HybridDescription\"), value: SamlConfigurationStatus.Testing, disabled: this.configuration.VerificationStatus != SamlConfigurationVerificationStatus.Verified },\r\n { label: this.translationService.t(\"SamlConfig.Enforced\"), description: this.translationService.t(\"SamlConfig.EnforcedDescription\"), value: SamlConfigurationStatus.Active, disabled: this.configuration.VerificationStatus != SamlConfigurationVerificationStatus.Verified },\r\n ];\r\n }\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { SettingsName } from \"@app/class/SettingsName\";\r\nimport { IAccountUserMapping } from \"@app/interfaces/IUser\";\r\nimport { Observable } from \"rxjs\";\r\nimport { map } from \"rxjs/operators\";\r\nimport { IAccountUserMappingUpdate } from \"./accountUserMapping.service.ajs\";\r\nimport { ConstantsService } from \"./constantsService\";\r\nimport { SessionService } from \"./session.service\";\r\nimport { TranslationService } from \"./translation.service\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AccountUserMappingService {\r\n isDemoSite: boolean;\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly constantsService: ConstantsService,\r\n private readonly sessionService: SessionService,\r\n private readonly translationService: TranslationService\r\n ) {\r\n this.isDemoSite = this.constantsService.getIsDemoSite();\r\n }\r\n\r\n getAccountUserMappings(): Observable {\r\n return this.http.get(`/api/userAccountMappings`)\r\n .pipe(map(mappings => {\r\n return this.formatMappings(mappings);\r\n }))\r\n }\r\n\r\n getAccountUserMappingsForAccount(accountId: number): Observable {\r\n return this.http.get(`/api/userAccountMappings/${accountId}`)\r\n .pipe(map(mappings => {\r\n return this.formatMappings(mappings);\r\n }))\r\n }\r\n\r\n getCurrentAccountUserMappings(): Observable {\r\n return this.http.get(`/api/userAccountMappings/current`)\r\n .pipe(map(mappings => {\r\n return this.formatMappings(mappings);\r\n }))\r\n }\r\n\r\n postAccountUserMapping(email: string, accountUserMapping: IAccountUserMapping, userLanguage: string = \"en\"): Observable {\r\n let mapping = accountUserMapping as IAccountUserMappingUpdate;\r\n mapping.Email = email;\r\n\r\n return this.http.post(`/api/userAccountMappings/`, mapping, { params: { userLanguage } });\r\n }\r\n\r\n hasCachedAccountUserMappings(): boolean {\r\n return this.sessionService.getItem(SettingsName.AccountUserMappings)?.length > 0;\r\n }\r\n\r\n updateCachedAccountUserMapping(userId: number, replacementMapping: IAccountUserMapping): boolean {\r\n if (!this.hasCachedAccountUserMappings()) {\r\n return false;\r\n }\r\n\r\n const cachedAccountUserMappings: IAccountUserMapping[] = { ...this.sessionService.getItem(SettingsName.AccountUserMappings) };\r\n const currentAccountUserMappingIndex = cachedAccountUserMappings.findIndex(mapping => mapping.UserId === userId);\r\n\r\n if (currentAccountUserMappingIndex === -1) {\r\n return false;\r\n }\r\n\r\n cachedAccountUserMappings[currentAccountUserMappingIndex] = replacementMapping;\r\n\r\n this.sessionService.setItem(SettingsName.AccountUserMappings, cachedAccountUserMappings);\r\n }\r\n //--\r\n\r\n private formatMappings(mappings: IAccountUserMapping[]): IAccountUserMapping[] {\r\n\r\n if (this.isDemoSite) {\r\n mappings.forEach(mapping => {\r\n mapping.Name = this.translationService.t('currentUserService.demo');\r\n })\r\n }\r\n\r\n return mappings;\r\n }\r\n}\r\n","import { Component, Input, OnInit, Output, EventEmitter } from \"@angular/core\";\r\nimport { IVListRow } from \"@directives/_veri/v-list/v-list.component\";\r\nimport { IZone, IZoneWithProbes } from \"@temperature/_models/temperature/ITemperatureZone\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport './temperature-zones-edit.component.scss';\r\nimport { ZoneService } from \"@temperature/_services/zone.service\";\r\nimport { ZoneStatus } from \"@temperature/_enums/temperature/ZoneStatus.enum\";\r\nimport { ZoneCreationSource } from \"@temperature/_enums/temperature/ZoneCreationSource.enum\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport { lastValueFrom } from \"rxjs\";\r\n\r\n@Component({\r\n template: require(\"./temperature-zones-edit.component.html\"),\r\n selector: 'temperature-zones-edit'\r\n})\r\nexport class TemperatureZonesComponent implements OnInit {\r\n\r\n loading = false;\r\n\r\n resolutionCodeText: string;\r\n editMode = false;\r\n\r\n\r\n @Input() zones: IZoneWithProbes[];\r\n\r\n @Input() vehicle: IVehicle;\r\n\r\n zoneList: IVListRow[];\r\n\r\n selectedZone: IZoneWithProbes;\r\n\r\n\r\n constructor(\r\n\r\n private readonly zoneService: ZoneService,\r\n private readonly vehicleService: VehicleService,\r\n ) {\r\n\r\n }\r\n\r\n ngOnInit(): void {\r\n this.prepareList();\r\n }\r\n\r\n\r\n addOrUpdateZone() {\r\n this.loading = true;\r\n lastValueFrom(this.zoneService.saveTemperatureZone(this.selectedZone)).then(zone => {\r\n lastValueFrom(this.zoneService.getZones({ VehicleId: this.vehicle.Id, Status: ZoneStatus.Active, invalidateCache: false })).then(zones => {\r\n this.zones = zones;\r\n this.zoneService.mapProbesToZone(this.zones, this.vehicle.probes);\r\n this.prepareList();\r\n\r\n this.loading = false;\r\n })\r\n })\r\n }\r\n\r\n listItemSelected(listItem: IVListRow) {\r\n this.selectedZone = listItem.data;\r\n this.resolutionCodeText = listItem.data.Name;\r\n this.editMode = true;\r\n }\r\n\r\n cancelEditMode() {\r\n this.editMode = false;\r\n this.selectedZone = {\r\n Id: null,\r\n Name: '',\r\n VehicleId: this.vehicle.Id,\r\n Position: null,\r\n CreatedTime: null,\r\n UpdatedTime: null,\r\n Status: ZoneStatus.Active,\r\n Source: ZoneCreationSource.User\r\n }\r\n }\r\n\r\n deactivateZone(confirmation: boolean) {\r\n if (!confirmation) {\r\n return;\r\n }\r\n this.selectedZone.Status = ZoneStatus.Inactive;\r\n\r\n let promises: angular.IPromise[] = [];\r\n\r\n this.vehicle.probes.forEach(probe => {\r\n\r\n if (probe.ZoneId == this.selectedZone.Id) {\r\n probe.ZoneId = null;\r\n probe.ZonePosition = null;\r\n }\r\n promises.push(this.vehicleService.updateVehicleProbe(probe, true));\r\n });\r\n\r\n Promise.all(promises)\r\n .then(() => {\r\n this.addOrUpdateZone();\r\n })\r\n .finally(() => {\r\n this.loading = false;\r\n });\r\n\r\n }\r\n\r\n private prepareList() {\r\n\r\n this.selectedZone = {\r\n Id: null,\r\n Name: '',\r\n VehicleId: this.vehicle.Id,\r\n Position: null,\r\n CreatedTime: null,\r\n UpdatedTime: null,\r\n Status: ZoneStatus.Active,\r\n Source: ZoneCreationSource.User\r\n }\r\n\r\n this.zoneList = [];\r\n\r\n this.zones.forEach(zone => {\r\n\r\n zone.Name = zone.Name ?? \"Zone \" + zone.Position;\r\n\r\n this.zoneList.push({\r\n data: zone,\r\n id: zone.Id,\r\n searchString: zone.Name ,\r\n sortData: zone.Name,\r\n contents: zone.Name\r\n\r\n })\r\n\r\n })\r\n\r\n }\r\n\r\n\r\n\r\n}\r\n","import { ChangeDetectorRef, Component, OnInit } from \"@angular/core\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { IAggregateFilterEvent, IFilterBarTab } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { FilterBarService } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.service\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { FoundationNavigationModule } from \"@app/main/modules/foundation/foundation.navigation\";\r\nimport { CalcType, FtCloudConfigExceptionError } from \"@app/main/modules/foundation/_enums/camera-configs/CameraConfigEnums\";\r\nimport { IAccountGroupConfigDto, ICameraDeviceParameterRecord } from \"@app/main/modules/foundation/_models/_camera-configs/CameraConfigModels\";\r\nimport { AccountService } from \"@app/main/modules/foundation/_services/account.service\";\r\nimport { ConfigAccountGroupService } from \"@app/main/modules/foundation/_services/config-account-group.service\";\r\nimport { IAccount } from \"@app/services/account.service\";\r\nimport { IStreamaxCameraProfile, StreamaxCameraProfileService } from \"@app/services/camera/streamax-camera-profile-service\";\r\nimport { NavigationService } from \"@app/services/navigation.service\";\r\nimport { PreferencesService } from \"@app/services/preferences.service\";\r\nimport { ITimeZoneInfo } from \"@app/userPreferences/model/ITimeZoneInfo\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { combineLatest, EMPTY, from } from \"rxjs\";\r\nimport { catchError, tap } from \"rxjs/operators\";\r\nimport './streamax-configs-account-list.component.scss';\r\nimport { StreamaxConfigsPercentageBarService } from \"./streamax-configs-percentage-bar.service\";\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'streamax-configs-account-list',\r\n template: require('./streamax-configs-account-list.component.html')\r\n})\r\nexport class StreamaxConfigsAccountListComponent implements OnInit {\r\n\r\n accountGroupConfigs: IAccountGroupConfigDto[];\r\n\r\n selectedAccountConfig: IAccountGroupConfigDto;\r\n selectedAccountName: string;\r\n selectedAccountProfile: IStreamaxCameraProfile;\r\n filteredRecords: IAccountGroupConfigDto[];\r\n\r\n accounts: Map;\r\n accountsList: IAccount[];\r\n accountsWithProfile: number[];\r\n\r\n profilesList: IStreamaxCameraProfile[];\r\n\r\n vehiclesList: IVehicle[];\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n loading: boolean = false;\r\n\r\n showAccountDrilldownView: boolean = false\r\n showProfileEditor: boolean = false;\r\n\r\n timezones: ITimeZoneInfo[];\r\n\r\n profileIsSaveable: boolean = false;\r\n\r\n filterTabs: IFilterBarTab[];\r\n filterEvent: IAggregateFilterEvent;\r\n\r\n get getErrorMax(): number {\r\n return Object.keys(FtCloudConfigExceptionError).filter(key => isNaN(Number(key))).length;\r\n }\r\n\r\n constructor(\r\n private readonly filterBarService: FilterBarService,\r\n private readonly accountService: AccountService,\r\n private readonly streamaxCameraProfileService: StreamaxCameraProfileService,\r\n private readonly vTableService: VTableService,\r\n private readonly cd: ChangeDetectorRef,\r\n private readonly navigationService: NavigationService,\r\n private readonly configAccountGroupService: ConfigAccountGroupService,\r\n private readonly preferencesService: PreferencesService,\r\n private readonly percentageBarService: StreamaxConfigsPercentageBarService) \r\n { }\r\n\r\n ngOnInit(): void {\r\n this.createTabs();\r\n this.loadData();\r\n }\r\n\r\n rowClicked($event: any): void {\r\n this.navigationService.updateBreadcrumbNameResolver({\r\n configAccountBreadcrumbKey: this.accountsList.find(a => a.Id == $event.data.AccountId).CompanyName,\r\n });\r\n\r\n this.navigationService.go(FoundationNavigationModule.StreamaxConfigsAccountView, { accountId: $event.data.AccountId })\r\n }\r\n\r\n backToAccountView(): void {\r\n this.selectedAccountConfig = null;\r\n this.showAccountDrilldownView = false;\r\n this.selectedAccountName = null;\r\n this.cd.detectChanges();\r\n }\r\n\r\n toggleNewAccountProfileEditor(): void {\r\n this.showProfileEditor = !this.showProfileEditor;\r\n }\r\n\r\n filterCameraByAccount(record: ICameraDeviceParameterRecord, account: IAccount): boolean {\r\n return record.vehicle?.AccountId === account.Id;\r\n }\r\n\r\n accountSearchPredicate(account: IAccount, searchText: string): boolean {\r\n return account.CompanyName.toLowerCase().indexOf(searchText.toLowerCase()) >= 0;\r\n }\r\n\r\n profileIsInSavableState($event: boolean): void {\r\n this.profileIsSaveable = $event\r\n\r\n this.cd.detectChanges();\r\n }\r\n\r\n addNewAccountProfile(newProfile: IStreamaxCameraProfile): void {\r\n const newAccountGroup = {\r\n Id: newProfile.AccountId,\r\n AccountId: newProfile.AccountId,\r\n PeripheralWithConfigRecord: [],\r\n CombinedErrors: 0\r\n }\r\n \r\n this.accountGroupConfigs = [\r\n ...this.accountGroupConfigs, newAccountGroup\r\n ]\r\n \r\n this.streamaxCameraProfileService.updateProfileToCache(newProfile);\r\n\r\n this.showProfileEditor = !this.showProfileEditor;\r\n }\r\n\r\n onFilterChanged($event: any): void {\r\n\r\n if (!$event.trigger) {\r\n return;\r\n }\r\n\r\n this.filterEvent = $event;\r\n\r\n this.filteredRecords = this.filterEvent.filteredData;\r\n }\r\n\r\n private loadData(): void {\r\n this.createTable();\r\n this.loading = true;\r\n\r\n combineLatest([\r\n this.configAccountGroupService.getConfigAccountGroups(),\r\n this.accountService.getCustomerAccounts(),\r\n this.streamaxCameraProfileService.getProfiles(),\r\n from(this.preferencesService.getTimezones() as Promise)\r\n ])\r\n .pipe(\r\n untilDestroyed(this),\r\n tap(([accountGroups, accounts, profiles, timezones]) => {\r\n this.accounts = new Map(accounts.map(account => [account.Id, account]));\r\n this.accountsList = accounts;\r\n this.accountGroupConfigs = accountGroups;\r\n this.profilesList = profiles;\r\n this.timezones = timezones.filter(t => this.streamaxTimezoneValues.includes(t.Id));\r\n\r\n const nonAssociationProfiles = this.profilesList.filter(p => !this.accountGroupConfigs.some(a => a.AccountId === p.AccountId));\r\n\r\n nonAssociationProfiles.forEach(p => {\r\n this.accountGroupConfigs.push({\r\n Id: p.AccountId,\r\n AccountId: p.AccountId,\r\n PeripheralWithConfigRecord: [],\r\n CombinedErrors: 0\r\n })\r\n }); \r\n\r\n //this.accountsWithProfile = this.accountsList.filter(a => this.profilesList.some(p => p.AccountId === a.Id)).map(a => a.Id);;\r\n\r\n this.tableRows = this.vTableService.createTableRows(this.accountGroupConfigs, this.tableColumns);\r\n\r\n this.loading = false;\r\n }),\r\n catchError(err => {\r\n console.error('Error loading data:', err);\r\n this.loading = false;\r\n return EMPTY;\r\n })\r\n ).subscribe();\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Account\", width: 250, minTableWidth: 450 }),\r\n createCellFunction: (accountGroup) => this.vTableService.createTableCell(this.accounts.get(accountGroup.AccountId).CompanyName)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"StreamaxConfigs.ActiveSet\", width: 120 }),\r\n createCellFunction: (accountGroup) => this.vTableService.createTableCell(this.profilesList.find(p => p.AccountId === accountGroup.AccountId)?.IsActive)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"StreamaxConfigs.DevicesCount\", width: 120 }),\r\n createCellFunction: (accountGroup) => this.vTableService.createTableCell(accountGroup.PeripheralWithConfigRecord.length)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"StreamaxConfigs.ConfigsCollected\", sortable: false, excludeFromExport: true }),\r\n createCellFunction: (accountGroup) => this.vTableService.createPercentageBarCell(\r\n this.percentageBarService.getPercentageBarModel(accountGroup, CalcType.DeviceComms)\r\n )\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"StreamaxConfigs.TotalAlignedMetrics\", sortable: false, excludeFromExport: true }),\r\n createCellFunction: (accountGroup) => this.vTableService.createPercentageBarCell(\r\n this.percentageBarService.getPercentageBarModel(accountGroup, CalcType.TotalErrors)\r\n )\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"StreamaxConfigs.TotalAlignedDevices\", sortable: false, excludeFromExport: true }),\r\n createCellFunction: (accountGroup) => this.vTableService.createPercentageBarCell(\r\n this.percentageBarService.getPercentageBarModel(accountGroup, CalcType.TotalSync)\r\n )\r\n }\r\n ]\r\n }\r\n\r\n private createTabs(): void {\r\n this.filterTabs = [];\r\n\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"StreamaxConfigs.AllUnmatched\", this.IsUnmatchedPredicate));\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"StreamaxConfigs.PartialMatch\", this.isPartiallyMatchedPredicate));\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"StreamaxConfigs.Matching\", this.isMatchedPredicate));\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"StreamaxConfigs.NoAssociations\", this.isNoAssociationPredicate));\r\n }\r\n\r\n private IsUnmatchedPredicate = (dto: IAccountGroupConfigDto) => {\r\n if (!dto.PeripheralWithConfigRecord.length) {\r\n return false;\r\n }\r\n\r\n return !dto.PeripheralWithConfigRecord.some(p =>\r\n p.LatestRecord?.CameraDeviceParameterSettings?.ProfileExceptionErrors?.Errors !== undefined &&\r\n p.LatestRecord.CameraDeviceParameterSettings.ProfileExceptionErrors.Errors.length === 0\r\n );\r\n }\r\n\r\n private isPartiallyMatchedPredicate = (dto: IAccountGroupConfigDto) => {\r\n const records = dto.PeripheralWithConfigRecord;\r\n if (!records || records.length === 0) return false;\r\n\r\n // True if at least one record has the Errors array defined and empty.\r\n const hasEmpty = records.some(p =>\r\n p.LatestRecord?.CameraDeviceParameterSettings?.ProfileExceptionErrors?.Errors !== undefined &&\r\n p.LatestRecord.CameraDeviceParameterSettings.ProfileExceptionErrors.Errors.length === 0\r\n );\r\n\r\n // True if at least one record is NOT in that state (either Errors is undefined or non-empty)\r\n const hasNonEmpty = records.some(p =>\r\n !(\r\n p.LatestRecord?.CameraDeviceParameterSettings?.ProfileExceptionErrors?.Errors !== undefined &&\r\n p.LatestRecord.CameraDeviceParameterSettings.ProfileExceptionErrors.Errors.length === 0\r\n )\r\n );\r\n\r\n return hasEmpty && hasNonEmpty;\r\n }\r\n\r\n private isMatchedPredicate = (dto: IAccountGroupConfigDto) => {\r\n if (!dto.PeripheralWithConfigRecord.length) {\r\n return false;\r\n }\r\n\r\n return dto.PeripheralWithConfigRecord.length > 0 &&\r\n dto.PeripheralWithConfigRecord.every(p =>\r\n p.LatestRecord?.CameraDeviceParameterSettings?.ProfileExceptionErrors?.Errors !== undefined &&\r\n p.LatestRecord.CameraDeviceParameterSettings.ProfileExceptionErrors.Errors.length === 0\r\n );\r\n }\r\n\r\n private isNoAssociationPredicate = (record: IAccountGroupConfigDto) => {\r\n return !record.PeripheralWithConfigRecord.length;\r\n }\r\n\r\n streamaxTimezoneValues: string[] = [\r\n \"Dateline Standard Time\",\r\n \"UTC-11\",\r\n \"UTC-11\",\r\n \"Hawaiian Standard Time\",\r\n \"Alaskan Standard Time\",\r\n \"Pacific Standard Time\",\r\n \"Pacific Standard Time (Mexico)\",\r\n \"Mountain Standard Time (Mexico)\",\r\n \"Mountain Standard Time\",\r\n \"US Mountain Standard Time\",\r\n \"Central Standard Time (Mexico)\",\r\n \"Canada Central Standard Time\",\r\n \"Central Standard Time\",\r\n \"Central America Standard Time\",\r\n \"SA Pacific Standard Time\",\r\n \"Eastern Standard Time\",\r\n \"US Eastern Standard Time\",\r\n \"Venezuela Standard Time\",\r\n \"Atlantic Standard Time\",\r\n \"Central Brazilian Standard Time\",\r\n \"SA Western Standard Time\",\r\n \"Pacific SA Standard Time\",\r\n \"Paraguay Standard Time\",\r\n \"Newfoundland Standard Time\",\r\n \"E. South America Standard Time\",\r\n \"Argentina Standard Time\",\r\n \"Greenland Standard Time\",\r\n \"SA Eastern Standard Time\",\r\n \"Montevideo Standard Time\",\r\n \"UTC-02\",\r\n \"Mid-Atlantic Standard Time\",\r\n \"Cape Verde Standard Time\",\r\n \"Azores Standard Time\",\r\n \"GMT Standard Time\",\r\n \"Morocco Standard Time\",\r\n \"Greenwich Standard Time\",\r\n \"UTC\",\r\n \"W. Europe Standard Time\",\r\n \"Central Europe Standard Time\",\r\n \"Romance Standard Time\",\r\n \"Central European Standard Time\",\r\n \"W. Central Africa Standard Time\",\r\n \"Namibia Standard Time\",\r\n \"GTB Standard Time\",\r\n \"Middle East Standard Time\",\r\n \"Syria Standard Time\",\r\n \"South Africa Standard Time\",\r\n \"FLE Standard Time\",\r\n \"Egypt Standard Time\",\r\n \"E. Europe Standard Time\",\r\n \"GTB Standard Time\",\r\n \"Israel Standard Time\",\r\n \"Arabic Standard Time\",\r\n \"Arab Standard Time\",\r\n \"Russian Standard Time\",\r\n \"E. Africa Standard Time\",\r\n \"Iran Standard Time\",\r\n \"Arabian Standard Time\",\r\n \"Caucasus Standard Time\",\r\n \"Azerbaijan Standard Time\",\r\n \"Georgian Standard Time\",\r\n \"Mauritius Standard Time\",\r\n \"Afghanistan Standard Time\",\r\n \"West Asia Standard Time\",\r\n \"Ekaterinburg Standard Time\",\r\n \"Pakistan Standard Time\",\r\n \"India Standard Time\",\r\n \"Sri Lanka Standard Time\",\r\n \"Nepal Standard Time\",\r\n \"Central Asia Standard Time\",\r\n \"N. Central Asia Standard Time\",\r\n \"Myanmar Standard Time\",\r\n \"North Asia Standard Time\",\r\n \"SE Asia Standard Time\",\r\n \"China Standard Time\",\r\n \"Singapore Standard Time\",\r\n \"W. Australia Standard Time\",\r\n \"Taipei Standard Time\",\r\n \"Ulaanbaatar Standard Time\",\r\n \"North Asia East Standard Time\",\r\n \"Tokyo Standard Time\",\r\n \"Korea Standard Time\",\r\n \"Yakutsk Standard Time\",\r\n \"Cen. Australia Standard Time\",\r\n \"AUS Central Standard Time\",\r\n \"E. Australia Standard Time\",\r\n \"Vladivostok Standard Time\",\r\n \"West Pacific Standard Time\",\r\n \"Tasmania Standard Time\",\r\n \"AUS Eastern Standard Time\",\r\n \"Central Pacific Standard Time\",\r\n \"New Zealand Standard Time\",\r\n \"Fiji Standard Time\",\r\n \"UTC+12\",\r\n \"Tonga Standard Time\"\r\n ];\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { ProductVendor } from \"@app/main/components/videos/enums/CameraProductType\";\r\nimport { IAccountGroupConfigDto } from \"@app/main/modules/foundation/_models/_camera-configs/CameraConfigModels\";\r\nimport { PeripheralService } from \"@app/main/modules/foundation/_services/peripheral.service\";\r\nimport { DataCacheService } from \"@app/services/caching/data-cache.service\";\r\nimport { StreamaxCameraParametersService } from \"@app/services/camera/streamax-camera-parameters.service\";\r\nimport { untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { combineLatest, Observable } from \"rxjs\";\r\nimport { map } from \"rxjs/operators\";\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class ConfigAccountGroupService {\r\n\r\n private configAccountGroupCacheName: string = \"configAccountGroupCache\";\r\n constructor(\r\n private readonly dataCacheService: DataCacheService,\r\n private readonly peripheralService: PeripheralService,\r\n private readonly streamaxCameraParametersService: StreamaxCameraParametersService\r\n ) { }\r\n\r\n getConfigAccountGroups(invalidateCache: boolean = false): Observable {\r\n return this.dataCacheService.getOrRequest(this.configAccountGroupCacheName, () => this.createNewConfigAccountGroups(), { invalidateCache, keyName: \"AccountId\" });\r\n }\r\n \r\n private createNewConfigAccountGroups(): Observable {\r\n return combineLatest([\r\n this.streamaxCameraParametersService.getLatestParameterRecords(),\r\n this.peripheralService.getAllPeripheralsWithMappings()\r\n ]).pipe(\r\n untilDestroyed(this),\r\n map(([latestRecords, peripherals]) => {\r\n const usableLatest = latestRecords.filter(r => !!r.CameraDeviceParameterSettings.ProfileExceptionErrors);\r\n const streamaxPeripherals = peripherals.filter(p => p.Product.GroupId === ProductVendor.Streamax);\r\n\r\n const accountPeripheralGroups = this.groupByAccountId(streamaxPeripherals, 'vehicleMapping.vehicle.AccountId');\r\n const accountRecordGroups = this.groupByAccountId(usableLatest, 'AccountId');\r\n\r\n // Map peripherals to records for each account\r\n return Object.keys(accountPeripheralGroups).map(accountId => {\r\n const peripheralWithConfigRecord = accountPeripheralGroups[accountId].map(peripheral => {\r\n const latestRecord = accountRecordGroups[accountId]?.find(\r\n record => record.Serial === peripheral.Serial\r\n ) || null;\r\n\r\n return {\r\n Id: peripheral.Id,\r\n Peripherals: peripheral,\r\n LatestRecord: latestRecord\r\n };\r\n });\r\n\r\n // Calculate combined errors for the account\r\n const combinedErrors = peripheralWithConfigRecord.reduce((acc, item) => {\r\n return acc + (item.LatestRecord?.CameraDeviceParameterSettings?.ProfileExceptionErrors?.Errors?.length || 0);\r\n }, 0);\r\n\r\n return {\r\n Id: parseInt(accountId, 10),\r\n AccountId: parseInt(accountId, 10),\r\n PeripheralWithConfigRecord: peripheralWithConfigRecord,\r\n CombinedErrors: combinedErrors\r\n };\r\n });\r\n })\r\n );\r\n }\r\n\r\n private groupByAccountId(items: T[], key: string): Record {\r\n return items.reduce((groups, item) => {\r\n const accountId = key.split('.').reduce((o, k) => o?.[k], item);\r\n if (accountId) {\r\n if (!groups[accountId]) groups[accountId] = [];\r\n groups[accountId].push(item);\r\n }\r\n return groups;\r\n }, {} as Record);\r\n }\r\n}\r\n\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { ICameraDeviceParameterRecord } from \"@app/main/modules/foundation/_models/_camera-configs/CameraConfigModels\";\r\nimport { DataCacheService } from \"@app/services/caching/data-cache.service\";\r\nimport { IStreamaxCameraProfile } from \"@app/services/camera/streamax-camera-profile-service\";\r\nimport { Observable, tap } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class StreamaxCameraParametersService {\r\n\r\n private streamaxCameraParametersCache: string = \"streamaxCameraParametersCache\";\r\n constructor(\r\n private readonly dataCacheService: DataCacheService,\r\n private readonly http: HttpClient\r\n ) { }\r\n\r\n getLatestParameterRecords(invalidateCache = false): Observable {\r\n return this.dataCacheService.getOrRequest(this.streamaxCameraParametersCache, () => this.getLatestParameterRecordsFromDb(), { invalidateCache });\r\n } \r\n\r\n getParameterRecordsFromDb(): Observable {\r\n return this.http.get(`/api/camera/parameters`);\r\n }\r\n\r\n getLatestParameterRecordsFromDb(): Observable {\r\n return this.http.get(`/api/cameras/parameters/latest`);\r\n }\r\n\r\n reassessRecordDeviations(profile: IStreamaxCameraProfile): Observable {\r\n return this.http.post(`/api/cameras/parameters/reassess/${profile.AccountId}`, profile).pipe(tap(updatedRecords => {\r\n updatedRecords.map(record => {\r\n this.dataCacheService.addOrUpdateItem(record, this.streamaxCameraParametersCache);\r\n return updatedRecords;\r\n });\r\n }));\r\n }\r\n\r\n runTestBuild(): Observable {\r\n return this.http.get(`/api/cameras/parameters/build`);\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnInit, Output } from \"@angular/core\";\r\nimport { FormBuilder, FormControl, FormGroup, Validators } from \"@angular/forms\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { VehicleType } from \"@app/enum/VehicleType.enum\";\r\nimport { ITriggerMetricsMap, ITriggerMetricsOverride, StreamaxCameraProfileService } from \"@app/services/camera/streamax-camera-profile-service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { tap } from \"rxjs\";\r\nimport './custom-trigger-metrics.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: `custom-trigger-metrics`,\r\n template: require('./custom-trigger-metrics.component.html')\r\n})\r\nexport class CustomTriggerMetrics implements OnInit {\r\n @Input() profileId: number;\r\n @Input() isNew: boolean;\r\n @Input() triggerMetrics: ITriggerMetricsOverride[];\r\n @Input() overriddenVehicleTypes: VehicleType[];\r\n\r\n @Output() customTriggerUpdated = new EventEmitter();\r\n @Output() customTriggerDeleted = new EventEmitter();\r\n\r\n vehicleTypeForm: FormGroup;\r\n formCategories: { title: string, formGroup: FormGroup }[];\r\n\r\n VehicleTypes = VehicleType;\r\n vehicleTypes: number[];\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n selectedRow: ITriggerMetricsOverride;\r\n showEditor: boolean = false;\r\n\r\n saveDisabled: boolean;\r\n\r\n constructor(\r\n private readonly vTableService: VTableService,\r\n private readonly formBuilder: FormBuilder,\r\n private readonly streamaxCameraProfileService: StreamaxCameraProfileService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.setupComponent();\r\n }\r\n\r\n onSaveCustomTrigger(): void {\r\n this.streamaxCameraProfileService.postTriggerOverride(this.profileId, this.selectedRow).pipe(untilDestroyed(this), tap(() => {\r\n\r\n const existingIndex = this.triggerMetrics.findIndex(\r\n (metric) => metric.VehicleType === this.selectedRow.VehicleType);\r\n\r\n if (existingIndex !== -1) {\r\n this.triggerMetrics[existingIndex] = this.selectedRow;\r\n } else {\r\n this.triggerMetrics = [...this.triggerMetrics, this.selectedRow];\r\n }\r\n\r\n this.overriddenVehicleTypes = [...this.overriddenVehicleTypes, this.selectedRow.VehicleType];\r\n\r\n this.vehicleTypes = Object.keys(VehicleType)\r\n .filter(s => !isNaN(Number(s)))\r\n .map(s => Number(s))\r\n .filter(v => !this.overriddenVehicleTypes?.includes(v));\r\n\r\n this.tableRows = this.vTableService.createTableRows(this.triggerMetrics, this.tableColumns);\r\n\r\n this.customTriggerUpdated.emit(this.selectedRow);\r\n\r\n this.closeCustomEditor();\r\n })).subscribe();\r\n }\r\n\r\n createNewOverride(): void {\r\n this.isNew = true;\r\n\r\n const firstAvailableEnumValue = this.vehicleTypes.find(type =>\r\n Object.values(VehicleType).includes(type as VehicleType)\r\n ) as VehicleType;\r\n\r\n this.selectedRow = {\r\n VehicleType: firstAvailableEnumValue,\r\n TriggerMetricsMap: {\r\n HarshAccelerationTriggerMetrics: {\r\n Offset: 0.1,\r\n EndSpeed: 200,\r\n StartSpeed: 0,\r\n ReAlertTimeSeconds: 10\r\n },\r\n HarshBrakingTriggerMetrics: {\r\n Offset: 0.1,\r\n EndSpeed: 200,\r\n StartSpeed: 0,\r\n ReAlertTimeSeconds: 10\r\n },\r\n LeftTurnTriggerMappings: {\r\n Offset: 0.1,\r\n EndSpeed: 200,\r\n StartSpeed: 0,\r\n ReAlertTimeSeconds: 10\r\n },\r\n RightTurnTriggerMappings: {\r\n Offset: 0.1,\r\n EndSpeed: 200,\r\n StartSpeed: 0,\r\n ReAlertTimeSeconds: 10\r\n },\r\n GyroTriggers: {\r\n XTrigger: 1.6,\r\n YTrigger: 1.8,\r\n ZTrigger: 1.8\r\n }\r\n }\r\n }\r\n\r\n this.createFormGroups();\r\n\r\n this.showEditor = true;\r\n }\r\n\r\n private createVehicleTypeCategory(): void {\r\n this.vehicleTypeForm = new FormGroup({\r\n \"VehicleType\": new FormControl(this.selectedRow.VehicleType)\r\n });\r\n\r\n this.vehicleTypeForm.statusChanges.pipe(untilDestroyed(this))\r\n .subscribe(status => {\r\n this.UpdateTriggerMetrics(status);\r\n })\r\n }\r\n\r\n rowClicked($event): void {\r\n this.selectedRow = $event.data;\r\n this.createFormGroups();\r\n this.showEditor = true;\r\n }\r\n\r\n closeCustomEditor(): void {\r\n this.selectedRow = null;\r\n this.isNew = false;\r\n this.formCategories = [];\r\n this.showEditor = false;\r\n }\r\n\r\n private setupComponent(): void {\r\n this.createTable();\r\n\r\n this.vehicleTypes = Object.keys(VehicleType)\r\n .filter(s => !isNaN(Number(s)))\r\n .map(s => Number(s))\r\n .filter(v => !this.overriddenVehicleTypes?.includes(v));\r\n\r\n this.tableRows = this.vTableService.createTableRows(this.triggerMetrics, this.tableColumns);\r\n }\r\n\r\n deleteConfig($event: boolean): void {\r\n if (!$event) {\r\n return;\r\n }\r\n\r\n this.streamaxCameraProfileService.deleteTriggerOverride(this.profileId, this.selectedRow.VehicleType).pipe(untilDestroyed(this), tap(() => {\r\n\r\n this.triggerMetrics = this.triggerMetrics.filter(m => m.VehicleType != this.selectedRow.VehicleType);\r\n \r\n this.overriddenVehicleTypes = this.overriddenVehicleTypes.filter(o => o != this.selectedRow.VehicleType);\r\n\r\n this.vehicleTypes = Object.keys(VehicleType)\r\n .filter(s => !isNaN(Number(s)))\r\n .map(s => Number(s))\r\n .filter(v => !this.overriddenVehicleTypes?.includes(v));\r\n\r\n this.tableRows = this.vTableService.createTableRows(this.triggerMetrics, this.tableColumns);\r\n\r\n this.customTriggerDeleted.emit(this.selectedRow);\r\n\r\n this.closeCustomEditor();\r\n })).subscribe();\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.VehicleType\" }),\r\n createCellFunction: (override) => this.vTableService.createEnumCell(VehicleType, \"VehicleType\", override.VehicleType)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"StreamaxConfigs.HardAccOffset\" }),\r\n createCellFunction: (override) => this.vTableService.createTableCell(override.TriggerMetricsMap.HarshAccelerationTriggerMetrics.Offset)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"StreamaxConfigs.HardAccSpeed\" }),\r\n createCellFunction: (override) => this.vTableService.createTableCell(`${override.TriggerMetricsMap.HarshAccelerationTriggerMetrics.StartSpeed} - ${override.TriggerMetricsMap.HarshAccelerationTriggerMetrics.EndSpeed}`)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"StreamaxConfigs.HardBrakeOffset\" }),\r\n createCellFunction: (override) => this.vTableService.createTableCell(override.TriggerMetricsMap.HarshBrakingTriggerMetrics.Offset)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"StreamaxConfigs.HardBrakeSpeed\" }),\r\n createCellFunction: (override) => this.vTableService.createTableCell(`${override.TriggerMetricsMap.HarshBrakingTriggerMetrics.StartSpeed} - ${override.TriggerMetricsMap.HarshBrakingTriggerMetrics.EndSpeed}`)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"StreamaxConfigs.HardLeftOffset\" }),\r\n createCellFunction: (override) => this.vTableService.createTableCell(override.TriggerMetricsMap.LeftTurnTriggerMappings.Offset)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"StreamaxConfigs.HardLeftSpeed\" }),\r\n createCellFunction: (override) => this.vTableService.createTableCell(`${override.TriggerMetricsMap.LeftTurnTriggerMappings.StartSpeed} - ${override.TriggerMetricsMap.LeftTurnTriggerMappings.EndSpeed}`)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"StreamaxConfigs.HardRightOffset\" }),\r\n createCellFunction: (override) => this.vTableService.createTableCell(override.TriggerMetricsMap.RightTurnTriggerMappings.Offset)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"StreamaxConfigs.HardRightSpeed\" }),\r\n createCellFunction: (override) => this.vTableService.createTableCell(`${override.TriggerMetricsMap.RightTurnTriggerMappings.StartSpeed} - ${override.TriggerMetricsMap.RightTurnTriggerMappings.EndSpeed}`)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"StreamaxConfigs.XTrigger\" }),\r\n createCellFunction: (override) => this.vTableService.createTableCell(override.TriggerMetricsMap.GyroTriggers.XTrigger)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"StreamaxConfigs.YTrigger\" }),\r\n createCellFunction: (override) => this.vTableService.createTableCell(override.TriggerMetricsMap.GyroTriggers.YTrigger)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"StreamaxConfigs.ZTrigger\" }),\r\n createCellFunction: (override) => this.vTableService.createTableCell(override.TriggerMetricsMap.GyroTriggers.ZTrigger)\r\n }\r\n ]\r\n }\r\n\r\n getControlType(control: FormControl): string {\r\n if (control.value instanceof Boolean || typeof control.value === 'boolean') {\r\n return 'boolean';\r\n } else if (typeof control.value === 'number') {\r\n return 'number';\r\n } else {\r\n return 'text';\r\n }\r\n }\r\n\r\n getStepValue(controlKey: string): number {\r\n switch (controlKey) {\r\n case \"Offset\":\r\n return 0.001\r\n case \"XTrigger\":\r\n case \"YTrigger\":\r\n case \"ZTrigger\":\r\n return 0.1\r\n default:\r\n return 1;\r\n }\r\n }\r\n\r\n getMaxValues(controlKey: string): number {\r\n switch (controlKey) {\r\n case \"Offset\":\r\n return 1;\r\n case \"XTrigger\":\r\n case \"YTrigger\":\r\n case \"ZTrigger\":\r\n case \"ReAlertTimeSeconds\":\r\n return 10;\r\n case \"StartSpeed\":\r\n case \"EndSpeed\":\r\n return 200;\r\n default:\r\n return 1;\r\n }\r\n }\r\n\r\n private createFormGroups(): void {\r\n this.formCategories = [];\r\n\r\n for (const category in this.selectedRow.TriggerMetricsMap) {\r\n let formCategory = {\r\n title: category,\r\n formGroup: this.createFormGroup(category)\r\n }\r\n\r\n formCategory.formGroup.statusChanges.pipe(untilDestroyed(this)).subscribe(status => {\r\n this.UpdateTriggerMetrics(status);\r\n })\r\n\r\n this.formCategories.push(formCategory);\r\n }\r\n\r\n this.createVehicleTypeCategory();\r\n }\r\n\r\n private createFormGroup(categoryName: string): FormGroup {\r\n const formGroupConfig = {};\r\n\r\n for (const key in this.selectedRow.TriggerMetricsMap[categoryName]) {\r\n\r\n if (this.selectedRow.TriggerMetricsMap[categoryName].hasOwnProperty(key)) {\r\n formGroupConfig[key] = new FormControl(this.selectedRow.TriggerMetricsMap[categoryName][key], [Validators.required, Validators.min(0), Validators.max(this.getMaxValues(key))]);\r\n }\r\n }\r\n\r\n return this.formBuilder.group(formGroupConfig);\r\n }\r\n\r\n private UpdateTriggerMetrics(status: string): void {\r\n if (status === \"INVALID\") {\r\n this.saveDisabled = true;\r\n return;\r\n }\r\n\r\n this.saveDisabled = false;\r\n\r\n const updatedTriggerMetricsMap = {};\r\n\r\n this.formCategories.forEach(category => {\r\n updatedTriggerMetricsMap[category.title] = category.formGroup.getRawValue();\r\n });\r\n\r\n this.selectedRow = {\r\n ...this.selectedRow,\r\n VehicleType: this.vehicleTypeForm.get(\"VehicleType\").value,\r\n TriggerMetricsMap: updatedTriggerMetricsMap as ITriggerMetricsMap,\r\n };\r\n }\r\n}\r\n","import { Component, Input, OnInit, ViewChild } from \"@angular/core\";\r\nimport { VTabComponent } from \"@app/directives/_layout/v-tabs/v-tab.component\";\r\nimport { VTabsComponent } from \"@app/directives/_layout/v-tabs/v-tabs.component\";\r\nimport { VehicleType } from \"@app/enum/VehicleType.enum\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { IAccountGroupConfigDto, ILocalTimeSettings } from \"@app/main/modules/foundation/_models/_camera-configs/CameraConfigModels\";\r\nimport { CustomTriggerMetrics } from \"@app/main/modules/foundation/_routes/streamax-configs/custom-trigger-metrics/custom-trigger-metrics.component\";\r\nimport { ConfigAccountGroupService } from \"@app/main/modules/foundation/_services/config-account-group.service\";\r\nimport { FoundationVehiclesService } from \"@app/main/modules/foundation/_services/vehicle.service\";\r\nimport { IAccount } from \"@app/services/account.service\";\r\nimport { StreamaxCameraParametersService } from \"@app/services/camera/streamax-camera-parameters.service\";\r\nimport { ICameraDeviceParameterProfileSettings, IStreamaxCameraProfile, ITriggerMetricsOverride, StreamaxCameraProfileService } from \"@app/services/camera/streamax-camera-profile-service\";\r\nimport { NavigationService } from \"@app/services/navigation.service\";\r\nimport { PreferencesService } from \"@app/services/preferences.service\";\r\nimport { ITimeZoneInfo } from \"@app/userPreferences/model/ITimeZoneInfo\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { time } from \"node:console\";\r\nimport { combineLatest, from } from \"rxjs\";\r\nimport { mergeMap, tap } from \"rxjs/operators\";\r\nimport './streamax-configs-account-view.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'streamax-configs-account-view',\r\n template: require('./streamax-configs-account-view.component.html')\r\n})\r\nexport class StreamaxConfigsComponent implements OnInit {\r\n accountId: number;\r\n accountGroupConfigs: IAccountGroupConfigDto;\r\n accounts: IAccount[];\r\n vehiclesList: IVehicle[];\r\n profile: IStreamaxCameraProfile;\r\n \r\n loading = false;\r\n\r\n timezones: ITimeZoneInfo[];\r\n updatedTimezone: ITimeZoneInfo;\r\n updatedStreamaxTimeSettings: ILocalTimeSettings;\r\n\r\n showProfileEditor: boolean = false;\r\n\r\n overriddenVehicleTypes: VehicleType[] = [];\r\n\r\n selectedTab: VTabComponent;\r\n\r\n @ViewChild('customTriggerMetrics') customTriggerMetrics: CustomTriggerMetrics;\r\n @ViewChild('tabs') tabs: VTabsComponent;\r\n @ViewChild('devicesList') devicesList: VTabComponent;\r\n\r\n constructor(\r\n private readonly configAccountGroupService: ConfigAccountGroupService,\r\n private readonly streamaxCameraParametersService: StreamaxCameraParametersService,\r\n private readonly navigationService: NavigationService,\r\n private readonly foundationVehicleService: FoundationVehiclesService,\r\n private readonly streamaxCameraProfileService: StreamaxCameraProfileService,\r\n private readonly preferencesService: PreferencesService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.accountId = this.navigationService.getRouteParam('accountId');\r\n \r\n this.loadData();\r\n }\r\n\r\n onSelectedTabChanged(tab: VTabComponent): void {\r\n this.selectedTab = tab;\r\n }\r\n\r\n toggleProfileEditor(): void {\r\n this.tabs.selectTab(this.devicesList);\r\n }\r\n\r\n reassessRecords(): void {\r\n this.updateProfileAndReassessRecords(() => {\r\n return;\r\n });\r\n }\r\n\r\n onCustomTriggerUpdated($event: ITriggerMetricsOverride): void {\r\n this.updateProfileAndReassessRecords(() => {\r\n const index = this.profile.CameraDeviceParameterProfileSettings.AlarmProfileMap.TriggerMetricOverrides\r\n .findIndex(o => o.VehicleType === $event.VehicleType);\r\n\r\n if (index !== -1) {\r\n this.profile.CameraDeviceParameterProfileSettings.AlarmProfileMap.TriggerMetricOverrides[index] = $event;\r\n } else {\r\n this.profile.CameraDeviceParameterProfileSettings.AlarmProfileMap.TriggerMetricOverrides.push($event);\r\n }\r\n\r\n this.streamaxCameraProfileService.updateProfileToCache(this.profile);\r\n });\r\n }\r\n\r\n onCustomTriggerDeleted($event: ITriggerMetricsOverride): void {\r\n const shouldMoveTab = false;\r\n\r\n this.updateProfileAndReassessRecords(() => {\r\n const index = this.profile.CameraDeviceParameterProfileSettings.AlarmProfileMap.TriggerMetricOverrides\r\n .findIndex(o => o.VehicleType === $event.VehicleType);\r\n\r\n if (index !== -1) {\r\n this.profile.CameraDeviceParameterProfileSettings.AlarmProfileMap.TriggerMetricOverrides =\r\n this.profile.CameraDeviceParameterProfileSettings.AlarmProfileMap.TriggerMetricOverrides.filter(o => o.VehicleType !== $event.VehicleType);\r\n }\r\n\r\n this.streamaxCameraProfileService.updateProfileToCache(this.profile);\r\n }, shouldMoveTab);\r\n }\r\n\r\n saveProfile(): void {\r\n this.updateProfileAndReassessRecords(() => {\r\n this.profile.CameraDeviceParameterProfileSettings.internalTimezoneInfo = this.profile.CameraDeviceParameterProfileSettings.updatedTimezoneInfo;\r\n this.profile.CameraDeviceParameterProfileSettings.TimeSettings = this.updatedStreamaxTimeSettings;\r\n\r\n this.streamaxCameraProfileService.postProfile(this.profile).pipe(untilDestroyed(this)).subscribe();\r\n });\r\n }\r\n\r\n onProfileUpdated($event: ICameraDeviceParameterProfileSettings): void {\r\n this.streamaxCameraProfileService.convertTimezoneInfoIdToStreamaxModel(this.profile.CameraDeviceParameterProfileSettings.internalTimezoneInfo.Id).pipe(untilDestroyed(this)).subscribe({\r\n next: streamaxTimezoneModel => {\r\n this.profile.CameraDeviceParameterProfileSettings = $event;\r\n this.updatedStreamaxTimeSettings = streamaxTimezoneModel\r\n }\r\n }); \r\n }\r\n\r\n private updateProfileAndReassessRecords(updateProfileFn: () => void, selectTab: boolean = true): void {\r\n this.loading = true;\r\n\r\n if (selectTab) {\r\n this.tabs.selectTab(this.devicesList);\r\n }\r\n\r\n updateProfileFn();\r\n\r\n // Reassess the records and update the accountGroupConfigs\r\n this.streamaxCameraParametersService.reassessRecordDeviations(this.profile).pipe(untilDestroyed(this)).subscribe({\r\n next: updatedRecords => {\r\n this.accountGroupConfigs = {\r\n ...this.accountGroupConfigs,\r\n PeripheralWithConfigRecord: this.accountGroupConfigs.PeripheralWithConfigRecord.map(peripheralWithConfig => {\r\n const updatedRecord = updatedRecords.find(\r\n ur => ur.Id === peripheralWithConfig.LatestRecord?.Id\r\n );\r\n\r\n return {\r\n ...peripheralWithConfig,\r\n LatestRecord: updatedRecord || peripheralWithConfig.LatestRecord // Update record if found, keep original otherwise\r\n };\r\n })\r\n };\r\n }, complete: () => {\r\n this.loading = false;\r\n }\r\n });\r\n }\r\n\r\n private loadData(): void {\r\n this.loading = true;\r\n\r\n combineLatest([\r\n this.configAccountGroupService.getConfigAccountGroups(),\r\n this.foundationVehicleService.getVehicles(),\r\n this.streamaxCameraProfileService.getProfiles(),\r\n from(this.preferencesService.getTimezones() as Promise)\r\n ]).pipe(untilDestroyed(this),\r\n tap(([accountGroups, vehicles, profiles, timezones]) => {\r\n this.vehiclesList = vehicles;\r\n this.accountGroupConfigs = accountGroups.find(a => a.AccountId == this.accountId);\r\n \r\n this.timezones = timezones.sort((a, b) => {\r\n const offsetA = this.parseBaseUtcOffset(a.BaseUtcOffset);\r\n const offsetB = this.parseBaseUtcOffset(b.BaseUtcOffset);\r\n return offsetA - offsetB; // Sort in ascending order\r\n });\r\n \r\n this.profile = profiles.find(p => p.AccountId == this.accountId);\r\n this.overriddenVehicleTypes = this.profile?.CameraDeviceParameterProfileSettings?.AlarmProfileMap?.TriggerMetricOverrides?.map(o => o.VehicleType) ?? [];\r\n\r\n this.loading = false;\r\n })).subscribe();\r\n }\r\n\r\n runBuilds(): void {\r\n this.streamaxCameraParametersService.runTestBuild().subscribe();\r\n }\r\n\r\n private parseBaseUtcOffset(baseUtcOffset: string): number {\r\n const [hours, minutes, seconds] = baseUtcOffset.split(':').map(Number);\r\n return hours * 60 + minutes; // Convert to total minutes\r\n }\r\n}\r\n","import { HybridServiceAccessor } from \"@app/common/hybrid-service-accessor\";\r\nimport { ITag } from \"@app/interfaces/ITag\";\r\nimport { DateService, DateUnit } from \"@app/services/date.service\";\r\nimport { LocationInformationService } from \"@app/services/location-information/location-information.service\";\r\nimport { VehicleService } from \"@app/services/vehicle.service\";\r\nimport { VorRecordStatus } from \"@components/resourceManagement/vor/vor.interfaces\";\r\nimport { IVideoEntry } from \"@components/videos/models/IVideoEntry\";\r\nimport { SortType } from \"@enums/SortType\";\r\nimport { IDriver } from \"@interfaces/IDriver\";\r\nimport { IPlot } from \"@interfaces/IPlot\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { IGroup } from \"@interfaces/IVehicleGroup\";\r\nimport { Colour, IDrivingStyleMetricScore } from \"@reports/models/IDrivingStyleMetricScore\";\r\nimport { IReportRowCell } from \"@reports/models/IReportRowCell\";\r\nimport { GeocodeService } from \"@services/geocode.service\";\r\nimport { ReasonCodeService } from \"@services/reasonCode.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { UnitConversionService, UnitConversionType } from \"@services/unitConversion.service\";\r\nimport { FormatDateTypes, VeriDate } from \"@services/veriDate.service\";\r\nimport { ITemperatureProfile } from \"@temperature/_models/temperature/ITemperatureProfile\";\r\nimport * as moment from \"moment\";\r\nimport { IVeriTableHeader, IVeriTableRow, IVeriTableRowCell, VeriTableRowStatus } from \"./veriTable.component\";\r\n\r\nexport class VeriTableService {\r\n private readonly locationInformationService = new HybridServiceAccessor(\"locationInformationService\", this.$injector);\r\n\r\n static $inject = [\"$injector\", \"$q\", \"dateService\", \"veriDate\", \"unitConversionService\", \"reasonCodeService\", \"vehicleService\", \"geocodeService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly $injector: angular.auto.IInjectorService,\r\n private readonly $q: angular.IQService,\r\n private readonly dateService: DateService,\r\n private readonly veriDate: VeriDate,\r\n private readonly unitConversionService: UnitConversionService,\r\n private readonly reasonCodeService: ReasonCodeService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly geocodeService: GeocodeService,\r\n private readonly translationService: TranslationService) {\r\n }\r\n\r\n createTableRowsWithCells(data: T[], createTableRowCells: (data: T, row?: IVeriTableRow) => IVeriTableRowCell[], createSearchString: (data: T) => string = () => null): IVeriTableRow[] {\r\n return this.createTableRows(data, data => this.createTableRow(data, (rowData, row) => createTableRowCells(rowData, row)), createSearchString);\r\n }\r\n\r\n createTableRow(data: T, createTableRowCells: (data: T, row?: IVeriTableRow) => IVeriTableRowCell[]) {\r\n\r\n var row: IVeriTableRow = { cells: [], data: data, };\r\n\r\n row.cells = createTableRowCells(data, row);\r\n\r\n if (!row.cells) {\r\n return null;\r\n }\r\n\r\n return row;\r\n }\r\n\r\n createTableRows(data: T[], createTableRow: (data: T) => IVeriTableRow, createSearchString: (data: T) => string = () => null): IVeriTableRow[] {\r\n var tableRows: IVeriTableRow[] = [];\r\n\r\n if (data) {\r\n data.forEach(d => {\r\n var row = createTableRow(d);\r\n\r\n if (row) {\r\n row.searchString = createSearchString(d);\r\n tableRows.push(row);\r\n }\r\n });\r\n }\r\n\r\n return tableRows;\r\n }\r\n\r\n createDateTimeHeader(title = this.translationService.t(\"Common.Time\"), additionalParams?: IVeriTableHeader): IVeriTableHeader {\r\n var header: IVeriTableHeader = {\r\n title: title,\r\n width: 150,\r\n sortable: true,\r\n sortType: SortType.Date\r\n }\r\n\r\n return Object.assign(header, additionalParams);\r\n }\r\n\r\n createDateHeader(title = this.translationService.t(\"Common.Date\"), additionalParams?: IVeriTableHeader): IVeriTableHeader {\r\n var header: IVeriTableHeader = {\r\n title: title,\r\n width: 150,\r\n sortable: true,\r\n sortType: SortType.Date,\r\n }\r\n\r\n return Object.assign(header, additionalParams);\r\n }\r\n\r\n createDateTimeCell(dateString: string | Date | moment.Moment, outputFormat: FormatDateTypes = null, className: string = null, nullFallback = this.translationService.t(\"Common.Never\")): IVeriTableRowCell {\r\n if (dateString) {\r\n const date = this.veriDate.createDate(dateString as Date);\r\n\r\n if (date && date.getFullYear() > 1) {\r\n return {\r\n contents: `{{cell.data | veriDate : '${outputFormat}'}}`,\r\n data: date,\r\n sortData: date,\r\n className: className,\r\n exportDataMethod: () => this.$q.when(this.veriDate.formatDate(date, outputFormat))\r\n }\r\n }\r\n }\r\n\r\n return this.createNACell(className, nullFallback);\r\n }\r\n\r\n createDateTimeCellv2(dateString: string | Date | moment.Moment | null, formatter: (d: string, v: VeriDate, f: FormatDateTypes) => string | null = null, outputFormat: FormatDateTypes = null, className: string = null, nullFallback = this.translationService.t(\"Common.Never\")) {\r\n dateString = dateString || \"2200-01-01T00:00:00Z\"; // if null or unidefined then it's Current\r\n\r\n const date = this.veriDate.createDate(dateString as Date);\r\n\r\n const contents = formatter ? formatter(dateString?.toString(), this.veriDate, outputFormat) : `{{cell.data | veriDate : '${outputFormat}'}}`;\r\n\r\n return {\r\n contents,\r\n data: date,\r\n sortData: date,\r\n className: className,\r\n exportDataMethod: () => this.$q.when(this.veriDate.formatDate(date, outputFormat)),\r\n };\r\n }\r\n\r\n createStackedCell(contentsTop: string, contentsBottom: string, sortData?: any): IVeriTableRowCell {\r\n\r\n if (!contentsTop && !contentsBottom) {\r\n\r\n return this.createNACell();\r\n }\r\n\r\n return {\r\n contents: `
${contentsTop}
\r\n
${contentsBottom}
`,\r\n sortData: sortData,\r\n exportData: `${contentsTop} ${contentsBottom}`\r\n }\r\n }\r\n\r\n createStackedDateTimeCell(dateString: string | Date | moment.Moment): IVeriTableRowCell {\r\n if (dateString) {\r\n const moment = this.veriDate.createMoment(dateString);\r\n\r\n if (moment.year() > 1) {\r\n return {\r\n contents: `
${this.veriDate.formatDate(moment, \"time\")}
\r\n
${this.veriDate.formatDate(moment, \"date\")}
`,\r\n sortData: moment\r\n }\r\n }\r\n }\r\n\r\n return this.createNACell();\r\n }\r\n\r\n createStackedDateTimeCellWithTimeAgo(dateString: string | Date | moment.Moment, timeAgoClass: String = \"\"): IVeriTableRowCell {\r\n if (dateString) {\r\n const moment = this.veriDate.createMoment(dateString);\r\n\r\n if (moment.year() > 1) {\r\n return {\r\n contents: `
${this.veriDate.formatDate(dateString)}
\r\n
${this.veriDate.formatDate(dateString, 'timeago')}
`,\r\n data: moment,\r\n sortData: moment\r\n }\r\n }\r\n }\r\n\r\n return this.createNACell();\r\n }\r\n\r\n createNACell(className?: string, contentsMessage?: string): IVeriTableRowCell {\r\n return {\r\n contents: contentsMessage || \"N/A\",\r\n sortData: null,\r\n className: `text-muted font-size-12 ${className}`\r\n }\r\n }\r\n\r\n //createTimeOrDateCell(dateString: string | Date): IVeriTableRowCell {\r\n // const moment = dateString ? this.veriDate.createMoment(dateString) : null;\r\n\r\n // return {\r\n // contents: this.veriDate.formatDate(moment, \"timeordate\"),\r\n // sortData: moment\r\n // }\r\n //}\r\n\r\n createDriverSummaryPanelCell(driver: IDriver, vehicle: IVehicle, time: moment.Moment, showTBC: boolean = false, className: string = null): IVeriTableRowCell {\r\n let vehicleDriverSortData = \"\";\r\n if (vehicle) {\r\n vehicleDriverSortData += vehicle.ShortReg;\r\n }\r\n if (driver) {\r\n vehicleDriverSortData += driver.Name;\r\n }\r\n\r\n let exportData = \"TBC\";\r\n if (vehicle) {\r\n exportData += vehicle.ShortReg;\r\n }\r\n if (vehicle && driver) {\r\n exportData += \" - \";\r\n }\r\n if (driver) {\r\n exportData += driver.Name;\r\n }\r\n\r\n return {\r\n contents: `\r\n `,\r\n sortData: vehicleDriverSortData,\r\n data: { driver: driver, vehicle: vehicle, time: time },\r\n exportData: exportData\r\n }\r\n }\r\n\r\n createTagsCell(tags: ITag[], resource: any): IVeriTableRowCell {\r\n var searchString = \"\";\r\n var exportData = tags.length > 0 ? \"\" : \" \";\r\n\r\n tags.forEach(tag => {\r\n searchString += tag.Name;\r\n exportData += `${tag.Name}, `;\r\n });\r\n\r\n return { contents: ``, data: resource, sortData: searchString, exportData: exportData }\r\n }\r\n\r\n createVehicleRegHeader(additionalParams?: IVeriTableHeader): IVeriTableHeader {\r\n const header: IVeriTableHeader = {\r\n title: this.translationService.t(\"Common.Vehicle\"),\r\n width: 100,\r\n sortable: true\r\n };\r\n\r\n return Object.assign(header, additionalParams);\r\n }\r\n\r\n createVehicleRegCell(vehicle: IVehicle): IVeriTableRowCell {\r\n return {\r\n contents: ``,\r\n data: vehicle,\r\n sortData: vehicle ? `${vehicle.ShortReg}_${vehicle.Reg}` : \"\", // We put in both Short Reg and Reg to make search work more predictably\r\n exportData: vehicle ? vehicle.ShortReg : \"---\",\r\n createSearchCallback: (vehicle: IVehicle) => {\r\n return this.vehicleService.createRobustRegPlateSearchString(vehicle);\r\n }\r\n }\r\n }\r\n\r\n createDriverCell(driver: IDriver): IVeriTableRowCell {\r\n if (!driver) {\r\n return this.createNACell(null, this.translationService.t(\"DriverSummaryPanel.NoDriver\"));\r\n }\r\n\r\n return {\r\n contents: driver.DisplayName,\r\n data: driver,\r\n exportData: driver.DisplayName,\r\n }\r\n }\r\n\r\n createLocationInformationCell(plotId: number, dataBinding: string = \"row.data\", plot: IPlot = null): IVeriTableRowCell {\r\n if (plot?.LocationInformation?.LocationDescription && !plot?.LocationInformation?.GeofenceIds?.length) {\r\n return {\r\n contents: plot.LocationInformation.LocationDescription,\r\n data: plot\r\n }\r\n }\r\n\r\n return { contents: ``, exportDataMethod: () => this.exportLocationInformationMethod(plotId) }\r\n }\r\n\r\n createScoreCell(reportRowCell: IReportRowCell): IVeriTableRowCell {\r\n\r\n const metricScore = reportRowCell?.MetaData as IDrivingStyleMetricScore;\r\n\r\n if (!metricScore) {\r\n return this.createNACell();\r\n }\r\n\r\n return {\r\n data: Math.round(reportRowCell.Data),\r\n sortData: reportRowCell.Data,\r\n exportData: Math.round(reportRowCell.Data).toString(),\r\n contents: `
${reportRowCell.Contents}
`,\r\n className: \"layout-row layout-align-start-center\"\r\n };\r\n }\r\n\r\n private exportLocationInformationMethod(plotId: number): angular.IPromise {\r\n if (!plotId) {\r\n return this.$q.resolve(\"N/A\")\r\n }\r\n\r\n return this.geocodeService.getLocationInformationFromPlotId(plotId).then(locationInformation => {\r\n if (locationInformation.GeofenceIds.length) {\r\n return this.$q.when(\r\n this.locationInformationService.service.getGeofenceNamesString(locationInformation)\r\n );\r\n }\r\n\r\n return locationInformation.LocationDescription;\r\n }).catch((error) => {\r\n console.error(\"Error retrieving composite location: \", error);\r\n\r\n return this.$q.resolve(null);\r\n });\r\n }\r\n\r\n createVideoEntryLocationCell(videoEntry: IVideoEntry, dataBinding: string = \"row.data\") {\r\n return { contents: ``, exportDataMethod: () => this.exportVideoEntryLocationMethod(videoEntry.Id) }\r\n }\r\n\r\n private exportVideoEntryLocationMethod(videoEntryId: number): angular.IPromise {\r\n if (!videoEntryId) {\r\n return this.$q.resolve(\"N/A\")\r\n }\r\n\r\n return this.geocodeService.getLocationInformationFromVideo(videoEntryId).then(location => {\r\n return location.LocationDescription;\r\n }).catch((error) => {\r\n console.error(\"Error retrieving formatted address: \", error);\r\n\r\n return null\r\n });\r\n }\r\n\r\n createVehicleOnlineStatusCell(vehicle: IVehicle, latestOfflineStatusTime?: moment.Moment, liveUpdates?: boolean): IVeriTableRowCell {\r\n const onlineStatus = vehicle.onlineStatus\r\n\r\n let sortData: Date = onlineStatus.lastOnlineTime;\r\n\r\n if (onlineStatus.lastOnlineTime && onlineStatus.online && latestOfflineStatusTime && this.veriDate.date1IsBeforeDate2(onlineStatus.lastOnlineTime, latestOfflineStatusTime.toDate())) {\r\n onlineStatus.sortingTime = this.dateService.addOrSubtractTime(latestOfflineStatusTime.toDate(), 1, DateUnit.Sec)\r\n sortData = onlineStatus.sortingTime;\r\n }\r\n\r\n return {\r\n contents: '',\r\n data: {\r\n vehicle,\r\n liveUpdates\r\n },\r\n sortData: sortData || this.veriDate.createMoment(new Date(1900, 0, 0)),\r\n exportData: sortData != null ? this.veriDate.formatDate(sortData) : this.translationService.t(`VehicleOnlineStatus.CameraOffline`),\r\n summaryLabel: onlineStatus.online\r\n ? this.translationService.t(`VehicleOnlineStatus.CameraOnline`)\r\n : this.translationService.t(`VehicleOnlineStatus.CameraOffline`)\r\n };\r\n }\r\n\r\n createStatusCell(text: string, color: string = \"grey-background\", tooltipText: string = \"\", showIcon: boolean = true): string {\r\n const iconString = (showIcon)\r\n ? `fiber_manual_record`\r\n : \"\";\r\n\r\n return `
\r\n ${iconString} ${text}\r\n
`;\r\n }\r\n\r\n createVehicleStatusCell(vehicle: IVehicle, showIcon: boolean = true): IVeriTableRowCell {\r\n const labelNoData = this.translationService.t(\"VeriTableService.NoData\");\r\n\r\n var statusToolTip = vehicle.Plot ? this.veriDate.formatDate(vehicle.Plot.Utc) : labelNoData;\r\n var vehicleStatus: IVeriTableRowCell = {\r\n summaryLabel: labelNoData,\r\n contents: this.createStatusCell(labelNoData, \"red-color\", statusToolTip, showIcon),\r\n sortData: vehicle.Plot?.Utc\r\n };\r\n\r\n if (vehicle.vorRecord && vehicle.vorRecord.status == VorRecordStatus.Active) {\r\n const labelVehicleOffRoad = this.translationService.t(\"VeriTableService.VehicleOffRoad\");\r\n\r\n statusToolTip = labelVehicleOffRoad;\r\n vehicleStatus.summaryLabel = labelVehicleOffRoad;\r\n vehicleStatus.contents = this.createStatusCell(`VOR`, \"grey-color\", statusToolTip, showIcon);\r\n vehicleStatus.exportData = labelVehicleOffRoad;\r\n\r\n return vehicleStatus;\r\n }\r\n\r\n if (vehicle.Plot) {\r\n if (vehicle.Plot.UtcMoment.isBefore(this.veriDate.createMoment(new Date()).add(-2, \"d\"))) {\r\n const labelNoRecentData = this.translationService.t(\"VeriTableService.NoRecentData\");\r\n\r\n vehicleStatus.summaryLabel = labelNoRecentData;\r\n vehicleStatus.contents = this.createStatusCell(labelNoRecentData, \"orange-color\", statusToolTip, showIcon)\r\n }\r\n else {\r\n if (this.reasonCodeService.isTravelling(vehicle.Plot.Reason)) {\r\n const labelDriving = this.translationService.t(\"VeriTableService.Driving\");\r\n\r\n vehicleStatus.summaryLabel = labelDriving;\r\n vehicleStatus.contents = this.createStatusCell(labelDriving, \"green-color\", statusToolTip, showIcon);\r\n } else {\r\n const labelStationary = this.translationService.t(\"VeriTableService.Stationary\");\r\n\r\n vehicleStatus.summaryLabel = labelStationary;\r\n vehicleStatus.contents = this.createStatusCell(labelStationary, \"grey-color\", statusToolTip, showIcon);\r\n }\r\n }\r\n }\r\n\r\n vehicleStatus.exportData = vehicleStatus.summaryLabel;\r\n\r\n return vehicleStatus;\r\n }\r\n\r\n createGpsIgnitionOnlineStatusCell(plot: IPlot): IVeriTableRowCell {\r\n\r\n if (!plot) {\r\n return {\r\n contents: \"\",\r\n data: null,\r\n sortData: null,\r\n exportData: null\r\n };\r\n }\r\n\r\n const isIgnitionOn = this.reasonCodeService.isIgnitionOn(plot.Reason);\r\n let statusText = this.reasonCodeService.createStatusText(plot);\r\n\r\n if (plot?.Dwell) {\r\n statusText += `
 for ${this.veriDate.minutesToDurationString(plot.Dwell / 60)}
`;\r\n }\r\n\r\n const tooltipText = isIgnitionOn ? this.translationService.t(\"VeriTableService.IgnitionOn\") : this.translationService.t(\"VeriTableService.IgnitionOff\");\r\n\r\n const statusIcon = `
\r\n fiber_manual_record ${statusText}\r\n
`;\r\n\r\n return {\r\n contents: statusIcon,\r\n data: plot,\r\n sortData: plot.UtcMoment || null,\r\n exportData: this.veriDate.formatDate(plot?.UtcMoment)\r\n };\r\n }\r\n\r\n\r\n createTemperatureProfileCell(profile: ITemperatureProfile): IVeriTableRowCell {\r\n if (!profile) {\r\n return this.createNACell();\r\n }\r\n\r\n const lowerBoundConvertedValue = this.unitConversionService.convertTemperatureWithSuffix(profile.LowerBound);\r\n const upperBoundConvertedValue = this.unitConversionService.convertTemperatureWithSuffix(profile.UpperBound);\r\n const lowerBoundConvertedExportValue = this.unitConversionService.convertTemperature(profile.LowerBound);\r\n const upperBoundConvertedExportValue = this.unitConversionService.convertTemperature(profile.UpperBound);\r\n\r\n return {\r\n contents: `
${profile.Name} (${lowerBoundConvertedValue} - ${upperBoundConvertedValue})
`,\r\n data: profile,\r\n sortData: lowerBoundConvertedValue,\r\n className: `padding-top-0 padding-bottom-0`,\r\n exportData: `${profile.Name} (${lowerBoundConvertedExportValue} - ${upperBoundConvertedExportValue})`\r\n };\r\n }\r\n\r\n createVehicleResourceGroupDisplayCell(data: IVehicle, groups?: IGroup[]): IVeriTableRowCell {\r\n return {\r\n contents: ``,\r\n data: [data, groups],\r\n excludeFromExport: true\r\n };\r\n }\r\n\r\n createDriverResourceGroupDisplayCell(data: IDriver): IVeriTableRowCell {\r\n return {\r\n contents: '',\r\n data: data,\r\n excludeFromExport: true\r\n };\r\n }\r\n\r\n createDownloadProgressCell(videoProgress: number): IVeriTableRowCell {\r\n return {\r\n contents: ``,\r\n exportData: `${videoProgress}%`\r\n };\r\n }\r\n\r\n createConvertedValueCell(value: number, conversionType: UnitConversionType, precision = 2): IVeriTableRowCell {\r\n const convertedValue = this.unitConversionService.convert(value, conversionType, precision);\r\n\r\n return {\r\n contents: `${convertedValue} ${this.unitConversionService.getConversionLabel(conversionType)}`,\r\n data: value,\r\n exportData: convertedValue.toString()\r\n }\r\n }\r\n\r\n getRowClassNameFromRowStatus(rowStatus: VeriTableRowStatus): string {\r\n switch (rowStatus) {\r\n case VeriTableRowStatus.OkChecked:\r\n return \"pass\";\r\n\r\n case VeriTableRowStatus.Warning:\r\n return \"warning\";\r\n\r\n case VeriTableRowStatus.Error:\r\n return \"error\";\r\n\r\n default:\r\n return \"ok\";\r\n }\r\n }\r\n\r\n}\r\n","import { Component, Input, OnChanges } from \"@angular/core\";\r\nimport { IAccount } from \"@app/services/account.service\";\r\nimport { NavigationService } from \"@services/navigation.service\";\r\nimport { Observable } from \"rxjs\";\r\nimport { FoundationNavigationModule } from \"../../foundation.navigation\";\r\nimport { AccountService } from \"../../_services/account.service\";\r\n\r\nimport \"./customer-name.component.scss\";\r\n\r\n@Component({\r\n selector: \"customer-name\",\r\n template: require(\"./customer-name.component.html\")\r\n})\r\nexport class CustomerNameComponent implements OnChanges {\r\n @Input() accountId: number;\r\n\r\n customer$: Observable;\r\n\r\n constructor(\r\n private readonly accountService: AccountService,\r\n private readonly navigationService: NavigationService) {\r\n\r\n }\r\n\r\n ngOnChanges() {\r\n if (!this.accountId) {\r\n return;\r\n }\r\n\r\n this.customer$ = this.accountService.getCustomerAccount(this.accountId);\r\n }\r\n\r\n customerClicked() {\r\n this.navigationService.go(FoundationNavigationModule.CustomerView, { customerId: this.accountId });\r\n }\r\n}\r\n","import { Component, Input, OnChanges, OnInit } from \"@angular/core\";\r\nimport { NavigationService } from \"@app/services/navigation.service\";\r\nimport { INote } from \"@foundation/_services/notes.service.ajs\";\r\nimport { IUser } from \"@interfaces/IUser\";\r\nimport { CurrentUserService } from \"@services/currentUser.service\";\r\nimport { NoteType } from \"../../_enums/NoteType\";\r\nimport \"./foundation-notes-list.component.scss\";\r\nimport { FoundationNotesService } from \"../../_services/notes.service\";\r\nimport { Subject, Subscription } from \"rxjs\";\r\nimport { take, takeUntil } from \"rxjs/operators\";\r\nimport { ResourceType } from \"../../_enums/ResourceType\";\r\n\r\n@Component({\r\n selector: \"foundation-notes-list\",\r\n template: require(\"./foundation-notes-list.component.html\")\r\n})\r\n\r\nexport class FoundationNotesListComponent implements OnInit, OnChanges {\r\n\r\n // Bindings\r\n\r\n @Input() type: ResourceType;\r\n @Input() entityId: number;\r\n\r\n // Internal\r\n\r\n tabCount: number = 0;\r\n\r\n loading = false;\r\n currentUser: IUser;\r\n\r\n notes: INote[];\r\n showNoteForm: boolean;\r\n noteToAdd: string;\r\n\r\n dataSubscription: Subscription;\r\n\r\n private destroy$ = new Subject();\r\n\r\n constructor(\r\n private readonly notesService: FoundationNotesService,\r\n private readonly currentUserService: CurrentUserService,\r\n private readonly navigationService: NavigationService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.getCurrentUser();\r\n this.updateNotes();\r\n }\r\n\r\n ngOnChanges(): void {\r\n this.updateNotes();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.unsubscribe();\r\n }\r\n\r\n toggleNoteForm(): void {\r\n this.showNoteForm = !this.showNoteForm;\r\n }\r\n\r\n addNote(): void {\r\n this.loading = true;\r\n\r\n const note: INote = {\r\n Comments: this.noteToAdd,\r\n ResourceId: this.entityId,\r\n ResourceType: this.type || 0, \r\n NoteType: NoteType.Manual,\r\n CreatedOn: new Date().toISOString(),\r\n CreatedByUserId: this.currentUser?.Id\r\n };\r\n\r\n this.notesService.addNote(note).pipe(take(1)).subscribe(() => {\r\n this.showNoteForm = false;\r\n this.noteToAdd = \"\";\r\n note.UserName = this.currentUser.CurrentAccountUserMapping?.Name || this.currentUser.Email;\r\n this.notes.unshift(note);\r\n\r\n this.loading = false;\r\n })\r\n }\r\n\r\n // ---\r\n\r\n private getCurrentUser(): void {\r\n this.currentUserService.getCurrentUser().then(user => {\r\n this.currentUser = user;\r\n })\r\n }\r\n\r\n private updateNotes(): void {\r\n this.loading = true;\r\n const type = this.type || ResourceType.Account;\r\n\r\n if (this.dataSubscription) {\r\n this.dataSubscription.unsubscribe();\r\n }\r\n\r\n this.dataSubscription = this.notesService.getNotes(this.entityId, type, NoteType.Manual).pipe(takeUntil(this.destroy$)).subscribe(notes => {\r\n this.notes = notes;\r\n this.tabCount = this.notes?.length;\r\n this.loading = false;\r\n })\r\n\r\n }\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { Observable } from \"rxjs\";\r\nimport { map } from \"rxjs/operators\";\r\nimport { NoteType } from \"../_enums/NoteType\";\r\nimport { ResourceType } from \"../_enums/ResourceType\";\r\nimport { INote } from \"./notes.service.ajs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FoundationNotesService {\r\n constructor(private readonly http: HttpClient) { }\r\n\r\n getNotes(entityId: number, resourceType: ResourceType, noteType: NoteType): Observable {\r\n return this.http.get(`/api/foundation/notes/${ResourceType[resourceType]}/${entityId}`).pipe(map(notes => {\r\n const filteredNotes = notes.filter(n => n.NoteType == noteType);\r\n\r\n filteredNotes.forEach(note => {\r\n\r\n note.noteTypeString = NoteType[note.NoteType];\r\n });\r\n\r\n return filteredNotes;\r\n\r\n }))\r\n }\r\n\r\n addNote(note: INote): Observable {\r\n\r\n return this.http.post(`/api/foundation/notes/`, note);\r\n }\r\n}\r\n","import { Component, Input, OnChanges } from \"@angular/core\";\r\nimport { DateService } from \"@app/services/date.service\";\r\nimport { catchError, tap } from \"rxjs/operators\";\r\nimport { ISimStatusInfo } from \"../../_services/peripheral.service.ajs\";\r\nimport { SimService } from \"../../_services/sim.service\";\r\nimport \"./simStatusInfo.component.scss\";\r\n\r\n@Component({\r\n selector: \"sim-status-info\",\r\n template: require(\"./simStatusInfo.component.html\")\r\n})\r\nexport class SimStatusInfoComponent implements OnChanges {\r\n\r\n @Input() serial: string;\r\n\r\n // ---\r\n\r\n simStatus: ISimStatusInfo;\r\n statusMessage: string = \"Updating SIM info...\";\r\n inSession: boolean;\r\n inFailureState = false;\r\n isUnsupportedSim = true;\r\n tooltipString: string = \"Updating...\";\r\n\r\n constructor(\r\n private readonly dateService: DateService,\r\n private readonly simService: SimService\r\n ) {\r\n }\r\n\r\n ngOnChanges() {\r\n if (!this.serial) {\r\n return;\r\n }\r\n\r\n this.simService\r\n .getSimInfo(this.serial)\r\n .pipe(\r\n catchError((error, data) => {\r\n this.handleError();\r\n throw error;\r\n }),\r\n tap(simStatus => {\r\n if (!simStatus?.SessionDetails) {\r\n this.handleError();\r\n return;\r\n }\r\n\r\n this.isUnsupportedSim = false;\r\n this.simStatus = simStatus;\r\n this.inSession = simStatus.SessionDetails?.dateSessionStarted && !simStatus.SessionDetails?.dateSessionEnded;\r\n\r\n this.createStatusMessage();\r\n })\r\n ).subscribe();\r\n }\r\n\r\n // ---\r\n\r\n private createStatusMessage() {\r\n this.statusMessage = \"SIM: \";\r\n this.tooltipString = `${this.simStatus.Usage.status}`;\r\n\r\n if (this.inSession) {\r\n this.statusMessage += \"Online\";\r\n this.tooltipString += ` - Session started ${this.dateService.relativeTime(this.simStatus.SessionDetails.dateSessionStarted)}`;\r\n }\r\n else {\r\n if (this.simStatus.SessionDetails.dateSessionEnded) {\r\n this.tooltipString += ` - Session ended ${this.dateService.relativeTime(this.simStatus.SessionDetails.dateSessionEnded)}`;\r\n }\r\n else {\r\n this.tooltipString += `No session recorded`;\r\n }\r\n\r\n this.statusMessage += `${this.simStatus.Usage.status}`;\r\n }\r\n\r\n this.tooltipString += ` - Usage: ${this.simStatus.Usage.dataUsageFormatted}`;\r\n\r\n if (this.simStatus.Usage.overageLimitReached) {\r\n this.tooltipString += \"Overage Limit Reached\";\r\n this.inFailureState = true;\r\n }\r\n\r\n switch (this.simStatus.Usage.status) {\r\n case \"RETIRED\":\r\n case \"PURGED\":\r\n case \"DEACTIVATED\":\r\n this.inFailureState = true;\r\n }\r\n }\r\n\r\n private handleError(): void {\r\n this.isUnsupportedSim = true;\r\n this.statusMessage = \"\";\r\n }\r\n}\r\n\r\n\r\n/*\r\nACTIVATED\r\nACTIVATION_READY\r\nDEACTIVATED\r\nINVENTORY\r\nPURGED\r\nREPLACED\r\nRETIRED\r\nTEST_READY\r\n*/\r\n","export interface ISimMapping {\r\n Id?: number;\r\n SimId?: number;\r\n Serial: string;\r\n EndUtc?: Date | string;\r\n StartUtc?: Date | string;\r\n SimMappingType?: SimMappingType\r\n}\r\n\r\nexport enum SimMappingType {\r\n Unit,\r\n Peripheral\r\n}\r\n","import { Component, ElementRef, EventEmitter, Input, OnChanges, OnDestroy, Output, ViewChild, ViewEncapsulation } from '@angular/core';\r\nimport Quagga, { QuaggaJSConfigObject, QuaggaJSResultObject } from '@ericblade/quagga2';\r\n//import defaultsDeep from 'lodash.defaultsdeep';\r\nimport { Subject } from 'rxjs';\r\nimport { filter, takeUntil } from 'rxjs/operators';\r\nimport './barcode-scanner-livestream.component.scss';\r\nimport { DEFAULT_CONFIG } from './barcode-scanner-livestream.config';\r\nimport { mapToReader } from './barcode-types';\r\n\r\n@Component({\r\n selector: 'barcode-scanner-livestream',\r\n template: require('./barcode-scanner-livestream.component.html')\r\n //encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class BarcodeScannerLivestreamComponent implements OnChanges, OnDestroy {\r\n // Inputs\r\n @Input() type: string | string[];\r\n\r\n @Input() deviceId: string;\r\n\r\n @Input() maxWidth = '100%';\r\n\r\n @Input() maxHeight: string;\r\n\r\n @Input() config: Partial;\r\n\r\n @Input() errorFilter: {\r\n median?: number\r\n threshold?: number\r\n }\r\n\r\n _valueChanges = new Subject();\r\n\r\n // Outputs\r\n @Output() valueChanges = new EventEmitter();\r\n\r\n @Output() started = new EventEmitter();\r\n\r\n @ViewChild('BarcodeScanner') barcodeScanner: ElementRef;\r\n\r\n get _maxWidth(): string {\r\n return this.maxWidth ? `${this.maxWidth}` : 'auto';\r\n }\r\n\r\n get _maxHeight(): string {\r\n return this.maxHeight ? `${this.maxHeight}` : 'auto';\r\n }\r\n\r\n private _started = false;\r\n\r\n get isStarted(): boolean {\r\n return this._started;\r\n }\r\n\r\n private _destroyed: Subject = new Subject();\r\n\r\n private configQuagga: QuaggaJSConfigObject;\r\n\r\n constructor() {\r\n\r\n this._valueChanges.pipe(\r\n takeUntil(this._destroyed),\r\n filter((result: QuaggaJSResultObject) => {\r\n const errors: number[] = result.codeResult.decodedCodes\r\n .filter(_ => _.error !== undefined)\r\n .map(_ => _.error);\r\n\r\n const median = this._getMedian(errors);\r\n\r\n //Filter result when median and/or threshold parameters are provided\r\n //Good result for code_128 : median = 0.08 and threshold = 0.1\r\n return !this.errorFilter ||\r\n !(this.errorFilter.median && median > this.errorFilter.median\r\n || this.errorFilter.threshold && errors.some(err => err > this.errorFilter.threshold))\r\n }),\r\n ).subscribe(result => {\r\n const drawingCtx = Quagga.canvas.ctx.overlay;\r\n\r\n Quagga.ImageDebug.drawPath(result.line, {\r\n x: 'x',\r\n y: 'y',\r\n }, drawingCtx, {\r\n color: 'red',\r\n lineWidth: 3,\r\n });\r\n\r\n this.valueChanges.next(result);\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.stop();\r\n this._destroyed.next(true);\r\n this._destroyed.complete();\r\n }\r\n\r\n ngOnChanges(): void {\r\n this.restart();\r\n }\r\n\r\n private _init(): Promise {\r\n\r\n return new Promise((resolve, reject) => {\r\n Quagga.onProcessed((result) => this.onProcessed(result));\r\n\r\n Quagga.onDetected((result) => this.onDetected(result));\r\n\r\n this.configQuagga = /*defaultsDeep({}, */this.config || DEFAULT_CONFIG;\r\n\r\n this.configQuagga.inputStream.target = this.barcodeScanner.nativeElement;\r\n\r\n if (this.type) {\r\n this.configQuagga.decoder.readers = mapToReader(this.type);\r\n }\r\n\r\n if (this.deviceId) {\r\n this.configQuagga.inputStream.constraints.deviceId = this.deviceId;\r\n }\r\n\r\n Quagga.init(this.configQuagga, (err) => {\r\n \r\n if (err) {\r\n \r\n return reject(err);\r\n }\r\n\r\n resolve();\r\n });\r\n });\r\n }\r\n\r\n private _getMedian(arr: number[]): number {\r\n arr.sort((a, b) => a - b);\r\n const half = Math.floor(arr.length / 2);\r\n if (arr.length % 2 === 1) // Odd length\r\n return arr[half];\r\n return (arr[half - 1] + arr[half]) / 2.0;\r\n }\r\n\r\n async start(): Promise {\r\n if (!this._started) {\r\n await this._init();\r\n Quagga.start();\r\n\r\n this._started = true;\r\n this.started.next(true);\r\n }\r\n }\r\n\r\n stop(): void {\r\n if (this._started) {\r\n Quagga.stop();\r\n this._started = false;\r\n this.started.next(false);\r\n }\r\n }\r\n\r\n restart(): void {\r\n if (this._started) {\r\n this.stop();\r\n this.start();\r\n }\r\n }\r\n\r\n onProcessed(result: QuaggaJSResultObject): any {\r\n const drawingCtx = Quagga.canvas.ctx.overlay;\r\n const drawingCanvas = Quagga.canvas.dom.overlay;\r\n\r\n if (result) {\r\n if (result.boxes) {\r\n drawingCtx.clearRect(0, 0,\r\n parseInt(drawingCanvas.getAttribute('width'), 10),\r\n parseInt(drawingCanvas.getAttribute('height'), 10));\r\n result.boxes.filter((box: any) => {\r\n return box !== result.box;\r\n }).forEach((box: any) => {\r\n Quagga.ImageDebug.drawPath(box, {\r\n x: 0,\r\n y: 1,\r\n }, drawingCtx, {\r\n color: 'green',\r\n lineWidth: 2,\r\n });\r\n });\r\n }\r\n\r\n if (result.box) {\r\n Quagga.ImageDebug.drawPath(result.box, {\r\n x: 0,\r\n y: 1,\r\n }, drawingCtx, {\r\n color: '#00F',\r\n lineWidth: 2,\r\n });\r\n }\r\n }\r\n }\r\n\r\n onDetected(result: QuaggaJSResultObject): void {\r\n //console.log(result.codeResult.code);\r\n this._valueChanges.next(result);\r\n }\r\n}\r\n","import { AfterViewInit, Component, EventEmitter, Output, ViewChild } from \"@angular/core\";\r\nimport { QuaggaJSResultObject } from \"@ericblade/quagga2\";\r\nimport { BarcodeScannerLivestreamComponent } from \"./barcode-scanner-livestream.component\";\r\nimport \"./barcode-scanner.component.scss\";\r\n\r\n@Component({\r\n selector: \"barcode-scanner\",\r\n template: require('./barcode-scanner.component.html')\r\n})\r\nexport class BarcodeScannerComponent implements AfterViewInit {\r\n\r\n @Output() selected = new EventEmitter();\r\n @Output() onScanned = new EventEmitter();\r\n\r\n // ---\r\n\r\n @ViewChild(BarcodeScannerLivestreamComponent) barcodeScanner: BarcodeScannerLivestreamComponent;\r\n\r\n barcodeValues: string[] = [];\r\n\r\n constructor() {\r\n\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.barcodeScanner.start();\r\n }\r\n\r\n onSelected(value: string) {\r\n console.log(value);\r\n this.selected.emit(value);\r\n }\r\n\r\n onValueChanges(result: QuaggaJSResultObject) {\r\n if (this.barcodeValues.indexOf(result.codeResult.code) >= 0) {\r\n return;\r\n }\r\n\r\n this.barcodeValues.push(result.codeResult.code);\r\n this.onScanned.emit(result.codeResult.code);\r\n }\r\n\r\n onStarted(started) {\r\n //console.log(started);\r\n }\r\n\r\n // ---\r\n\r\n}\r\n","import { Component, Input, OnChanges, OnInit } from \"@angular/core\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { IDeviceMessageQueryOptions } from \"@app/main/modules/foundation/_models/IDeviceMessageQueryOptions\";\r\nimport { DeviceMessageService } from \"@app/main/modules/foundation/_services/deviceMessage.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { DeviceCommunicationMethod, DeviceMessageDirection, ThirdPartyMessagingProvider } from \"@enums/deviceMessage/DeviceCommunicationMethod\";\r\nimport { DeviceCommunicationType } from \"@enums/deviceMessage/DeviceCommunicationType\";\r\nimport { DeviceMessageStatus } from \"@enums/deviceMessage/DeviceMessageStatus\";\r\nimport { IDeviceCommand, IDeviceCommunicationCommand, IDeviceMessageExtended } from \"@interfaces/IDeviceMessage\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { mergeMap, take, tap } from \"rxjs/operators\";\r\nimport \"./commandSender.component.scss\";\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: \"foundation-command-sender\",\r\n template: require(\"./commandSender.component.html\")\r\n})\r\n\r\nexport class CommandSenderComponent implements OnInit, OnChanges {\r\n\r\n // bindings\r\n @Input() unitSerial: string;\r\n @Input() isPeripheralCommand: boolean;\r\n\r\n // component\r\n icon: string;\r\n label: string;\r\n loading: boolean = false;\r\n deviceMessages: IDeviceMessageExtended[] = [];\r\n deviceCommunicationCommands: IDeviceCommunicationCommand[] = []\r\n selectedDeviceCommunicationCommand: IDeviceCommunicationCommand;\r\n commandAdditionalValue: string;\r\n deviceCommand: IDeviceCommand;\r\n\r\n deviceMessageDirection: typeof DeviceMessageDirection = DeviceMessageDirection;\r\n deviceCommunicationMethod: typeof DeviceCommunicationMethod = DeviceCommunicationMethod;\r\n deviceMessageStatus: typeof DeviceMessageStatus = DeviceMessageStatus;\r\n thirdPartyMessagingProvider: typeof ThirdPartyMessagingProvider = ThirdPartyMessagingProvider;\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n showSendCommandSidebar: boolean;\r\n additionalValueInfo: string;\r\n\r\n valueSelectorRequired: boolean;\r\n\r\n constructor(\r\n private readonly vTableService: VTableService,\r\n private readonly deviceMessageService: DeviceMessageService,\r\n private readonly translationService: TranslationService\r\n ) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.getData();\r\n this.createTable();\r\n }\r\n\r\n ngOnChanges(): void {\r\n if (!this.unitSerial) {\r\n console.warn(\"No serial given to command sender\");\r\n return;\r\n }\r\n\r\n this.getDeviceCommunicationTypes();\r\n }\r\n\r\n sendCommand(): void {\r\n this.deviceMessageService.sendDeviceCommunicationCommands(this.unitSerial, this.createDeviceCommand()).pipe(take(1), tap(deviceMessage => {\r\n deviceMessage.statusString = DeviceMessageStatus[deviceMessage.Status];\r\n this.deviceMessages.push(deviceMessage);\r\n this.createTableRows();\r\n this.toggleSidebar();\r\n })).subscribe();\r\n }\r\n\r\n onCommandTypeChange(): void {\r\n this.setValueSelectorAndInfo();\r\n }\r\n\r\n onValueChange($event: string): void {\r\n this.commandAdditionalValue = $event;\r\n }\r\n\r\n toggleSidebar(): void {\r\n this.showSendCommandSidebar = !this.showSendCommandSidebar\r\n }\r\n\r\n private setValueSelectorAndInfo(): void {\r\n switch (this.selectedDeviceCommunicationCommand.Item2) {\r\n case DeviceCommunicationType.TelematicsMode:\r\n case DeviceCommunicationType.LoggingLevel: \r\n this.additionalValueInfo = `0 = ${this.translationService.translate(\"Common.Disabled\")}, 1 = ${this.translationService.translate(\"Common.Enabled\")}`;\r\n this.valueSelectorRequired = true;\r\n break;\r\n case DeviceCommunicationType.CameraReboot:\r\n case DeviceCommunicationType.RemovePendingVideoRequests:\r\n this.additionalValueInfo = \"\";\r\n this.valueSelectorRequired = false;\r\n break;\r\n default:\r\n this.additionalValueInfo = \"\";\r\n this.valueSelectorRequired = true;\r\n break;\r\n }\r\n }\r\n\r\n private createDeviceCommand(): IDeviceCommand {\r\n return {\r\n CommandValue: this.commandAdditionalValue,\r\n CommunicationMethod: this.selectedDeviceCommunicationCommand.Item1,\r\n CommunicationType: this.selectedDeviceCommunicationCommand.Item2\r\n };\r\n }\r\n\r\n private getDeviceCommunicationTypes(): void {\r\n\r\n this.deviceMessageService.getDeviceCommunicationCommands(this.unitSerial, this.isPeripheralCommand).pipe(take(1)).subscribe(deviceCommunicationCommands => {\r\n if (this.isPeripheralCommand) {\r\n deviceCommunicationCommands = deviceCommunicationCommands.filter(command =>\r\n command.Item2 != DeviceCommunicationType.Custom && \r\n command.Item2 != DeviceCommunicationType.GetLogFile &&\r\n command.Item2 != DeviceCommunicationType.GenericFileUpload); \r\n }\r\n\r\n this.deviceCommunicationCommands = deviceCommunicationCommands;\r\n this.deviceCommunicationCommands.forEach(type => { type.DisplayName = DeviceCommunicationType[type.Item2].replace(/([A-Z])/g, ' $1').trim() });\r\n this.selectedDeviceCommunicationCommand = deviceCommunicationCommands.firstOrDefault();\r\n this.setValueSelectorAndInfo();\r\n });\r\n }\r\n\r\n private getData(): void {\r\n this.loading = true;\r\n\r\n const getParams: IDeviceMessageQueryOptions = this.isPeripheralCommand ?\r\n { PeripheralSerial: this.unitSerial } :\r\n { Serial: this.unitSerial };\r\n\r\n this.deviceMessageService.getAllDeviceMessages(getParams).pipe( \r\n untilDestroyed(this),\r\n mergeMap(deviceMessages => {\r\n this.deviceMessages = deviceMessages;\r\n\r\n this.deviceMessages.forEach(message => {\r\n message.directionString = DeviceMessageDirection[message.Direction];\r\n message.deviceCommunicationMethodString = DeviceCommunicationMethod[message.DeviceCommunicationMethod];\r\n message.statusString = DeviceMessageStatus[message.Status];\r\n message.thirdPartyMessagingProviderString = ThirdPartyMessagingProvider[message.ThirdPartyMessagingProvider];\r\n });\r\n\r\n this.createTableRows();\r\n this.loading = false;\r\n\r\n return this.deviceMessageService.getDeviceMessageUpdates(this.unitSerial)\r\n }),\r\n tap(messageUpdate => {\r\n const messageToUpdate = this.deviceMessages.find(m => m.Id == messageUpdate.RequestId);\r\n\r\n if (messageToUpdate != undefined) {\r\n messageToUpdate.Status = DeviceMessageStatus.Sent;\r\n messageToUpdate.statusString = DeviceMessageStatus[messageToUpdate.Status];\r\n\r\n this.createTableRows();\r\n }\r\n })).subscribe();\r\n }\r\n \r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"Common.Time\", sorted: true, sortDirection: SortDirection.Descending }),\r\n createCellFunction: message => this.vTableService.createDateCell(message.TimestampCreated, { dateTime: true })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Status\", width: 150 }),\r\n createCellFunction: message => this.vTableService.createTableCell(message.statusString)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"CommandSender.Message\" }),\r\n createCellFunction: message => this.vTableService.createTableCell(message.Message)\r\n }\r\n ]\r\n }\r\n\r\n private createTableRows(): void {\r\n this.tableRows = this.vTableService.createTableRows(this.deviceMessages, this.tableColumns);\r\n }\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { getOptionsQueryParams } from \"@app/class/Utilities\";\r\nimport { IDeviceCommand, IDeviceCommunicationCommand, IDeviceMessage } from \"@app/interfaces/IDeviceMessage\";\r\nimport { IDeviceMessageQueryOptions } from \"@app/main/modules/foundation/_models/IDeviceMessageQueryOptions\";\r\nimport { ICameraRequestUpdateMessage } from \"@app/main/modules/foundation/_routes/developerConsole/log-message.model\";\r\nimport { SignalRService, WebSocketEvents } from \"@app/main/modules/foundation/_routes/developerConsole/signalr.service\";\r\nimport { Observable, Subject } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\n\r\nexport class DeviceMessageService {\r\n\r\n deviceMessageCommandUpdateReceived = new Subject()\r\n\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly signalRService: SignalRService) {\r\n }\r\n\r\n getDeviceCommunicationCommands(serial: string, isPeripheralCommand: boolean): Observable {\r\n return this.http.get(`/api/foundation/devicecommunication/${serial}/types`, { params: { isPeripheralCommand } });\r\n }\r\n\r\n sendDeviceCommunicationCommands(serial: string, deviceCommand: IDeviceCommand): Observable {\r\n return this.http.post(`/api/foundation/devicecommunication/${serial}/sendcommand`, deviceCommand);\r\n }\r\n\r\n getAllDeviceMessages(queryOptions: IDeviceMessageQueryOptions): Observable {\r\n const params = getOptionsQueryParams(queryOptions);\r\n return this.http.get(`/api/foundation/devicecommunication/devicemessages`, params);\r\n }\r\n\r\n getDeviceMessageUpdates(serial: string): Observable {\r\n this.signalRService.initialise().then(() => {\r\n this.signalRService.joinDeviceGroup(serial);\r\n this.signalRService.registerEvents(WebSocketEvents.DeviceMessageCommandUpdate, this.deviceMessageCommandUpdateReceived);\r\n })\r\n return this.deviceMessageCommandUpdateReceived;\r\n }\r\n}\r\n","export enum DeviceCommunicationType {\r\n Job,\r\n Message,\r\n SetOdometer,\r\n Restart,\r\n ConfigUpdate,\r\n SetPrimaryApn,\r\n SetPrimaryApnPassword,\r\n SetSecondaryApn,\r\n SetSecondaryApnPassword,\r\n ForcePlotReport,\r\n DeleteAllQueuedMessages,\r\n SetSquarellDcf,\r\n SetSquarellFirmware,\r\n CalibrateAccelerometer,\r\n StartAccelerometer,\r\n GetSquarellThresholds,\r\n Custom,\r\n SetSquarellThresholds0to12,\r\n SetSquarellThresholds12to22,\r\n SetSquarellThresholds22up,\r\n CustomSquarellCommand134,\r\n GetSquarellExtendedVersion,\r\n GetSquarellFMS,\r\n GetSquarellParams,\r\n SetSquarellParams,\r\n CheckSquarellCalibration,\r\n SetPrimaryHostEndpoint,\r\n SetSecondaryHostEndpoint,\r\n SetHostPortNumber,\r\n CustomSquarellCommand135,\r\n TurnOffSerialData511,\r\n TurnOffSerialData580,\r\n TurnOffSerialData601,\r\n TurnOffSerialData602,\r\n TurnOffSerialData603,\r\n TurnOffSerialData604,\r\n TurnOffSerialData660,\r\n TurnOffSerialData850,\r\n SetTranscanClock,\r\n SetDeviceParameters,\r\n LoggingLevel,\r\n RemovePendingVideoRequests,\r\n CameraReboot,\r\n GetLogFile,\r\n TelematicsMode,\r\n GenericFileUpload,\r\n AdbPassthrough\r\n}\r\n","import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, TemplateRef, ViewChild } from '@angular/core';\r\nimport { VDialogRef } from '@app/directives/_layout/v-dialog/v-dialog-ref';\r\nimport { DialogService } from '@app/directives/_layout/v-dialog/v-dialog.service';\r\nimport { VTableComponent } from '@app/directives/_layout/v-table/_components/v-table.component';\r\nimport { IVTableColumn } from '@app/directives/_layout/v-table/_models/IVTableColumn';\r\nimport { IVTableRow } from '@app/directives/_layout/v-table/_models/IVTableRow';\r\nimport { VTableService } from '@app/directives/_layout/v-table/_services/v-table.service';\r\nimport { VTabComponent } from '@app/directives/_layout/v-tabs/v-tab.component';\r\nimport { SortDirection } from '@app/enum/SortDirection';\r\nimport { IConfigurableCameraDevice, IPeripheral } from '@app/interfaces/IPeripheral';\r\nimport { IUserIdToNameMapping } from '@app/main/modules/foundation/foundation.interfaces';\r\nimport { CommServerRequestState } from '@app/main/modules/foundation/_routes/hardware/_enums/CommServerRequestState';\r\nimport { IPeripheralMetadata } from \"@app/main/modules/foundation/_routes/hardware/_models/IPeripheralMetadata\";\r\nimport { CameraApplicationState, CameraAppType, ICameraApp } from '@app/main/modules/foundation/_routes/rv-lite/application/_models/ICameraApp';\r\nimport { CameraAppService } from '@app/main/modules/foundation/_routes/rv-lite/application/_services/camera-app.service';\r\nimport { CameraApplicationRequestService } from '@app/main/modules/foundation/_routes/rv-lite/application/_services/cameraApplicationRequestService';\r\nimport { IApplicationCameraRequest, IConfigCameraRequest } from '@app/main/modules/foundation/_routes/rv-lite/camera-config/camera-configuration.models';\r\nimport { ICameraConfiguration } from '@app/main/modules/foundation/_routes/rv-lite/config/_models/ICameraConfiguration';\r\nimport { CameraConfigurationRequestService } from '@app/main/modules/foundation/_routes/rv-lite/config/_services/cameraConfigurationRequestService';\r\nimport { UserService } from '@app/main/modules/foundation/_services/user.service';\r\nimport { CameraCommunicationServerService } from '@app/services/camera/camera-communication-server.service';\r\nimport { IConfigurationFile, IConfigurationUpdate } from '@app/services/cameraCommunicationServer.service';\r\nimport { CurrentUserService } from '@app/services/currentUser.service';\r\nimport { DateService, DateUnit } from '@app/services/date.service';\r\nimport { TranslationService } from '@app/services/translation.service';\r\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\r\nimport { combineLatest, EMPTY, forkJoin, Observable } from 'rxjs';\r\nimport { map, mergeMap, tap } from 'rxjs/operators';\r\nimport './config-switcher.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'config-switcher',\r\n template: require('./config-switcher.component.html')\r\n})\r\nexport class ConfigSwitcherComponent implements OnInit {\r\n // shared inputs\r\n @Input() isDeviceSpecific: boolean;\r\n @Input() allConfigs: ICameraConfiguration[];\r\n\r\n // inputs from device specific overview\r\n @Input() peripheral: IPeripheral; \r\n @Input() peripheralMetadata: IPeripheralMetadata;\r\n @Input() veriConfigHistory: IConfigCameraRequest[];\r\n\r\n // Inputs from multi-select table\r\n @Input() selectedRows: IVTableRow[];\r\n @Input() selectedDeviceColumns: IVTableColumn[];\r\n @Input() selectedDevices: IPeripheral[] = [];\r\n\r\n @Output() onActionsSet = new EventEmitter();\r\n @Output() onAutoUpdateSet = new EventEmitter();\r\n\r\n // tables\r\n configHistoryTableColumns: IVTableColumn[] = [];\r\n configHistoryTableRows: IVTableRow[] = [];\r\n updaterHistoryTableColumns: IVTableColumn[] = []\r\n updaterHistoryTableRows: IVTableRow[] = [];\r\n telematicsHistoryTableColumns: IVTableColumn[] = []\r\n telematicsHistoryTableRows: IVTableRow[] = [];\r\n\r\n loading: boolean = false;\r\n loadingTable: boolean = false;\r\n\r\n availableConfigs: ICameraConfiguration[];\r\n allApps: ICameraApp[];\r\n availableTelematicsApps: ICameraApp[];\r\n availableUpdaterApps: ICameraApp[];\r\n\r\n telematicsAppToApply: ICameraApp;\r\n updaterAppToApply: ICameraApp;\r\n configToApply: ICameraConfiguration;\r\n forceUpdate: boolean = false;\r\n\r\n userToNameList: IUserIdToNameMapping[];\r\n\r\n selectedTab: VTabComponent;\r\n\r\n changeUpdateList: string[] = [];\r\n\r\n @ViewChild(VTableComponent) table: VTableComponent;\r\n @ViewChild('confirmApplyTemplate') confirmApplyTemplate: TemplateRef;\r\n dialog: VDialogRef;\r\n\r\n // Commserver fields to be deleted when Commserver goes\r\n currentConfigId: number;\r\n deviceTypeId: number;\r\n deviceId: number;\r\n configUpdateHistory: IConfigurationUpdate[] = [];\r\n configFiles: IConfigurationFile[];\r\n selectedConfigFile: IConfigurationFile;\r\n \r\n get formIsCompletable(): boolean {\r\n return this.telematicsAppToApply?.Id != -1 || this.updaterAppToApply?.Id != -1 || this.configToApply?.Id != -1\r\n }\r\n\r\n get showApplyButton(): boolean {\r\n return this.selectedTab?.tabId == \"apply\"\r\n }\r\n\r\n get getConfirmationString(): string {\r\n return `${this.selectedDevices?.length > 1 ? this.selectedDevices?.length + this.translationService.t(\"ConfigManagement.DevicesLowerCase\") : this.selectedDevices[0].Serial} ${this.translationService.t(\"ConfigManagement.ChangesBlurb\")}`;\r\n }\r\n\r\n constructor(\r\n private readonly cd: ChangeDetectorRef,\r\n private readonly cameraCommunicationServer: CameraCommunicationServerService,\r\n private readonly vTableService: VTableService,\r\n private readonly cameraAppService: CameraAppService,\r\n private readonly userService: UserService,\r\n private readonly cameraConfigurationRequestService: CameraConfigurationRequestService,\r\n private readonly cameraApplicationRequestService: CameraApplicationRequestService,\r\n private readonly dateService: DateService,\r\n private readonly currentUserService: CurrentUserService,\r\n private readonly translationService: TranslationService,\r\n private readonly dialogService: DialogService\r\n ) { } \r\n\r\n ngOnInit(): void {\r\n this.createTables();\r\n this.loadData().pipe(untilDestroyed(this)).subscribe({\r\n next: () => this.loading = false\r\n });\r\n }\r\n \r\n setForceUpdate($event: any): void {\r\n this.forceUpdate = $event;\r\n }\r\n\r\n onSelectedTabChanged(tab: VTabComponent): void {\r\n this.selectedTab = tab;\r\n }\r\n\r\n confirmSaveAndCloseDialog(): void {\r\n this.closeDialog(); \r\n\r\n const observablesArray: Observable[] = [];\r\n\r\n this.selectedDevices.forEach(device => {\r\n if (this.configToApply.Id > 0) {\r\n const newRequest: IConfigCameraRequest = {\r\n Id: 0,\r\n ForceUpdate: this.forceUpdate,\r\n RequestState: CommServerRequestState.Pending,\r\n ConfigurationId: this.configToApply.Id,\r\n DeviceSerial: device.Serial,\r\n Expires: this.dateService.addOrSubtractTime(new Date, 1, DateUnit.Day),\r\n UserId: this.currentUserService.cachedUser.Id,\r\n VehicleId: device.vehicleMapping?.VehicleId\r\n }\r\n\r\n observablesArray.push(this.cameraConfigurationRequestService.postConfigurationRequest(newRequest));\r\n }\r\n\r\n if (this.telematicsAppToApply.Id > 0) {\r\n const newRequest: IApplicationCameraRequest = {\r\n Id: 0,\r\n ForceUpdate: this.forceUpdate,\r\n RequestState: CommServerRequestState.Pending,\r\n ApplicationId: this.telematicsAppToApply.Id,\r\n DeviceSerial: device.Serial,\r\n Expires: this.dateService.addOrSubtractTime(new Date, 1, DateUnit.Day),\r\n UserId: this.currentUserService.cachedUser.Id,\r\n VehicleId: device.vehicleMapping?.VehicleId\r\n }\r\n\r\n observablesArray.push(this.cameraApplicationRequestService.postApplicationRequest(newRequest));\r\n }\r\n\r\n if (this.updaterAppToApply.Id > 0) {\r\n const newRequest: IApplicationCameraRequest =\r\n {\r\n Id: 0,\r\n ForceUpdate: this.forceUpdate,\r\n RequestState: CommServerRequestState.Pending,\r\n ApplicationId: this.updaterAppToApply.Id,\r\n DeviceSerial: device.Serial,\r\n Expires: this.dateService.addOrSubtractTime(new Date, 1, DateUnit.Day),\r\n UserId: this.currentUserService.cachedUser.Id,\r\n VehicleId: device.vehicleMapping?.VehicleId\r\n }\r\n\r\n observablesArray.push(this.cameraApplicationRequestService.postApplicationRequest(newRequest));\r\n }\r\n\r\n this.cancelSupersededRequests(observablesArray);\r\n }); \r\n\r\n if (observablesArray.length > 0) {\r\n forkJoin(observablesArray)\r\n .pipe(\r\n untilDestroyed(this),\r\n tap(data => {\r\n data.forEach(update => {\r\n if (!!this.peripheral && !!update.ConfigurationId && update.RequestState === CommServerRequestState.Pending) {\r\n this.peripheral.veriConfigUpdateHistory.push(update);\r\n }\r\n\r\n if (this.peripheral && !!update.ApplicationId && update.RequestState === CommServerRequestState.Pending) {\r\n this.peripheral.veriAppUpdateHistory.push(update);\r\n }\r\n })\r\n\r\n this.createTableRows();\r\n this.cd.detectChanges();\r\n this.onActionsSet.emit();\r\n })\r\n ).subscribe();\r\n } \r\n }\r\n \r\n confirmApplySelectedActions(): void {\r\n if (!this.selectedDevices.length) {\r\n this.selectedDevices.push(this.peripheral);\r\n }\r\n\r\n this.constructChangesUpdateList();\r\n\r\n this.dialog = this.dialogService.open(this.confirmApplyTemplate, null);\r\n }\r\n\r\n closeDialog(): void {\r\n this.dialog.close();\r\n }\r\n\r\n setAutoUpdate(): void {\r\n this.onAutoUpdateSet.emit(this.peripheralMetadata.AutoUpdate); \r\n }\r\n\r\n private constructChangesUpdateList(): void {\r\n this.changeUpdateList = [];\r\n\r\n if (this.configToApply?.Id > 0) {\r\n this.changeUpdateList.push(this.translationService.t(\"ConfigManagement.ConfigVersion\", this.configToApply.Name));\r\n }\r\n\r\n if (this.updaterAppToApply?.Id > 0) {\r\n this.changeUpdateList.push(this.translationService.t(\"ConfigManagement.UpdaterAppVersion\", this.updaterAppToApply.Version));\r\n }\r\n\r\n if (this.telematicsAppToApply?.Id > 0) {\r\n this.changeUpdateList.push(this.translationService.t(\"ConfigManagement.TelematicsAppVersion\", this.telematicsAppToApply.Version));\r\n }\r\n\r\n if (this.forceUpdate) {\r\n this.changeUpdateList.push(this.translationService.t(\"ConfigManagement.ForceUpdateConfirmation\"));\r\n }\r\n\r\n this.changeUpdateList.push(this.translationService.t(\"ConfigManagement.AutoCancelPending\"))\r\n }\r\n\r\n private cancelSupersededRequests(observablesArray: Observable[]): void {\r\n if (!this.peripheral) {\r\n return;\r\n }\r\n\r\n if (this.configToApply?.Id > 0) {\r\n this.peripheral.veriConfigUpdateHistory?.filter(u => u.RequestState === CommServerRequestState.Pending && u.Id > 0)\r\n .forEach(update => {\r\n update.RequestState = CommServerRequestState.Cancelled;\r\n\r\n observablesArray.push(this.cameraConfigurationRequestService.postConfigurationRequest(update));\r\n });\r\n }\r\n\r\n if (this.telematicsAppToApply?.Id > 0) {\r\n this.peripheral.veriAppUpdateHistory?.filter(u => this.cameraAppService.getAppType(u.ApplicationId, this.allApps) === CameraAppType.Telematics && u.RequestState === CommServerRequestState.Pending && u.Id > 0)\r\n .forEach(update => {\r\n update.RequestState = CommServerRequestState.Cancelled;\r\n\r\n observablesArray.push(this.cameraApplicationRequestService.postApplicationRequest(update));\r\n });\r\n }\r\n\r\n if (this.updaterAppToApply?.Id > 0) {\r\n this.peripheral.veriAppUpdateHistory?.filter(u => this.cameraAppService.getAppType(u.ApplicationId, this.allApps) === CameraAppType.Updater && u.RequestState === CommServerRequestState.Pending && u.Id > 0)\r\n .forEach(update => {\r\n update.RequestState = CommServerRequestState.Cancelled;\r\n\r\n observablesArray.push(this.cameraApplicationRequestService.postApplicationRequest(update));\r\n });\r\n }\r\n }\r\n\r\n private loadData(): Observable {\r\n this.loading = true;\r\n return combineLatest([\r\n this.cameraAppService.getApplicationFiles(),\r\n this.userService.getIdToNameMappings()\r\n ]).pipe(\r\n mergeMap(([apps, userList]) => {\r\n this.allApps = apps;\r\n this.availableTelematicsApps = this.allApps.filter(app => app.IsActive && app.CameraAppType === CameraAppType.Telematics);\r\n this.availableUpdaterApps = this.allApps.filter(app => app.IsActive && app.CameraAppType === CameraAppType.Updater);\r\n\r\n this.availableConfigs = this.allConfigs.filter(config => config.IsActive);\r\n this.userToNameList = userList;\r\n\r\n this.includeSetupOption();\r\n\r\n if (!this.isDeviceSpecific) {\r\n this.loading = false;\r\n return EMPTY;\r\n }\r\n\r\n this.loadingTable = true;\r\n return this.getConfigDataFromCommserver();\r\n }));\r\n }\r\n\r\n private includeSetupOption(): void {\r\n this.telematicsAppToApply = {\r\n Name: this.translationService.t('ConfigManagement.NoTelematicsUpdate'),\r\n IsActive: true,\r\n CameraAppType: CameraAppType.Telematics,\r\n Description: \"\",\r\n Id: -1,\r\n State: CameraApplicationState.Production,\r\n FileGuid: \"\",\r\n Version: \"1\"\r\n };\r\n\r\n this.updaterAppToApply = {\r\n Name: this.translationService.t('ConfigManagement.NoUpdaterUpdate'),\r\n IsActive: true,\r\n CameraAppType: CameraAppType.Updater,\r\n Description: \"\",\r\n Id: -1,\r\n State: CameraApplicationState.Production,\r\n FileGuid: \"\",\r\n Version: \"1\"\r\n };\r\n\r\n this.configToApply = {\r\n ConfigJson: \"\",\r\n Id: -1,\r\n IsActive: true,\r\n Name: this.translationService.t('ConfigManagement.NoConfigUpdate'),\r\n Version: 1,\r\n VersionGroup: \"1\"\r\n };\r\n\r\n this.availableConfigs.push(this.configToApply);\r\n this.availableTelematicsApps.push(this.telematicsAppToApply);\r\n this.availableUpdaterApps.push(this.updaterAppToApply);\r\n }\r\n\r\n private createTables(): void {\r\n this.configHistoryTableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Config\" }),\r\n createCellFunction: (data) => this.vTableService.createTableCell(data.Description, { tooltip: true })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Status\", sorted: false }),\r\n createCellFunction: (data) => this.vTableService.createTableCell(data.Status)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"Common.RequestedDate\", sorted: true, sortDirection: SortDirection.Descending }),\r\n createCellFunction: (data) => this.vTableService.createDateCell(data.RequestedDate, { dateTime: true })\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"Common.InstalledDate\", sortable: false }),\r\n createCellFunction: data => this.vTableService.createDateCell(data.InstalledDate ?? null, { dateTime: true })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.RequestedBy\" }),\r\n createCellFunction: data => this.vTableService.createTableCell(data.RequestedUserName, { tooltip: true })\r\n },\r\n ];\r\n\r\n this.updaterHistoryTableColumns = this.telematicsHistoryTableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ title: \"Version\" }),\r\n createCellFunction: (data) => this.vTableService.createTableCell(this.allApps.find(a => a.Id == data.ApplicationId).Version, { tooltip: true })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Status\", sorted: false }),\r\n createCellFunction: (data) => this.vTableService.createTableCell(CommServerRequestState[data.RequestState])\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"Common.RequestedDate\", sorted: true, sortDirection: SortDirection.Descending }),\r\n createCellFunction: (data) => this.vTableService.createDateCell(data.CreatedTime, { dateTime: true })\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"Common.InstalledDate\", sortable: false }),\r\n createCellFunction: data => this.vTableService.createDateCell(data.RequestState === CommServerRequestState.Completed ? data.UpdatedTime: null, { dateTime: true })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.RequestedBy\" }),\r\n createCellFunction: data => this.vTableService.createTableCell(this.getUserNameFromId(data.UserId), { tooltip: true })\r\n },\r\n ];\r\n }\r\n\r\n private createTableRows(): void {\r\n if (!this.isDeviceSpecific) {\r\n return;\r\n }\r\n\r\n const combinedConfigUpdates: ICombinedConfigUpdate[] = [];\r\n\r\n this.configUpdateHistory?.forEach(update => {\r\n combinedConfigUpdates.push({\r\n Description: update.Description,\r\n Status: update.Status,\r\n RequestedDate: update.RequestedDate,\r\n InstalledDate: update.InstalledDate,\r\n RequestedUserName: update.RequestedUserName\r\n });\r\n });\r\n\r\n this.peripheral.veriConfigUpdateHistory?.forEach(update => {\r\n combinedConfigUpdates.push({\r\n Description: this.allConfigs.find(c => c.Id == update.ConfigurationId).Name,\r\n Status: CommServerRequestState[update.RequestState],\r\n RequestedDate: update.CreatedTime,\r\n InstalledDate: update.RequestState === CommServerRequestState.Completed ? update.UpdatedTime : null,\r\n RequestedUserName: this.getUserNameFromId(update.UserId)\r\n })\r\n });\r\n\r\n this.configHistoryTableRows = this.vTableService.createTableRows(combinedConfigUpdates, this.configHistoryTableColumns);\r\n\r\n this.updaterHistoryTableRows = this.vTableService.createTableRows(this.peripheral.veriAppUpdateHistory.filter(update => this.cameraAppService.getAppType(update.ApplicationId, this.allApps) === CameraAppType.Updater), this.updaterHistoryTableColumns);\r\n this.telematicsHistoryTableRows = this.vTableService.createTableRows(this.peripheral.veriAppUpdateHistory.filter(update => this.cameraAppService.getAppType(update.ApplicationId, this.allApps) === CameraAppType.Telematics), this.telematicsHistoryTableColumns);\r\n }\r\n\r\n private getUserNameFromId(userId: number): string {\r\n const rawName = this.userToNameList.find(u => u.UserId == userId)?.Username ?? \"Unknown\";\r\n\r\n return rawName.split('@')[0]\r\n .split('.')\r\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\r\n .join(' ');\r\n }\r\n\r\n // CommmServer Communications - to be deletaed once shut down\r\n\r\n private getConfigFilesForDevice(): void {\r\n if (!this.deviceTypeId) {\r\n return;\r\n }\r\n \r\n this.selectedConfigFile = null;\r\n\r\n this.cameraCommunicationServer.getAvailableConfigFiles(this.deviceTypeId, true)\r\n .pipe(untilDestroyed(this))\r\n .subscribe({\r\n next: configFiles => {\r\n this.configFiles = configFiles.filter(file => !file.Archived).sort((a, b) => {\r\n if (a.ConfigFileName < b.ConfigFileName) {\r\n return -1;\r\n }\r\n if (a.ConfigFileName > b.ConfigFileName) {\r\n return 1;\r\n }\r\n return 0;\r\n });\r\n\r\n this.selectCurrentConfig();\r\n },\r\n error: (error) => console.log(error)\r\n })\r\n }\r\n\r\n private selectCurrentConfig(): void {\r\n this.selectedConfigFile = this.configFiles.find(configFile => configFile.ConfigFileId == this.currentConfigId);\r\n }\r\n\r\n private getConfigHistory(): Observable {\r\n if (isNaN(this.deviceTypeId) || this.configUpdateHistory?.length) {\r\n return;\r\n }\r\n\r\n this.cameraCommunicationServer\r\n .getConfigurationUpdateHistory(this.deviceId)\r\n .pipe(untilDestroyed(this))\r\n .subscribe({\r\n next: (configHistory) => (this.configUpdateHistory = configHistory),\r\n error: (error) => console.log(error),\r\n complete: () => {\r\n this.createTableRows();\r\n }\r\n })\r\n }\r\n\r\n private getConfigDataFromCommserver(): Observable {\r\n return forkJoin({\r\n deviceInfo: this.cameraCommunicationServer.getDeviceInfo(this.peripheral.Serial),\r\n })\r\n .pipe(\r\n mergeMap(data => {\r\n this.deviceTypeId = data.deviceInfo?.DeviceTypeId;\r\n this.deviceId = data.deviceInfo?.DeviceId;\r\n this.currentConfigId = data.deviceInfo?.ConfigId;\r\n\r\n return this.cameraCommunicationServer.getConfigurationUpdateHistory(this.deviceId);\r\n }),\r\n map(() => {\r\n this.getConfigFilesForDevice();\r\n this.getConfigHistory();\r\n\r\n this.loadingTable = false;\r\n\r\n return;\r\n })\r\n );\r\n }\r\n\r\n registerConfigUpdateToCommServer(): void {\r\n\r\n\r\n const param = {\r\n DeviceId: this.deviceId,\r\n ConfigFileId: this.selectedConfigFile.ConfigFileId,\r\n };\r\n\r\n this.cameraCommunicationServer\r\n .postConfigUpdate(param)\r\n .pipe(\r\n untilDestroyed(this)\r\n )\r\n .subscribe({\r\n complete: () => {\r\n this.currentConfigId = this.selectedConfigFile.ConfigFileId;\r\n this.getConfigHistory();\r\n },\r\n error: (error) => {\r\n console.error(error)\r\n }\r\n });\r\n\r\n }\r\n}\r\n\r\n// Short lived interface to be deleted when Commserver is deprecated\r\n// Used to provide the UI with a unified interface for config updates\r\n// while we have two separate datasources/models\r\ninterface ICombinedConfigUpdate {\r\n Description: string;\r\n Status: string;\r\n RequestedDate: Date;\r\n InstalledDate?: Date;\r\n RequestedUserName: string;\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { getOptionsQueryParams } from \"@app/class/Utilities\";\r\nimport { ICameraRequestUpdateMessage } from \"@app/main/modules/foundation/_routes/developerConsole/log-message.model\";\r\nimport { SignalRService, WebSocketEvents } from \"@app/main/modules/foundation/_routes/developerConsole/signalr.service\";\r\nimport { IApplicationCameraRequest, IApplicationRequestQueryOptions } from \"@app/main/modules/foundation/_routes/rv-lite/camera-config/camera-configuration.models\";\r\nimport { Observable, Subject } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CameraApplicationRequestService {\r\n\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly signalRService: SignalRService) { }\r\n\r\n appRequestUpdateReceived = new Subject();\r\n\r\n getApplicationRequests(queryOptions: IApplicationRequestQueryOptions): Observable {\r\n const params = getOptionsQueryParams(queryOptions);\r\n return this.http.get(`/api/cameras/commserver/applications/requests`, params);\r\n }\r\n\r\n postApplicationRequest(appRequest: IApplicationCameraRequest): Observable {\r\n return this.http.post(`/api/cameras/commserver/applications/requests`, appRequest);\r\n }\r\n\r\n getApplicationRequestUpdates(serial: string): Observable {\r\n this.signalRService.initialise().then(() => {\r\n this.signalRService.joinDeviceGroup(serial);\r\n this.signalRService.registerEvents(WebSocketEvents.LogRequestUpdate, this.appRequestUpdateReceived);\r\n })\r\n return this.appRequestUpdateReceived;\r\n }\r\n}\r\n","import { Component, Input, OnChanges, SimpleChanges } from \"@angular/core\";\r\nimport { NavigationService } from \"@services/navigation.service\";\r\nimport { IUnit } from \"@interfaces/IPeripheral\";\r\nimport { CommissionService } from \"../../_routes/commissions/commission.service\";\r\nimport \"./device-summary.component.scss\";\r\nimport { FoundationNavigationModule } from \"../../foundation.navigation\";\r\nimport { SimService } from \"../../_services/sim.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { finalize, map, switchMap } from \"rxjs/operators\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { ISim } from \"@app/interfaces/ISim\";\r\nimport { ProductVendor } from \"@app/main/components/videos/enums/CameraProductType\";\r\nimport { SimMappingService } from \"@app/main/modules/foundation/_services/sim-mapping.service\";\r\nimport { ISerialSearchResponse } from \"@app/main/modules/foundation/_models/ISerialSearchResponse\";\r\nimport { AccountFeatures } from \"@app/enum/account/AccountFeature\";\r\nimport { SimMappingType } from \"@app/interfaces/ISimMapping\";\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: \"device-summary\",\r\n template: require(\"./device-summary.component.html\")\r\n})\r\nexport class DeviceSummaryComponent implements OnChanges {\r\n @Input() serial: string;\r\n @Input() unit: IUnit;\r\n @Input() static: boolean = false;\r\n @Input() disableSerialLink: boolean;\r\n\r\n // ---\r\n\r\n sim: ISim;\r\n showSimDetail = false;\r\n loading = false;\r\n\r\n constructor(\r\n private readonly commissionService: CommissionService,\r\n private readonly navigationService: NavigationService,\r\n private readonly simMappingService: SimMappingService,\r\n private readonly simService: SimService) {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['unit'] && !this.static && this.unit.Serial) {\r\n this.loadData();\r\n }\r\n }\r\n\r\n serialClicked(unit: IUnit, $event: MouseEvent) {\r\n $event.preventDefault();\r\n\r\n if (!unit.Id) {\r\n return;\r\n }\r\n\r\n if (unit.Imei) {\r\n this.navigationService.go(`${FoundationNavigationModule.Units}.view`, { unitSerial: unit.Serial });\r\n }\r\n else if (this.isCameraProduct(unit)) {\r\n this.navigationService.go(`${FoundationNavigationModule.Cameras}.view`, { serial: unit.Serial });\r\n }\r\n else {\r\n this.navigationService.go(`${FoundationNavigationModule.Peripherals}.view`, { serial: unit.Serial });\r\n }\r\n }\r\n\r\n openSimDetails(): void {\r\n this.showSimDetail = true;\r\n }\r\n\r\n closeSimDetails(): void {\r\n this.showSimDetail = false;\r\n }\r\n\r\n onNewSimAdded(sim: ISim): void {\r\n this.sim = sim;\r\n }\r\n\r\n get shouldShowSimAssign(): boolean {\r\n return !this.sim && this.unit?.Product?.GroupId !== ProductVendor.TachoSys && this.unit?.Product?.GroupId !== ProductVendor.SevenTelematics;\r\n }\r\n\r\n // ---\r\n\r\n private loadData(): void {\r\n\r\n this.loading = true;\r\n\r\n this.updateUnitOrPeripheralLabel(this.unit).pipe(\r\n untilDestroyed(this),\r\n switchMap(unitSearchResponse => {\r\n if (!!unitSearchResponse?.Unit) {\r\n this.unit.Product = unitSearchResponse.Product;\r\n return this.simMappingService.getSimMappings({ Serial: unitSearchResponse.Unit.Serial, IsActive: true, SimMappingType: SimMappingType.Unit })\r\n }\r\n\r\n if (!!unitSearchResponse?.Peripheral) {\r\n return this.simMappingService.getSimMappings({ Serial: unitSearchResponse.Peripheral.Serial, IsActive: true, SimMappingType: SimMappingType.Peripheral })\r\n }\r\n\r\n return of(null);\r\n }),\r\n switchMap(simMappings => {\r\n if (!simMappings?.length) {\r\n return of(false);\r\n }\r\n\r\n return this.simService.getSims({ Id: simMappings[0].SimId });\r\n }),\r\n map(sims => {\r\n\r\n this.sim = sims[0];\r\n return sims[0];\r\n }),\r\n finalize(() => this.loading = false))\r\n .subscribe();\r\n }\r\n\r\n private isCameraProduct(unit: IUnit): boolean {\r\n return (unit.Product.Features & AccountFeatures.Camera) === AccountFeatures.Camera;\r\n }\r\n\r\n private updateUnitOrPeripheralLabel(p: IUnit): Observable {\r\n return this.commissionService.getUnitOrPeripheralBySerial(p.Serial).pipe(\r\n map(unitSearchResponse => {\r\n unitSearchResponse.name = this.commissionService.createUnitLabel(unitSearchResponse);\r\n return unitSearchResponse;\r\n })\r\n )\r\n }\r\n}\r\n","import { Component, Input, SimpleChanges } from '@angular/core';\r\nimport './commission-4g-check.component.scss';\r\n\r\n@Component({\r\n selector: 'commission-4g-check',\r\n template: require('./commission-4g-check.component.html')\r\n})\r\nexport class Commission4gCheckComponent {\r\n @Input() pendingLabel: string;\r\n @Input() loadingLabel: string;\r\n @Input() successLabel: string;\r\n @Input() warningLabel: string;\r\n @Input() failedLabel: string;\r\n @Input() infoLabel: string;\r\n @Input() foldable: boolean;\r\n\r\n\r\n icon: string;\r\n label: string;\r\n checkStyle: {\r\n pending: boolean;\r\n loading: boolean;\r\n success: boolean;\r\n warning: boolean;\r\n info: boolean;\r\n };\r\n\r\n showDetails = false;\r\n constructor() { }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n this.updateState();\r\n this.updateStyle();\r\n }\r\n\r\n toggleDetails(): void {\r\n this.showDetails = !this.showDetails;\r\n }\r\n\r\n private updateStyle(): void {\r\n this.checkStyle = {\r\n pending: !!this.pendingLabel,\r\n loading: !!this.loadingLabel,\r\n success: !!this.successLabel,\r\n warning: !!this.warningLabel,\r\n info: !!this.infoLabel\r\n };\r\n }\r\n\r\n private updateState(): void {\r\n switch (true) {\r\n case !!this.pendingLabel && !this.loadingLabel:\r\n this.icon = `remove_circle_outline`;\r\n this.label = this.pendingLabel;\r\n break;\r\n\r\n case !!this.loadingLabel:\r\n this.icon = \"loop\";\r\n this.label = this.loadingLabel;\r\n break;\r\n\r\n case !!this.successLabel:\r\n this.icon = `check_circle`;\r\n this.label = this.successLabel;\r\n break;\r\n\r\n case !!this.infoLabel:\r\n this.icon = \"info\";\r\n this.label = this.infoLabel;\r\n break;\r\n\r\n case !!this.warningLabel:\r\n this.icon = \"warning\";\r\n this.label = this.warningLabel;\r\n this.showDetails = true;\r\n break;\r\n\r\n default:\r\n //failed\r\n this.icon = `highlight_off`;\r\n this.label = this.failedLabel;\r\n this.showDetails = true;\r\n break;\r\n }\r\n }\r\n}\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { IVTableColumn } from '@app/directives/_layout/v-table/_models/IVTableColumn';\r\nimport { IVTableRow } from '@app/directives/_layout/v-table/_models/IVTableRow';\r\nimport { VTableService } from '@app/directives/_layout/v-table/_services/v-table.service';\r\nimport { SortDirection } from '@app/enum/SortDirection';\r\nimport { NavigationService } from '@app/services/navigation.service';\r\nimport { TranslationService } from '@app/services/translation.service';\r\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\r\nimport { finalize, tap } from 'rxjs/operators';\r\nimport { NoteType } from '../../_enums/NoteType';\r\nimport { ResourceType } from '../../_enums/ResourceType';\r\nimport { FoundationNotesService } from '../../_services/notes.service';\r\nimport { INote } from '../../_services/notes.service.ajs';\r\nimport './notes-audit-list.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'foundation-notes-audit-list',\r\n template: require('./notes-audit-list.component.html')\r\n})\r\nexport class FoundationAuditNotesListComponent implements OnInit {\r\n customerId: number;\r\n\r\n notes: INote[];\r\n tabCount: number = 0;\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n loading: boolean;\r\n\r\n constructor(\r\n private readonly navigationService: NavigationService,\r\n private readonly notesService: FoundationNotesService,\r\n private readonly translationService: TranslationService,\r\n private readonly vTableService: VTableService\r\n ) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.createTable();\r\n this.customerId = this.navigationService.getRouteParam(\"customerId\");\r\n this.getData();\r\n }\r\n\r\n // ---\r\n\r\n private getData(): void {\r\n this.loading = true;\r\n\r\n this.notesService.getNotes(this.customerId, ResourceType.Account, NoteType.Automatic).pipe(\r\n untilDestroyed(this),\r\n tap(notes => {\r\n this.notes = notes;\r\n this.tabCount = notes.length;\r\n }),\r\n finalize(() => {\r\n this.tableRows = this.vTableService.createTableRows(this.notes, this.tableColumns);\r\n this.loading = false;\r\n })\r\n ).subscribe()\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader({ sorted: true, sortDirection: SortDirection.Descending }),\r\n createCellFunction: note => this.vTableService.createDateCell(note.CreatedOn)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.User\", width: 100, sortable: true }),\r\n createCellFunction: note => this.vTableService.createTableCell(this.translationService.t(\"Common.Unknown\"))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Log\", sortable: true }),\r\n createCellFunction: note => this.vTableService.createTableCell(note.Comments)\r\n }\r\n\r\n ]\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnInit, Output, TemplateRef, ViewChild } from \"@angular/core\";\r\nimport { getValuesFromEnum } from \"@app/class/Utilities\";\r\nimport { FileUploadComponent } from \"@app/directives/_forms/fileUpload/fileUpload.component\";\r\nimport { VDialogRef } from \"@app/directives/_layout/v-dialog/v-dialog-ref\";\r\nimport { DialogService } from \"@app/directives/_layout/v-dialog/v-dialog.service\";\r\nimport { VTableRowStatus } from \"@app/directives/_layout/v-table/_enums/VTableRowStatus.enum\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { VTabComponent } from \"@app/directives/_layout/v-tabs/v-tab.component\";\r\nimport { VTabsComponent } from \"@app/directives/_layout/v-tabs/v-tabs.component\";\r\nimport { VTableSelectionType } from \"@app/enum/VTableSelectionType\";\r\nimport { IPeripheral, IUnit } from \"@app/interfaces/IPeripheral\";\r\nimport { IProduct } from \"@app/interfaces/IProduct\";\r\nimport { ISim, SimType } from \"@app/interfaces/ISim\";\r\nimport { ISimMapping } from \"@app/interfaces/ISimMapping\";\r\nimport { IUser } from \"@app/interfaces/IUser\";\r\nimport { ProductVendor } from \"@app/main/components/videos/enums/CameraProductType\";\r\nimport { EngineerJobItemType, ImportStrategyReference, ImportType } from \"@app/main/modules/foundation/foundation.enums\";\r\nimport { ICsvImportCompletionResultDTO, ICsvImportValidationResultDTO, IImportValidationDTO, IJobItemValidationResultDTO, ImportValidationError, SimToSerialMappings } from \"@app/main/modules/foundation/foundation.interfaces\";\r\nimport { IUserGroup } from \"@app/main/modules/foundation/_models/IUserGroup\";\r\nimport { AccountService } from \"@app/main/modules/foundation/_services/account.service\";\r\nimport { FoundationCsvImporterService } from \"@app/main/modules/foundation/_services/foundation-csv-importer.service\";\r\nimport { UserGroupService } from \"@app/main/modules/foundation/_services/user-group.service\";\r\nimport { CurrentUserService } from \"@app/services/currentUser.service\";\r\nimport { ProductService } from \"@app/services/product.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { combineLatest } from \"rxjs\";\r\nimport { ErrorType } from \"../../_enums/ErrorType\";\r\nimport { IReseller } from \"../../_models/IReseller\";\r\nimport './foundation-csv-importer.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'foundation-csv-importer',\r\n template: require('./foundation-csv-importer.component.html')\r\n})\r\nexport class FoundationCsvImporterComponent implements OnInit {\r\n @Input() importStrategyRef: ImportStrategyReference;\r\n @Input() jobId: number;\r\n @Input() accountId: number;\r\n @Input() onFinishRedirectTo: string;\r\n @Input() importType: ImportType;\r\n\r\n @Output() modelSave = new EventEmitter();\r\n @Output() onFinishCallback = new EventEmitter();\r\n\r\n // Global component\r\n selectedFile: File | null = null;\r\n importStrategyReference = ImportStrategyReference;\r\n\r\n importValidationResult: ICsvImportValidationResultDTO = null;\r\n validationCompleted: boolean;\r\n importCount: number;\r\n completionString: string;\r\n\r\n loading: boolean = false;\r\n dialog: VDialogRef;\r\n\r\n vTableSelectionType = VTableSelectionType.Single;\r\n\r\n fileSetupErrors: ImportValidationError[];\r\n mainAssetErrors: ImportValidationError[];\r\n\r\n // Device import specific\r\n products: IProduct[];\r\n selectedProduct: IProduct;\r\n selectedTypeString: string;\r\n\r\n // Sim import specific\r\n selectedSimType = SimType.WirelessLogic;\r\n simType = SimType;\r\n simTypeStrings = getValuesFromEnum(SimType);\r\n\r\n preMappedSimsToSerial: SimToSerialMappings[];\r\n newSimsToCreate: ISim[];\r\n\r\n fatalSimErrors: ImportValidationError[];\r\n warningSimErrors: ImportValidationError[];\r\n existingMappingsToEnd: ISimMapping[];\r\n\r\n // Engineer import specific\r\n groups: IUserGroup[];\r\n selectedUserGroup: IUserGroup;\r\n currentUser: IUser;\r\n\r\n // Job item import specific\r\n selectedJobItemType: EngineerJobItemType = EngineerJobItemType.Install;\r\n engineerJobItemType = EngineerJobItemType;\r\n visitReasonStrings = Object.values(EngineerJobItemType).filter(s => !isNaN(Number(s))).map(s => Number(s));\r\n resellerMap: Map;\r\n jobReasonMap: Map;\r\n\r\n // HTML children\r\n @ViewChild('completionConfirmation') completionConfirmation: TemplateRef;\r\n @ViewChild('importRequestConfirmation') importRequestConfirmation: TemplateRef;\r\n @ViewChild('fileUpload') fileUpload: FileUploadComponent;\r\n @ViewChild('vTabsComponent') vTabsComponent: VTabsComponent;\r\n\r\n // table setups\r\n jobItemImportTableColumns: IVTableColumn[]\r\n jobItemImportTableRows: IVTableRow[];\r\n\r\n engineerImportTableColumns: IVTableColumn[];\r\n engineerImportTableRows: IVTableRow[];\r\n\r\n unitImportTableColumns: IVTableColumn[];\r\n unitImportTableRows: IVTableRow[];\r\n\r\n peripheralImportTableColumns: IVTableColumn[];\r\n peripheralImportTableRows: IVTableRow[];\r\n\r\n deviceErrorTableColumns: IVTableColumn[];\r\n deviceErrorTableRows: IVTableRow[];\r\n\r\n simErrorTableColumns: IVTableColumn[];\r\n simErrorTableRows: IVTableRow[];\r\n\r\n simImportTableColumns: IVTableColumn[];\r\n simImportTableRows: IVTableRow[];\r\n\r\n productTableColumns: IVTableColumn[];\r\n productTableRows: IVTableRow[];\r\n\r\n engineerGroupTableColumns: IVTableColumn[];\r\n engineerGroupTableRows: IVTableRow[];\r\n\r\n jobReasonTableColumns: IVTableColumn[];\r\n jobReasonTableRows: IVTableRow[];\r\n\r\n constructor(\r\n private readonly foundationCsvImporterService: FoundationCsvImporterService,\r\n private readonly productService: ProductService,\r\n private readonly vTableService: VTableService,\r\n private readonly dialogService: DialogService,\r\n private readonly translationService: TranslationService,\r\n private readonly userGroupService: UserGroupService,\r\n private readonly currentUserService: CurrentUserService,\r\n private readonly accountService: AccountService,) { }\r\n\r\n ngOnInit(): void {\r\n this.setupComponent();\r\n }\r\n\r\n private setupComponent() {\r\n this.currentUserService.getCurrentUser().then(currentUser => {\r\n this.currentUser = currentUser;\r\n\r\n this.createSelectionTables();\r\n this.createValidationTables();\r\n\r\n switch (this.importStrategyRef) {\r\n case ImportStrategyReference.Device:\r\n this.initProductTable();\r\n break;\r\n case ImportStrategyReference.Engineer:\r\n this.initEngineerGroupTable();\r\n break;\r\n case ImportStrategyReference.JobItem:\r\n this.initJobReasonTable();\r\n default:\r\n break;\r\n }\r\n });\r\n }\r\n\r\n private initEngineerGroupTable(): void {\r\n combineLatest([\r\n this.accountService.getResellers(),\r\n this.userGroupService.getUserGroups()\r\n ]).pipe(untilDestroyed(this)).subscribe(([resellers, userGroups]) => {\r\n this.resellerMap = new Map(resellers.map(reseller => [reseller.Id, reseller]));\r\n\r\n this.groups = userGroups;\r\n\r\n if (this.currentUser.IsReseller && !!this.groups.length) {\r\n this.groups = this.groups.filter(g => this.currentUser.ResellerIds.some(resellerId => resellerId === g.ResellerId));\r\n }\r\n\r\n if (!this.groups.length) {\r\n return;\r\n }\r\n\r\n this.selectedUserGroup = this.groups[0];\r\n\r\n this.engineerGroupTableRows = this.vTableService.createTableRows(this.groups, this.engineerGroupTableColumns, 0);\r\n });\r\n }\r\n\r\n private initProductTable(): void {\r\n this.productService.getProducts().then(products => {\r\n this.products = products.filter(p => p.HasSerial == true && p.Visible == true);\r\n\r\n if (!this.products.length) {\r\n return;\r\n }\r\n\r\n switch (this.importType) {\r\n case ImportType.Peripheral:\r\n this.products = this.products.filter(p =>\r\n p.GroupId === ProductVendor.AAMP ||\r\n p.GroupId === ProductVendor.Streamax ||\r\n p.GroupId === ProductVendor.RTL ||\r\n p.GroupId === ProductVendor.Alcolock ||\r\n p.GroupId === ProductVendor.TachoSys ||\r\n p.GroupId === ProductVendor.SevenTelematics);\r\n break;\r\n case ImportType.Unit:\r\n this.products = this.products.filter(p =>\r\n p.GroupId === ProductVendor.Calamp ||\r\n p.GroupId === ProductVendor.Queclink);\r\n break;\r\n default:\r\n }\r\n\r\n this.productService.sortProductsByGroup(this.products);\r\n\r\n this.selectedProduct = this.products[0];\r\n\r\n this.productTableRows = this.vTableService.createTableRows(this.products, this.productTableColumns, 0);\r\n });\r\n }\r\n\r\n private initJobReasonTable(): void {\r\n this.jobReasonTableRows = this.vTableService.createTableRows(this.visitReasonStrings, this.jobReasonTableColumns, 0)\r\n }\r\n\r\n readDeviceImportFile(event: any): void {\r\n this.importValidationResult = null;\r\n this.validationCompleted = false;\r\n\r\n if (event === undefined) {\r\n this.selectedFile = null;\r\n } else {\r\n this.selectedFile = event.file;\r\n }\r\n }\r\n\r\n validateImportFile() {\r\n this.loading = true;\r\n this.importValidationResult = null;\r\n this.validationCompleted = false;\r\n this.selectedFile.text().then(string => {\r\n const toSend: IImportValidationDTO = {\r\n CsvString: string,\r\n ImportStrategyReference: this.importStrategyRef,\r\n ProductId: this.selectedProduct?.Id,\r\n SimType: this.selectedSimType,\r\n ProductGroupId: this.selectedProduct?.GroupId || null,\r\n EngineerJobItemType: this.selectedJobItemType,\r\n JobId: this.jobId,\r\n AccountId: this.accountId\r\n }\r\n\r\n return this.foundationCsvImporterService.validateFile(toSend).subscribe(validationResult => {\r\n this.importCount = 0;\r\n var modelsJson = validationResult.ModelsToImportJson ?? null;\r\n\r\n if (!!modelsJson) {\r\n if (this.importStrategyRef == ImportStrategyReference.Device) {\r\n this.setupSimValidationReturn(validationResult);\r\n }\r\n\r\n switch (validationResult.ImportType) {\r\n case ImportType.Peripheral:\r\n this.setupPeripheralValidationReturn(validationResult, modelsJson);\r\n break;\r\n case ImportType.Unit:\r\n this.setupUnitValidationReturn(validationResult, modelsJson);\r\n break;\r\n case ImportType.Engineer:\r\n this.setupEngineerValidationReturn(validationResult, modelsJson);\r\n break;\r\n case ImportType.JobItem:\r\n this.setupJobItemValidationReturn(validationResult, modelsJson);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n this.importValidationResult = validationResult;\r\n\r\n this.setCompletionString();\r\n\r\n this.setupAssetErrorTable();\r\n\r\n this.validationCompleted = true;\r\n this.loading = false;\r\n });\r\n });\r\n }\r\n\r\n onFinish(): void {\r\n this.onFinishCallback.emit();\r\n }\r\n\r\n private setupAssetErrorTable(): void {\r\n this.mainAssetErrors = this.importValidationResult.ImportValidationErrors?.filter(err => err.ErrorType == ErrorType.MainAsset);\r\n this.fileSetupErrors = this.importValidationResult.ImportValidationErrors?.filter(err => err.ErrorType == ErrorType.FileSetup);\r\n\r\n this.deviceErrorTableRows = this.vTableService.createTableRows(this.mainAssetErrors, this.deviceErrorTableColumns);\r\n }\r\n\r\n private setupSimValidationReturn(validationResult: ICsvImportValidationResultDTO): void {\r\n this.newSimsToCreate = validationResult.SimsToCreate;\r\n this.preMappedSimsToSerial = JSON.parse(validationResult.MappingsToCreateJson) as SimToSerialMappings[];\r\n this.existingMappingsToEnd = JSON.parse(validationResult.MappingsToEndJson) as ISimMapping[];\r\n\r\n const simErrors = validationResult.ImportValidationErrors?.filter(err => err.ErrorType != ErrorType.MainAsset);\r\n\r\n if (simErrors?.length) {\r\n this.fatalSimErrors = simErrors.filter(err => err.ErrorType == ErrorType.SimFatal);\r\n this.warningSimErrors = simErrors.filter(err => err.ErrorType == ErrorType.SimWarning);\r\n\r\n this.simErrorTableRows = this.vTableService.createTableRows(this.warningSimErrors.concat(this.fatalSimErrors), this.simErrorTableColumns);\r\n }\r\n\r\n if (this.newSimsToCreate?.length) {\r\n this.simImportTableRows = this.vTableService.createTableRows(this.newSimsToCreate, this.simImportTableColumns);\r\n }\r\n }\r\n\r\n closeDialog(): void {\r\n this.vTabsComponent.stepPrev(true);\r\n this.loading = false;\r\n this.dialog.close();\r\n }\r\n\r\n confirmUpload(): void {\r\n this.loading = true;\r\n this.dialog = this.dialogService.open(this.importRequestConfirmation, null);\r\n }\r\n\r\n backToStart(): void {\r\n this.selectedFile = null;\r\n this.fileUpload.clearFile();\r\n this.vTabsComponent.stepToBeginning();\r\n }\r\n\r\n UploadFile(): void {\r\n this.dialog.close();\r\n\r\n const returnModels = this.importStrategyRef !== ImportStrategyReference.Engineer ?\r\n this.importValidationResult.ModelsToImportJson :\r\n JSON.stringify(this.importValidationResult.engineers);\r\n\r\n this.foundationCsvImporterService.saveFile({\r\n ImportStrategyReference: this.importStrategyRef,\r\n ModelsToCreate: returnModels,\r\n ProductGroupId: this.selectedProduct?.GroupId,\r\n ResellerId: this.selectedUserGroup?.ResellerId,\r\n SimsToCreate: this.newSimsToCreate,\r\n MappingsToCreateJson: this.importValidationResult.MappingsToCreateJson,\r\n MappingsToEndJson: this.importValidationResult.MappingsToEndJson\r\n }).subscribe((completionResult) => {\r\n\r\n this.loading = false;\r\n this.modelSave.emit(completionResult);\r\n });\r\n }\r\n\r\n confirmCompletion(): void {\r\n this.importValidationResult = null;\r\n this.validationCompleted = false;\r\n this.selectedFile = null;\r\n this.fileUpload.clearFile();\r\n this.dialog.close();\r\n }\r\n\r\n onTabSelect($event: VTabComponent): void {\r\n switch ($event.tabIndex) {\r\n case 0:\r\n this.fatalSimErrors = [];\r\n this.warningSimErrors = [];\r\n this.newSimsToCreate = [];\r\n this.preMappedSimsToSerial = [];\r\n break;\r\n case 1:\r\n this.validateImportFile();\r\n break;\r\n case 2:\r\n this.confirmUpload();\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n onProductTableRowClicked($event: IVTableRow): void {\r\n this.selectedProduct = this.products.find(p => p.Id == $event.data.Id);\r\n }\r\n\r\n onEngineerGroupTableRowClicked($event: IVTableRow): void {\r\n this.selectedUserGroup = this.groups.find(g => g.Id == $event.data.Id);\r\n }\r\n\r\n onjobReasonTableRowClicked($event: IVTableRow): void {\r\n this.selectedJobItemType = $event.data;\r\n }\r\n\r\n setCompletionString(): void {\r\n this.completionString = this.importValidationResult?.engineers?.length ?\r\n this.translationService.t('CsvImporter.EngineerCompletionString', [this.importCount, this.selectedTypeString]) :\r\n this.translationService.t('CsvImporter.CompletionString', [this.importCount, this.selectedTypeString]);\r\n }\r\n\r\n get canImport(): boolean {\r\n return this.importValidationResult?.peripherals?.length >= 1 ||\r\n this.importValidationResult?.units?.length >= 1 ||\r\n this.importValidationResult?.engineers?.length >= 1 ||\r\n this.importValidationResult?.jobItems?.length >= 1;\r\n }\r\n\r\n get isDeviceImport(): boolean {\r\n return this.importStrategyRef === ImportStrategyReference.Device;\r\n }\r\n\r\n /// ------------------------------\r\n\r\n private setupPeripheralValidationReturn(validationResult: ICsvImportValidationResultDTO, modelsJson: string) {\r\n validationResult.peripherals = JSON.parse(modelsJson) as IPeripheral[];\r\n this.peripheralImportTableRows = this.vTableService.createTableRows(validationResult.peripherals, this.peripheralImportTableColumns);\r\n this.importCount = validationResult.peripherals.length;\r\n this.selectedTypeString = this.selectedProduct.Description;\r\n }\r\n\r\n private setupUnitValidationReturn(validationResult: ICsvImportValidationResultDTO, modelsJson: string) {\r\n validationResult.units = JSON.parse(modelsJson) as IUnit[];\r\n this.unitImportTableRows = this.vTableService.createTableRows(validationResult.units, this.unitImportTableColumns);\r\n this.importCount = validationResult.units.length;\r\n this.selectedTypeString = this.selectedProduct.Description;\r\n }\r\n\r\n private setupEngineerValidationReturn(validationResult: ICsvImportValidationResultDTO, modelsJson: string) {\r\n validationResult.engineers = JSON.parse(modelsJson) as IUser[];\r\n this.engineerImportTableRows = this.vTableService.createTableRows(validationResult.engineers, this.engineerImportTableColumns);\r\n this.importCount = validationResult.engineers.length;\r\n this.selectedTypeString = this.selectedUserGroup.Description;\r\n validationResult.engineers.forEach(e => {\r\n e.UserGroupId = this.selectedUserGroup.Id;\r\n });\r\n }\r\n\r\n private setupJobItemValidationReturn(validationResult: ICsvImportValidationResultDTO, modelsJson: string) {\r\n validationResult.jobItems = JSON.parse(modelsJson) as IJobItemValidationResultDTO[];\r\n this.jobItemImportTableRows = this.vTableService.createTableRows(validationResult.jobItems, this.jobItemImportTableColumns);\r\n this.importCount = validationResult.jobItems.length;\r\n this.selectedTypeString = this.translationService.translateEnum(EngineerJobItemType, \"EngineerJobItemType\", this.selectedJobItemType);\r\n }\r\n\r\n private createValidationTables(): void {\r\n this.createDeviceErrorTable();\r\n this.createSimErrorTable();\r\n this.createSimImportTable();\r\n this.createPeripheralImportTable();\r\n this.createUnitImportTable();\r\n this.createEngineerImportTable();\r\n this.createJobItemImportTable();\r\n }\r\n\r\n private createSelectionTables(): void {\r\n this.createProductTable();\r\n this.createEngineerGroupTable();\r\n this.createJobReasonTable();\r\n }\r\n\r\n private createJobReasonTable(): void {\r\n this.jobReasonTableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"CsvImporter.VisitType\" }),\r\n createCellFunction: (enumNumber) => this.vTableService.createEnumCell(EngineerJobItemType, \"EngineerJobItemType\", enumNumber)\r\n }\r\n ];\r\n }\r\n\r\n private createEngineerGroupTable(): void {\r\n this.engineerGroupTableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"CsvImporter.ParentCompany\" }),\r\n createCellFunction: (userGroup) => this.vTableService.createTableCell(userGroup.Description)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Reseller\" }),\r\n createCellFunction: (userGroup) => this.vTableService.createTableCell(this.resellerMap.get(userGroup.ResellerId)?.Description || `AddSecure UK`)\r\n }\r\n ];\r\n }\r\n\r\n private createProductTable(): void {\r\n this.productTableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Description\" }),\r\n createCellFunction: (product) => this.vTableService.createTableCell(product.Description)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"CsvImporter.Supplier\", sorted: true }),\r\n createCellFunction: (product) => this.vTableService.createTableCell(ProductVendor[product.GroupId])\r\n }\r\n ];\r\n }\r\n\r\n private createDeviceErrorTable(): void {\r\n\r\n this.deviceErrorTableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ title: \"\", width: 50 }),\r\n createCellFunction: (validationError) => this.vTableService.createStatusCell(validationError.ErrorType == ErrorType.SimWarning ? VTableRowStatus.Warning : VTableRowStatus.Error)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"CsvImporter.Line\", width: 70, sorted: true }),\r\n createCellFunction: (validationError) => this.vTableService.createTableCell(validationError.LineNumber)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"CsvImporter.Error\" }),\r\n createCellFunction: (validationError) => this.vTableService.createTableCell(validationError.Message)\r\n }\r\n ];\r\n }\r\n\r\n private createSimErrorTable(): void {\r\n\r\n this.simErrorTableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ title: \"\", width: 50 }),\r\n createCellFunction: (validationError) => this.vTableService.createStatusCell(validationError.ErrorType == ErrorType.SimFatal ? VTableRowStatus.Error : VTableRowStatus.Warning)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"CsvImporter.Line\", width: 70, sorted: true }),\r\n createCellFunction: (validationError) => this.vTableService.createTableCell(validationError.LineNumber)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"CsvImporter.Error\" }),\r\n createCellFunction: (validationError) => this.vTableService.createTableCell(validationError.Message)\r\n }\r\n ];\r\n }\r\n\r\n private createSimImportTable(): void {\r\n\r\n this.simImportTableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ title: \"\", width: 60 }),\r\n createCellFunction: (sim) => this.vTableService.createStatusCell(!!this.warningSimErrors?.find(err => err.Metadata == sim.Iccid) ? VTableRowStatus.Warning : VTableRowStatus.Success)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: \"ICCID\" }),\r\n createCellFunction: (sim) => this.vTableService.createTableCell(sim.Iccid)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: \"IMSI\" }),\r\n createCellFunction: (sim) => this.vTableService.createTableCell(sim.Imsi)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: \"MSISDN\" }),\r\n createCellFunction: (sim) => this.vTableService.createTableCell(sim.Msisdn, { classes: \"validationWarning\" })\r\n }\r\n ];\r\n }\r\n\r\n private createPeripheralImportTable(): void {\r\n\r\n this.peripheralImportTableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ title: \"\", width: 60 }),\r\n createCellFunction: () => this.vTableService.createStatusCell(VTableRowStatus.Success)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"CsvImporter.Serial\", width: 200 }),\r\n createCellFunction: (device) => this.vTableService.createTableCell(device.Serial)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"CsvImporter.AssociatedIccid\" }),\r\n createCellFunction: (device) => this.vTableService.createTableCell(this.preMappedSimsToSerial?.find(mapping => mapping.Item1 == device.Serial)?.Item2 ?? \"--\")\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"CsvImporter.NewSim\", width: 90 }),\r\n createCellFunction: (device) => this.vTableService.createTableCell(\r\n !!this.preMappedSimsToSerial?.find(map => map.Item1 == device.Serial) &&\r\n !!this.newSimsToCreate?.find(sim => sim.Iccid == this.preMappedSimsToSerial?.find(mapping => mapping.Item1 == device.Serial)?.Item2) ? \"Yes\" : \"No\")\r\n }\r\n ];\r\n }\r\n\r\n private createUnitImportTable(): void {\r\n\r\n this.unitImportTableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ title: \"\", width: 60 }),\r\n createCellFunction: () => this.vTableService.createStatusCell(VTableRowStatus.Success)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"CsvImporter.Serial\", width: 200 }),\r\n createCellFunction: (unit) => this.vTableService.createTableCell(unit.Serial)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"CsvImporter.AssociatedIccid\" }),\r\n createCellFunction: (unit) => this.vTableService.createTableCell(this.preMappedSimsToSerial?.find(mapping => mapping.Item1 == unit.Serial)?.Item2 ?? \"--\")\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"CsvImporter.NewSim\", width: 90 }),\r\n createCellFunction: (unit) => this.vTableService.createTableCell(\r\n !!this.preMappedSimsToSerial?.find(map => map.Item1 == unit.Serial) &&\r\n !!this.newSimsToCreate?.find(sim => sim.Iccid == this.preMappedSimsToSerial?.find(mapping => mapping.Item1 == unit.Serial)?.Item2) ? \"Yes\" : \"No\")\r\n }\r\n ];\r\n }\r\n\r\n private createEngineerImportTable(): void {\r\n\r\n this.engineerImportTableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ title: \"\", width: 60 }),\r\n createCellFunction: () => this.vTableService.createStatusCell(VTableRowStatus.Success)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Name\" }),\r\n createCellFunction: (user) => this.vTableService.createTableCell(user.Description)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Email\" }),\r\n createCellFunction: (user) => this.vTableService.createTableCell(user.Email)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"CsvImporter.ParentCompany\" }),\r\n createCellFunction: (user) => this.vTableService.createTableCell(this.selectedUserGroup.Description)\r\n }\r\n ];\r\n }\r\n\r\n private createJobItemImportTable(): void {\r\n\r\n this.jobItemImportTableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ title: \"\", width: 60 }),\r\n createCellFunction: () => this.vTableService.createStatusCell(VTableRowStatus.Success)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"CommissionEditor.VehicleRegistrationTitle\" }),\r\n createCellFunction: (result) => this.vTableService.createVehicleRegCell(result.Vehicle, undefined, (!!result.Vehicle.Reg && result.VehicleRequiresCreation))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"CsvImporter.NewVehicle\" }),\r\n createCellFunction: (result) => this.vTableService.createTableCell(result.VehicleRequiresCreation || !result.Vehicle?.ShortReg ? \"Yes\" : \"No\")\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"EngineerJobItemList.Instruction\" }),\r\n createCellFunction: (result) => this.vTableService.createTableCell(result.EngineerJobItem.Comments)\r\n }\r\n ];\r\n }\r\n}\r\n","import { Component, Input, OnDestroy, OnInit } from '@angular/core';\r\nimport { IPeripheral, IUnit } from '@app/interfaces/IPeripheral';\r\nimport { ValidationTestResult } from '@app/main/modules/foundation/_services/device-data-validation.service';\r\nimport { VehicleValidationCheckRecordService } from '@app/main/modules/foundation/_services/vehicle-validation-check-record.service';\r\nimport { NavigationService } from '@app/services/navigation.service';\r\nimport { Subject } from 'rxjs';\r\nimport { take, takeUntil } from 'rxjs/operators';\r\nimport { IEngineerCommission } from '../../../foundation.interfaces';\r\nimport { FoundationNavigationModule } from '../../../foundation.navigation';\r\nimport { AccountService } from '../../../_services/account.service';\r\nimport { UnitsService } from '../../../_services/unit.service';\r\nimport { UserService } from '../../../_services/user.service';\r\nimport { FoundationVehiclesService } from '../../../_services/vehicle.service';\r\nimport { CommissionService } from '../commission.service';\r\nimport './commission-detail.component.scss';\r\n\r\n@Component({\r\n selector: 'commission-detail',\r\n template: require('./commission-detail.component.html')\r\n})\r\nexport class CommissionDetailComponent implements OnInit, OnDestroy {\r\n @Input() commission: IEngineerCommission;\r\n commissionId: number;\r\n\r\n installedDevices: (IPeripheral | IUnit)[];\r\n\r\n loading: boolean;\r\n loadingDevices: boolean;\r\n\r\n commissionValidationCheckRecords: ValidationTestResult[] = [];\r\n\r\n private destroy$ = new Subject();\r\n constructor(\r\n private readonly accountService: AccountService,\r\n private readonly commissionService: CommissionService,\r\n private readonly navigationService: NavigationService,\r\n private readonly unitsService: UnitsService,\r\n private readonly userService: UserService,\r\n private readonly vehicleService: FoundationVehiclesService,\r\n private readonly vehicleValidationCheckRecordService: VehicleValidationCheckRecordService) { }\r\n\r\n ngOnInit() {\r\n this.commissionId = +this.navigationService.getRouteParam('commissionId');\r\n this.loadData();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.unsubscribe();\r\n }\r\n\r\n goToDevicePage(device): void {\r\n if (device.Unit) {\r\n this.navigationService.go(`${ FoundationNavigationModule.Units}.view`, { unitId: device.Unit.Serial });\r\n return;\r\n }\r\n\r\n this.navigationService.go(`${ FoundationNavigationModule.Peripherals}.view`, { serial: device.Peripheral.Serial });\r\n }\r\n\r\n //--\r\n\r\n private loadData(): void {\r\n if (!this.commissionId) {\r\n return;\r\n }\r\n this.loading = true;\r\n this.commissionService.getEngineerCommissions({ Id: this.commissionId }).pipe(takeUntil(this.destroy$)).subscribe(commissions => {\r\n this.commission = commissions[0];\r\n this.getAssociatedProperties();\r\n this.getDevices();\r\n })\r\n }\r\n\r\n private getAssociatedProperties(): void {\r\n this.vehicleService.getVehicle(this.commission.VehicleId).pipe(take(1)).subscribe(vehicle => {\r\n this.commission.vehicle = vehicle;\r\n this.loading = false;\r\n });\r\n\r\n this.userService.getUsers({ Id: this.commission.EngineerUserId || this.commission.UserId }).pipe(take(1)).subscribe(users => {\r\n this.commission.engineerUser = users[0];\r\n });\r\n\r\n if (this.commission.EngineerUserId && this.commission.UserId != this.commission.EngineerUserId) {\r\n this.userService.getUsers({ Id: this.commission.UserId }).pipe(take(1)).subscribe(users => {\r\n this.commission.internalUser = users[0];\r\n });\r\n }\r\n\r\n this.accountService.getCustomerAccount(this.commission.AccountId).pipe(takeUntil(this.destroy$)).subscribe(account => {\r\n this.commission.account = account;\r\n });\r\n\r\n this.vehicleValidationCheckRecordService.getVehicleValidationCheckRecords({ CommissionId: this.commissionId }).pipe(takeUntil(this.destroy$)).subscribe(checkRecords => {\r\n checkRecords.forEach(cr => {\r\n\r\n const results = JSON.parse(cr.ValidationCheckResultJson) as ValidationTestResult[];\r\n\r\n results.forEach(result => {\r\n\r\n this.commissionValidationCheckRecords.push(result);\r\n });\r\n });\r\n });\r\n } \r\n\r\n\r\n private getDevices(): void {\r\n // TODO update this when serial numbers are available on metadata. We don't want to be using these legacy properties.\r\n // We need to remeber when doing this that these are still used and we need to think round it\r\n // e.g.If CANBusId is not filled in we don't process SensorData so need to find all the hidey holes\r\n this.loadingDevices = true;\r\n\r\n const serials: string[] = [];\r\n\r\n if (this.commission.CameraId) {\r\n serials.push(this.commission.CameraId);\r\n }\r\n\r\n if (this.commission.DigidlId) {\r\n serials.push(this.commission.DigidlId);\r\n }\r\n\r\n if (this.commission.CanbusId) {\r\n serials.push(this.commission.CanbusId);\r\n }\r\n\r\n if (this.commission.FmiId) {\r\n serials.push(this.commission.FmiId);\r\n }\r\n\r\n if (this.commission.TdtId) {\r\n serials.push(this.commission.TdtId);\r\n }\r\n\r\n if (this.commission.Serial) {\r\n serials.push(this.commission.Serial);\r\n }\r\n\r\n this.installedDevices = [];\r\n\r\n serials.forEach(serial => {\r\n this.unitsService.getUnitBySerial(serial).pipe(take(1)).subscribe(unit => {\r\n this.installedDevices.push(unit);\r\n })\r\n\r\n })\r\n\r\n }\r\n}\r\n","import { Component, Input, OnInit } from \"@angular/core\";\r\nimport { TableSummaryCalculatorFunction } from \"@app/directives/_layout/v-table/_components/visualisations/table-summary-box/table-summary-box.component\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { AsyncObservableComponent } from \"@app/directives/_misc/async-observable/async-observable.component\";\r\nimport { IAggregateFilterEvent, IFilterBarTab } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { FilterBarService } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.service\";\r\nimport { VerticalFilterItemCreationCallback } from \"@app/directives/_resourceFilters/vertical-filter-list/vertical-filter-list.component\";\r\nimport { DateRange } from \"@app/enum/DateRange.enum\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { IUser } from \"@app/interfaces/IUser\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { IAccount } from \"@app/services/account.service\";\r\nimport { NavigationService } from \"@app/services/navigation.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { combineLatest, forkJoin } from \"rxjs\";\r\nimport { EngineerCommissionStatus, EngineerJobItemType } from \"../../foundation.enums\";\r\nimport { IEngineerCommission } from \"../../foundation.interfaces\";\r\nimport { FoundationNavigationModule } from \"../../foundation.navigation\";\r\nimport { IReseller } from \"../../_models/IReseller\";\r\nimport { AccountService } from \"../../_services/account.service\";\r\nimport { EngineerService } from \"../../_services/engineer.service\";\r\nimport { VehicleValidationCheckRecordService } from \"../../_services/vehicle-validation-check-record.service\";\r\nimport { FoundationVehiclesService } from \"../../_services/vehicle.service\";\r\nimport './commission-list.component.scss';\r\nimport { CommissionService } from \"./commission.service\";\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'commission-list',\r\n template: require('./commission-list.component.html')\r\n})\r\nexport class CommissionListComponent implements OnInit {\r\n @Input() customerId: number;\r\n\r\n commissions: IEngineerCommission[] = [];\r\n vehiclesMap: Map;\r\n accountsMap: Map;\r\n resellerMap: Map;\r\n engineersMap: Map;\r\n\r\n tabCount: number = 0;\r\n\r\n defaultDateRange: DateRange = DateRange.Latest4Weeks;\r\n start: Date;\r\n end: Date;\r\n loading: boolean;\r\n\r\n filterTabs: IFilterBarTab[];\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n constructor(\r\n private readonly accountService: AccountService,\r\n private readonly commissionService: CommissionService,\r\n private readonly engineerService: EngineerService,\r\n private readonly filterBarService: FilterBarService,\r\n private readonly navigationService: NavigationService,\r\n private readonly translationService: TranslationService,\r\n private readonly vehicleService: FoundationVehiclesService,\r\n private readonly vehicleValidationCheckRecordService: VehicleValidationCheckRecordService,\r\n private readonly vTableService: VTableService) { }\r\n\r\n ngOnInit(): void {\r\n this.customerId = this.navigationService.getRouteParam(\"customerId\");\r\n this.createTable();\r\n this.createTabs();\r\n }\r\n\r\n onFilterChanged(event: IAggregateFilterEvent): void {\r\n if (event.trigger === 'date') {\r\n this.start = event.date[0];\r\n this.end = event.date[1];\r\n this.loadData();\r\n }\r\n }\r\n\r\n onRowClicked(row: IVTableRow): void {\r\n const commissionId = row.data.Id;\r\n this.navigationService.go(FoundationNavigationModule.ViewCommission, { commissionId })\r\n }\r\n\r\n newCommission(): void {\r\n this.navigationService.go(FoundationNavigationModule.NewCommissionWithBindings, { jobItemId: null, customerId: this.customerId || null });\r\n }\r\n\r\n resellerItemCreationCallback: VerticalFilterItemCreationCallback = (commission) => {\r\n\r\n return {\r\n name: this.getResellerName(commission),\r\n data: commission,\r\n predicate: (c) => c.account.ResellerId === commission.account.ResellerId\r\n };\r\n }\r\n\r\n visitReasonItemCreationCallback: VerticalFilterItemCreationCallback = (commission) => {\r\n\r\n return {\r\n name: commission.VisitReason,\r\n data: commission,\r\n predicate: (c) => c.VisitReasonId === commission.VisitReasonId\r\n };\r\n }\r\n\r\n validationItemCreationCallback: VerticalFilterItemCreationCallback = (commission) => {\r\n\r\n return {\r\n name: commission.VisitReason,\r\n data: commission,\r\n predicate: (c) => c.VisitReasonId === commission.VisitReasonId\r\n };\r\n }\r\n\r\n repeatVisitsItemCreationCallback: VerticalFilterItemCreationCallback = (commission) => {\r\n\r\n return {\r\n name: commission.vehicle?.Reg || \"Unknown\",\r\n icon: \"directions_car\",\r\n data: commission,\r\n predicate: (c) => c.VehicleId === commission.VehicleId\r\n };\r\n }\r\n\r\n subscriptionsCalculator: TableSummaryCalculatorFunction = (c) => {\r\n return c.Id % 0 == 0 ? 1 : 0;\r\n }\r\n\r\n // ---\r\n\r\n private loadData() {\r\n this.loading = true;\r\n\r\n combineLatest([\r\n this.commissionService.getEngineerCommissions({ AccountId: this.customerId, Start: this.start, End: this.end }),\r\n this.vehicleService.getVehicles(false),\r\n this.accountService.getCustomerAccounts(),\r\n this.accountService.getResellers(),\r\n this.engineerService.getEngineers()\r\n ])\r\n\r\n .pipe(untilDestroyed(this)).subscribe(([commissions, vehicles, accounts, resellers, engineers]) => {\r\n this.commissions = commissions;\r\n this.tabCount = commissions.length;\r\n this.vehiclesMap = this.vehicleService.createVehicleMap(vehicles);\r\n this.accountsMap = new Map(accounts.map(account => [account.Id, account]));\r\n this.resellerMap = new Map(resellers.map(reseller => [reseller.Id, reseller]));\r\n this.engineersMap = new Map(engineers.map(engineer => [engineer.Id, engineer]));\r\n\r\n this.mapDataToCommissions();\r\n this.tableRows = this.vTableService.createTableRows(this.commissions, this.tableColumns);\r\n\r\n this.loading = false;\r\n\r\n commissions.forEach(c => {\r\n if (c.VisitReasonId == 0) {\r\n c.VisitReason = EngineerJobItemType[0];\r\n }\r\n });\r\n })\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"Common.Timestamp\", sorted: true, sortDirection: SortDirection.Descending }),\r\n createCellFunction: commission => this.vTableService.createDateCell(commission.Timestamp, { dateTime: true })\r\n },\r\n {\r\n header: this.vTableService.createVehicleTableHeader(),\r\n createCellFunction: commission => this.vTableService.createVehicleRegCell(commission.vehicle)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Commissions.VisitReason\", width: 100, minTableWidth: 900 }),\r\n createCellFunction: commission => this.vTableService.createTableCell(commission.VisitReason)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Account\", minWidth: 10 }),\r\n createCellFunction: commission => this.vTableService.createTableCell(commission.account.CompanyName)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"EngineerUsers.Engineer\", width: 200, minTableWidth: 800 }),\r\n createCellFunction: commission => {\r\n const engineer: string = this.engineersMap.get(commission.EngineerUserId)?.Description;\r\n\r\n return this.vTableService.createTableCell(engineer);\r\n }\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Reseller\", width: 130, minTableWidth: 700 }),\r\n createCellFunction: commission => this.vTableService.createTableCell(this.getResellerName(commission))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Status\", width: 100, minTableWidth: 1150 }),\r\n createCellFunction: commission => this.vTableService.createEnumCell(EngineerCommissionStatus, \"EngineerCommissionStatus\", commission.Status)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Chargeable\", width: 110, minTableWidth: 1150 }),\r\n createCellFunction: commission => this.vTableService.createTableCell(commission.Chargeable ? \"Yes\" : \"No\")\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Cost\", sortType: SortType.Number, width: 100, minTableWidth: 1250 }),\r\n createCellFunction: commission => this.vTableService.createTableCell(commission.Chargeable ? commission.Cost : \"\")\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Commissions.CommissionNumber\", sortType: SortType.Number, width: 100, minTableWidth: 500 }),\r\n createCellFunction: commission => this.vTableService.createTableCell(commission.CommissionNumber > 1 ? commission.CommissionNumber : commission.Id)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"EngineerHistory.DeviceValidation\", sortable: false, minTableWidth: 1375 }),\r\n createCellFunction: commission => this.getValidationCheckForCommission(commission)\r\n }\r\n ]\r\n }\r\n\r\n private getResellerName(commission: IEngineerCommission) {\r\n return this.resellerMap.get(commission.account.ResellerId)?.Description || `AddSecure UK`\r\n }\r\n\r\n private mapDataToCommissions(): void {\r\n this.commissions.forEach(commission => {\r\n this.mapVehicleToCommission(commission);\r\n this.mapAccountToCommission(commission);\r\n })\r\n }\r\n\r\n private mapVehicleToCommission(commission: IEngineerCommission): void {\r\n commission.vehicle = this.vehiclesMap.get(commission.VehicleId);\r\n }\r\n\r\n private mapAccountToCommission(commission: IEngineerCommission): void {\r\n commission.account = this.accountsMap.get(commission.AccountId);\r\n }\r\n\r\n private createTabs(): void {\r\n this.filterTabs = [];\r\n\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"Common.All\", (engineer) => true));\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(EngineerJobItemType[EngineerJobItemType.Install], (engineer) => engineer.VisitReasonId == EngineerJobItemType.Install));\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(EngineerJobItemType[EngineerJobItemType.Uninstall], (engineer) => engineer.VisitReasonId == EngineerJobItemType.Uninstall));\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(EngineerJobItemType[EngineerJobItemType.Reinstall], (engineer) => engineer.VisitReasonId == EngineerJobItemType.Reinstall));\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(EngineerJobItemType[EngineerJobItemType.ServiceCall], (engineer) => engineer.VisitReasonId == EngineerJobItemType.ServiceCall));\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(EngineerJobItemType[EngineerJobItemType.Upgrade], (engineer) => engineer.VisitReasonId == EngineerJobItemType.Upgrade));\r\n }\r\n\r\n private getValidationCheckForCommission(commission: IEngineerCommission): any {\r\n const validationObservable = this.vehicleValidationCheckRecordService.getRecordResultsForTable(commission);\r\n\r\n return this.vTableService.createTableCell(commission, {\r\n component: AsyncObservableComponent,\r\n componentInputs: {\r\n observable$: validationObservable,\r\n useLoading: true\r\n }\r\n })\r\n }\r\n}\r\n","import { Component, OnInit, TemplateRef, ViewChild } from \"@angular/core\";\r\nimport { VDialogRef } from \"@app/directives/_layout/v-dialog/v-dialog-ref\";\r\nimport { DialogService } from \"@app/directives/_layout/v-dialog/v-dialog.service\";\r\nimport { VTabComponent } from \"@app/directives/_layout/v-tabs/v-tab.component\";\r\nimport { VTabsComponent } from \"@app/directives/_layout/v-tabs/v-tabs.component\";\r\nimport { UserType } from \"@app/enum/UserType\";\r\nimport { SavedState } from \"@app/interfaces/IPeripheral\";\r\nimport { IUser } from \"@app/interfaces/IUser\";\r\nimport { CameraChannelService } from \"@app/main/modules/cameras/_services/camera-channels.service\";\r\nimport { FoundationNavigationModule } from \"@app/main/modules/foundation/foundation.navigation\";\r\nimport { EngineerCommissionService } from \"@app/main/modules/foundation/_services/engineer-commission.service\";\r\nimport { EngineerJobItemService } from \"@app/main/modules/foundation/_services/engineer-job-item.service\";\r\nimport { VehicleValidationCheckRecordService } from \"@app/main/modules/foundation/_services/vehicle-validation-check-record.service\";\r\nimport { FoundationVehiclesService } from \"@app/main/modules/foundation/_services/vehicle.service\";\r\nimport { CurrentUserService } from \"@app/services/currentUser.service\";\r\nimport { NavigationService } from \"@app/services/navigation.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport copy from \"fast-copy\";\r\nimport { forkJoin, of } from \"rxjs\";\r\nimport { switchMap, take } from \"rxjs/operators\";\r\nimport { EngineerCommissionStatus, EngineerJobItemType } from \"../../../foundation.enums\";\r\nimport { IEngineerCommission, IProcessResult } from \"../../../foundation.interfaces\";\r\nimport './commission-editor.component.scss';\r\nimport { DeviceInstallEditor } from \"./components/deviceInstallEditor/device-install-editor.component\";\r\n\r\n\r\n@Component({\r\n selector: 'commission-editor',\r\n template: require('./commission-editor.component.html')\r\n})\r\nexport class VCommissionEditorComponent implements OnInit {\r\n jobItemId: number;\r\n customerId: number;\r\n commission: IEngineerCommission;\r\n\r\n loading: boolean;\r\n savingCommission: boolean;\r\n currentUser: IUser;\r\n\r\n onFinishRedirectTo = \"app.foundation.commissioning\";\r\n\r\n EngineerJobItemType = EngineerJobItemType;\r\n\r\n dialog: VDialogRef;\r\n\r\n errorTitle: string;\r\n errorMessage: string;\r\n mappingResult: IProcessResult;\r\n\r\n @ViewChild(DeviceInstallEditor) deviceInstallEditor: DeviceInstallEditor;\r\n @ViewChild('confirmSaveTemplate') confirmSaveTemplate: TemplateRef;\r\n @ViewChild('errorTemplate') errorTemplate: TemplateRef;\r\n @ViewChild('tabs') tabsComponent: VTabsComponent;\r\n @ViewChild('tab1') tab1: VTabComponent;\r\n @ViewChild('tab2') tab2: VTabComponent;\r\n @ViewChild('tab3') tab3: VTabComponent;\r\n\r\n\r\n constructor(\r\n private readonly currentUserService: CurrentUserService,\r\n private readonly commissionService: EngineerCommissionService,\r\n private readonly dialogService: DialogService,\r\n private readonly navigationService: NavigationService,\r\n private readonly foundationVehicleService: FoundationVehiclesService,\r\n private readonly engineerJobItemService: EngineerJobItemService,\r\n private readonly translationService: TranslationService,\r\n private readonly cameraChannelService: CameraChannelService,\r\n private readonly vehicleValidationCheckRecordService: VehicleValidationCheckRecordService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n if (!isNaN(this.navigationService.getRouteParam('jobItemId'))) {\r\n this.jobItemId = this.navigationService.getRouteParam('jobItemId');\r\n }\r\n\r\n if (!isNaN(this.navigationService.getRouteParam('customerId'))) {\r\n this.customerId = this.navigationService.getRouteParam('customerId');\r\n }\r\n\r\n this.currentUserService.getCurrentUser().then((user) => {\r\n this.currentUser = user;\r\n this.loadData();\r\n })\r\n }\r\n\r\n confirmSave(): void {\r\n this.dialog = this.dialogService.open(this.confirmSaveTemplate, null);\r\n }\r\n\r\n confirmSaveAndCloseDialog(): void {\r\n this.closeDialog();\r\n this.saveCommission();\r\n }\r\n\r\n cancelSave(): void {\r\n this.closeDialog();\r\n this.tab3.disablePrev = false;\r\n this.tabsComponent.selectTab(this.tab2);\r\n }\r\n\r\n closeDialog(): void {\r\n this.dialog.close();\r\n }\r\n\r\n confirmErrorAndCloseDialog(): void {\r\n this.closeDialog();\r\n this.rerouteAfterError();\r\n }\r\n\r\n onCommissionChanged(commission: IEngineerCommission): void {\r\n this.commission = copy(commission);\r\n }\r\n\r\n onSelectedTabChanged(tab: VTabComponent): void {\r\n if (tab.tabIndex == 0 && !!this.commission) {\r\n this.commission.Serial = null;\r\n this.commission.UnitLocation = null;\r\n this.commission.existingHardwareAcquired = false;\r\n }\r\n }\r\n\r\n //--\r\n\r\n private saveCommission(): void {\r\n this.savingCommission = true;\r\n\r\n if (!this.commission.Serial) {\r\n this.commission.vehicle.UnitLocation = null;\r\n }\r\n\r\n this.addMissingCommissionProperties(this.commission);\r\n\r\n (this.commissionService.processCommissionMappings(this.commission)).pipe(take(1)).subscribe(mappingResult => {\r\n\r\n if (!mappingResult.IsSuccess) {\r\n this.errorTitle = this.translationService.t(\"CommissionEditor.ProcessErrorTitle\");\r\n this.errorMessage = this.translationService.t(\"CommissionEditor.ProcessErrorMessage\", mappingResult.ExceptionMessage);\r\n this.dialog = this.dialogService.open(this.errorTemplate, null);\r\n return;\r\n }\r\n\r\n (this.commissionService.createUpdateEngineerCommission(this.commission).pipe(take(1)).subscribe(commissionResult => {\r\n this.mappingResult = commissionResult;\r\n\r\n if (!commissionResult.IsSuccess) {\r\n this.errorTitle = this.translationService.t(\"CommissionEditor.CommissionErrorTitle\");\r\n this.errorMessage = this.translationService.t(\"CommissionEditor.CommissionErrorMessage\", mappingResult.ExceptionMessage);\r\n this.dialog = this.dialogService.open(this.errorTemplate, null);\r\n return;\r\n }\r\n\r\n this.commission.Id = commissionResult.Value.Id\r\n\r\n const pendingCamera = this.commission.pendingCommissionChanges?.find(device => device.isCamera && device.Unit.savedState === SavedState.AddedRequiresSave);\r\n const pendingCameraId = this.commission.pendingCommissionChanges?.find(device => device.isCamera)?.Unit?.Serial;\r\n\r\n forkJoin({\r\n completeJobItem: !!this.jobItemId ? this.engineerJobItemService.completeEngineerJobItem(this.jobItemId) : of(null),\r\n updateChannels: !!pendingCamera ? this.cameraChannelService.getCommissionChannels(pendingCameraId, this.commission.VehicleId).pipe(\r\n switchMap((channels) => {\r\n return this.cameraChannelService.saveCommissionChannels(channels).pipe(take(1));\r\n })\r\n ) : of(null),\r\n updateVehicle: this.foundationVehicleService.createUpdateVehicle(this.commission.vehicle),\r\n associateCommissionIdToCheckRecords: this.vehicleValidationCheckRecordService.associateVehicleValidationCheckRecordsToCommission(this.commission.deviceValidationCheckRecordIds, this.commission.Id)\r\n }).pipe(\r\n take(1)\r\n ).subscribe(() => {\r\n this.savingCommission = false;\r\n });\r\n }));\r\n })\r\n }\r\n\r\n private loadData(): void {\r\n this.commission = {\r\n Id: 0,\r\n Status: EngineerCommissionStatus.Submitted,\r\n JobItemId: this.jobItemId,\r\n AccountId: this.customerId,\r\n pendingCommissionChanges: [],\r\n VisitReasonId: EngineerJobItemType.Install,\r\n UserId: this.currentUser.Id,\r\n Comments: \"\",\r\n EngineerId: 57,\r\n Metadata: {},\r\n deviceValidationCheckRecordIds: [],\r\n existingHardwareAcquired: false\r\n }\r\n\r\n }\r\n\r\n private addMissingCommissionProperties(commission: IEngineerCommission): void {\r\n if (!commission) {\r\n return;\r\n }\r\n commission.Client = commission.Client ?? \"\";\r\n commission.Make = commission.Make ?? \"\";\r\n commission.Model = commission.Model ?? \"\";\r\n commission.ShortReg = commission.vehicle.ShortReg ?? \"\"\r\n commission.Serial = commission.Serial ?? \"\";\r\n commission.CanbusId = commission.CanbusId ?? \"\";\r\n commission.CameraId = commission.CameraId ?? \"\";\r\n commission.FmiId = commission.FmiId ?? \"\";\r\n commission.DigidlId = commission.DigidlId ?? \"\";\r\n commission.MessagingId = commission.MessagingId ?? \"\";\r\n commission.TdtId = commission.TdtId ?? \"\";\r\n commission.PtoInputState = commission.PtoInputState ?? \"\";\r\n commission.PtoDescription = commission.PtoDescription ?? \"\";\r\n commission.Pto = commission.Pto ?? false;\r\n\r\n commission.Comments = this.concatenateCommentsSections(commission);\r\n commission.UnitLocation = commission.UnitLocation ?? \"\";\r\n commission.Accelerometer = commission.Accelerometer ?? false;\r\n\r\n commission.VisitReason = EngineerJobItemType[commission.VisitReasonId];\r\n }\r\n\r\n private concatenateCommentsSections(commission: IEngineerCommission): string {\r\n\r\n let concatenatedComments = \"\";\r\n if (commission.Metadata?.NoFaultFound) {\r\n let comment = this.translationService.t(\"CommissionEditor.NoChanges\");\r\n concatenatedComments += `***${comment}*** :: `;\r\n }\r\n\r\n if (commission.Comments?.length > 0) {\r\n concatenatedComments += `${commission.Comments}`;\r\n }\r\n\r\n if (commission.Chargeable && commission.ChargeReason?.length > 0) {\r\n let comment = this.translationService.t(\"CommissionEditor.ChargeableComments\");\r\n concatenatedComments += ` :: ${comment}: ${commission.ChargeReason}`;\r\n }\r\n\r\n commission.pendingCommissionChanges.forEach(device => {\r\n if (device.faultFlagged) {\r\n let comment = this.translationService.t(\"CommissionEditor.EngineerFault\")\r\n concatenatedComments += ` :: ***${comment}: ${device.Unit.Serial} - ${device.faultComments}***`;\r\n }\r\n });\r\n\r\n return concatenatedComments;\r\n }\r\n\r\n private rerouteAfterError(): void {\r\n // Should this go back to outside the commission?\r\n // Engineers back to jobItem main page?\r\n // Internal users back to commission main page?\r\n if (this.currentUser.Type === UserType.Engineer) {\r\n this.navigationService.go(FoundationNavigationModule.JobItems, null, true);\r\n } else if (!!this.commission.JobItemId) {\r\n this.navigationService.go(FoundationNavigationModule.Jobs);\r\n } else {\r\n this.navigationService.go(FoundationNavigationModule.Commissioning, null, true);\r\n }\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from \"@angular/core\";\r\nimport { FormControl, FormGroup, Validators } from \"@angular/forms\";\r\nimport { getValuesFromEnum } from \"@app/class/Utilities\";\r\nimport { CustomFormValidators } from \"@app/directives/_forms/form-validation.service\";\r\nimport { VehicleType } from \"@app/enum/VehicleType.enum\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { FoundationVehiclesService } from \"@app/main/modules/foundation/_services/vehicle.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'add-vehicle',\r\n template: require('./add-vehicle.component.html')\r\n})\r\nexport class AddVehicleComponent implements OnInit, OnChanges {\r\n\r\n @Input() accountId: number;\r\n @Input() vehicle: IVehicle; // For editing existing vehicles\r\n @Input() showVehicleType: boolean;\r\n @Input() vehicleReg: string; // For new vehicles, eg. when a user has entered a Reg in an autocomplete and it was not found.\r\n @Output() vehicleSave = new EventEmitter();\r\n @Output() cancel = new EventEmitter();\r\n\r\n VehicleTypes = VehicleType;\r\n vehicleTypes = getValuesFromEnum(VehicleType).filter(vType => vType != VehicleType.Unknown);\r\n selectedVehicleType: VehicleType;\r\n\r\n vehicleForm: FormGroup;\r\n\r\n vehicles: IVehicle[];\r\n\r\n editMode: boolean;\r\n loading: boolean;\r\n saving: boolean;\r\n\r\n constructor(\r\n private readonly vehicleService: FoundationVehiclesService) { }\r\n \r\n ngOnInit(): void {\r\n this.loadVehicles();\r\n this.createForm();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['vehicle'] && this.vehicle) {\r\n this.editMode = true;\r\n }\r\n }\r\n\r\n\r\n saveVehicle(): void {\r\n this.saving = true;\r\n this.vehicleService.createUpdateVehicle(this.vehicle)\r\n .pipe(untilDestroyed(this))\r\n .subscribe(vehicle => {\r\n this.vehicleSave.emit(vehicle);\r\n this.saving = false;\r\n })\r\n }\r\n\r\n cancelNewVehicle(): void {\r\n this.cancel.emit();\r\n }\r\n\r\n onVehicleTypeChanged(value: VehicleType): void {\r\n this.vehicleForm.get('VehicleType').setValue(value);\r\n this.selectedVehicleType = value;\r\n }\r\n\r\n //--\r\n\r\n private loadVehicles(): void {\r\n this.loading = true;\r\n this.vehicleService.getVehiclesForAccount(this.accountId)\r\n .pipe(\r\n untilDestroyed(this)\r\n )\r\n .subscribe(vehicles => {\r\n this.vehicles = vehicles;\r\n this.createForm();\r\n this.loading = false;\r\n })\r\n }\r\n\r\n private createForm(): void {\r\n if (this.editMode) {\r\n this.createVehicleEditForm();\r\n }\r\n else {\r\n this.createVehicleAddForm();\r\n }\r\n }\r\n\r\n private createVehicleAddForm(): void {\r\n\r\n this.vehicleForm = new FormGroup({\r\n \"Reg\": new FormControl(this.vehicleReg, [Validators.required, CustomFormValidators.duplicateVehicle(this.vehicles), CustomFormValidators.emptyWhiteSpace], CustomFormValidators.duplicateVehicleFromDatabaseAsync(this.vehicleService, this.accountId)),\r\n \"Make\": new FormControl(\"\"),\r\n \"Model\": new FormControl(\"\"),\r\n \"VehicleType\": new FormControl(this.vehicle?.VehicleType, [Validators.required]),\r\n });\r\n\r\n\r\n this.vehicleForm.statusChanges.pipe(untilDestroyed(this)).subscribe((status: string) => {\r\n if (status === \"INVALID\") {\r\n return;\r\n }\r\n\r\n this.vehicle = {\r\n ...this.vehicle,\r\n AccountId: this.accountId,\r\n Reg: this.vehicleForm.value.Reg,\r\n ShortReg: this.vehicleForm.value.Reg,\r\n Make: this.vehicleForm.value.Make,\r\n Model: this.vehicleForm.value.Model,\r\n VehicleType: this.vehicleForm.value.VehicleType\r\n }\r\n })\r\n }\r\n\r\n private createVehicleEditForm(): void {\r\n if (!this.vehicle) {\r\n return;\r\n }\r\n\r\n this.vehicleForm = new FormGroup({\r\n \"Reg\": new FormControl(this.vehicle.Reg, [Validators.required, CustomFormValidators.duplicateVehicle(this.vehicles), CustomFormValidators.emptyWhiteSpace]),\r\n \"ShortReg\": new FormControl(this.vehicle.ShortReg),\r\n \"Make\": new FormControl(this.vehicle.Make),\r\n \"Model\": new FormControl(this.vehicle.Model),\r\n \"VehicleType\": new FormControl(this.vehicle?.VehicleType)\r\n });\r\n\r\n\r\n this.vehicleForm.statusChanges.pipe(untilDestroyed(this)).subscribe((status: string) => {\r\n if (status === \"INVALID\") {\r\n return;\r\n }\r\n\r\n this.vehicle = {\r\n ...this.vehicle,\r\n Reg: this.vehicleForm.value.Reg,\r\n ShortReg: this.vehicleForm.value.ShortReg,\r\n Make: this.vehicleForm.value.Make,\r\n Model: this.vehicleForm.value.Model,\r\n VehicleType: this.vehicleForm.value.VehicleType\r\n }\r\n })\r\n }\r\n\r\n}\r\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { Observable, Subject } from \"rxjs\";\r\nimport { take, tap } from \"rxjs/operators\";\r\nimport { IEngineerJobBookingWithEngineerMappings } from \"../foundation.interfaces\";\r\nimport { IEngineerJobBookingMapping } from \"../_models/IEngineerJobBookingMapping\";\r\nimport { IUserJobBookingMappingQueryOptions } from \"../_models/IUserJobBookingMappingQueryOptions\";\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class EngineerJobBookingMappingService {\r\n\r\n jobBookingMappingListsSubject = new Subject<{ [jobBookingId: number]: IEngineerJobBookingMapping[] }>();\r\n private jobBookingMappingLists: { [jobBookingId: number]: IEngineerJobBookingMapping[] } = {};\r\n constructor(private readonly http: HttpClient) { }\r\n\r\n getEngineerJobBookingMappings(options: IUserJobBookingMappingQueryOptions = null): Observable {\r\n return this.http.get(`/api/foundation/engineerbookings/mappings`, { params: options as HttpParams }).pipe(tap(mappings => {\r\n mappings.forEach(mapping => {\r\n this.addMappingToCachedJobBookingMappingList(mapping);\r\n });\r\n this.jobBookingMappingListsSubject.next(this.jobBookingMappingLists);\r\n }))\r\n }\r\n\r\n addUpdateEngineerJobBookingMapping(mapping: IEngineerJobBookingMapping): Observable {\r\n return this.http.post(`/api/foundation/engineerbookings/mappings`, mapping).pipe(tap(mapping => {\r\n this.addMappingToCachedJobBookingMappingList(mapping);\r\n }));\r\n }\r\n\r\n createUpdateJobBookingMappings(booking: IEngineerJobBookingWithEngineerMappings): Observable[] {\r\n let mappingObservables: Observable[] = [];\r\n\r\n booking.assignedEngineers.forEach(engineer => {\r\n if (!booking.mappings.find(mapping => mapping.UserId === engineer.Id)) {\r\n mappingObservables.push(this.createJobBookingMappingsFromEngineerId(engineer.Id, booking.Id).pipe(take(1)));\r\n }\r\n })\r\n return mappingObservables;\r\n }\r\n\r\n deleteJobBookingMapping(mapping: IEngineerJobBookingMapping): Observable {\r\n this.removeMappingFromCachedBookingMappingLists(mapping);\r\n return this.http.delete(`/api/foundation/engineerbookings/mappings`, { params: { mappingId: mapping.Id } });\r\n }\r\n\r\n createJobBookingMappingsFromEngineerId(engineerId: number, jobBookingId: number): Observable {\r\n const mapping: IEngineerJobBookingMapping = {\r\n Id: 0,\r\n EngineerJobBookingId: jobBookingId,\r\n UserId: engineerId\r\n }\r\n\r\n return this.addUpdateEngineerJobBookingMapping(mapping);\r\n }\r\n\r\n //--\r\n\r\n private addMappingToCachedJobBookingMappingList(mapping: IEngineerJobBookingMapping): void {\r\n const mappings = this.getCachedJobBookingMappingListsForJobBookingId(mapping.EngineerJobBookingId);\r\n\r\n if (!mappings?.length) {\r\n this.jobBookingMappingLists[mapping.EngineerJobBookingId] = [mapping];\r\n return;\r\n }\r\n\r\n const existing = mappings.findIndex(bk => bk.Id === mapping.Id);\r\n if (existing < 0) {\r\n mappings.push(mapping);\r\n return;\r\n }\r\n\r\n mappings.splice(existing, 1);\r\n mappings.push(mapping);\r\n }\r\n\r\n private removeMappingFromCachedBookingMappingLists(mapping: IEngineerJobBookingMapping): void {\r\n\r\n const mappings = this.getCachedJobBookingMappingListsForJobBookingId(mapping.EngineerJobBookingId);\r\n const indexToRemove = mappings.findIndex(mp => mapping.Id === mp.Id);\r\n mappings.splice(indexToRemove, 1);\r\n }\r\n\r\n private getCachedJobBookingMappingListsForJobBookingId(jobBookingId): IEngineerJobBookingMapping[] {\r\n return this.jobBookingMappingLists[jobBookingId];\r\n }\r\n}\r\n","import { NoteType } from \"../_enums/NoteType\";\r\nimport { ResourceType } from \"../_enums/ResourceType\";\r\n\r\nexport interface INote {\r\n Id?: number;\r\n\r\n ResourceId: number;\r\n ResourceType: ResourceType;\r\n\r\n CreatedBy?: number;\r\n CreatedOn?: string;\r\n CreatedByUserId?: number;\r\n\r\n Comments: string;\r\n NoteType?: NoteType;\r\n UserName?: string;\r\n\r\n // --\r\n\r\n noteTypeString?: string;\r\n}\r\n\r\nexport class NotesService {\r\n static $inject = [\"$q\", \"$http\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $http: angular.IHttpService) { }\r\n\r\n getNotes(entityId: number, resourceType: ResourceType, noteType: NoteType): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/foundation/notes/${ResourceType[resourceType]}/${entityId}`,\r\n method: \"GET\",\r\n //cache: true\r\n })\r\n .then(response => {\r\n response.data = response.data.filter(n => n.NoteType == noteType);\r\n\r\n response.data.forEach(note => {\r\n\r\n note.noteTypeString = NoteType[note.NoteType];\r\n });\r\n\r\n return response.data;\r\n });\r\n }\r\n\r\n addNote(note: INote): angular.IPromise {\r\n\r\n return this\r\n .$http({\r\n url: `/api/foundation/notes/`,\r\n method: \"POST\",\r\n data: note\r\n })\r\n .then(response => {\r\n return response.data;\r\n });\r\n }\r\n}\r\n","import { Component, OnChanges, OnInit } from \"@angular/core\";\r\nimport \"./customer-subscriptions-page.component.scss\";\r\n\r\n@Component({\r\n selector: \"customer-subscriptions-page\",\r\n template: require(\"./customer-subscriptions-page.component.html\")\r\n})\r\nexport class CustomerSubscriptionsPageComponent implements OnInit, OnChanges {\r\n\r\n\r\n constructor() {\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n ngOnChanges() {\r\n }\r\n\r\n // ---\r\n\r\n}\r\n","import { Component, Input, OnChanges, OnInit } from \"@angular/core\";\r\nimport { TableSummaryCalculatorFunction } from \"@app/directives/_layout/v-table/_components/visualisations/table-summary-box/table-summary-box.component\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { IAggregateFilterEvent, IFilterBarTab } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { AccountStatus } from \"@app/enum/account/AccountStatus\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { combineLatest } from \"rxjs\";\r\nimport { AccountSubscriptionType } from \"../../../_enums/AccountSubscriptionType\";\r\nimport { IAccountSubscription } from \"../../../_models/IAccountSubscription\";\r\nimport { AccountService } from \"../../../_services/account.service\";\r\nimport { CustomerSubscriptionService } from \"../../../_services/customer-subscriptions.service\";\r\nimport { FoundationVehiclesService } from \"../../../_services/vehicle.service\";\r\nimport \"./customer-subscriptions.component.scss\";\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: \"customer-subscriptions\",\r\n template: require(\"./customer-subscriptions.component.html\")\r\n})\r\nexport class CustomerSubscriptionsComponent implements OnInit, OnChanges {\r\n @Input() accountId: number;\r\n\r\n tabCount: number;\r\n\r\n loading = false;\r\n subscriptions: IAccountSubscription[];\r\n AccountSubscriptionType = AccountSubscriptionType;\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n filterTabs: IFilterBarTab[] = [];\r\n\r\n filterEvent: IAggregateFilterEvent;\r\n totalCharge = 0;\r\n activeSubscriptions = 0;\r\n\r\n constructor(\r\n private readonly accountService: AccountService,\r\n private readonly vehicleService: FoundationVehiclesService,\r\n private readonly customerSubscriptionService: CustomerSubscriptionService,\r\n private readonly vTableService: VTableService,\r\n private readonly translationService: TranslationService\r\n ) {\r\n this.createTabs();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.createTable();\r\n this.loadData();\r\n }\r\n\r\n ngOnChanges(): void {\r\n }\r\n\r\n onFilterChanged(event: IAggregateFilterEvent): void {\r\n\r\n // We sometimes get weird events come through, need to understand why, until then this fixes a bug\r\n if (!event.trigger) {\r\n return;\r\n }\r\n\r\n this.filterEvent = event;\r\n }\r\n\r\n uniqueCustomerCalculator: TableSummaryCalculatorFunction = (item, allItems) => {\r\n return allItems.indexOf(item) ? 1 : 0;\r\n }\r\n\r\n subscriptionsCalculator: TableSummaryCalculatorFunction = (item) => {\r\n return item.active ? 1 : 0;\r\n }\r\n\r\n monthlyChargeCalculator: TableSummaryCalculatorFunction = (item) => {\r\n return item.ChargePerUnit * item.Amount;\r\n }\r\n\r\n yearlyChargeCalculator: TableSummaryCalculatorFunction = (item) => {\r\n return item.ChargePerUnit * item.Amount * 12;\r\n }\r\n\r\n // ---\r\n\r\n private loadData(): void {\r\n this.loading = true;\r\n\r\n let subscriptionsObservable = this.customerSubscriptionService.getSubscriptions();\r\n\r\n if (!isNaN(this.accountId)) {\r\n subscriptionsObservable = this.customerSubscriptionService.getSubscriptionsForAccount(this.accountId);\r\n }\r\n\r\n combineLatest([\r\n this.accountService.getCustomerAccounts(),\r\n subscriptionsObservable,\r\n this.vehicleService.getVehicles(true)\r\n ]).pipe(\r\n untilDestroyed(this) \r\n ).subscribe({\r\n next: ([accounts, subscriptions, vehicles]) => {\r\n this.subscriptions = subscriptions;\r\n this.customerSubscriptionService.setEndTimes(this.subscriptions, accounts);\r\n this.totalCharge = this.customerSubscriptionService.calculateSubscriptionCosts(this.subscriptions, vehicles);\r\n this.activeSubscriptions = this.subscriptions.filter(s => s.active).length;\r\n this.createTableRows();\r\n this.loading = false;\r\n }\r\n });\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createStatusTableHeader({ minTableWidth: 1024, sorted: false }),\r\n createCellFunction: sub => this.vTableService.createStatusCell(sub.status)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"CustomerSubscriptions.CreatedTime\", sorted: true, sortDirection: SortDirection.Descending, minTableWidth: 1300 }),\r\n createCellFunction: sub => this.vTableService.createDateCell(new Date(sub.CreatedTime), { dateTime: false })\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"CustomerSubscriptions.StartTime\", minTableWidth: 1200 }),\r\n createCellFunction: sub => this.vTableService.createDateCell(new Date(sub.StartTime), { dateTime: false })\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"CustomerSubscriptions.EndTime\" }),\r\n createCellFunction: sub => this.vTableService.createDateCell(new Date(sub.EndTime), { dateTime: false })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"CustomerSubscriptions.Customer\" }),\r\n createCellFunction: sub => this.vTableService.createTableCell(sub.account.CompanyName)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"CustomerSubscriptions.Type\", minTableWidth: 700, width: 160 }),\r\n createCellFunction: sub => this.vTableService.createEnumCell(AccountSubscriptionType, \"AccountSubscriptionType\", sub.Type)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"CustomerSubscriptions.Quantity\", sortType: SortType.Number, minTableWidth: 800, width: 100 }),\r\n createCellFunction: sub => this.vTableService.createTableCell(sub.Amount?.toLocaleString(), { sortData: sub.Amount })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: \"Charge per Unit\", sortType: SortType.Number, minTableWidth: 1000, width: 130 }),\r\n createCellFunction: sub => this.vTableService.createTableCell(\"£\" + sub.ChargePerUnit?.toLocaleString(), { sortData: sub.ChargePerUnit })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: \"Total Charge\", sortType: SortType.Number, minTableWidth: 600, width: 120 }),\r\n createCellFunction: sub => this.vTableService.createTableCell(\"£\" + sub.TotalCharge?.toLocaleString(), { sortData: sub.TotalCharge })\r\n }\r\n ];\r\n }\r\n\r\n private createTableRows(): void {\r\n this.tableRows = this.vTableService.createTableRows(this.subscriptions.filter(f => f.account.Status == AccountStatus.Active), this.tableColumns);\r\n this.tabCount = this.tableRows.length;\r\n }\r\n\r\n private createTabs(): void {\r\n this.filterTabs = [];\r\n\r\n this.createTabDefinition(this.translationService.t(\"CustomerSubscriptions.Active\"), a => a.active);\r\n this.createTabDefinition(this.translationService.t(\"CustomerSubscriptions.Expired\"), a => !a.active);\r\n }\r\n\r\n private createTabDefinition(title: string, callback: (account: IAccountSubscription) => boolean) {\r\n\r\n this.filterTabs.push({ title: title, predicate: callback });\r\n }\r\n}\r\n","\r\nexport enum AccountSubscriptionType {\r\n Tms,\r\n ContextualSpeeding,\r\n Maintenance,\r\n Reefer,\r\n ReportBuilder,\r\n DriverDashboard,\r\n SmsQuota,\r\n EmailQuota,\r\n SSO\r\n}\r\n","import { Component, OnInit, TemplateRef, ViewChild } from \"@angular/core\";\r\nimport { FormControl, FormGroup, Validators } from \"@angular/forms\";\r\nimport { CustomFormValidators, FormValidationService } from \"@app/directives/_forms/form-validation.service\";\r\nimport { ICountry } from \"@app/directives/_forms/smsInput/ICountry\";\r\nimport { IPhoneNumberOutput } from \"@app/directives/_forms/smsInput/smsInput.interfaces\";\r\nimport { VDialogRef } from \"@app/directives/_layout/v-dialog/v-dialog-ref\";\r\nimport { DialogService } from \"@app/directives/_layout/v-dialog/v-dialog.service\";\r\nimport { AccountStatus, AvailableAccountStatus } from \"@app/enum/account/AccountStatus\";\r\nimport { Platform } from \"@app/enum/account/Platform\";\r\nimport { IGenericPreference } from \"@app/interfaces/IGenericPreference\";\r\nimport { IPreferencesContent } from \"@app/interfaces/IPreferencesContent\";\r\nimport { IAccount } from \"@app/services/account.service\";\r\nimport { PreferenceService } from \"@app/services/accounts/preferences.service\";\r\nimport { NavigationService } from \"@app/services/navigation.service\";\r\nimport { DistanceMeasurement, IPreferencesQueryOptions, JourneyCostType } from \"@app/services/preferences.service\";\r\nimport { ITranslationLocale, TranslationService } from \"@app/services/translation.service\";\r\nimport { ITimeZoneInfo } from \"@app/userPreferences/model/ITimeZoneInfo\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport copy from \"fast-copy\";\r\nimport { Observable, Subscription, combineLatest, of } from \"rxjs\";\r\nimport { delay, mergeMap, take } from \"rxjs/operators\";\r\nimport { IUser } from \"../../../../../../interfaces/IUser\";\r\nimport { CurrentUserService } from \"../../../../../../services/currentUser.service\";\r\nimport { IReseller } from \"../../../_models/IReseller\";\r\nimport { AccountService } from \"../../../_services/account.service\";\r\nimport { UserService } from \"../../../_services/user.service\";\r\nimport { FoundationNavigationModule } from \"../../../foundation.navigation\";\r\nimport './customer-edit.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'foundation-customer-edit',\r\n template: require('./customer-edit.component.html')\r\n})\r\nexport class FoundationCustomerEditComponent implements OnInit {\r\n @ViewChild('confirmSaveTemplate') confirmSaveTemplate: TemplateRef;\r\n\r\n customerId: number;\r\n customer: IAccount;\r\n amendedCustomer: IAccount;\r\n\r\n customerImage$: Observable;\r\n\r\n AccountStatus = AccountStatus;\r\n Platform = Platform;\r\n\r\n selectedResellerId: number;\r\n resellers: IReseller[];\r\n\r\n isPhoneValid: boolean;\r\n currentUserCanUpdateAccountStatus$: Observable;\r\n\r\n AvailableAccountStatus = AvailableAccountStatus;\r\n accountStatusList = Object.keys(this.AvailableAccountStatus).filter(s => !isNaN(Number(s))).map(s => Number(s));\r\n selectedStatus: AccountStatus;\r\n\r\n customerEditForm: FormGroup;\r\n accountPreferences: IPreferencesContent;\r\n amendedPreferences: IPreferencesContent;\r\n countryCodes$: Observable;\r\n timeZones$: Observable;\r\n locales: ITranslationLocale[];\r\n loadingLocales: boolean;\r\n\r\n loading: boolean;\r\n accountStatusChanged: boolean = false;\r\n\r\n journeyCostTypeLabel: string;\r\n\r\n formSubscription = new Subscription();\r\n\r\n dialog: VDialogRef;\r\n\r\n currentUser: IUser;\r\n\r\n constructor(\r\n private readonly accountService: AccountService,\r\n private readonly dialogService: DialogService,\r\n private readonly formValidationService: FormValidationService,\r\n private readonly navigationService: NavigationService,\r\n private readonly preferenceService: PreferenceService,\r\n private readonly translationService: TranslationService,\r\n private readonly userService: UserService,\r\n private readonly currentUserService: CurrentUserService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.loadData();\r\n }\r\n\r\n\r\n onSmsOutputChanged(output: IPhoneNumberOutput): void {\r\n if (!this.amendedCustomer) {\r\n return;\r\n }\r\n\r\n if (!output.input) {\r\n this.isPhoneValid = true;\r\n this.amendedCustomer.Phone = null;\r\n }\r\n\r\n this.isPhoneValid = output.isValid;\r\n\r\n this.customerEditForm?.get(\"Phone\").setValue(output.internationalized);\r\n }\r\n\r\n onPrefChanged(value: any, preference: IGenericPreference, formName: string): void {\r\n this.customerEditForm.get(formName).setValue(value);\r\n preference.savePreference = true;\r\n this.updateJourneyCostTypeLabel(this.amendedPreferences);\r\n }\r\n\r\n onResellerSelectChange(resellerId: number): void {\r\n this.selectedResellerId = resellerId;\r\n this.customerEditForm.get(\"ResellerId\").setValue(resellerId);\r\n }\r\n\r\n confirmSave(): void {\r\n if (!this.formValidationService.checkFormValid(this.customerEditForm)) {\r\n return;\r\n }\r\n\r\n if (this.accountStatusChanged) {\r\n this.dialog = this.dialogService.open(this.confirmSaveTemplate, null);\r\n return;\r\n }\r\n this.saveCustomer();\r\n }\r\n\r\n confirmSaveAndCloseDialog(): void {\r\n this.closeDialog();\r\n this.saveCustomer();\r\n }\r\n\r\n cancelSave(): void {\r\n this.closeDialog();\r\n }\r\n\r\n closeDialog(): void {\r\n this.dialog.close();\r\n }\r\n\r\n setAccountStatusChanged(): void {\r\n this.accountStatusChanged = true;\r\n }\r\n\r\n saveCustomer(): void {\r\n this.loading = true;\r\n\r\n this.amendedPreferences.Timezone.savePreference = true// force to save 'default' timezone\r\n this.accountPreferences = copy(this.amendedPreferences);\r\n this.removeUnchangedProperties(this.accountPreferences);\r\n\r\n this.amendedCustomer.Status = this.amendedCustomer.Id > -1 ? this.amendedCustomer.Status : AccountStatus.Active;\r\n this.amendedCustomer.Phone = this.amendedCustomer.Phone ?? \"\";\r\n\r\n this.accountService.saveAccount(this.amendedCustomer).pipe(\r\n delay(300), // Give the readonly replica a time to get a new accountId before saving new preferences\r\n mergeMap(accountId => {\r\n this.customerId = accountId;\r\n return this.preferenceService.updateAccountPreferences(this.amendedPreferences, accountId);\r\n }),\r\n take(1))\r\n .subscribe(() => {\r\n this.navigationService.go(FoundationNavigationModule.CustomerView, { customerId: this.customerId })\r\n this.loading = false;\r\n })\r\n }\r\n\r\n //--\r\n\r\n private loadData(): void {\r\n this.customerId = this.navigationService.getRouteParam('customerId');\r\n this.currentUserCanUpdateAccountStatus$ = this.userService.currentUserCanUpdateAccountStatus();\r\n let accountRequest = this.accountService.getCustomerAccount(this.customerId);\r\n\r\n if (isNaN(+this.customerId)) {\r\n accountRequest = this.createNewAccount()\r\n }\r\n\r\n this.currentUserService.getCurrentUser().then(currentUser => {\r\n this.currentUser = currentUser;\r\n \r\n combineLatest([accountRequest, this.accountService.getResellers()])\r\n .pipe(untilDestroyed(this))\r\n .subscribe(([account, resellers]) => {\r\n this.resellers = resellers;\r\n this.customer = account;\r\n this.selectedResellerId = this.customer.ResellerId || this.getDefaultResellerId();\r\n this.setAmendedCustomer();\r\n this.getPreferences();\r\n this.getCountryCodes();\r\n this.getTimezones();\r\n this.getLocales();\r\n this.getCustomerImage();\r\n });\r\n })\r\n }\r\n\r\n private getDefaultResellerId(): number {\r\n const defaultReseller = this.resellers.find(x => x.IsDefault);\r\n return defaultReseller.Id;\r\n }\r\n\r\n private createForm(): void {\r\n if (!this.customer || !this.accountPreferences) {\r\n return;\r\n }\r\n\r\n this.customerEditForm = new FormGroup({\r\n // Customer Details\r\n CompanyName: new FormControl(this.customer.CompanyName, [Validators.required, CustomFormValidators.emptyWhiteSpace]),\r\n FleetSize: new FormControl(this.customer.FleetSize),\r\n Website: new FormControl(this.customer.Website),\r\n Phone: new FormControl(this.customer.Phone),\r\n Status: new FormControl(this.customer.Status),\r\n ResellerId: new FormControl(this.customer.ResellerId),\r\n // General\r\n ShowInactiveDrivers: new FormControl(this.accountPreferences.ShowInactiveDrivers.Value),\r\n ShowVehiclesNoUnit: new FormControl(this.accountPreferences.ShowVehiclesNoUnit.Value),\r\n ShowVehiclesNotTracking: new FormControl(this.accountPreferences.ShowVehiclesNotTracking.Value),\r\n TrailerAssociations: new FormControl(this.accountPreferences.TrailerAssociations.Value),\r\n // Map\r\n Geofences: new FormControl(this.accountPreferences.Geofences.Value),\r\n ShowZones: new FormControl(this.accountPreferences.ShowZones.Value),\r\n ViewSystemGeofences: new FormControl(this.accountPreferences.ViewSystemGeofences.Value),\r\n GeofenceLabelWhenZoomedOut: new FormControl(this.accountPreferences.GeofenceLabelWhenZoomedOut.Value),\r\n Clustering: new FormControl(this.accountPreferences.Clustering.Value),\r\n VehicleLabel: new FormControl(this.accountPreferences.VehicleLabel.Value),\r\n VehicleLabelText: new FormControl(this.accountPreferences.VehicleLabelText.Value),\r\n // Cost\r\n JourneyCostType: new FormControl(this.accountPreferences.JourneyCostType.Value),\r\n JourneyCost: new FormControl(this.accountPreferences.JourneyCost.Value),\r\n Currency: new FormControl(this.accountPreferences.Currency.Value),\r\n // Measurement\r\n DistanceMeasurement: new FormControl(this.accountPreferences.DistanceMeasurement.Value),\r\n TemperatureMeasurement: new FormControl(this.accountPreferences.TemperatureMeasurement.Value),\r\n VolumeMeasurement: new FormControl(this.accountPreferences.VolumeMeasurement.Value),\r\n FuelConsumptionMeasurement: new FormControl(this.accountPreferences.FuelConsumptionMeasurement.Value),\r\n // Internationalisation\r\n CountryCode: new FormControl(this.accountPreferences.CountryCode.Value),\r\n Timezone: new FormControl(this.accountPreferences.Timezone.Value),\r\n Language: new FormControl(this.accountPreferences.Language.Value),\r\n //TMS\r\n RouteStartCondition: new FormControl(this.accountPreferences.RouteStartCondition.Value),\r\n RouteEndCondition: new FormControl(this.accountPreferences.RouteEndCondition.Value),\r\n VisitMatchCondition: new FormControl(this.accountPreferences.VisitMatchCondition.Value),\r\n ArriveOnTimeResidingInLocation: new FormControl(this.accountPreferences.ArriveOnTimeResidingInLocation.Value),\r\n OnSiteBufferTime: new FormControl(this.accountPreferences.OnSiteBufferTime.Value),\r\n TravelBufferTime: new FormControl(this.accountPreferences.TravelBufferTime.Value),\r\n MaximumTimeToRestartRoute: new FormControl(this.accountPreferences.MaximumTimeToRestartRoute.Value),\r\n MinimumStartTime: new FormControl(this.accountPreferences.MinimumStartTime.Value),\r\n MaximumStartTime: new FormControl(this.accountPreferences.MaximumStartTime.Value),\r\n MaximumExpiryTime: new FormControl(this.accountPreferences.MaximumExpiryTime.Value),\r\n MaximumLateTimeAllowed: new FormControl(this.accountPreferences.MaximumLateTimeAllowed.Value),\r\n CanMatchOnMissedVisits: new FormControl(this.accountPreferences.CanMatchOnMissedVisits.Value),\r\n RecordVisitsAsMissedIfVisitedOutOfOrder: new FormControl(this.accountPreferences.RecordVisitsAsMissedIfVisitedOutOfOrder.Value),\r\n RecordUnplannedVisits: new FormControl(this.accountPreferences.RecordUnplannedVisits.Value),\r\n RestartRouteOnReturnToStartingLocation: new FormControl(this.accountPreferences.RestartRouteOnReturnToStartingLocation.Value)\r\n })\r\n\r\n this.subscribeToFormChanges();\r\n }\r\n\r\n private createNewAccount(): Observable {\r\n return of({\r\n Id: 0,\r\n CompanyName: \"\",\r\n Phone: null,\r\n Image: \"\",\r\n Features: 0,\r\n Status: AccountStatus.Active\r\n })\r\n }\r\n\r\n private subscribeToFormChanges(): void {\r\n if (this.formSubscription) {\r\n this.formSubscription.unsubscribe();\r\n }\r\n\r\n this.customerEditForm.statusChanges.pipe(untilDestroyed(this)).subscribe((status: string) => {\r\n if (status === 'INVALID') {\r\n return;\r\n }\r\n\r\n this.amendedCustomer = {\r\n ...this.amendedCustomer,\r\n CompanyName: this.customerEditForm.value.CompanyName,\r\n FleetSize: this.customerEditForm.value.FleetSize,\r\n Website: this.customerEditForm.value.Website,\r\n Phone: this.customerEditForm.value.Phone,\r\n Status: this.customerEditForm.value.Status,\r\n ResellerId: this.customerEditForm.value.ResellerId\r\n }\r\n\r\n\r\n Object.keys(this.amendedPreferences).forEach(key => {\r\n this.amendedPreferences[key].Value = this.customerEditForm.value[key];\r\n })\r\n\r\n\r\n })\r\n }\r\n\r\n private setAmendedCustomer(): void {\r\n this.amendedCustomer = copy(this.customer);\r\n this.selectedStatus = this.amendedCustomer.Status;\r\n }\r\n\r\n private getPreferences(): void {\r\n let preferenceQueryOptions: IPreferencesQueryOptions = {};\r\n\r\n if (this.customer) {\r\n preferenceQueryOptions = {\r\n isAccountPreferences: true,\r\n AccountId: this.customer.Id\r\n };\r\n }\r\n\r\n this.preferenceService.getAccountPreferences(preferenceQueryOptions).pipe(untilDestroyed(this)).subscribe(preferences => {\r\n this.updateJourneyCostTypeLabel(preferences);\r\n this.accountPreferences = preferences;\r\n this.amendedPreferences = copy(preferences);\r\n this.createForm();\r\n })\r\n }\r\n\r\n private getCountryCodes(): void {\r\n this.countryCodes$ = this.preferenceService.getCountryCodes();\r\n }\r\n\r\n private getTimezones(): void {\r\n this.timeZones$ = this.preferenceService.getTimezones();\r\n }\r\n\r\n private getLocales(): void {\r\n this.loadingLocales = true;\r\n this.translationService.getListOfLocales().then(locales => {\r\n this.locales = locales.filter(locale => locale.Locale != \"qa\" && locale.Locale != \"no\");\r\n this.loadingLocales = false;\r\n })\r\n }\r\n\r\n private updateJourneyCostTypeLabel(accountPreferences: IPreferencesContent): void {\r\n let translationPhrase: string = \"UserPreferences.costPerMile\";\r\n\r\n if (accountPreferences.JourneyCostType.Value == JourneyCostType.Distance) {\r\n if (accountPreferences.DistanceMeasurement.Value == DistanceMeasurement.Miles) {\r\n translationPhrase = \"UserPreferences.costPerMile\";\r\n\r\n } else if (accountPreferences.DistanceMeasurement.Value == DistanceMeasurement.Kilometres) {\r\n translationPhrase = \"UserPreferences.costPerKilometre\";\r\n\r\n }\r\n } else if (accountPreferences.JourneyCostType.Value == JourneyCostType.Hourly) {\r\n translationPhrase = \"UserPreferences.costPerHour\";\r\n }\r\n\r\n this.journeyCostTypeLabel = this.translationService.t(translationPhrase);\r\n }\r\n\r\n private removeUnchangedProperties(model: IPreferencesContent): void {\r\n for (const property in model) {\r\n const preference = model[property];\r\n\r\n if (preference && model[property].savePreference) {\r\n continue;\r\n }\r\n\r\n delete model[property];\r\n }\r\n }\r\n\r\n private getCustomerImage(): void {\r\n this.customerImage$ = this.accountService.getCustomerAccountImage(this.customerId);\r\n }\r\n}\r\n","import { Component, OnInit } from \"@angular/core\";\r\nimport { IAccountFeatureDescription } from \"@app/services/accountFeature.service\";\r\nimport { NavigationService } from \"@app/services/navigation.service\";\r\nimport { Observable } from \"rxjs\";\r\nimport { AccountService } from \"../../../_services/account.service\";\r\nimport './customer-overview.component.scss';\r\n\r\n@Component({\r\n selector: 'customer-overview',\r\n template: require('./customer-overview.component.html')\r\n})\r\nexport class CustomerOverviewComponent implements OnInit {\r\n\r\n loading: boolean;\r\n customerId: number;\r\n accountFeatureSet$: Observable;\r\n\r\n constructor(\r\n private readonly accountService: AccountService,\r\n private readonly navigationService: NavigationService) { }\r\n\r\n ngOnInit(): void {\r\n this.customerId = this.navigationService.getRouteParam(\"customerId\");\r\n this.updateFeatureset();\r\n }\r\n\r\n updateFeatureset(): void {\r\n this.accountFeatureSet$ = this.accountService.updateFeatureSet(this.customerId);\r\n }\r\n\r\n //--\r\n\r\n}\r\n","import { Component, OnInit } from \"@angular/core\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { IRecentlySelectedEntity } from \"@app/directives/_misc/recently-selected/recently-selected.component\";\r\nimport { AccountSector } from \"@app/enum/account/AccountSector\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { IAggregateFilterEvent, IFilterBarTab, IVerticalFilterListItem } from \"@directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { AccountFeatures } from \"@enums/account/AccountFeature\";\r\nimport { AccountFleetType } from \"@enums/account/AccountFleetType\";\r\nimport { AccountStatus } from \"@enums/account/AccountStatus\";\r\nimport { Platform } from \"@enums/account/Platform\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { IAccount } from \"@services/account.service\";\r\nimport { AccountFeatureService } from \"@services/accountFeature.service\";\r\nimport { NavigationService } from \"@services/navigation.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { combineLatest } from \"rxjs\";\r\nimport { IReseller } from \"../../_models/IReseller\";\r\nimport { AccountService } from \"../../_services/account.service\";\r\nimport { FoundationNavigationModule } from \"../../foundation.navigation\";\r\nimport \"./customers.component.scss\";\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: \"foundation-customers\",\r\n template: require(\"./customers.component.html\")\r\n})\r\nexport class FoundationCustomersComponent implements OnInit {\r\n\r\n loading = false;\r\n customers: IAccount[] = [];\r\n resellers: IReseller[] = [];\r\n\r\n // ---\r\n\r\n filterTabs: IFilterBarTab[] = [];\r\n\r\n Platform = Platform;\r\n AccountFleetType = AccountFleetType;\r\n AccountSector = AccountSector;\r\n AccountStatus = AccountStatus;\r\n\r\n featureItems: IVerticalFilterListItem[] = [];\r\n resellerItems: IVerticalFilterListItem[] = [];\r\n filterEvent: IAggregateFilterEvent;\r\n\r\n // Tables\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n constructor(\r\n private readonly navigationService: NavigationService,\r\n private readonly accountService: AccountService,\r\n private readonly accountFeatureService: AccountFeatureService,\r\n private readonly translationService: TranslationService,\r\n private readonly vTableService: VTableService) {\r\n\r\n this.createTabs();\r\n this.createAccountFeatureFilterItems();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.createTable();\r\n this.getData();\r\n }\r\n\r\n onRowClicked(row: IVTableRow): void {\r\n this.viewCustomer(row.data);\r\n }\r\n\r\n onRecentItemClicked(recentItem: IRecentlySelectedEntity) {\r\n const customer = this.customers.find(c => c.Id == recentItem.id);\r\n this.viewCustomer(customer);\r\n }\r\n\r\n viewCustomer(customer: IAccount): void {\r\n this.navigationService.go(FoundationNavigationModule.CustomerView, { customerId: customer.Id });\r\n }\r\n\r\n addCustomer(): void {\r\n this.navigationService.go(FoundationNavigationModule.CustomerNew);\r\n }\r\n\r\n onFilterChanged(event: IAggregateFilterEvent): void {\r\n\r\n // We sometimes get weird events come through, need to understand why, until then this fixes a bug\r\n if (!event.trigger) {\r\n return;\r\n }\r\n\r\n this.filterEvent = event;\r\n }\r\n\r\n // ---\r\n\r\n private getData(invalidateCache = false): void {\r\n this.loading = true;\r\n\r\n combineLatest([\r\n this.accountService.getCustomerAccounts(invalidateCache),\r\n this.accountService.getResellers()\r\n ]).pipe(\r\n untilDestroyed(this))\r\n .subscribe({\r\n next: ([customers, resellers]) => {\r\n this.customers = customers;\r\n this.resellers = resellers;\r\n\r\n this.mapResellersAndFeaturesToCustomers();\r\n \r\n this.tableRows = this.vTableService.createTableRows(this.customers, this.tableColumns);\r\n this.getResellersFilterItems();\r\n this.loading = false;\r\n }\r\n })\r\n }\r\n\r\n private mapResellersAndFeaturesToCustomers(): void {\r\n // TODO:\r\n // Use case for a table cell that performs a callback to get its data, e.g. renders only as it goes\r\n // this would be useful for reseller names etc\r\n // would be useful to show number of assets (so only calculate on demand)\r\n\r\n this.customers.forEach(account => {\r\n account.resellerName = this.accountService.getResellerName(this.resellers, account.ResellerId);\r\n\r\n account.featureString = this.accountFeatureService.getFeatureString(account.Features);\r\n });\r\n }\r\n\r\n private createTable(): void {\r\n\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"Common.Created\", sorted: true, sortDirection: SortDirection.Descending }),\r\n createCellFunction: (customer) => this.vTableService.createDateCell(new Date(customer.DateTimeSetup), { dateTime: false })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Name\", minWidth: 100 }),\r\n createCellFunction: (customer) => this.vTableService.createTableCell(customer.CompanyName)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"FoundationCustomers.ParentCompany\", minTableWidth: 650, width: 160 }),\r\n createCellFunction: (customer) => this.vTableService.createTableCell(customer.resellerName)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"FoundationCustomers.Platform\", minTableWidth: 1000, searchable: false, width: 120 }),\r\n createCellFunction: (customer) => this.vTableService.createTableCell(Platform[customer.Platform])\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"FoundationCustomers.FleetType\", minTableWidth: 1200, width: 100 }),\r\n createCellFunction: (customer) => this.vTableService.createTableCell(AccountFleetType[customer.FleetType])\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"FoundationCustomers.Sector\", minTableWidth: 1400, width: 140 }),\r\n createCellFunction: (customer) => this.vTableService.createTableCell(AccountSector[customer.SectorId])\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Status\", minTableWidth: 1300, width: 90 }),\r\n createCellFunction: (customer) => this.vTableService.createTableCell(AccountStatus[customer.Status])\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"AccountFeaturesEnum.Title\", width: 250 }),\r\n createCellFunction: (customer) => this.vTableService.createTableCell(customer.featureString)\r\n }\r\n ];\r\n }\r\n\r\n private createTabs(): void {\r\n this.filterTabs = [];\r\n\r\n this.createTabDefinition(this.translationService.tEnum(AccountStatus, \"AccountStatus\", AccountStatus.Active), a => a.Status == AccountStatus.Active);\r\n\r\n this.createTabDefinition(\"Verilocation\", a => a.Platform == Platform.Verilocation && a.Status == AccountStatus.Active);\r\n this.createTabDefinition(\"RTL\", a => a.Platform == Platform.RTL && a.Status == AccountStatus.Active);\r\n this.createTabDefinition(\"Isotrak\", a => a.Platform == Platform.Isotrak && a.Status == AccountStatus.Active);\r\n this.createTabDefinition(\"Alcolock\", a => a.Platform == Platform.Alcolock && a.Status == AccountStatus.Active);\r\n\r\n this.createTabDefinition(this.translationService.tEnum(AccountStatus, \"AccountStatus\", AccountStatus.Disabled), a => a.Status == AccountStatus.Barred || a.Status == AccountStatus.Disabled);\r\n }\r\n\r\n private createTabDefinition(title: string, callback: (account: IAccount) => boolean) {\r\n\r\n this.filterTabs.push({ title: title, predicate: callback });\r\n }\r\n\r\n private createAccountFeatureFilterItems(): void {\r\n this.featureItems = [];\r\n var allAccountFeatures = Object.keys(AccountFeatures).filter(key => !isNaN(Number(AccountFeatures[key])) && AccountFeatures[key] > 0);\r\n\r\n allAccountFeatures.forEach(enumKey => {\r\n var featureDesc = this.accountFeatureService.createFeatureDescription(enumKey);\r\n\r\n if (featureDesc) {\r\n this.featureItems.push({\r\n name: featureDesc.name,\r\n predicate: (account) => {\r\n return this.accountFeatureService.accountHasFeatureAccess(account, featureDesc.feature);\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n private getResellersFilterItems(): void {\r\n this.resellerItems = [];\r\n\r\n this.resellers.forEach(reseller => {\r\n const isPresentForAnyAccount = this.customers.some(x => x.ResellerId === reseller.Id);\r\n\r\n if (!isPresentForAnyAccount) {\r\n return;\r\n }\r\n\r\n const filter: IVerticalFilterListItem = {\r\n name: reseller.Description,\r\n predicate: (account) => reseller.Id === account.ResellerId,\r\n }\r\n\r\n filter.count = this.customers.filter(d => filter.predicate(d)).length;\r\n this.resellerItems.push(filter);\r\n });\r\n }\r\n}\r\n","import { Component, EventEmitter, OnInit, Output } from '@angular/core';\r\nimport { AccountStatus } from '@app/enum/account/AccountStatus';\r\nimport { Platform } from '@app/enum/account/Platform';\r\nimport { ResourceType } from '@app/enum/ResourceType';\r\nimport { IAccount } from '@app/services/account.service';\r\nimport { LoginService } from '@app/services/login.service.ajs';\r\nimport { NavigationService } from '@app/services/navigation.service';\r\nimport { Observable } from 'rxjs';\r\nimport { tap } from 'rxjs/operators';\r\nimport { FoundationNavigationModule } from '../../../foundation.navigation';\r\nimport { AccountService } from '../../../_services/account.service';\r\nimport './customer-view.component.scss';\r\n\r\n@Component({\r\n selector: 'foundation-customer-view',\r\n template: require('./customer-view.component.html')\r\n})\r\nexport class CustomerViewComponent implements OnInit {\r\n @Output() tabChanged = new EventEmitter();\r\n loading = false;\r\n\r\n customerId: number;\r\n customer: IAccount;\r\n customerImage$: Observable;\r\n\r\n showEditor: boolean;\r\n\r\n AccountStatus = AccountStatus;\r\n Platform = Platform;\r\n\r\n resourceType = ResourceType.Account;\r\n\r\n customerAccount$: Observable;\r\n\r\n constructor(\r\n private readonly accountService: AccountService,\r\n private readonly loginService: LoginService,\r\n private readonly navigationService: NavigationService) { }\r\n\r\n ngOnInit() {\r\n this.customerId = this.navigationService.getRouteParam('customerId');\r\n this.getData();\r\n }\r\n\r\n login() {\r\n this.loading = true;\r\n\r\n this.loginService.switchAccount(this.customerId, true);\r\n }\r\n\r\n editCustomer(): void {\r\n this.navigationService.go(FoundationNavigationModule.CustomerEdit, { customerId: this.customerId });\r\n }\r\n\r\n hideEditor(): void {\r\n this.showEditor = false;\r\n }\r\n\r\n //--\r\n\r\n private getData(): void {\r\n this.getCustomerAccount();\r\n\r\n this.getCustomerImage(); \r\n }\r\n\r\n private getCustomerAccount(): void {\r\n let accountName: string = 'Customer Name';\r\n\r\n this.customerAccount$ = this.accountService.getCustomerAccount(this.customerId).pipe(\r\n tap(account => {\r\n accountName = account.CompanyName;\r\n\r\n this.navigationService.updateTitle(accountName);\r\n })\r\n );\r\n }\r\n\r\n private getCustomerImage(): void {\r\n this.customerImage$ = this.accountService.getCustomerAccountImage(this.customerId);\r\n }\r\n}\r\n","import { Component, Input, OnInit, TemplateRef, ViewChild } from \"@angular/core\";\r\nimport { VDialogRef } from \"@app/directives/_layout/v-dialog/v-dialog-ref\";\r\nimport { DialogService } from \"@app/directives/_layout/v-dialog/v-dialog.service\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { SpecialUserPermissions } from \"@app/enum/SpecialUserPermissions\";\r\nimport { UserAccessPermissions } from \"@app/enum/UserAccessPermissions\";\r\nimport { AccountUserType, UserStatus, UserType } from \"@app/enum/UserType\";\r\nimport { AccountFeatures } from \"@app/enum/account/AccountFeature\";\r\nimport { AccountStatus } from \"@app/enum/account/AccountStatus\";\r\nimport { IUser } from \"@app/interfaces/IUser\";\r\nimport { UserEditorComponent } from \"@app/main/components/resourceManagement/users/userEditor/user-editor.component\";\r\nimport { LoginService } from \"@app/services/login.service.ajs\";\r\nimport { NavigationService } from \"@app/services/navigation.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { UserService } from \"../../../_services/user.service\";\r\nimport './user-list.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'customer-user-list',\r\n template: require('./user-list.component.html')\r\n})\r\nexport class CustomerUserList implements OnInit {\r\n @Input() customerId: number;\r\n\r\n @ViewChild('userEditor') userEditor: UserEditorComponent;\r\n @ViewChild('resetPasswordTemplate') resetPasswordTemplate: TemplateRef;\r\n\r\n AccountStatus = AccountStatus;\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n loading: boolean;\r\n selectedUser: IUser;\r\n users: IUser[] = [];\r\n tabCount: number = 0;\r\n\r\n dialog: VDialogRef;\r\n\r\n constructor(\r\n private readonly dialogService: DialogService,\r\n private readonly loginService: LoginService,\r\n private readonly navigationService: NavigationService,\r\n private readonly translationService: TranslationService,\r\n private readonly userService: UserService,\r\n private readonly vTableService: VTableService) { }\r\n\r\n ngOnInit() {\r\n this.customerId = this.navigationService.getRouteParam(\"customerId\");\r\n this.createTable();\r\n this.getData();\r\n }\r\n\r\n selectUser(row: IVTableRow): void {\r\n this.selectedUser = row.data;\r\n }\r\n\r\n closeUserEditor(): void {\r\n this.selectedUser = null;\r\n }\r\n\r\n saveUser(): void {\r\n this.userEditor.saveUser();\r\n }\r\n\r\n deactivateUser(deactivate: boolean): void {\r\n if (!deactivate || !this.selectedUser.IsActive) {\r\n return;\r\n }\r\n\r\n this.toggleStatus();\r\n }\r\n\r\n activateUser(): void {\r\n if (this.selectedUser.IsActive) {\r\n return;\r\n }\r\n\r\n this.toggleStatus();\r\n }\r\n\r\n resetPassword(): void {\r\n\r\n this.dialog = this.dialogService.open(this.resetPasswordTemplate, null);\r\n }\r\n\r\n confirmResetPassword(): void {\r\n this.loginService.sendForgotPasswordEmail(this.selectedUser.Email).then(() => {\r\n this.closeDialog();\r\n });\r\n }\r\n\r\n closeDialog(): void {\r\n this.dialog.close();\r\n }\r\n\r\n onUserSaved(user: IUser): void {\r\n const userToUpdate: number = this.users.findIndex(u => u.Id === user.Id);\r\n\r\n if (userToUpdate < 0) {\r\n this.users.push(user);\r\n } else {\r\n this.users.splice(userToUpdate, 1, user);\r\n }\r\n\r\n this.createTableRows();\r\n this.closeUserEditor();\r\n }\r\n\r\n addNewUser(): void {\r\n this.selectedUser = {\r\n Id: 0,\r\n CurrentAccountUserMapping: {\r\n AccountId: this.customerId,\r\n Status: UserStatus.Active,\r\n AccountStatus: AccountStatus.Active,\r\n Type: AccountUserType.User,\r\n\r\n ReadFeatures: AccountFeatures.Default,\r\n ManageFeatures: AccountFeatures.Default,\r\n SpecialUserPermissions: SpecialUserPermissions.None,\r\n\r\n AccessMask: UserAccessPermissions.None\r\n }\r\n }\r\n }\r\n\r\n isFleetUser(user: IUser): boolean {\r\n return user.Type === UserType.Fleet;\r\n }\r\n\r\n //--\r\n\r\n private getData(): void {\r\n if (!this.customerId) {\r\n console.warn(\"No CustomerID specified\", this.customerId);\r\n this.loading = false;\r\n return;\r\n }\r\n\r\n this.loading = true;\r\n\r\n this.userService.getUsersForAccount(this.customerId)\r\n .pipe(untilDestroyed(this))\r\n .subscribe(users => {\r\n this.users = users;\r\n this.tabCount = this.users.length;\r\n\r\n this.createTableRows();\r\n const selectedUserId = this.navigationService.getRouteParam(\"userId\");\r\n\r\n if (selectedUserId) {\r\n this.selectUserById(selectedUserId);\r\n }\r\n\r\n this.loading = false;\r\n })\r\n\r\n }\r\n\r\n private createTableRows(): void {\r\n this.tableRows = this.vTableService.createTableRows(this.users, this.tableColumns);\r\n\r\n }\r\n\r\n private toggleStatus(): void {\r\n this.loading = true;\r\n this.userService.toggleInternalUserStatus(this.selectedUser).pipe(untilDestroyed(this)).subscribe({\r\n next: () => this.closeUserEditor(),\r\n complete: () => this.loading = false\r\n });\r\n }\r\n\r\n private selectUserById(userId: number): void {\r\n this.selectedUser = this.users.find(user => user.Id === userId);\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ title: \"ID\", width: 80, sortable: true, sortType: SortType.Number }),\r\n createCellFunction: user => this.vTableService.createTableCell(user.Id)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Name\", sortable: true }),\r\n createCellFunction: user => this.vTableService.createTableCell(user.CurrentAccountUserMapping.Name)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Email\", sortable: true }),\r\n createCellFunction: user => this.vTableService.createTableCell(user.Email)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Type\", width: 80, sortable: true }),\r\n createCellFunction: user => this.vTableService.createEnumCell(AccountUserType, \"AccountUserType\", user.CurrentAccountUserMapping.Type)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Notes\", sortable: true }),\r\n createCellFunction: user => {\r\n let notes = \"\";\r\n\r\n if (user.ResetPassword) {\r\n notes += this.translationService.t(\"FoundationCustomers.PasswordResetRequired\")\r\n }\r\n\r\n if (user.FailedLoginAttempts) {\r\n notes += this.translationService.t(\"FoundationCustomers.FailedAttempts\", user.FailedLoginAttempts)\r\n }\r\n\r\n return this.vTableService.createTableCell(notes);\r\n }\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"Common.Created\" }),\r\n createCellFunction: user => this.vTableService.createDateCell(user.CurrentAccountUserMapping.Created)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"Common.Updated\" }),\r\n createCellFunction: user => this.vTableService.createDateCell(user.CurrentAccountUserMapping.Updated)\r\n }\r\n\r\n ]\r\n }\r\n\r\n}\r\n","import { ChangeDetectorRef, Component, OnInit } from '@angular/core';\r\nimport { SignalRService, WebSocketEvents } from './signalr.service';\r\nimport './developer-console.component.scss';\r\nimport { ILogMessage } from './log-message.model';\r\nimport { LogLevel } from './log-level.enum';\r\nimport { IPulseRecord, IPulseResponse, PulseMessageConsoleDisplayType } from '../hardware/_models/IPulseRecord';\r\nimport { Subject } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'developer-console',\r\n template: require('./developer-console.component.html')\r\n})\r\nexport class DeveloperConsoleComponent implements OnInit {\r\n constructor(\r\n private cd: ChangeDetectorRef,\r\n private signalRService: SignalRService) { }\r\n\r\n\r\n logMessageReceived = new Subject();\r\n tachoReceived = new Subject();\r\n pulseMessageReceived = new Subject();\r\n pulseResponseReceived = new Subject()\r\n\r\n logMessages: ILogMessage[] = [];\r\n pulseMessages: (IPulseRecord | IPulseResponse)[] = [];\r\n tachoMessages: any[] = [];\r\n\r\n logLevel = LogLevel;\r\n\r\n showLogs: boolean;\r\n showPulse: boolean;\r\n showTacho: boolean;\r\n\r\n serial = \"303213121024\"\r\n\r\n ngOnInit(): void {\r\n this.signalRService.initialise().then(() => {\r\n this.signalRService.joinDeviceGroup(this.serial);\r\n this.signalRService.registerEvents(WebSocketEvents.LogMessage, this.logMessageReceived);\r\n this.signalRService.registerEvents(WebSocketEvents.Tacho, this.tachoReceived);\r\n this.signalRService.registerEvents(WebSocketEvents.Pulse, this.pulseMessageReceived);\r\n this.signalRService.registerEvents(WebSocketEvents.CameraCommand, this.pulseResponseReceived);\r\n });\r\n\r\n this.logMessageReceived.subscribe((message) => {\r\n console.log(\"Log Message received:\", message);\r\n this.logMessages.push(message);\r\n this.cd.detectChanges();\r\n });\r\n\r\n this.tachoReceived.subscribe((message) => {\r\n console.log(\"Tacho Message received:\", message);\r\n this.tachoMessages.push(JSON.parse(message));\r\n this.cd.detectChanges();\r\n });\r\n\r\n this.pulseMessageReceived.subscribe((message) => {\r\n console.log(\"Pulse Message received:\", message);\r\n\r\n message.consoleDisplayType = PulseMessageConsoleDisplayType.Record;\r\n\r\n this.pulseMessages.push(message);\r\n this.cd.detectChanges();\r\n });\r\n\r\n this.pulseResponseReceived.subscribe((message) => {\r\n console.log(\"Pulse Response received\", message);\r\n\r\n message.consoleDisplayType = PulseMessageConsoleDisplayType.Response;\r\n\r\n this.pulseMessages.push(message);\r\n this.cd.detectChanges();\r\n });\r\n }\r\n\r\n joinGroup(): void {\r\n this.signalRService.joinDeviceGroup(this.serial)\r\n }\r\n\r\n clearData(): void {\r\n this.pulseMessages = [];\r\n this.logMessages = [];\r\n this.tachoMessages = [];\r\n }\r\n\r\n serialChanged(serial: string): void {\r\n this.serial = serial;\r\n }\r\n\r\n isPulseRecord(item: IPulseRecord | IPulseResponse): item is IPulseRecord {\r\n return item.consoleDisplayType === PulseMessageConsoleDisplayType.Record;\r\n }\r\n\r\n isPulseResponse(item: IPulseRecord | IPulseResponse): item is IPulseResponse {\r\n return item.consoleDisplayType === PulseMessageConsoleDisplayType.Response;\r\n }\r\n}\r\n","import { Component, EventEmitter, OnInit, Output } from \"@angular/core\";\r\nimport { UntilDestroy } from \"@ngneat/until-destroy\";\r\n\r\nimport { PercentageBarModel } from \"@app/directives/_layout/v-table/_components/cells/percentage-bar/percentage-bar-cell.component\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { IAccount } from \"@app/services/account.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { DeviceHealthAccountService } from \"../../device-health-account.service\";\r\nimport { IDeviceHealthAccountSummary } from \"../../models/device-health-account-summary\";\r\nimport './device-health-accounts.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'device-health-accounts',\r\n template: require('./device-health-accounts.component.html')\r\n})\r\nexport class DeviceHealthAccountsComponent implements OnInit {\r\n @Output() onAccountSelection = new EventEmitter();\r\n\r\n loading = false;\r\n\r\n tableColumns: IVTableColumn[] = [];\r\n tableRows: IVTableRow[] = [];\r\n data: IDeviceHealthAccountSummary[] = [];\r\n\r\n constructor(\r\n private readonly deviceHealthAccountService: DeviceHealthAccountService,\r\n private readonly vTableService: VTableService,\r\n private readonly translationService: TranslationService\r\n ) { }\r\n\r\n async ngOnInit(): Promise {\r\n this.createTable();\r\n await this.loadData();\r\n }\r\n\r\n selectSummary(row: IVTableRow): void {\r\n this.onAccountSelection.next(row.data.account);\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Account\", sortable: true }),\r\n createCellFunction: (summary) => this.vTableService.createTableCell(summary.account.CompanyName, { tooltip: true })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"DeviceHealth.Accounts.TotalErrors\", width: 120, sortable: true, sortDirection: SortDirection.Descending, sorted: true, sortType: SortType.Number }),\r\n createCellFunction: (summary) => this.vTableService.createTableCell(summary.cameraFailingVehiclesCount + summary.telematicFailingVehiclesCount)\r\n }, \r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"DeviceHealth.Accounts.VehiclesReportingTelematicsErrors\", sortable: true }),\r\n createCellFunction: (summary) => this.vTableService.createPercentageBarCell(this.getPercentageTelematicsModel(summary))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"DeviceHealth.Accounts.VehiclesReportingCameraErrors\", sortable: true}),\r\n createCellFunction: (summary) => this.vTableService.createPercentageBarCell(this.getPercentageCameraModel(summary))\r\n }, \r\n ];\r\n }\r\n\r\n private createTableRows(): void {\r\n this.tableRows = this.vTableService.createTableRows(this.data, this.tableColumns);\r\n }\r\n\r\n private async loadData(): Promise {\r\n this.loading = true;\r\n\r\n this.data = await this.deviceHealthAccountService.getStatsForAccounts();\r\n this.createTableRows();\r\n\r\n this.loading = false;\r\n }\r\n\r\n private getPercentageTelematicsModel(summary: IDeviceHealthAccountSummary): PercentageBarModel {\r\n const mainTextKey = summary.vehiclesCount === 0 \r\n ? 'DeviceHealth.Accounts.NoVehicles'\r\n : 'DeviceHealth.Accounts.ErrorsReported';\r\n\r\n return {\r\n positiveSegment: {\r\n count: summary.vehiclesCount - summary.telematicFailingVehiclesCount,\r\n tooltip: this.translationService.t('DeviceHealth.Accounts.VehiclesWithoutErrors')\r\n },\r\n negativeSegment: {\r\n count: summary.telematicFailingVehiclesCount,\r\n tooltip: this.translationService.t('DeviceHealth.Accounts.VehiclesWithErrors')\r\n },\r\n mainText: this.translationService.t(mainTextKey, [summary.telematicFailingVehiclesCount, summary.vehiclesCount])\r\n }\r\n }\r\n\r\n private getPercentageCameraModel(summary: IDeviceHealthAccountSummary): PercentageBarModel {\r\n const mainTextKey = summary.vehiclesCount === 0 \r\n ? 'DeviceHealth.Accounts.NoVehicles'\r\n : 'DeviceHealth.Accounts.ErrorsReported';\r\n\r\n return {\r\n positiveSegment: {\r\n count: summary.vehiclesCount - summary.cameraFailingVehiclesCount,\r\n tooltip: this.translationService.t('DeviceHealth.Accounts.VehiclesWithoutErrors')\r\n },\r\n negativeSegment: {\r\n count: summary.cameraFailingVehiclesCount,\r\n tooltip: this.translationService.t('DeviceHealth.Accounts.VehiclesWithErrors')\r\n },\r\n mainText: this.translationService.t(mainTextKey, [summary.cameraFailingVehiclesCount, summary.vehiclesCount])\r\n }\r\n }\r\n}","import { DeviceHealthRecordType } from \"../enums/device-health-record-type\";\r\n\r\nexport class DeviceHealthRecordHelper {\r\n static isTelematic(type: DeviceHealthRecordType): boolean {\r\n return [\r\n DeviceHealthRecordType.BadSatFix,\r\n DeviceHealthRecordType.MessageSpam,\r\n DeviceHealthRecordType.MissingOdometer,\r\n DeviceHealthRecordType.LocationSnapped\r\n ].includes(type);\r\n }\r\n\r\n static isCamera(type: DeviceHealthRecordType): boolean {\r\n return [\r\n DeviceHealthRecordType.CameraVideoLoss,\r\n DeviceHealthRecordType.CameraMemoryFault,\r\n DeviceHealthRecordType.CameraStorageFailure,\r\n DeviceHealthRecordType.CameraPowerLoss,\r\n DeviceHealthRecordType.CameraGPSLoss\r\n ].includes(type)\r\n }\r\n}","import { Component, OnInit, ViewChild } from '@angular/core';\r\nimport { RagCellBehavior } from '@app/directives/_layout/v-table/_components/cells/rag-cell/rag-cell.component';\r\nimport { IVTableColumn } from '@app/directives/_layout/v-table/_models/IVTableColumn';\r\nimport { IVTableRow } from '@app/directives/_layout/v-table/_models/IVTableRow';\r\nimport { VTableService } from '@app/directives/_layout/v-table/_services/v-table.service';\r\nimport { IAggregateFilterEvent, IVerticalFilterListItem } from '@app/directives/_resourceFilters/filter-bar/filter-bar.models';\r\nimport { VerticalFilterListComponent } from '@app/directives/_resourceFilters/vertical-filter-list/vertical-filter-list.component';\r\nimport { SortType } from '@app/enum/SortType';\r\nimport { VehicleType } from '@app/enum/VehicleType.enum';\r\nimport { FoundationNavigationModule } from '@app/main/modules/foundation/foundation.navigation';\r\nimport { DateService, DateUnit } from '@app/services/date.service';\r\nimport { NavigationService } from '@app/services/navigation.service';\r\nimport { TranslationService } from '@app/services/translation.service';\r\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\r\nimport { finalize } from 'rxjs/operators';\r\nimport { DeviceHealthService } from '../../device-health.service';\r\nimport { DeviceHealthRecordType } from '../../enums/device-health-record-type';\r\nimport { SDCardErrorType } from '../../enums/sd-card-error-type';\r\nimport { DeviceHealthRecord } from '../../models/device-health-record';\r\nimport { DeviceHealthRecordsByVehicle } from '../../models/device-health-records-by-vehicle';\r\nimport './device-health-vehicle-view.component.scss';\r\n\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'device-health-vehicle-view',\r\n template: require('./device-health-vehicle-view.component.html')\r\n})\r\nexport class DeviceHealthVehicleViewComponent implements OnInit {\r\n private dayRange = 14;\r\n\r\n @ViewChild(VerticalFilterListComponent) verticalFilterList: VerticalFilterListComponent;\r\n\r\n loading = false;\r\n\r\n vehicleId: number;\r\n recordGroup: DeviceHealthRecordsByVehicle;\r\n\r\n tableColumns: IVTableColumn[] = [];\r\n tableRows: IVTableRow[] = [];\r\n filterItems: IVerticalFilterListItem[] = [];\r\n\r\n startDate: Date;\r\n endDate: Date;\r\n\r\n defaultDateRange = 3;\r\n selectedRecordTypes: DeviceHealthRecordType[] = [];\r\n\r\n exportTitle: string;\r\n\r\n get records(): DeviceHealthRecord[] {\r\n return this.recordGroup?.records ?? [];\r\n }\r\n\r\n get vehicleType(): string {\r\n return this.translationService.tEnum(VehicleType, \"VehicleType\", this.recordGroup.vehicleType, \"\");\r\n }\r\n\r\n constructor(\r\n private readonly navigationService: NavigationService,\r\n private readonly deviceHealthService: DeviceHealthService,\r\n private readonly vTableService: VTableService,\r\n private readonly translationService: TranslationService,\r\n private readonly dateService: DateService\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.vehicleId = parseInt(this.navigationService.getRouteParam('vehicleId'));\r\n \r\n this.setDate();\r\n this.setQueryParams();\r\n this.createTable();\r\n this.loadData();\r\n }\r\n\r\n onFilterChanged(filterEvent: IAggregateFilterEvent) {\r\n if (filterEvent.trigger == \"date\") {\r\n this.startDate = filterEvent.date[0];\r\n this.endDate = filterEvent.date[1];\r\n\r\n this.loadData();\r\n return;\r\n }\r\n }\r\n\r\n goToVehicle(): void {\r\n this.navigationService.go(FoundationNavigationModule.VehicleView, {vehicleId: this.vehicleId})\r\n }\r\n\r\n private setQueryParams(): void {\r\n const queryParams = this.navigationService.getQueryParams();\r\n\r\n if (queryParams.filterBy) {\r\n this.selectedRecordTypes = (queryParams.filterBy as string).split(',').map(x => parseInt(x));\r\n } \r\n }\r\n\r\n private setDate(): void {\r\n const now = new Date();\r\n const nowMinusIncludeDays = this.dateService.addOrSubtractTime(now, -this.dayRange, DateUnit.Day);\r\n\r\n this.endDate = this.dateService.getEndOfDay(now);\r\n this.startDate = this.dateService.getStartOfDay(nowMinusIncludeDays);\r\n }\r\n\r\n private loadData(): void {\r\n this.loading = true;\r\n\r\n this.deviceHealthService.getAllActiveAndHistoricalRecords(this.vehicleId, this.startDate, this.endDate)\r\n .pipe(\r\n untilDestroyed(this),\r\n finalize(() => {\r\n this.createTableRows();\r\n this.createFilterItems();\r\n this.setSelectedFilterItem();\r\n\r\n this.loading = false;\r\n })\r\n ).subscribe(recordGroup => {\r\n this.recordGroup = recordGroup;\r\n this.exportTitle = `${this.translationService.t('DeviceHealth.Vehicles')} - ${recordGroup.vehicleRegistration}`;\r\n })\r\n }\r\n\r\n private createTableRows(): void {\r\n this.tableRows = this.vTableService.createTableRows(this.records, this.tableColumns);\r\n }\r\n\r\n private createTable(): void {\r\n const regBehavior: RagCellBehavior = {\r\n redFn: (record) => !record.EndTime,\r\n grayFn: (record) => !!record.EndTime\r\n }\r\n\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"DeviceHealth.Status\", sortable: true, sorted: true, width: 140 }),\r\n createCellFunction: (record) => this.vTableService.createRagCell(this.getStatusLabel(record), record, regBehavior),\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Serial\", sortable: true, width: 180 }),\r\n createCellFunction: record => this.vTableService.createTableCell(record.Serial)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Product\", sortable: true }),\r\n createCellFunction: record => this.vTableService.createTableCell(record.productName)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Issue\", sortable: true }),\r\n createCellFunction: record => this.vTableService.createTableCell(this.translationService.tEnum(DeviceHealthRecordType, \"DeviceHealthRecordType\", record.Type))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"DeviceHealth.AdditionalInfo\", sortable: true }),\r\n createCellFunction: record => this.vTableService.createTableCell(\r\n !!record.SDCardErrorType ? this.translationService.tEnum(SDCardErrorType, \"SDCardErrorType\", record.SDCardErrorType) : \"\",\r\n { tooltip: true })\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"DeviceHealth.StartDate\" }),\r\n createCellFunction: (record) => this.vTableService.createDateCell(record.StartTime, { dateTime: true }),\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"DeviceHealth.EndDate\" }),\r\n createCellFunction: (record) => this.vTableService.createDateCell(record.EndTime, { dateTime: true }),\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"DeviceHealth.Duration\", sortType: SortType.Number, width: 160}),\r\n createCellFunction: (summary) => this.vTableService.createDurationCell(this.getDuration(summary), DateUnit.Ms)\r\n },\r\n ]\r\n }\r\n\r\n private getStatusLabel(record: DeviceHealthRecord): string {\r\n return record.EndTime\r\n ? this.translationService.translate(\"DeviceHealth.Ended\")\r\n : this.translationService.translate(\"DeviceHealth.Active\");\r\n }\r\n\r\n private createFilterItems(): void {\r\n this.filterItems = this.deviceHealthService.getFiltersForVehicleDetails(this.records);\r\n }\r\n\r\n private setSelectedFilterItem(): void {\r\n if (this.selectedRecordTypes.length > 0) { \r\n this.filterItems\r\n .filter(item => this.selectedRecordTypes.includes(item.key))\r\n .forEach(item => this.verticalFilterList.selectItem(item));\r\n }\r\n }\r\n\r\n private getDuration(record: DeviceHealthRecord): number {\r\n const startTime = record.StartTime;\r\n const endTime = record.EndTime || new Date();\r\n\r\n return new Date(endTime).getTime() - new Date(startTime).getTime();\r\n }\r\n}\r\n","import { Component, ViewChild } from \"@angular/core\";\r\nimport { UntilDestroy } from \"@ngneat/until-destroy\";\r\n\r\nimport { VTabComponent } from \"@app/directives/_layout/v-tabs/v-tab.component\";\r\nimport { VTabsComponent } from \"@app/directives/_layout/v-tabs/v-tabs.component\";\r\nimport { IAccount } from \"@app/services/account.service\";\r\nimport { DeviceHealthVehiclesComponent } from \"../device-health-vehicles/device-health-vehicles.component\";\r\nimport './device-health.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'device-health',\r\n template: require('./device-health.component.html')\r\n})\r\nexport class DeviceHealthComponent {\r\n @ViewChild('tabs') tabs: VTabsComponent;\r\n @ViewChild('vehiclesTab') vehiclesTab: VTabComponent;\r\n @ViewChild('vehiclesComponent') vehiclesComponent: DeviceHealthVehiclesComponent;\r\n\r\n accountSelected(account: IAccount): void {\r\n this.tabs.selectTab(this.vehiclesTab);\r\n this.vehiclesComponent.selectAccount(account);\r\n }\r\n}","import { Component } from \"@angular/core\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { AsyncObservableComponent } from \"@app/directives/_misc/async-observable/async-observable.component\";\r\nimport { IAggregateFilterEvent } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { DateRange } from \"@enums/DateRange.enum\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { tap } from \"rxjs/operators\";\r\nimport { EngineerJobItemType } from \"../../foundation.enums\";\r\nimport { IEngineerCommission } from \"../../foundation.interfaces\";\r\nimport { EngineerCommissionService } from \"../../_services/engineer-commission.service\";\r\nimport { VehicleValidationCheckRecordService } from \"../../_services/vehicle-validation-check-record.service\";\r\nimport './engineer-commission-history-list.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'engineer-commission-history-list',\r\n template: require('./engineer-commission-history-list.component.html')\r\n\r\n})\r\nexport class EngineerCommissionHistoryListComponent {\r\n\r\n tableColumns: IVTableColumn[] = [];\r\n tableRows: IVTableRow[] = [];\r\n\r\n commissions: IEngineerCommission[];\r\n loading: boolean;\r\n\r\n defaultDateRange: DateRange = DateRange.ThisMonth;\r\n startDate: Date;\r\n endDate: Date;\r\n\r\n constructor(\r\n private readonly engineerCommissionService: EngineerCommissionService,\r\n private readonly vehicleValidationCheckRecordService: VehicleValidationCheckRecordService,\r\n private readonly vTableService: VTableService) { }\r\n\r\n ngOnInit(): void {\r\n this.createTable();\r\n }\r\n\r\n onFilterChanged(filterEvent: IAggregateFilterEvent): void {\r\n if (filterEvent.trigger == \"date\") {\r\n this.startDate = filterEvent.date[0];\r\n this.endDate = filterEvent.date[1];\r\n this.getCommissions();\r\n }\r\n }\r\n\r\n //--\r\n\r\n private getCommissions(): void {\r\n this.engineerCommissionService.getEngineerCommissions({ Start: this.startDate.toISOString(), End: this.endDate.toISOString() }).pipe(untilDestroyed(this),\r\n tap(commissions => {\r\n this.commissions = commissions;\r\n this.tableRows = this.vTableService.createTableRows(this.commissions, this.tableColumns);\r\n })\r\n ).subscribe();\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"EngineerHistory.CompletionDate\", sorted: true, sortDirection: SortDirection.Descending }),\r\n createCellFunction: commission => this.vTableService.createDateCell(commission.Timestamp)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: \"ID\", width: 100 }),\r\n createCellFunction: commission => this.vTableService.createTableCell(commission.Id)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"EngineerHistory.JobType\" }),\r\n createCellFunction: commission => this.vTableService.createEnumCell(EngineerJobItemType, \"EngineerJobItemType\", commission.VisitReasonId)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"EngineerHistory.DeviceValidation\", minTableWidth: 650 }),\r\n createCellFunction: commission => this.getValidationCheckForCommission(commission)\r\n }\r\n ]\r\n }\r\n\r\n private getValidationCheckForCommission(commission: IEngineerCommission): any {\r\n const validationObservable = this.vehicleValidationCheckRecordService.getRecordResultsForTable(commission);\r\n\r\n return this.vTableService.createTableCell(commission, {\r\n component: AsyncObservableComponent,\r\n componentInputs: {\r\n observable$: validationObservable,\r\n useLoading: true\r\n }\r\n })\r\n }\r\n\r\n}\r\n","import { Component, Input, OnChanges, OnInit, SimpleChanges } from \"@angular/core\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { tap } from \"rxjs/operators\";\r\nimport { IEngineerJobItem } from \"../../../foundation.interfaces\";\r\nimport { EngineerJobItemService } from \"../../../_services/engineer-job-item.service\";\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'job-completion',\r\n template: ``\r\n})\r\n\r\nexport class JobCompletionComponent implements OnInit, OnChanges {\r\n @Input() jobId: number;\r\n\r\n //--\r\n\r\n count: number = 0;\r\n total: number = 0;\r\n\r\n jobItems: IEngineerJobItem[];\r\n\r\n constructor(private readonly jobItemService: EngineerJobItemService) { }\r\n\r\n ngOnInit(): void {\r\n this.getData();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['jobId']) {\r\n this.getData();\r\n }\r\n }\r\n\r\n //--\r\n\r\n private getData(): void {\r\n this.jobItemService.getEngineerJobItems({ JobId: this.jobId }).pipe(\r\n untilDestroyed(this),\r\n tap(jobItems => {\r\n this.jobItems = jobItems;\r\n this.calculateTotals();\r\n })\r\n ).subscribe()\r\n\r\n }\r\n\r\n private calculateTotals(): void {\r\n const { completedJobItems, totalJobItems } = this.jobItemService.calculateJobCompletion(this.jobItems);\r\n this.total = totalJobItems;\r\n this.count = completedJobItems;\r\n }\r\n}\r\n","import { NavigationService } from \"@app/services/navigation.service\";\r\nimport { Component, Input, OnChanges, OnDestroy, OnInit } from \"@angular/core\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { IAggregateFilterEvent, IFilterBarTab } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { FilterBarService } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.service\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { IAccount } from \"@app/services/account.service\";\r\nimport { ConstantsService } from \"@app/services/constantsService\";\r\nimport { DateService, DateUnit } from \"@app/services/date.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { combineLatest, forkJoin, lastValueFrom, Subscription } from \"rxjs\";\r\nimport { EngineerJobStatus, IEngineerJob, IEngineerJobBookingWithEngineerMappings, IEngineerJobItem } from \"../../foundation.interfaces\";\r\nimport { AccountService } from \"../../_services/account.service\";\r\nimport { EngineerJobItemService } from \"../../_services/engineer-job-item.service\";\r\nimport { EngineerJobService } from \"../../_services/engineer-job.service\";\r\nimport { JobCompletionComponent } from \"./job-completion/job-completion.component\";\r\nimport './job-list.component.scss';\r\nimport { EngineerJobBookingService } from \"../../_services/engineer-job-booking.service\";\r\nimport { FoundationNavigationModule } from \"../../foundation.navigation\";\r\nimport { IVTableCell } from \"@app/directives/_layout/v-table/_models/IVTableCell\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'job-list',\r\n template: require('./job-list.component.html')\r\n})\r\nexport class JobListComponent implements OnInit, OnChanges {\r\n\r\n @Input() customerId: number;\r\n\r\n //--\r\n\r\n\r\n jobs: IEngineerJob[] = [];\r\n jobBookings: IEngineerJobBookingWithEngineerMappings[];\r\n displayJobs: IEngineerJob[] = [];\r\n accounts: IAccount[] = [];\r\n selectedJob: IEngineerJob;\r\n\r\n jobItems: IEngineerJobItem[];\r\n\r\n tabCount: number = 0;\r\n\r\n loading = false;\r\n isMobile = false;\r\n\r\n startDate: Date = new Date();\r\n endDate: Date = new Date();\r\n\r\n showAddJobForm: boolean;\r\n\r\n //Table\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n filterTabs: IFilterBarTab[] = [];\r\n\r\n dataSubscription: Subscription;\r\n jobBookingsSubscription: Subscription;\r\n\r\n constructor(\r\n private readonly navigationService: NavigationService,\r\n private readonly accountService: AccountService,\r\n private readonly constantsService: ConstantsService,\r\n private readonly dateService: DateService,\r\n private readonly engineerJobBookingService: EngineerJobBookingService,\r\n private readonly engineerJobItemService: EngineerJobItemService,\r\n private readonly engineerJobService: EngineerJobService,\r\n private readonly filterBarService: FilterBarService,\r\n private readonly translationService: TranslationService,\r\n private readonly vTableService: VTableService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.isMobile = this.constantsService.getIsMobile();\r\n this.startDate = this.dateService.addOrSubtractTime(new Date(), -180, DateUnit.Day);\r\n this.endDate = new Date();\r\n this.loadData();\r\n this.createTabs();\r\n }\r\n\r\n ngOnChanges(): void {\r\n if (this.tableColumns) {\r\n this.createTableRows();\r\n }\r\n }\r\n\r\n onFilterChanged(filterEvent: IAggregateFilterEvent): void {\r\n if (filterEvent.trigger == \"date\") {\r\n this.startDate = filterEvent.date[0];\r\n this.endDate = filterEvent.date[1];\r\n this.filterJobsByDate();\r\n }\r\n }\r\n\r\n selectJob(row: IVTableRow): void {\r\n const job = row.data;\r\n this.navigationService.go(FoundationNavigationModule.JobView, { jobId: job.Id });\r\n }\r\n\r\n addJob(): void {\r\n this.showAddJobForm = true;\r\n this.selectedJob = this.engineerJobService.createNewJob();\r\n }\r\n\r\n closeJobForm(): void {\r\n this.showAddJobForm = false;\r\n }\r\n\r\n jobBookingSaved(jobBooking: IEngineerJobBookingWithEngineerMappings): void {\r\n this.jobBookings.push(jobBooking);\r\n this.displayJobs.find(job => job.Id == jobBooking.JobId).jobBooking = jobBooking;\r\n \r\n this.createTableRows();\r\n this.createTabs();\r\n\r\n this.closeJobForm();\r\n this.navigationService.go(FoundationNavigationModule.JobView, { jobId: jobBooking.JobId }, false);\r\n }\r\n\r\n //--\r\n\r\n private loadData(): void {\r\n this.loading = true;\r\n this.createTable();\r\n\r\n if (this.dataSubscription) {\r\n this.dataSubscription.unsubscribe();\r\n }\r\n\r\n this.dataSubscription = new Subscription();\r\n\r\n this.dataSubscription.add(combineLatest([\r\n this.accountService.getCustomerAccounts(),\r\n this.engineerJobService.getEngineerJobs(),\r\n this.engineerJobBookingService.getEngineeringJobBookingsWithMappings({ Start: this.startDate, End: this.dateService.addOrSubtractTime(new Date(), 180, DateUnit.Day) })\r\n ]).pipe(untilDestroyed(this))\r\n .subscribe(([accounts, jobs, bookings]) => {\r\n this.accounts = accounts;\r\n this.jobBookings = bookings;\r\n\r\n this.renderJobs(jobs);\r\n this.loading = false\r\n })); \r\n\r\n this.dataSubscription.add(this.engineerJobBookingService.jobBookings.pipe(untilDestroyed(this)).subscribe(bookings => {\r\n this.jobBookings = bookings;\r\n this.renderJobs(this.jobs);\r\n }));\r\n }\r\n\r\n private renderJobs(jobs: IEngineerJob[]): void {\r\n this.loadJobs(jobs);\r\n this.createTableRows();\r\n }\r\n\r\n private loadJobs(jobs: IEngineerJob[]): void {\r\n if (!jobs?.length) {\r\n return;\r\n }\r\n\r\n const filteredJobs = this.customerId ? jobs.filter(j => j.AccountId == this.customerId) : jobs;\r\n\r\n this.jobs = this.displayJobs = this.engineerJobService.mapAccountsToJobs(filteredJobs, this.accounts);\r\n this.filterJobsByDate();\r\n this.engineerJobService.mapBookingsToJobs(this.displayJobs, this.jobBookings);\r\n this.tabCount = this.displayJobs?.length;\r\n }\r\n\r\n private filterJobsByDate(): void {\r\n if (!this.startDate || !this.endDate || !this.jobs) {\r\n return;\r\n }\r\n\r\n this.displayJobs = this.jobs.filter(job => {\r\n return this.dateService.dateIsBetweenDates(job.CreatedDate, this.startDate, this.dateService.addOrSubtractTime(this.endDate, 1, DateUnit.Hour));\r\n });\r\n }\r\n\r\n private createTable(): void {\r\n\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({\r\n title: \"ID\",\r\n width: 80\r\n }),\r\n createCellFunction: (job) => this.vTableService.createTableCell(job.Id.toString())\r\n\r\n\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"EngineerJobs.Customer\",\r\n minTableWidth: 950\r\n }),\r\n createCellFunction: (job) => this.vTableService.createTableCell(this.engineerJobService.getCompanyNameForJob(job, this.accounts))\r\n\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"Common.Status\",\r\n width: 90\r\n }),\r\n createCellFunction: (job) => this.vTableService.createEnumCell(EngineerJobStatus, 'EngineerJobStatus', job.Status)\r\n\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Description\" }),\r\n createCellFunction: (job) => this.vTableService.createTableCell(job.Description, { tooltip: true })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"EngineerJobs.Assigned\",\r\n minTableWidth: 950\r\n }),\r\n createCellFunction: (job) => this.getEngineerAssignCell(job)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({\r\n tKey: \"Common.StartTime\",\r\n minTableWidth: 950,\r\n sorted: true,\r\n sortDirection: SortDirection.Descending\r\n }),\r\n createCellFunction: (job) => this.vTableService.createDateCell(job.jobBooking?.StartUtc, { dateTime: false })\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({\r\n tKey: \"Common.EndTime\",\r\n minTableWidth: 950\r\n }),\r\n createCellFunction: (job) => this.vTableService.createDateCell(job.jobBooking?.EndUtc, { dateTime: false })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"EngineerJobs.Completion\",\r\n sortable: false,\r\n searchable: false,\r\n width: 150\r\n }),\r\n createCellFunction: (job) => this.vTableService.createTableCell(job, { component: JobCompletionComponent, componentInputs: { jobId: job.Id }, exportDataMethod: () => this.exportJobCompletionMethod(job.Id) })\r\n }\r\n ]\r\n\r\n }\r\n\r\n private createTableRows(): void {\r\n this.tableRows = this.vTableService.createTableRows(this.displayJobs, this.tableColumns);\r\n }\r\n\r\n private exportJobCompletionMethod(jobId: number): Promise {\r\n return lastValueFrom(this.engineerJobItemService.getEngineerJobItems({ JobId: jobId })).then(jobItems => {\r\n const { completedJobItems, totalJobItems } = this.engineerJobItemService.calculateJobCompletion(jobItems);\r\n return Promise.resolve(`${completedJobItems}/${totalJobItems} ${this.translationService.t(\"EngineerJobs.JobItems\")}`);\r\n })\r\n }\r\n\r\n private createTabs(): void {\r\n this.filterTabs = [];\r\n\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"EngineerJobs.Active\", (job) => !this.engineerJobService.jobIsClosed(job)));\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"EngineerJobs.Closed\", (job) => this.engineerJobService.jobIsClosed(job)));\r\n }\r\n\r\n private buildEngineerAssignedString(job: IEngineerJob): string {\r\n let engineerNames = \"\";\r\n\r\n if (!job.jobBooking?.assignedEngineers?.length) {\r\n return engineerNames;\r\n }\r\n\r\n job.jobBooking?.assignedEngineers?.forEach((engineer, index) => {\r\n if (index > 2) {\r\n return;\r\n }\r\n if (index > 1) {\r\n engineerNames += \" \" + this.translationService.t(\"EngineerJobs.AndXMore\", job.jobBooking.assignedEngineers.length - 2);\r\n return;\r\n }\r\n if (index == 1) {\r\n engineerNames += \", \";\r\n }\r\n engineerNames += engineer.Description;\r\n });\r\n\r\n return engineerNames;\r\n }\r\n\r\n private getEngineerAssignCell(job: IEngineerJob): IVTableCell {\r\n if (!job.jobBooking) {\r\n return this.vTableService.createTableCell(null);\r\n }\r\n\r\n if (this.jobIsAssignedToGroup(job)) {\r\n return this.vTableService.createTableCell(job.jobBooking.assignedGroup?.Description || \"\", { icon: \"fa-users\" });\r\n }\r\n\r\n const engineerAssignedString = this.buildEngineerAssignedString(job);\r\n return this.vTableService.createTableCell(engineerAssignedString, { tooltip: true, icon: \"fa-user\", searchData: this.getEngineerSearchDataString(job) })\r\n }\r\n\r\n private jobIsAssignedToGroup(job: IEngineerJob): boolean {\r\n return !!job.jobBooking?.mappings?.some(mapping => !!mapping.UserGroupId) || !!job.jobBooking?.assignedGroup;\r\n }\r\n\r\n private getEngineerSearchDataString(job: IEngineerJob): string {\r\n let searchString = \"\";\r\n\r\n job.jobBooking?.assignedEngineers?.forEach(engineer => {\r\n searchString += \"||||\" + engineer.Description;\r\n })\r\n\r\n return searchString;\r\n }\r\n\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output, ViewChild } from \"@angular/core\";\r\nimport { FormControl, FormGroup, Validators } from \"@angular/forms\";\r\nimport { VDateSelectorComponent } from \"@app/directives/_veri/v-date-selector/v-date-selector.component\";\r\nimport { IUser } from \"@app/interfaces/IUser\";\r\nimport { EngineerJobStatus, IEngineerJob, IEngineerJobBookingWithEngineerMappings } from \"@app/main/modules/foundation/foundation.interfaces\";\r\nimport { EngineerJobService } from \"@app/main/modules/foundation/_services/engineer-job.service\";\r\nimport { IAccount } from \"@app/services/account.service\";\r\nimport { Observable, Subject } from \"rxjs\";\r\nimport { take, takeUntil } from \"rxjs/operators\";\r\nimport { IEngineerJobBookingMapping } from \"../../../_models/IEngineerJobBookingMapping\";\r\nimport { IUserGroup } from \"../../../_models/IUserGroup\";\r\nimport { EngineerJobBookingMappingService } from \"../../../_services/engineer-job-booking-mapping.service\";\r\nimport { EngineerJobBookingService } from \"../../../_services/engineer-job-booking.service\";\r\nimport { UserGroupService } from \"../../../_services/user-group.service\";\r\nimport './job-editor.component.scss';\r\n\r\n@Component({\r\n selector: 'job-editor',\r\n template: require('./job-editor.component.html')\r\n})\r\nexport class JobEditorComponent implements OnInit, OnChanges, OnDestroy {\r\n @Input() job: IEngineerJob;\r\n @Input() jobBooking: IEngineerJobBookingWithEngineerMappings;\r\n @Input() accounts: IAccount[];\r\n @Input() editMode: boolean = false;\r\n\r\n @Output() jobSaved = new EventEmitter();\r\n @Output() jobBookingSaved = new EventEmitter();\r\n\r\n @ViewChild(VDateSelectorComponent) dateSelector: VDateSelectorComponent;\r\n\r\n //--\r\n\r\n amendedJob: IEngineerJob;\r\n amendedJobBooking: IEngineerJobBookingWithEngineerMappings;\r\n jobEditorForm: FormGroup;\r\n userGroups$: Observable;\r\n selectedUserGroupId: number;\r\n selectedUserGroup: IUserGroup;\r\n\r\n engineerJobStatus = EngineerJobStatus;\r\n\r\n saving: boolean;\r\n jobIsClosed: boolean = false;\r\n showParentCompany: boolean;\r\n\r\n formValid: boolean;\r\n\r\n private destroy$ = new Subject();\r\n constructor(\r\n private readonly engineerJobBookingService: EngineerJobBookingService,\r\n private readonly engineerJobBookingMappingService: EngineerJobBookingMappingService,\r\n private readonly engineerJobService: EngineerJobService,\r\n private readonly userGroupService: UserGroupService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.load();\r\n }\r\n\r\n ngOnChanges(): void {\r\n this.load();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.unsubscribe();\r\n }\r\n\r\n reset(): void {\r\n this.load();\r\n }\r\n\r\n saveJob(): void {\r\n this.saving = true;\r\n this.saveOrUpdateJob();\r\n }\r\n\r\n accountSearchPredicate(account: IAccount, text: string): boolean {\r\n return account.CompanyName.toLowerCase().includes(text.toLowerCase());\r\n }\r\n\r\n accountClicked(account: IAccount): void {\r\n this.amendedJob.AccountId = account.Id;\r\n }\r\n\r\n onAutocompleteCleared(): void {\r\n this.amendedJob.AccountId = null;\r\n }\r\n\r\n onDateSelectionChanged(dates: Date[]): void {\r\n if (dates.length < 2) {\r\n return;\r\n }\r\n this.editMode && this.jobEditorForm.markAsDirty();\r\n this.amendedJobBooking.StartUtc = dates[0];\r\n this.amendedJobBooking.EndUtc = dates[1];\r\n }\r\n\r\n onSelectedEngineersChanged(engineers: IUser[]): void {\r\n this.jobEditorForm.markAsDirty();\r\n this.clearSelectedParentCompany();\r\n this.amendedJobBooking.assignedEngineers = [...engineers];\r\n }\r\n\r\n onSelectedParentCompanyChanged(userGroup: IUserGroup): void {\r\n this.jobEditorForm.markAsDirty();\r\n this.amendedJobBooking.assignedGroupId = userGroup.Id;\r\n this.amendedJobBooking.assignedGroup = userGroup;\r\n this.selectedUserGroupId = userGroup.Id;\r\n this.selectedUserGroup = userGroup;\r\n }\r\n\r\n toggleShowParentCompany(toggle: boolean): void {\r\n this.jobEditorForm.markAsDirty();\r\n this.amendedJobBooking.assignedEngineers = [];\r\n this.amendedJobBooking.mappings = [];\r\n this.showParentCompany = toggle;\r\n !this.showParentCompany && this.clearSelectedParentCompany();\r\n }\r\n\r\n clearSelectedParentCompany(): void {\r\n this.amendedJobBooking.assignedGroupId = null;\r\n this.amendedJobBooking.assignedGroup = null;\r\n this.selectedUserGroup = null;\r\n this.selectedUserGroupId = null;\r\n }\r\n\r\n\r\n groupSearchPredicate(group: IUserGroup, text: string): boolean {\r\n return group.Description.toLowerCase().includes(text.toLowerCase());\r\n }\r\n\r\n\r\n // Getters\r\n\r\n get canSave(): boolean {\r\n if (!this.job ||\r\n this.jobIsClosed ||\r\n !this.amendedJob.AccountId ||\r\n !this.jobEditorForm?.valid ||\r\n (!this.jobEditorForm?.dirty && this.editMode) ||\r\n this.dateSelector.calendar.invalidSelection\r\n ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n //--\r\n\r\n private load(): void {\r\n if (!this.editMode) {\r\n this.createNewJob();\r\n this.setupJobEditorForm();\r\n return;\r\n }\r\n\r\n this.userGroups$ = this.userGroupService.getUserGroups();\r\n\r\n this.setAmendedJob();\r\n this.setupJobEditorForm();\r\n this.jobIsClosed = this.engineerJobService.jobIsClosed(this.job);\r\n this.setSelectedUserGroup();\r\n }\r\n\r\n private createNewJob(): void {\r\n this.amendedJob = { ...this.job };\r\n this.amendedJobBooking = { ...this.job.jobBooking };\r\n this.amendedJobBooking.assignedEngineers = [];\r\n this.amendedJobBooking.mappings = [];\r\n }\r\n\r\n private setAmendedJob(): void {\r\n this.amendedJob = { ...this.job };\r\n this.amendedJobBooking = { ...this.jobBooking };\r\n this.amendedJobBooking.assignedEngineers = this.jobBooking?.assignedEngineers ? [...this.jobBooking.assignedEngineers] : [];\r\n }\r\n\r\n private setupJobEditorForm(): void {\r\n this.jobEditorForm = new FormGroup({\r\n 'Description': new FormControl(this.amendedJob.Description, Validators.maxLength(150)),\r\n 'EngineerInstruction': new FormControl(this.amendedJob.EngineerInstruction)\r\n });\r\n\r\n this.jobEditorForm.statusChanges.pipe(takeUntil(this.destroy$)).subscribe((status: string) => {\r\n if (status === \"INVALID\") {\r\n return;\r\n }\r\n this.amendedJob = {\r\n ...this.amendedJob,\r\n Description: this.jobEditorForm.value.Description,\r\n EngineerInstruction: this.jobEditorForm.value.EngineerInstruction\r\n }\r\n });\r\n }\r\n\r\n private setSelectedUserGroup(): void {\r\n if (!this.jobBooking) {\r\n return;\r\n }\r\n\r\n this.selectedUserGroupId = this.jobBooking.assignedGroupId;\r\n if (this.selectedUserGroupId) {\r\n this.toggleShowParentCompany(true);\r\n }\r\n }\r\n\r\n private saveOrUpdateJob(): void {\r\n if (this.editMode && this.amendedJob.Status !== EngineerJobStatus.Cancelled) {\r\n this.deleteCancelledAssignments();\r\n this.saveNewEngineerMappings();\r\n }\r\n\r\n this.engineerJobService.createUpdateEngineerJob(this.amendedJob).pipe(take(1)).subscribe(job => {\r\n this.amendedJob.Id = job.Id;\r\n this.amendedJobBooking.JobId = job.Id;\r\n this.amendedJobBooking.assignedGroup = this.selectedUserGroup;\r\n this.amendedJobBooking.assignedGroupId = this.selectedUserGroupId;\r\n this.saveJobBooking();\r\n this.jobSaved.emit(this.amendedJob);\r\n\r\n })\r\n }\r\n\r\n private saveJobBooking(): void {\r\n const selectedEngineersCopy = [...this.amendedJobBooking.assignedEngineers];\r\n\r\n this.engineerJobBookingService.createUpdateEngineeringJobBooking(this.amendedJobBooking, this.amendedJob.AccountId).pipe(take(1)).subscribe(jobBooking => {\r\n this.amendedJobBooking = jobBooking;\r\n this.amendedJobBooking.assignedEngineers = [...selectedEngineersCopy];\r\n this.amendedJobBooking.assignedGroupId = this.selectedUserGroupId;\r\n this.amendedJobBooking.assignedGroup = this.selectedUserGroup;\r\n this.saving = false;\r\n this.jobBookingSaved.emit(this.amendedJobBooking);\r\n });\r\n }\r\n\r\n private deleteCancelledAssignments(): void {\r\n if (!this.jobBooking?.mappings?.length) {\r\n return;\r\n }\r\n\r\n this.jobBooking.mappings.forEach(mapping => {\r\n if (this.engineersMatchMapping(mapping) || this.selectedGroupMatchMapping(mapping)) // selected group Id matches mapping\r\n {\r\n return;\r\n }\r\n\r\n this.engineerJobBookingMappingService.deleteJobBookingMapping(mapping).pipe(take(1)).subscribe();\r\n })\r\n }\r\n\r\n private engineersMatchMapping(mapping :IEngineerJobBookingMapping) : boolean {\r\n return !mapping.UserGroupId && !!this.amendedJobBooking.assignedEngineers.find(eng => eng.Id === mapping.UserId);\r\n }\r\n\r\n private selectedGroupMatchMapping(mapping: IEngineerJobBookingMapping): boolean {\r\n return mapping.UserGroupId && this.amendedJobBooking.assignedGroupId == mapping.UserGroupId;\r\n }\r\n\r\n private saveNewEngineerMappings(): void {\r\n if (this.amendedJobBooking.assignedGroupId) {\r\n let mapping: IEngineerJobBookingMapping = {\r\n UserGroupId: this.amendedJobBooking.assignedGroupId,\r\n Id: 0,\r\n EngineerJobBookingId: this.amendedJobBooking.Id\r\n }\r\n this.amendedJobBooking.mappings.push(mapping);\r\n this.engineerJobBookingMappingService.addUpdateEngineerJobBookingMapping(mapping).pipe(take(1)).subscribe(() => {\r\n this.jobBookingSaved.emit(this.amendedJobBooking);\r\n });\r\n return;\r\n }\r\n\r\n this.amendedJobBooking.assignedEngineers.forEach(engineer => {\r\n if (this.mappingExists(engineer.Id)) {\r\n return;\r\n }\r\n this.engineerJobBookingMappingService.createJobBookingMappingsFromEngineerId(engineer.Id, this.amendedJobBooking.Id).pipe(take(1)).subscribe((mapping) => {\r\n this.amendedJobBooking.mappings.push(mapping);\r\n });\r\n })\r\n this.engineerJobBookingService.setSelectedJobBooking(this.amendedJobBooking);\r\n }\r\n\r\n private mappingExists(userId: number): boolean {\r\n if (!this.jobBooking?.assignedEngineers?.length) {\r\n return false;\r\n };\r\n\r\n return !!this.jobBooking.assignedEngineers.find(eng => eng.Id === userId);\r\n }\r\n\r\n\r\n}\r\n","import { Component, EventEmitter, Input, Output } from \"@angular/core\";\r\nimport { FormControl, FormGroup, Validators } from \"@angular/forms\";\r\nimport { getValuesFromEnum } from \"@app/class/Utilities\";\r\nimport { UserType } from \"@app/enum/UserType\";\r\nimport { IUser } from \"@app/interfaces/IUser\";\r\nimport { CurrentUserService } from \"@app/services/currentUser.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { combineLatest, from } from \"rxjs\";\r\nimport { debounceTime } from \"rxjs/operators\";\r\nimport { IEngineerJob, IEngineerJobItem } from \"../../foundation.interfaces\";\r\nimport { VisitFailureReason } from \"../../_enums/VisitFailureReason\";\r\nimport { IVisitFailureRecord } from \"../../_models/IVisitFailureRecord\";\r\nimport { FoundationAccountService } from \"../../_services/account.service.ajs\";\r\nimport { EngineerService } from \"../../_services/engineer.service\";\r\nimport { VisitFailureService } from \"../../_services/visit-failure.service\";\r\nimport './visit-failure-form.component.scss';\r\n\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: \"visit-failure-form\",\r\n template: require('./visit-failure-form.component.html')\r\n})\r\nexport class VisitFailureFormComponent {\r\n @Input() jobItem: IEngineerJobItem;\r\n @Input() job: IEngineerJob;\r\n @Input() recordToEdit: IVisitFailureRecord;\r\n @Input() accountId: number;\r\n\r\n @Output() visitFailureSaved = new EventEmitter();\r\n\r\n editMode: boolean;\r\n issueForm: FormGroup;\r\n\r\n VisitFailureReason = VisitFailureReason;\r\n failReasons: number[] = getValuesFromEnum(VisitFailureReason);\r\n \r\n currentUser: IUser;\r\n engineers: IUser[];\r\n selectedEngineer: IUser;\r\n\r\n visitFailureRecord: IVisitFailureRecord;\r\n disableChargeable: boolean;\r\n\r\n loading: boolean;\r\n\r\n constructor(\r\n private readonly accountService: FoundationAccountService,\r\n private readonly currentUserService: CurrentUserService,\r\n private readonly engineerService: EngineerService,\r\n private readonly visitFailureService: VisitFailureService\r\n ) { }\r\n\r\n ngOnChanges(): void {\r\n this.getData();\r\n }\r\n\r\n get userIsEngineer(): boolean {\r\n return this.currentUser?.Type == UserType.Engineer;\r\n }\r\n\r\n get formValid(): boolean {\r\n return this.issueForm?.valid;\r\n }\r\n\r\n save(): void {\r\n if (!this.issueForm.valid) {\r\n return;\r\n }\r\n\r\n this.visitFailureRecord.FailureTimestampUTC = this.visitFailureRecord.FailureTimestampUTC || new Date().toUTCString();\r\n\r\n this.visitFailureService.saveVisitFailure(this.visitFailureRecord).pipe(\r\n untilDestroyed(this)\r\n ).subscribe({\r\n next: record => this.visitFailureRecord = record,\r\n complete: () => this.visitFailureSaved.emit(this.visitFailureRecord)\r\n })\r\n }\r\n\r\n engineerSearchPredicate(engineer: IUser, text: string): boolean {\r\n return engineer.Description?.toLowerCase().includes(text.toLowerCase());\r\n }\r\n\r\n onEngineerClicked(engineer: IUser): void {\r\n this.selectedEngineer = engineer;\r\n this.issueForm.controls.Engineer.setValue(engineer);\r\n }\r\n\r\n clearEngineer(): void {\r\n this.selectedEngineer = null;\r\n this.issueForm.controls.Engineer.setValue(undefined);\r\n }\r\n\r\n onReasonChanged(reason: VisitFailureReason): void {\r\n\r\n if (reason === VisitFailureReason.KitNotOnSiteCustomer ||\r\n reason === VisitFailureReason.VehicleNotOnSite) {\r\n this.issueForm.controls.Chargeable.setValue(true);\r\n this.disableChargeable = true;\r\n return;\r\n }\r\n\r\n this.issueForm.controls.Chargeable.setValue(false);\r\n this.disableChargeable = false;\r\n }\r\n\r\n //--\r\n\r\n private getData(): void {\r\n this.loading = true;\r\n\r\n combineLatest([\r\n from(this.currentUserService.getCurrentUser() as Promise),\r\n this.engineerService.getEngineers()\r\n ]).pipe(\r\n untilDestroyed(this)\r\n ).subscribe({\r\n next: ([currentUser, engineers]) => {\r\n this.currentUser = currentUser;\r\n this.engineers = engineers;\r\n\r\n if (this.recordToEdit) {\r\n this.setExistingRecord();\r\n this.loading = false;\r\n return;\r\n }\r\n\r\n const accountId = this.job?.AccountId || this.accountId;\r\n\r\n if (!accountId) {\r\n console.error(\"VisitFailureFormComponent requires either a job or AccountId input\");\r\n }\r\n\r\n this.visitFailureRecord = {\r\n Id: 0,\r\n AccountId: accountId,\r\n UserId: this.currentUser.Id,\r\n EngineerId: this.currentUser.Type === UserType.Engineer ? this.currentUser.Id : undefined,\r\n Chargeable: false,\r\n JobItemId: this.jobItem?.Id,\r\n EngineerReason: \"\",\r\n CustomerAdvisor: \"\",\r\n VehicleId: this.jobItem?.VehicleId\r\n }\r\n\r\n this.createForm();\r\n this.loading = false;\r\n }\r\n })\r\n }\r\n\r\n private setExistingRecord(): void {\r\n this.editMode = true;\r\n this.visitFailureRecord = { ...this.recordToEdit };\r\n this.createForm();\r\n }\r\n\r\n\r\n private createForm(): void {\r\n if (this.issueForm) {\r\n return;\r\n }\r\n\r\n this.selectedEngineer = this.userIsEngineer ? this.currentUser : null;\r\n\r\n if (this.visitFailureRecord.EngineerId) {\r\n this.selectedEngineer = this.engineers.find(eng => eng.Id === this.visitFailureRecord.EngineerId);\r\n }\r\n\r\n this.issueForm = new FormGroup({\r\n Comment: new FormControl(this.visitFailureRecord.EngineerReason, {\r\n validators: [Validators.required, Validators.minLength(25)]\r\n }),\r\n Engineer: new FormControl(this.selectedEngineer, {\r\n validators: [Validators.required]\r\n }),\r\n Contact: new FormControl(this.visitFailureRecord.CustomerAdvisor),\r\n Reason: new FormControl(this.visitFailureRecord.Id ? this.visitFailureRecord.VisitFailureReason : null, {\r\n validators: [Validators.required]\r\n }),\r\n Chargeable: new FormControl(this.visitFailureRecord.Chargeable)\r\n });\r\n\r\n this.issueForm.valueChanges.pipe(\r\n debounceTime(300),\r\n untilDestroyed(this)\r\n ).subscribe(values => {\r\n this.visitFailureRecord = {\r\n ...this.visitFailureRecord,\r\n EngineerReason: values.Comment,\r\n EngineerId: values.Engineer?.Id,\r\n CustomerAdvisor: values.Contact,\r\n VisitFailureReason: values.Reason,\r\n Chargeable: values.Chargeable\r\n }\r\n })\r\n }\r\n}\r\n","export enum VisitFailureReason {\r\n VehicleNotOnSite,\r\n KitNotOnSiteCustomer,\r\n KitNotOnSiteAddsecure,\r\n VehicleNotAvailable,\r\n ThirdParty,\r\n OtherIssue\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { getOptionsQueryParams } from \"@app/class/Utilities\";\r\nimport { Observable } from \"rxjs\";\r\nimport { IVisitFailureRecord } from \"../_models/IVisitFailureRecord\";\r\nimport { IVisitFailureRecordQueryOptions } from \"../_models/IVisitFailureRecordQueryOptions\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class VisitFailureService {\r\n\r\n constructor(\r\n private readonly http: HttpClient\r\n ) { }\r\n\r\n getVisitFailures(options?: IVisitFailureRecordQueryOptions): Observable {\r\n const params = getOptionsQueryParams(options);\r\n return this.http.get(`/api/foundation/visitfailure`, params)\r\n }\r\n\r\n saveVisitFailure(visitFailure: IVisitFailureRecord): Observable {\r\n return this.http.post(`/api/foundation/visitfailure`, visitFailure);\r\n }\r\n}\r\n","import { Component, Injector, OnInit } from '@angular/core';\r\nimport { EngineerJobItemStatus, EngineerJobItemType } from '@app/main/modules/foundation/foundation.enums';\r\nimport { IEngineerJob, IEngineerJobBooking, IEngineerJobItem } from '@app/main/modules/foundation/foundation.interfaces';\r\nimport { EngineerJobItemService } from '@app/main/modules/foundation/_services/engineer-job-item.service';\r\nimport { TranslationService } from '@app/services/translation.service';\r\nimport { combineLatest, from } from 'rxjs';\r\nimport './engineer-job-item-list.component.scss';\r\nimport { NavigationService } from '@app/services/navigation.service';\r\nimport { RawParams } from \"@uirouter/core\";\r\nimport { VehicleService } from '@services/vehicle.service';\r\nimport { AccountService, IAccount } from '@services/account.service';\r\nimport { EngineerJobService } from '@app/main/modules/foundation/_services/engineer-job.service';\r\nimport { EngineerJobBookingService } from '@foundation/_services/engineer-job-booking.service';\r\nimport { IVehicle } from '@app/interfaces/IVehicle';\r\nimport copy from 'fast-copy';\r\nimport { FoundationNavigationModule } from '../../foundation.navigation';\r\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\r\n\r\ninterface IEngineerJobWithJobItemsAndBookings extends IEngineerJob {\r\n jobItems: IEngineerJobItem[];\r\n jobBookings: IEngineerJobBooking[];\r\n\r\n jobAvailability: {startTime: Date, endTime: Date}\r\n}\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'engineer-job-item-list',\r\n template: require('./engineer-job-item-list.component.html'),\r\n})\r\nexport class EngineerJobItemListComponent implements OnInit {\r\n\r\n jobs: IEngineerJobWithJobItemsAndBookings[] = [];\r\n displayJobs: IEngineerJobWithJobItemsAndBookings[] = [];\r\n\r\n loading: boolean;\r\n\r\n engineerJobItemType = EngineerJobItemType;\r\n\r\n foundJobItem: IEngineerJobItem = null;\r\n\r\n showIssueSidebar: boolean;\r\n selectedJobItem: IEngineerJobItem;\r\n selectedJob: IEngineerJob;\r\n \r\n constructor(\r\n private readonly injector: Injector,\r\n private readonly engineerJobService: EngineerJobService,\r\n private readonly engineerJobItemService: EngineerJobItemService,\r\n private readonly engineerJobBookingService: EngineerJobBookingService,\r\n private readonly translationService: TranslationService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly accountService: AccountService\r\n ) { }\r\n\r\n ngOnInit() {\r\n this.loadData(true);\r\n }\r\n \r\n onSearchChanged(text: string) {\r\n this.foundJobItem = null;\r\n this.displayJobs = copy(this.jobs);\r\n\r\n if (!text) {\r\n return;\r\n }\r\n\r\n this.filterJobItemsBySearchText(text);\r\n this.displayJobs = this.displayJobs.filter(job => job.jobItems.length > 0);\r\n\r\n this.setFoundJobItemIfApplicable();\r\n }\r\n\r\n createCommission(jobItemId: number): void {\r\n const rawParams: RawParams = {\r\n jobItemId: jobItemId,\r\n };\r\n\r\n const navigationService: NavigationService = this.injector.get(NavigationService);\r\n navigationService.go(FoundationNavigationModule.JobItemsCommissionNew, rawParams);\r\n }\r\n\r\n openIssueReport(jobItem: IEngineerJobItem): void {\r\n this.selectedJobItem = jobItem;\r\n this.selectedJob = this.jobs.find(job => job.Id === jobItem.JobId);\r\n this.showIssueSidebar = true;\r\n }\r\n\r\n closeIssueReport(): void {\r\n this.selectedJobItem = null;\r\n this.selectedJob = null;\r\n this.showIssueSidebar = false;\r\n }\r\n\r\n //--\r\n\r\n private loadData(loading = false): void {\r\n this.loading = loading;\r\n\r\n combineLatest([\r\n this.engineerJobItemService.getEngineerJobItems(),\r\n this.engineerJobBookingService.getEngineeringJobBookings(),\r\n from(this.vehicleService.getVehicles() as Promise),\r\n from(this.accountService.getAccountListFromDatabase() as Promise),\r\n this.engineerJobService.getEngineerJobs()\r\n ]).pipe(untilDestroyed(this))\r\n .subscribe({\r\n next: ([jobItems, jobBookings, vehicles, accounts, jobs]) => {\r\n jobItems = jobItems.filter(\r\n (item) =>\r\n item.Status !== EngineerJobItemStatus.Cancelled &&\r\n item.Status !== EngineerJobItemStatus.Complete\r\n );\r\n this.jobs = jobs as IEngineerJobWithJobItemsAndBookings[];\r\n\r\n this.mapVehiclesToJobItems(jobItems, vehicles);\r\n this.mapJobs(jobItems, jobBookings, accounts, vehicles);\r\n this.displayJobs = [...this.jobs];\r\n\r\n this.loading = false;\r\n }\r\n });\r\n }\r\n\r\n private filterJobItemsBySearchText(text: string): void {\r\n const searchTextLower = text.toLowerCase(); // Convert the search text to lowercase\r\n\r\n this.displayJobs.forEach((job) => {\r\n job.jobItems = job.jobItems.filter((jobItem) => {\r\n const searchText =\r\n (job.Id + (job.account?.CompanyName || '') + jobItem.Id + (jobItem.vehicle?.Reg || '') + (jobItem.vehicle?.ShortReg || '')).toLowerCase(); // Convert searchText to lowercase\r\n\r\n return searchText.includes(searchTextLower); // Compare in lowercase\r\n });\r\n });\r\n }\r\n\r\n private setFoundJobItemIfApplicable(): void {\r\n if (this.displayJobs.length === 1 && this.displayJobs[0].jobItems.length === 1) {\r\n this.foundJobItem = this.displayJobs[0].jobItems[0];\r\n }\r\n }\r\n\r\n private mapJobs(\r\n jobItems: IEngineerJobItem[],\r\n jobBookings: IEngineerJobBooking[],\r\n accounts: IAccount[],\r\n vehicles: IVehicle[],\r\n ) {\r\n this.jobs.forEach((job) => {\r\n job.jobBookings = jobBookings.filter(booking => booking.JobId === job.Id);\r\n this.assignJobAvailability(job);\r\n\r\n job.jobItems = jobItems.filter(item => item.JobId === job.Id);\r\n\r\n job.jobItems.forEach(item => {\r\n item.vehicle = vehicles.find(vehicle => item.VehicleId == vehicle.Id);\r\n });\r\n\r\n job.account = accounts.find(account => account.Id === job.AccountId);\r\n });\r\n\r\n this.jobs = this.jobs.filter((job) => job.jobItems.length > 0);\r\n }\r\n\r\n private mapVehiclesToJobItems(\r\n jobItems: IEngineerJobItem[],\r\n vehicles: IVehicle[]\r\n ) {\r\n jobItems.forEach((item) => {\r\n item.vehicle = !!item.VehicleId ? this.vehicleService.findVehicle(vehicles, item.VehicleId) : null;\r\n });\r\n }\r\n\r\n private assignJobAvailability(job: IEngineerJobWithJobItemsAndBookings): void {\r\n if (!job.jobBookings?.length) {\r\n return;\r\n }\r\n\r\n const booking = job.jobBookings[0];\r\n\r\n job.jobAvailability = {\r\n startTime: booking.StartUtc,\r\n endTime: booking.EndUtc\r\n };\r\n }\r\n}\r\n","import { Component, OnChanges, OnInit, TemplateRef, ViewChild } from \"@angular/core\";\r\nimport { VDialogRef } from \"@app/directives/_layout/v-dialog/v-dialog-ref\";\r\nimport { DialogService } from \"@app/directives/_layout/v-dialog/v-dialog.service\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { AsyncObservableComponent } from \"@app/directives/_misc/async-observable/async-observable.component\";\r\nimport { IFilterBarTab } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { FilterBarService } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.service\";\r\nimport { UserType } from \"@app/enum/UserType\";\r\nimport { IUser } from \"@app/interfaces/IUser\";\r\nimport { ImportStrategyReference } from \"@app/main/modules/foundation/foundation.enums\";\r\nimport { ICsvImportCompletionResultDTO } from \"@app/main/modules/foundation/foundation.interfaces\";\r\nimport { CurrentUserService } from \"@app/services/currentUser.service\";\r\nimport { LoginService } from \"@app/services/login.service.ajs\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { combineLatest, from } from \"rxjs\";\r\nimport { map } from \"rxjs/operators\";\r\nimport { IReseller } from \"../../_models/IReseller\";\r\nimport { IUserGroup } from \"../../_models/IUserGroup\";\r\nimport { AccountService } from \"../../_services/account.service\";\r\nimport { EngineerService } from \"../../_services/engineer.service\";\r\nimport { UserGroupService } from \"../../_services/user-group.service\";\r\nimport { UserService } from \"../../_services/user.service\";\r\nimport { FoundationUserResellerMappingService } from \"../../_services/userResellerMapping.service\";\r\nimport './engineer-users-list.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'engineer-users-list',\r\n template: require('./engineer-users-list.component.html')\r\n})\r\nexport class EngineerUsersComponent implements OnInit, OnChanges {\r\n engineers: IUser[];\r\n selectedEngineer: IUser;\r\n addNewUserGroup: boolean;\r\n newUserGroup: IUserGroup;\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n filterTabs: IFilterBarTab[] = [];\r\n\r\n hasReseller: boolean;\r\n selectedResellerId: number;\r\n resellers: IReseller[];\r\n\r\n saving: boolean;\r\n\r\n loading: boolean;\r\n savingUserGroup: boolean;\r\n\r\n dialog: VDialogRef;\r\n\r\n showCsvImporter: boolean;\r\n importStrategyRef: ImportStrategyReference = ImportStrategyReference.Engineer;\r\n\r\n currentUser: IUser;\r\n\r\n @ViewChild('resetPasswordTemplate') resetPasswordTemplate: TemplateRef;\r\n constructor(\r\n private readonly dialogService: DialogService,\r\n private readonly filterBarService: FilterBarService,\r\n private readonly loginService: LoginService,\r\n private readonly engineerService: EngineerService,\r\n private readonly translationService: TranslationService,\r\n private readonly accountService: AccountService,\r\n private readonly userService: UserService,\r\n private readonly userGroupService: UserGroupService,\r\n private readonly vTableService: VTableService,\r\n private readonly currentUserService: CurrentUserService,\r\n private readonly userResellerMappingService: FoundationUserResellerMappingService) { }\r\n\r\n ngOnInit(): void {\r\n this.getData();\r\n }\r\n\r\n ngOnChanges(): void {\r\n this.createTable();\r\n }\r\n\r\n onRowClicked(row: IVTableRow): void {\r\n this.selectedEngineer = row.data;\r\n }\r\n\r\n setHasReseller(hasReseller: boolean): void {\r\n this.hasReseller = hasReseller;\r\n\r\n if (!hasReseller) {\r\n this.selectedResellerId = null;\r\n this.newUserGroup.ResellerId = null;\r\n } else {\r\n this.newUserGroup.ResellerId = this.selectedResellerId;\r\n }\r\n }\r\n\r\n onResellerSelectChange(resellerId: number): void {\r\n this.selectedResellerId = resellerId;\r\n this.newUserGroup.ResellerId = resellerId;\r\n }\r\n\r\n resetPassword(): void {\r\n this.dialog = this.dialogService.open(this.resetPasswordTemplate, null);\r\n }\r\n\r\n confirmResetPassword(): void {\r\n this.loginService.sendForgotPasswordEmail(this.selectedEngineer.Email).then(() => {\r\n this.closeDialog();\r\n });\r\n }\r\n\r\n closeDialog(): void {\r\n this.dialog.close();\r\n }\r\n\r\n closeEdit(): void {\r\n this.selectedEngineer = null;\r\n }\r\n\r\n closeUserGroupSidebar(): void {\r\n this.addNewUserGroup = false;\r\n }\r\n\r\n addEngineer(): void {\r\n this.selectedEngineer = {\r\n Id: 0,\r\n Type: UserType.Engineer,\r\n IsActive: true\r\n };\r\n }\r\n\r\n addUserGroup(): void {\r\n this.addNewUserGroup = true;\r\n this.newUserGroup = {\r\n Id: 0,\r\n Description: \"\",\r\n Email: \"\",\r\n Phone: \"\",\r\n }\r\n }\r\n\r\n isUserGroupFormValid(): boolean {\r\n return !!this.newUserGroup?.Description?.length && (!this.hasReseller || (this.hasReseller && !!this.selectedResellerId));\r\n }\r\n\r\n saveUserGroup(): void {\r\n this.savingUserGroup = true;\r\n this.userGroupService.saveUserGroup(this.newUserGroup).pipe(untilDestroyed(this)).subscribe(() => {\r\n this.closeUserGroupSidebar();\r\n this.savingUserGroup = false;\r\n });\r\n }\r\n\r\n deactivateEngineer(deactivate: boolean): void {\r\n if (!deactivate || !this.selectedEngineer.IsActive) {\r\n return;\r\n }\r\n\r\n this.toggleStatus();\r\n }\r\n\r\n activateEngineer(): void {\r\n if (this.selectedEngineer.IsActive) {\r\n return;\r\n }\r\n\r\n this.toggleStatus();\r\n }\r\n\r\n onEngineerSaved(engineer: IUser): void {\r\n this.selectedEngineer = null;\r\n }\r\n \r\n openCsvImporter(): void {\r\n this.showCsvImporter = true;\r\n }\r\n\r\n closeCsvImporter(): void {\r\n this.showCsvImporter = false;\r\n }\r\n\r\n onCsvModelsSaved(event: ICsvImportCompletionResultDTO): void {\r\n const eventEngineers = JSON.parse(event.CreatedModels) as IUser[];\r\n\r\n this.engineerService.addCsvImportedEngineersToCache(eventEngineers);\r\n }\r\n\r\n //--\r\n\r\n private getData(): void {\r\n this.loading = true;\r\n\r\n\t\tcombineLatest([\r\n this.engineerService.getEngineersWithMappings(),\r\n this.accountService.getResellers(),\r\n from(this.currentUserService.getCurrentUser() as Promise)\r\n ]).pipe(\r\n untilDestroyed(this)\r\n ).subscribe(([engineers, resellers, currentUser]) => {\r\n this.resellers = resellers;\r\n this.currentUser = currentUser;\r\n this.hasReseller = currentUser.IsReseller;\r\n this.engineers = engineers;\r\n this.createTableRows()\r\n this.loading = false;\r\n });\r\n }\r\n\r\n private toggleStatus(): void {\r\n this.saving = true;\r\n this.userService.toggleInternalUserStatus(this.selectedEngineer).pipe(untilDestroyed(this)).subscribe(() => {\r\n this.closeEdit();\r\n this.saving = false;\r\n });\r\n }\r\n\r\n private createTableRows(): void {\r\n this.tableRows = this.vTableService.createTableRows(this.engineers, this.tableColumns);\r\n this.createTabs();\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'Common.Name' }),\r\n createCellFunction: (engineer) => this.vTableService.createTableCell(engineer.Description)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'Common.Email' }),\r\n createCellFunction: (engineer) => this.vTableService.createTableCell(engineer.Email)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'Common.Status' }),\r\n createCellFunction: (engineer) => {\r\n const isActiveText = engineer.IsActive ? this.translationService.t(\"UserStatusEnum.Active\") : this.translationService.t(\"UserStatusEnum.Inactive\");\r\n return this.vTableService.createTableCell(isActiveText);\r\n }\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"EngineerUsers.ParentCompany\", minTableWidth: 900 }),\r\n createCellFunction: engineer => {\r\n return this.vTableService.createTableCell(engineer.UserGroupId, {\r\n component: AsyncObservableComponent,\r\n componentInputs: {\r\n useLoading: true,\r\n observable$: this.userGroupService.getUserGroups({ Id: engineer.UserGroupId }).pipe(map(group => {\r\n return group[0].Description;\r\n }))\r\n }\r\n })\r\n }\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: 'users.LastLogin' }),\r\n createCellFunction: (engineer) => this.vTableService.createDateCell(engineer.lastLoggedIn)\r\n\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Reseller\" }),\r\n createCellFunction: (engineer) => this.vTableService.createTableCell(engineer.IsReseller ? engineer.ResellerIds.map(rId => this.accountService.getResellerName(this.resellers, rId)).join(', ') : \"\")\r\n }\r\n\r\n ]\r\n }\r\n\r\n private createTabs(): void {\r\n this.filterTabs = [];\r\n\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"Common.All\", (engineer) => true));\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"UserStatusEnum.Active\", (engineer) => engineer.IsActive));\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"UserStatusEnum.Inactive\", (engineer) => !engineer.IsActive));\r\n }\r\n}\r\n","import { ScrollingModule } from '@angular/cdk/scrolling';\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { HttpClientModule } from \"@angular/common/http\";\r\nimport { NgModule, Type } from \"@angular/core\";\r\nimport { ReactiveFormsModule } from \"@angular/forms\";\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\nimport { CoreDirectivesModule } from '@app/directives/_core/_core.directives.module';\r\nimport { FormsDirectivesModule } from '@app/directives/_forms/_form.directives.module';\r\nimport { VTableModule } from '@app/directives/_layout/v-table/v-table.module';\r\nimport { GroupsModule } from '@app/main/components/resourceManagement/groups/groups.module';\r\nimport { ResourceManagementModule } from '@app/main/components/resourceManagement/resourceManagement.module';\r\nimport { RequestVideoFormComponent } from '@app/main/components/videos/requestVideo/request-video-form/request-video-form.component';\r\nimport { RequestVideoService } from '@app/main/components/videos/requestVideo/requestVideo.service';\r\nimport { RequestVideoActivityChartComponent } from \"@app/main/components/videos/requestVideo/requestVideoActivityChart/request-video-activity-chart.component\";\r\nimport { VideoChannelSelectorComponent } from '@app/main/components/videos/video-channel-selector/video-channel-selector.component';\r\nimport { CameraDisplayService } from \"@components/videos/cameraDisplay.service\";\r\nimport { LayoutDirectivesModule } from \"@directives/_layout/_layout.directives.module\";\r\nimport { MapDirectivesModule } from \"@directives/_map/_map.directives.module\";\r\nimport { MiscDirectivesModule } from \"@directives/_misc/_misc.directives.module\";\r\nimport { ResourceFiltersDirectivesModule } from \"@directives/_resourceFilters/_resourceFilters.directives.module\";\r\nimport { VehicleDirectivesModule } from \"@directives/_vehicle/_vehicle.directives.module\";\r\nimport { VeriDirectivesModule } from \"@directives/_veri/_veri.directives.module\";\r\nimport { ObservationsService } from \"@services/observations.service\";\r\nimport { providerCreator } from \"@services/_services.module\";\r\nimport { PipesModule } from 'src/app/_pipes/_pipes.module';\r\nimport { CameraSignalStrengthComponent } from \"./_components/camera-signal-strength/camera-signal-strength.component\";\r\nimport { DownloadQualitySelector } from './_components/download-quality-selector/download-quality-selector.component';\r\nimport { VideoAddressComponent } from \"./_components/video-address/video-address.component\";\r\nimport { VideoDownloadListComponent } from './_components/video-download-list/video-download-list.component';\r\nimport { VideoDownloadProgressComponent } from './_components/video-download-progress/video-download-progress.component';\r\nimport { VideoDriverAssignmentComponent } from './_components/video-driver-assignment/video-driver-assignment.component';\r\nimport { VideoEntryComponent } from \"./_components/video-entry/video-entry.component\";\r\nimport { VideoEventListComponent } from \"./_components/video-event-list/video-event-list.component\";\r\nimport { VideoListComponent } from \"./_components/video-list/video-list.component\";\r\nimport { VideoRequestStatusComponent } from './_components/video-request-status/video-request-status.component';\r\n\r\nconst privateComponents: Type[] = [\r\n\r\n];\r\n\r\nconst publicComponents: any[] = [\r\n VideoEntryComponent,\r\n VideoAddressComponent,\r\n VideoEventListComponent,\r\n VideoListComponent,\r\n VideoDownloadListComponent,\r\n VideoDownloadProgressComponent,\r\n VideoRequestStatusComponent,\r\n CameraSignalStrengthComponent,\r\n RequestVideoFormComponent,\r\n RequestVideoActivityChartComponent,\r\n VideoChannelSelectorComponent,\r\n DownloadQualitySelector,\r\n VideoDriverAssignmentComponent];\r\n\r\nconst declarations: Type[] = [\r\n];\r\n\r\nconst providers: any[] = [\r\n providerCreator(CameraDisplayService, \"cameraDisplayService\"),\r\n providerCreator(ObservationsService, \"observationsService\"),\r\n providerCreator(RequestVideoService, \"requestVideoService\"),\r\n];\r\n\r\n@NgModule({\r\n imports: [\r\n ReactiveFormsModule,\r\n CommonModule,\r\n ScrollingModule,\r\n CoreDirectivesModule,\r\n HttpClientModule,\r\n BrowserAnimationsModule,\r\n PipesModule,\r\n VeriDirectivesModule,\r\n ResourceFiltersDirectivesModule, // for resource filters\r\n LayoutDirectivesModule, // for empty state\r\n VehicleDirectivesModule, //vehicle-reg\r\n MiscDirectivesModule, // loading indicator\r\n MapDirectivesModule,// for maps\r\n FormsDirectivesModule,\r\n VTableModule,\r\n ResourceManagementModule,\r\n GroupsModule\r\n ],\r\n providers: providers,\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents, ...declarations],\r\n exports: [...publicComponents, ...declarations]\r\n})\r\nexport class CameraModule {\r\n constructor() {\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, Output, SimpleChange, SimpleChanges } from \"@angular/core\";\r\nimport { IJourney } from \"@app/interfaces/IJourney\";\r\nimport { IPeripheral } from \"@app/interfaces/IPeripheral\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { IVehiclePeripheralMapping } from \"@app/interfaces/IVehiclePeripheralMapping\";\r\nimport { IVehicleWithCameraMappings } from \"@app/main/components/resourceManagement/cameras/camera-vehicles-manager/camera-vehicles-manager.component\";\r\nimport { AccountFeatureService, UserRole } from \"@app/services/accountFeature.service\";\r\nimport { DateService, DateUnit } from \"@app/services/date.service\";\r\nimport { JourneyService } from \"@app/services/journey.service\";\r\nimport { NavigationService } from \"@app/services/navigation.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { from, of } from \"rxjs\";\r\nimport { finalize, switchMap, tap } from \"rxjs/operators\";\r\nimport { VideoStreamType } from \"../../enums/VideoStreamType\";\r\nimport { IAvailableFootageCalendar } from \"../../models/IAvailableFootageCalendar\";\r\nimport { IVideoStream } from \"../../models/ICameraChannel\";\r\nimport { CameraFootageService } from \"../../services/camera-footage.service\";\r\nimport { CameraService } from \"../../services/camera.service\";\r\nimport './request-video-form.component.scss';\r\n\r\ninterface IRequestableVideoLength {\r\n lengthInSeconds: number;\r\n label: string;\r\n}\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'request-video-form',\r\n template: require('./request-video-form.component.html')\r\n})\r\nexport class RequestVideoFormComponent {\r\n @Input() requestDate: Date;\r\n @Input() cameraDevice: IPeripheral;\r\n @Input() vehicle: IVehicle;\r\n @Input() footageLoading: boolean;\r\n @Input() qualitiesAvailable: VideoStreamType[];\r\n\r\n @Output() requestDateChange: EventEmitter = new EventEmitter();\r\n @Output() videoLengthChange: EventEmitter = new EventEmitter();\r\n @Output() selectedChannelsChange: EventEmitter = new EventEmitter();\r\n @Output() downloadQualityChange: EventEmitter = new EventEmitter();\r\n @Output() noAvailableDates: EventEmitter = new EventEmitter();\r\n\r\n selectableDates: Date[] = [];\r\n requestHour: number;\r\n requestMinute: number;\r\n requestSecond: number;\r\n\r\n requestableVideoLengths: IRequestableVideoLength[];\r\n customVideoLengthEnabled: boolean;\r\n videoLength: number;\r\n\r\n selectedChannels: IVideoStream[];\r\n streamingChannels: IVideoStream[];\r\n canEditChannels: boolean;\r\n showChannelsEditor: boolean;\r\n loadingChannels: boolean;\r\n\r\n isLiveStreamCamera: boolean;\r\n latestCalendarFromFtCloud: IAvailableFootageCalendar;\r\n latestFootageHistoryDateQueried: Date;\r\n requestDateSameAsLatestQuery: boolean;\r\n\r\n journeys: IJourney[];\r\n\r\n calendarLoading: boolean;\r\n noFootageAvailable: boolean;\r\n calendarUnavailable: boolean;\r\n\r\n mainstreamSelected: boolean;\r\n selectedStreamType: VideoStreamType;\r\n\r\n timeChangeDebounce: ReturnType;\r\n\r\n endTime: Date;\r\n\r\n constructor(\r\n private readonly accountFeatureService: AccountFeatureService,\r\n private readonly cameraFootageService: CameraFootageService,\r\n private readonly cameraService: CameraService,\r\n private readonly dateService: DateService,\r\n private readonly journeyService: JourneyService,\r\n private readonly navigationService: NavigationService,\r\n private readonly translationService: TranslationService) { }\r\n\r\n ngOnInit(): void {\r\n this.initialise();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['requestDate'] && this.requestTimeHasChanged(changes['requestDate'])) {\r\n\r\n this.setTime();\r\n }\r\n\r\n if (changes['qualitiesAvailable']) {\r\n this.setQuality();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.timeChangeDebounce) {\r\n clearTimeout(this.timeChangeDebounce);\r\n }\r\n }\r\n\r\n get onlineStatusAllowsRequesting(): boolean {\r\n if (!this.vehicle) {\r\n return false;\r\n }\r\n\r\n return !!this.vehicle.onlineStatus\r\n && ((this.vehicle.onlineStatus.online && this.vehicle.onlineStatus.hasStreaming) || (!this.vehicle.onlineStatus.hasStreaming));\r\n }\r\n\r\n get showCalendar(): boolean {\r\n return !this.calendarUnavailable && !this.noFootageAvailable;\r\n }\r\n\r\n onDateChanged(newDate: Date): void {\r\n this.navigationService.setRouteParam(\"requestVideoTime\", null, false);\r\n this.requestDate = newDate;\r\n this.emitDateChange();\r\n }\r\n\r\n onSelectedTimeChanged(): void {\r\n if (this.timeIsNullOrNaN()) {\r\n return;\r\n }\r\n\r\n clearTimeout(this.timeChangeDebounce);\r\n\r\n this.timeChangeDebounce = setTimeout(() => {\r\n // Debounce to allow for scrolling through units quickly\r\n const timeString = this.convertTimeToString();\r\n const updatedDate = this.dateService.updateTime(this.requestDate, timeString);\r\n this.requestDate = updatedDate;\r\n\r\n this.emitDateChange();\r\n }, 500)\r\n }\r\n\r\n onVideoLengthSelected(length: number): void {\r\n this.videoLength = length;\r\n this.endTime = this.dateService.addOrSubtractTime(this.requestDate, this.videoLength, DateUnit.Sec);\r\n this.emitVideoLengthChange();\r\n }\r\n\r\n onSelectedChannelsChanged(channels: IVideoStream[]): void {\r\n this.selectedChannels = channels;\r\n this.emitChannelsChange(channels);\r\n }\r\n\r\n onDownloadQualityChanged(quality: VideoStreamType): void {\r\n this.selectedStreamType = quality;\r\n this.mainstreamSelected = quality == VideoStreamType.Main;\r\n this.downloadQualityChange.emit(this.mainstreamSelected);\r\n }\r\n\r\n openChannelsEditor(): void {\r\n this.showChannelsEditor = true;\r\n }\r\n\r\n closeChannelsEditor(): void {\r\n this.showChannelsEditor = false;\r\n }\r\n\r\n onVehicleSaved(vehicle: IVehicleWithCameraMappings): void {\r\n this.loadingChannels = true;\r\n this.closeChannelsEditor();\r\n\r\n setTimeout(() => {\r\n this.getPeripheralChannels();\r\n this.loadingChannels = false;\r\n }, 800)\r\n }\r\n\r\n //--\r\n\r\n private initialise(): void {\r\n\r\n this.customVideoLengthEnabled = this.cameraFootageService.isFootageLengthFunctionalityAvailable([this.cameraDevice]);\r\n this.isLiveStreamCamera = this.cameraDevice.Product.ProductMetadata?.CameraFeatures?.VideoRequest?.OnlineOnly;\r\n\r\n this.getAvailableDates();\r\n\r\n this.setupRequestableVideoLengths();\r\n this.getPeripheralChannels();\r\n\r\n this.canEditChannels = this.accountFeatureService.currentUserHasRole([UserRole.Administrator]);\r\n }\r\n\r\n private timeIsNullOrNaN(): boolean {\r\n if (this.requestHour == null || this.requestMinute == null || this.requestSecond == null) {\r\n return true;\r\n }\r\n\r\n if (isNaN(this.requestHour) || isNaN(this.requestMinute) || isNaN(this.requestSecond)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private convertTimeToString(): string {\r\n if (this.timeIsNullOrNaN()) {\r\n return '00:00:00';\r\n }\r\n\r\n const hourString = this.requestHour < 10 ? `0${this.requestHour}` : String(this.requestHour);\r\n const minuteString = this.requestMinute < 10 ? `0${this.requestMinute}` : String(this.requestMinute);\r\n const secondString = this.requestSecond < 10 ? `0${this.requestSecond}` : String(this.requestSecond);\r\n\r\n return `${hourString}:${minuteString}:${secondString}`;\r\n }\r\n\r\n private setTime(): void {\r\n if (!this.requestDate) {\r\n return;\r\n }\r\n\r\n const timeString = this.dateService.getTimeAsString(this.requestDate, true);\r\n const hoursMinutesSeconds: string[] = timeString.split(':');\r\n\r\n this.requestHour = Number(hoursMinutesSeconds[0]);\r\n this.requestMinute = Number(hoursMinutesSeconds[1]);\r\n this.requestSecond = Number(hoursMinutesSeconds[2]);\r\n\r\n this.endTime = this.dateService.addOrSubtractTime(this.requestDate, this.videoLength, DateUnit.Sec);\r\n }\r\n\r\n private setQuality(): void {\r\n if (!this.qualitiesAvailable?.length || (this.selectedStreamType && this.qualitiesAvailable.includes(this.selectedStreamType))) {\r\n return;\r\n }\r\n\r\n this.mainstreamSelected = !this.qualitiesAvailable.includes(VideoStreamType.Sub) || this.qualitiesAvailable.length > 1;\r\n }\r\n\r\n private setupRequestableVideoLengths(): void {\r\n if (!this.cameraDevice) {\r\n return;\r\n }\r\n\r\n this.addRequestableVideoLengths(this.cameraFootageService.getMaxRequestFootageLength(this.cameraDevice));\r\n\r\n if (!this.customVideoLengthEnabled) {\r\n return;\r\n }\r\n\r\n this.requestableVideoLengths.sort((videoLength1, videoLength2) => videoLength2.lengthInSeconds - videoLength1.lengthInSeconds);\r\n\r\n this.videoLength = this.requestableVideoLengths[this.requestableVideoLengths.length - 1].lengthInSeconds;\r\n this.emitVideoLengthChange();\r\n }\r\n\r\n private getAvailableDates(): void {\r\n if (this.isLiveStreamCamera) {\r\n this.setRequestableDatesFromFtCloudFootage();\r\n return;\r\n }\r\n\r\n const startDate = this.dateService.addOrSubtractTime(new Date(), -1, DateUnit.Week);\r\n const endDate = new Date();\r\n\r\n from(this.journeyService.getJourneysForVehicle(this.vehicle.Id, startDate, endDate) as Promise).pipe(\r\n untilDestroyed(this),\r\n switchMap((journeys: IJourney[]) => {\r\n this.journeys = journeys;\r\n return from(this.journeyService.getCurrentJourney(this.vehicle.Id, true) as Promise)\r\n }),\r\n switchMap((journey: IJourney) => {\r\n if (journey) {\r\n this.journeys.push(journey);\r\n }\r\n\r\n this.updateSelectableDatesFromJourneys();\r\n\r\n return from(this.cameraService.getPeripheralMappings(this.cameraDevice.Serial));\r\n }),\r\n tap((mapping: IVehiclePeripheralMapping) => {\r\n this.selectableDates = this.selectableDates.filter(date => this.dateService.date1IsAfterDate2(date, mapping.StartUtc));\r\n \r\n this.setRequestDate();\r\n\r\n this.handleNoAvailableDates();\r\n })\r\n ).subscribe(() => {\r\n this.emitDateChange();\r\n })\r\n\r\n }\r\n\r\n private updateSelectableDatesFromJourneys(): void {\r\n if (!this.journeys?.length) {\r\n return;\r\n }\r\n\r\n this.journeys.sort((journey1, journey2) => {\r\n return new Date(journey2.StartUtc).getTime() - new Date(journey1.StartUtc).getTime();\r\n });\r\n\r\n for (const journey of this.journeys) {\r\n const journeyStartTime: Date = new Date(journey.StartUtc);\r\n const journeyEndTime: Date = new Date(journey.EndUtc);\r\n\r\n this.selectableDates.push(journeyStartTime);\r\n\r\n if (this.dateService.isSameDate(journeyStartTime, journeyEndTime)) {\r\n continue;\r\n }\r\n\r\n this.selectableDates.push(journeyEndTime);\r\n }\r\n }\r\n\r\n private setRequestableDatesFromFtCloudFootage(): void {\r\n let dailyFootageDate: Date;\r\n this.calendarLoading = true;\r\n\r\n from(this.cameraFootageService.getLatestCalendarFootageHistory(this.cameraDevice.Serial, true, null, true)).pipe(\r\n untilDestroyed(this),\r\n finalize(() => this.calendarLoading = false),\r\n switchMap((latestFootageCalendar: IAvailableFootageCalendar) => {\r\n this.latestCalendarFromFtCloud = latestFootageCalendar;\r\n dailyFootageDate = this.getDailyFootageDate();\r\n\r\n this.clearLatestFootageHistoryDateQueried();\r\n\r\n if (!dailyFootageDate) {\r\n return of(null);\r\n }\r\n\r\n this.updateLatestQueriedDate(dailyFootageDate);\r\n this.updateSelectableDatesFromFtCloudCalendar(this.latestCalendarFromFtCloud);\r\n\r\n return from(this.cameraService.getPeripheralMappings(this.cameraDevice.Serial));\r\n }),\r\n tap((mapping: IVehiclePeripheralMapping) => {\r\n this.selectableDates = this.selectableDates.filter(date => this.dateService.date1IsAfterDate2(date, mapping.StartUtc));\r\n\r\n this.setRequestDate();\r\n\r\n this.handleNoAvailableDates();\r\n })\r\n ).subscribe(\r\n () => {\r\n this.emitDateChange();\r\n },\r\n error => {\r\n this.calendarUnavailable = true;\r\n });\r\n }\r\n\r\n private setRequestDate(): void {\r\n const presetTime = this.navigationService.getRouteParam(\"requestVideoTime\");\r\n this.requestDate = new Date(presetTime ? presetTime : this.selectableDates[0]);\r\n }\r\n\r\n private handleNoAvailableDates(): void {\r\n const today = new Date();\r\n const todayExists: boolean = !!this.selectableDates.find(date => this.dateService.isSameDate(date, today));\r\n\r\n if (todayExists || this.selectableDates?.length) {\r\n return;\r\n }\r\n\r\n this.noFootageAvailable = true;\r\n this.noAvailableDates.emit();\r\n }\r\n\r\n private updateSelectableDatesFromFtCloudCalendar(latestCalendarFromFtCloud: IAvailableFootageCalendar): void {\r\n this.selectableDates = [];\r\n if (!latestCalendarFromFtCloud?.AvailableDates?.length) {\r\n return;\r\n }\r\n\r\n for (const calendarDay of latestCalendarFromFtCloud.AvailableDates) {\r\n this.selectableDates.push(calendarDay);\r\n }\r\n }\r\n\r\n private getDailyFootageDate(): Date {\r\n if (!this.latestCalendarFromFtCloud?.AvailableDates?.length) {\r\n return;\r\n }\r\n\r\n this.latestCalendarFromFtCloud.AvailableDates.sort((date1, date2) => {\r\n return new Date(date2).getTime() - new Date(date1).getTime();\r\n });\r\n\r\n let dailyFootageDate = new Date(this.latestCalendarFromFtCloud.AvailableDates[0]);\r\n const matchingAvailableRequestDate = this.latestCalendarFromFtCloud.AvailableDates.find(date => this.dateService.isSameDate(new Date(date), this.requestDate));\r\n\r\n if (!!matchingAvailableRequestDate) {\r\n dailyFootageDate = this.requestDate;\r\n }\r\n\r\n return dailyFootageDate;\r\n }\r\n\r\n private clearLatestFootageHistoryDateQueried(): void {\r\n this.latestFootageHistoryDateQueried = null;\r\n }\r\n\r\n private updateLatestQueriedDate(newDate: Date): void {\r\n this.latestFootageHistoryDateQueried = newDate;\r\n\r\n this.updateLatestQueryDateCheck();\r\n }\r\n\r\n private updateLatestQueryDateCheck(): void {\r\n this.requestDateSameAsLatestQuery = (this.requestDate && this.latestFootageHistoryDateQueried)\r\n ? this.dateService.isSameDate(this.requestDate, this.latestFootageHistoryDateQueried)\r\n : false;\r\n }\r\n\r\n private addRequestableVideoLengths(maxLength: number): void {\r\n this.requestableVideoLengths = [];\r\n\r\n const secondsLabel = this.translationService.t(\"Common.Seconds\");\r\n const secondsInitial = secondsLabel.slice(0, 1).toLowerCase();\r\n\r\n const minutesLabel = this.translationService.t(\"Common.Minutes\");\r\n const minutesAbbr = minutesLabel.slice(0, 3);\r\n\r\n this.requestableVideoLengths.push({ lengthInSeconds: 20, label: \"20\" + secondsInitial });\r\n this.requestableVideoLengths.push({ lengthInSeconds: 30, label: \"30\" + secondsInitial });\r\n this.requestableVideoLengths.push({ lengthInSeconds: 60, label: \"1 \" + minutesAbbr });\r\n\r\n if (maxLength <= 60) {\r\n return;\r\n }\r\n\r\n this.requestableVideoLengths.push({ lengthInSeconds: 120, label: \"2 \" + minutesAbbr });\r\n this.requestableVideoLengths.push({ lengthInSeconds: 300, label: \"5 \" + minutesAbbr });\r\n }\r\n\r\n private getPeripheralChannels(): void {\r\n\r\n this.cameraService.getCameraChannels({ VehicleId: this.vehicle.Id }).then(channels => {\r\n\r\n const activeChannels = this.cameraService.filterDuplicateVideoStreams(channels).filter(c => c.IsActive);\r\n\r\n this.streamingChannels = activeChannels;\r\n this.selectedChannels = activeChannels;\r\n this.emitChannelsChange(this.selectedChannels);\r\n });\r\n }\r\n\r\n private requestTimeHasChanged(change: SimpleChange): boolean {\r\n if (!change.previousValue) {\r\n return true;\r\n }\r\n\r\n const currentTime = new Date(change.previousValue);\r\n const newTime = new Date(change.currentValue);\r\n\r\n return currentTime.getTime() !== newTime.getTime();\r\n\r\n }\r\n\r\n private emitDateChange(): void {\r\n this.requestDateChange.emit(this.requestDate);\r\n }\r\n\r\n private emitVideoLengthChange(): void {\r\n this.videoLengthChange.emit(this.videoLength);\r\n }\r\n\r\n private emitChannelsChange(channels: IVideoStream[]): void {\r\n this.selectedChannelsChange.emit(channels)\r\n }\r\n\r\n}\r\n","import { DateService } from \"@app/services/date.service\";\r\nimport { IJourney } from \"@interfaces/IJourney\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport { VideoStreamType } from \"../enums/VideoStreamType\";\r\nimport { ICameraFootageTimelineDisplaySection, ITimelineSummary } from \"../models/CameraFootageTimeline.interfaces\";\r\nimport { IAvailableDailyFootage } from \"../models/IAvailableDailyFootage\";\r\nimport { IVideoEntry } from \"../models/IVideoEntry\";\r\n\r\nexport interface IAvailableVideoFootageSection {\r\n startTime: moment.Moment;\r\n endTime: moment.Moment;\r\n\r\n startPercentage: number;\r\n widthPercentage: number;\r\n\r\n label?: string;\r\n requested?: boolean;\r\n videoStreamTypes?: VideoStreamType[];\r\n historicalFootage?: IAvailableDailyFootage[] | IJourney[];\r\n\r\n hasMainStream?: boolean;\r\n hasSubStream?: boolean;\r\n}\r\n\r\nexport class RequestVideoService {\r\n\r\n static $inject = [\"veriDate\", \"dateService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly veriDate: VeriDate,\r\n private readonly dateService: DateService,\r\n private readonly translationService: TranslationService\r\n ) {\r\n }\r\n\r\n createTimelineUsingAAMP(requestDate: Date, footageHistory: IAvailableDailyFootage[]): IAvailableVideoFootageSection[] {\r\n if (!footageHistory?.length) {\r\n return;\r\n }\r\n\r\n const label: string = this.translationService.t(\"cameraService.Online\");\r\n\r\n return this.createTimelineFootage(requestDate, footageHistory, \"Start\", \"End\", label);\r\n }\r\n\r\n createTimelineUsingJourneys(requestDate: Date, journeys: IJourney[]): IAvailableVideoFootageSection[] {\r\n if (!journeys?.length) {\r\n return;\r\n }\r\n\r\n const label: string = this.translationService.t(\"requestVideo.ignitionOn\");\r\n\r\n return this.createTimelineFootage(requestDate, journeys, \"StartUtc\", \"EndUtc\", label);\r\n }\r\n\r\n hasRequestedVideoAtMoment(moment: moment.Moment, videoEntries: IVideoEntry[]): boolean {\r\n const hoveredExistingRequestedVideo: IVideoEntry = videoEntries?.find(videoEntry => {\r\n const requestedVideoStartDate = this.veriDate.createMoment(videoEntry.VideoStartTime);\r\n const requestedVideoEndDate = this.veriDate.createMoment(videoEntry.VideoEndTime);\r\n\r\n if (!moment.isSame(requestedVideoStartDate, \"day\")) {\r\n return false;\r\n }\r\n\r\n return requestedVideoStartDate.isSameOrBefore(moment, \"second\") && requestedVideoEndDate.isSameOrAfter(moment, \"second\");\r\n });\r\n\r\n return !!hoveredExistingRequestedVideo;\r\n }\r\n\r\n hasFootageAvailableAtTime(time: Date, selectedStreamType: VideoStreamType, timeline: ITimelineSummary): boolean {\r\n const availableFootage: ICameraFootageTimelineDisplaySection[] = this.getFootageAvailableAtTime(time, timeline)?.filter(section => section.availableVideoStreamTypes.includes(selectedStreamType));\r\n\r\n return !!availableFootage?.length;\r\n }\r\n\r\n\r\n getFootageAvailableAtTime(time: Date, timeline: ITimelineSummary): ICameraFootageTimelineDisplaySection[] {\r\n let availableFootage: ICameraFootageTimelineDisplaySection[] = [];\r\n\r\n if (!timeline?.displaySections?.length) {\r\n return;\r\n }\r\n\r\n availableFootage = timeline.displaySections.filter(footage => {\r\n const endOfToday = this.dateService.getEndOfDay(new Date());\r\n return (!!footage.dateEnd)\r\n ? this.dateService.dateIsBetweenDates(time, footage.dateStart, footage.dateEnd, true)\r\n : this.dateService.dateIsBetweenDates(time, footage.dateStart, endOfToday, true)\r\n });\r\n\r\n return availableFootage;\r\n }\r\n\r\n // ---\r\n\r\n private createTimelineFootage(requestDate: Date, historicalFootage: IAvailableDailyFootage[] | IJourney[], startKey: string, endKey: string, label: string = \"\"): IAvailableVideoFootageSection[] {\r\n const newTimelineFootage: IAvailableVideoFootageSection[] = [];\r\n const requestDateMoment = this.veriDate.createMoment(requestDate);\r\n\r\n historicalFootage.forEach((footageHistory, index) => {\r\n\r\n let footageStartTime = (footageHistory[startKey]) ? this.veriDate.createMoment(footageHistory[startKey]) : null;\r\n let footageEndTime = (footageHistory[endKey]) ? this.veriDate.createMoment(footageHistory[endKey]) : null;\r\n\r\n if (!footageHistory[endKey]) {\r\n footageEndTime = this.veriDate.createMoment(new Date());\r\n }\r\n\r\n if (!footageStartTime.isSame(requestDateMoment, \"day\") && footageEndTime.isSame(requestDateMoment, \"day\")) {\r\n footageStartTime = footageEndTime.clone().startOf(\"day\");\r\n\r\n } else if (!footageEndTime.isSame(requestDateMoment, \"day\") && footageStartTime.isSame(requestDateMoment, \"day\")) {\r\n footageEndTime = footageStartTime.clone().endOf(\"day\");\r\n }\r\n\r\n const existingMatchingStartSection = newTimelineFootage.find(section => {\r\n return Math.abs(section.startTime.diff(footageStartTime) / 1000) <= 10;\r\n });\r\n\r\n if (existingMatchingStartSection) {\r\n\r\n if (footageStartTime.isAfter(existingMatchingStartSection.startTime)) {\r\n existingMatchingStartSection.startTime = footageStartTime;\r\n }\r\n\r\n if (footageEndTime.isBefore(existingMatchingStartSection.endTime)) {\r\n existingMatchingStartSection.endTime = footageEndTime;\r\n }\r\n\r\n existingMatchingStartSection.historicalFootage.push(footageHistory);\r\n\r\n if (VideoStreamType[footageHistory.StreamType] && !existingMatchingStartSection.videoStreamTypes.includes(footageHistory.StreamType)) {\r\n existingMatchingStartSection.videoStreamTypes.push(footageHistory.StreamType);\r\n }\r\n\r\n existingMatchingStartSection.hasMainStream = (existingMatchingStartSection.hasMainStream) ? true : footageHistory.StreamType === VideoStreamType.Main;\r\n existingMatchingStartSection.hasSubStream = (existingMatchingStartSection.hasSubStream) ? true : footageHistory.StreamType === VideoStreamType.Sub\r\n\r\n return;\r\n }\r\n\r\n const footageSection: IAvailableVideoFootageSection = {\r\n startTime: footageStartTime,\r\n endTime: footageEndTime,\r\n startPercentage: 0,\r\n widthPercentage: 0,\r\n label: label,\r\n historicalFootage: [footageHistory],\r\n videoStreamTypes: [],\r\n hasMainStream: footageHistory.StreamType === VideoStreamType.Main,\r\n hasSubStream: footageHistory.StreamType === VideoStreamType.Sub\r\n };\r\n\r\n if (VideoStreamType[footageHistory.StreamType]) {\r\n footageSection.videoStreamTypes.push(footageHistory.StreamType);\r\n }\r\n\r\n newTimelineFootage.push(footageSection);\r\n });\r\n\r\n return newTimelineFootage;\r\n }\r\n}\r\n","import { Component, ElementRef, EventEmitter, HostBinding, Input, OnChanges, OnInit, Output, Renderer2, SimpleChanges } from \"@angular/core\";\r\nimport { DateService } from \"@app/services/date.service\";\r\nimport { VideoStreamType } from \"../../enums/VideoStreamType\";\r\nimport { ICameraFootageTimelineDisplaySection } from \"../../models/CameraFootageTimeline.interfaces\";\r\nimport { CameraFootageTimelineService } from \"../../services/camera-footage-timeline.service\";\r\nimport \"./request-video-activity-chart.component.scss\";\r\n\r\n@Component({\r\n selector: 'request-video-activity-chart',\r\n template: require('./request-video-activity-chart.component.html')\r\n})\r\nexport class RequestVideoActivityChartComponent implements OnInit, OnChanges {\r\n\r\n // bindings\r\n\r\n @Input() footageSections: ICameraFootageTimelineDisplaySection[];\r\n @Input() selectedSecondOfDay: number;\r\n @Input() loading: boolean;\r\n @Input() @HostBinding(\"class.disabled\") disabled: boolean;\r\n @Output() selectedSecondChange = new EventEmitter();\r\n\r\n // ---\r\n\r\n selected: boolean;\r\n\r\n selectedSection: ICameraFootageTimelineDisplaySection;\r\n selectedPercentage: number;\r\n selectedTime: Date;\r\n\r\n hoveredSecondOfDay: number;\r\n hoveredSection: ICameraFootageTimelineDisplaySection;\r\n hoveredPercentage: number;\r\n hoveredTime: Date;\r\n\r\n futureMask: ICameraFootageTimelineDisplaySection;\r\n totalSecondsInRange: number = 86400;\r\n\r\n selectedLabelFlipped: boolean;\r\n hoveredLabelFlipped: boolean;\r\n\r\n VideoStreamType = VideoStreamType;\r\n\r\n constructor(\r\n private readonly renderer: Renderer2,\r\n private readonly elementRef: ElementRef,\r\n private readonly dateService: DateService,\r\n private readonly cameraFootageTimelineService: CameraFootageTimelineService\r\n ) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.subscribeToEvents();\r\n this.render();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[\"selectedSecondOfDay\"] || changes[\"footageSections\"] || changes[\"videoLength\"]) {\r\n\r\n this.render();\r\n }\r\n }\r\n\r\n onMouseMove(event: MouseEvent): void {\r\n if (this.disabled) {\r\n return;\r\n }\r\n\r\n this.setHoveredTimeUsingMouseEvent(event);\r\n }\r\n\r\n onMouseEnter(event: MouseEvent): void {\r\n this.clearHover();\r\n }\r\n\r\n onMouseLeave(event: MouseEvent): void {\r\n this.clearHover();\r\n }\r\n\r\n onMouseClickChart(event: MouseEvent): void {\r\n if (this.disabled) {\r\n return;\r\n }\r\n\r\n const offset: number = event.offsetX;\r\n const maxOffset: number = event[\"target\"][\"offsetWidth\"];\r\n\r\n const percentageClicked: number = (offset / maxOffset) * 100;\r\n const newSecondOfDayClicked: number = +((percentageClicked * 86400) / 100).toFixed(0);\r\n\r\n this.selectSecondOfDay(newSecondOfDayClicked);\r\n }\r\n\r\n // ---\r\n\r\n private selectChart(): void {\r\n this.selected = true;\r\n }\r\n\r\n private deselectChart(): void {\r\n this.selected = false;\r\n }\r\n\r\n private selectSecondOfDay(newSecond: number): void {\r\n this.selectedSecondOfDay = newSecond;\r\n this.selectedSecondChange?.emit(newSecond);\r\n\r\n this.render();\r\n }\r\n\r\n private render(): void {\r\n\r\n this.selectedSection = null;\r\n\r\n this.selectedPercentage = parseFloat(((this.selectedSecondOfDay / this.totalSecondsInRange) * 100).toFixed(2));\r\n\r\n this.calculateSelectedLabelOffset();\r\n\r\n if (!this.footageSections?.[0]) {\r\n return;\r\n }\r\n\r\n this.selectedTime = this.dateService.getStartOfDay(new Date(this.footageSections[0].dateStart));\r\n this.selectedTime.setSeconds(this.selectedSecondOfDay);\r\n this.selectedSection = this.getFootageSectionForDateTime(this.selectedTime);\r\n\r\n this.setupFutureMask();\r\n }\r\n\r\n private setupFutureMask(): void {\r\n this.futureMask = null;\r\n\r\n if (!this.dateService.isSameDate(this.selectedTime, new Date())) {\r\n return;\r\n }\r\n\r\n const endOfToday: Date = this.dateService.getEndOfDay(new Date());\r\n\r\n this.futureMask = {\r\n footage: [],\r\n availableChannelIds: [],\r\n availableVideoStreamTypes: [],\r\n dateStart: new Date(),\r\n dateEnd: endOfToday,\r\n startPercentage: 0,\r\n widthPercentage: 0,\r\n label: null,\r\n hasMainStream: false,\r\n hasSubStream: false\r\n }\r\n\r\n this.cameraFootageTimelineService.setFootageSectionPercentages([this.futureMask]);\r\n }\r\n\r\n private setHoveredTimeUsingMouseEvent(event: MouseEvent): void {\r\n\r\n if (!this.footageSections?.length) {\r\n return;\r\n }\r\n\r\n const offset: number = event.offsetX;\r\n const maxOffset: number = event[\"target\"][\"offsetWidth\"];\r\n\r\n this.hoveredPercentage = (offset / maxOffset) * 100;\r\n this.hoveredSecondOfDay = +((this.hoveredPercentage * 86400) / 100).toFixed(0);\r\n\r\n this.hoveredTime = this.dateService.getStartOfDay(new Date(this.footageSections[0].dateStart));\r\n this.hoveredTime.setSeconds(this.hoveredSecondOfDay);\r\n this.hoveredSection = this.getFootageSectionForDateTime(this.hoveredTime);\r\n\r\n this.calculateHoveredLabelOffset();\r\n }\r\n\r\n private clearHover(): void {\r\n this.hoveredSecondOfDay = null;\r\n this.hoveredSection = null;\r\n this.hoveredPercentage = null;\r\n this.hoveredTime = null;\r\n }\r\n\r\n private getFootageSectionForDateTime(date: Date): ICameraFootageTimelineDisplaySection {\r\n const sections: ICameraFootageTimelineDisplaySection[] = [];\r\n\r\n for (const footageSection of this.footageSections) {\r\n\r\n const matched = this.dateService.dateIsBetweenDates(date, footageSection.dateStart, footageSection.dateEnd, true, true);\r\n\r\n if (matched) {\r\n sections.push(footageSection);\r\n }\r\n }\r\n\r\n if (!sections?.length) {\r\n return null;\r\n }\r\n\r\n return sections.find(section => section.requested) || sections[0];\r\n }\r\n\r\n private subscribeToEvents(): void {\r\n this.renderer.listen(this.elementRef.nativeElement, 'mouseup', this.handleMouseUp.bind(this));\r\n this.renderer.listen(this.elementRef.nativeElement, 'keydown', this.handleKeyDown.bind(this));\r\n }\r\n\r\n private handleMouseUp(event: any): void {\r\n\r\n if (event.target?.offsetParent?.className?.indexOf(\"chart-container\") > -1) {\r\n this.selectChart();\r\n return;\r\n }\r\n\r\n this.deselectChart();\r\n }\r\n\r\n private handleKeyDown(event: any): void {\r\n this.handleArrowsKeys(event);\r\n }\r\n\r\n private handleArrowsKeys(event: any): void {\r\n\r\n if (!this.selected) {\r\n return;\r\n }\r\n\r\n if (!event?.originalEvent?.code) {\r\n return;\r\n }\r\n\r\n if (event.originalEvent.code === \"ArrowLeft\") {\r\n this.selectSecondOfDay(this.selectedSecondOfDay - 60);\r\n }\r\n\r\n if (event.originalEvent.code === \"ArrowRight\") {\r\n this.selectSecondOfDay(this.selectedSecondOfDay + 60);\r\n }\r\n }\r\n\r\n private calculateSelectedLabelOffset(): void {\r\n this.selectedLabelFlipped = this.selectedSecondOfDay > (this.totalSecondsInRange - 60 * 60 * 2);\r\n }\r\n\r\n private calculateHoveredLabelOffset(): void {\r\n this.hoveredLabelFlipped = this.hoveredSecondOfDay > this.totalSecondsInRange - 60 * 60 * 2;\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { IJourney } from \"@app/interfaces/IJourney\";\r\nimport { DateService } from \"@app/services/date.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { VideoStreamType } from \"../enums/VideoStreamType\";\r\nimport { ICameraFootageChannelTimeline, ICameraFootageTimelineDisplaySection, IFootageSectionGap, ITimelineBase, ITimelineChannelSummary, ITimelineSummary } from \"../models/CameraFootageTimeline.interfaces\";\r\nimport { IAvailableDailyFootage } from \"../models/IAvailableDailyFootage\";\r\n\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CameraFootageTimelineService {\r\n\r\n constructor(\r\n private readonly dateService: DateService,\r\n private readonly translationService: TranslationService\r\n ) { }\r\n\r\n trimEndDateForRequestUsingSummary(summary: ITimelineSummary, startDate: Date, endDate: Date, requiredQuality: VideoStreamType): Date {\r\n\r\n if (!summary?.displaySections?.length) {\r\n console.warn(\"No summary sections to search, returning existing end date\");\r\n return endDate;\r\n }\r\n\r\n const startSection = this.getTimelineDisplaySectionAtDate(summary.displaySections, startDate);\r\n\r\n if (!startSection) {\r\n console.warn(\"Couldn't find necessary section to trim date, returning existing end date\");\r\n return endDate;\r\n }\r\n\r\n if (!startSection.availableVideoStreamTypes.includes(requiredQuality)) {\r\n console.warn(\"Start section didn't include required quality, returning existing end date\");\r\n return endDate;\r\n }\r\n\r\n if (this.dateService.dateIsBetweenDates(endDate, startSection.dateStart, startSection.dateEnd, true, true)) {\r\n return endDate;\r\n }\r\n\r\n const indexOfSection = summary.displaySections.indexOf(startSection);\r\n\r\n let latestSection = startSection;\r\n\r\n for (var i = indexOfSection + 1; i < summary.displaySections.length; i++) {\r\n const section = summary.displaySections[i];\r\n\r\n if (!section.availableVideoStreamTypes.includes(requiredQuality)) {\r\n break;\r\n }\r\n\r\n if (!this.dateService.date1IsAfterDate2(endDate, section.dateStart)) {\r\n break; \r\n }\r\n\r\n latestSection = section;\r\n }\r\n\r\n\r\n const trimmedDate: Date = (this.dateService.date1IsAfterDate2(endDate, latestSection.dateEnd))\r\n ? new Date(latestSection.dateEnd)\r\n : endDate;\r\n\r\n return trimmedDate;\r\n }\r\n\r\n getTimelineDisplaySectionAtDate(sections: ICameraFootageTimelineDisplaySection[], startDate: Date): ICameraFootageTimelineDisplaySection {\r\n if (!sections?.length) {\r\n return;\r\n }\r\n\r\n return sections.find(section => this.dateService.dateIsBetweenDates(startDate, section.dateStart, section.dateEnd, true, true));\r\n }\r\n\r\n createAvailableDailyFootageTimelineFromJourneys(date: Date, journeys: IJourney[]): ITimelineSummary {\r\n if (!journeys?.length) {\r\n return;\r\n }\r\n\r\n const availableDailyFootageFromJourneys = this.convertJourneysIntoAvailableDailyFootage(journeys);\r\n\r\n return this.createAvailableDailyFootageTimeline(date, availableDailyFootageFromJourneys);\r\n }\r\n\r\n createAvailableDailyFootageTimeline(date: Date, availableDailyFootage: IAvailableDailyFootage[]): ITimelineSummary {\r\n\r\n if (!availableDailyFootage?.length) {\r\n return;\r\n }\r\n\r\n const summaryStartDate = this.dateService.getStartOfDay(date);\r\n const summaryEndDate = this.dateService.getEndOfDay(date);\r\n\r\n const summary: ITimelineSummary = this.createTimelineSummaryTemplate(availableDailyFootage, summaryStartDate, summaryEndDate);\r\n\r\n if (!summary.footage?.length) {\r\n return;\r\n }\r\n\r\n summary.channelSummaries = this.createChannelOverviews(summary);\r\n summary.availableChannelIds = summary.channelSummaries.flatMap(channelSummary => channelSummary.availableChannelIds);\r\n summary.availableVideoStreamTypes = this.getVideoStreamTypesFromFootage(summary.footage);\r\n\r\n const tolerance: number = 300;\r\n\r\n summary.displaySections = this.createFootageDisplaySections(summary.footage, summary.footage[0].Start, summary.footage[0].End, null, tolerance);\r\n this.patch(summary.displaySections);\r\n\r\n this.setFootageSectionPercentages(summary.displaySections);\r\n this.setStartEndDatesFromFootage(summary);\r\n\r\n return summary;\r\n }\r\n\r\n setFootageSectionPercentages(sections: ICameraFootageTimelineDisplaySection[]): void {\r\n\r\n if (!sections?.length) {\r\n return;\r\n }\r\n\r\n sections.forEach(section => {\r\n\r\n const startPercentage = this.getFootagePositionFromTime(section.dateStart);\r\n const endPercentage = this.getFootagePositionFromTime(section.dateEnd);\r\n\r\n section.startPercentage = startPercentage;\r\n section.widthPercentage = endPercentage - startPercentage;\r\n\r\n // Ensure we cannot go below 0% left\r\n if (section.startPercentage < 0) {\r\n section.startPercentage = 0;\r\n }\r\n\r\n // Ensure that we cannot go over 100%\r\n if (section.startPercentage + section.widthPercentage > 100) {\r\n section.widthPercentage -= section.startPercentage + section.widthPercentage - 100;\r\n }\r\n });\r\n }\r\n\r\n // ---\r\n\r\n private convertJourneysIntoAvailableDailyFootage(journeys: IJourney[]): IAvailableDailyFootage[] {\r\n const availableDailyFootage: IAvailableDailyFootage[] = [];\r\n\r\n if (!journeys?.length) {\r\n return availableDailyFootage;\r\n }\r\n\r\n journeys.forEach(journey => {\r\n availableDailyFootage.push({\r\n End: new Date(journey.EndUtc),\r\n Start: new Date(journey.StartUtc),\r\n StreamType: VideoStreamType.Main\r\n });\r\n })\r\n\r\n return availableDailyFootage;\r\n }\r\n\r\n private createChannelOverviews(overview: ITimelineSummary): ITimelineChannelSummary[] {\r\n const channelOverviews: ITimelineChannelSummary[] = [];\r\n const channelFootageMap = this.getChannelFootageMapFromSummary(overview);\r\n\r\n if (!channelFootageMap?.size) {\r\n return channelOverviews;\r\n }\r\n\r\n channelFootageMap.forEach((footage: IAvailableDailyFootage[], channelId: number) => {\r\n channelOverviews.push(this.createChannelOverview(channelId, footage));\r\n });\r\n\r\n return channelOverviews;\r\n }\r\n\r\n private createChannelOverview(channelId: number, footage: IAvailableDailyFootage[]): ITimelineChannelSummary {\r\n const channelOverview = this.createChannelOverviewTemplate(channelId);\r\n\r\n channelOverview.footage = footage;\r\n channelOverview.channelTimelines = this.createChannelTimelines(channelOverview);\r\n channelOverview.availableVideoStreamTypes = this.getVideoStreamTypesFromFootage(channelOverview.footage);\r\n\r\n channelOverview.displaySections = this.createFootageDisplaySections(channelOverview.footage, channelOverview.footage[0].Start, channelOverview.footage[0].End);\r\n this.patch(channelOverview.displaySections);\r\n this.setFootageSectionPercentages(channelOverview.displaySections);\r\n this.setStartEndDatesFromFootage(channelOverview);\r\n\r\n return channelOverview;\r\n }\r\n\r\n private createChannelTimelines(overview: ITimelineChannelSummary): ICameraFootageChannelTimeline[] {\r\n const channelTimelines: ICameraFootageChannelTimeline[] = [];\r\n const channelFootageMap = this.getChannelFootageMapFromSummary(overview);\r\n\r\n if (!channelFootageMap?.size) {\r\n return channelTimelines;\r\n }\r\n\r\n channelFootageMap.forEach((footage: IAvailableDailyFootage[], channelId: number) => {\r\n const footageByVideoStreamType = this.getChannelStreamTypeFootageMap(footage);\r\n\r\n footageByVideoStreamType.forEach((footage: IAvailableDailyFootage[], streamType: VideoStreamType) => {\r\n channelTimelines.push(this.createChannelTimeline(channelId, footage, streamType));\r\n });\r\n });\r\n\r\n return channelTimelines;\r\n }\r\n\r\n private createChannelTimeline(channelId: number, footage: IAvailableDailyFootage[], streamType: VideoStreamType): ICameraFootageChannelTimeline {\r\n\r\n const channelTimeline = this.createChannelTimelineTemplate(channelId);\r\n\r\n channelTimeline.availableVideoStreamTypes = [streamType];\r\n channelTimeline.footage = footage;\r\n\r\n this.setStartEndDatesFromFootage(channelTimeline);\r\n\r\n channelTimeline.displaySections = this.createChannelTimelineDisplaySections(channelTimeline);\r\n\r\n return channelTimeline;\r\n }\r\n\r\n private createChannelTimelineDisplaySections(channelTimeline: ICameraFootageChannelTimeline): ICameraFootageTimelineDisplaySection[] {\r\n const sections: ICameraFootageTimelineDisplaySection[] = [];\r\n\r\n if (!channelTimeline?.footage?.length) {\r\n return sections;\r\n }\r\n\r\n channelTimeline.footage.forEach(footage => {\r\n\r\n const newSection: ICameraFootageTimelineDisplaySection = {\r\n dateStart: footage.Start,\r\n dateEnd: footage.End,\r\n footage: [footage],\r\n availableVideoStreamTypes: [footage.StreamType],\r\n availableChannelIds: [footage.Channel],\r\n label: this.translationService.t(\"Common.Online\")\r\n }\r\n\r\n newSection.hasMainStream = newSection.availableVideoStreamTypes.includes(VideoStreamType.Main);\r\n newSection.hasSubStream = newSection.availableVideoStreamTypes.includes(VideoStreamType.Sub);\r\n\r\n sections.push(newSection);\r\n });\r\n\r\n this.setFootageSectionPercentages(sections);\r\n\r\n return sections;\r\n }\r\n\r\n\r\n private createBaseTimelineTemplate(startDate: Date = null, endDate: Date = null): ITimelineBase {\r\n const newTemplate: ITimelineBase = {\r\n dateStart: startDate,\r\n dateEnd: endDate,\r\n\r\n availableVideoStreamTypes: [],\r\n availableChannelIds: [],\r\n footage: [],\r\n\r\n displaySections: []\r\n }\r\n\r\n return newTemplate;\r\n }\r\n\r\n private createChannelOverviewTemplate(channelId: number, startDate: Date = null, endDate: Date = null): ITimelineChannelSummary {\r\n const newTemplate: ITimelineChannelSummary = {\r\n ...this.createBaseTimelineTemplate(startDate, endDate),\r\n\r\n channelId: channelId,\r\n channelTimelines: [],\r\n availableChannelIds: [channelId]\r\n }\r\n\r\n return newTemplate;\r\n }\r\n\r\n private createTimelineSummaryTemplate(footage: IAvailableDailyFootage[], startDate: Date, endDate: Date): ITimelineSummary {\r\n\r\n let filteredFootage = this.filterFootageWithinDates(footage, startDate, endDate);\r\n\r\n this.orderFootageByDateProperty(filteredFootage, \"Start\");\r\n\r\n const newTemplate: ITimelineSummary = {\r\n ...this.createBaseTimelineTemplate(startDate, endDate),\r\n\r\n footage: filteredFootage,\r\n channelSummaries: []\r\n }\r\n\r\n this.setStartEndDatesFromFootage(newTemplate);\r\n\r\n return newTemplate;\r\n }\r\n\r\n private createChannelTimelineTemplate(channelId: number): ICameraFootageChannelTimeline {\r\n const newTemplate: ICameraFootageChannelTimeline = {\r\n ...this.createBaseTimelineTemplate(),\r\n channelId: channelId\r\n }\r\n\r\n newTemplate.availableChannelIds = [channelId];\r\n\r\n return newTemplate;\r\n }\r\n\r\n private getChannelFootageMapFromSummary(summary: ITimelineSummary | ITimelineChannelSummary): Map {\r\n const channelFootageMap = summary.footage.reduce((channelMap, footage) => {\r\n const channelArray = channelMap.get(footage.Channel) || [];\r\n\r\n channelArray.push(footage);\r\n channelMap.set(footage.Channel, channelArray);\r\n\r\n return channelMap;\r\n }, new Map());\r\n\r\n return channelFootageMap;\r\n }\r\n\r\n private getChannelStreamTypeFootageMap(footage: IAvailableDailyFootage[]): Map {\r\n const channelFootageMap = footage.reduce((channelMap, footage) => {\r\n const channelArray = channelMap.get(footage.StreamType) || [];\r\n\r\n channelArray.push(footage);\r\n channelMap.set(footage.StreamType, channelArray);\r\n\r\n return channelMap;\r\n }, new Map());\r\n\r\n return channelFootageMap;\r\n }\r\n\r\n private getVideoStreamTypesFromFootage(footage: IAvailableDailyFootage[]): VideoStreamType[] {\r\n if (!footage?.length) {\r\n return [];\r\n }\r\n\r\n return [...new Set(footage.map(footage => footage.StreamType))];\r\n }\r\n\r\n private filterFootageWithinDates(footage: IAvailableDailyFootage[], startDate: Date, endDate: Date): IAvailableDailyFootage[] {\r\n if (!footage?.length) {\r\n return [];\r\n }\r\n\r\n footage.forEach(footage => {\r\n footage.Start = footage.Start < startDate ? startDate : footage.Start;\r\n footage.End = footage.End > endDate ? endDate : footage.End;\r\n })\r\n\r\n return footage.filter(footage => {\r\n return this.dateService.dateIsBetweenDates(footage.Start, startDate, endDate, true, true)\r\n && this.dateService.dateIsBetweenDates(footage.End, startDate, endDate, true, true)\r\n });\r\n }\r\n\r\n private orderFootageByDateProperty(footage: IAvailableDailyFootage[], property: string): void {\r\n if (!footage?.length) {\r\n return;\r\n }\r\n\r\n footage.sort((footage1, footage2) => this.dateService.sort(footage1[property], footage2[property], SortDirection.Ascending));\r\n }\r\n\r\n private orderSectionsByDateProperty(sections: ICameraFootageTimelineDisplaySection[], property: string): void {\r\n if (!sections?.length) {\r\n return;\r\n }\r\n\r\n sections.sort((section1, section2) => this.dateService.sort(section1[property], section2[property], SortDirection.Ascending));\r\n }\r\n\r\n private setStartEndDatesFromFootage(timelineBase: ITimelineBase): void {\r\n if (!timelineBase?.footage?.length) {\r\n return;\r\n }\r\n\r\n timelineBase.dateStart = new Date(timelineBase.footage[0].Start);\r\n timelineBase.dateEnd = new Date(this.findFootageWithLatestEndDate(timelineBase.footage)?.End);\r\n }\r\n\r\n private findFootageWithLatestEndDate(footage: IAvailableDailyFootage[]): IAvailableDailyFootage {\r\n if (!footage?.length) {\r\n return null;\r\n }\r\n\r\n return footage.reduce((latest, current) => {\r\n return current.End > latest.End ? current : latest;\r\n }, footage[0]);\r\n }\r\n\r\n private findFootageWithEarliestEndDate(footage: IAvailableDailyFootage[]): IAvailableDailyFootage {\r\n if (!footage?.length) {\r\n return null;\r\n }\r\n\r\n return footage.reduce((latest, current) => {\r\n return current.End > latest.End ? latest : current;\r\n }, footage[0]);\r\n }\r\n\r\n private getFootagePositionFromTime(date: Date): number {\r\n\r\n const percentPerSecond = 100 / (24 * 60 * 60);\r\n let position = this.dateService.getSecondOfDay(date) * percentPerSecond;\r\n\r\n position = Math.max(0, position);\r\n position = Math.min(100, position);\r\n\r\n return position;\r\n }\r\n\r\n private createFootageDisplaySections(availableFootage: IAvailableDailyFootage[], startDate: Date = null, endDate: Date = null, gap: IFootageSectionGap = null, tolerance: number = null): ICameraFootageTimelineDisplaySection[] {\r\n const sections: ICameraFootageTimelineDisplaySection[] = [];\r\n\r\n if (!availableFootage?.length) {\r\n return sections;\r\n }\r\n\r\n sections.push(this.createNewSection(availableFootage[0], startDate, endDate));\r\n\r\n availableFootage.forEach((footage, index) => {\r\n\r\n const currentSection = sections[sections.length - 1];\r\n const footageInCurrentSection: boolean = currentSection.footage.includes(footage);\r\n\r\n if (footageInCurrentSection) {\r\n return;\r\n }\r\n\r\n if (this.dateService.isSameDate(footage.Start, currentSection.dateStart, true) && !footageInCurrentSection) {\r\n this.addFootageToSection(currentSection, footage);\r\n }\r\n\r\n const footageStartAtCurrentSectionEnd: boolean = this.dateService.isSameDate(footage.Start, currentSection.dateEnd, true);\r\n const footageStartAfterCurrentSectionEnd: boolean = this.dateService.date1IsAfterDate2(footage.Start, currentSection.dateEnd);\r\n const footageStartAfterCurrentSectionStart: boolean = this.dateService.date1IsAfterDate2(footage.Start, currentSection.dateStart);\r\n const footageStartsBeforeCurrentSectionStart: boolean = this.dateService.date1IsAfterDate2(currentSection.dateStart, footage.Start);\r\n const footageStartsBeforeCurrentSectionEnd: boolean = this.dateService.date1IsAfterDate2(currentSection.dateEnd, footage.Start);\r\n const footageEndsBeforeCurrentSectionEnd: boolean = this.dateService.date1IsAfterDate2(currentSection.dateEnd, footage.End);\r\n const footageChannelInCurrentSection: boolean = currentSection.availableChannelIds.includes(footage.Channel);\r\n const footageStreamTypeInCurrentSection: boolean = currentSection.availableVideoStreamTypes.includes(footage.StreamType);\r\n const footageSharesCharacteristics: boolean = footageChannelInCurrentSection && footageStreamTypeInCurrentSection;\r\n\r\n let newSeparateSection: ICameraFootageTimelineDisplaySection;\r\n let newIntersectionSection: ICameraFootageTimelineDisplaySection;\r\n\r\n if (!footageStartAfterCurrentSectionStart && !gap) {\r\n return;\r\n }\r\n\r\n if (!!gap) {\r\n this.addFootageToSection(currentSection, footage, gap);\r\n\r\n } else if (footageEndsBeforeCurrentSectionEnd || footageStartsBeforeCurrentSectionEnd || footageStartsBeforeCurrentSectionStart) {\r\n if (footageSharesCharacteristics) {\r\n this.addFootageToSection(currentSection, footage, gap);\r\n } else {\r\n newIntersectionSection = this.createNewIntersectingSection(currentSection, footage, gap);\r\n sections.push(newIntersectionSection);\r\n }\r\n } else if (footageStartAtCurrentSectionEnd && footageSharesCharacteristics) {\r\n this.extendFootageSection(currentSection, footage, gap);\r\n\r\n } else if (footageStartAtCurrentSectionEnd || footageStartAfterCurrentSectionEnd) {\r\n newSeparateSection = this.createNewSection(footage);\r\n sections.push(newSeparateSection);\r\n\r\n const footageToExtendToNewSection = currentSection.footage.filter(currentSectionFootage => {\r\n return this.dateService.date1IsAfterDate2(currentSectionFootage.End, newSeparateSection.dateStart);\r\n });\r\n\r\n footageToExtendToNewSection?.forEach(extendableFootage => this.addFootageToSection(newSeparateSection, extendableFootage));\r\n }\r\n });\r\n\r\n sections.forEach(section => {\r\n section.hasMainStream = section.availableVideoStreamTypes.includes(VideoStreamType.Main);\r\n section.hasSubStream = section.availableVideoStreamTypes.includes(VideoStreamType.Sub);\r\n });\r\n\r\n return sections;\r\n }\r\n\r\n private patch(sections: ICameraFootageTimelineDisplaySection[]): void {\r\n\r\n const gaps: IFootageSectionGap[] = this.getGaps(sections);\r\n\r\n if (!gaps?.length) {\r\n return;\r\n }\r\n\r\n this.patchGaps(sections);\r\n\r\n const postGaps: IFootageSectionGap[] = this.getGaps(sections);\r\n\r\n if (!postGaps?.length) {\r\n return;\r\n }\r\n\r\n if (!postGaps.filter(gap => gap.footage.length)?.length) {\r\n return;\r\n }\r\n\r\n this.patch(sections);\r\n }\r\n\r\n private patchGaps(sections: ICameraFootageTimelineDisplaySection[], tolerance: number = null): void {\r\n const gaps: IFootageSectionGap[] = this.getGaps(sections);\r\n let newSections: ICameraFootageTimelineDisplaySection[] = [];\r\n\r\n if (!gaps?.length) {\r\n return;\r\n }\r\n\r\n gaps.forEach(gap => {\r\n const newSectionsForGap = this.createFootageDisplaySections(gap.footage, gap.dateStart, gap.dateEnd, gap, tolerance);\r\n\r\n if (!newSectionsForGap?.length) {\r\n return;\r\n }\r\n\r\n newSections.push(...newSectionsForGap);\r\n });\r\n\r\n sections.push(...newSections);\r\n this.orderSectionsByDateProperty(sections, \"dateStart\");\r\n }\r\n\r\n private getGaps(sections: ICameraFootageTimelineDisplaySection[]): IFootageSectionGap[] {\r\n const gaps: IFootageSectionGap[] = [];\r\n\r\n sections.forEach((section, index) => {\r\n\r\n if (index === 0) {\r\n return;\r\n }\r\n\r\n const previousSection = sections[index - 1];\r\n const previousSectionEnd: Date = previousSection.dateEnd;\r\n const sectionStart = section.dateStart;\r\n\r\n if (!this.dateService.date1IsAfterDate2(sectionStart, previousSectionEnd)) {\r\n return;\r\n }\r\n\r\n const footage = previousSection.footage.filter(footage => this.dateService.date1IsAfterDate2(footage.End, previousSectionEnd));\r\n\r\n if (!footage?.length) {\r\n return;\r\n }\r\n\r\n const earliestFootageDateEnd = this.findFootageWithEarliestEndDate(footage)?.End;\r\n const nextSectionDateStart = sections.find(section => this.dateService.date1IsAfterDate2(section.dateStart, previousSectionEnd))?.dateStart;\r\n\r\n let dateEnd = earliestFootageDateEnd;\r\n\r\n if (!!nextSectionDateStart && this.dateService.date1IsAfterDate2(earliestFootageDateEnd, nextSectionDateStart)) {\r\n dateEnd = nextSectionDateStart;\r\n }\r\n\r\n const newGap: IFootageSectionGap = {\r\n dateStart: previousSectionEnd,\r\n dateEnd: dateEnd,\r\n footage: footage\r\n };\r\n\r\n gaps.push(newGap);\r\n });\r\n\r\n // area from last section to end of day\r\n const lastSection = sections[sections.length - 1];\r\n const lastSectionEnd: Date = lastSection.dateEnd;\r\n const endOfDay = this.dateService.getEndOfDay(sections[0].dateStart);\r\n\r\n if (this.dateService.date1IsAfterDate2(endOfDay, lastSectionEnd)) {\r\n\r\n const lastSectionFootage = lastSection.footage.filter(footage => this.dateService.date1IsAfterDate2(footage.End, lastSectionEnd));\r\n\r\n if (!lastSectionFootage?.length) {\r\n return gaps;\r\n }\r\n\r\n const earliestEndDateFootage = this.findFootageWithEarliestEndDate(lastSectionFootage);\r\n\r\n gaps.push({\r\n dateStart: lastSectionEnd,\r\n dateEnd: earliestEndDateFootage.End,\r\n footage: lastSectionFootage\r\n });\r\n }\r\n\r\n return gaps;\r\n }\r\n\r\n private createNewIntersectingSection(currentSection: ICameraFootageTimelineDisplaySection, footage: IAvailableDailyFootage, gap: IFootageSectionGap = null): ICameraFootageTimelineDisplaySection {\r\n const newIntersectionSection = this.createNewSection(footage, gap?.dateStart);\r\n\r\n currentSection.dateEnd = new Date(newIntersectionSection.dateStart);\r\n\r\n const footageToExtendToNewSection = currentSection.footage.filter(currentSectionFootage => {\r\n return this.dateService.date1IsAfterDate2(currentSectionFootage.End, newIntersectionSection.dateStart);\r\n });\r\n\r\n footageToExtendToNewSection?.forEach(extendableFootage => this.addFootageToSection(newIntersectionSection, extendableFootage));\r\n\r\n return newIntersectionSection;\r\n }\r\n\r\n private addFootageToSection(section: ICameraFootageTimelineDisplaySection, footage: IAvailableDailyFootage, gap: IFootageSectionGap = null): void {\r\n section.footage.push(footage);\r\n\r\n if (!section.availableChannelIds.includes(footage.Channel)) {\r\n section.availableChannelIds.push(footage.Channel);\r\n }\r\n\r\n if (!section.availableVideoStreamTypes.includes(footage.StreamType)) {\r\n section.availableVideoStreamTypes.push(footage.StreamType);\r\n }\r\n\r\n this.trimSectionEndDateIfEarlier(section, footage, gap);\r\n }\r\n\r\n private extendFootageSection(section: ICameraFootageTimelineDisplaySection, footage: IAvailableDailyFootage, gap: IFootageSectionGap = null): void {\r\n this.addFootageToSection(section, footage, gap);\r\n\r\n const footageTails = section.footage.filter(sectionFootage => this.dateService.date1IsAfterDate2(sectionFootage.End, section.dateEnd));\r\n\r\n if (footageTails?.length) {\r\n const earliestTailEnd = this.findFootageWithEarliestEndDate(footageTails);\r\n\r\n if (this.dateService.date1IsAfterDate2(footage.End, earliestTailEnd.End)) {\r\n section.dateEnd = new Date(earliestTailEnd.End);\r\n return;\r\n }\r\n }\r\n\r\n section.dateEnd = new Date(footage.End);\r\n }\r\n\r\n private trimSectionEndDateIfEarlier(section: ICameraFootageTimelineDisplaySection, footage: IAvailableDailyFootage, gap: IFootageSectionGap = null): void {\r\n if (!this.dateService.date1IsAfterDate2(section.dateEnd, footage.End)) {\r\n return;\r\n }\r\n\r\n section.dateEnd = new Date(footage.End);\r\n }\r\n\r\n private createNewSection(footage: IAvailableDailyFootage, overrideDateStart: Date = null, overrideDateEnd: Date = null): ICameraFootageTimelineDisplaySection {\r\n\r\n const newSection: ICameraFootageTimelineDisplaySection = {\r\n dateStart: new Date(overrideDateStart ?? footage.Start),\r\n dateEnd: new Date(overrideDateEnd ?? footage.End),\r\n footage: [footage],\r\n availableVideoStreamTypes: [footage.StreamType],\r\n availableChannelIds: [footage.Channel],\r\n label: this.translationService.t(\"Common.Online\")\r\n };\r\n\r\n newSection.hasMainStream = newSection.availableVideoStreamTypes.includes(VideoStreamType.Main);\r\n newSection.hasSubStream = newSection.availableVideoStreamTypes.includes(VideoStreamType.Sub);\r\n\r\n return newSection;\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from \"@angular/core\";\r\nimport { IRadioButton } from \"@app/directives/_forms/_radio-buttons/radio-button-base/radio-button-base.component\";\r\nimport { CameraLocation } from \"@app/main/components/videos/enums/CameraLocation\";\r\nimport { IVideoStream } from \"@app/main/components/videos/models/ICameraChannel\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { CameraChannelType } from \"../enums/CameraChannelType\";\r\nimport { CameraStatusService } from \"../services/camera-status.service\";\r\nimport { CameraService } from \"../services/camera.service\";\r\nimport \"./video-channel-selector.component.scss\";\r\n\r\n@Component({\r\n selector: 'video-channel-selector',\r\n template: require('./video-channel-selector.component.html')\r\n})\r\nexport class VideoChannelSelectorComponent implements OnInit, OnChanges {\r\n @Input() isPreview: boolean = false;\r\n @Input() vehicle: IVehicle;\r\n @Input() availableChannels: IVideoStream[];\r\n @Input() autoSelectAll = false;\r\n @Input() dropBottom: boolean;\r\n\r\n @Output() channelsChange: EventEmitter = new EventEmitter();\r\n\r\n channelSelectorLabel = \"\";\r\n isOpen = false;\r\n\r\n loading = false;\r\n channels: IVideoStream[] = [];\r\n visibleChannels: IVideoStream[] = [];\r\n channelRadioButtons: IRadioButton[];\r\n\r\n CameraLocation = CameraLocation;\r\n CameraChannelType = CameraChannelType;\r\n\r\n constructor(\r\n private readonly translationService: TranslationService,\r\n private readonly cameraService: CameraService,\r\n private readonly cameraStatusService: CameraStatusService) {\r\n\r\n }\r\n\r\n ngOnInit(): void {\r\n this.updateChannelSelectorLabel();\r\n }\r\n\r\n ngOnChanges(): void {\r\n if (this.availableChannels) {\r\n this.processChannels(this.availableChannels);\r\n } else {\r\n this.getAllActiveStreamingChannels();\r\n }\r\n }\r\n\r\n getAllActiveStreamingChannels(): void {\r\n this.cameraStatusService.getVideoChannels(this.vehicle.Id).then(channels => {\r\n this.processChannels(channels);\r\n });\r\n }\r\n\r\n private processChannels(channels: IVideoStream[] = []): void {\r\n this.channels = this.cameraService.filterDuplicateVideoStreams(channels).filter(c => c.IsActive);\r\n\r\n this.setSelectedChannels();\r\n this.updateChannelSelectorLabel();\r\n this.createChannelCards(this.channels);\r\n }\r\n\r\n setSelectedChannels() {\r\n if (this.autoSelectAll) {\r\n this.channels.forEach(channel => { channel.visible = true; });\r\n }\r\n else {\r\n const primary = this.cameraService.getPrimaryChannel(this.channels);\r\n if (primary) {\r\n primary.visible = true;\r\n }\r\n }\r\n\r\n this.updateVisibleChannelList();\r\n }\r\n\r\n toggleChannelVisibility(channel: IVideoStream) {\r\n if (!channel) {\r\n return;\r\n }\r\n\r\n channel.visible = !channel.visible;\r\n\r\n if (channel.visible && !this.isPreview) {\r\n this.cameraService.getLiveStreamUrls(this.vehicle.Id, null).then(channels => {\r\n channel.StreamUrl = this.cameraService.filterDuplicateVideoStreams(channels).find(c => c.ChannelId == channel.ChannelId)?.StreamUrl;\r\n\r\n this.updateVisibleChannelList();\r\n });\r\n }\r\n else {\r\n this.updateVisibleChannelList();\r\n }\r\n }\r\n\r\n togglePopup() {\r\n this.isOpen = !this.isOpen;\r\n }\r\n\r\n onRadioButtonSelectionChanged(selectedButtons: IRadioButton[]): void {\r\n this.updateVisibleChannelList();\r\n }\r\n\r\n // ---\r\n\r\n private createChannelCards(channels: IVideoStream[]): void {\r\n if (this.channelRadioButtons?.length) {\r\n return;\r\n }\r\n\r\n this.channels = channels;\r\n this.channelRadioButtons = [];\r\n\r\n if (!this.channels?.length) {\r\n return;\r\n }\r\n\r\n // Sort\r\n this.channels.sort((a, b) => {\r\n if (a.CameraLocation == CameraLocation.Forward) {\r\n return -1;\r\n }\r\n\r\n return a.ChannelId - b.ChannelId;;\r\n });\r\n\r\n this.channels.forEach(channel => {\r\n const channelLabel: string = this.translationService.tEnum(CameraLocation, \"CameraLocation\", channel.CameraLocation);\r\n\r\n this.channelRadioButtons.push({\r\n label: `${channelLabel}`,\r\n description: `Channel ${channel.ChannelId}`,\r\n value: channel,\r\n selected: channel.visible\r\n });\r\n });\r\n\r\n this.updateVisibleChannelList();\r\n }\r\n\r\n private updateVisibleChannelList() {\r\n this.visibleChannels = (this.channelRadioButtons?.length)\r\n ? this.channelRadioButtons.filter((button: IRadioButton) => button.selected).map(button => button.value)\r\n : [];\r\n\r\n this.updateChannelSelectorLabel();\r\n\r\n this.channelsChange.emit(this.visibleChannels);\r\n }\r\n\r\n private updateChannelSelectorLabel() {\r\n\r\n if (this.visibleChannels.length == 0) {\r\n this.channelSelectorLabel = this.translationService.t('videoChannelSelector.noChannelsSelected');\r\n return;\r\n }\r\n\r\n this.channelSelectorLabel = \"\";\r\n for (let i = 0; i < Math.min(this.visibleChannels.length, 3); i++) {\r\n if (i > 0) {\r\n this.channelSelectorLabel += \", \";\r\n }\r\n\r\n this.channelSelectorLabel += this.translationService.tEnum(CameraLocation, \"CameraLocation\", this.visibleChannels[i].CameraLocation);\r\n }\r\n\r\n if (this.visibleChannels.length > 3) {\r\n this.channelSelectorLabel += ` (+${this.visibleChannels.length - 3})`;\r\n }\r\n }\r\n}\r\n\r\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Component, ElementRef, Host, HostBinding, Input, OnChanges, OnDestroy, OnInit, Optional } from \"@angular/core\";\r\nimport { PageTitlePillComponent } from \"@app/directives/_layout/_page-design/page-title-pill/page-title-pill.component\";\r\nimport { IPeripheral } from \"@app/interfaces/IPeripheral\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { ProductVendor } from \"@app/main/components/videos/enums/CameraProductType\";\r\nimport { HTMLService } from \"@app/services/htmlService.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { lastValueFrom } from \"rxjs\";\r\nimport './camera-signal-strength.component.scss';\r\n\r\nexport interface ISignalStatus {\r\n SignalStrength3g: number;\r\n SignalStrength4g: number;\r\n\r\n Has3gCapabilities: boolean;\r\n Has4gCapabilities: boolean;\r\n\r\n WifiModuleStatus: boolean;\r\n SignalStrengthWifi: number;\r\n\r\n IgnitionStatus: boolean;\r\n RecordingStatus: number[]\r\n}\r\n\r\n@Component({\r\n selector: 'camera-signal-strength',\r\n template: require('./camera-signal-strength.component.html')\r\n})\r\nexport class CameraSignalStrengthComponent implements OnInit, OnChanges, OnDestroy {\r\n @Input() vehicle: IVehicle;\r\n @HostBinding('class') signalStrengthClass: string;\r\n\r\n // ---\r\n\r\n camera: IPeripheral;\r\n\r\n signalStatus: ISignalStatus;\r\n signalType = this.translationService.t(\"Common.Loading\");\r\n signalStrength = 3;\r\n\r\n intervalSubscription: ReturnType;\r\n timeout: ReturnType;\r\n\r\n constructor(\r\n @Optional() @Host() private readonly pill: PageTitlePillComponent,\r\n private readonly el: ElementRef,\r\n private readonly httpClient: HttpClient,\r\n private readonly htmlService: HTMLService,\r\n private readonly translationService: TranslationService) {\r\n }\r\n\r\n ngOnInit() {\r\n this.updateDataAfterInterval();\r\n }\r\n\r\n ngOnChanges() {\r\n\r\n if (!this.vehicle) {\r\n return;\r\n }\r\n\r\n this.camera = this.vehicle.peripherals?.find(p => p.Product.IsCameraProduct);\r\n\r\n if (!this.cameraSupportsSignalStrength()) {\r\n this.hideComponent();\r\n return;\r\n }\r\n\r\n if (!this.signalStatus) {\r\n this.showLoadingIndicator();\r\n }\r\n\r\n this.updateData();\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.timeout) {\r\n clearTimeout(this.timeout);\r\n this.timeout = null;\r\n\r\n }\r\n\r\n if (this.intervalSubscription) {\r\n clearInterval(this.intervalSubscription);\r\n this.intervalSubscription = null;\r\n }\r\n }\r\n\r\n // ---\r\n\r\n private updateDataAfterInterval() {\r\n if (this.timeout) {\r\n clearTimeout(this.timeout);\r\n }\r\n\r\n this.timeout = setTimeout(() => {\r\n this.updateData();\r\n }, 10_000);\r\n }\r\n\r\n private updateData() {\r\n if (!this.cameraSupportsSignalStrength()) {\r\n return;\r\n }\r\n\r\n this.getSignalStrength(this.camera.Serial)\r\n .then(status => {\r\n this.signalStatus = status;\r\n\r\n this.parseSignalStrengthResponse();\r\n })\r\n .catch(() => {\r\n this.signalStatus = {} as any;\r\n this.signalStrength = 0;\r\n this.signalType = this.translationService.t(\"CameraSignalStrength.NoSignal\");\r\n })\r\n .finally(() => {\r\n this.updateDataAfterInterval();\r\n });\r\n }\r\n\r\n private getSignalStrength(serial: string, invalidateCache = false): Promise {\r\n const options = { params: {} as HttpParams }\r\n\r\n //options.params[\"minsToLive\"] = 30;\r\n //options.params[\"invalidateCache\"] = invalidateCache;\r\n\r\n return lastValueFrom(this.httpClient.get(`/api/ftcloudapi/signal/${serial}`, options));\r\n }\r\n\r\n private parseSignalStrengthResponse() {\r\n // This currently wont work due to broken API, leaving in for now\r\n if (this.signalStatus.SignalStrength4g > 0) {\r\n\r\n this.signalType = \"4G\";\r\n this.signalStrength = this.signalStatus.SignalStrength4g;\r\n }\r\n else if (this.signalStatus.SignalStrength3g > 0) {\r\n\r\n this.signalType = \"3G\";\r\n this.signalStrength = this.signalStatus.SignalStrength3g;\r\n }\r\n else {\r\n this.signalStrength = 0;\r\n this.signalType = this.translationService.t(\"CameraSignalStrength.NoSignal\");\r\n }\r\n\r\n // This is temporary whilst API is broken\r\n if (this.signalStrength >= 4) {\r\n this.signalType = this.translationService.t(\"CameraSignalStrength.GoodSignal\");\r\n }\r\n else if (this.signalStrength >= 2) {\r\n this.signalType = this.translationService.t(\"CameraSignalStrength.OKSignal\");\r\n }\r\n else if (this.signalStrength > 0) {\r\n this.signalType = this.translationService.t(\"CameraSignalStrength.PoorSignal\");\r\n }\r\n\r\n this.signalStrengthClass = `strength-${this.signalStrength}`;\r\n }\r\n\r\n private showLoadingIndicator() {\r\n if (this.intervalSubscription) {\r\n clearInterval(this.intervalSubscription);\r\n }\r\n\r\n this.intervalSubscription = setInterval(() => {\r\n if (this.signalStatus) {\r\n clearInterval(this.intervalSubscription);\r\n return;\r\n }\r\n\r\n if (++this.signalStrength > 5) {\r\n this.signalStrength = 1;\r\n }\r\n }, 500);\r\n }\r\n\r\n private hideComponent() {\r\n var elementToHide = this.el.nativeElement;\r\n\r\n if (this.pill) {\r\n elementToHide = this.htmlService.getParentByTag(this.el.nativeElement, \"page-title-pill\");\r\n }\r\n\r\n elementToHide.style.display = \"none\";\r\n }\r\n\r\n private cameraSupportsSignalStrength(): boolean {\r\n return this.camera?.Product?.GroupId === ProductVendor.Streamax;\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, Output, SimpleChanges } from '@angular/core';\r\nimport { VideoStreamType } from '@app/main/components/videos/enums/VideoStreamType';\r\nimport { CameraFootageService } from '@app/main/components/videos/services/camera-footage.service';\r\nimport { DateService } from '@app/services/date.service';\r\nimport './download-quality-selector.component.scss';\r\n\r\n@Component({\r\n selector: 'download-quality-selector',\r\n template: require('./download-quality-selector.component.html')\r\n})\r\nexport class DownloadQualitySelector {\r\n @Input() serial: string;\r\n @Input() startTime: Date;\r\n @Input() endTime: Date;\r\n\r\n @Output() qualityChange = new EventEmitter();\r\n\r\n selectedStreamType: VideoStreamType;\r\n substreamAvailable: boolean;\r\n mainstreamAvailable: boolean;\r\n VideoStreamType = VideoStreamType;\r\n\r\n loading: boolean = true;\r\n \r\n constructor(\r\n private readonly cameraFootageService: CameraFootageService,\r\n private readonly dateService: DateService) { }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n this.getAvailableQualities();\r\n }\r\n\r\n qualitySelected(quality: VideoStreamType): void {\r\n this.qualityChange.emit(quality);\r\n }\r\n\r\n //--\r\n\r\n private getAvailableQualities(): void {\r\n if (!this.serial || !this.startTime || !this.endTime) {\r\n return;\r\n }\r\n\r\n this.loading = true;\r\n\r\n this.cameraFootageService.getFootageHistoryForDay(this.serial, this.startTime).then(footage => {\r\n if (!footage?.length) {\r\n return;\r\n }\r\n\r\n const footageAtTime = footage.filter(ftg => {\r\n return this.dateService.dateIsBetweenDates(this.startTime, ftg.Start, ftg.End) || this.dateService.dateIsBetweenDates(this.endTime, ftg.Start, ftg.End);\r\n })\r\n\r\n const availableFootageTypes = footageAtTime.map(ftg => ftg.StreamType);\r\n\r\n if (availableFootageTypes.includes(VideoStreamType.Sub)) {\r\n this.substreamAvailable = true;\r\n this.selectedStreamType = VideoStreamType.Sub;\r\n \r\n }\r\n\r\n if (availableFootageTypes.includes(VideoStreamType.Main)) {\r\n this.mainstreamAvailable = true;\r\n this.selectedStreamType = VideoStreamType.Main;\r\n }\r\n\r\n }).finally(() => {\r\n this.loading = false;\r\n })\r\n }\r\n}\r\n","import { Component, OnInit } from \"@angular/core\";\r\nimport { getValuesFromEnum } from \"@app/class/Utilities\";\r\nimport { VTableRowStatus } from \"@app/directives/_layout/v-table/_enums/VTableRowStatus.enum\";\r\nimport { IVTableCell } from \"@app/directives/_layout/v-table/_models/IVTableCell\";\r\nimport { VehicleOnlineStatusComponent } from \"@app/directives/_misc/vehicle-online-status-indicator/vehicle-online-status.component\";\r\nimport { DateRange } from \"@app/enum/DateRange.enum\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { IGoogleMapsMarker } from \"@app/interfaces/IGoogleMapsMarkerOptions\";\r\nimport { IUser } from \"@app/interfaces/IUser\";\r\nimport { VideoEventCode } from \"@app/main/components/videos/enums/VideoEventCode\";\r\nimport { CameraStatusService } from \"@app/main/components/videos/services/camera-status.service\";\r\nimport { VideoEntryService } from \"@app/main/components/videos/services/video-entry.service\";\r\nimport { VideoEntryUtils } from \"@app/main/components/videos/utils/video-entry-utils\";\r\nimport { DateService, DateUnit } from \"@app/services/date.service\";\r\nimport { UsersService } from \"@app/services/users.service\";\r\nimport { CameraDisplayService } from \"@components/videos/cameraDisplay.service\";\r\nimport { VideoStatus } from \"@components/videos/enums/VideoStatus\";\r\nimport { IVideoEntry } from \"@components/videos/models/IVideoEntry\";\r\nimport { IVTableColumn } from \"@directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@directives/_layout/v-table/_models/IVTableRow\";\r\nimport { IDateCellOptions, VTableService } from \"@directives/_layout/v-table/_services/v-table.service\";\r\nimport { IAggregateFilterEvent, IFilterBarTab } from \"@directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { GeocodeService } from \"@services/geocode.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { IPolyline } from \"@typings/google.maps.angular\";\r\nimport { Subscription, timer } from \"rxjs\";\r\nimport { VideoAddressComponent } from \"../video-address/video-address.component\";\r\nimport { VideoDownloadProgressComponent } from \"../video-download-progress/video-download-progress.component\";\r\nimport { VideoDriverAssignmentComponent } from \"../video-driver-assignment/video-driver-assignment.component\";\r\nimport \"./video-download-list.component.scss\";\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: \"video-download-list\",\r\n template: require(\"./video-download-list.component.html\")\r\n})\r\nexport class VideoDownloadListComponent implements OnInit {\r\n\r\n // raw data\r\n users: IUser[];\r\n videoEntries: IVideoEntry[];\r\n\r\n // display\r\n defaultDateRange = DateRange.Latest4Weeks;\r\n displayVideoEntries: IVideoEntry[];\r\n exportedFileName: string;\r\n sidebarTitle: string;\r\n\r\n selectedVideoEntry: IVideoEntry;\r\n videosAvailable: boolean;\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n filterTabs: IFilterBarTab[] = [];\r\n filterEvent: IAggregateFilterEvent;\r\n\r\n // sidebar map\r\n vehiclePolyline: IPolyline;\r\n startMapMarker: IGoogleMapsMarker;\r\n endMapMarker: IGoogleMapsMarker;\r\n\r\n // loading\r\n loading: boolean;\r\n firstLoadComplete: boolean;\r\n timerSubscription = new Subscription();\r\n\r\n eventsList: { translatedString: string, value: VideoEventCode }[];\r\n VideoStatus = VideoStatus;\r\n\r\n constructor(\r\n private readonly dateService: DateService,\r\n private readonly usersService: UsersService,\r\n private readonly cameraDisplayService: CameraDisplayService,\r\n private readonly vTableService: VTableService,\r\n private readonly translationService: TranslationService,\r\n private readonly geocodeService: GeocodeService,\r\n private readonly videoEntryService: VideoEntryService,\r\n private readonly cameraStatusService: CameraStatusService) {\r\n }\r\n\r\n ngOnInit() {\r\n this.createTabs();\r\n this.createExportName();\r\n this.createTableColumns();\r\n this.subscribeToCacheUpdates();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.unsubscribeFromUpdates();\r\n }\r\n\r\n onTableRowClicked(row: IVTableRow): void {\r\n const videoEntry: IVideoEntry = row.data;\r\n\r\n if (VideoEntryUtils.isDownloaded(videoEntry)) {\r\n this.cameraDisplayService.showVideoPlayer(videoEntry).then(result => {\r\n if (result.requiresUpdate) {\r\n this.removeVideoEntryFromList(videoEntry);\r\n }\r\n });\r\n\r\n return;\r\n }\r\n\r\n this.selectVideoEntry(videoEntry);\r\n }\r\n\r\n selectVideoEntry(videoEntry: IVideoEntry): void {\r\n this.selectedVideoEntry = videoEntry;\r\n }\r\n\r\n clearSelectedVideoEntry(): void {\r\n this.selectedVideoEntry = null;\r\n this.videosAvailable = false;\r\n }\r\n\r\n openDownloadedVideo(videoEntry: IVideoEntry): void {\r\n this.cameraDisplayService.showVideoPlayer(videoEntry);\r\n this.clearSelectedVideoEntry();\r\n }\r\n\r\n filterVideoBySearchText(videoEntry: IVideoEntry, text: string): boolean {\r\n\r\n if (videoEntry.vehicle.ShortReg.toLocaleLowerCase().indexOf(text) >= 0 || videoEntry.vehicle.Reg.toLocaleLowerCase().indexOf(text) >= 0) {\r\n return true;\r\n }\r\n\r\n if (videoEntry.driver?.Name.toLocaleLowerCase().indexOf(text) >= 0) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n\r\n filterVideoByEvent(videoEntry: IVideoEntry, event: any): boolean {\r\n return videoEntry.EventCode === event.value;\r\n }\r\n\r\n eventSearchPredicate(event: VideoEventCode, searchText: string): boolean {\r\n const translatedState = this.translationService.tEnum(VideoEventCode, \"VideoEventCode\", event);\r\n return translatedState.toLowerCase().indexOf(searchText.toLowerCase()) >= 0;\r\n }\r\n\r\n onFilterChanged(event: IAggregateFilterEvent) {\r\n\r\n if (!event.trigger) {\r\n return;\r\n }\r\n\r\n this.filterEvent = event;\r\n\r\n if (this.filterEvent.trigger == \"date\") {\r\n this.subscribeToUpdates(true);\r\n return;\r\n }\r\n }\r\n\r\n onRequestComplete(): void {\r\n this.videosAvailable = true;\r\n }\r\n\r\n getVideoDownloadStatusLabel(videoEntry: IVideoEntry): string {\r\n return this.cameraStatusService.getVideoDownloadStatusLabel(videoEntry)\r\n }\r\n\r\n retryDownload(): void {\r\n this.selectedVideoEntry.Status = VideoStatus.UserUploadRequested;\r\n this.selectedVideoEntry.ExternalId = null;\r\n this.selectedVideoEntry.DateRequested = new Date();\r\n this.videoEntryService.updateVideoEntry(this.selectedVideoEntry).then(videoEntry => {\r\n this.selectedVideoEntry = videoEntry;\r\n this.clearSelectedVideoEntry();\r\n })\r\n }\r\n\r\n get isSelectedVideoStatusValid(): boolean {\r\n return !VideoEntryUtils.isDownloadFailed(this.selectedVideoEntry);\r\n }\r\n\r\n // ---\r\n\r\n private removeVideoEntryFromList(videoEntry: IVideoEntry): void {\r\n const filteredEntries = this.videoEntries.filter(x => x.Id !== videoEntry.Id)\r\n this.setVideoEntriesData(filteredEntries);\r\n }\r\n\r\n private subscribeToUpdates(showLoadingSpinner: boolean = false): void {\r\n\r\n if (showLoadingSpinner) {\r\n this.firstLoadComplete = false;\r\n }\r\n\r\n this.unsubscribeFromUpdates();\r\n\r\n const timer$ = timer(0, 60_000);\r\n\r\n this.timerSubscription = timer$.subscribe(() => {\r\n this.getData(true);\r\n });\r\n }\r\n\r\n private unsubscribeFromUpdates(): void {\r\n this.timerSubscription?.unsubscribe();\r\n }\r\n\r\n private async getData(invalidateCache: boolean = false): Promise {\r\n this.loading = true;\r\n\r\n const videoEntries = await this.getVideoEntries(invalidateCache);\r\n const users = await (this.usersService.getUsers({ includeAdmins: true }) as Promise);\r\n\r\n this.users = users;\r\n this.setVideoEntriesData(videoEntries);\r\n\r\n this.loading = false;\r\n this.firstLoadComplete = true;\r\n }\r\n\r\n private setVideoEntriesData(videoEntries: IVideoEntry[]): void {\r\n this.videoEntries = this.filterVideoEntries(videoEntries);\r\n\r\n if (this.selectedVideoEntry) {\r\n this.selectedVideoEntry = videoEntries.find(entry => entry.Id === this.selectedVideoEntry.Id);\r\n }\r\n\r\n this.processVideoEntries();\r\n this.createTableRows();\r\n this.createFilterItems();\r\n }\r\n\r\n private filterVideoEntries(videoEntries: IVideoEntry[]): IVideoEntry[] {\r\n return videoEntries.filter(v => v.Status != VideoStatus.Archived);\r\n }\r\n\r\n private getVideoEntries(invalidateCache: boolean = false): Promise {\r\n\r\n const endTime = this.filterEvent.date[1];\r\n const startTime = this.filterEvent.date[0];\r\n\r\n return this.videoEntryService.getVideoEntriesRequestedWithMappings({ \r\n endTime, \r\n startTime, \r\n invalidateCache, \r\n excludeMediaDeleted: true \r\n });\r\n }\r\n\r\n private processVideoEntries(): void {\r\n if (!this.videoEntries?.length) {\r\n return;\r\n }\r\n\r\n this.videoEntries.forEach(videoEntry => {\r\n if (!videoEntry.vehicle) {\r\n videoEntry.vehicle = {};\r\n }\r\n\r\n if (!videoEntry.RequestedBy) {\r\n return;\r\n }\r\n\r\n const user = this.users.filter(u => u.Id === videoEntry.RequestedBy);\r\n\r\n if (user.length > 0) {\r\n videoEntry.requestedByUser = user[0];\r\n }\r\n });\r\n }\r\n\r\n private createTableColumns(): void {\r\n\r\n this.tableColumns = [];\r\n\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"VideoDownloadList.Requested\",\r\n width: 160,\r\n sortType: SortType.Date,\r\n sorted: true,\r\n sortDirection: SortDirection.Descending\r\n }),\r\n createCellFunction: (videoEntry) => {\r\n\r\n let requestDate = videoEntry.MetaData.UserRequestedUploadDate || videoEntry.DateRequested;\r\n\r\n if (!videoEntry.RequestedBy) {\r\n requestDate = videoEntry.DateCreated;\r\n }\r\n\r\n const dateCellOptions: IDateCellOptions = {\r\n showRelativeTime: true\r\n };\r\n\r\n if (!VideoEntryUtils.isDownloaded(videoEntry)) {\r\n dateCellOptions[\"cutOff\"] = this.dateService.addOrSubtractTime(new Date(), -10, DateUnit.Day)\r\n }\r\n\r\n return this.vTableService.createDateCell(requestDate, dateCellOptions);\r\n }\r\n },\r\n\r\n\r\n {\r\n header: this.vTableService.createVehicleTableHeader(),\r\n createCellFunction: (videoEntry) => this.vTableService.createVehicleRegCell(videoEntry.vehicle)\r\n },\r\n \r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: 'Common.Driver',\r\n width: 140,\r\n minTableWidth: 1450,\r\n }),\r\n createCellFunction: (videoEntry) => {\r\n\r\n return this.vTableService.createTableCell(\r\n videoEntry.driver?.DisplayName || this.translationService.t('DriverSummaryPanel.NoDriver'),\r\n {\r\n classes: !videoEntry.driver ? 'text-muted' : '',\r\n component: VideoDriverAssignmentComponent,\r\n componentInputs: {\r\n videoEntry: videoEntry\r\n }\r\n })\r\n }\r\n },\r\n \r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"Common.Event\",\r\n width: 140,\r\n minTableWidth: 1450\r\n }),\r\n createCellFunction: (videoEntry) => this.vTableService.createTableCell(videoEntry.displayEventCode)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"VideoDownloadList.VideoStartTime\",\r\n minTableWidth: 700,\r\n width: 160,\r\n sortType: SortType.Date\r\n }),\r\n createCellFunction: (videoEntry) => {\r\n return this.vTableService.createDateCell(videoEntry.VideoStartTime, { showRelativeTime: true });\r\n }\r\n },\r\n {\r\n header: this.vTableService.createLocationInformationHeader({\r\n minTableWidth: 1150,\r\n width: null,\r\n }),\r\n createCellFunction: (videoEntry) => this.vTableService.createTableCell(videoEntry, { exportDataMethod: () => this.exportVideoEntryLocationMethod(videoEntry), component: VideoAddressComponent, componentInputs: { videoEntry: videoEntry } })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"VideoDownloadList.Camera\",\r\n minTableWidth: 950,\r\n width: 160,\r\n sortable: false\r\n }),\r\n createCellFunction: (videoEntry) => this.createOnlineStatusCell(videoEntry)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"Common.Status\",\r\n width: 160,\r\n minTableWidth: 600\r\n }),\r\n createCellFunction: (videoEntry) => this.createVideoDownloadStatusCell(videoEntry)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"VideoDownloadList.Progress\",\r\n width: 100,\r\n sortable: false,\r\n excludeFromExport: true\r\n }),\r\n createCellFunction: (videoEntry) => {\r\n switch (videoEntry.Status) {\r\n case VideoStatus.Error:\r\n return this.vTableService.createStatusCell(VTableRowStatus.Error);\r\n case VideoStatus.NoFilesAvailable:\r\n case VideoStatus.NoFootageAvailable:\r\n return this.vTableService.createStatusCell(VTableRowStatus.Info);\r\n default:\r\n return this.vTableService.createTableCell(0, { component: VideoDownloadProgressComponent, componentInputs: { videoEntry: videoEntry } })\r\n }\r\n }\r\n }\r\n ];\r\n }\r\n\r\n private createTableRows(): void {\r\n this.tableRows = [];\r\n\r\n if (!this.videoEntries?.length) {\r\n return;\r\n }\r\n\r\n this.tableRows = this.vTableService.createTableRows(this.videoEntries, this.tableColumns);\r\n }\r\n\r\n private createOnlineStatusCell(data: IVideoEntry): IVTableCell {\r\n return this.vTableService.createTableCell(data, {\r\n exportDataMethod: () => this.exportOnlineStatusMethod(data),\r\n component: VehicleOnlineStatusComponent,\r\n componentInputs: {\r\n vehicle: data.vehicle,\r\n live: false\r\n }\r\n })\r\n }\r\n\r\n private createVideoDownloadStatusCell(data: IVideoEntry): IVTableCell {\r\n const label = this.getVideoDownloadStatusLabel(data);\r\n const autoDownload = data.MetaData?.AuditLogs?.[0]?.includes(\"Auto Download\") ?? false; \r\n\r\n return this.vTableService.createVideoDownloadStatusCell(label, autoDownload);\r\n }\r\n\r\n private exportOnlineStatusMethod(videoEntry: IVideoEntry): Promise {\r\n return new Promise(resolve => {\r\n if (!videoEntry) {\r\n return resolve(\"N/A\");\r\n }\r\n\r\n if (!videoEntry.vehicle) {\r\n return resolve(this.translationService.t(`VehicleOnlineStatus.UnknownVehicle`));\r\n }\r\n\r\n if (videoEntry.vehicle.onlineStatus.online) {\r\n return resolve(this.translationService.t(`VehicleOnlineStatus.CameraOnline`));\r\n }\r\n \r\n if (!videoEntry.vehicle.onlineStatus.lastOnlineTime) {\r\n return resolve(this.translationService.t(`VehicleOnlineStatus.CameraOffline`))\r\n }\r\n\r\n return resolve(this.dateService.relativeTime(videoEntry.vehicle.onlineStatus.lastOnlineTime))\r\n });\r\n }\r\n\r\n private exportVideoEntryLocationMethod(videoEntry: IVideoEntry): Promise {\r\n return new Promise((resolve, reject) => {\r\n if (!videoEntry) {\r\n return resolve(\"N/A\")\r\n }\r\n\r\n if (videoEntry.GeocodedAddressId) {\r\n return resolve(videoEntry.PlaceName);\r\n }\r\n\r\n return this.geocodeService.getLocationInformationFromVideo(videoEntry.Id).then(location => {\r\n return resolve(location.LocationDescription);\r\n }).catch((error) => {\r\n console.error(\"Error retrieving location: \", error);\r\n\r\n return resolve(\"\");\r\n });\r\n });\r\n }\r\n\r\n private createTabs(): void {\r\n this.filterTabs = [];\r\n\r\n this.createTabDefinition(\"VideoDownloadList.FilterTabAll\", v => v.Status != VideoStatus.Restricted);\r\n this.createTabDefinition(\"VideoDownloadList.FilterTabPending\", v => VideoEntryUtils.isDownloading(v) || VideoEntryUtils.isRequested(v));\r\n this.createTabDefinition(\"VideoDownloadList.FilterTabComplete\", v => VideoEntryUtils.isDownloaded(v));\r\n this.createTabDefinition(\"VideoDownloadList.FilterTabFailed\", v => VideoEntryUtils.isDownloadFailed(v));\r\n this.createTabDefinition(\"VideoEventList.RestrictedEvents\", v => v.Status == VideoStatus.Restricted);\r\n }\r\n\r\n private createTabDefinition(translationString: string, callback: (video: IVideoEntry) => boolean) {\r\n this.filterTabs.push({ title: this.translationService.t(translationString), predicate: callback });\r\n }\r\n\r\n private createExportName(): void {\r\n this.exportedFileName = this.translationService.t(\"VideoDownloadList.ExportTitle\");\r\n }\r\n\r\n private createFilterItems(): any {\r\n this.eventsList = [];\r\n\r\n const enumValues = getValuesFromEnum(VideoEventCode);\r\n\r\n this.eventsList = enumValues.map(value => {\r\n return {\r\n translatedString: this.translationService.tEnum(VideoEventCode, \"VideoEventCode\", value),\r\n value: value\r\n }\r\n });\r\n }\r\n\r\n private subscribeToCacheUpdates(): void {\r\n this.videoEntryService.videoUpdate$.pipe(untilDestroyed(this)).subscribe(videoEntry => {\r\n this.videoEntries = [\r\n ...this.videoEntries.filter(e => e.Id !== videoEntry.Id),\r\n videoEntry\r\n ];\r\n\r\n this.createTableRows();\r\n })\r\n }\r\n}\r\n","import { Component, ElementRef, EventEmitter, Input, OnChanges, OnInit, Output, ViewChild } from \"@angular/core\";\r\nimport { VideoEntryUtils } from \"@app/main/components/videos/utils/video-entry-utils\";\r\nimport { IVeriTag } from \"@directives/_veri/v-tags/v-tags.component\";\r\nimport { ObservationsService } from \"@services/observations.service\";\r\nimport { VideoObservation } from \"../../../../components/videos/enums/VideoObservation\";\r\nimport { IVideoEntry } from \"../../../../components/videos/models/IVideoEntry\";\r\nimport { CameraService } from \"../../../../components/videos/services/camera.service\";\r\nimport \"./video-entry.component.scss\";\r\n\r\ntype ThumbnailSourceType = 'direct' | 'channelMedia';\r\n\r\n@Component({\r\n selector: \"video-entry\",\r\n template: require(\"./video-entry.component.html\")\r\n})\r\nexport class VideoEntryComponent implements OnInit, OnChanges {\r\n\r\n @Input() video: IVideoEntry;\r\n @Input() showDate: boolean;\r\n @Input() showVehicle: boolean;\r\n @Input() compactView: boolean = false;\r\n @Input() thumbnailSourceType: ThumbnailSourceType = 'channelMedia';\r\n\r\n @Output() onPlayVideo = new EventEmitter<{ videoEntry: IVideoEntry, $event: MouseEvent }>();\r\n\r\n @ViewChild('videoPlayer') videoPlayer: ElementRef;\r\n\r\n // ---\r\n\r\n loading: boolean;\r\n\r\n tags: IVeriTag[] = [];\r\n\r\n showVideoPreview = false;\r\n thumbnailSrc = \"\";\r\n\r\n constructor(\r\n private readonly observationsService: ObservationsService,\r\n private readonly cameraService: CameraService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.thumbnailSrc = this.getThumbnailSrc();\r\n }\r\n\r\n ngOnChanges(): void {\r\n this.createTags();\r\n }\r\n\r\n playVideo(event: MouseEvent): void {\r\n if (!VideoEntryUtils.isDownloaded(this.video)) {\r\n return;\r\n }\r\n\r\n this.onPlayVideo.emit({ videoEntry: this.video, $event: event });\r\n }\r\n\r\n downloadVideo(): void {\r\n this.cameraService.downloadVideo(this.video);\r\n }\r\n\r\n startVideoPreview(): void {\r\n // Dont allow this to be called twice\r\n if (this.showVideoPreview) {\r\n return;\r\n }\r\n\r\n this.showVideoPreview = true;\r\n\r\n if (!this.videoPlayer) {\r\n return;\r\n }\r\n\r\n this.loading = true;\r\n\r\n setTimeout(() => {\r\n this.videoPlayer.nativeElement.onloadeddata = () => {\r\n this.videoPlayer.nativeElement.play();\r\n this.videoPlayer.nativeElement.muted = true;\r\n this.loading = false;\r\n };\r\n });\r\n }\r\n\r\n endVideoPreview(): void {\r\n if (this.videoPlayer) {\r\n this.videoPlayer.nativeElement.src = null;\r\n this.videoPlayer.nativeElement.onloadeddata = null;\r\n }\r\n\r\n this.showVideoPreview = false;\r\n this.loading = false;\r\n }\r\n\r\n // --- \r\n\r\n private getThumbnailSrc(): string {\r\n switch (this.thumbnailSourceType) {\r\n case 'direct':\r\n return this.video.thumbnailUrl;\r\n case 'channelMedia':\r\n return this.video.channelMedia[0].thumbnailUrl\r\n default:\r\n throw new Error(\"Unsupported thumbnail type\");\r\n }\r\n }\r\n\r\n private createTags(): void {\r\n this.tags = [];\r\n\r\n this.video?.MetaData?.VideoObservations?.forEach(videoObservation => {\r\n if (!VideoObservation[videoObservation]) {\r\n return;\r\n }\r\n\r\n this.tags.push({\r\n id: this.tags?.length,\r\n label: this.observationsService.setObservationTitleForDisplay(videoObservation)\r\n });\r\n });\r\n }\r\n}\r\n","import { Component, Input, OnInit } from \"@angular/core\";\r\nimport { IGetVideoEntryOptions } from \"@app/main/components/videos/models/IGetVideoEntryOptions\";\r\nimport { CameraService } from \"@app/main/components/videos/services/camera.service\";\r\nimport { VideoEntryService } from \"@app/main/components/videos/services/video-entry.service\";\r\nimport { VideoEventCodeService } from \"@app/main/components/videos/services/video-event-code.service\";\r\nimport { VideoEntryUtils } from \"@app/main/components/videos/utils/video-entry-utils\";\r\nimport { NavigationService } from \"@app/services/navigation.service\";\r\nimport { CameraDisplayService } from \"@components/videos/cameraDisplay.service\";\r\nimport { VideoEventCode } from \"@components/videos/enums/VideoEventCode\";\r\nimport { VideoEventRisk } from \"@components/videos/enums/VideoEventRisk\";\r\nimport { VideoStatus } from \"@components/videos/enums/VideoStatus\";\r\nimport { IVideoEntry } from \"@components/videos/models/IVideoEntry\";\r\nimport { IVTableColumn } from \"@directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@directives/_layout/v-table/_services/v-table.service\";\r\nimport { IVeriMapComponent } from \"@directives/_map/veriMap/veriMapComponent/veriMap.component\";\r\nimport { ProgressColourPalette, VProgressBar } from \"@directives/_misc/v-progress-bar/v-progress-bar.component\";\r\nimport { IAggregateFilterEvent, IFilterBarTab } from \"@directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { VerticalFilterItemCreationCallback } from \"@directives/_resourceFilters/vertical-filter-list/vertical-filter-list.component\";\r\nimport { DateRange } from \"@enums/DateRange.enum\";\r\nimport { ResourceType } from \"@enums/ResourceType\";\r\nimport { SortDirection } from \"@enums/SortDirection\";\r\nimport { IDriver } from \"@interfaces/IDriver\";\r\nimport { IGoogleMapsMarker, IGoogleMapsMarkerOptions } from \"@interfaces/IGoogleMapsMarkerOptions\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { IVideoEventCategory } from \"@interfaces/IVideo\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { CanvasService, IPieDataSeries } from \"@services/canvas.service\";\r\nimport { ColourService } from \"@services/colour.service\";\r\nimport { GeocodeService } from \"@services/geocode.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport { VeriMarkerService } from \"@services/veriMarker.service\";\r\nimport { ClusterIcon, IMarkerOptions } from \"@typings/google.maps.angular\";\r\nimport { CameraModule } from \"../../camera.module.ajs\";\r\nimport { VideoAddressComponent } from \"../video-address/video-address.component\";\r\nimport { VideoDriverAssignmentComponent } from \"../video-driver-assignment/video-driver-assignment.component\";\r\nimport copy from \"fast-copy/dist/fast-copy.esm.js\";\r\nimport \"./video-event-list.component.scss\";\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: \"video-event-list\",\r\n template: require(\"./video-event-list.component.html\")\r\n})\r\nexport class VideoEventListComponent implements OnInit {\r\n\r\n @Input() vehicle: IVehicle;\r\n @Input() driver: IDriver;\r\n\r\n videoEvents: IVideoEntry[];\r\n displayVideoEvents: IVideoEntry[];\r\n\r\n veriMap: IVeriMapComponent;\r\n eventMarkerOptions: IMarkerOptions>;\r\n eventCategories: IVideoEventCategory[] = [];\r\n\r\n filterTabs: IFilterBarTab[] = [];\r\n\r\n defaultDateRange = DateRange.Latest7Days;\r\n filterEvent: IAggregateFilterEvent;\r\n\r\n showMinorEvents: boolean;\r\n\r\n loading: boolean;\r\n\r\n exportedFileName: string = this.translationService.t(\"VideoEventList.VideoEvents\");\r\n\r\n //// #Tables\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n // ---\r\n\r\n VideoStatus = VideoStatus;\r\n\r\n constructor(\r\n private readonly cameraDisplayService: CameraDisplayService,\r\n private readonly veriMarkerService: VeriMarkerService,\r\n private readonly colourService: ColourService,\r\n private readonly canvasService: CanvasService,\r\n private readonly navigationService: NavigationService,\r\n private readonly veriDate: VeriDate,\r\n private readonly vTableService: VTableService,\r\n private readonly translationService: TranslationService,\r\n private readonly geocodeService: GeocodeService,\r\n private readonly videoEventCodeService: VideoEventCodeService,\r\n private readonly cameraService: CameraService,\r\n private readonly videoEntryService: VideoEntryService) {\r\n this.createTabs();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.configureEventMarkerOptions();\r\n this.createTable();\r\n this.videoEntryService.videoUpdate$.pipe(untilDestroyed(this)).subscribe(videoEntry => {\r\n this.addVideoEntryToCurrentEntries(videoEntry);\r\n })\r\n }\r\n\r\n onRowClicked(row: IVTableRow): void {\r\n const event = row.data;\r\n this.goToEvent(event);\r\n }\r\n\r\n onVeriMapLoaded(veriMap: IVeriMapComponent): void {\r\n this.veriMap = veriMap;\r\n }\r\n\r\n onFilterChanged(event: IAggregateFilterEvent): void {\r\n // We sometimes get weird events come through, need to understand why, until then this fixes a bug\r\n if (!event.trigger) {\r\n return;\r\n }\r\n\r\n this.filterEvent = event;\r\n\r\n if (this.filterEvent.trigger == \"date\") {\r\n this.getVideoEvents(true);\r\n return;\r\n }\r\n\r\n this.filterVideos();\r\n }\r\n\r\n eventItemCreationCallback: VerticalFilterItemCreationCallback = (videoEvent) => {\r\n\r\n return {\r\n name: videoEvent.displayEventCode,\r\n icon: this.cameraService.getIconForEvent(videoEvent.displayEventCode),\r\n data: videoEvent,\r\n color: videoEvent.color.solidColour,\r\n predicate: (d) => d.EventCode === videoEvent.EventCode\r\n };\r\n }\r\n\r\n vehicleItemCreationCallback: VerticalFilterItemCreationCallback = (videoEvent) => {\r\n return {\r\n name: videoEvent.vehicle.Reg,\r\n tooltip: videoEvent.vehicle.ShortReg,\r\n icon: \"directions_car\",\r\n data: videoEvent,\r\n predicate: (d: IVideoEntry) => d.VehicleId === videoEvent.VehicleId\r\n };\r\n }\r\n\r\n driverItemCreationCallback: VerticalFilterItemCreationCallback = (videoEvent) => {\r\n return {\r\n name: videoEvent.driver?.DisplayName || this.translationService.t(\"FleetEvents.UnknownDriver\"),\r\n icon: \"person\",\r\n data: videoEvent,\r\n predicate: (d: IVideoEntry) => d.DriverId === videoEvent.DriverId\r\n };\r\n }\r\n\r\n // ---\r\n\r\n private getVideoEvents(invalidateCache = false, showLoadingIndicator = true): void {\r\n if (!this.filterEvent) {\r\n return;\r\n }\r\n\r\n const options: IGetVideoEntryOptions = {\r\n processEntries: true,\r\n invalidateCache: invalidateCache,\r\n includeArchived: true\r\n };\r\n\r\n if (this.vehicle || this.filterEvent.vehicle) {\r\n options.vehicleFilter = { vehicle: this.vehicle || this.filterEvent.vehicle };\r\n }\r\n\r\n if (this.driver || this.filterEvent.driver) {\r\n options.driverFilter = { driver: this.driver || this.filterEvent.driver };\r\n }\r\n\r\n if (this.filterEvent.group) {\r\n options.groupFilter = { group: this.filterEvent.group, resourceType: ResourceType.Any };\r\n }\r\n\r\n this.loading = showLoadingIndicator;\r\n\r\n this.videoEntryService.getVideosEntriesWithMappings(this.filterEvent.date[0], this.filterEvent.date[1], options)\r\n .then(videos => {\r\n this.videoEvents = videos;\r\n\r\n this.filterVideos();\r\n this.processEventCategories();\r\n })\r\n .catch((e) => {\r\n console.log(e);\r\n })\r\n .finally(() => {\r\n this.createTableRows();\r\n this.loading = false; \r\n });\r\n }\r\n\r\n private filterVideos(): void {\r\n let filterData = this.filterEvent?.filteredData\r\n if (!filterData) {\r\n filterData = this.videoEvents;\r\n }\r\n this.displayVideoEvents = filterData?.filter(event => event.color && event.Latitude && event.Longitude);\r\n\r\n this.createMarkers();\r\n }\r\n\r\n // Move to service and let videoList use it also\r\n filterVideoBySearchText(v: IVideoEntry, text: string): boolean {\r\n if (v.vehicle.ShortReg.toLocaleLowerCase().indexOf(text) >= 0 || v.vehicle.Reg.toLocaleLowerCase().indexOf(text) >= 0) {\r\n return true;\r\n }\r\n\r\n if (v.driver?.Name.toLocaleLowerCase().indexOf(text) >= 0) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private createMarkers(): void {\r\n if (!this.displayVideoEvents) {\r\n return;\r\n }\r\n\r\n const pipCache = new Map();\r\n\r\n this.displayVideoEvents.forEach(event => {\r\n if (!pipCache.has(event.color.solidColour)) {\r\n pipCache.set(event.color.solidColour, this.generateEventMarkerPipOptions(event));\r\n }\r\n\r\n if (!event.markerModel) {\r\n event.markerModel = {\r\n id: event.Id,\r\n options: copy(pipCache.get(event.color.solidColour)),\r\n model: event\r\n }\r\n\r\n event.markerModel.options.title = `${event.vehicle.Reg} - ${event.displayEventCode} - ${this.veriDate.formatDate(event.DateCreated)}`;\r\n event.markerModel.options.position = { lat: event.Latitude, lng: event.Longitude }\r\n }\r\n });\r\n }\r\n\r\n private generateEventMarkerPipOptions(event: IVideoEntry): IGoogleMapsMarkerOptions {\r\n let options: IGoogleMapsMarkerOptions = {\r\n isPip: true,\r\n };\r\n\r\n const width = 16\r\n const icon: google.maps.Icon = {\r\n url: this.veriMarkerService.generateColorPip(event.color.solidColour, width),\r\n scaledSize: new google.maps.Size(width, width),\r\n anchor: new google.maps.Point(width / 2, width / 2),\r\n }\r\n\r\n options = {\r\n icon: icon,\r\n zIndex: 0\r\n };\r\n\r\n return options;\r\n }\r\n\r\n private configureEventMarkerOptions(): void {\r\n this.eventMarkerOptions = {\r\n events: {},\r\n control: {},\r\n type: \"cluster\",\r\n typeOptions: {\r\n imagePath: \"https://rawgit.com/googlemaps/js-marker-clusterer/gh-pages/images/m\",\r\n maxZoom: 13,\r\n gridSize: 40 // default 60\r\n },\r\n typeEvents: {}\r\n };\r\n\r\n this.eventMarkerOptions.typeEvents.postClusterShow = (clusterIcon) => { this.createClusterIcon(clusterIcon); }\r\n this.eventMarkerOptions.events.click = (marker, eventName, model) => this.goToEvent(model.model);\r\n }\r\n\r\n private goToEvent(event: IVideoEntry): void {\r\n if (event.Mp4VideoFileGuid && event.Status === VideoStatus.Downloaded) {\r\n this.cameraDisplayService.showVideoPlayer(event);\r\n return;\r\n }\r\n\r\n this.navigationService.go(CameraModule.EventView, { eventId: event.Id });\r\n }\r\n\r\n private createClusterIcon(clusterIcon: ClusterIcon): void {\r\n const markers = clusterIcon.cluster_.markers_;\r\n const eventArray: IVideoEntry[] = markers.map(marker => marker.model);\r\n const matchingEventCategories = this.getEventCategoriesForEvents(eventArray);\r\n\r\n const data: IPieDataSeries[] = [];\r\n\r\n matchingEventCategories.forEach(category => {\r\n data.push({\r\n value: category.events.length,\r\n color: category.color.solidColour\r\n });\r\n });\r\n\r\n const pieCanvas = this.canvasService.getPieCanvas(clusterIcon.width_, data);\r\n clusterIcon.div_.appendChild(pieCanvas);\r\n }\r\n\r\n private getEventCategoriesForEvents(events: IVideoEntry[]): IVideoEventCategory[] {\r\n const categories: IVideoEventCategory[] = [];\r\n\r\n events.forEach(event => {\r\n if (event.eventCategory && categories.filter(category => category == event.eventCategory).length == 0) {\r\n categories.push(event.eventCategory);\r\n }\r\n });\r\n\r\n // Sort by size\r\n categories.sort((a, b) => b.events.length - a.events.length);\r\n\r\n return categories;\r\n }\r\n\r\n private processEventCategories(): void {\r\n this.eventCategories = [];\r\n\r\n const numPossibleVideoEvents = Object.keys(VideoEventCode).length / 2;\r\n\r\n this.videoEvents.forEach(event => {\r\n let existingcategory: IVideoEventCategory = this.eventCategories.find(eventcategory => eventcategory.name === event.displayEventCode);\r\n\r\n if (!existingcategory) {\r\n existingcategory = {\r\n id: event.EventCode,\r\n name: event.displayEventCode,\r\n count: 0,\r\n events: [],\r\n icon: this.cameraService.getIconForEvent(event.displayEventCode),\r\n color: {\r\n solidColour: this.colourService.getVigetColor(event.EventCode, numPossibleVideoEvents),\r\n description: \"\"\r\n }\r\n }\r\n\r\n if (!existingcategory.color.solidColour) {\r\n existingcategory.color.solidColour = \"#adadad\"; // solid colour of rgba(0, 0, 0, 0.3)\r\n }\r\n\r\n this.eventCategories.push(existingcategory);\r\n }\r\n\r\n event.eventCategory = existingcategory;\r\n event.color = existingcategory.color;\r\n\r\n existingcategory.events.push(event);\r\n existingcategory.count = existingcategory.events.length;\r\n });\r\n }\r\n\r\n private addVideoEntryToCurrentEntries(video: IVideoEntry): void {\r\n this.videoEvents = [\r\n ...this.videoEvents.filter(e => e.Id !== video.Id),\r\n video\r\n ];\r\n\r\n this.createTableRows();\r\n }\r\n\r\n private createTableRows(): void {\r\n this.tableRows = this.vTableService.createTableRows(this.videoEvents, this.tableColumns);\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: 'Common.Time', minTableWidth: 700, sorted: true, sortDirection: SortDirection.Descending }),\r\n createCellFunction: (event) => this.vTableService.createDateCell(event.VideoStartTime)\r\n },\r\n {\r\n header: this.vTableService.createVehicleTableHeader(),\r\n createCellFunction: (event) => this.vTableService.createVehicleRegCell(event.vehicle)\r\n }, \r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'Common.Driver' }),\r\n createCellFunction: (event) => {\r\n return this.vTableService.createTableCell(\r\n event.driver?.DisplayName || \"--\",\r\n {\r\n classes: !event.driver ? 'text-muted' : '',\r\n component: VideoDriverAssignmentComponent,\r\n componentInputs: {\r\n videoEntry: event\r\n }\r\n })\r\n }\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Event\", width: 140, minTableWidth: 400 }),\r\n createCellFunction: (event) => this.vTableService.createTableCell(event.displayEventCode)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"VideoEventList.Risk\", width: 100, minTableWidth: 700 }),\r\n createCellFunction: (event) => this.vTableService.createEnumCell(VideoEventRisk, \"VideoEventRisk\", this.videoEventCodeService.getEventRisk(event.EventCode))\r\n\r\n },\r\n {\r\n header: this.vTableService.createLocationInformationHeader({ minTableWidth: 700, width: null }),\r\n createCellFunction: (event) => this.vTableService.createTableCell(event, { exportDataMethod: () => this.exportVideoEntryLocationMethod(event), component: VideoAddressComponent, componentInputs: { videoEntry: event } })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Videos.Download\", minTableWidth: 950, width: 110 }),\r\n createCellFunction: (event) => {\r\n\r\n const autoDownload = event.MetaData?.AuditLogs?.[0]?.includes(\"Auto Download\") ?? false;\r\n\r\n if (VideoEntryUtils.isDeleted(event)) {\r\n return this.vTableService.createVideoDownloadStatusCell(this.translationService.t(\"VideoEventList.Deleted\"), autoDownload);\r\n }\r\n\r\n if (event.Status === VideoStatus.Archived) {\r\n return this.vTableService.createVideoDownloadStatusCell(this.translationService.t(\"VideoEventList.Archived\"), autoDownload);\r\n }\r\n\r\n if (VideoEntryUtils.isDownloaded(event)) {\r\n return this.vTableService.createVideoDownloadStatusCell(this.translationService.t(\"VideoEventList.Complete\"), autoDownload);\r\n }\r\n\r\n if (VideoEntryUtils.isDownloading(event)) {\r\n return this.vTableService.createTableCell(event.MetaData?.DownloadProgress, { component: VProgressBar, componentInputs: { palette: ProgressColourPalette.RAG, percentage: event.MetaData?.DownloadProgress } })\r\n }\r\n\r\n if (VideoEntryUtils.isRequested(event)) {\r\n return this.vTableService.createVideoDownloadStatusCell(this.translationService.t(\"cameraService.Requested\"), autoDownload);\r\n }\r\n\r\n return this.vTableService.createTableCell(null)\r\n }\r\n }\r\n ];\r\n }\r\n\r\n private exportVideoEntryLocationMethod(videoEntry: IVideoEntry): Promise {\r\n return new Promise((resolve, reject) => {\r\n if (!videoEntry) {\r\n return resolve(\"N/A\")\r\n }\r\n\r\n if (videoEntry.GeocodedAddressId) {\r\n return resolve(videoEntry.PlaceName);\r\n }\r\n\r\n return this.geocodeService.getLocationInformationFromVideo(videoEntry.Id).then(location => {\r\n return resolve(location.LocationDescription);\r\n }).catch((error) => {\r\n console.error(\"Error retrieving location: \", error);\r\n\r\n return resolve(\"\")\r\n });\r\n })\r\n\r\n }\r\n\r\n private createTabs(): void {\r\n this.filterTabs = [];\r\n\r\n this.createTabDefinition('VideoEventList.AllEvents', v => VideoEntryUtils.isEventAndActive(v) && v.Status != VideoStatus.Restricted && v.EventCode != VideoEventCode.Unknown && v.EventCode != VideoEventCode.Exception);\r\n this.createTabDefinition('VideoEventList.RestrictedEvents', v => VideoEntryUtils.isEventAndActive(v) && v.Status == VideoStatus.Restricted && v.EventCode != VideoEventCode.Unknown && v.EventCode != VideoEventCode.Exception);\r\n this.createTabDefinition('VideoEventList.Downloaded', v => v.Status == VideoStatus.Downloaded);\r\n this.createTabDefinition('VideoEventList.ArchivedEvents', v => v.Status == VideoStatus.Archived);\r\n }\r\n\r\n private createTabDefinition(translationString: string, callback: (video: IVideoEntry) => boolean): void {\r\n this.filterTabs.push({ title: this.translationService.t(translationString), predicate: callback });\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { VideoEventCode } from \"../enums/VideoEventCode\";\r\nimport { VideoEventRisk } from \"../enums/VideoEventRisk\";\r\nimport { VideoReviewStatus } from \"../enums/VideoReviewStatus.enum\";\r\nimport { VideoStatus } from \"../enums/VideoStatus\";\r\nimport { IVideoEntry } from \"../models/IVideoEntry\";\r\nimport { VideoEventCodeGroups } from \"../utils/video-event-code-groups\";\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class VideoEventCodeService {\r\n getEventRisk(eventCode: VideoEventCode): VideoEventRisk {\r\n if (VideoEventCodeGroups.lowRiskCodes.includes(eventCode)) {\r\n return VideoEventRisk.Low;\r\n }\r\n if (VideoEventCodeGroups.mediumRiskCodes.includes(eventCode)) {\r\n return VideoEventRisk.Medium;\r\n }\r\n if (VideoEventCodeGroups.highRiskCodes.includes(eventCode)) {\r\n return VideoEventRisk.High;\r\n }\r\n if (VideoEventCodeGroups.urgentRiskCodes.includes(eventCode)) {\r\n return VideoEventRisk.Urgent;\r\n }\r\n\r\n return VideoEventRisk.None;\r\n }\r\n\r\n isDmsEvent(eventCode: VideoEventCode): boolean {\r\n return VideoEventCodeGroups.dmsEventCodes.includes(eventCode)\r\n }\r\n\r\n isAdasEvent(eventCode: VideoEventCode) {\r\n return VideoEventCodeGroups.adasEventCodes.includes(eventCode)\r\n }\r\n\r\n isMinorEvent(videoEvent: IVideoEntry): boolean {\r\n if (videoEvent.Status === VideoStatus.Downloaded) {\r\n return false;\r\n }\r\n\r\n if (videoEvent.reviewStatus !== VideoReviewStatus.NeedsReview) {\r\n return false;\r\n }\r\n\r\n switch (videoEvent.EventCode) {\r\n case VideoEventCode.LowShock:\r\n case VideoEventCode.MediumShock:\r\n case VideoEventCode.Unknown:\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n}","import { Component, Input, OnChanges, OnDestroy, OnInit } from \"@angular/core\";\r\nimport { IGetVideoEntryOptions } from \"@app/main/components/videos/models/IGetVideoEntryOptions\";\r\nimport { VideoEntryService } from \"@app/main/components/videos/services/video-entry.service\";\r\nimport { VideoReviewService } from \"@app/main/components/videos/services/video-review.service\";\r\nimport { VideoEntryUtils } from \"@app/main/components/videos/utils/video-entry-utils\";\r\nimport { CameraDisplayService } from \"@components/videos/cameraDisplay.service\";\r\nimport { VideoStatus } from \"@components/videos/enums/VideoStatus\";\r\nimport { IVideoEntry } from \"@components/videos/models/IVideoEntry\";\r\nimport { IAggregateFilterEvent, IFilterBarTab } from \"@directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { DateRange } from \"@enums/DateRange.enum\";\r\nimport { ResourceType } from \"@enums/ResourceType\";\r\nimport { IDriver } from \"@interfaces/IDriver\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { ConstantsService } from \"@services/constantsService\";\r\nimport { IObservationCategory, ObservationsService } from \"@services/observations.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport * as angular from \"angular\";\r\nimport \"./video-list.component.scss\";\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: \"video-list\",\r\n template: require(\"./video-list.component.html\")\r\n})\r\nexport class VideoListComponent implements OnInit, OnChanges, OnDestroy {\r\n @Input() vehicle: IVehicle;\r\n @Input() driver: IDriver;\r\n\r\n // ---\r\n\r\n loading: boolean;\r\n hideResourceFilter: boolean;\r\n\r\n videos: IVideoEntry[] = [];\r\n displayVideos: IVideoEntry[] = [];\r\n\r\n accountVehicles: IVehicle[];\r\n\r\n defaultDateRange = DateRange.Latest7Days;\r\n filterEvent: IAggregateFilterEvent;\r\n\r\n filterTabs: IFilterBarTab[] = [];\r\n\r\n isMobile: boolean;\r\n observations: IObservationCategory[] = [];\r\n\r\n\r\n constructor(\r\n private readonly cameraDisplayService: CameraDisplayService,\r\n private readonly observationsService: ObservationsService,\r\n private readonly constantsService: ConstantsService,\r\n private readonly translationService: TranslationService,\r\n private readonly veriDate: VeriDate,\r\n private readonly videoReviewService: VideoReviewService,\r\n private readonly videoEntryService: VideoEntryService) {\r\n }\r\n\r\n ngOnInit() {\r\n this.setupListeners();\r\n this.createTabs();\r\n this.createDefaultDateRange();\r\n\r\n this.isMobile = this.constantsService.getIsMobile();\r\n\r\n if (this.isMobile) {\r\n this.hideResourceFilter = true;\r\n }\r\n\r\n this.observations = this.observationsService.getObservations();\r\n }\r\n\r\n ngOnChanges(onChangesObj: angular.IOnChangesObject) {\r\n if (onChangesObj[\"vehicle\"] || onChangesObj[\"driver\"]) {\r\n this.getVideos();\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.vehicle = null;\r\n this.driver = null;\r\n\r\n }\r\n\r\n playVideo(event: { videoEntry: IVideoEntry, $event: MouseEvent }) {\r\n this.cameraDisplayService.showVideoPlayer(event.videoEntry, event.$event)\r\n .then(result => {\r\n this.getVideos(result.requiresUpdate || result.statusChanged, false);\r\n });\r\n }\r\n\r\n onFilterChanged(event: IAggregateFilterEvent) {\r\n\r\n // We sometimes get weird events come through, need to understand why, until then this fixes a bug\r\n if (!event.trigger) {\r\n return;\r\n }\r\n\r\n this.filterEvent = event;\r\n\r\n if (this.filterEvent.trigger == \"date\") {\r\n this.getVideos(true);\r\n return;\r\n }\r\n\r\n this.filterVideos();\r\n }\r\n\r\n filterVideoBySearchText(v: IVideoEntry, text: string): boolean {\r\n if (v.vehicle.ShortReg.toLocaleLowerCase().indexOf(text) >= 0 || v.vehicle.Reg.toLocaleLowerCase().indexOf(text) >= 0) {\r\n return true;\r\n }\r\n\r\n if (v.driver?.Name.toLocaleLowerCase().indexOf(text) >= 0) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n filterVideoByObservation(v: IVideoEntry, observation: IObservationCategory): boolean {\r\n const foundObservation = v.MetaData?.VideoObservations.find(vc => vc == observation.observation);\r\n\r\n if (isNaN(foundObservation)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n observationSearchPredicate(o: IObservationCategory, searchText: string):boolean {\r\n return o.translation.toLocaleLowerCase().indexOf(searchText) >= 0;\r\n }\r\n\r\n // ---\r\n\r\n private createTabs(): void {\r\n this.filterTabs = [];\r\n\r\n this.createTabDefinition('videoList.navLabels.all', (v) => true);\r\n this.createTabDefinition('videoList.navLabels.new', v => VideoEntryUtils.isUnseen(v));\r\n this.createTabDefinition('videoList.navLabels.allBookmarks', v => v.MetaData?.Favourite?.length > 0);\r\n }\r\n\r\n private createTabDefinition(translationString: string, callback: (video: IVideoEntry) => boolean) {\r\n\r\n this.filterTabs.push({ title: this.translationService.t(translationString), predicate: callback });\r\n }\r\n\r\n private getVideos(invalidateCache = false, showLoadingIndicator = true): Promise {\r\n\r\n if (!this.filterEvent) {\r\n return;\r\n }\r\n\r\n var options: IGetVideoEntryOptions = {\r\n processEntries: true,\r\n downloadedOnly: true,\r\n invalidateCache: invalidateCache\r\n };\r\n\r\n if (this.vehicle || this.filterEvent.vehicle) {\r\n options.vehicleFilter = { vehicle: this.vehicle || this.filterEvent.vehicle };\r\n }\r\n\r\n if (this.driver || this.filterEvent.driver) {\r\n options.driverFilter = { driver: this.driver || this.filterEvent.driver };\r\n }\r\n\r\n if (this.driver || this.filterEvent.group) {\r\n options.groupFilter = { group: this.filterEvent.group, resourceType: ResourceType.Any };\r\n }\r\n\r\n this.loading = showLoadingIndicator;\r\n\r\n return this.videoEntryService.getVideosEntriesWithMappings(this.filterEvent.date[0], this.filterEvent.date[1], options)\r\n .then(videos => {\r\n this.videos = videos.filter(v => v.Status !== VideoStatus.Error && v.Status !== VideoStatus.Cancelled && v.Status !== VideoStatus.Archived && !VideoEntryUtils.hasNoFootage(v));\r\n\r\n this.filterVideos();\r\n })\r\n .catch((e) => {\r\n console.log(e);\r\n })\r\n .finally(() => {\r\n this.loading = false;\r\n });\r\n }\r\n\r\n private filterVideos() {\r\n this.displayVideos = this.filterEvent.filteredData;\r\n this.createDayBoundaries();\r\n }\r\n\r\n private createDayBoundaries() {\r\n // Create day boundaries\r\n var previousVideo: IVideoEntry;\r\n this.displayVideos.forEach(video => {\r\n (video as any).newDay = !previousVideo || !this.veriDate.createMoment(video.VideoStartTime).isSame(previousVideo.VideoStartTime, \"d\");\r\n\r\n previousVideo = video;\r\n });\r\n }\r\n\r\n private createDefaultDateRange() {\r\n var startEnd = this.veriDate.dateRangeFromEnum(this.defaultDateRange);\r\n\r\n this.filterEvent = { date: [startEnd.start, startEnd.end] };\r\n }\r\n\r\n private setupListeners() {\r\n\r\n this.videoReviewService.unseenVideoCountUpdated$.pipe(untilDestroyed(this)).subscribe(() => {\r\n this.getVideos(true, false);\r\n })\r\n\r\n this.videoReviewService.favouriteVideoCountUpdated$.pipe(untilDestroyed(this)).subscribe(() => {\r\n this.getVideos(true, false);\r\n })\r\n\r\n this.videoEntryService.downloadVideoCountUpdated$.pipe(untilDestroyed(this)).subscribe(() => {\r\n this.getVideos(false, false);\r\n });\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { IUser } from \"@app/interfaces/IUser\";\r\nimport { CurrentUserService } from \"@app/services/currentUser.service\";\r\nimport { DateService } from \"@app/services/date.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UsersService } from \"@app/services/users.service\";\r\nimport { Subject } from \"rxjs\";\r\nimport { VideoCoachingStatus } from \"../enums/VideoCoachingStatus.enum\";\r\nimport { VideoReviewStatus } from \"../enums/VideoReviewStatus.enum\";\r\nimport { VideoReviewSubStatus } from \"../enums/VideoReviewSubStatus.enum\";\r\nimport { IUserAction } from \"../models/IUserAction\";\r\nimport { IVideoEntry } from \"../models/IVideoEntry\";\r\nimport { IVideoMetaData } from \"../models/IVideoMetaData\";\r\nimport { IVideoTimelineEvent } from \"../models/IVideoTimelineEvent\";\r\nimport { VideoEntryService } from \"./video-entry.service\";\r\nimport { VideoReviewStatusService } from \"./video-review-status.service\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class VideoReviewService {\r\n private unseenVideoCountUpdatedSubject = new Subject();\r\n private favouriteVideoCountUpdatedSubject = new Subject();\r\n\r\n unseenVideoCountUpdated$ = this.unseenVideoCountUpdatedSubject.asObservable();\r\n favouriteVideoCountUpdated$ = this.favouriteVideoCountUpdatedSubject.asObservable();\r\n\r\n constructor(\r\n private readonly currentUserService: CurrentUserService,\r\n private readonly translationService: TranslationService,\r\n private readonly dateService: DateService,\r\n private readonly videoEntryService: VideoEntryService,\r\n private readonly usersService: UsersService,\r\n private readonly videoReviewStatusService: VideoReviewStatusService\r\n ) { }\r\n\r\n createVideoTimeline(videoEntry: IVideoEntry, users: IUser[]): IVideoTimelineEvent[] {\r\n const timeline: IVideoTimelineEvent[] = [];\r\n\r\n const checkIfExistAndAddToTimeline = (actions: IUserAction[], callback: (action: IUserAction) => IVideoTimelineEvent): void => {\r\n if (!actions) {\r\n return;\r\n }\r\n\r\n actions.forEach(a => {\r\n const userAction = callback(a);\r\n timeline.push(userAction);\r\n })\r\n }\r\n\r\n if (videoEntry.EventTimeUtc) {\r\n const event: IVideoTimelineEvent = {\r\n ActionDate: videoEntry.EventTimeUtc,\r\n displayText: this.translationService.t(\"cameraService.eventTime\"),\r\n icon: \"event_note\"\r\n }\r\n\r\n timeline.push(event);\r\n }\r\n\r\n if (videoEntry.MetaData.UserRequestedUploadDate || videoEntry.DateRequested) {\r\n const user = users.find(u => u.Id == videoEntry.RequestedBy);\r\n const comment = this.translationService.t(\"cameraService.requested\");\r\n const date = videoEntry.MetaData.UserRequestedUploadDate || videoEntry.DateRequested;\r\n const action = this.getUserAction(user, comment, date);\r\n\r\n timeline.push(action);\r\n }\r\n\r\n if (videoEntry.DateDownloaded) {\r\n const comment = this.translationService.t(\"cameraService.uploadedToCloud\");\r\n const date = videoEntry.DateDownloaded;\r\n const icon = \"cloud_done\";\r\n const action = this.getUserAction(null, comment, date, icon);\r\n\r\n timeline.push(action);\r\n }\r\n\r\n checkIfExistAndAddToTimeline(videoEntry.MetaData.Watched, (action) => this.findUserAndGetUserAction(action, users, \"visibility\"));\r\n checkIfExistAndAddToTimeline(videoEntry.MetaData.Authorised, (action) => this.findUserAndGetUserAction(action, users, \"done\"));\r\n checkIfExistAndAddToTimeline(videoEntry.MetaData.Favourite, (action) => this.findUserAndGetUserAction(action, users, \"favorite\"));\r\n\r\n checkIfExistAndAddToTimeline(videoEntry.MetaData.Notes, (action) => {\r\n const customDisplayText = this.translationService.t(`cameraService.addedComment`);\r\n return this.findUserAndGetUserAction(action, users, \"visibility\", true, customDisplayText);\r\n });\r\n\r\n timeline.sort((a, b) => this.dateService.sort(a.ActionDate, b.ActionDate));\r\n return timeline;\r\n }\r\n\r\n async setVideoReviewed(videoEntry: IVideoEntry, state: boolean): Promise {\r\n const user = await (this.currentUserService.getCurrentUser() as Promise)\r\n\r\n if (!videoEntry.MetaData.Authorised) {\r\n videoEntry.MetaData.Authorised = [];\r\n }\r\n\r\n let updateVideo: boolean;\r\n\r\n if (state) {\r\n const existingAction = this.isActionSetForUser(videoEntry.MetaData.Authorised, user);\r\n\r\n if (!existingAction) {\r\n const action = this.getUserAction(user, this.translationService.t('cameraService.viewed'));\r\n videoEntry.MetaData.Authorised.push(action);\r\n }\r\n\r\n updateVideo = !existingAction;\r\n } else {\r\n const actionIndex = videoEntry.MetaData.Authorised.findIndex(action => action.UserId === user.Id);\r\n\r\n if (actionIndex !== -1) {\r\n videoEntry.MetaData.Authorised.splice(actionIndex, 1);\r\n }\r\n\r\n updateVideo = actionIndex !== -1;\r\n }\r\n\r\n if (!updateVideo) {\r\n return videoEntry;\r\n }\r\n\r\n videoEntry.reviewed = state;\r\n \r\n return this.videoEntryService.updateVideoEntry(videoEntry);\r\n }\r\n\r\n getReviewStatusIcon(status: VideoReviewStatus): string {\r\n switch (status) {\r\n case VideoReviewStatus.Reviewed:\r\n return \"supervisor_account\";\r\n\r\n case VideoReviewStatus.Coached:\r\n case VideoReviewStatus.Reviewed:\r\n return \"playlist_add_check\";\r\n\r\n default:\r\n return \"edit_note\";\r\n }\r\n }\r\n\r\n async markVideoAsWatched(videoEntry: IVideoEntry): Promise {\r\n if (videoEntry.watched) {\r\n return videoEntry;\r\n }\r\n\r\n const user = await (this.currentUserService.getCurrentUser() as Promise)\r\n\r\n if (!videoEntry.MetaData.Watched) {\r\n videoEntry.MetaData.Watched = [];\r\n }\r\n\r\n const action = this.getUniqueUserAction(videoEntry.MetaData.Watched, user, this.translationService.t('cameraService.viewed'));\r\n\r\n if (!action) {\r\n return videoEntry;\r\n }\r\n\r\n videoEntry.MetaData.Watched.push(action);\r\n videoEntry.watched = true;\r\n\r\n const result = await this.videoEntryService.updateVideoEntry(videoEntry);\r\n this.unseenVideoCountUpdatedSubject.next();\r\n\r\n return result;\r\n }\r\n\r\n async setVideoFavourite(videoEntry: IVideoEntry, state: boolean): Promise {\r\n const user = await (this.currentUserService.getCurrentUser() as Promise)\r\n\r\n if (!videoEntry.MetaData.Favourite) {\r\n videoEntry.MetaData.Favourite = [];\r\n }\r\n\r\n let updateVideo: boolean;\r\n\r\n if (state) {\r\n const existingAction = this.isActionSetForUser(videoEntry.MetaData.Favourite, user);\r\n\r\n if (!existingAction) {\r\n const action = this.getUserAction(user, this.translationService.t('cameraService.favourited'));\r\n videoEntry.MetaData.Favourite.push(action);\r\n }\r\n\r\n updateVideo = !existingAction;\r\n } else {\r\n const actionIndex = videoEntry.MetaData.Favourite.findIndex(action => action.UserId === user.Id);\r\n\r\n if (actionIndex !== -1) {\r\n videoEntry.MetaData.Favourite.splice(actionIndex, 1);\r\n }\r\n\r\n updateVideo = actionIndex !== -1;\r\n }\r\n\r\n if (!updateVideo) {\r\n return videoEntry;\r\n }\r\n\r\n videoEntry.favourite = videoEntry.MetaData.Favourite.some(f => f.UserId === user.Id);\r\n videoEntry.companyFavourite = videoEntry.MetaData.Favourite.length > 0;\r\n\r\n return await this.videoEntryService.updateVideoEntry(videoEntry);\r\n }\r\n\r\n async addNoteToVideo(videoEntry: IVideoEntry, noteToAdd: IUserAction): Promise {\r\n noteToAdd.Status = videoEntry.reviewStatus;\r\n noteToAdd.CoachingStatus = videoEntry.coachingStatus;\r\n noteToAdd.ReviewStatus = videoEntry.reviewSubStatus;\r\n noteToAdd.statusDisplayValue = this.videoReviewStatusService.getVideoReviewStatusDisplayValue(videoEntry);\r\n\r\n if (!videoEntry.MetaData.Notes) {\r\n videoEntry.MetaData.Watched = [];\r\n }\r\n\r\n videoEntry.MetaData.Notes.push(noteToAdd);\r\n return await this.videoEntryService.updateVideoEntry(videoEntry);\r\n }\r\n\r\n async mapMetaDataNotesToUsers(metaData: IVideoMetaData): Promise {\r\n const users = await this.usersService.getUsers({includeAdmins: true});\r\n\r\n metaData.Notes.forEach(note => {\r\n note.user = this.usersService.findUser(users, note.UserId);\r\n });\r\n }\r\n\r\n private getUniqueUserAction(userActions: IUserAction[], user: IUser, comment: string): IVideoTimelineEvent {\r\n const existingAction = this.isActionSetForUser(userActions, user);\r\n return existingAction ? null : this.getUserAction( user, comment);\r\n }\r\n\r\n private getUserAction(\r\n user: IUser,\r\n comment: string,\r\n date: Date = null,\r\n icon: string = null,\r\n reviewStatus: VideoReviewStatus = VideoReviewStatus.NeedsReview,\r\n reviewSubStatus: VideoReviewSubStatus = VideoReviewSubStatus.None,\r\n coachingStatus: VideoCoachingStatus = VideoCoachingStatus.None,\r\n note = false,\r\n customDisplayText: string = null\r\n ): IVideoTimelineEvent {\r\n date = date || new Date();\r\n return {\r\n UserId: user && user.Id,\r\n ActionDate: date,\r\n Comment: comment,\r\n Status: reviewStatus,\r\n ReviewStatus: reviewSubStatus,\r\n CoachingStatus: coachingStatus,\r\n statusDisplayValue: this.videoReviewStatusService.getReviewStatusDisplayValue(reviewStatus, reviewSubStatus, coachingStatus),\r\n\r\n displayText: (customDisplayText || comment),\r\n icon: icon,\r\n user: user,\r\n note: note\r\n }\r\n }\r\n\r\n private findUserAndGetUserAction(\r\n action: IUserAction,\r\n users: IUser[],\r\n icon = \"\",\r\n note = false,\r\n customDisplayText: string = null\r\n ): IVideoTimelineEvent {\r\n const user = users.find(u => u.Id == action.UserId);\r\n const date = new Date(action.ActionDate)\r\n\r\n return this.getUserAction(\r\n user,\r\n action.Comment,\r\n date,\r\n icon,\r\n action.Status,\r\n action.ReviewStatus,\r\n action.CoachingStatus,\r\n note,\r\n customDisplayText);\r\n }\r\n\r\n\r\n private isActionSetForUser(userActions: IUserAction[], user: IUser): boolean {\r\n for (let i = 0; i < userActions.length; i++) {\r\n const watched = userActions[i];\r\n if (user.Id === watched.UserId) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { getOptionsQueryParams } from \"@app/class/Utilities\";\r\nimport { SignalRService, WebSocketEvents } from \"@app/main/modules/foundation/_routes/developerConsole/signalr.service\";\r\nimport { Observable, Subject } from \"rxjs\";\r\nimport { map } from \"rxjs/operators\";\r\nimport { CameraDiagnosticRecordType } from \"../_enums/CameraDiagnosticRecordType\";\r\nimport { ICameraDiagnosticRecord } from \"../_models/ICameraDiagnosticRecord\";\r\nimport { ICameraDiagnosticRecordQueryOptions } from \"../_models/ICameraDiagnosticRecordQueryOptions\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CameraEventService {\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly signalRService: SignalRService) { }\r\n\r\n diagMessageReceived = new Subject();\r\n\r\n getIncomingDiagMessages(serial: string): Observable {\r\n this.signalRService.initialise().then(() => {\r\n this.signalRService.joinDeviceGroup(serial);\r\n this.signalRService.registerEvents(WebSocketEvents.DiagnosticPacketUpdate, this.diagMessageReceived);\r\n });\r\n\r\n return this.diagMessageReceived;\r\n }\r\n\r\n getCameraEvents(options: ICameraDiagnosticRecordQueryOptions): Observable {\r\n const params = getOptionsQueryParams(options);\r\n\r\n return this.http.get(`/api/cameras/commserver/diagnosticrecords`, params).pipe(\r\n map(events => {\r\n return this.parseEventPayloads(events);\r\n })\r\n );\r\n }\r\n\r\n getGPSCameraEvents(options: ICameraDiagnosticRecordQueryOptions): Observable {\r\n options.RecordType = CameraDiagnosticRecordType.Gps;\r\n const params = getOptionsQueryParams(options);\r\n\r\n return this.http.get(`/api/cameras/commserver/diagnosticrecords`, params).pipe(\r\n map(events => {\r\n return this.parseEventPayloads(events);\r\n })\r\n );\r\n }\r\n\r\n private parseEventPayloads(events: ICameraDiagnosticRecord[]): ICameraDiagnosticRecord[] {\r\n return events.map(event => {\r\n event.parsedPayload = JSON.parse(event.PayloadJson);\r\n return event;\r\n })\r\n }\r\n}\r\n","import { ChangeDetectorRef, Component, Input } from \"@angular/core\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { DateRange } from \"@app/enum/DateRange.enum\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { ILogRequestUpdateMessage } from \"@app/main/modules/foundation/_routes/developerConsole/log-message.model\";\r\nimport { CameraLogService } from \"@app/main/modules/foundation/_routes/hardware/peripherals/camera-logs/camera-logs.service\";\r\nimport { CommServerRequestState } from \"@app/main/modules/foundation/_routes/hardware/_enums/CommServerRequestState\";\r\nimport { ICameraLogFile, ILogRequest } from \"@app/main/modules/foundation/_routes/hardware/_models/ILogRequest\";\r\nimport { DateService, DateUnit } from \"@app/services/date.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { forkJoin, Subject } from \"rxjs\";\r\nimport { mergeMap, tap } from \"rxjs/operators\";\r\nimport './camera-logs.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'camera-logs',\r\n template: require('./camera-logs.component.html')\r\n})\r\nexport class CameraLogsComponent {\r\n @Input() serial: string;\r\n\r\n logRequests: ILogRequest[];\r\n logFiles: ICameraLogFile[] = [];\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n requestStartDate: Date = new Date();\r\n defaultDateRange: DateRange = DateRange.Latest4Weeks;\r\n loading: boolean;\r\n\r\n requestHour: number = 0;\r\n requestMinute: number = 0;\r\n requestSecond: number = 0;\r\n requestDuration: number = 10;\r\n\r\n private endSubscription$: Subject = new Subject();\r\n\r\n showDetailsSidebar: boolean;\r\n showCreateRequestSidebar: boolean;\r\n\r\n fileContentDictionary: { [logRequestId: number]: ICameraLogFile[] } = {};\r\n logRequestIdKey: number;\r\n\r\n constructor(\r\n private readonly cd: ChangeDetectorRef,\r\n private readonly logService: CameraLogService,\r\n private readonly vTableService: VTableService,\r\n private readonly dateService: DateService,\r\n private readonly translationService: TranslationService) { }\r\n\r\n ngOnInit(): void {\r\n this.initialise();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.endSubscription$.next();\r\n this.endSubscription$ = null;\r\n }\r\n\r\n get logRequestFileCount(): number {\r\n return this.logRequests.find(r => r.Id == this.logRequestIdKey).FileCount;\r\n }\r\n\r\n onRowClicked(row: IVTableRow): void {\r\n this.logRequestIdKey = row.data.Id\r\n this.showDetailsSidebar = true;\r\n }\r\n\r\n onDetailClose(): void {\r\n this.showDetailsSidebar = false;\r\n }\r\n\r\n // Not translated as these are proper nouns in the P100 world\r\n getFileTypeString(fileName: string): string {\r\n if (fileName.indexOf(\"TELEMATICS_LOGS\") > -1) {\r\n return this.translationService.t(\"CameraLogs.Telematics\");\r\n } else if (fileName.indexOf(\"UPDATER_LOGS\") > -1) {\r\n return this.translationService.t(\"CameraLogs.Updater\");\r\n } else if (fileName.indexOf(\"SDCARD_FILE_TREE\") > -1) {\r\n return this.translationService.t(\"CameraLogs.SdCardTree\");\r\n } else {\r\n return this.translationService.t(\"CameraLogs.UnknownFileType\");\r\n }\r\n }\r\n\r\n downloadFile(cameraLogFile: ICameraLogFile): void {\r\n const localFile = new Blob([cameraLogFile.FileContent], { type: \"text/plain\" });\r\n\r\n const link = document.createElement(\"a\");\r\n link.href = URL.createObjectURL(localFile);\r\n link.download = cameraLogFile.FileName;\r\n link.click();\r\n link.remove();\r\n }\r\n\r\n // request methods\r\n toggleCreateRequestSidebar(): void {\r\n this.showCreateRequestSidebar = !this.showCreateRequestSidebar;\r\n }\r\n\r\n onDateChanged($event: Date): void {\r\n this.requestStartDate = $event;\r\n\r\n this.onSelectedTimeChanged();\r\n }\r\n\r\n onSelectedTimeChanged(): void {\r\n const hoursDate = new Date(this.requestStartDate).setHours(this.requestHour);\r\n const minuteDate = new Date(hoursDate).setMinutes(this.requestMinute);\r\n const secondDate = new Date(minuteDate).setSeconds(this.requestSecond);\r\n\r\n this.requestStartDate = new Date(secondDate);\r\n }\r\n\r\n requestLogs(): void {\r\n const newLogRequest: ILogRequest = {\r\n Id: 0,\r\n RequestState: CommServerRequestState.Pending,\r\n StartTime: this.requestStartDate,\r\n EndTime: this.dateService.addOrSubtractTime(this.requestStartDate, this.requestDuration, DateUnit.Min),\r\n Serial: this.serial,\r\n RequestTime: new Date(),\r\n FileCount: 0\r\n }\r\n\r\n this.logService.createLogRequest(newLogRequest).pipe(untilDestroyed(this), tap(logRequest => {\r\n if (!this.logRequests) {\r\n this.logRequests = [logRequest];\r\n } else {\r\n this.logRequests.push(logRequest);\r\n }\r\n\r\n\r\n this.createLogRequestTableRows();\r\n this.toggleCreateRequestSidebar();\r\n })).subscribe();\r\n }\r\n\r\n //--\r\n\r\n private initialise(): void {\r\n this.createTableColumns();\r\n this.getLogRequests();\r\n }\r\n\r\n private getLogRequests(): void {\r\n this.loading = true;\r\n this.endSubscription$.next();\r\n\r\n forkJoin({\r\n logRequests: this.logService.getLogRequests({ Serial: this.serial }),\r\n logFiles: this.logService.getLogFiles({ Serial: this.serial })\r\n }).pipe(\r\n untilDestroyed(this),\r\n mergeMap(data => {\r\n this.logRequests = data.logRequests;\r\n this.logFiles = data.logFiles;\r\n this.fileContentDictionary = data.logFiles.reduce((requestId, currentFile) => {\r\n\r\n if (requestId[currentFile.LogRequestId]) {\r\n requestId[currentFile.LogRequestId].push(currentFile);\r\n } else {\r\n requestId[currentFile.LogRequestId] = [currentFile];\r\n }\r\n\r\n return requestId;\r\n }, {} as { [logRequestId: number]: ICameraLogFile[] })\r\n\r\n this.createLogRequestTableRows();\r\n this.loading = false;\r\n\r\n return this.logService.getLogRequestUpdates(this.serial);\r\n }),\r\n tap(message => {\r\n this.updateRequestStatus(message);\r\n })\r\n ).subscribe();\r\n }\r\n\r\n private updateRequestStatus(logRequestMessage: ILogRequestUpdateMessage): void {\r\n const logRequestToUpdate = this.logRequests?.find(r => r.Id == logRequestMessage.RequestId);\r\n\r\n if (logRequestToUpdate === undefined) {\r\n return;\r\n }\r\n\r\n logRequestToUpdate.RequestState = logRequestMessage.CommServerRequestState;\r\n\r\n if (logRequestMessage.FileName?.length) {\r\n this.logFiles.push({\r\n FileName: logRequestMessage.FileName,\r\n FileContent: logRequestMessage.FileContent,\r\n LogRequestId: logRequestMessage.RequestId\r\n })\r\n }\r\n\r\n if (!!logRequestMessage.FileCount) {\r\n logRequestToUpdate.FileCount = logRequestMessage.FileCount;\r\n }\r\n\r\n if (!!logRequestMessage.SentTime) {\r\n logRequestToUpdate.SentTime = logRequestMessage.SentTime;\r\n }\r\n\r\n this.fileContentDictionary = this.logFiles.reduce((requestId, currentFile) => {\r\n\r\n if (requestId[currentFile.LogRequestId]) {\r\n requestId[currentFile.LogRequestId].push(currentFile);\r\n } else {\r\n requestId[currentFile.LogRequestId] = [currentFile];\r\n }\r\n\r\n return requestId;\r\n }, {} as { [logRequestId: number]: ICameraLogFile[] })\r\n\r\n this.createLogRequestTableRows();\r\n this.cd.detectChanges();\r\n }\r\n\r\n private createTableColumns(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"Common.Start\", sorted: true, sortDirection: SortDirection.Descending }),\r\n createCellFunction: logRequest => this.vTableService.createDateCell(logRequest.StartTime)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"Common.End\" }),\r\n createCellFunction: logRequest => this.vTableService.createDateCell(logRequest.EndTime)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: \"Log Duration\" }),\r\n createCellFunction: logRequest => this.vTableService.createDurationCell(this.dateService.getDiff(logRequest.StartTime, logRequest.EndTime, DateUnit.Min), DateUnit.Min)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Status\" }),\r\n createCellFunction: logRequest => this.vTableService.createEnumCell(CommServerRequestState, 'CommServerRequestState', logRequest.RequestState)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"cameraService.Requested\" }),\r\n createCellFunction: logRequest => this.vTableService.createDateCell(logRequest.RequestTime)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"CameraLogs.Sent\" }),\r\n createCellFunction: logRequest => this.vTableService.createDateCell(logRequest.SentTime)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"CameraLogs.FileCount\" }),\r\n createCellFunction: logRequest => this.vTableService.createTableCell(logRequest.FileCount)\r\n }\r\n ]\r\n }\r\n\r\n private createLogRequestTableRows(): void {\r\n this.tableRows = this.vTableService.createTableRows(this.logRequests, this.tableColumns);\r\n }\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { getOptionsQueryParams } from \"@app/class/Utilities\";\r\nimport { IVideoChannelMedia } from \"@app/main/components/videos/models/IVideoChannelMedia\";\r\nimport { IVideoEntry } from \"@app/main/components/videos/models/IVideoEntry\";\r\nimport { IVideoEventQueryOptions } from \"@app/main/components/videos/models/IVideoEventQueryOptions\";\r\nimport { IVideoQueryOptions } from \"@app/main/components/videos/models/IVideoQueryOptions\";\r\nimport { ConstantsService } from \"@app/services/constantsService\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { map } from \"rxjs/operators\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FoundationVideoService {\r\n private apiUrl: string;\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly constantsService: ConstantsService) {\r\n this.apiUrl = this.constantsService.getApiUrl();\r\n }\r\n\r\n getVideoEntries(options: IVideoEventQueryOptions = {}): Observable {\r\n const params = getOptionsQueryParams(options);\r\n\r\n return this.http.get(`/api/cameras/videoentries`, params).pipe(\r\n map(videos => {\r\n return this.setPrimaryChannel(videos);\r\n }));\r\n };\r\n\r\n getChannelMedia(options: IVideoQueryOptions): Observable {\r\n const params = getOptionsQueryParams(options);\r\n\r\n return this.http.get(`/api/cameras/channelmedia`, params);\r\n }\r\n\r\n //--\r\n\r\n private setPrimaryChannel(videos: IVideoEntry[]): IVideoEntry[] {\r\n videos.forEach(video => {\r\n video.channelMedia = [];\r\n\r\n if (!video.ThumbnailFileGuid && !video.Mp4VideoFileGuid) {\r\n return;\r\n }\r\n\r\n video.channelMedia.push({\r\n ChannelId: 0, // Aka primary\r\n thumbnailUrl: `${this.apiUrl}/api/cameras/media/${video.ThumbnailFileGuid}`,\r\n ThumbnailFileGuid: video.ThumbnailFileGuid,\r\n mp4VideoUrl: `${this.apiUrl}/api/cameras/media/${video.Mp4VideoFileGuid}`,\r\n Mp4VideoFileGuid: video.Mp4VideoFileGuid,\r\n mainChannel: true,\r\n })\r\n })\r\n\r\n return videos;\r\n }\r\n}\r\n","import { Component, OnInit, ViewChild } from '@angular/core';\r\nimport { VTabComponent } from '@app/directives/_layout/v-tabs/v-tab.component';\r\nimport { VTabsComponent } from '@app/directives/_layout/v-tabs/v-tabs.component';\r\nimport { IPeripheral } from '@app/interfaces/IPeripheral';\r\nimport { CameraChannelsEditorComponent } from '@app/main/components/resourceManagement/cameras/camera-channels-editor/camera-channels-editor.component';\r\nimport { ProductVendor } from '@app/main/components/videos/enums/CameraProductType';\r\nimport { FoundationNavigationModule } from '@app/main/modules/foundation/foundation.navigation';\r\nimport { CameraLogsComponent } from '@app/main/modules/foundation/_routes/hardware/peripherals/camera-logs/camera-logs.component';\r\nimport { CameraApplicationRequestService } from '@app/main/modules/foundation/_routes/rv-lite/application/_services/cameraApplicationRequestService';\r\nimport { IApplicationCameraRequest, IConfigCameraRequest } from '@app/main/modules/foundation/_routes/rv-lite/camera-config/camera-configuration.models';\r\nimport { CameraConfigurationRequestService } from '@app/main/modules/foundation/_routes/rv-lite/config/_services/cameraConfigurationRequestService';\r\nimport { PeripheralService } from '@app/main/modules/foundation/_services/peripheral.service';\r\nimport { CameraCommunicationServerService } from '@app/services/camera/camera-communication-server.service';\r\nimport { IConfigurationUpdate } from '@app/services/cameraCommunicationServer.service';\r\nimport { NavigationService } from '@app/services/navigation.service';\r\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\r\nimport { combineLatest, forkJoin, Observable } from 'rxjs';\r\nimport { map, mergeMap, tap } from 'rxjs/operators';\r\nimport { IFtCloudDeviceMetadataInfo } from '../../_models/IFtCloudDeviceMetadataPayload';\r\nimport { IPeripheralMetadata } from '../../_models/IPeripheralMetadata';\r\nimport './camera-view.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'camera-view',\r\n template: require('./camera-view.component.html')\r\n})\r\nexport class CameraViewComponent implements OnInit {\r\n cameraId: number;\r\n cameraSerial: string;\r\n camera: IPeripheral;\r\n\r\n deviceTypeId: number;\r\n deviceId: number;\r\n isAutoDeployment: boolean;\r\n currentConfigId: number;\r\n configHistoryData: IConfigurationUpdate[] = [];\r\n peripheralMetadata: IPeripheralMetadata;\r\n streamaxMetadata: IFtCloudDeviceMetadataInfo;\r\n\r\n selectedTab: VTabComponent;\r\n\r\n loading: boolean;\r\n saving: boolean;\r\n\r\n @ViewChild(\"channelsTab\") channelsTab: VTabComponent;\r\n @ViewChild(\"cameraChannelsEditor\") cameraChannelsEditor: CameraChannelsEditorComponent;\r\n\r\n @ViewChild(\"logsTab\") logsTab: VTabComponent;\r\n @ViewChild(\"cameraLogsViewer\") cameraLogsViewer: CameraLogsComponent;\r\n\r\n @ViewChild(VTabsComponent) tabs: VTabsComponent;\r\n\r\n constructor(\r\n private readonly cameraApplicationRequestService: CameraApplicationRequestService,\r\n private readonly cameraConfigurationRequestService: CameraConfigurationRequestService,\r\n private readonly cameraCommunicationServer: CameraCommunicationServerService,\r\n private readonly navigationService: NavigationService,\r\n private readonly peripheralService: PeripheralService) { }\r\n\r\n ngOnInit(): void {\r\n this.cameraSerial = this.navigationService.getRouteParam(\"serial\");\r\n this.loadData();\r\n }\r\n\r\n onSelectedTabChanged(tab: VTabComponent): void {\r\n this.selectedTab = tab;\r\n }\r\n\r\n saveChannels($event): void {\r\n this.saving = true;\r\n this.cameraChannelsEditor.saveChannels();\r\n }\r\n\r\n createLogRequest(): void {\r\n this.cameraLogsViewer.toggleCreateRequestSidebar();\r\n }\r\n\r\n onChannelsSaved(): void {\r\n this.navigationService.go(FoundationNavigationModule.Cameras, null, false);\r\n }\r\n\r\n selectChannelsTab(): void {\r\n this.tabs.selectTab(this.channelsTab);\r\n }\r\n\r\n get channelsTabSelected(): boolean {\r\n return this.selectedTab?.tabId == \"channels\"\r\n }\r\n\r\n get logsTabSelected(): boolean {\r\n return this.selectedTab?.tabId == \"logs\";\r\n }\r\n\r\n get hidePulseMessageTab(): boolean {\r\n return (!this.camera?.Product?.IsCameraProduct) || !(this.camera?.Product?.GroupId === ProductVendor.RTL);\r\n }\r\n\r\n get hidePeripheralJsonTab(): boolean {\r\n return (this.camera?.Product?.GroupId === ProductVendor.Streamax)\r\n }\r\n\r\n //--\r\n\r\n private loadData(): void {\r\n this.loading = true;\r\n combineLatest([\r\n this.getPeripheral(),\r\n this.getRtlConfigData(),\r\n this.getVeriConfigData(),\r\n this.getVeriAppData(),\r\n this.getPeripheralMetadata()\r\n ]).pipe(\r\n untilDestroyed(this))\r\n .subscribe({\r\n next: ([peripheral, rtlConfigData, veriConfigData, veriAppData, metaData]) => {\r\n this.camera.rtlConfigUpdateHistory = rtlConfigData;\r\n this.camera.veriAppUpdateHistory = veriAppData;\r\n this.camera.veriConfigUpdateHistory = veriConfigData;\r\n this.loading = false;\r\n }\r\n })\r\n }\r\n\r\n private getPeripheralMetadata(): Observable {\r\n return this.peripheralService.getPeripheralMetadata(this.cameraSerial).pipe(untilDestroyed(this), tap((metadata) => {\r\n this.peripheralMetadata = metadata;\r\n this.streamaxMetadata = !!metadata?.DeviceMetadataInfoJson?.length ? JSON.parse(metadata.DeviceMetadataInfoJson) as IFtCloudDeviceMetadataInfo : null;\r\n }));\r\n }\r\n\r\n private getPeripheral(): Observable {\r\n return this.peripheralService.getPeripheralBySerial(this.cameraSerial).pipe(map(peripheral => {\r\n this.camera = peripheral;\r\n\r\n if (!this.camera) {\r\n return;\r\n }\r\n\r\n this.navigationService.updateBreadcrumbNameResolver({\r\n peripheralNameBreadcrumbKey: this.camera?.name ?? \"Unknown\",\r\n });\r\n\r\n return peripheral;\r\n }));\r\n }\r\n\r\n private getVeriAppData(): Observable {\r\n return this.cameraApplicationRequestService.getApplicationRequests({ Serial: this.cameraSerial });\r\n }\r\n\r\n private getVeriConfigData(): Observable {\r\n return this.cameraConfigurationRequestService.getConfigurationRequests({ Serial: this.cameraSerial });\r\n }\r\n\r\n private getRtlConfigData(): Observable {\r\n return forkJoin({\r\n deviceInfo: this.cameraCommunicationServer.getDeviceInfo(this.cameraSerial),\r\n })\r\n .pipe(mergeMap(data => {\r\n this.deviceTypeId = data.deviceInfo?.DeviceTypeId;\r\n this.deviceId = data.deviceInfo?.DeviceId;\r\n this.isAutoDeployment = data.deviceInfo?.IsAutoDeployment;\r\n this.currentConfigId = data.deviceInfo?.ConfigId;\r\n var t = this.cameraApplicationRequestService.getApplicationRequests({ Serial: this.cameraSerial });\r\n return this.cameraCommunicationServer.getConfigurationUpdateHistory(this.deviceId);\r\n }));\r\n }\r\n}\r\n","import { Component, OnInit } from \"@angular/core\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { IFilterBarTab } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { FilterBarService } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.service\";\r\nimport { AccountFeatures } from \"@app/enum/account/AccountFeature\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { IPeripheral } from \"@app/interfaces/IPeripheral\";\r\nimport { ProductVendor } from \"@app/main/components/videos/enums/CameraProductType\";\r\nimport { ImportStrategyReference, ImportType } from \"@app/main/modules/foundation/foundation.enums\";\r\nimport { ICsvImportCompletionResultDTO } from \"@app/main/modules/foundation/foundation.interfaces\";\r\nimport { FoundationNavigationModule } from \"@app/main/modules/foundation/foundation.navigation\";\r\nimport { PeripheralService } from \"@app/main/modules/foundation/_services/peripheral.service\";\r\nimport { AccountFeatureService } from \"@app/services/accountFeature.service\";\r\nimport { NavigationService } from \"@app/services/navigation.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { finalize, tap } from \"rxjs/operators\";\r\nimport './peripheral-list.component.scss';\r\n\r\ninterface IProductVendor {\r\n name: string;\r\n value: number;\r\n}\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'peripheral-list',\r\n template: require('./peripheral-list.component.html')\r\n})\r\nexport class PeripheralListComponent implements OnInit {\r\n peripherals: IPeripheral[];\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n showDeviceImport: boolean;\r\n\r\n importStrategyRef = ImportStrategyReference.Device;\r\n importType = ImportType.Peripheral;\r\n loading: boolean;\r\n\r\n ProductVendor = ProductVendor;\r\n productVendors: IProductVendor[];\r\n\r\n filterTabs: IFilterBarTab[] = [];\r\n\r\n camerasView: boolean;\r\n\r\n importButtonString: string;\r\n\r\n constructor(\r\n private readonly accountFeatureService: AccountFeatureService,\r\n private readonly filterBarService: FilterBarService,\r\n private readonly navigationService: NavigationService,\r\n private readonly peripheralService: PeripheralService,\r\n private readonly translationService: TranslationService,\r\n private readonly vTableService: VTableService) { }\r\n\r\n ngOnInit(): void {\r\n this.setVendors();\r\n this.loadData();\r\n }\r\n\r\n onRowClicked(row: IVTableRow): void {\r\n const peripheral: IPeripheral = row.data;\r\n const viewName: string = this.camerasView ? `${FoundationNavigationModule.Cameras}.view` : `${FoundationNavigationModule.Peripherals}.view`;\r\n this.navigationService.go(viewName, {serial: peripheral.Serial })\r\n }\r\n\r\n addDevices(): void {\r\n this.showDeviceImport = true;\r\n }\r\n\r\n closeShowDeviceForm(): void {\r\n this.showDeviceImport = false;\r\n }\r\n\r\n filterPeripheralByVendor(peripheral: IPeripheral, vendor: IProductVendor): boolean {\r\n return peripheral.Product.GroupId === vendor.value;\r\n }\r\n\r\n vendorSearchPredicate(vendor: any, searchText: string): boolean {\r\n return vendor.name.toLowerCase().indexOf(searchText) >= 0;\r\n }\r\n\r\n onCsvModelsSaved(event: ICsvImportCompletionResultDTO) {\r\n this.loading = true;\r\n\r\n const newPeripherals = JSON.parse(event.CreatedModels) as IPeripheral[];\r\n this.peripherals.push(...newPeripherals);\r\n\r\n this.tableRows = this.vTableService.createTableRows(this.peripherals, this.tableColumns);\r\n\r\n this.loading = false;\r\n }\r\n\r\n //--\r\n\r\n private loadData(): void {\r\n this.importButtonString = this.translationService.t(\"FoundationPeripherals.ImportPlaceholder\");\r\n\r\n this.createTable();\r\n this.createTabs();\r\n this.loading = true;\r\n\r\n this.peripheralService.getAllPeripheralsWithMappings().pipe(\r\n untilDestroyed(this)\r\n ).subscribe({\r\n next: peripherals => {\r\n this.camerasView = this.navigationService.getLocation().split(\"/\").includes(\"cameras\");\r\n\r\n this.setImportButtonText();\r\n\r\n this.peripherals = peripherals.filter(peripheral => {\r\n // Catch for new Streamax products with no Features flag till we can update the database and add products in Foundation\r\n if (peripheral.Product?.GroupId === ProductVendor.Streamax || peripheral.Product?.GroupId === ProductVendor.AAMP) {\r\n return this.camerasView;\r\n }\r\n\r\n return this.accountFeatureService.featureFlagsHaveFeatureAccess(peripheral.Product?.Features, AccountFeatures.Camera) === this.camerasView;\r\n });\r\n\r\n this.tableRows = this.vTableService.createTableRows(peripherals, this.tableColumns);\r\n\r\n this.loading = false;\r\n }\r\n })\r\n }\r\n\r\n private setImportButtonText(): void {\r\n this.importButtonString = this.camerasView ?\r\n this.translationService.t(\"FoundationPeripherals.CameraImportButton\") :\r\n this.translationService.t(\"FoundationPeripherals.DeviceImport\");\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"FoundationHardware.Installed\", width: 150, minTableWidth: 400, sorted: true, sortDirection: SortDirection.Descending, sortType: SortType.Date }),\r\n createCellFunction: (peripheral) => this.vTableService.createDateCell(peripheral.vehicleMapping?.StartUtc)\r\n },\r\n {\r\n header: this.vTableService.createVehicleTableHeader(),\r\n createCellFunction: (peripheral) => this.vTableService.createVehicleRegCell(peripheral.vehicleMapping?.vehicle)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"FoundationHardware.Serial\", width: 150\r\n }),\r\n createCellFunction: (peripheral) => this.vTableService.createTableCell(peripheral.Serial)\r\n },\r\n\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"FoundationHardware.Name\", minTableWidth: 500 }),\r\n createCellFunction: (peripheral) => this.vTableService.createTableCell(peripheral.name)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"FoundationHardware.Vendor\", width: 150, minTableWidth: 450 }),\r\n createCellFunction: (peripheral) => this.vTableService.createTableCell(peripheral.productVendorString)\r\n }\r\n ]\r\n\r\n }\r\n\r\n private createTabs(): void {\r\n this.filterTabs = [];\r\n\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"Common.All\", (peripheral) => true));\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"Common.Installed\", (peripheral) => !!peripheral.vehicleMapping?.StartUtc));\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"Common.NotInstalled\", (peripheral) => !peripheral.vehicleMapping?.StartUtc));\r\n }\r\n\r\n private setVendors(): void {\r\n const vendorsList = Object.keys(ProductVendor).filter(s => !isNaN(Number(s)));\r\n this.productVendors = vendorsList.map(enumKey => {\r\n return {\r\n name: ProductVendor[enumKey],\r\n value: Number(enumKey)\r\n }\r\n });\r\n\r\n this.productVendors.sort((a, b) => {\r\n return a.name > b.name ? 1 : -1;\r\n })\r\n }\r\n}\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { IPeripheral } from '@app/interfaces/IPeripheral';\r\nimport { ProductVendor } from '@app/main/components/videos/enums/CameraProductType';\r\nimport { PeripheralService } from '@app/main/modules/foundation/_services/peripheral.service';\r\nimport { IConfigurationUpdate } from '@app/services/cameraCommunicationServer.service';\r\nimport { NavigationService } from '@app/services/navigation.service';\r\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\r\nimport { Observable } from 'rxjs';\r\nimport { finalize, tap } from 'rxjs/operators';\r\nimport './peripheral-view.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'peripheral-view',\r\n template: require('./peripheral-view.component.html')\r\n})\r\nexport class PeripheralViewComponent implements OnInit {\r\n peripheralId: number;\r\n peripheralSerial: string;\r\n peripheral: IPeripheral;\r\n\r\n deviceTypeId: number;\r\n deviceId: number;\r\n isAutoDeployment: boolean;\r\n currentConfigId: number;\r\n configHistoryData: IConfigurationUpdate[] = [];\r\n\r\n\r\n loading: boolean;\r\n saving: boolean;\r\n\r\n\r\n constructor(\r\n private readonly navigationService: NavigationService,\r\n private readonly peripheralService: PeripheralService) { }\r\n\r\n ngOnInit(): void {\r\n this.peripheralSerial = this.navigationService.getRouteParam(\"serial\");\r\n this.loadData();\r\n }\r\n\r\n get showSimTab(): boolean {\r\n return this.peripheral?.Product?.GroupId !== ProductVendor.TachoSys && this.peripheral?.Product?.GroupId !== ProductVendor.SevenTelematics;\r\n }\r\n\r\n //--\r\n\r\n private loadData(): void {\r\n this.loading = true;\r\n this.getPeripheral()\r\n .pipe(\r\n untilDestroyed(this))\r\n .subscribe({\r\n next: () => {\r\n this.loading = false;\r\n }\r\n })\r\n }\r\n\r\n private getPeripheral(): Observable {\r\n return this.peripheralService.getPeripheralBySerial(this.peripheralSerial).pipe(tap(peripheral => {\r\n this.peripheral = peripheral;\r\n\r\n if (!this.peripheral) {\r\n return;\r\n }\r\n\r\n this.navigationService.updateBreadcrumbNameResolver({\r\n peripheralNameBreadcrumbKey: this.peripheral.name,\r\n });\r\n }));\r\n }\r\n\r\n\r\n}\r\n","import { Component } from \"@angular/core\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { VerticalFilterItemCreationCallback } from \"@app/directives/_resourceFilters/vertical-filter-list/vertical-filter-list.component\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { ISim, SimStatus, SimType } from \"@app/interfaces/ISim\";\r\nimport { ISimMapping } from \"@app/interfaces/ISimMapping\";\r\nimport { SimService } from \"@app/main/modules/foundation/_services/sim.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport './sim-list.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'sim-list',\r\n template: require('./sim-list.component.html')\r\n})\r\nexport class SimListComponent {\r\n\r\n sims: ISim[];\r\n selectedSim: ISim;\r\n\r\n selectedSimCurrentMapping: ISimMapping;\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n loading: boolean;\r\n\r\n SimType = SimType;\r\n SimStatus = SimStatus;\r\n\r\n constructor(\r\n private readonly simService: SimService,\r\n private readonly translationService: TranslationService,\r\n private readonly vTableService: VTableService) { }\r\n\r\n ngOnInit(): void {\r\n this.createTables();\r\n this.getData();\r\n }\r\n\r\n onRowClicked(row: IVTableRow): void {\r\n this.selectedSim = row.data;\r\n }\r\n\r\n simTypeItemCreationCallback: VerticalFilterItemCreationCallback = (sim) => {\r\n return {\r\n name: this.translationService.tEnum(SimType, \"SimType\", sim.Type),\r\n icon: \"person\",\r\n data: sim,\r\n predicate: (s: ISim) => s.Type === sim.Type\r\n };\r\n }\r\n\r\n simStatusItemCreationCallback: VerticalFilterItemCreationCallback = (sim) => {\r\n return {\r\n name: this.translationService.tEnum(SimStatus, \"SimStatus\", sim.Status),\r\n icon: \"person\",\r\n data: sim,\r\n predicate: (s: ISim) => s.Status === sim.Status\r\n };\r\n }\r\n\r\n clearSelectedSim(): void {\r\n this.selectedSim = undefined;\r\n this.selectedSimCurrentMapping = undefined;\r\n }\r\n\r\n onSimMappingFound(mapping: ISimMapping): void {\r\n this.selectedSimCurrentMapping = mapping;\r\n }\r\n\r\n //--\r\n\r\n private createTables(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"FoundationSims.ICCID\", sorted: true, sortType: SortType.Number, sortDirection: SortDirection.Descending }),\r\n createCellFunction: sim => this.vTableService.createTableCell(sim.Iccid)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: \"Id\" }),\r\n createCellFunction: sim => this.vTableService.createTableCell(sim.Id)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"FoundationSims.Imsi\" }),\r\n createCellFunction: sim => this.vTableService.createTableCell(sim.Imsi)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Type\" }),\r\n createCellFunction: sim => this.vTableService.createEnumCell(SimType, \"SimType\", sim.Type)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Status\" }),\r\n createCellFunction: sim => this.vTableService.createEnumCell(SimStatus, \"SimStatus\", sim.Status)\r\n }\r\n ];\r\n\r\n }\r\n\r\n private createTableRows(): void {\r\n this.tableRows = this.vTableService.createTableRows(this.sims, this.tableColumns);\r\n }\r\n\r\n private getData(): void {\r\n this.loading = true;\r\n\r\n this.simService.getSims().pipe(\r\n untilDestroyed(this)\r\n ).subscribe({\r\n next: sims => {\r\n this.sims = sims;\r\n this.createTableRows();\r\n } ,\r\n complete: () => this.loading = false,\r\n error: () => this.loading = false\r\n })\r\n }\r\n\r\n \r\n}\r\n","import { Component, OnInit } from \"@angular/core\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { IFilterBarTab } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { FilterBarService } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.service\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { IUnit } from \"@app/interfaces/IPeripheral\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { ImportStrategyReference, ImportType } from \"@app/main/modules/foundation/foundation.enums\";\r\nimport { ICsvImportCompletionResultDTO } from \"@app/main/modules/foundation/foundation.interfaces\";\r\nimport { FoundationNavigationModule } from \"@app/main/modules/foundation/foundation.navigation\";\r\nimport { UnitsService } from \"@app/main/modules/foundation/_services/unit.service\";\r\nimport { NavigationService } from \"@app/services/navigation.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { finalize } from \"rxjs/operators\";\r\nimport './unit-list.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'unit-list',\r\n template: require('./unit-list.component.html')\r\n})\r\nexport class UnitListComponent implements OnInit {\r\n\r\n units: IUnit[];\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n vehicles: IVehicle[];\r\n\r\n loading: boolean;\r\n vehiclesLoading: boolean;\r\n\r\n showDeviceImport: boolean = false;\r\n importStrategyRef = ImportStrategyReference.Device;\r\n importType = ImportType.Unit;\r\n\r\n filterTabs: IFilterBarTab[] = [];\r\n\r\n constructor(\r\n private readonly filterBarService: FilterBarService,\r\n private readonly navigationService: NavigationService,\r\n private readonly translationService: TranslationService,\r\n private readonly unitService: UnitsService,\r\n private readonly vTableService: VTableService) {\r\n\r\n }\r\n\r\n ngOnInit(): void {\r\n this.loadData();\r\n }\r\n\r\n onRowClicked(row: IVTableRow): void {\r\n const unit: IUnit = row.data;\r\n this.navigationService.go(`${FoundationNavigationModule.Units}.view`, { unitSerial: unit.Serial })\r\n }\r\n\r\n addDevices(): void {\r\n this.showDeviceImport = true;\r\n }\r\n\r\n closeShowDeviceForm(): void {\r\n this.showDeviceImport = false;\r\n }\r\n\r\n onCsvModelsSaved(event: ICsvImportCompletionResultDTO) {\r\n this.loading = true;\r\n\r\n const newUnits = JSON.parse(event.CreatedModels) as IUnit[];\r\n this.units.push(...newUnits);\r\n\r\n this.tableRows = this.vTableService.createTableRows(this.units, this.tableColumns);\r\n\r\n this.loading = false;\r\n }\r\n\r\n //--\r\n\r\n private loadData(): void {\r\n this.loading = true;\r\n this.createTable();\r\n this.createTabs();\r\n\r\n this.unitService.getAllUnitsWithMappings().pipe(untilDestroyed(this), finalize(() => this.loading = false)).subscribe(units => {\r\n this.units = units;\r\n this.tableRows = this.vTableService.createTableRows(units, this.tableColumns);\r\n this.loading = false;\r\n })\r\n }\r\n\r\n private createTabs(): void {\r\n this.filterTabs = [];\r\n\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"Common.All\", (unit) => true));\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"Common.Installed\", (unit) => !!unit.vehicleMapping?.StartUtc));\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"Common.NotInstalled\", (unit) => !unit.vehicleMapping?.StartUtc));\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"FoundationHardware.Installed\", sorted: true, sortDirection: SortDirection.Descending, minTableWidth: 450, sortType: SortType.Date }),\r\n createCellFunction: (unit) => this.vTableService.createDateCell(unit.vehicleMapping?.StartUtc)\r\n },\r\n {\r\n header: this.vTableService.createVehicleTableHeader(),\r\n createCellFunction: (unit) => this.vTableService.createVehicleRegCell(unit.vehicleMapping?.vehicle)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"FoundationHardware.Serial\", width: 150\r\n }),\r\n createCellFunction: (unit) => this.vTableService.createTableCell(unit.Serial)\r\n },\r\n\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"FoundationHardware.Name\" }),\r\n createCellFunction: (unit) => this.vTableService.createTableCell(unit.name)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"FoundationHardware.IMEI\", width: 200, minTableWidth: 450 }),\r\n createCellFunction: (unit) => this.vTableService.createTableCell(unit.Imei)\r\n }\r\n\r\n ]\r\n }\r\n}\r\n","import { Component, Input, OnInit } from \"@angular/core\";\r\nimport { VTableRowStatus } from \"@app/directives/_layout/v-table/_enums/VTableRowStatus.enum\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { IAggregateFilterEvent } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { DateRange } from \"@app/enum/DateRange.enum\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { finalize } from \"rxjs/operators\";\r\nimport { IUnitLog, UnitLogService } from \"./unit-log.service\";\r\nimport \"./unit-logs.component.scss\";\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: \"unit-logs\",\r\n template: require(\"./unit-logs.component.html\")\r\n})\r\nexport class UnitLogsComponent implements OnInit {\r\n\r\n @Input() serial: string;\r\n\r\n loading = false;\r\n logs: IUnitLog[] = [];\r\n selectedLog: IUnitLog;\r\n\r\n defaultDateRange = DateRange.Last7Days;\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[] = [];\r\n\r\n filterEvent: IAggregateFilterEvent;\r\n\r\n constructor(\r\n private readonly unitLogService: UnitLogService,\r\n private readonly vTableService: VTableService) { }\r\n\r\n ngOnInit() {\r\n this.createTable();\r\n }\r\n\r\n onRowClicked(row: IVTableRow) {\r\n this.selectedLog = row.data;\r\n }\r\n\r\n onFilterChanged(event: IAggregateFilterEvent) {\r\n\r\n // We sometimes get weird events come through, need to understand why, until then this fixes a bug\r\n if (!event.trigger) {\r\n return;\r\n }\r\n\r\n this.filterEvent = event;\r\n\r\n if (this.filterEvent.trigger == \"date\") {\r\n this.getLogs();\r\n return;\r\n }\r\n }\r\n\r\n // ---\r\n\r\n private getLogs() {\r\n this.loading = true;\r\n\r\n this.unitLogService.getLogs({ serial: this.serial, start: this.filterEvent.date[0], end: this.filterEvent.date[1] })\r\n .pipe(\r\n untilDestroyed(this),\r\n finalize(() => this.loading = false))\r\n .subscribe(logs => {\r\n this.logs = logs;\r\n this.tableRows = this.vTableService.createTableRows(this.logs, this.tableColumns);\r\n });\r\n }\r\n\r\n private createTable(): void {\r\n\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createStatusTableHeader({ sorted: false }),\r\n createCellFunction: (log) => this.vTableService.createStatusCell(log.Errored ? VTableRowStatus.Error : VTableRowStatus.Info)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ sorted: true, tKey: \"Common.Time\", sortDirection: SortDirection.Descending }),\r\n createCellFunction: (log) => this.vTableService.createDateCell(new Date(log.Timestamp), {dateTime: true})\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: \"Processing Time\", width: 140 }),\r\n createCellFunction: (log) => this.vTableService.createTableCell(log.ProcessingTime + \"ms\")\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: \"Event Type\", width: 120 }),\r\n createCellFunction: (log) => this.vTableService.createTableCell(log.EventType)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: \"Host\", width: 150 }),\r\n createCellFunction: (log) => this.vTableService.createTableCell(log.HostDescription)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: \"Raw\" }),\r\n createCellFunction: (log) => this.vTableService.createTableCell(log.Raw)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: \"Error\" }),\r\n createCellFunction: (log) => this.vTableService.createTableCell(log.ErrorMessage)\r\n }\r\n ];\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { ProductVendor } from \"@app/main/components/videos/enums/CameraProductType\";\r\nimport { DateService } from \"@app/services/date.service\";\r\nimport { Observable } from \"rxjs\";\r\n\r\nexport interface IUnitLogRequestOptions {\r\n serial: string;\r\n start: Date;\r\n end: Date;\r\n}\r\n\r\nexport interface IUnitLog {\r\n Id: number;\r\n AccountId?: number;\r\n Serial: string;\r\n\r\n Timestamp: string;\r\n TimestampInserted: string\r\n\r\n Raw: string;\r\n HostDescription: string;\r\n EventType: string;\r\n\r\n ProcessingTime: number;\r\n\r\n ProductType: ProductVendor;\r\n\r\n Errored: boolean;\r\n ErrorMessage: string;\r\n}\r\n\r\n@Injectable()\r\nexport class UnitLogService {\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly dateService: DateService) {\r\n }\r\n\r\n getLogs(options: IUnitLogRequestOptions): Observable {\r\n\r\n const params = this.createHttpParams(options);\r\n\r\n var response = this.http.get(`/api/units/logs/${options.serial}`, { params: params });\r\n\r\n return response;\r\n }\r\n\r\n // ---\r\n\r\n private createHttpParams(options?: IUnitLogRequestOptions): HttpParams {\r\n let params = new HttpParams();\r\n\r\n if (!options) {\r\n return params;\r\n }\r\n\r\n if (options.start) {\r\n params = params.set(\"start\", options.start.toISOString())\r\n }\r\n\r\n if (options.end) {\r\n params = params.set(\"end\", options.end.toISOString())\r\n }\r\n\r\n return params;\r\n }\r\n}\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { VTabComponent } from '@app/directives/_layout/v-tabs/v-tab.component';\r\nimport { IAccountUnitMappingExtended } from '@app/interfaces/IAccountUnitMappingExtended';\r\nimport { IUnit } from '@app/interfaces/IPeripheral';\r\nimport { IVehicleUnitMapping } from '@app/interfaces/IVehiclePeripheralMapping';\r\nimport { UnitsService } from '@app/main/modules/foundation/_services/unit.service';\r\nimport { NavigationService } from '@app/services/navigation.service';\r\nimport { ResourceType } from \"@enums/ResourceType\";\r\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\r\nimport { HardwareMappingService } from '../../_services/hardware-mapping.service';\r\nimport './unit-view.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'unit-view',\r\n template: require('./unit-view.component.html')\r\n})\r\nexport class UnitViewComponent implements OnInit {\r\n unitSerial: string;\r\n unit: IUnit;\r\n vehicleMapping: IVehicleUnitMapping;\r\n\r\n accountUnitMappings: IAccountUnitMappingExtended[];\r\n accountId: number;\r\n\r\n selectedTab: VTabComponent;\r\n\r\n resourceType = ResourceType;\r\n\r\n loading: boolean;\r\n\r\n constructor(\r\n private readonly hardwareMappingService: HardwareMappingService,\r\n private readonly navigationService: NavigationService,\r\n private readonly unitService: UnitsService,\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.unitSerial = this.navigationService.getRouteParam(\"unitSerial\");\r\n this.loadData();\r\n }\r\n\r\n onTabSelected(tab: VTabComponent): void {\r\n this.selectedTab = tab;\r\n }\r\n\r\n //--\r\n\r\n private loadData(): void {\r\n this.loading = true;\r\n\r\n this.unitService.getUnitBySerialWithMappings(this.unitSerial)\r\n .pipe(\r\n untilDestroyed(this))\r\n .subscribe(units => {\r\n this.unit = units.find(u => u.Serial == this.unitSerial);\r\n this.getAccountMapping();\r\n this.loading = false\r\n })\r\n }\r\n\r\n private getAccountMapping(): void {\r\n this.hardwareMappingService.getAccountMappings(this.unit.Serial).pipe(untilDestroyed(this)).subscribe(mappings => {\r\n this.accountUnitMappings = mappings;\r\n this.accountId = this.accountUnitMappings[this.accountUnitMappings.length - 1]?.AccountId;\r\n })\r\n }\r\n\r\n}\r\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Component } from \"@angular/core\";\r\nimport { IAggregateFilterEvent, IFilterBarTab } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { DateService } from \"@app/services/date.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport \"./release-notes.component.scss\";\r\n\r\nexport interface IReleaseNote {\r\n CreatedOn: Date;\r\n FullName: string;\r\n Version: string;\r\n\r\n PBIs: IReleaseNoteChange[];\r\n Enhancements: IReleaseNoteChange[];\r\n Bugs: IReleaseNoteChange[];\r\n CustomerBugs: IReleaseNoteChange[];\r\n\r\n Changes: IReleaseNoteChange[];\r\n Parents: IReleaseNoteChange[];\r\n\r\n IsDraft: boolean;\r\n\r\n Environments: string[];\r\n\r\n Classification: \"Hotfix\" | \"Feature Release\";\r\n}\r\n\r\nexport interface IReleaseNoteChange {\r\n Id: number;\r\n ParentId?: number;\r\n\r\n Type: string;\r\n\r\n Title: string;\r\n Description: string;\r\n\r\n Url: string;\r\n\r\n CustomerRequest: boolean;\r\n CustomerTicketNumbers: string[];\r\n\r\n Parent?: IReleaseNoteChange;\r\n Children?: IReleaseNoteChange[];\r\n}\r\n\r\n@Component({\r\n selector: \"release-notes\",\r\n template: require(\"./release-notes.component.html\")\r\n})\r\nexport class ReleaseNotesComponent {\r\n releaseNotes: IReleaseNote[] = [];\r\n displayNotes: IReleaseNote[] = [];\r\n\r\n filterTabs: IFilterBarTab[] = [];\r\n filterEvent: IAggregateFilterEvent;\r\n\r\n pipeline = \"\";\r\n\r\n loading = false;\r\n\r\n searchTerm: string;\r\n\r\n constructor(\r\n private readonly http: HttpClient, \r\n private readonly dateService: DateService,\r\n private readonly translationService: TranslationService\r\n ) {\r\n this.createTabs();\r\n this.loadData(this.pipeline, \"Valkyrie Fleet\");\r\n }\r\n\r\n filterBySearchText = (rn: IReleaseNote, text: string): boolean => {\r\n return rn.Changes.some(change => {\r\n const changeIdContainsText = change.Id.toString().includes(text);\r\n const changeTitleContainsText = change.Title.toLocaleLowerCase().includes(text);\r\n\r\n return changeIdContainsText || changeTitleContainsText;\r\n });\r\n }\r\n\r\n onFilterBarChange(event: IAggregateFilterEvent) {\r\n // We sometimes get weird events come through, need to understand why, until then this fixes a bug\r\n if (!event.trigger) {\r\n return;\r\n }\r\n\r\n this.filterEvent = event;\r\n\r\n if (this.filterEvent.trigger === \"search\") {\r\n this.searchTerm = this.filterEvent.search;\r\n }\r\n\r\n this.displayNotes = this.filterEvent.filteredData;\r\n }\r\n\r\n pipelineChanged() {\r\n this.loadData(this.pipeline);\r\n }\r\n\r\n showCustomerReleaseNotes() {\r\n window.open(\"https://docs.verilocation.com/release-notes/\", \"_blank\");\r\n }\r\n\r\n // ---\r\n\r\n private loadData(pipeline?: string, environmentName?: string) {\r\n this.loading = true;\r\n\r\n let queryParams = new HttpParams();\r\n\r\n if (pipeline) {\r\n queryParams = queryParams.append(\"pipeline\", pipeline);\r\n }\r\n\r\n if (environmentName) {\r\n queryParams = queryParams.append(\"environmentName\", environmentName);\r\n }\r\n\r\n this.http.get(\"/api/servicestatus/releasenotes\", { params: queryParams }).subscribe(notes => {\r\n\r\n this.releaseNotes = notes;\r\n this.releaseNotes.sort((a, b) => this.dateService.sort(a.CreatedOn, b.CreatedOn));\r\n\r\n this.releaseNotes.forEach(rn => {\r\n this.prepareReleaseNote(rn);\r\n });\r\n\r\n this.loading = false;\r\n });\r\n }\r\n\r\n private prepareReleaseNote(rn: IReleaseNote): void {\r\n rn.Changes.sort((a, b) => a.Id - b.Id);\r\n\r\n rn.PBIs = rn.Changes.filter(c => c.Type == \"Product Backlog Item\" || c.Type == \"Task\");\r\n rn.Bugs = rn.Changes.filter(c => c.Type == \"Bug\" && !c.CustomerRequest);\r\n rn.CustomerBugs = rn.Changes.filter(c => c.Type == \"Bug\" && c.CustomerRequest);\r\n\r\n // Create parent trees\r\n rn.Enhancements = [...rn.Parents, ...rn.PBIs];\r\n rn.Enhancements = this.createParentHierarchy(rn, rn.Enhancements);\r\n rn.Enhancements = rn.Enhancements.filter(p => !p.Parent);\r\n\r\n rn.Classification = rn.PBIs.length < 1 ? \"Hotfix\" : \"Feature Release\";\r\n }\r\n\r\n private createParentHierarchy(rn: IReleaseNote, changes: IReleaseNoteChange[]): IReleaseNoteChange[] {\r\n changes.forEach(pbi => {\r\n if (!pbi.ParentId) {\r\n return;\r\n }\r\n\r\n this.findAndAssignParent(rn, pbi);\r\n });\r\n\r\n return changes.filter(c => !c.Parent);\r\n }\r\n\r\n private findAndAssignParent(rn: IReleaseNote, change: IReleaseNoteChange): boolean {\r\n var parent = rn.Parents.find(p => p.Id == change.ParentId);\r\n\r\n if (parent) {\r\n parent.Children = parent.Children || [];\r\n parent.Children.push(change);\r\n change.Parent = parent;\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private createTabs(): void {\r\n this.filterTabs = [];\r\n \r\n this.filterTabs.push({ title: this.translationService.t(\"ReleaseNotes.All\"), predicate: rn => true });\r\n this.filterTabs.push({ title: this.translationService.t(\"ReleaseNotes.FeatureReleases\"), predicate: rn => rn.Classification == \"Feature Release\" });\r\n this.filterTabs.push({ title: this.translationService.t(\"ReleaseNotes.Hotfixes\"), predicate: rn => rn.Classification == \"Hotfix\" });\r\n }\r\n}\r\n","import { Component, OnInit } from \"@angular/core\";\r\nimport { IVTableCell } from \"@app/directives/_layout/v-table/_models/IVTableCell\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { FallbackCellType, VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { VehicleOnlineStatusComponent } from \"@app/directives/_misc/vehicle-online-status-indicator/vehicle-online-status.component\";\r\nimport { IFilterBarTab } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { FilterBarService } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.service\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { VTableSelectionType } from \"@app/enum/VTableSelectionType\";\r\nimport { IConfigurableCameraDevice, IPeripheral } from \"@app/interfaces/IPeripheral\";\r\nimport { IAccount } from \"@app/services/account.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport copy from \"fast-copy\";\r\nimport { combineLatest, forkJoin, Observable } from \"rxjs\";\r\nimport { tap } from \"rxjs/operators\";\r\nimport { AccountService } from \"../../../_services/account.service\";\r\nimport { PeripheralService } from \"../../../_services/peripheral.service\";\r\nimport { CameraApplicationState, ICameraApp } from \"../application/_models/ICameraApp\";\r\nimport { CameraAppService } from \"../application/_services/camera-app.service\";\r\nimport { ICameraConfiguration } from \"../config/_models/ICameraConfiguration\";\r\nimport { ConfigManagerService } from \"../config/_services/config.service\";\r\nimport './camera-configuration.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'camera-configuration',\r\n template: require('./camera-configuration.component.html')\r\n})\r\nexport class CameraConfigurationComponent implements OnInit {\r\n cameras: IConfigurableCameraDevice[];\r\n accounts: Map;\r\n accountsList: IAccount[];\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n selectedRows: IVTableRow[];\r\n selectedDeviceColumns: IVTableColumn[];\r\n selectedDevices: IPeripheral[] = [];\r\n VTableSelectionType = VTableSelectionType;\r\n filterTabs: IFilterBarTab[];\r\n\r\n showDeviceConfigure: boolean;\r\n allConfigs: ICameraConfiguration[];\r\n allApps: ICameraApp[];\r\n availableConfigs: ICameraConfiguration[];\r\n availableApps: ICameraApp[];\r\n \r\n configToApply: ICameraConfiguration;\r\n appToApply: ICameraApp;\r\n\r\n forceUpdate: boolean;\r\n\r\n loading: boolean;\r\n\r\n constructor(\r\n private readonly accountService: AccountService,\r\n private readonly appService: CameraAppService,\r\n private readonly configService: ConfigManagerService,\r\n private readonly filterBarService: FilterBarService,\r\n private readonly peripheralService: PeripheralService,\r\n private readonly vTableService: VTableService,\r\n private readonly translationService: TranslationService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.loadData();\r\n }\r\n\r\n onSelectedRowsChanged(rows: IVTableRow[]): void {\r\n const selectedRowsCopy = copy(rows);\r\n this.selectedRows = selectedRowsCopy.map(row => {\r\n row.cells = row.cells.slice(1, 4);\r\n return row;\r\n });\r\n\r\n this.selectedDevices = rows.map(row => row.data);\r\n }\r\n\r\n selectConfig(config: ICameraConfiguration): void {\r\n this.configToApply = config;\r\n }\r\n\r\n resetSelectedActions(): void {\r\n delete this.configToApply;\r\n delete this.appToApply;\r\n\r\n this.forceUpdate = false;\r\n }\r\n\r\n openActionsSidebar(): void {\r\n this.selectedRows = this.selectedRows.map(row => {\r\n row.selected = false;\r\n return row;\r\n })\r\n this.showDeviceConfigure = true;\r\n }\r\n\r\n closeActionsSidebar(): void {\r\n this.resetSelectedActions();\r\n this.showDeviceConfigure = false;\r\n }\r\n\r\n filterCameraByAccount(camera: IPeripheral, account: IAccount): boolean {\r\n return camera.vehicleMapping?.vehicle?.AccountId === account.Id;\r\n }\r\n\r\n accountSearchPredicate(account: IAccount, searchText: string): boolean {\r\n return account.CompanyName.toLowerCase().indexOf(searchText.toLowerCase()) >= 0;\r\n }\r\n\r\n //--\r\n\r\n private loadData(): void {\r\n this.loading = true;\r\n this.createTabs();\r\n this.createTable();\r\n this.getAppsAndConfigs();\r\n\r\n combineLatest([\r\n this.loadAccounts(),\r\n this.loadCameras()\r\n ]).pipe(\r\n untilDestroyed(this)\r\n ).subscribe({\r\n next: () => {\r\n this.loading = false;\r\n this.tableRows = this.vTableService.createTableRows(this.cameras, this.tableColumns);\r\n this.createTabs();\r\n }\r\n });\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"FoundationHardware.Installed\", width: 150, minTableWidth: 400, sorted: true, sortDirection: SortDirection.Descending, sortType: SortType.Date }),\r\n createCellFunction: (camera) => this.vTableService.createDateCell(camera.vehicleMapping?.StartUtc)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"FoundationHardware.Serial\", width: 150\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.Serial)\r\n },\r\n {\r\n header: this.vTableService.createVehicleTableHeader(),\r\n createCellFunction: (camera) => this.vTableService.createVehicleRegCell(camera.vehicleMapping?.vehicle)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"FoundationHardware.Name\", minTableWidth: 500 }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.name)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"CameraConfiguration.CurrentConfig\" }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.currentConfig, { tooltip: true })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"AppManagement.UpdaterApp\", width: 150, minTableWidth: 450 }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.currentUpdaterAppVersion)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"AppManagement.TelematicsApp\", width: 150, minTableWidth: 450 }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.currentTelematicsAppVersion)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Account\", width: 250, minTableWidth: 450 }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(this.getCustomerAccountName(camera))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Status\", width: 250, minTableWidth: 450, sortType: SortType.Date }),\r\n createCellFunction: camera => this.createCameraOnlineStatusCell(camera)\r\n }\r\n ]\r\n\r\n this.selectedDeviceColumns = copy(this.tableColumns.slice(1, 4));\r\n }\r\n\r\n createCameraOnlineStatusCell(camera: IConfigurableCameraDevice): IVTableCell {\r\n if (!camera.vehicleMapping || !camera.onlineStatus) {\r\n return this.vTableService.createDateCell(undefined, { fallbackCellType: FallbackCellType.Never });\r\n }\r\n\r\n camera.vehicleMapping.vehicle.onlineStatus = this.peripheralService.getOnlineStatusForVehicle(camera);\r\n\r\n let sortData = camera.vehicleMapping.vehicle.onlineStatus.sortingTime;\r\n\r\n if (camera.onlineStatus.Online) {\r\n sortData = new Date();\r\n }\r\n if (!camera.onlineStatus.Online && !camera.onlineStatus.LastOnlineTime) {\r\n sortData = undefined;\r\n }\r\n\r\n return this.vTableService.createTableCell(camera, {\r\n sortData,\r\n component: VehicleOnlineStatusComponent,\r\n componentInputs: { vehicle: camera.vehicleMapping?.vehicle }\r\n })\r\n\r\n }\r\n\r\n private getCustomerAccountName(peripheral: IPeripheral): string {\r\n if (!this.accounts?.size ||\r\n !peripheral?.vehicleMapping?.vehicle ||\r\n !this.accounts?.has(peripheral.vehicleMapping.vehicle.AccountId)) {\r\n return;\r\n }\r\n\r\n return this.accounts.get(peripheral.vehicleMapping.vehicle.AccountId).CompanyName;\r\n }\r\n\r\n private loadAccounts(): Observable {\r\n return this.accountService.getCustomerAccounts().pipe(\r\n untilDestroyed(this),\r\n tap(accounts => {\r\n this.accounts = new Map(accounts.map(account => [account.Id, account]));\r\n this.accountsList = accounts;\r\n })\r\n )\r\n }\r\n\r\n private loadCameras(): Observable {\r\n return this.peripheralService.getAllConfigurableCameras().pipe(\r\n tap(cameras => {\r\n this.cameras = cameras;\r\n this.setConfigNameString();\r\n })\r\n );\r\n }\r\n\r\n private setConfigNameString(): void {\r\n if (!this.allConfigs?.length) {\r\n return;\r\n }\r\n\r\n this.cameras.forEach(c => {\r\n c.currentConfig = this.allConfigs.find(config => config.Id == Number(c.currentConfig))?.Name ?? this.translationService.t(\"Common.Unknown\");\r\n });\r\n }\r\n\r\n private getAppsAndConfigs(): void {\r\n combineLatest([\r\n this.configService.getConfigs(),\r\n this.appService.getApplicationFiles()\r\n ]).pipe(\r\n untilDestroyed(this),\r\n tap(([configs, apps]) => {\r\n this.allApps = apps;\r\n this.allConfigs = configs;\r\n this.availableApps = apps.filter(app => app.IsActive && app.State === CameraApplicationState.Production);\r\n this.availableConfigs = configs.filter(config => config.IsActive);\r\n })\r\n ).subscribe();\r\n }\r\n\r\n private createTabs(): void {\r\n this.filterTabs = [];\r\n\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"Common.Installed\", (device) => !!device.vehicleMapping?.StartUtc));\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"Common.NotInstalled\", (device) => !device.vehicleMapping?.StartUtc));\r\n }\r\n}\r\n","import { Component } from \"@angular/core\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { IFilterBarTab } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { FilterBarService } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.service\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { VTableSelectionType } from \"@app/enum/VTableSelectionType\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { finalize, tap } from \"rxjs/operators\";\r\nimport { ICameraConfiguration } from \"../../_models/ICameraConfiguration\";\r\nimport { ConfigManagerService } from \"../../_services/config.service\";\r\nimport './config-manager.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'config-manager',\r\n template: require('./config-manager.component.html')\r\n})\r\nexport class ConfigManagerComponent {\r\n\r\n configFiles: ICameraConfiguration[] = [];\r\n selectedConfig: ICameraConfiguration;\r\n selectedConfigs: ICameraConfiguration[] = [];\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n filterTabs: IFilterBarTab[];\r\n\r\n VTableSelectionType = VTableSelectionType;\r\n\r\n loading: boolean;\r\n\r\n constructor(\r\n private readonly configService: ConfigManagerService,\r\n private readonly filterBarService: FilterBarService,\r\n private readonly translationService: TranslationService,\r\n private readonly vTableService: VTableService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.createTable();\r\n this.createTabs();\r\n this.loadData();\r\n }\r\n\r\n addNewConfig(): void {\r\n this.selectedConfig = {\r\n Id: 0,\r\n Name: \"\",\r\n ConfigJson: \"\",\r\n IsActive: true,\r\n VersionGroup: null,\r\n Version: 0\r\n }\r\n }\r\n\r\n selectConfig(row: IVTableRow): void {\r\n this.selectedConfig = row.data;\r\n }\r\n\r\n clearSelectedConfig(): void {\r\n this.selectedConfig = null;\r\n }\r\n\r\n onConfigSaved(config: ICameraConfiguration): void {\r\n this.loading = true;\r\n\r\n this.configService.saveConfig(config).pipe(\r\n untilDestroyed(this)\r\n ).subscribe({\r\n complete: () => {\r\n this.clearSelectedConfig();\r\n this.loading = false\r\n }\r\n })\r\n }\r\n \r\n\r\n archiveConfig(confirm: boolean): void {\r\n if (!confirm) {\r\n return;\r\n }\r\n this.selectedConfig.IsActive = false;\r\n this.onConfigSaved(this.selectedConfig);\r\n }\r\n\r\n unarchiveConfig(): void {\r\n this.selectedConfig.IsActive = true;\r\n this.onConfigSaved(this.selectedConfig);\r\n }\r\n\r\n //--\r\n\r\n private loadData(): void {\r\n this.loading = true;\r\n this.configService.getConfigs().pipe(\r\n untilDestroyed(this)\r\n ).subscribe({\r\n next: configs => {\r\n this.configFiles = configs;\r\n this.createTableRows();\r\n this.loading = false;\r\n }\r\n });\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: 'Common.Created', sorted: true, sortDirection: SortDirection.Descending }),\r\n createCellFunction: (config) => this.vTableService.createDateCell(config.CreatedTime)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'RVLite.Version', sortType: SortType.Number, width: 150 }),\r\n createCellFunction: (config) => this.vTableService.createTableCell(config.Version)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'Common.Name' }),\r\n createCellFunction: (config) => this.vTableService.createTableCell(config.Name)\r\n } \r\n ]\r\n }\r\n\r\n private createTableRows(): void {\r\n this.tableRows = this.vTableService.createTableRows(this.configFiles, this.tableColumns);\r\n }\r\n \r\n private createTabs(): void {\r\n this.filterTabs = [];\r\n\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"Common.Active\", this.isActivePredicate));\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"Common.Archived\", this.isInactivePredicate));\r\n }\r\n\r\n private isActivePredicate = (config) => {\r\n return config.IsActive;\r\n }\r\n\r\n private isInactivePredicate = (config) => {\r\n return !config.IsActive;\r\n }\r\n}\r\n","import { Component, ViewChild } from \"@angular/core\";\r\nimport { VTabComponent } from \"@app/directives/_layout/v-tabs/v-tab.component\";\r\nimport { ApplicationManagerComponent } from \"./application/_components/application-manager/application-manager.component\";\r\nimport './rv-lite.component.scss';\r\n\r\n@Component({\r\n selector: 'rv-lite',\r\n template: require('./rv-lite.component.html')\r\n})\r\nexport class RVLiteComponent {\r\n selectedTab: VTabComponent;\r\n\r\n @ViewChild(\"appManager\") appManager: ApplicationManagerComponent;\r\n\r\n onTabSelected(tab: VTabComponent): void {\r\n this.selectedTab = tab;\r\n }\r\n}\r\n","import { Component, Input, OnInit } from \"@angular/core\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { IRecentlySelectedEntity } from \"@app/directives/_misc/recently-selected/recently-selected.component\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { IAccount } from \"@app/services/account.service\";\r\nimport { NavigationService } from \"@app/services/navigation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { combineLatest, forkJoin } from \"rxjs\";\r\nimport { finalize, tap } from \"rxjs/operators\";\r\nimport { FoundationNavigationModule } from \"../../foundation.navigation\";\r\nimport { AccountService } from \"../../_services/account.service\";\r\nimport { FoundationVehiclesService } from \"../../_services/vehicle.service\";\r\nimport './vehicle-list.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'foundation-vehicle-list',\r\n template: require(\"./vehicle-list.component.html\")\r\n})\r\nexport class FoundationVehicleListComponent implements OnInit {\r\n @Input() customerId: number;\r\n\r\n vehicles: IVehicle[];\r\n customers: IAccount[] = [];\r\n customerMap: Map;\r\n\r\n tabCount: number = 0;\r\n\r\n loading = false;\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n constructor(\r\n private readonly accountService: AccountService,\r\n private readonly navigationService: NavigationService,\r\n private readonly vehicleService: FoundationVehiclesService,\r\n private readonly vTableService: VTableService) { }\r\n\r\n ngOnInit(): void {\r\n this.customerId = this.navigationService.getRouteParam(\"customerId\");\r\n this.createTable();\r\n this.loadData();\r\n }\r\n\r\n\r\n selectVehicle(row: IVTableRow): void {\r\n const vehicle = row.data;\r\n this.navigationService.go(FoundationNavigationModule.VehicleView, { vehicleId: vehicle.Id });\r\n }\r\n\r\n onRecentItemClicked(recentItem: IRecentlySelectedEntity) {\r\n const vehicle = this.vehicles.find(v => v.Id == recentItem.id);\r\n this.selectVehicle({ data: vehicle } as any);\r\n }\r\n\r\n //--\r\n\r\n private loadData(): void {\r\n this.loading = true;\r\n\r\n combineLatest([\r\n this.accountService.getCustomerAccounts(),\r\n !!this.customerId ? this.vehicleService.getVehiclesForAccount(this.customerId) : this.vehicleService.getVehicles()\r\n ]).pipe(\r\n untilDestroyed(this),\r\n tap(([customers, vehicles]) => {\r\n this.customers = customers;\r\n this.customerMap = this.accountService.createAccountMap(this.customers);\r\n\r\n this.vehicles = vehicles;\r\n this.tabCount = vehicles.length;\r\n this.createTableRows();\r\n\r\n this.loading = false;\r\n }))\r\n .subscribe();\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"Common.Created\", width: 140, minTableWidth: 600, sorted: true, sortDirection: SortDirection.Descending }),\r\n createCellFunction: vehicle => this.vTableService.createDateCell(vehicle.Created)\r\n },\r\n {\r\n header: this.vTableService.createVehicleTableHeader(),\r\n createCellFunction: vehicle => this.vTableService.createVehicleRegCell(vehicle)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"FoundationVehicles.DisplayLabel\", sortable: true, minTableWidth: 800 }),\r\n createCellFunction: vehicle => this.vTableService.createTableCell(vehicle.ShortReg)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Company\", sortable: true, minWidth: 100 }),\r\n createCellFunction: vehicle => this.vTableService.createTableCell(this.customerMap.get(vehicle.AccountId)?.CompanyName)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"Common.Make\", sortable: true, width: 130, minTableWidth: 600\r\n }),\r\n createCellFunction: vehicle => this.vTableService.createTableCell(vehicle.Make)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"Common.Model\", sortable: true, width: 130, minTableWidth: 600\r\n }),\r\n createCellFunction: vehicle => this.vTableService.createTableCell(vehicle.Model)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"Common.Updated\", width: 140, minTableWidth: 700 }),\r\n createCellFunction: vehicle => this.vTableService.createDateCell(vehicle.Updated)\r\n }\r\n ]\r\n }\r\n\r\n private createTableRows(): void {\r\n this.tableRows = this.vTableService.createTableRows(this.vehicles, this.tableColumns);\r\n }\r\n}\r\n","import { ChangeDetectorRef, Component, OnInit, ViewChild } from '@angular/core';\r\nimport { VTableRowStatus } from '@app/directives/_layout/v-table/_enums/VTableRowStatus.enum';\r\nimport { IVTableColumn } from '@app/directives/_layout/v-table/_models/IVTableColumn';\r\nimport { IVTableRow } from '@app/directives/_layout/v-table/_models/IVTableRow';\r\nimport { VTableService } from '@app/directives/_layout/v-table/_services/v-table.service';\r\nimport { ResourceType } from '@app/enum/ResourceType';\r\nimport { SortDirection } from '@app/enum/SortDirection';\r\nimport { IGoogleMapsMarker } from '@app/interfaces/IGoogleMapsMarkerOptions';\r\nimport { IJourney } from '@app/interfaces/IJourney';\r\nimport { IUnit, IViewCommissionPeripheral } from '@app/interfaces/IPeripheral';\r\nimport { IPlot } from '@app/interfaces/IPlot';\r\nimport { ISensorData } from '@app/interfaces/ISensorData';\r\nimport { SensorDataValueType } from '@app/interfaces/ISensorDataValue';\r\nimport { IVehicle } from '@app/interfaces/IVehicle';\r\nimport { Diagnostics4gComponent } from '@app/main/modules/foundation/_components/diagnostics4G/diagnostics-4g.component';\r\nimport { AddVehicleComponent } from '@app/main/modules/foundation/_routes/commissions/commissionEditor/components/add-vehicle/add-vehicle.component';\r\nimport { PulseService } from '@app/main/modules/foundation/_routes/hardware/peripherals/pulse/pulse.service';\r\nimport { IPulseRecord } from '@app/main/modules/foundation/_routes/hardware/_models/IPulseRecord';\r\nimport { DateService } from '@app/services/date.service';\r\nimport { JourneyService } from '@app/services/journey.service';\r\nimport { MapService } from '@app/services/map.service';\r\nimport { NavigationService } from '@app/services/navigation.service';\r\nimport { PlotService } from '@app/services/plots/plot.service';\r\nimport { ReasonCodeService } from '@app/services/reasonCode.service';\r\nimport { TranslationService } from '@app/services/translation.service';\r\nimport { UnitConversionService, UnitConversionType } from '@app/services/unitConversion.service';\r\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\r\nimport { combineLatest, from, Observable } from 'rxjs';\r\nimport { PeripheralService } from '../../../_services/peripheral.service';\r\nimport { UnitsService } from '../../../_services/unit.service';\r\nimport { FoundationVehiclesService } from '../../../_services/vehicle.service';\r\nimport './vehicle-view.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'vehicle-view',\r\n template: require('./vehicle-view.component.html')\r\n})\r\nexport class VehicleViewComponent implements OnInit {\r\n vehicleId: number;\r\n vehicle: IVehicle;\r\n\r\n plots: IPlot[];\r\n journeys: IJourney[];\r\n\r\n sensorData: ISensorData[] = [];\r\n\r\n selectedVehicleCurrentUnit$: Observable;\r\n selectedVehiclePeripherals$: Observable;\r\n\r\n selectedPlot: IPlot;\r\n showSelectedPlotData: boolean;\r\n selectedMapPlot: IPlot;\r\n\r\n showingEditVehicleForm = false;\r\n\r\n SensorDataValueType = SensorDataValueType;\r\n\r\n locationMarker: IGoogleMapsMarker;\r\n resourceType: ResourceType = ResourceType.Vehicle;\r\n\r\n tableColumns: IVTableColumn[]\r\n tableRows: IVTableRow[];\r\n\r\n loading: boolean;\r\n diagnosticsInProcess: boolean;\r\n\r\n latestPulseRecord: IPulseRecord;\r\n\r\n private p100ProductId = 1253;\r\n\r\n @ViewChild(Diagnostics4gComponent) diagnostic4g: Diagnostics4gComponent;\r\n @ViewChild('vehicleEditor') userEditor: AddVehicleComponent;\r\n\r\n constructor(\r\n private readonly dateService: DateService,\r\n private readonly journeyService: JourneyService,\r\n private readonly mapService: MapService,\r\n private readonly navigationService: NavigationService,\r\n private readonly peripheralService: PeripheralService,\r\n private readonly plotService: PlotService,\r\n private readonly reasonCodeService: ReasonCodeService,\r\n private readonly translationService: TranslationService,\r\n private readonly unitConversionService: UnitConversionService,\r\n private readonly unitService: UnitsService,\r\n private readonly vehicleService: FoundationVehiclesService,\r\n private readonly vTableService: VTableService,\r\n private readonly pulseService: PulseService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.vehicleId = this.navigationService.getRouteParam('vehicleId');\r\n this.loadData();\r\n }\r\n\r\n get shouldShowUpdatedTimePill(): boolean {\r\n return new Date(this.vehicle?.Updated).getTime() !== new Date('0001-01-01T00:00:00Z').getTime();\r\n }\r\n \r\n showEditVehicleForm(): void {\r\n this.showingEditVehicleForm = true;\r\n }\r\n\r\n onVehicleSaved(vehicle: IVehicle) {\r\n this.vehicle = vehicle;\r\n this.showingEditVehicleForm = false;\r\n }\r\n\r\n onEditCancelled() {\r\n this.showingEditVehicleForm = false;\r\n }\r\n\r\n onDiagnosticsInProcess(inProcess: boolean) {\r\n this.diagnosticsInProcess = inProcess;\r\n }\r\n\r\n onDiagnosticsClicked(peripheral: IViewCommissionPeripheral) {\r\n if (!peripheral.showDiagnostics) {\r\n peripheral.showDiagnostics = true;\r\n } else {\r\n this.diagnostic4g.refreshDiagnosticsTests();\r\n }\r\n }\r\n\r\n //--\r\n\r\n private loadData(): void {\r\n this.loading = true;\r\n\r\n combineLatest([\r\n this.plotService.getPlotsWithSensorData(this.vehicleId, this.dateService.getStartOfDay(new Date()), this.dateService.getEndOfDay(new Date())),\r\n this.vehicleService.getVehicle(this.vehicleId),\r\n from(this.journeyService.getJourneysForDateAndVehicle(this.vehicleId, this.dateService.getStartOfDay(new Date()), this.dateService.getEndOfDay(new Date()), true) as Promise),\r\n this.pulseService.getLatestPulseMessage({ VehicleId: this.vehicleId })\r\n ]).pipe(untilDestroyed(this)).subscribe({\r\n next: ([plots, vehicle, journeys, latestPulse]) => {\r\n this.vehicle = vehicle;\r\n this.plots = plots;\r\n this.latestPulseRecord = latestPulse;\r\n\r\n this.createTable();\r\n\r\n const latestPlot = this.getLatestPlot(plots);\r\n this.selectedMapPlot = latestPlot;\r\n this.journeys = journeys;\r\n\r\n this.locationMarker = latestPlot ? this.mapService.createMapMarker(latestPlot, { label: this.translationService.t('FoundationVehicles.CurrentLocation'), showLabel: true }) : null;\r\n\r\n this.getInstallerUnitAndMapping();\r\n this.updatePeripherals();\r\n\r\n this.createTableRows();\r\n this.loading = false;\r\n }\r\n })\r\n }\r\n\r\n private getInstallerUnitAndMapping() {\r\n this.selectedVehicleCurrentUnit$ = this.unitService.getVehicleCurrentUnit(this.vehicle);\r\n }\r\n\r\n private updatePeripherals(): void {\r\n this.selectedVehiclePeripherals$ = this.peripheralService.getInstalledPeripheralsForVehicle(this.vehicleId);\r\n }\r\n\r\n private getLatestPlot(plots: IPlot[]): IPlot {\r\n if (!plots.length) {\r\n return;\r\n }\r\n\r\n return plots.reduce((a, b) => {\r\n return new Date(a.Utc).getTime() > new Date(b.Utc).getTime() ? a : b;\r\n });\r\n }\r\n\r\n private createTableRows(): void {\r\n this.tableRows = this.vTableService.createTableRows(this.plots, this.tableColumns);\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader({ sorted: true, sortDirection: SortDirection.Descending }),\r\n createCellFunction: plot => this.vTableService.createDateCell(plot.Utc)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Reason\", sortable: true, width: 120, minTableWidth: 600 }),\r\n createCellFunction: plot => this.vTableService.createTableCell(this.reasonCodeService.getReasonCodeLabel(plot.Reason))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Odometer\", sortable: true, width: 1020, minTableWidth: 600, canEdit: true }),\r\n createCellFunction: plot => {\r\n const value = this.unitConversionService.smartConvert((plot.Odometer / 1000), UnitConversionType.Distance, { precision: 1 });\r\n return this.vTableService.createTableCell(value);\r\n }\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Fuel\", sortable: true, minTableWidth: 600, canEdit: true }),\r\n createCellFunction: plot => {\r\n const value = this.unitConversionService.smartConvert(plot.SensorData?.FuelLevel, UnitConversionType.FuelCapacity, { precision: 1 });\r\n return this.vTableService.createTableCell(value)\r\n }\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Speed\", sortable: true, minTableWidth: 600, canEdit: true }),\r\n createCellFunction: plot => {\r\n const value = this.unitConversionService.smartConvert(plot.Velocity, UnitConversionType.Speed, { precision: 1 });\r\n return this.vTableService.createTableCell(value)\r\n }\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Direction\", sortable: true, minTableWidth: 600, canEdit: true }),\r\n createCellFunction: plot => {\r\n return this.vTableService.createTableCell(this.plotService.convertDirectionToWords(plot.Direction))\r\n }\r\n }\r\n ]\r\n\r\n this.getCanDataColumns();\r\n }\r\n\r\n private getCanDataColumns(): void {\r\n if (!this.plots?.length) {\r\n return;\r\n }\r\n\r\n const samplePlot = this.plots.find(plot => !!plot.SensorData);\r\n\r\n if (!samplePlot) {\r\n return;\r\n }\r\n\r\n const canDataColumns = Object.keys(samplePlot.SensorData) as (keyof ISensorData)[];\r\n const excludedColumns = [\"PlotId\", \"VehicleId\", \"Utc\"];\r\n\r\n canDataColumns.forEach(key => {\r\n if (excludedColumns.includes(key)) {\r\n return;\r\n }\r\n\r\n this.tableColumns.push({\r\n header: this.vTableService.createTableHeader({ tKey: 'SensorDataValueTypeEnum.' + key, sortable: false, canEdit: true, hidden: true }),\r\n createCellFunction: plot => {\r\n let data: any;\r\n\r\n if (plot.SensorData?.[key]) {\r\n data = plot.SensorData[key];\r\n }\r\n\r\n return this.vTableService.createTableCell(data, {tooltip: true});\r\n }\r\n })\r\n });\r\n }\r\n}\r\n","import { Component, ViewChild } from \"@angular/core\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { IAggregateFilterEvent, IFilterBarTab } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { FilterBarService } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.service\";\r\nimport { VerticalFilterItemCreationCallback } from \"@app/directives/_resourceFilters/vertical-filter-list/vertical-filter-list.component\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { IUser } from \"@app/interfaces/IUser\";\r\nimport { IAccount } from \"@app/services/account.service\";\r\nimport { DateService, DateUnit } from \"@app/services/date.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { combineLatest, forkJoin } from \"rxjs\";\r\nimport { mergeMap } from \"rxjs/operators\";\r\nimport { IEngineerJob, IEngineerJobItem } from \"../../foundation.interfaces\";\r\nimport { VisitFailureReason } from \"../../_enums/VisitFailureReason\";\r\nimport { IVisitFailureRecord } from \"../../_models/IVisitFailureRecord\";\r\nimport { IVisitFailureRecordQueryOptions } from \"../../_models/IVisitFailureRecordQueryOptions\";\r\nimport { AccountService } from \"../../_services/account.service\";\r\nimport { EngineerJobItemService } from \"../../_services/engineer-job-item.service\";\r\nimport { EngineerJobService } from \"../../_services/engineer-job.service\";\r\nimport { UserService } from \"../../_services/user.service\";\r\nimport { VisitFailureService } from \"../../_services/visit-failure.service\";\r\nimport { VisitFailureFormComponent } from \"../visit-failure-form/visit-failure-form.component\";\r\nimport './visit-failures.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'visit-failures',\r\n template: require('./visit-failures.component.html')\r\n})\r\nexport class VisitFailuresComponent {\r\n loading: boolean;\r\n loadingJob: boolean;\r\n loadingJobItems: boolean;\r\n\r\n startDate: Date;\r\n endDate: Date;\r\n\r\n users: Map;\r\n accounts: IAccount[];\r\n accountsMap: Map;\r\n selectedAccount: IAccount;\r\n jobItems: IEngineerJobItem[];\r\n jobItemsMap: Map;\r\n accountJobItems: IEngineerJobItem[];\r\n selectedJobItem: IEngineerJobItem;\r\n selectedJob: IEngineerJob;\r\n accountJobs: IEngineerJob[];\r\n\r\n visitFailureRecords: IVisitFailureRecord[];\r\n selectedVisitFailureRecord: IVisitFailureRecord;\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n filterTabs: IFilterBarTab[];\r\n\r\n showNewRecordForm: boolean;\r\n\r\n VisitFailureReason = VisitFailureReason;\r\n\r\n @ViewChild('visitFailureForm') visitFailureForm: VisitFailureFormComponent;\r\n\r\n constructor(\r\n private readonly accountService: AccountService,\r\n private readonly dateService: DateService,\r\n private readonly engineerJobItemService: EngineerJobItemService,\r\n private readonly engineerJobService: EngineerJobService,\r\n private readonly filterBarService: FilterBarService,\r\n private readonly translationService: TranslationService,\r\n private readonly userService: UserService,\r\n private readonly visitFailureService: VisitFailureService,\r\n private readonly vTableService: VTableService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.startDate = this.dateService.addOrSubtractTime(new Date(), -7, DateUnit.Day);\r\n this.endDate = new Date();\r\n\r\n this.createTable();\r\n this.createTabs();\r\n\r\n this.getData();\r\n }\r\n \r\n onFilterBarChanged(filterEvent: IAggregateFilterEvent): void {\r\n if (filterEvent.trigger == \"date\") {\r\n this.startDate = filterEvent.date[0];\r\n this.endDate = filterEvent.date[1];\r\n this.getData();\r\n }\r\n }\r\n\r\n filterRecordByAccount(record: IVisitFailureRecord, account: IAccount): boolean {\r\n return record.AccountId === account.Id;\r\n }\r\n\r\n accountSearchPredicate(account: IAccount, searchText: string): boolean {\r\n return account.CompanyName.toLowerCase().indexOf(searchText) >= 0;\r\n }\r\n\r\n onAccountClicked(account: IAccount): void {\r\n this.selectedAccount = account;\r\n\r\n this.loadingJob = true;\r\n\r\n this.engineerJobService.getEngineerJobsForAccount(account.Id).pipe(untilDestroyed(this)).subscribe({\r\n next: jobs => {\r\n this.accountJobs = jobs;\r\n this.loadingJob = false;\r\n }\r\n })\r\n }\r\n\r\n onJobClicked(job: IEngineerJob): void {\r\n this.selectedJob = job;\r\n\r\n this.accountJobItems = this.jobItems.filter(jobItem => jobItem.JobId === job.Id);\r\n }\r\n\r\n onJobItemClicked(jobItem: IEngineerJobItem): void {\r\n this.selectedJobItem = jobItem;\r\n }\r\n\r\n createNewRecord(): void {\r\n this.showNewRecordForm = true;\r\n }\r\n\r\n closeNewRecordForm(newRecord?: IVisitFailureRecord): void {\r\n this.showNewRecordForm = false;\r\n this.clearAccountAndJobs();\r\n\r\n if (newRecord) {\r\n this.visitFailureRecords.push(newRecord);\r\n this.createTableRows();\r\n }\r\n }\r\n\r\n jobItemSearchPredicate(jobItem: IEngineerJobItem, text: string): boolean {\r\n return jobItem.Id?.toString().toLowerCase().includes(text.toLowerCase()) || jobItem.Comments?.toString().toLowerCase().includes(text.toLowerCase())\r\n }\r\n\r\n jobSearchPredicate(job: IEngineerJob, text: string): boolean {\r\n return job.Id?.toString().toLowerCase().includes(text.toLowerCase()) || job.Description?.toString().toLowerCase().includes(text.toLowerCase());\r\n }\r\n\r\n clearAccountAndJobs(): void {\r\n this.selectedAccount =\r\n this.accountJobs =\r\n this.accountJobItems =\r\n this.selectedJob =\r\n this.selectedJobItem =\r\n null;\r\n }\r\n\r\n clearSelectedJobItems(): void {\r\n this.accountJobItems = null;\r\n this.selectedJobItem = null;\r\n }\r\n \r\n onRowClicked(row: IVTableRow): void {\r\n this.selectedVisitFailureRecord = row.data;\r\n\r\n this.loadingJob = true;\r\n\r\n this.engineerJobItemService.getEngineerJobItems({ jobItemId: this.selectedVisitFailureRecord.JobItemId }).pipe(\r\n untilDestroyed(this),\r\n mergeMap(jobItems => {\r\n this.selectedJobItem = jobItems[0];\r\n return this.engineerJobService.getEngineerJob(this.selectedJobItem.JobId)\r\n })).subscribe({\r\n next: job => {\r\n this.selectedJob = job;\r\n this.loadingJob = false;\r\n }\r\n })\r\n }\r\n\r\n closeSelectedVisitFailRecord(updatedRecord?: IVisitFailureRecord): void {\r\n this.selectedVisitFailureRecord = null;\r\n this.clearAccountAndJobs();\r\n\r\n if (updatedRecord) {\r\n this.visitFailureRecords = this.visitFailureRecords.filter(record => record.Id !== updatedRecord.Id);\r\n this.visitFailureRecords.push(updatedRecord);\r\n this.createTableRows();\r\n }\r\n }\r\n\r\n reasonItemCreationCallback: VerticalFilterItemCreationCallback = (record) => {\r\n\r\n return {\r\n name: this.translationService.tEnum(VisitFailureReason, \"VisitFailureReason\", record.VisitFailureReason),\r\n data: record,\r\n predicate: (d) => d.VisitFailureReason === record.VisitFailureReason\r\n };\r\n }\r\n\r\n //--\r\n\r\n private getData(): void {\r\n this.loading = true;\r\n\r\n const options: IVisitFailureRecordQueryOptions = {\r\n Start: this.startDate,\r\n End: this.endDate\r\n }\r\n\r\n combineLatest([\r\n this.visitFailureService.getVisitFailures(options),\r\n this.userService.getAllUsers(),\r\n this.accountService.getCustomerAccounts(),\r\n this.engineerJobItemService.getAllEngineerJobItems()\r\n ]).pipe(untilDestroyed(this)).subscribe({\r\n next: ([records, users, accounts, jobItems]) => {\r\n this.visitFailureRecords = records;\r\n this.users = new Map(users.map(user => [user.Id, user]));\r\n\r\n this.accounts = accounts;\r\n this.accountsMap = new Map(accounts.map(account => [account.Id, account]));\r\n\r\n this.jobItems = jobItems;\r\n this.jobItemsMap = new Map(jobItems.map(jobItem => [jobItem.Id, jobItem]));\r\n\r\n\r\n if (!this.accountsMap.size || !this.users.size) {\r\n return;\r\n }\r\n\r\n this.createTableRows();\r\n this.loading = false;\r\n }\r\n })\r\n }\r\n\r\n private createTableRows(): void {\r\n this.tableRows = this.vTableService.createTableRows(this.visitFailureRecords, this.tableColumns);\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader({ sorted: true, sortDirection: SortDirection.Descending }),\r\n createCellFunction: record => this.vTableService.createDateCell(record.FailureTimestampUTC)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Account\" }),\r\n createCellFunction: record => this.vTableService.createTableCell(this.getCustomerAccountName(record))\r\n },\r\n {\r\n header: this.vTableService.createVehicleTableHeader(),\r\n createCellFunction: record => this.vTableService.createVehicleRegCell(undefined, record.VehicleId)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"VisitFailures.JobId\", sortType: SortType.Number }),\r\n createCellFunction: record => this.vTableService.createTableCell(this.getJobId(record))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"VisitFailures.Username\" }),\r\n createCellFunction: record => this.vTableService.createTableCell(this.getUsername(record))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"VisitFailures.EngineerName\" }),\r\n createCellFunction: record => this.vTableService.createTableCell(this.getEngineerName(record))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Reason\" }),\r\n createCellFunction: record => this.vTableService.createEnumCell(VisitFailureReason, \"VisitFailureReason\", record.VisitFailureReason)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Chargeable\" }),\r\n createCellFunction: record => {\r\n const isChargeable: string = record.Chargeable ?\r\n this.translationService.t(\"Common.Yes\") :\r\n this.translationService.t(\"Common.No\");\r\n\r\n return this.vTableService.createTableCell(isChargeable);\r\n }\r\n }\r\n ]\r\n }\r\n\r\n private getCustomerAccountName(record: IVisitFailureRecord): string {\r\n const account = this.accountsMap.get(record.AccountId);\r\n return account.CompanyName;\r\n }\r\n\r\n\r\n private getEngineerName(record: IVisitFailureRecord): string {\r\n const engineer = this.users.get(record.EngineerId);\r\n return engineer.Description;\r\n }\r\n\r\n\r\n getUsername(record: IVisitFailureRecord): string {\r\n const user = this.users.get(record.UserId);\r\n return user.Description || user.Email;\r\n }\r\n\r\n private getJobId(record: IVisitFailureRecord): number {\r\n if (!record?.JobItemId) {\r\n return;\r\n }\r\n\r\n const jobItem = this.jobItemsMap.get(record.JobItemId);\r\n\r\n if (!jobItem) {\r\n return;\r\n }\r\n\r\n record.jobId = jobItem?.JobId;\r\n\r\n return jobItem?.JobId;\r\n }\r\n\r\n private createTabs(): void {\r\n this.filterTabs = [];\r\n\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"Common.All\", (record) => true));\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"Common.Chargeable\", (record) => record.Chargeable));\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"Commissions.NotChargeable\", (record) => !record.Chargeable));\r\n }\r\n}\r\n","import { UserType } from '@app/enum/UserType';\r\nimport { IUserIdToNameMapping } from '@app/main/modules/foundation/foundation.interfaces';\r\nimport { IAccountUserMapping, IUser } from '@interfaces/IUser';\r\nimport { AccountUserMappingService } from '@app/services/accountUserMapping.service.ajs';\r\nimport { HybridServiceAccessor } from '../../../../common/hybrid-service-accessor';\r\nimport { FoundationUserResellerMappingService } from './userResellerMapping.service';\r\nimport { IUserResellerMapping } from '../_models/IUserResellerMapping';\r\nimport { lastValueFrom } from 'rxjs';\r\n\r\nexport class FoundationUserService {\r\n private readonly userResellerMappingService = new HybridServiceAccessor(\"userResellerMappingService\", this.$injector);\r\n\r\n static $inject = [\"$q\", \"$http\", \"accountUserMappingService\", \"$injector\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $http: angular.IHttpService,\r\n private readonly accountUserMappingService: AccountUserMappingService,\r\n private readonly $injector: angular.auto.IInjectorService\r\n ) {\r\n }\r\n\r\n getUserIdToNameMappings(): angular.IPromise {\r\n return this.getUsernameMappings().then(mappings => {\r\n return mappings;\r\n });\r\n }\r\n\r\n getEngineers(): angular.IPromise {\r\n return this.$q.resolve([]);\r\n }\r\n\r\n getUsersForAccount(accountId: number, invalidateCache = false): angular.IPromise {\r\n\r\n const accountMappingPromise = this.accountUserMappingService.getAccountUserMappingsForAccount(accountId, invalidateCache)\r\n\r\n const usersPromise = this.getUsersForAccountPromise(accountId, invalidateCache)\r\n\r\n const userResellerMappingsPromise = lastValueFrom(this.userResellerMappingService.service.getMappings()) as angular.IPromise;\r\n\r\n return this.$q.all([accountMappingPromise, usersPromise, userResellerMappingsPromise]).then(([mappings, users, resellerMappings]) => {\r\n // Set current account mapping to match the account being specified\r\n\r\n users.forEach(user => {\r\n user.AccountUserMappings = mappings.filter(mapping => mapping.UserId == user.Id);\r\n user.CurrentAccountUserMapping = user.AccountUserMappings.find(m => m.AccountId == accountId);\r\n user.ResellerIds = resellerMappings.filter(mapping => mapping.UserId === user.Id && !mapping.EndTime).map(mapping => mapping.ResellerId);\r\n });\r\n\r\n return users;\r\n });\r\n }\r\n\r\n currentUserCanUpdateAccountStatus(): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/foundation/users/updateaccountstatus`,\r\n method: \"GET\",\r\n cache: false,\r\n params: {}\r\n })\r\n .then(response => {\r\n return response.data;\r\n });\r\n }\r\n\r\n private getUsersForAccountPromise(accountId: number, invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/foundation/users/account/${accountId}`,\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 30, invalidateCache: invalidateCache }\r\n })\r\n .then(response => {\r\n return response.data;\r\n });\r\n }\r\n\r\n private getUsernameMappings(invalidateCache = false): angular.IPromise {\r\n return this.$http({\r\n url: `/api/foundation/users/usernamemappings`,\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 30, invalidateCache: invalidateCache }\r\n })\r\n .then(response => {\r\n return response.data;\r\n });\r\n }\r\n}\r\n","import { Component, Input, OnChanges } from \"@angular/core\";\r\nimport { DynamicReportService } from \"@reports/_services/dynamicReports.service\";\r\nimport { ReportTypesNavLabels } from \"@reports/enums/ReportTypesNavLabels\";\r\nimport { IDynamicReportSchedule } from \"@reports/models/IDynamicReportSchedule\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { IReportDefinitionHistory } from \"../../models/IReportDefinition\";\r\nimport \"./report-card.component.scss\";\r\n\r\n@Component({\r\n selector: \"report-card\",\r\n template: require(\"./report-card.component.html\")\r\n})\r\nexport class ReportCardComponent implements OnChanges {\r\n\r\n @Input() reportDefinitionHistory: IReportDefinitionHistory;\r\n @Input() historyView: boolean;\r\n\r\n // ---\r\n\r\n title: string;\r\n subtitle: string;\r\n icon: string;\r\n\r\n rowDataSource: String;\r\n isSystemReport: boolean;\r\n\r\n schedule: IDynamicReportSchedule;\r\n\r\n constructor(\r\n private readonly dynamicReportService: DynamicReportService,\r\n private readonly translationService: TranslationService\r\n ) {\r\n }\r\n\r\n ngOnChanges() {\r\n if (!this.reportDefinitionHistory || !this.reportDefinitionHistory.definition) {\r\n this.clearTitle();\r\n return;\r\n }\r\n\r\n var reportType = this.dynamicReportService.getReportType(this.reportDefinitionHistory.definition);\r\n this.subtitle = reportType == ReportTypesNavLabels.System\r\n ? this.translationService.t(\"Reports.SystemReport\")\r\n : this.translationService.t(\"Reports.CustomReport\");\r\n this.isSystemReport = reportType == ReportTypesNavLabels.System ? true : false;\r\n\r\n if (this.historyView && this.reportDefinitionHistory?.latest?.ReportScheduleId) {\r\n this.loadSchedule();\r\n }\r\n\r\n this.updateDisplay();\r\n }\r\n\r\n // ---\r\n\r\n private loadSchedule() {\r\n if (!this.reportDefinitionHistory) {\r\n return;\r\n }\r\n\r\n this.dynamicReportService.getReportSchedules({ ReportDefinitionId: this.reportDefinitionHistory.definition.Id }).then(schedules => {\r\n\r\n this.schedule = schedules.find(s => s.Id == this.reportDefinitionHistory?.latest.ReportScheduleId);\r\n }).finally(() => {\r\n this.updateDisplay();\r\n });\r\n }\r\n\r\n private clearTitle(): void {\r\n this.title = \"\";\r\n }\r\n\r\n private updateDisplay(): void {\r\n this.title = this.getTitle();\r\n this.icon = this.getIcon();\r\n }\r\n\r\n private getIcon(): string {\r\n if (this.historyView) {\r\n return (this.schedule) ? \"date_range\" : \"person\";\r\n }\r\n\r\n return this.reportDefinitionHistory?.definition?.icon ?? \"date_range\";\r\n }\r\n\r\n private getTitle(): string {\r\n if (this.historyView) {\r\n if (this.schedule) {\r\n return this.translationService.t(\"ReportCard.ScheduledLabel\", this.schedule.Name);\r\n }\r\n\r\n return this.reportDefinitionHistory.lastRanByLabel;\r\n }\r\n\r\n if (this.isSystemReport) {\r\n return this.reportDefinitionHistory.definition.Parameters.TranslatedTitle;\r\n }\r\n\r\n return this.reportDefinitionHistory.definition.Title;\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, Output } from \"@angular/core\";\r\nimport { IComboBox } from \"@interfaces/IComboBox\";\r\nimport \"./report-category-selector.scss\";\r\n\r\n@Component({\r\n selector: \"report-category-selector\",\r\n template: require(\"./report-category-selector.html\")\r\n})\r\nexport class ReportCategorySelectorComponent {\r\n\r\n @Input() categoryIndex = 0;\r\n @Input() columnFilterOptions: IComboBox[] = [];\r\n\r\n @Output() optionChanged = new EventEmitter();\r\n\r\n // ---\r\n\r\n catFilterSelected(option: IComboBox) {\r\n console.log(\"catFilterSelected\");\r\n this.categoryIndex = this.columnFilterOptions.indexOf(option);\r\n\r\n this.optionChanged.emit({ option: option, selectedIndex: this.categoryIndex });\r\n }\r\n}\r\n","import { animate, style, transition, trigger } from \"@angular/animations\";\r\nimport { ChangeDetectorRef, Component, EventEmitter, Input, OnChanges, Output, Pipe, PipeTransform, SimpleChanges, ViewChild } from \"@angular/core\";\r\nimport { VAutocompleteComponent } from \"@directives/_forms/v-autocomplete/v-autocomplete.component\";\r\nimport { AccordianEntryComponent } from \"@directives/_layout/accordian/accordian-entry/accordian-entry.component\";\r\nimport { DynamicReportService } from \"@reports/_services/dynamicReports.service\";\r\nimport { IColumnHeader } from \"@reports/models/IColumnHeader\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport { copy } from \"angular\";\r\nimport { ReportTableRowDataSource } from \"../../enums/ReportTableRowDataSource\";\r\nimport \"./report-column-headers-selector.component.scss\";\r\nimport { TriggerValueOperator } from \"@app/main/modules/alerts/_enums/alerts.enums\";\r\n\r\n@Pipe({\r\n name: \"filterTitleRowColumnHeader\"\r\n})\r\nexport class FilterTitleRowColumnHeaderPipe implements PipeTransform {\r\n transform(columnHeaders: IColumnHeader[]): IColumnHeader[] {\r\n if (!columnHeaders?.length) {\r\n return [];\r\n }\r\n\r\n return columnHeaders.filter(columnHeader => !columnHeader.IsRowTitle);\r\n }\r\n}\r\n\r\n@Component({\r\n selector: \"report-column-headers-selector\",\r\n template: require(\"./report-column-headers-selector.component.html\"),\r\n animations: [\r\n trigger(\"columnListAnimation\", [\r\n transition(\":enter\", [\r\n style({ opacity: 0, transform: \"translateY(-20px)\" }),\r\n animate(\"300ms ease-out\", style({ opacity: 1, transform: \"translateY(0px)\" }))\r\n ]),\r\n transition(\":leave\", [\r\n animate(\"300ms ease-out\", style({ opacity: 0, height: 0 }))\r\n ]),\r\n transition(\"* <=> *\", [\r\n animate(\"300ms ease-out\")\r\n ])\r\n ])\r\n ]\r\n})\r\nexport class ReportColumnHeadersSelectorComponent implements OnChanges {\r\n\r\n @Input() primaryDataSource: ReportTableRowDataSource;\r\n @Input() allowedColumnHeaders: IColumnHeader[];\r\n @Input() columnHeaders: IColumnHeader[];\r\n @Output() columnHeadersChange = new EventEmitter();\r\n\r\n remainingAllowedColumns: IColumnHeader[];\r\n\r\n @ViewChild(\"columnHeaderAutocomplete\", { static: false }) columnHeaderAutocomplete: VAutocompleteComponent;\r\n\r\n trackColumnHeaders(index: number, columnHeader: IColumnHeader) {\r\n return columnHeader.Id;\r\n }\r\n\r\n constructor(\r\n private readonly dynamicReportService: DynamicReportService,\r\n private readonly translationService: TranslationService,\r\n private readonly changeDetectorRef: ChangeDetectorRef,\r\n private readonly veriDate: VeriDate\r\n ) {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n\r\n if (changes[\"columnHeaders\"]) {\r\n\r\n this.dynamicReportService.updateFilterOptionsForColumnHeaders(this.columnHeaders);\r\n this.moveTitleRowToTop(this.columnHeaders);\r\n\r\n }\r\n\r\n if (changes[\"allowedColumnHeaders\"]) {\r\n this.dynamicReportService.updateFilterOptionsForColumnHeaders(this.allowedColumnHeaders);\r\n }\r\n\r\n this.updateRemainingAllowedColumnHeaders();\r\n }\r\n\r\n onMovedColumn(columnHeader: IColumnHeader, direction: \"up\" | \"down\" = \"down\"): void {\r\n\r\n const indexOfColumnHeader = this.columnHeaders.indexOf(columnHeader);\r\n\r\n if (indexOfColumnHeader === -1) {\r\n console.warn(\"Couldn't find column header when trying to move/re-order\");\r\n return;\r\n }\r\n\r\n const newIndex = (direction === \"up\") ? indexOfColumnHeader - 1 : indexOfColumnHeader + 1;\r\n\r\n this.moveColumnHeader(indexOfColumnHeader, newIndex);\r\n }\r\n\r\n onColumnHeaderSelected(columnHeaderSelected: IColumnHeader): void {\r\n if (!columnHeaderSelected) {\r\n return;\r\n }\r\n\r\n const columnHeaderCopy: IColumnHeader = copy(columnHeaderSelected);\r\n\r\n this.columnHeaderAutocomplete.clearInput();\r\n\r\n const indexOfExisting = this.columnHeaders.findIndex(columnHeader => columnHeader.uniqueId === columnHeaderCopy.uniqueId);\r\n\r\n if (indexOfExisting > -1) {\r\n console.warn(\"Column header already exists\");\r\n return;\r\n }\r\n\r\n this.columnHeaders.push(columnHeaderCopy);\r\n\r\n this.updateRemainingAllowedColumnHeaders();\r\n this.forceArrayChanges();\r\n }\r\n\r\n onStartedDragColumnHeader(event: MouseEvent | TouchEvent, columnHeader: IColumnHeader, accordianEntry: AccordianEntryComponent): void {\r\n accordianEntry.close();\r\n }\r\n\r\n onClickEditColumnHeader(columnHeader: IColumnHeader): void {\r\n columnHeader.showEdit = !columnHeader.showEdit;\r\n }\r\n\r\n onFilterTimeChanged(columnHeader: IColumnHeader, value: number, type: \"hour\" | \"minute\"): void {\r\n if (!columnHeader?.filterOptions) {\r\n console.warn(\"No filter options found on column header\");\r\n return;\r\n }\r\n\r\n const filterOptionsProp = (type === \"hour\") ? \"filterTimeHour\" : \"filterTimeMinute\";\r\n\r\n columnHeader.filterOptions[filterOptionsProp] = value;\r\n\r\n const hour: number = (isNaN(columnHeader.filterOptions.filterTimeHour)) ? 0 : columnHeader.filterOptions.filterTimeHour;\r\n const minute: number = (isNaN(columnHeader.filterOptions.filterTimeMinute)) ? 0 : columnHeader.filterOptions.filterTimeMinute;\r\n if (hour == 0 && minute == 0 && columnHeader.FilterValueOperator === TriggerValueOperator.Equals) {\r\n columnHeader.FilterValue = null;\r\n }\r\n else {\r\n columnHeader.FilterValue = this.veriDate.createMoment(new Date()).hour(hour).minute(minute).second(0).format(\"HH:mm:ss\");\r\n }\r\n\r\n this.onFormValueChanged();\r\n }\r\n\r\n onBlurTitle(columnHeader: IColumnHeader): void {\r\n if (!columnHeader.Title) {\r\n this.revertTitle(columnHeader);\r\n }\r\n }\r\n\r\n revertTitle(columnHeader: IColumnHeader): void {\r\n columnHeader.Title = columnHeader.DefaultTitle;\r\n }\r\n\r\n columnHeaderFilter = (columnHeader: IColumnHeader, text: string): boolean => {\r\n return this.columnHeaderSearchPredicate(columnHeader, text);\r\n }\r\n\r\n columnHeaderSearchPredicate(columnHeader: IColumnHeader, text: string): boolean {\r\n const category = columnHeader.dataSourceDefinition.TranslatedDisplayName ? columnHeader.dataSourceDefinition.TranslatedDisplayName : \"Unknown\";\r\n const alreadyAdded: boolean = !!this.columnHeaders.find(header => header.Id === columnHeader.Id);\r\n\r\n const matchesTitle: boolean = columnHeader.Title.toLowerCase().includes(text.toLowerCase());\r\n const matchesDefaultTitle: boolean = columnHeader.DefaultTitle.toLowerCase().includes(text.toLowerCase());\r\n const matchesCategory: boolean = category.toLowerCase().includes(text.toLowerCase());\r\n\r\n const foundMatch = matchesTitle || matchesDefaultTitle || matchesCategory;\r\n\r\n return !alreadyAdded && foundMatch;\r\n }\r\n\r\n deleteColumn(columnHeader: IColumnHeader): void {\r\n const indexOfColumn = this.columnHeaders.indexOf(columnHeader);\r\n\r\n if (indexOfColumn === -1) {\r\n return;\r\n }\r\n\r\n this.columnHeaders.splice(indexOfColumn, 1);\r\n\r\n this.updateRemainingAllowedColumnHeaders();\r\n this.forceArrayChanges();\r\n }\r\n\r\n headerFilter(header: IColumnHeader, text: string): boolean {\r\n return header.ColumnDefinition.TranslatedTitle.toLowerCase().indexOf(text) >= 0;\r\n }\r\n\r\n onFormValueChanged(): void {\r\n this.forceArrayChanges();\r\n }\r\n\r\n // ---\r\n\r\n private moveColumnHeader(indexOfHeader: number, newIndex: number): void {\r\n const removedColumn = this.columnHeaders.splice(indexOfHeader, 1)[0];\r\n\r\n this.columnHeaders.splice(newIndex, 0, removedColumn);\r\n\r\n this.forceArrayChanges();\r\n }\r\n\r\n private forceArrayChanges(): void {\r\n this.moveTitleRowToTop(this.columnHeaders);\r\n\r\n this.columnHeadersChange.next([].concat(this.columnHeaders));\r\n }\r\n\r\n private updateRemainingAllowedColumnHeaders(): void {\r\n\r\n const filteredColumnHeaders = this.allowedColumnHeaders.filter(allowedColumnHeader => {\r\n return !this.columnHeaders.find(addedColumnHeader => addedColumnHeader.Id === allowedColumnHeader.Id);\r\n });\r\n\r\n this.remainingAllowedColumns = [].concat(filteredColumnHeaders);\r\n }\r\n\r\n private moveTitleRowToTop(columnHeaders: IColumnHeader[]): void {\r\n if (!columnHeaders?.length) {\r\n return;\r\n }\r\n\r\n const indexOfTitleRow = this.columnHeaders.findIndex(columnHeader => columnHeader.IsRowTitle);\r\n\r\n if (indexOfTitleRow < 1) {\r\n return;\r\n }\r\n\r\n this.columnHeaders.splice(0, 0, this.columnHeaders.splice(indexOfTitleRow, 1)[0]);\r\n }\r\n}\r\n","export enum ChartDefinition\r\n{\r\n DriverCan,\r\n Temperature\r\n}\r\n\r\n","import { Component, EventEmitter, Input, Output, SimpleChanges } from \"@angular/core\";\r\nimport { IGenericPreference } from \"@app/interfaces/IGenericPreference\";\r\nimport { IPreferencesContent } from \"@app/interfaces/IPreferencesContent\";\r\nimport { Currency } from \"@enums/Currency.enum\";\r\nimport { DurationFormat } from \"@enums/DurationFormat.enum\";\r\nimport { DistanceMeasurement } from \"@enums/measurements/DistanceMeasurement.enum\";\r\nimport { FuelConsumptionMeasurement } from \"@enums/measurements/FuelConsumptionMeasurement.enum\";\r\nimport { TemperatureMeasurement } from \"@enums/measurements/TemperatureMeasurement.enum\";\r\nimport { VolumeMeasurement } from \"@enums/measurements/VolumeMeasurement\";\r\nimport { ICombinedPreferences } from \"@interfaces/ICombinedPreferences\";\r\nimport { IReportDefinition } from \"@reports/models/IReportDefinition\";\r\nimport { PreferencesService } from \"@services/preferences.service\";\r\nimport \"./report-internationalisation-options.component.scss\";\r\n\r\n@Component({\r\n selector: \"report-internationalisation-options\",\r\n template: require(\"./report-internationalisation-options.component.html\")\r\n})\r\nexport class ReportInternationalisationOptionsComponent {\r\n\r\n @Input() report: IReportDefinition;\r\n @Output() reportChange = new EventEmitter();\r\n\r\n preferences: ICombinedPreferences;\r\n\r\n // ---\r\n\r\n Currency = Currency;\r\n DurationFormat = DurationFormat;\r\n VolumeMeasurement = VolumeMeasurement;\r\n DistanceMeasurement = DistanceMeasurement;\r\n TemperatureMeasurement = TemperatureMeasurement;\r\n FuelConsumptionMeasurement = FuelConsumptionMeasurement;\r\n\r\n loading: boolean;\r\n\r\n constructor(private readonly preferencesService: PreferencesService) { }\r\n\r\n onChanged(): void {\r\n // ensures other components are ready before emitting\r\n setTimeout(() => {\r\n this.cacheCustomPreferences(this.report);\r\n this.reportChange.emit(this.report);\r\n });\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n this.prepareReport(this.report);\r\n }\r\n\r\n updateReport(report: IReportDefinition): void {\r\n this.prepareReport(this.report);\r\n }\r\n\r\n // ---\r\n\r\n async prepareReport(report: IReportDefinition): Promise {\r\n if (!report) {\r\n return;\r\n }\r\n\r\n if (!this.hasMissingPreferences(report)) {\r\n this.onChanged();\r\n return;\r\n }\r\n\r\n this.preferences = await this.preferencesService.getAllPreferences();\r\n this.addMissingReportPreferences(report, this.preferences);\r\n this.onChanged();\r\n }\r\n\r\n private addMissingReportPreferences(report: IReportDefinition, preferences: ICombinedPreferences): void {\r\n if (!Currency[report.Currency]) {\r\n report.Currency = preferences.Currency.Value;\r\n }\r\n\r\n if (!VolumeMeasurement[report.VolumeMeasurement]) {\r\n report.VolumeMeasurement = preferences.VolumeMeasurement.Value;\r\n }\r\n\r\n if (!DistanceMeasurement[report.DistanceMeasurement]) {\r\n report.DistanceMeasurement = preferences.DistanceMeasurement.Value;\r\n }\r\n\r\n if (!TemperatureMeasurement[report.TemperatureMeasurement]) {\r\n report.TemperatureMeasurement = preferences.TemperatureMeasurement.Value;\r\n }\r\n\r\n if (!FuelConsumptionMeasurement[report.FuelConsumptionMeasurement]) {\r\n report.FuelConsumptionMeasurement = preferences.FuelConsumptionMeasurement.Value;\r\n }\r\n\r\n if (!DurationFormat[report.DurationFormat]) {\r\n report.DurationFormat = DurationFormat.DaysHoursMinutesSeconds;\r\n }\r\n }\r\n\r\n private hasMissingPreferences(report: IReportDefinition): boolean {\r\n return !Currency[report.Currency]\r\n || !VolumeMeasurement[report.VolumeMeasurement]\r\n || !DistanceMeasurement[report.DistanceMeasurement]\r\n || !TemperatureMeasurement[report.TemperatureMeasurement]\r\n || !FuelConsumptionMeasurement[report.FuelConsumptionMeasurement];\r\n }\r\n\r\n private cacheCustomPreferences(report: IReportDefinition): void {\r\n if (!report) {\r\n return;\r\n }\r\n\r\n const newCachedCustomPreferences: IPreferencesContent = {}\r\n\r\n newCachedCustomPreferences.Currency = this.createPreferenceForCaching(report.Currency);\r\n newCachedCustomPreferences.VolumeMeasurement = this.createPreferenceForCaching(report.VolumeMeasurement);\r\n newCachedCustomPreferences.DistanceMeasurement = this.createPreferenceForCaching(report.DistanceMeasurement);\r\n newCachedCustomPreferences.TemperatureMeasurement = this.createPreferenceForCaching(report.TemperatureMeasurement);\r\n newCachedCustomPreferences.FuelConsumptionMeasurement = this.createPreferenceForCaching(report.FuelConsumptionMeasurement);\r\n\r\n report.cachedCustomPreferences = newCachedCustomPreferences;\r\n }\r\n\r\n private createPreferenceForCaching(value: any): IGenericPreference {\r\n const newGenericPreference: IGenericPreference = {\r\n Value: value,\r\n Section: -1\r\n }\r\n\r\n return newGenericPreference;\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, Output, ViewChild } from \"@angular/core\";\r\nimport { AbstractControl, FormArray, FormBuilder, FormControl, FormGroup, ValidationErrors, ValidatorFn, Validators } from \"@angular/forms\";\r\nimport { CustomFormValidators } from \"@app/directives/_forms/form-validation.service\";\r\nimport { DayOfWeek } from \"@enums/DayOfWeek\";\r\nimport { DynamicReportService, ExportType, IReportScheduleQueryOptions } from \"@reports/_services/dynamicReports.service\";\r\nimport { SchedulingFrequency } from \"@reports/enums/SchedulingFrequency\";\r\nimport { TimeFilterType } from \"@reports/enums/TimeFilterType\";\r\nimport { IDynamicReportSchedule } from \"@reports/models/IDynamicReportSchedule\";\r\nimport { IReportDefinition } from \"@reports/models/IReportDefinition\";\r\nimport { DateService } from \"@services/date.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { copy } from \"angular\";\r\nimport { ReportFiltersComponent } from \"../report-filters/report-filters.component\";\r\nimport \"./report-schedule-editor.component.scss\";\r\n\r\n@Component({\r\n selector: \"report-schedule-editor\",\r\n template: require(\"./report-schedule-editor.component.html\")\r\n})\r\nexport class ReportScheduleEditorComponent implements OnChanges {\r\n\r\n @Input(\"schedule\") originalSchedule: IDynamicReportSchedule;\r\n @Input(\"reportId\") originalReportId: number;\r\n\r\n @Output() save = new EventEmitter();\r\n @Output() delete = new EventEmitter();\r\n @Output() cancel = new EventEmitter();\r\n\r\n @ViewChild(ReportFiltersComponent) reportFilters: ReportFiltersComponent;\r\n\r\n\r\n // ---\r\n\r\n dirtySchedule: IDynamicReportSchedule;\r\n isSaving: boolean;\r\n isDeleting: boolean;\r\n\r\n // ---\r\n\r\n reports: IReportDefinition[];\r\n selectedReport: IReportDefinition;\r\n\r\n timeFilterType = TimeFilterType;\r\n schedulingFrequency = SchedulingFrequency;\r\n exportType = ExportType;\r\n dayOfWeek = DayOfWeek;\r\n\r\n existingScheduleNames: string[];\r\n\r\n startMinuteOfDay: number;\r\n endMinuteOfDay: number;\r\n\r\n scheduleEditorForm: FormGroup;\r\n\r\n get sendTo(): FormArray {\r\n return this.scheduleEditorForm?.get(\"sendTo\") as FormArray;\r\n }\r\n\r\n get reportDefinitionId(): number {\r\n return this.scheduleEditorForm?.get(\"reportDefinitionId\").value;\r\n }\r\n\r\n get reportScheduleName(): string {\r\n return this.scheduleEditorForm?.get(\"scheduleName\").value;\r\n }\r\n\r\n get repeatDate(): number {\r\n return this.scheduleEditorForm?.get(\"repeatDate\").value;\r\n }\r\n\r\n get retryCountExceeded(): boolean {\r\n return this.dirtySchedule.RetryCount >= 50;\r\n }\r\n\r\n constructor(\r\n private readonly dateService: DateService,\r\n private readonly dynamicReportService: DynamicReportService,\r\n private readonly formBuilder: FormBuilder,\r\n private readonly translationService: TranslationService) {\r\n\r\n this.filterSchedulingFrequencies();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.prepareScheduleModel(this.originalSchedule);\r\n }\r\n\r\n ngOnChanges(): void {\r\n this.loadReports();\r\n this.prepareScheduleModel(this.originalSchedule);\r\n }\r\n\r\n cancelSchedule(): void {\r\n this.cancel.emit();\r\n }\r\n\r\n saveSchedule(): void {\r\n this.isSaving = true;\r\n\r\n this.cleanFormData();\r\n\r\n this.dynamicReportService.mapPreferences(this.dirtySchedule, this.dirtySchedule.reportDefinition, \"to-schedule\");\r\n\r\n this.dynamicReportService.saveSchedule(copy(this.dirtySchedule)).then((savedSchedule: IDynamicReportSchedule) => {\r\n this.save.emit(savedSchedule);\r\n }).finally(() => {\r\n this.isSaving = false;\r\n });\r\n }\r\n\r\n reactivateSchedule(): void {\r\n this.dirtySchedule.RetryCount = 0;\r\n this.saveSchedule();\r\n }\r\n\r\n deleteSchedule(confirm: boolean): void {\r\n if (!confirm) {\r\n return;\r\n }\r\n\r\n this.dirtySchedule.Active = false;\r\n\r\n this.isDeleting = true;\r\n\r\n const objectToDelete = copy(this.dirtySchedule);\r\n\r\n this.dynamicReportService.saveSchedule(this.dirtySchedule).then(() => {\r\n this.delete.emit(objectToDelete);\r\n }).finally(() => {\r\n this.isDeleting = false;\r\n });\r\n }\r\n\r\n addEmailRecipient(value: string = \"\") {\r\n this.sendTo.push(this.createEmailRecipientControl(value));\r\n }\r\n\r\n removeEmailRecipient(index: number): void {\r\n this.sendTo.removeAt(index);\r\n this.validateRecipients();\r\n }\r\n\r\n onRecipientValueChanged(): void {\r\n this.validateRecipients();\r\n }\r\n\r\n onReportFiltersChanged(report: IReportDefinition): void {\r\n this.updateScheduleUsingReport(this.dirtySchedule, report);\r\n }\r\n\r\n onTimeFilterStartChange(time: string): void {\r\n if (!time) {\r\n return;\r\n }\r\n const { hour, minute } = this.getHoursAndMinutesFromTimeString(time);\r\n this.startMinuteOfDay = (hour * 60) + minute;\r\n }\r\n\r\n onTimeFilterEndChange(time: string): void {\r\n if (!time) {\r\n return;\r\n }\r\n const { hour, minute } = this.getHoursAndMinutesFromTimeString(time);\r\n this.endMinuteOfDay = (hour * 60) + minute;\r\n }\r\n\r\n reportSelected(report: IReportDefinition): void {\r\n this.setSelectedReport(report.Id);\r\n }\r\n\r\n clearSelectedReport(): void {\r\n this.selectedReport = null;\r\n this.dirtySchedule.reportDefinition = null;\r\n }\r\n\r\n setSelectedReport(reportId: number): void {\r\n if (!reportId || !this.reports?.length) {\r\n return;\r\n }\r\n\r\n const report = this.reports.find(report => report.Id === reportId);\r\n\r\n if (!report) {\r\n return;\r\n }\r\n\r\n this.scheduleEditorForm.get(\"reportDefinitionId\").setValue(report.Id);\r\n\r\n const reportDefinition = copy(report);\r\n\r\n if (this.dirtySchedule.reportDefinition) {\r\n this.updateReportUsingSchedule(this.dirtySchedule, reportDefinition);\r\n } else {\r\n this.updateScheduleUsingReport(this.dirtySchedule, reportDefinition);\r\n }\r\n\r\n this.selectedReport = reportDefinition;\r\n this.dirtySchedule.reportDefinition = reportDefinition;\r\n }\r\n\r\n getReportSummaryText(): string {\r\n if (this.retryCountExceeded) {\r\n return this.translationService.t(\"ReportSchedules.ReportScheduleErrorMessage\");\r\n }\r\n\r\n return `${this.getFrequencyText()} ${this.getPeriodText()} ${this.getRangeText()} ${this.getRecipientsString()}`;\r\n }\r\n\r\n resetDays(): void {\r\n this.dirtySchedule.RepeatOn = [1];\r\n }\r\n\r\n validateSelectedDays(): boolean {\r\n if (this.dirtySchedule.Frequency === SchedulingFrequency.Monthly && this.repeatDate > 0 && this.repeatDate < 31) {\r\n return true;\r\n }\r\n if (!this.dirtySchedule.RepeatOn?.length || (this.dirtySchedule.Frequency === SchedulingFrequency.Weekly && this.dirtySchedule.RepeatOn.length < 2)) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n isFormValid(): boolean {\r\n return this.scheduleEditorForm?.valid\r\n && this.validateSelectedDays()\r\n && !!this.selectedReport\r\n && this.reportSingleResourceIsSelected();\r\n }\r\n\r\n\r\n reportFilter = (report: IReportDefinition, text: string): boolean => {\r\n return report.Title.toLowerCase().indexOf(text.toLowerCase()) >= 0;\r\n }\r\n\r\n // ---\r\n\r\n private prepareScheduleModel(schedule: IDynamicReportSchedule): void {\r\n if (this.dirtySchedule) {\r\n return;\r\n }\r\n\r\n if (schedule?.Id > 0) {\r\n this.dirtySchedule = copy(schedule);\r\n\r\n this.dynamicReportService.parseScheduleParametersJson(this.dirtySchedule);\r\n this.dynamicReportService.parseSchedulePreferencesJson(this.dirtySchedule);\r\n this.dynamicReportService.formatParametersToLocalTimezone(this.dirtySchedule.Parameters);\r\n\r\n this.dirtySchedule.reportDefinition.Parameters = this.dirtySchedule.Parameters;\r\n\r\n } else {\r\n this.dirtySchedule = this.dynamicReportService.createReportScheduleTemplate(this.originalReportId);\r\n }\r\n\r\n this.dynamicReportService.mapPreferences(this.dirtySchedule, this.dirtySchedule.reportDefinition, \"to-report\");\r\n\r\n this.setupForm(this.dirtySchedule);\r\n this.setSelectedReport(this.reportDefinitionId);\r\n\r\n }\r\n\r\n private reportSingleResourceIsSelected(): boolean {\r\n if (!this.reportFilters?.requireSingleResource) {\r\n return true;\r\n }\r\n\r\n return !!this.dirtySchedule.reportDefinition.Parameters.VehicleId || !!this.dirtySchedule.reportDefinition.Parameters.DriverId;\r\n }\r\n\r\n private loadReports() {\r\n this.dynamicReportService.getReports().then(reports => {\r\n this.reports = reports;\r\n\r\n if (this.originalSchedule?.Id) {\r\n this.setSelectedReport(this.originalSchedule.ReportDefinitionId);\r\n } else if (this.originalReportId) {\r\n this.setSelectedReport(this.originalReportId);\r\n }\r\n });\r\n\r\n this.dynamicReportService.getReportSchedules().then(schedules => {\r\n // If we are editing an existing schedule then ignore our own name\r\n if (this.originalSchedule?.Id) {\r\n schedules = schedules.filter(s => s.Id != this.originalSchedule.Id);\r\n }\r\n\r\n this.existingScheduleNames = schedules.map(schedule => schedule.Name);\r\n });\r\n }\r\n\r\n private setupForm(schedule: IDynamicReportSchedule) {\r\n this.scheduleEditorForm = this.formBuilder.group({\r\n scheduleName: [schedule.Name, [Validators.required, Validators.minLength(5), Validators.maxLength(100), CustomFormValidators.emptyWhiteSpace, this.uniqueScheduleNameValidator()]],\r\n repeatDate: [schedule.RunDate || 1, [Validators.required, Validators.min(1), Validators.max(31)]],\r\n reportDefinitionId: [schedule.ReportDefinitionId, [Validators.required, Validators.min(1)]],\r\n sendTo: new FormArray([\r\n ...this.createDefaultRecipients(schedule)\r\n ], [CustomFormValidators.minimumArrayLength(1)])\r\n });\r\n\r\n this.scheduleEditorForm.statusChanges.subscribe((status: string) => {\r\n if (status === \"INVALID\") {\r\n return;\r\n }\r\n\r\n this.processFormChanges();\r\n });\r\n }\r\n\r\n private processFormChanges(): void {\r\n this.mapFormToModel(this.dirtySchedule);\r\n }\r\n\r\n private createDefaultRecipients(schedule: IDynamicReportSchedule): AbstractControl[] {\r\n const emailControls: AbstractControl[] = [];\r\n\r\n schedule.SendTo?.forEach(email => emailControls.push(this.createEmailRecipientControl(email)));\r\n\r\n if (!emailControls.length) {\r\n emailControls.push(this.createEmailRecipientControl());\r\n }\r\n\r\n return emailControls;\r\n }\r\n\r\n private createEmailRecipientControl(value: string = \"\"): AbstractControl {\r\n return new FormControl(value, [Validators.required, Validators.email, CustomFormValidators.duplicateArrayItem]);\r\n }\r\n\r\n private mapFormToModel(schedule: IDynamicReportSchedule): void {\r\n schedule.Name = this.scheduleEditorForm.get(\"scheduleName\").value;\r\n schedule.RunDate = this.scheduleEditorForm.get(\"repeatDate\").value;\r\n schedule.SendTo = this.scheduleEditorForm.get(\"sendTo\").value;\r\n schedule.ReportDefinitionId = this.scheduleEditorForm.get(\"reportDefinitionId\").value;\r\n }\r\n\r\n private filterSchedulingFrequencies(): void {\r\n const enumsToRemove = [SchedulingFrequency.CurrentMonth, SchedulingFrequency.Overnight, SchedulingFrequency.Weekend];\r\n\r\n enumsToRemove.forEach(x => {\r\n let currentFrequency = this.schedulingFrequency as any;\r\n\r\n delete currentFrequency[SchedulingFrequency[x]];\r\n delete currentFrequency[x];\r\n });\r\n }\r\n\r\n private uniqueScheduleNameValidator(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n\r\n if (!this.existingScheduleNames?.length || !control.value) {\r\n return null;\r\n }\r\n\r\n const lowerCaseScheduleName = control.value.toLowerCase();\r\n const isDuplicate = this.existingScheduleNames.find(name => name.toLowerCase() === lowerCaseScheduleName);\r\n\r\n return isDuplicate ? { customMessage: \"Please enter a unique schedule name\" } : null;\r\n };\r\n }\r\n\r\n private validateRecipients(): void {\r\n setTimeout(() => {\r\n this.sendTo.controls.forEach(control => control.updateValueAndValidity());\r\n });\r\n }\r\n\r\n private cleanFormData(): void {\r\n this.trimScheduleName();\r\n }\r\n\r\n private trimScheduleName(): void {\r\n const name = this.dirtySchedule.Name.trim();\r\n if (!name || name.indexOf(' ') < 0) {\r\n return;\r\n }\r\n\r\n this.dirtySchedule.Name = name.replace(' ', ' ');\r\n this.trimScheduleName(); // Repeat until no unnecessary whitespace remains\r\n }\r\n\r\n private updateReportUsingSchedule(schedule: IDynamicReportSchedule, report: IReportDefinition): void {\r\n const scheduleModel = copy(schedule);\r\n\r\n this.dynamicReportService.copyScheduleParametersToReport(scheduleModel, report);\r\n this.dynamicReportService.copySchedulePreferencesToReport(scheduleModel, report);\r\n }\r\n\r\n private updateScheduleUsingReport(schedule: IDynamicReportSchedule, report: IReportDefinition): void {\r\n const reportModel = copy(report);\r\n\r\n reportModel.Parameters.TimeFilterStart = schedule.Parameters.TimeFilterStart\r\n reportModel.Parameters.TimeFilterEnd = schedule.Parameters.TimeFilterEnd\r\n reportModel.Parameters.TimeFilterType = schedule.Parameters.TimeFilterType\r\n\r\n this.dynamicReportService.copyReportParametersToSchedule(reportModel, schedule);\r\n this.dynamicReportService.copyReportPreferencesToSchedule(reportModel, schedule);\r\n }\r\n\r\n private getFrequencyText(): string {\r\n\r\n const reportName = this.reportScheduleName || this.translationService.t(\"ReportSchedules.ScheduleName\");\r\n const translatedFrequency = this.translationService.tEnum(SchedulingFrequency, \"SchedulingFrequency\", this.dirtySchedule.Frequency);\r\n\r\n return this.translationService.t(\"ReportSchedules.WillRun\", [reportName, translatedFrequency])\r\n }\r\n\r\n private getPeriodText(): string {\r\n\r\n switch (this.dirtySchedule.Frequency) {\r\n case SchedulingFrequency.Daily:\r\n if (this.dirtySchedule.RepeatOn.length < 1) {\r\n return '';\r\n }\r\n const days = this.dirtySchedule.RepeatOn.map(day => DayOfWeek[day]);\r\n return this.translationService.t(\"ReportSchedules.ForDays\", [days.join(', ')]);\r\n\r\n case SchedulingFrequency.Weekly:\r\n if (this.dirtySchedule.RepeatOn.length < 1) {\r\n return '';\r\n }\r\n\r\n const startDay = this.translationService.tEnum(DayOfWeek, \"DayOfWeek\", this.dirtySchedule.RepeatOn[0]);\r\n const startDayTime = (this.getStartTime(TimeFilterType.Range) ? this.getStartTime(TimeFilterType.Range) : '') + ' ' + startDay;\r\n\r\n let endDay: string = '--';\r\n if (this.dirtySchedule.RepeatOn.length > 1) {\r\n endDay = this.translationService.tEnum(DayOfWeek, \"DayOfWeek\", this.dirtySchedule.RepeatOn.slice(-1)[0]);\r\n }\r\n\r\n const endDayTime = (this.getEndTime(TimeFilterType.Range) ? this.getEndTime(TimeFilterType.Range) : '') + ' ' + endDay;\r\n\r\n return this.translationService.t(\"ReportSchedules.ForPeriod\", [startDayTime, endDayTime]);\r\n\r\n case SchedulingFrequency.Monthly:\r\n const dayOfMonth = this.dateService.getOrdinalSuffix(this.repeatDate);\r\n return this.translationService.t(\"ReportSchedules.DayOfMonth\", dayOfMonth);\r\n\r\n default:\r\n return `[${this.translationService.t(\"ReportSchedules.Unspecified\")}]`;\r\n\r\n }\r\n\r\n }\r\n\r\n private getRangeText(): string {\r\n if (this.dirtySchedule.Parameters.TimeFilterType !== TimeFilterType.Daily) {\r\n return '';\r\n }\r\n\r\n const startTime = this.getStartTime(TimeFilterType.Daily);\r\n const endTime = this.getEndTime(TimeFilterType.Daily);\r\n\r\n return this.translationService.t(\"ReportSchedules.RangeOf\", [startTime, endTime]);\r\n }\r\n\r\n private getRecipientsString(): string {\r\n let recipientsString = \"\";\r\n\r\n if (this.sendTo.value[0].length < 1) {\r\n return recipientsString;\r\n }\r\n\r\n recipientsString += this.translationService.t(\"ReportScheduleEditor.SendingTo\", this.sendTo.value[0]);\r\n\r\n if (this.sendTo.value.length > 1) {\r\n recipientsString += \" \" + this.translationService.t(\"ReportScheduleEditor.AndXOther\", this.sendTo.value.length - 1);\r\n }\r\n\r\n return recipientsString;\r\n }\r\n\r\n private getStartTime(timeFilterType: TimeFilterType): string {\r\n if (this.dirtySchedule.Parameters.TimeFilterType !== timeFilterType) {\r\n return;\r\n }\r\n return this.dirtySchedule.Parameters.TimeFilterStart;\r\n }\r\n\r\n private getEndTime(timeFilterType: TimeFilterType): string {\r\n if (this.dirtySchedule.Parameters.TimeFilterType !== timeFilterType) {\r\n return;\r\n }\r\n return this.dirtySchedule.Parameters.TimeFilterEnd;\r\n }\r\n\r\n private getHoursAndMinutesFromTimeString(time: string): { hour: number, minute: number } {\r\n const splitTime = time.split(':');\r\n const hour = Number(splitTime[0]);\r\n const minute = Number(splitTime[1]);\r\n\r\n return { hour, minute };\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, Output } from \"@angular/core\";\r\nimport { IComboBox } from \"@interfaces/IComboBox\";\r\nimport { DynamicReportService } from \"@reports/_services/dynamicReports.service\";\r\nimport { ReportTableRowDataSource } from \"@reports/enums/ReportTableRowDataSource\";\r\nimport { IColumnHeader } from \"@reports/models/IColumnHeader\";\r\nimport { IOnChangesObject } from \"angular\";\r\nimport copy from \"fast-copy/dist/fast-copy.esm.js\";\r\nimport \"./row-data-source-selector2.component.scss\";\r\n\r\nexport interface IRowDataSourceOption extends IComboBox {\r\n disableSubRowOptions?: boolean;\r\n}\r\n\r\n//export interface IComponentBindings {\r\n// row: ReportTableRowDataSource;\r\n// subRow: ReportTableRowDataSource;\r\n// columns: IColumnHeader[];\r\n\r\n// horizontal: boolean;\r\n// hideSubGroups: boolean;\r\n\r\n// onChange: (args: { $row: ReportTableRowDataSource, $subRow: ReportTableRowDataSource, rowTitleColumn: IColumnHeader }) => void;\r\n//}\r\n\r\nexport interface IRowDataSourceChange {\r\n row: ReportTableRowDataSource;\r\n subRow: ReportTableRowDataSource;\r\n rowTitleColumn: IColumnHeader;\r\n}\r\n\r\n@Component({\r\n selector: \"row-data-source-selector2\",\r\n template: require(\"./row-data-source-selector2.component.html\")\r\n})\r\nexport class RowDataSourceSelectorComponent2 implements OnChanges {\r\n @Input() row: ReportTableRowDataSource;\r\n @Input() subRow: ReportTableRowDataSource;\r\n @Input() columns: IColumnHeader[];\r\n @Input() horizontal: boolean;\r\n @Input() hideSubGroups: boolean;\r\n\r\n @Output() change = new EventEmitter();\r\n\r\n selectedRowOption: IRowDataSourceOption;\r\n selectedSubRowOption: IRowDataSourceOption;\r\n\r\n originalRowDataSourceOptions: IRowDataSourceOption[] = [\r\n { Name: \"Driver\", Value: ReportTableRowDataSource.Driver },\r\n { Name: \"Vehicle\", Value: ReportTableRowDataSource.Vehicle },\r\n { Name: \"Day\", Value: ReportTableRowDataSource.Day },\r\n { Name: \"Week\", Value: ReportTableRowDataSource.Week },\r\n { Name: \"DriverGroup\", Value: ReportTableRowDataSource.DriverGroup },\r\n { Name: \"VehicleGroup\", Value: ReportTableRowDataSource.VehicleGroup },\r\n { Name: \"VehicleDepot\", Value: ReportTableRowDataSource.VehicleDepot }\r\n ];\r\n\r\n originalSubRowDataSourceOptions: IRowDataSourceOption[] = [\r\n { Name: \"None\", Value: ReportTableRowDataSource.None },\r\n { Name: \"Driver\", Value: ReportTableRowDataSource.Driver },\r\n { Name: \"Vehicle\", Value: ReportTableRowDataSource.Vehicle },\r\n { Name: \"Day\", Value: ReportTableRowDataSource.Day },\r\n { Name: \"Week\", Value: ReportTableRowDataSource.Week },\r\n { Name: \"GeofenceVisit\", Value: ReportTableRowDataSource.GeofenceVisits },\r\n { Name: \"Journey\", Value: ReportTableRowDataSource.Journey },\r\n { Name: \"StationaryLocation\", Value: ReportTableRowDataSource.StationaryLocations },\r\n { Name: \"Route\", Value: ReportTableRowDataSource.Route },\r\n { Name: \"Temperature\", Value: ReportTableRowDataSource.TemperatureRecord },\r\n { Name: \"Alcolock\", Value: ReportTableRowDataSource.AlcolockRecord },\r\n { Name: \"TrailerAssociation\", Value: ReportTableRowDataSource.TrailerAssociation },\r\n { Name: \"VehicleInput\", Value: ReportTableRowDataSource.VehicleInput },\r\n { Name: \"CameraEvent\", Value: ReportTableRowDataSource.CameraEvent },\r\n { Name: \"VehicleEvent\", Value: ReportTableRowDataSource.CommonEvent }\r\n ];\r\n\r\n rowDataSourceOptions: IRowDataSourceOption[] = [];\r\n subRowDataSourceOptions: IRowDataSourceOption[] = [];\r\n\r\n constructor(\r\n private readonly reportService: DynamicReportService\r\n ) {\r\n }\r\n\r\n ngOnChanges(onChangesObj: IOnChangesObject): void {\r\n this.setRowsForDataSource();\r\n this.setSubRowsForDataSource();\r\n this.addSupportedDataSources();\r\n this.validateSelection();\r\n this.setSelectedOptions();\r\n }\r\n\r\n setSelectedOptions(): void {\r\n this.rowDataSourceOptions.forEach(option => {\r\n if (option.Value === this.row) {\r\n this.selectedRowOption = option;\r\n }\r\n });\r\n\r\n this.subRowDataSourceOptions.forEach(option => {\r\n if (option.Value === this.subRow) {\r\n this.selectedSubRowOption = option;\r\n }\r\n });\r\n }\r\n\r\n rowDataSourceChanged(): void {\r\n this.row = Number(this.selectedRowOption.Value);\r\n this.subRow = Number(this.selectedSubRowOption.Value);\r\n\r\n if (this.selectedRowOption.disableSubRowOptions) {\r\n this.selectedSubRowOption = this.subRowDataSourceOptions[0];\r\n this.subRow = ReportTableRowDataSource.None;\r\n }\r\n\r\n this.setSubRowsForDataSource();\r\n\r\n const rowTitleColumn: IColumnHeader = {\r\n Title: this.getTitleForRowDataSource(),\r\n IsRowTitle: true\r\n };\r\n\r\n this.change.emit({\r\n row: this.row,\r\n subRow: this.subRow,\r\n rowTitleColumn: rowTitleColumn\r\n });\r\n }\r\n\r\n private setRowsForDataSource(): void {\r\n this.rowDataSourceOptions = [];\r\n\r\n this.rowDataSourceOptions = copy(this.originalRowDataSourceOptions);\r\n }\r\n\r\n private setSubRowsForDataSource(): void {\r\n this.subRowDataSourceOptions = [];\r\n\r\n this.originalSubRowDataSourceOptions.forEach(combo => {\r\n if (ReportTableRowDataSource[combo.Value] === ReportTableRowDataSource[this.row]) {\r\n return;\r\n }\r\n\r\n if (ReportTableRowDataSource[this.subRow] === ReportTableRowDataSource[this.row]) {\r\n this.subRow = ReportTableRowDataSource.None;\r\n }\r\n\r\n this.subRowDataSourceOptions.push(combo);\r\n });\r\n }\r\n\r\n private addSupportedDataSources(): void {\r\n var geofenceColumns = this.reportService.findColumnsOfType(\"GeofenceVisit\", this.columns);\r\n\r\n if (geofenceColumns.length > 0) {\r\n this.rowDataSourceOptions.push({ Name: \"Geofence\", Value: ReportTableRowDataSource.Geofence });\r\n }\r\n\r\n if (this.reportService.findColumn(\"MaxVehicleSpeed\", \"CommonEvent\", this.columns) ||\r\n this.reportService.findColumn(\"RoadSpeed\", \"CommonEvent\", this.columns) ||\r\n this.reportService.findColumn(\"RoadType\", \"CommonEvent\", this.columns) ||\r\n this.reportService.findColumn(\"RoadTypeDisplay\", \"CommonEvent\", this.columns) ||\r\n this.reportService.findColumn(\"StartLocation\", \"CommonEvent\", this.columns)) {\r\n this.rowDataSourceOptions.push({ Name: \"Road Type\", Value: ReportTableRowDataSource.RoadType });\r\n this.subRowDataSourceOptions.push({ Name: \"Road Type\", Value: ReportTableRowDataSource.RoadType });\r\n }\r\n \r\n if (this.reportService.findColumnsOfType(\"FormSubmission\", this.columns).length) {\r\n this.rowDataSourceOptions.push({ Name: \"FormSubmission\", Value: ReportTableRowDataSource.FormSubmission, disableSubRowOptions: true });\r\n }\r\n\r\n this.rowDataSourceOptions.push({ Name: \"FormSubmission\", Value: ReportTableRowDataSource.FormSubmission, disableSubRowOptions: true });\r\n }\r\n\r\n private validateSelection(): void {\r\n let rowFound = false;\r\n\r\n for (var i = 0; i < this.rowDataSourceOptions.length; i++) {\r\n if (this.rowDataSourceOptions[i].Value === this.row) {\r\n rowFound = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!rowFound) {\r\n this.row = this.rowDataSourceOptions[0].Value;\r\n }\r\n\r\n let subRowFound = false;\r\n for (var i = 0; i < this.subRowDataSourceOptions.length; i++) {\r\n if (this.subRowDataSourceOptions[i].Value === this.subRow) {\r\n subRowFound = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!subRowFound) {\r\n this.subRow = 0;\r\n }\r\n }\r\n\r\n private getTitleForRowDataSource(): string {\r\n switch (this.row) {\r\n case ReportTableRowDataSource.Day:\r\n return \"Day\";\r\n case ReportTableRowDataSource.Week:\r\n return \"Week\";\r\n case ReportTableRowDataSource.Driver:\r\n return \"Driver\";\r\n case ReportTableRowDataSource.Vehicle:\r\n return \"Vehicle\";\r\n case ReportTableRowDataSource.DriverGroup:\r\n return \"Driver Group\";\r\n case ReportTableRowDataSource.VehicleGroup:\r\n return \"Vehicle Group\";\r\n case ReportTableRowDataSource.Geofence:\r\n return \"Geofence\";\r\n case ReportTableRowDataSource.Journey:\r\n return \"Journey\";\r\n case ReportTableRowDataSource.Route:\r\n return \"Route\";\r\n case ReportTableRowDataSource.StationaryLocations:\r\n return \"Stationary Location\";\r\n case ReportTableRowDataSource.TemperatureRecord:\r\n return \"Temperature Record\";\r\n case ReportTableRowDataSource.TrailerAssociation:\r\n return \"Trailer Association\";\r\n }\r\n\r\n return ReportTableRowDataSource[this.row];\r\n }\r\n}\r\n","\r\nexport enum ReportRunProgressState {\r\n Requested,\r\n DataCollection,\r\n PopulateData,\r\n RowCreation,\r\n DocumentCreation,\r\n Finished\r\n}\r\n","import { Component, OnInit } from \"@angular/core\";\r\nimport { DomSanitizer } from \"@angular/platform-browser\";\r\nimport { NavigationService } from \"@app/services/navigation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { IReportHistory } from \"../../models/IDynamicReportLog\";\r\nimport { ReportHistoryService } from \"../../_services/report-history.service\";\r\nimport './report-history-view.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'report-history-view',\r\n template: require('./report-history-view.component.html')\r\n})\r\nexport class ReportHistoryViewComponent implements OnInit {\r\n reportHistoryId: number;\r\n\r\n reportHistory: IReportHistory;\r\n pdfUrl: string\r\n\r\n loading: boolean;\r\n\r\n constructor(\r\n private readonly domSanitizer: DomSanitizer,\r\n private readonly navigationService: NavigationService,\r\n private readonly reportHistoryService: ReportHistoryService) {\r\n\r\n }\r\n\r\n ngOnInit(): void {\r\n this.reportHistoryId = this.navigationService.getRouteParam('reportHistoryId');\r\n\r\n this.getLog();\r\n }\r\n\r\n //--\r\n\r\n private getLog(): void {\r\n this.reportHistoryService.getSingleReportHistory(this.reportHistoryId).pipe(\r\n untilDestroyed(this)\r\n ).subscribe({\r\n next: history => {\r\n this.reportHistory = history;\r\n },\r\n complete: () => this.trustPdfUrl(this.reportHistory.pdfUrl),\r\n error: () => this.loading = false\r\n })\r\n }\r\n\r\n private trustPdfUrl(pdfUrl: string) {\r\n this.pdfUrl = this.domSanitizer.bypassSecurityTrustResourceUrl(pdfUrl) as any;\r\n this.loading = false;\r\n }\r\n\r\n}\r\n","import { Component } from \"@angular/core\";\r\nimport { SpecialUserPermissions } from \"@app/enum/SpecialUserPermissions\";\r\nimport { IAggregateFilterEvent, IFilterBarTab } from \"@directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { ReportTableRowDataSource } from \"@reports/enums/ReportTableRowDataSource\";\r\nimport { IReportHistory } from \"@reports/models/IDynamicReportLog\";\r\nimport { IReportDefinition, IReportDefinitionHistory } from \"@reports/models/IReportDefinition\";\r\nimport { DynamicReportService } from \"@reports/_services/dynamicReports.service\";\r\nimport { AccountService } from \"@services/account.service\";\r\nimport { AccountFeatureService } from \"@services/accountFeature.service\";\r\nimport { NavigationService } from \"@services/navigation.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { lastValueFrom, Subject } from \"rxjs\";\r\nimport { take } from \"rxjs/operators\";\r\nimport { ReportsNavigationModule } from \"../../reports.navigation\";\r\nimport { IReportEditorSave } from \"../../_components/report-editor/report-editor.component\";\r\nimport { ReportHistoryService } from \"../../_services/report-history.service\";\r\nimport \"./report-list-page.component.scss\";\r\n\r\n@Component({\r\n selector: \"report-list-page\",\r\n template: require(\"./report-list-page.component.html\")\r\n})\r\nexport class ReportListPageComponent {\r\n\r\n loading: boolean;\r\n\r\n allHistory: IReportDefinitionHistory[] = [];\r\n selectedCategoryHistory: IReportDefinitionHistory[] = [];\r\n displayReportHistory: IReportDefinitionHistory[] = [];\r\n\r\n definitions: IReportDefinition[];\r\n counts: number[] = [];\r\n\r\n filterTabs: IFilterBarTab[] = [];\r\n\r\n\r\n // dialogs\r\n showScheduleReportDialog: boolean;\r\n reportEditorValid: boolean;\r\n showReportEditor: boolean;\r\n\r\n newReport: IReportDefinition;\r\n\r\n private destroy$: Subject = new Subject();\r\n\r\n constructor(\r\n private readonly reportService: DynamicReportService,\r\n private readonly reportHistoryService: ReportHistoryService,\r\n private readonly translationService: TranslationService,\r\n private readonly navigationService: NavigationService,\r\n private readonly accountService: AccountService,\r\n private readonly accountFeatureService: AccountFeatureService) {\r\n\r\n }\r\n\r\n get userCanCreateReport(): boolean {\r\n return this.accountFeatureService.doesCurrentUserHaveSpecialPermission(SpecialUserPermissions.ManageReportBuilder);\r\n }\r\n\r\n ngOnInit(): void {\r\n this.createTabs();\r\n this.updateHistory(true);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.unsubscribe();\r\n }\r\n\r\n private createTabs(): void {\r\n this.filterTabs = [];\r\n\r\n // Todo: Show hide based on account features\r\n this.createTabDefinition(this.translationService.translate(\"ReportListPage.AllTab\"), (r) => true);\r\n this.createTabDefinition(this.translationService.translate(\"ReportListPage.CameraTab\"), r => this.isReportOfType(r.definition, [\"CameraDataSource\"]));\r\n this.createTabDefinition(this.translationService.translate(\"ReportListPage.DriverTab\"), r => this.filterDriverReports(r));\r\n this.createTabDefinition(this.translationService.translate(\"ReportListPage.VehicleTab\"), r => this.filterVehicleReports(r));\r\n this.createTabDefinition(this.translationService.translate(\"ReportListPage.TMSTab\"), r => this.isReportOfType(r.definition, [\"TmsDataSource\"]));\r\n this.createTabDefinition(this.translationService.translate(\"ReportListPage.TemperatureTab\"), r => this.isReportOfType(r.definition, [\"TemperatureDataSource\", \"TemperatureOutOfBoundsDataSource\"]));\r\n this.createTabDefinition(this.translationService.translate(\"ReportListPage.BreathalockTab\"), r => this.isReportOfType(r.definition, [\"AlcolockDataSource\"]));\r\n this.createTabDefinition(this.translationService.translate(\"ReportListPage.HealthCheckTab\"), r => this.isReportOfType(r.definition, [\"VehicleStatusDataSource\"]));\r\n }\r\n\r\n onFilterBarChange(event: IAggregateFilterEvent) {\r\n\r\n // We sometimes get weird events come through, need to understand why, until then this fixes a bug\r\n // This is LIKELY because of the default (change) subscription?\r\n if (!event.trigger) {\r\n return;\r\n }\r\n\r\n this.displayReportHistory = event.filteredData;\r\n }\r\n\r\n selectReportHistory(reportDefinition: IReportDefinition): void {\r\n this.showReport(reportDefinition.Id);\r\n }\r\n\r\n openReportEditor(): void {\r\n this.showReportEditor = true;\r\n }\r\n\r\n closeReportEditor(): void {\r\n this.showReportEditor = false;\r\n }\r\n\r\n onReportEditorValidated(valid: boolean) {\r\n this.reportEditorValid = valid;\r\n }\r\n\r\n onEditorSaved(reportSave: IReportEditorSave): void {\r\n this.closeReportEditor();\r\n\r\n if (!reportSave?.savedReport?.Id || reportSave.deleted) {\r\n this.updateHistory(true);\r\n return;\r\n }\r\n\r\n this.showReport(reportSave.savedReport.Id);\r\n }\r\n\r\n showReport(reportId: number): void {\r\n this.navigationService.go(ReportsNavigationModule.ViewReport, { reportId: reportId });\r\n }\r\n\r\n filterReportsBySearchText(r: IReportDefinitionHistory, text: string): boolean {\r\n if (r.definition.Title.toLocaleLowerCase().indexOf(text) >= 0) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n // ---\r\n \r\n private updateHistory(showSpinner = false, invalidateCache = false): angular.IPromise {\r\n\r\n this.loading = showSpinner;\r\n\r\n const definitionPromise = this.reportService.getReports(invalidateCache);\r\n const historyPromise = lastValueFrom(this.reportHistoryService.getLatestReportHistory().pipe(take(1))) as angular.IPromise;\r\n const countsPromise = this.reportService.getLogCounts(invalidateCache);\r\n const accountPromise = this.accountService.getAccountData();\r\n\r\n return this.reportService.$q\r\n .all([definitionPromise, historyPromise, countsPromise, accountPromise])\r\n .then(([definitions, history, counts, account]) => {\r\n\r\n this.definitions = definitions.filter(definition => this.accountFeatureService.isReportFeatureEnabledOnAccount(account, definition));\r\n this.counts = counts;\r\n\r\n this.allHistory = this.createReportHistory(this.definitions, history, this.counts);\r\n\r\n this.displayReportHistory = this.allHistory;\r\n })\r\n .finally(() => {\r\n this.loading = false;\r\n });\r\n }\r\n\r\n private createReportHistory(definitions: IReportDefinition[], logs: IReportHistory[], counts: {}): IReportDefinitionHistory[] {\r\n var reportHistory: IReportDefinitionHistory[] = [];\r\n\r\n definitions.forEach(definition => {\r\n if (!definition.Active) {\r\n return;\r\n }\r\n\r\n let history: IReportHistory[] = [];\r\n\r\n logs.forEach(reportLog => {\r\n if (definition.Id === reportLog.ReportDefinitionId) {\r\n history.push(reportLog);\r\n }\r\n });\r\n\r\n reportHistory.push({\r\n definition: definition,\r\n history: history,\r\n latest: history[0],\r\n runCount: counts[definition.Id]\r\n });\r\n });\r\n\r\n reportHistory.sort(this.sortReportHistoryMethod);\r\n\r\n return reportHistory;\r\n }\r\n\r\n private sortReportHistoryMethod(x: IReportDefinitionHistory, y: IReportDefinitionHistory): number {\r\n if (!y.runCount) { return -1; }\r\n if (!x.runCount) { return 1; }\r\n\r\n return y.runCount - x.runCount;\r\n }\r\n\r\n private isReportOfType(report: IReportDefinition, dataSources: string[]): boolean {\r\n return report.TableDefinition.collatedHeaders.some(h => dataSources.some(source => source == h.headerName));\r\n }\r\n\r\n private filterDriverReports(r: IReportDefinitionHistory): boolean {\r\n return r.definition.RowDataSource == ReportTableRowDataSource.Driver;\r\n }\r\n\r\n private filterVehicleReports(r: IReportDefinitionHistory): boolean {\r\n var reportTypesToExclude = [\"AlcolockDataSource\", \"VehicleStatusDataSource\", \"TemperatureDataSource\", \"TemperatureOutOfBoundsDataSource\", \"TmsDataSource\", \"CameraDataSource\"];\r\n\r\n if (this.isReportOfType(r.definition, reportTypesToExclude)) {\r\n return false;\r\n }\r\n\r\n return r.definition.RowDataSource == ReportTableRowDataSource.Vehicle;\r\n }\r\n\r\n private createTabDefinition(translationString: string, callback: (report: IReportDefinitionHistory) => boolean) {\r\n this.filterTabs.push({ title: translationString, predicate: callback });\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, Output, ViewChild } from \"@angular/core\";\r\nimport { DayOfWeek } from \"@enums/DayOfWeek\";\r\nimport { SchedulingFrequency } from \"@reports/enums/SchedulingFrequency\";\r\nimport { IDynamicReportSchedule } from \"@reports/models/IDynamicReportSchedule\";\r\nimport { IReportDefinition } from \"@reports/models/IReportDefinition\";\r\nimport { ExportType } from \"@reports/_services/dynamicReports.service\";\r\nimport { ReportSchedulesComponent } from \"../../_components/report-schedules/report-schedules.component\";\r\nimport \"./report-schedule-page.component.scss\";\r\n\r\n@Component({\r\n selector: \"report-schedule-page\",\r\n template: require(\"./report-schedule-page.component.html\")\r\n})\r\nexport class ReportSchedulePageComponent implements OnChanges {\r\n @Input() reportId: number;\r\n @Output() scheduleClick = new EventEmitter();\r\n\r\n // ---\r\n\r\n reports: IReportDefinition[];\r\n schedules: IDynamicReportSchedule[];\r\n selectedSchedule: IDynamicReportSchedule;\r\n\r\n @ViewChild(ReportSchedulesComponent, { static: false }) reportSchedules: ReportSchedulesComponent\r\n\r\n constructor() {\r\n }\r\n\r\n ngOnChanges() {\r\n }\r\n\r\n addSchedule() {\r\n this.editSchedule({\r\n Name: \"\",\r\n Frequency: SchedulingFrequency.Weekly,\r\n ReportDefinitionId: this.reportId,\r\n ExportType: ExportType.PDF,\r\n RepeatOn: [DayOfWeek.Monday],\r\n Active: true,\r\n SendTo: [\"\"]\r\n });\r\n }\r\n\r\n editSchedule(schedule: IDynamicReportSchedule) {\r\n this.selectedSchedule = schedule;\r\n }\r\n\r\n onCreateScheduleClicked(): void {\r\n this.addSchedule();\r\n }\r\n\r\n onScheduleEditorSaved(schedule: IDynamicReportSchedule) {\r\n this.clearSelectedSchedule();\r\n\r\n this.reportSchedules?.scheduleSaved(schedule);\r\n }\r\n\r\n onScheduleEditorDeleted(schedule: IDynamicReportSchedule) {\r\n this.clearSelectedSchedule();\r\n\r\n this.reportSchedules?.scheduleDeleted(schedule);\r\n }\r\n\r\n // ---\r\n\r\n private clearSelectedSchedule(): void {\r\n this.selectedSchedule = null;\r\n }\r\n\r\n}\r\n","import { Component, Input, OnChanges, OnInit, TemplateRef, ViewChild } from \"@angular/core\";\r\nimport { DomSanitizer } from \"@angular/platform-browser\";\r\nimport { DialogService } from \"@app/directives/_layout/v-dialog/v-dialog.service\";\r\nimport { VTabsComponent } from \"@app/directives/_layout/v-tabs/v-tabs.component\";\r\nimport { VTabComponent } from \"@directives/_layout/v-tabs/v-tab.component\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { IReportHistory } from \"@reports/models/IDynamicReportLog\";\r\nimport { IDynamicReportSchedule } from \"@reports/models/IDynamicReportSchedule\";\r\nimport { IReportDefinition } from \"@reports/models/IReportDefinition\";\r\nimport { IReportEditorSave } from \"@reports/_components/report-editor/report-editor.component\";\r\nimport { ReportSchedulesComponent } from \"@reports/_components/report-schedules/report-schedules.component\";\r\nimport { DynamicReportService } from \"@reports/_services/dynamicReports.service\";\r\nimport { NavigationService } from \"@services/navigation.service\";\r\nimport { copy } from \"angular\";\r\nimport { Subject } from \"rxjs\";\r\nimport { ReportRunProgressState } from \"../../enums/ReportRunProgressState.enum\";\r\nimport { ReportsNavigationModule } from \"../../reports.navigation\";\r\nimport { ReportHistoryService } from \"../../_services/report-history.service\";\r\nimport { ReportHistoryPageComponent } from \"../report-history-page/report-history-page.component\";\r\nimport \"./report-view.component.scss\";\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: \"report-view\",\r\n template: require(\"./report-view.component.html\")\r\n})\r\n\r\nexport class ReportViewComponent implements OnInit, OnChanges {\r\n\r\n @Input() reportId: number;\r\n @Input() report: IReportDefinition;\r\n\r\n // ---\r\n\r\n history: IReportHistory[];\r\n lastReportRun: IReportHistory;\r\n activeSchedules: IDynamicReportSchedule[];\r\n\r\n selectedSchedule: IDynamicReportSchedule;\r\n reportToRun: IReportDefinition;\r\n\r\n loading = false;\r\n loadingReportHistory = false;\r\n runningReport = false;\r\n runningReportFinished = false;\r\n\r\n scheduleSaving = false;\r\n\r\n pdfUrl: string;\r\n\r\n reportEditorValid: boolean;\r\n showReportEditor: boolean;\r\n\r\n selectedHistory: IReportHistory;\r\n\r\n updateSubject = new Subject();\r\n updateSubject$ = this.updateSubject.asObservable();\r\n\r\n requireSingleResource: boolean;\r\n\r\n errorDialog: any;\r\n\r\n selectedTab: VTabComponent;\r\n\r\n @ViewChild(ReportSchedulesComponent, { static: false }) reportSchedules: ReportSchedulesComponent\r\n @ViewChild('errorTemplate') errorTemplate: TemplateRef;\r\n @ViewChild('tabs') tabs: VTabsComponent;\r\n @ViewChild('historyView') historyTab: VTabComponent;\r\n @ViewChild('reportView') viewTab: VTabComponent;\r\n @ViewChild('reportHistory') reportHistory: ReportHistoryPageComponent;\r\n\r\n constructor(\r\n private readonly dialogService: DialogService,\r\n private readonly dynamicReportService: DynamicReportService,\r\n private readonly reportHistoryService: ReportHistoryService,\r\n private readonly navigationService: NavigationService,\r\n private readonly domSanitizer: DomSanitizer\r\n ) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.checkForHistory();\r\n this.subscribeToReportHistory();\r\n }\r\n\r\n ngOnChanges(): void {\r\n this.reportId = parseInt(this.navigationService.getRouteParam(\"reportId\"));\r\n this.loadData();\r\n }\r\n\r\n\r\n openReportRunner(): void {\r\n this.reportToRun = copy(this.report);\r\n }\r\n\r\n closeReportRunner() {\r\n this.reportToRun = null;\r\n this.runningReport = false;\r\n this.runningReportFinished = false;\r\n this.reportHistory?.reloadHistory();\r\n }\r\n\r\n onCreateScheduleClicked(): void {\r\n this.addSchedule();\r\n }\r\n\r\n onReportEditorValidated(valid: boolean) {\r\n this.reportEditorValid = valid;\r\n }\r\n\r\n onReportHistoryClicked(reportHistory: IReportHistory) {\r\n if (!reportHistory.pdfUrl) {\r\n console.warn(\"No pdf url provided for display\");\r\n return;\r\n }\r\n\r\n this.openReportHistory(reportHistory);\r\n }\r\n\r\n onEditorSaved(reportEditorSave: IReportEditorSave): void {\r\n this.closeReportEditor();\r\n\r\n this.report = reportEditorSave.savedReport;\r\n\r\n if (reportEditorSave.savedAsCopy || reportEditorSave.deleted) {\r\n this.navigationService.go(ReportsNavigationModule.ParentRoot);\r\n }\r\n }\r\n\r\n onScheduleEditorSaved(savedSchedule: IDynamicReportSchedule): void {\r\n this.clearSelectedSchedule();\r\n\r\n this.reportSchedules?.scheduleSaved(savedSchedule);\r\n this.activeSchedules = this.reportSchedules?.schedules\r\n }\r\n\r\n onScheduleEditorDeleted(deletedSchedule: IDynamicReportSchedule): void {\r\n this.clearSelectedSchedule();\r\n\r\n this.reportSchedules?.scheduleDeleted(deletedSchedule);\r\n this.activeSchedules = this.reportSchedules?.schedules\r\n }\r\n\r\n onScheduleEditorCancelled(): void {\r\n this.clearSelectedSchedule();\r\n }\r\n\r\n openReportEditor() {\r\n this.showReportEditor = true;\r\n }\r\n\r\n closeReportEditor() {\r\n this.showReportEditor = false;\r\n }\r\n\r\n addSchedule(): void {\r\n this.selectSchedule(this.dynamicReportService.createReportScheduleTemplate(this.report.Id));\r\n }\r\n\r\n selectSchedule(schedule: IDynamicReportSchedule): void {\r\n this.selectedSchedule = copy(schedule);\r\n this.selectedSchedule.ReportDefinitionId = this.report.Id;\r\n }\r\n\r\n runReport(): void {\r\n // Fake timer for better UX\r\n this.loadingReportHistory = true;\r\n setTimeout(() => {\r\n this.loadingReportHistory = false;\r\n this.closeReportRunner();\r\n this.runningReport = true;\r\n this.tabs.selectTab(this.viewTab);\r\n }, 1_000);\r\n\r\n this.clearPdf();\r\n\r\n this.dynamicReportService\r\n .populateReport(this.report)\r\n .then(reportLog => {\r\n this.runningReport = false;\r\n this.runningReportFinished = true;\r\n this.selectHistory(reportLog);\r\n })\r\n .finally(() => {\r\n this.loadingReportHistory = false;\r\n });\r\n }\r\n\r\n viewLastRunReport() {\r\n this.runningReportFinished = false;\r\n const reportLog = this.selectedHistory;\r\n\r\n this.trustPdfUrl(reportLog.pdfUrl);\r\n this.selectHistory(reportLog);\r\n this.createHistory([...this.history, reportLog]);\r\n\r\n this.closeReportRunner();\r\n }\r\n\r\n showLatestReport(event: MouseEvent): void {\r\n event.preventDefault();\r\n\r\n this.loading = true;\r\n this.trustPdfUrl(this.lastReportRun.pdfUrl);\r\n this.selectHistory(this.lastReportRun);\r\n }\r\n\r\n viewHistory(): void {\r\n this.closeReportRunner();\r\n this.tabs.selectTab(this.historyTab);\r\n this.reportHistory?.reloadHistory();\r\n }\r\n\r\n reRunReport(): void {\r\n this.cancelError();\r\n this.runReport();\r\n }\r\n\r\n cancelError(): void {\r\n this.errorDialog.close();\r\n }\r\n\r\n onSelectedTabChanged(tab: VTabComponent): void {\r\n this.selectedTab = tab;\r\n }\r\n\r\n get filtersFormIsValid(): boolean {\r\n return !this.requireSingleResource ||\r\n this.requireSingleResource && (!!this.report.Parameters.VehicleId || !!this.report.Parameters.DriverId);\r\n }\r\n // ---\r\n\r\n private checkForHistory(): void {\r\n const reportHistoryId = this.navigationService.getRouteParam('historyId');\r\n if (!reportHistoryId) {\r\n return;\r\n }\r\n\r\n this.reportHistoryService.getSingleReportHistory(reportHistoryId).pipe(untilDestroyed(this)).subscribe(history => {\r\n this.openReportHistory(history);\r\n this.navigationService.clearRouteParam(\"historyId\");\r\n })\r\n }\r\n\r\n private trustPdfUrl(pdfUrl: string) {\r\n this.pdfUrl = this.domSanitizer.bypassSecurityTrustResourceUrl(pdfUrl) as any;\r\n this.loading = false;\r\n }\r\n\r\n private loadData(): Promise {\r\n this.loading = true;\r\n\r\n this.clearData();\r\n this.clearUpdateSubject();\r\n\r\n const promises: Promise[] = [];\r\n\r\n promises.push(this.loadReport());\r\n promises.push(this.loadReportSchedules(true));\r\n\r\n return Promise.all(promises).finally(() => {\r\n this.processReport(this.report);\r\n this.requireSingleResource = this.dynamicReportService.restrictReportToSingleResource(this.report);\r\n\r\n this.loading = false;\r\n });\r\n }\r\n\r\n private subscribeToReportHistory(): void {\r\n this.reportHistoryService.getReportHistory({ ReportDefinitionId: this.reportId }).pipe(\r\n untilDestroyed(this)\r\n ).subscribe(\r\n history => {\r\n this.createHistory(history);\r\n });\r\n }\r\n\r\n private openReportHistory(reportHistory: IReportHistory): void {\r\n if (reportHistory.ProgressState !== ReportRunProgressState.Finished) {\r\n this.runningReport = true;\r\n }\r\n\r\n this.trustPdfUrl(reportHistory.pdfUrl);\r\n this.selectHistory(reportHistory);\r\n }\r\n\r\n private createHistory(history: IReportHistory[]): void {\r\n this.history = history;\r\n this.processReportHistory(this.history);\r\n }\r\n\r\n private loadReport(): Promise {\r\n return (this.dynamicReportService.getReports() as Promise).then(reports => {\r\n this.report = reports?.find(report => report.Id == this.reportId);\r\n });\r\n }\r\n\r\n private loadReportSchedules(invalidateCache = false): Promise {\r\n return (this.dynamicReportService.getReportSchedules({ invalidateCache: invalidateCache, IsActiveSchedule: true, ReportDefinitionId: this.reportId }) as Promise).then(schedules => {\r\n this.activeSchedules = schedules;\r\n });\r\n }\r\n\r\n private processReport(report: IReportDefinition): void {\r\n this.updateNavigation(report);\r\n }\r\n\r\n private processReportHistory(reportHistory: IReportHistory[]): void {\r\n this.updateLastReportRun(reportHistory);\r\n }\r\n\r\n\r\n private updateNavigation(report: IReportDefinition): void {\r\n if (!report) {\r\n this.navigationService.go(ReportsNavigationModule.ParentRoot);\r\n return;\r\n }\r\n\r\n this.navigationService.updateBreadcrumbNameResolver({ reportNameKey: report.Title });\r\n }\r\n\r\n private updateLastReportRun(reportHistory: IReportHistory[]): void {\r\n if (!reportHistory?.length) {\r\n return;\r\n }\r\n\r\n this.lastReportRun = reportHistory.reduce((prev, current) => {\r\n return (prev.Id > current.Id && prev.ProgressState == ReportRunProgressState.Finished) ? prev : current\r\n });\r\n }\r\n\r\n private clearSelectedSchedule(): void {\r\n this.selectedSchedule = null;\r\n }\r\n\r\n private selectHistory(history: IReportHistory): void {\r\n this.selectedHistory = history;\r\n }\r\n\r\n private clearSelectedHistory(): void {\r\n this.selectedHistory = null;\r\n }\r\n\r\n private clearPdf(): void {\r\n delete this.pdfUrl;\r\n }\r\n\r\n private clearData(): void {\r\n this.report = null;\r\n this.history = null;\r\n this.activeSchedules = null;\r\n }\r\n\r\n private clearUpdateSubject(): void {\r\n this.updateSubject.next();\r\n }\r\n}\r\n","import { CommonModule } from \"@angular/common\";\r\nimport { HttpClientModule } from \"@angular/common/http\";\r\nimport { NgModule, NO_ERRORS_SCHEMA, Type } from \"@angular/core\";\r\nimport { BrowserAnimationsModule } from \"@angular/platform-browser/animations\";\r\nimport { VTableModule } from \"@app/directives/_layout/v-table/v-table.module\";\r\nimport { CoreDirectivesModule } from \"@directives/_core/_core.directives.module\";\r\nimport { FormsDirectivesModule } from \"@directives/_forms/_form.directives.module\";\r\nimport { LayoutDirectivesModule } from \"@directives/_layout/_layout.directives.module\";\r\nimport { MapDirectivesModule } from \"@directives/_map/_map.directives.module\";\r\nimport { MiscDirectivesModule } from \"@directives/_misc/_misc.directives.module\";\r\nimport { ResourceFiltersDirectivesModule } from \"@directives/_resourceFilters/_resourceFilters.directives.module\";\r\nimport { VehicleDirectivesModule } from \"@directives/_vehicle/_vehicle.directives.module\";\r\nimport { VeriDirectivesModule } from \"@directives/_veri/_veri.directives.module\";\r\nimport { providerCreator } from \"@services/_services.module\";\r\nimport { AudioService } from \"@services/audio.service\";\r\nimport { ChartService } from \"@services/charts.service\";\r\nimport { ReeferDetailComponent } from \"@temperature/_components/reefer-detail/reefer-detail.component\";\r\nimport { ReeferListComponent } from \"@temperature/_components/reefer-list/reefer-list.component\";\r\nimport { TemperatureSourceDataComponent } from \"@temperature/_components/temperature-source-data/temperature-source-data.component\";\r\nimport { TemperatureTrendComponent } from \"@temperature/_components/temperature-trend/temperature-trend.component\";\r\nimport { TemperatureGraphComponent2 } from \"@temperature/_components/tempGraph/temperature-graph.component\";\r\nimport { PipesModule } from \"src/app/_pipes/_pipes.module\";\r\nimport { InputListComponent } from \"./_components/compliance/input-list/input-list.component\";\r\nimport { ProbeDetailComponent } from \"./_components/compliance/probe-detail/probe-detail.component\";\r\nimport { StackedProbeReadingComponent } from \"./_components/compliance/stacked-probe-reading/stacked-probe-reading.component\";\r\nimport { TemperatureComplianceDetailComponent } from \"./_components/compliance/temperature-compliance-detail/temperature-compliance-detail.component\";\r\nimport { TemperatureComplianceComponent } from \"./_components/compliance/temperature-compliance/temperature-compliance.component\";\r\nimport { TemperatureLogComponent } from \"./_components/compliance/temperature-log/temperature-log.component\";\r\nimport { ReeferErrorListComponent } from \"./_components/reefer-error-list/reefer-error-list.component\";\r\nimport { ZoneDetailPageComponent } from \"./_components/zone/zone-detail-page/zone-detail-page.component\";\r\nimport { ZoneOverviewPageComponent } from \"./_components/zone/zone-overview-page/zone-overview-page.component\";\r\nimport { ZoneSetPointComponent } from \"./_components/zone/zone-setpoint/zone-setpoint.component\";\r\nimport { ZoneSummaryViewComponent } from \"./_components/zone/zone-summary-view/zone-summary-view.component\";\r\nimport { ZoneTemperatureComponent } from \"./_components/zone/zone-temperature/zone-temperature.component\";\r\nimport { ZonedTemperatureDetailComponent } from \"./_components/zone/zoned-temperature-detail/zoned-temperature-detail.component\";\r\nimport { ZoneOperatingModeWidget } from \"./_components/zone/zoneOperatingModeWidget/zone-operating-mode-widget.component\";\r\nimport { SiteSearchComponent } from \"@app/main/navigation/site-search/site-search.component\";\r\nimport { GroupsModule } from \"@app/main/components/resourceManagement/groups/groups.module\";\r\n\r\nconst privateComponents: Type[] = [\r\n ReeferListComponent,\r\n ReeferDetailComponent,\r\n ReeferErrorListComponent,\r\n\r\n TemperatureGraphComponent2,\r\n TemperatureTrendComponent,\r\n TemperatureSourceDataComponent,\r\n TemperatureComplianceComponent,\r\n TemperatureComplianceDetailComponent,\r\n\r\n ZonedTemperatureDetailComponent,\r\n ZoneOperatingModeWidget,\r\n ZoneSummaryViewComponent,\r\n ZoneDetailPageComponent,\r\n ZoneOverviewPageComponent,\r\n ZoneTemperatureComponent,\r\n ZoneSetPointComponent,\r\n ProbeDetailComponent,\r\n InputListComponent,\r\n TemperatureLogComponent,\r\n\r\n StackedProbeReadingComponent,\r\n\r\n SiteSearchComponent // temporary hack\r\n];\r\n\r\nconst publicComponents: any[] = [\r\n\r\n];\r\n\r\nconst declarations: Type[] = [\r\n];\r\n\r\nconst providers: any[] = [\r\n providerCreator(AudioService, \"audioService\"),\r\n providerCreator(ChartService, \"chartService\"),\r\n];\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n HttpClientModule,\r\n BrowserAnimationsModule,\r\n VeriDirectivesModule,\r\n LayoutDirectivesModule,\r\n PipesModule,\r\n ResourceFiltersDirectivesModule,\r\n MiscDirectivesModule,\r\n VehicleDirectivesModule,\r\n FormsDirectivesModule,\r\n CoreDirectivesModule,\r\n MapDirectivesModule,\r\n VTableModule,\r\n GroupsModule\r\n ],\r\n providers: providers,\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents, ...declarations],\r\n exports: [...publicComponents, ...declarations],\r\n schemas: [NO_ERRORS_SCHEMA] //needed for highcharts\r\n})\r\nexport class TemperatureModule {\r\n constructor() {\r\n }\r\n}\r\n","\r\nimport { Component, OnInit } from \"@angular/core\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { IDiagnosticRecord } from \"@app/main/components/maintenance/faultCodes/_models/IDiagnosticRecord\";\r\nimport { IDiagnosticTroubleCode } from \"@app/main/components/maintenance/faultCodes/_models/IDiagnosticTroubleCode\";\r\nimport { FaultCodesService } from \"@app/main/components/maintenance/faultCodes/fault-codes.service\";\r\nimport { SensorDataService } from \"@app/main/components/maintenance/sensorData/sensor-data.service\";\r\nimport { LatestSensorDataValues, SensorDataValueType } from \"@interfaces/ISensorDataValue\";\r\nimport { NavigationService } from \"@services/navigation.service\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport { MultiStateInputCategory } from \"@temperature/_enums/reefer/MultiStateInputCategory.enum\";\r\nimport { ReeferEngineModeCategory } from \"@temperature/_enums/reefer/ReeferEngineModeCategory.enum\";\r\nimport { ReeferMake } from \"@temperature/_enums/reefer/ReeferMake.enum\";\r\nimport { ReeferOperatingModeCategory } from \"@temperature/_enums/reefer/ReeferOperatingModeCategory.enum\";\r\nimport { IMultiStateInputRecord } from \"@temperature/_models/multiStateInputs/IMultiStateInputRecord\";\r\nimport { IReefer } from \"@temperature/_models/reefer/IReefer\";\r\nimport { IReeferWithMappings } from \"@temperature/_models/reefer/IReeferWithMappings\";\r\nimport { MultiStateInputService } from \"@temperature/_services/multi-state-input.service\";\r\nimport { ReeferService } from \"@temperature/_services/reefer.service\";\r\nimport \"./reefer-detail.component.scss\";\r\nimport { lastValueFrom } from \"rxjs\";\r\n\r\n@Component({\r\n selector: \"reefer-detail\",\r\n template: require('./reefer-detail.component.html')\r\n})\r\nexport class ReeferDetailComponent implements OnInit {\r\n loading: boolean;\r\n\r\n vehicleId: number;\r\n vehicle: IVehicle;\r\n reeferUnit: IReeferWithMappings;\r\n\r\n diagnosticRecords: IDiagnosticRecord[];\r\n diagnosticTroubleCodes: IDiagnosticTroubleCode[];\r\n diagnosticErrors: IDiagnosticTroubleCode[];\r\n\r\n latestMultiStateInputRecords: IMultiStateInputRecord[];\r\n sensorDataValues: LatestSensorDataValues[];\r\n latestSensorDataValues: LatestSensorDataValues;\r\n\r\n ReeferOperatingModeCategory = ReeferOperatingModeCategory;\r\n ReeferEngineModeCategory = ReeferEngineModeCategory;\r\n ReeferMake = ReeferMake;\r\n\r\n constructor(\r\n private readonly faultCodeService: FaultCodesService,\r\n private readonly multiStateInputService: MultiStateInputService,\r\n private readonly navigationService: NavigationService,\r\n private readonly reeferService: ReeferService,\r\n private readonly sensorDataService: SensorDataService,\r\n private readonly vehicleService: VehicleService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.vehicleId = Number(this.navigationService.getRouteParam('vehicleId'));\r\n this.getData(true);\r\n }\r\n\r\n onLastUpdateChanged($event) {\r\n if (this.reeferUnit) {\r\n this.reeferUnit.lastUpdated = $event;\r\n }\r\n }\r\n\r\n //--\r\n\r\n private getData(first = false) {\r\n if (first) {\r\n this.loading = true;\r\n }\r\n\r\n const reeferPromise: Promise = lastValueFrom(this.reeferService.getReeferData({ vehicleId: this.vehicleId }));\r\n const propertiesPromise = this.getPropertiesForReeferData();\r\n\r\n Promise.all([reeferPromise, propertiesPromise])\r\n .then(([reeferUnits, _]) => {\r\n this.reeferUnit = reeferUnits[0];\r\n\r\n this.reeferService.santitiseReeferSerialNumber(this.reeferUnit);\r\n\r\n this.latestSensorDataValues = this.sensorDataValues.find(data => data.vehicleId === this.reeferUnit.VehicleId);\r\n this.getModes();\r\n\r\n this.diagnosticErrors = this.reeferService.getActiveReeferErrors(this.diagnosticRecords, this.diagnosticTroubleCodes);\r\n this.reeferUnit.multiStateInputRecords = this.latestMultiStateInputRecords;\r\n })\r\n .catch(e => {\r\n console.error(e);\r\n })\r\n .finally(() => {\r\n this.loading = false;\r\n })\r\n }\r\n\r\n private getPropertiesForReeferData() {\r\n const promises: any[] = [\r\n this.getVehicleData(),\r\n this.getDiagnosticData(),\r\n this.getMultiStateInputData()\r\n ];\r\n\r\n return Promise.all(promises);\r\n }\r\n\r\n private getVehicleData() {\r\n const vehiclePromise = this.vehicleService.getVehicle(this.vehicleId, { includePeripheralMappings: true }) as Promise;\r\n const sensorDataPromise = this.sensorDataService.getLatestSensorDataValues({ VehicleId: this.vehicleId });\r\n\r\n return Promise.all([vehiclePromise, sensorDataPromise]).then(([vehicle, sensorDataValues]) => {\r\n this.vehicle = vehicle;\r\n this.sensorDataValues = sensorDataValues;\r\n })\r\n }\r\n\r\n private getDiagnosticData() {\r\n const faultCodePromises: any[] = [\r\n this.faultCodeService.getActiveDiagnosticRecordsForVehicle(this.vehicleId),\r\n this.faultCodeService.getReeferDiagnosticTroubleCodes()\r\n ]\r\n\r\n return Promise.all(faultCodePromises).then(([diagnosticRecords, troubleCodes]) => {\r\n this.diagnosticRecords = this.reeferService.filterReeferErrorCodes(diagnosticRecords);\r\n this.diagnosticTroubleCodes = troubleCodes;\r\n })\r\n }\r\n\r\n private getMultiStateInputData() {\r\n lastValueFrom(this.multiStateInputService.getLatestMultiStateInputRecords()).then((latestMultiStateInputRecords) => {\r\n this.latestMultiStateInputRecords = latestMultiStateInputRecords.filter(record => record.VehicleId === this.vehicleId);\r\n })\r\n }\r\n\r\n private getModes() {\r\n const hardwareSource = this.reeferService.getHardwareSource(this.reeferUnit.Make);\r\n\r\n if (this.latestMultiStateInputRecords?.length) {\r\n this.reeferUnit.operatingMode = this.latestMultiStateInputRecords.find(record => record.Category == MultiStateInputCategory.ReeferOperatingMode && record.Source == hardwareSource)?.State;\r\n this.reeferUnit.engineMode = this.latestMultiStateInputRecords.find(record => record.Category == MultiStateInputCategory.ReeferEngineMode && record.Source == hardwareSource)?.State;\r\n }\r\n\r\n this.reeferUnit.voltage = Number(this.latestSensorDataValues?.getValue(SensorDataValueType.PrimaryAuxBatteryVoltage).toFixed(2));\r\n }\r\n}\r\n","import { Component, OnDestroy, OnInit } from \"@angular/core\";\r\nimport { VTableRowStatus } from \"@app/directives/_layout/v-table/_enums/VTableRowStatus.enum\";\r\nimport { IVTableCell } from \"@app/directives/_layout/v-table/_models/IVTableCell\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { TemperatureReadingComponent } from \"@app/directives/_misc/temperatureReading/temperatureReading.component\";\r\nimport { ProgressColourPalette, VProgressBar } from \"@app/directives/_misc/v-progress-bar/v-progress-bar.component\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { FaultCodesService } from \"@app/main/components/maintenance/faultCodes/fault-codes.service\";\r\nimport { IDiagnosticRecord } from \"@app/main/components/maintenance/faultCodes/_models/IDiagnosticRecord\";\r\nimport { IDiagnosticTroubleCode } from \"@app/main/components/maintenance/faultCodes/_models/IDiagnosticTroubleCode\";\r\nimport { SensorDataService } from \"@app/main/components/maintenance/sensorData/sensor-data.service\";\r\nimport { IVehicleWithSensorDataValues } from \"@app/main/components/maintenance/sensorData/_models/IVehicleWithSensorData\";\r\nimport { IAggregateFilterEvent, IFilterBarTab } from \"@directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { LatestSensorDataValues } from \"@interfaces/ISensorDataValue\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { DateService, DateUnit } from \"@services/date.service\";\r\nimport { WindowBreakpoint } from \"@services/responsive.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport { TemperatureNavigationModule } from \"@temperature/temperature.navigation\";\r\nimport { MultiStateInputCategory } from \"@temperature/_enums/reefer/MultiStateInputCategory.enum\";\r\nimport { ReeferEngineModeCategory } from \"@temperature/_enums/reefer/ReeferEngineModeCategory.enum\";\r\nimport { ReeferOperatingModeCategory } from \"@temperature/_enums/reefer/ReeferOperatingModeCategory.enum\";\r\nimport { TemperatureProbeCategory } from \"@temperature/_enums/temperature/TemperatureProbeCategory.enum\";\r\nimport { IMultiStateInput } from \"@temperature/_models/multiStateInputs/IMultiStateInput\";\r\nimport { IMultiStateInputRecord } from \"@temperature/_models/multiStateInputs/IMultiStateInputRecord\";\r\nimport { IReefer } from \"@temperature/_models/reefer/IReefer\";\r\nimport { IReeferWithMappings } from \"@temperature/_models/reefer/IReeferWithMappings\";\r\nimport { ITemperatureOutOfBoundsHistory } from \"@temperature/_models/temperature/ITemperatureOutOfBoundsHistory\";\r\nimport { ITemperatureProbe, ITemperatureProbeWithTemperatureData } from \"@temperature/_models/temperature/ITemperatureProbe\";\r\nimport { ITemperatureRecord } from \"@temperature/_models/temperature/ITemperatureRecord\";\r\nimport { ITemperatureSetpoint } from \"@temperature/_models/temperature/ITemperatureSetpoint\";\r\nimport { ITemperatureSetpointHistory } from \"@temperature/_models/temperature/ITemperatureSetpointHistory\";\r\nimport { IZone, IZoneWithProbes } from \"@temperature/_models/temperature/ITemperatureZone\";\r\nimport { IZoneTemperatureOutOfBoundsHistory } from \"@temperature/_models/temperature/ITemperatureZoneOutOfBoundsHistory\";\r\nimport { MultiStateInputService } from \"@temperature/_services/multi-state-input.service\";\r\nimport { ReeferService } from \"@temperature/_services/reefer.service\";\r\nimport { TemperatureProbeService } from \"@temperature/_services/temperature-probe.service\";\r\nimport { TemperatureSetpointService } from \"@temperature/_services/temperature-setpoint.service\";\r\nimport { ZoneService } from \"@temperature/_services/zone.service\";\r\nimport { lastValueFrom } from \"rxjs\";\r\nimport { ZoneOperatingModeWidget } from \"../zone/zoneOperatingModeWidget/zone-operating-mode-widget.component\";\r\nimport { UnitConversionService, UnitConversionType } from \"../../../../../services/unitConversion.service\";\r\nimport './reefer-list.component.scss';\r\n\r\n@Component({\r\n selector: 'reefer-list',\r\n template: require('./reefer-list.component.html')\r\n})\r\nexport class ReeferListComponent implements OnInit, OnDestroy {\r\n filterEvent: IAggregateFilterEvent;\r\n\r\n reeferData: IReeferWithMappings[];\r\n filteredData: IReeferWithMappings[];\r\n vehicles: IVehicle[];\r\n\r\n zones: IZoneWithProbes[];\r\n\r\n latestMultiStateInputRecords: IMultiStateInputRecord[];\r\n multiStateInputs: IMultiStateInput[];\r\n temperatureSetpoints: ITemperatureSetpoint[];\r\n temperatureSetpointHistories: ITemperatureSetpointHistory[];\r\n zoneTemperatureOutOfBoundsHistory: IZoneTemperatureOutOfBoundsHistory[];\r\n\r\n temperatureProbes: ITemperatureProbeWithTemperatureData[];\r\n temperatureRecords: ITemperatureRecord[];\r\n\r\n diagnosticRecords: IDiagnosticRecord[];\r\n sensorDataValues: LatestSensorDataValues[];\r\n diagnosticTroubleCodes: IDiagnosticTroubleCode[];\r\n\r\n filterTabs: IFilterBarTab[] = [];\r\n\r\n loading: boolean;\r\n updateInterval: ReturnType;\r\n\r\n WindowBreakpoint = WindowBreakpoint;\r\n ReeferOperatingModeCategory = ReeferOperatingModeCategory;\r\n ReeferEngineModeCategory = ReeferEngineModeCategory;\r\n TemperatureProbeCategory = TemperatureProbeCategory;\r\n\r\n dateRangeStart: Date;\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n constructor(\r\n private readonly faultCodeService: FaultCodesService,\r\n private readonly multiStateInputService: MultiStateInputService,\r\n private readonly reeferService: ReeferService,\r\n private readonly sensorDataService: SensorDataService,\r\n private readonly temperatureProbeService: TemperatureProbeService,\r\n private readonly temperatureSetpointService: TemperatureSetpointService,\r\n private readonly translationService: TranslationService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly vTableService: VTableService,\r\n private readonly zoneService: ZoneService,\r\n private readonly dateService: DateService,\r\n private readonly conversionService: UnitConversionService\r\n ) {\r\n this.dateRangeStart = this.dateService.addOrSubtractTime(new Date, -1, DateUnit.Day)\r\n }\r\n\r\n ngOnInit() {\r\n this.createTabs();\r\n\r\n this.createTable();\r\n this.getData(true);\r\n\r\n this.updateInterval = setInterval(() => {\r\n this.getData();\r\n }, 60_000);\r\n }\r\n\r\n ngOnDestroy() {\r\n clearInterval(this.updateInterval);\r\n }\r\n\r\n onRowClicked($event) {\r\n this.reeferService.openReeferDetailsDialog($event.data.vehicle.Id, TemperatureNavigationModule.Reefer);\r\n }\r\n\r\n onFilterChanged($event) {\r\n this.filterEvent = $event;\r\n }\r\n\r\n //--\r\n\r\n private getData(first = false) {\r\n if (first) {\r\n this.loading = true;\r\n }\r\n\r\n const propertiesPromise = this.getPropertiesForReeferData();\r\n const reeferPromise: Promise = lastValueFrom(this.reeferService.getReeferData())\r\n\r\n Promise.all([reeferPromise, propertiesPromise]).then(([reeferUnits, _]) => {\r\n this.reeferData = reeferUnits;\r\n this.reeferData.forEach((reefer) => {\r\n if (!this.vehicles.find(vehicle => vehicle.Id === reefer.VehicleId)) {\r\n // User does not have access to this vehicle or their preferences are to hide it.\r\n return;\r\n }\r\n\r\n this.setupSensorDataForReefer(reefer);\r\n\r\n this.getModes(reefer);\r\n\r\n this.temperatureSetpointService.mapHistoriesToSetPoints(this.temperatureSetpoints, this.temperatureSetpointHistories);\r\n\r\n reefer.multiStateInputRecords = this.multiStateInputService.getVehicleMultiStateInputHistory(reefer.VehicleId, this.latestMultiStateInputRecords);\r\n this.mapPropertiesToZones(reefer);\r\n\r\n const diagnosticRecords = this.diagnosticRecords.filter(diagnosticRecord => diagnosticRecord.VehicleId === reefer.VehicleId);\r\n\r\n reefer.lastUpdated = this.reeferService.getLastUpdated(reefer.zones, diagnosticRecords);\r\n reefer.activeErrors = this.reeferService.getActiveReeferErrors(diagnosticRecords, this.diagnosticTroubleCodes);\r\n reefer.currentError = this.getActiveReeferError(reefer).error;\r\n reefer.errorStatus = this.getActiveReeferError(reefer).status;\r\n reefer.plotId = reefer.vehicle?.PlotId;\r\n });\r\n }).finally(() => {\r\n this.filteredData = this.reeferData.filter(reefer => !!reefer.lastUpdated);\r\n this.tableRows = this.vTableService.createTableRows(this.filteredData, this.tableColumns);\r\n this.loading = false;\r\n });\r\n }\r\n\r\n private getPropertiesForReeferData() {\r\n const promises: PromiseLike[] = [\r\n this.getVehicleData(),\r\n this.getZones(),\r\n this.getDiagnosticData(),\r\n this.getTemperatureData(),\r\n this.getMultiStateInputData()\r\n ]\r\n\r\n return Promise.all(promises);\r\n }\r\n\r\n private getVehicleData() {\r\n const vehiclesPromise = this.vehicleService.getVehicles({ includeLatestPlots: true }) as Promise;\r\n const sensorDataPromise = this.sensorDataService.getLatestSensorDataValues();\r\n\r\n return Promise.all([vehiclesPromise, sensorDataPromise]).then(([vehicles, sensorDataValues]) => {\r\n this.vehicles = vehicles;\r\n this.sensorDataValues = sensorDataValues;\r\n })\r\n }\r\n\r\n private getZones() {\r\n return lastValueFrom(this.zoneService.getZones()).then(zones => {\r\n this.zones = zones;\r\n })\r\n }\r\n\r\n private getDiagnosticData() {\r\n const faultCodePromises: any[] = [\r\n this.faultCodeService.getActiveDiagnosticRecords(),\r\n this.faultCodeService.getReeferDiagnosticTroubleCodes()\r\n ]\r\n\r\n return Promise.all(faultCodePromises).then(([diagnosticRecords, troubleCodes]) => {\r\n this.diagnosticRecords = this.reeferService.filterReeferErrorCodes(diagnosticRecords);\r\n this.diagnosticTroubleCodes = troubleCodes;\r\n })\r\n }\r\n\r\n private getTemperatureData() {\r\n\r\n const temperaturePromises: any[] = [\r\n this.vehicleService.getLatestVehicleTemperatureRecords(false),\r\n lastValueFrom(this.temperatureSetpointService.getTemperatureSetpoints()),\r\n lastValueFrom(this.temperatureSetpointService.getTemperatureSetpointHistories({ Active: true })),\r\n lastValueFrom(this.temperatureProbeService.getTemperatureProbes()),\r\n lastValueFrom(this.zoneService.getZonesTemperatureOutOfBoundsHistory({ Active: true }))\r\n ];\r\n\r\n return Promise.all(temperaturePromises).then(([temperatureRecords, temperatureSetpoints, setpointHistories, temperatureProbes, outOfBoundsHistory]) => {\r\n this.temperatureRecords = temperatureRecords;\r\n this.temperatureSetpoints = temperatureSetpoints;\r\n this.temperatureSetpointHistories = setpointHistories;\r\n this.temperatureProbes = temperatureProbes;\r\n this.zoneTemperatureOutOfBoundsHistory = outOfBoundsHistory;\r\n })\r\n }\r\n\r\n private getMultiStateInputData() {\r\n const multiStateInputPromises: Promise[] = [\r\n lastValueFrom(this.multiStateInputService.getLatestMultiStateInputRecords()),\r\n lastValueFrom(this.multiStateInputService.getMultiStateInputs())\r\n ];\r\n return Promise.all(multiStateInputPromises).then(([latestMultiStateInputRecords, multiStateInputs]) => {\r\n this.latestMultiStateInputRecords = latestMultiStateInputRecords;\r\n this.multiStateInputs = multiStateInputs;\r\n })\r\n }\r\n\r\n private mapPropertiesToZones(reeferUnit: IReeferWithMappings) {\r\n reeferUnit.zones = this.zones.filter(zone => zone.VehicleId === reeferUnit.VehicleId);\r\n\r\n if (!reeferUnit.zones || !reeferUnit.zones.length) {\r\n return;\r\n }\r\n\r\n const probes = this.temperatureProbes.filter(probe => probe.VehicleId === reeferUnit.VehicleId);\r\n const reeferZoneModes = this.zoneService.getLatestReeferZoneOperatingModes(this.latestMultiStateInputRecords, this.multiStateInputs, this.reeferService.getHardwareSource(reeferUnit.Make));\r\n\r\n this.zoneService.mapProbesToZone(reeferUnit.zones, probes);\r\n this.zoneService.mapZoneStatuses(reeferUnit.zones, reeferZoneModes);\r\n this.zoneService.mapTemperatureSetpointsToZones(reeferUnit.zones, this.temperatureSetpoints);\r\n this.zoneService.mapOutOfBoundsHistoryToZones(reeferUnit.zones, this.zoneTemperatureOutOfBoundsHistory);\r\n this.temperatureProbeService.mapProbesLatestRecord(reeferUnit.zones, this.temperatureRecords);\r\n }\r\n\r\n private setupSensorDataForReefer(reeferUnit: IReeferWithMappings) {\r\n const vehicle = this.vehicles.find(vehicle => vehicle.Id === reeferUnit.VehicleId) as IVehicleWithSensorDataValues;\r\n this.reeferService.setupSensorDataForReefer(reeferUnit, vehicle, this.sensorDataValues);\r\n }\r\n\r\n private getModes(reeferUnit: IReeferWithMappings) {\r\n const hardwareSource = this.reeferService.getHardwareSource(reeferUnit.Make);\r\n reeferUnit.operatingMode = this.latestMultiStateInputRecords.find(record => record.Category == MultiStateInputCategory.ReeferOperatingMode && record.Source == hardwareSource && record.VehicleId === reeferUnit.VehicleId)?.State;\r\n reeferUnit.engineMode = this.latestMultiStateInputRecords.find(record => record.Category == MultiStateInputCategory.ReeferEngineMode && record.Source == hardwareSource && record.VehicleId === reeferUnit.VehicleId)?.State;\r\n }\r\n\r\n private getActiveReeferError(reefer: IReeferWithMappings): { error: string, status: VTableRowStatus } {\r\n let error: string;\r\n let status: VTableRowStatus = VTableRowStatus.Info;\r\n\r\n if (reefer.activeErrors.length) {\r\n error = reefer.activeErrors[0]?.Description;\r\n status = VTableRowStatus.Error;\r\n return { error, status };\r\n }\r\n\r\n if (this.zoneService.hasZoneOutOfBounds(reefer)) {\r\n let outOfBoundsList = [];\r\n const zonesOutOfBounds = reefer.zones.filter(zone => zone.outOfBounds);\r\n zonesOutOfBounds.forEach(zone => {\r\n outOfBoundsList.push(zone.Position);\r\n })\r\n\r\n error = this.translationService.t(\"ReeferList.ZonesOutOfBounds\", outOfBoundsList.join(', '));\r\n status = VTableRowStatus.Warning;\r\n }\r\n\r\n\r\n if (this.isReeferInactive(reefer)) {\r\n error = `${this.translationService.t(\"ReeferList.Active\")} ${this.dateService.relativeTime(reefer.lastUpdated)}`;\r\n status = VTableRowStatus.Warning;\r\n }\r\n\r\n return { error, status };\r\n }\r\n\r\n private isReeferInactive(reefer: IReeferWithMappings) {\r\n return !this.dateService.date1IsAfterDate2(reefer.lastUpdated, this.dateRangeStart);\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createStatusTableHeader(),\r\n createCellFunction: (reeferUnit) => this.vTableService.createStatusCell(reeferUnit.errorStatus)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"ReeferList.Alerts\", width: 200, minTableWidth: 475 }),\r\n createCellFunction: (reeferUnit) => this.vTableService.createTableCell(reeferUnit.currentError)\r\n },\r\n {\r\n header: this.vTableService.createVehicleTableHeader(),\r\n createCellFunction: (reeferUnit) => this.vTableService.createVehicleRegCell(reeferUnit.vehicle)\r\n },\r\n {\r\n header: this.vTableService.createLocationInformationHeader({ minTableWidth: 1500 }),\r\n createCellFunction: (reeferUnit) => this.vTableService.createLocationInformationCell({ plot: reeferUnit.vehicle.Plot })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"ReeferList.Fuel\", minTableWidth: 1400 }),\r\n createCellFunction: (reeferUnit) => this.vTableService.createTableCell(reeferUnit.fuelLevel,\r\n {\r\n component: VProgressBar,\r\n componentInputs: { percentage: reeferUnit.fuelLevel, palette: ProgressColourPalette.RAG }\r\n })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"ReeferList.ReeferStatus\", minTableWidth: 1300, width: 130, sortType: SortType.Number, canEdit: true }),\r\n createCellFunction: (reeferUnit) => this.createOperatingModeCell(reeferUnit)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"ReeferList.Engine\", minTableWidth: 1500, width: 130, sortType: SortType.Number, canEdit: true }),\r\n createCellFunction: (reeferUnit) => this.createEngineModeCell(reeferUnit)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t(\"ReeferList.ZoneNo\", 1), width: 60, sortType: SortType.Number, canEdit: true }),\r\n createCellFunction: (reeferUnit) => this.createZoneOpModeCell(reeferUnit, 1)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t(\"ReeferList.SetPointZone\", 1), minTableWidth: 800, sortType: SortType.Number, canEdit: true }),\r\n createCellFunction: (reeferUnit) => this.createSetpointCellForZone(reeferUnit, 1)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t(\"ReeferList.ReturnZone\", 1), minTableWidth: 600, sortType: SortType.Number, canEdit: true }),\r\n createCellFunction: (reeferUnit) => this.getTemperatureReadingCell(reeferUnit, 1, TemperatureProbeCategory.Return)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t(\"ReeferList.SupplyZone\", 1), minTableWidth: 1050, sortType: SortType.Number, canEdit: true }),\r\n createCellFunction: (reeferUnit) => this.getTemperatureReadingCell(reeferUnit, 1, TemperatureProbeCategory.Supply)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t(\"ReeferList.EvaporatorZone\", 1), minTableWidth: 1500, sortType: SortType.Number, canEdit: true }),\r\n createCellFunction: (reeferUnit) => this.getTemperatureReadingCell(reeferUnit, 1, TemperatureProbeCategory.Evaporator)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t(\"ReeferList.ZoneNo\", 2), width: 60, sortType: SortType.Number, canEdit: true, hidden: true }),\r\n createCellFunction: (reeferUnit) => this.createZoneOpModeCell(reeferUnit, 2)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t(\"ReeferList.SetPointZone\", 2), minTableWidth: 800, sortType: SortType.Number, canEdit: true, hidden: true }),\r\n createCellFunction: (reeferUnit) => this.createSetpointCellForZone(reeferUnit, 2)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t(\"ReeferList.ReturnZone\", 2), minTableWidth: 600, sortType: SortType.Number, canEdit: true, hidden: true }),\r\n createCellFunction: (reeferUnit) => this.getTemperatureReadingCell(reeferUnit, 2, TemperatureProbeCategory.Return)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t(\"ReeferList.SupplyZone\", 2), minTableWidth: 1050, sortType: SortType.Number, canEdit: true, hidden: true }),\r\n createCellFunction: (reeferUnit) => this.getTemperatureReadingCell(reeferUnit, 2, TemperatureProbeCategory.Supply)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t(\"ReeferList.EvaporatorZone\", 2), minTableWidth: 1500, sortType: SortType.Number, canEdit: true, hidden: true }),\r\n createCellFunction: (reeferUnit) => this.getTemperatureReadingCell(reeferUnit, 2, TemperatureProbeCategory.Evaporator)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t(\"ReeferList.ZoneNo\", 3), width: 60, sortType: SortType.Number, canEdit: true, hidden: true }),\r\n createCellFunction: (reeferUnit) => this.createZoneOpModeCell(reeferUnit, 3)\r\n },\r\n {\r\n\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t(\"ReeferList.SetPointZone\", 3), minTableWidth: 800, sortType: SortType.Number, canEdit: true, hidden: true }),\r\n createCellFunction: (reeferUnit) => this.createSetpointCellForZone(reeferUnit, 3)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t(\"ReeferList.ReturnZone\", 3), minTableWidth: 600, sortType: SortType.Number, canEdit: true, hidden: true }),\r\n createCellFunction: (reeferUnit) => this.getTemperatureReadingCell(reeferUnit, 3, TemperatureProbeCategory.Return)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t(\"ReeferList.SupplyZone\", 3), minTableWidth: 1050, sortType: SortType.Number, canEdit: true, hidden: true }),\r\n createCellFunction: (reeferUnit) => this.getTemperatureReadingCell(reeferUnit, 3, TemperatureProbeCategory.Supply)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t(\"ReeferList.EvaporatorZone\", 3), minTableWidth: 1500, sortType: SortType.Number, canEdit: true, hidden: true }),\r\n createCellFunction: (reeferUnit) => this.getTemperatureReadingCell(reeferUnit, 3, TemperatureProbeCategory.Evaporator)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t(\"ReeferList.ZoneNo\", 4), width: 60, sortType: SortType.Number, canEdit: true, hidden: true }),\r\n createCellFunction: (reeferUnit) => this.createZoneOpModeCell(reeferUnit, 4)\r\n },\r\n {\r\n\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t(\"ReeferList.SetPointZone\", 4), minTableWidth: 800, sortType: SortType.Number, canEdit: true, hidden: true }),\r\n createCellFunction: (reeferUnit) => this.createSetpointCellForZone(reeferUnit, 4)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t(\"ReeferList.ReturnZone\", 4), minTableWidth: 600, sortType: SortType.Number, canEdit: true, hidden: true }),\r\n createCellFunction: (reeferUnit) => this.getTemperatureReadingCell(reeferUnit, 4, TemperatureProbeCategory.Return)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t(\"ReeferList.SupplyZone\", 4), minTableWidth: 1050, sortType: SortType.Number, canEdit: true, hidden: true }),\r\n createCellFunction: (reeferUnit) => this.getTemperatureReadingCell(reeferUnit, 4, TemperatureProbeCategory.Supply)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t(\"ReeferList.EvaporatorZone\", 4), minTableWidth: 1500, sortType: SortType.Number, canEdit: true, hidden: true }),\r\n createCellFunction: (reeferUnit) => this.getTemperatureReadingCell(reeferUnit, 4, TemperatureProbeCategory.Evaporator)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ minTableWidth: 1200 }),\r\n createCellFunction: (reeferUnit) => this.vTableService.createDateCell(reeferUnit.lastUpdated, { showRelativeTime: true, showErrorIfBeforeDate: this.dateService.addOrSubtractTime(new Date(), -30, DateUnit.Min) })\r\n }\r\n\r\n ]\r\n }\r\n\r\n private getTemperatureReadingCell(reeferUnit: IReeferWithMappings, zoneNumber: number, category: TemperatureProbeCategory): IVTableCell {\r\n const reading = this.getTemperatureReading(reeferUnit.zones, zoneNumber, category);\r\n return this.vTableService.createTableCell(\r\n reading,\r\n {\r\n component: TemperatureReadingComponent,\r\n componentInputs: { temperatureReading: reading },\r\n exportData: this.conversionService.smartConvert(reading, UnitConversionType.Temperature, { precision: 1 })\r\n })\r\n }\r\n\r\n private createZoneOpModeCell(reeferUnit: IReeferWithMappings, zonePosition: number): IVTableCell {\r\n const opMode = this.zoneService.getZoneAtPosition(reeferUnit.zones, zonePosition)?.operatingMode;\r\n return this.vTableService.createTableCell(\r\n opMode,\r\n {\r\n classes: \"text-center\",\r\n component: ZoneOperatingModeWidget,\r\n componentInputs: { category: opMode }\r\n })\r\n }\r\n\r\n private createOperatingModeCell(reeferUnit: IReeferWithMappings): IVTableCell {\r\n const operatingModeString = reeferUnit.operatingMode ? this.translationService.tEnum(ReeferOperatingModeCategory, 'ReeferOperatingModeCategory', reeferUnit.operatingMode) : '';\r\n return this.vTableService.createTableCell(\r\n operatingModeString,\r\n { sortData: reeferUnit.operatingMode || -1 })\r\n }\r\n\r\n private createEngineModeCell(reeferUnit: IReeferWithMappings): IVTableCell {\r\n if (!reeferUnit.engineMode && reeferUnit.engineMode !== 0) {\r\n return this.vTableService.createTableCell(\"\");\r\n }\r\n\r\n const engineModeString = this.translationService.tEnum(ReeferEngineModeCategory, 'ReeferEngineModeCategory', reeferUnit.engineMode);\r\n return this.vTableService.createTableCell(engineModeString, { sortData: reeferUnit.engineMode || -1 })\r\n }\r\n\r\n private createSetpointCellForZone(reeferUnit: IReeferWithMappings, zonePosition: number): IVTableCell {\r\n const reading = this.zoneService.getZoneAtPosition(reeferUnit.zones, zonePosition)?.setpointReading;\r\n\r\n return this.vTableService.createTableCell(\r\n reading,\r\n {\r\n component: TemperatureReadingComponent,\r\n componentInputs: { temperatureReading: reading },\r\n sortData: reading,\r\n exportData: this.conversionService.smartConvert(reading, UnitConversionType.Temperature, { precision: 1 })\r\n })\r\n }\r\n\r\n private getTemperatureReading(zones: IZoneWithProbes[], zonePosition: number, category: TemperatureProbeCategory): number {\r\n const zone = this.zoneService.getZoneAtPosition(zones, zonePosition);\r\n if (!zone || !zone.probes.length) {\r\n return;\r\n }\r\n\r\n const probe = this.temperatureProbeService.getProbeByType(zone.probes, category);\r\n\r\n if (!probe || !probe.latestRecord) {\r\n return;\r\n }\r\n\r\n return probe.latestRecord.Temperature;\r\n }\r\n\r\n private createTabs(): void {\r\n this.filterTabs = [];\r\n\r\n this.createTabDefinition(\"ReeferList.All\", (r) => true);\r\n this.createTabDefinition(\"ReeferList.InAlert\", (r) => r.activeErrors?.length > 0);\r\n this.createTabDefinition(\"ReeferList.OutOfBounds\", (r) => this.zoneService.hasZoneOutOfBounds(r));\r\n this.createTabDefinition(\"ReeferList.LowFuel\", (r) => r.fuelLevel && r.fuelLevel < 15);\r\n this.createTabDefinition(\"ReeferList.Inactive\", (r) => this.isReeferInactive(r));\r\n }\r\n\r\n private createTabDefinition(translationString: string, callback: (reeferUnit: IReeferWithMappings) => boolean) {\r\n\r\n this.filterTabs.push({ title: this.translationService.t(translationString), predicate: callback });\r\n }\r\n}\r\n","import { Component, ElementRef, EventEmitter, HostListener, Input, OnChanges, OnDestroy, Output, SimpleChanges, ViewChild } from \"@angular/core\";\r\nimport { ConstantsService } from \"@app/services/constantsService\";\r\nimport { IVButtonDropDownItem } from \"@directives/_core/v-button/v-button.component\";\r\nimport { SortDirection } from \"@enums/SortDirection\";\r\nimport { IPlot, IPlotTemperatureRecord } from \"@interfaces/IPlot\";\r\nimport { IProbe } from \"@interfaces/IProbe\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { IVehicleInput } from \"@interfaces/IVehicleInput\";\r\nimport { ChartService, ChartType } from \"@services/charts.service\";\r\nimport { ColourService } from \"@services/colour.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { UnitConversionService, UnitConversionType } from \"@services/unitConversion.service\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport { IVehicleInputRecordHistory, VehicleInputService } from \"@services/vehicleInput.service\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport { MultiStateInputCategory } from \"@temperature/_enums/reefer/MultiStateInputCategory.enum\";\r\nimport { ReeferZoneOperatingModeCategory } from \"@temperature/_enums/reefer/ReeferZoneOperatingModeCategory.enum\";\r\nimport { TemperatureProfileMaterialisationOptions } from \"@temperature/_enums/temperature/TemperatureProfileMaterialisationOptions.enum\";\r\nimport { IMultiStateInputWithHistories } from \"@temperature/_models/multiStateInputs/IMultiStateInput\";\r\nimport { IMultiStateInputHistory } from \"@temperature/_models/multiStateInputs/IMultiStateInputHistory\";\r\nimport { IInputCategories } from \"@temperature/_models/temperature/IInputCategories\";\r\nimport { ITemperatureProfile } from \"@temperature/_models/temperature/ITemperatureProfile\";\r\nimport { ITemperatureSetpoint } from \"@temperature/_models/temperature/ITemperatureSetpoint\";\r\nimport { ITemperatureSetpointHistory } from \"@temperature/_models/temperature/ITemperatureSetpointHistory\";\r\nimport { MultiStateInputService } from \"@temperature/_services/multi-state-input.service\";\r\nimport { TemperatureSetpointService } from \"@temperature/_services/temperature-setpoint.service\";\r\nimport { TemperatureService } from \"@temperature/_services/temperature.service\";\r\nimport { ZoneService } from \"@temperature/_services/zone.service\";\r\nimport { IPromise } from \"angular\";\r\nimport { lastValueFrom } from \"rxjs\";\r\nimport './temperature-graph.component.scss';\r\n\r\ndeclare const Highcharts: any;\r\n\r\nexport interface IMultiStateInputHistoryChartData extends IMultiStateInputHistory {\r\n inputName: string;\r\n}\r\n\r\nexport interface ITemperatureSetpointWithHistories extends ITemperatureSetpoint {\r\n histories?: ITemperatureSetpointHistory[];\r\n}\r\n\r\nexport interface IProbeWithTemperatureData extends IProbe {\r\n records: IPlotTemperatureRecord[];\r\n temperatureProfile: ITemperatureProfile;\r\n}\r\n\r\nexport interface IVehicleInputWithHistories extends IVehicleInput {\r\n histories: IVehicleInputRecordHistory[];\r\n}\r\n\r\n@Component({\r\n selector: 'temp-graph',\r\n template: require('./temperature-graph.component.html')\r\n})\r\nexport class TemperatureGraphComponent2 implements OnChanges, OnDestroy {\r\n @Input() vehicle: IVehicle;\r\n @Input() start: Date;\r\n @Input() end: Date;\r\n @Input() plots: IPlot[];\r\n @Input() zoneId: number;\r\n @Input() showSourceDataBtn: boolean;\r\n\r\n @Output() showSourceData = new EventEmitter();\r\n\r\n @ViewChild('tooltipElement', { read: ElementRef }) tooltipElement: ElementRef;\r\n\r\n loading = false;\r\n probeGraphLoading = false;\r\n inputChartLoading = false;\r\n\r\n showTooltip: boolean;\r\n showInputChart: boolean = true;\r\n showResetZoom: boolean;\r\n\r\n tooltipDate: string;\r\n lastUpdated: string;\r\n\r\n tooltipLeft: number;\r\n tooltipTop: number;\r\n tooltipWidth: number = 260;\r\n\r\n plotlinePosition: number;\r\n\r\n tempProfiles: ITemperatureProfile[] = [];\r\n\r\n tooltipInputPoints: any[] = [];\r\n tooltipMultiStateInputPoints: any[] = [];\r\n tooltipProbePoints: any[] = [];\r\n inputCategories: IInputCategories[] = [];\r\n\r\n probeGraphConfig: Highcharts.Options;\r\n inputChartConfig: Highcharts.Options;\r\n\r\n inputChart: Highcharts.ChartObject;\r\n probeGraph: Highcharts.ChartObject;\r\n\r\n exporting: boolean = false;\r\n exportTypes: IVButtonDropDownItem[];\r\n showProbeConfigGraph: boolean = false;\r\n\r\n isMobile: boolean;\r\n\r\n colours = [\"#0d3c55\", \"#0f5b78\", \"#117899\", \"#1395ba\", \"#5ca793\", \"#a2b86c\", \"#ebc844\", \"#ecaa38\", \"#ef8b2c\", \"#f16c20\", \"#d94e1f\", \"#c02e1d\", \"#c01d4e\", \"#b4189a\", \"#e42ed4\", \"#aa47dd\"];\r\n\r\n constructor(\r\n private readonly chartService: ChartService,\r\n private readonly colourService: ColourService,\r\n private readonly constantsService: ConstantsService,\r\n private readonly multiStateInputService: MultiStateInputService,\r\n private readonly temperatureService: TemperatureService,\r\n private readonly temperatureSetpointService: TemperatureSetpointService,\r\n private readonly translationService: TranslationService,\r\n private readonly unitConversionService: UnitConversionService,\r\n private readonly vehicleInputService: VehicleInputService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly zoneService: ZoneService,\r\n private readonly veriDate: VeriDate) {\r\n this.isMobile = this.constantsService.getIsMobile();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[\"vehicle\"] || changes[\"start\"] || changes[\"end\"] || changes[\"zoneId\"]) {\r\n this.resetState();\r\n this.setDefaultStartAndEndDates();\r\n this.loadGraphData();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n delete this.probeGraph;\r\n delete this.inputChart;\r\n }\r\n\r\n @HostListener('mousemove', [\"$event\"])\r\n tooltipMovement($event: MouseEvent): void {\r\n if (!this.probeGraphConfig) {\r\n return;\r\n }\r\n\r\n // min margin of yaxis label\r\n const yAxisMinLabelPadding = 80;\r\n\r\n //series label padding\r\n const seriesLabelPadding = this.probeGraphConfig.series[0]?.data ? 45 : 10;\r\n\r\n // min margin of xaxis label\r\n const XAxisLabelPadding = 41;\r\n\r\n if ($event.offsetX < yAxisMinLabelPadding || $event.offsetY <= seriesLabelPadding || this.tooltipProbePoints.length == 0 && this.tooltipInputPoints.length == 0 && this.tooltipMultiStateInputPoints.length == 0) {\r\n this.hideTooltip();\r\n }\r\n else {\r\n this.showTooltip = true;\r\n }\r\n\r\n const tooltipContainer = $event.currentTarget as HTMLElement;\r\n\r\n if (this.tooltipElement && this.tooltipElement.nativeElement) {\r\n const tooltipXOffset = 20;\r\n this.tooltipLeft = $event.offsetX + (tooltipXOffset);\r\n\r\n if (this.tooltipLeft + tooltipXOffset > tooltipContainer.offsetWidth - this.tooltipWidth) {\r\n this.tooltipLeft = $event.offsetX - (tooltipXOffset * 2);\r\n this.tooltipLeft -= this.tooltipWidth;\r\n }\r\n\r\n\r\n const tooltipYOffset = 50;\r\n // Todo: This is horribly inefficient - cache use of boundingClientRect outside of this method\r\n this.tooltipTop = $event.clientY - tooltipContainer.getBoundingClientRect().top - tooltipYOffset;\r\n this.tooltipTop = Math.min(this.tooltipTop, tooltipContainer.getBoundingClientRect().height - (this.tooltipElement.nativeElement.getBoundingClientRect().height + XAxisLabelPadding));\r\n }\r\n }\r\n\r\n hideTooltip(): void {\r\n this.showTooltip = false;\r\n }\r\n\r\n setPlotline($event: MouseEvent): void {\r\n const charts = [this.inputChart, this.probeGraph];\r\n charts.forEach(currentchart => {\r\n if (!currentchart || !currentchart.xAxis) {\r\n return;\r\n }\r\n\r\n const xaxis = currentchart.xAxis[0] as any;\r\n\r\n this.plotlinePosition = xaxis.toValue($event.offsetX, false);\r\n\r\n this.chartService.addOrUpdateChartCrossHairFromMouseX(xaxis, $event.offsetX);\r\n this.tooltipDate = this.veriDate.formatDate(new Date(this.plotlinePosition));\r\n this.updateTooltipData(currentchart, this.plotlinePosition);\r\n });\r\n }\r\n\r\n resetZoom(): void {\r\n const charts = [this.inputChart, this.probeGraph];\r\n\r\n charts.forEach(currentchart => {\r\n if (!currentchart || !currentchart.xAxis) {\r\n return;\r\n }\r\n\r\n currentchart.xAxis[0].setExtremes(null, null);\r\n\r\n this.showResetZoom = false;\r\n });\r\n }\r\n\r\n onItemClick(event: IVButtonDropDownItem): void {\r\n this.exporting = true;\r\n\r\n const filename = `${this.vehicle.Reg} ${event.label} ${this.veriDate.formatDate(new Date(), 'Date')}`;\r\n\r\n event.data.exportChart({ filename });\r\n\r\n this.resetState();\r\n\r\n this.loadGraphData();\r\n this.exporting = false;\r\n }\r\n\r\n get showExportButton(): boolean {\r\n return !this.isMobile && (this.showProbeConfigGraph || this.showInputChart && !this.probeGraphLoading);\r\n }\r\n\r\n //--\r\n\r\n private resetState(): void {\r\n this.exportTypes = [];\r\n this.showProbeConfigGraph = false;\r\n this.showInputChart = false;\r\n\r\n delete this.probeGraph;\r\n delete this.inputChart;\r\n delete this.probeGraphConfig;\r\n delete this.inputChartConfig;\r\n }\r\n\r\n private loadGraphData(invalidateCache = false): void {\r\n\r\n if (this.latestRequested()) {\r\n invalidateCache = true;\r\n }\r\n\r\n this.probeGraphLoading = true;\r\n this.inputChartLoading = true;\r\n this.tempProfiles = [];\r\n\r\n if (!this.vehicle) {\r\n return;\r\n }\r\n\r\n const promises: any[] = [];\r\n\r\n promises.push(this.loadInputs(invalidateCache))\r\n promises.push(this.loadTemperatureData(invalidateCache));\r\n promises.push(this.loadMultiStateInputs());\r\n promises.push(this.temperatureSetpointService.loadSetpoints(this.vehicle.Id, this.start, this.end));\r\n\r\n Promise.all(promises)\r\n .then(([inputs, probes, multiStateInputs, setpoints]: [IVehicleInputWithHistories[], IProbeWithTemperatureData[], IMultiStateInputWithHistories[], ITemperatureSetpointWithHistories[]]) => {\r\n\r\n this.createProbeChart(probes, setpoints);\r\n this.createInputChart(inputs, multiStateInputs);\r\n })\r\n .finally(() => {\r\n this.showInputChart = this.inputChartConfig && this.inputChartConfig.series[0].data.length > 0;\r\n this.inputChartLoading = false;\r\n this.probeGraphLoading = false;\r\n\r\n if (invalidateCache) {\r\n this.lastUpdated = new Date().toString();\r\n }\r\n else {\r\n this.lastUpdated = null;\r\n }\r\n });\r\n }\r\n\r\n private loadTemperatureData(invalidateCache: boolean): Promise {\r\n const temperaturePromises: IPromise[] = [];\r\n\r\n temperaturePromises.push(this.vehicleService.getProbes(this.vehicle.Id, invalidateCache));\r\n temperaturePromises.push(this.vehicleService.getVehicleTemperatureRecords(this.vehicle.Id, this.veriDate.createMoment(this.start), this.veriDate.createMoment(this.end), invalidateCache));\r\n temperaturePromises.push(this.temperatureService.getTemperatureProfiles(invalidateCache, { MaterialisationOptions: TemperatureProfileMaterialisationOptions.WithHistories }));\r\n\r\n return Promise.all(temperaturePromises).then(([probes, temperatureRecords, temperatureProfiles]: [IProbeWithTemperatureData[], IPlotTemperatureRecord[], ITemperatureProfile[]]) => {\r\n\r\n this.vehicleService.sanitiseVehicleProbes(this.vehicle, probes);\r\n\r\n temperatureRecords.sort((a, b) => {\r\n return this.veriDate.sort(a.Timestamp, b.Timestamp, SortDirection.Ascending);\r\n });\r\n\r\n probes.forEach(probe => {\r\n\r\n probe.records = [];\r\n\r\n temperatureRecords.forEach(record => {\r\n if (record.TemperatureProbeId === probe.Id) {\r\n probe.records.push(record);\r\n }\r\n });\r\n\r\n const profile = temperatureProfiles.find(profile => probe.TemperatureProfileId === profile.Id);\r\n\r\n if (!profile) {\r\n return;\r\n }\r\n\r\n let relevantProfile = profile.TemperatureProfileHistories.find(history => {\r\n //Find relevant profile data for the time period that is being viewed\r\n return this.veriDate.createMoment(this.start).isBetween(this.veriDate.createMoment(history.Start), this.veriDate.createMoment(history.End));\r\n }) as ITemperatureProfile;\r\n\r\n if (!relevantProfile) {\r\n relevantProfile = profile;\r\n }\r\n relevantProfile.LowerBound = this.unitConversionService.convertTemperature(relevantProfile.LowerBound);\r\n relevantProfile.UpperBound = this.unitConversionService.convertTemperature(relevantProfile.UpperBound);\r\n relevantProfile.Name = profile.Name;\r\n\r\n probe.MinPrimaryThreshold = relevantProfile.LowerBound;\r\n probe.MaxPrimaryThreshold = relevantProfile.UpperBound;\r\n\r\n probe.temperatureProfile = relevantProfile;\r\n\r\n // If not added already, add to our list\r\n if (!this.tempProfiles.find(p => p.Id == relevantProfile.Id)) {\r\n this.tempProfiles.push(relevantProfile);\r\n }\r\n });\r\n\r\n return probes;\r\n });\r\n }\r\n\r\n private loadMultiStateInputs(): Promise {\r\n const multiStateInputPromises: Promise[] = [];\r\n\r\n multiStateInputPromises.push(lastValueFrom(this.multiStateInputService.getMultiStateInputs({ VehicleId: this.vehicle.Id })));\r\n multiStateInputPromises.push(lastValueFrom(this.multiStateInputService.getMultiStateInputHistories({ VehicleId: this.vehicle.Id, Start: this.start, End: this.end })));\r\n\r\n return Promise.all(multiStateInputPromises).then(([multiStateInputs, multiStateInputHistories]: [IMultiStateInputWithHistories[], IMultiStateInputHistoryChartData[]]) => {\r\n multiStateInputs.forEach(multiStateInput => {\r\n multiStateInput.histories = multiStateInputHistories.filter(h => h.MultiStateInputId == multiStateInput.Id)\r\n });\r\n\r\n return multiStateInputs;\r\n });\r\n }\r\n\r\n private loadInputs(invalidateCache: boolean): Promise {\r\n\r\n const inputPromises: IPromise[] = [];\r\n inputPromises.push(this.vehicleInputService.getVehicleInputs(this.vehicle.Id, invalidateCache));\r\n inputPromises.push(this.vehicleInputService.getVehicleInputHistory(this.vehicle.Id, this.start, this.end, true, invalidateCache));\r\n\r\n return Promise.all(inputPromises).then(([inputs, inputHistories]: [IVehicleInputWithHistories[], IVehicleInputRecordHistory[]]) => {\r\n inputs.forEach(input => {\r\n input.histories = inputHistories.filter(h => h.InputId == input.Id)\r\n });\r\n\r\n return inputs;\r\n });\r\n }\r\n\r\n\r\n private isInZone(zoneId: number): boolean {\r\n if (!isNaN(this.zoneId) && zoneId && zoneId === this.zoneId) {\r\n return true;\r\n } else if (!isNaN(this.zoneId)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private addTemperatureSeries(temperatureSeries: any[], probe: IProbeWithTemperatureData, index: number): void {\r\n if (!this.isInZone(probe.ZoneId)) {\r\n return;\r\n }\r\n\r\n\r\n const foundRecords = [];\r\n var lastRecord: IPlotTemperatureRecord = null\r\n\r\n probe.records.forEach(record => {\r\n var timestampValue = new Date(record.Timestamp).valueOf();\r\n\r\n if (lastRecord != null && this.veriDate.getDiff(lastRecord.Timestamp, record.Timestamp, \"hours\") > 2) {\r\n foundRecords.push([new Date(timestampValue).valueOf(), null]);\r\n }\r\n\r\n foundRecords.push([timestampValue, this.unitConversionService.convertTemperature(record.Temperature)]);\r\n lastRecord = record;\r\n });\r\n\r\n const seriesColour = this.colourService.getVigetColor(index, 16, 3, this.colours);\r\n\r\n if (foundRecords.length > 0) {\r\n this.showProbeConfigGraph = true;\r\n temperatureSeries.push(\r\n {\r\n name: probe.cleanName,\r\n data: foundRecords,\r\n id: probe.Id,\r\n zoneAxis: 'y',\r\n color: `${seriesColour}`,\r\n lineWidth: 1,\r\n zones: [\r\n {\r\n value: probe.MinPrimaryThreshold,\r\n dashStyle: 'ShortDot',\r\n color: seriesColour,\r\n },\r\n {\r\n value: probe.MaxPrimaryThreshold,\r\n dashStyle: 'solid',\r\n color: seriesColour,\r\n },\r\n {\r\n dashStyle: 'ShortDot',\r\n color: seriesColour,\r\n }\r\n ]\r\n }\r\n );\r\n }\r\n }\r\n\r\n private addSetpointSeries(temperatureSeries: any[], setpoint: ITemperatureSetpointWithHistories): void {\r\n if (!setpoint.histories || !this.zoneId) {\r\n return;\r\n }\r\n\r\n if (!this.isInZone(setpoint.ZoneId)) {\r\n return;\r\n }\r\n\r\n const foundRecords = [];\r\n\r\n setpoint.histories.forEach(record => {\r\n if (this.veriDate.createMoment(record.StartTime).isBefore(this.start) && this.veriDate.createMoment(record.EndTime).isBefore(this.start)) {\r\n return;\r\n }\r\n\r\n if (this.veriDate.createMoment(record.StartTime).isBefore(this.start)) {\r\n foundRecords.push([this.start.valueOf(), this.unitConversionService.convertTemperature(record.SetpointValue)]);\r\n } else {\r\n foundRecords.push([new Date(record.StartTime).valueOf(), this.unitConversionService.convertTemperature(record.SetpointValue)]);\r\n }\r\n\r\n if (record.EndTime) {\r\n foundRecords.push([new Date(record.EndTime).valueOf(), this.unitConversionService.convertTemperature(record.SetpointValue)]);\r\n }\r\n else if (this.veriDate.createMoment(record.EndTime).isAfter(this.end)) {\r\n foundRecords.push([this.end.valueOf(), this.unitConversionService.convertTemperature(record.SetpointValue)]);\r\n }\r\n else {\r\n foundRecords.push([this.end.valueOf(), this.unitConversionService.convertTemperature(record.SetpointValue)]);\r\n }\r\n });\r\n\r\n const seriesColour = this.colourService.getVigetColor(16, 16, 3, this.colours);\r\n\r\n temperatureSeries.push(\r\n {\r\n name: this.translationService.t(\"temperatureGraph.setpoint\"),\r\n data: foundRecords,\r\n id: setpoint.Id,\r\n zoneAxis: 'y',\r\n color: `${seriesColour}`,\r\n lineWidth: 1,\r\n dashStyle: \"LongDash\",\r\n showInLegend: false\r\n }\r\n );\r\n }\r\n\r\n private createProbeChart(probes: IProbeWithTemperatureData[], setpoints: ITemperatureSetpointWithHistories[]): void {\r\n if (!probes.length) {\r\n return;\r\n }\r\n\r\n const temperatureSeries: any[] = [];\r\n\r\n\r\n probes.forEach((probe, index) => {\r\n this.addTemperatureSeries(temperatureSeries, probe, index);\r\n });\r\n\r\n temperatureSeries.sort((a, b) => {\r\n //Ensure legend labels appear alphabetically\r\n if (a.name < b.name) {\r\n return -1;\r\n }\r\n })\r\n\r\n setpoints.forEach((setpoint, index) => {\r\n this.addSetpointSeries(temperatureSeries, setpoint);\r\n });\r\n\r\n this.probeGraphConfig = this.createTempChartConfig(\"line\", temperatureSeries, chart => {\r\n this.probeGraph = chart;\r\n\r\n this.exportTypes.push({ id: 0, label: this.translationService.t(\"Common.Temperature\"), icon: \"panorama\", data: this.probeGraph });\r\n this.sortExportLabels();\r\n\r\n setTimeout(() => {\r\n window.dispatchEvent(new Event('resize'));\r\n });\r\n });\r\n\r\n this.probeGraphConfig.exporting = this.getExportingOptions();\r\n\r\n this.chartService.setChartXAxisExtremes(this.probeGraphConfig, Number(this.end), Number(this.start));\r\n\r\n const series = this.probeGraphConfig.plotOptions as any;\r\n\r\n series.series = {\r\n states: {\r\n inactive: {\r\n opacity: 1\r\n }\r\n },\r\n marker: {\r\n enabled: false,\r\n states: {\r\n hover: {\r\n enabled: false\r\n }\r\n }\r\n }\r\n };\r\n\r\n this.probeGraphConfig.chart.marginLeft = 90;\r\n\r\n this.probeGraphConfig.chart.spacing = [10, 10, 10, 10];\r\n\r\n this.probeGraphConfig.chart.plotBackgroundColor = 'rgba(251,251,251,0.8)';\r\n\r\n this.probeGraphConfig.yAxis = {\r\n title: {\r\n text: `${this.translationService.t('Common.Temperature')} (${this.unitConversionService.getConversionLabel(UnitConversionType.Temperature)})`,\r\n margin: 20\r\n }\r\n };\r\n\r\n this.displayTempProfilesOnGraph();\r\n\r\n this.probeGraphConfig.chart.resetZoomButton = { position: { y: -100 } }; // hides reset button on the chart\r\n this.probeGraphConfig.tooltip = { enabled: false, shared: false };\r\n\r\n this.probeGraphConfig.legend = {\r\n enabled: true,\r\n layout: 'horizontal',\r\n align: 'left',\r\n verticalAlign: 'top',\r\n itemMarginTop: 0,\r\n itemMarginBottom: 0,\r\n width: 1000\r\n\r\n }\r\n\r\n this.syncChartZooming(this.probeGraphConfig);\r\n Highcharts.chart('tempChartContainer', this.probeGraphConfig);\r\n }\r\n\r\n private latestRequested(): boolean {\r\n const now = new Date();\r\n return this.veriDate.date1IsBeforeDate2(now, this.end)\r\n }\r\n\r\n private addInputSeries(inputs: IVehicleInputWithHistories[], categories: string[], seriesColour: string[], seriesData: any[]): void {\r\n inputs.forEach((vehicleInput, index) => {\r\n\r\n if (!this.isInZone(vehicleInput.ZoneId)) {\r\n return;\r\n }\r\n\r\n this.inputCategories.push({\r\n name: vehicleInput.name,\r\n inputStateDescription: vehicleInput.InputStateDescription,\r\n isMultiStateInput: false\r\n });\r\n\r\n categories.push(vehicleInput.name);\r\n\r\n seriesColour.push(this.colourService.getVigetColor(index, vehicleInput.histories.length, 7, this.colours));\r\n\r\n vehicleInput.histories.forEach(historyListItem => {\r\n historyListItem.inputName = vehicleInput.name;\r\n\r\n if (!historyListItem.inputName) {\r\n return;\r\n }\r\n\r\n let x: number;\r\n let x2 = historyListItem.EndUtc ? new Date(historyListItem.EndUtc).valueOf() : Date.now();\r\n\r\n if (this.veriDate.date1IsBeforeDate2(historyListItem.StartUtc, this.start)) {\r\n x = this.veriDate.createMoment(this.start).valueOf();\r\n }\r\n else {\r\n x = this.veriDate.createMoment(historyListItem.StartUtc).valueOf();\r\n }\r\n\r\n if (this.veriDate.date1IsAfterDate2(historyListItem.EndUtc, this.end)) {\r\n x2 = this.veriDate.createMoment(this.end).valueOf();\r\n }\r\n\r\n seriesData.push({\r\n x: x,\r\n x2: x2,\r\n y: categories.indexOf(`${historyListItem.inputName}`),\r\n name: `${historyListItem.inputName}`,\r\n custom: {\r\n inputStateDescription: vehicleInput.InputStateDescription,\r\n isMultiStateInput: false\r\n }\r\n });\r\n });\r\n });\r\n }\r\n\r\n private addMultiStateInputSeries(multiStateInputs: IMultiStateInputWithHistories[], categories: string[], seriesData: any[]): void {\r\n\r\n if (!this.zoneId) {\r\n // We only want multistate inputs on reefer pages\r\n return;\r\n }\r\n\r\n multiStateInputs.forEach(multiStateInput => {\r\n\r\n if (!this.isInZone(multiStateInput.ZoneId)) {\r\n return;\r\n }\r\n\r\n var inputCategoryName = this.translationService.translateEnum(MultiStateInputCategory, \"MultiStateInputCategory\", multiStateInput.Category);\r\n\r\n this.inputCategories.push({\r\n name: inputCategoryName,\r\n inputStateDescription: 1,\r\n isMultiStateInput: true\r\n });\r\n\r\n categories.push(inputCategoryName);\r\n\r\n multiStateInput.histories.forEach((historyListItem: IMultiStateInputHistoryChartData) => {\r\n let x: number;\r\n let x2 = historyListItem.EndTime ? new Date(historyListItem.EndTime).valueOf() : Date.now();\r\n\r\n if (this.veriDate.date1IsBeforeDate2(historyListItem.StartTime, this.start)) {\r\n x = this.veriDate.createMoment(this.start).valueOf();\r\n }\r\n else {\r\n x = this.veriDate.createMoment(historyListItem.StartTime).valueOf();\r\n }\r\n\r\n if (this.veriDate.date1IsAfterDate2(historyListItem.EndTime, this.end)) {\r\n x2 = this.veriDate.createMoment(this.end).valueOf();\r\n }\r\n\r\n seriesData.push({\r\n x: x,\r\n x2: x2,\r\n y: categories.indexOf(inputCategoryName),\r\n name: inputCategoryName,\r\n color: this.getColourForTriggerState(historyListItem, multiStateInputs),\r\n custom: {\r\n inputStateDescription: this.getDescriptionForTriggerState(historyListItem, multiStateInputs),\r\n isMultiStateInput: true\r\n }\r\n });\r\n });\r\n });\r\n }\r\n\r\n private createInputChart(inputs: IVehicleInputWithHistories[], multiStateInputs: IMultiStateInputWithHistories[]): void {\r\n\r\n if (!inputs.length) {\r\n return;\r\n }\r\n\r\n const categories: string[] = [];\r\n const xRangeSeries: any[] = [];\r\n const seriesData: any[] = [];\r\n const seriesColour: string[] = [];\r\n\r\n this.inputCategories = [];\r\n\r\n this.addInputSeries(inputs, categories, seriesColour, seriesData)\r\n this.addMultiStateInputSeries(multiStateInputs, categories, seriesData);\r\n\r\n this.orderInputCategoriesByName();\r\n\r\n xRangeSeries.push({\r\n name: `${this.vehicle.Reg}`,\r\n type: 'xrange',\r\n pointWidth: 20,\r\n pointPadding: 0.4,\r\n data: seriesData,\r\n showInLegend: false\r\n });\r\n\r\n this.inputChartConfig = this.chartService.createBasicXRangeChart(xRangeSeries);\r\n this.inputChartConfig.exporting = this.getExportingOptions();\r\n\r\n this.chartService.setChartXAxisExtremes(this.inputChartConfig, Number(this.end), Number(this.start));\r\n\r\n const yAxis = this.inputChartConfig.yAxis as Highcharts.AxisOptions;\r\n\r\n yAxis.categories = [...categories];\r\n yAxis.minPadding = 100;\r\n\r\n this.inputChartConfig.chart.marginLeft = 90;\r\n this.inputChartConfig.colors = seriesColour;\r\n\r\n var maxSeries = xRangeSeries[0].data.reduce((count, d) => { return Math.max(count, d.y + 1) }, 0);\r\n this.inputChartConfig.chart.height = (maxSeries + 1) * 35;\r\n\r\n this.chartService.setOnLoadCallback(this.inputChartConfig, (chart) => {\r\n this.inputChart = chart;\r\n\r\n this.exportTypes.push({ id: 1, label: this.translationService.t(\"Common.Inputs\"), icon: \"panorama\", data: this.inputChart });\r\n this.sortExportLabels();\r\n\r\n setTimeout(() => {\r\n window.dispatchEvent(new Event('resize'));\r\n }, 1000);\r\n });\r\n\r\n this.inputChartConfig.chart.resetZoomButton = { position: { y: -100 } }; // hides reset button on the chart\r\n\r\n this.syncChartZooming(this.inputChartConfig);\r\n Highcharts.chart('inputChartContainer', this.inputChartConfig);\r\n }\r\n\r\n private createTempChartConfig(chartType: ChartType, series: Highcharts.IndividualSeriesOptions[], callback: (chartObject: Highcharts.ChartObject, event: MouseEvent) => void): Highcharts.Options {\r\n const options = this.chartService.createChartOptions(chartType);\r\n options.series = series;\r\n\r\n options.chart.spacing = [0, 0, 0, 0];\r\n options.chart.marginRight = 0;\r\n\r\n this.chartService.setOnLoadCallback(options, callback);\r\n return options;\r\n }\r\n\r\n private sortExportLabels(): void {\r\n this.exportTypes.sort((a, b) => {\r\n return Number(a.label) - Number(b.label);\r\n });\r\n }\r\n\r\n private getExportingOptions(): Highcharts.ExportingOptions {\r\n return {\r\n enabled: true,\r\n buttons: null,\r\n chartOptions: {\r\n title: {\r\n text: this.vehicle.Reg\r\n },\r\n chart: {\r\n backgroundColor: 'white'\r\n }\r\n }\r\n }\r\n }\r\n\r\n private displayTempProfilesOnGraph(): void {\r\n\r\n this.tempProfiles.forEach((profile, index) => {\r\n const yaxis = this.probeGraphConfig.yAxis as Highcharts.AxisOptions;\r\n\r\n yaxis.plotBands = yaxis.plotBands || [];\r\n yaxis.plotLines = yaxis.plotLines || [];\r\n\r\n const seriesColour = this.colourService.getVigetColor(index, 4, 3);\r\n\r\n yaxis.plotBands.push({\r\n from: profile.LowerBound,\r\n to: profile.UpperBound,\r\n id: profile.Name,\r\n color: this.colourService.createTransparentColor(seriesColour, 0.08),\r\n });\r\n\r\n yaxis.plotLines.push({\r\n value: profile.LowerBound,\r\n color: 'rgba(145,145,145, 0.4)',\r\n dashStyle: 'longdash',\r\n width: 1,\r\n zIndex: 3,\r\n label: {\r\n text: `${profile.Name} Min`,\r\n style: {\r\n color: '#919191',\r\n fontSize: \"12\",\r\n fontWeight: \"400\"\r\n }\r\n }\r\n });\r\n\r\n yaxis.plotLines.push({\r\n value: profile.UpperBound,\r\n color: 'rgba(145,145,145, 0.4)',\r\n dashStyle: 'longdash',\r\n width: 1,\r\n zIndex: 3,\r\n label: {\r\n text: `${profile.Name} Max`,\r\n y: 15,\r\n style: {\r\n color: '#919191',\r\n fontSize: \"12\",\r\n fontWeight: \"400\"\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n private syncChartZooming(currentChart: Highcharts.Options): void {\r\n this.showResetZoom = false;\r\n const xAxis = currentChart.xAxis as Highcharts.AxisOptions;\r\n xAxis.startOnTick = false;\r\n xAxis.endOnTick = false;\r\n\r\n xAxis.events = {\r\n afterSetExtremes: (event: any) => {\r\n if (event.userMax) {\r\n this.showResetZoom = true;\r\n }\r\n\r\n if (event.trigger == \"zoom\") {\r\n if (this.inputChart && currentChart == this.probeGraphConfig) {\r\n this.inputChart.xAxis[0].setExtremes(event.min, event.max, true, true);\r\n }\r\n\r\n if (currentChart == this.inputChartConfig) {\r\n this.probeGraph.xAxis[0].setExtremes(event.min, event.max, true, true);\r\n }\r\n }\r\n }\r\n };\r\n }\r\n\r\n private orderInputCategoriesByName(): void {\r\n this.inputCategories.sort((a, b) => {\r\n if (a.name < b.name) {\r\n return -1;\r\n }\r\n })\r\n }\r\n\r\n private orderTooltipInputPointsByName(): void {\r\n this.tooltipInputPoints.sort((a, b) => {\r\n if (a.name < b.name) {\r\n return -1;\r\n }\r\n })\r\n }\r\n\r\n private orderTooltipMultiStateInputPointsByName(): void {\r\n this.tooltipMultiStateInputPoints.sort((a, b) => {\r\n if (a.name < b.name) {\r\n return -1;\r\n }\r\n })\r\n }\r\n\r\n private updateTooltipData(chart: Highcharts.ChartObject, axisPoint: number): void {\r\n const xaxis = chart.xAxis[0] as any;\r\n\r\n if (chart == this.probeGraph) {\r\n this.tooltipProbePoints = [];\r\n\r\n xaxis.series.forEach(seriesItem => {\r\n const foundProbePoint = seriesItem.data.find(p => p && p.x >= axisPoint);\r\n\r\n if (foundProbePoint) {\r\n this.tooltipProbePoints.push(foundProbePoint);\r\n }\r\n });\r\n }\r\n\r\n if (chart == this.inputChart) {\r\n this.tooltipInputPoints = [];\r\n\r\n xaxis.series.forEach(seriesItem => {\r\n seriesItem.data.forEach(point => {\r\n if (axisPoint >= point.x && axisPoint <= point.x2) {\r\n this.tooltipInputPoints.push(point);\r\n }\r\n });\r\n });\r\n if (this.tooltipInputPoints.length) {\r\n this.orderTooltipInputPointsByName();\r\n }\r\n }\r\n }\r\n\r\n private getColourForTriggerState(historyListItem: IMultiStateInputHistoryChartData, multiStateInputs: IMultiStateInputWithHistories[]) {\r\n const multiStateInput = multiStateInputs.find(input => {\r\n return input.Id === historyListItem.MultiStateInputId;\r\n });\r\n\r\n if (multiStateInput && multiStateInput.Category == MultiStateInputCategory.ReeferZoneOperatingMode) {\r\n var zoneOperatingMode = historyListItem.TriggerState as ReeferZoneOperatingModeCategory;\r\n return this.zoneService.getOperatingModeColour(zoneOperatingMode);\r\n }\r\n\r\n return this.zoneService.getOperatingModeColour(-1);\r\n }\r\n\r\n private getDescriptionForTriggerState(historyListItem: IMultiStateInputHistoryChartData, multiStateInputs: IMultiStateInputWithHistories[]) {\r\n\r\n const multiStateInput = multiStateInputs.find(input => {\r\n return input.Id === historyListItem.MultiStateInputId;\r\n\r\n });\r\n if (multiStateInput) {\r\n return this.multiStateInputService.getTriggerStateName(historyListItem.TriggerState, multiStateInput.Category);\r\n }\r\n }\r\n\r\n private setDefaultStartAndEndDates(): void {\r\n if (!this.start || !this.end) {\r\n this.end = this.veriDate.createMoment(new Date()).toDate();\r\n this.start = this.veriDate.createMoment(this.end).subtract(1, \"day\").toDate();\r\n }\r\n }\r\n}\r\n","export enum TemperatureProfileMaterialisationOptions {\r\n Basic,\r\n WithHistories\r\n}\r\n","import { Component, Input, OnChanges, TemplateRef, ViewChild } from \"@angular/core\";\r\nimport { VTableComponent } from \"@app/directives/_layout/v-table/_components/v-table.component\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { IVehicleInput } from \"@interfaces/IVehicleInput\";\r\nimport { DateService, DateUnit } from \"@services/date.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { IVehicleInputRecordHistory, VehicleInputService } from \"@services/vehicleInput.service\";\r\nimport './input-list.component.scss';\r\n\r\ninterface IInputDataItem {\r\n Id: number;\r\n name: string;\r\n startTime: Date;\r\n startLocation: number;\r\n endTime: Date;\r\n endLocation: number;\r\n duration: number;\r\n}\r\n\r\n@Component({\r\n selector: 'input-list',\r\n template: require('./input-list.component.html')\r\n})\r\nexport class InputListComponent implements OnChanges {\r\n @Input() vehicleId: number;\r\n @Input() vehicleReg: string;\r\n @Input() start: Date;\r\n @Input() end: Date;\r\n\r\n @ViewChild('stackedDateLocationCell') stackedDateLocationCellTemplate: TemplateRef;\r\n @ViewChild('inputListTable') table: VTableComponent;\r\n //--\r\n loading = false;\r\n\r\n inputsData: IInputDataItem[];\r\n vehicleInputs: IVehicleInput[];\r\n inputHistory: IVehicleInputRecordHistory[];\r\n\r\n //// #Tables\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n constructor(\r\n private readonly dateService: DateService,\r\n private readonly translationService: TranslationService,\r\n private readonly vehicleInputService: VehicleInputService,\r\n private readonly vTableService: VTableService) { }\r\n\r\n ngOnInit(): void {\r\n this.createTable();\r\n }\r\n\r\n ngOnChanges(): void {\r\n this.getData();\r\n }\r\n\r\n getData(): Promise {\r\n this.loading = true;\r\n const promises = [];\r\n\r\n promises.push(this.vehicleInputService.getVehicleInputs(this.vehicleId));\r\n promises.push(this.vehicleInputService.getVehicleInputHistory(this.vehicleId, this.start, this.end));\r\n\r\n return Promise.all(promises).then(([vehicleInputs, inputHistory]) => {\r\n this.vehicleInputs = vehicleInputs;\r\n this.inputHistory = inputHistory;\r\n }).finally(() => {\r\n this.setupInputsTable();\r\n this.loading = false;\r\n })\r\n }\r\n\r\n createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'VehicleTimeline.ActiveInputs', width: 200, sorted: true }),\r\n createCellFunction: (item) => this.vTableService.createTableCell(item.name)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: 'VehicleTimeline.InputTableHeaderStartTime', width: 200 }),\r\n createCellFunction: (item) => this.vTableService.createTableCell({ date: item.startTime, plotId: item.startLocation }, { exportData: this.dateService.formatDate(item.startTime), sortData: item.startTime, template: this.stackedDateLocationCellTemplate })\r\n },\r\n {\r\n\r\n header: this.vTableService.createDateTableHeader({ tKey: 'VehicleTimeline.InputTableHeaderEndTime', width: 200 }),\r\n createCellFunction: (item) => this.vTableService.createTableCell(\r\n {\r\n date: item.endTime && new Date(item.endTime),\r\n plotId: item.endLocation\r\n },\r\n {\r\n exportData: item.endTime ? this.dateService.formatDate(item.endTime) : this.translationService.t(\"VehicleTimeline.Current\"),\r\n sortData: item.endTime,\r\n template: this.stackedDateLocationCellTemplate\r\n })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'Common.Duration' }),\r\n createCellFunction: (item) => this.vTableService.createDurationCellFromDates(item.startTime, this.getEndTime(item))\r\n }\r\n ];\r\n }\r\n\r\n\r\n private getEndTime(item: IInputDataItem): Date {\r\n if (item.endTime) {\r\n return new Date(item.endTime);\r\n }\r\n\r\n return new Date();\r\n }\r\n\r\n private setupInputsTable(): void {\r\n this.inputsData = [];\r\n\r\n if (!this.inputHistory) {\r\n return;\r\n }\r\n\r\n this.inputHistory.forEach((input, index) => {\r\n\r\n this.vehicleInputs.forEach(vehicleInput => {\r\n if (input.InputId == vehicleInput.Id) {\r\n input.inputName = vehicleInput.name;\r\n input.inputStateDescription = vehicleInput.InputStateDescription;\r\n }\r\n });\r\n\r\n this.inputsData.push(\r\n this.createInputItem(input, index),\r\n );\r\n });\r\n this.tableRows = this.vTableService.createTableRows(this.inputsData, this.tableColumns);\r\n }\r\n\r\n private createInputItem(input: IVehicleInputRecordHistory, index: number): IInputDataItem {\r\n let startDate = new Date(input.StartUtc);\r\n let endDate = input.EndUtc ? new Date(input.EndUtc) : new Date();\r\n\r\n return {\r\n Id: index,\r\n name: input.inputName,\r\n startTime: startDate,\r\n startLocation: input.StartPlotId,\r\n endTime: input.EndUtc ? new Date(input.EndUtc) : null,\r\n endLocation: input.EndPlotId,\r\n duration: endDate.getTime() - startDate.getTime()\r\n }\r\n\r\n }\r\n}\r\n","import { Component, Input, OnChanges, OnInit, ViewChild } from \"@angular/core\";\r\nimport { VTableComponent } from \"@app/directives/_layout/v-table/_components/v-table.component\";\r\nimport { VTableRowStatus } from \"@app/directives/_layout/v-table/_enums/VTableRowStatus.enum\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { IDateCellOptions, VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { SortDirection } from \"@enums/SortDirection\";\r\nimport { DateService, DateUnit } from \"@services/date.service\";\r\nimport { UnitConversionService, UnitConversionType } from \"@services/unitConversion.service\";\r\nimport { ITemperatureProbe, ITemperatureProbeWithTemperatureData } from \"@temperature/_models/temperature/ITemperatureProbe\";\r\nimport { IVehicleWithTemperatureData } from \"@temperature/_models/temperature/IVehicleWithTemperatureData\";\r\nimport { TemperatureProbeService } from \"@temperature/_services/temperature-probe.service\";\r\nimport { TemperatureRecordService } from \"@temperature/_services/temperature-record.service\";\r\nimport { lastValueFrom } from \"rxjs\";\r\nimport './probe-detail.component.scss';\r\n\r\n@Component({\r\n selector: 'probe-detail',\r\n template: require('./probe-detail.component.html')\r\n})\r\nexport class ProbeDetailComponent implements OnChanges, OnInit {\r\n loading = false;\r\n\r\n @Input() vehicle: IVehicleWithTemperatureData;\r\n\r\n @ViewChild(VTableComponent) table: VTableComponent;\r\n\r\n //--\r\n temperatureProbes: ITemperatureProbeWithTemperatureData[];\r\n\r\n UnitConversionType = UnitConversionType;\r\n\r\n SortDirection = SortDirection;\r\n\r\n dateCellOptions: IDateCellOptions;\r\n\r\n // Tables\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n constructor(\r\n private readonly dateService: DateService,\r\n private readonly temperatureProbeService: TemperatureProbeService,\r\n private readonly temperatureRecordService: TemperatureRecordService,\r\n private readonly unitConversionService: UnitConversionService,\r\n private readonly vTableService: VTableService) { }\r\n\r\n\r\n ngOnInit(): void {\r\n this.createTable();\r\n }\r\n\r\n ngOnChanges(): void {\r\n this.getData();\r\n }\r\n\r\n //--\r\n\r\n\r\n private getData(): Promise {\r\n this.loading = true;\r\n const promises = [];\r\n promises.push(this.getProbes());\r\n promises.push(lastValueFrom(this.temperatureRecordService.getLatestTemperatureRecordsForVehicle(this.vehicle.Id)));\r\n\r\n return Promise.all(promises).then(([probes, latestTemperatureRecords]) => {\r\n\r\n probes.forEach(probe => {\r\n this.temperatureProbeService.mapProbeLatestRecord(probe, latestTemperatureRecords);\r\n });\r\n\r\n this.dateCellOptions = {\r\n showErrorIfBeforeDate: this.dateService.addOrSubtractTime(new Date(), -30, DateUnit.Min)\r\n }\r\n\r\n this.temperatureProbes = probes;\r\n this.getProfileNames();\r\n this.getTimeInAlarm();\r\n\r\n }).finally(() => {\r\n this.filterProbes();\r\n this.tableRows = this.vTableService.createTableRows(this.temperatureProbes, this.tableColumns);\r\n this.loading = false;\r\n });\r\n }\r\n\r\n private getProbes(): Promise {\r\n if (this.vehicle.temperatureProbes?.length) {\r\n return Promise.resolve(this.vehicle.temperatureProbes);\r\n }\r\n\r\n return lastValueFrom(this.temperatureProbeService.getTemperatureProbesForVehicle(this.vehicle.Id));\r\n }\r\n\r\n private getProfileNames(): void {\r\n if (!this.temperatureProbes) {\r\n return;\r\n }\r\n\r\n this.temperatureProbes.forEach(probe => {\r\n if (!probe.TemperatureProfile) {\r\n probe.profileName = \"\";\r\n return;\r\n }\r\n\r\n const lowerBoundString = this.unitConversionService.smartConvert(probe.TemperatureProfile?.LowerBound, UnitConversionType.Temperature);\r\n const upperBoundString = this.unitConversionService.smartConvert(probe.TemperatureProfile?.UpperBound, UnitConversionType.Temperature);\r\n\r\n probe.profileName = `${probe.TemperatureProfile?.Name} (${lowerBoundString} - ${upperBoundString})`;\r\n\r\n })\r\n }\r\n\r\n private getTimeInAlarm(): void {\r\n this.temperatureProbes.forEach(probe => {\r\n\r\n const outOfBounds = probe.outOfBoundsHistories.find(history => !history.EndUtc);\r\n if (!outOfBounds) {\r\n probe.status = VTableRowStatus.Info;\r\n return;\r\n }\r\n\r\n if (this.temperatureProbeService.temperatureIsInBoundsAccordingToProfile(probe)) {\r\n return;\r\n }\r\n\r\n probe.timeInAlarm = new Date().getTime() - new Date(outOfBounds.StartUtc).getTime();\r\n probe.status = VTableRowStatus.Error;\r\n probe.inAlarm = true;\r\n })\r\n }\r\n \r\n private filterProbes(): void {\r\n if (!this.temperatureProbes) {\r\n return;\r\n }\r\n this.temperatureProbes = this.temperatureProbes.filter(probe => !!probe.latestRecord);\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createStatusTableHeader(),\r\n createCellFunction: (probe) => this.vTableService.createStatusCell(probe.status)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"TempCompliance.ProbeName\" }),\r\n createCellFunction: (probe) => this.vTableService.createTableCell(probe.cleanName)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"Common.LastUpdated\" }),\r\n createCellFunction: (probe) => this.vTableService.createDateCell(\r\n probe.latestRecord.Timestamp, {\r\n showRelativeTime: true,\r\n showErrorIfBeforeDate: this.dateService.addOrSubtractTime(new Date(), -30, DateUnit.Min),\r\n showWarningIfBeforeDate: this.dateService.addOrSubtractTime(new Date(), -14, DateUnit.Min)\r\n })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"TempCompliance.LatestTemperature\" }),\r\n createCellFunction: (probe) => this.vTableService.createTableCell(this.unitConversionService.smartConvert(probe.latestRecord.Temperature, UnitConversionType.Temperature, { precision: 1 }), { sortData: probe.latestRecord.Temperature, classes: probe.inAlarm ? 'red-color ' : '' })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"TempCompliance.TimeInAlarm\" }),\r\n createCellFunction: (probe) => this.vTableService.createDurationCell(probe.timeInAlarm, DateUnit.Ms)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"TempCompliance.Profile\" }),\r\n createCellFunction: (probe) => this.vTableService.createTableCell(probe.profileName)\r\n }\r\n\r\n ];\r\n }\r\n\r\n}\r\n","import { Component, Input, OnChanges, ViewChild } from \"@angular/core\";\r\nimport { VTableComponent } from \"@app/directives/_layout/v-table/_components/v-table.component\";\r\nimport { IVTableCell } from \"@app/directives/_layout/v-table/_models/IVTableCell\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { DateService, DateUnit } from \"@services/date.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { UnitConversionService, UnitConversionType } from \"@services/unitConversion.service\";\r\nimport { ITemperatureOutOfBoundsHistory } from \"@temperature/_models/temperature/ITemperatureOutOfBoundsHistory\";\r\nimport { ITemperatureProbe, ITemperatureProbeWithTemperatureData } from \"@temperature/_models/temperature/ITemperatureProbe\";\r\nimport { IVehicleWithTemperatureData } from \"@temperature/_models/temperature/IVehicleWithTemperatureData\";\r\nimport { TemperatureOutOfBoundsHistoryService } from \"@temperature/_services/temperature-out-of-bounds.service\";\r\nimport { TemperatureProbeService } from \"@temperature/_services/temperature-probe.service\";\r\nimport { TemperatureRecordService } from \"@temperature/_services/temperature-record.service\";\r\nimport { lastValueFrom } from \"rxjs\";\r\nimport { ITemperatureRecord } from \"../../../_models/temperature/ITemperatureRecord\";\r\nimport { IStackedProbeReadingData, StackedProbeReadingComponent } from \"../stacked-probe-reading/stacked-probe-reading.component\";\r\nimport './temperature-log.component.scss';\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\n\r\ninterface ITemperatureLogTableRecord {\r\n Id: number;\r\n timestamp: Date;\r\n plot: number;\r\n probe1: IStackedProbeReadingData;\r\n probe2?: IStackedProbeReadingData;\r\n probe3?: IStackedProbeReadingData;\r\n probe4?: IStackedProbeReadingData;\r\n}\r\n\r\n@Component({\r\n selector: 'temperature-log',\r\n template: require('./temperature-log.component.html')\r\n})\r\nexport class TemperatureLogComponent implements OnChanges {\r\n @Input() vehicle: IVehicleWithTemperatureData;\r\n @Input() start: Date;\r\n @Input() end: Date;\r\n\r\n loading: boolean;\r\n temperatureLog: ITemperatureLogTableRecord[] = [];\r\n temperatureOutOfBoundsHistory: ITemperatureOutOfBoundsHistory[];\r\n temperatureRecordsByDate: any;\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n exportedFileName: string = this.translationService.t(\"TempCompliance.Temperatures\");\r\n\r\n numberOfProbes = 0;\r\n\r\n UnitConversionType = UnitConversionType;\r\n\r\n @ViewChild('tempLogTable') table: VTableComponent;\r\n\r\n constructor(\r\n private readonly dateService: DateService,\r\n private readonly temperatureOutOfBoundsHistoryService: TemperatureOutOfBoundsHistoryService,\r\n private readonly temperatureProbeService: TemperatureProbeService,\r\n private readonly temperatureRecordService: TemperatureRecordService,\r\n private readonly translationService: TranslationService,\r\n private readonly unitConversionService: UnitConversionService,\r\n private readonly vTableService: VTableService) { }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n ngOnChanges(): void {\r\n this.getData();\r\n }\r\n\r\n //--\r\n\r\n private getData(): void {\r\n this.loading = true;\r\n const promises = [];\r\n promises.push(this.getProbes());\r\n promises.push(lastValueFrom(this.temperatureRecordService.getLatestTemperatureRecordsForVehicle(this.vehicle.Id)));\r\n promises.push(lastValueFrom(this.temperatureRecordService.getTemperatureRecordsForVehicle(this.vehicle.Id, this.start, this.end)));\r\n promises.push(lastValueFrom(this.temperatureOutOfBoundsHistoryService.getVehicleTemperatureOutOfBoundsHistories(this.vehicle.Id, this.dateService.addOrSubtractTime(this.start, -31, DateUnit.Day), this.end)));\r\n\r\n Promise.all(promises).then(([probes, latestRecords, records, outOfBoundsHistories]) => {\r\n\r\n this.temperatureRecordsByDate = this.groupRecordsByDate(records);\r\n this.temperatureOutOfBoundsHistory = outOfBoundsHistories;\r\n\r\n this.temperatureProbeService.mapTemperatureRecordsToProbes(probes, records);\r\n probes.forEach(probe => {\r\n this.temperatureProbeService.mapProbeLatestRecord(probe, latestRecords);\r\n });\r\n\r\n this.vehicle.temperatureProbes = probes;\r\n\r\n }).finally(() => {\r\n this.setExportedFileName();\r\n this.setupTemperatureLog();\r\n\r\n this.tableRows = this.vTableService.createTableRows(this.temperatureLog, this.tableColumns);\r\n this.loading = false;\r\n })\r\n }\r\n\r\n private setupTemperatureLog(): void {\r\n this.temperatureLog = [];\r\n\r\n if (!this.vehicle?.temperatureProbes) {\r\n return;\r\n }\r\n\r\n const probeIds = this.vehicle.temperatureProbes.map((probe, index) => {\r\n if (index < 4) {\r\n return probe.Id;\r\n }\r\n })\r\n\r\n Object.keys(this.temperatureRecordsByDate).forEach((key, rowId) => {\r\n const row: ITemperatureLogTableRecord = {\r\n Id: rowId,\r\n timestamp: new Date(key),\r\n plot: null,\r\n probe1: null,\r\n probe2: null,\r\n probe3: null,\r\n probe4: null\r\n }\r\n\r\n let rowHasData = false;\r\n\r\n this.temperatureRecordsByDate[key].forEach((record: ITemperatureRecord, index: number) => {\r\n if (!probeIds.includes(record.TemperatureProbeId)) {\r\n return;\r\n }\r\n\r\n rowHasData = true;\r\n\r\n const probe = this.vehicle.temperatureProbes.find(probe => probe.Id === record.TemperatureProbeId);\r\n const probeKey = \"probe\" + (index + 1);\r\n row[probeKey] = {\r\n probeName: probe.cleanName,\r\n temperature: this.unitConversionService.convertTemperatureWithSuffix(record.Temperature),\r\n outOfBounds: this.probeHasOutOfBoundsHistory(probe, new Date(key))\r\n };\r\n row.plot = row.plot || record.PlotId;\r\n })\r\n\r\n if (!rowHasData) {\r\n return;\r\n }\r\n\r\n this.temperatureLog.push(row);\r\n })\r\n\r\n this.createTable();\r\n }\r\n\r\n private groupRecordsByDate(records: ITemperatureRecord[]) {\r\n const groupedRecords = {};\r\n records.forEach(record => {\r\n const timestampStr = String(record.Timestamp);\r\n if (!groupedRecords[timestampStr]) {\r\n groupedRecords[timestampStr] = [];\r\n }\r\n groupedRecords[timestampStr].push(record);\r\n })\r\n return groupedRecords;\r\n }\r\n\r\n\r\n private probeHasOutOfBoundsHistory(probe: ITemperatureProbeWithTemperatureData, date: Date): boolean {\r\n return this.temperatureOutOfBoundsHistory.some(history => {\r\n return history.TemperatureProbeId === probe.Id &&\r\n this.dateService.date1IsAfterDate2(date, history.StartUtc, true) &&\r\n (this.dateService.date1IsAfterDate2(history.EndUtc, date) || !history.EndUtc);\r\n })\r\n }\r\n\r\n private getProbes(): Promise {\r\n if (this.vehicle.temperatureProbes.length) {\r\n return Promise.resolve(this.vehicle.temperatureProbes);\r\n }\r\n\r\n return lastValueFrom(this.temperatureProbeService.getTemperatureProbesForVehicle(this.vehicle.Id));\r\n }\r\n\r\n private setExportedFileName(): void {\r\n if (!this.vehicle) {\r\n return;\r\n }\r\n\r\n const vehicleReg = this.vehicle.ShortReg;\r\n const dateRange = this.start.toLocaleDateString();\r\n\r\n this.exportedFileName = `${vehicleReg}_${dateRange}`;\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader({ title: this.translationService.t('Common.Time'), sortDirection: SortDirection.Descending }),\r\n createCellFunction: (log) => this.vTableService.createDateCell(log.timestamp)\r\n },\r\n {\r\n header: this.vTableService.createLocationInformationHeader(),\r\n createCellFunction: (log) => this.vTableService.createLocationInformationCell({ plotId: log.plot })\r\n }\r\n ];\r\n\r\n if (this.vehicle.temperatureProbes.length > 0) {\r\n const maxColumns = Math.min(this.vehicle.temperatureProbes.length, 4);\r\n for (let index = 1; index <= maxColumns; index++) {\r\n this.tableColumns.push({\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('TempCompliance.ProbeX', index), sortType: SortType.Number }),\r\n createCellFunction: (log) => this.createProbeReadingCell(log, index)\r\n })\r\n }\r\n }\r\n }\r\n\r\n private createProbeReadingCell(log: ITemperatureLogTableRecord, index: number): IVTableCell {\r\n const probeKey = `probe${index}`;\r\n return this.vTableService.createTableCell(log[probeKey], { sortData: log[probeKey]?.temperature, exportData: log[probeKey]?.temperature, component: StackedProbeReadingComponent, componentInputs: { data: log[probeKey] } })\r\n }\r\n\r\n}\r\n","import { ChangeDetectorRef, Component, OnInit } from \"@angular/core\";\r\nimport { VTableHeaderType } from \"@app/directives/_layout/v-table/_enums/VTableHeaderType.enum\";\r\nimport { VTableRowStatus } from \"@app/directives/_layout/v-table/_enums/VTableRowStatus.enum\";\r\nimport { IVTableCell } from \"@app/directives/_layout/v-table/_models/IVTableCell\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { FallbackCellType, IDateCellOptions, VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { UnitConversionService, UnitConversionType } from \"@app/services/unitConversion.service\";\r\nimport { IFilterBarTab } from \"@directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { SortDirection } from \"@enums/SortDirection\";\r\nimport { AudioService } from \"@services/audio.service\";\r\nimport { DateService, DateUnit } from \"@services/date.service\";\r\nimport { ReasonCodeService } from \"@services/reasonCode.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport { ITemperatureOutOfBoundsHistory } from \"@temperature/_models/temperature/ITemperatureOutOfBoundsHistory\";\r\nimport { ITemperatureProbeWithLatestRecord, ITemperatureProbeWithTemperatureData } from \"@temperature/_models/temperature/ITemperatureProbe\";\r\nimport { ITemperatureRecord } from \"@temperature/_models/temperature/ITemperatureRecord\";\r\nimport { IVehicleWithTemperatureData } from \"@temperature/_models/temperature/IVehicleWithTemperatureData\";\r\nimport { TemperatureOutOfBoundsHistoryService } from \"@temperature/_services/temperature-out-of-bounds.service\";\r\nimport { TemperatureProbeService } from \"@temperature/_services/temperature-probe.service\";\r\nimport { TemperatureRecordService } from \"@temperature/_services/temperature-record.service\";\r\nimport { lastValueFrom } from \"rxjs\";\r\nimport { IStackedProbeReadingData, StackedProbeReadingComponent } from \"../stacked-probe-reading/stacked-probe-reading.component\";\r\nimport \"./temperature-compliance.component.scss\";\r\n\r\n@Component({\r\n selector: 'temperature-compliance',\r\n template: require(\"./temperature-compliance.component.html\")\r\n})\r\nexport class TemperatureComplianceComponent implements OnInit {\r\n loading = false;\r\n\r\n filterTabs: IFilterBarTab[] = [];\r\n\r\n temperatureRecords: ITemperatureRecord[];\r\n temperatureProbes: ITemperatureProbeWithLatestRecord[];\r\n vehicles: IVehicleWithTemperatureData[];\r\n activeOutOfBoundsHistories: ITemperatureOutOfBoundsHistory[];\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n selectedVehicle: IVehicleWithTemperatureData;\r\n\r\n temperatureData: any[] = [];\r\n reloadInterval: ReturnType;\r\n\r\n useAudibleAlarm: boolean = false;\r\n latestUpdateTime: Date;\r\n\r\n dateCellOptions: IDateCellOptions;\r\n totalVisibleColumns: number = 4;\r\n maxVisibleColumns: number = 8;\r\n\r\n totalExportableProbeColumns: number = 4;\r\n\r\n SortDirection = SortDirection;\r\n\r\n constructor(\r\n private readonly audioService: AudioService,\r\n private readonly conversionService: UnitConversionService,\r\n private readonly dateService: DateService,\r\n private readonly reasonCodeService: ReasonCodeService,\r\n private readonly temperatureOutOfBoundsHistoryService: TemperatureOutOfBoundsHistoryService,\r\n private readonly temperatureProbeService: TemperatureProbeService,\r\n private readonly temperatureRecordsService: TemperatureRecordService,\r\n private readonly translationService: TranslationService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly vTableService: VTableService,\r\n private readonly changeDetector: ChangeDetectorRef) { }\r\n\r\n\r\n ngOnInit(): void {\r\n this.createTabs();\r\n this.getData(true);\r\n this.latestUpdateTime = new Date();\r\n this.reloadInterval = setInterval(() => {\r\n this.getData();\r\n }, 70_000)\r\n }\r\n\r\n ngOnDestroy(): void {\r\n clearInterval(this.reloadInterval);\r\n }\r\n\r\n toggleAudibleAlarm() {\r\n this.useAudibleAlarm = !this.useAudibleAlarm;\r\n }\r\n\r\n onRowClicked($event): void {\r\n this.selectedVehicle = $event.data;\r\n }\r\n\r\n //--\r\n\r\n private getVehicleIsInJourney(vehicle: IVehicleWithTemperatureData) {\r\n vehicle.inJourney = this.reasonCodeService.isTravelling(vehicle.Plot?.Reason) && vehicle.Plot?.Velocity > 0;\r\n vehicle.journeyStatus = vehicle.inJourney ? this.translationService.t(\"TempCompliance.InJourney\") : '';\r\n }\r\n\r\n private getData(firstLoad = false): Promise {\r\n if (firstLoad) {\r\n this.loading = true;\r\n }\r\n \r\n const promises: any[] = [];\r\n\r\n promises.push(lastValueFrom(this.temperatureRecordsService.getLatestTemperatureRecords(false)));\r\n promises.push(lastValueFrom(this.temperatureProbeService.getTemperatureProbes()));\r\n promises.push(this.vehicleService.getVehicles({ includeLatestPlots: true, includePeripheralMappings: true }));\r\n promises.push(lastValueFrom(this.temperatureOutOfBoundsHistoryService.getActiveVehicleTemperatureOutOfBoundsHistories()))\r\n\r\n return Promise.all(promises).then(([tempRecords, probes, vehicles, outOfBoundsHistories]) => {\r\n this.temperatureRecords = tempRecords;\r\n this.temperatureProbes = probes;\r\n this.vehicles = vehicles;\r\n this.activeOutOfBoundsHistories = outOfBoundsHistories;\r\n\r\n this.mapData();\r\n\r\n if (this.useAudibleAlarm) {\r\n this.checkForNewOutOfBounds();\r\n }\r\n \r\n this.createTable();\r\n }).finally(() => {\r\n this.tableRows = this.vTableService.createTableRows(this.vehicles, this.tableColumns);\r\n this.latestUpdateTime = new Date();\r\n this.loading = false;\r\n\r\n this.changeDetector.markForCheck();\r\n })\r\n }\r\n\r\n private mapData(): void {\r\n if (!this.vehicles) {\r\n return;\r\n }\r\n\r\n this.setupProbes();\r\n\r\n this.temperatureProbeService.mapTemperatureProbesToVehicles(this.temperatureProbes, this.vehicles);\r\n\r\n this.vehicles = this.vehicles.filter(vehicle => vehicle.temperatureProbes?.length > 0);\r\n\r\n this.vehicles.forEach(vehicle => {\r\n if (!vehicle.temperatureProbes.length) {\r\n return;\r\n }\r\n\r\n vehicle.latestTemperatureUpdate = new Date(this.temperatureProbeService.getLastUpdatedForVehicleProbes(vehicle.temperatureProbes));\r\n vehicle.lastUpdatedRelativeTime = this.dateService.relativeTime(vehicle.latestTemperatureUpdate);\r\n\r\n this.getVehicleIsInJourney(vehicle);\r\n this.getVehicleIsInErrorState(vehicle);\r\n this.checkVehicleHasProfileSet(vehicle);\r\n this.cleanVehicleProbeNames(vehicle);\r\n this.getVehicleIsInJourney(vehicle);\r\n\r\n if (vehicle.temperatureProbes.length > this.totalVisibleColumns) {\r\n this.totalVisibleColumns = Math.min(vehicle.temperatureProbes.length, this.maxVisibleColumns);\r\n }\r\n\r\n if (vehicle.temperatureProbes.length > this.totalExportableProbeColumns) {\r\n this.totalExportableProbeColumns = vehicle.temperatureProbes.length;\r\n }\r\n })\r\n\r\n\r\n }\r\n\r\n private setupProbes(): void {\r\n this.temperatureProbes.sort((a, b) => a.Position - b.Position);\r\n\r\n this.temperatureProbes.forEach(probe => {\r\n this.temperatureProbeService.mapProbeLatestRecord(probe, this.temperatureRecords);\r\n this.temperatureOutOfBoundsHistoryService.mapHistoriesToProbe(this.activeOutOfBoundsHistories, probe);\r\n });\r\n\r\n this.temperatureProbes = this.temperatureProbes.filter(probe => !!probe.latestRecord && this.probeIsActive(probe));\r\n }\r\n\r\n private cleanVehicleProbeNames(vehicle: IVehicleWithTemperatureData) {\r\n vehicle.temperatureProbes.forEach(probe => {\r\n this.temperatureProbeService.cleanVehicleProbeName(vehicle.Reg, probe);\r\n })\r\n }\r\n\r\n private checkForNewOutOfBounds(): void {\r\n if (!this.activeOutOfBoundsHistories) {\r\n return;\r\n }\r\n\r\n let alarmSounded = false;\r\n this.activeOutOfBoundsHistories.forEach(history => {\r\n if (alarmSounded) {\r\n return;\r\n }\r\n if (this.dateService.date1IsAfterDate2(history.StartUtc, this.latestUpdateTime)) {\r\n this.audioService.soundAlarm();\r\n alarmSounded = true;\r\n }\r\n })\r\n }\r\n\r\n private probeIsActive(probe: ITemperatureProbeWithTemperatureData): boolean {\r\n if (!probe) {\r\n return false;\r\n }\r\n if (probe.latestRecord && this.isRecentData(probe.latestRecord.Timestamp)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private isRecentData(date: Date): boolean {\r\n const cutoff = this.dateService.addOrSubtractTime(new Date(), -7, DateUnit.Day);\r\n\r\n if (this.dateService.date1IsAfterDate2(cutoff, date)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private getVehicleIsInErrorState(vehicle: IVehicleWithTemperatureData) {\r\n let errorState: VTableRowStatus = VTableRowStatus.Info;\r\n if (this.vehicleHasProbeOutOfBounds(vehicle)) {\r\n errorState = VTableRowStatus.Error;\r\n vehicle.outOfBounds = true;\r\n }\r\n\r\n const thirtyMinutesAgo = this.dateService.addOrSubtractTime(new Date(), -30, DateUnit.Min);\r\n if (this.dateService.date1IsAfterDate2(thirtyMinutesAgo, vehicle.latestTemperatureUpdate)) {\r\n errorState = VTableRowStatus.Error;\r\n vehicle.outOfDate = true;\r\n }\r\n\r\n vehicle.errorStatus = errorState;\r\n }\r\n\r\n private checkVehicleHasProfileSet(vehicle: IVehicleWithTemperatureData) {\r\n vehicle.hasProfile = vehicle.temperatureProbes.some(probe => !!probe.TemperatureProfile);\r\n }\r\n\r\n private vehicleHasProbeOutOfBounds(vehicle: IVehicleWithTemperatureData) {\r\n return this.activeOutOfBoundsHistories.some(history => {\r\n return !!vehicle.temperatureProbes.find(probe => probe.Id === history.TemperatureProbeId);\r\n });\r\n }\r\n\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createStatusTableHeader({ minTableWidth: 900 }),\r\n createCellFunction: (vehicle) => this.vTableService.createStatusCell(vehicle.errorStatus)\r\n },\r\n {\r\n header: this.vTableService.createVehicleTableHeader(),\r\n createCellFunction: (vehicle) => this.vTableService.createVehicleRegCell(vehicle)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t(\"TempCompliance.State\"), minTableWidth: 900 }),\r\n createCellFunction: (vehicle) => this.vTableService.createTableCell(vehicle.journeyStatus)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t(\"Common.LastUpdated\"), minTableWidth: 900, width: 130, sortType: SortType.Date }, VTableHeaderType.Date),\r\n createCellFunction: (vehicle) => this.vTableService.createDateCell(\r\n vehicle.latestTemperatureUpdate,\r\n {\r\n showRelativeTime: true,\r\n showErrorIfBeforeDate: this.dateService.addOrSubtractTime(new Date(), -30, DateUnit.Min),\r\n showWarningIfBeforeDate: this.dateService.addOrSubtractTime(new Date(), -14, DateUnit.Min)\r\n })\r\n }\r\n ];\r\n\r\n for (let i = 0; i < this.totalExportableProbeColumns; i++) {\r\n let minTableWidth: number;\r\n if (i >= 4) {\r\n minTableWidth = 900;\r\n }\r\n const exportOnly = i >= this.totalVisibleColumns;\r\n\r\n this.tableColumns.push({\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t(\"TempCompliance.ProbeX\", i + 1), minTableWidth, sortType: SortType.Number, exportOnly: exportOnly }),\r\n createCellFunction: (vehicle) => this.createTemperatureReadingCell(vehicle, i)\r\n })\r\n }\r\n }\r\n\r\n\r\n\r\n private createTemperatureReadingCell(vehicle, index: number): IVTableCell {\r\n if (!vehicle.temperatureProbes[index]) {\r\n\r\n return this.vTableService.createTableCell(null, {}, FallbackCellType.Dashed);\r\n }\r\n\r\n const latestTemp = vehicle.temperatureProbes[index].latestRecord.Temperature;\r\n const cutOff = this.dateService.addOrSubtractTime(new Date(), -30, DateUnit.Min);\r\n\r\n const data: IStackedProbeReadingData = {\r\n probeName: vehicle.temperatureProbes[index].cleanName,\r\n temperature: this.conversionService.smartConvert(latestTemp, UnitConversionType.Temperature, { precision: 1 }),\r\n outOfBounds: this.probeIsOutOfBounds(vehicle.temperatureProbes[index]),\r\n lastUpdated: `${this.translationService.t('Common.LastUpdated')} ${this.dateService.formatDate(vehicle.temperatureProbes[index].latestRecord?.Timestamp)}`,\r\n outOfDate: this.dateService.date1IsAfterDate2(cutOff, vehicle.temperatureProbes[index].latestRecord?.Timestamp)\r\n };\r\n\r\n return this.vTableService.createTableCell(data, { sortData: latestTemp, exportData: data.temperature, component: StackedProbeReadingComponent, componentInputs: { data: data } })\r\n\r\n }\r\n\r\n private createTabs(): void {\r\n this.filterTabs = [];\r\n\r\n this.createTabDefinition(\"Common.All\", (r) => true);\r\n this.createTabDefinition(\"TempCompliance.OutOfBounds\", (r) => r.outOfBounds);\r\n this.createTabDefinition(\"ReeferList.Inactive\", (r) => r.outOfDate);\r\n this.createTabDefinition(\"TempCompliance.InJourney\", (r) => r.inJourney);\r\n this.createTabDefinition(\"TempCompliance.NoAlarm\", (r) => !r.hasProfile);\r\n }\r\n\r\n private createTabDefinition(translationString: string, callback: (vehicle: IVehicleWithTemperatureData) => boolean) {\r\n\r\n this.filterTabs.push({ title: this.translationService.t(translationString), predicate: callback });\r\n }\r\n\r\n private probeIsOutOfBounds(probe: ITemperatureProbeWithTemperatureData): boolean {\r\n const histories = probe.outOfBoundsHistories;\r\n const isInProfileBounds = this.temperatureProbeService.temperatureIsInBoundsAccordingToProfile(probe);\r\n\r\n if (histories.length && histories.find(history => !history.EndUtc) && !isInProfileBounds) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n","import { Component } from \"@angular/core\";\r\nimport { IDriver } from \"@app/interfaces/IDriver\";\r\nimport { IGeofence } from \"@app/interfaces/IGeofences\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { DriverService } from \"@app/services/driver.service\";\r\nimport { GeofenceService } from \"@app/services/geofence.service\";\r\nimport { VehicleService } from \"@app/services/vehicle.service\";\r\nimport \"./site-search.component.scss\";\r\n\r\n@Component({\r\n selector: \"site-search\",\r\n template: require(\"./site-search.component.html\")\r\n})\r\nexport class SiteSearchComponent {\r\n searchValue: string;\r\n\r\n // --\r\n\r\n loading: boolean;\r\n dataLoaded: boolean;\r\n\r\n vehicles: IVehicle[];\r\n geofences: IGeofence[];\r\n drivers: IDriver[];\r\n\r\n matchedVehicles: IVehicle[];\r\n matchedGeofences: IGeofence[];\r\n matchedDrivers: IDriver[];\r\n\r\n constructor(\r\n private readonly vehicleService: VehicleService,\r\n private readonly driverService: DriverService,\r\n private readonly geofenceService: GeofenceService) {\r\n }\r\n\r\n searchValueUpdated() {\r\n\r\n\r\n if (!this.searchValue) {\r\n this.matchedVehicles = [];\r\n this.matchedDrivers = [];\r\n this.matchedGeofences = [];\r\n return;\r\n }\r\n\r\n if (!this.dataLoaded) {\r\n this.loadData()?.then(() => { this.searchValueUpdated() });\r\n return;\r\n }\r\n\r\n this.matchedVehicles = this.vehicleService.searchVehicles(this.vehicles, this.searchValue);\r\n\r\n\r\n this.matchedDrivers = this.driverService.searchDrivers(this.drivers, this.searchValue.toLowerCase());\r\n\r\n\r\n this.matchedGeofences = this.geofenceService.searchGeofences(this.geofences, this.searchValue);\r\n\r\n }\r\n\r\n loadData(): angular.IPromise {\r\n if (this.loading || this.dataLoaded) {\r\n return;\r\n }\r\n\r\n this.loading = true;\r\n\r\n const vehiclePromise = this.vehicleService.getVehicles({});\r\n const driverPromise = this.driverService.getDrivers({});\r\n const geofencePromise = this.geofenceService.getGeofences({ unsafe: true });\r\n\r\n vehiclePromise.then(vehicles => { this.vehicles = vehicles; });\r\n driverPromise.then(drivers => { this.drivers = drivers; });\r\n geofencePromise.then(geofences => { this.geofences = geofences; });\r\n\r\n return vehiclePromise.then(() => {\r\n driverPromise.then(() => {\r\n geofencePromise.then(() => {\r\n this.loading = false;\r\n this.dataLoaded = true;\r\n })\r\n })\r\n })\r\n }\r\n\r\n // --\r\n\r\n}\r\n","import { Component, HostBinding, Input, OnChanges, OnInit, SimpleChanges } from \"@angular/core\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { AlertCategory } from \"src/app/main/modules/alerts/_enums/alerts.enums\";\r\nimport { IAlertRuleRecord } from \"src/app/main/modules/alerts/_models/alerts.interfaces\";\r\nimport { AlertReviewService } from \"src/app/main/modules/alerts/_services/alert-review.service\";\r\nimport { AlertsService } from \"src/app/main/modules/alerts/_services/alerts.service\";\r\nimport \"./alert-detail.component.scss\";\r\n\r\n@Component({\r\n selector: \"alert-detail\",\r\n template: require(\"./alert-detail.component.html\")\r\n})\r\nexport class AlertDetailComponent implements OnInit, OnChanges {\r\n\r\n @Input() record: IAlertRuleRecord;\r\n @Input() tableMode?: boolean = false;\r\n @Input() category?: AlertCategory;\r\n @Input() subcategory?: number;\r\n categoryString = \"\";\r\n\r\n updating = false;\r\n\r\n constructor(\r\n private readonly alertReviewService: AlertReviewService,\r\n private readonly alertsService: AlertsService,\r\n private readonly translationService: TranslationService\r\n ) {\r\n }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (!this.record) {\r\n return;\r\n }\r\n\r\n this.getCategory();\r\n\r\n }\r\n\r\n private getCategory() {\r\n if (this.category === undefined || this.category === null) {\r\n return;\r\n }\r\n\r\n this.categoryString = this.translationService.tEnum(AlertCategory, 'AlertCategory', this.category);\r\n if (this.subcategory !== undefined || this.subcategory !== null) {\r\n const { subCategoryEnum, subCategoryString } = this.alertsService.getAlertRuleSubcategoryEnum(this.category);\r\n const subCatString = this.translationService.tEnum(subCategoryEnum, subCategoryString, this.subcategory);\r\n this.categoryString += ` > ${subCatString}`;\r\n }\r\n }\r\n}\r\n","import { Component, Input, OnChanges, SimpleChanges } from \"@angular/core\";\r\nimport { IAlertRuleRecord } from \"src/app/main/modules/alerts/_models/alerts.interfaces\";\r\nimport { IAxleWeightAlertDetailData, AxleWeightAlertDetailService } from\r\n \"src/app/main/modules/alerts/components/alert-detail/axle-weight-alert-detail/axle-weight-alert-detail.service\";\r\n\r\n@Component({\r\n selector: \"axle-weight-alert-detail\",\r\n template: require(\"./axle-weight-alert-detail.component.html\")\r\n})\r\nexport class AxleWeightAlertDetailComponent implements OnChanges {\r\n\r\n @Input()\r\n record: IAlertRuleRecord;\r\n @Input()\r\n tableMode: boolean = false;\r\n\r\n updating: boolean;\r\n\r\n alertDetailData: IAxleWeightAlertDetailData;\r\n tableModeLabel: string;\r\n\r\n debounceTimeout: any;\r\n\r\n constructor(\r\n private readonly alertDetailService: AxleWeightAlertDetailService) {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (this.debounceTimeout) {\r\n clearTimeout(this.debounceTimeout);\r\n }\r\n\r\n this.debounceTimeout = setTimeout(() => {\r\n this.getAxleWeightData();\r\n this.debounceTimeout = null;\r\n },\r\n 100);\r\n }\r\n\r\n private getAxleWeightData() {\r\n this.updating = true;\r\n\r\n this.alertDetailService.getAlertData(this.record)\r\n .then((alertData: IAxleWeightAlertDetailData) => {\r\n this.alertDetailData = alertData;\r\n this.tableModeLabel = this.alertDetailService.createAlertLabel(this.alertDetailData);\r\n }).finally(() => {\r\n this.updating = false;\r\n });\r\n }\r\n}\r\n","import { Component, Input, OnChanges, SimpleChanges } from \"@angular/core\";\r\nimport { IAlertRuleRecord } from \"src/app/main/modules/alerts/_models/alerts.interfaces\";\r\nimport { IInputAlertDetailData, InputAlertDetailService } from\r\n \"src/app/main/modules/alerts/components/alert-detail/input-alert-detail/input-alert-detail.service\";\r\n\r\n@Component({\r\n selector: \"input-alert-detail\",\r\n template: require(\"./input-alert-detail.component.html\")\r\n})\r\nexport class InputAlertDetailComponent implements OnChanges {\r\n\r\n @Input()\r\n record: IAlertRuleRecord;\r\n @Input()\r\n tableMode: boolean = false;\r\n\r\n updating = false;\r\n\r\n alertDetailData: IInputAlertDetailData;\r\n tableModeLabel: string;\r\n\r\n debounceTimeout: any;\r\n\r\n constructor(\r\n private readonly alertDetailService: InputAlertDetailService) {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (this.debounceTimeout) {\r\n clearTimeout(this.debounceTimeout);\r\n }\r\n\r\n this.debounceTimeout = setTimeout(() => {\r\n this.getInputData();\r\n this.debounceTimeout = null;\r\n },\r\n 100);\r\n }\r\n\r\n private getInputData() {\r\n this.updating = true;\r\n\r\n this.alertDetailService.getAlertData(this.record)\r\n .then((data: IInputAlertDetailData) => {\r\n this.alertDetailData = data;\r\n this.tableModeLabel = this.alertDetailService.createAlertLabel(this.alertDetailData);\r\n }).finally(() => {\r\n this.updating = false;\r\n });\r\n }\r\n}\r\n","import { Component, Input, OnChanges, SimpleChanges } from \"@angular/core\";\r\nimport { IAlertRuleRecord } from \"src/app/main/modules/alerts/_models/alerts.interfaces\";\r\nimport { IPowerLossAlertDetailData, PowerLossAlertDetailService } from\r\n \"src/app/main/modules/alerts/components/alert-detail/power-loss-alert-detail/power-loss-alert-detail.service\";\r\n\r\n@Component({\r\n selector: \"power-loss-alert-detail\",\r\n template: require(\"./power-loss-alert-detail.component.html\")\r\n})\r\nexport class PowerLossAlertDetailComponent implements OnChanges {\r\n\r\n @Input()\r\n record: IAlertRuleRecord;\r\n @Input()\r\n tableMode: boolean = false;\r\n\r\n updating = false;\r\n\r\n alertDetailData: IPowerLossAlertDetailData;\r\n tableModeLabel: string;\r\n\r\n debounceTimeout: any;\r\n\r\n constructor(\r\n private readonly alertDetailService: PowerLossAlertDetailService) {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (this.debounceTimeout) {\r\n clearTimeout(this.debounceTimeout);\r\n }\r\n\r\n this.debounceTimeout = setTimeout(() => {\r\n this.getPowerLossData();\r\n this.debounceTimeout = null;\r\n },\r\n 100);\r\n }\r\n\r\n private getPowerLossData() {\r\n this.updating = true;\r\n\r\n this.alertDetailService.getAlertData(this.record)\r\n .then((data) => {\r\n this.updating = false;\r\n this.alertDetailData = data;\r\n this.tableModeLabel = this.alertDetailService.createAlertLabel(this.alertDetailData);\r\n });\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { ITemperatureAlarmRecord } from \"@app/main/modules/temperature/_models/temperature/ITemperatureAlarmRecord\";\r\nimport { ITemperatureOutOfBoundsHistory } from \"@app/main/modules/temperature/_models/temperature/ITemperatureOutOfBoundsHistory\";\r\nimport { ITemperatureProbe } from \"@app/main/modules/temperature/_models/temperature/ITemperatureProbe\";\r\nimport { ITemperatureProfile } from \"@app/main/modules/temperature/_models/temperature/ITemperatureProfile\";\r\nimport { TemperatureOutOfBoundsHistoryService } from \"@app/main/modules/temperature/_services/temperature-out-of-bounds.service\";\r\nimport { TemperatureProbeService } from \"@app/main/modules/temperature/_services/temperature-probe.service\";\r\nimport { TemperatureProfileService } from \"@app/main/modules/temperature/_services/temperature-profile.service\";\r\nimport { TemperatureRecordService } from \"@app/main/modules/temperature/_services/temperature-record.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UnitConversionService, UnitConversionType } from \"@app/services/unitConversion.service\";\r\nimport { combineLatest, lastValueFrom, Observable, of } from \"rxjs\";\r\nimport { map } from \"rxjs/operators\";\r\nimport { IAlertRuleRecord } from \"../../../_models/alerts.interfaces\";\r\nimport { ITemperatureAlertDetailData } from \"./ITemperatureAlertDetailData\";\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class TemperatureAlertDetailService {\r\n\r\n #alertDataCache: { [recordId: number]: ITemperatureAlertDetailData } = [];\r\n\r\n constructor(\r\n private readonly temperatureOutOfBoundsHistoryService: TemperatureOutOfBoundsHistoryService,\r\n private readonly temperatureProbeService: TemperatureProbeService,\r\n private readonly temperatureProfileService: TemperatureProfileService,\r\n private readonly temperatureRecordService: TemperatureRecordService,\r\n private readonly translationService: TranslationService,\r\n private readonly unitConversionService: UnitConversionService) { }\r\n\r\n getAlertData(record: IAlertRuleRecord): Observable {\r\n if (this.#alertDataCache[record.Id]) {\r\n return of(this.#alertDataCache[record.Id]);\r\n }\r\n return combineLatest([\r\n this.temperatureProbeService.getTemperatureProbesForVehicle(record.VehicleId).pipe(map(probes => {\r\n return probes.find(probe => probe.Id === record.alertMetadata.TemperatureProbeId);\r\n })),\r\n this.temperatureOutOfBoundsHistoryService.getVehicleTemperatureOutOfBoundsHistory(record.alertMetadata.TemperatureOutOfBoundsHistoryId),\r\n this.temperatureProfileService.getTemperatureProfiles().pipe(map(profiles => {\r\n return profiles.find(profile => profile.Id === record.alertMetadata.TemperatureProfileId);\r\n })),\r\n this.temperatureRecordService.getTemperatureAlarmRecord(record.alertMetadata.TemperatureAlarmRecordId)\r\n ]).pipe(\r\n map(\r\n ([probe, outOfBoundsHistory, profile, alarmRecord]: [ITemperatureProbe, ITemperatureOutOfBoundsHistory, ITemperatureProfile, ITemperatureAlarmRecord]) => {\r\n const alertDetailData: ITemperatureAlertDetailData = this.createAlertDetailData([probe, outOfBoundsHistory, profile, alarmRecord]);\r\n alertDetailData.vehicle = record.vehicle;\r\n\r\n this.#alertDataCache[record.Id] = alertDetailData;\r\n\r\n return alertDetailData;\r\n })\r\n )\r\n\r\n }\r\n\r\n createAlertLabel(data: ITemperatureAlertDetailData): string {\r\n\r\n var convertTemperature = (value: number) => this.unitConversionService.smartConvert(value, UnitConversionType.Temperature);\r\n\r\n return `${convertTemperature(data.temperatureExtreme)} (${convertTemperature(data.lowerBound)} - ${convertTemperature(data.upperBound)})`\r\n }\r\n\r\n getAlertExport(record: IAlertRuleRecord): Promise {\r\n return lastValueFrom(this.getAlertData(record)).then(data => {\r\n return `[${data.temperatureProbe?.Name}] ${this.createAlertLabel(data)}`;\r\n }).catch((error) => {\r\n console.error(\"Error retrieving temperature alert detail: \", error);\r\n return '';\r\n });\r\n }\r\n\r\n //--\r\n\r\n private createAlertDetailData(data: [ITemperatureProbe, ITemperatureOutOfBoundsHistory, ITemperatureProfile, ITemperatureAlarmRecord]): ITemperatureAlertDetailData {\r\n const probe: ITemperatureProbe = data[0];\r\n const outOfBoundsHistory: ITemperatureOutOfBoundsHistory = data[1];\r\n const profile: ITemperatureProfile = data[2];\r\n const alarmRecord: ITemperatureAlarmRecord = data[3];\r\n \r\n let detailData: ITemperatureAlertDetailData = {\r\n temperatureProfile: profile,\r\n temperatureOutOfBoundsHistory: outOfBoundsHistory,\r\n temperatureProbe: probe,\r\n temperatureAlarmRecord: alarmRecord,\r\n upperBound: profile?.UpperBound ?? alarmRecord?.UpperBound,\r\n lowerBound: profile?.LowerBound ?? alarmRecord?.LowerBound,\r\n temperatureExtreme: outOfBoundsHistory?.TemperatureExtreme ?? alarmRecord?.Temperature\r\n }\r\n\r\n if (detailData.temperatureOutOfBoundsHistory) {\r\n if (detailData.temperatureExtreme < detailData.lowerBound) {\r\n detailData.temperatureDiffExtreme = Math.abs(detailData.temperatureExtreme - detailData.lowerBound);\r\n detailData.temperatureDiffMessageExtreme = this.translationService.t('Alerts.BelowLowerBounds');\r\n } else {\r\n detailData.temperatureDiffExtreme = detailData.temperatureExtreme - detailData.upperBound;\r\n detailData.temperatureDiffMessageExtreme = this.translationService.t('Alerts.AboveUpperBounds');;\r\n }\r\n }\r\n\r\n return detailData;\r\n }\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { DataCacheService } from \"@app/services/caching/data-cache.service\";\r\nimport { IProfileQueryOptions } from \"@temperature/_models/temperature/IProfileQueryOptions\";\r\nimport { ITemperatureProfile } from \"@temperature/_models/temperature/ITemperatureProfile\";\r\nimport { Observable } from \"rxjs\";\r\nimport { tap } from \"rxjs/operators\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class TemperatureProfileService {\r\n private temperatureProfilesCacheName: string = 'temperatureProfilesCache';\r\n constructor(private readonly http: HttpClient,\r\n private readonly dataCacheService: DataCacheService) { }\r\n\r\n getTemperatureProfiles(invalidateCache = false, queryOptions?: IProfileQueryOptions): Observable {\r\n if (queryOptions) {\r\n return this.getTemperatureProfilesFromDb(queryOptions);\r\n }\r\n return this.dataCacheService.getOrRequest(this.temperatureProfilesCacheName, () => this.getTemperatureProfilesFromDb(), { invalidateCache });\r\n }\r\n\r\n getTemperatureProfilesFromDb(queryOptions?: IProfileQueryOptions): Observable {\r\n const params = queryOptions ?? {};\r\n return this.http.get('/api/temperature/profiles', { params: params });\r\n }\r\n\r\n saveTemperatureProfile(profile: ITemperatureProfile): Observable {\r\n return this.http.post('/api/temperature/profiles', { body: profile }).pipe(tap(profile => {\r\n this.dataCacheService.addOrUpdateItem(profile, this.temperatureProfilesCacheName)\r\n }))\r\n }\r\n}\r\n","import { Component, Input, OnChanges, SimpleChanges } from \"@angular/core\";\r\nimport { IAlertRuleRecord } from \"src/app/main/modules/alerts/_models/alerts.interfaces\";\r\nimport { ITollAlertDetailData, TollAlertDetailService } from\r\n \"src/app/main/modules/alerts/components/alert-detail/toll-alert-detail/toll-alert-detail.service\";\r\nimport angular from \"angular\";\r\n\r\n@Component({\r\n selector: \"toll-alert-detail\",\r\n template: require(\"./toll-alert-detail.component.html\")\r\n})\r\nexport class TollAlertDetailComponent implements OnChanges {\r\n\r\n @Input()\r\n record: IAlertRuleRecord;\r\n @Input()\r\n tableMode: boolean = false;\r\n\r\n updating = false;\r\n\r\n alertDetailData: ITollAlertDetailData;\r\n tableModeLabel: string;\r\n\r\n debounceTimeout: any;\r\n\r\n constructor(\r\n private readonly alertDetailService: TollAlertDetailService) {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (this.debounceTimeout) {\r\n clearTimeout(this.debounceTimeout);\r\n }\r\n\r\n this.debounceTimeout = setTimeout(() => {\r\n this.getTollData();\r\n this.debounceTimeout = null;\r\n },\r\n 100);\r\n }\r\n\r\n private getTollData() : angular.IPromise {\r\n this.updating = true;\r\n\r\n return this.alertDetailService.getAlertData(this.record)\r\n .then((data: ITollAlertDetailData) => {\r\n this.alertDetailData = data;\r\n this.tableModeLabel = this.alertDetailService.createAlertLabel(this.alertDetailData);\r\n }).finally(() => {\r\n this.updating = false;\r\n });\r\n }\r\n}\r\n","import { Component, Input, OnChanges, SimpleChanges } from \"@angular/core\";\r\nimport { IAlertRuleRecord } from \"src/app/main/modules/alerts/_models/alerts.interfaces\";\r\nimport { ITyreRecordAlertDetailData, TyreRecordAlertDetailService } from\r\n \"src/app/main/modules/alerts/components/alert-detail/tyre-record-alert-detail/tyre-record-detail.service\";\r\n\r\n@Component({\r\n selector: \"tyre-record-alert-detail\",\r\n template: require(\"./tyre-record-alert-detail.component.html\")\r\n})\r\nexport class TyreRecordAlertDetailComponent implements OnChanges {\r\n\r\n @Input()\r\n record: IAlertRuleRecord;\r\n @Input()\r\n tableMode: boolean = false;\r\n\r\n updating = false;\r\n\r\n alertDetailData: ITyreRecordAlertDetailData;\r\n tableModeLabel: string;\r\n\r\n debounceTimeout: any;\r\n\r\n constructor(\r\n private readonly alertDetailService: TyreRecordAlertDetailService) {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (this.debounceTimeout) {\r\n clearTimeout(this.debounceTimeout);\r\n }\r\n\r\n this.debounceTimeout = setTimeout(() => {\r\n this.getTyreRecordData();\r\n this.debounceTimeout = null;\r\n },\r\n 100);\r\n }\r\n\r\n private getTyreRecordData() {\r\n this.updating = true;\r\n\r\n this.alertDetailService.getAlertData(this.record)\r\n .then((data) => {\r\n this.updating = false;\r\n this.alertDetailData = data;\r\n this.tableModeLabel = this.alertDetailService.createAlertLabel(this.alertDetailData);\r\n });\r\n }\r\n\r\n}\r\n","import { Component, Input, OnChanges, SimpleChanges } from \"@angular/core\";\r\nimport { IAlertRuleRecord } from \"src/app/main/modules/alerts/_models/alerts.interfaces\";\r\nimport { IVehicleDiagnosticAlertDetailData, VehicleDiagnosticAlertDetailService } from\r\n \"src/app/main/modules/alerts/components/alert-detail/vehicle-diagnostic-detail/vehicle-diagnostic-detail.service\";\r\n\r\n@Component({\r\n selector: \"vehicle-diagnostic-alert-detail\",\r\n template: require(\"./vehicle-diagnostic-alert-detail.component.html\")\r\n})\r\nexport class VehicleDiagnosticAlertDetailComponent implements OnChanges {\r\n\r\n @Input()\r\n record: IAlertRuleRecord;\r\n @Input()\r\n tableMode: boolean = false;\r\n\r\n updating = false;\r\n\r\n alertDetailData: IVehicleDiagnosticAlertDetailData;\r\n tableModeLabel: string;\r\n\r\n debounceTimeout: any;\r\n\r\n constructor(\r\n private readonly alertDetailService: VehicleDiagnosticAlertDetailService) {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (this.debounceTimeout) {\r\n clearTimeout(this.debounceTimeout);\r\n }\r\n\r\n this.debounceTimeout = setTimeout(() => {\r\n this.getDiagnosticData();\r\n this.debounceTimeout = null;\r\n },\r\n 100);\r\n }\r\n\r\n private getDiagnosticData() {\r\n this.updating = true;\r\n\r\n this.alertDetailService.getAlertData(this.record)\r\n .then((data) => {\r\n this.updating = false;\r\n this.alertDetailData = data;\r\n this.tableModeLabel = this.alertDetailService.createAlertLabel(this.alertDetailData);\r\n });\r\n }\r\n\r\n}\r\n","import { Component, Input, OnChanges, SimpleChanges } from \"@angular/core\";\r\nimport { IAlertRuleRecord as IAlertRuleRecord1 } from \"src/app/main/modules/alerts/_models/alerts.interfaces\";\r\nimport { VideoAlertDetailService, IVideoAlertDetailData } from\r\n \"src/app/main/modules/alerts/components/alert-detail/video-alert-detail/video-alert-detail.service\";\r\n\r\n@Component({\r\n selector: \"video-alert-detail\",\r\n template: require(\"./video-alert-detail.component.html\")\r\n})\r\nexport class VideoAlertDetailComponent implements OnChanges {\r\n\r\n @Input()\r\n record: IAlertRuleRecord1;\r\n @Input()\r\n tableMode: boolean = false;\r\n\r\n updating = false;\r\n\r\n alertDetailData: IVideoAlertDetailData;\r\n tableModeLabel: string;\r\n\r\n debounceTimeout: any;\r\n\r\n constructor(\r\n private readonly alertDetailService: VideoAlertDetailService) {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (this.debounceTimeout) {\r\n clearTimeout(this.debounceTimeout);\r\n }\r\n\r\n this.debounceTimeout = setTimeout(() => {\r\n this.getVideoData();\r\n this.debounceTimeout = null;\r\n },\r\n 100);\r\n }\r\n\r\n private getVideoData() {\r\n this.updating = true;\r\n\r\n this.alertDetailService.getAlertData(this.record)\r\n .then((data) => {\r\n this.updating = false;\r\n this.alertDetailData = data;\r\n this.tableModeLabel = this.alertDetailService.createAlertLabel(this.alertDetailData);\r\n });\r\n }\r\n\r\n}\r\n","import { Component, EventEmitter, Input, OnInit, Output } from \"@angular/core\";\r\nimport { timeout } from \"@app/class/Utilities\";\r\nimport { IUser } from \"@interfaces/IUser\";\r\nimport { UserRole } from \"@services/accountFeature.service\";\r\nimport { CurrentUserService } from \"@services/currentUser.service\";\r\nimport { DisplayService, IDialogOptionsJson } from \"@services/display.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { AlertReviewStatus } from \"src/app/main/modules/alerts/_enums/AlertReviewStatus.enums\";\r\nimport { IAlertResolutionCode } from \"src/app/main/modules/alerts/_models/IAlertResolutionCode\";\r\nimport { IAlertReviewEvent } from \"src/app/main/modules/alerts/_models/IAlertReviewEvent\";\r\nimport { IAlertReviewHistory } from \"src/app/main/modules/alerts/_models/IAlertReviewHistory\";\r\nimport { AlertReviewService } from \"src/app/main/modules/alerts/_services/alert-review.service\";\r\nimport { AlertsService } from \"src/app/main/modules/alerts/_services/alerts.service\";\r\nimport './alert-review-dialog.component.scss';\r\n\r\n@Component({\r\n selector: 'alert-review-dialog',\r\n template: require('./alert-review-dialog.component.html')\r\n})\r\nexport class AlertReviewDialogComponent implements OnInit {\r\n @Input() incident: IAlertReviewHistory;\r\n @Output() addAlertReviewEvent = new EventEmitter();\r\n\r\n loading = false;\r\n\r\n noteText: string = '';\r\n\r\n event: IAlertReviewEvent;\r\n resolution: IAlertResolutionCode;\r\n resolutionId: number;\r\n resolutionCodes: IAlertResolutionCode[];\r\n agreement = false;\r\n\r\n currentUser: IUser;\r\n\r\n UserRole = UserRole;\r\n\r\n resolvingIncident: boolean;\r\n\r\n constructor(\r\n private readonly alertReviewService: AlertReviewService,\r\n private readonly alertsService: AlertsService,\r\n private readonly currentUserService: CurrentUserService,\r\n private readonly displayService: DisplayService,\r\n private readonly translationService: TranslationService) { }\r\n\r\n ngOnInit(): void {\r\n this.currentUserService.getCurrentUser().then(user => {\r\n this.currentUser = user;\r\n })\r\n this.loadData();\r\n }\r\n\r\n resolveIncident(): Promise {\r\n\r\n if (this.resolvingIncident) {\r\n return;\r\n }\r\n\r\n this.resolvingIncident = true;\r\n\r\n this.event = {\r\n Status: AlertReviewStatus.Closed,\r\n Notes: this.noteText,\r\n AlertReviewHistoryId: this.incident.Id,\r\n CreatedTime: new Date(),\r\n UpdatedTime: new Date(),\r\n UserId: this.currentUser.Id,\r\n VehicleId: this.incident.VehicleId,\r\n ResolutionCodeId: this.resolutionId\r\n };\r\n\r\n return (this.alertReviewService.addAlertReviewEvent(this.event) as Promise).then((alertReviewEvent: IAlertReviewEvent) => {\r\n\r\n this.addAlertReviewEvent.emit(alertReviewEvent);\r\n\r\n }).finally(() => {\r\n this.resolvingIncident = false;\r\n });\r\n }\r\n\r\n openResolutionManagerDialog($event) {\r\n let dialogHTML = ``;\r\n\r\n const dialogOptions: IDialogOptionsJson = {\r\n title: this.translationService.t('Alerts.ResolutionCodes'),\r\n dialogHTML: dialogHTML,\r\n dialogId: `alertResolutionCodesDialog`,\r\n bindings: {\r\n onResCodesChanged: () => { this.onResCodesChanged(); },\r\n },\r\n event: $event,\r\n multiple: true,\r\n clickOutsideToClose: true,\r\n escapeToClose: true\r\n };\r\n this.displayService.showDialog(dialogOptions);\r\n\r\n }\r\n\r\n onResCodesChanged(): void {\r\n this.loadData(1000);\r\n }\r\n\r\n\r\n // ---\r\n\r\n private async loadData(delay: number = 0): Promise {\r\n\r\n if (this.loading) {\r\n return;\r\n }\r\n\r\n this.loading = true;\r\n\r\n await timeout(delay);\r\n\r\n let promises = [];\r\n\r\n promises.push(this.alertReviewService.getAlertReviewEvents({ AlertReviewHistoryId: this.incident.Id, invalidateCache: true }));\r\n promises.push(this.alertsService.getAlertResolutionCodes({ invalidateCache: true }));\r\n\r\n Promise.all(promises).then(([alertEvents, resolutionCodes]) => {\r\n this.alertReviewService.mapEventsToHistory(this.incident, alertEvents);\r\n this.resolutionCodes = resolutionCodes.filter(c => c.Active);\r\n this.getResolution();\r\n this.setupActionForm();\r\n })\r\n .finally(() => {\r\n this.loading = false;\r\n })\r\n }\r\n\r\n private setupActionForm() {\r\n\r\n\r\n this.event = {\r\n AlertReviewHistoryId: this.incident.Id,\r\n CreatedTime: new Date(),\r\n UpdatedTime: new Date(),\r\n VehicleId: this.incident.VehicleId,\r\n ResolutionCodeId: this.resolutionId\r\n }\r\n }\r\n\r\n\r\n private getResolution() {\r\n\r\n this.resolutionId = this.alertReviewService.getResolutionCode(this.incident);\r\n if (this.resolutionId) {\r\n this.resolution = this.resolutionCodes.find(code => code.Id === this.alertReviewService.getResolutionCode(this.incident));\r\n }\r\n else {\r\n this.resolution = this.resolutionCodes[0];\r\n this.resolutionId = this.resolution.Id;\r\n }\r\n }\r\n\r\n}\r\n","\r\nimport { Component, OnDestroy, OnInit } from \"@angular/core\";\r\nimport { VTableRowStatus } from \"@app/directives/_layout/v-table/_enums/VTableRowStatus.enum\";\r\nimport { IVTableCell } from \"@app/directives/_layout/v-table/_models/IVTableCell\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { FallbackCellType, VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { DepotNameComponent } from \"@app/directives/_misc/depotName/depotName.component\";\r\nimport { IAggregateFilterEvent, IFilterBarTab } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { DateRange } from \"@app/enum/DateRange.enum\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { IPlot } from \"@app/interfaces/IPlot\";\r\nimport { IGroup } from \"@app/interfaces/IVehicleGroup\";\r\nimport { IDateQueryOptions } from \"@app/services/accelerometerRecord.service\";\r\nimport { DateService } from \"@app/services/date.service\";\r\nimport { DriverService } from \"@app/services/driver.service\";\r\nimport { DriverAssignmentService } from \"@app/services/driverAssignment.service\";\r\nimport { GroupService } from \"@app/services/group.service.ajs\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { VehicleService } from \"@app/services/vehicle.service\";\r\nimport { Subscription, timer } from \"rxjs\";\r\nimport { AlertReviewStatus } from \"../../_enums/AlertReviewStatus.enums\";\r\nimport { AlertCategory } from \"../../_enums/alerts.enums\";\r\nimport { IAlertRule } from \"../../_models/alerts.interfaces\";\r\nimport { IAlertReviewHistory } from \"../../_models/IAlertReviewHistory\";\r\nimport { AlertReviewService } from \"../../_services/alert-review.service\";\r\nimport { AlertRecordMaterialisationOptions, AlertsService, IAlertRecordQueryOptions } from \"../../_services/alerts.service\";\r\nimport { AlertCategoryComponent } from \"../alert-category/alert-category.component\";\r\nimport { AlertDetailService } from \"../alert-detail/alert-detail.service\";\r\nimport { AxleWeightAlertDetailComponent } from \"../alert-detail/axle-weight-alert-detail/axle-weight-alert-detail.component\";\r\nimport { GeofenceAlertDetailComponent } from \"../alert-detail/geofence-alert-detail/geofence-alert-detail.component\";\r\nimport { InputAlertDetailComponent } from \"../alert-detail/input-alert-detail/input-alert-detail.component\";\r\nimport { PowerLossAlertDetailComponent } from \"../alert-detail/power-loss-alert-detail/power-loss-alert-detail.component\";\r\nimport { TemperatureAlertDetailComponent } from \"../alert-detail/temperature-alert-detail/temperature-alert-detail.component\";\r\nimport { TollAlertDetailComponent } from \"../alert-detail/toll-alert-detail/toll-alert-detail.component\";\r\nimport { TyreRecordAlertDetailComponent } from \"../alert-detail/tyre-record-alert-detail/tyre-record-alert-detail.component\";\r\nimport { VehicleDiagnosticAlertDetailComponent } from \"../alert-detail/vehicle-diagnostic-detail/vehicle-diagnostic-alert-detail.component\";\r\nimport { VideoAlertDetailComponent } from \"../alert-detail/video-alert-detail/video-alert-detail.component\";\r\nimport \"./alert-review-history.component.scss\";\r\n\r\n@Component({\r\n selector: 'alert-review-history',\r\n template: require('./alert-review-history.component.html')\r\n})\r\nexport class AlertReviewHistoryComponent implements OnInit, OnDestroy {\r\n loading = false;\r\n\r\n //// #Tables\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n alertReviewHistory: IAlertReviewHistory[];\r\n alertRules: IAlertRule[];\r\n depots: IGroup[];\r\n\r\n defaultDateRange: DateRange = DateRange.Latest7Days;\r\n startDate: Date;\r\n endDate: Date;\r\n groupFilter: IGroup;\r\n\r\n filterTabs: IFilterBarTab[] = [];\r\n\r\n tabIndex: number = 1;\r\n\r\n updateInterval: ReturnType;\r\n\r\n subscriptions = new Subscription();\r\n\r\n constructor(\r\n private readonly alertDetailService: AlertDetailService,\r\n private readonly alertsService: AlertsService,\r\n private readonly alertReviewService: AlertReviewService,\r\n private readonly driverService: DriverService,\r\n private readonly driverAssignmentService: DriverAssignmentService,\r\n private readonly groupService: GroupService,\r\n private readonly translationService: TranslationService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly dateService: DateService,\r\n private readonly vTableService: VTableService,\r\n ) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.createTabs();\r\n\r\n this.startDate = this.dateService.dateRangeFromEnum(this.defaultDateRange).start;\r\n this.endDate = this.dateService.dateRangeFromEnum(this.defaultDateRange).end;\r\n\r\n this.subscriptions.add(timer(0, 60_000).subscribe((iteration: number) => {\r\n this.loadData(iteration === 0, true);\r\n }));\r\n\r\n this.subscriptions.add(this.alertReviewService.alertReviewHistoryUpdated$.subscribe((history) => {\r\n this.alertReviewService.updateAlertReviewHistoryItem(this.alertReviewHistory, history);\r\n\r\n this.createTableRows();\r\n }));\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscriptions.unsubscribe();\r\n }\r\n\r\n selectedItemChanged(row: IVTableRow) {\r\n this.alertReviewService.openIncidentDetailsDialog(row.data, 'app.alerts.review');\r\n }\r\n\r\n onFilterChanged(filterEvent: IAggregateFilterEvent): void {\r\n if (!filterEvent.trigger) {\r\n return;\r\n }\r\n\r\n if (filterEvent.trigger === 'date') {\r\n this.startDate = filterEvent.date[0];\r\n this.endDate = filterEvent.date[1];\r\n\r\n this.loadData(true, true);\r\n }\r\n }\r\n\r\n // ---\r\n\r\n private loadData(firstLoad = false, invalidateCache = false): void {\r\n\r\n if (firstLoad) {\r\n this.loading = true;\r\n }\r\n\r\n let promises: any[] = [];\r\n\r\n promises.push(this.vehicleService.getVehicles());\r\n promises.push(this.driverService.getDrivers());\r\n promises.push(this.driverAssignmentService.getDriverAssignments(true));\r\n promises.push(this.groupService.getGroups());\r\n promises.push(this.alertsService.getAlertRules());\r\n\r\n const dateQueryOptions: IDateQueryOptions = {\r\n Start: this.startDate,\r\n End: this.endDate,\r\n invalidateCache: invalidateCache\r\n }\r\n\r\n promises.push(this.alertReviewService.getAlertReviewHistory(dateQueryOptions));\r\n promises.push(this.alertReviewService.getAlertReviewEvents({ ...dateQueryOptions, End: new Date() }));\r\n\r\n const alertRecordQueryOptions = dateQueryOptions as IAlertRecordQueryOptions;\r\n alertRecordQueryOptions.MaterialisationOptions = AlertRecordMaterialisationOptions.WithMetadata;\r\n\r\n promises.push(this.alertsService.getAlertRuleRecordsUsingQueryOptions(alertRecordQueryOptions));\r\n\r\n Promise.all(promises)\r\n .then(([vehicles, drivers, assignments, groups, alertRules, alertReviewHistory, alertReviewEvents, alertRecords]) => {\r\n\r\n this.alertReviewHistory = alertReviewHistory;\r\n\r\n this.depots = groups.filter(group => group.IsDepot);\r\n\r\n this.driverAssignmentService.mapDriversToVehicles(drivers, assignments, vehicles);\r\n\r\n this.alertRules = alertRules;\r\n\r\n this.alertReviewHistory.forEach(history => {\r\n this.alertReviewService.mapVehicleToHistory(history, vehicles);\r\n this.alertReviewService.mapEventsToHistory(history, alertReviewEvents);\r\n this.alertReviewService.mapAlertRecordToHistory(history, alertRecords);\r\n\r\n if (history.AlertRecord) {\r\n this.alertsService.parseAlertRecordMetadata(history.AlertRecord);\r\n }\r\n\r\n });\r\n\r\n if (this.groupFilter) {\r\n\r\n const vehicleIds = this.groupFilter.VehicleIds;\r\n this.alertReviewHistory = this.alertReviewHistory.filter(history => {\r\n if (vehicleIds.includes(history.VehicleId)) {\r\n return history;\r\n }\r\n });\r\n }\r\n\r\n this.createTable();\r\n\r\n }).finally(() => {\r\n this.createTableRows();\r\n this.loading = false;\r\n });\r\n }\r\n\r\n private createTableRows(): void {\r\n this.tableRows = this.vTableService.createTableRows(this.alertReviewHistory, this.tableColumns);\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n this.vTableService.createTableColumn(\r\n this.vTableService.createStatusTableHeader({ sorted: false, minTableWidth: 490 }),\r\n (historyItem) => {\r\n const rowStatus = this.setRowWarningStatus(historyItem);\r\n\r\n return this.vTableService.createStatusCell(rowStatus);\r\n }\r\n ),\r\n this.vTableService.createTableColumn(\r\n this.vTableService.createTableHeader({ title: \"ID\", sortable: true, width: 100 }),\r\n (historyItem) => this.vTableService.createTableCell(historyItem.Id)\r\n ),\r\n this.vTableService.createTableColumn(\r\n this.vTableService.createDateTableHeader({ tKey: \"Alerts.DateRaised\", sorted: true, sortDirection: SortDirection.Descending, minTableWidth: 800 }),\r\n (historyItem) => this.vTableService.createDateCell(new Date(historyItem.StartTime))\r\n ),\r\n this.vTableService.createTableColumn(\r\n this.vTableService.createTableHeader({ title: this.translationService.t('Alerts.Status'), sortable: true, width: 100, minTableWidth: 390 }),\r\n (historyItem) => {\r\n const status: string = this.translationService.tEnum(AlertReviewStatus, 'AlertReviewStatus', this.alertReviewService.getCurrentStatusOfHistoryItem(historyItem));\r\n\r\n return this.vTableService.createTableCell(status);\r\n },\r\n ),\r\n this.vTableService.createTableColumn(\r\n this.vTableService.createTableHeader({ title: this.translationService.t('Alerts.OpenDuration'), sortable: true, sortType: SortType.Number, width: 200, minTableWidth: 1040 }),\r\n (historyItem) => {\r\n const { startTime, endTime } = this.alertReviewService.getStartAndEndDates(historyItem);\r\n\r\n return this.vTableService.createDurationCellFromDates(startTime, endTime);\r\n },\r\n ),\r\n this.vTableService.createTableColumn(\r\n this.vTableService.createTableHeader({ title: this.translationService.t('Common.Vehicle'), sortable: true, width: 100 }),\r\n (historyItem) => this.vTableService.createVehicleRegCell(historyItem.Vehicle),\r\n ),\r\n this.vTableService.createTableColumn(\r\n this.vTableService.createTableHeader({ title: this.translationService.t('Common.Driver'), sortable: true, width: 150, minTableWidth: 1170 }),\r\n (historyItem) => this.vTableService.createTableCell(historyItem.Vehicle?.Driver?.DisplayName, {}, FallbackCellType.NA),\r\n ),\r\n this.vTableService.createTableColumn(\r\n this.vTableService.createTableHeader({ title: this.translationService.t('Alerts.Depot'), sortable: true, width: 150, minTableWidth: 1295 }),\r\n (historyItem) => {\r\n const depot: IGroup = this.vehicleService.getVehicleDepot(historyItem.VehicleId, this.depots);\r\n\r\n return this.vTableService.createTableCell(depot?.Name, { component: DepotNameComponent, componentInputs: { name: depot?.Name } }, FallbackCellType.NA);\r\n },\r\n ),\r\n this.vTableService.createTableColumn(\r\n this.vTableService.createTableHeader({ title: this.translationService.t('Alerts.Category'), sortable: true, width: 150 }),\r\n (historyItem) => {\r\n const category: string = this.translationService.tEnum(AlertCategory, 'AlertCategory', this.alertReviewService.getAlertRuleCategory(historyItem, this.alertRules));\r\n const { subCategoryEnum, subCategoryString } = this.alertsService.getAlertRuleSubcategoryEnum(this.alertReviewService.getAlertRuleCategory(historyItem, this.alertRules));\r\n const subCategory: string = this.translationService.tEnum(subCategoryEnum, subCategoryString, this.alertReviewService.getAlertRuleSubCategory(historyItem, this.alertRules));\r\n\r\n return this.vTableService.createTableCell(category, { exportData: `${category} ${subCategory ? ' ' + subCategory : ''}`, component: AlertCategoryComponent, componentInputs: { category, subCategory } }, FallbackCellType.NA);\r\n },\r\n ),\r\n this.vTableService.createTableColumn(\r\n this.vTableService.createTableHeader({ title: this.translationService.t('Alerts.Information'), width: 150, searchable: false, sortable: false, minTableWidth: 666 }),\r\n (historyItem) => this.createInformationCell(historyItem),\r\n ),\r\n this.vTableService.createTableColumn(\r\n this.vTableService.createTableHeader({ title: this.translationService.t('Common.Location'), minTableWidth: 1450 }),\r\n (historyItem) => {\r\n const plot: IPlot = historyItem.AlertRecord?.plot ? historyItem.AlertRecord.plot : {};\r\n\r\n return this.vTableService.createLocationInformationCell({ plot });\r\n }\r\n ),\r\n ]\r\n }\r\n\r\n private createInformationCell(historyItem: IAlertReviewHistory): IVTableCell {\r\n if (!historyItem.AlertRecord) {\r\n return this.vTableService.createTableCell(this.translationService.t('Alerts.NoAlarmData'))\r\n }\r\n\r\n switch (true) {\r\n case !!historyItem.AlertRecord.alertMetadata?.AxleWeightOutOfBoundsHistoryId:\r\n case !!historyItem.AlertRecord.alertMetadata?.AxleWeightProfileId:\r\n return this.vTableService.createTableCell(historyItem, { component: AxleWeightAlertDetailComponent, componentInputs: { record: historyItem.AlertRecord, tableMode: true }, exportDataMethod: () => this.detailExportMethod(historyItem) });\r\n\r\n case !!historyItem.AlertRecord.alertMetadata?.GeofenceId:\r\n return this.vTableService.createTableCell(historyItem, { component: GeofenceAlertDetailComponent, componentInputs: { record: historyItem.AlertRecord, tableMode: true }, exportDataMethod: () => this.detailExportMethod(historyItem) });\r\n\r\n case !!historyItem.AlertRecord.alertMetadata?.InputId:\r\n return this.vTableService.createTableCell(historyItem, { component: InputAlertDetailComponent, componentInputs: { record: historyItem.AlertRecord, tableMode: true }, exportDataMethod: () => this.detailExportMethod(historyItem) });\r\n\r\n case !!historyItem.AlertRecord.alertMetadata?.PowerLossHistoryId:\r\n return this.vTableService.createTableCell(historyItem, { component: PowerLossAlertDetailComponent, componentInputs: { record: historyItem.AlertRecord, tableMode: true }, exportDataMethod: () => this.detailExportMethod(historyItem) });\r\n\r\n case !!historyItem.AlertRecord.alertMetadata?.TemperatureRecordId:\r\n case !!historyItem.AlertRecord.alertMetadata?.TemperatureAlarmRecordId:\r\n return this.vTableService.createTableCell(historyItem, { component: TemperatureAlertDetailComponent, componentInputs: { record: historyItem.AlertRecord, tableMode: true }, exportDataMethod: () => this.detailExportMethod(historyItem) });\r\n\r\n case !!historyItem.AlertRecord.alertMetadata?.TollId:\r\n return this.vTableService.createTableCell(historyItem, { component: TollAlertDetailComponent, componentInputs: { record: historyItem.AlertRecord, tableMode: true }, exportDataMethod: () => this.detailExportMethod(historyItem) });\r\n\r\n case !!historyItem.AlertRecord.alertMetadata?.TyreRecordDataId:\r\n return this.vTableService.createTableCell(historyItem, { component: TyreRecordAlertDetailComponent, componentInputs: { record: historyItem.AlertRecord, tableMode: true }, exportDataMethod: () => this.detailExportMethod(historyItem) });\r\n\r\n case !!historyItem.AlertRecord.alertMetadata?.VehicleDiagnosticRecordId:\r\n return this.vTableService.createTableCell(historyItem, { component: VehicleDiagnosticAlertDetailComponent, componentInputs: { record: historyItem.AlertRecord, tableMode: true }, exportDataMethod: () => this.detailExportMethod(historyItem) });\r\n\r\n case !!historyItem.AlertRecord.alertMetadata?.VideoEntryId:\r\n return this.vTableService.createTableCell(historyItem, { component: VideoAlertDetailComponent, componentInputs: { record: historyItem.AlertRecord, tableMode: true }, exportDataMethod: () => this.detailExportMethod(historyItem) }); \r\n\r\n default:\r\n return this.vTableService.createTableCell(this.translationService.t('Alerts.NoAlarmData'))\r\n }\r\n}\r\n\r\n private detailExportMethod(historyItem): Promise {\r\n return this.alertDetailService.getAlertDetailExport(historyItem.AlertRecord);\r\n }\r\n\r\n private setRowWarningStatus(historyItem: IAlertReviewHistory): VTableRowStatus {\r\n let status: VTableRowStatus = VTableRowStatus.Info;\r\n if (this.alertReviewService.getCurrentStatusOfHistoryItem(historyItem) === AlertReviewStatus.Closed) {\r\n status = VTableRowStatus.Success;\r\n }\r\n return status;\r\n }\r\n\r\n private createTabs(): void {\r\n this.filterTabs = [];\r\n\r\n this.createTabDefinition(\"Common.All\", (r) => true);\r\n this.createTabDefinition(\"Alerts.Open\", (r) => r.currentStatus === AlertReviewStatus.Open);\r\n this.createTabDefinition(\"Alerts.Closed\", (r) => r.currentStatus === AlertReviewStatus.Closed);\r\n }\r\n\r\n private createTabDefinition(translationString: string, callback: (historyItem: IAlertReviewHistory) => boolean) {\r\n\r\n this.filterTabs.push({ title: this.translationService.t(translationString), predicate: callback });\r\n }\r\n\r\n}\r\n\r\n\r\n","import { Component, EventEmitter, OnInit, Output } from \"@angular/core\";\r\nimport { timeout } from \"@app/class/Utilities\";\r\nimport { IVListRow } from \"@directives/_veri/v-list/v-list.component\";\r\nimport { IAlertResolutionCode } from \"src/app/main/modules/alerts/_models/IAlertResolutionCode\";\r\nimport { AlertsService } from \"src/app/main/modules/alerts/_services/alerts.service\";\r\nimport './resolution-code-editor.component.scss';\r\n\r\n@Component({\r\n template: require('./resolution-code-editor.component.html'),\r\n selector: 'resolution-code-editor'\r\n})\r\nexport class ResolutionCodeEditorComponent implements OnInit {\r\n\r\n @Output() add = new EventEmitter();\r\n @Output() delete = new EventEmitter();\r\n\r\n resolutionCode: IAlertResolutionCode;\r\n resolutionCodes: IVListRow[];\r\n\r\n resolutionCodeText: string;\r\n editMode = false;\r\n\r\n loading: boolean;\r\n saving: boolean;\r\n deleting: boolean;\r\n\r\n constructor(\r\n private readonly alertsService: AlertsService) { }\r\n\r\n ngOnInit(): void {\r\n this.loadData();\r\n }\r\n\r\n async addResolutionCode(): Promise {\r\n\r\n if (this.saving) {\r\n return;\r\n }\r\n\r\n this.saving = true;\r\n\r\n if (this.editMode) {\r\n await this.alertsService.updateAlertResolutionCode(this.resolutionCode)\r\n } else {\r\n await this.alertsService.addAlertResolutionCode(this.resolutionCode)\r\n }\r\n\r\n this.add.emit();\r\n this.saving = false;\r\n\r\n this.loadData(1000);\r\n }\r\n\r\n listItemSelected(listItem: IVListRow): void {\r\n this.resolutionCode = listItem.data;\r\n this.resolutionCodeText = listItem.data.Name;\r\n this.editMode = true;\r\n }\r\n\r\n cancelEditMode(): void {\r\n this.editMode = false;\r\n this.resolutionCode = {\r\n Id: null,\r\n Name: '',\r\n AccountId: null,\r\n Active: true\r\n }\r\n }\r\n\r\n async deleteResolutionCode(confirmation: boolean): Promise {\r\n\r\n if (this.deleting) {\r\n return;\r\n }\r\n\r\n if (!confirmation) {\r\n return;\r\n }\r\n\r\n this.deleting = true;\r\n\r\n this.resolutionCode.Active = false;\r\n\r\n await this.alertsService.updateAlertResolutionCode(this.resolutionCode);\r\n\r\n this.cancelEditMode();\r\n this.delete.emit();\r\n this.deleting = false;\r\n\r\n this.loadData(1000);\r\n }\r\n\r\n //--\r\n\r\n private async loadData(delay: number = 0): Promise {\r\n\r\n if (this.loading) {\r\n return;\r\n }\r\n\r\n this.loading = true;\r\n\r\n await timeout(delay);\r\n\r\n this.resolutionCodes = [];\r\n\r\n this.resolutionCode = {\r\n Id: null,\r\n Name: '',\r\n AccountId: null,\r\n Active: true\r\n }\r\n\r\n this.alertsService.getAlertResolutionCodes({ invalidateCache: true }).then(codes => {\r\n codes.filter(c => c.Active).forEach(code => {\r\n this.resolutionCodes.push({\r\n data: code,\r\n id: code.Id,\r\n searchString: code.Name,\r\n sortData: code.Name,\r\n contents: code.Name\r\n });\r\n })\r\n }).finally(() => {\r\n this.loading = false;\r\n })\r\n }\r\n}\r\n","import { Component, OnInit } from \"@angular/core\";\r\nimport { AccountFeatures } from \"@enums/account/AccountFeature\";\r\nimport { SpecialUserPermissions } from \"@enums/SpecialUserPermissions\";\r\nimport { AccountUserType } from \"@enums/UserType\";\r\nimport { IAccountUserMapping, IUser } from \"@interfaces/IUser\";\r\nimport { AccountService, IAccount } from \"@services/account.service\";\r\nimport { AccountFeatureService, IAccountFeatureDescription, ISpecialUserPermissionDescription } from \"@services/accountFeature.service\";\r\nimport { CurrentUserService } from \"@services/currentUser.service\";\r\nimport \"./user-access-tester.component.scss\";\r\n\r\n@Component({\r\n selector: \"user-access-tester\",\r\n template: require(\"./user-access-tester.component.html\")\r\n})\r\nexport class UserAccessTesterComponent implements OnInit {\r\n\r\n // raw data\r\n user: IUser;\r\n accountData: IAccount;\r\n accountFeatureDescriptions: IAccountFeatureDescription[];\r\n specialUserPermissionDescriptions: ISpecialUserPermissionDescription[];\r\n\r\n // state\r\n cachedUserType: AccountUserType;\r\n cachedReadFeatures: AccountFeatures;\r\n cachedManageFeatures: AccountFeatures;\r\n cachedSpecialUserPermissions: SpecialUserPermissions;\r\n\r\n // spinners\r\n loading: boolean;\r\n\r\n // enums\r\n UserType = AccountUserType;\r\n AccountFeature = AccountFeatures;\r\n\r\n get isAdminUser(): boolean {\r\n return this.user?.CurrentAccountUserMapping?.Type === AccountUserType.Admin;\r\n }\r\n\r\n constructor(\r\n private readonly accountService: AccountService,\r\n private readonly accountFeatureService: AccountFeatureService,\r\n private readonly currentUserService: CurrentUserService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.getData();\r\n }\r\n\r\n reset(): void {\r\n this.getData(true);\r\n }\r\n\r\n toggleUserType(): void {\r\n this.user.CurrentAccountUserMapping.Type = (this.user.CurrentAccountUserMapping.Type === AccountUserType.Admin) ? AccountUserType.User : AccountUserType.Admin;\r\n\r\n this.cacheUserType();\r\n this.processUserType();\r\n }\r\n\r\n toggleAccountFeature(feature: AccountFeatures): void {\r\n this.accountService.updateAccountCache(this.accountData);\r\n this.accountFeatureService.printAccountFeatureListForAccount(this.accountData);\r\n }\r\n\r\n toggleUserReadFeature(feature: AccountFeatures): void {\r\n this.currentUserService.updateCurrentUserCache(this.user);\r\n this.cacheFeatureAccess();\r\n }\r\n\r\n toggleUserManageFeature(feature: AccountFeatures): void {\r\n this.currentUserService.updateCurrentUserCache(this.user);\r\n this.cacheFeatureAccess();\r\n }\r\n\r\n toggleSpecialUserPermission(permission: SpecialUserPermissions): void {\r\n this.currentUserService.updateCurrentUserCache(this.user);\r\n this.cacheSpecialPermissionAccess();\r\n }\r\n\r\n updateFeatureSet(): void {\r\n if (this.loading) {\r\n return;\r\n }\r\n\r\n this.loading = true;\r\n\r\n this.accountService.updateAccountData().then((accountData: IAccount) => {\r\n this.accountData = accountData;\r\n\r\n }).finally(() => {\r\n this.loading = false;\r\n });\r\n }\r\n\r\n // ---\r\n\r\n private getData(invalidateCache: boolean = false): Promise {\r\n if (this.loading) {\r\n return;\r\n }\r\n\r\n this.loading = true;\r\n\r\n const currentUserPromise = this.currentUserService.getCurrentUser(invalidateCache) as Promise;\r\n const accountDataPromose = this.accountService.getAccountData(invalidateCache) as Promise;\r\n\r\n return Promise.all([currentUserPromise, accountDataPromose]).then(([currentUser, accountData]) => {\r\n this.user = currentUser;\r\n this.accountData = accountData;\r\n this.accountFeatureDescriptions = this.accountFeatureService.getFeatureDescriptionsForAccountAndUser(accountData, currentUser);\r\n this.specialUserPermissionDescriptions = this.accountFeatureService.getSpecialUserPermissionDescriptions();\r\n\r\n this.cacheUserType();\r\n this.cacheFeatureAccess();\r\n this.cacheSpecialPermissionAccess();\r\n this.processUserType();\r\n\r\n }).finally(() => {\r\n this.loading = false;\r\n });\r\n }\r\n\r\n private setAllReadFeatures(enabled: boolean): void {\r\n this.accountFeatureDescriptions.forEach(featureDescription => {\r\n enabled\r\n ? this.addUserReadFeature(this.user.CurrentAccountUserMapping, featureDescription.feature)\r\n : this.removeUserReadFeature(this.user.CurrentAccountUserMapping, featureDescription.feature);\r\n });\r\n }\r\n\r\n private setAllManageFeatures(enabled: boolean): void {\r\n this.accountFeatureDescriptions.forEach(featureDescription => {\r\n enabled\r\n ? this.addUserManageFeature(this.user.CurrentAccountUserMapping, featureDescription.feature)\r\n : this.removeUserManageFeature(this.user.CurrentAccountUserMapping, featureDescription.feature);\r\n });\r\n }\r\n\r\n private cacheUserType(): void {\r\n this.cachedUserType = this.user.CurrentAccountUserMapping.Type;\r\n }\r\n\r\n private cacheFeatureAccess(): void {\r\n this.cachedReadFeatures = this.user.CurrentAccountUserMapping.ReadFeatures;\r\n this.cachedManageFeatures = this.user.CurrentAccountUserMapping.ManageFeatures;\r\n }\r\n\r\n private cacheSpecialPermissionAccess(): void {\r\n this.cachedSpecialUserPermissions = this.user.CurrentAccountUserMapping.SpecialUserPermissions;\r\n }\r\n\r\n private addUserReadFeature(userMapping: IAccountUserMapping, feature: AccountFeatures): void {\r\n userMapping.ReadFeatures = userMapping.ReadFeatures | feature;\r\n }\r\n\r\n private removeUserReadFeature(userMapping: IAccountUserMapping, feature: AccountFeatures): void {\r\n userMapping.ReadFeatures = userMapping.ReadFeatures & ~feature;\r\n }\r\n\r\n private addUserManageFeature(userMapping: IAccountUserMapping, feature: AccountFeatures): void {\r\n userMapping.ManageFeatures = userMapping.ManageFeatures | feature;\r\n }\r\n\r\n private removeUserManageFeature(userMapping: IAccountUserMapping, feature: AccountFeatures): void {\r\n userMapping.ManageFeatures = userMapping.ManageFeatures & ~feature;\r\n }\r\n\r\n private processUserType(): void {\r\n if (this.isAdminUser) {\r\n this.setAllReadFeatures(true);\r\n this.setAllManageFeatures(true);\r\n } else {\r\n this.user.CurrentAccountUserMapping.ReadFeatures = this.cachedReadFeatures;\r\n this.user.CurrentAccountUserMapping.ManageFeatures = this.cachedManageFeatures;\r\n }\r\n\r\n this.currentUserService.updateCurrentUserCache(this.user);\r\n }\r\n}\r\n","import { Component, Input, OnChanges, SimpleChanges } from \"@angular/core\";\r\nimport { AccountFeatures } from \"@enums/account/AccountFeature\";\r\nimport { IPlot } from \"@interfaces/IPlot\";\r\nimport { AccountFeatureService } from \"@services/accountFeature.service\";\r\nimport { CameraService } from \"../../videos/services/camera.service\";\r\n\r\n@Component({\r\n selector: 'video-restriction',\r\n template: ''\r\n})\r\nexport class VideoRestrictionComponent implements OnChanges {\r\n\r\n @Input() plot: IPlot;\r\n\r\n debounceTimeout: any;\r\n hideVideoButton: boolean;\r\n\r\n constructor(\r\n private readonly cameraService: CameraService,\r\n private readonly accountFeatureService: AccountFeatureService) { }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n\r\n this.checkRestriction();\r\n }\r\n\r\n // ---\r\n\r\n private checkRestriction() {\r\n\r\n this.hideVideoButton = !this.accountFeatureService.currentUserHasFeatureAccess(AccountFeatures.Camera) || this.plot?.videoRestricted === true;\r\n\r\n if (this.hideVideoButton || !this.plot.LocationInformation?.GeofenceIds?.length) { return; }\r\n \r\n this.cameraService.videoRestrictionCheck({\r\n VehicleId: this.plot.VehicleId,\r\n Length: 2,\r\n VideoStartTime: this.plot.UtcMoment.toDate(),\r\n VideoId: null,\r\n StreamType: null\r\n })\r\n .then(result => {\r\n if (!result?.CanBeRequested) {\r\n this.hideVideoButton = true;\r\n this.plot.videoRestricted = true;\r\n }\r\n else {\r\n this.plot.videoRestricted = false;\r\n }\r\n });\r\n \r\n\r\n \r\n }\r\n\r\n}\r\n","import { Component, Input, OnChanges, OnDestroy, SimpleChanges } from \"@angular/core\";\r\nimport { IPlotTemperatureRecord } from \"@app/interfaces/IPlot\";\r\nimport { ITemperatureProbe } from \"@app/main/modules/temperature/_models/temperature/ITemperatureProbe\";\r\nimport { ITemperatureProfile } from \"@app/main/modules/temperature/_models/temperature/ITemperatureProfile\";\r\nimport { TemperatureProbeService } from \"@app/main/modules/temperature/_services/temperature-probe.service\";\r\nimport { TemperatureProfileService } from \"@app/main/modules/temperature/_services/temperature-profile.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { combineLatest, Subscription } from \"rxjs\";\r\nimport './temperatureRow.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'temperature-row',\r\n template: require('./temperature-row.component.html')\r\n})\r\nexport class TemperatureRowComponent implements OnChanges, OnDestroy {\r\n @Input() temperatureRecord: IPlotTemperatureRecord;\r\n @Input() showLabel: boolean;\r\n\r\n //--\r\n\r\n probe: ITemperatureProbe;\r\n profile: ITemperatureProfile;\r\n outOfBounds: boolean;\r\n\r\n dataSubscription = new Subscription();\r\n\r\n constructor(\r\n private readonly temperatureProbeService: TemperatureProbeService,\r\n private readonly temperatureProfileService: TemperatureProfileService) { }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['temperatureRecord']) {\r\n this.getProbesAndProfiles();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.clearSubscriptions();\r\n }\r\n //--\r\n\r\n private getProbesAndProfiles(): void {\r\n this.clearSubscriptions();\r\n\r\n this.dataSubscription = combineLatest([\r\n this.temperatureProbeService.getTemperatureProbesForVehicle(this.temperatureRecord.VehicleId),\r\n this.temperatureProfileService.getTemperatureProfiles()\r\n ]).pipe(\r\n untilDestroyed(this)\r\n ).subscribe({\r\n next: ([probes, profiles]) => {\r\n this.probe = probes.find(probe => probe.Id == this.temperatureRecord.TemperatureProbeId);\r\n this.profile = profiles.find(profile => profile.Id == this.probe.TemperatureProfileId);\r\n this.setOutOfBounds();\r\n }\r\n });\r\n }\r\n\r\n private clearSubscriptions(): void {\r\n this.dataSubscription?.unsubscribe();\r\n }\r\n\r\n private setOutOfBounds(): void {\r\n if (!this.probe || !this.profile) {\r\n this.outOfBounds = false;\r\n return;\r\n }\r\n\r\n if (this.temperatureRecord.Temperature < this.profile.LowerBound ||\r\n this.temperatureRecord.Temperature > this.profile.UpperBound) {\r\n this.outOfBounds = true;\r\n }\r\n }\r\n}\r\n","import { Component, OnInit, TemplateRef, ViewChild } from \"@angular/core\";\r\nimport { VTableRowStatus } from \"@app/directives/_layout/v-table/_enums/VTableRowStatus.enum\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { DepotNameComponent } from \"@app/directives/_misc/depotName/depotName.component\";\r\nimport { IAggregateFilterEvent } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { DateService } from \"@app/services/date.service\";\r\nimport { DateRange } from \"@enums/DateRange.enum\";\r\nimport { SortType } from \"@enums/SortType\";\r\nimport { IGeofence } from \"@interfaces/IGeofences\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { IGroup } from \"@interfaces/IVehicleGroup\";\r\nimport { GeofenceService, IGeofenceVisit } from \"@services/geofence.service\";\r\nimport { GroupService } from \"@services/group.service.ajs\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport \"./depot-compliance.component.scss\";\r\n\r\n\r\ninterface IVehicleDepotVisitBreakdown {\r\n geofence: IGeofence;\r\n depot?: IGroup;\r\n duration?: number;\r\n durationString?: string;\r\n percentage?: number;\r\n}\r\n\r\ninterface IVehicleDepotRecord extends IVehicle {\r\n allGeofenceVisits?: IGeofenceVisit[],\r\n allDepotVisits?: IGeofenceVisit[];\r\n homeDepotGroup?: IGroup,\r\n mostVisitedDepot?: IGroup;\r\n depotVisitBreakdown?: IVehicleDepotVisitBreakdown[];\r\n homeVisits?: IGeofenceVisit[],\r\n}\r\n\r\n\r\n@Component({\r\n selector: \"depot-compliance\",\r\n template: require('./depot-compliance.component.html')\r\n})\r\nexport class DepotComplianceComponent implements OnInit {\r\n\r\n loading = false;\r\n\r\n defaultDateRange = DateRange.ThisMonth;\r\n startDate: Date;\r\n endDate: Date;\r\n\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n selectedVehicleTableColumns: IVTableColumn[];\r\n selectedVehicleTableRows: IVTableRow[];\r\n\r\n vehicles: IVehicleDepotRecord[];\r\n selectedVehicle: IVehicleDepotRecord;\r\n\r\n geofences: IGeofence[];\r\n geofenceVisits: IGeofenceVisit[];\r\n\r\n depots: IGroup[];\r\n\r\n timeWindow: number;\r\n\r\n @ViewChild('mostVisitedColumn') mostVisitedColumn: TemplateRef;\r\n constructor(\r\n private readonly dateService: DateService,\r\n private readonly groupService: GroupService,\r\n private readonly geofenceService: GeofenceService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly veriDate: VeriDate,\r\n private readonly vTableService: VTableService,\r\n private readonly translationService: TranslationService,\r\n ) {\r\n }\r\n\r\n\r\n ngOnInit(): void {\r\n this.startDate = this.veriDate.dateRangeFromEnum(this.defaultDateRange).start;\r\n this.endDate = this.veriDate.dateRangeFromEnum(this.defaultDateRange).end;\r\n this.createTable();\r\n this.loadData();\r\n }\r\n\r\n selectedVehicleChanged(row: IVTableRow) {\r\n this.selectedVehicle = row.data;\r\n this.createSelectedVehicleTable();\r\n this.createSelectedVehicleTableRows();\r\n }\r\n\r\n clearSelectedVehicle() {\r\n this.selectedVehicle = null;\r\n }\r\n\r\n onFilterChanged(filterEvent: IAggregateFilterEvent) {\r\n\r\n if (filterEvent.trigger == \"date\") {\r\n this.startDate = filterEvent.date[0];\r\n this.endDate = filterEvent.date[1];\r\n this.setTimeWindow();\r\n this.loadData();\r\n return;\r\n }\r\n }\r\n\r\n\r\n getExportTitle() {\r\n return `${this.translationService.translate('DepotCompliance.DepotCompliance')} - ${this.veriDate.createMoment(this.startDate).format('DD-MM-YYYY')} to ${this.veriDate.createMoment(this.endDate).format('DD-MM-YYYY')}`;\r\n }\r\n\r\n //--\r\n\r\n private loadData() {\r\n this.loading = true;\r\n const promises: any[] = [];\r\n promises.push(this.vehicleService.getVehicles({ includeLatestPlots: true }));\r\n promises.push(this.groupService.getGroups());\r\n promises.push(this.geofenceService.getGeofences());\r\n promises.push(this.geofenceService.getGeofenceVisits(this.veriDate.createMoment(this.startDate), this.veriDate.createMoment(this.endDate), true));\r\n Promise.all(promises).then(([vehicles, groups, geofences, visits]) => {\r\n this.vehicles = vehicles;\r\n this.geofences = geofences;\r\n this.depots = this.groupService.findDepotsWithHomeLocations(groups);\r\n this.mapDepotToVehicles();\r\n this.mapVisitsToVehicles(visits);\r\n this.getDepotVisitsBreakdown()\r\n }).finally(() => {\r\n this.tableRows = this.vTableService.createTableRows(this.vehicles, this.tableColumns);\r\n this.loading = false;\r\n })\r\n }\r\n\r\n private mapDepotToVehicles() {\r\n this.vehicles.forEach(vehicle => {\r\n vehicle.homeDepotGroup = this.vehicleService.findVehicleDepot(vehicle.Id, this.depots);\r\n })\r\n }\r\n\r\n private setTimeWindow(): void {\r\n const startDate = this.startDate;\r\n const endDate = this.dateService.date1IsAfterDate2(this.endDate, new Date()) ? new Date() : this.endDate;\r\n this.timeWindow = endDate.getTime() - startDate.getTime();\r\n }\r\n\r\n private mapVisitsToVehicles(visits: IGeofenceVisit[]) {\r\n visits.forEach(visit => {\r\n this.getVisitDuration(visit);\r\n visit.geofence = this.geofenceService.findGeofence(this.geofences, visit.GeofenceId);\r\n });\r\n this.vehicles.forEach(vehicle => {\r\n vehicle.allGeofenceVisits = visits.filter(visit => visit.VehicleId === vehicle.Id);\r\n vehicle.allGeofenceVisits.sort((a, b) => {\r\n if (a.duration > b.duration) {\r\n return -1;\r\n }\r\n });\r\n vehicle.allDepotVisits = vehicle.allGeofenceVisits.filter(visit => this.isVisitLocationADepot(visit) && this.visitIsOver9Hours(visit));\r\n vehicle.homeVisits = this.geofenceService.findGeofenceVisitsToDepotsOrHomeLocations(vehicle.allGeofenceVisits, this.depots);\r\n });\r\n }\r\n\r\n private getDepotVisitsBreakdown() {\r\n this.vehicles.forEach(vehicle => {\r\n vehicle.depotVisitBreakdown = [];\r\n vehicle.allDepotVisits.forEach(visit => {\r\n const location = vehicle.depotVisitBreakdown.find(dv => {\r\n return dv.geofence.Id === visit.GeofenceId;\r\n });\r\n if (location) {\r\n location.duration += visit.duration;\r\n return;\r\n }\r\n\r\n const depot = this.depots.find(d => d.GeofenceId === visit.GeofenceId);\r\n vehicle.depotVisitBreakdown.push({\r\n geofence: this.geofenceService.findGeofence(this.geofences, visit.GeofenceId),\r\n depot,\r\n duration: visit.duration,\r\n percentage: 0\r\n });\r\n\r\n });\r\n\r\n const totalDuration = vehicle.depotVisitBreakdown.reduce((prev, curr) => {\r\n return prev + curr.duration;\r\n }, 0);\r\n vehicle.depotVisitBreakdown.forEach(depotBreakdown => {\r\n depotBreakdown.percentage = (depotBreakdown.duration / totalDuration * 100);\r\n depotBreakdown.durationString = this.veriDate.formatDurationMs(depotBreakdown.duration);\r\n })\r\n vehicle.depotVisitBreakdown.sort((a, b) => {\r\n if (a.duration > b.duration) {\r\n return -1;\r\n };\r\n });\r\n\r\n this.findMostVisitedDepotsForVehicle(vehicle);\r\n });\r\n }\r\n\r\n private getVisitDuration(visit: IGeofenceVisit) {\r\n const startTime = new Date(visit.StartUtc);\r\n const endTime = visit.EndUtc ? new Date(visit.EndUtc) : new Date();\r\n visit.duration = endTime.getTime() - startTime.getTime();\r\n visit.durationFormatted = this.veriDate.formatDurationMs(visit.duration);\r\n }\r\n\r\n private getTotalTimeAtDepots(vehicle: IVehicleDepotRecord): number {\r\n let totalTime = 0;\r\n totalTime = vehicle.allDepotVisits.reduce((prev, curr) => {\r\n return prev + curr.duration;\r\n }, 0);\r\n if (totalTime > this.timeWindow) {\r\n // If a vehicle has been parked since before the start date on the\r\n // date filter, it will return a longer time than the expected window\r\n totalTime = this.timeWindow;\r\n }\r\n return totalTime;\r\n }\r\n\r\n private findMostVisitedDepotsForVehicle(vehicle: IVehicleDepotRecord) {\r\n if (!vehicle.depotVisitBreakdown?.length) {\r\n return;\r\n }\r\n vehicle.mostVisitedDepot = this.depots.find(depot => {\r\n return depot.GeofenceId === vehicle.depotVisitBreakdown[0].geofence.Id;\r\n });\r\n return vehicle.mostVisitedDepot;\r\n\r\n }\r\n\r\n private isVisitLocationADepot(visit: IGeofenceVisit) {\r\n const depot = this.depots.find(depot => depot.GeofenceId === visit.GeofenceId);\r\n if (depot) {\r\n return true;\r\n }\r\n else {\r\n return false;\r\n }\r\n }\r\n\r\n private visitIsOver9Hours(visit: IGeofenceVisit) {\r\n return visit.duration > 9 * 60 * 60 * 1000;\r\n }\r\n\r\n private getRowWarningStatus(vehicle: IVehicleDepotRecord): VTableRowStatus {\r\n if (!vehicle.mostVisitedDepot || !vehicle.homeDepotGroup) {\r\n return VTableRowStatus.Info;\r\n }\r\n if (vehicle.homeDepotGroup.GeofenceId === vehicle.mostVisitedDepot?.GeofenceId) {\r\n return VTableRowStatus.Info;\r\n }\r\n else {\r\n return VTableRowStatus.Error;\r\n }\r\n }\r\n\r\n private createTable() {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createStatusTableHeader(),\r\n createCellFunction: (vehicle) => this.vTableService.createStatusCell(this.getRowWarningStatus(vehicle)),\r\n },\r\n {\r\n header: this.vTableService.createVehicleTableHeader(),\r\n createCellFunction: (vehicle) => this.vTableService.createVehicleRegCell(vehicle),\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('DepotCompliance.HomeDepot'), sortable: true }),\r\n createCellFunction: (vehicle) => {\r\n const depot = vehicle.homeDepotGroup;\r\n if (!depot) {\r\n return this.vTableService.createTableCell(this.translationService.t(\"DepotCompliance.NoDepotOrHomeSpecified\"), {classes: 'text-muted'})\r\n }\r\n return this.vTableService.createTableCell(depot?.Name, { exportData: depot?.Name, sortData: depot?.Name, component: DepotNameComponent, componentInputs: { name: depot?.Name } });\r\n }\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('DepotCompliance.MostVisitedDepot'), sortable: true }),\r\n createCellFunction: (vehicle) => {\r\n const mostVisited = this.findMostVisitedDepotsForVehicle(vehicle);\r\n const mostVisitedPercentage = vehicle.depotVisitBreakdown.length ? vehicle.depotVisitBreakdown[0].percentage : null;\r\n const templateData = {\r\n name: mostVisited?.Name || null,\r\n percentage: mostVisitedPercentage\r\n }\r\n return this.vTableService.createTableTemplateCell(templateData, this.mostVisitedColumn, { exportData: mostVisited?.Name || \"--\", sortData: mostVisited?.Name });\r\n }\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('DepotCompliance.TotalTimeSpent'), sortable: true, sortType: SortType.Number }),\r\n createCellFunction: (vehicle) => {\r\n const totalTimeSpent = this.getTotalTimeAtDepots(vehicle);\r\n return this.vTableService.createTableCell(this.dateService.formatTimeFromMilliseconds(totalTimeSpent), { sortData: totalTimeSpent, exportData: this.dateService.formatTimeFromMilliseconds(totalTimeSpent) });\r\n }\r\n },\r\n ];\r\n }\r\n\r\n private createSelectedVehicleTable() {\r\n\r\n this.selectedVehicleTableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('DepotCompliance.Depot'), sortable: true, sortType: SortType.String }),\r\n createCellFunction: (visitBreakdown) => this.vTableService.createTableCell(visitBreakdown.depot?.Name, { component: DepotNameComponent, componentInputs: { name: visitBreakdown.depot?.Name } })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('DepotCompliance.TotalDuration'), sortable: true, sortType: SortType.Number }),\r\n createCellFunction: (visitBreakdown) => this.vTableService.createTableCell(visitBreakdown.durationString, { sortData: visitBreakdown.duration })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('DepotCompliance.Percentage'), sortable: true, sortType: SortType.Number }),\r\n createCellFunction: (visitBreakdown) => this.vTableService.createTableCell(visitBreakdown.percentage.toFixed(1) + '%', { sortData: visitBreakdown.percentage })\r\n }\r\n ]\r\n\r\n }\r\n\r\n private createSelectedVehicleTableRows() {\r\n this.selectedVehicleTableRows = this.vTableService.createTableRows(this.selectedVehicle.depotVisitBreakdown, this.selectedVehicleTableColumns);\r\n }\r\n}\r\n","import { AfterViewInit, Component, Input, OnInit } from \"@angular/core\";\r\n\r\nimport { IDriverComparison } from \"../driver-behaviour-comparison.component\";\r\nimport \"./driver-behaviour-stack.component.scss\";\r\n\r\n@Component({\r\n selector: \"driver-behaviour-stack\",\r\n template: require(\"./driver-behaviour-stack.component.html\")\r\n})\r\nexport class DriverBehaviourStackComponent implements OnInit, AfterViewInit {\r\n @Input() driver: IDriverComparison;\r\n\r\n constructor(\r\n ) {\r\n\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n ngAfterViewInit() {\r\n\r\n }\r\n\r\n // ---\r\n\r\n}\r\n","import { AfterViewInit, Component, ElementRef, Input, OnChanges, OnInit, SimpleChanges, ViewChild } from \"@angular/core\";\r\nimport { CanvasService } from \"@app/services/canvas.service\";\r\nimport { ResponsiveService } from \"@app/services/responsive.service\";\r\nimport { IDriverScore } from \"../driver-behaviour-comparison.component\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport \"./driver-score-graph.component.scss\";\r\n\r\ninterface ISegment {\r\n color: string;\r\n value: number;\r\n}\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: \"driver-score-graph\",\r\n template: require(\"./driver-score-graph.component.html\")\r\n})\r\nexport class DriverScoreGraphComponent implements OnInit, AfterViewInit, OnChanges {\r\n @Input() score: IDriverScore;\r\n @Input() width: number;\r\n @Input() horizontal: boolean;\r\n\r\n @ViewChild('canvas') canvas: ElementRef;\r\n\r\n // ---\r\n\r\n private segments: ISegment[];\r\n private ctx: CanvasRenderingContext2D;\r\n\r\n private height: number;\r\n\r\n private fontSize: number;\r\n private messageClass: string;\r\n private messageString: string;\r\n\r\n private centerX: number;\r\n private centerY: number;\r\n private radius: number;\r\n private lineWidth: number;\r\n\r\n private distancePerTick: number;\r\n private targetIndicatorPosition: number;\r\n private currentIndicatorPosition: number;\r\n\r\n constructor(\r\n private el: ElementRef,\r\n private responsiveService: ResponsiveService,\r\n private canvasService: CanvasService) {\r\n\r\n this.responsiveService.currentWindowWidth$.pipe(untilDestroyed(this)).subscribe(() => {\r\n this.resizeCanvas();\r\n this.drawCanvas();\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.ctx = this.canvas.nativeElement.getContext('2d');\r\n\r\n this.resizeCanvas();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n\r\n if (!this.score) {\r\n return;\r\n }\r\n\r\n // Segment configurations\r\n\r\n const b1 = this.score.lowerRagBound / 100;\r\n var b2 = (this.score.upperRagBound - this.score.lowerRagBound) / 100;\r\n var b3 = 1 - b2 - b1;\r\n this.segments = this.createSegments(b1, b2, b3);\r\n\r\n this.onScoreUpdated();\r\n }\r\n\r\n private onScoreUpdated() {\r\n // Position for the indicator\r\n this.currentIndicatorPosition = this.targetIndicatorPosition || 0;\r\n\r\n let targetScore = this.score.score;\r\n\r\n // Clamp scores so we dont bleed off the edge of the canvas\r\n const buffer = this.horizontal ? 10 : 2;\r\n Math.min(100 - buffer, this.score.score);\r\n targetScore = Math.max(buffer, targetScore);\r\n this.targetIndicatorPosition = targetScore / 100;\r\n\r\n this.distancePerTick = (this.targetIndicatorPosition - this.currentIndicatorPosition) / 33;\r\n this.distancePerTick = (this.targetIndicatorPosition - this.currentIndicatorPosition) / 50;\r\n\r\n this.animateCanvas();\r\n this.setMessageClass();\r\n }\r\n\r\n // ---\r\n\r\n private resizeCanvas() {\r\n if (!this.canvas?.nativeElement || !this.score) {\r\n return;\r\n }\r\n\r\n this.width = this.el.nativeElement.offsetWidth;\r\n this.fontSize = this.width / 10;\r\n\r\n this.height = this.width / 2;\r\n\r\n if (this.horizontal) {\r\n this.width = 90;\r\n this.height = 20;\r\n }\r\n\r\n this.canvasService.setCanvasDimensions(this.canvas.nativeElement, this.ctx, this.width, this.height);\r\n\r\n // Center and radius of the gauge\r\n this.centerX = this.canvas.nativeElement.width / 2;\r\n this.centerY = this.canvas.nativeElement.height * 0.95;\r\n this.radius = this.canvas.nativeElement.width * 0.4;\r\n this.lineWidth = this.width / 40; \r\n\r\n if (this.horizontal) {\r\n this.centerY = this.canvas.nativeElement.height / 2;\r\n this.lineWidth = 4;\r\n }\r\n }\r\n\r\n private drawCanvas() {\r\n if (!this.ctx || !this.segments) {\r\n return;\r\n }\r\n\r\n this.ctx.clearRect(0, 0, this.width, this.height);\r\n\r\n // Calculate the starting angle and ending angle for each segment\r\n if (this.horizontal) {\r\n this.drawHorizontalSegments();\r\n }\r\n else {\r\n this.drawArcSegments();\r\n this.drawIndicatorDots();\r\n }\r\n\r\n this.drawIndicator(this.currentIndicatorPosition);\r\n }\r\n\r\n private animateCanvas() {\r\n if (!this.canvas?.nativeElement) {\r\n setTimeout(() => {\r\n this.animateCanvas();\r\n });\r\n\r\n return;\r\n }\r\n\r\n if (!this.height) {\r\n this.resizeCanvas();\r\n }\r\n\r\n \r\n\r\n if (Math.abs(this.targetIndicatorPosition - this.currentIndicatorPosition) > Math.abs(this.distancePerTick)) {\r\n this.currentIndicatorPosition += this.distancePerTick;\r\n\r\n if (this.distancePerTick > 0) {\r\n this.currentIndicatorPosition = Math.min(this.currentIndicatorPosition, this.targetIndicatorPosition);\r\n }\r\n else {\r\n this.currentIndicatorPosition = Math.max(this.currentIndicatorPosition, this.targetIndicatorPosition);\r\n }\r\n\r\n requestAnimationFrame(() => { this.animateCanvas(); });\r\n }\r\n else {\r\n\r\n this.currentIndicatorPosition = this.targetIndicatorPosition;\r\n }\r\n\r\n this.drawCanvas();\r\n }\r\n\r\n private drawHorizontalSegments() {\r\n let startPosition = 0;\r\n this.segments.forEach((segment, i) => {\r\n const endPosition = startPosition + this.width * segment.value;\r\n this.drawArcSegment(startPosition, endPosition, segment.color, i == 0, i == this.segments.length - 1);\r\n startPosition = endPosition; // Update the starting angle for the next segment\r\n });\r\n }\r\n\r\n private drawArcSegments() {\r\n let startAngle = Math.PI; // Start at 180 degrees (semi-circle)\r\n\r\n this.segments.forEach((segment, i) => {\r\n const endAngle = startAngle + Math.PI * segment.value;\r\n this.drawArcSegment(startAngle, endAngle, segment.color, i == 0, i == this.segments.length - 1);\r\n startAngle = endAngle; // Update the starting angle for the next segment\r\n });\r\n }\r\n\r\n private drawArcSegment(startAngle: number, endAngle: number, color: string, startSegment = false, endSegment = false) {\r\n this.ctx.beginPath();\r\n\r\n const buffer = this.horizontal ? this.lineWidth / 1.5 : this.lineWidth / 120;\r\n let angle1 = startAngle;\r\n let angle2 = endAngle;\r\n\r\n if (!startSegment) {\r\n angle1 += buffer;\r\n }\r\n\r\n if (!endSegment) {\r\n angle2 -= buffer;\r\n }\r\n\r\n if (this.horizontal) {\r\n this.ctx.moveTo(startAngle + buffer, this.centerY);\r\n this.ctx.lineTo(endAngle - buffer, this.centerY);\r\n }\r\n else {\r\n this.ctx.arc(this.centerX, this.centerY, this.radius, angle1, angle2);\r\n }\r\n\r\n this.ctx.lineWidth = this.lineWidth;\r\n this.ctx.strokeStyle = color;\r\n this.ctx.lineCap = 'round';\r\n this.ctx.stroke();\r\n }\r\n\r\n //https://dribbble.com/shots/21266211-Dashboard-Elements\r\n private drawIndicator(position: number) {\r\n const angle = Math.PI + (Math.PI * position); // Calculate the angle in radians\r\n let x = this.centerX + this.radius * Math.cos(angle);\r\n let y = this.centerY + this.radius * Math.sin(angle);\r\n\r\n if (this.horizontal) {\r\n const buffer = 0.06;\r\n x = Math.max(0, Math.min(1 - buffer, position)) * this.width;\r\n y = this.centerY;\r\n }\r\n\r\n const circleSize = this.lineWidth * 1.1;\r\n const innerCircleSize = circleSize * 0.6;\r\n\r\n // Draw the outer colored circle\r\n this.ctx.shadowColor = \"black\";\r\n this.ctx.shadowBlur = 3;\r\n this.ctx.beginPath();\r\n this.ctx.arc(x, y, circleSize, 0, 2 * Math.PI); // Outer circle radius\r\n this.ctx.fillStyle = '#FFFFFF'; // Inner circle color\r\n this.ctx.fill();\r\n this.ctx.shadowBlur = 0;\r\n\r\n // Draw the inner white circle\r\n this.ctx.beginPath();\r\n this.ctx.arc(x, y, innerCircleSize, 0, 2 * Math.PI); // Inner circle radius\r\n this.ctx.fillStyle = this.getColour(position); // Outer circle color\r\n this.ctx.fill();\r\n }\r\n\r\n private drawIndicatorDots() {\r\n const radius = this.radius * .85;\r\n\r\n this.ctx.globalAlpha = 0.2;\r\n\r\n const numDots = this.width > 300 ? 15 : 10;\r\n for (let i = 0; i <= numDots; i++) {\r\n const position = i / numDots;\r\n const angle = Math.PI + (Math.PI * position); // Calculate the angle in radians\r\n const x = this.centerX + radius * Math.cos(angle);\r\n const y = this.centerY + radius * Math.sin(angle);\r\n\r\n // Draw the outer colored circle\r\n this.ctx.beginPath();\r\n this.ctx.arc(x, y, 1, 0, 2 * Math.PI); // Outer circle radius\r\n this.ctx.fillStyle = this.getColour(position); // Outer circle color\r\n this.ctx.fillStyle = \"black\";\r\n this.ctx.fill();\r\n }\r\n\r\n this.ctx.globalAlpha = 1;\r\n }\r\n\r\n private createSegments(...values: number[]): ISegment[] {\r\n var segments = [];\r\n let runningValue = 0;\r\n\r\n\r\n values.forEach(v => {\r\n runningValue += v;\r\n segments.push({ color: this.getColour(runningValue), value: v });\r\n });\r\n\r\n return segments;\r\n }\r\n\r\n private getColour(value: number): string {\r\n\r\n if (value > this.score.upperRagBound / 100) {\r\n // green\r\n return \"rgb(92, 167, 147)\";\r\n return '#208840';\r\n }\r\n\r\n if (value <= this.score.lowerRagBound / 100) {\r\n // red\r\n return \"rgba(200, 50, 50, .75)\";\r\n return '#cf4946';\r\n }\r\n\r\n // orange\r\n return \"rgb(236, 170, 56)\";\r\n return 'orange';\r\n }\r\n\r\n private setMessageClass() {\r\n this.messageClass = \"\";\r\n this.messageString = \"Poor\";\r\n\r\n if (this.score.score > this.score.upperRagBound) {\r\n this.messageClass = \"good\";\r\n this.messageString = \"Great\";\r\n }\r\n else if (this.score.score > this.score.lowerRagBound) {\r\n // red\r\n this.messageClass = \"ok\";\r\n this.messageString = \"Average\";\r\n }\r\n }\r\n}\r\n","import { Component, OnInit } from \"@angular/core\";\r\nimport { IProgressBarColourRules } from \"@directives/_misc/v-progress-bar/v-progress-bar.component\";\r\nimport { IAggregateFilterEvent, IFilterBarTab } from \"@directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { DateRange } from \"@enums/DateRange.enum\";\r\nimport { IGeofence } from \"@interfaces/IGeofences\";\r\nimport { IJourney } from \"@interfaces/IJourney\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { IGroup } from \"@interfaces/IVehicleGroup\";\r\nimport { DateService, DateUnit } from \"@services/date.service\";\r\nimport { GeofenceService, IGeofenceVisit } from \"@services/geofence.service\";\r\nimport { GroupService } from \"@services/group.service.ajs\";\r\nimport { JourneyService } from \"@services/journey.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { IVehicleUtilisationRecord, UtilisationService } from \"@services/utilisation.service\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport \"./vehicle-utilisation.component.scss\";\r\n\r\nexport interface ITimeLabel {\r\n label: string;\r\n subLabel: string;\r\n}\r\n\r\nenum UtilisationSource {\r\n Journey,\r\n Depot\r\n}\r\n\r\n@Component({\r\n selector: \"vehicle-utilisation\",\r\n template: require(\"./vehicle-utilisation.component.html\")\r\n})\r\nexport class VehicleUtilisationComponent implements OnInit {\r\n\r\n loading = false;\r\n\r\n defaultDateRange = DateRange.Latest7Days;\r\n colourRules: IProgressBarColourRules = {\r\n GreenZoneStart: 75,\r\n YellowZoneStart: 25\r\n };\r\n\r\n timeLabels: ITimeLabel[] = [];\r\n\r\n filterEvent: IAggregateFilterEvent;\r\n filterTabs: IFilterBarTab[] = [];\r\n\r\n displayVehicles: IVehicleUtilisationRecord[] = [];\r\n allVehicles: IVehicleUtilisationRecord[] = [];\r\n\r\n utilisationSource = UtilisationSource.Journey;\r\n\r\n // ---\r\n\r\n vehicles: IVehicle[];\r\n groups: IGroup[];\r\n\r\n geofences: IGeofence[];\r\n geofenceVisits: IGeofenceVisit[];\r\n journeys: IJourney[];\r\n\r\n constructor(\r\n private readonly groupService: GroupService,\r\n private readonly geofenceService: GeofenceService,\r\n private readonly journeyService: JourneyService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly veriDate: VeriDate,\r\n private readonly utilisationService: UtilisationService,\r\n private readonly translationService: TranslationService,\r\n private readonly dateService: DateService) {\r\n }\r\n\r\n ngOnInit() {\r\n this.createTabs();\r\n }\r\n\r\n filterBySearchText(v: IVehicleUtilisationRecord, text: string): boolean {\r\n if (v.vehicle.ShortReg.toLocaleLowerCase().indexOf(text) >= 0 || v.vehicle.Reg.toLocaleLowerCase().indexOf(text) >= 0) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n onFilterChanged(event: IAggregateFilterEvent) {\r\n\r\n // We sometimes get weird events come through, need to understand why, until then this fixes a bug\r\n if (!event.trigger) {\r\n return;\r\n }\r\n\r\n this.filterEvent = event;\r\n\r\n if (this.filterEvent.trigger == \"date\") {\r\n this.updateTimeLabels();\r\n this.updateData(true);\r\n return;\r\n }\r\n\r\n this.displayVehicles = this.filterEvent.filteredData;\r\n }\r\n\r\n onUtilisationTypeChange(source: UtilisationSource) {\r\n this.utilisationSource = source;\r\n this.updateData(true);\r\n }\r\n\r\n // -------------------\r\n\r\n private updateData(invalidateCache = false) {\r\n this.loading = true;\r\n this.allVehicles = [];\r\n\r\n const baseDataPromise = this.getBaseData();\r\n const utilisationDataPromise = this.utilisationSource == UtilisationSource.Journey\r\n ? this.getJourneyUtilisationData(invalidateCache)\r\n : this.getDepotUtilisationData(invalidateCache);\r\n\r\n var promises: any = [baseDataPromise, utilisationDataPromise];\r\n\r\n Promise.all(promises)\r\n .then(() => {\r\n this.createUtilisationRecords();\r\n })\r\n .finally(() => {\r\n this.loading = false;\r\n });\r\n }\r\n\r\n private getBaseData(): Promise {\r\n const groupsPromise = this.groupService.getGroups().then(groups => { this.groups = groups }) as Promise;\r\n const vehiclesPromise = this.vehicleService.getVehicles({ includePeripheralMappings: true }).then(vehicles => { this.vehicles = vehicles; }) as Promise;\r\n\r\n return Promise.all([groupsPromise, vehiclesPromise]);\r\n }\r\n\r\n private getDepotUtilisationData(invalidateCache: boolean): Promise {\r\n const geofencesPromise = this.geofenceService.getGeofences({ invalidateCache }).then(geofences => { this.geofences = geofences; }) as Promise;\r\n const geofenceVisitsPromise = this.geofenceService\r\n .getGeofenceVisits(this.veriDate.createMoment(this.filterEvent.date[0]), this.veriDate.createMoment(this.filterEvent.date[1]))\r\n .then(geofenceVisits => { this.geofenceVisits = geofenceVisits; }) as Promise;\r\n\r\n return Promise.all([geofencesPromise, geofenceVisitsPromise]);\r\n }\r\n\r\n private getJourneyUtilisationData(invalidateCache: boolean): Promise {\r\n return this.journeyService\r\n .getAllJourneys(this.filterEvent.date[0], this.filterEvent.date[1], false, false, invalidateCache)\r\n .then(journeys => {\r\n this.journeys = journeys;\r\n }) as Promise;\r\n }\r\n\r\n private createUtilisationRecords() {\r\n if (this.utilisationSource == UtilisationSource.Journey) {\r\n this.allVehicles = this.utilisationService.createUtilisationRecordsForJourneys(\r\n this.filterEvent.date[0],\r\n this.filterEvent.date[1],\r\n this.vehicles,\r\n this.journeys);\r\n return;\r\n }\r\n\r\n this.allVehicles = this.utilisationService.createUtilisationRecordsForDepots(\r\n this.filterEvent.date[0],\r\n this.filterEvent.date[1],\r\n this.groups,\r\n this.vehicles,\r\n this.geofenceVisits,\r\n this.geofences);\r\n }\r\n\r\n private updateTimeLabels() {\r\n this.timeLabels = [];\r\n\r\n if (!this.filterEvent?.date) {\r\n return;\r\n }\r\n\r\n const minutesInRange = Math.abs(this.dateService.getDiff(this.filterEvent.date[0], this.filterEvent.date[1], DateUnit.Min));\r\n\r\n const hoursInRange = Math.ceil(minutesInRange / 60);\r\n\r\n let maxLabels = 12;\r\n let hoursPerLabel = hoursInRange / maxLabels;\r\n const dayMode = hoursInRange / 24 > 4;\r\n\r\n // If we span multiple days, then switch to day mode, if not hour mode\r\n if (dayMode) {\r\n while (hoursPerLabel % 24 != 0 && maxLabels > 0) {\r\n maxLabels--;\r\n hoursPerLabel = hoursInRange / maxLabels;\r\n }\r\n }\r\n else {\r\n while (hoursPerLabel % 1 != 0 && maxLabels > 0) {\r\n maxLabels--;\r\n hoursPerLabel = hoursInRange / maxLabels;\r\n }\r\n }\r\n\r\n for (let i = 0; i < maxLabels; i++) {\r\n\r\n const hour = i * hoursPerLabel;\r\n const dateTime = this.dateService.addOrSubtractTime(this.filterEvent.date[0], hour, DateUnit.Hour);\r\n\r\n this.timeLabels.push({\r\n label: this.dateService.formatDate(dateTime, { stringDayOnly: dayMode, timeOnly: !dayMode }),\r\n subLabel: this.dateService.formatDate(dateTime)\r\n });\r\n }\r\n }\r\n\r\n private createTabs(): void {\r\n this.filterTabs = [];\r\n \r\n this.filterTabs.push({ title: this.translationService.t(\"FleetUtilisation.All\"), predicate: (vu) => true });\r\n this.filterTabs.push({ title: this.translationService.t(\"FleetUtilisation.HighUtilisation\"), predicate: (vu: IVehicleUtilisationRecord) => vu.utilisationPercentage >= 75 });\r\n\r\n this.filterTabs.push({ title: this.translationService.t(\"FleetUtilisation.MediumUtilisation\"), predicate: (vu: IVehicleUtilisationRecord) => vu.utilisationPercentage >= 25 && vu.utilisationPercentage <75 });\r\n this.filterTabs.push({ title: this.translationService.t(\"FleetUtilisation.LowUtilisation\"), predicate: (vu: IVehicleUtilisationRecord) => vu.utilisationPercentage < 25 && vu.utilisationPercentage > 0 });\r\n this.filterTabs.push({ title: this.translationService.t(\"FleetUtilisation.Unused\"), predicate: (vu: IVehicleUtilisationRecord) => vu.utilisationPercentage == 0 });\r\n }\r\n}\r\n","import { Component, TemplateRef, ViewChild } from \"@angular/core\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { VTabComponent } from \"@app/directives/_layout/v-tabs/v-tab.component\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { UserService } from \"@app/main/modules/foundation/_services/user.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { take } from \"rxjs/operators\";\r\nimport { NpsGaugeHorizontal } from \"../nps-gauge-horizontal/nps-gauge-horizontal.component\";\r\nimport { ICalculatedNPSScore, INPSAggregatedScore, INPSCalculatedScore, INPSEntry, NPSService } from \"../nps.service\";\r\nimport \"./nps-dashboard.component.scss\";\r\n\r\nexport interface IDonutSlice {\r\n name: string;\r\n count: number;\r\n percentage: number;\r\n remainder: number;\r\n offset: number;\r\n color: string;\r\n}\r\n\r\n@Component({\r\n selector: \"nps-dashboard\",\r\n template: require(\"./nps-dashboard.component.html\")\r\n})\r\nexport class NPSDashboardComponent {\r\n @ViewChild('scoreTemplate') scoreTemplate: TemplateRef;\r\n\r\n ratings: INPSEntry[];\r\n score: ICalculatedNPSScore;\r\n\r\n scoreHistogram: INPSCalculatedScore[] = [];\r\n\r\n resellerScores: INPSAggregatedScore[] = [];\r\n customerScores: INPSAggregatedScore[] = [];\r\n happyCustomers: INPSAggregatedScore[] = [];\r\n unhappyCustomers: INPSAggregatedScore[] = [];\r\n\r\n donutSlices: IDonutSlice[] = [];\r\n\r\n selectedRating: INPSEntry;\r\n selectedUserRecentRatings: INPSEntry[];\r\n selectedUserEmail: string;\r\n\r\n resultsTableColumns: IVTableColumn[];\r\n selectedRatingTableColumns: IVTableColumn[];\r\n resultsTableRows: IVTableRow[];\r\n\r\n summaryTableColumns1: IVTableColumn[];\r\n summaryTableColumns2: IVTableColumn[];\r\n summaryTableColumns3: IVTableColumn[];\r\n resellersSummaryTableRows: IVTableRow[];\r\n happiestSummaryTableRows: IVTableRow[];\r\n unhappySummaryTableRows: IVTableRow[];\r\n selectedRatingTableRows: IVTableRow[];\r\n\r\n hideInternal: boolean = true;\r\n hideCustomers: boolean;\r\n\r\n loading = false;\r\n\r\n constructor(\r\n private readonly npsService: NPSService,\r\n private readonly translationService: TranslationService,\r\n private readonly userService: UserService,\r\n private readonly vTableService: VTableService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.loadData();\r\n this.createTables();\r\n }\r\n\r\n onRatingClick(event: IVTableRow) {\r\n this.selectRating(event.data);\r\n }\r\n\r\n selectRating(rating: INPSEntry) {\r\n\r\n this.selectedRating = rating;\r\n\r\n this.selectedUserRecentRatings = this.ratings.filter(r => r.UserId == rating.UserId);\r\n\r\n this.getSelectedUserEmail();\r\n\r\n this.selectedRatingTableRows = this.vTableService.createTableRows(this.ratings.filter(r => r.UserId == rating.UserId), this.selectedRatingTableColumns);\r\n }\r\n\r\n closeSelectedRating(): void {\r\n this.selectedRating = null;\r\n this.selectedUserEmail = null;\r\n this.selectedRatingTableRows = [];\r\n }\r\n\r\n onTabSelected(tab: VTabComponent): void {\r\n\r\n this.hideCustomers = tab.tabIndex === 1;\r\n this.hideInternal = tab.tabIndex === 0;\r\n\r\n this.loadData();\r\n }\r\n\r\n // ---\r\n\r\n private loadData() {\r\n this.loading = true;\r\n\r\n this.npsService.getRatings({ populateCustomers: true, hideInternal: this.hideInternal, hideCustomers: this.hideCustomers }).then(ratings => {\r\n this.ratings = ratings;\r\n\r\n this.npsService.prepareNPSEntriesForDisplay(ratings);\r\n\r\n this.score = this.npsService.calculateNPSScore(ratings);\r\n this.scoreHistogram = this.npsService.calculateScoreHistogram(ratings);\r\n this.customerScores = this.npsService.calculateAggregatedScoresByCustomer(ratings);\r\n this.resellerScores = this.npsService.calculateAggregatedScoresByReseller(ratings);\r\n\r\n const numCustomers = 2;\r\n this.customerScores.sort((a, b) => b.score.score - a.score.score);\r\n this.happyCustomers = this.customerScores.slice(0, numCustomers);\r\n this.unhappyCustomers = this.customerScores.slice(-numCustomers);\r\n\r\n this.calculateDonut();\r\n this.createTableRows();\r\n\r\n this.loading = false;\r\n });\r\n }\r\n\r\n private calculateDonut() {\r\n this.donutSlices = [];\r\n this.createDonutSlice(this.translationService.t(\"NpsRater.Detractors\"), this.score.detractor.count, this.score.detractor.percentage, this.npsService.getColor(0));\r\n this.createDonutSlice(this.translationService.t(\"NpsRater.Passives\"), this.score.passive.count, this.score.passive.percentage, this.npsService.getColor(7));\r\n this.createDonutSlice(this.translationService.t(\"NpsRater.Promoters\"), this.score.promoter.count, this.score.promoter.percentage, this.npsService.getColor(10));\r\n }\r\n\r\n private createDonutSlice(label: string, count: number, percentage: number, color: string) {\r\n\r\n const initialOffsetPercentage = 50; // was 25\r\n const offset = 100 - this.donutSlices.reduce((a, b) => a + b.percentage, 0) + initialOffsetPercentage;\r\n\r\n // This allows us to make a half circle, 1 is full circle, 0.5 is half\r\n let percentModifier = 0.5;\r\n\r\n this.donutSlices.push({\r\n name: label,\r\n count: count,\r\n percentage: percentage * percentModifier,\r\n remainder: 100 - percentage * percentModifier,\r\n offset: offset,\r\n color: color\r\n });\r\n }\r\n\r\n private getSelectedUserEmail(): void {\r\n if (!this.selectedRating) {\r\n return;\r\n }\r\n\r\n this.userService.getUsers({ Id: +this.selectedRating.UserId }).pipe(take(1)).subscribe(users => {\r\n this.selectedUserEmail = users[0]?.Email;\r\n });\r\n\r\n }\r\n\r\n private createTables(): void {\r\n this.resultsTableColumns = this.createResultsTable(true);\r\n this.selectedRatingTableColumns = this.createResultsTable(false);\r\n }\r\n\r\n private createTableRows(): void {\r\n this.resultsTableRows = this.vTableService.createTableRows(this.ratings, this.resultsTableColumns);\r\n\r\n // Need separate column arrays even though the tables are identical, otherwise sorting a column will sort all 3 tables at once.\r\n this.summaryTableColumns1 = this.createSummaryTable();\r\n this.summaryTableColumns2 = this.createSummaryTable();\r\n this.summaryTableColumns3 = this.createSummaryTable();\r\n\r\n this.resellersSummaryTableRows = this.vTableService.createTableRows(this.resellerScores, this.summaryTableColumns1);\r\n this.happiestSummaryTableRows = this.vTableService.createTableRows(this.happyCustomers, this.summaryTableColumns2);\r\n this.unhappySummaryTableRows = this.vTableService.createTableRows(this.unhappyCustomers,\r\n this.summaryTableColumns3);\r\n }\r\n\r\n private createResultsTable(includeCustomer: boolean): IVTableColumn[] {\r\n let columns = [\r\n {\r\n header: this.vTableService.createDateTableHeader({ sorted: true, sortDirection: SortDirection.Descending }),\r\n createCellFunction: entry => this.vTableService.createDateCell(new Date(entry.DateTime))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'NpsRater.Score', width: 110, sortType: SortType.Number, sortDirection: SortDirection.Descending }),\r\n createCellFunction: entry => {\r\n const data = {\r\n color: entry.color,\r\n Score: entry.Score,\r\n scoreLabel: entry.scoreLabel\r\n }\r\n return this.vTableService.createTableTemplateCell(data, this.scoreTemplate)\r\n }\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'Common.User' }),\r\n createCellFunction: entry => this.vTableService.createTableCell(entry.UserDescription)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'NpsRater.Comments' }),\r\n createCellFunction: entry => this.vTableService.createTableCell(entry.Comments)\r\n }\r\n ]\r\n\r\n if (includeCustomer) {\r\n columns.splice(2, 0, {\r\n header: this.vTableService.createTableHeader({ tKey: 'NpsRater.Customer' }),\r\n createCellFunction: entry => this.vTableService.createTableCell(entry.customer.CompanyName)\r\n })\r\n\r\n\r\n }\r\n\r\n return columns;\r\n }\r\n\r\n private createSummaryTable(): IVTableColumn[] {\r\n return [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'NpsRater.Customer' }),\r\n createCellFunction: aggregatedScore => this.vTableService.createTableCell(aggregatedScore.description)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'NpsRater.Score', width: 80, sortType: SortType.Number, sorted: true, sortDirection: SortDirection.Ascending }),\r\n createCellFunction: aggregatedScore => this.vTableService.createTableCell(aggregatedScore.score.score, { classes: 'text-right' })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'NpsRater.Responses', width: 100 }),\r\n createCellFunction: aggregatedScore => this.vTableService.createTableCell(aggregatedScore.ratings.length, { classes: 'text-right' })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: \"NPS\", width: 100, sortable: false }),\r\n createCellFunction: aggregatedScore => this.vTableService.createTableCell(aggregatedScore.score.score, {\r\n component: NpsGaugeHorizontal,\r\n componentInputs: {\r\n score: aggregatedScore.score\r\n }\r\n })\r\n }\r\n ]\r\n }\r\n\r\n}\r\n","import { Component, Input, OnInit } from \"@angular/core\";\r\nimport { ICalculatedNPSScore } from \"../nps.service\";\r\nimport \"./nps-gauge-horizontal.component.scss\";\r\n\r\n@Component({\r\n selector: \"nps-gauge-horizontal\",\r\n template: require(\"./nps-gauge-horizontal.component.html\")\r\n})\r\nexport class NpsGaugeHorizontal implements OnInit {\r\n @Input() score: ICalculatedNPSScore;\r\n\r\n constructor() { }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n // ---\r\n\r\n}\r\n","import { Component, Input, OnInit } from \"@angular/core\";\r\n\r\nimport { VTableRowStatus } from \"@app/directives/_layout/v-table/_enums/VTableRowStatus.enum\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { FallbackCellType, VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\n\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { IDiagnosticRecord } from \"../../_models/IDiagnosticRecord\";\r\nimport { IVehicleDiagnosticRecords } from \"../../_models/IVehicleDiagnosticRecords\";\r\nimport { FaultCodesService } from \"../../fault-codes.service\";\r\nimport \"./fault-code-vehicle-history.component.scss\";\r\n\r\n@Component({\r\n selector: 'fault-code-vehicle-history',\r\n template: require(\"./fault-code-vehicle-history.component.html\")\r\n})\r\nexport class FaultCodeVehicleHistoryComponent implements OnInit {\r\n tableColumns: IVTableColumn[] = [];\r\n tableRows: IVTableRow[] = [];\r\n\r\n diagnosticRecords: IDiagnosticRecord[] = [];\r\n loading: boolean;\r\n\r\n @Input() vehicleRecords: IVehicleDiagnosticRecords\r\n\r\n constructor(\r\n private readonly vTableService: VTableService,\r\n private readonly faultCodesService: FaultCodesService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.createTableColumns();\r\n this.loadDiagnosticRecords();\r\n }\r\n\r\n private createTableColumns(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createStatusTableHeader({sorted: false}),\r\n createCellFunction: (record) => this.vTableService.createStatusCell(\r\n record.DateCleared ? VTableRowStatus.Success : VTableRowStatus.Warning) \r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"FaultCodes.Code\",\r\n sortType: SortType.String,\r\n sortable: true\r\n }),\r\n createCellFunction: (data) => this.vTableService.createTableCell(data.FriendlyCode)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"FaultCodes.Description\",\r\n sortType: SortType.String,\r\n sortable: true\r\n }),\r\n createCellFunction: (data) => this.vTableService.createTableCell(data.description, {}, FallbackCellType.NA)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({\r\n tKey: \"FaultCodes.Raised\",\r\n sortable: true,\r\n sortDirection: SortDirection.Descending,\r\n sorted: true,\r\n sortType: SortType.Date\r\n }),\r\n createCellFunction: (data) => this.vTableService.createDateCell(data.DateReceived)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({\r\n tKey: \"FaultCodes.Cleared\",\r\n sortable: true,\r\n sortType: SortType.Date\r\n }),\r\n createCellFunction: (data) => this.vTableService.createDateCell(data.DateCleared)\r\n }\r\n ]\r\n }\r\n\r\n private loadDiagnosticRecords(): void {\r\n this.loading = true;\r\n this.faultCodesService.getVehicleDiagnosticRecords(this.vehicleRecords.vehicle.Id)\r\n .then(records => {\r\n this.diagnosticRecords = records;\r\n })\r\n .finally(() => {\r\n this.tableRows = this.vTableService.createTableRows(this.diagnosticRecords, this.tableColumns);\r\n this.loading = false;\r\n });\r\n }\r\n}","import { Component, OnInit } from \"@angular/core\";\r\nimport { VTableRowStatus } from \"@app/directives/_layout/v-table/_enums/VTableRowStatus.enum\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\n\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { IVehicleDiagnosticRecords } from \"../../_models/IVehicleDiagnosticRecords\";\r\nimport { FaultCodesService } from \"../../fault-codes.service\";\r\nimport \"./fault-codes.component.scss\";\r\n\r\n@Component({\r\n selector: 'fault-codes',\r\n template: require(\"./fault-codes.component.html\")\r\n})\r\nexport class FaultCodesComponent implements OnInit {\r\n tableColumns: IVTableColumn[] = [];\r\n tableRows: IVTableRow[] = [];\r\n\r\n diagnosticRecords: IVehicleDiagnosticRecords[] = [];\r\n loading: boolean;\r\n\r\n selectedVehicle: IVehicleDiagnosticRecords;\r\n\r\n constructor(\r\n private readonly vTableService: VTableService,\r\n private readonly faultCodesService: FaultCodesService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.createTableColumns();\r\n this.loadDiagnosticRecords();\r\n }\r\n\r\n vehicleSelected(row: IVTableRow): void {\r\n this.selectedVehicle = row.data;\r\n }\r\n\r\n historyClosed(): void {\r\n this.selectedVehicle = null;\r\n }\r\n\r\n private createTableColumns(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createStatusTableHeader({sorted: false}),\r\n createCellFunction: (record) => this.vTableService.createStatusCell(\r\n record.activeRecords.length == 0 ? VTableRowStatus.Success : VTableRowStatus.Warning)\r\n },\r\n {\r\n header: this.vTableService.createVehicleTableHeader(),\r\n createCellFunction: (data) => this.vTableService.createVehicleRegCell(data.vehicle)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"FaultCodes.ActiveFaultCodes\",\r\n sortType: SortType.String,\r\n }),\r\n createCellFunction: (data) => this.vTableService.createTableCell(this.getFriendlyCodesString(data))\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({\r\n tKey: \"FaultCodes.LastFaultRaised\",\r\n sortable: true,\r\n sortDirection: SortDirection.Descending,\r\n sorted: true,\r\n sortType: SortType.Date\r\n }),\r\n createCellFunction: (data) => this.vTableService.createDateCell(data.lastRecord?.DateReceived)\r\n }\r\n ]\r\n }\r\n\r\n private loadDiagnosticRecords(): void {\r\n this.loading = true;\r\n this.faultCodesService\r\n .getLastAndActiveDiagnosticRecords()\r\n .then(activeRecords => {\r\n this.diagnosticRecords = activeRecords;\r\n })\r\n .finally(() => {\r\n this.tableRows = this.vTableService.createTableRows(this.diagnosticRecords, this.tableColumns);\r\n this.loading = false;\r\n })\r\n }\r\n\r\n private getFriendlyCodesString(records: IVehicleDiagnosticRecords): string {\r\n return records.activeRecords.map(x => x.FriendlyCode).join(\", \");\r\n }\r\n}","import { Component, Input, OnInit } from \"@angular/core\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { FallbackCellType, VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { IAggregateFilterEvent } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { DateRange } from \"@app/enum/DateRange.enum\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { ISensorData } from \"@app/interfaces/ISensorData\";\r\nimport { DateService } from \"@app/services/date.service\";\r\nimport { IVehicleWithSensorDataValues } from \"../../_models/IVehicleWithSensorData\";\r\nimport { SensorDataService } from \"../../sensor-data.service\";\r\nimport \"./sensor-data-history.component.scss\";\r\n\r\n// TODO: this is workaround for filter-bar to work.\r\n// can be removed when https://dev.azure.com/Connexas/Valkyrie/_git/Valkyrie/pullrequest/8849\r\n// is present on master branch\r\ninterface IIdSensorData extends ISensorData {\r\n Id: number;\r\n}\r\n\r\n@Component({\r\n selector: 'sensor-data-history',\r\n template: require(\"./sensor-data-history.component.html\")\r\n})\r\nexport class SensorDataHistoryComponent implements OnInit {\r\n @Input() vehicle: IVehicleWithSensorDataValues\r\n\r\n tableColumns: IVTableColumn[] = [];\r\n tableRows: IVTableRow[] = [];\r\n\r\n defaultDateRange = DateRange.Today;\r\n startDate: Date;\r\n endDate: Date;\r\n\r\n sensorData: IIdSensorData[] = [];\r\n loading: boolean;\r\n\r\n constructor(\r\n private readonly vTableService: VTableService,\r\n private readonly sensorDataService: SensorDataService,\r\n private readonly dateService: DateService\r\n ) { }\r\n\r\n async ngOnInit(): Promise {\r\n this.startDate = this.dateService.dateRangeFromEnum(this.defaultDateRange).start;\r\n this.endDate = this.dateService.dateRangeFromEnum(this.defaultDateRange).end;\r\n\r\n this.createTableColumns();\r\n }\r\n\r\n async onFilterChanged(filterEvent: IAggregateFilterEvent): Promise {\r\n if (filterEvent.trigger == \"date\") {\r\n this.startDate = filterEvent.date[0];\r\n this.endDate = filterEvent.date[1];\r\n\r\n await this.loadSensorData();\r\n }\r\n }\r\n\r\n private createTableColumns(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader({\r\n tKey: \"SensorData.Timestamp\",\r\n sortable: true,\r\n sortDirection: SortDirection.Descending,\r\n sorted: true\r\n }),\r\n createCellFunction: (data) => this.vTableService.createDateCell(data.Utc)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"SensorData.EngineHoursTotal\",\r\n sortType: SortType.Number,\r\n sortable: true\r\n }),\r\n createCellFunction: (data) => this.vTableService.createTableCell(this.getEngineHours(data), {}, FallbackCellType.NA)\r\n }\r\n ]\r\n }\r\n\r\n private createTableRows(): void {\r\n this.tableRows = this.vTableService.createTableRows(this.sensorData, this.tableColumns);\r\n }\r\n\r\n private getEngineHours(data: ISensorData): number {\r\n return data.PrimaryAuxEngineOnDuration ? data.PrimaryAuxEngineOnDuration / 3600 : null;\r\n }\r\n\r\n private async loadSensorData(): Promise {\r\n this.loading = true;\r\n\r\n const result = await this.sensorDataService.getSensorData(this.vehicle.Id, this.startDate, this.endDate);\r\n\r\n this.sensorData = result.map(x => ({ ...x, Id: x.PlotId } as IIdSensorData))\r\n this.createTableRows();\r\n this.loading = false;\r\n }\r\n}\r\n","import { Component, OnInit } from \"@angular/core\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { FallbackCellType, VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { SensorDataValueType } from \"@app/interfaces/ISensorDataValue\";\r\n\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { IVehicleWithSensorDataValues } from \"../../_models/IVehicleWithSensorData\";\r\nimport { SensorDataService } from \"../../sensor-data.service\";\r\nimport \"./sensor-data.component.scss\";\r\n\r\n@Component({\r\n selector: 'sensor-data1',\r\n template: require(\"./sensor-data.component.html\")\r\n})\r\nexport class SensorDataComponent implements OnInit {\r\n tableColumns: IVTableColumn[] = [];\r\n tableRows: IVTableRow[] = [];\r\n\r\n sensorData: IVehicleWithSensorDataValues[] = [];\r\n loading: boolean;\r\n\r\n selectedVehicle: IVehicleWithSensorDataValues;\r\n\r\n constructor(\r\n private readonly vTableService: VTableService,\r\n private readonly sensorDataService: SensorDataService\r\n ) { }\r\n\r\n async ngOnInit(): Promise {\r\n this.createTableColumns();\r\n await this.loadSensorData();\r\n }\r\n\r\n rowSelected(row: IVTableRow): void {\r\n this.selectedVehicle = row.data;\r\n }\r\n\r\n onHistoryClosed(): void {\r\n this.selectedVehicle = null;\r\n }\r\n\r\n private createTableColumns(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createVehicleTableHeader(),\r\n createCellFunction: (data) => this.vTableService.createVehicleRegCell(data)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"SensorData.EngineHoursTotal\",\r\n sortType: SortType.Number,\r\n sorted: true,\r\n sortDirection: SortDirection.Descending\r\n }),\r\n createCellFunction: (data) => this.vTableService.createTableCell(this.getEngineHours(data), {}, FallbackCellType.NA)\r\n },\r\n ]\r\n }\r\n\r\n private createTableRows(): void {\r\n this.tableRows = this.vTableService.createTableRows(this.sensorData, this.tableColumns);\r\n }\r\n\r\n private async loadSensorData(): Promise {\r\n this.loading = true;\r\n this.sensorData = await this.sensorDataService.getLatestVehiclesSensorData();\r\n\r\n this.createTableRows();\r\n this.loading = false;\r\n }\r\n\r\n private getEngineHours(vehicle: IVehicleWithSensorDataValues): number {\r\n const engineHours = vehicle\r\n .latestSensorDataValues\r\n ?.getValue(SensorDataValueType.PrimaryAuxEngineOnDuration);\r\n\r\n return engineHours ? engineHours / 3600 : null;\r\n }\r\n}","import { Component, OnInit } from \"@angular/core\";\r\nimport { VTableRowStatus } from \"@app/directives/_layout/v-table/_enums/VTableRowStatus.enum\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { IAggregateFilterEvent, IFilterBarTab } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { DateService, DateUnit } from \"@app/services/date.service\";\r\nimport { DriverInfringementStatus, IDriverTachoHours, ITachoDay, ITachoModeSummary, TachoService } from \"@app/services/tacho.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport \"./tacho-compliance-page.component.scss\";\r\n\r\n@Component({\r\n selector: \"tacho-compliance\",\r\n template: require(\"./tacho-compliance-page.component.html\")\r\n})\r\nexport class TachoComplianceComponent implements OnInit {\r\n\r\n loading: boolean;\r\n sideBarLoading: boolean;\r\n\r\n currentDriverTachoHours: IDriverTachoHours[] = [];\r\n filterTabs: IFilterBarTab[] = [];\r\n\r\n selectedDriver: IDriverTachoHours;\r\n selectedDriverTachoDays: ITachoDay[];\r\n\r\n modeSummary: ITachoModeSummary[];\r\n\r\n startDate: Date;\r\n endDate: Date;\r\n\r\n updateTimeCutOff: Date;\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n constructor(\r\n private readonly tachoService: TachoService,\r\n private readonly dateService: DateService,\r\n private readonly translationService: TranslationService,\r\n private readonly vTableService: VTableService\r\n ) {\r\n }\r\n\r\n ngOnInit() {\r\n this.createTabs();\r\n this.createTable();\r\n\r\n this.startDate = this.dateService.addOrSubtractTime(new Date(), -7, DateUnit.Day);\r\n this.endDate = this.dateService.addOrSubtractTime(new Date(), -1, DateUnit.Day);\r\n\r\n this.updateTimeCutOff = this.dateService.addOrSubtractTime(new Date(), -1, DateUnit.Day);\r\n\r\n this.updateData(true);\r\n }\r\n\r\n onFilterChanged(filterEvent: IAggregateFilterEvent) {\r\n if (filterEvent.trigger == \"date\") {\r\n this.dateChanged(filterEvent.date);\r\n }\r\n }\r\n\r\n dateChanged(dates: Date[]) {\r\n\r\n this.startDate = dates[0];\r\n this.endDate = dates[1];\r\n\r\n this.loadTachoDataForDriver();\r\n }\r\n\r\n selectDriver(driver: IDriverTachoHours) {\r\n this.selectedDriver = driver;\r\n }\r\n\r\n loadTachoDataForDriver() {\r\n\r\n this.sideBarLoading = true;\r\n this.selectedDriverTachoDays = [];\r\n\r\n this.tachoService\r\n .getTachoDaysForDriver(this.selectedDriver.Driver.Id, this.startDate, this.endDate)\r\n .then(tachoDays => {\r\n this.selectedDriverTachoDays = tachoDays;\r\n\r\n this.modeSummary = this.tachoService.createModeSummaryMins(this.selectedDriverTachoDays);\r\n })\r\n .finally(() => {\r\n this.sideBarLoading = false;\r\n });\r\n }\r\n\r\n // ---\r\n\r\n private updateData(showLoadingIndicator = false): angular.IPromise {\r\n this.loading = showLoadingIndicator;\r\n\r\n return this.tachoService\r\n .getCurrentTachoForAllDrivers(true)\r\n .then((driverTachoHours) => {\r\n this.currentDriverTachoHours = driverTachoHours;\r\n this.tableRows = this.vTableService.createTableRows(this.currentDriverTachoHours, this.tableColumns);\r\n })\r\n .finally(() => {\r\n this.loading = false;\r\n });\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createStatusTableHeader(),\r\n createCellFunction: tacho => this.vTableService.createStatusCell(this.getRowStatus(tacho))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"TachoCompliancePage.DriverName\" }),\r\n createCellFunction: tacho => this.vTableService.createTableCell(tacho.Driver.Name)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"TachoCompliancePage.Warnings\", minTableWidth: 800 }),\r\n createCellFunction: tacho => this.vTableService.createTableCell(tacho.DriverTachoDisplay.statusMessage)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"TachoCompliancePage.ContinuousDrive\", width: 140, sortType: SortType.Number }),\r\n createCellFunction: tacho => this.vTableService.createDurationCell(tacho.ContinuousDrive, DateUnit.Min)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"TachoCompliancePage.BreakRestTaken\", minTableWidth: 700, width: 100, sortType: SortType.Number }),\r\n createCellFunction: tacho => this.vTableService.createDurationCell(tacho.BreakRestTaken, DateUnit.Min)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"TachoCompliancePage.DailyDrive\", minTableWidth: 400, width: 100, sortType: SortType.Number }),\r\n createCellFunction: tacho => this.vTableService.createDurationCell(tacho.DailyDrive, DateUnit.Min)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"TachoCompliancePage.WeeklyDrive\", minTableWidth: 1100, width: 110, sortType: SortType.Number }),\r\n createCellFunction: tacho => this.vTableService.createDurationCell(tacho.WeeklyDrive, DateUnit.Min)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"TachoCompliancePage.Updated\", minTableWidth: 500 }),\r\n createCellFunction: tacho => this.vTableService.createDateCell(tacho.EventTime, { dateTime: true, showErrorIfBeforeDate: this.updateTimeCutOff })\r\n }\r\n ]\r\n }\r\n\r\n private getRowStatus(tacho: IDriverTachoHours): VTableRowStatus {\r\n switch (tacho.DriverTachoDisplay.status) {\r\n case DriverInfringementStatus.Prewarning:\r\n return VTableRowStatus.Warning;\r\n\r\n case DriverInfringementStatus.Warning:\r\n return VTableRowStatus.Error;\r\n\r\n default:\r\n return VTableRowStatus.Info;\r\n }\r\n }\r\n\r\n private createTabs(): void {\r\n this.filterTabs = [];\r\n\r\n this.createTabDefinition(\"All\", (tachoHours) => true);\r\n this.createTabDefinition(\"Alerts\", (tachoHours) => tachoHours.DriverTachoDisplay.status == DriverInfringementStatus.Warning);\r\n this.createTabDefinition(\"Warnings\", (tachoHours) => tachoHours.DriverTachoDisplay.status == DriverInfringementStatus.Prewarning);\r\n }\r\n\r\n private createTabDefinition(translationString: string, callback: (tachoHours: IDriverTachoHours) => boolean): void {\r\n this.filterTabs.push({ title:/* this.translationService.t(translationString)*/translationString, predicate: callback });\r\n }\r\n}\r\n","import { Component, OnInit } from \"@angular/core\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport \"./vehicles.component.scss\";\r\n\r\n@Component({\r\n selector: \"vehicles-page\",\r\n template: require(\"./vehicles.component.html\")\r\n})\r\nexport class VehiclesPageRouteComponent implements OnInit {\r\n\r\n loading = false;\r\n vehicles: IVehicle[] = [];\r\n selectedVehicle: IVehicle;\r\n\r\n constructor(private readonly vehicleService: VehicleService) {\r\n\r\n }\r\n\r\n ngOnInit() {\r\n this.getData();\r\n }\r\n\r\n onRowClicked($event: IVTableRow) {\r\n this.selectedVehicle = $event.data;\r\n console.log(this.selectedVehicle);\r\n }\r\n\r\n // ---\r\n\r\n maxTempColumns = 0;\r\n\r\n private getData() {\r\n this.loading = true;\r\n\r\n this.vehicleService.getVehicles({ includeLatestPlots: true, includeLatestTemp: true, includePeripheralMappings: true })\r\n .then(vehicles => {\r\n this.vehicles = vehicles;\r\n\r\n const vehiclesWithTemp = this.vehicles.filter(v => v.Temperatures?.length != 0);\r\n vehiclesWithTemp.forEach(v => {\r\n this.maxTempColumns = Math.max(this.maxTempColumns, v.Temperatures.length);\r\n });\r\n\r\n })\r\n .finally(() => {\r\n this.loading = false;\r\n });\r\n }\r\n}\r\n","import { Component } from \"@angular/core\";\r\nimport { DomSanitizer, SafeResourceUrl } from \"@angular/platform-browser\";\r\nimport { UserPlatform } from \"@interfaces/IUser\";\r\nimport { AccountService } from \"@services/account.service\";\r\nimport { CurrentUserService } from \"@services/currentUser.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport \"./contact-page.component.scss\";\r\n\r\n@Component({\r\n selector: \"contact-page\",\r\n template: require(\"./contact-page.component.html\")\r\n})\r\nexport class ContactPageComponent {\r\n supportEmail = \"support.smarttransport.uk@addsecure.com\";\r\n\r\n foundationKbAddress: SafeResourceUrl;\r\n\r\n constructor(\r\n private readonly currentUserService: CurrentUserService,\r\n private readonly accountService: AccountService,\r\n private readonly domSanitizer: DomSanitizer,\r\n private readonly translationService: TranslationService) {\r\n if (this.currentUserService.cachedUser.platform == UserPlatform.Foundation) {\r\n this.foundationKbAddress = this.domSanitizer.bypassSecurityTrustResourceUrl(\"https://docs.verilocation.com/api-documentation/\");\r\n }\r\n\r\n\r\n this.foundationKbAddress = this.domSanitizer.bypassSecurityTrustResourceUrl(\"https://docs.verilocation.com/api-documentation/\");\r\n this.foundationKbAddress = this.domSanitizer.bypassSecurityTrustResourceUrl(\"https://github.com/GitbookIO/gitbook\");\r\n }\r\n\r\n emailSupport() {\r\n var companyName = this.accountService.getAccountDataFromCache().CompanyName;\r\n let subject = this.translationService.t('ContactPage.SupportEmailSubject', companyName);\r\n window.open(`mailto:${this.supportEmail}?subject=${subject}`);\r\n }\r\n\r\n callSupport() {\r\n window.open(`tel:+443301112636`);\r\n }\r\n\r\n callSales() {\r\n window.open(`tel:+443301112636`);\r\n }\r\n\r\n viewAPIDocs() {\r\n window.open(`https://docs.verilocation.com/api-documentation/`);\r\n }\r\n\r\n viewReleaseNotes() {\r\n window.open(`https://docs.verilocation.com/release-notes/`);\r\n }\r\n}\r\n","import { Component, Input} from \"@angular/core\";\r\nimport \"./delivery-profile-edit.component.scss\";\r\nimport { IGeofence } from \"@app/interfaces/IGeofences\";\r\n\r\n@Component({\r\n selector: \"delivery-profile-edit\",\r\n template: require(\"./delivery-profile-edit.component.html\")\r\n})\r\nexport class DeliveryProfileEditComponent {\r\n @Input() geofence: IGeofence;\r\n}","import { Component, Input } from \"@angular/core\";\r\nimport { IGeofence } from \"@app/interfaces/IGeofences\";\r\nimport './delivery-profile-view.component.scss';\r\n\r\n@Component({\r\n selector: \"delivery-profile-view\",\r\n template: require(\"./delivery-profile-view.component.html\")\r\n})\r\nexport class DeliveryProfileViewComponent {\r\n @Input() geofence: IGeofence;\r\n}\r\n","import { ITimeSpan } from \"@interfaces/ITimeSpan\";\r\nimport { ColourService } from \"@services/colour.service\";\r\nimport { MapService } from \"@services/map.service\";\r\nimport * as angular from \"angular\";\r\nimport * as moment from \"moment\";\r\nimport { IPlannedRouteVisit } from \"../../modules/tms/_models/IPlannedRouteVisit\";\r\nimport { ITMSJob } from \"./interfaces/ITMSJob\";\r\n\r\nexport enum RouteEditingDisabledReason {\r\n Editable,\r\n Start,\r\n Status\r\n}\r\n\r\nexport enum PlannedRouteStatus {\r\n Planned,\r\n Started,\r\n Completed,\r\n CompletedWithMissing,\r\n Cancelled,\r\n Expired,\r\n Incomplete\r\n}\r\n\r\nexport enum RouteVisitStatus {\r\n Planned,\r\n Next,\r\n Arrived,\r\n Departed,\r\n Missed\r\n}\r\n\r\nexport interface IOptimiserRequest {\r\n\r\n maxDistanceKmPerVehicle: number;\r\n maxDistanceKmSlack: number;\r\n\r\n numVehicles: number;\r\n maxWorkingTimeHours: number;\r\n maxDrivingTimeHours: number;\r\n onSiteTimeMins: number;\r\n breakRequired: number;\r\n\r\n depotIndex: number;\r\n locations: IUnplannedLocation[];\r\n}\r\n\r\nexport interface IOptimiserResponse {\r\n OptimisedVehicleRoutes: IOptimisedVehicleRoute[];\r\n\r\n DroppedLocations: IUnplannedLocation[];\r\n\r\n stats?: IOptimiserResponseStats;\r\n\r\n originalMapLink: string;\r\n optimisedMapLink: string;\r\n}\r\n\r\nexport interface IOptimiserResponseStats {\r\n originalDistance: number;\r\n optimisedDistance: number;\r\n\r\n distancePercentage: number;\r\n distanceSavingPercentage: number;\r\n\r\n originalDurationMinutes: number;\r\n optimisedDurationMinutes: number;\r\n\r\n durationPercentage: number;\r\n durationSavingPercentage: number;\r\n}\r\n\r\nexport interface IOptimisedVehicleBreak {\r\n DurationSeconds: number;\r\n Name: string;\r\n StartSecond: number;\r\n}\r\n\r\nexport interface IOptimisedRouteTimelineEntry {\r\n title: string;\r\n arrivalTime: moment.Moment;\r\n departureTime: moment.Moment;\r\n\r\n travelDistance: number;\r\n travelTime: number;\r\n\r\n activityDuration: number;\r\n\r\n cumulativeDistance: number;\r\n cumulativeDuration: number;\r\n\r\n icon?: string;\r\n isBreak?: boolean;\r\n}\r\n\r\nexport interface IOptimisedVehicleRoute {\r\n\r\n VehicleId: number;\r\n OptimisedLocations: IOptimisedLocation[];\r\n Breaks: IOptimisedVehicleBreak[];\r\n\r\n timeline: IOptimisedRouteTimelineEntry[];\r\n\r\n visitCount: number;\r\n\r\n TotalDistance: number;\r\n TotalDistanceKm: number;\r\n\r\n TravelTime: ITimeSpan;\r\n WorkingTime: ITimeSpan;\r\n\r\n // ---\r\n\r\n colour: string;\r\n}\r\n\r\nexport interface IOptimisedLocation/* extends IOptimiserLocation*/ {\r\n DistanceToStop: number;\r\n TravelTimeSeconds: number;\r\n\r\n OriginalLocation: IUnplannedLocation;\r\n}\r\n\r\nexport interface IUnplannedVisit extends IUnplannedLocation {\r\n jobs: ITMSJob[];\r\n}\r\n\r\nexport interface IUnplannedLocation {\r\n Id: number;\r\n Title: string;\r\n Latitude: number;\r\n Longitude: number;\r\n OnSiteTimeMins: number;\r\n}\r\nexport interface IUnplannedJobLocation { }\r\n\r\nexport class OptimiserService {\r\n\r\n static $inject = [\"$http\", \"$q\", \"colourService\", \"mapService\"];\r\n\r\n constructor(\r\n private readonly $http: angular.IHttpService,\r\n private readonly $q: angular.IQService,\r\n private readonly colourService: ColourService,\r\n private readonly mapService: MapService) {\r\n }\r\n\r\n createUnplannedLocationsFromJobs(jobs: ITMSJob[], onSiteTimeMins: number = 5): IUnplannedLocation[] {\r\n const locations: IUnplannedLocation[] = [];\r\n\r\n jobs.forEach(job => {\r\n const location: IUnplannedLocation = {\r\n Id: job.Id,\r\n Latitude: job.geofence.Latitude,\r\n Longitude: job.geofence.Longitude,\r\n Title: job.geofence.Addr1,\r\n OnSiteTimeMins: onSiteTimeMins//,30 // owens test\r\n };\r\n\r\n if (job.geofence.Addr2) {\r\n if (location.Title.trim() != \"\") {\r\n location.Title += \", \";\r\n }\r\n\r\n location.Title += job.geofence.Addr2\r\n }\r\n\r\n locations.push(location);\r\n });\r\n\r\n return locations;\r\n }\r\n\r\n createUnplannedLocationsFromVisits(visits: IPlannedRouteVisit[]): IUnplannedLocation[] {\r\n\r\n const locations: IUnplannedLocation[] = [];\r\n\r\n visits.forEach(v => {\r\n\r\n if (!v.RouteStopLocation) {\r\n return;\r\n }\r\n\r\n const location: IUnplannedLocation = {\r\n Id: v.Id,\r\n Latitude: v.RouteStopLocation.Latitude,\r\n Longitude: v.RouteStopLocation.Longitude,\r\n Title: v.Name,\r\n OnSiteTimeMins: v.onSiteTimeMins//,30 // owens test\r\n };\r\n\r\n locations.push(location);\r\n });\r\n\r\n return locations;\r\n }\r\n\r\n createDefaultOptimiserRequest(): IOptimiserRequest {\r\n var optimiserRequest: IOptimiserRequest = {\r\n locations: [],\r\n maxDistanceKmPerVehicle: 1000,\r\n maxDistanceKmSlack: 5,\r\n numVehicles: 50,\r\n maxWorkingTimeHours: 13,\r\n maxDrivingTimeHours: 9,\r\n depotIndex: 0,\r\n onSiteTimeMins: 5,\r\n breakRequired: 45\r\n };\r\n\r\n return optimiserRequest;\r\n }\r\n\r\n createGoogleMapsLink(locations: IUnplannedLocation[]): string {\r\n //https://www.google.com/maps/dir/?api=1&origin=nn40tz&waypoints=nn54ap&destination=nn47bf\r\n\r\n console.log(\"create maps link\", locations.length, locations)\r\n\r\n var url = \"https://www.google.com/maps/dir/?api=1\";\r\n url += `&origin=${locations[0].Title}`;\r\n //url += `&destination=${locations[locations.length - 1].title}`;\r\n\r\n url += \"&waypoints=\";\r\n locations.forEach(loc => { url += `${loc.Title}|`; });\r\n\r\n // Return to depot\r\n url += `&destination=${locations[0].Title}`;\r\n\r\n return url;\r\n }\r\n\r\n createOptimiserRequestFromJobs(depot: IUnplannedLocation, jobs: ITMSJob[]): IOptimiserRequest {\r\n var optimiseRequest = this.createDefaultOptimiserRequest();\r\n\r\n optimiseRequest.locations = this.createUnplannedLocationsFromJobs(jobs);\r\n\r\n // Ensure depot is first index, and we filter out returns to depot keeping our search space small\r\n //var depot = optimiseRequest.locations.find(l => l.title.indexOf(\"NN17 5XZ\") >= 0);\r\n //if (!depot) {\r\n // depot = optimiseRequest.locations[0]\r\n //};\r\n\r\n //optimiseRequest.locations = optimiseRequest.locations.filter(l => l != depot && l.title.indexOf(\"NN17 5XZ\") < 0);\r\n this.setDepot(depot, optimiseRequest);\r\n\r\n return optimiseRequest;\r\n }\r\n\r\n setDepot(depot: IUnplannedLocation, optimiserRequest: IOptimiserRequest) {\r\n if (depot) {\r\n optimiserRequest.locations.unshift(depot);\r\n optimiserRequest.depotIndex = 0;\r\n }\r\n }\r\n\r\n //createOptimiserRequestFromTMSVisits(stops: IUnplannedVisit[]): IOptimiserRequest { }\r\n\r\n calculateOptimiserStats(optimiseRequest: IOptimiserRequest, optimiserResponse: IOptimiserResponse) {\r\n console.log(\"// -----------------\")\r\n console.log(\"// CalculateOptimiserStats\")\r\n console.log(\"// -----------------\")\r\n\r\n console.log();\r\n\r\n // Calculate (in current form) total distance\r\n var totalDistance = 0;\r\n var previousLocation = optimiseRequest.locations[0];\r\n\r\n optimiseRequest.locations.forEach((location, index) => {\r\n if (index == 0) {\r\n return;\r\n }\r\n\r\n totalDistance += this.mapService.getDistance(previousLocation.Latitude, previousLocation.Longitude, location.Latitude, location.Longitude);\r\n previousLocation = location;\r\n });\r\n\r\n const totalTime = totalDistance / 64;\r\n\r\n console.log(\"// Original distance:\", `${totalDistance}Km`);\r\n console.log(\"// Original time (64kph / 40mph):\", `${totalTime}hours`); // 40 /** 1.60934*/\r\n\r\n console.log();\r\n\r\n var newDistance = optimiserResponse.OptimisedVehicleRoutes.reduce((total, ovr) => total + ovr.TotalDistanceKm, 0);\r\n var newTime = optimiserResponse.OptimisedVehicleRoutes.reduce((total, ovr) => total + ovr.TravelTime.totalHours, 0);\r\n\r\n console.log(\"// New distance:\", `${newDistance}Km`);\r\n console.log(\"// New time (64kph / 40mph):\", `${newTime}hours`); // 40 /** 1.60934*/\r\n\r\n const distancePercentage = newDistance / totalDistance * 100;\r\n const distanceSavingPercentage = 100 - distancePercentage;\r\n\r\n const durationPercentage = newTime / totalTime * 100;\r\n const durationSavingPercentage = 100 - durationPercentage;\r\n\r\n optimiserResponse.stats = {\r\n originalDistance: totalDistance,\r\n optimisedDistance: newDistance,\r\n\r\n distancePercentage: distancePercentage,\r\n distanceSavingPercentage: distanceSavingPercentage,\r\n\r\n originalDurationMinutes: totalTime * 60,\r\n optimisedDurationMinutes: newTime * 60,\r\n\r\n durationPercentage: durationPercentage,\r\n durationSavingPercentage: durationSavingPercentage\r\n };\r\n }\r\n\r\n optimise(optimiseRequest: IOptimiserRequest): angular.IPromise {\r\n return this\r\n .$http({\r\n url: \"/api/optimiser\",\r\n method: \"POST\",\r\n data: optimiseRequest\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n\r\n response.data.OptimisedVehicleRoutes.forEach((ovr, i) => {\r\n ovr.colour = this.colourService.getVigetColor(i, response.data.OptimisedVehicleRoutes.length);\r\n ovr.VehicleId = i + 1;\r\n ovr.visitCount = ovr.OptimisedLocations.length - 2 - ovr.Breaks.length;\r\n\r\n this.createRouteTimeline(ovr);\r\n });\r\n\r\n this.calculateOptimiserStats(optimiseRequest, response.data);\r\n\r\n response.data.originalMapLink = this.createGoogleMapsLink(optimiseRequest.locations);\r\n response.data.optimisedMapLink = this.createGoogleMapsLink(response.data.OptimisedVehicleRoutes[0].OptimisedLocations.map(l => l.OriginalLocation));\r\n\r\n //console.log(\"response.data.originalMapLink\", response.data.originalMapLink);\r\n //console.log(\"response.data.optimisedMapLink\", response.data.optimisedMapLink);\r\n\r\n return response.data;\r\n });\r\n }\r\n\r\n // ---\r\n\r\n private createRouteTimeline(ovr: IOptimisedVehicleRoute) {\r\n\r\n // Create timeline\r\n var shiftStartTime = moment().hour(8).minute(0).second(0);\r\n ovr.timeline = [];\r\n var previousTimelineEntry: IOptimisedRouteTimelineEntry = null;\r\n var takenBreak = false;\r\n\r\n ovr.OptimisedLocations.forEach(location => {\r\n if (!takenBreak && previousTimelineEntry && previousTimelineEntry.cumulativeDuration + location.TravelTimeSeconds > ovr.Breaks[0].StartSecond) {\r\n const breakEntry = this.createRouteTimelineEntry(\r\n previousTimelineEntry,\r\n ovr.Breaks[0].Name,\r\n 0,\r\n 0,\r\n ovr.Breaks[0].DurationSeconds,\r\n shiftStartTime);\r\n\r\n breakEntry.arrivalTime = shiftStartTime.clone().add(ovr.Breaks[0].StartSecond, \"s\");\r\n breakEntry.departureTime = breakEntry.arrivalTime.clone().add(ovr.Breaks[0].DurationSeconds, \"s\");\r\n breakEntry.isBreak = true;\r\n\r\n ovr.timeline.push(breakEntry);\r\n previousTimelineEntry = breakEntry;\r\n\r\n takenBreak = true;\r\n }\r\n\r\n const timelineEntry = this.createRouteTimelineEntry(\r\n previousTimelineEntry,\r\n location.OriginalLocation.Title,\r\n location.DistanceToStop,\r\n location.TravelTimeSeconds,\r\n location.OriginalLocation.OnSiteTimeMins * 60,\r\n shiftStartTime);\r\n\r\n ovr.timeline.push(timelineEntry);\r\n previousTimelineEntry = timelineEntry;\r\n });\r\n }\r\n\r\n private createRouteTimelineEntry(previousEntry: IOptimisedRouteTimelineEntry, name: string, distance: number, travelTime: number, activityTime: number, shiftStartTime: moment.Moment): IOptimisedRouteTimelineEntry {\r\n var entry: IOptimisedRouteTimelineEntry = {\r\n travelDistance: distance,\r\n activityDuration: activityTime,\r\n travelTime: travelTime,\r\n cumulativeDistance: 0,\r\n cumulativeDuration: 0,\r\n arrivalTime: shiftStartTime,\r\n departureTime: shiftStartTime,\r\n title: name\r\n };\r\n\r\n if (previousEntry) {\r\n entry.cumulativeDuration += previousEntry.cumulativeDuration + travelTime;\r\n entry.cumulativeDistance += previousEntry.cumulativeDistance + distance;\r\n\r\n entry.arrivalTime = shiftStartTime.clone().add(entry.cumulativeDuration, \"s\");\r\n }\r\n\r\n entry.cumulativeDuration += + activityTime;\r\n entry.departureTime = entry.arrivalTime.clone().add(entry.activityDuration, \"s\");\r\n\r\n return entry\r\n }\r\n}\r\n","import { Component, Input, OnInit } from \"@angular/core\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { UnitConversionService, UnitConversionType } from \"@services/unitConversion.service\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport './pva-bar-chart.component.scss';\r\n\r\nenum IPvaBarChartType {\r\n Planned,\r\n Actual\r\n}\r\n\r\ninterface IPvaBarChartObject {\r\n type: IPvaBarChartType;\r\n value: number;\r\n percentageHeight: number;\r\n tooltipLabel: string;\r\n}\r\n\r\n@Component({\r\n selector: 'pva-bar-chart',\r\n template: require('./pva-bar-chart.component.html')\r\n})\r\nexport class PvaBarChartComponent implements OnInit {\r\n @Input() plannedFigure: number;\r\n @Input() actualFigure: number;\r\n @Input() distance: boolean;\r\n @Input() duration: boolean;\r\n\r\n bars: IPvaBarChartObject[];\r\n differenceLabel: string;\r\n differenceLabelClass: string;\r\n distanceUnit: string;\r\n\r\n chartLabel: string;\r\n show = false;\r\n\r\n constructor(\r\n private readonly translationService: TranslationService,\r\n private readonly unitConversionService: UnitConversionService,\r\n private readonly veriDate: VeriDate) {\r\n\r\n }\r\n\r\n ngOnInit(): void {\r\n if (!this.isValidInput()) {\r\n console.error(\"Input missing or invalid\");\r\n this.show = false;\r\n return;\r\n } else {\r\n this.show = true;\r\n }\r\n if (this.distance) {\r\n this.distanceUnit = this.unitConversionService.getConversionLabel(UnitConversionType.Distance);\r\n }\r\n this.createBars();\r\n this.setChartLabels();\r\n this.defineHeights();\r\n }\r\n\r\n private isValidInput(): boolean {\r\n if (isNaN(this.plannedFigure) || isNaN(this.actualFigure) || !this.plannedFigure || !this.actualFigure) {\r\n return false;\r\n }\r\n else {\r\n return true;\r\n }\r\n }\r\n\r\n private createBars() {\r\n this.bars = [];\r\n this.bars = [\r\n {\r\n type: IPvaBarChartType.Planned,\r\n value: this.plannedFigure,\r\n percentageHeight: 100,\r\n tooltipLabel: this.getTooltipLabel(this.plannedFigure)\r\n },\r\n {\r\n type: IPvaBarChartType.Actual,\r\n value: this.actualFigure,\r\n percentageHeight: 100,\r\n tooltipLabel: this.getTooltipLabel(this.actualFigure)\r\n }\r\n ];\r\n if (this.distance) {\r\n this.bars.forEach(bar => {\r\n bar.value = this.getConvertedDistance(bar.value);\r\n })\r\n }\r\n }\r\n\r\n private setChartLabels() {\r\n let difference = this.actualFigure - this.plannedFigure;\r\n if (isNaN(difference)) {\r\n return;\r\n }\r\n const prefix = difference > 0 ? '+' : '';\r\n if (this.distance) {\r\n difference = this.unitConversionService.convert(difference, UnitConversionType.Distance, 1);\r\n this.differenceLabel = `${prefix}${difference} ${this.distanceUnit}`;\r\n this.chartLabel = this.translationService.t('Tms.Distance');\r\n }\r\n if (this.duration) {\r\n this.differenceLabel = `${prefix}${this.veriDate.minutesToDurationString(difference)}`;\r\n this.chartLabel = this.translationService.t('Tms.Duration');\r\n }\r\n if (this.actualFigure < this.plannedFigure) {\r\n this.differenceLabelClass = 'color-ontime';\r\n }\r\n else if (this.actualFigure > this.plannedFigure) {\r\n this.differenceLabelClass = 'color-missed';\r\n }\r\n }\r\n\r\n private getConvertedDistance(value) {\r\n let valueToConvert = value.toString();\r\n return this.unitConversionService.convert(valueToConvert, UnitConversionType.Distance, 1);\r\n }\r\n\r\n private getTooltipLabel(value: number): string {\r\n if (!value || isNaN(value)) {\r\n return;\r\n }\r\n if (this.distance) {\r\n let distance = this.getConvertedDistance(value);\r\n return `${distance} ${this.distanceUnit}`;\r\n }\r\n if (this.duration) {\r\n return this.veriDate.minutesToDurationString(value);\r\n }\r\n }\r\n\r\n private defineHeights() {\r\n if (this.bars[0].value > this.bars[1].value) {\r\n this.bars[0].percentageHeight = 100;\r\n this.bars[1].percentageHeight = this.bars[1].value / this.bars[0].value * 100;\r\n }\r\n else if (this.bars[1].value > this.bars[0].value) {\r\n this.bars[1].percentageHeight = 100;\r\n this.bars[0].percentageHeight = this.bars[0].value / this.bars[1].value * 100;\r\n }\r\n else if (this.bars[1].value === this.bars[0].value) {\r\n this.bars[1].percentageHeight = 100;\r\n this.bars[0].percentageHeight = 100;\r\n }\r\n }\r\n\r\n}\r\n","import { Component } from \"@angular/core\";\r\nimport './pva-chart-legend.component.scss';\r\n\r\n@Component({\r\n selector: 'pva-chart-legend',\r\n template: require('./pva-chart-legend.component.html')\r\n})\r\nexport class PvaChartLegend {\r\n\r\n}\r\n","\r\nimport { IPlot } from \"@interfaces/IPlot\";\r\nimport { RouteStatus } from \"@tms/_enums/RouteStatus\";\r\nimport { TrackingMode } from \"@tms/_enums/TrackingMode\";\r\nimport { UserAccessType } from \"@tms/_enums/UserAccessType\";\r\nimport { IPlannedRouteNote } from \"./IPlannedRouteNote\";\r\nimport { IPlannedRouteVisit } from \"./IPlannedRouteVisit\";\r\nimport { ITmsRouteRules } from \"./ITmsRouteRules\";\r\n\r\nexport enum VisitType {\r\n Planned,\r\n Unplanned\r\n}\r\n\r\nexport interface IPlannedRoute {\r\n Id: number;\r\n AccountId: number;\r\n RouteTemplateId?: number;\r\n Name: string;\r\n VehicleId?: number;\r\n DriverId?: number;\r\n CreationDateTime?: Date;\r\n LastUpdateDateTime?: Date;\r\n CreatedBy?: UserAccessType;\r\n ExternalReference: string;\r\n ActualStartTime?: Date;\r\n StartPlotId?: number;\r\n StartPlot: IPlot;\r\n ActualEndTime?: Date;\r\n EndPlotId?: number;\r\n EndPlot: IPlot;\r\n PlannedStartTime: Date;\r\n PlannedEndTime?: Date;\r\n Status: RouteStatus;\r\n TrackingMode: TrackingMode;\r\n PlannedVisits: IPlannedRouteVisit[];\r\n PlannedRouteNotes: IPlannedRouteNote[];\r\n TmsRouteRulesJson: string;\r\n TmsRouteRules: ITmsRouteRules;\r\n}\r\n\r\nexport interface IImportedPlannedRoute {\r\n Value?: IPlannedRoute;\r\n Error?: string;\r\n IsError: boolean;\r\n}\r\n","import { AfterViewInit, Component, ElementRef, HostBinding, Input, OnChanges } from \"@angular/core\";\r\nimport { DelayedHoverService } from \"@app/directives/_misc/delayed-hover.service\";\r\n\r\nimport { RouteVisitStatus } from \"@tms/_enums/RouteVisitStatus\";\r\nimport { ActiveRoutesService, IRouteDetailDisplay, IRouteDetailVisitDisplay } from \"@tms/_services/active-routes.service\";\r\nimport \"./active-route-visit.component.scss\";\r\n\r\n@Component({\r\n selector: \"active-route-visit\",\r\n template: require(\"./active-route-visit.component.html\"),\r\n providers: [DelayedHoverService]\r\n})\r\nexport class ActiveRouteVisitComponent implements OnChanges, AfterViewInit {\r\n\r\n @Input() visit: IRouteDetailVisitDisplay;\r\n @Input() plannedRoute: IRouteDetailDisplay;\r\n\r\n // ---\r\n\r\n @HostBinding(\"class\") class: string;\r\n\r\n // ---\r\n\r\n visitIndex = 0;\r\n first = false;\r\n last = false;\r\n\r\n showPopup = false;\r\n visitIcon: string;\r\n minWidth = 40;\r\n\r\n statusString = \"\";\r\n\r\n constructor(\r\n private readonly elementRef: ElementRef,\r\n private readonly activeRoutesService: ActiveRoutesService,\r\n private readonly delayedHoverService: DelayedHoverService) {\r\n }\r\n\r\n ngOnChanges() {\r\n this.visitIndex = this.plannedRoute.displayPlannedVisits.indexOf(this.visit);\r\n this.first = this.visitIndex == 0;\r\n this.last = this.visitIndex == this.plannedRoute.displayPlannedVisits.length - 1;\r\n\r\n this.class = this.activeRoutesService.getVisitClass(this.visit);\r\n\r\n this.updateDisplayLabelWidth();\r\n this.updateVisitIcon();\r\n\r\n this.statusString = RouteVisitStatus[this.visit.Status];\r\n }\r\n\r\n ngAfterViewInit() {\r\n\r\n this.delayedHoverService.createMouseEnterDelay(\r\n this.elementRef.nativeElement,\r\n show => {\r\n this.showPopup = show;\r\n },\r\n 150);\r\n }\r\n\r\n // ---\r\n\r\n private updateDisplayLabelWidth() {\r\n this.minWidth = Math.max(30, this.visit.pixelsToNextStop + this.visit.pixelWidth - 20);\r\n\r\n if (this.last) {\r\n this.minWidth = 200;\r\n }\r\n }\r\n\r\n private updateVisitIcon() {\r\n this.visitIcon = \"\";\r\n\r\n if (this.first) {\r\n this.visitIcon = \"schedule\";\r\n }\r\n\r\n if (this.last) {\r\n this.visitIcon = \"flag\";\r\n }\r\n\r\n switch (this.visit.Status) {\r\n case RouteVisitStatus.Arrived:\r\n case RouteVisitStatus.Departed:\r\n this.visitIcon = \"done\";\r\n break;\r\n\r\n case RouteVisitStatus.Missed:\r\n case RouteVisitStatus.Cancelled:\r\n this.visitIcon = \"clear\";\r\n break;\r\n }\r\n }\r\n}\r\n","import { CdkVirtualScrollViewport } from \"@angular/cdk/scrolling\";\r\nimport { AfterViewInit, Component, ElementRef, HostListener, OnDestroy, OnInit, ViewChild } from \"@angular/core\";\r\nimport { IAggregateFilterEvent, IFilterBarTab } from \"@directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { AccountFeatures } from \"@enums/account/AccountFeature\";\r\nimport { AccountFeatureService, FeatureAccessType } from \"@services/accountFeature.service\";\r\nimport { NavigationService } from \"@services/navigation.service\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport { RouteStatus } from \"@tms/_enums/RouteStatus\";\r\nimport { RouteVisitStatus } from \"@tms/_enums/RouteVisitStatus\";\r\nimport { showStateTrigger, visibleStateTrigger } from \"@tms/_routes/activeRoutes/active-routes.animations\";\r\nimport { ActiveRoutesService, IRouteDetailDisplay, IRouteDetailVisitDisplay } from \"@tms/_services/active-routes.service\";\r\nimport { PlannedRouteService } from \"@tms/_services/planned-route.service\";\r\nimport * as moment from \"moment\";\r\nimport \"./active-routes.component.scss\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\n\r\n@Component({\r\n selector: 'active-routes',\r\n template: require('./active-routes.component.html'),\r\n animations: [visibleStateTrigger, showStateTrigger]\r\n})\r\nexport class ActiveRoutesComponent implements OnInit, OnDestroy, AfterViewInit {\r\n @ViewChild(\"viewport\") viewport: CdkVirtualScrollViewport;\r\n @ViewChild(\"nowIndicator\") nowIndicator: ElementRef;\r\n\r\n @ViewChild('calendarTitle') calendarTitle: ElementRef;\r\n @ViewChild('calendar') calendarContainer: ElementRef;\r\n\r\n // ---\r\n\r\n calendarContainerWidth: number;\r\n\r\n filterTabs: IFilterBarTab[] = [];\r\n\r\n activeRoutes: IRouteDetailDisplay[] = [];\r\n filteredRoutes: IRouteDetailDisplay[] = [];\r\n displayRoutes: IRouteDetailDisplay[] = [];\r\n\r\n showAsTimeline: boolean;\r\n\r\n selectedRoute: IRouteDetailDisplay;\r\n\r\n updateInterval: ReturnType;\r\n\r\n hoursToDisplay: {\r\n label: string,\r\n time: moment.Moment,\r\n }[] = [];\r\n\r\n screenWidth = 1200;\r\n leftNavBuffer = 250;\r\n pixelsPerHour = 200;\r\n currentTimePosition = 0;\r\n loading = false;\r\n\r\n panLeftClickPressed = false;\r\n panLeftClickInitialX = 0;\r\n panLeftDistanceTravelledX = 0;\r\n panLeftOriginalOffsetX = 0;\r\n panLeftOffsetX = 0;\r\n\r\n swimlaneHeight = 70;\r\n scrollOffsetY = 0;\r\n scrollContainerHeight = 0;\r\n\r\n calendarPanPosition = 0;\r\n showSyncButtonRight = false;\r\n showSyncButtonLeft = false;\r\n\r\n middleScreenTime: moment.Moment;\r\n\r\n rowHeight: number = 70;\r\n\r\n canManageTMS: boolean;\r\n\r\n constructor(\r\n private readonly accountFeatureService: AccountFeatureService,\r\n private readonly activeRoutesService: ActiveRoutesService,\r\n private readonly navigationService: NavigationService,\r\n private readonly plannedRouteService: PlannedRouteService,\r\n private readonly veriDate: VeriDate,\r\n private readonly translationService: TranslationService,\r\n ) {\r\n this.createTabs();\r\n this.onResize();\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.calendarContainerWidth = this.calendarContainer.nativeElement.clientWidth;\r\n this.calendarTitle.nativeElement.addEventListener('mousewheel', this.toggleZoom.bind(this))\r\n }\r\n\r\n ngOnInit(): void {\r\n\r\n this.canManageTMS = this.accountFeatureService.currentUserHasFeatureAccess(AccountFeatures.TMS, FeatureAccessType.Manage);\r\n\r\n this.pixelsPerHour = 250;\r\n\r\n this.showAsTimeline = true;\r\n this.middleScreenTime = this.veriDate.createMoment(new Date());\r\n\r\n this.setTimeHeaders();\r\n\r\n if (this.showAsTimeline) {\r\n this.updateCurrentTimeMarker();\r\n }\r\n\r\n this.updateData(true, true);\r\n\r\n this.updateInterval = setInterval(() => {\r\n this.updateCurrentTimeMarker();\r\n\r\n this.updateData(false, true);\r\n }, 30_000);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.updateInterval) {\r\n clearInterval(this.updateInterval);\r\n }\r\n }\r\n\r\n onChildrenRendered(): void {\r\n this.viewport.checkViewportSize();\r\n }\r\n\r\n toggleZoom($event: MouseWheelEvent) {\r\n // Zoom hours on mouse wheel\r\n\r\n if ($event.deltaY < 0) {\r\n this.zoomOut();\r\n }\r\n if ($event.deltaY > 0) {\r\n this.zoomIn();\r\n }\r\n return false;\r\n }\r\n\r\n @HostListener('window:resize', ['$event'])\r\n onResize(event?) {\r\n this.screenWidth = window.innerWidth;\r\n }\r\n\r\n goToScheduling(): void {\r\n this.navigationService.go(\"app.tms.scheduling\");\r\n }\r\n\r\n zoomOut() {\r\n this.pixelsPerHour -= 50;\r\n this.setMinMaxZoom();\r\n\r\n this.updateCurrentTimeMarker();\r\n this.setPositionsOnStops(false);\r\n }\r\n\r\n zoomIn() {\r\n this.pixelsPerHour += 50;\r\n this.setMinMaxZoom();\r\n\r\n this.updateCurrentTimeMarker();\r\n this.setPositionsOnStops(false);\r\n }\r\n\r\n panLeftMouseDown($event: MouseEvent) {\r\n this.panLeftClickPressed = true;\r\n this.panLeftClickInitialX = $event.clientX;\r\n $event.preventDefault();\r\n }\r\n\r\n panLeftMouseMove($event: MouseEvent) {\r\n if (!this.panLeftClickPressed || this.calendarPanLimitsReached($event)) {\r\n\r\n return;\r\n }\r\n\r\n this.panLeftDistanceTravelledX = $event.clientX - this.panLeftClickInitialX;\r\n this.panLeftOffsetX = Math.round(this.panLeftOriginalOffsetX + this.panLeftDistanceTravelledX);\r\n\r\n this.updateRouteVisitVisibility();\r\n this.updateCalendarPanPosition();\r\n }\r\n\r\n panLeftMouseUp($event: MouseEvent) {\r\n if (this.panLeftClickPressed) {\r\n $event.preventDefault();\r\n }\r\n\r\n this.onMouseUp();\r\n }\r\n\r\n onMouseUp() {\r\n this.panLeftClickPressed = false;\r\n this.panLeftOriginalOffsetX = this.panLeftOffsetX;\r\n }\r\n\r\n calendarPanLimitsReached($event: MouseEvent): boolean {\r\n // Prevent scrolling past beginning/end of timeline\r\n if (this.calendarPanPosition > 0 && $event.clientX > this.panLeftClickInitialX) {\r\n return true;\r\n }\r\n\r\n const fullWidth = this.hoursToDisplay.length * this.pixelsPerHour * -1;\r\n const maxScrollRight = fullWidth + this.calendarContainerWidth;\r\n\r\n if (this.calendarPanPosition < maxScrollRight && $event.clientX < this.panLeftClickInitialX) {\r\n return true;\r\n }\r\n\r\n if (!this.showAsTimeline && $event.clientX < this.panLeftClickInitialX) {\r\n const longestRouteLength = Math.max(...this.displayRoutes.map(route => route.PlannedVisits.length));\r\n const pixelWidth = this.displayRoutes[0].displayPlannedVisits[0].pixelWidth;\r\n const maxScrollRightListView = longestRouteLength * pixelWidth + 70;\r\n\r\n if (Math.abs(this.calendarPanPosition) > maxScrollRightListView) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n syncScreen(offset = 0) {\r\n this.panLeftClickInitialX = 0;\r\n this.panLeftDistanceTravelledX = 0;\r\n this.panLeftOriginalOffsetX = offset;\r\n\r\n // The timeout gives us a nice animation\r\n setTimeout(() => {\r\n this.panLeftOffsetX = offset;\r\n\r\n this.updateCalendarPanPosition();\r\n this.updateRouteVisitVisibility();\r\n\r\n }, 50);\r\n }\r\n\r\n showRouteDetails(route: IRouteDetailDisplay) {\r\n\r\n // Prevent accidental clicks whilst panning\r\n if (this.panLeftOriginalOffsetX != this.panLeftOffsetX) {\r\n return;\r\n }\r\n\r\n this.plannedRouteService.openRouteDetailsDialog(route);\r\n }\r\n\r\n onFilterBarChange(event: IAggregateFilterEvent) {\r\n\r\n // We sometimes get weird events come through, need to understand why, until then this fixes a bug\r\n // This is LIKELY because of the default (change) subscription?\r\n if (!event.trigger) {\r\n return;\r\n }\r\n\r\n this.displayRoutes = event.filteredData;\r\n this.setPositionsOnStops();\r\n }\r\n\r\n filterRoutesBySearchText = (r: IRouteDetailDisplay, text: string) => {\r\n return this.activeRoutesService.filterRouteByTextPredicate(r, text);\r\n }\r\n\r\n bringRouteIntoView(plannedRoute: IRouteDetailDisplay) {\r\n\r\n this.onMouseUp();\r\n let startTime = this.veriDate.createMoment(plannedRoute.PlannedStartTime);\r\n const plannedStartTimePixelPosition = this.getChartPixelPosition(startTime);\r\n\r\n this.syncScreen(this.currentTimePosition - plannedStartTimePixelPosition + 50);\r\n }\r\n\r\n toggleTimelineView() {\r\n this.showAsTimeline = !this.showAsTimeline;\r\n\r\n if (!this.showAsTimeline) {\r\n\r\n this.panLeftClickInitialX = 0;\r\n this.panLeftOffsetX = 0;\r\n this.calendarPanPosition = 0;\r\n this.panLeftDistanceTravelledX = 0;\r\n this.currentTimePosition = 0;\r\n }\r\n else {\r\n this.updateCurrentTimeMarker();\r\n }\r\n\r\n this.setPositionsOnStops();\r\n }\r\n\r\n scheduleARouteClicked(): void {\r\n this.navigationService.go(\"app.tms.scheduling.new\");\r\n }\r\n\r\n trackByVisit(index: number, visit: IRouteDetailVisitDisplay): number {\r\n return visit.Id;\r\n }\r\n\r\n trackByPlannedRoute(index: number, route: IRouteDetailDisplay): number {\r\n return route.Id;\r\n }\r\n\r\n // ---\r\n\r\n private setTimeHeaders() {\r\n const now = this.veriDate.createMoment(new Date());\r\n\r\n now.startOf(\"d\").add(-1, \"d\");\r\n for (let i = 0; i < 24 * 2.5; i++) {\r\n now.add(1, \"h\");\r\n\r\n this.hoursToDisplay.push({\r\n label: now.format(\"HH:mm\"),\r\n time: now.clone()\r\n });\r\n }\r\n }\r\n\r\n private updateTimeHeaders() {\r\n // Add extra headers if current routes start/end outside of current header times\r\n if (!this.activeRoutes || this.activeRoutes.length == 0) {\r\n return;\r\n }\r\n\r\n const orderedRoutes = [...this.activeRoutes].sort((a, b) => {\r\n return new Date(a.PlannedStartTime) < new Date(b.PlannedStartTime) ? -1 : 1;\r\n });\r\n\r\n const earliestRouteStart = this.veriDate.createMoment(orderedRoutes[0].PlannedStartTime);\r\n const latestRouteEnd = this.veriDate.createMoment(orderedRoutes[orderedRoutes.length - 1].PlannedEndTime);\r\n\r\n if (this.veriDate.date1IsBeforeDate2(earliestRouteStart.toDate(), this.hoursToDisplay[0].time.toDate())) {\r\n const originalStart = this.hoursToDisplay[0].time;\r\n const hoursToAdd = Math.round(this.veriDate.getDiff(earliestRouteStart, originalStart) / 1000 / 60 / 60 + 3);\r\n\r\n for (let i = hoursToAdd; i >= 0; i--) {\r\n originalStart.add(-1, \"h\");\r\n this.hoursToDisplay.unshift({\r\n label: originalStart.format(\"HH:mm\"),\r\n time: originalStart.clone()\r\n });\r\n }\r\n }\r\n else if (this.veriDate.date1IsBeforeDate2(this.hoursToDisplay[0].time.toDate(), latestRouteEnd.toDate())) {\r\n const originalEnd = this.hoursToDisplay[this.hoursToDisplay.length - 1].time;\r\n const hoursToAdd = Math.round(this.veriDate.getDiff(latestRouteEnd, originalEnd) / 1000 / 60 / 60 + 3);\r\n\r\n for (let i = hoursToAdd; i >= 0; i--) {\r\n originalEnd.add(1, \"h\");\r\n this.hoursToDisplay.push({\r\n label: originalEnd.format(\"HH:mm\"),\r\n time: originalEnd.clone()\r\n });\r\n }\r\n }\r\n }\r\n\r\n private setMinMaxZoom() {\r\n this.pixelsPerHour = Math.min(this.screenWidth / 4, this.pixelsPerHour);\r\n this.pixelsPerHour = Math.max(150, this.pixelsPerHour);\r\n }\r\n\r\n private updateData(first = false, invalidateCache = false) {\r\n\r\n if (first) {\r\n this.loading = true;\r\n }\r\n\r\n const totalTimeWindowToGet = 12;\r\n\r\n var startTimeWindow = this.veriDate.createMoment(new Date()).add(-totalTimeWindowToGet / 2, \"h\");\r\n var endTimeWindow = this.veriDate.createMoment(new Date()).add(totalTimeWindowToGet / 2, \"h\");\r\n\r\n return this.plannedRouteService\r\n .getPlannedRoutes(startTimeWindow, endTimeWindow, { mapDrivers: true, mapVehicles: true, mapGeofences: true, invalidateCache: invalidateCache })\r\n .then(routes => {\r\n this.activeRoutes = routes as IRouteDetailDisplay[];\r\n this.activeRoutes.forEach(route => {\r\n route.displayPlannedVisits = this.activeRoutesService.createDisplayPlannedVisitsOnRoute(route);\r\n this.activeRoutesService.updateRouteVisits(route);\r\n });\r\n\r\n // Sort them by start time\r\n this.activeRoutes.sort((a, b) => this.veriDate.createMoment(a.PlannedStartTime).diff(b.PlannedStartTime));\r\n\r\n if (first) {\r\n // Find out how wide they may be and adjust initial pixelsPerHour accordingly\r\n let totalMins = 0;\r\n let totalStopCount = 0;\r\n\r\n this.activeRoutes.forEach(route => {\r\n route.displayPlannedVisits.forEach(visit => {\r\n let diff = this.veriDate.createMoment(visit.PlannedDepartureTime).diff(visit.PlannedArrivalTime, \"m\");\r\n totalMins += diff;\r\n totalStopCount++;\r\n });\r\n });\r\n\r\n this.updateTimeHeaders();\r\n\r\n if (totalStopCount > 0) {\r\n const averageMinsPerStop = totalMins / totalStopCount;\r\n const averageHoursPerStop = averageMinsPerStop / 60;\r\n\r\n const idealPixelsPerStop = 100;\r\n this.pixelsPerHour = idealPixelsPerStop / averageHoursPerStop;\r\n\r\n this.setMinMaxZoom();\r\n\r\n this.updateCurrentTimeMarker();\r\n }\r\n }\r\n })\r\n .finally(() => {\r\n this.loading = false;\r\n });\r\n }\r\n\r\n private getChartPixelPosition(time: moment.Moment) {\r\n const pixelsPerTimelineMinute = this.pixelsPerHour / 60;\r\n\r\n const firstTime = this.hoursToDisplay[0].time;\r\n const minsFromStartUntilNow = time.diff(firstTime, \"m\");\r\n\r\n return minsFromStartUntilNow * pixelsPerTimelineMinute;\r\n }\r\n\r\n private getChartTimeFromPixel(pixelPosition: number) {\r\n const pixelsPerTimelineMinute = this.pixelsPerHour / 60;\r\n\r\n const minsFromStartUntilNow = pixelPosition / pixelsPerTimelineMinute;\r\n const firstTime = this.hoursToDisplay[0].time;\r\n\r\n return firstTime.clone().add(-minsFromStartUntilNow, \"m\");\r\n }\r\n\r\n private updateCurrentTimeMarker() {\r\n if (!this.showAsTimeline) {\r\n return;\r\n }\r\n\r\n this.currentTimePosition = this.getChartPixelPosition(this.veriDate.createMoment(new Date())) - this.pixelsPerHour;\r\n this.updateCalendarPanPosition();\r\n }\r\n\r\n private setPositionsOnStops(updateVisibility = true) {\r\n\r\n if (!this.displayRoutes) {\r\n return;\r\n }\r\n\r\n const currentTime = this.veriDate.createMoment(new Date());\r\n\r\n this.displayRoutes.forEach((route, i) => {\r\n let previousStop = null;\r\n\r\n route.startTimeWindowPosition = this.getChartPixelPosition(this.veriDate.createMoment(route.PlannedStartTime).add(-1, \"h\"));\r\n route.endTimeWindowPosition = this.getChartPixelPosition(this.veriDate.createMoment(route.PlannedEndTime).add(1, \"h\"));\r\n\r\n route.displayPlannedVisits.forEach((visit, si) => {\r\n\r\n visit.startPixelPosition = Math.round(this.getChartPixelPosition(this.veriDate.createMoment(visit.PlannedArrivalTime)));\r\n visit.endPixelPosition = Math.round(this.getChartPixelPosition(this.veriDate.createMoment(visit.PlannedDepartureTime)));\r\n visit.pixelWidth = Math.round(visit.endPixelPosition - visit.startPixelPosition);\r\n\r\n visit.classSize = \"\";\r\n\r\n if (visit.pixelWidth < 120) {\r\n visit.classSize = \"pip\";\r\n }\r\n else if (visit.pixelWidth < 160) {\r\n visit.classSize = \"medium\";\r\n }\r\n\r\n visit.pixelsToNextStop = 0;\r\n\r\n if (previousStop) {\r\n previousStop.pixelsToNextStop = visit.startPixelPosition - previousStop.endPixelPosition;\r\n\r\n this.calculatePixelsTravelled(route, previousStop, visit, currentTime);\r\n }\r\n\r\n if (!this.showAsTimeline) {\r\n // Overwrite these values for non calendar\r\n const pixelMargin = 10;\r\n visit.pixelWidth = 170;\r\n visit.startPixelPosition = (si * (visit.pixelWidth + pixelMargin)) + pixelMargin;\r\n visit.endPixelPosition = visit.startPixelPosition + visit.pixelWidth;\r\n visit.classSize = \"\";\r\n }\r\n\r\n previousStop = visit;\r\n });\r\n });\r\n\r\n if (updateVisibility) {\r\n this.updateRouteVisitVisibility();\r\n }\r\n }\r\n\r\n private calculatePixelsTravelled(route: IRouteDetailDisplay, visit: IRouteDetailVisitDisplay, nextStop: IRouteDetailVisitDisplay, currentTime: moment.Moment) {\r\n\r\n if (visit.Status == RouteVisitStatus.Arrived || visit.Status == RouteVisitStatus.Departed) {\r\n // Ensure we are not missed, else we dont know if we went there or not?!\r\n if (nextStop.Status != RouteVisitStatus.Missed) {\r\n visit.actualPixelsTravelled = visit.pixelsToNextStop;\r\n\r\n // Add 5 so we dont see our nubbin\r\n visit.actualPixelsTravelled += 3;\r\n }\r\n }\r\n else if (route.currentVisit === visit && route.nextVisit && route.currentVisit !== route.nextVisit) {\r\n\r\n const currentTravelSecs = currentTime.diff(visit.PlannedDepartureTime, \"s\");\r\n\r\n const pixelsPerSecond = this.pixelsPerHour / 60 / 60;\r\n visit.actualPixelsTravelled = currentTravelSecs * pixelsPerSecond;\r\n }\r\n else {\r\n visit.actualPixelsTravelled = 0;\r\n }\r\n }\r\n\r\n private updateRouteVisitVisibility() {\r\n if (!this.displayRoutes) {\r\n return;\r\n }\r\n\r\n const screenBuffer = this.screenWidth - this.leftNavBuffer - 250; // 250 is the width of the user bar\r\n\r\n this.displayRoutes.forEach((route, i) => {\r\n route.hasVisibleVisits = false;\r\n\r\n route.displayPlannedVisits.forEach((visit, si) => {\r\n let insideLeftBounds = this.calendarPanPosition + visit.pixelsToNextStop > visit.endPixelPosition * -1;\r\n let insideRightBounds = this.calendarPanPosition - screenBuffer < visit.startPixelPosition * -1;\r\n visit.isVisible = insideLeftBounds && insideRightBounds;\r\n\r\n route.hasVisibleVisits = route.hasVisibleVisits || visit.isVisible;\r\n\r\n visit.isLeftOfScreen = !insideLeftBounds && insideRightBounds;\r\n });\r\n });\r\n }\r\n\r\n private updateCalendarPanPosition() {\r\n if (this.showAsTimeline) {\r\n this.calendarPanPosition = Math.round((this.currentTimePosition * -1) + this.panLeftOffsetX);\r\n const middleScreenPosition = this.calendarPanPosition + this.leftNavBuffer - (this.screenWidth / 2);\r\n this.middleScreenTime = this.getChartTimeFromPixel(middleScreenPosition);\r\n }\r\n else {\r\n this.calendarPanPosition = this.panLeftOffsetX;\r\n }\r\n\r\n const halfScreenWidth = this.screenWidth / 2;\r\n\r\n this.showSyncButtonLeft = false;\r\n this.showSyncButtonRight = false;\r\n\r\n if (Math.abs(this.calendarPanPosition) - this.currentTimePosition > halfScreenWidth - this.leftNavBuffer) {\r\n this.showSyncButtonLeft = true;\r\n }\r\n else if (Math.abs(this.currentTimePosition) - Math.abs(this.calendarPanPosition) > this.screenWidth / 2) {\r\n this.showSyncButtonRight = true;\r\n }\r\n }\r\n\r\n private createTabs(): void {\r\n this.filterTabs = [];\r\n \r\n this.filterTabs.push({ title: this.translationService.t(\"Common.All\"), predicate: () => true });\r\n this.filterTabs.push({ title: this.translationService.t(\"Tms.InProgress\"), predicate: x => x.Status == RouteStatus.Started });\r\n this.filterTabs.push({ title: this.translationService.t(\"Tms.Completed\"), predicate: x => x.Status == RouteStatus.Completed || x.Status == RouteStatus.Incomplete || x.Status == RouteStatus.CompletedWithMissing });\r\n this.filterTabs.push({ title: this.translationService.t(\"Tms.Incomplete\"), predicate: x => x.Status == RouteStatus.Incomplete || x.Status == RouteStatus.CompletedWithMissing });\r\n this.filterTabs.push({ title: this.translationService.t(\"Tms.Planned\"), predicate: x => x.Status == RouteStatus.Planned });\r\n this.filterTabs.push({ title: this.translationService.t(\"Tms.Expired\"), predicate: x => x.Status == RouteStatus.Expired || x.Status == RouteStatus.UserExpired });\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output } from \"@angular/core\";\r\nimport { FormControl, FormGroup, Validators } from \"@angular/forms\";\r\nimport { IPlannedRouteNote } from \"@tms/_models/IPlannedRouteNote\";\r\nimport \"./notes.component.scss\";\r\n\r\n\r\n@Component({\r\n selector: 'history-notes',\r\n template: require(\"./notes.component.html\")\r\n})\r\nexport class HistoryNotesComponent implements OnInit, OnChanges {\r\n @Input() notes: IPlannedRouteNote[];\r\n @Output() newNoteAdded = new EventEmitter();\r\n\r\n notesForm: FormGroup;\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n this.initForm();\r\n }\r\n\r\n ngOnChanges(): void {\r\n }\r\n\r\n initForm(): void {\r\n this.notesForm = new FormGroup({\r\n 'noteTextToAdd': new FormControl('', Validators.required)\r\n })\r\n }\r\n\r\n addNote() {\r\n const newNote: IPlannedRouteNote = {\r\n Note: this.notesForm.get('noteTextToAdd').value\r\n }\r\n if (this.newNoteAdded) {\r\n this.newNoteAdded.emit(newNote);\r\n }\r\n\r\n this.notesForm.reset();\r\n }\r\n}\r\n","import { ChangeDetectorRef, Component, OnDestroy, OnInit } from \"@angular/core\";\r\nimport { IPlannedRouteDetail, PlannedRouteService, selectMany } from \"@tms/_services/planned-route.service\";\r\nimport { VisitOnTimeStatus } from \"../../_enums/VisitOnTimeStatus\";\r\nimport \"./route-performance.component.scss\";\r\nimport { lastValueFrom, Subscription } from \"rxjs\";\r\nimport { PlannedRouteService2 } from \"../../_services/planned-route.service2\";\r\nimport { IPlannedRouteOptions } from \"../../_models/IPlannedRouteOptions\";\r\nimport { IRoutePerformance } from \"../../_models/IRoutePerformance\";\r\nimport { DateRange } from \"@app/enum/DateRange.enum\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { RoutePerformanceBarComponent } from \"../../_components/route-performance-bar/route-performance-bar.component\";\r\nimport { IAggregateFilterEvent } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\n\r\n@Component({\r\n selector: \"route-performance\",\r\n template: require(\"./route-performance.component.html\")\r\n})\r\nexport class RoutePerformanceComponent implements OnInit, OnDestroy {\r\n\r\n defaultDateRange = DateRange.Last7Days;\r\n filterEvent: IAggregateFilterEvent;\r\n\r\n routes: IPlannedRouteDetail[] = [];\r\n\r\n routePerformance: IRoutePerformance[] = [];\r\n selectedRow: IRoutePerformance;\r\n plannedRoutesSubscription: Subscription;\r\n loading = false;\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n selectedRouteTableColumns: IVTableColumn[];\r\n selectedRouteTableRows: IVTableRow[];\r\n\r\n constructor(\r\n private readonly plannedRouteService: PlannedRouteService,\r\n private readonly plannedRouteService2: PlannedRouteService2,\r\n private readonly vTableService: VTableService,\r\n private readonly cd: ChangeDetectorRef) {\r\n }\r\n\r\n ngOnInit() {\r\n this.loadData();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.plannedRoutesSubscription?.unsubscribe();\r\n }\r\n\r\n rowClick($event: IVTableRow) {\r\n this.selectedRow = $event.data;\r\n this.selectedRouteTableRows = this.vTableService.createTableRows(this.selectedRow.routes, this.selectedRouteTableColumns);\r\n this.cd.detectChanges();\r\n }\r\n\r\n onRouteRowClicked($event: IVTableRow) {\r\n this.plannedRouteService.openRouteDetailsDialog($event.data, 'app.tms.routeperformance');\r\n }\r\n\r\n onFilterChanged(event: IAggregateFilterEvent) {\r\n if (!event.trigger) {\r\n return;\r\n }\r\n\r\n this.filterEvent = event;\r\n\r\n if (event.trigger === \"date\") {\r\n this.requestData(true);\r\n }\r\n }\r\n\r\n // ---\r\n private async requestData(invalidateCache = false): Promise {\r\n this.loading = true;\r\n\r\n const options: IPlannedRouteOptions = {\r\n invalidateCache: invalidateCache,\r\n formatPlannedVisitsForDisplay: true,\r\n startedRoutesOnly: true\r\n };\r\n\r\n await lastValueFrom(this.plannedRouteService2.requestPlannedRoutes(this.filterEvent.date[0], this.filterEvent.date[1], options));\r\n }\r\n\r\n private loadData(): void {\r\n this.createTable();\r\n this.createSelectedRowTable();\r\n\r\n this.plannedRoutesSubscription = this.plannedRouteService2.plannedRoutesSubject.subscribe((routes) => {\r\n this.routes = routes;\r\n this.processRoutes();\r\n this.createTableRows();\r\n this.loading = false;\r\n });\r\n }\r\n\r\n private processRoutes() {\r\n this.routePerformance = [];\r\n\r\n this.routes.forEach((r, index) => {\r\n\r\n let match = this.getOrCreateExistingRoutePerformance(r, index);\r\n\r\n if (!match) {\r\n return;\r\n }\r\n \r\n let routeVisits = selectMany(match.routes, r => r.PlannedVisits);\r\n match.arrivalEarlyCount = routeVisits.filter(v => this.plannedRouteService.getArrivalVisitOnTimeStatus(v) == VisitOnTimeStatus.Early).length;\r\n match.arrivalOnTimeCount = routeVisits.filter(v => this.plannedRouteService.getArrivalVisitOnTimeStatus(v) == VisitOnTimeStatus.OnTime).length;\r\n match.arrivalLateCount = routeVisits.filter(v => this.plannedRouteService.getArrivalVisitOnTimeStatus(v) == VisitOnTimeStatus.Late).length;\r\n match.arrivalMissedCount = routeVisits.filter(v => this.plannedRouteService.getArrivalVisitOnTimeStatus(v) == VisitOnTimeStatus.Missed).length;\r\n });\r\n }\r\n\r\n private getOrCreateExistingRoutePerformance(r: IPlannedRouteDetail, index: number): IRoutePerformance {\r\n\r\n // Ignore routes with no name\r\n if (!r.Name) {\r\n return null;\r\n }\r\n\r\n let match = this.routePerformance.find(rp => rp.routes.length && this.routesEquivalent(rp.routes[0], r));\r\n\r\n if (!match) {\r\n match = {\r\n Id: index,\r\n name: r.Name,\r\n arrivalEarlyCount: 0,\r\n arrivalEarlyMins: 0,\r\n arrivalLateCount: 0,\r\n arrivalLateMins: 0,\r\n arrivalMissedCount: 0,\r\n arrivalOnTimeCount: 0,\r\n arrivalOnTimeMins: 0,\r\n performanceRating: 0,\r\n routes: []\r\n };\r\n\r\n this.routePerformance.push(match);\r\n }\r\n\r\n match.routes.push(r);\r\n return match;\r\n }\r\n\r\n private routesEquivalent(r1: IPlannedRouteDetail, r2: IPlannedRouteDetail): boolean {\r\n if (r1.PlannedVisits.length != r2.PlannedVisits.length) {\r\n return false;\r\n }\r\n\r\n for (var i = 0; i < r1.PlannedVisits.length; i++) {\r\n const r1visit = r1.PlannedVisits[i];\r\n const r2visit = r2.PlannedVisits[i];\r\n\r\n if (r1visit.Name != r2visit.Name) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"RoutePerformance.RouteName\" }),\r\n createCellFunction: rp => this.vTableService.createTableCell(rp.name)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"RoutePerformance.Routes\", sortType: SortType.Number, width: 100, sorted: true }),\r\n createCellFunction: rp => this.vTableService.createTableCell(rp.routes.length)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"RoutePerformance.Early\", sortType: SortType.Number, width: 100 }),\r\n createCellFunction: rp => this.vTableService.createTableCell(rp.arrivalEarlyCount)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"RoutePerformance.OnTime\", sortType: SortType.Number, width: 100 }),\r\n createCellFunction: rp => this.vTableService.createTableCell(rp.arrivalOnTimeCount)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"RoutePerformance.Late\", sortType: SortType.Number, width: 100 }),\r\n createCellFunction: rp => this.vTableService.createTableCell(rp.arrivalLateCount)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"RoutePerformance.Missed\", sortType: SortType.Number, width: 100 }),\r\n createCellFunction: rp => this.vTableService.createTableCell(rp.arrivalMissedCount)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"RoutePerformance.ArrivalPerformance\", sortable: false, excludeFromExport: true }),\r\n createCellFunction: rp => this.vTableService.createTableCell(rp, {\r\n component: RoutePerformanceBarComponent,\r\n componentInputs: {\r\n routes: rp.routes\r\n }\r\n })\r\n }\r\n ]\r\n }\r\n\r\n private createTableRows(): void {\r\n this.tableRows = this.vTableService.createTableRows(this.routePerformance, this.tableColumns);\r\n }\r\n\r\n private createSelectedRowTable(): void {\r\n this.selectedRouteTableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"RoutePerformance.RouteName\" }),\r\n createCellFunction: route => this.vTableService.createTableCell(route.Name)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"RoutePerformance.StartTime\", sorted: true }),\r\n createCellFunction: route => this.vTableService.createDateCell(route.PlannedStartTime)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"RoutePerformance.ArrivalPerformance\", sortable: false, excludeFromExport: true }),\r\n createCellFunction: route => this.vTableService.createTableCell(route, {\r\n component: RoutePerformanceBarComponent,\r\n componentInputs: {\r\n route: route\r\n }\r\n })\r\n }\r\n ]\r\n }\r\n\r\n}\r\n","import { HttpClient, HttpErrorResponse, HttpEventType, HttpResponse } from \"@angular/common/http\";\r\nimport { AfterViewInit, Component, ElementRef, OnDestroy, OnInit, ViewChild } from \"@angular/core\";\r\nimport { VTableRowStatus } from \"@app/directives/_layout/v-table/_enums/VTableRowStatus.enum\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { DriverNameComponent } from \"@app/directives/_misc/driver-name/driver-name.component\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { IPlannedRouteVisit } from \"@app/main/modules/tms/_models/IPlannedRouteVisit\";\r\nimport { FileUploadComponent, IFileUploadDetails } from \"@directives/_forms/fileUpload/fileUpload.component\";\r\nimport { IDriver } from \"@interfaces/IDriver\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { ColourService } from \"@services/colour.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport { IPlannedRoute } from \"@tms/_models/IPlannedRoute\";\r\nimport { PlannedRouteService } from \"@tms/_services/planned-route.service\";\r\nimport { Subscription } from \"rxjs\";\r\nimport { filter, take } from \"rxjs/operators\";\r\nimport \"./schedule-import.component.scss\";\r\n\r\nfunction selectMany(input: TIn[], selectListFn: (t: TIn) => TOut[]): TOut[] {\r\n return input.reduce((out, inx) => {\r\n out.push(...selectListFn(inx));\r\n return out;\r\n }, new Array());\r\n}\r\n\r\nexport interface ITMSImportError {\r\n ErrorType: TMSImportErrorType;\r\n ErrorLevel: TMSErrorLevel;\r\n Message: string;\r\n ColumnName: string;\r\n\r\n ColumnIndex: number;\r\n RowIndex: number;\r\n // --\r\n\r\n rowStatus: VTableRowStatus;\r\n errorLevelString: string;\r\n errorTypeString: string;\r\n}\r\nexport enum TMSImportErrorType {\r\n ColumnHeaderMapping,\r\n ColumnHeaderValidation,\r\n DuplicateColumnHeaderMapping,\r\n DataParsing,\r\n DataValidation,\r\n DataCorrection,\r\n MultipleDriverMatches,\r\n DriverNotFound,\r\n VehicleRegNotFound,\r\n Information\r\n}\r\n\r\nexport interface ITMSCsvHeader { }\r\n\r\nexport interface ITMSFileRecord {\r\n RouteNumber: number;\r\n VisitNumber: number;\r\n\r\n Driver: string;\r\n Address: string;\r\n Postcode: string;\r\n\r\n VisitArrivalDateTime: string;\r\n VisitDepartureDateTime: string;\r\n VisitDuration: string;\r\n\r\n rowStatus: VTableRowStatus;\r\n}\r\n\r\nexport interface ITMSFileIngestionResult {\r\n Errors: ITMSImportError[];\r\n Headers: ITMSCsvHeader[];\r\n TMSFileRecords: ITMSFileRecord[];\r\n DriverNameMappings: IDriver[];\r\n VehicleRegMappings: IVehicle[];\r\n}\r\n\r\nexport interface ITMSFileParseRequest {\r\n DateFromInclusive: string;\r\n Filename: string;\r\n DefaultGeofenceRadius: number;\r\n}\r\n\r\nexport interface IGeneratePlannedRoutesModel {\r\n TMSFileIngestionResult: ITMSFileIngestionResult;\r\n TMSFileParseRequest: ITMSFileParseRequest;\r\n}\r\n\r\nexport enum TMSErrorLevel {\r\n Info,\r\n Warning,\r\n Error\r\n}\r\n\r\nexport enum TMSRouteGenerationErrorType {\r\n InconsistentRouteField,\r\n MultipleGeofenceMatches,\r\n NoGeofenceMatches,\r\n Exception,\r\n InvalidInput,\r\n DuplicateReference,\r\n OverlappingRoute,\r\n NoVisits,\r\n GeocodingFailed,\r\n GeofenceRadiusTooSmall,\r\n Unauthorised\r\n}\r\n\r\nexport interface ITMSRouteGenerationError {\r\n ErrorType: TMSRouteGenerationErrorType;\r\n Message: string;\r\n ColumnName: string;\r\n ErrorLevel: TMSErrorLevel;\r\n // ---\r\n\r\n errorStatus: VTableRowStatus;\r\n}\r\n\r\nexport interface IGeneratedRouteSummary {\r\n\r\n validRoutes: ITMSPlannedRouteGenerationResult[];\r\n invalidRoutes: ITMSPlannedRouteGenerationResult[];\r\n\r\n allRoutes: ITMSPlannedRouteGenerationResult[];\r\n}\r\n\r\nexport interface ITMSPlannedRouteGenerationResult {\r\n Errors: ITMSRouteGenerationError[];\r\n PlannedRoute: IPlannedRoute;\r\n Success: boolean;\r\n RouteNumber: number;\r\n // ---\r\n\r\n uploaded: boolean;\r\n rowStatus: VTableRowStatus;\r\n name: string;\r\n errorString: string;\r\n}\r\n\r\ninterface IValidationSummaryBox {\r\n count: number;\r\n label: string;\r\n icon: string;\r\n color?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'schedule-import',\r\n template: require('./schedule-import.component.html')\r\n})\r\nexport class ScheduleImportComponent implements OnInit, AfterViewInit, OnDestroy {\r\n loading: boolean;\r\n\r\n importString: string;\r\n importFilename: string;\r\n\r\n validationResult: ITMSFileIngestionResult;\r\n validRowCount: number;\r\n\r\n fileResultSummary: IValidationSummaryBox[];\r\n routeResultSummary: IValidationSummaryBox[];\r\n\r\n generatedRouteSummary: IGeneratedRouteSummary;\r\n selectedGeneratedRoute: ITMSPlannedRouteGenerationResult;\r\n\r\n onFinishRedirectTo = \"app.tms.scheduling\";\r\n\r\n generateRoutesSub: Subscription;\r\n\r\n numToSave = 0;\r\n saveSuccessCount = 0;\r\n saveErrorCount = 0;\r\n readonly exampleCsvFilePath = \"/assets/files/ExampleRouteImportFile.csv\";\r\n \r\n @ViewChild(FileUploadComponent) fileUpload: FileUploadComponent;\r\n @ViewChild('weekCommencingDate') weekCommencingDate: ElementRef;\r\n @ViewChild('defaultArea') defaultAreaInput: ElementRef;\r\n\r\n startDateValid: boolean = true;\r\n dateFromInclusive: string;\r\n\r\n defaultAreaValid: boolean = true;\r\n defaultGeofenceRadius: number = 250;\r\n\r\n validationErrorsTableColumns: IVTableColumn[];\r\n validationErrorsTableRows: IVTableRow[];\r\n fileRecordsTableColumns: IVTableColumn[];\r\n fileRecordsTableRows: IVTableRow[];\r\n allRoutesWithErrorsTableColumns: IVTableColumn[];\r\n allRoutesTableColumns: IVTableColumn[];\r\n allRoutesTableRows: IVTableRow[];\r\n\r\n selectedGeneratedRouteColumns: IVTableColumn[];\r\n selectedGeneratedRouteRows: IVTableRow[];\r\n selectedRouteErrorColumns: IVTableColumn[]\r\n selectedRouteErrorRows: IVTableRow[];\r\n\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly colourService: ColourService,\r\n private readonly plannedRouteService: PlannedRouteService,\r\n private readonly translationService: TranslationService,\r\n private readonly veriDate: VeriDate,\r\n private readonly vTableService: VTableService\r\n ) {\r\n }\r\n ngOnDestroy(): void {\r\n if (this.generateRoutesSub) {\r\n this.generateRoutesSub.unsubscribe();\r\n }\r\n }\r\n\r\n ngOnInit(): void {\r\n this.createTables();\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n let today = this.veriDate.getDateInInputFormat(new Date());\r\n this.weekCommencingDate.nativeElement.value = this.weekCommencingDate.nativeElement.min = today;\r\n this.defaultAreaInput.nativeElement.value = \"250\";\r\n }\r\n\r\n onRouteRowClicked(row: IVTableRow): void {\r\n this.selectedGeneratedRoute = row.data;\r\n this.createSelectedRouteTables();\r\n }\r\n\r\n onImportFileChanged(event: IFileUploadDetails) {\r\n if (this.weekCommencingDate.nativeElement.checkValidity()) {\r\n this.uploadCSV(event.file);\r\n this.startDateValid = true;\r\n\r\n } else {\r\n this.fileUpload.hasFile = false;\r\n this.startDateValid = false;\r\n }\r\n }\r\n\r\n onDateChange(event: Event) {\r\n if (!this.weekCommencingDate.nativeElement.checkValidity()) {\r\n this.startDateValid = false;\r\n } else {\r\n this.startDateValid = true;\r\n this.dateFromInclusive = this.weekCommencingDate.nativeElement.value;\r\n }\r\n if (this.startDateValid && this.fileUpload.hasFile) {\r\n this.uploadCSV(this.fileUpload.file);\r\n }\r\n }\r\n\r\n onDefaultAreaChange() {\r\n if (!this.defaultAreaInput.nativeElement.checkValidity()) {\r\n this.defaultAreaValid = false;\r\n } else {\r\n this.defaultAreaValid = true;\r\n this.defaultGeofenceRadius = Number.parseInt(this.defaultAreaInput.nativeElement.value);\r\n }\r\n }\r\n\r\n uploadCSV(file: File) {\r\n this.reset();\r\n\r\n const formData = new FormData();\r\n formData.append('file', file, file.name);\r\n this.importFilename = file.name;\r\n\r\n this.dateFromInclusive = this.weekCommencingDate.nativeElement.value;\r\n this.uploadRouteCsv(formData);\r\n }\r\n\r\n downloadExampleFile() {\r\n window.location.assign(this.exampleCsvFilePath);\r\n }\r\n\r\n\r\n savePlannedRoutes() {\r\n\r\n this.numToSave = 0;\r\n this.saveSuccessCount = 0;\r\n this.saveErrorCount = 0;\r\n this.loading = true;\r\n\r\n this.allRoutesTableRows = [];\r\n this.allRoutesTableColumns = this.createAllRouteTableColumns(false);\r\n /* Code for using addRoutes - WIP */\r\n //this.generatedRouteSummary.allRoutes.forEach((route, i) => {\r\n // if (!route.Success) {\r\n // return;\r\n // }\r\n // route.rowStatus = VTableCellStatus.Pending;\r\n //})\r\n\r\n //const allRoutes = this.generatedRouteSummary.allRoutes.map(route => route.Success && route.PlannedRoute);\r\n //this.plannedRouteService.addPlannedRoutes(allRoutes).then(addedRoutes => {\r\n\r\n // this.saveSuccessCount = addedRoutes.filter(addedRoute => !addedRoute.IsError).length;\r\n // this.saveErrorCount = addedRoutes.filter(addedRoute => addedRoute.IsError).length;\r\n\r\n // this.generatedRouteSummary.allRoutes.forEach((route, i) => {\r\n\r\n // if (!route.Success) {\r\n // return;\r\n // }\r\n\r\n // const matchingRoute = addedRoutes.find(returnedRoute => returnedRoute.Value?.Id === route.PlannedRoute.Id);\r\n\r\n // if (!matchingRoute.IsError) {\r\n // route.rowStatus = VTableCellStatus.Success;\r\n // }\r\n // else {\r\n // route.rowStatus = VTableCellStatus.Error;\r\n // }\r\n // this.table.updateRow(route);\r\n // })\r\n //}).finally(() => {\r\n // this.loading = false;\r\n //})\r\n /* End code for using addRoutes - WIP */\r\n\r\n this.generatedRouteSummary.allRoutes.forEach((route, i) => {\r\n if (!route.Success) {\r\n return;\r\n }\r\n\r\n this.numToSave++;\r\n route.rowStatus = VTableRowStatus.Pending;\r\n\r\n this.plannedRouteService.addPlannedRoute(route.PlannedRoute)\r\n .then(() => {\r\n route.rowStatus = VTableRowStatus.Success;\r\n this.saveSuccessCount++;\r\n })\r\n .catch(() => {\r\n route.rowStatus = VTableRowStatus.Error;\r\n this.saveErrorCount++;\r\n }).finally(() => {\r\n\r\n this.allRoutesTableRows = this.vTableService.createTableRows(this.generatedRouteSummary.allRoutes, this.allRoutesTableColumns)\r\n\r\n this.loading = this.saveSuccessCount + this.saveErrorCount != this.numToSave;\r\n });\r\n });\r\n\r\n }\r\n\r\n // ---\r\n\r\n private createSummaryBox(count: number, icon: string, label: string, color: string): IValidationSummaryBox {\r\n return {\r\n count: count,\r\n icon: icon, //validate\r\n label: label,\r\n color: color\r\n };\r\n }\r\n\r\n private processValidationResult() {\r\n this.fileResultSummary = [];\r\n\r\n const rowsWithErrors = this.validationResult.Errors.filter(e => e.ErrorLevel === TMSErrorLevel.Error).map(e => e.RowIndex).filter(e => e !== 0); // We do not count row 0 as that is column headers\r\n const errorCount = [...new Set(rowsWithErrors)].length; // Gets unique row indexes for validRowCount\r\n this.validRowCount = this.validationResult.TMSFileRecords.length - errorCount;\r\n\r\n this.fileResultSummary.push(this.createSummaryBox(this.validRowCount, \"done\", \"Valid Rows\", this.colourService.greenColor));\r\n this.fileResultSummary.push(this.createSummaryBox(this.validationResult.Errors.map(e => e.ErrorLevel).filter(e => e == TMSErrorLevel.Warning).length, \"warning\", \"Warnings\", this.colourService.orangeColor));\r\n this.fileResultSummary.push(this.createSummaryBox(this.validationResult.Errors.map(e => e.ErrorLevel).filter(e => e == TMSErrorLevel.Error).length, \"clear\", \"Errors\", this.colourService.redColor));\r\n\r\n this.fileResultSummary.forEach(rs => {\r\n if (rs.count == 0) {\r\n rs.color = this.colourService.greyColor;\r\n }\r\n });\r\n\r\n // Set all results to good, before we test for errors\r\n this.validationResult.TMSFileRecords.forEach(fr => { fr.rowStatus = VTableRowStatus.Success; });\r\n\r\n this.validationResult.Errors.forEach(error => {\r\n error.rowStatus = this.convertTmsErrorLevelToTableCellStatus(error.ErrorLevel);\r\n error.errorLevelString = TMSErrorLevel[error.ErrorLevel];\r\n error.errorTypeString = TMSImportErrorType[error.ErrorType];\r\n\r\n // Find matching status\r\n // 0 is actually the header row, we should ignore 0 and subtract one\r\n error.RowIndex--;\r\n if (error.RowIndex >= 0) {\r\n this.validationResult.TMSFileRecords[error.RowIndex].rowStatus = error.rowStatus;\r\n }\r\n });\r\n }\r\n\r\n private uploadRouteCsv(formData: FormData) {\r\n formData.append(\"DateFromInclusive\", this.dateFromInclusive);\r\n formData.append(\"Filename\", this.importFilename);\r\n formData.append(\"DefaultGeofenceRadius\", this.defaultGeofenceRadius.toString());\r\n\r\n this.loading = true;\r\n this.http.post(`/api/routeimport`, formData, { reportProgress: true, observe: 'events' })\r\n .subscribe({\r\n next: (event) => {\r\n if (event.type === HttpEventType.UploadProgress) {\r\n //console.log(\"Upload progress\", Math.round(100 * event.loaded / event.total));\r\n }\r\n else if (event.type === HttpEventType.Response) {\r\n this.validationResult = event.body as ITMSFileIngestionResult;\r\n this.processValidationResult();\r\n\r\n this.validationErrorsTableRows = this.vTableService.createTableRows(this.validationResult.Errors, this.validationErrorsTableColumns);\r\n\r\n this.fileRecordsTableRows = this.vTableService.createTableRows(this.validationResult.TMSFileRecords, this.fileRecordsTableColumns);\r\n }\r\n },\r\n error: (err: HttpErrorResponse) => console.error(err),\r\n complete: () => this.loading = false\r\n });\r\n }\r\n\r\n private generatePlannedRoutes() {\r\n // Dont rerun this unless required\r\n if (this.generatedRouteSummary) {\r\n return;\r\n }\r\n\r\n const generatePlannedRoutesModel: IGeneratePlannedRoutesModel =\r\n {\r\n TMSFileIngestionResult: this.validationResult,\r\n TMSFileParseRequest: {\r\n DateFromInclusive: this.dateFromInclusive,\r\n Filename: this.importFilename,\r\n DefaultGeofenceRadius: this.defaultGeofenceRadius,\r\n },\r\n };\r\n\r\n this.loading = true;\r\n this.generateRoutesSub = this.http.post(`/api/routeimport/generateroutes`, generatePlannedRoutesModel, { reportProgress: true, observe: 'events' })\r\n .pipe(\r\n filter(event => event.type === HttpEventType.Response),\r\n take(1)\r\n )\r\n .subscribe({\r\n next: (event: HttpResponse) => {\r\n this.generatedRouteSummary = {\r\n allRoutes: event.body as ITMSPlannedRouteGenerationResult[],\r\n invalidRoutes: [],\r\n validRoutes: []\r\n };\r\n this.processPlannedRoutes();\r\n this.allRoutesTableRows = this.vTableService.createTableRows(this.generatedRouteSummary.allRoutes, this.allRoutesWithErrorsTableColumns);\r\n },\r\n error: (err: HttpErrorResponse) => {\r\n console.error(err)\r\n },\r\n complete: () => {\r\n this.loading = false;\r\n }\r\n });\r\n }\r\n\r\n private convertTmsErrorLevelToTableCellStatus(maxTmsErrorLevel: TMSErrorLevel): VTableRowStatus {\r\n switch (maxTmsErrorLevel) {\r\n case TMSErrorLevel.Info:\r\n return VTableRowStatus.Info;\r\n\r\n case TMSErrorLevel.Warning:\r\n return VTableRowStatus.Warning;\r\n\r\n case TMSErrorLevel.Error:\r\n return VTableRowStatus.Error;\r\n }\r\n }\r\n\r\n private processPlannedRoutes() {\r\n this.generatedRouteSummary.allRoutes.forEach(r => {\r\n r.name = r.PlannedRoute.PlannedVisits[0]?.Name || 'None';\r\n if (r.Errors.length == 0) {\r\n r.rowStatus = VTableRowStatus.Success;\r\n }\r\n else {\r\n\r\n r.Errors?.forEach(error => {\r\n error.errorStatus = this.convertTmsErrorLevelToTableCellStatus(error.ErrorLevel);\r\n });\r\n const maxTmsErrorLevel = Math.max(...r.Errors.map(e => e.ErrorLevel));\r\n const highPriorityError = r.Errors.find(e => e.ErrorLevel === maxTmsErrorLevel);\r\n\r\n if (r.Errors.length === 1) {\r\n r.errorString = r.Errors[0].Message.substr(0, 50).trim() + '...';\r\n }\r\n else if (r.Errors.length > 1) {\r\n const errorCount = r.Errors.length - 1;\r\n r.errorString = `${highPriorityError.Message.substr(0, 50).trim()}... (+${errorCount} ${this.translationService.t('ScheduleImport.OtherErrors')})`;\r\n }\r\n r.rowStatus = this.convertTmsErrorLevelToTableCellStatus(maxTmsErrorLevel);\r\n }\r\n });\r\n\r\n this.generatedRouteSummary.validRoutes = this.generatedRouteSummary.allRoutes.filter(r => r.Success);\r\n this.generatedRouteSummary.invalidRoutes = this.generatedRouteSummary.allRoutes.filter(r => !r.Success);\r\n\r\n this.routeResultSummary = [];\r\n\r\n this.routeResultSummary.push(this.createSummaryBox(this.generatedRouteSummary.validRoutes.length, \"done\", \"Valid Routes\", this.colourService.greenColor));\r\n this.routeResultSummary.push(this.createSummaryBox(this.generatedRouteSummary.invalidRoutes.length, \"clear\", \"Invalid Routes\", this.colourService.redColor));\r\n }\r\n\r\n private reset() {\r\n this.validRowCount = 0;\r\n this.validationResult = null;\r\n\r\n this.fileResultSummary = [];\r\n this.routeResultSummary = [];\r\n\r\n this.generatedRouteSummary = null;\r\n this.selectedGeneratedRoute = null;\r\n }\r\n\r\n private createTables(): void {\r\n this.createValidationErrorsTableColumns();\r\n this.createFileRecordTableColumns();\r\n this.allRoutesWithErrorsTableColumns = this.createAllRouteTableColumns(true);\r\n }\r\n\r\n private createValidationErrorsTableColumns(): void {\r\n this.validationErrorsTableColumns = [\r\n {\r\n header: this.vTableService.createStatusTableHeader({ tKey: 'ScheduleImport.Status', width: 90 }),\r\n createCellFunction: error => this.vTableService.createStatusCell(error.rowStatus)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'ScheduleImport.Row', width: 60, sortType: SortType.Number }),\r\n createCellFunction: error => this.vTableService.createTableCell(error.RowIndex)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'ScheduleImport.Column', width: 60, sortType: SortType.Number }),\r\n createCellFunction: error => this.vTableService.createTableCell(error.ColumnIndex)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'ScheduleImport.Error', width: 180 }),\r\n createCellFunction: error => this.vTableService.createTableCell(error.errorTypeString)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'ScheduleImport.ColumnName', width: 180 }),\r\n createCellFunction: error => this.vTableService.createTableCell(error.ColumnName)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'ScheduleImport.Details' }),\r\n createCellFunction: error => this.vTableService.createTableCell(error.Message)\r\n }\r\n ]\r\n }\r\n\r\n private createFileRecordTableColumns(): void {\r\n this.fileRecordsTableColumns = [\r\n {\r\n header: this.vTableService.createStatusTableHeader({ tKey: 'ScheduleImport.Status', width: 90 }),\r\n createCellFunction: record => this.vTableService.createStatusCell(record.rowStatus)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'Common.Route', width: 80, sortType: SortType.Number }),\r\n createCellFunction: record => this.vTableService.createTableCell(record.RouteNumber, { classes: \"text-right\" })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'Tms.Visit', width: 80, sortType: SortType.Number }),\r\n createCellFunction: record => this.vTableService.createTableCell(record.VisitNumber, { classes: \"text-right\" })\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader(),\r\n createCellFunction: record => this.vTableService.createDateCell(record.VisitArrivalDateTime)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'Common.Driver', sortType: SortType.Number }),\r\n createCellFunction: record => this.vTableService.createTableCell(record.Driver)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'Common.Address', sortType: SortType.Number }),\r\n createCellFunction: record => this.vTableService.createTableCell(record.Address)\r\n }\r\n ]\r\n }\r\n\r\n private createAllRouteTableColumns(withErrors: boolean): IVTableColumn[] {\r\n const columns = [\r\n {\r\n header: this.vTableService.createStatusTableHeader({ tKey: 'ScheduleImport.Status' }),\r\n createCellFunction: route => this.vTableService.createStatusCell(route.rowStatus)\r\n },\r\n\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: 'ScheduleImport.StartTime' }),\r\n createCellFunction: route => this.vTableService.createDateCell(route.PlannedRoute.PlannedStartTime)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'ScheduleImport.FirstVisit', width: 250 }),\r\n createCellFunction: route => this.vTableService.createTableCell(route.name)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'Common.Driver', sortable: false }),\r\n createCellFunction: route => this.vTableService.createTableCell(route.PlannedRoute?.DriverId, {\r\n component: DriverNameComponent,\r\n componentInputs: { id: route.PlannedRoute?.DriverId }\r\n })\r\n }\r\n ]\r\n\r\n if (withErrors) {\r\n columns.splice(1, 0,\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'Common.Route', width: 80, sortType: SortType.Number }),\r\n createCellFunction: route => this.vTableService.createTableCell(route.RouteNumber, { classes: \"text-right\" })\r\n },);\r\n\r\n columns.push(\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'ScheduleImport.Errors' }),\r\n createCellFunction: route => this.vTableService.createTableCell(route.errorString)\r\n }\r\n )\r\n }\r\n\r\n return columns;\r\n }\r\n\r\n private createSelectedRouteTables(): void {\r\n this.createSelectedColumns();\r\n this.createSelectedRouteRows();\r\n }\r\n\r\n private createSelectedColumns(): void {\r\n this.selectedGeneratedRouteColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: 'ScheduleImport.PlannedArrival', sorted: true }),\r\n createCellFunction: visit => this.vTableService.createDateCell(visit.PlannedArrivalTime)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: 'ScheduleImport.PlannedDeparture' }),\r\n createCellFunction: visit => this.vTableService.createDateCell(visit.PlannedDepartureTime)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'ScheduleImport.Location' }),\r\n createCellFunction: visit => this.vTableService.createTableCell(visit.Name)\r\n }\r\n ];\r\n\r\n this.selectedRouteErrorColumns = [\r\n {\r\n header: this.vTableService.createStatusTableHeader({ tKey: 'ScheduleImport.Status' }),\r\n createCellFunction: error => this.vTableService.createStatusCell(error.errorStatus)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'ScheduleImport.Errors' }),\r\n createCellFunction: error => this.vTableService.createTableCell(error.Message)\r\n }\r\n ]\r\n }\r\n\r\n private createSelectedRouteRows(): void {\r\n this.selectedGeneratedRouteRows = this.vTableService.createTableRows(this.selectedGeneratedRoute.PlannedRoute.PlannedVisits, this.selectedGeneratedRouteColumns);\r\n\r\n this.selectedRouteErrorRows = this.vTableService.createTableRows(this.selectedGeneratedRoute.Errors, this.selectedRouteErrorColumns);\r\n }\r\n}\r\n","import { Component, Input, OnChanges, OnInit } from \"@angular/core\";\r\nimport \"./ahead-behind.component.scss\";\r\n\r\n@Component({\r\n selector: \"ahead-behind\",\r\n template: require(\"./ahead-behind.component.html\")\r\n})\r\nexport class AheadBehindComponent implements OnInit, OnChanges {\r\n\r\n @Input() left: number;\r\n @Input() right: number;\r\n @Input() max: number;\r\n\r\n // ---\r\n\r\n leftPercentage: number;\r\n rightPercentage: number;\r\n\r\n constructor() {\r\n }\r\n\r\n ngOnInit() {\r\n this.calculateBarWidths();\r\n }\r\n\r\n ngOnChanges() {\r\n this.calculateBarWidths();\r\n }\r\n\r\n // ---\r\n\r\n private calculateBarWidths() {\r\n this.leftPercentage = this.left * 100 / this.max;\r\n this.rightPercentage = this.right * 100 / this.max;\r\n }\r\n}\r\n","import { ChangeDetectorRef, Component, OnDestroy, OnInit } from \"@angular/core\";\r\nimport { IVTableCell } from \"@app/directives/_layout/v-table/_models/IVTableCell\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { IAggregateFilterEvent } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { DateRange } from \"@app/enum/DateRange.enum\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { WindowBreakpoint } from \"@services/responsive.service\";\r\nimport { RouteVisitStatus } from \"@tms/_enums/RouteVisitStatus\";\r\nimport { IPlannedRouteVisit } from \"@tms/_models/IPlannedRouteVisit\";\r\nimport { IPlannedRouteDetail, PlannedRouteService, selectMany } from \"@tms/_services/planned-route.service\";\r\nimport { lastValueFrom, Subscription } from \"rxjs\";\r\nimport { DateService, DateUnit } from \"../../../../../services/date.service\";\r\nimport { IEarlyLatePerformanceInterface } from \"../../_models/IEarlyLatePerformanceInterface\";\r\nimport { IPlannedRouteOptions } from \"../../_models/IPlannedRouteOptions\";\r\nimport { PlannedRouteService2 } from \"../../_services/planned-route.service2\";\r\nimport { AheadBehindComponent } from \"./ahead-behind/ahead-behind.component\";\r\nimport \"./visit-performance.component.scss\";\r\n\r\nexport interface IPlannedRouteVisitPerformance extends IPlannedRouteVisit, IEarlyLatePerformanceInterface {\r\n}\r\n\r\nexport interface IVisitPerformance extends IEarlyLatePerformanceInterface {\r\n Id?: number;\r\n name: string;\r\n\r\n totalVisitCount: number;\r\n missCount: number;\r\n successCount: number;\r\n\r\n arrivalEarlyCount: number;\r\n arrivalLateCount: number;\r\n\r\n departureEarlyCount: number;\r\n departureLateCount: number;\r\n\r\n performanceRating?: number;\r\n\r\n visits: IPlannedRouteVisitPerformance[];\r\n}\r\n\r\n@Component({\r\n selector: \"visit-performance\",\r\n template: require(\"./visit-performance.component.html\")\r\n})\r\nexport class VisitPerformanceComponent implements OnInit, OnDestroy {\r\n\r\n defaultDateRange = DateRange.Last7Days;\r\n filterEvent: IAggregateFilterEvent;\r\n\r\n routes: IPlannedRouteDetail[];\r\n visits: IPlannedRouteVisit[];\r\n\r\n visitPerformance: IVisitPerformance[] = [];\r\n selectedRow: IVisitPerformance;\r\n\r\n maxVisits = 5;\r\n maxDiffMins = 60;\r\n\r\n loading = false;\r\n plannedRoutesSubscription: Subscription;\r\n\r\n WindowBreakpoint = WindowBreakpoint;\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n selectedVisitsTableColumns: IVTableColumn[];\r\n selectedVisitsTableRows: IVTableRow[];\r\n\r\n constructor(\r\n private readonly plannedRouteService: PlannedRouteService,\r\n private readonly plannedRouteService2: PlannedRouteService2,\r\n private readonly dateService: DateService,\r\n private readonly vTableService: VTableService) {\r\n }\r\n\r\n ngOnInit() {\r\n this.prepareForData();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.plannedRoutesSubscription?.unsubscribe();\r\n }\r\n\r\n rowClick($event: IVTableRow) {\r\n this.selectedRow = $event.data;\r\n this.createSelectedVisitsTableRows();\r\n }\r\n\r\n onVisitRowClicked($event: IVTableRow) {\r\n this.plannedRouteService.openRouteDetailsDialogById($event.data.PlannedRouteId, 'app.tms.visitperformance'/* TmsModule.RoutePerformance*/);\r\n }\r\n\r\n onFilterChanged(event: IAggregateFilterEvent) {\r\n if (!event.trigger) {\r\n return;\r\n }\r\n\r\n this.filterEvent = event;\r\n\r\n if (event.trigger === \"date\") {\r\n this.requestData(true);\r\n }\r\n }\r\n\r\n requestData(invalidateCache = false): void {\r\n this.loading = true;\r\n\r\n const options: IPlannedRouteOptions = {\r\n invalidateCache: invalidateCache,\r\n formatPlannedVisitsForDisplay: true,\r\n startedRoutesOnly: true\r\n };\r\n\r\n lastValueFrom(this.plannedRouteService2.requestPlannedRoutes(this.filterEvent.date[0], this.filterEvent.date[1], options)).finally(() => {\r\n this.createTableRows();\r\n });\r\n }\r\n // ---\r\n\r\n\r\n // Success Rate - aka visit rate\r\n\r\n // Average Arrival Delta\r\n // Max Arrival Delta\r\n\r\n // Average On Site Delta\r\n // Max On Site Delta\r\n\r\n // Route performance? e.g. what is success rate of routes that include this stop\r\n\r\n private prepareForData(): void {\r\n this.createTable();\r\n this.createSelectedVisitsTable();\r\n this.plannedRoutesSubscription = this.plannedRouteService2.plannedRoutesSubject.subscribe((routes) => {\r\n this.routes = routes;\r\n this.visits = selectMany(this.routes, route => route.PlannedVisits);\r\n\r\n this.processVisits();\r\n this.createTableRows();\r\n this.loading = false;\r\n });\r\n }\r\n\r\n private processVisits() {\r\n this.visitPerformance = [];\r\n\r\n this.visits.forEach((visit, index) => {\r\n\r\n // If we are planned, ignore\r\n if (visit.Status == RouteVisitStatus.Planned) {\r\n return;\r\n }\r\n\r\n let existingVP = this.visitPerformance.find(p => p.name == visit.Name);\r\n\r\n if (!existingVP) {\r\n existingVP = {\r\n Id: index,\r\n name: visit.Name,\r\n\r\n totalVisitCount: 0,\r\n missCount: 0,\r\n successCount: 0,\r\n\r\n arrivalEarlyCount: 0,\r\n arrivalLateCount: 0,\r\n\r\n departureEarlyCount: 0,\r\n departureLateCount: 0,\r\n\r\n arrivalEarlyMins: 0,\r\n arrivalLateMins: 0,\r\n\r\n onsiteEarlyMins: 0,\r\n onsiteLateMins: 0,\r\n\r\n visits: []\r\n };\r\n\r\n this.visitPerformance.push(existingVP);\r\n }\r\n\r\n switch (visit.Status) {\r\n case RouteVisitStatus.Arrived:\r\n case RouteVisitStatus.Departed:\r\n this.processDepartedVisit(existingVP, visit);\r\n\r\n let visitperformance = this.createPerformanceVisit(visit);\r\n existingVP.visits.push(visitperformance);\r\n\r\n break;\r\n\r\n case RouteVisitStatus.Missed:\r\n\r\n existingVP.missCount++;\r\n break;\r\n }\r\n\r\n\r\n\r\n\r\n\r\n existingVP.totalVisitCount = existingVP.successCount + existingVP.missCount;\r\n existingVP.performanceRating = existingVP.totalVisitCount\r\n ? existingVP.successCount / existingVP.totalVisitCount\r\n : 0;\r\n\r\n this.maxDiffMins = Math.max(this.maxDiffMins, existingVP.arrivalEarlyMins);\r\n this.maxDiffMins = Math.max(this.maxDiffMins, existingVP.arrivalLateMins);\r\n });\r\n }\r\n\r\n private createPerformanceVisit(visit: IPlannedRouteVisit): IPlannedRouteVisitPerformance {\r\n let vp: IPlannedRouteVisitPerformance = visit as any;\r\n\r\n vp.arrivalEarlyMins = 0;\r\n vp.arrivalLateMins = 0;\r\n vp.onsiteEarlyMins = 0;\r\n vp.onsiteLateMins = 0;\r\n\r\n this.calculateEarlyLateMins(vp, visit);\r\n\r\n return vp;\r\n }\r\n\r\n private processDepartedVisit(existingVP: IVisitPerformance, visit: IPlannedRouteVisit) {\r\n existingVP.successCount++;\r\n\r\n this.calculateEarlyLateMins(existingVP, visit);\r\n\r\n // Arrival / departure\r\n if (existingVP.arrivalEarlyMins) {\r\n existingVP.arrivalEarlyCount++;\r\n }\r\n else {\r\n existingVP.arrivalLateCount++;\r\n }\r\n\r\n // On site time\r\n if (existingVP.onsiteEarlyMins > 0) {\r\n existingVP.departureEarlyCount++;\r\n }\r\n else {\r\n existingVP.departureLateCount++;\r\n }\r\n }\r\n\r\n private calculateEarlyLateMins(existingVP: IEarlyLatePerformanceInterface, visit: IPlannedRouteVisit) {\r\n\r\n let arrivalDiff = visit.ActualArrivalTime ? this.dateService.getDiff(visit.ActualArrivalTime, visit.PlannedArrivalTime, DateUnit.Min) : 0;\r\n let departureDiff = visit.ActualDepartureTime ? this.dateService.getDiff(visit.ActualDepartureTime, visit.PlannedDepartureTime, DateUnit.Min) : 0;\r\n\r\n // Arrival / departure\r\n if (arrivalDiff > 0) {\r\n existingVP.arrivalEarlyMins += arrivalDiff;\r\n }\r\n else {\r\n existingVP.arrivalLateMins -= arrivalDiff;\r\n }\r\n\r\n // On site time\r\n if (departureDiff > 0) {\r\n existingVP.onsiteEarlyMins += departureDiff;\r\n }\r\n else {\r\n existingVP.onsiteLateMins -= departureDiff;\r\n }\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"VisitPerformance.VisitName\" }),\r\n createCellFunction: performance => this.vTableService.createTableCell(performance.name)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"VisitPerformance.PlanCount\", width: 150, sorted: true, sortDirection: SortDirection.Ascending, sortType: SortType.Number }),\r\n createCellFunction: performance => this.vTableService.createTableCell(performance.totalVisitCount)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"VisitPerformance.SuccessCount\", width: 160 }),\r\n createCellFunction: performance => this.vTableService.createTableCell(performance.successCount)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"VisitPerformance.VisitRate\", width: 150, searchable: false }),\r\n createCellFunction: performance => this.createPerformanceRatingCell(performance)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"VisitPerformance.ArrivalTime\", width: 150, sortable: false, searchable: false, excludeFromExport: true }),\r\n createCellFunction: performance => this.vTableService.createTableCell(performance, { component: AheadBehindComponent, componentInputs: { left: Math.round(performance.arrivalEarlyMins), right: Math.round(performance.arrivalLateMins), max: this.maxDiffMins } })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"VisitPerformance.OnSiteDuration\", width: 150, sortable: false, searchable: false, excludeFromExport: true }),\r\n createCellFunction: performance => this.vTableService.createTableCell(performance, { component: AheadBehindComponent, componentInputs: { left: Math.round(performance.onsiteEarlyMins), right: Math.round(performance.onsiteLateMins), max: this.maxDiffMins } })\r\n },\r\n ]\r\n }\r\n\r\n private createSelectedVisitsTable(): void {\r\n this.selectedVisitsTableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Name\" }),\r\n createCellFunction: visit => this.vTableService.createTableCell(visit.Name)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"VisitPerformance.ArrivalTime\", width: 150, sortable: false, searchable: false, excludeFromExport: true }),\r\n createCellFunction: visit => this.vTableService.createTableCell(performance, { component: AheadBehindComponent, componentInputs: { left: Math.round(visit.arrivalEarlyMins), right: Math.round(visit.arrivalLateMins), max: this.maxDiffMins } })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"VisitPerformance.OnSiteDuration\", width: 150, sortable: false, searchable: false, excludeFromExport: true }),\r\n createCellFunction: visit => this.vTableService.createTableCell(performance, { component: AheadBehindComponent, componentInputs: { left: Math.round(visit.onsiteEarlyMins), right: Math.round(visit.onsiteLateMins), max: this.maxDiffMins } })\r\n },\r\n ]\r\n }\r\n\r\n private createTableRows(): void {\r\n this.tableRows = this.vTableService.createTableRows(this.visitPerformance, this.tableColumns);\r\n }\r\n\r\n private createSelectedVisitsTableRows(): void {\r\n if (!this.selectedRow) {\r\n return;\r\n }\r\n this.selectedVisitsTableRows = this.vTableService.createTableRows(this.selectedRow.visits, this.selectedVisitsTableColumns);\r\n }\r\n\r\n private createPerformanceRatingCell(performance: IVisitPerformance): IVTableCell {\r\n const percentage = performance.performanceRating * 100;\r\n return this.vTableService.createTableCell(`${Math.round(percentage)}%`, { sortData: percentage });\r\n }\r\n}\r\n","import { IPlannedRouteAudit } from \"@tms/_models/IPlannedRouteAudit\";\r\n\r\nexport class PlannedRouteAuditService {\r\n\r\n static $inject = [\"$http\", \"$q\"];\r\n\r\n constructor(\r\n private readonly $http: angular.IHttpService,\r\n private readonly $q: angular.IQService,\r\n ) {\r\n }\r\n\r\n getPlannedRouteAudits(routeId: number): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/tms/plannedrouteaudit/${routeId}`,\r\n method: \"GET\"\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n}\r\n","import { IGoogleMapsMarker, IGoogleMapsMarkerOptions } from \"@interfaces/IGoogleMapsMarkerOptions\";\r\nimport { GoogleMarkerService, ICreateEventMarkerOptions, MarkerAnchorPosition } from \"@services/googleMarker.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport { VeriMarkerService } from \"@services/veriMarker.service\";\r\nimport { IPlannedRoute } from \"@tms/_models/IPlannedRoute\";\r\nimport { IPlannedRouteVisit } from \"@tms/_models/IPlannedRouteVisit\";\r\nimport { IUnplannedStop } from \"@tms/_models/IUnplannedStop\";\r\nimport { GeofenceService } from \"@services/geofence.service\";\r\nimport { PlannedRouteVisitService } from \"./planned-route-visit.service\";\r\nimport { PlannedRouteService } from \"./planned-route.service\";\r\nimport { VisitOnTimeStatus } from \"../_enums/VisitOnTimeStatus\";\r\nimport { GeofenceType } from \"@enums/GeofenceType\";\r\nimport { IRouteStop } from \"@components/planning/interfaces/IRouteStop\";\r\n\r\nexport interface IPlannedRouteMapMarkerOptions {\r\n route?: IPlannedRoute;\r\n unplannedStops?: IUnplannedStop[];\r\n showEveryStop?: boolean;\r\n bypassStatus?: boolean;\r\n showPlannedStops?: boolean;\r\n showUnplannedStops?: boolean;\r\n}\r\n\r\nexport class PlannedRouteMapService {\r\n\r\n readonly greyColor = \"#c9c9c9\";\r\n readonly greenColor = \"#60b27f\";\r\n readonly darkColor = \"#242527\";\r\n readonly orangeColor = \"#ff6e40\";\r\n readonly redColor = \"#ff4141\";\r\n\r\n static $inject = [\"veriDate\", \"translationService\", \"plannedRouteService\", \"plannedRouteVisitService\", \"googleMarkerService\", \"veriMarkerService\", \"geofenceService\"];\r\n\r\n constructor(\r\n private readonly veriDate: VeriDate,\r\n private readonly translationService: TranslationService,\r\n private readonly plannedRouteService: PlannedRouteService,\r\n private readonly plannedRouteVisitService: PlannedRouteVisitService,\r\n private readonly googleMarkerService: GoogleMarkerService,\r\n private readonly veriMarkerService: VeriMarkerService,\r\n private readonly geofenceService: GeofenceService\r\n ) {\r\n }\r\n\r\n createMapMarkersForRoute(options: IPlannedRouteMapMarkerOptions): IGoogleMapsMarker[] {\r\n const mapMarkers: IGoogleMapsMarker[] = [];\r\n\r\n if (options.showUnplannedStops) {\r\n this.addUnplannedStopsMarkers(options.unplannedStops, mapMarkers);\r\n }\r\n\r\n if (options.showPlannedStops) {\r\n this.addPlannedVisitsMarkers(options.route, mapMarkers, options?.showEveryStop, options?.bypassStatus);\r\n }\r\n\r\n return mapMarkers;\r\n }\r\n\r\n createRouteMarkerOptions(routeStop: IRouteStop, index: number, max: number): IGoogleMapsMarkerOptions {\r\n\r\n let icon = \"---\";\r\n\r\n let markerType = \"marker-event-pause\";\r\n //let label = `Waypoint ${index}`;\r\n let label = routeStop.displayLabel;\r\n\r\n if (index === 0) {\r\n icon = \"play_arrow\";\r\n label = `Start: ${label}`;\r\n markerType = \"marker-event-start\";\r\n }\r\n else if (index === max - 1) {\r\n icon = \"stop\"; //flag\r\n label = `End: ${label}`;\r\n markerType = \"marker-event-end\";\r\n }\r\n\r\n const options = this.googleMarkerService.createEventMarkerOptions({ label: label, markerClass: markerType, subIcon: icon, showLabel: true });\r\n\r\n // Bit hacky\r\n if (icon === \"---\") {\r\n options.labelContent = options.labelContent.replace(`${icon}`, `${index}`);\r\n }\r\n\r\n options.visible = true;\r\n options.draggable = true;\r\n\r\n return options;\r\n }\r\n\r\n // ---\r\n\r\n private addUnplannedStopsMarkers(unplannedStops: IUnplannedStop[], existingMarkers: IGoogleMapsMarker[]): void {\r\n if (!unplannedStops?.length) {\r\n return;\r\n }\r\n\r\n unplannedStops.forEach((unplannedStop: IUnplannedStop) => {\r\n existingMarkers.push({\r\n id: Math.floor(Math.random() * 1000) + 1,\r\n options: this.createPipMarkerOptions(null, unplannedStop, this.darkColor, 12)\r\n });\r\n\r\n const unplannedStopTime = this.veriDate.convertMomentToTimespan(this.veriDate.createMoment(unplannedStop.VisitTime));\r\n const label = `${this.translationService.t(\"Tms.UnplannedStop\")} (${unplannedStopTime})`;\r\n\r\n existingMarkers.push(this.createMapMarker(null, unplannedStop, {\r\n label: label,\r\n subIcon: \"question_mark\",\r\n showLabel: true,\r\n colour: this.greyColor\r\n }));\r\n });\r\n }\r\n\r\n private addPlannedVisitsMarkers(route: IPlannedRoute, existingMarkers: IGoogleMapsMarker[], showEveryStop: boolean = false, bypassStatus: boolean = false): void {\r\n if (!route?.PlannedVisits?.length) {\r\n return;\r\n }\r\n\r\n const showEveryNStops = (showEveryStop) ? 1 : 1; // 3; (use clustering or show every 3 stops etc)\r\n const showStartLocation = route.TmsRouteRules?.RouteMatchingRules?.StartRouteOnDepartStartingLocation;\r\n const showEndLocation = route.TmsRouteRules?.RouteMatchingRules?.EndRouteOnArriveAtEndingLocation;\r\n let combineStartEndLocation = false;\r\n\r\n const firstVisit = route.PlannedVisits[0];\r\n const lastVisit = route.PlannedVisits[route.PlannedVisits.length - 1];\r\n\r\n if (showStartLocation\r\n && showEndLocation\r\n && this.plannedRouteVisitService.hasRouteStopLocation(firstVisit)\r\n && this.plannedRouteVisitService.hasRouteStopLocation(lastVisit)\r\n ) {\r\n combineStartEndLocation =\r\n firstVisit.RouteStopLocation.Latitude === lastVisit.RouteStopLocation.Latitude &&\r\n firstVisit.RouteStopLocation.Longitude === lastVisit.RouteStopLocation.Longitude;\r\n }\r\n\r\n route.PlannedVisits.forEach((visit, index) => {\r\n if (!visit.RouteStopLocation) {\r\n console.warn(`No RouteStopLocation for visit index: ${index}`, visit);\r\n return;\r\n }\r\n\r\n let visitPlannedInFuture = new Date(visit.PlannedArrivalTime) < new Date();\r\n\r\n const performanceStatus: VisitOnTimeStatus = this.plannedRouteService.getArrivalVisitOnTimeStatus(visit);\r\n const statusColor = (visitPlannedInFuture) ? this.getColorUsingStatus(performanceStatus, bypassStatus) : this.darkColor;\r\n\r\n const actualArrivalTimeSpanString = (visit.ActualArrivalTime)\r\n ? ` (${this.veriDate.convertMomentToTimespan(this.veriDate.createMoment(visit.ActualArrivalTime))})`\r\n : \"\";\r\n const isFirstOrLastMarker = index === 0 || index === route.PlannedVisits.length - 1;\r\n\r\n let label = null;\r\n let icon = null;\r\n let color = this.greyColor;\r\n\r\n // first marker\r\n if (index === 0) {\r\n if (combineStartEndLocation) {\r\n label = this.createAddressMarkerForVisit(visit);\r\n\r\n } else if (showStartLocation) {\r\n label = this.createAddressMarkerForVisit(visit);\r\n\r\n } else {\r\n label = `${index}` + actualArrivalTimeSpanString;\r\n }\r\n\r\n icon = (showStartLocation)\r\n ? \"home_filled\"\r\n : \"play_arrow\";\r\n\r\n color = (showStartLocation)\r\n ? this.greyColor\r\n : statusColor;\r\n\r\n // first visit with start location (first visit)\r\n } else if (showStartLocation && index === 1 && route.PlannedVisits.length > 3) {\r\n label = `${index}` + actualArrivalTimeSpanString;\r\n icon = \"play_arrow\";\r\n color = statusColor;\r\n\r\n // last marker with end location, different to start location\r\n } else if (showEndLocation && index === route.PlannedVisits.length - 1 && !combineStartEndLocation) {\r\n label = this.createAddressMarkerForVisit(visit);\r\n\r\n icon = \"flag\";\r\n color = statusColor;\r\n\r\n // only visit with start and end location (only visit)\r\n } else if (showStartLocation && showEndLocation && index === 1 && route.PlannedVisits.length === 3) {\r\n label = `${index}` + actualArrivalTimeSpanString;\r\n icon = \"place\";\r\n color = statusColor;\r\n\r\n // last visit with end location (last visit)\r\n } else if (showEndLocation && index === route.PlannedVisits.length - 2) {\r\n label = `${index}` + actualArrivalTimeSpanString;\r\n icon = \"place\";\r\n color = statusColor;\r\n\r\n // last marker without end location (last visit)\r\n } else if (!showEndLocation && index === route.PlannedVisits.length - 1) {\r\n label = `${index}` + actualArrivalTimeSpanString;\r\n icon = \"flag\";\r\n color = statusColor;\r\n\r\n // any stop\r\n } else if (index % showEveryNStops === 0) {\r\n label = `${index}` + actualArrivalTimeSpanString;\r\n icon = \"place\";\r\n color = statusColor;\r\n }\r\n\r\n const pipSize = (isFirstOrLastMarker) ? 16 : 12;\r\n\r\n existingMarkers.push({\r\n id: existingMarkers.length,\r\n options: this.createPipMarkerOptions(visit, null, this.darkColor, pipSize)\r\n });\r\n\r\n if (!label) {\r\n return;\r\n }\r\n\r\n let anchorBottom = !!route.PlannedVisits.find((plannedVisit, plannedVisitIndex) => {\r\n return plannedVisit.Id !== visit.Id\r\n && plannedVisitIndex > index\r\n && plannedVisit.RouteStopLocation\r\n && plannedVisit.RouteStopLocation.Latitude === visit.RouteStopLocation.Latitude\r\n && plannedVisit.RouteStopLocation.Longitude === visit.RouteStopLocation.Longitude\r\n });\r\n\r\n existingMarkers.push(this.createMapMarker(visit, null, {\r\n label: label,\r\n subIcon: icon,\r\n showLabel: true,\r\n colour: color,\r\n anchorPosition: (anchorBottom) ? MarkerAnchorPosition.Bottom : MarkerAnchorPosition.Top\r\n }));\r\n });\r\n }\r\n\r\n private getColorUsingStatus(status: VisitOnTimeStatus, bypassStatus: boolean = false): string {\r\n if (bypassStatus) {\r\n return this.darkColor;\r\n }\r\n\r\n switch (status) {\r\n case VisitOnTimeStatus.Early: return this.greenColor;\r\n case VisitOnTimeStatus.OnTime: return this.greenColor;\r\n case VisitOnTimeStatus.Late: return this.orangeColor;\r\n case VisitOnTimeStatus.Missed: return this.redColor;\r\n }\r\n }\r\n\r\n private createMapMarker(visit: IPlannedRouteVisit, unplannedStop: IUnplannedStop, options: ICreateEventMarkerOptions): IGoogleMapsMarker {\r\n if (!visit && !unplannedStop) {\r\n return null;\r\n }\r\n\r\n if (visit && (visit.RouteStopLocation.GeofenceType == GeofenceType.Polygon || (visit.RouteStopLocation.Latitude == 0 && visit.RouteStopLocation.Longitude == 0))) {\r\n this.geofenceService.setPolygonGeofenceVisualCenter(visit.RouteStopLocation);\r\n }\r\n\r\n options.position = {\r\n lat: (visit) ? visit.RouteStopLocation.Latitude : unplannedStop.Latitude,\r\n lng: (visit) ? visit.RouteStopLocation.Longitude : unplannedStop.Longitude\r\n };\r\n\r\n return {\r\n id: Math.floor(Math.random() * 1000) + 1,\r\n options: this.googleMarkerService.createEventMarkerOptions(options)\r\n };\r\n }\r\n\r\n private createPipMarkerOptions(visit: IPlannedRouteVisit, unplannedStop: IUnplannedStop, color: string, size: number = 16): IGoogleMapsMarkerOptions {\r\n if (!visit && !unplannedStop) {\r\n return null;\r\n }\r\n\r\n let options: IGoogleMapsMarkerOptions = {\r\n isPip: true\r\n };\r\n\r\n const icon: google.maps.Icon = {\r\n url: this.veriMarkerService.generateColorPip(color, size),\r\n scaledSize: new google.maps.Size(size, size),\r\n anchor: new google.maps.Point(size / 2, size / 2),\r\n }\r\n\r\n options = {\r\n icon: icon,\r\n zIndex: 0,\r\n position: {\r\n lat: (visit) ? visit.RouteStopLocation.Latitude : unplannedStop.Latitude,\r\n lng: (visit) ? visit.RouteStopLocation.Longitude : unplannedStop.Longitude\r\n }\r\n };\r\n\r\n return options;\r\n }\r\n\r\n private createAddressMarkerForVisit(visit: IPlannedRouteVisit): string {\r\n if (!visit) {\r\n return `Unknown`;\r\n }\r\n\r\n let friendlyMarkerString: string = null;\r\n\r\n if (visit.Name && visit.Address) {\r\n friendlyMarkerString = `${visit.Name}, ${visit.Address}`;\r\n }\r\n\r\n if (!friendlyMarkerString && visit.Geofence) {\r\n friendlyMarkerString = `${visit.Geofence.Description}`;\r\n\r\n if (visit.Geofence.Addr1) {\r\n friendlyMarkerString += `, ${visit.Geofence.Addr1}`\r\n }\r\n }\r\n\r\n return friendlyMarkerString;\r\n }\r\n\r\n}\r\n","import { IUser } from \"@interfaces/IUser\";\r\nimport { CacheService } from \"@services/cache.Service\";\r\nimport { UsersService } from \"@services/users.service\";\r\nimport { IPlannedRouteNote } from \"@tms/_models/IPlannedRouteNote\";\r\n\r\nexport class PlannedRouteNoteService {\r\n\r\n plannedRouteNoteServiceCache = 'plannedRouteNoteServiceCache';\r\n\r\n static $inject = [\"$http\", \"$q\", \"cacheService\", \"usersService\"];\r\n\r\n constructor(\r\n private readonly $http: angular.IHttpService,\r\n private readonly $q: angular.IQService,\r\n private readonly cacheService: CacheService,\r\n private readonly usersService: UsersService,\r\n ) {\r\n this.cacheService.createCache(this.plannedRouteNoteServiceCache, { maxAge: 5 * 60 * 1000 });\r\n }\r\n\r\n getNotesForPlannedRoutes(start: moment.Moment, end: moment.Moment, invalidateCache = false, unsafe=false): angular.IPromise {\r\n return this.cacheService.getOrRetrieveData(this.plannedRouteNoteServiceCache, () => this.getNotesForPlannedRoutesFromDatabase(start, end), invalidateCache, unsafe);\r\n }\r\n\r\n getNotesForPlannedRoutesFromDatabase(start: moment.Moment, end: moment.Moment): angular.IPromise {\r\n const notesPromise = this\r\n .$http({\r\n url: `/api/tms/notes/plannedroutes?start=${start.toISOString()}&end=${end.toISOString()}`,\r\n method: \"GET\"\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n\r\n const usersPromise = this.usersService.getUsers({ includeAdmins: true });\r\n\r\n return this.$q\r\n .all([notesPromise, usersPromise])\r\n .then(([notes, users]) => {\r\n this.mapUsersToNotes(notes, users);\r\n return notes;\r\n });\r\n }\r\n\r\n getNotesForPlannedRoute(routeId: number): angular.IPromise {\r\n const notesPromise = this\r\n .$http({\r\n url: `/api/tms/notes/${routeId}`,\r\n method: \"GET\"\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n\r\n const usersPromise = this.usersService.getUsers({ includeAdmins: true });\r\n\r\n return this.$q\r\n .all([notesPromise, usersPromise])\r\n .then(([notes, users]) => {\r\n this.mapUsersToNotes(notes, users);\r\n return notes;\r\n });\r\n }\r\n\r\n addPlannedRouteNotes(routeId: number, note: IPlannedRouteNote) {\r\n return this\r\n .$http({\r\n url: `/api/tms/notes/${routeId}`,\r\n method: \"POST\",\r\n data: note\r\n })\r\n .then(response => {\r\n return response.data;\r\n });\r\n }\r\n\r\n private mapUsersToNotes(notes: IPlannedRouteNote[], users: IUser[]) {\r\n if (!notes) {\r\n return;\r\n }\r\n notes.forEach(note => {\r\n if (!note.UserId) {\r\n note.author = 'SYSTEM';\r\n return;\r\n }\r\n const noteUser = users.find(u => {\r\n return u.Id === note.UserId;\r\n });\r\n if (noteUser) {\r\n note.user = noteUser;\r\n note.author = noteUser.AccountUserMappings[0]?.Name || 'Unknown User';\r\n return;\r\n }\r\n });\r\n }\r\n\r\n}\r\n","import { IGoogleMapsMarkerOptions } from \"@interfaces/IGoogleMapsMarkerOptions\";\r\nimport { GoogleService } from \"@services/google.service\";\r\nimport { GoogleMarkerService } from \"@services/googleMarker.service\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport { IGeoArea } from \"@tms/_models/IGeoArea\";\r\nimport { IPlannedRouteVisit } from \"@tms/_models/IPlannedRouteVisit\";\r\nimport { GeofenceService } from \"@services/geofence.service\";\r\nimport { GeofenceType } from \"@enums/GeofenceType\";\r\n\r\nexport class PlannedRouteVisitService {\r\n\r\n static $inject = [\"$http\", \"$q\", \"veriDate\", \"googleService\", \"googleMarkerService\", \"geofenceService\"];\r\n\r\n constructor(\r\n private readonly $http: angular.IHttpService,\r\n private readonly $q: angular.IQService,\r\n private readonly veriDate: VeriDate,\r\n private readonly googleService: GoogleService,\r\n private readonly googleMarkerService: GoogleMarkerService,\r\n private readonly geofenceService: GeofenceService\r\n ) {\r\n }\r\n\r\n updateDirectionsForVisits(visits: IPlannedRouteVisit[], updateTravelDistance: boolean = true, updateLinePoints: boolean = false, saveData: boolean = true) {\r\n const promises: angular.IPromise[] = [];\r\n if (visits.length <= 1) {\r\n return this.$q.resolve(visits);\r\n }\r\n\r\n visits.forEach((visit, index) => {\r\n const lastVisit = visits[index - 1];\r\n if (!lastVisit) {\r\n promises.push(this.$q.resolve(visit));\r\n return;\r\n }\r\n\r\n if ((updateTravelDistance && !visit.TravelDistanceMetres) || (updateLinePoints && (!visit.LinePoints || visit.LinePoints.length === 2))) {\r\n const promise = this.updateDirectionsForVisit(lastVisit, visit, saveData);\r\n promises.push(promise);\r\n } else {\r\n promises.push(this.$q.resolve(visit));\r\n }\r\n });\r\n\r\n return this.$q.all(promises).then(visits => {\r\n return visits;\r\n });\r\n }\r\n\r\n updatePlannedRouteVisit(plannedRouteVisit: IPlannedRouteVisit): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/tms/visits`,\r\n method: \"POST\",\r\n data: plannedRouteVisit\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n calculateTotalDistanceKm(visits: IPlannedRouteVisit[]): { planned: number, actual: number } {\r\n let plannedDistanceAccKm: number = 0;\r\n let actualDistanceAccKm: number = 0;\r\n\r\n visits.forEach(visit => {\r\n plannedDistanceAccKm += visit.TravelDistanceMetres / 1000;\r\n actualDistanceAccKm += visit.ActualDistanceTraveled / 1000;\r\n });\r\n\r\n return { planned: plannedDistanceAccKm, actual: actualDistanceAccKm };\r\n }\r\n\r\n updateDirectionsForVisit(currentVisit: IPlannedRouteVisit, nextVisit: IPlannedRouteVisit, updateVisit: boolean = true): angular.IPromise {\r\n return this.getRouteBetweenVisitLocations(currentVisit, nextVisit)\r\n .then((route) => {\r\n\r\n if (!route) {\r\n return nextVisit;\r\n }\r\n\r\n const leg = route.legs[0];\r\n\r\n if (!nextVisit.TravelTime) {\r\n const travelTime = leg.duration.value ? (leg.duration.value / 60) : 0;\r\n\r\n nextVisit.TravelTime = this.veriDate.convertMinsToTimeSpan(travelTime);\r\n nextVisit.travelTimeMins = travelTime;\r\n }\r\n\r\n if (!nextVisit.TravelDistanceMetres) {\r\n nextVisit.TravelDistanceMetres = leg.distance.value;\r\n }\r\n\r\n if (!nextVisit.LinePoints || nextVisit.LinePoints.length <= 2) {\r\n nextVisit.LinePoints = this.googleStepToLatLongArray(leg);\r\n }\r\n\r\n if (updateVisit) {\r\n this.updatePlannedRouteVisit(nextVisit);\r\n }\r\n\r\n return nextVisit;\r\n })\r\n .catch(error => {\r\n console.error(error);\r\n return nextVisit;\r\n });\r\n }\r\n\r\n createRouteMarkerOptions(visit: IPlannedRouteVisit, index: number, max: number): IGoogleMapsMarkerOptions {\r\n\r\n let icon = \"---\";\r\n\r\n let iconValueSet = false;\r\n\r\n let markerType = \"marker-event-pause\";\r\n\r\n let label = visit.displayLabel;\r\n\r\n if (index === 0) {\r\n icon = \"play_arrow\";\r\n label = `Start: ${label}`;\r\n markerType = \"marker-event-start\";\r\n iconValueSet = true;\r\n }\r\n else if (index === max - 1) {\r\n icon = \"stop\"; //flag\r\n label = `End: ${label}`;\r\n markerType = \"marker-event-end\";\r\n iconValueSet = true;\r\n }\r\n\r\n const options = this.googleMarkerService.createEventMarkerOptions({ label: label, markerClass: markerType, subIcon: icon, showLabel: true });\r\n\r\n if (!iconValueSet) {\r\n options.labelContent = options.labelContent.replace(`${icon}`, `${index}`);\r\n }\r\n\r\n options.visible = true;\r\n options.draggable = false;\r\n\r\n return options;\r\n }\r\n\r\n createUnplannedStopMarkerOptions(index: number): IGoogleMapsMarkerOptions {\r\n const options = this.googleMarkerService.createEventMarkerOptions({ label: \"UnplannedStop\", markerClass: \"marker-event-end\", subIcon: \"flag\", showLabel: true });\r\n\r\n //options.labelContent = options.labelContent.replace(`flag`, `${index}`);\r\n\r\n options.visible = true;\r\n options.draggable = false;\r\n\r\n return options;\r\n }\r\n\r\n updateOnSiteTimeMins(visit: IPlannedRouteVisit): void {\r\n if (!visit.OnSiteTime) {\r\n visit.OnSiteTime = \"00:00:00\";\r\n }\r\n \r\n visit.onSiteTimeMins = this.veriDate.convertTimeSpanToMins(visit.OnSiteTime);\r\n }\r\n\r\n updateTimeProperties(visit: IPlannedRouteVisit): void {\r\n this.updateTravelTimeMins(visit);\r\n this.updatePlannedArrivalTimeSpan(visit);\r\n this.updatePlannedDepartureTimeSpan(visit);\r\n this.updateOnSiteTimeMins(visit);\r\n }\r\n\r\n updateTravelTimeMins(visit: IPlannedRouteVisit): void {\r\n if (!visit?.TravelTime) {\r\n return;\r\n }\r\n\r\n visit.travelTimeMins = this.veriDate.convertTimeSpanToMins(visit.TravelTime);\r\n }\r\n\r\n updatePlannedArrivalTimeSpan(visit: IPlannedRouteVisit): void {\r\n if (!visit?.PlannedArrivalTime) {\r\n return;\r\n }\r\n\r\n const plannedArrivalTimeMoD = this.veriDate.getMinuteOfDayFromDate(new Date(visit.PlannedArrivalTime));\r\n visit.plannedArrivalTimeSpan = this.veriDate.convertMinsToTimeSpan(plannedArrivalTimeMoD);\r\n }\r\n\r\n updatePlannedDepartureTimeSpan(visit: IPlannedRouteVisit): void {\r\n if (!visit?.PlannedDepartureTime) {\r\n return;\r\n }\r\n\r\n const plannedDepartureTimeMoD = this.veriDate.getMinuteOfDayFromDate(new Date(visit.PlannedDepartureTime));\r\n visit.plannedDepartureTimeSpan = this.veriDate.convertMinsToTimeSpan(plannedDepartureTimeMoD);\r\n }\r\n\r\n hasRouteStopLocation(visit: IPlannedRouteVisit): boolean {\r\n if (!visit?.RouteStopLocation) {\r\n return false;\r\n }\r\n\r\n return !!visit.RouteStopLocation.Latitude && !!visit.RouteStopLocation.Longitude;\r\n }\r\n\r\n getLatLngsForVisit(visit: IPlannedRouteVisit): google.maps.LatLng {\r\n let latLng: google.maps.LatLng;\r\n\r\n if (visit.RouteStopLocation || visit.RouteStopLocationJson) {\r\n\r\n if (!visit.RouteStopLocation && visit.RouteStopLocationJson) {\r\n visit.RouteStopLocation = JSON.parse(visit.RouteStopLocationJson) as IGeoArea;\r\n }\r\n\r\n if (visit.RouteStopLocation.GeofenceType == GeofenceType.Polygon || (visit.RouteStopLocation.Latitude == 0 && visit.RouteStopLocation.Longitude == 0)) {\r\n this.geofenceService.setPolygonGeofenceVisualCenter(visit.RouteStopLocation);\r\n }\r\n\r\n latLng = new google.maps.LatLng({\r\n lat: visit.RouteStopLocation.Latitude,\r\n lng: visit.RouteStopLocation.Longitude\r\n });\r\n }\r\n\r\n return latLng;\r\n }\r\n\r\n private getRouteBetweenVisitLocations(startLocation, endLocation): angular.IPromise {\r\n if (!startLocation || !endLocation) {\r\n return this.$q.resolve(null);\r\n }\r\n\r\n const latLngFrom = this.getLatLngsForVisit(startLocation);\r\n const latLngTo = this.getLatLngsForVisit(endLocation);\r\n\r\n if (!latLngFrom || !latLngTo) {\r\n return this.$q.resolve(null);\r\n }\r\n\r\n return this.googleService.getDirections(latLngFrom, latLngTo).then((response) => {\r\n return response.routes[0];\r\n });\r\n }\r\n\r\n\r\n private googleStepToLatLongArray(leg: google.maps.DirectionsLeg): number[][] {\r\n var latLongs: number[][] = [];\r\n leg.steps.forEach(step => {\r\n step.path?.forEach(p => {\r\n latLongs.push([p.lat(), p.lng()]);\r\n });\r\n });\r\n\r\n return latLongs;\r\n }\r\n}\r\n","export enum VisitMatchOptions {\r\n None = 0,\r\n OnLocation = 1,\r\n OnJourney = 2,\r\n OnJob = 4,\r\n OnDwell = 8\r\n}\r\n","import { Component, EventEmitter, Input, OnInit, Output } from \"@angular/core\";\r\nimport { IComboBox } from \"@interfaces/IComboBox\";\r\nimport \"./close-route-reason.component.scss\";\r\nimport { PlannedRouteClosureReason } from \"../../_enums/PlannedRouteClosureReason\";\r\n\r\n@Component({\r\n selector: \"close-route-reasons\",\r\n template: require(\"./close-route-reason.component.html\")\r\n})\r\nexport class CloseRouteReasonComponent implements OnInit {\r\n\r\n @Input() plannedRouteClosureReason: PlannedRouteClosureReason = null;\r\n @Output() optionChanged = new EventEmitter(); // Create an EventEmitter\r\n closureReasonOptions: IComboBox[] = [];\r\n\r\n ngOnInit(): void {\r\n for (const key in PlannedRouteClosureReason) {\r\n if (isNaN(Number(key))) {\r\n this.closureReasonOptions.push({ Name: key, Value: '' });\r\n }\r\n }\r\n }\r\n\r\n emitPlannedRouteClosureReason(value) {\r\n this.plannedRouteClosureReason = value;\r\n this.optionChanged.emit(this.plannedRouteClosureReason);\r\n }\r\n}\r\n","import { Component, OnDestroy, OnInit } from \"@angular/core\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { IAggregateFilterEvent, IFilterBarTab } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { DriverSummaryPanelComponent } from \"@app/directives/_vehicle/driverSummaryPanel/driverSummaryPanel.component\";\r\nimport { DateRange } from \"@app/enum/DateRange.enum\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { DateUnit } from \"@app/services/date.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { lastValueFrom, Subscription } from \"rxjs\";\r\nimport { TmsModuleNavigation } from \"../../tms.navigation\";\r\nimport { RoutePerformanceBarComponent } from \"../../_components/route-performance-bar/route-performance-bar.component\";\r\nimport { RouteStatus } from \"../../_enums/RouteStatus\";\r\nimport { RouteVisitStatus } from \"../../_enums/RouteVisitStatus\";\r\nimport { IPlannedRouteOptions } from \"../../_models/IPlannedRouteOptions\";\r\nimport { IPlannedRouteDetail, PlannedRouteService } from \"../../_services/planned-route.service\";\r\nimport { PlannedRouteService2 } from \"../../_services/planned-route.service2\";\r\nimport { ActiveRouteProgressComponent } from \"../activeRoutes/active-route-progress/active-route-progress.component\";\r\nimport './tms-history.component.scss';\r\n\r\n@Component({\r\n selector: \"tms-history\",\r\n template: require(\"./tms-history.component.html\"),\r\n})\r\nexport class TmsHistoryComponent implements OnInit, OnDestroy {\r\n\r\n defaultDateRange = DateRange.Last7Days;\r\n filterEvent: IAggregateFilterEvent;\r\n plannedRoutes: IPlannedRouteDetail[] = [];\r\n selectedRoute: IPlannedRouteDetail;\r\n filterTabs: IFilterBarTab[] = [];\r\n loading = true;\r\n SortType = SortType;\r\n exportTitle = this.translationService.t(\"Tms.TmsHistory\");\r\n DateUnit = DateUnit;\r\n plannedRoutesSubscription: Subscription;\r\n\r\n //// #Tables\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n constructor(\r\n private readonly plannedRouteService: PlannedRouteService,\r\n private readonly plannedRouteService2: PlannedRouteService2,\r\n private readonly translationService: TranslationService,\r\n private readonly vTableService: VTableService\r\n ) {\r\n this.createTabs();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.plannedRoutesSubscription = this.plannedRouteService2.plannedRoutesSubject.subscribe((routes) => {\r\n this.plannedRoutes = routes;\r\n this.createTabs();\r\n this.createTable();\r\n this.tableRows = this.vTableService.createTableRows(this.plannedRoutes, this.tableColumns);\r\n \r\n this.loading = false;\r\n });\r\n }\r\n\r\n onFilterChanged(event: IAggregateFilterEvent): void {\r\n if (!event.trigger) {\r\n return;\r\n }\r\n this.filterEvent = event;\r\n\r\n if (this.filterEvent.trigger == \"date\") {\r\n this.requestData(true);\r\n }\r\n }\r\n\r\n selectedRouteChanged(route: IPlannedRouteDetail): void {\r\n this.selectedRoute = route;\r\n this.plannedRouteService.openRouteDetailsDialog(route, TmsModuleNavigation.History);\r\n this.selectedRoute = null;\r\n }\r\n\r\n async requestData(invalidateCache = false): Promise {\r\n this.loading = true;\r\n this.plannedRoutes = [];\r\n\r\n const options: IPlannedRouteOptions = {\r\n mapDrivers: true,\r\n mapVehicles: true,\r\n updateDistance: false,\r\n invalidateCache: invalidateCache,\r\n customTimes: true,\r\n routeDuration: true,\r\n routeDisplayName: true,\r\n startedRoutesOnly: true,\r\n routeDisplayStatus: true\r\n };\r\n\r\n await lastValueFrom(this.plannedRouteService2.requestPlannedRoutes(this.filterEvent.date[0], this.filterEvent.date[1], options));\r\n }\r\n\r\n private createTable() {\r\n\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'TmsHistory.Completed', sortType: SortType.Number, width: 120 }),\r\n createCellFunction: (plannedRoute) => this.vTableService.createTableCell(plannedRoute, { exportData: `${this.routeProgressExportData(plannedRoute)}%`, sortData: this.routeProgressExportData(plannedRoute), component: ActiveRouteProgressComponent, componentInputs: { route: plannedRoute } }),\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: 'TmsHistory.Start', sorted: true, sortDirection: SortDirection.Descending }),\r\n createCellFunction: (plannedRoute) => this.vTableService.createDateCell(plannedRoute.PlannedStartTime),\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: 'TmsHistory.End', minTableWidth: 1400 }),\r\n createCellFunction: (plannedRoute) => this.vTableService.createDateCell(plannedRoute.PlannedEndTime),\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'TmsHistory.Duration', minTableWidth: 1400, sortType: SortType.Number }),\r\n createCellFunction: (plannedRoute) => this.vTableService.createDurationCell(plannedRoute.totalDurationMins, DateUnit.Min),\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'TmsHistory.Route' }),\r\n createCellFunction: (plannedRoute) => this.vTableService.createTableCell(plannedRoute.routeDisplayName),\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'TmsHistory.DriverVehicle' }),\r\n createCellFunction: (plannedRoute) => this.vTableService.createTableCell(plannedRoute, { exportData: this.routeVehicleDriverExportData(plannedRoute), sortData: this.routeVehicleDriverExportData(plannedRoute), component: DriverSummaryPanelComponent, componentInputs: { driver: plannedRoute.driver, vehicle: plannedRoute.vehicle, compactView: true, showTacho: false } }),\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'TmsHistory.ScheduleAdherence', width: 250, sortable: false, excludeFromExport: true }),\r\n createCellFunction: (plannedRoute) => this.vTableService.createTableCell(plannedRoute, { component: RoutePerformanceBarComponent, componentInputs: { route: plannedRoute } }),\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'TmsHistory.Visits', minTableWidth: 1000, width: 80, sortType: SortType.Number }),\r\n createCellFunction: (plannedRoute) => this.vTableService.createTableCell(this.routeVisitCountData(plannedRoute), { sortData: plannedRoute?.allVisits?.length || 0 }),\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'TmsHistory.Status', width: 130, minTableWidth: 900 }),\r\n createCellFunction: (plannedRoute) => this.vTableService.createEnumCell(RouteStatus, \"RouteStatus\", plannedRoute.Status)\r\n }\r\n ];\r\n }\r\n\r\n routeVehicleDriverExportData(plannedRoute: IPlannedRouteDetail): string {\r\n let displayNameLabel = (!plannedRoute.driver?.DisplayName)\r\n ? this.translationService.t(\"Tms.NoDriver\")\r\n : plannedRoute.driver.DisplayName;\r\n\r\n let vehicleRegLabel = (!plannedRoute.vehicle?.Reg)\r\n ? this.translationService.t(\"Tms.NA\")\r\n : plannedRoute.vehicle.Reg;\r\n\r\n return `${vehicleRegLabel} ${displayNameLabel}`;\r\n }\r\n\r\n routeProgressExportData(plannedRoute: IPlannedRouteDetail): number {\r\n if (!plannedRoute?.PlannedVisits) {\r\n return 0;\r\n }\r\n\r\n // Note, this should probably use ETA or distance to show how far through we are\r\n var progress = 0;\r\n\r\n const numCompletedVisits = plannedRoute.PlannedVisits.filter(v => v.Status == RouteVisitStatus.Arrived || v.Status == RouteVisitStatus.Departed).length;\r\n progress = Math.round(numCompletedVisits * 100 / plannedRoute.PlannedVisits.length);\r\n\r\n return progress;\r\n }\r\n\r\n routeVisitCountData(plannedRoute: IPlannedRouteDetail): string {\r\n\r\n const visitCount = plannedRoute.allVisits?.length || 0;\r\n\r\n if (!plannedRoute.unplannedVisits?.length) {\r\n return visitCount.toString();\r\n }\r\n\r\n return `${visitCount} (${plannedRoute.unplannedVisits.length} ${this.translationService.t(\"Tms.Unplanned\")})`;\r\n }\r\n\r\n private createTabs(): void {\r\n this.filterTabs = [];\r\n\r\n this.filterTabs.push({ title: this.translationService.t(\"Common.All\"), predicate: () => true });\r\n this.filterTabs.push({ title: this.translationService.t(\"Tms.Completed\"), predicate: x => x.Status == RouteStatus.Completed || x.Status == RouteStatus.Incomplete || x.Status == RouteStatus.CompletedWithMissing });\r\n this.filterTabs.push({ title: this.translationService.t(\"Tms.Incomplete\"), predicate: x => x.Status == RouteStatus.Incomplete || x.Status == RouteStatus.CompletedWithMissing });\r\n this.filterTabs.push({ title: this.translationService.t(\"Tms.Planned\"), predicate: x => x.Status == RouteStatus.Planned });\r\n this.filterTabs.push({ title: this.translationService.t(\"Tms.Expired\"), predicate: x => x.Status == RouteStatus.Expired || x.Status == RouteStatus.UserExpired });\r\n this.filterTabs.push({ title: this.translationService.t(\"Tms.Closed\"), predicate: x => x.Status == RouteStatus.Closed });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.plannedRoutesSubscription?.unsubscribe();\r\n }\r\n}\r\n","module.exports = \"\";","module.exports = \" \";","\r\nimport { DateService } from \"@app/services/date.service\";\r\nimport { UnitStatus } from \"@enums/UnitStatus\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { IGroup } from \"@interfaces/IVehicleGroup\";\r\nimport { ConstantsService } from \"@services/constantsService\";\r\nimport { MapService } from \"@services/map.service\";\r\nimport { SessionService } from \"@services/session.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport * as angular from \"angular\";\r\nimport { copy } from \"angular\";\r\nimport \"./vehicleList.scss\";\r\n\r\nexport interface IViewOptions {\r\n\r\n orderBy: LiveMapOrderByOptions;\r\n groupBy: string;\r\n //viewBy: string;\r\n reverse: boolean;\r\n\r\n orderByOptions: { name: string, value: LiveMapOrderByOptions }[];\r\n}\r\n\r\nexport class LiveMapOrderByOptions {\r\n\r\n // ReSharper disable InconsistentNaming\r\n\r\n static get ID(): string { return \"ID\"; }\r\n static get Reg(): string { return \"Reg\"; }\r\n static get DriverName(): string { return \"Driver.Name\"; }\r\n static get Make(): string { return \"Make\"; }\r\n static get Speed(): string { return \"-Plot.Velocity\"; }\r\n static get Distance(): string { return \"Distance\"; }\r\n static get LastUpdated(): string { return \"-Plot.Utc\"; }\r\n\r\n // ReSharper restore InconsistentNaming\r\n}\r\n\r\ninterface IVehicleListBindings {\r\n vehicles: IVehicle[];\r\n selectedVehicle: IVehicle;\r\n nearestToCenter: any; // this is any rather than google.maps.latlng to prevent runtime errors\r\n loading: boolean;\r\n\r\n hideSort: boolean;\r\n\r\n vehiclesFiltered: (vehicles: { $vehicles: IVehicle[] }) => void;\r\n vehicleClicked: (vehicle: { $vehicle: IVehicle }) => void;\r\n vehicleOrderbyChanged: (sort: { $orderBy: LiveMapOrderByOptions }) => void;\r\n}\r\n\r\ninterface IVehicleListFilterOptions {\r\n vehicleWildcard?: string;\r\n group?: IGroup;\r\n}\r\n\r\nclass VehicleListComponentController implements angular.IComponentController, IVehicleListBindings {\r\n\r\n loadedVehicles = false;\r\n loading: boolean;\r\n\r\n vehicles: IVehicle[];\r\n selectedVehicle: IVehicle;\r\n nearestToCenter: google.maps.LatLng;\r\n\r\n hideSort: boolean;\r\n\r\n vehiclesDisplay: IVehicle[];\r\n\r\n filter: IVehicleListFilterOptions;\r\n showVehicleSortOptions = false;\r\n viewOptions: IViewOptions;\r\n showMilesAway = false;\r\n //vehicleGroups: IGroup[];\r\n\r\n selectedVehicleIndex = 0;\r\n unitStatus = UnitStatus;\r\n\r\n dontScrollListOnNextUpdate = false;\r\n\r\n vehicleClicked: (vehicle: { $vehicle: IVehicle }) => void;\r\n vehicleDoubleClicked: (vehicle: { $vehicle: IVehicle }) => void;\r\n vehiclesFiltered: (vehicles: { $vehicles: IVehicle[] }) => void;\r\n vehicleOrderbyChanged: (sort: { $orderBy: LiveMapOrderByOptions }) => void;\r\n\r\n vehicleClickTimeout: angular.IPromise;\r\n isMobile: boolean;\r\n\r\n static $inject = [\"$scope\", \"$timeout\", \"$filter\", \"dateService\", \"sessionService\", \"vehicleService\", \"mapService\", \"constantsService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly $scope: angular.IScope,\r\n private readonly $timeout: angular.ITimeoutService,\r\n private readonly $filter: angular.IFilterService,\r\n private readonly dateService: DateService,\r\n private readonly sessionService: SessionService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly mapService: MapService,\r\n private readonly constantsService: ConstantsService,\r\n private readonly translationService: TranslationService) {\r\n\r\n this.isMobile = this.constantsService.getIsMobile();\r\n\r\n this.filter = {\r\n vehicleWildcard: \"\"\r\n };\r\n\r\n this.viewOptions = {\r\n orderBy: LiveMapOrderByOptions.Reg,\r\n groupBy: \"\",\r\n reverse: false,\r\n orderByOptions: []\r\n };\r\n\r\n this.viewOptions.orderByOptions.push({ name: this.translationService.t(\"vehicleList.orderByOptions.reg\"), value: LiveMapOrderByOptions.Reg });\r\n this.viewOptions.orderByOptions.push({ name: this.translationService.t(\"vehicleList.orderByOptions.driverName\"), value: LiveMapOrderByOptions.DriverName });\r\n //optionsList.push(new LiveMap.Model.OrderByOptionsModel(\"Make\", LiveMapOrderByOptions.Make));\r\n this.viewOptions.orderByOptions.push({ name: this.translationService.t(\"vehicleList.orderByOptions.speed\"), value: LiveMapOrderByOptions.Speed });\r\n this.viewOptions.orderByOptions.push({ name: this.translationService.t(\"vehicleList.orderByOptions.nearestTo\"), value: LiveMapOrderByOptions.Distance });\r\n this.viewOptions.orderByOptions.push({ name: this.translationService.t(\"vehicleList.orderByOptions.lastUpdated\"), value: LiveMapOrderByOptions.LastUpdated });\r\n\r\n }\r\n\r\n $onInit(): void {\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n //(this.$scope as any).$suspend();\r\n\r\n if (onChangesObj[\"vehicles\"]) {\r\n if (this.vehicles != null) {\r\n this.loadedVehicles = true;\r\n this.filterDisplayVehicles();\r\n\r\n if (/*this.vehicles.length > 0 ||*/ !onChangesObj[\"vehicles\"].isFirstChange()) {\r\n //if (this.vehicles != null && this.vehicles.length !== 0) {\r\n //this.populateVehicleGroups();\r\n //}\r\n }\r\n }\r\n }\r\n\r\n if (onChangesObj[\"selectedVehicle\"] && !onChangesObj[\"selectedVehicle\"].isFirstChange()) {\r\n\r\n if (!this.dontScrollListOnNextUpdate) {\r\n const previousValue = onChangesObj[\"selectedVehicle\"].previousValue as IVehicle;\r\n const currentValue = onChangesObj[\"selectedVehicle\"].currentValue as IVehicle;\r\n\r\n if (previousValue == null || currentValue == null || (previousValue.Id !== currentValue.Id)) {\r\n this.selectedVehicleIndex = this.vehiclesDisplay.indexOf(this.selectedVehicle);\r\n }\r\n }\r\n\r\n this.dontScrollListOnNextUpdate = false;\r\n }\r\n\r\n if (onChangesObj[\"nearestToCenter\"] && !onChangesObj[\"nearestToCenter\"].isFirstChange()) {\r\n this.calculateVehicleDistancesFromPoint();\r\n }\r\n }\r\n\r\n orderByChanged(): void {\r\n this.calculateVehicleDistancesFromPoint();\r\n this.sortDisplayVehicles();\r\n\r\n this.showMilesAway = (this.viewOptions.orderBy === LiveMapOrderByOptions.Distance);\r\n\r\n if (this.vehicleOrderbyChanged) {\r\n this.vehicleOrderbyChanged({ $orderBy: this.viewOptions.orderBy });\r\n }\r\n }\r\n\r\n toggleVehicleSortOptionsVisibility() {\r\n this.showVehicleSortOptions = !this.showVehicleSortOptions;\r\n }\r\n\r\n onGroupClicked(group: IGroup) {\r\n this.filter.group = group;\r\n this.filterDisplayVehicles();\r\n }\r\n\r\n onVehicleClicked(vehicle: IVehicle) {\r\n\r\n // Double click behaviour\r\n if (this.vehicleClickTimeout) {\r\n\r\n this.$timeout.cancel(this.vehicleClickTimeout);\r\n this.vehicleClickTimeout = null;\r\n\r\n if (this.vehicleDoubleClicked !== null) {\r\n this.dontScrollListOnNextUpdate = true;\r\n\r\n this.vehicleDoubleClicked({ $vehicle: vehicle });\r\n }\r\n\r\n return;\r\n }\r\n\r\n // Single click behaviour\r\n\r\n this.vehicleClickTimeout = this.$timeout(() => {\r\n if (this.vehicleClicked !== null) {\r\n this.dontScrollListOnNextUpdate = true;\r\n\r\n this.vehicleClicked({ $vehicle: vehicle });\r\n this.vehicleClickTimeout = null;\r\n }\r\n }, 250);\r\n }\r\n\r\n filterDisplayVehicles() {\r\n if (this.vehicles == null) {\r\n return;\r\n }\r\n\r\n this.vehiclesDisplay = this.filterVehicleList(this.vehicles, this.filter);\r\n this.sortDisplayVehicles();\r\n\r\n if (this.vehiclesFiltered != null) {\r\n this.vehiclesFiltered({ $vehicles: this.vehiclesDisplay });\r\n }\r\n\r\n this.$scope.$applyAsync();\r\n }\r\n\r\n // ------------------------------------------------------------------------------\r\n\r\n private sortDisplayVehicles() {\r\n this.vehiclesDisplay = this.$filter('orderBy')(this.vehiclesDisplay, this.viewOptions.orderBy as string, this.viewOptions.reverse);\r\n\r\n this.sortUpdatedVehicles();\r\n\r\n // Go through each trailer, pop off, then re-insert at correct order below the tractor\r\n var trailers: IVehicle[] = [];\r\n\r\n this.vehiclesDisplay.forEach(v => {\r\n if (v.tractor) {\r\n trailers.push(v);\r\n }\r\n });\r\n\r\n trailers.forEach(trailer => {\r\n var trailerIndex = this.vehiclesDisplay.indexOf(trailer);\r\n this.vehiclesDisplay.splice(trailerIndex, 1);\r\n\r\n var tractorIndex = 0;\r\n this.vehiclesDisplay.forEach((v, i) => {\r\n if (v.Id == trailer.tractor.Id) {\r\n tractorIndex = i;\r\n trailer.showTrailerHookup = true;\r\n\r\n const trailerPlotIsLatest = this.dateService.date1IsAfterDate2(trailer.Plot.Utc, trailer.tractor.Plot.Utc);\r\n\r\n if (trailerPlotIsLatest) {\r\n trailer.tractor.Plot = copy(trailer.Plot);\r\n v.Plot = copy(trailer.Plot);\r\n } else {\r\n trailer.Plot = copy(v.Plot);\r\n trailer.tractor.Plot = copy(v.Plot);\r\n }\r\n\r\n v.Plot.UtcMoment\r\n }\r\n });\r\n\r\n this.vehiclesDisplay.splice(tractorIndex + 1, 0, trailer);\r\n });\r\n }\r\n\r\n private sortUpdatedVehicles(): void {\r\n // Move vehicles that have never updated to the bottom of the list if sorting by descending date\r\n if (this.viewOptions.orderBy == LiveMapOrderByOptions.LastUpdated) {\r\n this.vehiclesDisplay = this.vehiclesDisplay.sort((a, b) => {\r\n if (!a.Plot) {\r\n return this.viewOptions.reverse ? -1 : 1;\r\n }\r\n\r\n if (!b.Plot) {\r\n return this.viewOptions.reverse ? 1 : -1;\r\n }\r\n\r\n return 0;\r\n })\r\n }\r\n }\r\n\r\n private vehicleMatchesSearchTerm(vehicle: IVehicle, searchTerm: string, preventRecursion = false): boolean {\r\n if (vehicle.Reg.toLowerCase().indexOf(searchTerm) >= 0 || vehicle.ShortReg.toLowerCase().indexOf(searchTerm) >= 0) {\r\n return true;\r\n }\r\n else if (vehicle.Driver && vehicle.Driver.Name.toLowerCase().indexOf(searchTerm) >= 0) {\r\n return true;\r\n }\r\n\r\n if (preventRecursion) {\r\n return false;\r\n }\r\n\r\n // We should show parent / child trailer associations also (so we see the complete travelling unit)\r\n if (vehicle.attachedTrailers) {\r\n for (var i = 0; i < vehicle.attachedTrailers.length; i++) {\r\n const trailer = vehicle.attachedTrailers[i];\r\n\r\n if (this.vehicleMatchesSearchTerm(trailer, searchTerm, true)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n if (vehicle.tractor) {\r\n if (this.vehicleMatchesSearchTerm(vehicle.tractor, searchTerm, true)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n private filterVehicleList(vehicles: IVehicle[], vehicleListFilterOptions: IVehicleListFilterOptions) {\r\n\r\n var filtered: IVehicle[] = [];\r\n\r\n if (!vehicleListFilterOptions || (!vehicleListFilterOptions.group && !vehicleListFilterOptions.vehicleWildcard)) {\r\n vehicles.forEach(vehicle => {\r\n\r\n if (this.vehicleService.showVehicleWithNoUnit(vehicle) && this.vehicleService.showNonFunctioningUnit(vehicle)) {\r\n filtered.push(vehicle);\r\n }\r\n });\r\n\r\n return filtered;\r\n }\r\n\r\n var lowerCaseWildCard = vehicleListFilterOptions.vehicleWildcard ? vehicleListFilterOptions.vehicleWildcard.toLowerCase() : null;\r\n\r\n vehicles.forEach(vehicle => {\r\n\r\n var wildcardHit = false;\r\n var wildcardRequired = false;\r\n\r\n var groupHit = false;\r\n var groupRequired = false;\r\n\r\n var isFunctioningUnit = false;\r\n\r\n if (lowerCaseWildCard) {\r\n wildcardRequired = true;\r\n\r\n wildcardHit = this.vehicleMatchesSearchTerm(vehicle, lowerCaseWildCard);\r\n }\r\n\r\n if (vehicleListFilterOptions.group) {\r\n groupRequired = true;\r\n\r\n // See if we are in this group\r\n if (vehicleListFilterOptions.group.VehicleIds.indexOf(vehicle.Id) >= 0) {\r\n groupHit = true;\r\n }\r\n }\r\n\r\n if (this.vehicleService.showNonFunctioningUnit(vehicle)) {\r\n isFunctioningUnit = true;\r\n }\r\n\r\n if ((!wildcardRequired || wildcardHit) && (!groupRequired || groupHit) && isFunctioningUnit) {\r\n filtered.push(vehicle);\r\n }\r\n });\r\n\r\n filtered.forEach(vehicle => {\r\n if (vehicle.tractor && !filtered.find(v => v.Id == vehicle.tractor.Id)) {\r\n vehicle.showTrailerHookup = false;\r\n }\r\n })\r\n\r\n return filtered;\r\n }\r\n\r\n private calculateVehicleDistancesFromPoint() {\r\n\r\n if (this.viewOptions.orderBy !== LiveMapOrderByOptions.Distance || !this.nearestToCenter) {\r\n return;\r\n }\r\n\r\n for (let i = 0; i < this.vehiclesDisplay.length; i++) {\r\n\r\n const vehicle = this.vehiclesDisplay[i];\r\n\r\n if (!vehicle.Plot?.markerModel?.options?.visible) {\r\n continue;\r\n }\r\n\r\n vehicle.Distance = this.mapService.getDistance(this.nearestToCenter.lat(), this.nearestToCenter.lng(), vehicle.Plot.Latitude, vehicle.Plot.Longitude);\r\n }\r\n\r\n this.sortDisplayVehicles();\r\n }\r\n}\r\n\r\nexport class VehicleListComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n\r\n constructor() {\r\n this.bindings = {\r\n vehicles: \"<\",\r\n selectedVehicle: \"<\",\r\n nearestToCenter: \"<\",\r\n hideSort: \"<\",\r\n loading: \"<\",\r\n\r\n vehicleClicked: \"&\",\r\n vehicleDoubleClicked: \"&\",\r\n vehicleOrderbyChanged: \"&\",\r\n vehiclesFiltered: \"&\"\r\n };\r\n\r\n this.controller = VehicleListComponentController;\r\n this.template = require(\"./vehicleList.html\");\r\n }\r\n}\r\n","import { IImportValidationError } from \"./IImportValidation\";\r\n\r\nexport interface IImportAdapterResult {\r\n preProcessedDataRows?: string[];\r\n originalRowCols?: IRowCol[][];\r\n errors?: IImportValidationError[]; \r\n status?: ImportPreProcessResult;\r\n}\r\n\r\nexport enum ImportPreProcessResult {\r\n Ok = 1,\r\n Error = 2\r\n}\r\n\r\nexport interface IRowCol {\r\n row: number;\r\n colFrom: number;\r\n}\r\n","import { IPlot } from \"@interfaces/IPlot\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\n\r\nexport enum ForceVector {\r\n Unknown = -1,\r\n Acceleration,\r\n Deceleration,\r\n Cornering,\r\n CorneringLeft,\r\n CorneringRight,\r\n}\r\n\r\nexport enum Severity {\r\n Information,\r\n Low,\r\n Medium,\r\n High,\r\n Critical\r\n}\r\n\r\nexport interface IAccelerometerRecord {\r\n PlotId: number;\r\n VehicleId?: number;\r\n EventTime: Date;\r\n ForceVector: ForceVector;\r\n ForceValue: number;\r\n StartingSpeed: number;\r\n Duration: number;\r\n Plot: IPlot;\r\n Vehicle: IVehicle;\r\n Severity: Severity;\r\n}\r\n\r\nexport interface IBaseQueryOptions {\r\n invalidateCache?: boolean;\r\n}\r\n\r\nexport interface IDateQueryOptions extends IBaseQueryOptions {\r\n Start?: string | Date;\r\n End?: string | Date;\r\n}\r\n\r\nexport interface IAccelerometerRecordQueryOptions extends IDateQueryOptions {\r\n PlotId?: number;\r\n VehicleId?: number;\r\n}\r\n\r\nexport class AccelerometerRecordService {\r\n\r\n static $inject = [\"$http\", \"$q\"];\r\n\r\n constructor(private readonly $http: angular.IHttpService,\r\n private readonly $q: angular.IQService) {\r\n }\r\n\r\n getEventsForFleet(queryOptions: IAccelerometerRecordQueryOptions): angular.IPromise {\r\n if (queryOptions.Start) {\r\n queryOptions.Start = new Date(queryOptions.Start).toISOString();\r\n }\r\n\r\n if (queryOptions.End) {\r\n queryOptions.End = new Date(queryOptions.End).toISOString();\r\n }\r\n return this.$http({\r\n url: `/api/accelerometer/records`,\r\n method: \"GET\",\r\n cache: true,\r\n params: queryOptions\r\n }).then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n}\r\n","import { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { PlotService } from \"@services/plot.service\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport * as angular from \"angular\";\r\nimport * as moment from \"moment\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\n\r\nexport enum TPMSTyreStatus {\r\n OK,\r\n Warning,\r\n Failure\r\n}\r\n\r\nexport enum TyreRecordEventCode {\r\n Unknown = 0,\r\n Scheduled = 1,\r\n Alert = 2\r\n}\r\n\r\nexport enum TyreSystemAlarmStatus {\r\n None = 0,\r\n UnderInflationWarning = 1,\r\n UnderInflationAlarm = 2,\r\n LeakAlarm = 3,\r\n TemperatureWarning = 4,\r\n OverTemperatureWarning = 5\r\n}\r\n\r\nexport enum TyreSystemError {\r\n None = 0,\r\n LooseOrTurned = 1,\r\n LowBattery = 2,\r\n FaultNotDefined = 3\r\n}\r\n\r\nexport enum TyreAlarmStatus {\r\n OK = 0,\r\n UnderInflationWarning = 1,\r\n UnderInflationAlarm = 2,\r\n LeakAlarm = 3,\r\n Muted = 4,\r\n TemperatureWarning = 5,\r\n OverTemperatureWarning = 8\r\n}\r\n\r\nexport enum TyrePressureThresholdStatus {\r\n NotSupported1 = 0,\r\n NotSupported2 = 1,\r\n NoWarningPressure = 2,\r\n UnderPressure = 3,\r\n ExtremeUnderPressure = 4,\r\n NotSupported3 = 5,\r\n SensorError = 6,\r\n NotAvailable = 7\r\n}\r\n\r\nexport enum TyreModuleElectricalStatus {\r\n Ok = 0,\r\n FaultNotDefined = 1,\r\n LowBattery = 2,\r\n NotSupported = 3\r\n}\r\n\r\nexport enum TyreStatus {\r\n Ok = 0,\r\n LeakDetected = 1,\r\n LooseOrTurned = 2,\r\n NotSupported = 3\r\n}\r\n\r\nexport enum TyreModuleStatus {\r\n Muted = 0,\r\n Ok = 1,\r\n NotAvailable = 2,\r\n NotSupported = 3\r\n}\r\n\r\nexport interface ITyreRecord {\r\n PlotId: number;\r\n DateTime: string;\r\n EventCode: TyreRecordEventCode;\r\n VehicleId: number;\r\n\r\n TyreRecordData: ITyreRecordData[];\r\n\r\n // ----\r\n\r\n Id: number; // Required for veriTable.selected \r\n\r\n vehicle: IVehicle;\r\n\r\n allAxles: ITPMSAxle[];\r\n tractorAxles: ITPMSAxle[];\r\n trailerAxles: ITPMSAxle[];\r\n}\r\n\r\nexport interface ITyreRecordData {\r\n\r\n Id: number;\r\n TyreRecordId: number;\r\n AxleNumber: number;\r\n AxleTyrePosition: number;\r\n PressureKPa?: number;\r\n Temperature?: number;\r\n ModuleStatus?: TyreModuleStatus;\r\n Status?: TyreStatus;\r\n ModuleElectricalStatus?: TyreModuleElectricalStatus;\r\n PressureThresholdStatus?: TyrePressureThresholdStatus;\r\n AlarmStatus?: TyreAlarmStatus;\r\n TyreSystemActive: boolean;\r\n TyreSystemError: TyreSystemError;\r\n TyreSystemAlarmStatus: TyreSystemAlarmStatus;\r\n\r\n // ---\r\n\r\n tyreRecord: ITyreRecord;\r\n}\r\n\r\nexport interface ITPMSAxle {\r\n allTyres?: ITPMSTyre[];\r\n tyresLeft?: ITPMSTyre[];\r\n tyresRight?: ITPMSTyre[];\r\n\r\n leftTyreExceptions?: ITPMSTyre[];\r\n rightTyreExceptions?: ITPMSTyre[];\r\n\r\n label?: string;\r\n\r\n isSpacer?: boolean;\r\n showDriveTrain?: boolean;\r\n}\r\n\r\nexport interface ITPMSTyre {\r\n axleNumber: number;\r\n axleTyrePosition: number;\r\n uniqueTyreRef: string;\r\n\r\n status?: TPMSTyreStatus;\r\n\r\n pressure?: number;\r\n pressurePSI: number;\r\n temp?: number;\r\n speed?: number;\r\n\r\n originalData: ITyreRecordData;\r\n}\r\n\r\nexport class TPMSService {\r\n\r\n static $inject = [\"$q\", \"$http\", \"vehicleService\", \"translationService\", \"plotService\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $http: angular.IHttpService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly translationService: TranslationService,\r\n private readonly plotService: PlotService) {\r\n }\r\n\r\n getLatestTPMSRecords(invalidateCache = false): angular.IPromise {\r\n const vehiclePromise = this.vehicleService.getVehicles({ includeLatestPlots: true, includePeripheralMappings: true });\r\n var tyreRecordPromise = this\r\n .$http({\r\n url: \"/api/tyres/latest\",\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 1, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => { return response.data });\r\n\r\n return this.$q\r\n .all([vehiclePromise, tyreRecordPromise])\r\n .then(([vehicles, tyreRecords]) => {\r\n // Everything is 16 based, 0 indexed\r\n // Tyres with AxleTyrePosition less than 7 is \"on the left\"\r\n // Tyres with AxleNumber less than 7 is tractor, above 7 is trailer\r\n\r\n // Map vehicle\r\n tyreRecords.forEach(tyreRecord => {\r\n tyreRecord.vehicle = this.vehicleService.findVehicle(vehicles, tyreRecord.VehicleId);\r\n });\r\n\r\n this.populateLayoutData(tyreRecords);\r\n\r\n return tyreRecords;\r\n });\r\n }\r\n\r\n getTPMSHistoryForVehicle(vehicleId: number, startDate: moment.Moment, endDate: moment.Moment, includeSpeedData: boolean, invalidateCache = false): angular.IPromise {\r\n\r\n var tpmsHistoryPromise = this\r\n .$http({\r\n url: `/api/tyres/${vehicleId}/?start=${startDate.utc().format()}&end=${endDate.utc().format()}`,\r\n method: \"GET\",\r\n cache: true,\r\n params: {\r\n minsToLive: 30,\r\n invalidateCache: invalidateCache\r\n }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n var tyreRecords = response.data;\r\n\r\n this.populateLayoutData(tyreRecords);\r\n\r\n return tyreRecords;\r\n });\r\n\r\n if (!includeSpeedData) {\r\n return tpmsHistoryPromise;\r\n }\r\n\r\n var speedDataPromise = this.plotService.getPlotsForDateRange(vehicleId, startDate, endDate);\r\n\r\n return this.$q\r\n .all([tpmsHistoryPromise, speedDataPromise])\r\n .then(([tyreRecords, speedData]) => {\r\n tyreRecords.forEach(tyreRecord => {\r\n tyreRecord.allAxles.forEach(axle => {\r\n if (axle.isSpacer) {\r\n return;\r\n }\r\n\r\n axle.allTyres.forEach(tyre => {\r\n const plot = this.plotService.findPlot(speedData, tyre.originalData.tyreRecord.PlotId);\r\n tyre.speed = plot.Velocity;\r\n });\r\n });\r\n });\r\n\r\n return tyreRecords;\r\n });\r\n }\r\n\r\n // -------------------\r\n\r\n private populateLayoutData(tyreRecordData: ITyreRecord[]) {\r\n tyreRecordData.forEach(tyreRecord => {\r\n tyreRecord.Id = tyreRecord.PlotId;\r\n\r\n tyreRecord.tractorAxles = [];\r\n tyreRecord.trailerAxles = [];\r\n\r\n tyreRecord.TyreRecordData.forEach(tyreRecordData => {\r\n\r\n tyreRecordData.tyreRecord = tyreRecord;\r\n\r\n var axle = this.getAxle(tyreRecord, tyreRecordData);\r\n\r\n this.populateTyreData(axle, tyreRecordData);\r\n });\r\n\r\n this.populateAllLists(tyreRecord);\r\n\r\n this.createAxleLabels(tyreRecord.tractorAxles, this.translationService.t(\"TPMS.TractorAxle\"));\r\n this.createAxleLabels(tyreRecord.trailerAxles, this.translationService.t(\"TPMS.TrailerAxle\"));\r\n\r\n this.createDriveTrain(tyreRecord.tractorAxles);\r\n this.createDriveTrain(tyreRecord.trailerAxles);\r\n });\r\n }\r\n\r\n private populateTyreData(axle: ITPMSAxle, tyreRecordData: ITyreRecordData): any {\r\n var tyre: ITPMSTyre = {\r\n axleNumber: tyreRecordData.AxleNumber,\r\n axleTyrePosition: tyreRecordData.AxleTyrePosition,\r\n uniqueTyreRef: `${tyreRecordData.AxleNumber}-${tyreRecordData.AxleTyrePosition}`,\r\n\r\n pressure: tyreRecordData.PressureKPa,\r\n pressurePSI: tyreRecordData.PressureKPa ? tyreRecordData.PressureKPa * 0.145038 : null,\r\n temp: tyreRecordData.Temperature,\r\n speed: null,\r\n\r\n originalData: tyreRecordData\r\n };\r\n\r\n // Round PSI measurement\r\n if (tyre.pressurePSI) {\r\n tyre.pressurePSI = Math.round(tyre.pressurePSI /** 100*/) /*/ 100*/;\r\n }\r\n\r\n if (tyreRecordData.AxleTyrePosition <= 7) {\r\n axle.tyresLeft.push(tyre);\r\n }\r\n else {\r\n axle.tyresRight.push(tyre);\r\n }\r\n\r\n axle.isSpacer = false;\r\n }\r\n\r\n private getAxle(tyreRecord: ITyreRecord, tyreRecordData: ITyreRecordData): ITPMSAxle {\r\n //console.log(\"getAxle\", tyreRecordData.AxleNumber, tyreRecord, tyreRecordData);\r\n\r\n if (tyreRecordData.AxleNumber <= 7) {\r\n this.createEmtpyAxleData(tyreRecord.tractorAxles);\r\n return tyreRecord.tractorAxles[tyreRecordData.AxleNumber];\r\n }\r\n else {\r\n this.createEmtpyAxleData(tyreRecord.trailerAxles);\r\n return tyreRecord.trailerAxles[tyreRecordData.AxleNumber - 8];\r\n }\r\n }\r\n\r\n private createEmtpyAxleData(axles: ITPMSAxle[]) {\r\n\r\n if (axles.length == 8) {\r\n return;\r\n }\r\n\r\n for (var i = 0; i < 8; i++) {\r\n axles[i] = {\r\n isSpacer: true,\r\n allTyres: [],\r\n tyresLeft: [],\r\n tyresRight: [],\r\n label: `--`\r\n };\r\n }\r\n }\r\n\r\n private createDriveTrain(axles: ITPMSAxle[]) {\r\n\r\n if (axles.length == 0) {\r\n return;\r\n }\r\n\r\n var firstAxleInUse = -1;\r\n var lastAxleInUse = -1;\r\n\r\n axles.forEach((axle, i) => {\r\n if (firstAxleInUse == -1 && !axle.isSpacer) {\r\n firstAxleInUse = i;\r\n }\r\n\r\n if (!axle.isSpacer) {\r\n lastAxleInUse = i;\r\n }\r\n });\r\n\r\n for (var i = firstAxleInUse; i < lastAxleInUse; i++) {\r\n axles[i].showDriveTrain = true;\r\n }\r\n }\r\n\r\n private createAxleLabels(axles: ITPMSAxle[], prefix = \"Axle\"): any {\r\n var axleCount = 1;\r\n\r\n axles.forEach(axle => {\r\n if (axle.isSpacer) {\r\n return\r\n }\r\n\r\n axle.label = `${prefix} ${axleCount++}`;\r\n });\r\n }\r\n\r\n private populateAllLists(tyreRecord: ITyreRecord) {\r\n\r\n tyreRecord.allAxles = tyreRecord.tractorAxles.concat(tyreRecord.trailerAxles);\r\n\r\n tyreRecord.allAxles.forEach(axle => {\r\n if (axle.isSpacer) {\r\n return;\r\n }\r\n\r\n axle.allTyres = axle.tyresLeft.concat(axle.tyresRight);\r\n });\r\n }\r\n}\r\n","import * as angular from \"angular\";\r\nimport * as moment from \"moment\";\r\n\r\nimport { IImportConfig } from \"./interfaces/IImportConfig\";\r\nimport { IImportCount } from \"./interfaces/IImportCount\";\r\nimport { IImportOption } from \"./interfaces/IImportOption\";\r\nimport { IImportAdapterResult, ImportPreProcessResult, IRowCol } from \"./interfaces/IImportAdapterResult\";\r\nimport { IImportResult } from \"./interfaces/IImportResult\";\r\nimport { IImportValidationError, IImportValidationStatus } from \"./interfaces/IImportValidation\";\r\nimport { IVeriTableHeader, IVeriTableRow } from \"@directives/_veri/veriTable/veriTable.component\";\r\n\r\nimport { FieldType } from \"./enums/FieldType\";\r\nimport { CsvImporterService } from \"./csvImporter.service\";\r\nimport { FileReaderService } from \"@services/fileReader.service\";\r\nimport { ImportSource } from \"./enums/ImportSource\";\r\n\r\nimport \"./csvImporter.html\";\r\nimport \"./csvImporter.scss\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\n\r\nexport interface ICsvImportComponentBindings {\r\n importConfig: IImportConfig;\r\n loading: boolean;\r\n onCancel: () => void;\r\n onSubmit: (importedData: any) => angular.IPromise;\r\n onValidateRow: (args: { csvLine: string, importOptions: IImportOption[], rowIdx: number }) => IImportValidationStatus;\r\n onValidateData: (args: { csvLines: string[], importOptions: IImportOption[] }) => angular.IPromise[]>;\r\n onUseAdapter: (args: { csvLines: string[] }) => boolean;\r\n onCallAdapter: (args: { csvLines: string[], startOfWeekDate: Date }) => IImportAdapterResult;\r\n}\r\n\r\ninterface IDateForm {\r\n startOfWeekDate: Date;\r\n}\r\n\r\nexport class CsvImporterController implements ICsvImportComponentBindings {\r\n importConfig: IImportConfig;\r\n loading: boolean;\r\n onCancel: () => void;\r\n onSubmit: (importedData: any) => angular.IPromise;\r\n onValidateRow: (args: { csvLine: string, importOptions: IImportOption[], rowIdx: number }) => IImportValidationStatus;\r\n onValidateData: (args: { csvLines: string[], importOptions: IImportOption[] }) => angular.IPromise[]>;\r\n onUseAdapter: (args: { csvLines: string[] }) => boolean;\r\n onCallAdapter: (args: { csvLines: string[], startOfWeekDate: Date }) => IImportAdapterResult;\r\n\r\n mappedImportOptions: IImportOption[];\r\n importOptions: IImportOption[];\r\n tableHeaders: IVeriTableHeader[];\r\n informationText: string;\r\n\r\n importFile: File;\r\n importedData: any[];\r\n invalidRouteCount = 0;\r\n inputId: string;\r\n\r\n showMappings = false;\r\n showResults = false;\r\n mappingsIncomplete = true;\r\n showRowErrors = false;\r\n showValidationErrors = false;\r\n showSelectDate = false;\r\n showHelpInfo = false;\r\n\r\n validationErrors: IImportValidationError[];\r\n\r\n submitted = false;\r\n successCount: number;\r\n failedCount: number;\r\n\r\n helpInfoText: string;\r\n\r\n columnImportNames: string[] = [];\r\n\r\n tableRows: IVeriTableRow[] = [];\r\n\r\n repeatOption: IImportOption;\r\n\r\n csvImportLines: string[];\r\n infoTableHeaderCols: string[];\r\n infoTableRowCols: string[];\r\n\r\n dateForm: IDateForm;\r\n minDate: Date;\r\n maxDate: Date;\r\n\r\n maxCols = 0;\r\n\r\n static $inject = [\r\n \"$mdDialog\", \"csvImporterService\", \"fileReaderService\", \"translationService\"\r\n ];\r\n\r\n constructor(\r\n private readonly $mdDialog: angular.material.IDialogService,\r\n private readonly csvImporterService: CsvImporterService,\r\n private readonly fileReaderService: FileReaderService,\n private readonly translationService: TranslationService\r\n )\r\n {\r\n this.inputId = `fileinputid-${Math.floor(Math.random() * 1000)}`;\r\n }\r\n\r\n $onInit() {\r\n this.submitted = false;\r\n this.successCount = 0;\r\n this.failedCount = 0;\r\n this.validationErrors = [] as IImportValidationError[];\r\n this.importOptions = this.importConfig.importOptions;\r\n this.tableHeaders = this.importConfig.tableHeaders;\r\n this.informationText = this.importConfig.informationText;\r\n this.setHelpInfoText();\r\n this.infoTableHeaderCols = this.importConfig.informationTableHeader.split(\",\");\r\n this.infoTableRowCols = this.importConfig.informationTableRow.split(\",\");\r\n this.dateForm = { startOfWeekDate: null };\r\n this.minDate = this.getMinStartOfWeekDate();\r\n this.maxDate = new Date(this.minDate.getFullYear() + 2, this.minDate.getMonth(), this.minDate.getDate());\r\n }\r\n\r\n importFileArrived(file: File) {\r\n if (this.importFile || this.loading) {\r\n return;\r\n }\r\n this.submitted = false;\r\n this.showHelpInfo = false;\r\n this.successCount = 0;\r\n this.failedCount = 0;\r\n this.validationErrors = [] as IImportValidationError[];\r\n this.importFile = file;\r\n\r\n if (this.importFile) {\r\n this.fileReaderService\r\n .readAsText(this.importFile)\r\n .then(fileText => {\r\n this.prepareToProcessCsvFile(fileText);\r\n });\r\n }\r\n }\r\n\r\n back() {\r\n this.clear();\r\n }\r\n\r\n cancel(): void {\r\n this.clear();\r\n if (this.onCancel) {\r\n this.onCancel();\r\n }\r\n \r\n this.$mdDialog.hide();\r\n }\r\n\r\n cancelValidationErrors() {\r\n this.clear();\r\n if (this.onCancel) {\r\n this.onCancel();\r\n }\r\n this.showValidationErrors = false;\r\n }\r\n\r\n submit(): void {\r\n if (!this.onSubmit) {\r\n return;\r\n }\r\n\r\n this.onSubmit({ importedData: this.importedData }).then((result => {\r\n this.successCount = result.successCount;\r\n this.failedCount = result.failedCount;\r\n this.submitted = true;\r\n }));\r\n }\r\n\r\n getFieldType(fieldType: FieldType): string {\r\n return FieldType[fieldType];\r\n }\r\n\r\n helpInfo() {\r\n this.showHelpInfo = !this.showHelpInfo;\r\n this.setHelpInfoText();\r\n }\r\n\r\n onlySundayDatePredicate(date) {\r\n return date.getDay() === 0;\r\n };\r\n\r\n onDateChanged() {\r\n this.showSelectDate = false;\r\n this.preprocessImportFile(new Date(this.dateForm.startOfWeekDate));\r\n this.dateForm.startOfWeekDate = null;\r\n }\r\n\r\n private setHelpInfoText() {\r\n this.helpInfoText = this.showHelpInfo ? this.translationService.t(\"csvImporter.hideHelp\") : this.translationService.t(\"csvImporter.showHelp\");\r\n }\r\n\r\n private clear(): void {\r\n this.importedData = [];\r\n this.tableRows = [];\r\n this.validationErrors = [];\r\n this.importFile = null;\r\n this.invalidRouteCount = 0;\r\n this.successCount = 0;\r\n this.failedCount = 0;\r\n this.showResults = false;\r\n this.showSelectDate = false;\r\n this.showValidationErrors = false;\r\n this.showMappings = false;\r\n }\r\n\r\n private prepareToProcessCsvFile(fileText: string) {\r\n this.csvImportLines = this.csvImporterService.extractLines(fileText);\r\n\r\n if (this.onUseAdapter && this.onCallAdapter && this.onUseAdapter({ csvLines: this.csvImportLines })) {\r\n this.showSelectDate = true;\r\n }\r\n else {\r\n this.processCsvFile(this.csvImportLines);\r\n }\r\n }\r\n\r\n private preprocessImportFile(startOfWeekDate: Date) {\r\n const conversionResult = this.onCallAdapter({ csvLines: this.csvImportLines, startOfWeekDate: startOfWeekDate });\r\n\r\n if (conversionResult.status === ImportPreProcessResult.Ok && conversionResult.preProcessedDataRows && conversionResult.preProcessedDataRows.length) {\r\n this.processAdaptedImportFile(conversionResult);\r\n } else {\r\n this.preparePreprocessValidationErrors(conversionResult);\r\n }\r\n }\r\n\r\n private preparePreprocessValidationErrors(conversionResult: IImportAdapterResult) {\r\n const errors = conversionResult.errors;\r\n if (errors && errors.length) {\r\n errors.forEach((error: IImportValidationError) => {\r\n const colNumber = error.colNumber ? + error.colNumber : null;\r\n this.csvImporterService.addError(this.validationErrors, error.fieldName, error.fieldValue, error.text, error.rowNumber, conversionResult.originalRowCols, colNumber);\r\n });\r\n } else {\r\n this.csvImporterService.addError(this.validationErrors, \"Generic\", \"unknown\", this.translationService.t(\"csvImporter.unrecognizedParagon\"), 1, conversionResult.originalRowCols);\r\n }\r\n this.displayValidationErrors();\r\n }\r\n\r\n private processAdaptedImportFile(conversionResult: IImportAdapterResult) {\r\n this.initOptions(false);\r\n\r\n this.processCsvDataUseColumnPositions(conversionResult.preProcessedDataRows, conversionResult.originalRowCols);\r\n }\r\n\r\n private processCsvFile(csvLines: string[]) {\r\n const hasTitles = this.csvFileHasTitles(csvLines);\r\n\r\n this.initOptions(hasTitles);\r\n\r\n if (hasTitles) {\r\n this.processCsvDataUseTitles(csvLines);\r\n } else {\r\n this.processCsvDataUseColumnPositions(csvLines, null);\r\n }\r\n }\r\n\r\n private initOptions(hasTitles: boolean) {\r\n this.createMappedOptionsArray();\r\n\r\n this.mappedImportOptions.forEach(option => {\r\n option.isValid = true;\r\n option.mappedColumnIdx = hasTitles ? -1 : option.indexPosition;\r\n option.repeatCount = 0;\r\n });\r\n\r\n this.repeatOption = this.mappedImportOptions.find(opt => opt.repeats);\r\n }\r\n\r\n private createMappedOptionsArray() {\r\n if (this.mappedImportOptions) {\r\n this.mappedImportOptions.length = 0;\r\n }\r\n this.mappedImportOptions = angular.copy(this.importOptions);\r\n }\r\n\r\n private csvFileHasTitles(csvLines: string[]): boolean {\r\n const titleRowCellValues = this.csvImporterService.getTitleRowCellValues(csvLines);\r\n\r\n if (!titleRowCellValues || !titleRowCellValues.length) {\r\n return false;\r\n }\r\n\r\n for (let cell of titleRowCellValues) {\r\n if (cell && cell.trim().length > 0) {\r\n if (this.csvImporterService.isValidFieldForType(cell, FieldType.Date).isValid ||\r\n this.csvImporterService.isValidFieldForType(cell, FieldType.Integer).isValid ||\r\n this.csvImporterService.isValidFieldForType(cell, FieldType.PositiveDouble).isValid) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private removeHeaderLine(csvLines: string[]): string[] {\r\n csvLines.splice(0, 1);\r\n return csvLines;\r\n }\r\n\r\n private getMappedImportOption(colIdx: number): IImportOption {\r\n const importOption = this.mappedImportOptions.find(opt => opt.mappedColumnIdx === colIdx);\r\n if (importOption) {\r\n return importOption;\r\n }\r\n\r\n if (!this.repeatOption || colIdx < this.repeatOption.mappedColumnIdx || !this.repeatOption.repeatAfterCols || this.repeatOption.repeatAfterCols < 1) {\r\n return null;\r\n }\r\n\r\n const repeatColIdx = this.repeatOption.mappedColumnIdx;\r\n const repeatAfterCols = this.repeatOption.repeatAfterCols;\r\n\r\n const offsetCol = (colIdx - repeatColIdx) % repeatAfterCols;\r\n const effectiveColIdx = repeatColIdx + offsetCol;\r\n\r\n return this.mappedImportOptions.find(opt => opt.mappedColumnIdx === effectiveColIdx);\r\n }\r\n\r\n private processCsvDataUseTitles(csvLines: string[]) {\r\n this.setTitleOptions(csvLines);\r\n\r\n if (this.validationErrors.length) {\r\n this.displayValidationErrors();\r\n return;\r\n }\r\n\r\n const lines = this.removeHeaderLine(csvLines);\r\n this.processCsvImportData(lines, null);\r\n }\r\n\r\n private processCsvDataUseColumnPositions(csvLines: string[], rowColTranslations: IRowCol[][]) {\r\n this.processCsvImportData(csvLines, rowColTranslations);\r\n this.getDropdownColumnNumbers(this.maxCols);\r\n }\r\n\r\n private processCsvImportData(csvLines: string[], rowColTranslations: IRowCol[][]) {\r\n this.maxCols = 0;\r\n\r\n let allRowsValid = true;\r\n let rowIsValid = false;\r\n\r\n this.tableRows = [];\r\n\r\n csvLines.forEach((csvLine, rowIdx) => {\r\n rowIsValid = this.validateCellFormats(csvLine, rowIdx, rowColTranslations);\r\n\r\n rowIsValid = rowIsValid && this.validateRow(csvLine, rowIdx);\r\n\r\n allRowsValid = allRowsValid && rowIsValid;\r\n });\r\n\r\n if (allRowsValid) {\r\n this.validateAllRows(csvLines).then((tableRows: IVeriTableRow[]) => {\r\n this.tableRows = angular.copy(tableRows);\r\n this.invalidRouteCount = tableRows.filter(x => !x.data.isValid).length;\r\n tableRows.length = 0;\r\n if (this.invalidRouteCount) {\r\n this.displayValidationErrors();\r\n }\r\n });\r\n } else {\r\n this.displayValidationErrors();\r\n }\r\n }\r\n\r\n private validateRow(csvLine: string, rowIdx: number): boolean {\r\n\r\n if (!this.onValidateRow) {\r\n return true;\r\n }\r\n\r\n const validationStatus = this.onValidateRow({\r\n csvLine: csvLine,\r\n importOptions: this.mappedImportOptions,\r\n rowIdx: rowIdx\r\n });\r\n\r\n if (!validationStatus) {\r\n return true;\r\n }\r\n\r\n if (!validationStatus.isValid && validationStatus.error) {\r\n this.validationErrors.push(validationStatus.error);\r\n }\r\n\r\n return validationStatus.isValid;\r\n }\r\n\r\n private validateAllRows(csvLines: string[]): angular.IPromise[]> {\r\n this.importedData = [] as any[];\r\n\r\n if (!this.onValidateData) {\r\n return null;\r\n }\r\n\r\n return this.onValidateData({\r\n csvLines: csvLines,\r\n importOptions: this.mappedImportOptions\r\n })\r\n .then((importResults: IVeriTableRow[]) => {\r\n importResults.forEach((importResult, rowIdx) => {\r\n const validationName = this.importConfig.importSource === ImportSource.RouteTemplate ? this.translationService.t(\"csvImporter.sitesData\") : this.translationService.t(\"csvImporter.geofenceData\");\r\n this.validateImportResult(importResult, rowIdx, validationName);\r\n this.importedData.push(angular.copy(importResult.data));\r\n });\r\n return importResults;\r\n });\r\n }\r\n\r\n private validateImportResult(routeResult: IVeriTableRow, rowIdx: number, genericErrorText: string) {\r\n if (!routeResult.data.isValid && routeResult.data.errors.length) {\r\n const errorText = routeResult.data.errors.join(\", \").replace(/, *$/, \"\");\r\n this.addOrUpdateValidationError(genericErrorText, routeResult.data.altName, errorText, rowIdx, null);\r\n }\r\n }\r\n\r\n private validateCellFormats(csvLine: string, rowIdx: number, rowColTranslations: IRowCol[][]): boolean {\r\n\r\n const cellValues = this.csvImporterService.getFieldValuesFromLine(csvLine);\r\n\r\n let rowIsValid = cellValues.length > 0;\r\n\r\n cellValues.forEach((cellValue, columnIdx) => {\r\n\r\n const importOption = this.getMappedImportOption(columnIdx);\r\n\r\n if (importOption) {\r\n importOption.isValid = this.validateField(importOption, cellValue, columnIdx, rowIdx, rowColTranslations);\r\n rowIsValid = rowIsValid && importOption.isValid;\r\n }\r\n });\r\n\r\n this.maxCols = cellValues.length > this.maxCols ? cellValues.length : this.maxCols;\r\n\r\n return rowIsValid;\r\n }\r\n\r\n private validateField(option: IImportOption, cellValue: string, colIdx: number, rowIdx: number, rowColTranslations: IRowCol[][]): boolean {\r\n if (this.csvImporterService.isEmptyCell(cellValue)) {\r\n if (option.isRequired) {\r\n this.csvImporterService.addValidationError(this.validationErrors, option.displayName, cellValue, this.translationService.t(\"csvImporter.fieldEmpty\"), rowIdx, rowColTranslations, colIdx);\r\n }\r\n return !option.isRequired;\r\n }\r\n\r\n const validationResult = this.csvImporterService.isValidFieldForType(cellValue, option.fieldType);\r\n if (!validationResult.isValid) {\r\n this.csvImporterService.addValidationError(this.validationErrors, option.displayName, cellValue,\r\n this.csvImporterService.getInvalidFieldForTypeMessage(option, validationResult.message),\r\n rowIdx, rowColTranslations, colIdx);\r\n return false;\r\n }\r\n\r\n if (option.validate && !option.validate(cellValue)) {\r\n const validationText = option.validationText ? option.validationText : this.translationService.t(\"csvImporter.fieldInvalid\");\r\n this.csvImporterService.addValidationError(this.validationErrors, option.displayName, cellValue, validationText, rowIdx, rowColTranslations, colIdx);\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private addOrUpdateValidationError(fieldName: string, fieldValue: string, validationText: string, rowIndex: number, colIndex?: number) {\r\n const colStr = colIndex || colIndex === 0 ? (colIndex + 1).toString() : \"-\";\r\n\r\n const currentError = {\r\n rowNumber: rowIndex + 1,\r\n colNumber: colStr,\r\n fieldName: fieldName,\r\n fieldValue: fieldValue,\r\n text: validationText\r\n };\r\n\r\n let inserted = false;\r\n for (let i = 0; i < this.validationErrors.length && !inserted; i++) {\r\n if (i > rowIndex) {\r\n this.validationErrors.splice(i, 0, currentError);\r\n inserted = true;\r\n }\r\n }\r\n\r\n if (!inserted) {\r\n this.validationErrors.push(currentError);\r\n }\r\n }\r\n\r\n private getColumnNames(maxCols: number): string[] {\r\n\r\n let alphabet = Array.from(Array(26).keys(), i => String.fromCharCode(i + 65));\r\n\r\n let offset = 0;\r\n\r\n while (alphabet.length < maxCols) {\r\n const firstChar = alphabet[offset++];\r\n alphabet =\r\n alphabet.concat(Array.from(Array(26).keys(), i => firstChar.concat(String.fromCharCode(i + 65))));\r\n }\r\n\r\n return alphabet;\r\n }\r\n\r\n private getDropdownColumnNumbers(maxCols: number) {\r\n const columnNames = this.getColumnNames(maxCols);\r\n\r\n this.columnImportNames = [];\r\n for (let i = 0; i < maxCols; i++) {\r\n this.columnImportNames.push(this.translationService.t('csvImporter.columnName', columnNames[i]));\r\n }\r\n }\r\n\r\n private getDropdownColumnNames(cellValues: string[]) {\r\n this.columnImportNames = [];\r\n cellValues.forEach(cellValue => {\r\n if (cellValue.trim().length > 0) {\r\n this.columnImportNames.push(cellValue);\r\n }\r\n });\r\n }\r\n\r\n private displayValidationErrors() {\r\n this.showValidationErrors = true;\r\n this.showMappings = false;\r\n this.showResults = false;\r\n }\r\n\r\n private setTitleOptions(csvLines: string[]) {\r\n const titleRowCellValues = this.csvImporterService.getTitleRowCellValues(csvLines);\r\n this.mappedImportOptions.forEach(option => {\r\n this.csvImporterService.mapImportOptionFromTitles(option, titleRowCellValues, this.validationErrors);\r\n });\r\n\r\n this.getDropdownColumnNames(titleRowCellValues);\r\n }\r\n\r\n private getMinStartOfWeekDate() {\r\n const today = new Date();\r\n const todayMoment = moment(today);\r\n return todayMoment.add(-today.getDay(), \"days\").toDate();\r\n }\r\n\r\n}\r\n\r\nexport class CsvImporterComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n\r\n constructor() {\r\n this.bindings = {\r\n importConfig: \"<\",\r\n loading: \"<\",\r\n onCancel: \"&\",\r\n onSubmit: \"&\",\r\n onValidateRow: \"&\",\r\n onValidateData: \"&\",\r\n onUseAdapter: \"&\",\r\n onCallAdapter: \"&\"\r\n };\r\n\r\n this.controller = CsvImporterController;\r\n this.template = require(\"./csvImporter.html\");\r\n }\r\n}\r\n\r\n\r\n","module.exports = \"

{{ 'GeofenceImporter.DialogTitle' | translate }}

clear
\";","import { IVeriTableHeader, IVeriTableRow } from \"@directives/_veri/veriTable/veriTable.component\";\r\nimport { SortType } from \"@enums/SortType\";\r\nimport { IDriver } from \"@interfaces/IDriver\";\r\nimport { IGeofence } from \"@interfaces/IGeofences\";\r\nimport { IKeyValuePair } from \"@interfaces/IKeyValuePair\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { DriverService } from \"@services/driver.service\";\r\nimport { GeofenceService } from \"@services/geofence.service\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport * as angular from \"angular\";\r\nimport * as moment from \"moment\";\r\nimport { ParagonImportAdapterService } from \"src/app/main/components/csvImporter/adapters/paragonImportAdapter.service\";\r\nimport { IPlannedRoute } from \"../../planning/interfaces/IPlannedRoute\";\r\nimport { IPlannedRouteVisit } from \"../../planning/interfaces/IPlannedRouteVisit\";\r\nimport { IRouteTemplate } from \"../../planning/interfaces/IRouteTemplate\";\r\nimport { RouteVisitStatus, OldTmsService } from \"../../planning/tmsService\";\r\nimport \"../csvImporter.html\";\r\nimport \"../csvImporter.scss\";\r\nimport { FieldType } from \"../enums/FieldType\";\r\nimport { ImportSource } from \"../enums/ImportSource\";\r\nimport { IImportConfig } from \"../interfaces/IImportConfig\";\r\nimport { IImportCount } from \"../interfaces/IImportCount\";\r\nimport { IImportOption } from \"../interfaces/IImportOption\";\r\nimport { ITMSImportRoute } from \"../interfaces/ITmsImportRoute\";\r\nimport { RouteDataImporterService } from \"./routeDataImporter.service\";\r\n\r\nexport class CsvRouteImporterController {\r\n importFile: File;\r\n invalidRouteCount = 0;\r\n\r\n routeTemplates: IRouteTemplate[];\r\n vehicles: IVehicle[];\r\n drivers: IDriver[];\r\n geofences: IGeofence[];\r\n\r\n loading = false;\r\n successCount: number;\r\n failedCount: number;\r\n\r\n importConfig: IImportConfig;\r\n\r\n fieldMappings: IKeyValuePair[] = [];\r\n\r\n static $inject = [\"$mdDialog\", \"$q\", \"tmsService\", \"driverService\", \"vehicleService\", \"geofenceService\", \"routeDataImporterService\", \"paragonImportAdapterService\"];\r\n\r\n constructor(\r\n private readonly $mdDialog: angular.material.IDialogService,\r\n private readonly $q: angular.IQService,\r\n private readonly tmsService: OldTmsService,\r\n private readonly driverService: DriverService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly geofenceService: GeofenceService,\r\n private readonly routeDataImporterService: RouteDataImporterService,\r\n private readonly paragonImportAdapterService: ParagonImportAdapterService\r\n ) {\r\n this.importConfig = {\r\n importOptions: this.getImportOptions(),\r\n tableHeaders: this.getTableHeaders(),\r\n informationText: this.getInformationText(),\r\n informationTableHeader: this.getInformationTableHeader(),\r\n informationTableRow: this.getInformationTableRow(),\r\n importSource: ImportSource.RouteTemplate\r\n };\r\n }\r\n\r\n $onInit() {\r\n this.loading = true;\r\n\r\n const routeTemplatesPromise = this.tmsService.getRouteTemplates(true);\r\n const vehiclesPromise = this.vehicleService.getVehicles({ includePeripheralMappings: true });\r\n const driversPromise = this.driverService.getDrivers();\r\n const geofencesPromise = this.geofenceService.getGeofences();\r\n\r\n this.$q.all([routeTemplatesPromise, vehiclesPromise, driversPromise, geofencesPromise])\r\n .then(([routeTemplates, vehicles, drivers, geofences]) => {\r\n this.routeTemplates = routeTemplates;\r\n this.vehicles = vehicles;\r\n this.drivers = drivers;\r\n this.geofences = geofences;\r\n this.loading = false;\r\n });\r\n }\r\n\r\n hide(): void {\r\n this.$mdDialog.hide();\r\n }\r\n\r\n validateData(csvLines: string[], importOptions: IImportOption[]): angular.IPromise[]> {\r\n return this.routeDataImporterService.validateData(csvLines, importOptions, this.vehicles, this.drivers, this.geofences, this.routeTemplates);\r\n }\r\n\r\n submit(importedData: any[]): angular.IPromise {\r\n\r\n const routeData = importedData as ITMSImportRoute[];\r\n\r\n var savePromises: angular.IPromise[] = [];\r\n \r\n this.failedCount = 0;\r\n this.successCount = 0;\r\n this.loading = true;\r\n\r\n routeData.forEach(route => {\r\n if (!route.isValid || route.successfullyImported) {\r\n return true;\r\n }\r\n\r\n const plannedRoute = this.getPlannedRoute(route);\r\n\r\n savePromises.push(\r\n this.tmsService.addPlannedRoute(plannedRoute).then(() => {\r\n this.successCount++;\r\n route.successfullyImported = true;\r\n }).catch((exception) => {\r\n console.error(exception.statusText, exception);\r\n this.failedCount++;\r\n route.failedImport = true;\r\n }));\r\n\r\n return true;\r\n });\r\n\r\n return this.$q.all(savePromises).then(() => {\r\n this.loading = false;\r\n return { successCount: this.successCount, failedCount: this.failedCount } as IImportCount;\r\n });\r\n }\r\n\r\n useAdapter(csvLines: string[]): boolean {\r\n return this.paragonImportAdapterService.fileHasParagonHeader(csvLines);\r\n }\r\n\r\n runAdapter(csvLines: string[], startOfWeekDate: Date) {\r\n return this.paragonImportAdapterService.preProcessImportFile(csvLines, startOfWeekDate);\r\n }\r\n\r\n private getPlannedRoute(importRoute: ITMSImportRoute) {\r\n const startTime = moment(importRoute.startTime);\r\n\r\n const plannedRoute: IPlannedRoute = {\r\n PlannedStartTime: startTime.toISOString(),\r\n Name: importRoute.name,\r\n PlannedVisits: this.createRouteStops(importRoute, startTime)\r\n };\r\n\r\n if (importRoute.driver) {\r\n plannedRoute.DriverId = importRoute.driver.Id;\r\n }\r\n if (importRoute.vehicle) {\r\n plannedRoute.VehicleId = importRoute.vehicle.Id;\r\n }\r\n\r\n return plannedRoute;\r\n }\r\n\r\n private createRouteStops(importRoute: ITMSImportRoute, startTime: moment.Moment): IPlannedRouteVisit[] {\r\n const plannedRouteStops = [] as IPlannedRouteVisit[];\r\n\r\n var previousStop: IPlannedRouteVisit;\r\n\r\n importRoute.visits.forEach((visit, index) => {\r\n const routeStop: IPlannedRouteVisit = {\r\n GeofenceId: visit.geofence.Id,\r\n Geofence: visit.geofence,\r\n OnSiteTime: this.tmsService.convertMinsToTimeSpan(visit.onSiteTimeMins),\r\n TravelTime: this.tmsService.convertMinsToTimeSpan(visit.travelTimeMins),\r\n OnSiteTimeBuffer: this.tmsService.convertMinsToTimeSpan(this.tmsService.defaultOnsiteTimeMinsBuffer),\r\n TravelTimeBuffer: this.tmsService.convertMinsToTimeSpan(this.tmsService.defaultTravelTimeMinsBuffer),\r\n TravelDistanceMetres: visit.travelDistanceMetres,\r\n ActualDistanceTraveled: 0,\r\n RouteVisitPosition: index,\r\n RouteStopId: null,\r\n Status: RouteVisitStatus.Planned,\r\n LinePoints: visit.linePoints ? visit.linePoints : []\r\n };\r\n\r\n if (previousStop) {\r\n routeStop.PlannedArrivalTime = moment(previousStop.PlannedDepartureTime).add(\"m\", visit.travelTimeMins);\r\n routeStop.PlannedDepartureTime = moment(previousStop.PlannedDepartureTime)\r\n .add(\"m\", visit.travelTimeMins + visit.onSiteTimeMins);\r\n } else {\r\n routeStop.PlannedArrivalTime = moment(startTime);\r\n routeStop.PlannedDepartureTime = moment(startTime).add(\"m\", visit.onSiteTimeMins);\r\n }\r\n\r\n previousStop = routeStop;\r\n\r\n plannedRouteStops.push(routeStop);\r\n });\r\n\r\n return plannedRouteStops;\r\n }\r\n\r\n private getTableHeaders(): IVeriTableHeader[] {\r\n return [\r\n { title: \"Line No.\", hide: true },\r\n { title: \"Name\", sortable: true },\r\n { title: \"Vehicle Or Driver\", sortable: true, width: 140, },\r\n { title: \"Start Time\", sortable: true, width: 160, sortType: SortType.Date },\r\n { title: \"Visits\", sortable: true, width: 70, sortType: SortType.Number },\r\n { title: \"Est. Duration\", sortable: true, width: 160, sortType: SortType.Number },\r\n { title: \"Distance\", sortable: true, width: 120, sortType: SortType.Number }\r\n ];\r\n }\r\n\r\n private getImportOptions(): IImportOption[] {\r\n\r\n const csvImportOptions: IImportOption[] = [{\r\n columnName: \"driverOrVehicle\",\r\n aliases: [\"driver\", \"vehicle\", \"vehicleReg\", \"driverName\"],\r\n displayName: \"Driver or Vehicle\",\r\n fieldType: FieldType.String,\r\n indexPosition: 0,\r\n isRequired: false,\r\n repeats: false,\r\n validate: (val) => { return this.validateDriverOrVehicle(val); }\r\n },\r\n {\r\n columnName: \"startDate\",\r\n aliases: [\"startDateTime\", \"startTime\"],\r\n displayName: \"Start Date\",\r\n fieldType: FieldType.Date,\r\n indexPosition: 1,\r\n isRequired: true,\r\n repeats: false\r\n },\r\n {\r\n columnName: \"geofence\",\r\n aliases: [\"location\", \"site\", \"visit\", \"siteVisit\"],\r\n displayName: \"Site\",\r\n fieldType: FieldType.String,\r\n indexPosition: 2,\r\n isRequired: true,\r\n repeats: true,\r\n repeatAfterCols: 4,\r\n repeatCount: 0,\r\n validate: (val) => { return this.validateGeofence(val); }\r\n },\r\n {\r\n columnName: \"arrivalTime\",\r\n aliases: [\"arrival\", \"travelTime\"],\r\n displayName: \"Arrival Time\",\r\n fieldType: FieldType.DateOrInteger,\r\n indexPosition: 3,\r\n isRequired: true,\r\n repeats: true,\r\n repeatAfterCols: 4,\r\n repeatCount: 0\r\n },\r\n {\r\n columnName: \"departureTime\",\r\n aliases: [\"departure\", \"onsiteTime\"],\r\n displayName: \"Departure Time\",\r\n fieldType: FieldType.DateOrInteger,\r\n indexPosition: 4,\r\n isRequired: true,\r\n repeats: true,\r\n repeatAfterCols: 4,\r\n repeatCount: 0\r\n },\r\n {\r\n columnName: \"distance\",\r\n aliases: [\"travelDistance\"],\r\n displayName: \"Travel Distance\",\r\n fieldType: FieldType.PositiveDouble,\r\n indexPosition: 5,\r\n isRequired: true,\r\n repeats: true,\r\n repeatAfterCols: 4,\r\n repeatCount: 0\r\n }\r\n ];\r\n\r\n return csvImportOptions;\r\n }\r\n\r\n private getInformationText(): string {\r\n return \"Import format: Vehicle reg or driver name, Start date-time, Visit geofence name,
\" +\r\n \"Arrival date (or travel time), Departure date (or onsite time), Travel distance (metres).

\" +\r\n \"Columns should repeat for each site visit - from Visit geofence name to Travel distance.

\" +\r\n \"Note: The import CSV file may contain a single title row line but this is optional.

\";\r\n }\r\n\r\n private getInformationTableHeader(): string {\r\n return \"Driver,Start Time,Site,Arrival Time,Departure Time,Distance,Site,Arrival Time,Departure Time,Distance\";\r\n }\r\n\r\n private getInformationTableRow(): string {\r\n return \"Jim,2019-12-14T15:02,Rushden HQ,2019-12-14T15:02,2019-12-14T15:05,0,Rushden Site,2019-12-14T15:28,2019-12-14T15:38:02Z,928\";\r\n }\r\n\r\n private validDriver(nameLowercase: string): boolean {\r\n if (!this.drivers) {\r\n return false;\r\n }\r\n return this.drivers.find(d => (d.Name || \"\").toLowerCase() === nameLowercase) !== undefined;\r\n }\r\n\r\n private validVehicle(nameLowercase: string): boolean {\r\n if (!this.vehicles) {\r\n return false;\r\n }\r\n const searchReg = nameLowercase.replace(/\\s/g, \"\");\r\n return this.vehicles.find(v => (v.Reg || \"\").toLowerCase().replace(/\\s/g, \"\") === searchReg) !== undefined ||\r\n this.vehicles.find(v => (v.ShortReg || \"\").toLowerCase() === searchReg) !== undefined;\r\n }\r\n\r\n private validateDriverOrVehicle(name: string): boolean {\r\n const nameLowercase = name.toLowerCase();\r\n\r\n return this.validDriver(nameLowercase) || this.validVehicle(nameLowercase);\r\n }\r\n\r\n private validateGeofence(val: string): boolean {\r\n if (!this.geofences) {\r\n return false;\r\n }\r\n\r\n let foundGeofence = false;\r\n for (let geofence of this.geofences) {\r\n if (geofence.Description === val) {\r\n foundGeofence = true;\r\n break;\r\n }\r\n }\r\n\r\n return foundGeofence;\r\n }\r\n}\r\n\r\nexport class CsvRouteImporterComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n\r\n constructor() {\r\n this.controller = CsvRouteImporterController;\r\n this.template = require(\"./csvRouteImporter.dialog.html\");\r\n }\r\n}\r\n\r\n","import { IDriver } from \"@interfaces/IDriver\";\r\nimport { IGeofence } from \"@interfaces/IGeofences\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { IPlannedRoute } from \"./IPlannedRoute\";\r\nimport { IPlannedRouteVisit } from \"./IPlannedRouteVisit\";\r\n\r\nexport interface ITMSJob {\r\n Id: number;\r\n AccountId: number;\r\n\r\n DriverId: number;\r\n VehicleId: number;\r\n GeofenceId: number;\r\n\r\n PlannedRouteStopId: number;\r\n PlannedRouteId: number;\r\n\r\n ActualDeliveryDate: string;\r\n PlannedDeliveryDate: string;\r\n\r\n LoadReference: string;\r\n JobReference: string;\r\n JsonData: string;\r\n InvoiceReference: string;\r\n\r\n JobStatus: TMSJobStatus;\r\n TrackingStatus: TMSJobTrackingStatus;\r\n PlanningStatus: TMSJobPlanningStatus;\r\n\r\n CustomerLoadStatus: string;\r\n CustomerJobStatus: string;\r\n\r\n OverallWeight: number;\r\n ProductLoadType: string;\r\n ProductQuantity: number;\r\n Comments: string;\r\n CustomerPOD: string;\r\n JobAction: string;\r\n DeliveryName: string;\r\n Address: string;\r\n Cost: number;\r\n\r\n AuditJson: string;\r\n\r\n SignatureRequired: boolean;\r\n SignaturePrintedName: string;\r\n SignatureFileGuid: string;\r\n\r\n PhotoRequired: boolean;\r\n PhotoComment: string;\r\n PhotoFileGuid: string;\r\n \r\n Reason: TMSJobStatusReason;\r\n ReasonNotes: string;\r\n\r\n // ---\r\n\r\n vehicle: IVehicle;\r\n driver: IDriver;\r\n geofence: IGeofence;\r\n\r\n plannedRoute: IPlannedRoute;\r\n plannedRouteStop: IPlannedRouteVisit;\r\n\r\n displayStatus: string;\r\n\r\n photoUrl: string;\r\n signatureUrl: string;\r\n}\r\n\r\nexport enum TMSJobStatus {\r\n Rejected,\r\n Completed,\r\n PartialCompeted,\r\n Missing,\r\n Skipped\r\n}\r\n\r\nexport enum TMSJobTrackingStatus {\r\n Planned,\r\n Arrived,\r\n MobileArrived,\r\n Departed,\r\n Missed\r\n}\r\n\r\nexport enum TMSJobPlanningStatus {\r\n Imported,\r\n Cancelled,\r\n Planned,\r\n Completed,\r\n Expired,\r\n}\r\n\r\nexport enum TMSJobStatusReason {\r\n Pending,\r\n Completed,\r\n Damaged,\r\n Missing,\r\n Rejected\r\n}\r\n","module.exports = \"

Import Routes

clear
\";","module.exports = \"

Export Routes

clear
\";","module.exports = \"

Alternative Routes

clear
\";","import { FleetNavigationModule } from \"@app/main/modules/fleet/fleet.navigation\";\r\nimport { UserRole } from \"@services/accountFeature.service\";\r\nimport { AuthorizationService } from \"@services/authorization.service\";\r\nimport { StateProvider } from \"@uirouter/angularjs\";\r\nimport * as angular from \"angular\";\r\n\r\nexport class Config {\r\n\r\n constructor($stateProvider: StateProvider) {\n\r\n $stateProvider.state(FleetNavigationModule.Geofences, {\r\n url: \"/geofences/:panel/:geofence\",\r\n views: {\r\n \"content@app\": {\r\n template: require(\"./geofences_moved.html\"),\r\n //controller: \"geofencesController\",\r\n //controllerAs: \"$ctrl\"\r\n }\r\n },\n params: {\r\n position: { squash: true, value: null, dynamic: true },\r\n geofence: { squash: true, value: null, dynamic: true },\n visits: { squash: true, value: null, dynamic: true },\r\n panel: { squash: true, value: null, dynamic: true },\r\n },\n data: { translation: 'Common.Geofences' },\n resolve: {\r\n authorize: [\"authorizationService\", (authorization: AuthorizationService) => authorization.authorizeForUser([UserRole.ManageGeofences])]\r\n }\r\n });\r\n }\r\n}\r\n\r\nangular\r\n .module(\"app.components.geofences\", [\r\n \"ui.router\",\r\n \"ngMaterial\"\r\n ])\r\n .config([\"$stateProvider\", Config])\r\n //.controller(\"geofencesController\", GeofencesController)\n","import moment from \"moment\";\r\n\r\nexport class HighChartsService {\r\n\r\n static $inject = [\"$q\", \"$timeout\"];\r\n\r\n constructor(\r\n private $q: angular.IQService,\r\n private $timeout: angular.ITimeoutService) {\r\n }\r\n\r\n getStandardAngularChartOptions(title?: string, onReadyCallback?: (chartObject: Highcharts.ChartObject) => void): Highcharts.Options {\r\n const highchartsOptions = this.getStandardChartOptions();\r\n highchartsOptions.chart.alignTicks = false;\r\n\r\n return highchartsOptions;\r\n }\r\n\r\n addZone(series: Highcharts.SeriesChart, value: number, color?: string, fillColor?: string) {\r\n series.zones = series.zones || [];\r\n\r\n let areaZone: Highcharts.AreaZone = {\r\n color: color,\r\n fillColor: fillColor\r\n };\r\n\r\n if (value) {\r\n areaZone.value = value;\r\n }\r\n\r\n series.zones.push(areaZone);\r\n }\r\n\r\n addYAxisPlotBand(yAxisOptions: Highcharts.AxisOptions,\r\n from: number,\r\n to: number,\r\n backgroundColor: string,\r\n borderColor: string,\r\n label: string,\r\n fit = false): Highcharts.PlotBands {\r\n\r\n let band: Highcharts.PlotBands = {\r\n color: backgroundColor,\r\n borderWidth: 1,\r\n borderColor: borderColor\r\n };\r\n\r\n if (from !== undefined) {\r\n band.from = from;\r\n }\r\n\r\n if (to !== undefined) {\r\n band.to = to;\r\n }\r\n\r\n //const yAxisOptions = (this.tempChartConfig.options.yAxis[0] as Highcharts.AxisOptions);\r\n\r\n if (fit) {\r\n const yAxisPadding = 3;\r\n const paddedFrom = from - yAxisPadding;\r\n const paddedTo = to + yAxisPadding;\r\n yAxisOptions.min = isNaN(yAxisOptions.min) ? paddedFrom : Math.min(yAxisOptions.min, paddedFrom);\r\n yAxisOptions.max = isNaN(yAxisOptions.max) ? paddedTo : Math.max(yAxisOptions.max, paddedTo);\r\n }\r\n\r\n yAxisOptions.plotBands.push(band);\r\n\r\n return band;\r\n }\r\n\r\n addOrUpdateSeriesDataValue(series: Highcharts.IndividualSeriesOptions, timestamp: string | moment.Moment, value: number) {\r\n const timestampValue = moment(timestamp).valueOf();\r\n\r\n series.data.push([timestampValue, value]);\r\n }\r\n\r\n // ------------------------------------------------------------\r\n\r\n private getStandardChartOptions(): Highcharts.Options {\r\n const highchartsOptions: Highcharts.Options = {\r\n chart: {\r\n spacingTop: 10,\r\n spacingBottom: 5,\r\n backgroundColor: \"transparent\",\r\n plotBackgroundColor: \"#fff\",\r\n plotBorderWidth: 1,\r\n plotBorderColor: \"rgba(0,0,0,0.12)\",\r\n zoomType: \"x\",\r\n resetZoomButton: {\r\n theme: {}\r\n }\r\n },\r\n credits: {\r\n enabled: false\r\n },\r\n legend: {\r\n enabled: true,\r\n align: \"right\",\r\n verticalAlign: \"top\",\r\n itemMarginTop: -5\r\n },\r\n colors: [\"#00426a\", \"#cf4946\", \"#555555\", \"#90ED7D\"],\r\n plotOptions: {\r\n line: {\r\n marker: {\r\n enabled: false, // disable for simplified view\r\n radius: 2\r\n },\r\n lineWidth: 1,\r\n states: {\r\n hover: {\r\n lineWidth: 1\r\n }\r\n }\r\n },\r\n areaspline: {\r\n fillOpacity: 0.3,\r\n lineWidth: 1,\r\n states: {\r\n hover: {\r\n lineWidth: 1\r\n }\r\n },\r\n marker: {\r\n enabled: false, // disable for simplified view\r\n radius: 2\r\n },\r\n zoneAxis: \"x\",\r\n zones: []\r\n },\r\n spline: {\r\n lineWidth: 1,\r\n marker: {\r\n enabled: false\r\n },\r\n states: {\r\n hover: {\r\n lineWidth: 1,\r\n marker: {\r\n enabled: false\r\n }\r\n }\r\n },\r\n dashStyle: \"longdash\"\r\n },\r\n series: {}\r\n },\r\n title: null,\r\n tooltip: {\r\n crosshairs: true,\r\n shared: true,\r\n formatter: () => { return false; } // disables tooltip but keeps crosshair\r\n },\r\n xAxis: {\r\n type: \"datetime\",\r\n title: {\r\n text: null // disables title\r\n },\r\n plotBands: []\r\n },\r\n yAxis: [],\r\n exporting: {\r\n enabled: false\r\n }\r\n };\r\n\r\n return highchartsOptions;\r\n }\r\n}\r\n","import { downgradeComponent } from \"@angular/upgrade/static\";\r\nimport { StreamaxConfigsAccountListComponent } from \"@app/main/modules/foundation/_routes/streamax-configs/account-list/streamax-configs-account-list.component\";\r\nimport { StreamaxConfigsComponent } from \"@app/main/modules/foundation/_routes/streamax-configs/streamax-configs-account-view.component\";\r\nimport { AuthorizationService } from \"@app/services/authorization.service\";\r\nimport { CustomerUserList } from \"@foundation/_routes/customers/userList/user-list.component\";\r\nimport { HomeComponent } from \"@foundation/_routes/home/home.component\";\r\nimport { RouteConfigHelperProvider } from \"@services/routeConfigHelper.provider\";\r\nimport { StateProvider } from \"@uirouter/angularjs\";\r\nimport * as angular from \"angular\";\r\nimport { UserPlatform } from \"../../../interfaces/IUser\";\r\nimport \"./_components/components.module.ajs\";\r\nimport \"./_routes/commissions/commission.module.ajs\";\r\nimport { CustomerSubscriptionsPageComponent } from \"./_routes/customers/customer-subscriptions-page/customer-subscriptions-page.component\";\r\nimport { CustomerSubscriptionsComponent } from \"./_routes/customers/customer-subscriptions/customer-subscriptions.component\";\r\nimport { FoundationCustomerEditComponent } from \"./_routes/customers/customerEdit/customer-edit.component\";\r\nimport { CustomerOverviewComponent } from \"./_routes/customers/customerOverview/customer-overview.component\";\r\nimport { CustomerViewComponent } from \"./_routes/customers/customerView/customer-view.component\";\r\nimport { FoundationCustomersComponent } from \"./_routes/customers/customers.component\";\r\nimport { DeveloperConsoleComponent } from \"./_routes/developerConsole/developer-console.component\";\r\nimport { DeviceHealthAccountsComponent } from \"./_routes/device-health/components/device-health-accounts/device-health-accounts.component\";\r\nimport { DeviceHealthVehicleViewComponent } from \"./_routes/device-health/components/device-health-vehicle-view/device-health-vehicle-view.component\";\r\nimport { DeviceHealthVehiclesComponent } from \"./_routes/device-health/components/device-health-vehicles/device-health-vehicles.component\";\r\nimport { DeviceHealthComponent } from \"./_routes/device-health/components/device-health/device-health.component\";\r\nimport { EngineerCommissionHistoryListComponent } from \"./_routes/engineer-commission-history/engineer-commission-history-list.component\";\r\nimport { EngineerJobItemListComponent } from \"./_routes/engineer-job-items/engineer-job-item-list.component\";\r\nimport { EngineerUsersComponent } from \"./_routes/engineer-users/engineer-users-list.component\";\r\nimport { CameraViewComponent } from \"./_routes/hardware/peripherals/camera-view/camera-view.component\";\r\nimport { PeripheralListComponent } from \"./_routes/hardware/peripherals/peripheral-list/peripheral-list.component\";\r\nimport { PeripheralViewComponent } from \"./_routes/hardware/peripherals/peripheral-view/peripheral-view.component\";\r\nimport { SimListComponent } from \"./_routes/hardware/sim/sim-list/sim-list.component\";\r\nimport { UnitListComponent } from \"./_routes/hardware/units/unit-list/unit-list.component\";\r\nimport { UnitLogsComponent } from \"./_routes/hardware/units/unit-logs/unit-logs.component\";\r\nimport { UnitViewComponent } from \"./_routes/hardware/units/unit-view/unit-view.component\";\r\nimport { JobDetailsComponent } from \"./_routes/jobs/job-details/job-details.component\";\r\nimport { JobListComponent } from \"./_routes/jobs/job-list.component\";\r\nimport { ReleaseNotesComponent } from \"./_routes/release-notes/release-notes.component\";\r\nimport { ApplicationManagerComponent } from \"./_routes/rv-lite/application/_components/application-manager/application-manager.component\";\r\nimport { CameraConfigurationComponent } from \"./_routes/rv-lite/camera-config/camera-configuration.component\";\r\nimport { ConfigManagerComponent } from \"./_routes/rv-lite/config/_components/config-manager/config-manager.component\";\r\nimport { RVLiteComponent } from \"./_routes/rv-lite/rv-lite.component\";\r\nimport { FoundationVehicleListComponent } from \"./_routes/vehicles/vehicle-list.component\";\r\nimport { VehicleViewComponent } from \"./_routes/vehicles/vehicleView/vehicle-view.component\";\r\nimport { VisitFailuresComponent } from \"./_routes/visit-failures/visit-failures.component\";\r\nimport { FoundationAccountService } from \"./_services/account.service.ajs\";\r\nimport { NotesService } from \"./_services/notes.service.ajs\";\r\nimport { FoundationPeripheralService } from \"./_services/peripheral.service.ajs\";\r\nimport { FoundationUserService } from \"./_services/user.service.ajs\";\r\nimport { FoundationVehicleService } from \"./_services/vehicle.service.ajs\";\r\nimport { FoundationNavigationModule } from \"./foundation.navigation\";\r\n\r\n\r\nexport class Config {\r\n\r\n static $inject = [\"$stateProvider\", \"routeConfigHelperProvider\"];\r\n\r\n constructor(\r\n private $stateProvider: StateProvider,\r\n private routeConfigHelperProvider: RouteConfigHelperProvider) {\r\n\r\n var routeConfigHelper = routeConfigHelperProvider.$get();\r\n\r\n $stateProvider.state(FoundationNavigationModule.HomePage, {\r\n url: \"/home\",\r\n views: { \"content@app\": { component: \"foundationHomePage\" } },\r\n data: { translation: 'Common.Home' },\r\n resolve: {\r\n authorize: [\"authorizationService\", (authorization: AuthorizationService) => authorization.authorizeForEngineer()]\r\n }\r\n });\r\n\r\n $stateProvider.state(FoundationNavigationModule.ConfigManager, {\r\n url: \"/config-manager\",\r\n views: { \"content@app\": { component: \"configManager\" } },\r\n data: { translation: 'ConfigManagement.ConfigManagement', subtitleTranslationKey: \"ConfigManagement.ConfigSubTitle\" }\r\n });\r\n\r\n\r\n $stateProvider.state(FoundationNavigationModule.AppManager, {\r\n url: \"/app-manager\",\r\n views: { \"content@app\": { component: \"appManager\" } },\r\n data: { translation: 'AppManagement.AppManagement', subtitleTranslationKey: \"AppManagement.AppSubTitle\" }\r\n });\r\n\r\n $stateProvider.state(FoundationNavigationModule.CameraConfig, {\r\n url: \"/camera-configuration\",\r\n views: { \"content@app\": { component: \"cameraConfiguration\" } },\r\n data: { translation: 'CameraConfiguration.CameraConfiguration', subtitleTranslationKey: \"CameraConfiguration.CameraConfigurationSubTitle\" }\r\n });\r\n\r\n $stateProvider.state(FoundationNavigationModule.Commissioning, {\r\n url: \"/commissioning\",\r\n views: { \"content@app\": { component: \"commissionList\" } },\r\n data: { translation: 'Common.Commissioning', subtitleTranslationKey: \"Commissions.CommissioningSubTitle\" },\r\n resolve: {\r\n authorize: [\"authorizationService\", (authorization: AuthorizationService) => authorization.authorizeForEngineer()]\r\n }\r\n });\r\n\r\n routeConfigHelper.createDetailStateWithBoundParams({\r\n stateName: `${FoundationNavigationModule.Commissioning}.view`,\r\n translation: 'Common.Commissioning',\r\n bindingName: \"commissionId\",\r\n component: \"commissionDetail\",\r\n breadcrumbNameResolverKey: \"commissionDescription\"\r\n });\r\n\r\n $stateProvider.state(FoundationNavigationModule.NewCommissionWithBindings, {\r\n url: \"/new/:jobItemId/:customerId\",\r\n views: {\r\n \"content@app\": { component: \"commissionEditor\", bindings: { jobItemId: \"jobItemId\", customerId: \"customerId\"} }\r\n },\r\n data: { translation: 'Commissions.NewCommission', subtitleTranslationKey: \"Commissions.CreateNewSubtitle\" },\r\n resolve: {\r\n authorize: [\"authorizationService\", (authorization: AuthorizationService) => authorization.authorizeForEngineer()]\r\n }\r\n });\r\n\r\n $stateProvider.state(FoundationNavigationModule.NewCommissionNoBindings, {\r\n url: \"/new\",\r\n views: {\r\n \"content@app\": {\r\n component: \"commissionEditor\"\r\n }\r\n },\r\n data: { translation: 'Commissions.NewCommission', subtitleTranslationKey: \"Commissions.CreateNewSubtitle\" },\r\n resolve: {\r\n authorize: [\"authorizationService\", (authorization: AuthorizationService) => authorization.authorizeForEngineer()]\r\n }\r\n });\r\n\r\n $stateProvider.state(FoundationNavigationModule.NPS, {\r\n url: \"/nps\",\r\n views: { \"content@app\": { component: \"npsDashboard\" } },\r\n data: { translation: \"NpsRater.RouteTitle\", subtitleTranslationKey: \"NpsRater.RouteSubtitle\" }\r\n });\r\n\r\n routeConfigHelper.createDetailStateWithBoundParams({ url: \"/new\", bindingName: \"jobItemId\", stateName: FoundationNavigationModule.JobItemsCommissionNew, component: \"commissionEditor\", translation: 'Common.NewCommission' });\r\n\r\n $stateProvider.state(FoundationNavigationModule.Customers, {\r\n url: \"/customers\",\r\n views: { \"content@app\": { component: \"foundationCustomers\" } },\r\n data: { translation: 'Common.Customers', subtitleTranslationKey: \"FoundationCustomers.CustomersSubTitle\" },\r\n resolve: {\r\n authorize: [\"authorizationService\", (authorization: AuthorizationService) => authorization.authorizeForEngineer()]\r\n }\r\n });\r\n\r\n $stateProvider.state(FoundationNavigationModule.CustomerSubscriptions, {\r\n url: \"/subscriptions\",\r\n views: { \"content@app\": { component: \"customerSubscriptionsPage\" } },\r\n data: { translation: 'CustomerSubscriptionsPage.Subscriptions', subtitleTranslationKey: \"CustomerSubscriptionsPage.SubscriptionsSubTitle\" },\r\n resolve: {\r\n authorize: [\"authorizationService\", (authorization: AuthorizationService) => authorization.authorizeForEngineer()]\r\n }\r\n });\r\n\r\n routeConfigHelper.createDetailStateWithBoundParams({\r\n url: \"/view\",\r\n bindingName: \"customerId\",\r\n stateName: FoundationNavigationModule.CustomerView,\r\n component: \"foundationCustomerView\",\r\n breadcrumbNameResolverKey: \"companyNameBreadcrumbKey\"\r\n });\r\n\r\n routeConfigHelper.createDetailStateWithBoundParams({\r\n url: \"/new\",\r\n bindingName: \"customerId\",\r\n stateName: FoundationNavigationModule.CustomerNew,\r\n component: \"foundationCustomerEdit\"\r\n });\r\n\r\n routeConfigHelper.createDetailStateWithBoundParams({\r\n url: \"/edit\",\r\n bindingName: \"customerId\",\r\n stateName: FoundationNavigationModule.CustomerEdit,\r\n component: \"foundationCustomerEdit\",\r\n breadcrumbNameResolverKey: \"companyNameBreadcrumbKey\"\r\n });\r\n\r\n $stateProvider.state(FoundationNavigationModule.ReleaseNotes, {\r\n url: \"/release-notes\",\r\n views: { \"content@app\": { component: \"releaseNotes\" } },\r\n data: { translation: \"ReleaseNotes.ReleaseNotes\", subtitleTranslationKey: \"ReleaseNotes.ReleaseNotesSubTitle\" }\r\n });\r\n\r\n $stateProvider.state(FoundationNavigationModule.Vehicles, {\r\n url: \"/vehicles\",\r\n views: { \"content@app\": { component: \"foundationVehicleList\" } },\r\n data: { translation: 'Common.Vehicles', subtitle: \"View or edit vehicle information\" },\r\n resolve: {\r\n authorize: [\"authorizationService\", (authorization: AuthorizationService) => authorization.authorizeForEngineer()]\r\n }\r\n });\r\n\r\n $stateProvider.state(FoundationNavigationModule.DeviceHealth, {\r\n url: \"/device-health\",\r\n views: { \"content@app\": { component: \"deviceHealth\" } },\r\n data: { translation: 'DeviceHealth.Title', subtitleTranslationKey: 'DeviceHealth.VehiclesSubTitle' },\r\n resolve: {\r\n authorize: [\"authorizationService\", (authorization: AuthorizationService) => authorization.authorizeForEngineer()]\r\n }\r\n });\r\n\r\n routeConfigHelper.createDetailStateWithBoundParams({\r\n url: \"/view\",\r\n bindingName: \"vehicleId\",\r\n queryParamsNames: [\"filterBy\"],\r\n stateName: FoundationNavigationModule.DeviceHealthVehicleView,\r\n component: \"deviceHealthVehicleView\",\r\n translation: \"DeviceHealth.Vehicles\",\r\n breadcrumbNameResolverKey: \"shortRegBreadcrumbKey\"\r\n });\r\n\r\n $stateProvider.state(FoundationNavigationModule.DeviceHealthCompanies, {\r\n url: \"/vehicles\",\r\n views: { \"content@app\": { component: \"foundationVehicleList\" } },\r\n data: { translation: 'Common.Vehicles', subtitle: \"View or edit vehicle information\" },\r\n resolve: {\r\n authorize: [\"authorizationService\", (authorization: AuthorizationService) => authorization.authorizeForEngineer()]\r\n }\r\n });\r\n\r\n routeConfigHelper.createDetailStateWithBoundParams({\r\n url: \"/view\",\r\n bindingName: \"vehicleId\",\r\n stateName: FoundationNavigationModule.VehicleView,\r\n component: \"vehicleView\",\r\n translation: \"Common.Vehicle\",\r\n breadcrumbNameResolverKey: \"shortRegBreadcrumbKey\"\r\n });\r\n\r\n $stateProvider.state(FoundationNavigationModule.Units, {\r\n url: \"/units\",\r\n views: { \"content@app\": { component: \"unitList\" } },\r\n data: { translation: 'FoundationUnits.Units', subtitleTranslationKey: \"FoundationUnits.UnitsListSubTitle\" }\r\n });\r\n\r\n routeConfigHelper.createDetailStateWithBoundParams({\r\n url: \"/view\",\r\n bindingName: \"unitSerial\",\r\n stateName: `${FoundationNavigationModule.Units}.view`,\r\n component: \"unitView\",\r\n translation: \"FoundationUnits.Units\",\r\n breadcrumbNameResolverKey: \"unitNameBreadcrumbKey\"\r\n });\r\n\r\n $stateProvider.state(FoundationNavigationModule.Cameras, {\r\n url: \"/cameras\",\r\n views: { \"content@app\": { component: \"peripheralList\" } },\r\n data: { translation: 'Common.Cameras', subtitleTranslationKey: \"FoundationPeripherals.CameraListSubTitle\" }\r\n });\r\n\r\n routeConfigHelper.createDetailStateWithBoundParams({\r\n url: \"/view\",\r\n bindingName: \"serial\",\r\n stateName: `${FoundationNavigationModule.Cameras}.view`,\r\n component: \"cameraView\",\r\n translation: \"Common.Cameras\",\r\n breadcrumbNameResolverKey: \"peripheralNameBreadcrumbKey\"\r\n });\r\n\r\n $stateProvider.state(FoundationNavigationModule.Peripherals, {\r\n url: \"/peripherals\",\r\n views: { \"content@app\": { component: \"peripheralList\" } },\r\n data: { translation: 'Common.Peripherals', subtitleTranslationKey: \"FoundationPeripherals.PeripheralListSubTitle\" }\r\n });\r\n\r\n routeConfigHelper.createDetailStateWithBoundParams({\r\n url: \"/view\",\r\n bindingName: \"serial\",\r\n stateName: `${FoundationNavigationModule.Peripherals}.view`,\r\n component: \"peripheralView\",\r\n translation: \"Common.Peripherals\",\r\n breadcrumbNameResolverKey: \"peripheralNameBreadcrumbKey\"\r\n });\r\n\r\n $stateProvider.state(FoundationNavigationModule.Sims, {\r\n url: \"/sims\",\r\n views: { \"content@app\": { component: \"simList\" } },\r\n data: { translation: 'FoundationSims.Sims', subtitleTranslationKey: \"FoundationSims.SimListDescription\" }\r\n });\r\n\r\n $stateProvider.state(FoundationNavigationModule.RVLite, {\r\n url: \"/roadview\",\r\n views: { \"content@app\": { component: \"rvLite\" } },\r\n data: { translation: 'RVLite.RVLite', subtitleTranslationKey: \"RVLite.RVLiteDescription\" }\r\n });\r\n\r\n $stateProvider.state(FoundationNavigationModule.StreamaxConfigsAccountList, {\r\n url: \"/streamax-configs-account-list\",\r\n views: { \"content@app\": { component: \"streamaxConfigsAccountList\" } },\r\n data: { translation: 'StreamaxConfigs.StreamaxConfigs', subtitleTranslationKey: \"StreamaxConfigs.StreamaxConfigsSubtitle\" }\r\n });\r\n\r\n routeConfigHelper.createDetailStateWithBoundParams({\r\n url: \"/accountview\",\r\n stateName: `${FoundationNavigationModule.StreamaxConfigsAccountView}`,\r\n translation: \"Common.Jobs\",\r\n bindingName: \"accountId\",\r\n component: \"streamaxConfigsAccountView\",\r\n breadcrumbNameResolverKey: \"configAccountBreadcrumbKey\"\r\n })\r\n\r\n $stateProvider.state(FoundationNavigationModule.Jobs, {\r\n url: \"/jobs\",\r\n views: { \"content@app\": { component: \"jobList\" } },\r\n data: { translation: 'Common.Jobs', subtitleTranslationKey: \"EngineerJobs.JobsSubTitle\" },\r\n resolve: {\r\n authorize: [\"authorizationService\", (authorization: AuthorizationService) => authorization.authorizeForEngineer()]\r\n }\r\n });\r\n\r\n routeConfigHelper.createDetailStateWithBoundParams({\r\n url: '/view',\r\n stateName: FoundationNavigationModule.JobView,\r\n translation: \"Common.Jobs\",\r\n bindingName: \"jobId\",\r\n component: \"jobDetails\",\r\n breadcrumbNameResolverKey: \"jobBreadcrumbKey\"\r\n });\r\n\r\n $stateProvider.state(FoundationNavigationModule.VisitFailures, {\r\n url: \"/visit-failures\",\r\n views: { \"content@app\": { component: \"visitFailures\" } },\r\n data: { translation: 'VisitFailures.VisitFailures', subtitleTranslationKey: \"VisitFailures.VisitFailuresSubtitle\" }\r\n });\r\n\r\n $stateProvider.state(FoundationNavigationModule.JobItems, {\r\n url: \"/engineerjobitems\",\r\n views: { \"content@app\": { component: \"engineerJobItemList\" } },\r\n data: { translation: 'EngineerJobItemList.JobItems', subtitleTranslationKey: \"EngineerJobItemList.JobItemsSubTitle\" }\r\n });\r\n\r\n $stateProvider.state(FoundationNavigationModule.EngineerHistory, {\r\n url: \"/engineer-history\",\r\n views: { \"content@app\": { component: \"engineerCommissionHistoryList\" } },\r\n data: { translation: 'EngineerHistory.CommissionHistory', subtitleTranslationKey: \"EngineerHistory.CommissionHistorySubtitle\" }\r\n });\r\n\r\n $stateProvider.state(FoundationNavigationModule.DeveloperConsole, {\r\n url: \"/console\",\r\n views: { \"content@app\": { component: \"developerConsole\" } },\r\n data: { translation: 'DeveloperConsole.Console', subtitleTranslationKey: \"DeveloperConsole.ConsoleSubtitle\" }\r\n });\r\n\r\n $stateProvider.state(FoundationNavigationModule.Engineers, {\r\n url: \"/engineers\",\r\n views: { \"content@app\": { component: \"engineerUsers\" } },\r\n data: { translation: 'EngineerUsers.Engineers', subtitleTranslationKey: \"EngineerUsers.EngineersSubTitle\" },\r\n resolve: {\r\n authorize: [\"authorizationService\", (authorization: AuthorizationService) => authorization.authorizeForEngineer()]\r\n }\r\n });\r\n\r\n $stateProvider.state(FoundationNavigationModule.ParentRoot, {\r\n abstract: true,\r\n url: \"/foundation\",\r\n redirectTo: FoundationNavigationModule.Default,\r\n views: { \"module-navigation\": {} },\r\n data: { translation: 'Common.Foundation', theme: \"AddSecure\", userPlatform: UserPlatform.Foundation }\r\n });\r\n }\r\n}\r\n\r\nangular\r\n .module(\"app.foundation\", [\r\n \"app.directives\",\r\n \"app.foundation.commission\",\r\n \"app.foundation.components\",/*, \"app.foundation.tickets\"*/])\r\n .config(Config)\r\n\r\n .service(\"foundationAccountService\", FoundationAccountService)\r\n\r\n\r\n .service(\"foundationUserService\", FoundationUserService)\r\n .service(\"foundationVehicleService\", FoundationVehicleService)\r\n .service(\"foundationPeripheralService\", FoundationPeripheralService)\r\n .service(\"notesService\", NotesService)\r\n\r\n .component(\"foundationHomePage\", new HomeComponent())\r\n\r\n .directive(\"foundationCustomers\", downgradeComponent({ component: FoundationCustomersComponent }))\r\n .directive(\"engineerUsers\", downgradeComponent({ component: EngineerUsersComponent }))\r\n .directive(\"jobList\", downgradeComponent({ component: JobListComponent }))\r\n .directive(\"engineerJobItemList\", downgradeComponent({ component: EngineerJobItemListComponent }))\r\n .directive(\"engineerCommissionHistoryList\", downgradeComponent({ component: EngineerCommissionHistoryListComponent }))\r\n .directive(\"developerConsole\", downgradeComponent({ component: DeveloperConsoleComponent }))\r\n .directive(\"jobDetails\", downgradeComponent({ component: JobDetailsComponent }))\r\n .directive(\"foundationVehicleList\", downgradeComponent({ component: FoundationVehicleListComponent }))\r\n .directive(\"vehicleView\", downgradeComponent({ component: VehicleViewComponent }))\r\n .directive(\"customerOverview\", downgradeComponent({ component: CustomerOverviewComponent }))\r\n .directive(\"customerUserList\", downgradeComponent({ component: CustomerUserList }))\r\n .directive(\"foundationCustomerView\", downgradeComponent({ component: CustomerViewComponent }))\r\n .directive(\"foundationCustomerEdit\", downgradeComponent({ component: FoundationCustomerEditComponent }))\r\n\r\n .directive(\"deviceHealth\", downgradeComponent({ component: DeviceHealthComponent }))\r\n .directive(\"deviceHealthAccounts\", downgradeComponent({ component: DeviceHealthAccountsComponent }))\r\n .directive(\"deviceHealthVehicles\", downgradeComponent({ component: DeviceHealthVehiclesComponent }))\r\n .directive(\"deviceHealthVehicleView\", downgradeComponent({ component: DeviceHealthVehicleViewComponent }))\r\n\r\n .directive(\"customerSubscriptions\", downgradeComponent({ component: CustomerSubscriptionsComponent }))\r\n .directive(\"customerSubscriptionsPage\", downgradeComponent({ component: CustomerSubscriptionsPageComponent }))\r\n\r\n .directive(\"configManager\", downgradeComponent({ component: ConfigManagerComponent }))\r\n .directive(\"appManager\", downgradeComponent({ component: ApplicationManagerComponent }))\r\n .directive(\"cameraConfiguration\", downgradeComponent({ component: CameraConfigurationComponent }))\r\n\r\n .directive(\"peripheralList\", downgradeComponent({ component: PeripheralListComponent }))\r\n .directive(\"simList\", downgradeComponent({ component: SimListComponent }))\r\n .directive(\"rvLite\", downgradeComponent({ component: RVLiteComponent }))\r\n .directive(\"streamaxConfigsAccountList\", downgradeComponent({ component: StreamaxConfigsAccountListComponent }))\r\n .directive(\"streamaxConfigsAccountView\", downgradeComponent({ component: StreamaxConfigsComponent }))\r\n .directive(\"unitList\", downgradeComponent({ component: UnitListComponent }))\r\n .directive(\"unitView\", downgradeComponent({ component: UnitViewComponent }))\r\n\r\n .directive(\"unitLogs\", downgradeComponent({ component: UnitLogsComponent }))\r\n .directive(\"peripheralView\", downgradeComponent({ component: PeripheralViewComponent }))\r\n .directive(\"cameraView\", downgradeComponent({ component: CameraViewComponent }))\r\n .directive(\"visitFailures\", downgradeComponent({ component: VisitFailuresComponent }))\r\n\r\n\r\n .directive(\"releaseNotes\", downgradeComponent({ component: ReleaseNotesComponent }))\r\n\r\n ;\r\n","\r\nimport * as angular from \"angular\";\r\nimport * as moment from \"moment\";\r\n\r\nimport { IMessageModel, IUnreadMessageModel } from \"../models/IMessageModel\";\r\nimport { ExpiryOptionsModel } from \"../models/ExpiryOptionsModel\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\n\r\nexport class MessageService {\r\n\r\n static UnreadMessageCountUpdatedEvent = \"UnreadMessageCountUpdatedEvent\";\r\n\r\n static $inject = [\"$rootScope\", \"$http\", \"translationService\"];\r\n\r\n constructor(\r\n private $rootScope: angular.IRootScopeService,\r\n private $http: angular.IHttpService,\n private translationService: TranslationService) {\r\n }\r\n\r\n getLatestMessages(): angular.IPromise {\r\n return this.$http\r\n .get(\"/api/messages/latest\")\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n getMessageUnreadCounts() {\r\n return this.$http\r\n .get(\"/api/messages/unread\")\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n var unreadMessageModels = result.data;\r\n\r\n var numUnreadMessages = 0;\r\n angular.forEach(unreadMessageModels, unreadMessage => {\r\n numUnreadMessages += unreadMessage.UnreadMessages;\r\n });\r\n\r\n this.$rootScope.$broadcast(MessageService.UnreadMessageCountUpdatedEvent, numUnreadMessages);\r\n\r\n return unreadMessageModels;\r\n });\r\n }\r\n\r\n sendMessage(message: IMessageModel): angular.IPromise {\r\n return this.$http\r\n .post(\"/api/messages/\", message)\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n getMessagesForVehicle(vehicleId: number, page: number, pageSize: number, dateFrom?: moment.Moment, dateTo?: moment.Moment): angular.IPromise {\r\n\r\n if (!vehicleId) {\r\n console.error(\"No vehicle supplied in getMessagesForVehicle()\", vehicleId);\r\n }\r\n\r\n var params: any = {\r\n page: page,\r\n pageSize: pageSize,\r\n dateFrom: dateFrom ? dateFrom.utc().format() : null,\r\n dateTo: dateTo ? dateTo.utc().format() : null\r\n };\r\n\r\n return this\r\n .$http({\r\n method: \"GET\",\r\n url: `/api/messages/vehicle/${vehicleId}`,\r\n params: params\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n setConversationMessagesToRead(vehicleId: number): angular.IPromise {\r\n return this.$http({\r\n method: \"POST\",\r\n url: `/api/messages/vehicle/${vehicleId}/read`\r\n });\r\n }\r\n\r\n setMessageToRead(messageId: number): angular.IPromise {\r\n return this.$http({\r\n method: \"POST\",\r\n url: `/api/messages/${messageId}/read`\r\n });\r\n }\r\n\r\n createMessageModel(messageBody: string, expiryCode: number): IMessageModel {\r\n\r\n var newMessage: IMessageModel = {\r\n VehicleId: -1,\r\n GroupId: -1,\r\n Body: messageBody,\r\n Subject: \"\",\r\n ExpiryCode: expiryCode,\r\n MsgCode: -1, // Used by UI to indicate \"sending\"\r\n TimestampQueued: moment().toISOString(),\r\n Id: 1000000000,\r\n Originator: 0\r\n };\r\n\r\n return newMessage;\r\n }\r\n\r\n getExpiryOptions(): ExpiryOptionsModel[] {\r\n const expiryOptions: ExpiryOptionsModel[] = [];\n\r\n expiryOptions.push(new ExpiryOptionsModel(2, `1 ${this.translationService.t(\"Common.Hour\")}`));\r\n expiryOptions.push(new ExpiryOptionsModel(3, `2 ${this.translationService.t(\"Common.Hours\")}`));\r\n expiryOptions.push(new ExpiryOptionsModel(4, `4 ${this.translationService.t(\"Common.Hours\")}`));\r\n expiryOptions.push(new ExpiryOptionsModel(5, `8 ${this.translationService.t(\"Common.Hours\")}`));\r\n expiryOptions.push(new ExpiryOptionsModel(6, `12 ${this.translationService.t(\"Common.Hours\")}`));\r\n expiryOptions.push(new ExpiryOptionsModel(7, `24 ${this.translationService.t(\"Common.Hours\")}`));\r\n\r\n return expiryOptions;\r\n }\r\n}\r\n","\r\nimport * as angular from \"angular\";\r\n\r\nimport { ExpiryOptionsModel } from \"./models/ExpiryOptionsModel\";\r\nimport { IGroup } from \"@interfaces/IVehicleGroup\";\r\nimport { MessageService } from \"./service/messaging.service\";\r\nimport { GroupService } from \"@services/group.service.ajs\";\r\n\r\nexport class GroupMessageController {\r\n\r\n messageBody = \"\";\r\n expiryOptions: ExpiryOptionsModel[] = [];\r\n messageReplyExpiryId: number;\r\n\r\n vehicleGroups: IGroup[];\r\n selectedGroupId: number;\n selectedGroupHasNoVehicles: boolean;\r\n\r\n static $inject = [\"$mdDialog\", \"messageService\", \"groupService\"];\r\n\r\n constructor(\r\n private $mdDialog: angular.material.IDialogService,\r\n private messageService: MessageService,\r\n private groupService: GroupService) {\r\n\r\n this.expiryOptions = this.messageService.getExpiryOptions();\n\r\n this.messageReplyExpiryId = this.expiryOptions[this.expiryOptions.length - 1].id;\r\n\r\n this.groupService\r\n .getGroups(true)\r\n .then(groups => {\r\n this.vehicleGroups = groups;\r\n this.selectedGroupId = this.vehicleGroups[0].Id;\n this.onGroupChange()\r\n });\r\n }\r\n\n onGroupChange() {\n var selectedGroup = this.vehicleGroups.find(group => group.Id == this.selectedGroupId);\n this.selectedGroupHasNoVehicles = selectedGroup.VehicleIds.length == 0;\n\n \n }\n\r\n sendGroupMessage() {\r\n const groupMessageConfig = {\r\n groupId: this.selectedGroupId,\r\n messageBody: this.messageBody,\r\n expiryId: this.messageReplyExpiryId\r\n };\r\n\r\n this.$mdDialog.hide(groupMessageConfig);\r\n }\r\n\r\n cancel() {\r\n this.$mdDialog.cancel();\r\n }\r\n}\r\n","\r\nimport { VehicleModel } from \"../../../../model/VehicleModel\";\r\nimport { IMessageModel } from \"./IMessageModel\";\r\nimport { MessageService } from \"../service/messaging.service\";\r\n\r\nexport class Conversation {\r\n vehicle: VehicleModel;\r\n lastMessage: IMessageModel;\r\n messages: IMessageModel[];\r\n\r\n unreadMessageCount: number;\r\n\r\n constructor(messageService: MessageService, private $filter: angular.IFilterService) {\r\n this.lastMessage = messageService.createMessageModel(\"\", -1);\r\n this.lastMessage.Id = -1;\r\n this.messages = [];\r\n this.unreadMessageCount = 0;\r\n }\r\n\r\n getNextPageNumber(pageSize: number): number {\r\n return Math.ceil((this.messages.length + pageSize) / pageSize);\r\n }\r\n\r\n clearMessages() {\r\n this.messages = [];\r\n }\r\n\r\n applyNewMessages(messages: IMessageModel[]) {\r\n for (var i = 0; i < messages.length; i++) {\r\n var m = messages[i];\r\n\r\n this.updateOrPushMessage(m);\r\n }\r\n\r\n this.unreadMessageCount = 0;\r\n this.messages.forEach(message => {\r\n if (message.Originator === 1 && message.MsgCode !== 6) {\r\n this.unreadMessageCount++;\r\n }\r\n });\r\n\r\n this.messages = this.$filter(\"orderBy\")(this.messages, arrayMessage => arrayMessage.Id, true);\r\n }\r\n\r\n private updateOrPushMessage(message: IMessageModel) {\r\n var found = false;\r\n for (var i = 0; i < this.messages.length; i++) {\r\n\r\n if (this.messages[i].Id === message.Id) {\r\n found = true;\r\n\r\n this.messages[i] = message;\r\n }\r\n }\r\n\r\n if (!found) {\r\n this.messages.push(message);\r\n }\r\n }\r\n}\r\n","export enum NotificationRecipientType {\r\n Email,\r\n Sms\r\n}\r\n","export enum NotificationRecordStatus {\r\n Unknown,\r\n Pending,\r\n Sent,\r\n Delivered,\r\n Read,\r\n Failed,\r\n OverQuota,\r\n}\r\n","import './common/common';\r\nimport 'zone.js';\r\nimport \"core-js/proposals/reflect-metadata\";\r\nimport \"./bootstrap\";\r\n","type predicate = (arg: T) => boolean;\r\n\r\ninterface Array {\r\n firstOrDefault(predicate?: predicate): T;\r\n any(): T;\r\n groupBy(keyFn: (item: T) => K): Record;\r\n}\r\n\r\nArray.prototype.firstOrDefault = function (predicate?: Function) {\r\n return this.reduce((accumulator, currentValue) => {\r\n\r\n if (!accumulator && (!predicate || predicate(currentValue)))\r\n accumulator = currentValue;\r\n\r\n return accumulator;\r\n }, null);\r\n};\r\n\r\nArray.prototype.any = function () {\r\n return this.some(item => item);\r\n}\r\n\r\nArray.prototype.groupBy = function (\r\n this: T[],\r\n keyFn: (item: T) => K\r\n ): Record {\r\n return this.reduce((acc, item) => {\r\n const key = keyFn(item);\r\n (acc[key] = acc[key] || []).push(item);\r\n return acc;\r\n }, {} as Record);\r\n};","import * as angular from 'angular';\r\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\r\nimport './app.module.ajs';\r\nimport { NgAppModule } from './app.module';\r\n\r\n// Wait for the DOM to be ready\r\nangular.element(() => {\r\n // Manually bootstrap AngularJS\r\n angular.bootstrap(document.body, ['veriApp'], { strictDi: true });\r\n\r\n // Then bootstrap Angular\r\n platformBrowserDynamic()\r\n .bootstrapModule(NgAppModule)\r\n .catch(err => console.error(err));\r\n});\r\n","import { CommonModule } from \"@angular/common\";\r\nimport { NgModule, Type } from \"@angular/core\";\r\nimport { MapDirectivesModule } from \"@directives/_map/_map.directives.module\";\r\nimport { TooltipService } from \"@directives/_misc/tooltip/tooltip.service\";\r\nimport { TranslatePipe } from \"src/app/_pipes/translate.pipe\";\r\nimport { VeriDatePipe } from \"../_pipes/veri-date.pipe\";\r\nimport { PipesModule } from \"../_pipes/_pipes.module\";\r\nimport { SplashScreenComponent } from \"./splash-screen/splash-screen.component\";\r\nimport { UnauthorizedViewComponent } from \"./unauthorized-view/unauthorized-view.component\";\r\nimport { CoreDirectivesModule } from \"./_core/_core.directives.module\";\r\nimport { FormsDirectivesModule } from \"./_forms/_form.directives.module\";\r\nimport { LayoutDirectivesModule } from \"./_layout/_layout.directives.module\";\r\nimport { MiscDirectivesModule } from \"./_misc/_misc.directives.module\";\r\nimport { ResourceFiltersDirectivesModule } from \"./_resourceFilters/_resourceFilters.directives.module\";\r\nimport { VehicleDirectivesModule } from \"./_vehicle/_vehicle.directives.module\";\r\nimport { VeriDirectivesModule } from \"./_veri/_veri.directives.module\";\r\n\r\nconst privateComponents: Type[] = [\r\n\n];\r\n\r\nconst publicComponents: Type[] = [\n SplashScreenComponent,\n UnauthorizedViewComponent\r\n];\r\n\r\nconst providers: any[] = [\n TooltipService,\r\n VeriDatePipe,\r\n TranslatePipe\r\n];\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n VehicleDirectivesModule,\r\n VeriDirectivesModule,\r\n MiscDirectivesModule,\r\n FormsDirectivesModule,\n ResourceFiltersDirectivesModule,\r\n PipesModule,\r\n MapDirectivesModule,\n LayoutDirectivesModule,\n CoreDirectivesModule\n ],\r\n providers: providers,\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents],\r\n exports: [...publicComponents]\r\n})\r\nexport class DirectivesModule {\r\n constructor() {\r\n }\r\n}\r\n","module.exports = \"
\";","import { IAccumulatedData } from \"./IAccumulatedData\";\r\n\r\nexport enum EventType {\r\n HarshBraking = 1,\r\n OverRpm = 2,\r\n Unknown3 = 3,\r\n Pto = 4,\r\n OverTorque = 8,\r\n BadAnticipation = 16,\r\n Idling = 32,\r\n OverAcceleration = 64\r\n}\r\n\r\nexport enum EventFlag {\r\n End,\r\n Start,\r\n}\r\n\r\nexport interface ISensorData extends IAccumulatedData {\r\n PlotId: number;\r\n VehicleId?: number;\r\n Utc: Date;\r\n Header: string;\r\n Profile: string;\r\n ExtendedInfo: string;\r\n BatteryLevel?: number;\r\n CruiseActive?: boolean;\r\n EngineRpm?: number;\r\n EventType?: EventType;\r\n EventFlag?: EventFlag;\r\n EventEntryValue?: number;\r\n EventExitValue?: number;\r\n EventMaxValue?: number;\r\n EventDuration?: number;\r\n FuelLevel?: number;\r\n OdometerKm?: number;\n PrimaryAuxBatteryVoltage?: number;\n PrimaryAuxEngineFuelLevel?: number;\n PrimaryAuxElectricOnDuration?: number; // Given in seconds\n PrimaryAuxEngineOnDuration?: number; // Given in seconds\n PrimaryAuxEngineSource?: number;\n PrimaryAuxStandbyOnDuration?: number; // Given in seconds\r\n PtoActive?: boolean;\r\n TachoSlot1Driver: string;\r\n TachoSlot1WorkState?: number;\r\n TachoSlot1TimeState?: number;\r\n TachoSlot1DrivingTime?: number;\r\n TachoSlot2Driver: string;\r\n TachoSlot2WorkState?: number;\r\n TachoSlot2TimeState?: number;\r\n TachoSlot2DrivingTime?: number;\r\n ThrottlePosition?: number;\r\n TotalWeight?: number;\r\n TrailerId: string;\r\n TrailerConnected?: boolean;\r\n VehicleIdentificationNumber: string;\r\n Velocity?: number;\r\n VelocityMax?: number;\r\n}\r\n","module.exports = \" \";","import { Directive, ElementRef, Injector, Input } from '@angular/core';\r\nimport { UpgradeComponent } from '@angular/upgrade/static';\r\nimport { IGoogleMapsMarker } from '@app/interfaces/IGoogleMapsMarkerOptions';\r\nimport { IJourney } from '@app/interfaces/IJourney';\r\nimport { IPlot } from '@app/interfaces/IPlot';\r\n\r\n@Directive({\r\n selector: 'veri-map-container'\r\n})\r\nexport class VeriMapContainerComponentFacade extends UpgradeComponent {\r\n @Input() hideGeofences: boolean;\r\n @Input() journeys: IJourney[];\r\n @Input() plots: IPlot[];\r\n @Input() selectedPlot: IPlot;\r\n @Input() locationMarker: IGoogleMapsMarker;\r\n\r\n constructor(elementRef: ElementRef, injector: Injector) {\r\n super('veriMapContainer', elementRef, injector);\r\n }\r\n}\r\n","module.exports = \" 0\\\" [polylines]=polylines> \";","import { Directive, ElementRef, Injector, Input } from '@angular/core';\r\nimport { UpgradeComponent } from '@angular/upgrade/static';\r\nimport { IGeofence } from '@app/interfaces/IGeofences';\r\n\r\n@Directive({\r\n selector: 'veri-map-single-geofence'\r\n})\r\nexport class VeriMapSingleGeofenceComponentFacade extends UpgradeComponent {\r\n @Input() geofence: IGeofence;\r\n\r\n constructor(elementRef: ElementRef, injector: Injector) {\r\n super('veriMapSingleGeofence', elementRef, injector);\r\n }\r\n}\r\n","import { Pipe, PipeTransform, Injectable } from \"@angular/core\";\r\n\r\n@Pipe({\r\n name: 'enumNames'\r\n})\r\n@Injectable()\r\nexport class EnumNamesPipe implements PipeTransform {\r\n constructor() { }\r\n\r\n transform(value: string[], parsedEnum: any): string[] {\r\n if (!value) {\r\n return [\"\"];\r\n }\r\n\r\n const keys = Object.keys(value);\r\n const firstHalf = keys.splice(keys.length / 2);\r\n\r\n return firstHalf;\r\n }\r\n}\r\n","import { Injectable, Pipe, PipeTransform } from \"@angular/core\";\r\nimport { GeocodeService } from \"@app/services/geocode.service\";\r\n\r\n@Pipe({ name: 'location' })\r\n@Injectable()\r\nexport class VLocationPipe implements PipeTransform {\r\n constructor(private readonly geocodeService: GeocodeService) { }\r\n\r\n transform(input: number): Promise {\r\n\r\n if (!input || isNaN(Number(input))) {\r\n return Promise.resolve(null);\r\n }\r\n\r\n return new Promise((res, rej) => {\r\n // Wrapping angular iPromise in an ES6 Promise so that the async pipe can be used\r\n this.geocodeService.getLocationInformationFromPlotId(Number(input)).then(location => {\r\n if (!location) {\r\n return rej(\"No location found for plot\" + input)\r\n }\r\n\r\n return res(location.LocationDescription);\r\n })\r\n })\r\n }\r\n}\r\n","import { Injectable, Pipe, PipeTransform } from \"@angular/core\";\r\nimport { DateService, IDateFormatOptions } from \"@services/date.service\";\r\n\r\n@Pipe({\r\n name: 'vDate',\r\n pure: true\r\n})\r\n@Injectable()\r\nexport class VDatePipe implements PipeTransform {\r\n constructor(private dateService: DateService) {\r\n \r\n }\r\n\r\n transform(input: string, options: IDateFormatOptions): string {\r\n return this.dateService.formatDate(input, options);\r\n }\r\n}\r\n","import { Pipe, PipeTransform, Injectable } from \"@angular/core\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\n\r\n@Pipe({ name: 'enumAsString' })\r\n@Injectable()\r\nexport class EnumAsString implements PipeTransform {\r\n constructor(private translationService: TranslationService) { }\r\n\r\n transform(value: number, type: T, parsedEnum: any): string {\r\n if (!type[value]) {\r\n return;\r\n }\r\n\r\n return this.translationService.tEnum(type, parsedEnum.toString(), value);\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from \"@angular/core\";\r\n\r\n@Pipe({\r\n name: \"formatNumber\",\r\n})\r\nexport class FormatNumberPipe implements PipeTransform {\r\n\r\n transform(input: string) {\r\n\r\n var inputNumber = Number(input);\r\n\r\n if (inputNumber > 1000) {\r\n var thousands = inputNumber / 1000;\r\n thousands = Math.round(thousands * 10) / 10;\r\n return `${thousands}k`;\r\n }\r\n\r\n return input;\r\n }\r\n}\r\n","import { Injectable, Pipe, PipeTransform } from \"@angular/core\";\r\nimport { SortDirection } from \"@enums/SortDirection\";\r\nimport { SortType } from \"@enums/SortType\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\n\r\n@Pipe({ name: 'orderByProp' })\r\n@Injectable()\r\nexport class OrderByPropPipe implements PipeTransform {\r\n constructor(private veriDate: VeriDate) { }\r\n\r\n transform(data: any[], property: string, sortType: SortType = SortType.String, ascending: boolean = true): any[] {\r\n\r\n if (!data.length) {\r\n return [];\r\n }\r\n\r\n const dataCopy = [...data];\r\n\r\n if (!property) {\r\n return dataCopy;\r\n }\r\n\r\n const sortDirection = (ascending) ? SortDirection.Ascending : SortDirection.Descending;\r\n\r\n return dataCopy.sort((data1, data2) => {\r\n if (!data1[property] || !data2[property]) {\r\n return 0;\r\n }\r\n\r\n return this.getSortResponse(data1[property], data2[property], sortType, sortDirection);\r\n });\r\n }\r\n\r\n private getSortResponse(data1: any, data2: any, sortType: SortType, sortDirection: SortDirection): number {\r\n if (data1 == data2) {\r\n return 0;\r\n }\r\n else if (data1 == null) {\r\n return sortDirection === SortDirection.Ascending ? -1 : 1\r\n }\r\n else if (data2 == null) {\r\n return sortDirection === SortDirection.Ascending ? 1 : -1\r\n }\r\n else if (sortType === SortType.Date) {\r\n return this.veriDate.sort(data1, data2, sortDirection);\r\n }\r\n else if (sortType === SortType.Number) {\r\n const direction = sortDirection === SortDirection.Ascending ? -1 : 1;\r\n\r\n if (typeof data1 === \"string\") {\r\n return direction;\r\n }\r\n\r\n return data1 < data2 ? 1 * direction : -1 * direction;\r\n }\r\n else if (sortType === SortType.Boolean) {\r\n const direction = sortDirection === SortDirection.Ascending ? -1 : 1;\r\n\r\n return data1 && !data2 ? 1 * direction : -1 * direction;\r\n }\r\n else {\r\n return sortDirection === SortDirection.Ascending\r\n ? data1.localeCompare(data2)\r\n : data2.localeCompare(data1);\r\n }\r\n }\r\n}\r\n","import { Injectable, Pipe, PipeTransform } from \"@angular/core\";\r\nimport { DateService } from \"@services/date.service\";\r\n\r\n@Pipe({ name: 'ordinalSuffix' })\r\n@Injectable()\r\nexport class VOrdinalSuffixPipe implements PipeTransform {\r\n constructor(private dateService: DateService) { }\r\n\r\n transform(input: string): string {\r\n return this.dateService.getOrdinalSuffix(Number(input));\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from \"@angular/core\";\r\nimport {parsePhoneNumberWithError, ParseError } from \"libphonenumber-js/min\";\r\n\r\n@Pipe({\r\n name: \"phoneNumber\",\r\n})\r\nexport class PhoneNumberPipe implements PipeTransform {\r\n transform(value: string | undefined | null, ...args: string[]): any {\r\n try {\r\n const phoneNumber = parsePhoneNumberWithError(value);\r\n return phoneNumber.isValid() ? phoneNumber.format('INTERNATIONAL') : value;\r\n } catch (error) {\r\n if (error instanceof ParseError) {\r\n console.log(error.message)\r\n }\r\n return value;\r\n }\r\n }\r\n}\r\n","import { Injectable, Pipe, PipeTransform } from \"@angular/core\";\r\nimport { DateService, IDateFormatOptions } from \"@services/date.service\";\r\n\r\n@Pipe({ name: 'relativeTime' })\r\n@Injectable()\r\nexport class VRelativeTimePipe implements PipeTransform {\r\n constructor(private dateService: DateService) { }\r\n\r\n transform(input: string, options: IDateFormatOptions): string {\r\n return this.dateService.relativeTime(input);\r\n }\r\n}\r\n","import { Injectable, Pipe, PipeTransform } from \"@angular/core\";\r\n\r\nexport interface ISplitPascalCaseParams {\r\n ignoreDigits?: boolean;\r\n}\r\n\r\n@Pipe({ name: 'splitPascalCase' })\r\n@Injectable()\r\nexport class SplitPascalCasePipe implements PipeTransform {\r\n constructor() { }\r\n\r\n transform(input: string, params?: ISplitPascalCaseParams): string {\r\n if (params?.ignoreDigits) {\r\n return (!!input)\r\n ? input.replace(/([A-Z][a-z])/g, \" $1\").trim()\r\n : \"\";\r\n }\r\n\r\n return (!!input)\r\n ? input.replace(/([A-Z][a-z])/g, \" $1\").replace(/(\\d)/g, \" $1\").trim()\r\n : \"\";\r\n }\r\n}\r\n","import { Injectable, Pipe, PipeTransform } from \"@angular/core\";\r\nimport { DateService } from \"@services/date.service\";\r\n\r\n@Pipe({ name: 'vTime' })\r\n@Injectable()\r\nexport class VTimePipe implements PipeTransform {\r\n constructor(private dateService: DateService) { }\r\n\r\n transform(input: string): string {\r\n return this.dateService.getTimeAsString(input, true);\r\n }\r\n}\r\n","import { Injectable, Pipe, PipeTransform } from \"@angular/core\";\r\nimport { UnitConversionService, UnitConversionType } from \"@services/unitConversion.service\";\r\n\r\n@Pipe({ name: 'unitConversion' })\r\n@Injectable()\r\nexport class UnitConversionPipe implements PipeTransform {\r\n constructor(private unitConversionService: UnitConversionService) { }\r\n\r\n transform(input: string, includeUnit?: boolean, conversionTypeString?: string, precision?: number): string {\r\n\r\n let conversionType = UnitConversionType.Speed;\r\n\r\n if (conversionTypeString) {\r\n conversionType = this.unitConversionService.getConversionType(conversionTypeString);\r\n }\r\n\r\n if (includeUnit) {\r\n return this.unitConversionService.convertUnitWithSuffix(input, conversionType, precision);\r\n }\r\n\r\n return this.unitConversionService.convertUnitWithFormatting(input, conversionType, precision);\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { isObservable, of } from 'rxjs';\r\nimport { map, startWith, catchError } from 'rxjs/operators';\r\n\r\n//https://medium.com/angular-in-depth/angular-show-loading-indicator-when-obs-async-is-not-yet-resolved-9d8e5497dd8\r\n\r\n@Pipe({\r\n name: 'withLoading',\r\n})\r\nexport class WithLoadingPipe implements PipeTransform {\r\n transform(val) {\r\n return isObservable(val)\r\n ? val.pipe(\r\n map((value: any) => ({\r\n loading: value.type === 'start',\r\n value: value.type ? value.value : value\r\n })),\r\n startWith({ loading: true }),\r\n catchError(error => of({ loading: false, error }))\r\n )\r\n : val;\r\n }\r\n}\r\n","module.exports = \"
\";","module.exports = \" \";","module.exports = \"{{label}} \";","module.exports = \" \";","import { Directive, ElementRef, Input } from \"@angular/core\";\r\n\r\n@Directive({\r\n selector: \"[bindCssVariable]\"\r\n})\r\nexport class BindCssVariableDirective {\r\n @Input(\"bindCssVariable\") variable: string;\r\n @Input(\"bindCssVariableValue\") value: string;\r\n\r\n constructor(private host: ElementRef) { }\r\n\r\n ngOnChanges(changes) {\r\n const value = changes.value.currentValue;\r\n\r\n if (!value) {\r\n this.host.nativeElement.style.removeProperty(`--${this.variable}`);\r\n return;\r\n }\r\n\r\n this.host.nativeElement.style.setProperty(`--${this.variable}`, value);\r\n }\r\n}\r\n","import { AfterViewInit, Directive, ElementRef, HostListener, Input, OnDestroy, OnInit } from \"@angular/core\";\r\nimport { HTMLService } from \"@services/htmlService.service\";\r\nimport { fromEvent, Subscription } from \"rxjs\";\r\nimport { debounceTime, tap, throttleTime } from \"rxjs/operators\";\r\nimport \"./scroll-shadow.directive.scss\";\r\n\r\n@Directive({\r\n selector: \"[scrollShadow]\"\r\n})\r\nexport class ScrollShadowDirective implements OnInit, OnDestroy, AfterViewInit {\r\n @Input(\"scrollShadow\") direction: \"both\" | \"top\" | \"bottom\" = \"both\";\r\n\r\n // ---\r\n\r\n private topShadow: HTMLElement;\r\n private bottomShadow: HTMLElement;\r\n\r\n private showingTopShadow = false;\r\n private showingBottomShadow = false;\r\n\r\n private subscriptons = new Subscription();\r\n\r\n constructor(\r\n private el: ElementRef,\r\n private readonly htmlService: HTMLService) {\r\n }\r\n\r\n ngOnInit() {\r\n this.subscriptons.add(fromEvent(this.el.nativeElement, 'scroll').pipe(\r\n throttleTime(10), // emits once, then ignores subsequent emissions for 50ms, repeat...\r\n tap(event => {\r\n this.showHideShadows();\r\n this.addRemoveScrollingClass();\r\n })\r\n ).subscribe());\r\n }\r\n\r\n ngOnDestroy() {\r\n this.subscriptons.unsubscribe();\r\n }\r\n\r\n ngAfterViewInit() {\r\n\r\n this.topShadow = this.createShadow(\"top\");\r\n this.bottomShadow = this.createShadow(\"bottom\");\r\n\r\n this.accountForParentPaddings();\r\n setTimeout(() => {\r\n this.showHideShadows();\r\n });\r\n }\r\n\r\n // ---\r\n\r\n scrolling = false;\r\n removeScrollTimeout: number;\r\n private addRemoveScrollingClass() {\r\n if (!this.scrolling) {\r\n this.el.nativeElement.classList.add(\"scrolling\");\r\n this.scrolling = true;\r\n }\r\n\r\n if (this.removeScrollTimeout) {\r\n clearTimeout(this.removeScrollTimeout);\r\n }\r\n\r\n this.removeScrollTimeout = window.setTimeout(() => {\r\n this.el.nativeElement.classList.remove(\"scrolling\");\r\n this.removeScrollTimeout = null;\r\n });\r\n }\r\n\r\n private createShadow(position: \"top\" | \"bottom\"): HTMLElement {\r\n const child = document.createElement('div');\r\n\r\n child.className += `scroll-shadow-${position}`;\r\n\r\n if (position == \"top\") {\r\n this.el.nativeElement.prepend(child);\r\n }\r\n else {\r\n this.el.nativeElement.appendChild(child);\r\n }\r\n\r\n return child;\r\n }\r\n\r\n private showHideShadows() {\r\n window.performance.mark(\"scroll-shadow\");\r\n var scrollTop = this.el.nativeElement.scrollTop;\r\n var scrollHeight = this.el.nativeElement.scrollHeight;\r\n\r\n var scrollBuffer = 25;\r\n\r\n var showShadowClass = \"show\";\r\n\r\n // Top Shadow\r\n if (scrollTop > scrollBuffer) {\r\n\r\n if (!this.showingTopShadow) {\r\n this.topShadow.classList.add(showShadowClass);\r\n this.showingTopShadow = true;\r\n }\r\n }\r\n else if (this.showingTopShadow) {\r\n this.topShadow.classList.remove(showShadowClass);\r\n this.showingTopShadow = false;\r\n }\r\n\r\n // Bottom Shadow\r\n if (/*scrollShadowBottom*/true) {\r\n var clientHeight = this.el.nativeElement.clientHeight;\r\n if (scrollTop + clientHeight + scrollBuffer < scrollHeight) {\r\n if (!this.showingBottomShadow) {\r\n this.bottomShadow.classList.add(showShadowClass);\r\n this.showingBottomShadow = true;\r\n }\r\n }\r\n else if (this.showingBottomShadow) {\r\n this.bottomShadow.classList.remove(showShadowClass);\r\n this.showingBottomShadow = false;\r\n }\r\n }\r\n\r\n window.performance.measure(\"scroll-shadow\");\r\n }\r\n\r\n private accountForParentPaddings() {\r\n var style = window.getComputedStyle(this.el.nativeElement);\r\n\r\n this.topShadow.style.top = `-${style.paddingTop}`;\r\n this.bottomShadow.style.bottom = `-${style.paddingBottom}`;\r\n }\r\n}\r\n","module.exports = \"
\";","module.exports = \"{{label}} \";","import { animate, style, transition, trigger } from '@angular/animations';\r\n\r\nexport const animDropDown = trigger('animDropDown', [\r\n transition('hide => show', [\r\n style({ transform: 'scale(0.1)', opacity: '0' }),\r\n animate('.1s', style({ transform: 'scale(1)', opacity: '*' }))\r\n ])\r\n]);\r\n","module.exports = \"
\";","module.exports = \"
{{'veriTable.noItemsDisplay' | translate}}
\";","import { Component } from \"@angular/core\";\r\nimport './v-tiles.component.scss';\r\n\r\n@Component({\r\n selector: 'v-tiles',\r\n template: require('./v-tiles.component.html')\r\n})\r\nexport class VTilesComponent {\r\n\r\n}\r\n","module.exports = \" \";","import { Component, Input } from \"@angular/core\";\r\nimport './v-tile.component.scss';\r\n\r\n@Component({\r\n selector: 'v-tile',\r\n template: require('./v-tile.component.html')\r\n})\r\nexport class VTileComponent {\r\n @Input() tileTitle: string;\r\n}\r\n","module.exports = \"
{{ tileTitle }}
\";","import { AfterViewInit, Directive, ElementRef, Input, OnChanges, OnInit } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[autofocus]'\r\n})\r\nexport class AutofocusDirective implements OnChanges, AfterViewInit {\r\n @Input('autofocus') autofocus: boolean;\r\n\r\n constructor(private host: ElementRef) {\r\n }\r\n\r\n ngOnChanges() {\r\n this.setAutoFocus();\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.setAutoFocus();\r\n }\r\n\r\n // ---\r\n\r\n private setAutoFocus() {\r\n if (this.autofocus == false) {\r\n return;\r\n }\r\n\r\n this.host.nativeElement.focus();\r\n }\r\n}\r\n","import { animate, style, transition, trigger } from '@angular/animations';\r\n\r\nexport const animSlideFromTop = trigger('animSlideFromTop', [\r\n transition(':enter', [\r\n style({ 'transform-origin': 'top', height: '0px', opacity: '0' }),\r\n animate('.15s', style({ height: '*', opacity: '1' }))\r\n ]),\r\n transition(':leave', [\r\n style({ 'transform-origin': 'top', height: '*', opacity: '1' }),\r\n animate('.15s', style({ height: '0px', opacity: '0' }))\r\n ])\r\n]);\r\n\r\nexport const animSlideFromBottom = trigger('animSlideFromBottom', [\r\n transition(':enter', [\r\n style({ 'transform-origin': 'bottom', height: '0px', opacity: '0' }),\r\n animate('.15s', style({ height: '*', opacity: '1' }))\r\n ]),\r\n transition(':leave', [\r\n style({ 'transform-origin': 'bottom', height: '*', opacity: '1' }),\r\n animate('.15s', style({ height: '0px', opacity: '0' }))\r\n ])\r\n]);\r\n","module.exports = \"
\";","module.exports = \" \";","module.exports = \"
{{ title }}
{{ description }}
\";","module.exports = \"
{{ label }}
{{icon}} {{status == 1 ? 'check_circle' : 'error'}} clear {{ suffix }}
{{helpText}}
\";","module.exports = \"
{{ title }}
{{ description }}
\";","import { Directive, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\r\nimport { DelayedHoverService } from './delayed-hover.service';\r\n\r\n// Source: https://blog.davidjs.com/2019/11/delayed-hover-event-in-angular/\r\n@Directive({\r\n // tslint:disable-next-line:directive-selector\r\n selector: '[delayed-hover]',\r\n providers: [DelayedHoverService]\r\n})\r\nexport class DelayedHoverDirective implements OnInit, OnDestroy {\r\n @Input() delay = 1500;\r\n\r\n @Output('delayed-hover') hoverEvent = new EventEmitter();\r\n\r\n constructor(private readonly element: ElementRef, private readonly delayedHoverService: DelayedHoverService) { }\r\n\r\n ngOnInit() {\r\n this.createMouseEnterDelay(\r\n this.element.nativeElement,\r\n show => {\r\n if (show) {\r\n this.hoverEvent.emit(show);\r\n }\r\n },\r\n this.delay\r\n );\r\n }\r\n\r\n createMouseEnterDelay(element: HTMLElement, observer: (boolean) => void, hoverDelay = 300) {\r\n this.delayedHoverService.createMouseEnterDelay(element, observer, hoverDelay)\r\n }\r\n\r\n ngOnDestroy() {\r\n }\r\n}\r\n","module.exports = \"
{{step.label}} {{step.subText}}
\";","import { Directive, ElementRef, HostListener, Input, OnDestroy, Renderer2 } from \"@angular/core\";\r\nimport \"./tooltip.scss\";\r\nimport { ITooltipPosition, TooltipService } from \"./tooltip.service\";\r\n\r\n@Directive({\r\n selector: \"[tooltip]\"\r\n})\r\nexport class TooltipDirective implements OnDestroy {\r\n\r\n // Bindings\r\n\r\n @Input('tooltip') title: string;\r\n @Input('tooltip-direction') direction: string = \"top\";\r\n @Input('hide-tooltip') hideTooltip = false;\r\n @Input() titleClass: string;\r\n\r\n // Internals\r\n\r\n tooltip: HTMLElement;\r\n delay = 10;\r\n\r\n constructor(private elementRef: ElementRef, private renderer: Renderer2, private tooltipService: TooltipService) {\r\n }\r\n\r\n @HostListener('mouseenter') onMouseEnter() {\r\n if (!this.tooltip && !this.hideTooltip) {\r\n this.show();\r\n }\r\n }\r\n\r\n @HostListener('mouseleave') onMouseLeave() {\r\n this.removeTooltip();\r\n }\r\n\r\n @HostListener('click') onClick() {\r\n this.removeTooltip();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.removeTooltip();\r\n }\r\n\r\n show() {\r\n if (!this.title) {\r\n return;\r\n }\r\n\r\n this.tooltip = this.tooltipService.create(this.title);\r\n this.tooltipService.setPosition(this.tooltip, this.getPosition());\r\n this.tooltipService.show(this.tooltip);\r\n }\r\n\r\n removeTooltip() {\r\n if (!this.tooltip) {\r\n return;\r\n }\r\n\r\n this.tooltipService.remove(this.tooltip);\r\n this.tooltip = null;\r\n }\r\n\r\n // ---\r\n\r\n private getPosition(): ITooltipPosition {\r\n //this.setDirection();\r\n\r\n //var tooltipBounding = this.tooltip.getBoundingClientRect();\r\n var elBounding = this.elementRef.nativeElement.getBoundingClientRect();\r\n var scrollLeft = window.scrollX || document.documentElement.scrollLeft;\r\n var scrollTop = window.scrollY || document.documentElement.scrollTop;\r\n var arrow_padding = 12;\r\n var pos: ITooltipPosition = { left: 0, top: 0 };\r\n var newDirection = null;\r\n\r\n // calculate the left position\r\n if (this.stringStartsWith(this.direction, 'left')) {\r\n pos.left = elBounding.left/* - tooltipBounding.width*/ - (arrow_padding / 2) + scrollLeft;\r\n }\r\n else if (this.stringStartsWith(this.direction, 'right')) {\r\n pos.left = elBounding.left + elBounding.width + (arrow_padding / 2) + scrollLeft;\r\n }\r\n else if (this.stringContains(this.direction, 'left')) {\r\n pos.left = elBounding.left /*- tooltipBounding.width */ + arrow_padding + scrollLeft;\r\n }\r\n else if (this.stringContains(this.direction, 'right')) {\r\n pos.left = elBounding.left + elBounding.width - arrow_padding + scrollLeft;\r\n }\r\n else {\r\n pos.left = elBounding.left + (elBounding.width / 2) /*- (tooltipBounding.width / 2)*/ + scrollLeft;\r\n }\r\n\r\n // calculate the top position\r\n if (this.stringStartsWith(this.direction, 'top')) {\r\n pos.top = elBounding.top /*- tooltipBounding.height*/ - (arrow_padding / 2) + scrollTop;\r\n }\r\n else if (this.stringStartsWith(this.direction, 'bottom')) {\r\n pos.top = elBounding.top + elBounding.height + (arrow_padding / 2) + scrollTop;\r\n }\r\n else if (this.stringContains(this.direction, 'top')) {\r\n pos.top = elBounding.top - /*tooltipBounding.height +*/ arrow_padding + scrollTop;\r\n }\r\n else if (this.stringContains(this.direction, 'bottom')) {\r\n pos.top = elBounding.top + elBounding.height - arrow_padding + scrollTop;\r\n }\r\n else {\r\n pos.top = elBounding.top + (elBounding.height / 2) /*- (tooltipBounding.height / 2)*/ + scrollTop;\r\n }\r\n\r\n // Todo?\r\n // check if the tooltip is outside the bounds of the window\r\n //if (this.fixedPosition) {\r\n // if (pos.left < scrollLeft) {\r\n // newDirection = this.direction.replace('left', 'right');\r\n // }\r\n // else if ((pos.left + tooltipBounding.width) > (window.innerWidth + scrollLeft)) {\r\n // newDirection = this.direction.replace('right', 'left');\r\n // }\r\n\r\n // if (pos.top < scrollTop) {\r\n // newDirection = this.direction.replace('top', 'bottom');\r\n // }\r\n // else if ((pos.top + tooltipBounding.height) > (window.innerHeight + scrollTop)) {\r\n // newDirection = this.direction.replace('bottom', 'top');\r\n // }\r\n\r\n // if (newDirection) {\r\n // //return this.calculatePosition(this.tooltip, newDirection);\r\n // }\r\n //}\r\n\r\n //pos.left += 'px';\r\n //pos.top += 'px';\r\n pos.direction = this.direction;\r\n\r\n return pos;\r\n }\r\n\r\n private stringStartsWith(searchString, findString): boolean {\r\n if (!searchString) {\r\n console.warn(\"stringStartsWith searchString null\", searchString, findString);\r\n return false;\r\n }\r\n\r\n return searchString.substr(0, findString.length) === findString;\r\n }\r\n\r\n private stringContains(searchString, findString): boolean {\r\n return searchString.indexOf(findString) !== -1;\r\n }\r\n}\r\n","import { Component, Input } from \"@angular/core\";\r\nimport './trailer.component.scss';\r\n\r\n@Component({\r\n selector: 'trailer',\r\n template: require('./trailer.component.html')\r\n})\r\nexport class TrailerComponent {\r\n @Input() reeferMake: string;\r\n @Input() maxWidth: number = 1000;\r\n\r\n constructor() { }\r\n\r\n\r\n}\r\n","module.exports = \"
{{reeferMake}}
\";","module.exports = \" {{ percentage | number : roundTo }}% = 0 && total >= 0\\\">{{ count }}/{{ total }} {{ subject }} \";","module.exports = \"

My Account

clear
My Details *warning
This field is required!
Must be a valid email address!
This field is required!
Must be a valid email address!
Password *warning
To maintain your existing password, leave these fields blank.
Must be at least 8 characters long
Must include a lowercase letter
Must include an uppercase letter
Must include a number
Must include a special character i.e. &
Passwords must match!
Company Image*
{{$ctrl.errorMessage}} Save
\";","module.exports = \"

{{'UserPreferences.resetPassword' | translate}}

{{'UserPreferences.accountEmail' | translate}}

{{$ctrl.currentUser.Email}}

{{'UserPreferences.nameDescription' | translate}}

{{$ctrl.currentUser.CurrentAccountUserMapping.Name}}

{{'UserPreferences.accountPassword' | translate}}

{{'UserPreferences.newPasswordAfterReset' | translate}}
  • {{'UserPreferences.characterLength' | translate}}
  • {{'UserPreferences.includeLowercase' | translate}}
  • {{'UserPreferences.includeUppercase' | translate}}
  • {{'UserPreferences.includeNumber' | translate}}
  • {{'UserPreferences.includeSpecial' | translate}}
{{'UserPreferences.changePasswordOnAccount' | translate}}
{{'UserPreferences.characterLength' | translate}}
{{'UserPreferences.includeLowercase' | translate}}
{{'UserPreferences.includeUppercase' | translate}}
{{'UserPreferences.includeNumber' | translate}}
{{'UserPreferences.includeSpecial' | translate}}
{{'UserPreferences.passwordsMustMatch' | translate}}
{{'Common.Save' | translate}}
\";","module.exports = \" \";","module.exports = \"{{ observable$ | async }} {{ data.value }} -- {{ 'Common.Loading' | translate }}... \";","module.exports = \"
{{ percentage }}% \";","module.exports = \" \";","import { AfterViewInit, Directive, ElementRef, Input, OnChanges, OnDestroy } from '@angular/core';\r\n\r\ninterface IcountToData {\r\n element: HTMLElement;\r\n timeoutHandle?: number;\r\n refreshInterval?: number;\r\n duration?: number;\r\n step?: number;\r\n steps?: number;\r\n countFrom?: number;\r\n countTo?: number;\r\n value?: number;\r\n increment?: number;\r\n num?: number;\r\n\r\n filter?: string;\r\n filterParam?: any;\r\n}\r\n\r\n@Directive({\r\n selector: '[countTo]'\r\n})\r\nexport class CountToDirective implements /*OnInit,*/ OnChanges, AfterViewInit, OnDestroy{\r\n\r\n @Input() countTo: number;\r\n @Input() filter: string = 'number';\r\n @Input() filterParam: number = 0;\r\n @Input() duration: number = 0.3;\r\n\r\n // ---\r\n\r\n private countToData: IcountToData;\r\n\r\n private isOnScreen = false;\r\n private observer: IntersectionObserver;\r\n\r\n constructor(private el: ElementRef) {\r\n\r\n this.countToData = {\r\n element: this.el.nativeElement,\r\n filter: this.filter,\r\n filterParam: this.filterParam\r\n };\r\n }\r\n\r\n ngOnChanges() {\r\n if (this.countToData) {\r\n if (this.countTo != undefined) {\r\n if (!this.isOnScreen) {\r\n this.setContent(this.countToData, this.countTo);\r\n }\r\n else {\r\n this.start(this.countToData);\r\n }\r\n }\r\n else {\r\n this.setContent(this.countToData, 0);\r\n }\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.setupObserver();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.observer.disconnect();\r\n }\r\n\r\n // ---\r\n\r\n private start(countToData: IcountToData) {\r\n if (countToData && countToData.timeoutHandle) {\r\n clearTimeout(countToData.timeoutHandle);\r\n }\r\n\r\n this.calculate(countToData);\r\n this.tick(countToData);\r\n }\r\n\r\n private calculate(countToData: IcountToData) {\r\n\r\n if (!countToData) {\r\n return;\r\n }\r\n\r\n countToData.refreshInterval = 30;\r\n countToData.step = 0;\r\n countToData.timeoutHandle = null;\r\n\r\n countToData.value = countToData.countTo || 0;\r\n countToData.countFrom = countToData.value;\r\n let countToString: string = String(this.countTo);\r\n\r\n // If we have any commas (from number formatting) remove them\r\n if (countToData && countToString.indexOf(\",\")) {\r\n countToString = countToString.split(\",\").join(\"\");\r\n }\r\n\r\n countToData.countTo = parseFloat(countToString);\r\n\r\n countToData.duration = ((this.duration) * 1000) || 300; // default half second\r\n\r\n countToData.steps = Math.ceil(countToData.duration / countToData.refreshInterval);\r\n countToData.increment = ((countToData.countTo - countToData.value) / countToData.steps);\r\n countToData.num = countToData.value;\r\n }\r\n\r\n private tick(countToData: IcountToData) {\r\n countToData.timeoutHandle = window.setTimeout(() => {\r\n var newData = this.easeOutCubic(countToData.step + 1, countToData.countFrom, countToData.countTo - countToData.countFrom, countToData.steps);\r\n countToData.num = newData;\r\n\r\n countToData.step++;\r\n\r\n if (countToData.step >= countToData.steps) {\r\n clearTimeout(countToData.timeoutHandle);\r\n countToData.num = countToData.countTo;\r\n\r\n this.setContent(countToData, countToData.countTo);\r\n }\r\n else {\r\n this.setContent(countToData, countToData.num);\r\n\r\n this.tick(countToData);\r\n }\r\n\r\n }, countToData.refreshInterval);\r\n }\r\n\r\n private setContent(countToData: IcountToData, value: number) {\r\n countToData.element.textContent = `${Math.round(value).toLocaleString()}`;\r\n }\r\n\r\n private easeOutCubic(t_currentTime: number, b_startValue: number, c_endValue: number, d_duration: number) {\r\n // Source: https://joshondesign.com/2013/03/01/improvedEasingEquations\r\n // Source: https://github.com/danro/jquery-easing/blob/master/jquery.easing.js\r\n return c_endValue * ((t_currentTime = t_currentTime / d_duration - 1) * t_currentTime * t_currentTime + 1) + b_startValue;\r\n }\r\n\r\n private setupObserver() {\r\n\r\n let observerOptions = {\r\n root: null,\r\n rootMargin: \"0px\",\r\n threshold: []\r\n };\r\n\r\n const intersectionCallback: IntersectionObserverCallback = (entries, self) => {\r\n\r\n entries.forEach((entry) => {\r\n this.isOnScreen = entry.isIntersecting;\r\n });\r\n }\r\n\r\n this.observer = new IntersectionObserver(intersectionCallback, observerOptions);\r\n this.observer.observe(this.el.nativeElement);\r\n }\r\n}\r\n","module.exports = \"
{{day.firstLetter}}
1\\\" class=reset-btn>{{ 'Common.Reset' | translate }}
{{ 'DayOfWeekPicker.QuickSelectLabel' | translate }}: {{ 'DayOfWeekPicker.EverydayShortcut' | translate }} | {{ 'DayOfWeekPicker.WeekdaysShortcut' | translate }} | {{ 'DayOfWeekPicker.WeekendsShortcut' | translate }}
\";","module.exports = \"person {{ driver?.Name }} \";","module.exports = \"
\";","module.exports = \"
{{ 'flvPlayer.TimeoutMessage' | translate : displayTimer }}
\";","module.exports = \"{{ isFullScreen ? 'fullscreen_exit' : 'fullscreen'}} \";","import { Directive, ElementRef, HostBinding } from \"@angular/core\";\r\nimport { ConstantsService } from \"@app/services/constantsService\";\r\nimport './hide-production.directive.scss';\r\n\r\n@Directive({\r\n selector: '[hideInProduction]'\r\n})\r\nexport class HideInProductionDirective {\r\n\r\n @HostBinding('class.hide-production') hideClass = true;\r\n constructor(private readonly el: ElementRef,\r\n private readonly constantsService: ConstantsService) { }\r\n\r\n ngOnInit(): void {\r\n this.setDisplay();\r\n }\r\n\r\n private setDisplay(): void {\r\n if (this.constantsService.getIsProduction()) {\r\n this.el.nativeElement.remove();\r\n return;\r\n }\r\n }\r\n}\r\n","import { Directive, ElementRef, Input, OnChanges, SimpleChanges } from \"@angular/core\";\r\n\r\n@Directive({\r\n selector: \"[highlight]\"\r\n})\r\nexport class HighlightTextDirective implements OnChanges {\r\n private _content: string;\r\n private _searchTerm: string;\r\n private separatedText = [];\r\n private separatedSearchedText = [];\r\n private final = \"\";\r\n\r\n searchPattern: any;\r\n matchpattern: any;\r\n\r\n splitFlag = \"\";\r\n matchFlag = \"\";\r\n spanStart = '';\r\n spanEnd = \"\";\r\n\r\n @Input(\"content\")\r\n set content(content: string) {\r\n this._content = content.toString();\r\n }\r\n get content(): string {\r\n return this._content;\r\n }\r\n\r\n @Input(\"searchTerm\")\r\n set searchTerm(searchTerm: string) {\r\n this._searchTerm = searchTerm;\r\n this.highlight();\r\n }\r\n get searchTerm(): string {\r\n return this._searchTerm;\r\n }\r\n\r\n @Input() caseSensitive: boolean;\r\n\r\n constructor(private el: ElementRef) {\r\n this.caseSensitive = false;\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[\"searchTerm\"]) {\r\n this.highlight();\r\n }\r\n }\r\n\r\n highlight() {\r\n this.final = \"\";\r\n\r\n if (!this.caseSensitive) {\r\n this.splitFlag = \"i\";\r\n this.matchFlag = \"gi\";\r\n }\r\n else {\r\n this.splitFlag = \"\";\r\n this.matchFlag = \"g\";\r\n }\r\n\r\n this.searchPattern = new RegExp(this._searchTerm, this.splitFlag);\r\n this.matchpattern = new RegExp(this._searchTerm, this.matchFlag);\r\n\r\n if (this._searchTerm !== undefined && this._searchTerm != null && this._searchTerm.length > 0 && this._searchTerm[0] !== \".\") {\r\n this.separatedText = this._content.split(this.searchPattern);\r\n this.separatedSearchedText = this._content.match(this.matchpattern);\r\n\r\n if (this.separatedSearchedText != null && this.separatedSearchedText.length > 0) {\r\n for (let i = 0; i < this.separatedText.length; i++) {\r\n if (i <= this.separatedSearchedText.length - 1) {\r\n this.final +=\r\n this.separatedText[i] +\r\n this.spanStart +\r\n this.separatedSearchedText[i] +\r\n this.spanEnd;\r\n }\r\n else {\r\n this.final += this.separatedText[i];\r\n }\r\n }\r\n }\r\n\r\n if (this.final.length > 0) {\r\n this.el.nativeElement.innerHTML = this.final;\r\n }\r\n else {\r\n this.el.nativeElement.innerText = this._content;\r\n }\r\n }\r\n else {\r\n this.el.nativeElement.innerText = this._content;\r\n }\r\n }\r\n}\r\n","\r\nimport { Directive, EmbeddedViewRef, Input, OnInit, TemplateRef, ViewContainerRef } from \"@angular/core\";\r\nimport { AccountFeatures } from \"@enums/account/AccountFeature\";\r\nimport { AccountFeatureService, FeatureAccessType } from \"@services/accountFeature.service\";\r\nimport { AccountOption } from \"@services/class/AccountOption\";\r\nimport { SessionService } from \"@services/session.service\";\r\nimport { SettingsName } from \"../../class/SettingsName\";\r\n\r\nexport interface IIfEnabledSettings {\r\n accountOption?: string;\r\n userRoles?: string[];\r\n readFeatures?: AccountFeatures[];\r\n manageFeatures?: AccountFeatures[];\r\n requireAllRoles?: boolean;\r\n}\r\n\r\n@Directive({\r\n selector: '[ifEnabled]'\r\n})\r\nexport class IfEnabledDirective implements OnInit {\r\n\r\n @Input() set ifEnabled(settings: IIfEnabledSettings) { this.settings = settings; }\r\n\r\n settings: IIfEnabledSettings;\r\n\r\n embeddedViewRef: EmbeddedViewRef;\r\n\r\n constructor(\r\n private readonly sessionService: SessionService,\r\n private readonly accountFeatureService: AccountFeatureService,\r\n private templateRef: TemplateRef,\r\n private viewContainerRef: ViewContainerRef\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.createView();\r\n this.process();\r\n }\r\n\r\n // ---\r\n\r\n private createView(): void {\r\n if (this.embeddedViewRef) {\r\n return;\r\n }\r\n\r\n this.embeddedViewRef = this.viewContainerRef.createEmbeddedView(this.templateRef);\r\n }\r\n\r\n private clearView(): void {\r\n this.viewContainerRef.clear();\r\n\r\n if (!this.embeddedViewRef) {\r\n return;\r\n }\r\n\r\n this.embeddedViewRef = null;\r\n }\r\n\r\n private process(): void {\r\n if (!this.hasRequirements()) {\r\n console.warn(\"No requirements passed into IfEnabledDirective\");\r\n return;\r\n }\r\n\r\n let removeElement = false;\r\n\r\n if (this.requireRemoveDueToFeatureAccess() || this.requireRemoveDueToUserRole()) {\r\n removeElement = true;\r\n }\r\n\r\n if (removeElement) {\r\n this.clearView();\r\n }\r\n }\r\n\r\n private hasRequirements(): boolean {\r\n if (!this.settings) {\r\n return false;\r\n }\r\n\r\n return !!this.settings.accountOption\r\n || !!this.settings.userRoles?.length\r\n || !!this.settings.readFeatures?.length\r\n || !!this.settings.manageFeatures?.length;\r\n }\r\n\r\n private requireRemoveDueToFeatureAccess(): boolean {\r\n const requiresReadFeatures = this.settings.readFeatures?.length;\r\n const requiresManageFeatures = this.settings.manageFeatures?.length;\r\n\r\n if (!requiresReadFeatures && !requiresManageFeatures) {\r\n return false\r\n }\r\n\r\n\r\n let hasMissingReadFeature = false;\r\n let hasMissingManageFeature = false;\r\n\r\n if (requiresReadFeatures) {\r\n hasMissingReadFeature = !this.accountFeatureService.currentUserHasAllFeatureAccess(this.settings.readFeatures, FeatureAccessType.Read);\r\n }\r\n\r\n if (requiresManageFeatures) {\r\n hasMissingManageFeature = !this.accountFeatureService.currentUserHasAllFeatureAccess(this.settings.manageFeatures, FeatureAccessType.Manage);\r\n }\r\n\r\n return hasMissingReadFeature || hasMissingManageFeature;\r\n }\r\n\r\n private requireRemoveDueToUserRole(): boolean {\r\n const requiresUserRole = this.settings.userRoles?.length;\r\n\r\n if (!requiresUserRole && !this.settings.accountOption) {\r\n return false\r\n }\r\n\r\n let removeElement = false;\r\n\r\n if (requiresUserRole) {\r\n removeElement = !this.accountFeatureService.currentUserHasRole(this.settings.userRoles, this.settings.requireAllRoles);\r\n }\r\n\r\n if (this.settings.accountOption) {\r\n const accountOptions = this.sessionService.getItem(SettingsName.AccountOptions);\r\n\r\n removeElement = !accountOptions[this.settings.accountOption];\r\n }\r\n\r\n return removeElement;\r\n }\r\n\r\n private getRootElement(): HTMLElement {\r\n if (!this.embeddedViewRef?.rootNodes?.length) {\r\n return;\r\n }\r\n\r\n return this.embeddedViewRef.rootNodes[0];\r\n }\r\n}\r\n","\r\nexport interface IAccountOptions {\r\n AccessList: string; // Obsolete\r\n AccountId: number;\r\n AerialAccess: number;\r\n DisplayAerialMap: number;\r\n Options: string;\r\n UseWorldWideMap: number;\r\n}\r\n\r\nexport class AccountOption {\r\n JourneyCostValue = \"\";\r\n JourneyCostType = \"\";\r\n DisplayDistance: \"mi\" | \"km\" = \"mi\";\r\n Tms = false;\r\n ReportBuilder = false;\n ConfigurableDashboards = false;\r\n EditOdometer = false;\r\n\r\n constructor(accountOptions: IAccountOptions) {\r\n if (!accountOptions) {\r\n console.warn(\"No AccountOptions\");\r\n return;\r\n }\r\n\r\n try {\r\n this.parse(accountOptions);\r\n }\r\n catch (e) {\r\n console.error(\"Unable to parse AccountOptions\");\r\n }\r\n }\r\n\r\n private parse(accountOptions: IAccountOptions): void {\r\n const options = accountOptions.Options.split(\",\");\r\n\r\n options.forEach(accountOption => {\r\n const optionSplit = accountOption.split(\" \");\r\n\r\n if (optionSplit && optionSplit[0] === \"\") {\r\n return;\r\n }\r\n\r\n const property = optionSplit[0];\r\n\r\n if (this.hasOwnProperty(property)) {\r\n\r\n if (this.isBoolean(optionSplit[1])) {\r\n this[property] = this.toBoolean(optionSplit[1]);\r\n return;\r\n }\r\n\r\n this[property] = optionSplit[1];\r\n }\r\n });\r\n }\r\n\r\n private isBoolean(value: string) {\r\n if (value.toLowerCase() === \"true\" || value.toLowerCase() === \"false\") {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private toBoolean(value: string) {\r\n return value.toLowerCase() === \"true\";\r\n }\r\n}\r\n","\r\nimport { GeofenceType } from \"@enums/GeofenceType\";\r\nimport { IGeofence } from \"@interfaces/IGeofences\";\r\nimport { CanvasService } from \"@services/canvas.service\";\r\nimport * as angular from \"angular\";\r\nimport { IGeofenceNavigationPoint } from \"./geofences.interfaces\";\r\n\r\nexport interface IGeofenceOverlaySize {\r\n sw?: google.maps.Point;\r\n ne?: google.maps.Point;\r\n width?: number;\r\n height?: number;\r\n}\r\n\r\n\r\nexport class GeofenceOverlay {\r\n\r\n overlay: google.maps.OverlayView;\r\n bounds: google.maps.LatLngBounds;\r\n visible = false;\r\n\r\n private canvas: HTMLCanvasElement = null;\r\n private div: HTMLDivElement = null;\r\n private context: CanvasRenderingContext2D;\r\n private overlayProjection: google.maps.MapCanvasProjection;\r\n private descriptionLines: string[];\r\n private longestLine: string;\r\n private className = \"geofenceOverlay\";\r\n private previousClassname;\r\n private hover = false;\r\n\r\n private backgroundColor: string;\r\n private strokeStyle: string;\r\n private isReadable = false;\r\n private navigationPointMarkerZoomThreshold = 15;\r\n private hasAddedNavigationPoints = false;\r\n\r\n private previousSize: IGeofenceOverlaySize = {};\r\n\r\n constructor(\r\n public geofence: IGeofence,\r\n private map: google.maps.Map,\r\n private showLabelWhenZoomedOut: boolean,\r\n private drawOnAdd = false) {\r\n\r\n performance.mark(\"GCreation\");\r\n\r\n this.canvas = null;\r\n this.div = null;\r\n\r\n this.init();\r\n performance.measure(\"GCreation\");\r\n }\r\n\r\n removeChild() {\r\n angular.element(this.div).remove();\r\n }\r\n\r\n hideElement() {\r\n if (this.div && this.visible) {\r\n this.visible = false;\r\n this.overlay.setMap(null);\r\n }\r\n }\r\n\r\n showElement() {\r\n if (!this.div) {\r\n this.initOverlay();\r\n\r\n this.descriptionLines = this.splitGeofenceName();\r\n this.longestLine = this.getLongestLine(this.descriptionLines);\r\n\r\n this.createElements();\r\n }\r\n\r\n if (this.div && !this.visible) {\r\n this.visible = true;\r\n this.overlay.setMap(this.map);\r\n }\r\n }\r\n\r\n setGeofenceClass(forceShowLabel: boolean = false) {\r\n const showLabel = (forceShowLabel || this.showLabelWhenZoomedOut) && !this.isReadable;\r\n\r\n let className = this.className;\r\n\r\n if (this.hover) {\r\n className += \" hover\";\r\n }\r\n\r\n if (showLabel) {\r\n className += ` showLabel`;\r\n\r\n if (forceShowLabel) {\r\n className += ` force`;\r\n }\r\n }\r\n\r\n if (className != this.previousClassname) {\r\n this.div.className = className;\r\n this.previousClassname = className;\r\n }\r\n }\r\n\r\n setHover(hover: boolean) {\r\n if (this.hover === hover) {\r\n return;\r\n }\r\n\r\n this.hover = hover;\r\n\r\n this.updateColoursForMapType();\r\n\r\n this.hideElement();\r\n this.showElement();\r\n\r\n if (this.visible) {\r\n\r\n // Quick hack to clear canvas\r\n this.canvas.width = this.canvas.width;\r\n this.drawGeofence(true);\r\n }\r\n }\r\n\r\n updateColoursForMapType() {\r\n /* if (this.hover) {\r\n // red\r\n this.backgroundColor = \"rgba(250, 100, 100, 0.4)\";\r\n this.strokeStyle = \"rgba(250, 100, 100, 0.8)\";\r\n\r\n // Blue\r\n this.backgroundColor = \"rgba(33,150,243,0.4)\";\r\n this.strokeStyle = \"rgba(33,150,243,0.9)\";\r\n }\r\n else*/ if (this.map.getMapTypeId() === google.maps.MapTypeId.SATELLITE || this.map.getMapTypeId() === google.maps.MapTypeId.HYBRID) {\r\n this.backgroundColor = \"rgba(250, 250, 250, 0.4)\";\r\n this.strokeStyle = \"rgba(50, 50, 50, 0.8)\";\r\n }\r\n else {\r\n this.backgroundColor = \"rgba(50, 50, 50, 0.4)\";\r\n this.strokeStyle = \"rgba(50, 50, 50, 0.8)\";\r\n }\r\n\r\n //var random = this.randomNumber(0, geofenceColors.length - 1);\r\n //this.strokeStyle = geofenceColors[random];\r\n //this.backgroundColor = this.createTransparentColor(this.strokeStyle, 0.4);\r\n\r\n if (this.geofence.PriorityTag && this.geofence.PriorityTag.ColourObject) {\r\n this.backgroundColor = this.geofence.PriorityTag.ColourObject.transparentColour;\r\n this.strokeStyle = this.geofence.PriorityTag.ColourObject.solidColour;\r\n }\r\n }\r\n\r\n getOverlaySize(): IGeofenceOverlaySize {\r\n if (!this.overlayProjection) {\r\n return {};\r\n }\r\n\r\n const sw = this.overlayProjection.fromLatLngToDivPixel(this.bounds.getSouthWest());\r\n const ne = this.overlayProjection.fromLatLngToDivPixel(this.bounds.getNorthEast());\r\n\r\n const width = Math.round(ne.x - sw.x);\r\n const height = Math.round(sw.y - ne.y);\r\n\r\n return {\r\n sw: sw,\r\n ne: ne,\r\n width: width,\r\n height: height\r\n }\r\n }\r\n\r\n drawGeofence(forceRedraw = false) {\r\n //var t1 = performance.now();\r\n\r\n //var map = this.overlay.getMap() as google.maps.Map;\r\n if (!this.overlay || !this.overlay.getMap()) {\r\n return;\r\n }\r\n\r\n window.performance.mark(\"drawGeofence\");\r\n\r\n const hasResized = this.resizeContainingElement();\r\n if (!forceRedraw && !hasResized) {\r\n return;\r\n }\r\n\r\n if (forceRedraw) {\r\n this.context.clearRect(0, 0, this.previousSize.width, this.previousSize.height);\r\n }\r\n\r\n this.context.strokeStyle = this.strokeStyle;\r\n this.context.lineWidth = this.hover ? 3 : 1;\r\n this.context.fillStyle = this.backgroundColor;\r\n\r\n this.setGeofenceClass();\r\n\r\n if (this.geofence.GeofenceType === GeofenceType.Circle) {\r\n this.drawCircleGeofence(this.isReadable);\r\n }\r\n else {\r\n this.drawPolygonGeofence(this.isReadable);\r\n }\r\n\r\n window.performance.measure(\"drawGeofence\");\r\n }\r\n\r\n // ---\r\n\r\n private init() {\r\n if (this.geofence.GeofenceType === GeofenceType.Circle) {\r\n const location = new google.maps.LatLng(this.geofence.Latitude, this.geofence.Longitude);\r\n this.bounds = this.getBoundingBoxForCircle(location, this.geofence.Radius);\r\n }\r\n else {\r\n this.bounds = this.getBoundingBoxForPolygonArray(this.geofence.Points);\r\n }\r\n\r\n if (this.drawOnAdd) {\r\n this.showElement();\r\n }\r\n }\r\n\r\n private initOverlay() {\r\n this.overlay = new google.maps.OverlayView();\r\n\r\n this.overlay.onAdd = () => {\r\n this.addOverlayElements();\r\n\r\n if (this.drawOnAdd) {\r\n //this.overlay.setMap(this.map);\r\n this.showElement();\r\n this.drawGeofence();\r\n }\r\n };\r\n\r\n this.overlay.draw = () => {\r\n this.drawGeofence();\r\n }\r\n\r\n this.overlay.onRemove = () => {\r\n this.removeChild();\r\n }\r\n }\r\n\r\n private randomNumber(min: number, max: number) {\r\n return Math.floor(Math.random() * (max - min + 1) + min);\r\n }\r\n\r\n private createElements() {\r\n\r\n window.performance.mark(\"createElements\");\r\n this.div = document.createElement(\"div\") as HTMLDivElement;\r\n this.div.className = this.className;\r\n\r\n if (this.showLabelWhenZoomedOut) {\r\n const textElement = document.createElement(\"div\");\r\n textElement.className = \"description\";\r\n textElement.textContent = \"\";\r\n\r\n this.descriptionLines.forEach(line => {\r\n textElement.innerHTML += `${line}
`;\r\n });\r\n\r\n this.div.appendChild(textElement);\r\n }\r\n\r\n this.canvas = document.createElement(\"canvas\") as HTMLCanvasElement;\r\n this.context = this.canvas.getContext(\"2d\");\r\n\r\n this.div.appendChild(this.canvas);\r\n\r\n\r\n\r\n window.performance.measure(\"createElements\");\r\n }\r\n\r\n private removeCurrentNavigationPointElements(): void {\r\n const existingElements = this.div.getElementsByClassName(`navigation-point`);\r\n while (existingElements?.length > 0) {\r\n this.div.removeChild(existingElements[0]);\r\n }\r\n\r\n this.hasAddedNavigationPoints = false;\r\n }\r\n\r\n private createNavigationPointElements(navigationPoints: IGeofenceNavigationPoint[], div: HTMLDivElement): void {\r\n if (!navigationPoints || !div) {\r\n return;\r\n }\r\n\r\n const shouldShowNavigationPoints = this.map.getZoom() > this.navigationPointMarkerZoomThreshold;\r\n\r\n if (shouldShowNavigationPoints && this.hasAddedNavigationPoints) {\r\n return;\r\n }\r\n else if (!shouldShowNavigationPoints && this.hasAddedNavigationPoints) {\r\n this.removeCurrentNavigationPointElements();\r\n }\r\n else if (shouldShowNavigationPoints) {\r\n var totalWidth = this.bounds.getNorthEast().lng() - this.bounds.getSouthWest().lng();\r\n var totalHeight = this.bounds.getNorthEast().lat() - this.bounds.getSouthWest().lat();\r\n\r\n navigationPoints?.forEach(navigationPoint => {\r\n const elementClass = `navigation-point`;\r\n const elementId = elementClass + `-${navigationPoint?.Id}`;\r\n const point = this.convertLatLngToPixelCoordinates([navigationPoint.Latitude, navigationPoint.Longitude], totalWidth, totalHeight);\r\n\r\n const newDiv: HTMLDivElement = document.createElement(\"div\");\r\n newDiv.style.left = `${point[0] * 100 / this.previousSize.width}%`;\r\n newDiv.style.top = `${point[1] * 100 / this.previousSize.height}%`;\r\n\r\n newDiv.id = elementId;\r\n newDiv.className = elementClass;\r\n newDiv.textContent = ``;\r\n newDiv.innerHTML += `location_on
${navigationPoint?.Name}
`;\r\n\r\n div.appendChild(newDiv);\r\n });\r\n\r\n this.hasAddedNavigationPoints = true;\r\n }\r\n }\r\n\r\n private getBoundingBoxForCircle(point: google.maps.LatLng, radius: number) {\r\n const north = google.maps.geometry.spherical.computeOffset(point, radius, 0);\r\n const east = google.maps.geometry.spherical.computeOffset(point, radius, 90);\r\n const south = google.maps.geometry.spherical.computeOffset(point, radius, 180);\r\n const west = google.maps.geometry.spherical.computeOffset(point, radius, 270);\r\n\r\n const bounds = new google.maps.LatLngBounds();\r\n\r\n bounds.extend(north);\r\n bounds.extend(east);\r\n bounds.extend(south);\r\n bounds.extend(west);\r\n\r\n return bounds;\r\n }\r\n\r\n private getBoundingBoxForPolygonArray(polygon: [number, number][]) {\r\n const bounds = new google.maps.LatLngBounds();\r\n\r\n for (let i = 0; i < polygon.length; i++) {\r\n const latLng = new google.maps.LatLng(polygon[i][0], polygon[i][1]);\r\n bounds.extend(latLng);\r\n }\r\n\r\n return bounds;\r\n }\r\n\r\n private addOverlayElements() {\r\n if (!this.div) {\r\n this.createElements();\r\n }\r\n\r\n const panes = this.overlay.getPanes();\r\n panes.overlayLayer.appendChild(this.div);\r\n\r\n // We use the south-west and north-east coordinates of the overlay to peg it to the correct position and size.\r\n // To do this, we need to retrieve the projection from the overlay.\r\n this.overlayProjection = this.overlay.getProjection();\r\n\r\n //if (this.geofence.Points) {\r\n // const plabel = new PolyLabel();\r\n // const center = plabel.getCenter([this.geofence.Points]);\r\n\r\n // this.geofence.Latitude = center[0];\r\n // this.geofence.Longitude = center[1];\r\n //}\r\n\r\n this.updateColoursForMapType();\r\n }\r\n\r\n private drawPolygonGeofence(drawText: boolean) {\r\n var totalWidth = this.bounds.getNorthEast().lng() - this.bounds.getSouthWest().lng();\r\n var totalHeight = this.bounds.getNorthEast().lat() - this.bounds.getSouthWest().lat();\r\n\r\n this.context.beginPath();\r\n for (var i = 0; i < this.geofence.Points.length; i++) {\r\n const pixel = this.convertLatLngToPixelCoordinates(this.geofence.Points[i], totalWidth, totalHeight);\r\n\r\n this.context.lineTo(pixel[0], pixel[1]);\r\n }\r\n\r\n //this.context.closePath();\r\n this.context.stroke();\r\n this.context.fill();\r\n\r\n if (drawText) {\r\n var middleLng = (this.bounds.getNorthEast().lng() + this.bounds.getSouthWest().lng()) / 2;\r\n\r\n const pixel = this.convertLatLngToPixelCoordinates([this.geofence.Latitude, middleLng], totalWidth, totalHeight);\r\n this.fillText(pixel[0], pixel[1]);\r\n }\r\n }\r\n\r\n private convertLatLngToPixelCoordinates(p: [number, number], totalWidth: number, totalHeight: number) {\r\n const mappedXpercent = (p[1] - this.bounds.getSouthWest().lng()) / totalWidth;\r\n const mappedYpercent = (p[0] - this.bounds.getSouthWest().lat()) / totalHeight;\r\n\r\n // Whole numbers are far faster for the browser to render\r\n const pixelX = Math.round(this.previousSize.width * mappedXpercent);\r\n const pixelY = Math.round(this.previousSize.height - (this.previousSize.height * mappedYpercent));\r\n\r\n return [pixelX, pixelY];\r\n }\r\n\r\n private drawCircleGeofence(drawText: boolean) {\r\n if (this.previousSize.width <= this.context.lineWidth * 2) {\r\n return;\r\n }\r\n\r\n const centerX = this.previousSize.width / 2;\r\n const centerY = this.previousSize.height / 2;\r\n\r\n // Check we're trying to draw a valid circle.\r\n const radius = centerX - Math.ceil(this.context.lineWidth / 4);\r\n\r\n if (radius <= 0) {\r\n console.warn(\"no radius\", radius, centerX, this.context.lineWidth, this.previousSize.width, this.geofence);\r\n return;\r\n }\r\n\r\n this.drawCircle(centerX, centerY, radius);\r\n\r\n if (drawText) {\r\n this.fillText(centerX, centerY);\r\n }\r\n }\r\n\r\n private resizeContainingElement(): boolean {\r\n const size = this.getOverlaySize();\r\n\r\n if (!size || !size.sw || !size.ne) {\r\n return false;\r\n }\r\n\r\n if (this.previousSize.ne &&\r\n this.previousSize.sw &&\r\n this.previousSize.ne.equals(size.ne) &&\r\n this.previousSize.sw.equals(size.sw)) {\r\n return false;\r\n }\r\n\r\n this.div.style.left = size.sw.x + \"px\";\r\n this.div.style.top = size.ne.y + \"px\";\r\n\r\n this.previousSize.ne = size.ne;\r\n this.previousSize.sw = size.sw;\r\n\r\n if (size.width == this.previousSize.width && size.height == this.previousSize.height) {\r\n return false;\r\n }\r\n\r\n this.div.style.width = size.width + \"px\";\r\n this.div.style.height = size.height + \"px\";\r\n\r\n this.canvas.width = size.width;\r\n this.canvas.height = size.height;\r\n\r\n this.previousSize = size;\r\n\r\n this.isReadable = this.isGeofenceTextReadable();\r\n\r\n this.createNavigationPointElements(this.geofence?.navigationPoints, this.div);\r\n\r\n return true;\r\n }\r\n\r\n private drawCircle(x: number, y: number, radius: number, backgroundColor: string = this.backgroundColor) {\r\n window.performance.mark(\"drawCircle\");\r\n\r\n this.context.beginPath();\r\n this.context.arc(x, y, radius, 0, 2 * Math.PI, false);\r\n this.context.closePath();\r\n //this.context.lineWidth = this.strokeWidth;\r\n this.context.fillStyle = (backgroundColor) ? backgroundColor : \"rgba(250, 250, 250, 0.4)\";\r\n\r\n this.context.stroke();\r\n this.context.fill();\r\n\r\n\r\n window.performance.measure(\"drawCircle\");\r\n }\r\n\r\n private isGeofenceTextReadable() {\r\n const fontSize = this.getFontSizeForLine(this.longestLine);\r\n return fontSize >= 7;\r\n }\r\n\r\n private fillText(x: number, y: number) {\r\n window.performance.mark(\"fillText\");\r\n\r\n this.context.fillStyle = \"black\";\r\n this.context.textAlign = \"center\";\r\n\r\n const fontSize = this.getFontSizeForLine(this.longestLine);\r\n this.context.font = `${fontSize}px Roboto`;\r\n\r\n if (this.descriptionLines.length === 1) {\r\n this.context.textBaseline = \"middle\";\r\n this.context.fillText(this.descriptionLines[0], x, y);\r\n }\r\n else {\r\n this.context.textBaseline = \"bottom\";\r\n this.context.fillText(this.descriptionLines[0], x, y);\r\n this.context.textBaseline = \"top\";\r\n this.context.fillText(this.descriptionLines[1], x, y);\r\n }\r\n\r\n window.performance.measure(\"fillText\");\r\n }\r\n\r\n private reduceLineCount(lines: string[], includeMidPoint = false) {\r\n const lineArray: string[] = [\"\", \"\"];\r\n\r\n let midPoint = Math.floor(lines.length / 2);\r\n\r\n if (includeMidPoint) {\r\n midPoint++;\r\n }\r\n\r\n for (let i = 0; i < lines.length; i++) {\r\n const index = i < midPoint ? 0 : 1;\r\n\r\n let line = lineArray[index] || \"\";\r\n\r\n if (line.length > 0) {\r\n line += \" \";\r\n }\r\n\r\n line += lines[i];\r\n lineArray[index] = line;\r\n }\r\n\r\n return lineArray;\r\n }\r\n\r\n private splitGeofenceName() {\r\n\r\n if (!this.geofence.Description || this.geofence.Description.length === 0) {\r\n return [];\r\n }\r\n\r\n // aim for a maximum of two lines, split near middle if a space exists\r\n const lines = this.geofence.Description.trim().toUpperCase().split(\" \");\r\n if (lines.length <= 2) {\r\n\r\n return lines;\r\n }\r\n\r\n // If we have more than one line then lets look for the most appropriate combination of words\r\n const lineArray1 = this.reduceLineCount(lines, false);\r\n\r\n // If we have even lines this should be fairly easy\r\n if (lines.length % 2 === 0) {\r\n return lineArray1;\r\n }\r\n\r\n const lineArray2 = this.reduceLineCount(lines, true);\r\n\r\n const lineArray1Diff = Math.abs(lineArray1[0].length - lineArray1[1].length);\r\n const lineArray2Diff = Math.abs(lineArray2[0].length - lineArray2[1].length);\r\n\r\n return lineArray1Diff < lineArray2Diff ? lineArray1 : lineArray2;\r\n }\r\n\r\n private getLongestLine(lines: string[]) {\r\n var longestLine = \"\";\r\n\r\n lines.forEach((line) => {\r\n if (line.length > longestLine.length) {\r\n longestLine = line;\r\n }\r\n });\r\n\r\n return longestLine;\r\n }\r\n\r\n private getFontSizeForLine(line: string) {\r\n window.performance.mark(\"getFontSizeForLine\");\r\n\r\n const fractionModifier = line.length < 5 ? 1 : 1.2;\r\n const letterFraction = fractionModifier / line.length;\r\n let pixelSize = Math.min(this.previousSize.width, this.previousSize.height) * letterFraction;\r\n\r\n // Makes wider polygons text bigger, works best on boxes rather than irregular polygon\r\n const widthModifier = 0.75;\r\n if (this.previousSize.width * widthModifier > this.previousSize.height) {\r\n pixelSize *= this.previousSize.width * widthModifier / this.previousSize.height;\r\n }\r\n\r\n // Set max size\r\n pixelSize = Math.min(pixelSize, 60);\r\n\r\n window.performance.measure(\"getFontSizeForLine\");\r\n\r\n return pixelSize;\r\n }\r\n\r\n private addLabel(x: number, y: number, text: string) {\r\n window.performance.mark(\"addLabel\");\r\n\r\n this.context.fillStyle = \"black\";\r\n this.context.textAlign = \"center\";\r\n\r\n const fontSize = this.getFontSizeForLine(text);\r\n this.context.font = `${fontSize / 3}px Roboto`;\r\n this.context.textBaseline = \"middle\";\r\n this.context.fillText(text, x, y);\r\n\r\n window.performance.measure(\"addLabel\");\r\n }\r\n}\r\n","module.exports = \"
{{ isGeofence ? 'filter_tilt_shift' : 'place' }} {{label}}
\";","import { Component, EventEmitter, HostBinding, Input, OnChanges, Output, SimpleChanges } from \"@angular/core\";\r\nimport { VTableComponent } from \"@app/directives/_layout/v-table/_components/v-table.component\";\r\nimport { DateService } from \"@app/services/date.service\";\r\nimport \"./recently-selected.component.scss\";\r\n\r\nexport interface IRecentlySelectedEntity {\r\n id: number | string;\r\n label: string;\r\n\r\n date: Date;\r\n data?: any;\r\n}\r\n\r\n@Component({\r\n selector: \"recently-selected\",\r\n template: require(\"./recently-selected.component.html\")\r\n})\r\nexport class RecentlySelectedComponent implements OnChanges {\r\n\r\n @Input() idProp = \"Id\";\r\n @Input() labelProp = \"Name\";\r\n @Input() icon: string;\r\n @Input() storageKey: string;\r\n\r\n @Input() table: VTableComponent;\r\n @Input() maxItems = 10;\r\n\r\n @Output() itemClick = new EventEmitter();\r\n\r\n // ---\r\n\r\n recentList: IRecentlySelectedEntity[] = [];\r\n\r\n @HostBinding(\"class.empty\") isEmpty = true;\r\n\r\n constructor(private readonly dateService: DateService) {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n\r\n if (changes[\"storageKey\"] && changes[\"table\"].isFirstChange()) {\r\n this.loadRecentList();\r\n }\r\n else {\r\n console.error(\"storageKey required\");\r\n }\r\n\r\n if (changes[\"table\"] && changes[\"table\"].isFirstChange()) {\r\n this.table.rowClick.subscribe(row => {\r\n // Artificially slow this down to occur after any animation has happened\r\n // Makes for a more pleasing experience\r\n setTimeout(() => { this.addRecentlySelectedItem(row.data); }, 500);\r\n });\r\n }\r\n }\r\n\r\n recentClicked(item: IRecentlySelectedEntity) {\r\n setTimeout(() => {\r\n this.updateDateTimeOnItem(item);\r\n }, 500);\r\n\r\n this.itemClick.emit(item);\r\n }\r\n\r\n // ---\r\n\r\n private addRecentlySelectedItem(item: any) {\r\n const itemId = item[this.idProp] || item[\"Id\"] || item[\"id\"];\r\n const label = this.getNestedProperty(item, this.labelProp) || item[\"Name\"] || item[\"Description\"] || \"[labelProp] missing\";\r\n\r\n this.recentList = this.recentList || [];\r\n\r\n var existingItem = this.recentList.find(r => r.id == itemId)\r\n if (existingItem) {\r\n this.updateDateTimeOnItem(existingItem);\r\n return;\r\n }\r\n\r\n this.recentList.push({\r\n id: itemId,\r\n label: label,\r\n date: new Date(),\r\n data: item\r\n });\r\n\r\n this.removeOldItems();\r\n this.saveRecentList();\r\n this.updateEmptyClass();\r\n }\r\n\r\n private updateDateTimeOnItem(item: IRecentlySelectedEntity) {\r\n item.date = new Date();\r\n this.sortList();\r\n this.saveRecentList();\r\n }\r\n\r\n private getNestedProperty(item: any, propString: string): any {\r\n const propValue = propString\r\n .replace(/\\[([^\\[\\]]*)\\]/g, '.$1.')\r\n .split('.')\r\n .filter(t => t !== '')\r\n .reduce((prev, cur) => prev && prev[cur], item);\r\n\r\n return propValue;\r\n }\r\n\r\n private removeOldItems() {\r\n this.sortList();\r\n this.recentList.length = Math.min(this.recentList.length, 5);\r\n }\r\n\r\n private sortList() {\r\n this.recentList.sort((a, b) => this.dateService.sort(a.date, b.date));\r\n }\r\n\r\n private loadRecentList() {\r\n var jsonString = localStorage.getItem(this.storageKey);\r\n this.recentList = JSON.parse(jsonString) as IRecentlySelectedEntity[];\r\n this.updateEmptyClass();\r\n }\r\n\r\n private saveRecentList() {\r\n // Clear data before saving\r\n this.recentList.forEach(c => c.data = null);\r\n\r\n localStorage.setItem(this.storageKey, JSON.stringify(this.recentList));\r\n }\r\n\r\n private updateEmptyClass(): void {\r\n this.isEmpty = this.recentList?.length == 0;\r\n }\r\n}\r\n","module.exports = \"
{{ label }} downloaded
\";","module.exports = \"
{{ primaryPlateText }}
\";","module.exports = \" \";","module.exports = \"
0\\\" class={{s.className}} [style.width]=\\\"s.percentage + '%'\\\" [tooltip]=s.tooltip>
{{ model.mainText }}
\";","module.exports = \" fiber_manual_record {{ displayData }}\";","module.exports = \"
{{ date | vDate : {dateTime: dateTime} }}
{{date | relativeTime}}
\";","module.exports = \" download download_done -- \";","module.exports = \" {{ title }} keyboard_arrow_down \";","module.exports = \"
{{ 'DrillDownReportTable.EditColumns' | translate }} {{ 'ColumnEditor.EditorSubtitle' | translate }} \";","module.exports = \"
{{ 'Common.Recent' | translate }}
{{icon}}
{{recent.label}}
\";","module.exports = \"{{statusIcon}}
{{statusMessage}} Read More
\";","module.exports = \"
{{probeName}} schedule
{{label}}
\";","module.exports = \"arrow_upward \";","module.exports = \"fiber_manual_record
{{ displayText }} podcasts
\";","module.exports = \"\";","module.exports = \"
language
\";","import { Directive, ElementRef, Input, OnChanges, OnInit } from \"@angular/core\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\n\r\n@Directive({\r\n selector: \"[translate]\"\r\n})\r\nexport class TranslateDirective implements OnChanges {\r\n @Input() translate: string;\r\n @Input() translateParams: any;\r\n\r\n constructor(\r\n private readonly element: ElementRef,\r\n private readonly translationService: TranslationService\r\n ) { }\r\n\r\n ngOnChanges() {\r\n this.translatePhrase(this.translate, this.translateParams);\r\n }\r\n\r\n translatePhrase(phrase: string, params?: any) {\r\n this.element.nativeElement.innerHTML = '';\r\n this.element.nativeElement.innerHTML = this.translationService.t(phrase, params);\r\n }\r\n}\r\n","import { animate, style, transition, trigger } from '@angular/animations';\r\n\r\nexport const animZoomInOut = trigger('animZoomInOut', [\r\n transition(':enter', [\r\n style({ transform: 'scale(0.1)', opacity: '0' }),\r\n animate('.15s', style({ transform: 'scale(1)', opacity: '*' }))\r\n ]),\r\n transition(':leave', [\r\n style({ transform: 'scale(1)', opacity: '*' }),\r\n animate('.15s', style({ transform: 'scale(0.1)', opacity: '0' }))\r\n ])\r\n]);\r\n","module.exports = \"
done
\";","import { Component, Input, OnInit, SimpleChanges } from '@angular/core';\r\nimport { ValidationErrors } from '@angular/forms';\r\nimport { FormValidationService } from \"../form-validation.service\";\r\nimport \"./control-errors.component.scss\";\r\n\r\n@Component({\r\n selector: 'v-control-errors',\r\n template: require('./control-errors.component.html')\r\n})\r\nexport class ControlErrorsComponent {\r\n\r\n @Input() errors: ValidationErrors;\r\n\r\n // ---\r\n\r\n errorLabel: string;\r\n\r\n constructor(private readonly validationService: FormValidationService) {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n\r\n this.renderErrors();\r\n }\r\n\r\n // ---\r\n\r\n private renderErrors(): void {\r\n if (!this.errors) {\r\n this.errorLabel = null;\r\n return;\r\n }\r\n\r\n this.errorLabel = this.validationService.getErrorLabel(this.errors);\r\n }\r\n}\r\n","module.exports = \"{{ errorLabel }} \";","module.exports = \"
Drop file to upload it
clear
{{file.name}}
{{fileSizeLabel}}
{{ isImage ? 'add_photo_alternate' : 'insert_drive_file' }}
{{'fileUpload.fileTooLarge' | translate : maxFileSizeLabel}}
\";","module.exports = \"

{{formTitle}}

{{subtitle}}
\";","import { Directive, ElementRef, HostListener, Input, OnInit } from \"@angular/core\";\r\n\r\n@Directive({\r\n selector: '[vInputMask]'\r\n})\r\nexport class InputMaskDirective implements OnInit {\r\n @Input('v-input-mask') inputMask = '';\r\n\r\n input: HTMLInputElement;\r\n\r\n specialKeys = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Tab'];\r\n readOnlyChars = [\"/\", \"@\", \":\", \".\", \",\"];\r\n\r\n constructor(el: ElementRef) {\r\n this.input = el.nativeElement;\r\n }\r\n\r\n ngOnInit(): void {\r\n\r\n this.input.value = this.inputMask;\r\n }\r\n\r\n @HostListener(\"keydown\", [\"$event\", \"$event.key\"])\r\n onKeyDown(event: KeyboardEvent, key: string): void {\r\n\r\n if (event.metaKey || event.ctrlKey || this.specialKeys.includes(key)) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n\r\n const cursorPosition = this.input.selectionStart;\r\n\r\n switch (key) {\r\n case 'Backspace':\r\n this.handleDelete(cursorPosition, 'back');\r\n return;\r\n case 'Delete':\r\n this.handleDelete(cursorPosition, 'forward');\r\n return;\r\n\r\n\r\n }\r\n\r\n this.replaceCharacterAtPosition(cursorPosition, key);\r\n\r\n }\r\n\r\n private replaceCharacterAtPosition(position: number, char: string): void {\r\n const charToReplace = this.input.value.charAt(position);\r\n\r\n if (!charToReplace) {\r\n return;\r\n }\r\n\r\n if (this.readOnlyChars.includes(charToReplace)) {\r\n this.input.setSelectionRange(position + 1, position + 1);\r\n return this.replaceCharacterAtPosition(position + 1, char);\r\n }\r\n\r\n const start = this.input.value.substr(0, position);\r\n const end = this.input.value.substr(position + 1);\r\n\r\n let newInput = start + char + end;\r\n this.input.value = newInput;\r\n this.input.setSelectionRange(position + 1, position + 1);\r\n }\r\n\r\n private handleDelete(position: number, direction: 'back' | 'forward'): void {\r\n if ((position < 1 && direction === 'back') || (this.input.maxLength != -1 && position >= this.input.maxLength && direction === 'forward') || !position && position != 0) {\r\n return;\r\n }\r\n\r\n let indexToDelete = direction === 'back' ? this.findCharIndexToDelete(position) : position;\r\n\r\n this.replaceCharacterAtPosition(indexToDelete, '-');\r\n\r\n if (direction === 'forward') {\r\n this.input.setSelectionRange(indexToDelete + 1, indexToDelete + 1);\r\n return;\r\n }\r\n\r\n this.input.setSelectionRange(indexToDelete, indexToDelete);\r\n\r\n }\r\n\r\n private findCharIndexToDelete(position: number): number {\r\n if (position < 1 || position > this.input.value.length) {\r\n return;\r\n }\r\n\r\n let char = this.input.value.charAt(position - 1);\r\n\r\n if (this.readOnlyChars.includes(char)) {\r\n return this.findCharIndexToDelete(position - 1);\r\n }\r\n\r\n return position - 1;\r\n }\r\n}\r\n","module.exports = \"
{{ label }}
\";","module.exports = \" {{ itemDisplayProp ? item[itemDisplayProp] : item }} \";","import { Component, EventEmitter, Input, OnChanges, Output } from \"@angular/core\";\r\nimport { IDriver } from \"@interfaces/IDriver\";\r\nimport { DriverService } from \"@services/driver.service\";\r\nimport \"./v-driver-autocomplete.component.scss\";\r\n\r\n@Component({\r\n selector: \"v-driver-autocomplete\",\r\n template: require('./v-driver-autocomplete.component.html')\r\n})\r\nexport class VDriverAutocompleteComponent implements OnChanges {\r\n @Input() driver: IDriver;\r\n @Input() selectedDriverId: string;\r\n\r\n @Output() driverSelected: EventEmitter = new EventEmitter();\r\n @Output() clear = new EventEmitter();\r\n\r\n @Input() label: string = \"Driver\";\r\n @Input() placeholder: string = \"Select Driver\";\r\n\r\n // ---\r\n\r\n driverPromise: angular.IPromise;\r\n\r\n constructor(private readonly driverService: DriverService) {\r\n }\r\n\r\n ngOnChanges() {\r\n\r\n if (this.selectedDriverId) {\r\n this.loadData();\r\n }\r\n }\r\n\r\n onCleared(): void {\r\n this.clear.emit();\r\n }\r\n\r\n onFocus() {\r\n this.loadData();\r\n }\r\n\r\n onDriverClicked(vehicle: IDriver) {\r\n this.driverSelected.emit(vehicle);\r\n }\r\n\r\n driverFilter = (driver: IDriver, text: string): boolean => {\r\n\r\n // This should be a common method somewhere else...\r\n return driver.Name.toLowerCase().indexOf(text) >= 0;\r\n }\r\n\r\n // ---\r\n\r\n private loadData() {\r\n this.driverPromise = this.driverService.getDrivers();\r\n }\r\n}\r\n","module.exports = \" \";","import { Component, EventEmitter, Input, OnChanges, Output } from \"@angular/core\";\r\nimport { IVehicleQueryOptions } from \"@app/interfaces/IVehicleQueryOptions\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport \"./v-vehicle-autocomplete.component.scss\";\r\n\r\n@Component({\r\n selector: \"v-vehicle-autocomplete\",\r\n template: require('./v-vehicle-autocomplete.component.html')\r\n})\r\nexport class VVehicleAutocompleteComponent implements OnChanges {\r\n @Input() vehicle: IVehicle;\r\n @Input() selectedVehicleId: string;\r\n @Input() queryOptions: IVehicleQueryOptions;\r\n\r\n @Output() vehicleSelected = new EventEmitter();\r\n @Output() clear = new EventEmitter();\r\n\r\n @Input() label: string = this.translationService.t(\"Common.Vehicle\");\r\n @Input() placeholder: string = this.translationService.t(\"VehicleAutoComplete.SelectVehicle\");\r\n\r\n // ---\r\n\r\n vehiclePromise: angular.IPromise;\r\n\r\n constructor(\r\n private readonly translationService: TranslationService,\r\n private readonly vehicleService: VehicleService) {\r\n }\r\n\r\n ngOnChanges() {\r\n\r\n if (this.selectedVehicleId) {\r\n this.loadData();\r\n }\r\n }\r\n\r\n onCleared(): void {\r\n this.clear.emit();\r\n }\r\n\r\n onFocus() {\r\n this.loadData();\r\n }\r\n\r\n onVehicleClicked(vehicle: IVehicle) {\r\n this.vehicleSelected.emit(vehicle);\r\n }\r\n\r\n vehicleFilter = (vehicle: IVehicle, text: string): boolean => {\r\n return this.vehicleService.vehicleSearchPredicate(vehicle, text);\r\n }\r\n\r\n // ---\r\n\r\n private loadData() {\r\n this.vehiclePromise = this.vehicleService.getVehiclesBasic(this.queryOptions);\r\n }\r\n}\r\n","module.exports = \" {{item.ShortReg}} / {{item.Reg}} \";","module.exports = \" \";","module.exports = \" \";","module.exports = \"
{{ 'VSlider.NoValuesWarning' | translate }}
{{ config.zoneLabels[i] }}
{{ handle.value | number: '1.0-0' }}{{ unit }} - {{ ((handles[i + 1]) ? (handles[i + 1].value - 1) : max) | number: '1.0-0' }}{{ unit }}
{{ handle.value | number: '1.0-0' }}{{ unit }}
\";","import { Component, EventEmitter, Input, OnChanges, Output } from \"@angular/core\";\r\nimport './v-time-picker.component.scss';\r\n\r\n@Component({\r\n selector: 'v-time-picker',\r\n template: require('./v-time-picker.component.html')\r\n})\r\nexport class VTimePickerComponent implements OnChanges {\r\n\r\n @Input() selectedTime: string;\r\n @Output() selectedTimeChange = new EventEmitter();\r\n\r\n @Input() increments: 5 | 10 | 15 | 20 | 30 = 15;\r\n @Input() disabled: boolean;\r\n\r\n //--\r\n\r\n availableTimes: string[];\r\n\r\n constructor() { }\r\n\r\n ngOnChanges(): void {\r\n this.setupAvailableTimes()\r\n }\r\n\r\n timeChanged(time: string): void {\r\n this.selectedTimeChange.emit(time);\r\n }\r\n\r\n//--\r\n\r\n private setupAvailableTimes(): void {\r\n this.availableTimes = [];\r\n\r\n const incrementsPerHour = 60 / this.increments;\r\n\r\n for (let hour = 0; hour < 24; hour++) {\r\n for (let inc = 0; inc < incrementsPerHour; inc++) {\r\n const hourString = String(hour).length == 2 ? String(hour) : \"0\" + String(hour);\r\n let minutes = this.increments * inc;\r\n\r\n const minuteString = String(minutes).length == 2 ? String(minutes) : \"0\" + String(minutes);\r\n \r\n const timeString = `${hourString}:${minuteString}`;\r\n this.availableTimes.push(timeString);\r\n }\r\n\r\n }\r\n }\r\n}\r\n","module.exports = \" \";","module.exports = \"
\";","import { Injectable } from \"@angular/core\";\r\nimport { ICountry } from \"./ICountry\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SmsInputService {\r\n constructor() { }\r\n\r\n getCountries(): ICountry[] {\r\n return [{\r\n name: \"Australia/Cocos/Christmas Island\",\r\n dialCode: 61,\r\n countryCode: \"au\",\r\n isoCode: \"036\",\r\n replaceablePrefix: 0,\r\n exampleMobileNumber: `+61723456789`\r\n },\r\n {\r\n name: \"Austria\",\r\n dialCode: 43,\r\n countryCode: \"at\",\r\n isoCode: \"040\",\r\n replaceablePrefix: 0,\r\n exampleMobileNumber: `+431234567890`\r\n },\r\n {\r\n name: \"Belgium\",\r\n dialCode: 32,\r\n countryCode: \"be\",\r\n isoCode: \"056\",\r\n replaceablePrefix: 0,\r\n exampleMobileNumber: `+3212345678`\r\n },\r\n {\r\n name: \"Brazil (Brasil)\",\r\n dialCode: 55,\r\n countryCode: \"br\",\r\n isoCode: \"076\",\r\n replaceablePrefix: 0,\r\n exampleMobileNumber: `+5501234567890`\r\n },\r\n {\r\n name: \"Canada\",\r\n dialCode: 1,\r\n countryCode: \"ca\",\r\n isoCode: \"124\",\r\n replaceablePrefix: 0,\r\n exampleMobileNumber: `+12345678999`\r\n },\r\n {\r\n name: \"Denmark (Danmark)\",\r\n dialCode: 45,\r\n countryCode: \"dk\",\r\n isoCode: \"208\",\r\n replaceablePrefix: 0,\r\n exampleMobileNumber: `+4523456789`\r\n },\r\n {\r\n name: \"France\",\r\n dialCode: 33,\r\n countryCode: \"fr\",\r\n isoCode: \"250\",\r\n replaceablePrefix: 0,\r\n exampleMobileNumber: `+33123456789`\r\n },\r\n {\r\n name: \"Finland (Suomi)\",\r\n dialCode: 358,\r\n countryCode: \"fi\",\r\n isoCode: \"246\",\r\n replaceablePrefix: 0,\r\n exampleMobileNumber: `+358023456789`\r\n },\r\n {\r\n name: \"Germany (Deutschland)\",\r\n dialCode: 49,\r\n countryCode: \"de\",\r\n isoCode: \"276\",\r\n replaceablePrefix: 0,\r\n exampleMobileNumber: `+49123456789`\r\n },\r\n {\r\n name: \"Hungary (Magyarország)\",\r\n dialCode: 36,\r\n countryCode: \"hu\",\r\n isoCode: \"348\",\r\n replaceablePrefix: 0,\r\n exampleMobileNumber: `+3612345678`\r\n },\r\n {\r\n name: \"Ireland\",\r\n dialCode: 353,\r\n countryCode: \"ie\",\r\n isoCode: \"372\",\r\n replaceablePrefix: 0,\r\n exampleMobileNumber: `+35312345678`\r\n },\r\n {\r\n name: \"Netherlands (Nederland)\",\r\n dialCode: 31,\r\n countryCode: \"nl\",\r\n isoCode: \"528\",\r\n replaceablePrefix: 0,\r\n exampleMobileNumber: `+31123456789`\r\n },\r\n {\r\n name: \"Norway (Norge)\",\r\n dialCode: 47,\r\n countryCode: \"no\",\r\n isoCode: \"578\",\r\n replaceablePrefix: 0,\r\n exampleMobileNumber: `+4723456789`\r\n },\r\n {\r\n name: \"Poland (Polska)\",\r\n dialCode: 48,\r\n countryCode: \"pl\",\r\n isoCode: \"616\",\r\n replaceablePrefix: 0,\r\n exampleMobileNumber: `+481234567`\r\n },\r\n {\r\n name: \"Qatar (‫قطر‬‎)\",\r\n dialCode: 974,\r\n countryCode: \"qa\",\r\n isoCode: \"634\",\r\n replaceablePrefix: 0,\r\n exampleMobileNumber: `+97434567890`\r\n },\r\n {\r\n name: \"Spain (España)\",\r\n dialCode: 34,\r\n countryCode: \"es\",\r\n isoCode: \"724\",\r\n replaceablePrefix: 0,\r\n exampleMobileNumber: `+34555555555`\r\n },\r\n {\r\n name: \"Sweden (Sverige)\",\r\n dialCode: 46,\r\n countryCode: \"se\",\r\n isoCode: \"752\",\r\n replaceablePrefix: 0,\r\n exampleMobileNumber: `+46555555555`\r\n },\r\n {\r\n name: \"Switzerland\",\r\n dialCode: 41,\r\n countryCode: \"ch\",\r\n isoCode: \"756\",\r\n replaceablePrefix: 0,\r\n exampleMobileNumber: `+41345678900`\r\n },\r\n {\r\n name: \"United Kingdom\",\r\n dialCode: 44,\r\n countryCode: \"gb\",\r\n isoCode: \"826\",\r\n replaceablePrefix: 0,\r\n exampleMobileNumber: `+441234567890`\r\n },\r\n {\r\n name: \"United States\",\r\n dialCode: 1,\r\n countryCode: \"us\",\r\n isoCode: \"840\",\r\n replaceablePrefix: 0,\r\n exampleMobileNumber: `+112345678901`\r\n }];\r\n }\r\n}\r\n","module.exports = \"
\";","import { Directive, ElementRef, Input, OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core';\r\nimport { NgModel } from '@angular/forms';\r\nimport { Subscription } from 'rxjs';\r\n\r\n@Directive({\r\n selector: '[phoneInput]'\r\n})\r\nexport class PhoneInputDirective implements OnInit, OnChanges, OnDestroy {\r\n @Input() phoneInputDial: string;\r\n @Input() phoneInputCc: string;\r\n\r\n subscription = new Subscription();\r\n constructor(private el: ElementRef, private ngModel: NgModel) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.subscription.add(this.ngModel.valueChanges.subscribe((value) => {\r\n this.updateValue(value);\r\n }));\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['phoneInputDial']) {\r\n let value: string = this.ngModel.value;\r\n if (!value) {\r\n return;\r\n }\r\n value = value.replace(\"+\" + changes['phoneInputDial'].previousValue, \"\");\r\n this.updateValue(value);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n\r\n private format(value: string): string {\r\n const regExp = /[^\\d^+]/g;\r\n const parsedPn = value.replace(regExp, '');\r\n\r\n if (!parsedPn) return '';\r\n\r\n let formattedPn = parsedPn.trim().charAt(0) === '+' ? parsedPn : `+${this.phoneInputDial}${parsedPn}`;\r\n\r\n return formattedPn;\r\n }\r\n\r\n updateValue(value: string): void {\r\n if (!value) {\r\n return;\r\n }\r\n const formattedValue = this.format(value);\r\n this.ngModel.viewToModelUpdate(formattedValue);\r\n this.el.nativeElement.value = formattedValue;\r\n\r\n }\r\n}\r\n","module.exports = \"
{{ button.label }}
{{ button.description }}
\";","module.exports = \"
{{ button.label }}
{{ button.description }}
{{ button.note }}
check_circle
\";","module.exports = \"
{{ button.label }}
\";","import { Component, EventEmitter, Input, OnChanges, Output } from \"@angular/core\";\r\nimport { IGeofence } from \"@app/interfaces/IGeofences\";\r\nimport { GeofenceService } from \"@app/services/geofence.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport \"./v-geofence-autocomplete.component.scss\";\r\n\r\n@Component({\r\n selector: \"v-geofence-autocomplete\",\r\n template: require('./v-geofence-autocomplete.component.html')\r\n})\r\nexport class VGeofenceAutocompleteComponent implements OnChanges {\r\n @Input() geofence: IGeofence;\r\n @Input() selectedGeofenceId: string;\r\n\r\n @Output() geofenceSelected: EventEmitter = new EventEmitter();\r\n @Output() clear = new EventEmitter();\r\n\r\n @Input() label: string = this.translationService.t(\"Common.Geofence\");\r\n @Input() placeholder: string = this.translationService.t(\"Common.SelectGeofence\");\r\n\r\n // ---\r\n\r\n geofencePromise: angular.IPromise;\r\n\r\n constructor(\r\n private readonly geofenceService: GeofenceService,\r\n private readonly translationService: TranslationService\r\n ) {\r\n }\r\n\r\n ngOnChanges() {\r\n\r\n if (this.selectedGeofenceId) {\r\n this.loadData();\r\n }\r\n }\r\n\r\n onCleared(): void {\r\n this.clear.emit();\r\n }\r\n\r\n onFocus() {\r\n this.loadData();\r\n }\r\n\r\n onGeofenceClicked(geofence: IGeofence) {\r\n this.geofenceSelected.emit(geofence);\r\n }\r\n\r\n geofenceFilter = (geofence: IGeofence, text: string): boolean => {\r\n return geofence.Description.toLowerCase().indexOf(text) >= 0;\r\n }\r\n\r\n // ---\r\n\r\n private loadData() {\r\n this.geofencePromise = this.geofenceService.getGeofences();\r\n }\r\n}\r\n","module.exports = \" \";","import { Component, EventEmitter, Input, Output, Type } from \"@angular/core\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\n\r\n@Component({\r\n selector: 'v-select-input',\r\n template: require('./v-select-input.component.html')\r\n})\r\nexport class VSelectInputComponent {\r\n @Input() value: string;\r\n @Input() label: string;\r\n @Input() options: string[];\r\n @Input() otherText: string = this.translationService.t(\"Common.Other_\");\r\n\r\n @Output() valueChange = new EventEmitter();\r\n\r\n //--\r\n\r\n showInputField: boolean;\r\n\r\n constructor(\r\n private readonly translationService: TranslationService) { }\r\n\r\n onSelectedValueChanged(value): void {\r\n this.showInputField = value == 'other';\r\n\r\n if (this.showInputField) {\r\n return;\r\n }\r\n\r\n this.valueChange.emit(value);\r\n }\r\n\r\n onInputChanged(value: string): void {\r\n this.valueChange.emit(value);\r\n }\r\n}\r\n","module.exports = \" \";","import { AfterViewInit, Component, EventEmitter, Input, OnInit, Output, ViewChild } from \"@angular/core\";\r\nimport { SettingsName } from \"@app/class/SettingsName\";\r\nimport { ICombinedPreferences } from \"@app/interfaces/ICombinedPreferences\";\r\nimport { IAutoCompleteResult, MapzenService } from \"@app/services/mapzen.service\";\r\nimport { SessionService } from \"@app/services/session.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { VAutocompleteComponent } from \"../v-autocomplete.component\";\r\nimport { Place } from \"./place\";\r\nimport \"./v-places-autocomplete.component.scss\";\r\n\r\n@Component({\r\n selector: \"v-places-autocomplete\",\r\n template: require('./v-places-autocomplete.component.html')\r\n})\r\nexport class VPlacesAutocompleteComponent implements OnInit, AfterViewInit {\r\n @ViewChild('autocomplete') autocomplete: VAutocompleteComponent;\r\n\r\n @Input() label: string = this.translationService.t(\"Common.Place\");\r\n @Input() placeholder: string = this.translationService.t(\"PlacesAutoComplete.SelectPlace\");\r\n\r\n @Output() placeSelected = new EventEmitter();\r\n\r\n itemFilter = () => true;\r\n\r\n countryCode: string;\r\n itemPromise: Promise = Promise.resolve([]);\r\n\r\n constructor(\r\n private readonly sessionService: SessionService,\r\n private readonly translationService: TranslationService,\r\n private readonly mapzenService: MapzenService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.setupCountryCode();\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n setTimeout(() => {\r\n // It is not nice solution, but this \"trick\" allows us\r\n // not to modify v-autocomplete so we don't risk making\r\n // regression, as this functionality here seems to be\r\n // one time only\r\n this.autocomplete.showDropdown = false;\r\n });\r\n }\r\n\r\n onTextChanged(text: string): void {\r\n this.itemPromise = this.getItems(text);\r\n }\r\n\r\n onItemClicked(item: IAutoCompleteResult): void {\r\n const place: Place = {\r\n name: item.formatted,\r\n lat: item.geometry.lat,\r\n lng: item.geometry.lng\r\n }\r\n\r\n this.placeSelected.next(place);\r\n }\r\n\r\n private setupCountryCode(): void {\r\n const userOptions = this.sessionService.getItem(SettingsName.UserOptions);\r\n this.countryCode = userOptions.CountryCode.Value;\r\n }\r\n\r\n private async getItems(text: string): Promise {\r\n const countryCode = this.countryCode || \"GB\";\r\n const result = await this.mapzenService.autocomplete(text, countryCode);\r\n\r\n return result.results;\r\n }\r\n}\r\n","module.exports = \"
location_on {{ item.formatted }}
\";","module.exports = \" home chevron_right {{ breadcrumb.name }} {{ breadcrumb.name }} west {{ backBreadcrumb.name }} \";","var map = {\n\t\"./eventsExport/eventsExport.dialog.html\": 1525,\n\t\"./journeysExport/journeysExport.dialog.html\": 1526,\n\t\"./plotsExport/plotsExport.dialog.html\": 1527\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 = 1524;","module.exports = \"

{{'eventsExport.exportEvents' | translate}}

clear
\";","module.exports = \"

{{'journeysExport.exportJourneys' | translate : $ctrl.additionalData.ShortReg}}

clear
\";","module.exports = \"

{{'plotsExport.exportPlots' | translate : $ctrl.additionalData.ShortReg}}

clear
\";","module.exports = \" close \";","module.exports = \"
{{'FilterBar.Filters' | translate}}
\";","import { Injectable } from \"@angular/core\";\r\nimport { IVTableCell } from \"@app/directives/_layout/v-table/_models/IVTableCell\";\r\nimport { IVTableHeader } from \"@app/directives/_layout/v-table/_models/IVTableHeader\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { DynamicReportsService } from \"@app/main/components/reports/_services/dynamic-reports.service\";\r\nimport { ExportType } from \"@app/main/components/reports/_services/dynamicReports.service\";\r\nimport { ColumnDataType } from \"@app/main/components/reports/enums/ColumnDataType\";\r\nimport { IColumnHeader } from \"@app/main/components/reports/models/IColumnHeader\";\r\nimport { IReportDefinitionNew } from \"@app/main/components/reports/models/IReportDefinition\";\r\nimport { ReportParameterType } from \"@app/main/components/reports/models/IReportParameters\";\r\nimport { IReportTableRow } from \"@app/main/components/reports/models/IReportRow\";\r\nimport { IReportRowCell } from \"@app/main/components/reports/models/IReportRowCell\";\r\nimport { IReportVVTableDefinition } from \"@app/main/components/reports/models/IReportTableDefinition\";\r\n\r\nexport interface ITableExportParams {\r\n headers: IVTableHeader[];\r\n rows: IVTableRow[];\r\n\r\n exportType: ExportType;\r\n exportTitle: string;\r\n\r\n exportAsLandscape?: boolean;\r\n\r\n reportDefinition?: IReportDefinitionNew;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ExportService {\r\n constructor(private readonly dynamicReportService: DynamicReportsService) { }\r\n\r\n downloadTableAsReport(params: ITableExportParams): Promise {\r\n return this.createReportDefinitionForExport(params).then(reportDefinition => {\r\n reportDefinition.TableDefinition.Rows?.forEach(row => delete row.tableRow);\r\n return this.downloadReportExport(reportDefinition, params.exportType);\r\n });\r\n }\r\n\r\n private createReportDefinitionForExport(params: ITableExportParams): Promise {\r\n if (params.reportDefinition) {\r\n return Promise.resolve(params.reportDefinition);\r\n }\r\n\r\n let headers: IVTableHeader[];\r\n let rows: IVTableRow[];\r\n\r\n if (params.headers && params.rows) {\r\n headers = params.headers;\r\n rows = params.rows;\r\n }\r\n\r\n if (!headers || !rows) {\r\n console.warn(\"No headers or rows to export\");\r\n return Promise.resolve(null);\r\n }\r\n\r\n return new Promise((resolve) => {\r\n return this.dynamicReportService.getStandardColumns().then(standardColumns => {\r\n //Wrap it in a Promise to convert from IPromise\r\n resolve(this.createReportTableFromTable(headers, rows, standardColumns.stringColumn).then(tableDefinition => {\r\n\r\n const reportDefinition: IReportDefinitionNew = {\r\n Title: params.exportTitle,\r\n TableDefinition: tableDefinition,\r\n Parameters: {\r\n CustomParameters: [\r\n {\r\n Value: true,\r\n Active: true,\r\n ParameterType: ReportParameterType.HideParameterList\r\n }]\r\n },\r\n Portrait: !params.exportAsLandscape\r\n }\r\n\r\n return reportDefinition;\r\n }));\r\n })\r\n });\r\n }\r\n\r\n private createReportTableFromTable(headers: IVTableHeader[], rows: IVTableRow[], stringColumn: IColumnHeader): Promise {\r\n\r\n return this.createTableReportRows(headers, rows, stringColumn).then(reportRows => {\r\n const report: IReportVVTableDefinition = {\r\n Headers: this.createTableReportHeaders(headers, stringColumn),\r\n Rows: reportRows,\r\n };\r\n\r\n return report;\r\n });\r\n }\r\n\r\n private createTableReportRows(headers: IVTableHeader[], tableRows: IVTableRow[], stringColumn: IColumnHeader): Promise {\r\n const rowPromises: Promise[] = [];\r\n const reportRows: IReportTableRow[] = [];\r\n\r\n tableRows.forEach((row: IVTableRow, index) => {\r\n const rowPromise = this.createTableReportCells(headers, row.cells, stringColumn).then(cells => {\r\n\r\n const reportRow: IReportTableRow = {\r\n Parameters: null,\r\n Cells: cells,\r\n HasData: true,\r\n tableRow: row\r\n };\r\n\r\n reportRows.push(reportRow);\r\n });\r\n\r\n rowPromises.push(rowPromise);\r\n });\r\n\r\n return Promise.all(rowPromises).then(rows => {\r\n reportRows.sort((a, b) => {\r\n return tableRows.indexOf(a.tableRow) - tableRows.indexOf(b.tableRow);\r\n });\r\n\r\n return reportRows;\r\n });\r\n }\r\n\r\n private createTableReportHeaders(headers: IVTableHeader[], stringColumn: IColumnHeader): IColumnHeader[] {\r\n const reportHeaders: IColumnHeader[] = [];\r\n\r\n headers.forEach((header: IVTableHeader) => {\r\n if (header.excludeFromExport) {\r\n return;\r\n }\r\n\r\n const reportHeader = Object.assign({}, stringColumn);\r\n\r\n reportHeader.Title = header.title;\r\n reportHeader.Width = header.width ? header.width : undefined;\r\n\r\n reportHeaders.push(reportHeader);\r\n });\r\n\r\n return reportHeaders;\r\n }\r\n\r\n private createTableReportCells(headers: IVTableHeader[], cells: IVTableCell[], stringColumn: IColumnHeader): Promise {\r\n const cellPromises: Promise[] = [];\r\n\r\n cells.forEach((cell: IVTableCell, index) => {\r\n const header = headers[index];\r\n if (header.excludeFromExport) {\r\n return;\r\n }\r\n\r\n cellPromises.push(this.createReportCellFromTable(cell, stringColumn));\r\n });\r\n\r\n return Promise.all(cellPromises).then(cells => {\r\n return cells;\r\n });\r\n }\r\n\r\n private createReportCellFromTable(cell: IVTableCell, stringColumn: IColumnHeader): Promise {\r\n\r\n const reportCell: IReportRowCell = {\r\n Data: String(cell.exportData) || cell.data,\r\n Contents: String(cell.exportData) || cell.data,\r\n CellDataType: ColumnDataType.String,\r\n DataSourceType: stringColumn.DataSourceType,\r\n DataSourceValue: stringColumn.DataSourceValue,\r\n };\r\n\r\n if (cell.exportDataMethod) {\r\n return cell.exportDataMethod().then(exportData => {\r\n reportCell.Data = exportData;\r\n reportCell.Contents = exportData;\r\n\r\n return reportCell;\r\n });\r\n }\r\n return Promise.resolve(reportCell);\r\n }\r\n\r\n private downloadReportExport(reportDefinition: IReportDefinitionNew, exportType: ExportType) {\r\n const documentUrl = this.getDocumentUrl(reportDefinition, exportType);\r\n\r\n if (documentUrl) {\r\n window.open(documentUrl);\r\n return;\r\n }\r\n\r\n return this.dynamicReportService.generate(reportDefinition, exportType);\r\n }\r\n\r\n private getDocumentUrl(reportDefinition: IReportDefinitionNew, exportType: ExportType) {\r\n switch (exportType) {\r\n case ExportType.PDF:\r\n return reportDefinition.reportPdfUrl;\r\n\r\n case ExportType.CSV:\r\n return reportDefinition.reportCsvUrl;\r\n\r\n case ExportType.Excel:\r\n return reportDefinition.reportExcelUrl;\r\n }\r\n }\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { ExportType, IStandardColumns } from \"./dynamicReports.service\";\r\nimport { IColumnHeader } from \"../models/IColumnHeader\";\r\nimport { IReportDefinition } from \"../models/IReportDefinition\";\r\nimport { lastValueFrom } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DynamicReportsService {\r\n constructor(\r\n private readonly http: HttpClient) {\r\n }\r\n\r\n getStandardColumns(): Promise {\r\n return this.getColumnHeaders().then((columns) => {\r\n const reportColumns = columns;\r\n\r\n return {\r\n rowTitleColumn: this.findColumn(\"RowTitle\", \"SharedReport\", reportColumns),\r\n stringColumn: this.findColumn(\"String\", \"SharedReport\", reportColumns),\r\n doubleColumn: this.findColumn(\"Double\", \"SharedReport\", reportColumns),\r\n dateColumn: this.findColumn(\"Date\", \"SharedReport\", reportColumns),\r\n durationColumn: this.findColumn(\"Duration\", \"SharedReport\", reportColumns)\r\n }\r\n });\r\n }\r\n\r\n getColumnHeaders(): Promise {\r\n return lastValueFrom(this.http.get(`/api/reports/columnheaders`))\r\n .then((columnHeaders) => {\r\n\r\n columnHeaders.forEach(column => {\r\n column.uniqueId = this.getUniqueColumnId(column);\r\n });\r\n\r\n return columnHeaders;\r\n });\r\n }\r\n\r\n getUniqueColumnId(column: IColumnHeader): string {\r\n return `${column.ReportType}.${column.DataSourceValue}`;\r\n }\r\n\r\n\r\n findColumn(dataSource: string, dataSourceType: string, columns: IColumnHeader[]): IColumnHeader {\r\n dataSource = dataSource.toLowerCase();\r\n\r\n let foundColumn: IColumnHeader;\r\n\r\n const columnsToSearch = this.findColumnsOfType(dataSourceType, columns);\r\n\r\n columnsToSearch.forEach(header => {\r\n if (header.DataSourceValue.toLowerCase() === dataSource || header.Title.toLowerCase() == dataSource) {\r\n foundColumn = header;\r\n }\r\n });\r\n\r\n return Object.assign({}, foundColumn);\r\n }\r\n\r\n findColumnsOfType(dataSourceType: string, columns: IColumnHeader[]): IColumnHeader[] {\r\n dataSourceType = dataSourceType.toLowerCase();\r\n\r\n let columnsToSearch = [];\r\n\r\n if (dataSourceType && columns) {\r\n columnsToSearch = columns.filter(column => { return column.DataSourceType.toLowerCase().indexOf(dataSourceType) !== -1 });\r\n }\r\n\r\n return columnsToSearch;\r\n }\r\n\r\n generate(report: IReportDefinition, exportType: ExportType): Promise {\r\n if (report == null) {\r\n return Promise.resolve();\r\n }\r\n\r\n return lastValueFrom(this.http.post(`/api/analytical/generate/${exportType}`, report, {responseType: 'blob' as 'json'}))\r\n .then((result: Blob) => {\r\n const fileURL = URL.createObjectURL(result);\r\n\r\n const a = document.createElement('a');\r\n a.href = fileURL;\r\n a.target = '_blank';\r\n a.download = `${report.Title}${this.getDocumentExtension(exportType)}`;\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n });\r\n }\r\n\r\n private getDocumentExtension(exportType: ExportType): string {\r\n switch (exportType) {\r\n case ExportType.PDF:\r\n return \".pdf\";\r\n\r\n case ExportType.CSV:\r\n return \".csv\";\r\n\r\n case ExportType.Excel:\r\n return \".xlsx\";\r\n\r\n default:\r\n return \"\";\r\n }\r\n }\r\n}\r\n","module.exports = \" {{ \\\"VExportButton.\\\"+(exporting ? \\\"Exporting\\\" : \\\"Export\\\") | translate }}

{{ \\\"VExportButton.ErrorTitle\\\" | translate }}

{{ errorMessage }}

{{ \\\"Common.Close\\\" | translate }}
\";","module.exports = \"
{{row.contents}}
{{'veriList.noLabelDisplay' | translate : itemLabel}}
\";","module.exports = \"
{{entry.icon}}
{{entry.largeDetails.title}}
{{entry.largeDetails.verb}} {{entry.date | vDate : dateFormatOptions }}
{{entry.largeDetails.text}}
{{listItem.verb}} {{listItem.date | vDate : dateFormatOptions }}
{{entry.inlineDetails.subject}} {{entry.inlineDetails.verb}} {{entry.inlineDetails.noun}} {{entry.date | vDate : dateFormatOptions}}
{{entry.date | vDate : dateFormatOptions }}
speech
\";","module.exports = \" \";","export enum VideoLabelIcon {\r\n Videocam = \"videocam\",\r\n NotificationsActive = \"notifications_active\",\r\n Person = \"person\",\r\n DirectionsCar = \"directions_car\",\r\n LocalCarWash = \"local_car_wash\"\r\n}","export class CameraEventThreshold {\r\n constructor(public low: number, public medium: number, public high: number) { }\r\n}\r\n\r\nexport class CameraEventThresholds {\r\n acceleration: CameraEventThreshold;\r\n braking: CameraEventThreshold;\r\n cornering: CameraEventThreshold;\r\n minThreshold: number;\r\n maxThreshold: number;\r\n\r\n constructor(acceleration: CameraEventThreshold, braking: CameraEventThreshold, cornering: CameraEventThreshold) {\r\n this.acceleration = acceleration;\r\n this.braking = braking;\r\n this.cornering = cornering;\r\n this.minThreshold = Math.min(acceleration.low, braking.low, cornering.low);\r\n this.maxThreshold = Math.max(acceleration.high, braking.high, cornering.high);\r\n }\r\n}","module.exports = \"
play_circle {{'veriVideo.PreviewFootage' | translate}}
restart_alt {{'veriVideo.Retry' | translate}}
{{playbackStream.CameraLocation | enumAsString : CameraLocation : 'CameraLocation'}}
\";","module.exports = \"
{{message}}
{{errorMessage}}
{{'vehicleVideoStream.restart' | translate}}
\";","module.exports = \" {{boxIcon}}
{{boxTitle}}
{{boxSubtitle}}
\";","module.exports = \"
chevron_left
{{month.name}} {{month.year}}
chevron_right
{{header}}
{{day.day}}
{{error}}
\";","module.exports = \"
{{ 'TimeFilters.RangeStartEndTimeLabel' | translate }}
{{ 'TimeFilters.ToLabel' | translate }}
help
{{ 'TimeFilters.DailyTimeFilterLabel' | translate }}
{{ 'TimeFilters.ToLabel' | translate }}
help
\";","module.exports = \"
{{quickDate.label}}
{{ showTimeFilterOptions ? 'Hide' : 'Show' }} {{ 'DateSelector.TimeFilters' | translate }}
\";","module.exports = \"
{{ title }}
{{ description }}
\";","module.exports = \"
{{ (pill.hovering) ? removeIcon : pill.icon }} {{ pill.icon }} 0\\\">
{{ pill.label }}
{{ pill.label }}
\";","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, ViewChild } from \"@angular/core\";\r\nimport { VAutocompleteComponent } from \"@app/directives/_forms/v-autocomplete/v-autocomplete.component\";\r\nimport { ITag } from \"@app/interfaces/ITag\";\r\nimport { TagsService } from \"@app/services/tags.service\";\r\nimport { IPill } from \"../../v-pills/v-pills.component\";\r\n\r\n@Component({\r\n selector: 'tag-selector',\r\n template: require('./tag-selector.component.html')\r\n})\r\nexport class TagSelectorComponent implements OnInit, OnChanges {\r\n\r\n @Input() tagIds: number[];\r\n\r\n @Output() tagIdsChanged = new EventEmitter();\r\n \r\n\r\n allTags: ITag[] = [];\r\n availableTags: ITag[];\r\n loading: boolean = true;\r\n tagPills: IPill[] = [];\r\n\r\n @ViewChild('tagAutocomplete') dropdown: VAutocompleteComponent;\r\n\r\n constructor(\r\n private readonly tagService: TagsService) { }\r\n\r\n ngOnInit(): void {\r\n this.load();\r\n }\r\n\r\n ngOnChanges(): void {\r\n this.renderPills();\r\n }\r\n\r\n onTagClicked(clickedTag: ITag): void {\r\n this.dropdown?.clearInput();\r\n\r\n this.addPill(clickedTag);\r\n\r\n this.tagIds = this.tagPills.map(pill => {\r\n return pill.data.Id;\r\n });\r\n\r\n const tagIndex = this.availableTags.findIndex(tag => tag.Id == clickedTag.Id);\r\n\r\n this.availableTags.splice(tagIndex, 1);\r\n\r\n this.tagIdsChanged.emit(this.tagIds);\r\n }\r\n\r\n onTagRemoved(pill: IPill): void {\r\n const tag = pill.data;\r\n const selectedTagIndex = this.tagIds.findIndex(tagId => tagId === tag.Id);\r\n\r\n if (selectedTagIndex < 0) {\r\n this.renderPills();\r\n return;\r\n }\r\n\r\n this.availableTags.push(tag);\r\n\r\n this.tagIds.splice(selectedTagIndex, 1);\r\n this.renderPills();\r\n this.tagIdsChanged.emit(this.tagIds);\r\n }\r\n\r\n tagSearchPredicate(tag: ITag, text: string): boolean {\r\n return tag.Name?.toLowerCase().includes(text.toLowerCase());\r\n }\r\n\r\n //--\r\n\r\n private load(): void {\r\n this.loadTags();\r\n }\r\n\r\n private loadTags(): void {\r\n this.loading = true;\r\n this.tagService.getTags().then(tags => {\r\n this.allTags = tags;\r\n this.availableTags = this.allTags.filter(tag => !this.tagIds.find(tagId => tagId === tag.Id));\r\n this.renderPills();\r\n }).finally(() => {\r\n this.loading = false;\r\n })\r\n }\r\n\r\n private renderPills(): void {\r\n if (!this.allTags.length) {\r\n return;\r\n }\r\n\r\n this.tagPills = [];\r\n if (!this.tagIds) {\r\n return;\r\n }\r\n\r\n this.tagIds.forEach(tagId => {\r\n this.addPill(this.allTags.find(tag => tag.Id === tagId));\r\n })\r\n }\r\n\r\n private addPill(tag: ITag): void {\r\n if (!!this.tagPills.find(pill => pill.data.Id === tag.Id)) {\r\n return;\r\n }\r\n\r\n this.tagPills.push({\r\n data: tag,\r\n label: tag.Name,\r\n icon: 'close'\r\n })\r\n }\r\n}\r\n","module.exports = \"
{{item.Name}}
\";","module.exports = \"
{{ tag.icon }} {{ tag.label }}
x
0 && tags.length > max\\\" class=\\\"tag no-select\\\">
+ {{ tags.length - max }} {{'veriTags.more' | translate}}
\";","module.exports = \" \";","module.exports = \"
{{collapsed ? 'keyboard_arrow_down' : 'keyboard_arrow_up'}}

{{ icon }} {{cardTitle}} ({{titleCount | number}})

\";","module.exports = \"

done
\";","module.exports = \"
{{ icon }}
{{ title }}
\";","module.exports = \" \";","module.exports = \"
{{ item.Name }} ({{ item.Count }})
add_chart
{{header.graphOptions.show ? 'check_circle' : 'radio_button_unchecked'}} {{header.title}}
arrow_downward
{{ 'veriTable.clearSearch' | translate }}
\";","module.exports = \"
\";","module.exports = \" \";","module.exports = \" \";","module.exports = \" {{label.icon}} {{label.label}} ({{label.count}}) \";","module.exports = \"
{{ 'Common.NoData' | translate}}
\";","module.exports = \"
0\\\" class=\\\"dashboard-box-container layout-row\\\"> {{event.label}}
\";","module.exports = \"
{{'veriVideo.restart' | translate}}
{{videoLabel}}
\";","module.exports = \"
close
play_arrow pause
\";","module.exports = \"
{{ isPlaying ? 'pause' : 'play_arrow' }}
skip_previous
{{secondsPlayedString}} / {{videoDurationString}}
fast_rewind
fast_forward
{{playbackSpeed}}x
{{ 'videoControls.playbackSpeed' | translate }}
{{speedOption}}x
{{ isZoomed ? 'zoom_out' : 'zoom_in' }}
{{ fillFrame ? 'picture_in_picture' : 'aspect_ratio' }}
{{ isFullScreen ? 'fullscreen_exit' : 'fullscreen' }}
\";","module.exports = \"
{{toolTipText}}
{{periodTitle}}
\";","module.exports = \"

{{'veriVideoThumbnails.previewThumbnails' | translate}}

1\\\" class=thumbnail-strip>
\";","import { AfterViewInit, Component, Input, OnInit } from \"@angular/core\";\r\nimport { AccordianComponent } from \"../accordian.component\";\r\nimport \"./accordian-entry.component.scss\";\r\n\r\n@Component({\r\n selector: \"accordian-entry\",\r\n template: require(\"./accordian-entry.component.html\"),\r\n})\r\nexport class AccordianEntryComponent {\r\n @Input() title: string = \"Title Required\";\r\n @Input() open = false;\r\n @Input() icon: string;\r\n\r\n // ---\r\n\r\n constructor(\r\n private readonly accordian: AccordianComponent\r\n ) {\r\n accordian.registerAccordianEntry(this);\r\n }\r\n\r\n toggle(): void {\r\n this.open = !this.open;\r\n }\r\n\r\n close(): void {\r\n this.open = false;\r\n }\r\n\r\n // ---\r\n\r\n}\r\n","module.exports = \" \";","module.exports = \"
{{ icon }} {{ title }}
expand_more
\";","module.exports = \" {{icon}}
{{title}}
{{text}}
\";","import { Directive, ElementRef, Input, OnChanges, OnDestroy, OnInit, Renderer2, SimpleChanges } from \"@angular/core\";\r\nimport { ResponsiveService } from \"@services/responsive.service\";\r\nimport { Subscription } from \"rxjs\";\r\n\r\n@Directive({\r\n selector: \"[maxParentWidth]\"\r\n})\r\nexport class MaxParentWidthDirective implements OnInit, OnDestroy, OnChanges {\r\n @Input(\"maxParentWidth\") maxParentWidth: number;\r\n\r\n // ---\r\n\r\n private originalDisplayStyle: string;\r\n private subscriptons = new Subscription();\r\n\r\n constructor(\r\n private readonly renderer: Renderer2,\r\n private readonly elementRef: ElementRef,\r\n private readonly responsiveService: ResponsiveService\r\n ) {\r\n this.cacheOriginalDisplayStyle();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.subscriptons.add(this.responsiveService.currentWindowWidth$.subscribe(() => this.handleWindowResize()));\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscriptons.unsubscribe();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n this.handleWindowResize();\r\n }\r\n\r\n // ---\r\n\r\n private handleWindowResize(): void {\r\n if (!this.maxParentWidth) {\r\n return;\r\n }\r\n\r\n const parentWidth = this.responsiveService.getParentWidthOfElementRef(this.elementRef);\r\n\r\n if (!parentWidth) {\r\n return;\r\n }\r\n\r\n this.calculateDisplayFromParentWidth(parentWidth);\r\n }\r\n\r\n private calculateDisplayFromParentWidth(parentWidth: number): void {\r\n if (this.maxParentWidth >= parentWidth) {\r\n this.responsiveService.removeHiddenElementStyling(this.elementRef, this.originalDisplayStyle, this.renderer);\r\n return;\r\n }\r\n\r\n this.responsiveService.addHiddenElementStyling(this.elementRef, this.renderer);\r\n }\r\n\r\n private cacheOriginalDisplayStyle(): void {\r\n this.originalDisplayStyle = this.elementRef?.nativeElement?.style?.display;\r\n }\r\n}\r\n","import { Directive, ElementRef, Input, OnChanges, OnDestroy, OnInit, Renderer2, SimpleChanges } from \"@angular/core\";\r\nimport { ResponsiveService, WindowBreakpoint } from \"@services/responsive.service\";\r\nimport { Subscription } from \"rxjs\";\r\n\r\n@Directive({\r\n selector: \"[maxWindowBreakpoint]\"\r\n})\r\nexport class MaxWindowBreakpointDirective implements OnInit, OnDestroy, OnChanges {\r\n @Input(\"maxWindowBreakpoint\") maxWindowBreakpoint: WindowBreakpoint;\r\n\r\n // ---\r\n\r\n private currentBreakpoint: WindowBreakpoint;\r\n private originalDisplayStyle: string;\r\n private subscriptons = new Subscription();\r\n\r\n constructor(\r\n private readonly renderer: Renderer2,\r\n private readonly elementRef: ElementRef,\r\n private readonly responsiveService: ResponsiveService\r\n ) {\r\n this.cacheOriginalDisplayStyle();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.subscriptons.add(this.responsiveService.currentBreakpoint$.subscribe((currentBreakpoint: WindowBreakpoint) => this.handleBreakpoint(currentBreakpoint)));\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscriptons.unsubscribe();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n this.handleBreakpoint();\r\n }\r\n\r\n // ---\r\n\r\n private handleBreakpoint(newBreakpoint?: WindowBreakpoint): void {\r\n\r\n if (WindowBreakpoint[newBreakpoint]) {\r\n this.currentBreakpoint = newBreakpoint;\r\n }\r\n\r\n if (!WindowBreakpoint[this.maxWindowBreakpoint]) {\r\n return;\r\n }\r\n\r\n this.calculateDisplay();\r\n }\r\n\r\n private calculateDisplay(): void {\r\n if (this.responsiveService.shouldDisplayUsingMaxBreakpoint(this.maxWindowBreakpoint)) {\r\n this.responsiveService.removeHiddenElementStyling(this.elementRef, this.originalDisplayStyle, this.renderer);\r\n return;\r\n }\r\n\r\n this.responsiveService.addHiddenElementStyling(this.elementRef, this.renderer);\r\n }\r\n\r\n private cacheOriginalDisplayStyle(): void {\r\n this.originalDisplayStyle = this.elementRef?.nativeElement?.style?.display;\r\n }\r\n\r\n}\r\n","import { Directive, ElementRef, Input, OnChanges, OnDestroy, OnInit, Renderer2, SimpleChanges } from \"@angular/core\";\r\nimport { ResponsiveService } from \"@services/responsive.service\";\r\nimport { Subscription } from \"rxjs\";\r\n\r\n@Directive({\r\n selector: \"[minParentWidth]\"\r\n})\r\nexport class MinParentWidthDirective implements OnInit, OnDestroy, OnChanges {\r\n @Input(\"minParentWidth\") minParentWidth: number;\r\n\r\n // ---\r\n\r\n private originalDisplayStyle: string;\r\n private subscriptons = new Subscription();\r\n\r\n constructor(\r\n private readonly renderer: Renderer2,\r\n private readonly elementRef: ElementRef,\r\n private readonly responsiveService: ResponsiveService\r\n ) {\r\n this.cacheOriginalDisplayStyle();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.subscriptons.add(this.responsiveService.currentWindowWidth$.subscribe(() => this.handleWindowResize()));\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscriptons.unsubscribe();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n this.handleWindowResize();\r\n }\r\n\r\n // ---\r\n\r\n private handleWindowResize(): void {\r\n if (!this.minParentWidth) {\r\n return;\r\n }\r\n\r\n const parentWidth = this.responsiveService.getParentWidthOfElementRef(this.elementRef);\r\n\r\n if (!parentWidth) {\r\n return;\r\n }\r\n\r\n this.calculateDisplayFromParentWidth(parentWidth);\r\n }\r\n\r\n private calculateDisplayFromParentWidth(parentWidth: number): void {\r\n if (this.minParentWidth <= parentWidth) {\r\n this.responsiveService.removeHiddenElementStyling(this.elementRef, this.originalDisplayStyle, this.renderer);\r\n return;\r\n }\r\n\r\n this.responsiveService.addHiddenElementStyling(this.elementRef, this.renderer);\r\n }\r\n\r\n private cacheOriginalDisplayStyle(): void {\r\n this.originalDisplayStyle = this.elementRef?.nativeElement?.style?.display;\r\n }\r\n}\r\n","import { Directive, ElementRef, Input, OnChanges, OnDestroy, OnInit, Renderer2, SimpleChanges } from \"@angular/core\";\r\nimport { ResponsiveService, WindowBreakpoint } from \"@services/responsive.service\";\r\nimport { Subscription } from \"rxjs\";\r\n\r\n@Directive({\r\n selector: \"[minWindowBreakpoint]\"\r\n})\r\nexport class MinWindowBreakpointDirective implements OnInit, OnDestroy, OnChanges {\r\n @Input(\"minWindowBreakpoint\") minWindowBreakpoint: WindowBreakpoint;\r\n\r\n // ---\r\n\r\n private currentBreakpoint: WindowBreakpoint;\r\n private originalDisplayStyle: string;\r\n private subscriptons = new Subscription();\r\n\r\n constructor(\r\n private readonly renderer: Renderer2,\r\n private readonly elementRef: ElementRef,\r\n private readonly responsiveService: ResponsiveService\r\n ) {\r\n this.cacheOriginalDisplayStyle();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.subscriptons.add(this.responsiveService.currentBreakpoint$.subscribe((currentBreakpoint: WindowBreakpoint) => this.handleBreakpoint(currentBreakpoint)));\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscriptons.unsubscribe();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n this.handleBreakpoint();\r\n }\r\n\r\n // ---\r\n\r\n private handleBreakpoint(newBreakpoint?: WindowBreakpoint): void {\r\n\r\n if (WindowBreakpoint[newBreakpoint]) {\r\n this.currentBreakpoint = newBreakpoint;\r\n }\r\n\r\n if (!WindowBreakpoint[this.minWindowBreakpoint]) {\r\n return;\r\n }\r\n\r\n this.calculateDisplay();\r\n }\r\n\r\n private calculateDisplay(): void {\r\n if (this.responsiveService.shouldDisplayUsingMinBreakpoint(this.minWindowBreakpoint)) {\r\n this.responsiveService.removeHiddenElementStyling(this.elementRef, this.originalDisplayStyle, this.renderer);\r\n return;\r\n }\r\n\r\n this.responsiveService.addHiddenElementStyling(this.elementRef, this.renderer);\r\n }\r\n\r\n private cacheOriginalDisplayStyle(): void {\r\n this.originalDisplayStyle = this.elementRef?.nativeElement?.style?.display;\r\n }\r\n}\r\n","module.exports = \" {{group.Name}} + {{hiddenGroups.length}} \";","module.exports = \"
\";","module.exports = \"
Previous {{ selectedTab.nextLabel }}
\";","module.exports = \" \";","module.exports = \" \";","module.exports = \" \";","module.exports = \"
{{icon}}
{{parentState.name}} / {{routeTitle}}
{{subtitle}}
\";","module.exports = \"{{icon}}
\";","import { animate, style, transition, trigger } from '@angular/animations';\r\n\r\nexport const animSlideFromLeft = trigger('animSlideFromLeft', [\r\n transition(':enter', [\r\n style({ transform: 'translateX(-10px)' }),\r\n animate('300ms ease-out', style({ transform: 'translateX(0px)' }))\r\n ]),\r\n transition(':leave', [\r\n style({ transform: 'translateX(0px)' }),\r\n animate('300ms ease-out', style({ transform: 'translateX(-10px)' }))\r\n ])\r\n]);\r\n","module.exports = \"
{{title}} clear
{{subtitle}}
{{ message }}
\";","module.exports = \"
\";","module.exports = \" \";","module.exports = \" \";","import { CdkVirtualScrollViewport } from \"@angular/cdk/scrolling\";\r\nimport { Component, EventEmitter, Input, OnChanges, OnInit, Output, ViewChild } from \"@angular/core\";\r\nimport { DriverStatus, IDriver } from \"@interfaces/IDriver\";\r\nimport { DriverService } from \"@services/driver.service\";\r\nimport \"./driver-list.component.scss\";\r\n\r\n@Component({\r\n selector: \"driver-list-new\",\r\n template: require(\"./driver-list.component.html\")\r\n})\r\nexport class DriverListComponent implements OnInit, OnChanges {\r\n\r\n @Input() selectedDriver: IDriver;\r\n @Output() driverClick = new EventEmitter();\r\n\r\n @ViewChild(CdkVirtualScrollViewport) virtualScroll: CdkVirtualScrollViewport;\r\n\r\n // ---\r\n\r\n drivers: IDriver[];\r\n displayDrivers: IDriver[] = [];\r\n loading = false;\r\n rowHeight = 51;\r\n\r\n constructor(private readonly driverService: DriverService) { }\r\n\r\n ngOnInit() {\r\n this.loadData();\r\n }\r\n\r\n ngOnChanges() {\r\n this.scrollToSelectedDriver();\r\n }\r\n\r\n onSearch(text: string) {\r\n if (!text) {\r\n this.displayDrivers = this.drivers;\r\n return;\r\n }\r\n\r\n this.displayDrivers = this.driverService.searchDrivers(this.drivers, text);\r\n }\r\n\r\n trackByDriver(index: number, driver: IDriver) {\r\n return driver.Id;\r\n }\r\n\r\n clickRow(driver: IDriver) {\r\n this.driverClick.emit(driver);\r\n }\r\n\r\n // ---\r\n\r\n private loadData() {\r\n this.loading = true;\r\n\r\n this.driverService.getDrivers()\r\n .then(drivers => {\r\n this.sortDrivers(drivers);\r\n\r\n this.drivers = drivers;\r\n this.displayDrivers = drivers;\r\n })\r\n .finally(() => {\r\n this.loading = false;\r\n window.dispatchEvent(new Event('resize'));\r\n\r\n this.scrollToSelectedDriver();\r\n console.log(this.displayDrivers);\r\n });\r\n }\r\n\r\n private scrollToSelectedDriver() {\r\n if (!this.selectedDriver|| !this.drivers) {\r\n return;\r\n }\r\n\r\n setTimeout(() => {\r\n var index = this.displayDrivers.findIndex(v => v.Id == this.selectedDriver.Id);\r\n\r\n // Ensure viewport is rendered well\r\n this.virtualScroll.scrollToIndex(index);\r\n });\r\n }\r\n\r\n private sortDrivers(drivers: IDriver[]) {\r\n // Need default sorter?\r\n drivers.sort((d1, d2) => {\r\n // Show active drivers first\r\n if (d1.Status == DriverStatus.Active && d2.Status == DriverStatus.Inactive) {\r\n return -1;\r\n }\r\n else if (d1.Status == DriverStatus.Inactive && d2.Status == DriverStatus.Active) {\r\n return 1;\r\n }\r\n\r\n return d1.DisplayName.localeCompare(d2.DisplayName);\r\n });\r\n }\r\n}\r\n","module.exports = \"
{{driver.Name}}
Inactive
Active
DB Card: {{driver.ButtonId}}
\";","module.exports = \"
{{ 'newResourceFilterBar.apply' | translate }}
\";","module.exports = \"
{{ driver?.DisplayName }}
\";","module.exports = \"{{name}}
Reset
{{ itemDisplayProp ? item[itemDisplayProp] : item }}
\";","import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from \"@angular/core\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { VButtonDropdownComponent } from \"@directives/_core/v-dropdown/v-button-dropdown/v-button-dropdown.component\";\r\nimport { FilterTriggerType, IFilterBarFilter } from \"../filter-bar.models\";\r\nimport \"./vehicle-type-button-filter.component.scss\";\r\nimport { VehicleType } from \"@app/enum/VehicleType.enum\";\r\nimport { FilterBarComponent } from \"../filter-bar.component\";\r\n\r\nexport interface IKeyValuePair {\r\n id: number;\r\n value: string;\r\n}\r\n\r\n@Component({\r\n selector: \"vehicle-type-button-filter\",\r\n template: require(\"./vehicle-type-button-filter.component.html\")\r\n})\r\nexport class VehicleTypeButtonFilterComponent implements IFilterBarFilter {\r\n @Input() selected: IKeyValuePair;\r\n @Input() label;\r\n @Output() change = new EventEmitter();\r\n\r\n @ViewChild(VButtonDropdownComponent) dropdown: VButtonDropdownComponent;\r\n\r\n name = this.translationService.t(\"FilterBar.ResourceType\");\r\n icon = \"fa-solid fa-truck\";\r\n type: FilterTriggerType = \"vehicletype\";\r\n vehicleTypes: IKeyValuePair[] = [];\r\n \r\n constructor(\r\n readonly parent: FilterBarComponent,\r\n readonly elementRef: ElementRef,\r\n private readonly translationService: TranslationService\r\n ) {\r\n }\r\n\r\n onFilterOpen(): void {\r\n if(this.vehicleTypes?.length){\r\n return;\r\n }\r\n \r\n for (const type in VehicleType) {\r\n if (isNaN(Number(type))) {\r\n this.vehicleTypes.push({id: Number(VehicleType[type]), value: this.translationService.t(`VehicleTypeEnum.${type}`)})\r\n };\r\n }\r\n }\r\n \r\n filterPredicate(item: any, vehicleType?: IKeyValuePair): boolean { \r\n if (item.vehicle) {\r\n return item.vehicle.VehicleType === vehicleType.id;\r\n }\r\n\r\n if (item.Vehicle) {\r\n return item.Vehicle.VehicleType === vehicleType.id;\r\n }\r\n\r\n if (item.Reg) {\r\n return item.VehicleType === vehicleType.id;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n searchPredicate = (item: IKeyValuePair, value?: any): boolean => {\r\n return item.value.toLowerCase().includes(value.toLowerCase());\r\n }\r\n\r\n onVehicleTypeClick(vehicleType: IKeyValuePair): void {\r\n this.selected = vehicleType;\r\n this.change.emit(this.selected);\r\n this.parent.onFilterChange(\"vehicletype\", vehicleType);\r\n\r\n if (this.selected) {\r\n this.label = vehicleType.value\r\n }\r\n }\r\n\r\n clearSelectedVehicleType(): void {\r\n this.onVehicleTypeClick(null);\r\n }\r\n}\r\n","module.exports = \"
{{vehicleType.value}}
\";","import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from \"@angular/core\";\r\nimport { ResourceAllocation } from \"@app/enum/ResourceType\";\r\nimport { ITag } from \"@app/interfaces/ITag\";\r\nimport { TagsService } from \"@app/services/tags.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { VButtonDropdownComponent } from \"@directives/_core/v-dropdown/v-button-dropdown/v-button-dropdown.component\";\r\nimport { FilterBarComponent } from \"../filter-bar.component\";\r\nimport { FilterTriggerType, IFilterBarFilter } from \"../filter-bar.models\";\r\nimport \"./tag-button-filter.component.scss\";\r\n\r\n@Component({\r\n selector: \"tag-button-filter\",\r\n template: require(\"./tag-button-filter.component.html\")\r\n})\r\nexport class TagButtonFilterComponent implements IFilterBarFilter {\r\n @Input() selected: ITag;\r\n @Input() label = this.translationService.t('tags.AllTags');\r\n @Output() change = new EventEmitter();\r\n\r\n @ViewChild(VButtonDropdownComponent) dropdown: VButtonDropdownComponent;\r\n\r\n // ---\r\n\r\n name = this.translationService.t(\"tags.Tag\");\r\n icon = \"fa-solid fa-tag\";\r\n type: FilterTriggerType = \"tag\";\r\n\r\n tags: ITag[];\r\n\r\n itemPromise: angular.IPromise;\r\n\r\n resourceAllocation = ResourceAllocation;\r\n\r\n constructor(\r\n readonly parent: FilterBarComponent,\r\n readonly elementRef: ElementRef,\r\n private readonly tagsService: TagsService,\r\n private readonly translationService: TranslationService\r\n ) {\r\n\r\n }\r\n\r\n onFilterOpen(): void {\r\n this.itemPromise = this.tagsService.getTags().then(tags => {\r\n this.tags = tags;\r\n });\r\n }\r\n\r\n filterPredicate(item: any, value?: ITag): boolean {\r\n if (item.TagIds) {\r\n return item.TagIds.includes(value.Id);\r\n }\r\n\r\n if (item.vehicle) {\r\n return item.vehicle.TagIds?.includes(value.Id);\r\n }\r\n\r\n if (item.Vehicle) {\r\n return item.Vehicle.TagIds?.includes(value.Id);\r\n }\r\n\r\n if (item.driver) {\r\n return item.driver.TagIds?.includes(value.Id);\r\n }\r\n if (item.Driver) {\r\n return item.Driver.TagIds?.includes(value.Id);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n searchPredicate = (item: ITag, value?: any): boolean => {\r\n return item.Name.toLowerCase().includes(value.toLowerCase());\r\n }\r\n\r\n onTagClick(tag: ITag): void {\r\n this.selected = tag;\r\n\r\n this.change.emit(tag);\r\n this.parent.onFilterChange(\"tag\", tag);\r\n\r\n if (this.selected) {\r\n this.label = tag.Name;\r\n }\r\n else {\r\n this.label = this.translationService.t('tags.AllTags');\r\n }\r\n }\r\n\r\n clearSelectedTag(): void {\r\n this.onTagClick(null);\r\n }\r\n}\r\n","module.exports = \"
{{tag.Name}}
{{ tag.ResourceAllocation | enumAsString : resourceAllocation : 'ResourceAllocation' }}
\";","module.exports = \"

{{name}}

0\\\" (onClick)=onItemSelected(null) class=link>Reset
minValue\\\" class=item-row [ngClass]=\\\"{ 'selected' : item.selected || i == categoryIndex, 'no-data' : item.count == 0 }\\\" bindCssVariable=color [bindCssVariableValue]=item.color>
{{item.selected ? \\\"done\\\" : item.icon}}
{{item.name}}
\";","module.exports = \"
{{(driver?.Name || ('DriverSummaryPanel.NoDriver' | translate))}} [VOR]
{{(driver?.Name || ('DriverSummaryPanel.NoDriver' | translate))}} [VOR]
{{driver?.Mobile}} {{vehicle?.PhoneNumber}}
\";","module.exports = \" \";","import { CdkVirtualScrollViewport } from \"@angular/cdk/scrolling\";\r\nimport { Component, EventEmitter, Input, OnChanges, OnInit, Output, ViewChild } from \"@angular/core\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport \"./vehicle-list.component.scss\";\r\n\r\n@Component({\r\n selector: \"vehicle-list-new\",\r\n template: require(\"./vehicle-list.component.html\")\r\n})\r\nexport class VehicleListComponent implements OnInit, OnChanges {\r\n\r\n @Input() selectedVehicle: IVehicle;\r\n @Output() vehicleClick = new EventEmitter();\r\n\r\n @ViewChild(CdkVirtualScrollViewport) virtualScroll: CdkVirtualScrollViewport;\r\n\r\n // ---\r\n\r\n vehicles: IVehicle[];\r\n displayVehicles: IVehicle[] = [];\r\n loading = false;\r\n rowHeight = 51;\r\n\r\n constructor(private readonly vehicleService: VehicleService) { }\r\n\r\n ngOnInit() {\r\n this.loadData();\r\n }\r\n\r\n ngOnChanges() {\r\n this.scrollToSelectedVehicle();\r\n }\r\n\r\n onSearch(text: string) {\r\n if (!text) {\r\n this.displayVehicles = this.vehicles;\r\n return;\r\n }\r\n\r\n this.displayVehicles = this.vehicleService.searchVehicles(this.vehicles, text);\r\n }\r\n\r\n trackByVehicle(index: number, vehicle: IVehicle) {\r\n return vehicle.Id;\r\n }\r\n\r\n clickRow(vehicle: IVehicle) {\r\n this.vehicleClick.emit(vehicle);\r\n }\r\n\r\n // ---\r\n\r\n private loadData() {\r\n this.loading = true;\r\n\r\n this.vehicleService.getVehicles({ includeLatestPlots: true, includePeripheralMappings: true })\r\n .then(vehicles => {\r\n this.sortVehicles(vehicles);\r\n this.vehicles = vehicles;\r\n this.displayVehicles = vehicles;\r\n })\r\n .finally(() => {\r\n this.loading = false;\r\n window.dispatchEvent(new Event('resize'));\r\n\r\n this.scrollToSelectedVehicle();\r\n });\r\n }\r\n\r\n private scrollToSelectedVehicle() {\r\n if (!this.selectedVehicle || !this.vehicles) {\r\n return;\r\n }\r\n\r\n setTimeout(() => {\r\n var index = this.vehicles.findIndex(v => v.Id == this.selectedVehicle.Id);\r\n\r\n // Ensure viewport is rendered well\r\n this.virtualScroll.scrollToIndex(index);\r\n });\r\n }\r\n\r\n private sortVehicles(vehicles: IVehicle[]) {\r\n // Need default sorter?\r\n vehicles.sort((v1, v2) => {\r\n // Show vehicles with data first\r\n if (v1.Plot && !v2.Plot) {\r\n return -1;\r\n }\r\n else if (!v1.Plot && v2.Plot) {\r\n return 1;\r\n }\r\n\r\n return v1.ShortReg.localeCompare(v2.ShortReg);\r\n });\r\n }\r\n}\r\n","module.exports = \"
\";","import { Injectable } from \"@angular/core\";\r\nimport { IPlot } from \"@app/interfaces/IPlot\";\r\nimport { PlotService } from \"@app/services/plots/plot.service\";\r\nimport { BehaviorSubject, lastValueFrom } from \"rxjs\";\r\nimport { take, tap } from \"rxjs/operators\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class VehicleStatusService {\r\n private latestPlots = new Map();\r\n constructor(private readonly plotService: PlotService) {\r\n this.getLatestPlots();\r\n }\r\n\r\n async getLatestPlotForVehicle(vehicleId: number): Promise {\r\n if (!this.latestPlots.size) {\r\n await this.getLatestPlots();\r\n }\r\n\r\n return this.latestPlots.get(vehicleId);\r\n }\r\n\r\n private async getLatestPlots(): Promise {\r\n await lastValueFrom(this.plotService.getLatestPlots().pipe(tap(\r\n plots => {\r\n this.latestPlots = new Map(plots.map(plot => [plot.VehicleId, plot]));\r\n }\r\n )))\r\n }\r\n}\r\n","module.exports = \"
fiber_manual_record
{{vehicle?.ShortReg}}
{{text}}
{{text}}
\";","module.exports = \"
{{vehicle?.vehicleData?.Make || vehicle?.Make}} {{vehicle?.vehicleData?.Model || vehicle?.Model}} {{vehicle?.vehicleData?.Derivative}}
{{vehicle.vehicleData.VehicleYear}} {{vehicle.vehicleData.Bhp}} BHP {{vehicle.vehicleData.EngineSizeDescripion}} {{vehicle.vehicleData.Fuel}} {{vehicle.vehicleData.TransmissionType}}
check warning warning
{{vehicle?.vehicleData?.MotExpiry | veriDate : \\\"date\\\"}}
{{'vehicleInfoCard.motExpiry' | translate}}
check warning warning
{{vehicle?.vehicleData?.TaxExpiry | veriDate : \\\"date\\\"}}
{{'vehicleInfoCard.taxExpiry' | translate}}
{{'vehicleInfoCard.height' | translate}}
{{vehicle.vehicleData.Height}}mm
{{'vehicleInfoCard.width' | translate}}
{{vehicle.vehicleData.Width}}mm
{{'vehicleInfoCard.weight' | translate}}
{{vehicle.vehicleData.Weight}}
{{'vehicleInfoCard.type' | translate}}
{{vehicle.vehicleData.VehicleType}}
{{'vehicleInfoCard.colour' | translate}}
{{vehicle.vehicleData.Colour}}
{{'vehicleInfoCard.axle' | translate}}
{{vehicle.vehicleData.AxleName}}
VIN
{{vehicle.vehicleData.Vin}}
\";","module.exports = \"{{ moment | veriDate: 'time' }} \";","import { CommonModule } from \"@angular/common\";\r\nimport { CUSTOM_ELEMENTS_SCHEMA, NgModule, NO_ERRORS_SCHEMA } from \"@angular/core\";\r\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\nimport { FormsDirectivesModule } from \"@app/directives/_forms/_form.directives.module\";\r\nimport { VTableModule } from \"@app/directives/_layout/v-table/v-table.module\";\r\nimport { MapDirectivesModule } from \"@app/directives/_map/_map.directives.module\";\r\nimport { VehicleDirectivesModule } from \"@app/directives/_vehicle/_vehicle.directives.module\";\r\nimport { ResourceManagementModule } from \"@app/main/components/resourceManagement/resourceManagement.module\";\r\nimport { StreamaxConfigsModule } from \"@app/main/modules/foundation/_routes/streamax-configs/streamax-configs.module\";\r\nimport { FoundationAccountService } from \"@app/main/modules/foundation/_services/account.service.ajs\";\r\nimport { DeviceDataValidationService } from \"@app/main/modules/foundation/_services/device-data-validation.service\";\r\nimport { VehicleValidationCheckRecordService } from \"@app/main/modules/foundation/_services/vehicle-validation-check-record.service\";\r\nimport { FoundationVehicleService } from \"@app/main/modules/foundation/_services/vehicle.service.ajs\";\r\nimport { CoreDirectivesModule } from \"@directives/_core/_core.directives.module\";\r\nimport { LayoutDirectivesModule } from \"@directives/_layout/_layout.directives.module\";\r\nimport { ResourceFiltersDirectivesModule } from \"@directives/_resourceFilters/_resourceFilters.directives.module\";\r\nimport { CommissionModule } from \"@foundation/_routes/commissions/commission.module\";\r\nimport { ManualDeviceValidationCheckService } from \"@foundation/_services/manual-device-validation-check.service\";\r\nimport { NotesService } from \"@foundation/_services/notes.service.ajs\";\r\nimport { FoundationPeripheralService } from \"@foundation/_services/peripheral.service.ajs\";\r\nimport { providerCreator } from \"@services/_services.module\";\r\nimport { StateParams, Transition } from \"@uirouter/angularjs\";\r\nimport { PipesModule } from \"src/app/_pipes/_pipes.module\";\r\nimport { MiscDirectivesModule } from \"../../../directives/_misc/_misc.directives.module\";\r\nimport { FoundationComponentsModule } from \"./_components/components.modules\";\r\nimport { CustomerSubscriptionsPageComponent } from \"./_routes/customers/customer-subscriptions-page/customer-subscriptions-page.component\";\r\nimport { CustomerSubscriptionsComponent } from \"./_routes/customers/customer-subscriptions/customer-subscriptions.component\";\r\nimport { FoundationCustomerEditComponent } from \"./_routes/customers/customerEdit/customer-edit.component\";\r\nimport { CustomerOverviewComponent } from \"./_routes/customers/customerOverview/customer-overview.component\";\r\nimport { FoundationCustomersComponent } from \"./_routes/customers/customers.component\";\r\nimport { CustomerViewComponent } from \"./_routes/customers/customerView/customer-view.component\";\r\nimport { CustomerUserList } from \"./_routes/customers/userList/user-list.component\";\r\nimport { DeveloperConsoleComponent } from \"./_routes/developerConsole/developer-console.component\";\r\nimport { DeviceHealthAccountsComponent } from \"./_routes/device-health/components/device-health-accounts/device-health-accounts.component\";\r\nimport { DeviceHealthVehicleViewComponent } from \"./_routes/device-health/components/device-health-vehicle-view/device-health-vehicle-view.component\";\r\nimport { DeviceHealthVehiclesComponent } from \"./_routes/device-health/components/device-health-vehicles/device-health-vehicles.component\";\r\nimport { DeviceHealthComponent } from \"./_routes/device-health/components/device-health/device-health.component\";\r\nimport { EngineerCommissionHistoryListComponent } from \"./_routes/engineer-commission-history/engineer-commission-history-list.component\";\r\nimport { EngineerJobItemListModule } from \"./_routes/engineer-job-items/engineer-job-item-list.module\";\r\nimport { EngineerEditorComponent } from \"./_routes/engineer-users/engineer-editor/engineer-editor.component\";\r\nimport { EngineerUsersComponent } from \"./_routes/engineer-users/engineer-users-list.component\";\r\nimport { HardwareModule } from \"./_routes/hardware/hardware.module\";\r\nimport { UnitLogService } from \"./_routes/hardware/units/unit-logs/unit-log.service\";\r\nimport { FoundationJobsModule } from \"./_routes/jobs/jobs.module\";\r\nimport { ReleaseNotesComponent } from \"./_routes/release-notes/release-notes.component\";\r\nimport { RVLiteModule } from \"./_routes/rv-lite/rv-lite.module\";\r\nimport { FoundationVehicleListComponent } from \"./_routes/vehicles/vehicle-list.component\";\r\nimport { VehicleViewComponent } from \"./_routes/vehicles/vehicleView/vehicle-view.component\";\r\nimport { VisitFailuresComponent } from \"./_routes/visit-failures/visit-failures.component\";\r\nimport { FoundationUserService } from \"./_services/user.service.ajs\";\r\n\r\nconst privateComponents: any[] = [\r\n\r\n];\r\n\r\nconst publicComponents: any[] = [\r\n FoundationCustomersComponent,\r\n EngineerUsersComponent,\r\n DeveloperConsoleComponent,\r\n EngineerEditorComponent,\r\n CustomerSubscriptionsComponent,\r\n CustomerSubscriptionsPageComponent,\r\n ReleaseNotesComponent,\r\n FoundationVehicleListComponent,\r\n VehicleViewComponent,\r\n CustomerOverviewComponent,\r\n CustomerUserList,\r\n CustomerViewComponent,\r\n FoundationCustomerEditComponent,\r\n DeviceHealthComponent,\r\n DeviceHealthAccountsComponent,\r\n DeviceHealthVehiclesComponent,\r\n DeviceHealthVehicleViewComponent,\r\n EngineerCommissionHistoryListComponent,\r\n VisitFailuresComponent\r\n];\r\n\r\nconst declarations: any[] = [\r\n];\r\n\r\nconst providers: any[] = [\r\n providerCreator(FoundationPeripheralService, \"foundationPeripheralService\"),\r\n providerCreator(FoundationAccountService, \"foundationAccountService\"),\r\n providerCreator(FoundationUserService, \"foundationUserService\"),\r\n providerCreator(FoundationVehicleService, \"foundationVehicleService\"),\r\n providerCreator(NotesService, \"notesService\"),\r\n ManualDeviceValidationCheckService,\r\n DeviceDataValidationService,\r\n VehicleValidationCheckRecordService,\r\n providerCreator(StateParams, '$stateParams'),\r\n providerCreator(Transition, '$transitions'),\r\n UnitLogService\r\n];\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n BrowserAnimationsModule,\r\n PipesModule,\r\n CommissionModule,\r\n MiscDirectivesModule,\r\n FormsDirectivesModule,\r\n ResourceFiltersDirectivesModule,\r\n FoundationComponentsModule,\r\n MapDirectivesModule,\r\n VTableModule,\r\n LayoutDirectivesModule,\r\n CoreDirectivesModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n VehicleDirectivesModule,\r\n EngineerJobItemListModule,\r\n ResourceManagementModule,\r\n FoundationJobsModule,\r\n HardwareModule,\r\n RVLiteModule,\r\n StreamaxConfigsModule\r\n ],\r\n providers: providers,\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents, ...declarations],\r\n exports: [...publicComponents, ...declarations],\r\n schemas: [CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA]\r\n})\r\nexport class FoundationModule {\r\n constructor() {\r\n }\r\n}\r\n","module.exports = \"
{{data[0]}}
{{data[1]}}
\";","module.exports = \"
{{ cell.data }}
\";","module.exports = \"{{ buttonString }} \";","import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from \"@angular/core\";\r\nimport { IVTableColumn } from \"../../_models/IVTableColumn\";\r\nimport { VTableService } from \"../../_services/v-table.service\";\r\nimport './v-table-column-editor.component.scss';\r\n\r\n@Component({\r\n selector: 'column-editor',\r\n template: require('./v-table-column-editor.component.html')\r\n})\r\nexport class VTableColumnEditorComponent implements OnChanges {\r\n @Input() columns: IVTableColumn[];\r\n @Output() columnsChange = new EventEmitter[]>();\r\n\r\n storageKey: string;\r\n\r\n constructor(\r\n private readonly vTableService: VTableService) { }\r\n\r\n ngOnChanges(): void {\r\n this.storageKey = this.vTableService.getTableId(this.columns);\r\n }\r\n \r\n onColumnChecked(column: IVTableColumn, checked: boolean): void {\r\n column.header.hidden = !column.header.hidden;\r\n this.saveUserColumnPreferences();\r\n }\r\n\r\n //--\r\n\r\n private saveUserColumnPreferences(): void {\r\n window.localStorage.setItem(this.storageKey, JSON.stringify(this.columns));\r\n }\r\n}\r\n","module.exports = \"
{{ column.header.title }}
\";","module.exports = \"
\";","module.exports = \"
{{title}}
{{valuePrefix}}
\";","module.exports = \"
{{ rangeDescriptorHtml }} \";","module.exports = \" {{ 'Common.DiscardChanges' | translate }} {{ 'Common.Saved' | translate }} {{ 'Common.Save' | translate }} \";","module.exports = \"
{{ 'AccountSettingsSaveWarning.PrimaryWarning' | translate }}
{{ 'AccountSettingsSaveWarning.Question' | translate }}
\";","module.exports = \"
\";","module.exports = \"
{{ 'AutoDownloadConfiguration.ChannelSubtitle' | translate}}
{{ 'AutoDownloadConfiguration.ChannelSubtitleInfo' | translate }}
{{ channel.label }}
{{ autoDownloadForm.controls[\\\"channels\\\"].errors.customMessage }}
{{ dataUsageInformation }}
\";","module.exports = \" {{ 'AutoDownloadConfiguration.Add' | translate }} \";","module.exports = \"
{{ 'CameraManagement.ChannelInactive' | translate }}
{{ 'CameraManagement.Active' | translate }}
\";","module.exports = \"\\\"{{ \";","module.exports = \" \";","module.exports = \" \";","module.exports = \"
{{ 'ContextualSpeedingRoadEditor.RoadMarkersSubtitle' | translate }}
{{ 'ContextualSpeedingRoadEditor.NoMarkersAdded' | translate }}
{{ start.options.position.lat.toFixed(6) }}, {{ start.options.position.lng.toFixed(6) }}
{{ end.options.position.lat.toFixed(6) }}, {{ end.options.position.lng.toFixed(6) }}
{{ 'ContextualSpeedingRoadEditor.ClearMarkers' | translate }}
\";","export enum ContextualSpeedingTab {\r\n ByVehicle = \"byVehicle\",\r\n ByRoad = \"byRoad\"\r\n}\r\n","module.exports = \" {{ button.displayText | translate }} \";","export type SpeedingExample = {\r\n currentValue: string;\r\n allowedValue: string;\r\n}\r\n\r\nexport class SpeedingExamplesCalculator {\r\n static getExamples(speedPercentThreshold: number, speedThresholdAllowance: number, speedUnit: string) : SpeedingExample[] {\r\n return [\r\n this.calculate(20, speedPercentThreshold, speedThresholdAllowance, speedUnit),\r\n this.calculate(40, speedPercentThreshold, speedThresholdAllowance, speedUnit),\r\n this.calculate(60, speedPercentThreshold, speedThresholdAllowance, speedUnit),\r\n this.calculate(80, speedPercentThreshold, speedThresholdAllowance, speedUnit),\r\n this.calculate(100, speedPercentThreshold, speedThresholdAllowance, speedUnit),\r\n ]\r\n }\r\n\r\n private static calculate(\r\n currentValue: number, \r\n speedPercentThreshold: number, \r\n speedThresholdAllowance: number, \r\n speedUnit: string\r\n ) : SpeedingExample {\r\n const percentageMultiplier = 1 + (speedPercentThreshold / 100);\r\n const allowedValue = Math.round(currentValue * percentageMultiplier + speedThresholdAllowance);\r\n\r\n\r\n return { \r\n currentValue: `${currentValue} ${speedUnit}`,\r\n allowedValue: `${allowedValue} ${speedUnit}`\r\n };\r\n }\r\n}","module.exports = \"
{{ 'ContextualSpeedingVehicleEditor.SampleCalculations.Title' | translate: [currentValue] }}
  • {{ 'ContextualSpeedingVehicleEditor.SampleCalculations.Calculation' | translate: [item.currentValue, item.allowedValue] }}
\";","module.exports = \"
info {{ 'DeviceProfileService.NoUnitInstalledLabel' | translate }}
info {{ 'DeviceProfileService.IncompatibleUnitLabel' | translate }}
info {{ 'DeviceProfileService.NoProfileAssigned' | translate }}
sync_problem {{ 'DeviceProfileService.AwaitingSyncLabel' | translate }}
cloud_done {{ 'DeviceProfileService.SynchronizedLabel' | translate }}
--
\";","module.exports = \"
{{ 'DeviceProfileEditor.AssignProfileSubtitle' | translate }}
{{ 'DeviceProfileEditor.OneVehicleAssignmentWarning' | translate }}
{{ 'DeviceProfileEditor.ApplyToAllVehiclesToggle' | translate }}
{{ allResourcesAssociationError }}
{{ vehicle.ShortReg }}
{{ 'DeviceProfileEditor.OnlyCompatibleUnitsDisplayed' | translate }}
{{ displayMapping.mapping.validationError }}
{{ displayMapping.mapping.validationError }}
{{ 'DeviceProfileEditor.AssignmentRemovalAcknowledgeButton' | translate }}
\";","module.exports = \"
{{ vehicle.deviceProfile.Name }}
{{ 'DeviceProfileVehiclePreview.NoDeviceProfileAppliedDescription' | translate }}
{{ 'Common.Loading' | translate }}
\";","module.exports = \" 0\\\">
{{ 'DeviceProfileVehicleView.' + ((comparison.IsCorrect && comparison.ProfileValue === comparison.DeviceValue) ? 'SynchronizedLabel' : 'OutOfSyncLabel') | translate }}
{{ 'DeviceProfileVehicleView.EmptyStateLabel' | translate }}
\";","module.exports = \" {{ 'DeviceProfilesManager.CreateDeviceProfileButton' | translate }} \";","module.exports = \" {{ 'DrivingStyleAssociationsManager.ApplyToAllToggle' | translate }}
{{ group.Name }} {{ 'DrivingStyleAssociationsManager.AddAssociationButton' | translate }}
\";","module.exports = \"
0\\\" formTitle=\\\"{{ 'DrivingStyleMetricEditor.WeightingTitle' | translate }}\\\" subtitle=\\\"{{ 'DrivingStyleMetricEditor.WeightingSubtitle' | translate }}\\\">
0\\\">
{{ metricMapping.metricMetadataItem.calculationDescription }}
{{ 'DrivingStylesService.AllCustomWeightingsMustEqual100' | translate : drivingStyle.totalWeighting }}
\";","module.exports = \"
{{ 'DrivingStyleMetricSelector.NoMetricsAppliedWarning' | translate }}
{{ drivingStyle.metricMappingsError }}
0\\\"> = maxAllowedMetrics)\\\" (click)=onClickToggleMetricMapping(metricMapping);> = maxAllowedMetrics\\\"> 0\\\" [metricMapping]=metricMapping> {{ 'Common.Configure' | translate }} {{ 'DrivingStyleMetricSelector.NoMetricsAvailableWarning' | translate }} \";","module.exports = \" {{ 'DrivingStyleEditor.LoadingTitle' | translate }} {{ ((dirtyDrivingStyle?.Id > 0) ? 'DrivingStyleEditor.EditDrivingStyleTitle' : 'DrivingStyleEditor.CreateNewDrivingStyleTitle') | translate }} {{ 'DrivingStyleEditor.AssociationsPillLabel' | translate: (dirtyDrivingStyle?.DrivingStyleAssociations?.length ?? 0) }} {{ 'DrivingStyleEditor.AppliedMetricsPillLabel' | translate: (dirtyDrivingStyle?.DrivingStyleMetricMappings?.length ?? 0) }} 0\\\" class=margin-right-10 subjectVerb=\\\"{{'Common.Delete' | translate}}\\\" subjectName=\\\"{{'Common.DrivingStyle' | translate}}\\\" (onConfirm)=onConfirmDeleteButton($event)> {{ 'Common.Cancel' | translate }} {{ 'Common.SaveAndClose' | translate }}
{{ 'DrivingStyleEditor.AppliesToSubtitle' | translate }}
{{ 'DrivingStyleEditor.AppliedToInfo1' | translate }}
{{ 'DrivingStyleEditor.AppliedToInfo2' | translate }}
0\\\" [tinyMode]=true icon=info> {{ 'DrivingStyleEditor.MetricWeightingsEnabledInfoContent' | translate }}
{{ 'DrivingStyleEditor.AppliedMetricsSubtitle' | translate: maxTotalAllowedMetrics }}
= maxTotalAllowedMetrics\\\"> {{ 'DrivingStyleEditor.MaxMetricsWarningContent' | translate: maxTotalAllowedMetrics }}
\";","module.exports = \"{{ ('DrivingStylesService.WeightingLevelLabel' + MetricMappingWeightingLevel[metricMapping.weightingLevelDetails.level]) | translate: (metricMapping.Weighting | number : '1.0-1') }} \";","module.exports = \" {{ vehicle.drivingStyle.Name }} {{ 'DrivingStyleVehiclePreview.NoDrivingStyleAppliedDescription' | translate }}
{{ 'Common.Loading' | translate }}
\";","module.exports = \" {{ 'DrivingStylesManager.CreateNewStyleButton' | translate }} \";","module.exports = \"
Clear
\";","module.exports = \" \";","module.exports = \"
{{'groups.setAsDepot' | translate}}
{{ 'groups.DuplicateVehicleDepotAssignment' | translate }}
{{'groups.assignedToDepot' | translate : parentDepot.Name}}
{{'groups.groupContainsDepotContent' | translate}}
  • {{depot.Name}}
{{ 'FormValidationService.ParentCascadeContainsDepot' | translate }}
{{'Common.Groups' | translate}}
0 && numParents < 5\\\" (onClick)=addSubGroup()>{{'groups.addSubGroup' | translate}}
{{'groups.saveBeforeAdding' | translate}}
= 5\\\" class=text-muted>{{'groups.maxSubGroups' | translate}}
{{'groups.addSubGroup' | translate}}
0\\\" formTitle=\\\"{{ 'groups.LinkedAlerts' | translate }}\\\" subtitle=\\\"{{ 'groups.LinkedAlertsSubtitle' | translate }}\\\">
\";","module.exports = \"
{{ title }}
{{ 'Common.Depot' | translate }} {{ 'groupList.Parent' | translate }}: {{ changedGroup.parent.Name }} {{ 'groupList.SubgroupsCount' | translate : (changedGroup.children?.length || 0)}}
0\\\">{{ 'groupList.VehiclesHidden' | translate : hiddenVehiclesCount }} 0\\\">{{ 'groupList.DriversHidden' | translate : hiddenDriversCount }} 0\\\">{{ 'groupList.GeofencesHidden' | translate : hiddenGeofencesCount }}
0\\\" (onConfirm)=deleteGroup($event) subjectName=\\\"{{'Common.Group' | translate}}\\\" subjectVerb=\\\"{{'Common.Delete' | translate}}\\\" [groupAlertMapping]=groupAlertMappings [canBeDeleted]=!groupAlertMappings?.GroupIdInUse>
{{ \\\"Common.Cancel\\\" | translate }} {{ 'Common.Save' | translate }}
\";","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild } from '@angular/core';\r\nimport { ResourceGroupDisplayComponent } from '@app/directives/_layout/resourceGroupDisplay/resourceGroupDisplay.component';\r\nimport { IVTableCell } from '@app/directives/_layout/v-table/_models/IVTableCell';\r\nimport { IVTableColumn } from '@app/directives/_layout/v-table/_models/IVTableColumn';\r\nimport { IVTableRow } from '@app/directives/_layout/v-table/_models/IVTableRow';\r\nimport { VTableService } from '@app/directives/_layout/v-table/_services/v-table.service';\r\nimport { FilterBarComponent } from '@app/directives/_resourceFilters/filter-bar/filter-bar.component';\r\nimport { VehicleStatusComponent } from '@app/directives/_vehicle/vehicle-status/vehicle-status.component';\r\nimport { ResourceType } from '@app/enum/ResourceType';\r\nimport { VehicleType } from '@app/enum/VehicleType.enum';\r\nimport { VTableSelectionType } from '@app/enum/VTableSelectionType';\r\nimport { IDriver } from '@app/interfaces/IDriver';\r\nimport { IGeofence } from '@app/interfaces/IGeofences';\r\nimport { IVehicle } from '@app/interfaces/IVehicle';\r\nimport { IGroup } from '@app/interfaces/IVehicleGroup';\r\nimport { TranslationService } from '@app/services/translation.service';\r\nimport './group-resources.component.scss';\r\n\r\n@Component({\r\n selector: 'group-resources',\r\n template: require('./group-resources.component.html')\r\n})\r\nexport class GroupResourcesComponent implements OnInit, OnChanges {\r\n @Input() resources: IVehicle[] | IDriver[] | IGeofence[];\r\n @Input() resourceType: ResourceType;\r\n @Input() groups: IGroup[];\r\n @Input() group: IGroup;\r\n @Input() isDepot: boolean;\r\n\r\n @Output() selectedResourcesChange = new EventEmitter();\r\n @ViewChild(FilterBarComponent) filterBar: FilterBarComponent; \r\n \r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[] = [];\r\n\r\n selectedResourceIds: Set;\r\n\r\n VTableSelectionType = VTableSelectionType;\r\n ResourceType = ResourceType;\r\n\r\n constructor(\r\n private readonly translationService: TranslationService,\r\n private readonly vTableService: VTableService) { }\r\n\r\n ngOnInit(): void {\r\n this.createTable();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if ((changes['isDepot'] || changes['resources']) && this.resources?.length && this.tableColumns) {\r\n this.createTableRows();\r\n this.selectResourcesInGroup();\r\n }\r\n }\r\n\r\n onSelectedRowsChange(selectedRows: IVTableRow[]): void {\r\n this.selectedResourceIds = new Set(selectedRows.map(row => row.data.Id));\r\n this.selectedResourcesChange.emit([...this.selectedResourceIds]);\r\n this.filterBar.updateTabCounts();\r\n }\r\n \r\n //--\r\n\r\n private createTable(): void {\r\n this.tableColumns = [];\r\n\r\n this.tableColumns.push({\r\n header: this.vTableService.createTableHeader({ tKey: \"groups.Label\", width: this.getWidthForLabel() }),\r\n createCellFunction: resource => this.getLabelCellForResource(resource)\r\n })\r\n\r\n if (this.resourceType == ResourceType.Vehicle) {\r\n this.tableColumns.push({\r\n header: this.vTableService.createTableHeader({ tKey: 'Common.Type', width: 150 }),\r\n createCellFunction: (resource: IVehicle) => this.vTableService.createEnumCell(VehicleType, \"VehicleType\", resource.VehicleType)\r\n })\r\n }\r\n\r\n if (this.resourceType == ResourceType.Vehicle) {\r\n this.tableColumns.push({\r\n header: this.vTableService.createTableHeader({ tKey: 'Common.Status', width: 200, sortable: false, searchable: false }),\r\n createCellFunction: (resource: IVehicle) => this.vTableService.createTableCell(resource, {\r\n component: VehicleStatusComponent,\r\n componentInputs: {\r\n vehicle: resource,\r\n hideReg: true\r\n }\r\n })\r\n })\r\n }\r\n\r\n if (this.resourceType !== ResourceType.Geofence) {\r\n this.tableColumns.push({\r\n header: this.vTableService.createTableHeader({ tKey: 'groupList.CurrentGroups' }),\r\n createCellFunction: resource => this.getCurrentGroupsCellForResource(resource)\r\n })\r\n }\r\n }\r\n\r\n private getWidthForLabel(): number {\r\n switch (this.resourceType) {\r\n case ResourceType.Driver:\r\n return 200;\r\n case ResourceType.Vehicle:\r\n return 100;\r\n }\r\n }\r\n\r\n private createTableRows(): void {\r\n this.tableRows = this.vTableService.createTableRows(this.resources, this.tableColumns);\r\n }\r\n\r\n private getLabelCellForResource(resource: IVehicle | IDriver | IGeofence): IVTableCell {\r\n if (this.isVehicle(resource)) {\r\n return this.createLabelCellForVehicle(resource);\r\n }\r\n\r\n if (this.isDriver(resource)) {\r\n return this.createLabelCellForDriver(resource);\r\n }\r\n\r\n if (this.isGeofence(resource)) {\r\n return this.createLabelCellForGeofence(resource);\r\n }\r\n }\r\n\r\n private createLabelCellForVehicle(vehicle: IVehicle): IVTableCell {\r\n return this.vTableService.createVehicleRegCell(vehicle);\r\n }\r\n\r\n private createLabelCellForDriver(driver: IDriver): IVTableCell {\r\n return this.vTableService.createTableCell(driver.DisplayName);\r\n }\r\n\r\n private createLabelCellForGeofence(geofence: IGeofence): IVTableCell {\r\n return this.vTableService.createTableCell(geofence.Description);\r\n }\r\n\r\n private getCurrentGroupsCellForResource(resource: IVehicle | IDriver | IGeofence): IVTableCell {\r\n if (this.isVehicle(resource)) {\r\n return this.getCurrentGroupsCellForVehicle(resource);\r\n }\r\n\r\n if (this.isDriver(resource)) {\r\n return this.getCurrentGroupsCellForDriver(resource);\r\n }\r\n }\r\n\r\n private getCurrentGroupsCellForVehicle(vehicle: IVehicle): any {\r\n const depotContainingResource = this.getOtherDepotForResource(vehicle, ResourceType.Vehicle);\r\n\r\n if (this.isDepot && !!depotContainingResource) {\r\n if (this.selectedResourceIds?.has(vehicle.Id) ||\r\n (!this.selectedResourceIds && this.group.GroupVehicleMappings.findIndex(mapping => mapping.ResourceId == vehicle.Id) > -1)) {\r\n return this.vTableService.createTableCell(this.translationService.t('groups.VehicleInOtherDepots', depotContainingResource.Name), {\r\n tooltip: true,\r\n classes: 'text-muted',\r\n icon: 'fa-circle-exclamation'\r\n });\r\n }\r\n\r\n return this.vTableService.createTableCell(this.translationService.t('groups.cantSelectVehicles', depotContainingResource.Name), {\r\n disableRow: true,\r\n tooltip: true\r\n });\r\n\r\n }\r\n\r\n const searchAndSortString: string = this.getSearchAndSortStringForResourceGroups(vehicle, ResourceType.Vehicle);\r\n\r\n return this.vTableService.createTableCell(searchAndSortString, {\r\n component: ResourceGroupDisplayComponent,\r\n componentInputs: {\r\n groups: this.groups,\r\n vehicle: vehicle,\r\n max: 2\r\n }\r\n });\r\n }\r\n\r\n private getSearchAndSortStringForResourceGroups(resource: IVehicle, resourceType: ResourceType): string {\r\n const propertyName: string = `${ResourceType[resourceType]}Ids`;\r\n const resourceGroups: IGroup[] = this.groups.filter(group => group[propertyName].includes(resource.Id));\r\n return resourceGroups.map(group => group.Name).join();\r\n }\r\n\r\n\r\n private getCurrentGroupsCellForDriver(driver: IDriver): any {\r\n const searchAndSortString: string = this.getSearchAndSortStringForResourceGroups(driver, ResourceType.Driver);\r\n\r\n return this.vTableService.createTableCell(searchAndSortString, {\r\n component: ResourceGroupDisplayComponent,\r\n componentInputs: {\r\n groups: this.groups,\r\n driver: driver,\r\n max: 2\r\n }\r\n });\r\n }\r\n \r\n private selectResourcesInGroup(): void {\r\n if (!this.tableRows) {\r\n return;\r\n }\r\n\r\n this.selectedResourceIds?.clear();\r\n\r\n if (this.selectedResourceIds && this.group.Id > 0) {\r\n this.selectFromSavedList();\r\n return;\r\n }\r\n else if (this.group.Id <= 0) {\r\n this.selectedResourceIds?.clear();\r\n this.selectedResourcesChange.emit([])\r\n }\r\n \r\n this.deselectAllRows();\r\n \r\n this.tableRows.forEach(row => {\r\n if (this.isVehicle(row.data) && this.group.GroupVehicleMappings.findIndex(mapping => mapping.ResourceId == row.data.Id) > -1) {\r\n row.selected = true;\r\n }\r\n\r\n if (this.isDriver(row.data) && this.group.GroupDriverMappings.findIndex(mapping => mapping.ResourceId == row.data.Id) > -1) {\r\n row.selected = true;\r\n }\r\n\r\n\r\n if (this.isGeofence(row.data) && this.group.GroupGeofenceMappings.findIndex(mapping => mapping.ResourceId == row.data.Id) > -1) {\r\n row.selected = true;\r\n }\r\n });\r\n }\r\n\r\n private deselectAllRows(): void {\r\n this.tableRows.forEach(row => row.selected = false);\r\n }\r\n\r\n private selectFromSavedList(): void {\r\n this.tableRows.forEach(row => {\r\n if (this.isVehicle(row.data) && this.selectedResourceIds.has(row.data.Id)) {\r\n row.selected = true;\r\n }\r\n\r\n if (this.isDriver(row.data) && this.selectedResourceIds.has(row.data.Id)) {\r\n row.selected = true;\r\n }\r\n\r\n\r\n if (this.isGeofence(row.data) && this.selectedResourceIds.has(row.data.Id)) {\r\n row.selected = true;\r\n }\r\n })\r\n }\r\n\r\n private getOtherDepotForResource(resource: IDriver | IVehicle | IGeofence, resourceType: ResourceType): IGroup {\r\n let otherDepot = null;\r\n const propertyName = `Group${ResourceType[resourceType]}Mappings`;\r\n\r\n const depots = this.groups.filter(group => group.IsDepot);\r\n\r\n for (let i = 0; i < depots.length; i++) {\r\n if (depots[i].Id === this.group.Id) {\r\n continue;\r\n }\r\n\r\n if (depots[i][propertyName].some(mapping => mapping.ResourceId == resource.Id)) {\r\n otherDepot = depots[i];\r\n break;\r\n }\r\n }\r\n\r\n return otherDepot;\r\n }\r\n\r\n private isVehicle(resource: IVehicle | IGeofence | IDriver): boolean {\r\n return \"Reg\" in resource;\r\n }\r\n\r\n private isDriver(resource: IVehicle | IGeofence | IDriver): boolean {\r\n return \"Username\" in resource;\r\n }\r\n\r\n private isGeofence(resource: IVehicle | IGeofence | IDriver): boolean {\r\n return \"Description\" in resource;\r\n }\r\n \r\n}\r\n","module.exports = \" \";","module.exports = \"
check home {{ !!group.children ? 'folder_open' : 'keyboard_arrow_right' }}
{{ group.Name }}
(Depot)
{{group.totalVehicles}} {{group.totalDrivers }} {{group.totalGeofences }}
0\\\">
\";","module.exports = \" {{ 'groups.addGroup' | translate }}
{{ 'groups.addGroup' | translate }} {{ selectedGroup.Name || ('groups.newGroup' | translate) }} {{ 'Common.Depot' | translate }} {{ 'groupList.Parent' | translate }}: {{ selectedGroup.parent.Name }} {{ 'groupList.SubgroupsCount' | translate : (selectedGroup.children?.length || 0)}}
\";","module.exports = \" {{ 'SamlConfig.PageTitle' | translate }} {{ 'SamlConfig.DomainVerifiedMessage' | translate }} {{ 'SamlConfig.PendingMessage' | translate }} {{ 'SamlConfig.VerifyNow' | translate }} {{ 'SamlConfig.SaveMessage' | translate }} \";","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { IAccountUserMapping, IUser } from \"@app/interfaces/IUser\";\r\nimport { Observable } from \"rxjs\";\r\nimport { catchError, mergeMap, tap } from \"rxjs/operators\";\r\nimport { AccountUserMappingService } from \"../accountUserMapping.service\";\r\nimport { UsersService } from \"../users.service\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UserService {\r\n constructor(private readonly http: HttpClient,\r\n private readonly accountUserMappingService: AccountUserMappingService,\r\n private readonly usersService: UsersService) { }\r\n\r\n saveUser(user: IUser): Observable {\r\n return this.http.post(`/api/users/`, user, { params: { userLanguage: user.newUserLanguageCode } });\r\n }\r\n\r\n saveUserWithAccountMapping(user: IUser): Observable {\r\n if (user.Id > 0) {\r\n return this.accountUserMappingService.postAccountUserMapping(user.Email, user.CurrentAccountUserMapping);\r\n }\r\n\r\n return this.saveUser(user).pipe(mergeMap(userId => {\r\n return this.accountUserMappingService.postAccountUserMapping(user.Email, user.CurrentAccountUserMapping);\r\n }))\r\n }\r\n\r\n isCurrentUserOnFoundationPlatform(): boolean {\r\n // TODO the original method used here uses $rootScope... need to spend some time investigating the alternatives\r\n return this.usersService.isCurrentUserOnFoundationPlatform();\r\n }\r\n\r\n\r\n getLoginToken(userId: number): Observable {\r\n return this.http.get(`/api/users/token/${userId}`, { responseType: \"text\" });\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { AccountService } from \"@app/main/modules/foundation/_services/account.service\";\r\nimport { AccountFeatureService, IAccountFeatureDescription, IAccountFeatureDescriptionMap, ISpecialUserPermissionDescriptionMap } from \"@app/services/accountFeature.service\";\r\nimport { Observable } from \"rxjs\";\r\nimport { map } from \"rxjs/operators\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UserEditorService {\r\n constructor(\r\n private readonly accountFeatureService: AccountFeatureService,\r\n private readonly accountService: AccountService) { }\r\n\r\n getFeatureDescriptions(accountId: number): Observable {\r\n return this.accountService.getCustomerAccount(accountId).pipe(\r\n map(account => {\r\n return this.accountFeatureService.getFeatureDescriptionsForAccount(account);\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 { Observable } from \"rxjs\";\r\nimport { tap } from \"rxjs/operators\";\r\nimport { AccountService, IAccount } from \"./account.service\";\r\nimport { ConstantsService } from \"./constantsService\";\r\nimport { CurrentUserService } from \"./currentUser.service\";\r\nimport { ILoginResponse } from \"./login.service.ajs\";\r\nimport { NavigationService } from \"./navigation.service\";\r\nimport { SessionService } from \"./session.service\";\r\n\r\n@Injectable({\n providedIn: \"root\"\n})\nexport class LoginService {\n\n private tokenUrl: string;\n constructor(private readonly http: HttpClient,\n private readonly accountService: AccountService,\n private readonly constantsService: ConstantsService,\n private readonly currentUserService: CurrentUserService,\n private readonly navigationService: NavigationService,\n private readonly sessionService: SessionService) {\r\n this.tokenUrl = this.constantsService.getTokenUrl(); }\n\n sendForgotPasswordEmail(email: string): Observable {\n return this.http.post(`/api/forgottenpassword`, JSON.stringify(email));\r\n }\n\n loginWithToken(token: string, flushExistingSession = false): Observable {\r\n return this.login(\"---\", token, flushExistingSession);\r\n }\r\n\r\n login(username: string, password: string, flushExistingSession = false): Observable {\r\n if (flushExistingSession) {\r\n // Flush any existing session\r\n this.sessionService.clearAllCachesAndSessions();\r\n }\n\n const data = `grant_type=password&username=${username}&password=${encodeURIComponent(password)}`;\n const headers = new HttpHeaders({\r\n \"Content-Type\": \"application/x-www-form-urlencoded\"\r\n })\r\n\r\n return this.http.post(this.tokenUrl, data, { headers }).pipe(\n tap(loginResponse => {\n this.storeLoginSession(loginResponse);\r\n })\r\n );\r\n }\n\n switchAccount(accountId: number, reloadOnSuccess = false): Promise {\r\n return this.sessionService.switchAccount(accountId)\r\n .then(() => {\r\n this.currentUserService.getCurrentUser(true).then(() => {\r\n this.accountRedirect(reloadOnSuccess);\r\n });\r\n }) as Promise;\r\n\r\n }\n\n accountRedirect(reload = false): Promise {\r\n return this.getAllUserAndAccountSettings(true).then((accountData) => {\r\n this.navigationService.goToDefaultPage(accountData, reload);\r\n });\r\n }\r\n\r\n getAllUserAndAccountSettings(invalidateCache = true): Promise {\r\n return this.currentUserService.getCurrentUser().then(currentUser => {\r\n // We chain these, as we need current user BEFORE we get account data\r\n return this.accountService.getAccountData(invalidateCache)\r\n .then(accountData => {\r\n\r\n return this.sessionService.getAllUserAndAccountSettings()\r\n .then(() => {\n return accountData;\r\n })\r\n .finally(() => {\r\n return accountData;\r\n });\r\n })\r\n .finally(() => {\r\n this.currentUserService.performUserValidationChecks();\r\n });\r\n }) as Promise;\r\n }\n\n //--\n\n private storeLoginSession(loginResponse: ILoginResponse) {\r\n if (loginResponse != null && loginResponse.access_token.length > 0) {\r\n this.sessionService.setStorage(loginResponse);\r\n }\r\n else {\r\n console.warn(\"Didnt store login response...\");\r\n }\r\n }\r\n}\n","module.exports = \" 0\\\"> {{ 'UserEditor.UserTypeAccessWarning' | translate }}
{{ accountFeatureDescription.name }}
\";","export enum ZoneCreationSource {\r\n Hardware,\r\n User\r\n}\r\n","module.exports = \"
{{row.contents}} {{row.data.Source == 0 ? ('TemperatureZonesEdit.Hardware' | translate) : ('TemperatureZonesEdit.Custom' | translate)}}
\";","import { CommonModule } from \"@angular/common\";\r\nimport { CUSTOM_ELEMENTS_SCHEMA, NgModule, NO_ERRORS_SCHEMA } from \"@angular/core\";\r\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\r\nimport { VTableModule } from \"@app/directives/_layout/v-table/v-table.module\";\r\nimport { MapDirectivesModule } from \"@app/directives/_map/_map.directives.module\";\r\nimport { ResourceFiltersDirectivesModule } from \"@app/directives/_resourceFilters/_resourceFilters.directives.module\";\r\nimport { ResourceManagementModule } from \"@app/main/components/resourceManagement/resourceManagement.module\";\r\nimport { StreamaxConfigsAccountListComponent } from \"@app/main/modules/foundation/_routes/streamax-configs/account-list/streamax-configs-account-list.component\";\r\nimport { CustomTriggerMetrics } from \"@app/main/modules/foundation/_routes/streamax-configs/custom-trigger-metrics/custom-trigger-metrics.component\";\r\nimport { StreamaxConfigProfileEditor } from \"@app/main/modules/foundation/_routes/streamax-configs/profiles/streamax-config-profile-editor.component\";\r\nimport { StreamaxConfigsComponent } from \"@app/main/modules/foundation/_routes/streamax-configs/streamax-configs-account-view.component\";\r\nimport { StreamaxConfigsDeviceList } from \"@app/main/modules/foundation/_routes/streamax-configs/streamax-configs-device-list/streamax-configs-device-list.component\";\r\nimport { DeviceProfileVehicleSummaryComponent } from \"@app/main/modules/foundation/_routes/streamax-configs/streamax-configs-vehicle-summary/streamax-configs-vehicle-summary.component\";\r\nimport { CoreDirectivesModule } from \"@directives/_core/_core.directives.module\";\r\nimport { FormsDirectivesModule } from \"@directives/_forms/_form.directives.module\";\r\nimport { LayoutDirectivesModule } from \"@directives/_layout/_layout.directives.module\";\r\nimport { MiscDirectivesModule } from \"@directives/_misc/_misc.directives.module\";\r\nimport { VeriDirectivesModule } from \"@directives/_veri/_veri.directives.module\";\r\nimport { PipesModule } from \"src/app/_pipes/_pipes.module\";\r\nimport { VehicleDirectivesModule } from \"../../../../../directives/_vehicle/_vehicle.directives.module\";\r\nimport { FoundationComponentsModule } from \"../../_components/components.modules\";\r\n\r\nconst privateComponents: any[] = [\r\n];\r\n\r\nconst publicComponents: any[] = [\r\n StreamaxConfigsComponent,\r\n StreamaxConfigsAccountListComponent,\r\n StreamaxConfigProfileEditor,\r\n CustomTriggerMetrics,\r\n StreamaxConfigsDeviceList,\r\n DeviceProfileVehicleSummaryComponent\r\n];\r\n\r\nconst declarations: any[] = [\r\n];\r\n\r\nconst providers: any[] = [\r\n\r\n];\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n PipesModule,\r\n FormsModule,\r\n FormsDirectivesModule,\r\n ReactiveFormsModule,\r\n VeriDirectivesModule,\r\n VehicleDirectivesModule,\r\n MiscDirectivesModule,\r\n LayoutDirectivesModule,\r\n CoreDirectivesModule,\r\n VTableModule,\r\n ResourceFiltersDirectivesModule,\r\n ResourceManagementModule,\r\n FoundationComponentsModule,\r\n MapDirectivesModule\r\n ],\r\n providers: providers,\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents, ...declarations],\r\n exports: [...publicComponents, ...declarations],\r\n schemas: [CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA]\r\n})\r\nexport class StreamaxConfigsModule {\r\n constructor() {\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { PercentageBarModel, PercentageBarSegment } from \"@app/directives/_layout/v-table/_components/cells/percentage-bar/percentage-bar-cell.component\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { CalcType, FtCloudConfigExceptionError } from \"../../../_enums/camera-configs/CameraConfigEnums\";\r\nimport { IAccountGroupConfigDto } from \"../../../_models/_camera-configs/CameraConfigModels\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class StreamaxConfigsPercentageBarService {\r\n private readonly maxErrors = Object.keys(FtCloudConfigExceptionError).filter(key => isNaN(Number(key))).length - 1;\r\n\r\n constructor(private readonly translationService: TranslationService) { }\r\n\r\n getPercentageBarModel(accountGroupDto: IAccountGroupConfigDto, calcType: CalcType): PercentageBarModel {\r\n switch (calcType) {\r\n case CalcType.DeviceComms:\r\n return this.calculateDeviceCommsPercentages(accountGroupDto);\r\n case CalcType.TotalErrors:\r\n return this.calculateTotalErrorsPercentages(accountGroupDto);\r\n case CalcType.TotalSync:\r\n return this.calculateTotalSyncPercentages(accountGroupDto);\r\n default:\r\n throw new Error(\"Invalid calcType\");\r\n }\r\n }\r\n\r\n private calculateDeviceCommsPercentages(dto: IAccountGroupConfigDto): PercentageBarModel {\r\n const positiveSegment = this.getSegment(\r\n dto.PeripheralWithConfigRecord.filter(r => !!r.LatestRecord).length,\r\n 'StreamaxConfigs.Collected'\r\n );\r\n\r\n const negativeSegment = this.getSegment(\r\n dto.PeripheralWithConfigRecord.filter(r => !r.LatestRecord).length,\r\n 'StreamaxConfigs.Uncollected'\r\n )\r\n\r\n const mainText = this.translationService.t('StreamaxConfigs.NConfigsCollected', positiveSegment.count);\r\n\r\n return { positiveSegment, negativeSegment, mainText };\r\n }\r\n\r\n private calculateTotalErrorsPercentages(dto: IAccountGroupConfigDto): PercentageBarModel {\r\n const totalPossibleErrorsOverall = dto.PeripheralWithConfigRecord.length * this.maxErrors;\r\n const totalPossibleErrorsReceived = dto.PeripheralWithConfigRecord.filter(r => !!r.LatestRecord).length * this.maxErrors;\r\n\r\n const positiveSegment = this.getSegment(totalPossibleErrorsReceived - dto.CombinedErrors, 'StreamaxConfigs.MatchedProps');\r\n const negativeSegment = this.getSegment(dto.CombinedErrors, 'StreamaxConfigs.UnMatchedProps');\r\n const neutralSegment = this.getSegment(dto.PeripheralWithConfigRecord.filter(r => !r.LatestRecord).length * this.maxErrors, 'Common.Unknown');\r\n\r\n const mainText = this.translationService.t(\r\n 'StreamaxConfigs.XOfYMetricsAdhere', \r\n [totalPossibleErrorsReceived - dto.CombinedErrors, totalPossibleErrorsOverall]\r\n );\r\n\r\n return { positiveSegment, negativeSegment, neutralSegment, mainText };\r\n }\r\n\r\n private calculateTotalSyncPercentages(dto: IAccountGroupConfigDto): PercentageBarModel {\r\n const positiveSegment = this.getSegment(\r\n dto.PeripheralWithConfigRecord.filter(r =>\r\n r.LatestRecord?.CameraDeviceParameterSettings?.ProfileExceptionErrors?.Errors.length === 0\r\n ).length,\r\n 'StreamaxConfigs.MatchedDevices'\r\n );\r\n\r\n const negativeSegment = this.getSegment(\r\n dto.PeripheralWithConfigRecord.filter(r =>\r\n r.LatestRecord?.CameraDeviceParameterSettings?.ProfileExceptionErrors?.Errors.length > 0\r\n ).length,\r\n 'StreamaxConfigs.UnmatchedDevices'\r\n );\r\n\r\n const neutralSegment = this.getSegment(dto.PeripheralWithConfigRecord.filter(r => !r.LatestRecord).length, 'StreamaxConfigs.Uncollected');\r\n\r\n const mainText = this.translationService.t('StreamaxConfigs.NDevicesMatchCompletely', positiveSegment.count);\r\n\r\n return { positiveSegment, negativeSegment, neutralSegment, mainText };\r\n }\r\n\r\n private getSegment(count: number, tKey: string): PercentageBarSegment {\r\n return {\r\n count,\r\n tooltip: this.translationService.t(tKey)\r\n }\r\n }\r\n}","module.exports = \" {{ 'StreamaxConfigs.SetupNewAccountButton' | translate }} \";","module.exports = \" 0\\\"> {{ 'StreamaxConfigs.CreateNewOverride' | translate }} {{ selectedRow.VehicleType | enumAsString : VehicleTypes : 'VehicleTypes' }} {{ control.key }} \";","import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from \"@angular/core\";\r\nimport { FormControl, FormGroup, Validators } from \"@angular/forms\";\r\nimport { CustomFormValidators } from \"@app/directives/_forms/form-validation.service\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VehicleType } from \"@app/enum/VehicleType.enum\";\r\nimport { DSTOffsetDay, DSTOffsetMonth, DSTOffsetWeek, StreamaxRecordOverwrite } from \"@app/main/modules/foundation/_enums/camera-configs/CameraConfigEnums\";\r\nimport { IAccount } from \"@app/services/account.service\";\r\nimport { ICameraDeviceParameterProfileSettings, IStreamaxCameraProfile, ITriggerMetricsOverride, StreamaxCameraProfileService } from \"@app/services/camera/streamax-camera-profile-service\";\r\nimport { ITimeZoneInfo } from \"@app/userPreferences/model/ITimeZoneInfo\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { mergeMap, tap } from \"rxjs\";\r\nimport './streamax-config-profile-editor.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'streamax-config-profile-editor',\r\n template: require('./streamax-config-profile-editor.component.html')\r\n})\r\nexport class StreamaxConfigProfileEditor implements OnChanges {\r\n @Input() profile: ICameraDeviceParameterProfileSettings;\r\n @Input() isNewAccount: boolean;\r\n @Input() timezones: ITimeZoneInfo[];\r\n @Input() accounts: IAccount[];\r\n @Input() accountIdsWithExistingProfile: number[];\r\n\r\n @Output() profileUpdated = new EventEmitter();\r\n @Output() newProfileCreated = new EventEmitter();\r\n @Output() profileIsInSavableState = new EventEmitter();\r\n\r\n profileTimezone: ITimeZoneInfo;\r\n\r\n accountPicker: FormGroup;\r\n audioForm: FormGroup;\r\n ignitionDelayForm: FormGroup;\r\n videoLossForm: FormGroup;\r\n cameraCoveredForm: FormGroup;\r\n timezoneForm: FormGroup;\r\n accelAlarmGlobal: FormGroup;\r\n accelAlarmTrigger: FormGroup;\r\n brakeAlarmTrigger: FormGroup;\r\n leftAlarmTrigger: FormGroup;\r\n rightAlarmTrigger: FormGroup;\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n selectedRow: ITriggerMetricsOverride;\r\n\r\n selectedNewAccount: IAccount;\r\n\r\n overriddenVehicleTypes: VehicleType[] = [];\r\n\r\n constructor(\r\n private readonly streamaxCameraProfileService: StreamaxCameraProfileService\r\n ) { }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['isNewAccount']) {\r\n console.log(\"new Account setup\")\r\n this.profile = {\r\n AudioEnabled: false,\r\n CameraCoveredAlarm: false,\r\n VideoLossAlarm: true,\r\n IgnitionDelay: 300,\r\n RecordOverwrite: StreamaxRecordOverwrite.ByCapacity,\r\n TimeSettings: {\r\n TimezoneId: \"0A\",\r\n DSTEnabled: true,\r\n OffSetStartMonth: DSTOffsetMonth.March,\r\n OffSetEndMonth: DSTOffsetMonth.October,\r\n OffSetStartWeek: DSTOffsetWeek.LastWeekOfMonth,\r\n OffSetEndWeek: DSTOffsetWeek.LastWeekOfMonth,\r\n OffSetStartDay: DSTOffsetDay.Sunday,\r\n OffSetEndDay: DSTOffsetDay.Sunday,\r\n OffSetStartHour: 1,\r\n OffSetEndHour: 2,\r\n OffSetStartMinute: 0,\r\n OffSetEndMinute: 0\r\n },\r\n AlarmProfileMap: {\r\n AlarmEnabled: true,\r\n HardAccelerationTriggerEnabled: true,\r\n HarshBrakingTriggerEnabled: true,\r\n HarshLeftTurnTriggerEnabled: true,\r\n HarshRightTurnTriggerEnabled: true\r\n }\r\n }\r\n\r\n this.updateTimezoneInfo();\r\n }\r\n\r\n if (changes['profile']) {\r\n this.overriddenVehicleTypes = this.profile.AlarmProfileMap.TriggerMetricOverrides?.map(o => o.VehicleType);\r\n\r\n this.updateTimezoneInfo();\r\n }\r\n }\r\n\r\n accountSearchPredicate(account: IAccount, text: string): boolean {\r\n return account.CompanyName.toLowerCase().includes(text.toLowerCase());\r\n }\r\n\r\n onAccountSelected($event: IAccount): void {\r\n this.selectedNewAccount = $event;\r\n this.accountPicker.controls.AccountPicker.setValue(this.selectedNewAccount);\r\n this.accountPicker.get('AccountPicker').updateValueAndValidity();\r\n }\r\n\r\n clearSlectedAccount(): void {\r\n this.selectedNewAccount = null;\r\n this.accountPicker.controls.AccountPicker.setValue(this.selectedNewAccount);\r\n this.accountPicker.get('AccountPicker').updateValueAndValidity();\r\n }\r\n\r\n saveNewProfile(): void {\r\n this.streamaxCameraProfileService\r\n .convertTimezoneInfoIdToStreamaxModel(this.profile.internalTimezoneInfo.Id)\r\n .pipe(\r\n untilDestroyed(this),\r\n mergeMap(streamaxTimezone => {\r\n this.profile.TimeSettings = streamaxTimezone;\r\n \r\n\r\n const newProfileToSave: IStreamaxCameraProfile = {\r\n AccountId: this.selectedNewAccount.Id,\r\n IsActive: false,\r\n Id: 0,\r\n CameraDeviceParameterProfileSettings: this.profile,\r\n Name: this.selectedNewAccount.CompanyName\r\n };\r\n \r\n return this.streamaxCameraProfileService.postProfile(newProfileToSave);\r\n })\r\n )\r\n .subscribe({\r\n next: newProfile => {\r\n this.newProfileCreated.emit(newProfile);\r\n }\r\n });\r\n }\r\n\r\n private updateTimezoneInfo(): void {\r\n if (!!this.profile.internalTimezoneInfo) {\r\n this.createFormCategories();\r\n return;\r\n }\r\n\r\n this.streamaxCameraProfileService.convertStreamaxTimezoneId(this.profile.TimeSettings?.TimezoneId).pipe(untilDestroyed(this), tap(timezoneInfoId => {\r\n this.profile.internalTimezoneInfo = this.timezones.find(t => t.Id === timezoneInfoId.timezoneId);\r\n\r\n this.createFormCategories();\r\n })).subscribe({\r\n error: (err) => console.error('Error updating timezone info:', err),\r\n });\r\n }\r\n\r\n getControlType(control: FormControl): string {\r\n if (control.value instanceof Boolean || typeof control.value === 'boolean') {\r\n return 'boolean';\r\n } else if (typeof control.value === 'number') {\r\n return 'number';\r\n } else {\r\n return 'text';\r\n }\r\n }\r\n\r\n private createFormCategories(): void {\r\n\r\n if (this.isNewAccount) {\r\n this.createAccountFormCategory();\r\n this.accountPicker.get(\"AccountPicker\").updateValueAndValidity();\r\n }\r\n\r\n this.createAudioFormCategory();\r\n this.createIgnitionFormCategory();\r\n this.createVideoLossFormCategory();\r\n this.createCameraCoveredFormCategory();\r\n this.createTimezoneFormCategory();\r\n this.createGlobalAccelerationAlarmFormCategory();\r\n this.createAccelerationAlarmTriggerFormCategory();\r\n this.createBrakingAlarmTriggerFormCategory();\r\n this.createLeftAlarmTriggerFormCategory();\r\n this.createRightAlarmTriggerFormCategory(); \r\n }\r\n\r\n private updateProfile(status: string): void {\r\n if (status == \"INVALID\") {\r\n console.log(\"component issuing\")\r\n this.profileIsInSavableState.emit(false);\r\n return;\r\n }\r\n\r\n this.profileIsInSavableState.emit(true);\r\n this.profile = {\r\n ...this.profile,\r\n AudioEnabled: this.audioForm.get(\"AudioEnabled\").value,\r\n IgnitionDelay: this.ignitionDelayForm.get(\"IgnitionDelay\").value,\r\n VideoLossAlarm: this.videoLossForm.get(\"VideoLossAlarm\").value,\r\n CameraCoveredAlarm: this.cameraCoveredForm.get(\"CameraCoveredAlarm\").value,\r\n AlarmProfileMap: {\r\n AlarmEnabled: this.accelAlarmGlobal.get(\"AccelAlarmGlobal\").value,\r\n HardAccelerationTriggerEnabled: this.accelAlarmTrigger.get(\"AccelAlarmTrigger\").value,\r\n HarshBrakingTriggerEnabled: this.brakeAlarmTrigger.get(\"BrakeAlarmTrigger\").value,\r\n HarshLeftTurnTriggerEnabled: this.leftAlarmTrigger.get(\"LeftAlarmTrigger\").value,\r\n HarshRightTurnTriggerEnabled: this.rightAlarmTrigger.get(\"RightAlarmTrigger\").value,\r\n TriggerMetricOverrides: this.profile.AlarmProfileMap.TriggerMetricOverrides\r\n },\r\n updatedTimezoneInfo: this.timezoneForm.get(\"Timezone\").value\r\n }\r\n\r\n this.profileUpdated.emit(this.profile);\r\n }\r\n\r\n private createAccountFormCategory(): void {\r\n this.accountPicker = new FormGroup({\r\n \"AccountPicker\": new FormControl(this.selectedNewAccount, { validators: [Validators.required, CustomFormValidators.accountHasConfig(this.accountIdsWithExistingProfile)] })\r\n });\r\n\r\n this.accountPicker.statusChanges.pipe(untilDestroyed(this))\r\n .subscribe(status => {\r\n this.updateProfile(status);\r\n });\r\n }\r\n\r\n private createAccelerationAlarmTriggerFormCategory(): void {\r\n this.accelAlarmTrigger = new FormGroup({\r\n \"AccelAlarmTrigger\": new FormControl(this.profile.AlarmProfileMap.HardAccelerationTriggerEnabled)\r\n });\r\n\r\n this.accelAlarmTrigger.statusChanges.pipe(untilDestroyed(this))\r\n .subscribe(status => {\r\n this.updateProfile(status);\r\n });\r\n }\r\n\r\n private createBrakingAlarmTriggerFormCategory(): void {\r\n this.brakeAlarmTrigger = new FormGroup({\r\n \"BrakeAlarmTrigger\": new FormControl(this.profile.AlarmProfileMap.HarshBrakingTriggerEnabled)\r\n });\r\n\r\n this.brakeAlarmTrigger.statusChanges.pipe(untilDestroyed(this))\r\n .subscribe(status => {\r\n this.updateProfile(status);\r\n });\r\n }\r\n\r\n private createLeftAlarmTriggerFormCategory(): void {\r\n this.leftAlarmTrigger = new FormGroup({\r\n \"LeftAlarmTrigger\": new FormControl(this.profile.AlarmProfileMap.HarshLeftTurnTriggerEnabled)\r\n });\r\n\r\n this.leftAlarmTrigger.statusChanges.pipe(untilDestroyed(this))\r\n .subscribe(status => {\r\n this.updateProfile(status);\r\n });\r\n }\r\n\r\n private createRightAlarmTriggerFormCategory(): void {\r\n this.rightAlarmTrigger = new FormGroup({\r\n \"RightAlarmTrigger\": new FormControl(this.profile.AlarmProfileMap.HarshRightTurnTriggerEnabled)\r\n });\r\n\r\n this.rightAlarmTrigger.statusChanges.pipe(untilDestroyed(this))\r\n .subscribe(status => {\r\n this.updateProfile(status);\r\n });\r\n }\r\n\r\n private createGlobalAccelerationAlarmFormCategory(): void {\r\n this.accelAlarmGlobal = new FormGroup({\r\n \"AccelAlarmGlobal\": new FormControl(this.profile.AlarmProfileMap.AlarmEnabled)\r\n });\r\n\r\n console.log(this.accelAlarmGlobal.value.AccelAlarmGlobal)\r\n\r\n this.accelAlarmGlobal.statusChanges.pipe(untilDestroyed(this))\r\n .subscribe(status => {\r\n this.updateProfile(status);\r\n });\r\n }\r\n\r\n private createTimezoneFormCategory(): void {\r\n this.timezoneForm = new FormGroup({\r\n \"Timezone\": new FormControl(this.profile.internalTimezoneInfo, {\r\n validators: [Validators.required]\r\n })\r\n });\r\n\r\n this.timezoneForm.statusChanges.pipe(untilDestroyed(this))\r\n .subscribe(status => {\r\n this.updateProfile(status);\r\n });\r\n }\r\n\r\n private createCameraCoveredFormCategory(): void {\r\n this.cameraCoveredForm = new FormGroup({\r\n \"CameraCoveredAlarm\": new FormControl(this.profile.CameraCoveredAlarm)\r\n });\r\n\r\n this.cameraCoveredForm.statusChanges.pipe(untilDestroyed(this))\r\n .subscribe(status => {\r\n this.updateProfile(status);\r\n });\r\n }\r\n\r\n private createVideoLossFormCategory(): void {\r\n console.log(this.profile.VideoLossAlarm)\r\n this.videoLossForm = new FormGroup({\r\n \"VideoLossAlarm\": new FormControl(this.profile.VideoLossAlarm)\r\n });\r\n\r\n this.videoLossForm.statusChanges.pipe(untilDestroyed(this))\r\n .subscribe(status => {\r\n this.updateProfile(status);\r\n })\r\n }\r\n\r\n private createIgnitionFormCategory(): void {\r\n console.log(this.profile.IgnitionDelay)\r\n this.ignitionDelayForm = new FormGroup({\r\n \"IgnitionDelay\": new FormControl(this.profile.IgnitionDelay)\r\n });\r\n\r\n this.ignitionDelayForm.statusChanges.pipe(untilDestroyed(this))\r\n .subscribe(status => {\r\n this.updateProfile(status);\r\n })\r\n }\r\n\r\n private createAudioFormCategory(): void {\r\n this.audioForm = new FormGroup({\r\n \"AudioEnabled\": new FormControl(this.profile.AudioEnabled)\r\n });\r\n\r\n this.audioForm.statusChanges.pipe(untilDestroyed(this))\r\n .subscribe(status => {\r\n this.updateProfile(status);\r\n })\r\n }\r\n}\r\n","module.exports = \" {{item.CompanyName}}
{{ 'FormValidationService.Required' | translate }}
{{ 'FormValidationService.AccountHasConfig' | translate }}
{{ audioForm.value.AudioEnabled ? ('Common.Enabled' | translate) : ('Common.Disabled' | translate) }} {{ audioForm.value.AudioEnabled ? ('StreamaxConfigs.AudioEnabledDesc' | translate) : ('StreamaxConfigs.AudioDisabledDesc' | translate) }} {{ videoLossForm.value.VideoLossAlarm ? ('Common.Enabled' | translate) : ('Common.Disabled' | translate) }} {{ 'StreamaxConfigs.TriggerInfoPanelDesc' | translate }} {{ cameraCoveredForm.value.CameraCoveredAlarm ? ('Common.Enabled' | translate) : ('Common.Disabled' | translate) }} {{ 'StreamaxConfigs.TriggerInfoPanelDesc' | translate }} {{ profile.internalTimezoneInfo.SupportsDaylightSavingTime ? ('StreamaxConfigs.DstEnabled' | translate) : ('StreamaxConfigs.DstDisabled' | translate) }} {{ 'StreamaxConfigs.DstPanelDesc' | translate }} {{accelAlarmGlobal.value.AccelAlarmGlobal ? ('Common.Enabled' | translate) : ('Common.Disabled' | translate) }} {{ accelAlarmTrigger.value.AccelAlarmTrigger ? ('StreamaxConfigs.HardAccTriggerEnabled' | translate) : ('StreamaxConfigs.HardAccTriggerDisabled' | translate) }} {{ brakeAlarmTrigger.value.BrakeAlarmTrigger ? ('StreamaxConfigs.HardBrakeTriggerEnabled' | translate) : ('StreamaxConfigs.HardBrakeTriggerDisabled' | translate) }} {{ leftAlarmTrigger.value.LeftAlarmTrigger ? ('StreamaxConfigs.HardLeftTriggerEnabled' | translate) : ('StreamaxConfigs.HardLeftTriggerDisabled' | translate) }} {{ rightAlarmTrigger.value.RightAlarmTrigger ? ('StreamaxConfigs.HardRightTriggerEnabled' | translate) : ('StreamaxConfigs.HardRightTriggerDisabled' | translate) }} {{ 'StreamaxConfigs.AccAlarmTriggersPanelDesc' | translate }} \";","module.exports = \" {{ 'StreamaxConfigs.CreateNewOverride' | translate }} {{ 'StreamaxConfigs.SaveProfile' | translate }} {{ 'StreamaxConfigs.ToggleActiveSet' | translate }} {{ 'StreamaxConfigs.ReRunAssessments' | translate }} \";","import { Component, Input, OnChanges, SimpleChanges } from \"@angular/core\";\r\nimport { VTableRowStatus } from \"@app/directives/_layout/v-table/_enums/VTableRowStatus.enum\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { IAggregateFilterEvent, IFilterBarTab } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { FilterBarService } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.service\";\r\nimport { VPillsComponent } from \"@app/directives/_veri/v-pills/v-pills.component\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { VehicleType } from \"@app/enum/VehicleType.enum\";\r\nimport { FtCloudConfigExceptionError, StreamaxRecordOverwrite } from \"@app/main/modules/foundation/_enums/camera-configs/CameraConfigEnums\";\r\nimport { IAccountGroupConfigDto, IChannelSpecificSettings, IPeripheralWithConfigRecord, IProfileExceptionErrors } from \"@app/main/modules/foundation/_models/_camera-configs/CameraConfigModels\";\r\nimport { ICameraDeviceParameterProfileSettings } from \"@app/services/camera/streamax-camera-profile-service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { ITimeZoneInfo } from \"@app/userPreferences/model/ITimeZoneInfo\";\r\nimport './streamax-configs-device-list.component.scss';\r\n\r\n@Component({\r\n selector: 'streamax-configs-device-list',\r\n template: require('./streamax-configs-device-list.component.html')\r\n})\r\nexport class StreamaxConfigsDeviceList implements OnChanges {\r\n @Input() profile: ICameraDeviceParameterProfileSettings;\r\n @Input() accountGroupConfigs: IAccountGroupConfigDto;\r\n @Input() loading: boolean;\r\n @Input() timezones: ITimeZoneInfo[];\r\n peripheralWithConfigRecords: IPeripheralWithConfigRecord[];\r\n filteredRecords: IPeripheralWithConfigRecord[];\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n filterTabs: IFilterBarTab[];\r\n filterEvent: IAggregateFilterEvent;\r\n\r\n selectedRow: IPeripheralWithConfigRecord;\r\n\r\n constructor(\r\n private readonly filterBarService: FilterBarService,\r\n private readonly vTableService: VTableService,\r\n private readonly translationService: TranslationService) {\r\n this.createTabs();\r\n this.createTable();\r\n }\r\n\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n\r\n if (changes['accountGroupConfigs']) {\r\n\r\n this.accountGroupConfigs?.PeripheralWithConfigRecord.forEach(r => {\r\n this.createExceptionPills(r);\r\n });\r\n\r\n this.peripheralWithConfigRecords = this.accountGroupConfigs?.PeripheralWithConfigRecord;\r\n\r\n this.filteredRecords = this.peripheralWithConfigRecords;\r\n\r\n this.tableRows = this.vTableService.createTableRows(this.peripheralWithConfigRecords, this.tableColumns);\r\n }\r\n }\r\n\r\n onFilterChanged($event: any): void {\r\n\r\n if (!$event.trigger) {\r\n return;\r\n }\r\n\r\n this.filterEvent = $event;\r\n\r\n this.filteredRecords = this.filterEvent.filteredData;\r\n }\r\n\r\n rowClicked($event: IVTableRow): void {\r\n this.selectedRow = $event.data;\r\n }\r\n\r\n closeSidebar(): void {\r\n this.selectedRow = null;\r\n }\r\n\r\n private computeCellStatus(errors: IProfileExceptionErrors, cellErrors: FtCloudConfigExceptionError[]): VTableRowStatus {\r\n if (!errors || !errors.Errors || !Array.isArray(cellErrors)) {\r\n return null;\r\n }\r\n\r\n return cellErrors.some(cellError => errors.Errors.includes(cellError))\r\n ? VTableRowStatus.Failure\r\n : VTableRowStatus.Success;\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader({ sorted: true, sortDirection: SortDirection.Descending }),\r\n createCellFunction: (camera) => this.vTableService.createDateCell(camera.LatestRecord?.CreatedTime)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"FoundationHardware.Serial\",\r\n width: 150\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.Peripherals.Serial)\r\n },\r\n {\r\n header: this.vTableService.createVehicleTableHeader(),\r\n createCellFunction: (camera) => this.vTableService.createVehicleRegCell(camera.Peripherals.vehicleMapping?.vehicle)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"Common.VehicleType\",\r\n width: 150\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createEnumCell(VehicleType, \"VehicleType\", camera.Peripherals.vehicleMapping?.vehicle?.VehicleType ?? VehicleType.Unknown)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"Common.Product\"\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.Peripherals.Product.Description)\r\n },\r\n // Profile deviations\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"Common.General\",\r\n classes: \"centre\"\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createStatusCell(this.computeCellStatus(camera.LatestRecord?.CameraDeviceParameterSettings?.ProfileExceptionErrors ?? null, [\r\n FtCloudConfigExceptionError.AudioToggle,\r\n FtCloudConfigExceptionError.IgnitionDelay,\r\n FtCloudConfigExceptionError.RecordOverwrite\r\n ]))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.AccAlarm\",\r\n classes: \"centre\"\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createStatusCell(this.computeCellStatus(camera.LatestRecord?.CameraDeviceParameterSettings?.ProfileExceptionErrors ?? null, [\r\n FtCloudConfigExceptionError.AcceleratorAlarmToggle,\r\n FtCloudConfigExceptionError.HardAccelerationTrigger,\r\n FtCloudConfigExceptionError.HardAccelerationTriggerMetrics,\r\n FtCloudConfigExceptionError.HarshBrakingTrigger,\r\n FtCloudConfigExceptionError.HarshBrakingTriggerMetrics,\r\n FtCloudConfigExceptionError.HarshLeftTurnTrigger,\r\n FtCloudConfigExceptionError.HarshLeftTurnTriggerMetrics,\r\n FtCloudConfigExceptionError.HarshRightTurnTrigger,\r\n FtCloudConfigExceptionError.HarshRightTurnTriggerMetrics,\r\n FtCloudConfigExceptionError.GyroMetrics\r\n ]))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.StatusAlarms\",\r\n classes: \"centre\"\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createStatusCell(this.computeCellStatus(camera.LatestRecord?.CameraDeviceParameterSettings?.ProfileExceptionErrors ?? null, [\r\n FtCloudConfigExceptionError.VideoLossAlarmToggle,\r\n FtCloudConfigExceptionError.VideoLossAlarmTrigger,\r\n FtCloudConfigExceptionError.CameraCoveredAlarmToggle,\r\n FtCloudConfigExceptionError.CameraCoveredAlarmTrigger\r\n ]))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"UserPreferences.timezone\",\r\n classes: \"centre\"\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createStatusCell(this.computeCellStatus(camera.LatestRecord?.CameraDeviceParameterSettings?.ProfileExceptionErrors ?? null, [\r\n FtCloudConfigExceptionError.Timezone,\r\n FtCloudConfigExceptionError.DaylightSavingsToggle,\r\n FtCloudConfigExceptionError.DaylightSavingsOffset\r\n ]))\r\n },\r\n // Config Values\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.AudioVal\",\r\n exportOnly: true\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.LatestRecord?.CameraDeviceParameterSettings?.ChannelSpecificSettings.some(s => s.AudioEnabled == true && s.CameraConnected) ? \"true\" : \"false\")\r\n },\r\n\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.IgnDelayVal\",\r\n exportOnly: true\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.LatestRecord?.CameraDeviceParameterSettings?.IgnitionDelaySeconds)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.OverWriteVal\",\r\n exportOnly: true\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createEnumCell(StreamaxRecordOverwrite, \"StreamaxRecordOverwrite\", camera.LatestRecord?.CameraDeviceParameterSettings?.RecordOverwrite)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.Acc1AlarmVal\",\r\n exportOnly: true\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.LatestRecord?.CameraDeviceParameterSettings?.Acc1AlarmSettings?.AlarmEnabled == null ? \"N/A\" : camera.LatestRecord.CameraDeviceParameterSettings.Acc1AlarmSettings?.AlarmEnabled ? \"Enabled\" : \"Disabled\")\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.Acc2AlarmVal\",\r\n exportOnly: true\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.LatestRecord?.CameraDeviceParameterSettings?.Accel2AlarmSettings?.AlarmEnabled == null ? \"N/A\" : camera.LatestRecord.CameraDeviceParameterSettings.Accel2AlarmSettings?.AlarmEnabled ? \"Enabled\" : \"Disabled\")\r\n },\r\n\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.HardBrakeTriggerVal\",\r\n exportOnly: true\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.LatestRecord?.CameraDeviceParameterSettings?.Accel2AlarmSettings?.HarshBrakingTriggerSettings?.TriggerEnabled)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.HardBrakeOffset\",\r\n exportOnly: true\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.LatestRecord?.CameraDeviceParameterSettings?.Accel2AlarmSettings?.HarshBrakingTriggerSettings?.Offset)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.HardBrakeSpeedStart\",\r\n exportOnly: true\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.LatestRecord?.CameraDeviceParameterSettings?.Accel2AlarmSettings?.HarshBrakingTriggerSettings?.StartSpeed)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.HardBrakeSpeedEnd\",\r\n exportOnly: true\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.LatestRecord?.CameraDeviceParameterSettings?.Accel2AlarmSettings?.HarshBrakingTriggerSettings?.EndSpeed)\r\n },\r\n //{\r\n // header: this.vTableService.createTableHeader({\r\n // title: \"HarshBraking ReApply seconds\",\r\n // exportOnly: true\r\n // }),\r\n // createCellFunction: (camera) => this.vTableService.createTableCell(camera.LatestRecord.CameraDeviceParameterSettings.Accel2AlarmSettings?.HarshBrakingTriggerSettings?.ReAlertTimeOffset)\r\n //},\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.HardAccTriggerVal\",\r\n exportOnly: true\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.LatestRecord?.CameraDeviceParameterSettings?.Accel2AlarmSettings?.HardAccelerationTriggerSettings?.TriggerEnabled)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.HardAccOffset\",\r\n exportOnly: true\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.LatestRecord?.CameraDeviceParameterSettings?.Accel2AlarmSettings?.HardAccelerationTriggerSettings?.Offset)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.HardAccSpeedStart\",\r\n exportOnly: true\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.LatestRecord?.CameraDeviceParameterSettings?.Accel2AlarmSettings?.HardAccelerationTriggerSettings?.StartSpeed)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.HardAccSpeedEnd\",\r\n exportOnly: true\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.LatestRecord?.CameraDeviceParameterSettings?.Accel2AlarmSettings?.HardAccelerationTriggerSettings?.EndSpeed)\r\n },\r\n //{\r\n // header: this.vTableService.createTableHeader({\r\n // title: \"HarshAcceleration ReApply seconds\",\r\n // exportOnly: true\r\n // }),\r\n // createCellFunction: (camera) => this.vTableService.createTableCell(camera.LatestRecord?.CameraDeviceParameterSettings?.Accel2AlarmSettings?.HardAccelerationTriggerSettings?.ReAlertTimeOffset)\r\n //},\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.HardLeftTriggerVal\",\r\n exportOnly: true\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.LatestRecord?.CameraDeviceParameterSettings?.Accel2AlarmSettings?.HarshLeftTurnTriggerSettings?.TriggerEnabled)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.HardLeftOffset\",\r\n exportOnly: true\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.LatestRecord?.CameraDeviceParameterSettings?.Accel2AlarmSettings?.HarshLeftTurnTriggerSettings?.Offset)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.HardLeftSpeedStart\",\r\n exportOnly: true\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.LatestRecord?.CameraDeviceParameterSettings?.Accel2AlarmSettings?.HarshLeftTurnTriggerSettings?.StartSpeed)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.HardLeftSpeedEnd\",\r\n exportOnly: true\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.LatestRecord?.CameraDeviceParameterSettings?.Accel2AlarmSettings?.HarshLeftTurnTriggerSettings?.EndSpeed)\r\n },\r\n //{\r\n // header: this.vTableService.createTableHeader({\r\n // title: \"HarshLeft ReApply seconds\",\r\n // exportOnly: true\r\n // }),\r\n // createCellFunction: (camera) => this.vTableService.createTableCell(camera.LatestRecord?.CameraDeviceParameterSettings?.Accel2AlarmSettings?.HarshLeftTurnTriggerSettings?.ReAlertTimeOffset)\r\n //},\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.HardRightTriggerVal\",\r\n exportOnly: true\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.LatestRecord?.CameraDeviceParameterSettings?.Accel2AlarmSettings?.HarshRightTurnTriggerSettings?.TriggerEnabled)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.HardRightOffset\",\r\n exportOnly: true\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.LatestRecord?.CameraDeviceParameterSettings?.Accel2AlarmSettings?.HarshRightTurnTriggerSettings?.Offset)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.HardRightSpeedStart\",\r\n exportOnly: true\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.LatestRecord?.CameraDeviceParameterSettings?.Accel2AlarmSettings?.HarshRightTurnTriggerSettings?.StartSpeed)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.HardRightSpeedEnd\",\r\n exportOnly: true\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.LatestRecord?.CameraDeviceParameterSettings?.Accel2AlarmSettings?.HarshRightTurnTriggerSettings?.EndSpeed)\r\n },\r\n //{\r\n // header: this.vTableService.createTableHeader({\r\n // title: \"HarshRight ReApply seconds\",\r\n // exportOnly: true\r\n // }),\r\n // createCellFunction: (camera) => this.vTableService.createTableCell(camera.LatestRecord?.CameraDeviceParameterSettings?.Accel2AlarmSettings?.HarshRightTurnTriggerSettings?.ReAlertTimeOffset)\r\n //},\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.CamCoveredAlarm\",\r\n exportOnly: true\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.LatestRecord?.CameraDeviceParameterSettings?.CameraCoveredAlarmSettings?.AlarmEnabled ? \"Enabled\" : \"Disabled\")\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.CamCoveredAlarmTriggers\",\r\n exportOnly: true\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(this.getChannelTriggers(camera.LatestRecord?.CameraDeviceParameterSettings?.CameraCoveredAlarmSettings?.ChannelTriggersEnabled))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.VideoLossAlarm\",\r\n exportOnly: true\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.LatestRecord?.CameraDeviceParameterSettings?.VideoLossAlarmSettings?.AlarmEnabled)\r\n },\r\n\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.VideoLossAlarmTriggers\",\r\n exportOnly: true\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(this.getChannelTriggers(camera.LatestRecord?.CameraDeviceParameterSettings?.VideoLossAlarmSettings?.ChannelTriggersEnabled))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.ConnectedChannels\",\r\n exportOnly: true\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(this.getConnectedChannelPositions(camera.LatestRecord?.CameraDeviceParameterSettings?.ChannelSpecificSettings ?? []))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.TimezoneVal\",\r\n exportOnly: true\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.LatestRecord?.CameraDeviceParameterSettings?.LocalTimeSettings?.TimezoneId)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"StreamaxConfigs.DstVal\",\r\n exportOnly: true\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.LatestRecord?.CameraDeviceParameterSettings?.LocalTimeSettings?.DSTEnabled)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"Common.Errors\",\r\n minWidth: 500\r\n }),\r\n createCellFunction: camera => this.vTableService.createTableCell(camera, {\r\n component: VPillsComponent,\r\n componentInputs: {\r\n pills: camera.ExceptionPills\r\n }\r\n })\r\n }\r\n ]\r\n }\r\n\r\n private createExceptionPills(record: IPeripheralWithConfigRecord): void {\r\n\r\n record.ExceptionPills = [];\r\n\r\n if (!record.LatestRecord?.CameraDeviceParameterSettings) {\r\n record.ExceptionPills.push({ label: FtCloudConfigExceptionError[FtCloudConfigExceptionError.Uncollected], data: FtCloudConfigExceptionError.Uncollected, hovering: false });\r\n\r\n return;\r\n }\r\n\r\n const errors = record.LatestRecord.CameraDeviceParameterSettings.ProfileExceptionErrors.Errors;\r\n\r\n let tooltip = \"\";\r\n let extraCount = 0;\r\n\r\n for (var i = 0; i < errors.length; i++) {\r\n const labelAndTooltip = this.translationService.tEnum(FtCloudConfigExceptionError, \"FtCloudConfigExceptionError\", errors[i]);\r\n\r\n if (i < 2) {\r\n record.ExceptionPills.push({\r\n label: labelAndTooltip,\r\n hovering: false,\r\n data: errors[i]\r\n });\r\n }\r\n else {\r\n extraCount++\r\n tooltip += `${labelAndTooltip} `\r\n }\r\n }\r\n\r\n if (extraCount > 0) {\r\n record.ExceptionPills.push({\r\n label: `+${extraCount}`,\r\n hovering: true,\r\n tooltip: tooltip\r\n })\r\n }\r\n }\r\n\r\n private getConnectedChannelPositions(settings: IChannelSpecificSettings[]): number[] {\r\n if (!settings.length) {\r\n return;\r\n }\r\n\r\n return settings\r\n .filter(setting => setting.CameraConnected)\r\n .map(setting => setting.ChannelPosition);\r\n }\r\n\r\n private getChannelTriggers(value: number): string {\r\n if (!value) {\r\n return \"None\";\r\n }\r\n\r\n const positions: number[] = [];\r\n let position = 1;\r\n\r\n while (value > 0) {\r\n if (value & 1) {\r\n positions.push(position); // Add the position if the bit is set\r\n }\r\n value >>= 1;\r\n position++;\r\n }\r\n\r\n return positions.length > 0 ? positions.toString() : \"None\";\r\n }\r\n\r\n private createTabs(): void {\r\n this.filterTabs = [];\r\n\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"StreamaxConfigs.InDate\", this.isActivePredicate));\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"StreamaxConfigs.Expired\", this.IsExpiredPredicate));\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"StreamaxConfigs.Uncollected\", this.isUncollectedPredicate));\r\n }\r\n\r\n private IsExpiredPredicate = (record: IPeripheralWithConfigRecord) => {\r\n if (!record.LatestRecord) {\r\n return false;\r\n }\r\n\r\n const twoWeeksAgo = new Date();\r\n twoWeeksAgo.setDate(twoWeeksAgo.getDate() - 14);\r\n\r\n return new Date(record.LatestRecord.CreatedTime).getTime() < twoWeeksAgo.getTime();\r\n }\r\n\r\n private isActivePredicate = (record: IPeripheralWithConfigRecord) => {\r\n if (!record.LatestRecord) {\r\n return false;\r\n }\r\n\r\n const twoWeeksAgo = new Date();\r\n twoWeeksAgo.setDate(twoWeeksAgo.getDate() - 14);\r\n\r\n const now = new Date();\r\n const recordTime = new Date(record.LatestRecord.CreatedTime).getTime();\r\n\r\n return recordTime >= twoWeeksAgo.getTime() && recordTime <= now.getTime();\r\n }\r\n\r\n private isUncollectedPredicate = (record: IPeripheralWithConfigRecord) => {\r\n return record.LatestRecord == null;\r\n }\r\n}\r\n","module.exports = \" \";","import { Component, Input, OnInit } from \"@angular/core\";\r\nimport { VehicleType } from \"@app/enum/VehicleType.enum\";\r\nimport { ICameraChannel } from \"@app/main/components/videos/models/ICameraChannel\";\r\nimport { CameraChannelService } from \"@app/main/modules/cameras/_services/camera-channels.service\";\r\nimport { ChannelFlag, DSTOffsetDay, DSTOffsetMonth, DSTOffsetWeek, StreamaxRecordOverwrite } from \"@app/main/modules/foundation/_enums/camera-configs/CameraConfigEnums\";\r\nimport { ICameraDeviceParameterRecord, RecordToProfileComparison } from \"@app/main/modules/foundation/_models/_camera-configs/CameraConfigModels\";\r\nimport { ICameraDeviceParameterProfileSettings, ITriggerMetricsMap, StreamaxCameraProfileService } from \"@app/services/camera/streamax-camera-profile-service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { ITimeZoneInfo } from \"@app/userPreferences/model/ITimeZoneInfo\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { combineLatest } from \"rxjs\";\r\nimport './streamax-configs-vehicle-summary.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'streamax-configs-vehicle-summary',\r\n template: require('./streamax-configs-vehicle-summary.component.html')\r\n})\r\nexport class DeviceProfileVehicleSummaryComponent implements OnInit {\r\n\r\n @Input() deviceRecord: ICameraDeviceParameterRecord;\r\n @Input() deviceProfile: ICameraDeviceParameterProfileSettings;\r\n @Input() vehicleType: VehicleType;\r\n @Input() timezones: ITimeZoneInfo[];\r\n\r\n cameraChannels: ICameraChannel[];\r\n\r\n recordToProfileGeneralComparisons: RecordToProfileComparison[] = [];\r\n recordToProfileTimezoneComparisons: RecordToProfileComparison[] = [];\r\n recordToProfileAccAlarmComparisons: RecordToProfileComparison[] = [];\r\n recordToProfileStatusAlarmComparisons: RecordToProfileComparison[] = [];\r\n\r\n acceleratorAlarmType: string;\r\n\r\n accTriggerDefaults: ITriggerMetricsMap;\r\n\r\n constructor(\r\n private readonly profileService: StreamaxCameraProfileService,\r\n private readonly translationService: TranslationService,\r\n private readonly cameraChannelService: CameraChannelService) { }\r\n\r\n ngOnInit(): void {\r\n this.setupComponent();\r\n }\r\n\r\n private setupComponent(): void {\r\n\r\n combineLatest([\r\n this.profileService.getTriggerDefaults(this.vehicleType),\r\n this.cameraChannelService.getCameraChannels({ VehicleId: this.deviceRecord.VehicleId })\r\n ]).pipe(untilDestroyed(this)).subscribe(([defaultTriggers, channels]) => {\r\n this.accTriggerDefaults = defaultTriggers;\r\n this.cameraChannels = channels;\r\n\r\n this.setupGeneralComparisons();\r\n this.setupTimeComparisons();\r\n this.setupAccAlarmComparisons();\r\n this.setupStatusAlarmComparisons();\r\n }); \r\n }\r\n\r\n private setupStatusAlarmComparisons(): void {\r\n this.recordToProfileStatusAlarmComparisons.push({\r\n deviceMetric: this.deviceRecord.CameraDeviceParameterSettings.CameraCoveredAlarmSettings.AlarmEnabled,\r\n profileMetric: this.deviceProfile.CameraCoveredAlarm,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.CamCoveredMetricString\"),\r\n InputType: \"check\"\r\n });\r\n\r\n if (this.deviceProfile.CameraCoveredAlarm || this.deviceRecord.CameraDeviceParameterSettings.CameraCoveredAlarmSettings.AlarmEnabled) {\r\n\r\n this.deviceRecord.CameraDeviceParameterSettings.ChannelSpecificSettings.forEach(s => {\r\n\r\n const errorString = (this.deviceProfile.CameraCoveredAlarm && !s.CameraConnected && this.cameraChannels.find(c => c.ChannelId === s.ChannelPosition).IsActive) ? this.translationService.t(\"StreamaxConfigs.CameraOnlyActiveInVeri\") : null;\r\n\r\n this.recordToProfileStatusAlarmComparisons.push({\r\n deviceMetric: this.isChannelTriggered(this.deviceRecord.CameraDeviceParameterSettings.CameraCoveredAlarmSettings.ChannelTriggersEnabled, s.ChannelPosition),\r\n profileMetric: this.deviceProfile.CameraCoveredAlarm && (s.CameraConnected || this.cameraChannels.find(c => c.ChannelId === s.ChannelPosition).IsActive),\r\n MetricString: this.translationService.t(\"StreamaxConfigs.CamCoveredTriggerMetricString\", s.ChannelPosition),\r\n InputType: \"check\",\r\n ErrorStringOverride: errorString\r\n })\r\n });\r\n }\r\n\r\n this.recordToProfileStatusAlarmComparisons.push({\r\n deviceMetric: this.deviceRecord.CameraDeviceParameterSettings.VideoLossAlarmSettings.AlarmEnabled,\r\n profileMetric: this.deviceProfile.VideoLossAlarm,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.VideoLossMetricString\"),\r\n InputType: \"check\"\r\n });\r\n\r\n if (this.deviceProfile.VideoLossAlarm || this.deviceRecord.CameraDeviceParameterSettings.VideoLossAlarmSettings.AlarmEnabled) {\r\n\r\n this.deviceRecord.CameraDeviceParameterSettings.ChannelSpecificSettings.forEach(s => {\r\n\r\n const errorString = (this.deviceProfile.VideoLossAlarm && !s.CameraConnected && this.cameraChannels.find(c => c.ChannelId === s.ChannelPosition).IsActive) ? this.translationService.t(\"StreamaxConfigs.CameraOnlyActiveInVeri\") : null;\r\n\r\n this.recordToProfileStatusAlarmComparisons.push({\r\n deviceMetric: this.isChannelTriggered(this.deviceRecord.CameraDeviceParameterSettings.VideoLossAlarmSettings.ChannelTriggersEnabled, s.ChannelPosition),\r\n profileMetric: this.deviceProfile.VideoLossAlarm && (s.CameraConnected || this.cameraChannels.find(c => c.ChannelId === s.ChannelPosition).IsActive),\r\n MetricString: this.translationService.t(\"StreamaxConfigs.VideoLossTriggerMetricString\", s.ChannelPosition),\r\n InputType: \"check\",\r\n ErrorStringOverride: errorString\r\n })\r\n });\r\n }\r\n }\r\n\r\n private isChannelTriggered(enabledFlags: ChannelFlag, channelPosition: number): boolean {\r\n // Create a bitmask for the specific channel position - 1 to match indexing\r\n const bitmask = 1 << (channelPosition - 1);\r\n \r\n return (enabledFlags & bitmask) === bitmask;\r\n }\r\n\r\n private setupAccAlarmComparisons(): void {\r\n\r\n if (!!this.deviceRecord.CameraDeviceParameterSettings.Acc1AlarmSettings) {\r\n this.acceleratorAlarmType = \"Acc1\"\r\n\r\n this.recordToProfileAccAlarmComparisons.push({\r\n deviceMetric: this.deviceRecord.CameraDeviceParameterSettings.Acc1AlarmSettings.AlarmEnabled,\r\n profileMetric: this.deviceProfile.AlarmProfileMap.AlarmEnabled,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.AccAlarmGlobalSwitchMetricString\"),\r\n InputType: \"check\"\r\n });\r\n\r\n if (this.deviceProfile.AlarmProfileMap.AlarmEnabled || this.deviceRecord.CameraDeviceParameterSettings.Acc1AlarmSettings.AlarmEnabled) {\r\n\r\n const customTriggers = this.deviceProfile.AlarmProfileMap.TriggerMetricOverrides.find(o => o.VehicleType === this.vehicleType);\r\n\r\n const comparisonTriggers = customTriggers == undefined ? this.accTriggerDefaults : customTriggers.TriggerMetricsMap;\r\n\r\n this.recordToProfileAccAlarmComparisons.push({\r\n deviceMetric: this.deviceRecord.CameraDeviceParameterSettings.Acc1AlarmSettings.XTrigger,\r\n profileMetric: comparisonTriggers.GyroTriggers.XTrigger,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.AccAlarmXTriggerMetricString\"),\r\n InputType: \"number\"\r\n });\r\n\r\n this.recordToProfileAccAlarmComparisons.push({\r\n deviceMetric: this.deviceRecord.CameraDeviceParameterSettings.Acc1AlarmSettings.YTrigger,\r\n profileMetric: comparisonTriggers.GyroTriggers.YTrigger,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.AccAlarmYTriggerMetricString\"),\r\n InputType: \"number\"\r\n });\r\n\r\n this.recordToProfileAccAlarmComparisons.push({\r\n deviceMetric: this.deviceRecord.CameraDeviceParameterSettings.Acc1AlarmSettings.ZTrigger,\r\n profileMetric: comparisonTriggers.GyroTriggers.ZTrigger,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.AccAlarmZTriggerMetricString\"),\r\n InputType: \"number\"\r\n });\r\n }\r\n }\r\n\r\n if (!!this.deviceRecord.CameraDeviceParameterSettings.Accel2AlarmSettings) {\r\n this.acceleratorAlarmType = \"Accel2\"\r\n\r\n this.recordToProfileAccAlarmComparisons.push({\r\n deviceMetric: this.deviceRecord.CameraDeviceParameterSettings.Accel2AlarmSettings.AlarmEnabled,\r\n profileMetric: this.deviceProfile.AlarmProfileMap.AlarmEnabled,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.AccAlarmGlobalSwitchMetricString\"),\r\n InputType: \"check\"\r\n });\r\n\r\n if (this.deviceProfile.AlarmProfileMap.AlarmEnabled || this.deviceRecord.CameraDeviceParameterSettings.Accel2AlarmSettings.AlarmEnabled) {\r\n\r\n const customTriggers = this.deviceProfile.AlarmProfileMap.TriggerMetricOverrides.find(o => o.VehicleType === this.vehicleType);\r\n\r\n const comparisonTriggers = customTriggers == undefined ? this.accTriggerDefaults : customTriggers.TriggerMetricsMap;\r\n\r\n this.recordToProfileAccAlarmComparisons.push({\r\n deviceMetric: this.deviceRecord.CameraDeviceParameterSettings.Accel2AlarmSettings.HardAccelerationTriggerSettings.TriggerEnabled,\r\n profileMetric: this.deviceProfile.AlarmProfileMap.HardAccelerationTriggerEnabled,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.HardAccTriggerVal\"),\r\n InputType: \"check\"\r\n });\r\n\r\n this.recordToProfileAccAlarmComparisons.push({\r\n deviceMetric: this.deviceRecord.CameraDeviceParameterSettings.Accel2AlarmSettings.HardAccelerationTriggerSettings.StartSpeed,\r\n profileMetric: comparisonTriggers.HarshAccelerationTriggerMetrics.StartSpeed,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.HardAccSpeedStart\"),\r\n InputType: \"number\"\r\n });\r\n\r\n this.recordToProfileAccAlarmComparisons.push({\r\n deviceMetric: this.deviceRecord.CameraDeviceParameterSettings.Accel2AlarmSettings.HardAccelerationTriggerSettings.EndSpeed,\r\n profileMetric: comparisonTriggers.HarshAccelerationTriggerMetrics.EndSpeed,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.HardAccSpeedEnd\"),\r\n InputType: \"number\"\r\n });\r\n\r\n this.recordToProfileAccAlarmComparisons.push({\r\n deviceMetric: this.deviceRecord.CameraDeviceParameterSettings.Accel2AlarmSettings.HardAccelerationTriggerSettings.Offset / 1000,\r\n profileMetric: comparisonTriggers.HarshAccelerationTriggerMetrics.Offset,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.HardAccOffset\"),\r\n InputType: \"number\"\r\n });\r\n \r\n this.recordToProfileAccAlarmComparisons.push({\r\n deviceMetric: this.deviceRecord.CameraDeviceParameterSettings.Accel2AlarmSettings.HarshBrakingTriggerSettings.TriggerEnabled,\r\n profileMetric: this.deviceProfile.AlarmProfileMap.HarshBrakingTriggerEnabled,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.HardBrakeTriggerVal\"),\r\n InputType: \"check\"\r\n });\r\n\r\n this.recordToProfileAccAlarmComparisons.push({\r\n deviceMetric: this.deviceRecord.CameraDeviceParameterSettings.Accel2AlarmSettings.HarshBrakingTriggerSettings.StartSpeed,\r\n profileMetric: comparisonTriggers.HarshBrakingTriggerMetrics.StartSpeed,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.HardBrakeSpeedStart\"),\r\n InputType: \"number\"\r\n });\r\n\r\n this.recordToProfileAccAlarmComparisons.push({\r\n deviceMetric: this.deviceRecord.CameraDeviceParameterSettings.Accel2AlarmSettings.HarshBrakingTriggerSettings.EndSpeed,\r\n profileMetric: comparisonTriggers.HarshBrakingTriggerMetrics.EndSpeed,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.HardBrakeSpeedEnd\"),\r\n InputType: \"number\"\r\n });\r\n\r\n this.recordToProfileAccAlarmComparisons.push({\r\n deviceMetric: this.deviceRecord.CameraDeviceParameterSettings.Accel2AlarmSettings.HarshBrakingTriggerSettings.Offset / 1000,\r\n profileMetric: comparisonTriggers.HarshBrakingTriggerMetrics.Offset,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.HardBrakeOffset\"),\r\n InputType: \"number\"\r\n });\r\n\r\n this.recordToProfileAccAlarmComparisons.push({\r\n deviceMetric: this.deviceRecord.CameraDeviceParameterSettings.Accel2AlarmSettings.HarshLeftTurnTriggerSettings.TriggerEnabled,\r\n profileMetric: this.deviceProfile.AlarmProfileMap.HarshLeftTurnTriggerEnabled,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.HardLeftTriggerVal\"),\r\n InputType: \"check\"\r\n });\r\n\r\n this.recordToProfileAccAlarmComparisons.push({\r\n deviceMetric: this.deviceRecord.CameraDeviceParameterSettings.Accel2AlarmSettings.HarshLeftTurnTriggerSettings.StartSpeed,\r\n profileMetric: comparisonTriggers.LeftTurnTriggerMappings.StartSpeed,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.HardLeftSpeedStart\"),\r\n InputType: \"number\"\r\n });\r\n\r\n this.recordToProfileAccAlarmComparisons.push({\r\n deviceMetric: this.deviceRecord.CameraDeviceParameterSettings.Accel2AlarmSettings.HarshLeftTurnTriggerSettings.EndSpeed,\r\n profileMetric: comparisonTriggers.LeftTurnTriggerMappings.EndSpeed,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.HardLeftSpeedEnd\"),\r\n InputType: \"number\"\r\n });\r\n\r\n this.recordToProfileAccAlarmComparisons.push({\r\n deviceMetric: this.deviceRecord.CameraDeviceParameterSettings.Accel2AlarmSettings.HarshLeftTurnTriggerSettings.Offset / 1000,\r\n profileMetric: comparisonTriggers.LeftTurnTriggerMappings.Offset,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.HardLeftOffset\"),\r\n InputType: \"number\"\r\n });\r\n \r\n this.recordToProfileAccAlarmComparisons.push({\r\n deviceMetric: this.deviceRecord.CameraDeviceParameterSettings.Accel2AlarmSettings.HarshRightTurnTriggerSettings.TriggerEnabled,\r\n profileMetric: this.deviceProfile.AlarmProfileMap.HarshRightTurnTriggerEnabled,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.HardRightTriggerVal\"),\r\n InputType: \"check\"\r\n });\r\n\r\n this.recordToProfileAccAlarmComparisons.push({\r\n deviceMetric: this.deviceRecord.CameraDeviceParameterSettings.Accel2AlarmSettings.HarshRightTurnTriggerSettings.StartSpeed,\r\n profileMetric: comparisonTriggers.RightTurnTriggerMappings.StartSpeed,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.HardRightSpeedStart\"),\r\n InputType: \"number\"\r\n });\r\n\r\n this.recordToProfileAccAlarmComparisons.push({\r\n deviceMetric: this.deviceRecord.CameraDeviceParameterSettings.Accel2AlarmSettings.HarshRightTurnTriggerSettings.EndSpeed,\r\n profileMetric: comparisonTriggers.RightTurnTriggerMappings.EndSpeed,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.HardRightSpeedEnd\"),\r\n InputType: \"number\"\r\n });\r\n\r\n this.recordToProfileAccAlarmComparisons.push({\r\n deviceMetric: this.deviceRecord.CameraDeviceParameterSettings.Accel2AlarmSettings.HarshRightTurnTriggerSettings.Offset / 1000,\r\n profileMetric: comparisonTriggers.RightTurnTriggerMappings.Offset,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.HardRightOffset\"),\r\n InputType: \"number\"\r\n });\r\n }\r\n }\r\n }\r\n\r\n private setupGeneralComparisons(): void {\r\n this.deviceRecord.CameraDeviceParameterSettings.ChannelSpecificSettings.forEach(s => {\r\n\r\n const errorString = (!s.CameraConnected && s.AudioEnabled != this.deviceProfile.AudioEnabled) ? this.translationService.t(\"StreamaxConfigs.AudioEnabledNoFeed\") : null;\r\n\r\n this.recordToProfileGeneralComparisons.push({\r\n deviceMetric: s.AudioEnabled,\r\n profileMetric: this.deviceProfile.AudioEnabled,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.ChannelNAudio\", s.ChannelPosition),\r\n InputType: \"check\",\r\n ErrorStringOverride: errorString\r\n })\r\n });\r\n\r\n this.recordToProfileGeneralComparisons.push({\r\n deviceMetric: this.deviceRecord.CameraDeviceParameterSettings.IgnitionDelaySeconds,\r\n profileMetric: this.deviceProfile.IgnitionDelay,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.IgnitionDelay\"),\r\n InputType: \"number\"\r\n });\r\n\r\n this.recordToProfileGeneralComparisons.push({\r\n deviceMetric: StreamaxRecordOverwrite[this.deviceRecord.CameraDeviceParameterSettings.RecordOverwrite],\r\n profileMetric: StreamaxRecordOverwrite[this.deviceProfile.RecordOverwrite],\r\n MetricString: this.translationService.t(\"StreamaxConfigs.RecordOverwrite\"),\r\n InputType: \"string\"\r\n });\r\n }\r\n\r\n private setupTimeComparisons(): void {\r\n\r\n combineLatest([\r\n this.profileService.convertStreamaxTimezoneId(this.deviceRecord.CameraDeviceParameterSettings.LocalTimeSettings.TimezoneId),\r\n this.profileService.convertStreamaxTimezoneId(this.deviceProfile.TimeSettings.TimezoneId)\r\n ]).pipe(untilDestroyed(this)).subscribe({\r\n next: ([deviceTimezoneInfoId, profileTimezoneInfoId]) => {\r\n this.recordToProfileTimezoneComparisons.push({\r\n deviceMetric: this.timezones.find(t => t.Id === deviceTimezoneInfoId.timezoneId).DisplayName,\r\n profileMetric: this.timezones.find(t => t.Id === profileTimezoneInfoId.timezoneId).DisplayName,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.TimezoneId\"),\r\n InputType: \"string\"\r\n });\r\n\r\n this.recordToProfileTimezoneComparisons.push({\r\n deviceMetric: this.deviceRecord.CameraDeviceParameterSettings.LocalTimeSettings.DSTEnabled,\r\n profileMetric: this.deviceProfile.TimeSettings.DSTEnabled,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.DstEnabled\"),\r\n InputType: \"check\"\r\n });\r\n\r\n this.recordToProfileTimezoneComparisons.push({\r\n deviceMetric: this.translationService.tEnum(DSTOffsetMonth, \"DSTOffsetMonth\", this.deviceRecord.CameraDeviceParameterSettings.LocalTimeSettings.OffSetStartMonth),\r\n profileMetric: this.translationService.tEnum(DSTOffsetMonth, \"DSTOffsetMonth\", this.deviceProfile.TimeSettings.OffSetStartMonth),\r\n MetricString: this.translationService.t(\"StreamaxConfigs.TimeOffsetStartMonth\"),\r\n InputType: \"string\"\r\n });\r\n\r\n this.recordToProfileTimezoneComparisons.push({\r\n deviceMetric: this.translationService.tEnum(DSTOffsetWeek, \"DSTOffsetWeek\", this.deviceRecord.CameraDeviceParameterSettings.LocalTimeSettings.OffSetStartWeek),\r\n profileMetric: this.translationService.tEnum(DSTOffsetWeek, \"DSTOffsetWeek\", this.deviceProfile.TimeSettings.OffSetStartWeek),\r\n MetricString: this.translationService.t(\"StreamaxConfigs.TimeOffsetStartWeek\"),\r\n InputType: \"string\"\r\n });\r\n\r\n this.recordToProfileTimezoneComparisons.push({\r\n deviceMetric: this.translationService.tEnum(DSTOffsetDay, \"DSTOffsetDay\", this.deviceRecord.CameraDeviceParameterSettings.LocalTimeSettings.OffSetStartDay),\r\n profileMetric: this.translationService.tEnum(DSTOffsetDay, \"DSTOffsetDay\", this.deviceProfile.TimeSettings.OffSetStartDay),\r\n MetricString: this.translationService.t(\"StreamaxConfigs.TimeOffsetStartDay\"),\r\n InputType: \"string\"\r\n });\r\n\r\n this.recordToProfileTimezoneComparisons.push({\r\n deviceMetric: this.deviceRecord.CameraDeviceParameterSettings.LocalTimeSettings.OffSetStartHour,\r\n profileMetric: this.deviceProfile.TimeSettings.OffSetStartHour,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.TimeOffsetStartHour\"),\r\n InputType: \"number\"\r\n });\r\n\r\n this.recordToProfileTimezoneComparisons.push({\r\n deviceMetric: this.deviceRecord.CameraDeviceParameterSettings.LocalTimeSettings.OffSetStartMinute,\r\n profileMetric: this.deviceProfile.TimeSettings.OffSetStartMinute,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.TimeOffsetStartMinute\"),\r\n InputType: \"number\"\r\n });\r\n\r\n this.recordToProfileTimezoneComparisons.push({\r\n deviceMetric: this.translationService.tEnum(DSTOffsetMonth, \"DSTOffsetMonth\", this.deviceRecord.CameraDeviceParameterSettings.LocalTimeSettings.OffSetEndMonth),\r\n profileMetric: this.translationService.tEnum(DSTOffsetMonth, \"DSTOffsetMonth\", this.deviceProfile.TimeSettings.OffSetEndMonth),\r\n MetricString: this.translationService.t(\"StreamaxConfigs.TimeOffsetEndMonth\"),\r\n InputType: \"string\"\r\n });\r\n\r\n this.recordToProfileTimezoneComparisons.push({\r\n deviceMetric: this.translationService.tEnum(DSTOffsetWeek, \"DSTOffsetWeek\", this.deviceRecord.CameraDeviceParameterSettings.LocalTimeSettings.OffSetEndWeek),\r\n profileMetric: this.translationService.tEnum(DSTOffsetWeek, \"DSTOffsetWeek\", this.deviceProfile.TimeSettings.OffSetEndWeek),\r\n MetricString: this.translationService.t(\"StreamaxConfigs.TimeOffsetEndWeek\"),\r\n InputType: \"string\"\r\n });\r\n\r\n this.recordToProfileTimezoneComparisons.push({\r\n deviceMetric: this.translationService.tEnum(DSTOffsetDay, \"DSTOffsetDay\", this.deviceRecord.CameraDeviceParameterSettings.LocalTimeSettings.OffSetEndDay),\r\n profileMetric: this.translationService.tEnum(DSTOffsetDay, \"DSTOffsetDay\", this.deviceProfile.TimeSettings.OffSetEndDay),\r\n MetricString: this.translationService.t(\"StreamaxConfigs.TimeOffsetEndDay\"),\r\n InputType: \"string\"\r\n });\r\n \r\n this.recordToProfileTimezoneComparisons.push({\r\n deviceMetric: this.deviceRecord.CameraDeviceParameterSettings.LocalTimeSettings.OffSetEndHour,\r\n profileMetric: this.deviceProfile.TimeSettings.OffSetEndHour,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.TimeOffsetEndHour\"),\r\n InputType: \"number\"\r\n });\r\n \r\n this.recordToProfileTimezoneComparisons.push({\r\n deviceMetric: this.deviceRecord.CameraDeviceParameterSettings.LocalTimeSettings.OffSetEndMinute,\r\n profileMetric: this.deviceProfile.TimeSettings.OffSetEndMinute,\r\n MetricString: this.translationService.t(\"StreamaxConfigs.TimeOffsetEndMinute\"),\r\n InputType: \"number\"\r\n });\r\n }\r\n });\r\n }\r\n}\r\n\r\n","module.exports = \"
{{ 'StreamaxConfigs.UnMatchedProp' | translate }}
{{ comparison.deviceMetric ? ('StreamaxConfigs.EnabledOnDevice' | translate) : ('StreamaxConfigs.DisabledOnDevice' | translate) }} {{ comparison.profileMetric ? ('StreamaxConfigs.EnabledOnProfile' | translate) : ('StreamaxConfigs.DisabledOnProfile' | translate) }}
{{ 'StreamaxConfigs.UnMatchedProp' | translate }}
{{ comparison.deviceMetric ? ('StreamaxConfigs.EnabledOnDevice' | translate) : ('StreamaxConfigs.DisabledOnDevice' | translate) }} {{ comparison.profileMetric ? ('StreamaxConfigs.EnabledOnProfile' | translate) : ('StreamaxConfigs.DisabledOnProfile' | translate) }}
{{ 'StreamaxConfigs.UnMatchedProp' | translate }}
{{ comparison.ErrorStringOverride }}
{{ comparison.deviceMetric ? ('StreamaxConfigs.EnabledOnDevice' | translate) : ('StreamaxConfigs.DisabledOnDevice' | translate) }} {{ comparison.profileMetric ? ('StreamaxConfigs.EnabledOnProfile' | translate) : ('StreamaxConfigs.DisabledOnProfile' | translate) }}
{{ 'StreamaxConfigs.UnMatchedProp' | translate }}
{{ comparison.deviceMetric ? ('StreamaxConfigs.EnabledOnDevice' | translate) : ('StreamaxConfigs.DisabledOnDevice' | translate) }} {{ comparison.profileMetric ? ('StreamaxConfigs.EnabledOnProfile' | translate) : ('StreamaxConfigs.DisabledOnProfile' | translate) }}
\";","import { IBaseDrivingStyle } from \"../../resourceManagement/driving-styles-manager/driving-styles.interfaces\";\r\n\r\nexport enum Colour {\r\n None,\r\n Blue,\r\n Red,\r\n Yellow,\r\n Orange,\r\n Green,\r\n Purple,\r\n Black,\r\n Grey\r\n}\r\n\r\nexport interface IDrivingStyleMetricScore extends IBaseDrivingStyle {\r\n Colour: Colour;\r\n RawValue: number;\r\n Score: number;\r\n}\r\n","module.exports = \" {{ data.value.CompanyName }} {{ 'Common.Loading' | translate }}... \";","module.exports = \"
{{noteToAdd?.length ? noteToAdd.length : 0 }} / 199
{{ 'NotesList.AddNoteButton' | translate }}
person {{note.UserName}}
{{note.CreatedOn | veriDate}}
{{note.Comments}}
{{ 'NotesList.AddNoteButton' | translate }} {{ 'NotesList.SaveNoteButton' | translate }} {{ 'Common.Cancel' | translate }}
\";","module.exports = \" fiber_manual_record {{ statusMessage }} \";","import { Component, EventEmitter, Input, Output, SimpleChanges, TemplateRef, ViewChild } from \"@angular/core\";\r\nimport { FormControl, FormGroup, Validators } from \"@angular/forms\";\r\nimport { getValuesFromEnum } from \"@app/class/Utilities\";\r\nimport { CustomFormValidators } from \"@app/directives/_forms/form-validation.service\";\r\nimport { VDialogRef } from \"@app/directives/_layout/v-dialog/v-dialog-ref\";\r\nimport { DialogService } from \"@app/directives/_layout/v-dialog/v-dialog.service\";\r\nimport { ISim, SimStatus, SimType } from \"@app/interfaces/ISim\";\r\nimport { ISimMapping, SimMappingType } from \"@app/interfaces/ISimMapping\";\r\nimport { ProductVendor } from \"@app/main/components/videos/enums/CameraProductType\";\r\nimport { SimMappingService } from \"@app/main/modules/foundation/_services/sim-mapping.service\";\r\nimport { SimService } from \"@app/main/modules/foundation/_services/sim.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { Observable, of, Subscription } from \"rxjs\";\r\nimport { finalize, switchMap, tap } from \"rxjs/operators\";\r\nimport { ICombinedSimMappingQueryOptions } from \"../../_models/ICombinedSimMappingQueryOptions\";\r\nimport './sim-data.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'sim-data',\r\n template: require('./sim-data.component.html')\r\n})\r\nexport class SimDataComponent {\r\n @Input() simId: number;\r\n @Input() serial: string;\r\n @Input() vendor: ProductVendor;\r\n\r\n @Output() simUpdated = new EventEmitter();\r\n\r\n @ViewChild('confirmReassignTemplate') confirmReassignTemplate: TemplateRef;\r\n //--\r\n\r\n currentSim: ISim;\r\n SimType = SimType;\r\n SimStatus = SimStatus;\r\n currentMapping: ISimMapping;\r\n newSimMapping: ISimMapping;\r\n\r\n simTypes = getValuesFromEnum(SimType).filter(value => value !== SimType.Unknown);\r\n\r\n showUpdateSim: boolean;\r\n newSimForm: FormGroup;\r\n newSim: ISim;\r\n newSimId: number;\r\n simExists: boolean = true;\r\n validationError: string = \"\";\r\n showCreateSimFormFields: boolean;\r\n simAlreadyAssigned: boolean;\r\n\r\n dialog: VDialogRef;\r\n loading: boolean;\r\n\r\n private simValidationSubscription: Subscription;\r\n constructor(\r\n private readonly simMappingService: SimMappingService,\r\n private readonly simService: SimService,\r\n private readonly translationService: TranslationService,\r\n private readonly dialogService: DialogService) { }\r\n\r\n ngOnInit(): void {\r\n this.loadSimData();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['simId'] && changes['serial']) {\r\n this.loadSimData();\r\n }\r\n }\r\n\r\n showSimUpdateForm(): void {\r\n this.showUpdateSim = true;\r\n this.clearValidationErrors();\r\n this.createSimForm();\r\n\r\n this.newSimForm.statusChanges.pipe(untilDestroyed(this)).subscribe(status => {\r\n if (status === \"INVALID\") {\r\n this.clearValidationErrors();\r\n return;\r\n }\r\n\r\n if (!this.showCreateSimFormFields) {\r\n this.validateSim();\r\n return;\r\n }\r\n\r\n this.newSim = {\r\n Iccid: this.newSimForm.get('simIccid').value,\r\n Imsi: this.newSimForm.get('Imsi')?.value,\r\n Msisdn: this.newSimForm.get('Msisdn')?.value,\r\n Type: this.newSimForm.get('Type')?.value,\r\n Status: SimStatus.Active\r\n }\r\n })\r\n }\r\n\r\n cancelSimUpdate(): void {\r\n this.createSimForm();\r\n this.showUpdateSim = false;\r\n this.clearValidationErrors();\r\n this.clearNewSimDetails();\r\n this.simValidationSubscription.unsubscribe();\r\n }\r\n\r\n clearValidationErrors(): void {\r\n this.validationError = \"\";\r\n this.simAlreadyAssigned = false;\r\n }\r\n\r\n showCreateSimForm(): void {\r\n this.showCreateSimFormFields = true;\r\n this.clearValidationErrors();\r\n this.newSimForm.addControl('Type', new FormControl(null, Validators.required));\r\n this.newSimForm.addControl('Imsi', new FormControl(\"\"));\r\n this.newSimForm.addControl('Msisdn', new FormControl(\"\"));\r\n }\r\n\r\n onSimTypeChanged(type: SimType): void {\r\n this.newSimForm.get('Type').setValue(type);\r\n }\r\n\r\n addOrUpdateSim(): void {\r\n if (this.currentMapping) {\r\n this.simMappingService.endSimMapping(this.currentMapping).pipe(untilDestroyed(this)).subscribe();\r\n }\r\n\r\n if (this.newSimId) {\r\n this.createNewMapping(this.newSimId).pipe(\r\n untilDestroyed(this),\r\n tap(() => {\r\n this.currentSim = this.newSim;\r\n this.simId = this.currentSim.Id;\r\n this.clearNewSimDetails();\r\n }),\r\n finalize(() => {\r\n this.onSimUpdateCompleted();\r\n })\r\n ).subscribe();\r\n return;\r\n }\r\n\r\n // Sim is new and needs adding\r\n this.simService.updateSim(this.newSim).pipe(\r\n untilDestroyed(this),\r\n switchMap(sim => {\r\n this.simId = sim.Id;\r\n this.currentSim = sim;\r\n this.clearNewSimDetails();\r\n return this.createNewMapping(sim.Id);\r\n }),\r\n finalize(() => {\r\n this.onSimUpdateCompleted();\r\n })\r\n ).subscribe();\r\n }\r\n\r\n unassignSim(confirm: boolean): void {\r\n if (!confirm) {\r\n return;\r\n }\r\n\r\n this.simMappingService.endSimMapping(this.currentMapping).pipe(\r\n untilDestroyed(this),\r\n tap(() => {\r\n this.clearAllSimData();\r\n this.simUpdated.emit(null);\r\n })\r\n ).subscribe();\r\n }\r\n\r\n\r\n confirmReassign(): void {\r\n this.dialog = this.dialogService.open(this.confirmReassignTemplate, null);\r\n }\r\n\r\n confirmReassignAndCloseDialog(): void {\r\n this.simMappingService.endSimMapping(this.newSimMapping).pipe(\r\n untilDestroyed(this),\r\n finalize(() => {\r\n this.addOrUpdateSim();\r\n this.closeDialog();\r\n })\r\n ).subscribe()\r\n }\r\n\r\n closeDialog(): void {\r\n this.dialog.close();\r\n }\r\n\r\n //--\r\n\r\n private validateSim(): void {\r\n this.loading = true;\r\n this.clearValidationErrors();\r\n\r\n const newIccid: string = this.newSimForm.get('simIccid').value;\r\n\r\n this.simValidationSubscription = this.simService.getSimByIccid(newIccid).pipe(\r\n untilDestroyed(this),\r\n finalize(() => this.loading = false),\r\n switchMap(sim => {\r\n if (!sim) {\r\n this.simExists = false;\r\n this.validationError = this.translationService.t(\"FoundationUnits.SimDoesNotExist\");\r\n this.simId = null;\r\n return of([]);\r\n }\r\n\r\n this.simExists = true;\r\n this.newSim = sim;\r\n this.newSimId = sim.Id;\r\n return this.simMappingService.getSimMappings({ SimId: sim.Id });\r\n }),\r\n tap(mappings => {\r\n if (!mappings.length) {\r\n return;\r\n }\r\n\r\n this.newSimMapping = mappings.find(x => !x.EndUtc);\r\n\r\n if (this.newSimMapping) {\r\n this.validationError = this.translationService.t(\"FoundationUnits.SimAlreadyAssigned\", this.newSimMapping.Serial);\r\n this.simAlreadyAssigned = true;\r\n };\r\n })).subscribe()\r\n }\r\n\r\n private clearNewSimDetails(): void {\r\n this.newSim = null;\r\n }\r\n\r\n private clearAllSimData(): void {\r\n this.currentSim = null;\r\n this.simId = null;\r\n this.currentMapping = null;\r\n this.clearNewSimDetails();\r\n }\r\n\r\n private createSimForm(): void {\r\n this.newSimForm = new FormGroup({\r\n simIccid: new FormControl(\"\", [Validators.required, CustomFormValidators.simIccid])\r\n })\r\n }\r\n\r\n private onSimUpdateCompleted(): void {\r\n this.showCreateSimFormFields = false;\r\n this.showUpdateSim = false;\r\n this.simUpdated.emit(this.newSim);\r\n }\r\n\r\n private createNewMapping(simId: number): Observable {\r\n\r\n const newSimMapping: ISimMapping = {\r\n Id: 0,\r\n Serial: this.serial,\r\n SimId: simId,\r\n SimMappingType: this.isUnit() ? SimMappingType.Unit : SimMappingType.Peripheral\r\n }\r\n\r\n return this.simMappingService.addSimMapping(newSimMapping).pipe(\r\n untilDestroyed(this),\r\n tap(mapping => {\r\n this.currentMapping = mapping;\r\n }));\r\n }\r\n\r\n private isUnit(): boolean {\r\n const unitvendor = [\r\n ProductVendor.Calamp,\r\n ProductVendor.Aplicom,\r\n ProductVendor.Queclink,\r\n ProductVendor.Astra,\r\n ProductVendor.Falcom,\r\n ProductVendor.Trakm8\r\n ]\r\n\r\n return unitvendor.includes(this.vendor);\r\n }\r\n\r\n private loadSimData(): void {\r\n if (!this.simId && !this.serial) {\r\n console.warn(\"No SimId or Serial given, unable to get Sim Data\")\r\n return;\r\n }\r\n\r\n this.getSimAndMappings();\r\n }\r\n\r\n\r\n private getSimAndMappings(): void {\r\n this.loading = true;\r\n const options: ICombinedSimMappingQueryOptions = {\r\n Serial: this.serial,\r\n IsActive: true\r\n }\r\n\r\n this.simMappingService.getSimMappings(options).pipe(\r\n finalize(() => this.loading = false),\r\n switchMap(mappings => {\r\n if (!mappings.length) {\r\n return of(null);\r\n }\r\n this.currentMapping = mappings[0];\r\n return this.simService.getSim(mappings[0].SimId);\r\n }),\r\n tap(sim => {\r\n this.currentSim = sim;\r\n this.simId = sim?.Id;\r\n })\r\n ).subscribe();\r\n }\r\n}\r\n","module.exports = \"
sim_card
{{ 'FoundationUnits.CurrentSim' | translate }}: {{currentSim.Iccid}}
{{ 'FoundationUnits.NoSimInUnit' | translate }}
{{ 'Common.Create' | translate }} {{ 'FoundationUnits.AssignSim' | translate }} {{ 'FoundationUnits.ReAssignSim' | translate }} {{ 'Common.Cancel' | translate }}
{{ validationError }}
{{ 'Common.Type' | translate }}: {{SimType[currentSim.Type]}} {{ 'Common.Status' | translate }}: {{SimStatus[currentSim.Status]}} Imsi: {{currentSim.Imsi}} Msisdn: {{currentSim.Msisdn}} {{ 'FoundationUnits.LastDetailsUpdate' | translate }}: {{currentSim.LastDetailsUpdate | vDate : { relativeTime: true } }}
{{ 'FoundationUnits.NewSim' | translate }}: {{newSim.Iccid}}
{{ 'Common.Type' | translate }}: {{SimType[newSim.Type]}} {{ 'Common.Status' | translate }}: {{SimStatus[newSim.Status]}} Imsi: {{newSim.Imsi}} Msisdn: {{newSim.Msisdn}} {{ 'FoundationUnits.LastDetailsUpdate' | translate }}: {{newSim.LastDetailsUpdate | vDate : { relativeTime: true } }}
{{simId? ('FoundationUnits.AssignNewSim' | translate) : ('FoundationUnits.AssignSim' | translate)}}

{{ \\\"FoundationUnits.ReassignSimTitle\\\" | translate }}?

{{ \\\"FoundationUnits.ReassignSimConfirmation\\\" | translate : newSimMapping.Serial }}

{{ \\\"Common.Cancel\\\" | translate }} {{ \\\"Common.Confirm\\\" | translate }}
\";","import { Component, Input } from \"@angular/core\";\r\nimport { ISim, SimType } from \"@app/interfaces/ISim\";\r\nimport { ISimStatus } from \"@app/main/modules/foundation/_models/ISimStatus\";\r\nimport { SimService } from \"@app/main/modules/foundation/_services/sim.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { finalize, mergeMap, tap } from \"rxjs/operators\";\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'sim-status',\r\n template: require('./sim-status.component.html')\r\n})\r\nexport class SimStatusComponent {\r\n @Input() simId: number;\r\n\r\n\r\n //--\r\n sim: ISim;\r\n simStatusInfo: ISimStatus;\r\n\r\n loading: boolean;\r\n\r\n constructor(\r\n private readonly simService: SimService) { }\r\n\r\n ngOnInit(): void {\r\n this.loadData();\r\n }\r\n\r\n //--\r\n\r\n private loadData(): void {\r\n this.loading = true;\r\n\r\n this.simService.getSim(this.simId).pipe(\r\n untilDestroyed(this),\r\n mergeMap(sim => {\r\n this.sim = sim;\r\n\r\n if (this.sim.Type == SimType.Tele2 || this.sim.Type == SimType.Aeris || this.sim.Type == SimType.WirelessLogic) {\r\n return this.getSimStatus();\r\n }\r\n\r\n return of(true);\r\n }),\r\n finalize(() => this.loading = false))\r\n .subscribe();\r\n }\r\n\r\n private getSimStatus(): Observable {\r\n return this.simService.getSimStatusByIccid(this.sim.Iccid, this.sim.Type).pipe(tap(status => {\r\n this.simStatusInfo = status;\r\n }));\r\n }\r\n\r\n}\r\n","module.exports = \"
signal_cellular_alt
{{ 'Common.Status' | translate }}: {{simStatusInfo.Status}} {{ 'FoundationUnits.Plan' | translate }}: {{simStatusInfo.RatePlan}} {{ 'FoundationUnits.DataUsage' | translate }}: {{simStatusInfo.dataUsageFormatted}} {{ 'FoundationUnits.LastSessionStarted' | translate }}: {{simStatusInfo.SessionStarted | vDate : {dateTime: true} }}
\";","import { QuaggaJSConfigObject } from '@ericblade/quagga2';\r\n\r\nexport const DEFAULT_CONFIG: QuaggaJSConfigObject = {\r\n inputStream: {\r\n name: 'Live',\r\n type: 'LiveStream',\r\n target: null,\r\n constraints: {\r\n width: { min: 640 },\r\n height: { min: 480 },\r\n aspectRatio: { min: 1, max: 2 },\r\n facingMode: 'environment', // or user\r\n },\r\n singleChannel: false // true: only the red color-channel is read\r\n },\r\n locator: {\r\n patchSize: 'medium',\r\n halfSample: false\r\n },\r\n locate: true,\r\n numOfWorkers: 4,\r\n decoder: {\r\n readers: ['code_128_reader']\r\n }\r\n};\r\n","export const BARCODE_TYPES = [\r\n 'code_128',\r\n 'code_39',\r\n 'code_39_vin',\r\n 'ean',\r\n 'ean_extended',\r\n 'ean_8',\r\n 'upc',\r\n 'upc_e',\r\n 'codabar',\r\n 'i2of5',\r\n '2of5',\r\n 'code_93'\r\n];\r\n\r\nexport function mapToReader(value: string | string[]) {\r\n if (typeof value === 'string') {\r\n checkBarCodeType(value);\r\n return [mapToBarcodeType(value)];\r\n } else {\r\n return value.map(val => {\r\n checkBarCodeType(val);\r\n return mapToBarcodeType(val);\r\n });\r\n }\r\n}\r\n\r\nfunction checkBarCodeType(value: string) {\r\n if (!BARCODE_TYPES.some(t => t === value)) {\r\n throw new Error(`This barcode type '${value}' is not valid.`);\r\n }\r\n}\r\n\r\nfunction mapToBarcodeType(value) {\r\n return `${value}_reader`;\r\n}\r\n","module.exports = \"
\";","module.exports = \"

Detected Serial Numbers

{{ value }} Select
\";","export enum DeviceCommunicationMethod {\r\n Comms,\r\n Sms,\r\n}\r\n\r\nexport enum ThirdPartyMessagingProvider {\r\n WirelessLogic,\r\n Aeris,\r\n Twilio,\r\n Tele2,\r\n}\r\n\r\nexport enum DeviceMessageDirection {\r\n Outbound,\r\n Inbound,\r\n}\r\n","export enum DeviceMessageStatus {\r\n Pending,\r\n Sent,\r\n Failed,\r\n Deleted,\r\n Delivered,\r\n Expired,\r\n}\r\n","module.exports = \" {{'CommandSender.SendCommand' | translate }} {{'CommandSender.SendCommand' | translate }}

{{ additionalValueInfo }}
\";","import { Component, Input, OnChanges, SimpleChanges } from \"@angular/core\";\r\nimport { ValidationStatus, ValidationTestResult } from \"../../_services/device-data-validation.service\";\r\nimport \"./commission-check.component.scss\";\r\n@Component({\r\n selector: \"commission-check\",\r\n template: require(\"./commission-check.component.html\")\r\n})\r\nexport class CommissionCheckComponent implements OnChanges {\r\n // bindings\r\n @Input() result: ValidationTestResult;\r\n // component\r\n icon: string;\r\n label: string;\r\n ValidationStatus = ValidationStatus;\r\n constructor() {\r\n }\r\n ngOnChanges(onChangesObj: SimpleChanges): void {\r\n if (!this.result) {\r\n return;\r\n }\r\n this.updateState();\r\n }\r\n // ---\r\n private updateState(): void {\r\n if (!this.result) {\r\n return;\r\n }\r\n this.label = this.result.TestResponseString;\r\n if (this.result.Status == ValidationStatus.Pass) {\r\n this.icon = `check_circle`;\r\n return;\r\n }\r\n this.icon = `highlight_off`;\r\n this.label = this.result.TestResponseString;\r\n }\r\n}\r\n","module.exports = \"
{{ icon }}
{{ label }}
{{ result.InfoMessageString }}
\";","module.exports = \"
{{peripheralMetadata.AutoUpdate ? ( 'CameraConfiguration.Enabled' | translate ) : ( 'CameraConfiguration.Disabled' | translate )}} {{ 'ConfigManagement.AppDisabledInfo' | translate }}
{{ 'CameraConfiguration.ForceUpdate' | translate }} {{ forceUpdate ? ('ConfigManagement.ForceUpdateTrueInfo' | translate) : ('ConfigManagement.ForceUpdateFalseInfo' | translate) }}

{{ 'ConfigManagement.ApplyHeader' | translate }}

{{getConfirmationString}}
  • {{ change }}
{{ \\\"Common.Cancel\\\" | translate }} {{ \\\"Common.Confirm\\\" | translate }}
\";","import { HttpErrorResponse } from '@angular/common/http';\r\nimport { Component, EventEmitter, Input, OnChanges, OnDestroy, Output, SimpleChanges } from '@angular/core';\r\nimport { VButtonStatus } from '@app/directives/_forms/v-input/v-input.component';\r\nimport { IVehicle } from '@app/interfaces/IVehicle';\r\nimport { ValidationResult } from '@app/main/modules/foundation/foundation.enums';\r\nimport { IDeviceToAdd, IValidationResults } from '@app/main/modules/foundation/foundation.interfaces';\r\nimport { DeviceDataValidationService, ValidationCheck, ValidationCheckType, ValidationRequestParameters, ValidationStatus } from '@app/main/modules/foundation/_services/device-data-validation.service';\r\nimport { UnitsService } from '@app/main/modules/foundation/_services/unit.service';\r\nimport { VehicleValidationCheckRecordService, IVehicleValidationCheckRecord } from '@app/main/modules/foundation/_services/vehicle-validation-check-record.service';\r\nimport { CurrentUserService } from '@app/services/currentUser.service';\r\nimport { DateService, DateUnit } from '@app/services/date.service';\r\nimport { TranslationService } from '@app/services/translation.service';\r\nimport { forkJoin, Observable, of, Subject } from 'rxjs';\r\nimport { catchError, finalize, take, takeUntil } from 'rxjs/operators';\r\nimport './device-install-validator.component.scss';\r\n\r\n@Component({\r\n selector: 'device-install-validator',\r\n template: require('./device-install-validator.component.html')\r\n})\r\nexport class DeviceInstallValidatorComponent implements OnChanges, OnDestroy {\r\n @Input() device: IDeviceToAdd;\r\n @Input() serial: string;\r\n @Input() newDevice: boolean;\r\n @Input() autoRunTests: boolean;\r\n @Input() peripheralNoTrackerError: boolean;\r\n @Input() includeTemperatureTests: boolean;\r\n @Input() commissionVehicle: IVehicle;\r\n\r\n @Output() validationComplete: EventEmitter = new EventEmitter();\r\n\r\n //--\r\n\r\n ValidationCheckType = ValidationCheckType;\r\n\r\n categories: ValidationCheckType[];\r\n results: IValidationResults;\r\n\r\n loading: boolean;\r\n\r\n private destroy$ = new Subject();\r\n constructor(\r\n private readonly unitService: UnitsService,\r\n private readonly dateService: DateService,\r\n private readonly deviceDataValidationService: DeviceDataValidationService,\r\n private readonly translationService: TranslationService,\r\n private readonly currentUserService: CurrentUserService,\r\n private readonly vehicleValidationCheckRecordService: VehicleValidationCheckRecordService) {\r\n\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (!this.serial) {\r\n return;\r\n }\r\n\r\n this.searchForSerial();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.unsubscribe();\r\n }\r\n\r\n get deviceNotFound(): boolean {\r\n return !this.device.searchResponse && this.serial?.length > 5 && !this.peripheralNoTrackerError;\r\n }\r\n\r\n get formDetails(): { title: string, subtitle: string } {\r\n if (this.newDevice) {\r\n return {\r\n title: this.device.label,\r\n subtitle: this.translationService.t('Commissions.DeviceToAddValidationSubtitle')\r\n }\r\n }\r\n\r\n return {\r\n title: \" this.translationService.t('Commissions.PreInstalledValidationTitle')\",\r\n subtitle: this.translationService.t('Commissions.PreInstalledValidationSubtitle')\r\n }\r\n }\r\n\r\n //--\r\n\r\n private runTests() {\r\n this.results = {\r\n result: ValidationResult.Pass,\r\n checksRun: []\r\n }\r\n\r\n this.loading = true;\r\n\r\n this.runCoreTests().pipe(take(1)).subscribe(check => {\r\n\r\n if (this.newDevice) {\r\n this.results.checksRun.push(check);\r\n\r\n if (check.ValidationResults.some(result => result.Status === ValidationStatus.Fail)) {\r\n this.saveCheckRecords();\r\n this.loading = false;\r\n this.results.result = ValidationResult.Fail;\r\n return;\r\n }\r\n }\r\n\r\n this.runRemainingTests();\r\n });\r\n }\r\n\r\n private saveCheckRecords(): void {\r\n this.currentUserService.getCurrentUser().then(currentUser => {\r\n const observables: Observable[] = [];\r\n\r\n this.results.checksRun.forEach(cr => {\r\n observables.push(\r\n this.vehicleValidationCheckRecordService.addVehicleValidationCheckRecords({\r\n ValidationCheckType: cr.ValidationCheckType,\r\n EventTime: new Date(),\r\n UserId: currentUser.Id,\r\n VehicleId: this.commissionVehicle?.Id,\r\n Serial: this.serial,\r\n ValidationCheckResultJson: JSON.stringify(cr.ValidationResults)\r\n })\r\n );\r\n });\r\n\r\n forkJoin(observables).pipe(takeUntil(this.destroy$)).subscribe(data => {\r\n this.results.checksRun.forEach(cr => {\r\n cr.ValidationResultDatabaseId = data.find(d => d.ValidationCheckType == cr.ValidationCheckType)?.Id\r\n });\r\n\r\n this.validationComplete.emit(this.results);\r\n });\r\n });\r\n }\r\n\r\n private runCoreTests(): Observable {\r\n if (!this.categories?.find(cat => cat === ValidationCheckType.Core)) {\r\n return;\r\n }\r\n\r\n const validationRequestParameters: ValidationRequestParameters = {\r\n Serial: this.device.serial,\r\n CheckType: ValidationCheckType.Core,\r\n ParentTrackerImei: this.device?.searchResponse?.parentTrackerImei,\r\n StartTime: this.dateService.addOrSubtractTime(new Date(), -60, DateUnit.Min).toISOString(),\r\n EndTime: this.dateService.addOrSubtractTime(new Date(), +1, DateUnit.Min).toISOString()\r\n }\r\n\r\n return this.deviceDataValidationService.getValidationResults(validationRequestParameters);\r\n }\r\n\r\n private runRemainingTests(): void {\r\n const categoriesRemaining = this.categories.filter(category => category !== ValidationCheckType.Core);\r\n if (!categoriesRemaining.length) {\r\n this.loading = false;\r\n return;\r\n }\r\n\r\n if (categoriesRemaining.includes(ValidationCheckType.Temperature) && !!this.device?.searchResponse?.Unit && !this.includeTemperatureTests) {\r\n const index = categoriesRemaining.indexOf(ValidationCheckType.Temperature, 0);\r\n if (index > -1) {\r\n categoriesRemaining.splice(index, 1);\r\n }\r\n }\r\n\r\n const observables: Observable[] = [];\r\n\r\n categoriesRemaining.forEach(category => {\r\n let validationOptions: ValidationRequestParameters = {\r\n Serial: this.device.serial,\r\n CheckType: category,\r\n StartTime: this.dateService.addOrSubtractTime(new Date(), -60, DateUnit.Min).toISOString(),\r\n EndTime: this.dateService.addOrSubtractTime(new Date(), +1, DateUnit.Min).toISOString()\r\n }\r\n\r\n if (!!this.device?.searchResponse?.parentTrackerImei) {\r\n validationOptions.ParentTrackerImei = this.device?.searchResponse?.parentTrackerImei;\r\n }\r\n\r\n observables.push(this.deviceDataValidationService.getValidationResults(validationOptions).pipe(catchError((err, caught) => this.failedCheck(err, category))));\r\n });\r\n\r\n forkJoin(observables).pipe(takeUntil(this.destroy$), finalize(() => this.loading = false)).subscribe(data => {\r\n this.results.checksRun.push(...data)\r\n this.results.checksRun.forEach(check => {\r\n if (check.ValidationResults.some(result => result.Status === ValidationStatus.Fail)) {\r\n this.results.result = ValidationResult.Fail;\r\n return;\r\n }\r\n });\r\n\r\n this.saveCheckRecords();\r\n });\r\n }\r\n\r\n private failedCheck(err: HttpErrorResponse, checkType: ValidationCheckType): Observable {\r\n const failureResult: ValidationCheck = {\r\n ValidationResults: [{\r\n Status: ValidationStatus.Warning,\r\n TestResponseString: \"Validation run\",\r\n InfoMessageString: `Run failed - ${err.error}`,\r\n \r\n }],\r\n ValidationCheckType: checkType\r\n };\r\n\r\n return of(failureResult);\r\n }\r\n\r\n private searchForSerial(): void {\r\n if (!this.device) {\r\n this.device = { serial: this.serial, inputStatus: VButtonStatus.Default, buttonStatus: VButtonStatus.Default }\r\n }\r\n const parentTrackerReference = this.device.searchResponse?.parentTrackerImei;\r\n\r\n\r\n this.unitService.getUnitBySerial(this.serial)\r\n .pipe(take(1))\r\n .subscribe(searchResponse => {\r\n this.device.searchResponse = searchResponse;\r\n this.device.searchResponse.parentTrackerImei = parentTrackerReference;\r\n this.createUnitLabel();\r\n\r\n if (!this.device?.searchResponse?.Product) {\r\n this.results = { result: ValidationResult.Fail, checksRun: [] }\r\n this.validationComplete.emit(this.results);\r\n return;\r\n } \r\n\r\n this.deviceDataValidationService.getValidationCategories(this.serial).pipe(takeUntil(this.destroy$)).subscribe(categories => {\r\n this.categories = categories;\r\n\r\n this.autoRunTests && this.runTests();\r\n })\r\n });\r\n\r\n }\r\n\r\n private createUnitLabel(): void {\r\n if (!this.device.searchResponse) {\r\n this.device.label = \"\";\r\n }\r\n\r\n if (this.device.searchResponse.Product) {\r\n this.device.label = `${this.device.searchResponse.vendorString ? this.device.searchResponse.vendorString : ''} ${this.device.searchResponse.Product.Description}`;\r\n return;\r\n }\r\n\r\n this.device.label = this.translationService.t(\"Commissions.ProductInformationUnavailable\");\r\n\r\n }\r\n}\r\n","module.exports = \" {{ 'DeviceValidationSummary.DeviceNotFound' | translate : serial}}
{{ 'DeviceInstallEditor.Revalidate' | translate }}

{{ result.ValidationCheckType | enumAsString : ValidationCheckType : 'ValidationCheckType' }}

\";","module.exports = \"
{{ loading ? 'refresh' : unit.icon }}
{{ unit.name }}
{{ 'Common.Serial' | translate }} {{ unit.Serial }} {{ unit.Serial }} (Added - Requires save) (Removed - Requires save) Installed {{unit.StartUtc | veriDate : 'date'}}
(Added - Requires save) (Removed - Requires save) Installed {{unit.StartUtc | veriDate : 'date'}}
{{ 'Unit Location: ' + unit.unitLocation }}
SIM: {{ sim?.Iccid }} {{ 'FoundationUnits.AddSim' | translate }} {{ sim?.Iccid ? \\\"SIM ICCID: \\\" + sim.Iccid : \\\"\\\" }}
{{ 'FoundationUnits.SimData' | translate }}
{{ 'FoundationUnits.SimStatus' | translate }}
\";","import { Component, Input, OnChanges } from \"@angular/core\";\r\nimport { VTableRowStatus } from \"@app/directives/_layout/v-table/_enums/VTableRowStatus.enum\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { IValidationResults } from \"@app/main/modules/foundation/foundation.interfaces\";\r\nimport { DateService } from \"@app/services/date.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { finalize } from \"rxjs/operators\";\r\nimport { ValidationStatus, ValidationTestResult } from \"../../_services/device-data-validation.service\";\r\nimport { IVehicleValidationCheckRecord, IVehicleValidationCheckRecordQueryOptions, StringSearchType, VehicleValidationCheckRecordService } from \"../../_services/vehicle-validation-check-record.service\";\r\nimport \"./device-validation-summary.component.scss\";\r\n\r\nexport interface IValidationCheckRecordWithResults extends IVehicleValidationCheckRecord {\r\n results?: ValidationTestResult[];\r\n}\r\n\r\nexport interface IValidationSession {\r\n sessionTime: Date;\r\n commissonId: number;\r\n records: IValidationCheckRecordWithResults[];\r\n}\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: \"device-validation-summary\",\r\n template: require('./device-validation-summary.component.html')\r\n})\r\n\r\nexport class DeviceValidationSummaryComponent implements OnChanges {\r\n\r\n @Input() vehicle: IVehicle;\r\n @Input() serial: string;\r\n\r\n constructor(\r\n private readonly vTableService: VTableService,\r\n private readonly vehicleValidationCheckRecordService: VehicleValidationCheckRecordService,\r\n private readonly dateService: DateService) {\r\n }\r\n\r\n validationRecordColumns: IVTableColumn[];\r\n validationRecordsRows: IVTableRow[];\r\n\r\n sessions: IValidationSession[] = [];\r\n\r\n loading: boolean;\r\n\r\n ngOnInit(): void {\r\n this.createDataTable();\r\n this.loadData();\r\n }\r\n\r\n ngOnChanges(): void {\r\n this.loadData();\r\n }\r\n\r\n getDateOneDayAgo(): Date {\r\n var date = new Date();\r\n date.setDate(date.getDate() - 1);\r\n return date;\r\n }\r\n\r\n validationComplete($event: IValidationResults): void {\r\n \r\n }\r\n\r\n private loadData(): void {\r\n this.loading = true;\r\n\r\n var options: IVehicleValidationCheckRecordQueryOptions = {\r\n Serial: { Value: this.serial, Type: StringSearchType.Match }\r\n };\r\n\r\n this.vehicleValidationCheckRecordService.getVehicleValidationCheckRecords(options).pipe(untilDestroyed(this), finalize(() => this.loading = false)).subscribe(records => {\r\n this.sessions = [];\r\n\r\n records.forEach((record: IValidationCheckRecordWithResults) => {\r\n record.results = JSON.parse(record.ValidationCheckResultJson) as ValidationTestResult[];\r\n\r\n let existingSession = this.sessions.find(session => this.dateService.formatDate(session.sessionTime, { dateTime: true }) === this.dateService.formatDate(record.EventTime, { dateTime: true }));\r\n\r\n if (!existingSession) {\r\n // Create a new session if no existing session found\r\n existingSession = { sessionTime: record.EventTime, records: [], commissonId: record.CommissionId }\r\n this.sessions.push(existingSession);\r\n }\r\n\r\n existingSession.records.push(record);\r\n })\r\n\r\n this.validationRecordsRows = this.vTableService.createTableRows(this.sessions, this.validationRecordColumns);\r\n })\r\n }\r\n\r\n private createDataTable(): void {\r\n this.validationRecordColumns = [\r\n {\r\n header: this.vTableService.createStatusTableHeader(),\r\n createCellFunction: (validationSession) => this.vTableService.createStatusCell(this.countRecordResults(validationSession.records, ValidationStatus.Fail) > 0 ? VTableRowStatus.Error : VTableRowStatus.Success)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ sorted: true }),\r\n createCellFunction: (validationSession) => this.vTableService.createDateCell(validationSession.sessionTime)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"DeviceValidationSummary.SuccessfulChecks\" }),\r\n createCellFunction: (validationSession) => this.vTableService.createTableCell(this.countRecordResults(validationSession.records, ValidationStatus.Pass))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"DeviceValidationSummary.Warnings\" }),\r\n createCellFunction: (validationSession) => this.vTableService.createTableCell(this.countRecordResults(validationSession.records, ValidationStatus.Warning))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"DeviceValidationSummary.FailedChecks\" }),\r\n createCellFunction: (validationSession) => this.vTableService.createTableCell(this.countRecordResults(validationSession.records, ValidationStatus.Fail))\r\n }\r\n ];\r\n }\r\n\r\n private countRecordResults(records: IValidationCheckRecordWithResults[], statusToCount: ValidationStatus): number {\r\n return records.reduce((count, record) => {\r\n return count + record.results.filter(result => result.Status === statusToCount).length;\r\n }, 0);\r\n }\r\n}\r\n","module.exports = \"
\";","module.exports = \"
{{ icon }}
{{ label }}
info
\";","module.exports = \"
{{ 'Diagnostics4G.Installation' | translate }}
{{checks.pulsePacket.subText}}
Satellites: {{device.SatCount}}
Accuracy: within {{device.GPSAccuracy}} meters radius
{{checks.gpsAccuracy.subText}}
{{checks.receivingDelay.subText}}
{{checks.lastIgnition.subText}}
{{checks.sdCard.subText}}
{{checks.videos.subText}}
{{ 'Diagnostics4G.Firmware' | translate }}
Auto deployment: {{ device?.IsAutoDeployment ? 'ON' : 'OFF' }}
Telematics
Production version: {{device?.ProdTelematicsVersion}}
Installed version: {{device?.TelematicsVersion}}
Date of installation: {{ device?.TelematicsInstallDate | vDate : {dateTime: true} }}
Requested: {{ device?.TelematicsRequestedName + ' ' + device?.TelematicsRequestedDate | vDate : {dateTime: true} + ' ' + device?.TelematicsRequestedStatusName }}
Updater
Production version: {{device.ProdUpdaterVersion}}
Installed version: {{device.UpdaterVersion}}
Date of installation: {{ device.UpdaterInstallDate | vDate : {dateTime: true} }}
Requested: {{ device?.UpdaterRequestedVersion + ' ' + device?.UpdaterRequestedDate | vDate : {dateTime: true} + ' ' + device?.UpdaterRequestedStatusName }}
{{ 'Diagnostics4G.Config' | translate }}
Config name: {{device?.ConfigName}}
Date of installation: {{ device?.ConfigFileInstallDate | vDate : {dateTime: true} }}
Requested config: {{ device?.ConfigRequestedName }}
highlight_off {{ 'Diagnostics4G.DeviceNotFound' | translate }}
\";","module.exports = \" \";","import { Component, Input, OnChanges } from \"@angular/core\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { NavigationService } from \"@services/navigation.service\";\r\nimport { AccountService } from \"../../_services/account.service\";\r\nimport { FoundationAccountService } from \"../../_services/account.service.ajs\";\r\nimport \"./reseller-name.component.scss\";\r\n\r\n@Component({\r\n selector: \"reseller-name\",\r\n template: require(\"./reseller-name.component.html\")\r\n})\r\nexport class ResellerNameComponent implements OnChanges {\r\n @Input() id: number;\r\n\r\n resellerName: string;\r\n\r\n constructor(\r\n private readonly accountService: AccountService,\r\n private readonly foundationAccountService: FoundationAccountService,\r\n private readonly translationService: TranslationService,\r\n private readonly navigationService: NavigationService) {\r\n }\r\n\r\n ngOnChanges() {\r\n this.resellerName = this.translationService.t(\"Common.Loading\");\r\n\r\n this.accountService.getResellers().subscribe(resellers => {\r\n this.resellerName = this.foundationAccountService.getResellerName(resellers, this.id);\r\n });\r\n }\r\n\r\n resellerClicked() {\r\n //this.navigationService.go(FoundationNavigationModule.CustomerOverview, { customerId: this.id });\r\n }\r\n}\r\n","module.exports = \" {{resellerName}} \";","import { Component, EventEmitter, Input, OnChanges, Output } from \"@angular/core\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { ReasonCode } from \"@app/enum/ReasonCode\";\r\nimport { ILocationInformation } from \"@app/interfaces/ILocationInformation\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { IPulseRecordPayload } from \"@app/main/modules/foundation/_routes/hardware/_models/IPulseRecordPayload\";\r\nimport { ValidationCheckType } from \"@app/main/modules/foundation/_services/device-data-validation.service\";\r\nimport { DriverTachoMode, IDriverTachoHours } from \"@app/services/tacho.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { IAampAlarmData, IAampCompiledTestObject, IAampGpsData, IDeviceDayCalendar, IDeviceToAdd, IftCloudAlarmData, IftCloudCompiledTestObject, IFtCloudFootageHistory, IFtCloudGpsData, IValidationResults } from \"@foundation/foundation.interfaces\";\r\nimport { IPlot } from \"@interfaces/IPlot\";\r\nimport { ISensorData } from \"@interfaces/ISensorData\";\r\nimport { IDeviceInfo, IS3VideoFile } from \"@services/cameraCommunicationServer.service\";\r\nimport { GeocodeService } from \"@services/geocode.service\";\r\nimport { ITemperatureRecord } from \"@temperature/_models/temperature/ITemperatureRecord\";\r\nimport angular from \"angular\";\r\nimport \"./validation-check-container.component.scss\";\r\n\r\n@Component({\r\n selector: \"validation-check-container\",\r\n template: require('./validation-check-container.component.html')\r\n})\r\n\r\nexport class ValidationCheckContainerComponent implements OnChanges {\r\n @Input() deviceToAdd: IDeviceToAdd;\r\n @Input() newDevice: boolean;\r\n @Input() includeTemperatureTests: boolean;\r\n @Input() commissionVehicle: IVehicle;\r\n\r\n @Output() onValidationComplete: EventEmitter = new EventEmitter();\r\n @Output() deviceToAddChanged: EventEmitter = new EventEmitter();\r\n\r\n // ---\r\n\r\n showCheckDetails = true;\r\n\r\n plots: IPlot[];\r\n sensorData: ISensorData[];\r\n videos: IS3VideoFile[];\r\n aampTestData: IAampCompiledTestObject;\r\n aampGpsPackets: IAampGpsData[];\r\n aampAlarmPackets: IAampAlarmData[];\r\n ftCloudTestData: IftCloudCompiledTestObject;\r\n temperatureRecords: ITemperatureRecord[];\r\n digiDlData: IDriverTachoHours[];\r\n pulsePacketString: string;\r\n\r\n is4gCamera: boolean;\r\n isMdvr: boolean;\r\n isTranscan: boolean;\r\n\r\n unitLocation: string;\r\n\r\n // ---- eums ----\r\n\r\n DriverTachoMode = DriverTachoMode;\r\n\r\n // ---\r\n\r\n constructor(\r\n private readonly geocodeService: GeocodeService,\r\n private readonly vTableService: VTableService,\r\n private readonly translationService: TranslationService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.createDataTables();\r\n }\r\n\r\n ngOnChanges() {\r\n this.sensorData = null;\r\n this.plots = null;\r\n this.aampTestData = null\r\n }\r\n\r\n toggleCheckDetails() {\r\n\r\n this.showCheckDetails = !this.showCheckDetails;\r\n }\r\n\r\n onFaultRecordChecked(event: any): void {\r\n this.deviceToAdd.faultRecorded = event;\r\n }\r\n\r\n\r\n validationComplete(results: IValidationResults): void {\r\n this.assignData(results);\r\n\r\n this.createTableRows();\r\n\r\n this.onValidationComplete.emit(results);\r\n }\r\n\r\n get noData(): boolean {\r\n return !this.plots\r\n && !this.temperatureRecords\r\n && !this.sensorData\r\n && !this.aampTestData\r\n && !this.ftCloudTestData\r\n && !this.digiDlData\r\n && !this.pulsePacketString?.length;\r\n }\r\n\r\n // ---\r\n\r\n private createTableRows(): void {\r\n this.resetTables();\r\n\r\n this.gpsTableRows = this.vTableService.createTableRows(this.plots, this.gpsTableColumns);\r\n\r\n this.temperatureTableRows = this.vTableService.createTableRows(this.temperatureRecords, this.temperatureTableColumns);\r\n\r\n this.sensorFuelDataTableRows = this.vTableService.createTableRows(this.sensorData, this.sensorFuelDataTableColumns);\r\n this.sensorTimingsDataTableRows = this.vTableService.createTableRows(this.sensorData, this.sensorTimingsDataTableColumns);\r\n this.sensorDriverDataTableRows = this.vTableService.createTableRows(this.sensorData, this.sensorDriverDataTableColumns);\r\n\r\n this.aampGpsDataTableRows = this.vTableService.createTableRows(this.aampTestData?.GpsRecords, this.aampGpsDataTableColumns);\r\n this.aampAlarmDataTableRows = this.vTableService.createTableRows(this.aampTestData?.AlarmRecords, this.aampAlarmDataTableColumns);\r\n this.aampFootageHistoryDataTableRows = this.vTableService.createTableRows(this.aampTestData?.FootageRecords, this.aampFootageHistoryDataTableColumns);\r\n\r\n this.ftCloudGpsDataTableRows = this.vTableService.createTableRows(this.ftCloudTestData?.GpsRecords, this.ftCloudGpsDataTableColumns);\r\n this.ftCloudAlarmDataTableRows = this.vTableService.createTableRows(this.ftCloudTestData?.AlarmRecords, this.ftCloudAlarmDataTableColumns);\r\n this.ftCloudFootageHistoryDataTableRows = this.vTableService.createTableRows(this.ftCloudTestData?.FootageRecords, this.ftCloudFootageHistoryDataTableColumns);\r\n\r\n this.digiDataTableRows = this.vTableService.createTableRows(this.digiDlData, this.digiDataTableColumns);\r\n }\r\n\r\n private resetTables(): void {\r\n this.gpsTableRows = [];\r\n this.temperatureTableRows = [];\r\n this.sensorFuelDataTableRows = [];\r\n this.sensorTimingsDataTableRows = [];\r\n this.sensorDriverDataTableRows = [];\r\n this.aampGpsDataTableRows = [];\r\n this.aampAlarmDataTableRows = [];\r\n this.aampFootageHistoryDataTableRows = [];\r\n this.ftCloudGpsDataTableRows = [];\r\n this.ftCloudAlarmDataTableRows = [];\r\n this.ftCloudFootageHistoryDataTableRows = [];\r\n this.digiDataTableRows = []; \r\n }\r\n\r\n private assignData(results: IValidationResults): void {\r\n this.plots = results.checksRun.find(c => c.ValidationCheckType == ValidationCheckType.Plot)?.TestData as IPlot[];\r\n\r\n if (this.plots?.length) {\r\n this.plots.forEach(p => p.ReasonText = this.translationService.tEnum(ReasonCode, 'ReasonCode', p.Reason));\r\n this.resolveAddress(this.plots[this.plots.length - 1].Latitude, this.plots[this.plots.length - 1].Longitude);\r\n }\r\n\r\n this.pulsePacketString = null;\r\n this.videos = [];\r\n if (!!results.checksRun.find(c => c.ValidationCheckType == ValidationCheckType.AddsecureCamera)?.TestData) {\r\n const rtlP100Data = results.checksRun.find(c => c.ValidationCheckType == ValidationCheckType.AddsecureCamera)?.TestData[0] as IDeviceInfo;\r\n\r\n if (!!rtlP100Data.Lat && !!rtlP100Data.Lon) {\r\n this.resolveAddress(rtlP100Data.Lat, rtlP100Data.Lon);\r\n this.videos = rtlP100Data.CameraLatestVideos;\r\n } else {\r\n const veriP100Data = results.checksRun.find(c => c.ValidationCheckType == ValidationCheckType.AddsecureCamera)?.TestData[0] as IPulseRecordPayload;\r\n this.pulsePacketString = JSON.stringify(veriP100Data, null, 2);\r\n this.resolveAddress(veriP100Data.GPS?.latitude, veriP100Data.GPS?.longitude);\r\n }\r\n }\r\n\r\n this.sensorData = results.checksRun.find(c => c.ValidationCheckType == ValidationCheckType.SensorData)?.TestData as ISensorData[];\r\n this.temperatureRecords = results.checksRun.find(c => c.ValidationCheckType == ValidationCheckType.Temperature)?.TestData as ITemperatureRecord[];\r\n this.digiDlData = results.checksRun.find(c => c.ValidationCheckType == ValidationCheckType.DigiDl)?.TestData as IDriverTachoHours[];\r\n\r\n if (!!results.checksRun.find(c => c.ValidationCheckType == ValidationCheckType.FtCloud)?.TestData) {\r\n this.ftCloudTestData = results.checksRun.find(c => c.ValidationCheckType == ValidationCheckType.FtCloud)?.TestData[0] as IftCloudCompiledTestObject;\r\n }\r\n\r\n if (!!results.checksRun.find(c => c.ValidationCheckType == ValidationCheckType.Ceiba)?.TestData) {\r\n this.aampTestData = results.checksRun.find(c => c.ValidationCheckType == ValidationCheckType.Ceiba)?.TestData[0] as IAampCompiledTestObject;\r\n }\r\n\r\n if (this.ftCloudTestData?.GpsRecords?.length) {\r\n this.resolveAddress(this.ftCloudTestData?.GpsRecords[0].Latitude, this.ftCloudTestData?.GpsRecords[0].Longitude);\r\n }\r\n\r\n if (this.aampTestData?.GpsRecords?.length) {\r\n this.resolveAddress(this.aampTestData.GpsRecords[0].GpsLat, this.aampTestData.GpsRecords[0].GpsLng);\r\n }\r\n }\r\n\r\n private resolveAddress(latitutde: number, longitude: number): Promise {\r\n if (latitutde === undefined && longitude === undefined) {\r\n\r\n this.unitLocation = this.translationService.t('Common.Unknown');\r\n return Promise.resolve()\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n this.geocodeService.getAddressFromPoint(new google.maps.LatLng(latitutde, longitude))\r\n .then((location: ILocationInformation) => {\r\n if (location?.LocationDescription) {\r\n this.unitLocation = location.LocationDescription;\r\n } else {\r\n this.unitLocation = this.translationService.t('Common.Unknown');\r\n }\r\n resolve();\r\n })\r\n .catch((error: any) => {\r\n console.error(\"Error in resolveAddress:\", error);\r\n reject(error);\r\n });\r\n });\r\n }\r\n\r\n // --------- Data tables setup ------------------\r\n\r\n private createDataTables(): void {\r\n this.createGpsTables();\r\n this.createTemperatureTable();\r\n this.createSensorFuelDataTable();\r\n this.createSensorTimingsDataTable();\r\n this.createSensorDriverDataTable();\r\n this.createAampGpsDataTable();\r\n this.createAampAlarmDataTable();\r\n this.createAampFootageHistoryDataTable();\r\n this.createFtCloudGpsDataTable();\r\n this.createFtCloudAlarmDataTable();\r\n this.createFtCloudFootageHistoryDataTable();\r\n this.createDigiDataTable();\r\n }\r\n\r\n gpsTableColumns: IVTableColumn[];\r\n gpsTableRows: IVTableRow[];\r\n\r\n private createGpsTables(): void {\r\n this.gpsTableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader(),\r\n createCellFunction: (plot) => this.vTableService.createDateCell(new Date(plot.Utc))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('ValidationCheckContainer.ReasonCode') }),\r\n createCellFunction: (plot) => this.vTableService.createTableCell(plot.ReasonText)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('Common.Odometer') }),\r\n createCellFunction: (plot) => this.vTableService.createTableCell(plot.Odometer)\r\n }\r\n ];\r\n }\r\n\r\n temperatureTableColumns: IVTableColumn[];\r\n temperatureTableRows: IVTableRow[];\r\n\r\n private createTemperatureTable(): void {\r\n this.temperatureTableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader(),\r\n createCellFunction: (temp) => this.vTableService.createDateCell(new Date(temp.Timestamp))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('ValidationCheckContainer.PlotId') }),\r\n createCellFunction: (temp) => this.vTableService.createTableCell(temp.PlotId)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('ValidationCheckContainer.Probe') }),\r\n createCellFunction: (temp) => this.vTableService.createTableCell(temp.TemperatureProbeId)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('Common.Temperature') }),\r\n createCellFunction: (temp) => this.vTableService.createTableCell(temp.Temperature)\r\n }\r\n ];\r\n }\r\n\r\n sensorFuelDataTableColumns: IVTableColumn[];\r\n sensorFuelDataTableRows: IVTableRow[];\r\n\r\n private createSensorFuelDataTable(): void {\r\n this.sensorFuelDataTableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader(),\r\n createCellFunction: (sensorData) => this.vTableService.createDateCell(new Date(sensorData.Utc))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('ValidationCheckContainer.Header') }),\r\n createCellFunction: (sensorData) => this.vTableService.createTableCell(sensorData.Header)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('ValidationCheckContainer.PtoFuel') }),\r\n createCellFunction: (sensorData) => this.vTableService.createTableCell(sensorData.FuelUsedPto)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('ValidationCheckContainer.IdleFuel') }),\r\n createCellFunction: (sensorData) => this.vTableService.createTableCell(sensorData.FuelUsedIdle)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('ValidationCheckContainer.TotalFuel') }),\r\n createCellFunction: (sensorData) => this.vTableService.createTableCell(sensorData.FuelUsedTotal)\r\n }\r\n ];\r\n }\r\n\r\n sensorTimingsDataTableColumns: IVTableColumn[];\r\n sensorTimingsDataTableRows: IVTableRow[];\r\n\r\n private createSensorTimingsDataTable(): void {\r\n this.sensorTimingsDataTableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader(),\r\n createCellFunction: (sensorData) => this.vTableService.createDateCell(new Date(sensorData.Utc))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('ValidationCheckContainer.PtoTime') }),\r\n createCellFunction: (sensorData) => this.vTableService.createTableCell(sensorData.PtoDuration)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('ValidationCheckContainer.IdleTime') }),\r\n createCellFunction: (sensorData) => this.vTableService.createTableCell(sensorData.IdlingDuration)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('ValidationCheckContainer.EngineOnTime') }),\r\n createCellFunction: (sensorData) => this.vTableService.createTableCell(sensorData.EngineOnDuration)\r\n }\r\n ];\r\n }\r\n\r\n sensorDriverDataTableColumns: IVTableColumn[];\r\n sensorDriverDataTableRows: IVTableRow[];\r\n\r\n private createSensorDriverDataTable(): void {\r\n this.sensorDriverDataTableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader(),\r\n createCellFunction: (sensorData) => this.vTableService.createDateCell(new Date(sensorData.Utc))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('Common.Tachograph') }),\r\n createCellFunction: (sensorData) => this.vTableService.createTableCell(sensorData.TachoSlot1Driver)\r\n }\r\n ];\r\n }\r\n\r\n aampGpsDataTableColumns: IVTableColumn[];\r\n aampGpsDataTableRows: IVTableRow[];\r\n\r\n private createAampGpsDataTable(): void {\r\n this.aampGpsDataTableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader(),\r\n createCellFunction: (aampGpsData) => this.vTableService.createDateCell(new Date(aampGpsData.GpsTime))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('ValidationCheckContainer.Latitude') }),\r\n createCellFunction: (aampGpsData) => this.vTableService.createTableCell(aampGpsData.GpsLat)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('ValidationCheckContainer.Longitude') }),\r\n createCellFunction: (aampGpsData) => this.vTableService.createTableCell(aampGpsData.GpsLng)\r\n }\r\n ];\r\n }\r\n\r\n aampAlarmDataTableColumns: IVTableColumn[];\r\n aampAlarmDataTableRows: IVTableRow[];\r\n\r\n private createAampAlarmDataTable(): void {\r\n this.aampAlarmDataTableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader(),\r\n createCellFunction: (aampAlarmData) => this.vTableService.createDateCell(new Date(aampAlarmData.GpsTime))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('ValidationCheckContainer.Latitude') }),\r\n createCellFunction: (aampAlarmData) => this.vTableService.createTableCell(aampAlarmData.GpsLat)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('ValidationCheckContainer.Longitude') }),\r\n createCellFunction: (aampAlarmData) => this.vTableService.createTableCell(aampAlarmData.GpsLng)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('ValidationCheckContainer.AlarmType') }),\r\n createCellFunction: (aampAlarmData) => this.vTableService.createTableCell(aampAlarmData.Content)\r\n }\r\n ];\r\n }\r\n\r\n aampFootageHistoryDataTableColumns: IVTableColumn[];\r\n aampFootageHistoryDataTableRows: IVTableRow[];\r\n\r\n private createAampFootageHistoryDataTable(): void {\r\n this.aampFootageHistoryDataTableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('ValidationCheckContainer.Channel') }),\r\n createCellFunction: (aampFootageHistoryData) => this.vTableService.createTableCell(aampFootageHistoryData.chn)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ title: this.translationService.t('ValidationCheckContainer.FootageStart') }),\r\n createCellFunction: (aampFootageHistoryData) => this.vTableService.createDateCell(new Date(aampFootageHistoryData.starttime))\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ title: this.translationService.t('ValidationCheckContainer.FootageEnd') }),\r\n createCellFunction: (aampFootageHistoryData) => this.vTableService.createDateCell(new Date(aampFootageHistoryData.endtime))\r\n }\r\n ];\r\n }\r\n\r\n ftCloudGpsDataTableColumns: IVTableColumn[];\r\n ftCloudGpsDataTableRows: IVTableRow[];\r\n\r\n private createFtCloudGpsDataTable(): void {\r\n this.ftCloudGpsDataTableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader({ title: this.translationService.t('Common.Time') }),\r\n createCellFunction: (ftCloudGpsData) => this.vTableService.createDateCell(new Date(ftCloudGpsData.EventTime))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('ValidationCheckContainer.Latitude') }),\r\n createCellFunction: (ftCloudGpsData) => this.vTableService.createTableCell(ftCloudGpsData.Latitude)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('ValidationCheckContainer.Longitude') }),\r\n createCellFunction: (ftCloudGpsData) => this.vTableService.createTableCell(ftCloudGpsData.Longitude)\r\n }\r\n ];\r\n }\r\n\r\n ftCloudAlarmDataTableColumns: IVTableColumn[];\r\n ftCloudAlarmDataTableRows: IVTableRow[];\r\n\r\n private createFtCloudAlarmDataTable(): void {\r\n this.ftCloudAlarmDataTableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader({ title: this.translationService.t('Common.Time') }),\r\n createCellFunction: (ftCloudAlarmData) => this.vTableService.createDateCell(new Date(ftCloudAlarmData.StartTime))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('ValidationCheckContainer.Latitude') }),\r\n createCellFunction: (ftCloudAlarmData) => this.vTableService.createTableCell(ftCloudAlarmData.gpsInfo.Latitude)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('ValidationCheckContainer.Longitude') }),\r\n createCellFunction: (ftCloudAlarmData) => this.vTableService.createTableCell(ftCloudAlarmData.gpsInfo.Longitude)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('ValidationCheckContainer.AlarmType') }),\r\n createCellFunction: (ftCloudAlarmData) => this.vTableService.createTableCell(ftCloudAlarmData.AlarmType)\r\n }\r\n ];\r\n }\r\n\r\n ftCloudFootageHistoryDataTableColumns: IVTableColumn[];\r\n ftCloudFootageHistoryDataTableRows: IVTableRow[];\r\n\r\n private createFtCloudFootageHistoryDataTable(): void {\r\n this.ftCloudFootageHistoryDataTableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('ValidationCheckContainer.Channel') }),\r\n createCellFunction: (ftCloudFootageHistoryData) => this.vTableService.createTableCell(ftCloudFootageHistoryData.Channel)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ title: this.translationService.t('ValidationCheckContainer.FootageStart'), sorted: true }),\r\n createCellFunction: (ftCloudFootageHistoryData) => this.vTableService.createDateCell(ftCloudFootageHistoryData.StartTime)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ title: this.translationService.t('ValidationCheckContainer.FootageEnd') }),\r\n createCellFunction: (ftCloudFootageHistoryData) => this.vTableService.createDateCell(new Date(ftCloudFootageHistoryData.EndTime))\r\n }\r\n ];\r\n }\r\n\r\n digiDataTableColumns: IVTableColumn[];\r\n digiDataTableRows: IVTableRow[];\r\n\r\n private createDigiDataTable(): void {\r\n this.digiDataTableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader({ title: this.translationService.t('Common.Time') }),\r\n createCellFunction: (digiDlData) => this.vTableService.createDateCell(new Date(digiDlData.EventTime))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('ValidationCheckContainer.Mode') }),\r\n createCellFunction: (digiDlData) => this.vTableService.createEnumCell(DriverTachoMode, \"DriverTachoMode\", digiDlData.Mode)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ title: this.translationService.t('ValidationCheckContainer.RemainingDrive') }),\r\n createCellFunction: (digiDlData) => this.vTableService.createTableCell(digiDlData.RemainingDrive)\r\n }\r\n ];\r\n }\r\n}\r\n","module.exports = \"
{{ 'Common.Location' | translate }}
{{unitLocation}}
{{ 'ValidationCheckContainer.RecordFault' | translate }}

{{ 'ValidationCheckContainer.GPSData' | translate }}

{{ 'ValidationCheckContainer.TemperatureData' | translate }}

{{ 'ValidationCheckContainer.FuelData' | translate }}

{{ 'ValidationCheckContainer.FuelData' | translate }}

{{ 'Common.Driver' | translate }}

{{ 'ValidationCheckContainer.GPSData' | translate }}

{{ 'ValidationCheckContainer.AlarmData' | translate }}

{{ 'ValidationCheckContainer.FootageHistory' | translate }}

{{ 'ValidationCheckContainer.GPSData' | translate }}

{{ 'ValidationCheckContainer.AlarmData' | translate }}

{{ 'ValidationCheckContainer.FootageHistory' | translate }}

{{ 'ValidationCheckContainer.DigiTachoData' | translate }}

{{pulsePacketString}}
{{ 'ValidationCheckContainer.VideoContainer' | translate }}
{{video.UploadDate | veriDate}}
\";","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { ICsvImportCompletionDTO, ICsvImportCompletionResultDTO, ICsvImportValidationResultDTO, IImportValidationDTO } from \"@app/main/modules/foundation/foundation.interfaces\";\r\nimport { Observable } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FoundationCsvImporterService {\r\n\r\n constructor(private readonly http: HttpClient) {\r\n\r\n }\r\n\r\n validateFile(toValidate: IImportValidationDTO): Observable {\r\n return this.http.post(`/api/foundation/import/validate`, toValidate)\r\n }\r\n\r\n saveFile(toSave: ICsvImportCompletionDTO): Observable {\r\n return this.http.post(`/api/foundation/import`, toSave);\r\n }\r\n}\r\n","\r\nexport enum ErrorType {\r\n MainAsset,\r\n SimFatal,\r\n SimWarning,\r\n FileSetup\r\n}\r\n","module.exports = \"
{{ 'CsvImporter.Disclaimer' | translate }}

{{ 'CsvImporter.ProductSelect' | translate }}

{{ 'CsvImporter.SelectEngineer' | translate }}

{{ 'CsvImporter.NoParentCompaniesError' | translate }}

{{ 'CsvImporter.VisitType' | translate }}

{{ 'CsvImporter.CsvImportTypeError' | translate }}

{{ 'CsvImporter.DeviceValidationResults' | translate }}

{{ 'CsvImporter.FileErrors' | translate }} {{ 'CsvImporter.DeviceError' | translate }} {{ 'CsvImporter.ValidatedDevices' | translate }} {{ 'CsvImporter.ValidatedUnits' | translate }}

{{ 'CsvImporter.SimValidationResults' | translate }}

{{ 'CsvImporter.SimError' | translate }} {{ 'CsvImporter.SimWarning' | translate }} {{ 'CsvImporter.NewSimHeader' | translate }}

{{ 'CsvImporter.DeviceToSimMappingResults' | translate }}

{{ 'CsvImporter.NewSimAssociationHeader' | translate }} {{ 'CsvImporter.CurrentMappings' | translate }}

{{ 'CsvImporter.DeviceValidationErrors' | translate }}

{{ 'CsvImporter.SimValidationErrors' | translate }}

{{ 'CsvImporter.ValidatedPeripherals' | translate }}

{{ 'CsvImporter.ValidatedUnits' | translate }}

{{ 'CsvImporter.ValidatedSims' | translate }}

{{ 'CsvImporter.DeviceError' | translate }} {{ 'CsvImporter.Validated' | translate }} {{ 'CsvImporter.Validated' | translate }}
{{ 'CsvImporter.AddAnotherFile' | translate }}

{{ 'CsvImporter.RequestConfirmationHeader' | translate }}

{{ 'CsvImporter.RequestJobConfirmationBody' | translate : importCount }}

{{ 'CsvImporter.RequestConfirmationBody' | translate : [importCount, selectedTypeString] }}

{{ \\\"Common.Cancel\\\" | translate }} {{ \\\"Common.Confirm\\\" | translate }}
\";","import { Component, EventEmitter, Input, OnChanges, Output } from \"@angular/core\";\r\nimport { ValidationResult } from \"@foundation/foundation.enums\";\r\nimport { IManualValidationCheckCategory } from \"@foundation/foundation.interfaces\";\r\nimport { ManualDeviceValidationCheckService, ManualTests } from \"@foundation/_services/manual-device-validation-check.service\";\r\nimport \"./manual-test-container.component.scss\";\r\n\r\n@Component({\r\n selector: \"manual-test-container\",\r\n template: require('./manual-test-container.component.html')\r\n})\r\nexport class ManualTestContainerComponent implements OnChanges {\r\n\r\n // bindings\r\n @Input() categories: IManualValidationCheckCategory\r\n\r\n @Output() onValidationComplete: EventEmitter = new EventEmitter();\r\n\r\n // internal\r\n faultRecorded: boolean = false;\r\n\r\n constructor(\r\n private readonly manualDeviceValidationCheckService: ManualDeviceValidationCheckService) {\r\n } \r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n ngOnChanges(): void {\r\n this.validateCompletion();\r\n }\r\n\r\n onFaultRecordChecked(event: any): void {\r\n this.faultRecorded = event;\r\n this.validateCompletion();\r\n\r\n }\r\n\r\n onFaultTextChanged(): void {\r\n this.validateCompletion();\r\n }\r\n\r\n onTestChecked(event: any, test: ManualTests): void {\r\n this.categories.checks.find(check => check.test == test).testConfirmation = event == true ? ValidationResult.Pass : ValidationResult.Warning;\r\n\r\n this.validateCompletion();\r\n }\r\n\r\n // --------------------\r\n\r\n private validateCompletion(): void {\r\n let verified = true;\r\n\r\n this.categories.checks.forEach(check => {\r\n if (check.testConfirmation != ValidationResult.Pass) {\r\n verified = false;\r\n }\r\n });\r\n console.log(verified);\r\n\r\n console.log(this.categories.faultComments);\r\n if (verified || (this.faultRecorded && this.categories.faultComments)) {\r\n console.log(this.categories.faultComments);\r\n this.onValidationComplete.emit(ValidationResult.Pass);\r\n } else {\r\n this.onValidationComplete.emit(ValidationResult.Fail);\r\n }\r\n }\r\n}\r\n","module.exports = \"
{{categories.name}}
{{check.name}}
{{check.assertion}}
Record Fault
\";","export enum UnitLocation {\r\n PassengerDash,\r\n DriverDash,\r\n BehindTacho,\r\n UnderSeat,\r\n BehindClocks,\r\n NearsideRear,\r\n OffsideRear\r\n}\r\n","module.exports = \"
{{ peripheral.Unit.savedState == 2 ? 'Cancel' : 'Remove' }} {{ 'DeviceInstallEditor.RunTests' | translate }}
{{ 'DeviceInstallEditor.LeftOnSite' | translate }}
{{\\\"CommissionEditor.ValidationErrorMakeDeviceChanges\\\" | translate}}
{{ 'DeviceInstallEditor.NoTracking' | translate }}
{{ 'DeviceInstallEditor.NoExistingHardware' | translate }}
{{ 'DeviceInstallEditor.RetryHardwareCollection' | translate }}
{{ 'DeviceInstallEditor.AddDevice' | translate }}
{{ 'DeviceInstallEditor.NoHardwareChanged' | translate }} {{ 'DeviceInstallEditor.Chargeable' | translate }}
{{\\\"FormValidationService.Required\\\" | translate}}
{{ 'DeviceInstallEditor.Scan' | translate }}
{{ 'DeviceInstallEditor.NoTracking' | translate }}
{{\\\"EngineerJobs.FieldRequired\\\" | translate}}
5 && !peripheralNoTrackerError\\\">
{{ 'DeviceInstallEditor.NoMatchFound' | translate : deviceToAdd.serial }}
{{ 'DeviceInstallEditor.TrackerRequired' | translate }}
{{ 'DeviceInstallEditor.IncludeTemperatureTests' | translate }}
{{ nonTestableDevice.name }}
{{ option | enumAsString : DistanceMeasurement : 'DistanceMeasurement' }} {{ 'Common.Cancel' | translate }}' {{ 'DeviceInstallEditor.SetOdoValue' | translate }}
{{ 'Commissions.GpsOdometer' | translate : [currentOdoKm, currentOdoMiles] }}
{{ 'DeviceInstallEditor.EditOdoValue' | translate }}
\";","module.exports = \" {{ commission ? commission.Id : ('Commissions.Commission' | translate) }} {{ commission?.VisitReason }} {{commission.account.CompanyName}} {{ \\\"Commissions.CreatedOn\\\" | translate : (commission.Timestamp | vDate) }} \";","import { Component, Input } from \"@angular/core\";\r\nimport { VehicleType } from \"@app/enum/VehicleType.enum\";\r\nimport { IPeripheral, IUnit } from \"@app/interfaces/IPeripheral\";\r\nimport { IEngineerCommission, IValidationCheck } from \"@app/main/modules/foundation/foundation.interfaces\";\r\nimport './commission-summary.component.scss';\r\n\r\n\r\n@Component({\r\n selector: 'commission-summary',\r\n template: require('./commission-summary.component.html')\r\n})\r\nexport class CommissionSummaryComponent {\r\n @Input() commission: IEngineerCommission;\r\n @Input() commissionChecks: IValidationCheck[];\r\n\r\n installedDevices: (IPeripheral | IUnit)[];\r\n VehicleType = VehicleType;\r\n\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n\r\n}\r\n","module.exports = \" {{ commission.CommissionNumber ? commission.CommissionNumber : commission.Id }} {{ commission.VisitReason }} {{ commission.internalUser.Description || commission.internalUser.Email }} {{ commission.engineerUser.Description || commission.engineerUser.Email }} 0\\\" formTitle=\\\"{{ 'Commissions.DevicesInstalled' }}\\\">
{{ device.Peripheral?.Serial || device.Unit?.Serial }} {{ device.Product.Description }}
{{ 'Common.Make' | translate }}: {{commission.vehicle.Make || ('Common.Unknown' | translate)}}
{{ 'Common.Model' | translate }}: {{commission.vehicle.Model || ('Common.Unknown' | translate)}}
{{ 'CommissionEditor.VehicleType' | translate }}: {{commission.vehicle.VehicleType | enumAsString : VehicleType : 'VehicleType'}}
{{ commission.UnitLocation }} {{ commission.Comments }}
\";","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { Observable } from \"rxjs\";\r\nimport { ILoginHistory } from \"./loginHistory.service.ajs\";\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class LoginHistoryService {\r\n\r\n constructor(\r\n private readonly http: HttpClient) {\r\n }\r\n\r\n getLatestLoginHistories(): Observable {\r\n return this.http.get(`/api/loginhistory/`);\r\n }\r\n\r\n getLatestLoginHistoryForUser(userId: number): Observable {\r\n return this.http.get(`/api/loginhistory/${userId}`);\r\n }\r\n\r\n\r\n getAllLoginHistoryForUser(userId: number, startTime: Date, endTime: Date): Observable {\r\n const params = {\r\n startTime: startTime.toISOString(),\r\n endTime: endTime.toISOString()\r\n }\r\n return this.http.get(`/api/loginhistory/${userId}/all`, { params });\r\n }\r\n}\r\n","module.exports = \" {{ 'Commissions.CreateCommissionButton' | translate }} {{ 'Commissions.CreateCommissionButton' | translate }} \";","module.exports = \" {{ 'Common.NewCommission' | translate }} {{ commission.VisitReasonId | enumAsString : EngineerJobItemType : \\\"EngineerJobItemType\\\" }} {{ commission.account.CompanyName }} {{ commission.engineerUser.Description }}

{{ \\\"CommissionEditor.ValidationConfirmTitle\\\" | translate }}?

{{ \\\"CommissionEditor.ValidationConfirmHtmlContent\\\" | translate }}

{{ \\\"Common.Cancel\\\" | translate }} {{ \\\"Common.Confirm\\\" | translate }}

{{ errorTitle }}

{{ errorMessage }}

{{ \\\"Common.Confirm\\\" | translate }}
\";","module.exports = \"
{{ 'Common.Save' | translate }} {{ \\\"Common.Cancel\\\" | translate }}
\";","import { Component, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges, ViewChild } from \"@angular/core\";\r\nimport { AbstractControl, FormBuilder, FormGroup, ValidationErrors, Validators } from \"@angular/forms\";\r\nimport { VAutocompleteComponent } from \"@app/directives/_forms/v-autocomplete/v-autocomplete.component\";\r\nimport { UserType } from \"@app/enum/UserType\";\r\nimport { VehicleType } from \"@app/enum/VehicleType.enum\";\r\nimport { IUser } from \"@app/interfaces/IUser\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { EngineerJobItemType } from \"@app/main/modules/foundation/foundation.enums\";\r\nimport { IEngineer, IEngineerCommission, IEngineerJobItem } from \"@app/main/modules/foundation/foundation.interfaces\";\r\nimport { AccountService } from \"@app/main/modules/foundation/_services/account.service\";\r\nimport { EngineerJobItemService } from \"@app/main/modules/foundation/_services/engineer-job-item.service\";\r\nimport { EngineerJobService } from \"@app/main/modules/foundation/_services/engineer-job.service\";\r\nimport { EngineerService } from \"@app/main/modules/foundation/_services/engineer.service\";\r\nimport { FoundationVehiclesService } from \"@app/main/modules/foundation/_services/vehicle.service\";\r\nimport { IAccount } from \"@app/services/account.service\";\r\nimport { CurrentUserService } from \"@app/services/currentUser.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { combineLatest, forkJoin, Observable, of } from \"rxjs\";\r\nimport { delay, take } from \"rxjs/operators\";\r\nimport './new-commission-detail.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'new-commission-detail',\r\n template: require('./new-commission-detail.component.html')\r\n})\r\nexport class NewCommissionDetailComponent implements OnInit, OnChanges {\r\n @Input() commission: IEngineerCommission;\r\n @Input() jobItemId: number;\r\n\r\n @Output() commissionChanged = new EventEmitter();\r\n\r\n @ViewChild('vehicleAutocomplete') vehicleAutocomplete: VAutocompleteComponent;\r\n //--\r\n loading: boolean;\r\n vehiclesLoading: boolean;\r\n\r\n vehicleConfirmed = false;\r\n editVehicleDetails: boolean;\r\n\r\n engineerJobItemType = EngineerJobItemType;\r\n visitReasons = Object.keys(EngineerJobItemType).filter(s => !isNaN(Number(s))).map(s => Number(s));\r\n\r\n VehicleTypes = VehicleType;\r\n vehicleTypes = Object.keys(VehicleType).filter(s => !isNaN(Number(s))).map(s => Number(s));\r\n\r\n\r\n accounts: IAccount[];\r\n engineers: IUser[];\r\n availableEngineers: IUser[];\r\n vehicles: IVehicle[];\r\n allVehicles: IVehicle[];\r\n currentUser: IUser;\r\n jobItem: IEngineerJobItem;\r\n userIsEngineer = false;\r\n\r\n newVehicle: IVehicle;\r\n newVehicleReg: string;\r\n\r\n selectedVisitReason: EngineerJobItemType;\r\n selectedEngineer: IUser;\r\n selectedEngineerLegacy: IEngineer;\r\n selectedAccount: IAccount;\r\n selectedVehicle: IVehicle;\r\n selectedVehicleType: VehicleType;\r\n\r\n commissionForm: FormGroup;\r\n\r\n showAddVehicleForm: boolean;\r\n showAddVehicleButton: boolean;\r\n\r\n constructor(\r\n private readonly accountsService: AccountService,\r\n private readonly currentUserService: CurrentUserService,\r\n private readonly engineerService: EngineerService,\r\n private readonly formBuilder: FormBuilder,\r\n private readonly jobItemService: EngineerJobItemService,\r\n private readonly jobService: EngineerJobService,\r\n private readonly vehicleService: FoundationVehiclesService) { }\r\n\r\n ngOnInit(): void {\r\n this.loadData();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n\r\n if (changes['commission'] && this.commission) {\r\n this.createForm();\r\n }\r\n\r\n if (!!this.jobItem && !this.commission.JobNumber) {\r\n this.commission.JobNumber = this.jobItem.JobId;\r\n }\r\n\r\n if (!!this.jobItemId && !this.selectedVehicle) {\r\n this.showAddVehicleButton = true;\r\n }\r\n }\r\n\r\n\r\n // Autocomplete select actions\r\n onVisitReasonSelected(reason: EngineerJobItemType): void {\r\n if (!this.commissionForm) {\r\n return;\r\n }\r\n\r\n this.selectedVisitReason = reason;\r\n this.commissionForm.get('visitReasonId').setValue(reason);\r\n\r\n }\r\n\r\n onAccountSelected(account: IAccount): void {\r\n if (!account) {\r\n return;\r\n }\r\n this.commission.account = account;\r\n this.commissionForm.get('accountId').setValue(account.Id);\r\n this.selectedAccount = account;\r\n this.getVehicles();\r\n }\r\n\r\n onEngineerSelected(engineer: IUser): void {\r\n if (!this.commissionForm) {\r\n return;\r\n }\r\n\r\n this.selectedEngineer = engineer;\r\n this.commission.engineerUser = engineer;\r\n this.commissionForm.get('userId').setValue(engineer.Id);\r\n }\r\n\r\n onLegacyEngineerSelected(engineer: IEngineer): void {\r\n if (!this.commissionForm) {\r\n return;\r\n }\r\n\r\n this.selectedEngineerLegacy = engineer;\r\n this.commission.engineerName = engineer.Name;\r\n this.commissionForm.get('engineerId').setValue(engineer.Id);\r\n }\r\n\r\n onVehicleSelected(vehicle: IVehicle): void {\r\n if (!vehicle) {\r\n return;\r\n }\r\n this.clearVehicle();\r\n\r\n this.selectedVehicle = vehicle;\r\n this.commission.vehicle = vehicle;\r\n this.selectedVehicleType = vehicle.VehicleType ?? VehicleType.Unknown;\r\n this.vehicleConfirmed = false;\r\n this.commission.pendingCommissionChanges = [];\r\n this.commissionForm.get('vehicleConfirmed').setValue(this.vehicleConfirmed);\r\n this.commissionForm.get('vehicleId').setValue(vehicle.Id);\r\n this.commissionForm.get('vehicleMake').setValue(vehicle.Make);\r\n this.commissionForm.get('vehicleModel').setValue(vehicle.Model);\r\n this.commissionForm.get('vehicleType').setValue(this.selectedVehicleType);\r\n if (!VehicleType[this.selectedVehicleType] || this.selectedVehicleType === VehicleType.None || this.selectedVehicleType === VehicleType.Unknown) {\r\n this.toggleEditVehicleDetails(true);\r\n }\r\n }\r\n\r\n\r\n //Autocomplete search predicates\r\n accountSearchPredicate(account: IAccount, text: string): boolean {\r\n return account.CompanyName.toLowerCase().includes(text.toLowerCase());\r\n }\r\n\r\n engineerSearchPredicate(engineer: IUser, text: string): boolean {\r\n return engineer.Description?.toLowerCase().includes(text.toLowerCase());\r\n }\r\n\r\n engineerLegacySearchPredicate(engineer: IEngineer, text: string): boolean {\r\n return engineer.Name?.toLowerCase().includes(text.toLowerCase());\r\n }\r\n\r\n vehicleSearchPredicate(vehicle: IVehicle, text: string): boolean {\r\n return vehicle.ShortReg.toLowerCase().includes(text.toLowerCase()) || vehicle.ShortReg.toLowerCase().includes(text.toLowerCase());\r\n }\r\n\r\n // Value change events\r\n onRegChanged(value: string): void {\r\n this.newVehicle.Reg = this.newVehicle.ShortReg = value;\r\n\r\n }\r\n\r\n onMakeChanged(value: string): void {\r\n if (this.newVehicle) {\r\n this.newVehicle.Make = value;\r\n return;\r\n }\r\n this.commissionForm.get('vehicleMake').setValue(value);\r\n }\r\n\r\n onModelChanged(value: string): void {\r\n if (this.newVehicle) {\r\n this.newVehicle.Model = value;\r\n return;\r\n }\r\n this.commissionForm.get('vehicleModel').setValue(value);\r\n }\r\n\r\n onVehicleTypeChanged(value: VehicleType): void {\r\n if (this.newVehicle) {\r\n this.newVehicle.VehicleType = value;\r\n return;\r\n }\r\n this.commissionForm.get('vehicleType').setValue(value);\r\n this.selectedVehicleType = value;\r\n }\r\n\r\n // Toggles\r\n toggleEditVehicleDetails(toggle: boolean): void {\r\n this.editVehicleDetails = toggle;\r\n }\r\n\r\n toggleConfirmVehicle(): void {\r\n this.vehicleConfirmed = !this.vehicleConfirmed;\r\n this.commissionForm.get('vehicleConfirmed').setValue(this.vehicleConfirmed);\r\n }\r\n\r\n toggleShowAddVehicleForm(): void {\r\n this.showAddVehicleForm = true;\r\n this.newVehicle = {\r\n Id: 0,\r\n Reg: null,\r\n ShortReg: null,\r\n Make: null,\r\n Model: null,\r\n VehicleType: VehicleType.Unknown\r\n }\r\n\r\n this.vehicleAutocomplete?.clearInput();\r\n }\r\n\r\n onNoVehiclesFound(searchTerm: string): void {\r\n this.showAddVehicleButton = true;\r\n this.vehicleConfirmed = false;\r\n this.commissionForm.get('vehicleConfirmed').setValue(this.vehicleConfirmed);\r\n this.newVehicleReg = searchTerm;\r\n }\r\n\r\n\r\n // Autocomplete clear actions\r\n clearAccount(): void {\r\n this.commission.account = null;\r\n this.selectedAccount = null;\r\n this.commissionForm.get('accountId').setValue(null);\r\n this.clearVehicle();\r\n }\r\n\r\n clearVehicle(): void {\r\n this.commission.VehicleId = null;\r\n this.commission.vehicle = null;\r\n this.selectedVehicle = null;\r\n this.vehicleConfirmed = false;\r\n this.showAddVehicleButton = false;\r\n this.commissionForm.get('vehicleConfirmed').setValue(this.vehicleConfirmed);\r\n this.commissionForm.get('vehicleMake').setValue(null);\r\n this.commissionForm.get('vehicleModel').setValue(null);\r\n this.commissionForm.get('vehicleType').setValue(null);\r\n }\r\n\r\n clearEngineer(): void {\r\n this.selectedEngineer = null;\r\n this.commissionForm.get('userId').setValue(null);\r\n }\r\n\r\n clearEngineerLegacy(): void {\r\n this.selectedEngineerLegacy = null;\r\n this.commission.engineerName = \"\";\r\n this.commissionForm.get('engineerId').setValue(null);\r\n }\r\n\r\n //\r\n\r\n onNewVehicleAdded(vehicle: IVehicle): void {\r\n this.vehicles.push(vehicle);\r\n this.onVehicleSelected(vehicle);\r\n this.showAddVehicleForm = false;\r\n this.newVehicle = null;\r\n \r\n let observable: Observable = of(null);\r\n\r\n if (!!this.jobItem) {\r\n this.jobItem.VehicleId = vehicle.Id;\r\n observable = this.jobItemService.createUpdateEngineerJobItem(this.jobItem);\r\n }\r\n\r\n observable.pipe(take(1), delay(2000)).subscribe(jobItem => {\r\n this.vehicleConfirmed = true;\r\n this.commissionForm.get('vehicleConfirmed').setValue(this.vehicleConfirmed); \r\n });\r\n }\r\n\r\n // Getters\r\n get formIsValid(): boolean {\r\n return this.commissionForm?.valid;\r\n }\r\n\r\n get commissionUserId(): number {\r\n return this.commissionForm?.get(\"userId\").value;\r\n }\r\n\r\n get commissionAccountId(): number {\r\n return this.commissionForm?.get(\"accountId\").value;\r\n }\r\n\r\n get commissionVehicleId(): number {\r\n return this.commissionForm?.get(\"vehicleId\").value;\r\n }\r\n\r\n get canAddNewVehicle(): boolean {\r\n return (this.commission?.VisitReasonId === EngineerJobItemType.Install\r\n && (this.showAddVehicleButton)\r\n && !this.commission.vehicle)\r\n || (this.userIsEngineer && !this.commission.vehicle);\r\n }\r\n\r\n //--\r\n\r\n private loadData(): void {\r\n this.loading = true;\r\n\r\n this.getUsers().then(() => {\r\n combineLatest([\r\n this.accountsService.getCustomerAccounts(),\r\n this.engineerService.getEngineers(),\r\n this.jobItemId ? this.jobItemService.getEngineerJobItems({ jobItemId: this.jobItemId }) : of([])\r\n ])\r\n .pipe(untilDestroyed(this))\r\n .subscribe(([accounts, engineers, jobItems]) => {\r\n this.accounts = accounts;\r\n this.engineers = engineers;\r\n this.availableEngineers = engineers.filter(e => e.IsActive)\r\n this.jobItem = jobItems[0];\r\n this.mapDataToCommission();\r\n this.loading = false;\r\n })\r\n })\r\n\r\n\r\n }\r\n\r\n private getUsers(): Promise {\r\n return Promise.all([\r\n this.currentUserService.getCurrentUser() as Promise\r\n ]).then(([currentUser]) => {\r\n this.currentUser = currentUser;\r\n })\r\n }\r\n\r\n private getVehicles(): void {\r\n this.vehiclesLoading = true;\r\n this.vehicleService.getVehiclesForAccount(this.commission.AccountId)\r\n .pipe(untilDestroyed(this))\r\n .subscribe(vehicles => {\r\n this.vehicles = vehicles;\r\n if (this.jobItem) {\r\n this.onVehicleSelected(vehicles.find(veh => veh.Id === this.jobItem.VehicleId));\r\n }\r\n this.vehiclesLoading = false;\r\n })\r\n }\r\n\r\n private createForm(): void {\r\n if (!this.commission || this.commissionForm) {\r\n return;\r\n }\r\n\r\n this.commissionForm = this.formBuilder.group({\r\n visitReasonId: [this.commission.VisitReasonId, [Validators.required]],\r\n accountId: [this.commission.AccountId, [Validators.required]],\r\n userId: [this.commission.EngineerUserId, [Validators.required]],\r\n vehicleId: [this.commission.VehicleId, [Validators.required]],\r\n vehicleMake: [this.commission.vehicle?.Make],\r\n vehicleModel: [this.commission.vehicle?.Model],\r\n vehicleType: [this.commission.vehicle?.VehicleType, [Validators.required]],\r\n vehicleConfirmed: [this.vehicleConfirmed, [Validators.required, this.requiredTrue]]\r\n })\r\n\r\n this.commissionForm.statusChanges.pipe(untilDestroyed(this)).subscribe((status: string) => {\r\n this.commission.VisitReasonId = +this.commissionForm.get(\"visitReasonId\").value;\r\n this.commission.AccountId = +this.commissionForm.get(\"accountId\").value;\r\n this.commission.EngineerUserId = +this.commissionForm.get(\"userId\").value;\r\n this.commission.VehicleId = +this.commissionForm.get(\"vehicleId\").value;\r\n\r\n if (this.commission.vehicle) {\r\n this.commission.vehicle.Make = this.commissionForm.get(\"vehicleMake\").value || this.commission.vehicle.Make;\r\n this.commission.vehicle.Model = this.commissionForm.get(\"vehicleModel\").value || this.commission.vehicle.Model;\r\n this.commission.vehicle.VehicleType = +this.commissionForm.get(\"vehicleType\").value;\r\n }\r\n\r\n this.commissionChanged.emit(this.commission);\r\n })\r\n }\r\n\r\n private mapDataToCommission(): void {\r\n if (this.currentUser.Type === UserType.Engineer) {\r\n this.userIsEngineer = true;\r\n this.onEngineerSelected(this.currentUser);\r\n }\r\n if (this.commission.AccountId) {\r\n const account = this.accounts.find(account => account.Id === this.commission.AccountId);\r\n this.onAccountSelected(account);\r\n }\r\n\r\n this.onVisitReasonSelected(this.commission.VisitReasonId);\r\n this.mapJobItemToCommission();\r\n }\r\n\r\n private mapJobItemToCommission(): void {\r\n if (!this.jobItem) {\r\n return;\r\n }\r\n\r\n this.jobService.getEngineerJob(this.jobItem.JobId).pipe(take(1)).subscribe(job => {\r\n this.onVisitReasonSelected(this.jobItem.Type);\r\n this.onAccountSelected(this.accounts.find(acc => acc.Id === job.AccountId));\r\n this.onVehicleSelected(this.vehicles?.find(veh => veh.Id === this.jobItem.VehicleId));\r\n })\r\n }\r\n\r\n requiredTrue = (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) {\r\n return {\r\n \"required\": { valid: false }\r\n }\r\n }\r\n }\r\n}\r\n","module.exports = \"
{{\\\"FormValidationService.Required\\\" | translate}}
{{ commission.VisitReasonId | enumAsString : engineerJobItemType : \\\"EngineerJobItemType\\\" }}
{{item.CompanyName}}
{{\\\"FormValidationService.Required\\\" | translate}}
{{ commission.account.CompanyName }}
{{item.Description}}
{{\\\"FormValidationService.Required\\\" | translate}}
{{item.ShortReg}} / {{item.Reg}}
{{ 'CommissionEditor.Or' | translate }}
{{ 'Commissions.AddVehicle' | translate }}
{{\\\"FormValidationService.Required\\\" | translate}}
{{\\\"FormValidationService.VehicleTypeUnknown\\\" | translate}}
{{ 'Common.Make' | translate }}: {{commission.vehicle.Make || ('Common.Unknown' | translate)}}
{{ 'Common.Model' | translate }}: {{commission.vehicle.Model || ('Common.Unknown' | translate)}}
{{ 'CommissionEditor.VehicleType' | translate }}: {{commission.vehicle.VehicleType | enumAsString : VehicleTypes : 'VehicleTypes'}}
{{ 'CommissionEditor.ConfirmVehicle' | translate }}
{{ 'FormValidationService.Required' | translate }}
{{ 'CommissionEditor.DetailsNotCorrect' | translate }}
\";","module.exports = \" \";","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { VTableRowStatus } from \"@app/directives/_layout/v-table/_enums/VTableRowStatus.enum\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { IAccount } from \"@app/services/account.service\";\r\nimport { DataCacheService } from \"@app/services/caching/data-cache.service\";\r\nimport { Observable } from \"rxjs\";\r\nimport { AccountSubscriptionType } from \"../_enums/AccountSubscriptionType\";\r\nimport { IAccountSubscription } from \"../_models/IAccountSubscription\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CustomerSubscriptionService {\r\n private subscriptionsCacheName: string = \"customerSubscriptionsCache\";\r\n\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly dataCacheService: DataCacheService\r\n ) {\r\n }\r\n\r\n getSubscriptions(invalidateCache = false): Observable {\r\n return this.dataCacheService.getOrRequest(this.subscriptionsCacheName, () => this.getSubscriptionsFromDb(), { invalidateCache, keyName: \"AccountId\" });\r\n }\r\n\r\n getSubscriptionsFromDb(): Observable {\r\n return this.http.get(\"/api/account/subscriptions/\");\r\n }\r\n\r\n getSubscriptionsForAccount(accountId: number): Observable {\r\n const subscriptions = this.dataCacheService.getSingleValue(accountId, this.subscriptionsCacheName);\r\n\r\n if (subscriptions?.length) {\r\n return subscriptions;\r\n }\r\n\r\n return this.http.get(\"/api/account/subscriptions/\", { params: { accountId } });\r\n }\r\n\r\n getSubscriptionCost(sub: IAccountSubscription): number {\r\n return sub.Amount * this.getSubscriptionCostPerUnit(sub);\r\n }\r\n\r\n //// Returns cost in £ per Unit/Vehicle in a decimal value. 0.15 = 15p, 1 = £1\r\n getSubscriptionCostPerUnit(sub: IAccountSubscription): number {\r\n switch (sub.Type) {\r\n case AccountSubscriptionType.EmailQuota:\r\n return 0.002;\r\n\r\n case AccountSubscriptionType.SmsQuota:\r\n // 3 segments per \"message\"\r\n return 0.15;\r\n\r\n case AccountSubscriptionType.ContextualSpeeding:\r\n case AccountSubscriptionType.Reefer:\r\n case AccountSubscriptionType.Tms:\r\n case AccountSubscriptionType.ReportBuilder:\r\n return 1;\r\n\r\n case AccountSubscriptionType.SSO:\r\n return 2;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n setEndTimes(subscriptions: IAccountSubscription[], customers: IAccount[]) {\r\n subscriptions.forEach(s => {\r\n\r\n s.account = customers.find(c => c.Id == s.AccountId);\r\n\r\n if (!s.EndTime) {\r\n // Max date\r\n s.EndTime = new Date(8640000000000000);\r\n }\r\n\r\n s.active = s.EndTime > new Date;\r\n s.status = s.active ? VTableRowStatus.Success : VTableRowStatus.Info\r\n });\r\n }\r\n\r\n calculateSubscriptionCosts(subscriptions: IAccountSubscription[], vehicles: IVehicle[]): number {\r\n var totalCharge = 0;\r\n\r\n subscriptions.forEach(sub => {\r\n if (!sub.Amount) {\r\n sub.Amount = vehicles.filter(v => v.AccountId == sub.AccountId).length;\r\n }\r\n\r\n sub.ChargePerUnit = this.getSubscriptionCostPerUnit(sub);\r\n sub.TotalCharge = this.getSubscriptionCost(sub);\r\n\r\n if (sub.active) {\r\n totalCharge += sub.TotalCharge || 0;\r\n }\r\n });\r\n\r\n return totalCharge;\r\n }\r\n\r\n // ---\r\n}\r\n","module.exports = \"
\";","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { ICountry } from \"@app/directives/_forms/smsInput/ICountry\";\r\nimport { IPreferencesContent } from \"@app/interfaces/IPreferencesContent\";\r\nimport { ITimeZoneInfo } from \"@app/userPreferences/model/ITimeZoneInfo\";\r\nimport copy from \"fast-copy\";\r\nimport { forkJoin, Observable, of } from \"rxjs\";\r\nimport { map } from \"rxjs/operators\";\r\nimport { IPreferencesQueryOptions } from \"../preferences.service\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PreferenceService {\r\n\r\n constructor(\r\n private readonly http: HttpClient\r\n ) { }\r\n\r\n getPreferences(queryOptions: IPreferencesQueryOptions): Observable {\r\n return this.http.get(\"/api/preferences/preferencesContent\", { params: queryOptions as HttpParams });\r\n }\r\n\r\n getDefaultPreferences(): Observable {\r\n return this.http.get(\"/api/preferences/default\");\r\n }\r\n\r\n getAccountPreferences(queryOptions: IPreferencesQueryOptions): Observable {\r\n let prefsObservable = this.getPreferences(queryOptions);\r\n\r\n if (!queryOptions.AccountId) {\r\n prefsObservable = of({})\r\n }\r\n\r\n return forkJoin({\r\n prefs: prefsObservable,\r\n defaultPrefs: this.getDefaultPreferences()\r\n }).pipe(map(data => {\r\n const mergedPrefs: IPreferencesContent = copy({ ...data.defaultPrefs, ...data.prefs });\r\n this.setExistingPrefProperties(data.prefs, mergedPrefs);\r\n return mergedPrefs;\r\n }))\r\n }\r\n\r\n getCountryCodes(): Observable {\r\n return this.http.get(\"/api/useroptions/countrycodes/\");\r\n }\r\n\r\n getTimezones(): Observable {\r\n return this.http.get(\"/api/useroptions/timezones/\");\r\n }\r\n\r\n updateAccountPreferences(accountPreferences: IPreferencesContent, accountId?: number): Observable {\r\n return this.http.post(`/api/preferences/account/${accountId}`, accountPreferences);\r\n }\r\n\r\n private setExistingPrefProperties(sourceModel: IPreferencesContent, targetModel: IPreferencesContent) {\r\n for (const property in sourceModel) {\r\n\r\n const preference = targetModel[property];\r\n if (!preference) {\r\n continue;\r\n }\r\n\r\n preference.savePreference = true;\r\n }\r\n }\r\n}\r\n","module.exports = \"
business
{{customerId > 0 ? customer?.CompanyName : ('CustomerEdit.NewCompany' | translate) }} {{customer?.Status | enumAsString : AccountStatus : \\\"AccountStatus\\\"}} {{ 'FoundationCustomers.Created' | translate : customer?.DateTimeSetup }} {{customer?.Platform | enumAsString : Platform : \\\"Platform\\\"}} {{ 'Common.Save' | translate }}
{{ 'CustomerEdit.InvalidPhoneNumber' | translate }}

{{'UserPreferences.generalPreferences' | translate}}

{{'UserPreferences.companyDefaultPreferencesMessage' | translate}}
{{'UserPreferences.showInactiveDrivers' | translate}} {{'UserPreferences.showVehiclesWithNoUnit' | translate}} {{'UserPreferences.showVehiclesNotTracking' | translate}} {{'UserPreferences.showTrailerAssociations' | translate}}

{{'UserPreferences.mapPreferences' | translate}}

{{'UserPreferences.mapPreferencesSubtitle' | translate}}
{{'UserPreferences.showGeofences' | translate}} {{'UserPreferences.showZones' | translate}} {{'UserPreferences.showSystemZones' | translate}} {{'UserPreferences.showGeofenceLabels' | translate}} {{'UserPreferences.showVehicleClustering' | translate}} {{'UserPreferences.showVehicleLabels' | translate}} {{'UserPreferences.registration' | translate}} {{'UserPreferences.displayLabel' | translate}}

{{'UserPreferences.costPreferences' | translate}}

{{'UserPreferences.costPreferencesSubtitle' | translate}}
{{'UserPreferences.distance' | translate}} {{'UserPreferences.hourly' | translate}} {{'UserPreferences.pound' | translate}} {{'UserPreferences.euro' | translate}} {{'UserPreferences.dollar' | translate}}

{{'UserPreferences.unitMeasurementPreferences' | translate}}

{{'UserPreferences.unitMeasurementPreferencesSubtitle' | translate}}
{{'UserPreferences.kilometres' | translate}} {{'UserPreferences.miles' | translate}} {{'UserPreferences.celsius' | translate}} {{'UserPreferences.fahrenheit' | translate}} {{'UserPreferences.litre' | translate}} {{'UserPreferences.gallon' | translate}} {{'UserPreferences.usGallon' | translate}} MPG L/100KM MPG (US) KPL

{{'UserPreferences.internationalisationPreferences' | translate}}

{{'UserPreferences.internationalisationPreferencesSubtitle' | translate}}
{{'CustomerEdit.TimezoneWarningSubtitle' | translate}}

{{'UserPreferences.TmsPreferences' | translate}}

{{'UserPreferences.TmsPreferencesSubtitle' | translate}}
{{'UserPreferences.DepartStartLocation' | translate}} {{'UserPreferences.DepartFromAnyVisit' | translate}} {{'UserPreferences.JourneyStart' | translate}} {{'UserPreferences.ArriveEndLocation' | translate}} {{'UserPreferences.ArriveAllVisits' | translate}} {{'UserPreferences.OnLocation' | translate}} {{'UserPreferences.OnJourney' | translate}} {{'UserPreferences.OnDwell' | translate}} {{'UserPreferences.CanMatchOnMissedVisits' | translate}} {{'UserPreferences.RecordVisitsAsMissedIfVisitedOutOfOrder' | translate}} {{'UserPreferences.RecordUnplannedVisits' | translate}} {{'UserPreferences.RestartRouteOnReturnToStartingLocation' | translate}}

{{ \\\"CustomerEdit.ConfirmSave\\\" | translate }}?

{{ \\\"CustomerEdit.AccountStatusChanged\\\" | translate }}

{{ \\\"Common.Cancel\\\" | translate }} {{ \\\"Common.Confirm\\\" | translate }}
\";","module.exports = \"

{{ 'FoundationCustomers.EnabledFeatures' | translate }}

{{ 'FoundationCustomers.UpdateFeatureset' | translate }}
\";","export enum AccountSector {\r\n Legacy = 1,\r\n WasteRecycling,\r\n Security,\r\n Aggregate,\r\n Agricultural = 5,\r\n Horticultural,\r\n FacilitiesManagement,\r\n Haulage,\r\n Parcel,\r\n Finance,\r\n Hospitality,\r\n CustomerServices,\r\n Construction,\r\n Laundry,\r\n FoodBeverage,\r\n PassengerServices,\r\n Other,\r\n Utilities,\r\n ConsumerGoods,\r\n Leisure,\r\n Logistics,\r\n Retail,\r\n Pharmaceutical\r\n}\r\n","\r\nexport enum AccountFleetType {\r\n Unknown,\r\n HGV,\r\n Car,\r\n Van,\r\n Mixed\r\n}\r\n","module.exports = \" {{ 'FoundationCustomers.AddCustomerButton' | translate }}
\";","module.exports = \" {{customer.Status | enumAsString : AccountStatus : \\\"AccountStatus\\\"}} {{ 'FoundationCustomers.Created' | translate : (customer.DateTimeSetup | vDate) }} {{customer.Platform | enumAsString : Platform : \\\"Platform\\\"}} {{ 'FoundationCustomers.EditCustomer' | translate }} {{ 'Login.LogIn' | translate }} \";","module.exports = \" {{ 'users.addUser' | translate }} 0\\\">{{ 'UserEditor.LoginAs' | translate : selectedUser?.CurrentAccountUserMapping?.Name }}

{{ \\\"UserEditor.ResetPassword\\\" | translate }}?

{{ \\\"UserEditor.PasswordInformation\\\" | translate }}

{{ \\\"Common.Cancel\\\" | translate }} {{ \\\"Common.Confirm\\\" | translate }}
\";","export enum LogLevel {\r\n // Define your log levels here based on your C# LogLevel enum\r\n // For example:\r\n Debug = 0,\r\n Info = 1,\r\n Warning = 2,\r\n Error = 3,\r\n // Add more if needed\r\n}\r\n","module.exports = \"

Developer console

Join Group

Logs Pulse Tacho Clear
{{log.Timestamp | vDate : {dateTime: true} }} : {{log.Level | enumAsString : logLevel : 'LogLevel'}}
{{log.Environment}} : {{log.Machine}}
{{log.Namespace}}.{{log.ClassName}}
{{log.Message}}
{{log.Value | json}}

{{tacho | json}}

Pulse Packet
PulsePacket Id: {{ pulseMessage.Id }}
Pulse Response
PulsePacketId: {{ pulseMessage.PulseRecordId }}
{{pulseMessage | json}}

\";","import { Injectable } from \"@angular/core\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { IAccount } from \"@app/services/account.service\";\r\nimport { VehicleService } from \"@app/services/vehicle.service\";\r\nimport { firstValueFrom } from \"rxjs\";\r\nimport { AccountService } from \"../../_services/account.service\";\r\nimport { DeviceHealthService } from \"./device-health.service\";\r\nimport { DeviceHealthRecordHelper } from \"./helpers/device-health-record-helper\";\r\nimport { IDeviceHealthAccountSummary } from \"./models/device-health-account-summary\";\r\nimport { DeviceHealthSimpleSummary } from \"./models/device-health-simple-summary\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DeviceHealthAccountService {\r\n constructor(\r\n private readonly deviceHealthService: DeviceHealthService,\r\n private readonly accountService: AccountService,\r\n private readonly vehicleService: VehicleService\r\n ) { }\r\n\r\n async getStatsForAccounts(): Promise {\r\n const summaries = await firstValueFrom(this.deviceHealthService.getAllSummaries());\r\n const accounts = await firstValueFrom(this.accountService.getCustomerAccounts());\r\n const vehicles = await this.vehicleService.getVehicles();\r\n\r\n const { telematicSummaries, cameraSummaries } = this.groupSummariesByType(summaries);\r\n const vehiclesByAccount = vehicles.groupBy(x => x.AccountId);\r\n\r\n const result = accounts\r\n .map(account => this.mapDataToAccount(account, telematicSummaries, cameraSummaries, vehiclesByAccount))\r\n .filter(summary => summary.vehiclesCount > 0);\r\n\r\n return result;\r\n }\r\n\r\n private groupSummariesByType(\r\n summaries: DeviceHealthSimpleSummary[]\r\n ): {telematicSummaries: DeviceHealthSimpleSummary[], cameraSummaries: DeviceHealthSimpleSummary[] } {\r\n const telematicSummaries: DeviceHealthSimpleSummary[] = [];\r\n const cameraSummaries: DeviceHealthSimpleSummary[] = [];\r\n\r\n summaries.forEach(s => {\r\n const isTelematic = s.DaySummaries.some(\r\n ds => ds.TypeSummaries\r\n .map(ts => ts.Type)\r\n .some(t => DeviceHealthRecordHelper.isTelematic(t))\r\n )\r\n\r\n if (isTelematic) {\r\n telematicSummaries.push(s);\r\n } else {\r\n cameraSummaries.push(s);\r\n }\r\n });\r\n\r\n return { telematicSummaries, cameraSummaries };\r\n }\r\n\r\n private mapDataToAccount(\r\n account: IAccount, \r\n telematicSummaries: DeviceHealthSimpleSummary[], \r\n cameraSummaries: DeviceHealthSimpleSummary[], \r\n vehicles: Record\r\n ): IDeviceHealthAccountSummary {\r\n const vehiclesCount = vehicles[account.Id]?.length || 0;\r\n const cameraFailingVehiclesCount = this.getFailingVehiclesCount(account.Id, cameraSummaries);\r\n const telematicFailingVehiclesCount = this.getFailingVehiclesCount(account.Id, telematicSummaries);\r\n\r\n return { \r\n accountId: account.Id, \r\n account, \r\n vehiclesCount, \r\n cameraFailingVehiclesCount, \r\n telematicFailingVehiclesCount \r\n };\r\n }\r\n\r\n private getFailingVehiclesCount(accountId: number, summaries: DeviceHealthSimpleSummary[]): number {\r\n const summariesForAccount = summaries.filter(s => s.AccountId === accountId);\r\n const summariesByVehicle: Record = summariesForAccount.groupBy(x => x.VehicleId);\r\n return Object.keys(summariesByVehicle).length;\r\n }\r\n}","import { VehicleType } from \"@app/enum/VehicleType.enum\";\r\nimport { IAccount } from \"@app/services/account.service\";\r\nimport { DeviceHealthRecord } from \"./device-health-record\";\r\n\r\nexport class DeviceHealthRecordsByVehicle {\r\n records: DeviceHealthRecord[];\r\n \r\n accountId: number;\r\n companyName: string;\r\n \r\n vehicleId?: number;\r\n vehicleType?: VehicleType;\r\n vehicleRegistration?: string;\r\n vehicleMake?: string;\r\n vehicleModel?: string;\r\n\r\n constructor(records: DeviceHealthRecord[], account: IAccount) {\r\n this.records = records;\r\n this.accountId = account.Id;\r\n this.companyName = account.CompanyName;\r\n\r\n if (records.length > 0) {\r\n this.vehicleId = records[0].VehicleId;\r\n this.vehicleType = records[0].VehicleType;\r\n this.vehicleRegistration = records[0].VehicleRegistration;\r\n this.vehicleMake = records[0].VehicleMake;\r\n this.vehicleModel = records[0].VehicleModel;\r\n }\r\n }\r\n}","module.exports = \"
\";","export enum SDCardErrorType {\r\n Full = 1,\r\n Unformatted = 2,\r\n ReadWriteError = 3,\r\n RecordingDisabled = 4,\r\n Loss = 5,\r\n NotIdentifiedOrNotMounted = 6,\r\n PartitioningError = 7,\r\n CapacityLimitExceeded = 8 \r\n}","module.exports = \" {{recordGroup.vehicleRegistration}} {{vehicleType}}
\";","module.exports = \" {{ account.CompanyName }}
\";","module.exports = \" \";","module.exports = \" \";","import { CommonModule } from \"@angular/common\";\r\nimport { CUSTOM_ELEMENTS_SCHEMA, NgModule } from \"@angular/core\";\r\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\r\nimport { CoreDirectivesModule } from \"@directives/_core/_core.directives.module\";\r\nimport { FormsDirectivesModule } from \"@directives/_forms/_form.directives.module\";\r\nimport { LayoutDirectivesModule } from \"@directives/_layout/_layout.directives.module\";\r\nimport { MiscDirectivesModule } from \"@directives/_misc/_misc.directives.module\";\r\nimport { VeriDirectivesModule } from \"@directives/_veri/_veri.directives.module\";\r\nimport { PipesModule } from \"src/app/_pipes/_pipes.module\";\r\nimport { VehicleDirectivesModule } from \"../../../../../directives/_vehicle/_vehicle.directives.module\";\r\nimport { FoundationJobsModule } from \"../jobs/jobs.module\";\r\nimport { EngineerJobItemListComponent } from \"./engineer-job-item-list.component\";\r\n\r\nconst privateComponents: any[] = [\r\n\r\n];\r\n\r\nconst publicComponents: any[] = [\r\n EngineerJobItemListComponent\r\n];\r\n\r\nconst declarations: any[] = [\r\n];\r\n\r\nconst providers: any[] = [\r\n \r\n];\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n PipesModule,\r\n FormsModule,\r\n FormsDirectivesModule,\r\n VeriDirectivesModule,\r\n VehicleDirectivesModule,\r\n MiscDirectivesModule,\r\n LayoutDirectivesModule,\r\n CoreDirectivesModule,\r\n ReactiveFormsModule,\r\n FoundationJobsModule\r\n ],\r\n providers: providers,\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents, ...declarations],\r\n exports: [...publicComponents, ...declarations],\r\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\r\n})\r\nexport class EngineerJobItemListModule {\r\n constructor() {\r\n }\r\n}\r\n","module.exports = \" {{ 'EngineerJobs.AddJob' | translate }}
\";","module.exports = \" {{ item.CompanyName }}
{{\\\"EngineerJobs.FieldRequired\\\" | translate }}
{{ 'JobEditor.ChooseCompany' | translate }}
{{item.Description}}
{{ 'JobEditor.ChooseEngineer' | translate }}
{{ job.Description }} {{ job.EngineerInstruction }}
\";","module.exports = \"
{{ job.Id }}: {{ job.Description }}
{{ job.Status | enumAsString : engineerJobStatus : \\\"EngineerJobStatus\\\" }} {{ job.account?.CompanyName }} {{ jobBooking?.StartUtc | vDate }} - {{ jobBooking?.EndUtc | vDate }} {{\\\"JobDetails.ImportJobItems\\\" | translate }} {{\\\"JobDetails.AddJobItem\\\" | translate }} {{\\\"JobDetails.CancelChanges\\\" | translate }} {{(saving ? \\\"Common.Saving\\\" : \\\"Common.Save\\\") | translate }}
\";","import { Component, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges } from \"@angular/core\";\r\nimport { FormControl, FormGroup, Validators } from \"@angular/forms\";\r\nimport { CustomFormValidators } from \"@app/directives/_forms/form-validation.service\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { EngineerJobItemStatus, EngineerJobItemType } from \"@app/main/modules/foundation/foundation.enums\";\r\nimport { IEngineerCommission, IEngineerJobItem } from \"@app/main/modules/foundation/foundation.interfaces\";\r\nimport { EngineerJobItemService } from \"@app/main/modules/foundation/_services/engineer-job-item.service\";\r\nimport { EngineerJobService } from \"@app/main/modules/foundation/_services/engineer-job.service\";\r\nimport { FoundationVehiclesService } from \"@app/main/modules/foundation/_services/vehicle.service\";\r\nimport { NavigationService } from \"@app/services/navigation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { Observable } from \"rxjs\";\r\nimport { take, tap, finalize, switchMap } from \"rxjs/operators\";\r\nimport { FoundationNavigationModule } from \"../../../foundation.navigation\";\r\nimport { EngineerCommissionService } from \"../../../_services/engineer-commission.service\";\r\nimport './job-item-editor.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'job-item-editor',\r\n template: require('./job-item-editor.component.html')\r\n})\r\nexport class JobItemEditorComponent implements OnInit, OnChanges, OnDestroy {\r\n @Input() jobItem: IEngineerJobItem;\r\n @Input() allJobItems: IEngineerJobItem[];\r\n @Input() duplicateJobId: number;\r\n\r\n @Output() jobItemSaved = new EventEmitter();\r\n @Output() vehicleSelected = new EventEmitter();\r\n @Output() lastJobItemCancelled = new EventEmitter();\r\n @Output() vehicleAdd = new EventEmitter();\r\n @Output() reportIssueClick = new EventEmitter();\r\n\r\n //--\r\n\r\n accountId: number;\r\n amendedJobItem: IEngineerJobItem;\r\n\r\n commission: IEngineerCommission;\r\n\r\n showVehicleAddForm = false;\r\n vehicles: IVehicle[];\r\n availableVehiclesPromise: Promise;\r\n availableVehicles: IVehicle[];\r\n selectedVehicle: IVehicle;\r\n\r\n jobItemEditorForm: FormGroup;\r\n vehicleAddForm: FormGroup;\r\n vehicleToAdd: IVehicle = {};\r\n noVehicleAvailable: boolean = false;\r\n\r\n vehiclesLoading: boolean;\r\n\r\n isLastJobItem: boolean = false;\r\n\r\n engineerJobItemStatus = EngineerJobItemStatus;\r\n statuses = Object.keys(EngineerJobItemStatus).filter(s => !isNaN(Number(s))).map(s => Number(s));\r\n engineerJobItemType = EngineerJobItemType;\r\n types = Object.keys(EngineerJobItemType).filter(s => !isNaN(Number(s))).map(s => Number(s));\r\n\r\n saving: boolean = false;\r\n\r\n\r\n constructor(\r\n private readonly engineerCommissionService: EngineerCommissionService,\r\n private readonly engineerJobService: EngineerJobService,\r\n private readonly engineerJobItemService: EngineerJobItemService,\r\n private readonly navigationService: NavigationService,\r\n private readonly vehicleService: FoundationVehiclesService) { }\r\n\r\n ngOnInit(): void {\r\n this.getData();\r\n this.loadCommissions();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['jobItem']) {\r\n\r\n this.mapPropertiesToAmendedJobItem();\r\n this.setupForms();\r\n }\r\n\r\n if (changes['allJobItems']) {\r\n this.isLastJobItem = this.getIsLastJobItem();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n delete this.amendedJobItem;\r\n }\r\n\r\n showAddVehicle(): void {\r\n this.showVehicleAddForm = true;\r\n this.clearVehicle();\r\n }\r\n\r\n clearVehicle(): void {\r\n this.selectedVehicle = null;\r\n this.amendedJobItem.VehicleId = null;\r\n this.vehicleSelected.emit(null);\r\n }\r\n\r\n\r\n saveJobItem(): void {\r\n this.saving = true;\r\n\r\n this.engineerJobItemService.createUpdateEngineerJobItem(this.amendedJobItem)\r\n .pipe(take(1))\r\n .subscribe(jobItem => {\r\n this.jobItemSaved.emit();\r\n this.saving = false;\r\n });\r\n }\r\n\r\n onVehicleSelected(vehicle: IVehicle): void {\r\n this.selectedVehicle = vehicle;\r\n this.amendedJobItem.VehicleId = vehicle.Id;\r\n this.vehicleSelected.emit(vehicle);\r\n }\r\n\r\n vehicleSearchPredicate(vehicle: IVehicle, text: string): boolean {\r\n return vehicle.ShortReg.toLowerCase().includes(text.toLowerCase()) || vehicle.ShortReg.toLowerCase().includes(text.toLowerCase());\r\n }\r\n\r\n onNewVehicleAdded(vehicle: IVehicle): void {\r\n this.selectedVehicle = vehicle;\r\n this.amendedJobItem.VehicleId = vehicle.Id;\r\n this.amendedJobItem.vehicle = vehicle;\r\n this.setNoVehicle(false);\r\n this.cancelAddVehicle();\r\n this.vehicleAdd.emit(vehicle);\r\n }\r\n\r\n setNoVehicle(noVehicle: boolean): void {\r\n this.noVehicleAvailable = noVehicle;\r\n }\r\n\r\n cancelJobItem(cancel: boolean): void {\r\n if (!cancel) {\r\n return;\r\n }\r\n\r\n if (this.isLastJobItem) {\r\n this.lastJobItemCancelled.emit();\r\n return;\r\n }\r\n this.engineerJobItemService.closeEngineerJobItem(this.amendedJobItem).pipe(take(1)).subscribe();\r\n\r\n this.jobItemSaved.emit();\r\n }\r\n\r\n\r\n cancelAddVehicle(): void {\r\n this.showVehicleAddForm = false;\r\n }\r\n\r\n addCommission(): void {\r\n this.navigationService.go(FoundationNavigationModule.NewCommissionWithBindings, { jobItemId: this.jobItem.Id, customerId: this.accountId });\r\n }\r\n\r\n reportIssue(): void {\r\n this.reportIssueClick.emit();\r\n }\r\n\r\n viewCommission(): void {\r\n if (!this.amendedJobItem.commission) {\r\n return;\r\n }\r\n\r\n this.navigationService.go(FoundationNavigationModule.ViewCommission, { commissionId: this.amendedJobItem.commission.Id });\r\n }\r\n\r\n get canSaveForm(): boolean {\r\n return this.amendedJobItem.Status === EngineerJobItemStatus.Incomplete\r\n && (!!this.selectedVehicle || this.noVehicleAvailable)\r\n && !this.saving;\r\n\r\n }\r\n\r\n get canMarkUnknown(): boolean {\r\n return (this.amendedJobItem.Type === EngineerJobItemType.Install\r\n || this.amendedJobItem.Type === EngineerJobItemType.Reinstall)\r\n && this.amendedJobItem.Status === EngineerJobItemStatus.Incomplete;\r\n }\r\n\r\n //--\r\n\r\n private setupForms(): void {\r\n this.setupJobItemEditorForm();\r\n this.setupVehicleAddForm();\r\n }\r\n\r\n private loadCommissions(): void {\r\n this.engineerCommissionService.getEngineerCommissions({ JobId: this.jobItem.JobId })\r\n .pipe(untilDestroyed(this))\r\n .subscribe(commissions => {\r\n this.amendedJobItem.commission = commissions.find(commission => commission.JobItemId == this.jobItem.Id);\r\n })\r\n }\r\n\r\n private mapPropertiesToAmendedJobItem(): void {\r\n this.amendedJobItem = { ...this.jobItem };\r\n this.selectedVehicle = this.jobItem.vehicle;\r\n\r\n if (!this.amendedJobItem.VehicleId && this.amendedJobItem.Id) {\r\n this.noVehicleAvailable = true;\r\n }\r\n }\r\n\r\n private setupJobItemEditorForm(): void {\r\n const instructions = this.amendedJobItem?.Comments || \"\";\r\n\r\n this.jobItemEditorForm = new FormGroup({\r\n 'Instructions': new FormControl(instructions)\r\n });\r\n\r\n this.jobItemEditorForm.statusChanges.pipe(untilDestroyed(this)).subscribe((status: string) => {\r\n if (status === \"INVALID\") {\r\n return;\r\n }\r\n\r\n this.amendedJobItem = {\r\n ...this.amendedJobItem,\r\n Comments: this.jobItemEditorForm.value.Instructions\r\n }\r\n });\r\n }\r\n\r\n private getData(): void {\r\n this.engineerJobService.getEngineerJob(this.jobItem.JobId).pipe(\r\n switchMap(job => {\r\n this.accountId = job.AccountId;\r\n return this.getVehicles(job.AccountId);\r\n })\r\n ).subscribe({\r\n next: () => {\r\n this.setupForms();\r\n this.vehiclesLoading = false;\r\n }\r\n });\r\n }\r\n\r\n private getVehicles(accountId: number): Observable {\r\n this.vehiclesLoading = true;\r\n return this.vehicleService.getVehiclesForAccount(accountId)\r\n .pipe(\r\n untilDestroyed(this),\r\n tap(vehicles => {\r\n this.vehicles = vehicles;\r\n })\r\n )\r\n }\r\n\r\n private setupVehicleAddForm(): void {\r\n this.vehicleAddForm = new FormGroup({\r\n \"Reg\": new FormControl(\"\", [Validators.required, CustomFormValidators.duplicateVehicle(this.vehicles)]),\r\n \"Make\": new FormControl(\"\"),\r\n \"Model\": new FormControl(\"\")\r\n });\r\n\r\n this.vehicleAddForm.statusChanges.pipe(untilDestroyed(this)).subscribe((status: string) => {\r\n if (status === \"INVALID\") {\r\n return;\r\n }\r\n\r\n this.vehicleToAdd = {\r\n ...this.vehicleToAdd,\r\n AccountId: this.accountId,\r\n Reg: this.vehicleAddForm.value.Reg,\r\n ShortReg: this.vehicleAddForm.value.Reg,\r\n Make: this.vehicleAddForm.value.Make,\r\n Model: this.vehicleAddForm.value.Model,\r\n }\r\n })\r\n }\r\n\r\n private getIsLastJobItem(): boolean {\r\n const openItems = this.allJobItems?.filter(jobItem => jobItem.Status === EngineerJobItemStatus.Incomplete);\r\n\r\n return openItems.length === 1;\r\n }\r\n}\r\n","module.exports = \"
info {{ \\\"JobItemList.DuplicateJob\\\" | translate : duplicateJobId }}
{{amendedJobItem.Id}} {{amendedJobItem.Status | enumAsString : engineerJobItemStatus : 'EngineerJobItemStatus'}} {{amendedJobItem.Type | enumAsString : engineerJobItemType : 'EngineerJobItemType'}}
{{\\\"EngineerJobs.FieldRequired\\\" | translate }}
{{item.ShortReg}} / {{item.Reg}}
edit
{{ 'Commissions.AddVehicle' | translate}} {{ 'EngineerJobs.VehicleNotKnown' | translate }}
{{ \\\"EngineerJobs.FieldRequired\\\" | translate }}
{{ amendedJobItem.Comments || 'N/A'}}
{{ 'EngineerJobs.NoCommissionFound' | translate }} {{ 'EngineerJobs.ViewCommission' | translate }} {{amendedJobItem.commission.CommissionNumber > 0 ? amendedJobItem.commission.CommissionNumber : amendedJobItem.commission.Id}}
{{ 'EngineerJobs.AddCommission' | translate }} {{ \\\"EngineerJobItemList.ReportIssue\\\" | translate }}
\";","import { Component, EventEmitter, forwardRef, Inject, Input, OnDestroy, OnInit, Output, TemplateRef, ViewChild } from '@angular/core';\r\nimport { VDialogRef } from '@app/directives/_layout/v-dialog/v-dialog-ref';\r\nimport { DialogService } from '@app/directives/_layout/v-dialog/v-dialog.service';\r\nimport { IVTableColumn } from '@app/directives/_layout/v-table/_models/IVTableColumn';\r\nimport { IVTableRow } from '@app/directives/_layout/v-table/_models/IVTableRow';\r\nimport { VTableService } from '@app/directives/_layout/v-table/_services/v-table.service';\r\nimport { IFilterBarTab } from '@app/directives/_resourceFilters/filter-bar/filter-bar.models';\r\nimport { FilterBarService } from '@app/directives/_resourceFilters/filter-bar/filter-bar.service';\r\nimport { SortDirection } from '@app/enum/SortDirection';\r\nimport { SortType } from '@app/enum/SortType';\r\nimport { IVehicle } from '@app/interfaces/IVehicle';\r\nimport { EngineerJobItemStatus, EngineerJobItemType } from '@app/main/modules/foundation/foundation.enums';\r\nimport { ICsvImportCompletionResultDTO, IEngineerCommission, IEngineerJob, IEngineerJobItem, IJobItemValidationResultDTO } from '@app/main/modules/foundation/foundation.interfaces';\r\nimport { EngineerCommissionService } from '@app/main/modules/foundation/_services/engineer-commission.service';\r\nimport { EngineerJobItemService } from '@app/main/modules/foundation/_services/engineer-job-item.service';\r\nimport { FoundationVehiclesService } from '@app/main/modules/foundation/_services/vehicle.service';\r\nimport { TranslationService } from '@app/services/translation.service';\r\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\r\nimport { combineLatest } from 'rxjs';\r\nimport { JobDetailsComponent } from '../job-details/job-details.component';\r\nimport './job-item-list.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'job-item-list',\r\n template: require('./job-item-list.component.html')\r\n})\r\nexport class JobItemListComponent implements OnInit {\r\n @Input() job: IEngineerJob;\r\n @Input() accountId: number;\r\n\r\n @Output() lastJobItemCancelled = new EventEmitter();\r\n @ViewChild('lastJobItemConfirmation') jobCloseConfirm: TemplateRef;\r\n //--\r\n\r\n jobItems: IEngineerJobItem[] = [];\r\n allOpenJobItems: IEngineerJobItem[] = [];\r\n selectedJobItem: IEngineerJobItem;\r\n\r\n commissions: IEngineerCommission[];\r\n\r\n filterTabs: IFilterBarTab[] = [];\r\n\r\n vehicles: IVehicle[];\r\n vehiclesMap: Map;\r\n\r\n duplicateJobId: number;\r\n\r\n loading: boolean;\r\n\r\n deleteConfirmSubjectTranslation = this.translationService.t('EngineerJobs.JobItem');\r\n\r\n EngineerJobItemType = EngineerJobItemType;\r\n EngineerJobItemStatus = EngineerJobItemStatus;\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n showIssueReporter: boolean;\r\n\r\n messageDialog: VDialogRef;\r\n\r\n\r\n constructor(\r\n @Inject(forwardRef(() => JobDetailsComponent)) private parent: JobDetailsComponent,\r\n private readonly dialogService: DialogService,\r\n private readonly engineerCommissionService: EngineerCommissionService,\r\n private readonly engineerJobItemService: EngineerJobItemService,\r\n private readonly filterBarService: FilterBarService,\r\n private readonly translationService: TranslationService,\r\n private readonly vehicleService: FoundationVehiclesService,\r\n private readonly vTableService: VTableService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.loadData(true);\r\n this.createTable();\r\n this.createTabs();\r\n this.parent.newJobItem.pipe(untilDestroyed(this)).subscribe(value => {\r\n\r\n this.selectedJobItem = {\r\n JobId: this.job.Id,\r\n Status: EngineerJobItemStatus.Incomplete,\r\n Comments: \"\"\r\n };\r\n })\r\n }\r\n\r\n\r\n selectJobItem(row: IVTableRow): void {\r\n this.selectedJobItem = row.data;\r\n }\r\n\r\n clearSelectedJobItem(): void {\r\n this.selectedJobItem = null;\r\n }\r\n\r\n onLastJobItemCancelled(): void {\r\n this.messageDialog = this.dialogService.open(this.jobCloseConfirm, undefined);\r\n }\r\n\r\n onNewVehicleAdded(vehicle: IVehicle): void {\r\n this.vehicles.push(vehicle);\r\n this.vehiclesMap.set(vehicle.Id, vehicle);\r\n }\r\n\r\n cancelRemove(): void {\r\n this.messageDialog?.close();\r\n }\r\n\r\n confirmRemove(): void {\r\n this.messageDialog?.close();\r\n this.selectedJobItem = null;\r\n this.lastJobItemCancelled.emit();\r\n }\r\n\r\n vehicleFilterPredicate(item: any, value?: IVehicle): boolean {\r\n // Try to find vehicle id\r\n if (item.VehicleId) {\r\n return item.VehicleId == value.Id;\r\n }\r\n\r\n if (item.vehicle) {\r\n return item.vehicle.Id == value.Id;\r\n }\r\n\r\n if (item.ShortReg) {\r\n return item.Id == value.Id;\r\n }\r\n\r\n // Dont know how to cope with this\r\n return false;\r\n }\r\n\r\n vehicleSearchPredicate = (vehicle: IVehicle, value?: any): boolean => {\r\n return vehicle.ShortReg.toLowerCase().indexOf(value) >= 0 || vehicle.Reg.toLowerCase().indexOf(value) >= 0;\r\n }\r\n\r\n checkForDuplicateJobItems(vehicle: IVehicle): void {\r\n if (!vehicle) {\r\n this.duplicateJobId = null;\r\n return;\r\n }\r\n const duplicate = this.allOpenJobItems.find(jobItem => jobItem.VehicleId === vehicle.Id);\r\n if (duplicate) {\r\n this.duplicateJobId = duplicate.JobId;\r\n return;\r\n }\r\n this.duplicateJobId = null;\r\n }\r\n\r\n onCsvModelsSaved(event: ICsvImportCompletionResultDTO): void {\r\n this.loading = true;\r\n const createdModels = JSON.parse(event.CreatedModels) as IJobItemValidationResultDTO[];\r\n\r\n if (!this.jobItems) {\r\n this.jobItems = [];\r\n }\r\n\r\n createdModels.forEach(created => {\r\n this.jobItems.push(created.EngineerJobItem);\r\n this.vehicles.push(created.Vehicle)\r\n })\r\n\r\n this.vehiclesMap = this.vehicleService.createVehicleMap(this.vehicles);\r\n this.mapVehiclesAndCommissionsToJobItems();\r\n\r\n this.loading = false;\r\n }\r\n\r\n onReportIssueClicked(): void {\r\n if (!this.selectedJobItem) {\r\n return;\r\n }\r\n\r\n this.openIssueReportSidebar();\r\n }\r\n\r\n onCloseIssueReporter(): void {\r\n this.closeIssueReportSidebar();\r\n }\r\n\r\n //--\r\n\r\n private loadData(loading = false): void {\r\n if (!this.job?.Id) {\r\n return;\r\n }\r\n this.loading = loading;\r\n\r\n\r\n combineLatest([\r\n this.engineerJobItemService.getAllEngineerJobItems(),\r\n this.vehicleService.getVehiclesForAccount(this.accountId),\r\n this.engineerCommissionService.getEngineerCommissions({ JobId: this.job.Id })\r\n ]).pipe(untilDestroyed(this))\r\n .subscribe(([jobItems, vehicles, commissions]) => {\r\n this.jobItems = jobItems.filter(jobItem => jobItem.JobId === this.job.Id);\r\n this.allOpenJobItems = jobItems.filter(jobItem => jobItem.Status === EngineerJobItemStatus.Incomplete)\r\n this.vehicles = vehicles;\r\n\r\n this.vehiclesMap = this.vehicleService.createVehicleMap(vehicles);\r\n this.commissions = commissions;\r\n\r\n this.mapVehiclesAndCommissionsToJobItems();\r\n this.loading = false;\r\n });\r\n }\r\n \r\n private renderTable(): void {\r\n this.createTabs();\r\n this.tableRows = this.vTableService.createTableRows(this.jobItems, this.tableColumns);\r\n }\r\n\r\n private mapVehiclesAndCommissionsToJobItems(): void {\r\n if (!this.vehiclesMap || !this.jobItems) {\r\n return;\r\n }\r\n\r\n this.jobItems.forEach(jobItem => {\r\n jobItem.vehicle = this.vehiclesMap.get(jobItem.VehicleId);\r\n jobItem.commission = this.commissions.find(commission => commission.JobItemId === jobItem.Id);\r\n })\r\n\r\n this.renderTable();\r\n }\r\n\r\n private openIssueReportSidebar(): void {\r\n this.showIssueReporter = true;\r\n }\r\n\r\n private closeIssueReportSidebar(): void {\r\n this.showIssueReporter = false;\r\n this.selectedJobItem = null;\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ title: \"ID\", width: 100, sorted: true, sortType: SortType.Number, sortDirection: SortDirection.Descending }),\r\n createCellFunction: (jobItem) => this.vTableService.createTableCell(jobItem.Id)\r\n },\r\n {\r\n header: this.vTableService.createVehicleTableHeader(),\r\n createCellFunction: (jobItem) => this.vTableService.createVehicleRegCell(jobItem.vehicle)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"EngineerJobs.JobItemType\" }),\r\n createCellFunction: (jobItem) => this.vTableService.createEnumCell(EngineerJobItemType, \"EngineerJobItemType\", jobItem.Type)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Status\" }),\r\n createCellFunction: (jobItem) => this.vTableService.createEnumCell(EngineerJobItemStatus, \"EngineerJobItemStatus\", jobItem.Status)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"EngineerJobs.Instructions\" }),\r\n createCellFunction: (jobItem) => this.vTableService.createTableCell(jobItem.Comments)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"EngineerJobs.Commission\" }),\r\n createCellFunction: (jobItem) => this.vTableService.createTableCell(jobItem.commission?.CommissionNumber == 0 ? jobItem.commission?.Id : jobItem.commission?.CommissionNumber)\r\n }\r\n ]\r\n }\r\n\r\n private createTabs(): void {\r\n this.filterTabs = [];\r\n\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"EngineerJobs.Active\", (jobItem) => jobItem.Status === EngineerJobItemStatus.Incomplete));\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"EngineerJobs.Closed\", (jobItem) => jobItem.Status !== EngineerJobItemStatus.Incomplete));\r\n }\r\n}\r\n","module.exports = \"
{{ \\\"EngineerJobItemList.ReportIssue\\\" | translate }}

{{ 'EngineerJobs.CancelJobItem' | translate }}

{{ 'EngineerJobs.ConfirmJobCloseMessage' | translate : jobId }}
{{ \\\"Common.No\\\" | translate }} {{ \\\"Common.Yes\\\" | translate }}
\";","import { Component, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output, ViewChild } from \"@angular/core\";\r\nimport { VAutocompleteComponent } from \"@app/directives/_forms/v-autocomplete/v-autocomplete.component\";\r\nimport { IPill } from \"@app/directives/_veri/v-pills/v-pills.component\";\r\nimport { IUser } from \"@app/interfaces/IUser\";\r\nimport { Subject } from \"rxjs\";\r\nimport { takeUntil } from \"rxjs/operators\";\r\nimport { EngineerService } from \"../../../_services/engineer.service\";\r\nimport './engineer-select.component.scss';\r\n\r\n@Component({\r\n selector: \"engineer-select\",\r\n template: require(\"./engineer-select.component.html\")\r\n})\r\nexport class EngineerSelectComponent implements OnInit, OnChanges, OnDestroy {\r\n @Input() selectedEngineers: IUser[] = [];\r\n @Input() disabled: boolean;\r\n @Input() resellerId: number;\r\n @Input() titleKey: string = 'EngineerJobs.AssignEngineer';\r\n @Output() selectionChanged = new EventEmitter();\r\n\r\n allEngineers: IUser[];\r\n availableEngineers: IUser[];\r\n loading: boolean = true;\r\n engineerPills: IPill[] = [];\r\n\r\n @ViewChild('engineerAutocomplete') dropdown: VAutocompleteComponent;\r\n\r\n private destroy$ = new Subject();\r\n constructor(\r\n private readonly engineerService: EngineerService) { }\r\n\r\n ngOnInit(): void {\r\n this.load();\r\n }\r\n\r\n ngOnChanges(): void {\r\n this.renderPills();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.unsubscribe();\r\n }\r\n\r\n onEngineerClicked(engineer: IUser): void {\r\n if (this.disabled) {\r\n return;\r\n }\r\n this.dropdown?.clearInput();\r\n\r\n this.addPill(engineer);\r\n\r\n this.selectedEngineers = this.engineerPills.map(pill => {\r\n return pill.data;\r\n });\r\n\r\n const engineerIndex = this.availableEngineers.findIndex(eng => eng.Id == engineer.Id);\r\n\r\n this.availableEngineers.splice(engineerIndex, 1);\r\n\r\n this.selectionChanged.emit(this.selectedEngineers);\r\n }\r\n\r\n onEngineerRemoved(pill: IPill): void {\r\n if (this.disabled) {\r\n return;\r\n }\r\n const engineer = pill.data;\r\n const selectedEngineerIndex = this.selectedEngineers.findIndex(eng => eng.Id === engineer.Id);\r\n\r\n if (selectedEngineerIndex < 0) {\r\n this.renderPills();\r\n return;\r\n }\r\n\r\n this.availableEngineers.push(engineer);\r\n\r\n this.selectedEngineers.splice(selectedEngineerIndex, 1);\r\n this.renderPills();\r\n this.selectionChanged.emit(this.selectedEngineers);\r\n }\r\n\r\n engineerSearchPredicate(engineer: IUser, text: string): boolean {\r\n return engineer.Description?.toLowerCase().includes(text.toLowerCase());\r\n }\r\n\r\n //--\r\n\r\n private load(): void {\r\n this.renderPills();\r\n this.loadEngineers();\r\n }\r\n\r\n private loadEngineers(): void {\r\n this.loading = true;\r\n this.engineerService.getEngineers().pipe(takeUntil(this.destroy$)).subscribe(engineers => {\r\n const filteredEngineers = !!this.resellerId ?\r\n engineers.filter(engineer => engineer.ResellerIds.some(r => r === this.resellerId)) :\r\n engineers.filter(engineer => !engineer.ResellerIds?.any());\r\n\r\n this.allEngineers = filteredEngineers;\r\n\r\n this.availableEngineers = this.allEngineers.filter(engineer => {\r\n return engineer.IsActive && !this.selectedEngineers.find(eng => eng.Id == engineer.Id);\r\n });\r\n\r\n this.loading = false;\r\n })\r\n }\r\n\r\n private renderPills(): void {\r\n this.engineerPills = [];\r\n if (!this.selectedEngineers) {\r\n return;\r\n }\r\n\r\n this.selectedEngineers.forEach(engineer => {\r\n this.addPill(engineer);\r\n })\r\n }\r\n\r\n private addPill(engineer: IUser): void {\r\n if (!!this.engineerPills.find(pill => pill.data.Id === engineer.Id)) {\r\n return;\r\n }\r\n this.engineerPills.push({\r\n data: engineer,\r\n label: engineer.Description,\r\n icon: 'close'\r\n })\r\n }\r\n}\r\n","module.exports = \"
{{item.Description}}
\";","module.exports = \" {{item.Description}}
{{ 'EngineerJobs.FieldRequired' | translate }}
{{ selectedEngineer?.Description }}
{{ visitFailureRecord?.CustomerAdvisor || '--' }} {{ visitFailureRecord?.EngineerReason }} {{ 'EngineerJobItemList.ChargeableLabel' | translate}}
\";","module.exports = \"
{{ \\\"EngineerJobItemList.Commission\\\" | translate }}

{{job.Id}} : {{job.account?.CompanyName}}
{{ \\\"EngineerJobItemList.JobAvailability\\\" | translate }}: {{job.jobAvailability?.startTime | vDate}} - {{job.jobAvailability?.endTime | vDate}}
{{ \\\"Common.Description\\\" | translate }}:
{{ \\\"EngineerJobItemList.Instructions\\\" | translate }}:

{{jobItem.Id}} : {{jobItem.Type | enumAsString : engineerJobItemType : 'EngineerJobItemType'}}

{{'Common.Notes' | translate}}

{{ \\\"EngineerJobItemList.Commission\\\" | translate }} {{ \\\"EngineerJobItemList.ReportIssue\\\" | translate }}
{{ \\\"EngineerJobItemList.ReportIssue\\\" | translate }} {{ 'VisitFailures.JobId' | translate }}: {{ selectedJob.Id }}
\";","import { Component, EventEmitter, Input, OnChanges, Output } from \"@angular/core\";\r\nimport { AbstractControl, AsyncValidatorFn, FormControl, FormGroup, ValidationErrors, ValidatorFn, Validators } from \"@angular/forms\";\r\nimport { CustomFormValidators } from \"@app/directives/_forms/form-validation.service\";\r\nimport { IUser } from \"@app/interfaces/IUser\";\r\nimport { CurrentUserService } from \"@app/services/currentUser.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { combineLatest, from, Observable, of } from \"rxjs\";\r\nimport { map, take } from \"rxjs/operators\";\r\nimport { IReseller } from \"../../../_models/IReseller\";\r\nimport { IUserGroup } from \"../../../_models/IUserGroup\";\r\nimport { AccountService } from \"../../../_services/account.service\";\r\nimport { EngineerService } from \"../../../_services/engineer.service\";\r\nimport { UserGroupService } from \"../../../_services/user-group.service\";\r\nimport { UserService } from \"../../../_services/user.service\";\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: \"engineer-editor\",\r\n template: require(\"./engineer-editor.component.html\")\r\n})\r\nexport class EngineerEditorComponent implements OnChanges {\r\n @Input() engineer: IUser;\r\n\r\n @Output() engineerSaved = new EventEmitter();\r\n\r\n groups: IUserGroup[];\r\n\r\n hasReseller: boolean;\r\n selectedResellerId: number;\r\n resellers: IReseller[];\r\n\r\n engineerEditorForm: FormGroup;\r\n saving: boolean;\r\n\r\n currentUser: IUser;\r\n\r\n constructor(\r\n private readonly engineerService: EngineerService,\r\n private readonly userGroupService: UserGroupService,\r\n private readonly userService: UserService,\r\n private readonly currentUserService: CurrentUserService,\r\n private readonly accountService: AccountService) { }\r\n \r\n ngOnChanges(): void {\r\n this.loadData();\r\n }\r\n\r\n saveEngineer(): void {\r\n this.saving = true;\r\n\r\n this.engineerService.saveEngineer(this.engineer).pipe(take(1)).subscribe(user => {\r\n this.engineerSaved.emit(user);\r\n this.saving = false;\r\n });\r\n }\r\n\r\n groupSearchPredicate(group: IUserGroup, text: string): boolean {\r\n return group.Description.toLowerCase().includes(text.toLowerCase());\r\n }\r\n\r\n onGroupSelected(group: IUserGroup): void {\r\n if (!group) {\r\n return;\r\n }\r\n this.engineerEditorForm.get(\"UserGroupId\").setValue(group.Id);\r\n }\r\n\r\n setHasReseller(hasReseller: boolean): void {\r\n if (!hasReseller) {\r\n this.selectedResellerId = null;\r\n this.engineerEditorForm.get(\"ResellerIds\").setValue([]);\r\n }\r\n\r\n this.engineerEditorForm.get(\"HasReseller\").setValue(hasReseller);\r\n this.hasReseller = hasReseller;\r\n }\r\n\r\n onResellerSelectChange(resellerId: number): void {\r\n this.selectedResellerId = resellerId;\r\n this.engineerEditorForm.get(\"ResellerIds\").setValue([resellerId]);\r\n }\r\n\r\n get formIsValid(): boolean {\r\n return this.engineerEditorForm.valid;\r\n }\r\n\r\n get userGroupId(): number {\r\n return this.engineerEditorForm.value.UserGroupId;\r\n }\r\n\r\n get EmailExistsValidator(): AsyncValidatorFn {\r\n return (control: AbstractControl): Observable => {\r\n if (this.currentUser.Email.toLowerCase() == (control.value as string).toLowerCase()) {\r\n return of({ emailAlreadyExists: true })\r\n }\r\n\r\n return this.userService.emailExists(control.value)\r\n .pipe(map((result: boolean) => result ? { emailAlreadyExists: true } : null));\r\n };\r\n }\r\n\r\n //--\r\n\r\n private loadData(): void {\r\n if (!this.engineer || this.engineerEditorForm) {\r\n return;\r\n }\r\n\r\n this.setupForm(this.engineer);\r\n\r\n combineLatest([\r\n this.userGroupService.getUserGroups(),\r\n from(this.currentUserService.getCurrentUser() as Promise),\r\n this.accountService.getResellers()\r\n ]).pipe(\r\n untilDestroyed(this)\r\n ).subscribe(([groups, currentUser, resellers]) => {\r\n this.groups = groups;\r\n this.currentUser = currentUser;\r\n this.resellers = resellers;\r\n this.hasReseller = !!this.engineer.ResellerIds?.any() || this.currentUser.IsReseller;\r\n this.engineerEditorForm.get(\"HasReseller\").setValue(this.hasReseller);\r\n this.selectedResellerId = this.engineer.ResellerIds?.firstOrDefault();\r\n });\r\n }\r\n\r\n private setupForm(engineer: IUser): void {\r\n this.engineerEditorForm = new FormGroup({\r\n 'Name': new FormControl(engineer.Description, [Validators.required, CustomFormValidators.emptyWhiteSpace]),\r\n 'Email': new FormControl(engineer.Email, [Validators.required, Validators.email], !!engineer.Id ? null : [this.EmailExistsValidator]),\r\n 'UserGroupId': new FormControl(engineer.UserGroupId),\r\n 'HasReseller': new FormControl(engineer.IsReseller ?? false),\r\n 'ResellerIds': new FormControl(engineer.ResellerIds ?? [])\r\n }, [this.validateIfHasReseller()]);\r\n\r\n this.engineerEditorForm.statusChanges.pipe(untilDestroyed(this)).subscribe((status: string) => {\r\n if (status === \"INVALID\" || !this.currentUser) {\r\n return;\r\n }\r\n\r\n this.engineer = {\r\n ...this.engineer,\r\n Description: this.engineerEditorForm.value.Name,\r\n Email: this.engineerEditorForm.value.Email,\r\n ResellerIds: this.engineerEditorForm.value.ResellerIds,\r\n IsReseller: !!this.engineerEditorForm.value.ResellerIds?.length,\r\n UserGroupId: this.engineerEditorForm.value.UserGroupId\r\n }\r\n });\r\n }\r\n\r\n validateIfHasReseller(): ValidatorFn {\r\n return (form: FormGroup): ValidationErrors | null => {\r\n const hasReseller = form.get('HasReseller').value;\r\n const resellerIds = form.get('ResellerIds').value;\r\n\r\n return hasReseller && !resellerIds.any() ? { 'noReseller': true } : null;\r\n }\r\n }\r\n}\r\n","module.exports = \" {{ 'Common.AssignToReseller' | translate }}
{{\\\"FormValidationService.Required\\\" | translate}}
{{item.Description}}
\";","module.exports = \" {{ 'EngineerUsers.AddParentCompany' | translate }} {{ 'EngineerUsers.ImportEngineers' | translate }} {{ \\\"EngineerUsers.NewEngineer\\\" | translate }} 0 ? ('EngineerUsers.EditEngineer' | translate) : ('EngineerUsers.NewEngineer' | translate) }}\\\">
{{\\\"FormValidationService.Required\\\" | translate}}
{{ 'Common.AssignToReseller' | translate }}
{{\\\"FormValidationService.Required\\\" | translate}}

{{ \\\"UserEditor.ResetPassword\\\" | translate }}?

{{ \\\"UserEditor.PasswordInformation\\\" | translate }}

{{ \\\"Common.Cancel\\\" | translate }} {{ \\\"Common.Confirm\\\" | translate }}
\";","import { CommonModule } from \"@angular/common\";\r\nimport { CUSTOM_ELEMENTS_SCHEMA, NgModule, NO_ERRORS_SCHEMA } from \"@angular/core\";\r\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\r\nimport { VTableModule } from \"@app/directives/_layout/v-table/v-table.module\";\r\nimport { MapDirectivesModule } from \"@app/directives/_map/_map.directives.module\";\r\nimport { ResourceFiltersDirectivesModule } from \"@app/directives/_resourceFilters/_resourceFilters.directives.module\";\r\nimport { ResourceManagementModule } from \"@app/main/components/resourceManagement/resourceManagement.module\";\r\nimport { CameraModule } from \"@app/main/modules/cameras/camera.module\";\r\nimport { P100DeviceDetails } from \"@app/main/modules/foundation/_routes/hardware/peripherals/p100-device-details/p100-device-details.component\";\r\nimport { StreamaxDeviceDetail } from \"@app/main/modules/foundation/_routes/hardware/peripherals/streamax-device-details/streamax-device-details.component\";\r\nimport { CoreDirectivesModule } from \"@directives/_core/_core.directives.module\";\r\nimport { FormsDirectivesModule } from \"@directives/_forms/_form.directives.module\";\r\nimport { LayoutDirectivesModule } from \"@directives/_layout/_layout.directives.module\";\r\nimport { MiscDirectivesModule } from \"@directives/_misc/_misc.directives.module\";\r\nimport { VeriDirectivesModule } from \"@directives/_veri/_veri.directives.module\";\r\nimport { PipesModule } from \"src/app/_pipes/_pipes.module\";\r\nimport { VehicleDirectivesModule } from \"../../../../../directives/_vehicle/_vehicle.directives.module\";\r\nimport { FoundationComponentsModule } from \"../../_components/components.modules\";\r\nimport { CommissionModule } from \"../commissions/commission.module\";\r\nimport { CameraEventsComponent } from \"./peripherals/camera-events/camera-events.component\";\r\nimport { CameraLogsComponent } from \"./peripherals/camera-logs/camera-logs.component\";\r\nimport { CameraVideoViewComponent } from \"./peripherals/camera-videos/camera-videos-view/camera-video-view.component\";\r\nimport { CameraVideosComponent } from \"./peripherals/camera-videos/camera-videos.component\";\r\nimport { CameraViewComponent } from \"./peripherals/camera-view/camera-view.component\";\r\nimport { GpsDetailComponent } from \"./peripherals/gps-detail/gps-detail.component\";\r\nimport { PeripheralDeviceDetails } from \"./peripherals/peripheral-device-details/peripheral-device-details.component\";\r\nimport { PeripheralListComponent } from \"./peripherals/peripheral-list/peripheral-list.component\";\r\nimport { PeripheralViewComponent } from \"./peripherals/peripheral-view/peripheral-view.component\";\r\nimport { PulseMessageDetailComponent } from \"./peripherals/pulse/pulse-message-detail/pulse-message-detail.component\";\r\nimport { PulseMessagesComponent } from \"./peripherals/pulse/pulse-messages.component\";\r\nimport { PulseResponseComponent } from \"./peripherals/pulse/pulse-response/pulse-response.component\";\r\nimport { SimDetailComponent } from \"./sim/sim-detail/sim-detail.component\";\r\nimport { SimListComponent } from \"./sim/sim-list/sim-list.component\";\r\nimport { SimUnitSummaryComponent } from \"./sim/sim-unit-summary/sim-unit-summary.component\";\r\nimport { UnitListComponent } from \"./units/unit-list/unit-list.component\";\r\nimport { UnitLogsComponent } from \"./units/unit-logs/unit-logs.component\";\r\nimport { UnitOverviewComponent } from \"./units/unit-view/unit-overview/unit-overview.component\";\r\nimport { UnitPlotsComponent } from \"./units/unit-view/unit-plots/unit-plots.component\";\r\nimport { UnitViewComponent } from \"./units/unit-view/unit-view.component\";\r\n\r\nconst privateComponents: any[] = [\r\n];\r\n\r\nconst publicComponents: any[] = [\r\n UnitListComponent,\r\n PeripheralListComponent,\r\n UnitViewComponent,\r\n PeripheralViewComponent,\r\n CameraViewComponent,\r\n UnitOverviewComponent,\r\n UnitLogsComponent,\r\n UnitPlotsComponent,\r\n SimUnitSummaryComponent,\r\n PeripheralDeviceDetails,\r\n PulseMessagesComponent,\r\n PulseMessageDetailComponent,\r\n PulseResponseComponent,\r\n StreamaxDeviceDetail, \r\n P100DeviceDetails,\r\n CameraLogsComponent,\r\n CameraEventsComponent,\r\n GpsDetailComponent,\r\n SimListComponent,\r\n SimDetailComponent,\r\n CameraVideosComponent,\r\n CameraVideoViewComponent\r\n];\r\n\r\nconst declarations: any[] = [\r\n];\r\n\r\nconst providers: any[] = [\r\n\r\n];\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n PipesModule,\r\n FormsModule,\r\n FormsDirectivesModule,\r\n ReactiveFormsModule,\r\n VeriDirectivesModule,\r\n VehicleDirectivesModule,\r\n MiscDirectivesModule,\r\n LayoutDirectivesModule,\r\n CoreDirectivesModule,\r\n VTableModule,\r\n ResourceFiltersDirectivesModule,\r\n ResourceManagementModule,\r\n FoundationComponentsModule,\r\n MapDirectivesModule,\r\n CommissionModule,\r\n CameraModule\r\n ],\r\n providers: providers,\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents, ...declarations],\r\n exports: [...publicComponents, ...declarations],\r\n schemas: [CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA]\r\n})\r\nexport class HardwareModule {\r\n constructor() {\r\n }\r\n}\r\n","module.exports = \"
{{ 'requestVideo.VideoLengthTrimmedSecondaryLabel' | translate }}

{{'requestVideo.SelectedChannels' | translate : [selectedChannels?.length, streamingChannels?.length] }} edit

{{ \\\"RequestVideoForm.DownloadQuality\\\" | translate }}

{{ \\\"RequestVideoForm.QualityDescription\\\" | translate }}
\";","module.exports = \"
{{ i + 1}}:00
{{ selectedTime && (selectedTime | vDate: {timeOnly: true}) }} {{ selectedSection?.label || ('requestVideoActivityChart.offline' | translate) }}
{{ hoveredTime | vDate: {timeOnly: true} }} {{ hoveredSection?.label }}
\";","module.exports = \" \";","module.exports = \"
{{'videos.videoDownloaded' | translate}}
\";","module.exports = \"
{{signalType}} \";","module.exports = \" {{ 'DownloadQuality.HighQuality' | translate }} ({{ 'DownloadQuality.Unavailable' | translate }}) {{ 'DownloadQuality.StandardQuality' | translate }} ({{ 'DownloadQuality.Unavailable' | translate }}) \";","module.exports = \"
{{label}}
\";","module.exports = \"
{{ 'VideoDownloadList.Requested' | translate }}
{{ 'VideoRequestStatus.Retrieving' | translate }}
{{ 'VideoRequestStatus.Downloading' | translate }}
{{ 'VideoRequestStatus.Complete' | translate }}
{{ 'VideoRequestStatus.Faceblurring' | translate }}
\";","module.exports = \" {{ driver.Name }} {{ 'DriverSummaryPanel.NoDriver' | translate }} ... \";","module.exports = \" {{ event.translatedString }} {{ 'VideoDownloadList.VideoRequestTitle' | translate }} - {{ selectedVideoEntry.displayEventCode }} {{videoRequestStatus.detailedStatus}} \";","module.exports = \"
{{'Videos.New' | translate}}
play_circle_outline
{{video.displayEventCode}} Event
{{video.VideoStartTime | veriDate: \\\"fulldatetime\\\" }}
access_time {{video.duration}}
\";","import { VideoEventCode } from \"../enums/VideoEventCode\";\r\n\r\nexport class VideoEventCodeGroups {\r\n static lowRiskCodes = [VideoEventCode.LowShock, VideoEventCode.LaneDeparture];\r\n\r\n static mediumRiskCodes = [\r\n VideoEventCode.MediumShock,\r\n VideoEventCode.Pedestrian,\r\n VideoEventCode.DriverDistraction,\r\n VideoEventCode.DriverFatigue,\r\n VideoEventCode.DriverYawn, VideoEventCode.Speed,\r\n VideoEventCode.BlindSpot\r\n ];\r\n\r\n static highRiskCodes = [\r\n VideoEventCode.HighShock,\r\n VideoEventCode.Braking,\r\n VideoEventCode.Turning,\r\n VideoEventCode.Acceleration,\r\n VideoEventCode.DriverOnPhone,\r\n VideoEventCode.Collision,\r\n VideoEventCode.VehicleTooClose,\r\n VideoEventCode.NoSeatBelt\r\n ];\r\n\r\n static urgentRiskCodes = [VideoEventCode.Button];\r\n\r\n static dmsEventCodes = [\r\n VideoEventCode.DriverOnPhone,\r\n VideoEventCode.DriverFatigue,\r\n VideoEventCode.DriverYawn,\r\n VideoEventCode.DriverSmoking,\r\n VideoEventCode.DriverDistraction,\r\n VideoEventCode.DriverAbsent,\r\n VideoEventCode.NoSeatBelt\r\n ];\r\n\r\n static adasEventCodes = [\r\n VideoEventCode.LaneDeparture,\r\n VideoEventCode.Collision,\r\n VideoEventCode.VehicleTooClose,\r\n VideoEventCode.BlindSpot,\r\n VideoEventCode.Pedestrian\r\n ];\r\n}","module.exports = \"
\";","module.exports = \"
0\\\">
{{video.VideoStartTime | veriDate :'date'}}
\";","import { Component, EventEmitter, Input, Output, SimpleChanges } from \"@angular/core\";\r\nimport { ITimelineEntry } from \"@app/directives/_veri/v-timeline/v-timeline.component\";\r\nimport { IGoogleMapsMarker } from \"@app/interfaces/IGoogleMapsMarkerOptions\";\r\nimport { VideoStatus } from \"@app/main/components/videos/enums/VideoStatus\";\r\nimport { IVideoEntry } from \"@app/main/components/videos/models/IVideoEntry\";\r\nimport { VideoEntryService } from \"@app/main/components/videos/services/video-entry.service\";\r\nimport { VideoEntryUtils } from \"@app/main/components/videos/utils/video-entry-utils\";\r\nimport { GeocodeService } from \"@app/services/geocode.service\";\r\nimport { MapService } from \"@app/services/map.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { timer } from \"rxjs\";\r\nimport { RequestStep } from \"../video-download-progress/video-download-progress.component\";\r\nimport './video-request-status.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'video-request-status',\r\n template: require('./video-request-status.component.html')\r\n})\r\nexport class VideoRequestStatusComponent {\r\n @Input() videoEntry: IVideoEntry;\r\n @Output() videoOpen: EventEmitter = new EventEmitter();\r\n @Output() downloadComplete: EventEmitter = new EventEmitter();\r\n\r\n //--\r\n\r\n videoMarker: IGoogleMapsMarker;\r\n downloadedChannelsCount: number;\r\n currentStep: number;\r\n detailedStatus: string = this.translationService.t(\"VideoRequestStatus.VideoRequested\");\r\n videosAvailable: boolean;\r\n statusIcon: string = 'downloading';\r\n showProgressBar = true;\r\n timelineEntries: ITimelineEntry[] = [];\r\n auditEntries: ITimelineEntry[] = [];\r\n\r\n VideoStatus = VideoStatus;\r\n loadingLocation: boolean;\r\n\r\n constructor(\r\n private readonly geocodeService: GeocodeService,\r\n private readonly mapService: MapService,\r\n private readonly translationService: TranslationService,\r\n private readonly videoEntryService: VideoEntryService) { }\r\n\r\n\r\n ngOnInit(): void {\r\n this.loadData();\r\n timer(0, 20_000)\r\n .pipe(untilDestroyed(this))\r\n .subscribe(() => this.updateVideoEntry());\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n this.getDownloadedChannelsCount();\r\n }\r\n\r\n\r\n openDownloadedVideo(): void {\r\n this.videoOpen.emit(this.videoEntry);\r\n }\r\n\r\n onStatusChanged(status: RequestStep): void {\r\n this.updateDetailedStatus(status);\r\n this.updateVideoEntry();\r\n }\r\n\r\n //--\r\n\r\n private loadData(): void {\r\n this.createMarkerFromVideoLocation();\r\n this.getDownloadedChannelsCount();\r\n this.updateVideoEntry();\r\n this.checkForErrors();\r\n }\r\n\r\n private updateVideoEntry(): void {\r\n this.videoEntryService.getVideoEntry(this.videoEntry.Id).then(videoEntry => {\r\n this.videoEntry = {\r\n ...this.videoEntry,\r\n ExternalId: videoEntry.ExternalId\r\n\r\n }\r\n });\r\n }\r\n\r\n\r\n private createMarkerFromVideoLocation(): void {\r\n if (!this.videoEntry.Latitude || !this.videoEntry.Longitude) {\r\n this.videoMarker = null;\r\n return;\r\n }\r\n let label: string = \"\";\r\n\r\n this.loadingLocation = true;\r\n\r\n this.geocodeService.getLocationInformationFromVideo(this.videoEntry.Id).then(location => {\r\n label = location.LocationDescription;\r\n this.videoMarker = this.mapService.createMapMarker({\r\n Latitude: this.videoEntry.Latitude,\r\n Longitude: this.videoEntry.Longitude\r\n }, { showLabel: true, label: label })\r\n }).finally(() => {\r\n this.loadingLocation = false;\r\n });\r\n }\r\n\r\n private getDownloadedChannelsCount(): void {\r\n if (!this.videoEntry) {\r\n return;\r\n }\r\n\r\n this.downloadedChannelsCount = 0;\r\n\r\n this.videoEntry.channelMedia.forEach(channel => {\r\n if (channel.mp4VideoUrl) {\r\n this.downloadedChannelsCount++;\r\n }\r\n })\r\n }\r\n\r\n private updateDetailedStatus(status: RequestStep): void {\r\n this.detailedStatus = this.translationService.t(\"VideoRequestStatus.VideoRequested\");\r\n this.showProgressBar = true;\r\n\r\n switch (status) {\r\n case RequestStep.Requested:\r\n this.detailedStatus = this.translationService.t(\"VideoRequestStatus.VideoRequested\");\r\n break;\r\n\r\n case RequestStep.Retrieving:\r\n this.detailedStatus = this.translationService.t(\"VideoRequestStatus.UploadingFootage\");\r\n this.statusIcon = \"upload_file\";\r\n break;\r\n\r\n case RequestStep.Downloading:\r\n this.detailedStatus = this.translationService.t(\"VideoRequestStatus.DownloadingFootage\");\r\n this.statusIcon = \"downloading\";\r\n break;\r\n\r\n case RequestStep.Complete:\r\n this.detailedStatus = this.translationService.t(\"VideoRequestStatus.VideosAvailable\");\r\n this.statusIcon = \"check_circle\";\r\n this.downloadComplete.emit();\r\n break;\r\n\r\n case RequestStep.Faceblurring:\r\n this.detailedStatus = this.translationService.t(\"VideoRequestStatus.Faceblurring\");\r\n this.statusIcon = \"published_with_changes\";\r\n break;\r\n }\r\n\r\n this.checkForErrors();\r\n }\r\n\r\n private checkForErrors(): void {\r\n\r\n if (VideoEntryUtils.hasNoFootage(this.videoEntry)) {\r\n this.detailedStatus = this.translationService.t(\"VideoRequestStatus.NoFootageOrFiles\");\r\n this.statusIcon = \"cloud_off\";\r\n this.showProgressBar = false;\r\n return;\r\n }\r\n\r\n if (VideoEntryUtils.isDownloadFailed(this.videoEntry)) {\r\n this.detailedStatus = this.translationService.t(\"VideoRequestStatus.ErrorGettingVideos\");\r\n this.statusIcon = \"highlight_off\";\r\n this.showProgressBar = false;\r\n return;\r\n }\r\n\r\n if (!this.videoEntry.vehicle?.onlineStatus?.online && !VideoEntryUtils.isRequestComplete(this.videoEntry)) {\r\n this.detailedStatus = this.translationService.t(\"VideoRequestStatus.WaitingForCamera\");\r\n this.statusIcon = \"videocam_off\";\r\n this.showProgressBar = true;\r\n return;\r\n }\r\n }\r\n}\r\n","module.exports = \"
{{ 'ValidationCheckContainer.NoLocationAvailable' | translate }}
{{ 'VideoRequestStatus.FootageDate' | translate }}
{{ videoEntry.VideoStartTime | vDate : {dateTime:true} }}
{{ 'VideoRequestStatus.FootageDuration' | translate }}
{{ videoEntry.duration }}
{{ detailedStatus }} {{ statusIcon }}
{{ downloadedChannelsCount }}/{{ videoEntry.MetaData.ChannelsRequested.length || 1 }} {{ 'VideoRequestStatus.ChannelsDownloaded' | translate }} {{ videoEntry.DateRequested | vDate : {dateTime: true} }} ({{ videoEntry.DateRequested | relativeTime }})
\";","import { Component, EventEmitter, Input, OnInit, Output } from \"@angular/core\";\r\nimport { ProgressColourPalette } from \"@app/directives/_misc/v-progress-bar/v-progress-bar.component\";\r\nimport { IGoogleMapsMarker } from \"@app/interfaces/IGoogleMapsMarkerOptions\";\r\nimport { IPeripheral } from \"@app/interfaces/IPeripheral\";\r\nimport { IVehicleWithCameraMappings } from \"@app/main/components/resourceManagement/cameras/camera-vehicles-manager/camera-vehicles-manager.component\";\r\nimport { CameraChannelType } from \"@app/main/components/videos/enums/CameraChannelType\";\r\nimport { ICameraChannel } from \"@app/main/components/videos/models/ICameraChannel\";\r\nimport { CameraChannelService } from \"@app/main/modules/cameras/_services/camera-channels.service\";\r\nimport { ISimStatus } from \"@app/main/modules/foundation/_models/ISimStatus\";\r\nimport { CommServerRequestState } from \"@app/main/modules/foundation/_routes/hardware/_enums/CommServerRequestState\";\r\nimport { IPeripheralMetadata } from \"@app/main/modules/foundation/_routes/hardware/_models/IPeripheralMetadata\";\r\nimport { CameraAppType, ICameraApp } from \"@app/main/modules/foundation/_routes/rv-lite/application/_models/ICameraApp\";\r\nimport { CameraAppService } from \"@app/main/modules/foundation/_routes/rv-lite/application/_services/camera-app.service\";\r\nimport { ICameraConfiguration } from \"@app/main/modules/foundation/_routes/rv-lite/config/_models/ICameraConfiguration\";\r\nimport { ConfigManagerService } from \"@app/main/modules/foundation/_routes/rv-lite/config/_services/config.service\";\r\nimport { PeripheralService } from \"@app/main/modules/foundation/_services/peripheral.service\";\r\nimport { SimService } from \"@app/main/modules/foundation/_services/sim.service\";\r\nimport { CameraCommunicationServerService } from \"@app/services/camera/camera-communication-server.service\";\r\nimport { IConfigurationFile } from \"@app/services/cameraCommunicationServer.service\";\r\nimport { DateService, DateUnit } from \"@app/services/date.service\";\r\nimport { MapService } from \"@app/services/map.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { combineLatest } from \"rxjs\";\r\nimport { CreationCode } from \"../../_enums/CreationCode.enum\";\r\nimport { ICameraDiagnosticRecord } from \"../../_models/ICameraDiagnosticRecord\";\r\nimport { IPulseRecord } from \"../../_models/IPulseRecord\";\r\nimport { IPulseRecordPayload } from \"../../_models/IPulseRecordPayload\";\r\nimport { CameraEventService } from \"../../_services/camera-events.service\";\r\nimport { PulseService } from \"../pulse/pulse.service\";\r\nimport './p100-device-details.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'p100-device-details',\r\n template: require('./p100-device-details.component.html')\r\n})\r\nexport class P100DeviceDetails implements OnInit {\r\n @Input() peripheral: IPeripheral;\r\n @Output() selectChannelsTab = new EventEmitter();\r\n\r\n pulseRecords: IPulseRecord[];\r\n latestPulseRecord: IPulseRecord;\r\n latestData: IPulseRecordPayload;\r\n latestEvents: ICameraDiagnosticRecord[];\r\n latestGPSPacket: ICameraDiagnosticRecord;\r\n latestDataDelayString: string;\r\n configInstallDate: Date;\r\n updaterInstallDate: Date;\r\n telematicsInstallDate: Date;\r\n\r\n rtlConfigs: IConfigurationFile[];\r\n\r\n peripheralMetadata: IPeripheralMetadata;\r\n\r\n simStatus: ISimStatus;\r\n\r\n cameraConfigs: ICameraConfiguration[];\r\n configName: string;\r\n cameraApplications: ICameraApp[];\r\n\r\n pendingConfigRequestName: string;\r\n pendingTelematicsAppVersion: string;\r\n pendingUpdaterAppVersion: string;\r\n\r\n cameraChannels: ICameraChannel[];\r\n adas = \"ADAS\";\r\n dms = \"DMS\";\r\n\r\n ProgressColourPalette = ProgressColourPalette;\r\n\r\n autoUpdateEnabled: boolean;\r\n\r\n loading: boolean;\r\n showSimManager: boolean;\r\n showChannelManager: boolean;\r\n showConfigManager: boolean;\r\n showGpsDetail: boolean;\r\n ignitionOffLongerThan14Days: boolean;\r\n locationMarker: IGoogleMapsMarker;\r\n\r\n CreationCode = CreationCode;\r\n\r\n constructor(\r\n private readonly dateService: DateService,\r\n private readonly mapService: MapService,\r\n private readonly pulseService: PulseService,\r\n private readonly simService: SimService,\r\n private readonly configManagerService: ConfigManagerService,\r\n private readonly cameraAppService: CameraAppService,\r\n private readonly peripheralService: PeripheralService,\r\n private readonly cameraChannelService: CameraChannelService,\r\n private readonly cameraEventService: CameraEventService,\r\n private readonly cameraCommunicationServer: CameraCommunicationServerService,\r\n private readonly translationsService: TranslationService) { }\r\n\r\n ngOnInit(): void {\r\n this.loadData();\r\n }\r\n\r\n openChannelsTab(): void {\r\n this.selectChannelsTab.emit();\r\n }\r\n\r\n get allChannelsCount(): number {\r\n return this.cameraChannels?.length\r\n }\r\n\r\n get activeChannelCount(): number {\r\n return this.cameraChannels?.filter(c => c.IsActive).length ?? 0;\r\n }\r\n\r\n get hasActiveAdasChannel(): boolean {\r\n return this.cameraChannels?.some(c => c.IsActive && c.CameraChannelType === CameraChannelType.ADASSensor) ?? false;\r\n }\r\n\r\n get hasActiveDmsChannel(): boolean {\r\n return this.cameraChannels?.some(c => c.IsActive && c.CameraChannelType === CameraChannelType.DMSSensor) ?? false;\r\n }\r\n\r\n openSimManager(): void {\r\n this.showSimManager = true;\r\n }\r\n\r\n closeSimManager(): void {\r\n this.showSimManager = false;\r\n }\r\n\r\n openChannelManager(): void {\r\n this.showChannelManager = true;\r\n }\r\n\r\n closeChannelManager(): void {\r\n this.showChannelManager = false;\r\n }\r\n\r\n openConfigManager(): void {\r\n this.showConfigManager = true;\r\n }\r\n\r\n closeConfigManager(): void {\r\n this.setConfigInfo();\r\n this.setAppInfo();\r\n this.showConfigManager = false;\r\n }\r\n\r\n openGpsDetail(): void {\r\n this.showGpsDetail = true;\r\n }\r\n\r\n closeGpsDetail(): void {\r\n this.showGpsDetail = false;\r\n }\r\n\r\n onVehicleChannelsSaved(vehicle: IVehicleWithCameraMappings): void {\r\n this.cameraChannels = vehicle.cameraChannels;\r\n this.closeChannelManager();\r\n }\r\n\r\n setAutoUpdate(): void {\r\n this.peripheralService.setAutoUpdateProperty({ Serial: this.peripheral.Serial, AutoUpdateEnabled: this.peripheralMetadata.AutoUpdate })\r\n .pipe(\r\n untilDestroyed(this),\r\n ).subscribe()\r\n }\r\n\r\n //--\r\n\r\n private loadData(): void {\r\n this.loading = true;\r\n this.simService.getSimInfo(this.peripheral.Serial).pipe(untilDestroyed(this)).subscribe(); // Test SIM not registered in db, need to work this bit out\r\n const recordStartDate = this.dateService.addOrSubtractTime(new Date(), -14, DateUnit.Day);\r\n const recordEndDate = new Date();\r\n\r\n combineLatest([\r\n this.pulseService.getHistoricalPulseMessages({ Serial: this.peripheral.Serial, Start: recordStartDate, End: recordEndDate }),\r\n this.pulseService.getLatestPulseMessage({ Serial: this.peripheral.Serial }),\r\n this.configManagerService.getConfigs(false),\r\n this.cameraAppService.getApplicationFiles(),\r\n this.cameraChannelService.getCameraChannels({ VehicleId: this.peripheral.vehicleMapping.VehicleId }),\r\n this.peripheralService.getPeripheralMetadata(this.peripheral.Serial),\r\n this.cameraEventService.getGPSCameraEvents({ Serial: this.peripheral.Serial, Start: recordStartDate, End: recordEndDate }),\r\n this.cameraCommunicationServer.getAvailableConfigFiles(15, true)\r\n ]).pipe(\r\n untilDestroyed(this))\r\n .subscribe({\r\n next: ([pulseMessages, latestPulse, configs, apps, channels, peripheralMetadata, events, rtlConfigs]: [IPulseRecord[], IPulseRecord, ICameraConfiguration[], ICameraApp[], ICameraChannel[], IPeripheralMetadata, ICameraDiagnosticRecord[], IConfigurationFile[]]) => {\r\n this.cameraConfigs = configs;\r\n this.pulseRecords = pulseMessages;\r\n this.cameraChannels = channels;\r\n this.cameraApplications = apps;\r\n this.peripheralMetadata = peripheralMetadata;\r\n this.autoUpdateEnabled = this.peripheralMetadata.AutoUpdate;\r\n this.rtlConfigs = rtlConfigs;\r\n this.latestEvents = events;\r\n\r\n this.latestPulseRecord = latestPulse[0];\r\n this.latestData = this.latestPulseRecord?.Payload ? JSON.parse(this.latestPulseRecord.Payload) : null;\r\n\r\n this.setConfigInfo();\r\n this.setAppInfo();\r\n this.getIgnitionStatus();\r\n\r\n this.latestGPSPacket = this.getLatestGPSPacket();\r\n this.latestDataDelayString = this.computeLatestDataDelay(this.latestGPSPacket);\r\n this.locationMarker = this.getLocation();\r\n this.loading = false;\r\n }\r\n })\r\n }\r\n\r\n private computeLatestDataDelay(cameraDiagnosticRecord: ICameraDiagnosticRecord): string {\r\n\r\n let creationTime: Date = null;\r\n let eventTime: Date = null;\r\n\r\n if (!!this.latestGPSPacket) {\r\n creationTime = this.latestGPSPacket?.CreatedTime;\r\n eventTime = this.latestGPSPacket?.EventTime;\r\n } else if (!!this.latestData) {\r\n creationTime = this.latestPulseRecord.CreatedTime;\r\n eventTime = this.latestData.GPS.dateTime;\r\n }\r\n\r\n if (!creationTime || !eventTime) {\r\n return this.translationsService.t(\"FoundationPeripherals.NoDataDelayPacket\");\r\n }\r\n \r\n const delayMs = new Date(creationTime).getTime() - new Date(eventTime).getTime();\r\n return this.dateService.formatTimeFromMilliseconds(delayMs);\r\n }\r\n \r\n private setConfigInfo(): void {\r\n this.setConfigName();\r\n this.setLatestConfigInstallDate();\r\n this.setPendingConfigRequests();\r\n }\r\n\r\n private setAppInfo(): void {\r\n this.setLatestAppInstalls();\r\n this.setPendingAppInstalls();\r\n }\r\n\r\n private getLatestGPSPacket(): ICameraDiagnosticRecord {\r\n if (!this.latestEvents.length) {\r\n return;\r\n }\r\n\r\n const latestGPSPacket = this.latestEvents.reduce((prev, current) => {\r\n if (new Date(prev.EventTime).getTime() < new Date(current.EventTime).getTime()) {\r\n return current;\r\n }\r\n\r\n return prev;\r\n\r\n }, this.latestEvents[0]);\r\n\r\n return latestGPSPacket;\r\n }\r\n\r\n private getLocation(): IGoogleMapsMarker {\r\n if (!this.latestGPSPacket) {\r\n return;\r\n }\r\n\r\n const gpsData = this.latestGPSPacket.parsedPayload.GPS;\r\n\r\n return this.mapService.createMapMarker({ Latitude: gpsData.latitude, Longitude: gpsData.longitude }, { label: this.dateService.formatDate(gpsData.dateTime), showLabel: true });\r\n }\r\n\r\n private getIgnitionStatus(): void {\r\n if (!this.latestData || this.latestData.ignitionStatus) {\r\n return;\r\n }\r\n\r\n const fourteenDaysAgo = this.dateService.addOrSubtractTime(new Date(), -14, DateUnit.Day);\r\n this.ignitionOffLongerThan14Days = this.dateService.date1IsAfterDate2(fourteenDaysAgo, this.latestData.LastIgnitionChangeTime);\r\n }\r\n\r\n private getLatestRecord(): IPulseRecord | undefined {\r\n return this.pulseRecords.reduce((mostRecent, current) => {\r\n if (!mostRecent || current.CreatedTime > mostRecent.CreatedTime) {\r\n return current;\r\n }\r\n\r\n return mostRecent;\r\n }, undefined);\r\n }\r\n\r\n private setPendingAppInstalls(): void {\r\n const pendingUpdaterInstalls = this.peripheral.veriAppUpdateHistory?.filter(a => (a.RequestState === CommServerRequestState.Pending || a.RequestState === CommServerRequestState.Requested) && this.cameraAppService.getAppType(a.ApplicationId, this.cameraApplications) === CameraAppType.Updater);\r\n const pendingTelematicsInstalls = this.peripheral.veriAppUpdateHistory?.filter(a => (a.RequestState === CommServerRequestState.Pending || a.RequestState === CommServerRequestState.Requested) && this.cameraAppService.getAppType(a.ApplicationId, this.cameraApplications) === CameraAppType.Telematics);\r\n\r\n if (pendingTelematicsInstalls?.length) {\r\n pendingTelematicsInstalls.sort((a, b) => {\r\n return new Date(b.CreatedTime).getTime() - new Date(a.CreatedTime).getTime();\r\n });\r\n\r\n this.pendingTelematicsAppVersion = `v${this.cameraApplications.find(app => app.Id == pendingTelematicsInstalls[0].ApplicationId).Version}`;\r\n }\r\n\r\n if (pendingUpdaterInstalls?.length) {\r\n pendingUpdaterInstalls.sort((a, b) => {\r\n return new Date(b.CreatedTime).getTime() - new Date(a.CreatedTime).getTime();\r\n });\r\n\r\n this.pendingUpdaterAppVersion = `v${this.cameraApplications.find(app => app.Id == pendingUpdaterInstalls[0].ApplicationId).Version}`;\r\n }\r\n }\r\n\r\n private setLatestAppInstalls(): void {\r\n if (!this.peripheral.veriAppUpdateHistory?.length) {\r\n return;\r\n }\r\n\r\n const updaterInstalls = this.peripheral.veriAppUpdateHistory.filter(a => a.RequestState === CommServerRequestState.Completed && this.cameraAppService.getAppType(a.ApplicationId, this.cameraApplications) === CameraAppType.Updater);\r\n const telematicsInstalls = this.peripheral.veriAppUpdateHistory.filter(a => a.RequestState === CommServerRequestState.Completed && this.cameraAppService.getAppType(a.ApplicationId, this.cameraApplications) === CameraAppType.Telematics);\r\n\r\n if (!!updaterInstalls.length) {\r\n updaterInstalls.sort((a, b) => {\r\n return new Date(b.SentTime).getTime() - new Date(a.SentTime).getTime();\r\n });\r\n\r\n this.updaterInstallDate = updaterInstalls[0].SentTime;\r\n }\r\n\r\n if (!!telematicsInstalls.length) {\r\n telematicsInstalls.sort((a, b) => {\r\n return new Date(b.SentTime).getTime() - new Date(a.SentTime).getTime();\r\n });\r\n\r\n this.telematicsInstallDate = telematicsInstalls[0].SentTime;\r\n }\r\n }\r\n\r\n private setLatestConfigInstallDate(): void {\r\n if (this.peripheral.veriConfigUpdateHistory?.length) {\r\n const completedRequests = this.peripheral.veriConfigUpdateHistory.filter(c => c.RequestState === CommServerRequestState.Completed);\r\n\r\n completedRequests.sort((a, b) => {\r\n return new Date(b.SentTime).getTime() - new Date(a.SentTime).getTime();\r\n });\r\n\r\n this.configInstallDate = completedRequests[0]?.SentTime;\r\n return;\r\n }\r\n\r\n // Remove with CommServer\r\n if (this.peripheral?.rtlConfigUpdateHistory?.length) {\r\n const relevantRequests = this.peripheral.rtlConfigUpdateHistory.filter(c => c.Description == this.configName);\r\n\r\n if (!relevantRequests.length) {\r\n return;\r\n }\r\n\r\n relevantRequests.sort((a, b) => {\r\n return new Date(b.RequestedDate).getTime() - new Date(a.RequestedDate).getTime();\r\n });\r\n\r\n this.configInstallDate = relevantRequests[0].InstalledDate ?? relevantRequests[0].RequestedDate;\r\n }\r\n }\r\n\r\n private setPendingConfigRequests(): void {\r\n const pendingVerilocationRequests = this.peripheral.veriConfigUpdateHistory?.filter(c => c.RequestState === CommServerRequestState.Pending || c.RequestState === CommServerRequestState.Requested);\r\n\r\n if (pendingVerilocationRequests?.length) {\r\n pendingVerilocationRequests.sort((a, b) => {\r\n return new Date(b.CreatedTime).getTime() - new Date(a.CreatedTime).getTime();\r\n });\r\n\r\n this.pendingConfigRequestName = this.cameraConfigs.find(config => config.Id == pendingVerilocationRequests[0].ConfigurationId).Name;\r\n return;\r\n }\r\n\r\n // Remove with CommServer\r\n const pendingRtlRequests = this.peripheral.rtlConfigUpdateHistory?.filter(c => !c.InstalledDate && c.Description != this.configName && c.Description != \"Verilocation_Migration_Config\");\r\n\r\n if (pendingRtlRequests?.length) {\r\n pendingRtlRequests.sort((a, b) => {\r\n return new Date(b.RequestedDate).getTime() - new Date(a.RequestedDate).getTime();\r\n });\r\n\r\n this.pendingConfigRequestName = pendingRtlRequests[0].Description;\r\n return;\r\n }\r\n\r\n }\r\n private setConfigName(): void {\r\n if (this.latestData?.HardwareConfigName.indexOf(';') > -1) {\r\n this.latestData.HardwareConfigName = this.latestData.HardwareConfigName.substring(0, this.latestData?.HardwareConfigName.indexOf(';'))\r\n }\r\n\r\n const pulseConfigName = this.latestData?.HardwareConfigName;\r\n let cameraConfigId = Number(pulseConfigName);\r\n\r\n if (isNaN(cameraConfigId) && !(pulseConfigName in this.commServerToVerilocationConfigMappings)) {\r\n this.configName = this.rtlConfigs.find(c => c.ConfigFileUniqueId?.toUpperCase() == pulseConfigName?.toUpperCase())?.ConfigFileName;\r\n return;\r\n } else if (isNaN(cameraConfigId)) {\r\n cameraConfigId = this.commServerToVerilocationConfigMappings[pulseConfigName];\r\n }\r\n\r\n this.configName = this.cameraConfigs.find(config => config.Id == cameraConfigId).Name;\r\n }\r\n\r\n private commServerToVerilocationConfigMappings: { [key: string]: number } = {\r\n \"C157A7C1-723D-408C-B7D9-32D27DBDE60D\": 3,\r\n \"b2258a1a-168e-466b-ae23-6dfac432624f\": 4\r\n };\r\n}\r\n\r\n","\r\nexport enum CameraDiagnosticRecordType {\r\n Gps,\r\n Trip,\r\n Video\r\n}\r\n","module.exports = \"
{{ peripheral.Product.Description }} {{ peripheral.Serial }} {{ latestData.Device_IMEI }}
{{ ignitionStatus ? ('FoundationPeripherals.IgnitionOnSince' | translate : (latestData.LastIgnitionChangeTime | vDate : {dateTime: true})) : ('FoundationPeripherals.IgnitionOffSince' | translate : (latestData.LastIgnitionChangeTime | vDate : {dateTime: true})) }} warning
{{ latestData.ReportDateTime | vDate : {dateTime: true, second: '2-digit'} }} {{ latestDataDelayString }}
{{ 'FoundationPeripherals.Manage' | translate }}
{{ allChannelsCount }}
{{ activeChannelCount }} {{ hasActiveAdasChannel }} {{ hasActiveDmsChannel }}
{{ 'FoundationPeripherals.Manage' | translate }}
{{peripheralMetadata.AutoUpdate ? \\\"Enabled\\\" : \\\"Disabled\\\"}} {{ 'FoundationPeripherals.AutoUpdateInfo' | translate }}
v{{ latestData.FirmwareVersion }}
{{ 'FoundationPeripherals.InstallTime' | translate : (updaterInstallDate | vDate : {dateTime: 'dateTime'}) }}
{{ 'FoundationPeripherals.InstalledViaCommserver' | translate }}
{{ 'FoundationPeripherals.PendingInstallation' | translate : pendingUpdaterAppVersion }}
v{{ latestData.Applications[0]?.AppVersion }}
{{ 'FoundationPeripherals.InstallTime' | translate : (updaterInstallDate | vDate : {dateTime: 'dateTime'})}}
{{ 'FoundationPeripherals.InstalledViaCommserver' | translate }}
{{ 'FoundationPeripherals.PendingInstallation' | translate : pendingTelematicsAppVersion }}
{{ configName }}
Installed: {{ configInstallDate | vDate : {dateTime: 'dateTime'} }}
{{ 'FoundationPeripherals.PendingInstallation' | translate : pendingConfigRequestName }}
{{ 'FoundationPeripherals.View' | translate }}
{{ latestGPSPacket.EventTime | vDate : {dateTime: true, second: '2-digit'} }} {{ latestGPSPacket.parsedPayload.creationCode | enumAsString : CreationCode : 'CreationCode' }} {{ latestGPSPacket.parsedPayload.GPS.accuracy }}m {{ latestGPSPacket.parsedPayload.GPS.satelitecount }} {{ latestGPSPacket.parsedPayload.GPS.speed }}
{{ 'FoundationPeripherals.Manage' | translate }} {{ latestData.SIM_ICCID }} {{ latestData.NetworkAccessPoint }} {{ latestData.NetworkOperator }}
{{latestGPSPacket.parsedPayload['creationCode'] | enumAsString : CreationCode : \\\"CreationCode\\\"}} {{latestGPSPacket.parsedPayload['additionalDataValue'] ? ' - ' + latestGPSPacket.parsedPayload['additionalDataValue'] : '' }} {{ latestGPSPacket.EventTime | vDate: {dateTime: true, second: '2-digit'} }} {{ 'DeviceEvents.PlotDataMessage' | translate }} \";","import { Component, EventEmitter, Input, OnInit, Output } from \"@angular/core\";\r\nimport { ProgressColourPalette } from \"@app/directives/_misc/v-progress-bar/v-progress-bar.component\";\r\nimport { IPeripheral } from \"@app/interfaces/IPeripheral\";\r\nimport { IVehicleWithCameraMappings } from \"@app/main/components/resourceManagement/cameras/camera-vehicles-manager/camera-vehicles-manager.component\";\r\nimport { CameraChannelType } from \"@app/main/components/videos/enums/CameraChannelType\";\r\nimport { ICameraChannel } from \"@app/main/components/videos/models/ICameraChannel\";\r\nimport { CameraOnlineHistoryService } from \"@app/main/components/videos/services/camera-online-history.service\";\r\nimport { CameraStatusService } from \"@app/main/components/videos/services/camera-status.service\";\r\nimport { CameraChannelService } from \"@app/main/modules/cameras/_services/camera-channels.service\";\r\nimport { ICommunicationMetadata, IFtCloudDeviceMetadataInfo } from \"@app/main/modules/foundation/_routes/hardware/_models/IFtCloudDeviceMetadataPayload\";\r\nimport { IPeripheralMetadata } from \"@app/main/modules/foundation/_routes/hardware/_models/IPeripheralMetadata\";\r\nimport { IStreamaxExtendedDeviceInfo } from \"@app/main/modules/foundation/_routes/hardware/_models/IStreamaxExtendedDeviceInfo\";\r\nimport { PeripheralService } from \"@app/main/modules/foundation/_services/peripheral.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { forkJoin, from } from \"rxjs\";\r\nimport { filter, finalize, switchMap, take, tap } from \"rxjs/operators\";\r\nimport './streamax-device-details.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'streamax-device-details',\r\n template: require('./streamax-device-details.component.html')\r\n})\r\n\r\nexport class StreamaxDeviceDetail implements OnInit {\r\n @Input() peripheral: IPeripheral;\r\n @Output() selectChannelsTab = new EventEmitter();\r\n\r\n loading: boolean;\r\n\r\n ProgressColourPalette = ProgressColourPalette;\r\n\r\n peripheralMetadata: IPeripheralMetadata;\r\n streamaxMetadata: IFtCloudDeviceMetadataInfo;\r\n commsMetadata: ICommunicationMetadata;\r\n\r\n deviceInfo: IStreamaxExtendedDeviceInfo;\r\n\r\n cameraChannels: ICameraChannel[];\r\n openCameraConfigButtonLabel: string;\r\n\r\n showMetadataSidebar: boolean;\r\n showPeripheralDataSideBar: boolean;\r\n showSimManagerSidebar: boolean;\r\n showChannelManager: boolean;\r\n\r\n adas = \"ADAS\";\r\n dms = \"DMS\";\r\n mb = \"MB\";\r\n\r\n\r\n constructor(\r\n private readonly peripheralService: PeripheralService,\r\n private readonly cameraChannelService: CameraChannelService,\r\n private readonly cameraStatusService: CameraStatusService,\r\n private readonly cameraOnlineHistoryService: CameraOnlineHistoryService,\r\n private readonly translationService: TranslationService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.loadData();\r\n }\r\n\r\n get openCameraConfigDisabled(): boolean {\r\n return !!this.openCameraConfigButtonLabel;\r\n }\r\n\r\n get streamaxChannelCount(): number {\r\n return this.deviceInfo?.ChannelList?.length;\r\n }\r\n\r\n get allChannelsCount(): number {\r\n return this.cameraChannels?.length\r\n }\r\n\r\n get activeChannelCount(): number {\r\n return this.cameraChannels?.filter(c => c.IsActive).length ?? 0;\r\n }\r\n\r\n get hasActiveAdasChannel(): boolean {\r\n return this.cameraChannels?.some(c => c.IsActive && c.CameraChannelType === CameraChannelType.ADASSensor) ?? false;\r\n }\r\n\r\n get hasActiveDmsChannel(): boolean {\r\n return this.cameraChannels?.some(c => c.IsActive && c.CameraChannelType === CameraChannelType.DMSSensor) ?? false;\r\n }\r\n\r\n toggleMetadataSidebar(): void {\r\n this.showMetadataSidebar = !this.showMetadataSidebar;\r\n }\r\n\r\n togglePeripheralJsonSidebar(): void {\r\n this.showPeripheralDataSideBar = !this.showPeripheralDataSideBar;\r\n }\r\n\r\n openChannelsTab(): void {\r\n this.selectChannelsTab.emit();\r\n }\r\n\r\n openCameraConfig(): void {\r\n from(this.cameraOnlineHistoryService.getCameraOnlineStatus(this.peripheral.vehicleMapping.VehicleId)).pipe(\r\n take(1),\r\n tap(status => {\r\n if (!status?.Online) {\r\n this.openCameraConfigButtonLabel = this.translationService.t('FoundationPeripherals.CameraWentOffline');\r\n }\r\n }),\r\n filter(status => status?.Online),\r\n switchMap(() => this.cameraStatusService.getCameraConfigPageUrl(this.peripheral.Serial, this.streamaxMetadata?.deviceModel)),\r\n tap(url => {\r\n window.open(url.Url, \"_blank\");\r\n })\r\n ).subscribe()\r\n }\r\n\r\n openSimManager(): void {\r\n this.showSimManagerSidebar = true;\r\n }\r\n\r\n closeSimManager(): void {\r\n this.showSimManagerSidebar = false;\r\n }\r\n\r\n\r\n openChannelManager(): void {\r\n this.showChannelManager = true;\r\n }\r\n\r\n closeChannelManager(): void {\r\n this.showChannelManager = false;\r\n }\r\n\r\n onVehicleChannelsSaved(vehicle: IVehicleWithCameraMappings): void {\r\n this.cameraChannels = vehicle.cameraChannels;\r\n this.closeChannelManager();\r\n }\r\n\r\n //--\r\n\r\n private loadData(): void {\r\n this.loading = true;\r\n forkJoin({\r\n metadata: this.peripheralService.getPeripheralMetadata(this.peripheral.Serial),\r\n channels: this.cameraChannelService.getCameraChannels({ VehicleId: this.peripheral.vehicleMapping.VehicleId }),\r\n deviceInfo: this.cameraStatusService.getDeviceInfo(this.peripheral.Serial),\r\n cameraStatus: this.cameraOnlineHistoryService.getCameraOnlineStatus(this.peripheral.vehicleMapping.VehicleId)\r\n }).pipe(\r\n untilDestroyed(this),\r\n finalize(() => this.loading = false),\r\n tap(data => {\r\n this.peripheralMetadata = data.metadata;\r\n this.streamaxMetadata = !!data.metadata?.DeviceMetadataInfoJson?.length ? JSON.parse(data.metadata.DeviceMetadataInfoJson) as IFtCloudDeviceMetadataInfo : null;\r\n this.commsMetadata = this.streamaxMetadata?.communication.find(m => !!m.imei);\r\n this.cameraChannels = data.channels;\r\n this.deviceInfo = data.deviceInfo;\r\n \r\n if (!data.cameraStatus?.Online) {\r\n this.openCameraConfigButtonLabel = this.translationService.t('FoundationPeripherals.CameraIsOffline');\r\n } \r\n }),\r\n ).subscribe();\r\n }\r\n}\r\n","module.exports = \"
{{ 'FoundationPeripherals.DataCaptured' | translate : (streamaxMetadata?.updateTime | vDate : {dateTime: true}) }}
{{ 'FoundationPeripherals.ViewLatestMetadata' | translate }} {{ 'FoundationPeripherals.ViewPeripheralData' | translate }} {{ 'FoundationPeripherals.ConfigureCamera' | translate }}
{{ peripheral?.Product?.Description }} {{ streamaxMetadata?.deviceModel }} {{ peripheral.Serial }}
{{ module.healthStatus != null ? module.healthStatus : \\\"Unknown\\\" }} {{ module.storageType }} {{ module.useType }}
{{ 'FoundationPeripherals.Manage' | translate }} {{ commsMetadata?.iccid }} {{ commsMetadata?.imei }} {{ commsMetadata?.imsi }} {{ commsMetadata?.networkType }} {{ commsMetadata?.networkMode }} {{ 'FoundationPeripherals.Manage' | translate }}
{{ allChannelsCount }}
{{ \\\"FtCloud reports \\\" + streamaxChannelCount + \\\" channels\\\" }}
{{ activeChannelCount }} {{ hasActiveAdasChannel }} {{ hasActiveDmsChannel }}
{{ streamaxMetadata | json }}
{{ peripheral | json }}
\";","import { ChangeDetectorRef, Component, Input, OnInit, ViewChild } from \"@angular/core\";\r\nimport { VTableComponent } from \"@app/directives/_layout/v-table/_components/v-table.component\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { IAggregateFilterEvent } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { VerticalFilterItemCreationCallback } from \"@app/directives/_resourceFilters/vertical-filter-list/vertical-filter-list.component\";\r\nimport { DateRange } from \"@app/enum/DateRange.enum\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { DateService, DateUnit } from \"@app/services/date.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { finalize, map, mergeMap, tap } from \"rxjs/operators\";\r\nimport { CreationCode } from \"../../_enums/CreationCode.enum\";\r\nimport { ICameraDiagnosticRecord } from \"../../_models/ICameraDiagnosticRecord\";\r\nimport { CameraEventService } from \"../../_services/camera-events.service\";\r\nimport './camera-events.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: \"camera-events\",\r\n template: require('./camera-events.component.html')\r\n})\r\nexport class CameraEventsComponent implements OnInit {\r\n @Input() serial: string;\r\n @ViewChild('diagMessagesTable') diagMessagesTable: VTableComponent;\r\n\r\n events: ICameraDiagnosticRecord[];\r\n selectedEvent: ICameraDiagnosticRecord;\r\n\r\n startDate: Date;\r\n endDate: Date;\r\n defaultDateRange: DateRange = DateRange.Today;\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[] = [];\r\n\r\n loading: boolean;\r\n liveUpdates: boolean = true;\r\n\r\n CreationCode = CreationCode;\r\n\r\n constructor(\r\n private readonly cd: ChangeDetectorRef,\r\n private readonly cameraEventService: CameraEventService,\r\n private readonly dateService: DateService,\r\n private readonly translationService: TranslationService,\r\n private readonly vTableService: VTableService) { }\r\n\r\n ngOnInit(): void {\r\n this.setDefaultDate();\r\n this.createTable();\r\n }\r\n\r\n selectEvent(row: IVTableRow): void {\r\n this.selectedEvent = row.data;\r\n }\r\n\r\n deselectEvent(): void {\r\n this.selectedEvent = null;\r\n }\r\n\r\n onFilterChanged(filterEvent: IAggregateFilterEvent): void {\r\n if (!filterEvent.trigger) {\r\n return;\r\n }\r\n\r\n if (filterEvent.trigger == \"date\") {\r\n this.startDate = filterEvent.date[0];\r\n this.endDate = filterEvent.date[1];\r\n this.setLiveUpdates();\r\n this.getData();\r\n }\r\n }\r\n\r\n creationCodeItemCreationCallback: VerticalFilterItemCreationCallback = (event) => {\r\n\r\n return {\r\n name: this.translationService.tEnum(CreationCode, \"CreationCode\", event.parsedPayload['creationCode']),\r\n icon: '',\r\n data: event,\r\n color: 'black',\r\n predicate: (d) => d.parsedPayload['creationCode'] === event.parsedPayload['creationCode']\r\n };\r\n }\r\n\r\n additionalDataItemCreationCallback: VerticalFilterItemCreationCallback = (event) => {\r\n\r\n return {\r\n name: event.parsedPayload['additionalDataName'] || this.translationService.t(\"Common.None\"),\r\n icon: '',\r\n data: event,\r\n color: 'black',\r\n predicate: (d) => d.parsedPayload['additionalDataName'] === event.parsedPayload['additionalDataName']\r\n };\r\n }\r\n\r\n //--\r\n\r\n private getData(): void {\r\n this.loading = true;\r\n\r\n this.cameraEventService.getCameraEvents({ Serial: this.serial, Start: this.startDate, End: this.endDate }).pipe(\r\n untilDestroyed(this),\r\n mergeMap(records => {\r\n this.events = records;\r\n this.createTableRows();\r\n this.loading = false\r\n return this.subscribeToLiveMessages();\r\n })\r\n ).subscribe();\r\n }\r\n\r\n private subscribeToLiveMessages(): Observable {\r\n if (!this.liveUpdates) {\r\n return of(null); \r\n }\r\n\r\n return this.cameraEventService.getIncomingDiagMessages(this.serial).pipe(\r\n untilDestroyed(this),\r\n tap(message => {\r\n const deserialised = JSON.parse(message);\r\n const newEvent: ICameraDiagnosticRecord = { parsedPayload: deserialised, EventTime: new Date() };\r\n this.events.push(newEvent);\r\n this.diagMessagesTable.addNewRow(newEvent);\r\n this.cd.detectChanges();\r\n })\r\n );\r\n }\r\n\r\n private setDefaultDate(): void {\r\n const dateRange = this.dateService.dateRangeFromEnum(this.defaultDateRange);\r\n this.startDate = dateRange.start;\r\n this.endDate = dateRange.end;\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"DeviceEvents.ReceivedDate\", sorted: true, sortDirection: SortDirection.Descending }),\r\n createCellFunction: event => this.vTableService.createDateCell(event.CreatedTime)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"DeviceEvents.EventDate\" }),\r\n createCellFunction: event => this.vTableService.createDateCell(event.EventTime)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"DeviceEvents.Delay\" }),\r\n createCellFunction: event => this.vTableService.createDurationCell(new Date(event.CreatedTime).getTime() - new Date(event.EventTime).getTime())\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"DeviceEvents.CreationCode\", width: 150 }),\r\n createCellFunction: event => this.vTableService.createEnumCell(CreationCode, \"CreationCode\", event.parsedPayload[\"creationCode\"])\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"DeviceEvents.SeqNumber\", width: 150 }),\r\n createCellFunction: event => this.vTableService.createTableCell(event.parsedPayload[\"SeqNumber\"])\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"DeviceEvents.IgnitionStatus\", width: 150 }),\r\n createCellFunction: event => this.vTableService.createTableCell(event.parsedPayload[\"ignitionStatus\"] ? this.translationService.t(\"Common.On\") : this.translationService.t(\"Common.Off\"))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"DeviceEvents.AdditionalDataName\", width: 200 }),\r\n createCellFunction: event => this.vTableService.createTableCell(event.parsedPayload[\"additionalDataName\"])\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"DeviceEvents.AdditionalDataValue\" }),\r\n createCellFunction: event => this.vTableService.createTableCell(event.parsedPayload[\"additionalDataValue\"])\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"DeviceEvents.GsmStrength\", width: 150 }),\r\n createCellFunction: event => this.vTableService.createTableCell(event.parsedPayload[\"gsmSignalStrength\"])\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"DeviceEvents.SatCount\", width: 150 }),\r\n createCellFunction: event => this.vTableService.createTableCell(event.parsedPayload[\"GPS\"][\"satelitecount\"])\r\n }\r\n ]\r\n }\r\n\r\n private createTableRows(): void {\r\n this.tableRows = this.vTableService.createTableRows(this.events, this.tableColumns);\r\n }\r\n\r\n private setLiveUpdates(): void {\r\n // Only subscribe to new messages if the end date is within the last 15 minutes or in the future\r\n this.liveUpdates = this.dateService.date1IsAfterDate2(this.endDate, this.dateService.addOrSubtractTime(new Date(), -15, DateUnit.Min));\r\n }\r\n}\r\n","module.exports = \"
{{selectedEvent.parsedPayload['creationCode'] | enumAsString : CreationCode : \\\"CreationCode\\\"}} {{selectedEvent.parsedPayload['additionalDataValue'] ? ' - ' + selectedEvent.parsedPayload['additionalDataValue'] : '' }} {{ selectedEvent.EventTime | vDate: {dateTime: true, second: '2-digit'} }} \";","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { getOptionsQueryParams } from \"@app/class/Utilities\";\r\nimport { ILogRequestUpdateMessage } from \"@app/main/modules/foundation/_routes/developerConsole/log-message.model\";\r\nimport { SignalRService, WebSocketEvents } from \"@app/main/modules/foundation/_routes/developerConsole/signalr.service\";\r\nimport { Observable, Subject } from \"rxjs\";\r\nimport { ICameraLogFile, ILogRequest } from \"../../_models/ILogRequest\";\r\nimport { ICameraLogFileQueryOptions, ILogRequestQueryOptions } from \"../../_models/ILogRequestQueryOptions\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CameraLogService {\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly signalRService: SignalRService) { }\r\n\r\n logRequestUpdateReceived = new Subject();\r\n\r\n getLogRequestUpdates(serial: string): Observable {\r\n this.signalRService.initialise().then(() => {\r\n this.signalRService.joinDeviceGroup(serial);\r\n this.signalRService.registerEvents(WebSocketEvents.LogRequestUpdate, this.logRequestUpdateReceived);\r\n });\r\n\r\n return this.logRequestUpdateReceived;\r\n }\r\n\r\n getLogRequests(options: ILogRequestQueryOptions): Observable {\r\n const params = getOptionsQueryParams(options);\r\n return this.http.get(`/api/cameras/commserver/logs/requests`, params);\r\n }\r\n\r\n createLogRequest(logRequest: ILogRequest): Observable {\r\n return this.http.post(`/api/cameras/commserver/logs/requests`, logRequest);\r\n }\r\n\r\n getLogFiles(options: ICameraLogFileQueryOptions): Observable {\r\n const params = getOptionsQueryParams(options);\r\n return this.http.get(`/api/cameras/commserver/logs/files`, params);\r\n }\r\n\r\n\r\n}\r\n","module.exports = \"
{{ 'CameraLogs.DetailsSidebarInfoPanel1' | translate : [requestStartDate, requestDuration] }}
{{ 'CameraLogs.DetailsSidebarInfoPanel2' | translate : [fileContentDictionary[logRequestIdKey]?.length ?? 0, logRequestFileCount == 0 ? '?' : logRequestFileCount] }}
{{ item.FileName }}
{{ getFileTypeString(item.FileName) }}
{{ 'Common.Download' | translate }}

{{ 'CameraLogs.RequestInfoPanel' | translate : [requestStartDate, requestDuration] }}
\";","import { Component, Input } from '@angular/core';\r\nimport { ITimelineEntry } from '@app/directives/_veri/v-timeline/v-timeline.component';\r\nimport { IGoogleMapsMarker } from '@app/interfaces/IGoogleMapsMarkerOptions';\r\nimport { VideoEventCode } from '@app/main/components/videos/enums/VideoEventCode';\r\nimport { VideoStatus } from '@app/main/components/videos/enums/VideoStatus';\r\nimport { IVideoChannelMedia } from '@app/main/components/videos/models/IVideoChannelMedia';\r\nimport { IVideoEntry } from '@app/main/components/videos/models/IVideoEntry';\r\nimport { FoundationVideoService } from '@app/main/modules/foundation/_services/video.service';\r\nimport { MapService } from '@app/services/map.service';\r\nimport { TranslationService } from '@app/services/translation.service';\r\nimport { untilDestroyed } from '@ngneat/until-destroy';\r\nimport { mergeMap } from 'rxjs/operators';\r\nimport './camera-video-view.component.scss';\r\n\r\n@Component({\r\n selector: 'camera-video-view',\r\n template: require('./camera-video-view.component.html')\r\n})\r\nexport class CameraVideoViewComponent {\r\n @Input() videoId: number;\r\n video: IVideoEntry;\r\n\r\n mapMarker: IGoogleMapsMarker;\r\n timelineEntries: ITimelineEntry[];\r\n\r\n loading: boolean;\r\n\r\n VideoEventCode = VideoEventCode;\r\n VideoStatus = VideoStatus;\r\n constructor(\r\n private readonly mapService: MapService,\r\n private readonly translationService: TranslationService,\r\n private readonly videoService: FoundationVideoService) { }\r\n\r\n ngOnInit(): void {\r\n this.getVideo();\r\n }\r\n\r\n //--\r\n\r\n private getVideo(): void {\r\n if (!this.videoId) {\r\n return;\r\n }\r\n\r\n this.videoService.getVideoEntries({ Id: this.videoId }).pipe(\r\n untilDestroyed(this),\r\n mergeMap(videos => {\r\n this.video = videos[0];\r\n return this.videoService.getChannelMedia({ VideoEventId: this.video.Id });\r\n })\r\n ).subscribe({\r\n next: channelMedia => {\r\n this.setChannelMedia(channelMedia);\r\n this.createMapMarker();\r\n this.createTimelineFromAuditTrail();\r\n },\r\n complete: this.cancelLoading,\r\n error: this.cancelLoading\r\n })\r\n }\r\n\r\n private cancelLoading(): void {\r\n this.loading = false;\r\n }\r\n\r\n private setChannelMedia(channelMedia: IVideoChannelMedia[]): void {\r\n channelMedia.forEach(cm => {\r\n if (cm.ChannelId > 0) {\r\n this.video.channelMedia.push(cm);\r\n }\r\n })\r\n }\r\n\r\n private createMapMarker(): void {\r\n this.mapMarker = this.mapService.createMapMarker({ Latitude: this.video.Latitude, Longitude: this.video.Longitude }, { showLabel: true, label: this.translationService.t(\"Common.Location\") })\r\n }\r\n\r\n private createTimelineFromAuditTrail(): void {\r\n if (!this.video.MetaData?.AuditLogs) {\r\n return;\r\n }\r\n\r\n this.timelineEntries = [];\r\n\r\n this.video.MetaData.AuditLogs.forEach(log => {\r\n const splitLog = log.split(\":\");\r\n const logDate = splitLog.slice(0, 3).join(\":\");\r\n const logText = splitLog[3];\r\n\r\n this.timelineEntries.push({\r\n date: new Date(logDate),\r\n icon: 'schedule',\r\n largeDetails: {\r\n title: logText\r\n }\r\n })\r\n })\r\n }\r\n}\r\n","module.exports = \"
0\\\">
{{ video.ExternalId || '--' }} {{ video.DateDownloaded ? (video.DateDownloaded | vDate : {dateTime: true, second: '2-digit'}) : '--' }}
{{ video?.Latitude }} {{ video?.Longitude }}
\";","import { Component, Input, OnInit } from \"@angular/core\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { FallbackCellType, VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { IAggregateFilterEvent } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { DateRange } from \"@app/enum/DateRange.enum\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { IPeripheral } from \"@app/interfaces/IPeripheral\";\r\nimport { VideoEventCode } from \"@app/main/components/videos/enums/VideoEventCode\";\r\nimport { VideoStatus } from \"@app/main/components/videos/enums/VideoStatus\";\r\nimport { IVideoEntry } from \"@app/main/components/videos/models/IVideoEntry\";\r\nimport { FoundationVideoService } from \"@app/main/modules/foundation/_services/video.service\";\r\nimport { DateService } from \"@app/services/date.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport './camera-videos.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'camera-videos',\r\n template: require('./camera-videos.component.html')\r\n})\r\nexport class CameraVideosComponent implements OnInit {\r\n @Input() camera: IPeripheral;\r\n\r\n videos: IVideoEntry[];\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n startDate: Date;\r\n endDate: Date;\r\n defaultDateRange = DateRange.Last30Days;\r\n\r\n selectedVideo: IVideoEntry;\r\n VideoEventCode = VideoEventCode;\r\n VideoStatus = VideoStatus;\r\n\r\n loading: boolean;\r\n constructor(\r\n private readonly dateService: DateService,\r\n private readonly videoService: FoundationVideoService,\r\n private readonly vTableService: VTableService) { }\r\n\r\n ngOnInit(): void {\r\n this.setDefaultDates();\r\n this.createTable();\r\n }\r\n\r\n onRowClicked(row: IVTableRow): void {\r\n this.selectedVideo = row.data;\r\n }\r\n\r\n onFilterChanged(filterEvent: IAggregateFilterEvent) {\r\n\r\n if (filterEvent.trigger == \"date\") {\r\n this.startDate = filterEvent.date[0];\r\n this.endDate = filterEvent.date[1];\r\n this.getVideos();\r\n }\r\n }\r\n\r\n clearSelectedVideo(): void {\r\n this.selectedVideo = null;\r\n }\r\n\r\n //--\r\n\r\n private getVideos(): void {\r\n if (!this.camera) {\r\n return;\r\n }\r\n\r\n this.loading = true;\r\n\r\n this.videoService.getVideoEntries({ VehicleId: this.camera.vehicleMapping?.vehicle?.Id, Start: this.startDate, End: this.endDate, UseCreatedDate: true }).pipe(\r\n untilDestroyed(this)\r\n ).subscribe({\r\n next: videos => {\r\n this.videos = videos;\r\n },\r\n complete: () => {\r\n this.tableRows = this.vTableService.createTableRows(this.videos, this.tableColumns);\r\n this.loading = false\r\n },\r\n error: () => this.loading = false\r\n })\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"CameraVideos.VideoStartTime\", sorted: true, sortDirection: SortDirection.Descending }),\r\n createCellFunction: video => this.vTableService.createDateCell(video.VideoStartTime)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"CameraVideos.VideoEndTime\", sorted: true }),\r\n createCellFunction: video => this.vTableService.createDateCell(video.VideoEndTime)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"CameraVideos.Duration\" }),\r\n createCellFunction: video => this.vTableService.createDurationCell(new Date(video.VideoEndTime).getTime() - new Date(video.VideoStartTime).getTime())\r\n },\r\n {\r\n header: this.vTableService.createVehicleTableHeader(),\r\n createCellFunction: video => this.vTableService.createVehicleRegCell(this.camera.vehicleMapping?.vehicle)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"CameraVideos.EventCode\" }),\r\n createCellFunction: video => this.vTableService.createEnumCell(VideoEventCode, \"VideoEventCode\", video.EventCode)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Status\" }),\r\n createCellFunction: video => this.vTableService.createEnumCell(VideoStatus, \"VideoStatus\", video.Status)\r\n \r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"CameraVideos.UserRequestedDate\", width: 200 }),\r\n createCellFunction: video => this.vTableService.createDateCell(video.DateRequested, { dateTime: true })\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"CameraVideos.CameraRequestedDate\", width: 200 }),\r\n createCellFunction: video => this.vTableService.createDateCell(video.MetaData.CameraUploadRequestedTime)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"CameraVideos.ReceivedDate\", width: 200 }),\r\n createCellFunction: video => this.vTableService.createDateCell(video.DateDownloaded)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"CameraVideos.ExternalId\" }),\r\n createCellFunction: video => this.vTableService.createTableCell(video.ExternalId, undefined, FallbackCellType.Dashed)\r\n }\r\n ]\r\n }\r\n\r\n private setDefaultDates(): void {\r\n const dateRange = this.dateService.dateRangeFromEnum(this.defaultDateRange);\r\n this.startDate = dateRange.start;\r\n this.endDate = dateRange.end;\r\n }\r\n}\r\n","module.exports = \"
{{ selectedVideo.EventCode | enumAsString : VideoEventCode : 'VideoEventCode' }} {{ selectedVideo.VideoStartTime | vDate : {dateTime: true, second: '2-digit'} }} {{ selectedVideo.Status | enumAsString : VideoStatus : 'VideoStatus' }} \";","module.exports = \" {{ 'Common.Serial' | translate }}: {{ camera.Serial }} {{'FoundationPeripherals.Installed' | translate}} {{ camera.vehicleMapping.StartUtc | vDate : {dateTime: false} }} {{'FoundationPeripherals.Removed' | translate}} {{ camera.vehicleMapping.EndUtc | vDate : {dateTime: false} }} {{ \\\"Common.Save\\\" | translate }} {{ 'CameraLogs.RequestLogs' | translate}} \";","import { Component, Input } from \"@angular/core\";\r\nimport { CreationCode } from \"../../_enums/CreationCode.enum\";\r\nimport { ICameraDiagnosticRecord } from \"../../_models/ICameraDiagnosticRecord\";\r\nimport './gps-detail.component.scss';\r\n\r\n@Component({\r\n selector: 'gps-detail',\r\n template: require('./gps-detail.component.html')\r\n})\r\nexport class GpsDetailComponent {\r\n @Input() gpsEvent: ICameraDiagnosticRecord;\r\n CreationCode = CreationCode;\r\n constructor() { }\r\n}\r\n","module.exports = \" {{ gpsEvent.parsedPayload['additionalDataName'] || '--' }} {{ gpsEvent.parsedPayload['additionalDataValue'] || '--' }} {{ gpsEvent.parsedPayload['NetworkAccessPoint'] }} {{ gpsEvent.parsedPayload['NetworkOperator'] }} {{ gpsEvent.parsedPayload['ReportType'] }} {{ gpsEvent.parsedPayload['gsmSignalStrength'] }}
{{ gpsEvent.parsedPayload['GPS'] | json }}
\";","import { Component, EventEmitter, Input, Output } from \"@angular/core\";\r\nimport { ProgressColourPalette } from \"@app/directives/_misc/v-progress-bar/v-progress-bar.component\";\r\nimport { IPeripheral } from \"@app/interfaces/IPeripheral\";\r\nimport { SimService } from \"@app/main/modules/foundation/_services/sim.service\";\r\nimport { UntilDestroy } from \"@ngneat/until-destroy\";\r\nimport { PulseService } from \"../pulse/pulse.service\";\r\nimport './peripheral-device-details.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'peripheral-device-details',\r\n template: require('./peripheral-device-details.component.html')\r\n})\r\nexport class PeripheralDeviceDetails {\r\n @Input() peripheral: IPeripheral;\r\n @Output() selectChannelsTab = new EventEmitter();\r\n\r\n \r\n\r\n ProgressColourPalette = ProgressColourPalette;\r\n\r\n loading: boolean;\r\n\r\n constructor() { }\r\n\r\n openChannelsTab(): void {\r\n this.selectChannelsTab.emit();\r\n }\r\n}\r\n","module.exports = \"
\";","module.exports = \" {{ importButtonString }} {{ vendor.name }} \";","module.exports = \" {{ 'Common.Serial' | translate }}: {{ peripheral.Serial }} {{'FoundationPeripherals.Installed' | translate}} {{ peripheral.vehicleMapping.StartUtc | vDate : {dateTime: false} }} {{'FoundationPeripherals.Removed' | translate}} {{ peripheral.vehicleMapping.EndUtc | vDate : {dateTime: false} }}
{{ peripheral | json }}
\";","import { Component, Input } from \"@angular/core\";\r\nimport { IPulseRecord } from \"../../../_models/IPulseRecord\";\r\nimport { IPulseRecordPayload } from \"../../../_models/IPulseRecordPayload\";\r\nimport './pulse-message-detail.component.scss';\r\n\r\n@Component({\r\n selector: 'pulse-message-detail',\r\n template: require('./pulse-message-detail.component.html')\r\n})\r\nexport class PulseMessageDetailComponent {\r\n @Input() pulseRecord: IPulseRecord;\r\n pulsePayload: IPulseRecordPayload;\r\n\r\n ngOnChanges(): void {\r\n this.pulsePayload = this.pulseRecord.parsedPayload;\r\n }\r\n}\r\n","module.exports = \"
  • {{ application.AppName }} v{{ application.AppVersion }}
\";","import { ChangeDetectorRef, Component, Input, OnInit, ViewChild } from \"@angular/core\";\r\nimport { VTableComponent } from \"@app/directives/_layout/v-table/_components/v-table.component\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { IAggregateFilterEvent } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { IPill, VPillsComponent } from \"@app/directives/_veri/v-pills/v-pills.component\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { IGoogleMapsMarker } from \"@app/interfaces/IGoogleMapsMarkerOptions\";\r\nimport { IPlot } from \"@app/interfaces/IPlot\";\r\nimport { ICameraConfiguration } from \"@app/main/modules/foundation/_routes/rv-lite/config/_models/ICameraConfiguration\";\r\nimport { ConfigManagerService } from \"@app/main/modules/foundation/_routes/rv-lite/config/_services/config.service\";\r\nimport { DateService, DateUnit } from \"@app/services/date.service\";\r\nimport { MapService } from \"@app/services/map.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { combineLatest, Observable, of, Subject } from \"rxjs\";\r\nimport { mergeMap, takeUntil, tap } from \"rxjs/operators\";\r\nimport { CameraCommandType, IPulseRecord } from \"../../_models/IPulseRecord\";\r\nimport { IPulseRecordPayload } from \"../../_models/IPulseRecordPayload\";\r\nimport './pulse-messages.component.scss';\r\nimport { PulseService } from \"./pulse.service\";\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'pulse-messages',\r\n template: require('./pulse-messages.component.html')\r\n})\r\nexport class PulseMessagesComponent implements OnInit {\r\n @Input() serial: string;\r\n @ViewChild('messagesTable') table: VTableComponent;\r\n\r\n messages: IPulseRecord[] = [];\r\n configs: ICameraConfiguration[] = [];\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[] = [];\r\n exportTitle: string;\r\n\r\n selectedMessage: IPulseRecord;\r\n selectedPayload: IPulseRecordPayload;\r\n selectedMessagePlot: IPlot;\r\n selectedMessageLocation: google.maps.LatLng;\r\n locationMarker: IGoogleMapsMarker;\r\n\r\n startDate: Date;\r\n endDate: Date;\r\n\r\n loading: boolean;\r\n liveUpdates: boolean = true;\r\n cancelLiveUpdates$ = new Subject();\r\n\r\n CameraCommandType = CameraCommandType;\r\n\r\n constructor(\r\n private readonly cd: ChangeDetectorRef,\r\n private readonly dateService: DateService,\r\n private readonly mapService: MapService,\r\n private readonly pulseService: PulseService,\r\n private readonly configManagerService: ConfigManagerService,\r\n private readonly translationService: TranslationService,\r\n private readonly vTableService: VTableService) { }\r\n\r\n ngOnInit(): void {\r\n this.initDates();\r\n this.createTable();\r\n this.getHistoricalMessagesAndSubscribeToNew();\r\n }\r\n\r\n showMessageDetail(row: IVTableRow): void {\r\n this.selectedMessage = row.data;\r\n this.selectedMessagePlot = this.createPlot(this.selectedMessage);\r\n this.selectedMessageLocation = this.createLocation(this.selectedMessage);\r\n this.selectedPayload = this.selectedMessage.parsedPayload || this.getParsedPayload(this.selectedMessage);\r\n\r\n const label = (this.selectedPayload.GPS?.speed || 0).toString();\r\n this.locationMarker = this.mapService.createMapMarker(this.selectedMessagePlot, { label: label, showLabel: true });\r\n }\r\n \r\n clearSelectedMessage(): void {\r\n this.selectedMessage = null;\r\n this.selectedMessagePlot = null;\r\n this.locationMarker = null;\r\n }\r\n\r\n onFilterChanged(filterEvent: IAggregateFilterEvent): void {\r\n if (filterEvent.trigger == \"date\") {\r\n this.cancelLiveUpdates$.next();\r\n this.startDate = filterEvent.date[0];\r\n this.endDate = filterEvent.date[1];\r\n this.setLiveUpdates();\r\n this.getHistoricalMessagesAndSubscribeToNew();\r\n return;\r\n }\r\n }\r\n\r\n\r\n //--\r\n\r\n private getHistoricalMessagesAndSubscribeToNew(): void {\r\n this.loading = true;\r\n\r\n combineLatest([\r\n this.pulseService.getHistoricalPulseMessages({ Serial: this.serial, Start: this.startDate, End: this.endDate }),\r\n this.configManagerService.getConfigs()\r\n ]).pipe(\r\n untilDestroyed(this),\r\n tap(([historicalMessages, configs]) => {\r\n this.messages = historicalMessages;\r\n this.configs = configs;\r\n\r\n this.tableRows = this.vTableService.createTableRows(this.messages, this.tableColumns);\r\n this.createExportTitle();\r\n\r\n this.loading = false;\r\n\r\n return;\r\n }),\r\n mergeMap(() => {\r\n // Subscribe to new messages\r\n return this.subscribeToLiveMessages();\r\n })\r\n )\r\n .subscribe();\r\n }\r\n\r\n private subscribeToLiveMessages(): Observable {\r\n if (!this.liveUpdates) {\r\n return of(null);\r\n }\r\n\r\n return this.pulseService.getPulseMessages(this.serial).pipe(\r\n takeUntil(this.cancelLiveUpdates$),\r\n tap(message => {\r\n message.CreatedTime = new Date();\r\n this.messages.push(message);\r\n this.table.addNewRow(message);\r\n this.cd.detectChanges();\r\n })\r\n );\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader({ sorted: true, sortDirection: SortDirection.Descending }),\r\n createCellFunction: message => this.vTableService.createDateCell(message.CreatedTime)\r\n },\r\n {\r\n header: this.vTableService.createLocationInformationHeader({ width: null }),\r\n createCellFunction: message => this.vTableService.createLocationInformationCell({ latLng: this.createLocation(message)})\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"FoundationPeripherals.ResponseRequests\" }),\r\n createCellFunction: message => this.vTableService.createTableCell(this.getEnumFlagsAsString(message.CameraCommandType), {\r\n component: VPillsComponent,\r\n componentInputs: {\r\n pills: this.getFlagsEnumAsPills(message.CameraCommandType)\r\n }\r\n })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"FoundationPeripherals.UpdaterVersion\", width: 150 }),\r\n createCellFunction: message => this.vTableService.createTableCell(this.getFirmwareVersion(message))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"FoundationPeripherals.TelematicsVersion\", width: 150 }),\r\n createCellFunction: message => this.vTableService.createTableCell(this.getTelematicsVersion(message))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"FoundationPeripherals.ConfigVersion\" }),\r\n createCellFunction: message => this.vTableService.createTableCell(this.getConfigVersion(message))\r\n }\r\n ]\r\n }\r\n\r\n private createPlot(message: IPulseRecord): IPlot {\r\n if (!message.Payload) {\r\n return;\r\n }\r\n\r\n message.parsedPayload = this.getParsedPayload(message);\r\n return {\r\n Latitude: +message.parsedPayload.GPS.latitude,\r\n Longitude: +message.parsedPayload.GPS.longitude\r\n }\r\n }\r\n \r\n private createLocation(message: IPulseRecord): google.maps.LatLng {\r\n if (!message.Payload) {\r\n return;\r\n }\r\n\r\n message.parsedPayload = this.getParsedPayload(message);\r\n\r\n return new google.maps.LatLng(+message.parsedPayload.GPS.latitude, +message.parsedPayload.GPS.longitude);\r\n\r\n }\r\n\r\n private getTelematicsVersion(message: IPulseRecord) : string {\r\n const payload = this.getParsedPayload(message);\r\n const application = payload['Applications'];\r\n\r\n return application[0].AppVersion; \r\n }\r\n\r\n private getConfigVersion(message: IPulseRecord) : string {\r\n const payload = this.getParsedPayload(message);\r\n\r\n let cameraConfigId = parseInt(payload.HardwareConfigName);\r\n\r\n if (isNaN(cameraConfigId) && !(payload.HardwareConfigName in this.commServerToVerilocationConfigMappings)) {\r\n return `CommServerUrlRef: ${payload.HardwareConfigName}`;\r\n } else if (isNaN(cameraConfigId)) {\r\n cameraConfigId = this.commServerToVerilocationConfigMappings[payload.HardwareConfigName];\r\n }\r\n\r\n return this.configs.find(config => config.Id == cameraConfigId)?.Name ?? \"Unknown\";\r\n }\r\n\r\n private commServerToVerilocationConfigMappings: { [key: string]: number } = {\r\n \"C157A7C1-723D-408C-B7D9-32D27DBDE60D\": 3,\r\n \"b2258a1a-168e-466b-ae23-6dfac432624f\": 4\r\n };\r\n\r\n private getFirmwareVersion(message: IPulseRecord) : string {\r\n const payload = this.getParsedPayload(message);\r\n\r\n return payload['FirmwareVersion'];\r\n }\r\n\r\n private getParsedPayload(message: IPulseRecord): IPulseRecordPayload {\r\n return JSON.parse(message.Payload);\r\n }\r\n\r\n private GetEnumFlagsAsList(flags: CameraCommandType): string[] {\r\n return Object.values(CameraCommandType)\r\n .filter((value) => typeof value === 'number' && (flags & value) !== 0)\r\n .map((value) => CameraCommandType[value])\r\n .filter((name) => name !== undefined);\r\n }\r\n\r\n private getFlagsEnumAsPills(flags: CameraCommandType): IPill[] {\r\n const flagNames = this.GetEnumFlagsAsList(flags);\r\n\r\n let flagPills: IPill[] = [];\r\n\r\n flagNames.forEach(f => {\r\n flagPills.push({\r\n label: f.replace(/([A-Z])/g, ' $1').trim()\r\n });\r\n });\r\n\r\n return flagPills;\r\n }\r\n\r\n private getEnumFlagsAsString(flags: CameraCommandType): string {\r\n const flagNames = this.GetEnumFlagsAsList(flags);\r\n\r\n if (!flagNames.length) {\r\n return \"None\";\r\n }\r\n\r\n return flagNames.join(', ');\r\n }\r\n\r\n private initDates(): void {\r\n this.startDate = this.dateService.getStartOfDay(new Date);\r\n this.endDate = this.dateService.getEndOfDay(new Date)\r\n }\r\n\r\n private setLiveUpdates(): void {\r\n // Only subscribe to new messages if the end date is within the last 15 minutes or in the future\r\n this.liveUpdates = this.dateService.date1IsAfterDate2(this.endDate, this.dateService.addOrSubtractTime(new Date(), -15, DateUnit.Min));\r\n }\r\n\r\n private createExportTitle(): void {\r\n this.exportTitle = this.translationService.t('FoundationPeripherals.PulseMessages') + \" \" + this.dateService.formatDate(this.startDate);\r\n }\r\n}\r\n","module.exports = \"
{{ selectedMessage.CreatedTime | vDate : {dateTime: true} }} {{ selectedMessage.CameraCommandType | enumAsString : CameraCommandType : 'CameraCommandType' }} {{ 'FoundationPeripherals.Ignition' | translate }} {{ selectedPayload.ignitionStatus ? ('FoundationPeripherals.IgnitionOnSince' | translate : (selectedPayload.LastIgnitionChangeTime | vDate : {dateTime: true}) ) : ('FoundationPeripherals.IgnitionOffSince' | translate : (selectedPayload.LastIgnitionChangeTime | vDate : {dateTime: true}) ) }}
\";","import { Component, Input } from \"@angular/core\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { tap } from \"rxjs/operators\";\r\nimport { ICameraCommand } from \"../../../_models/ICameraCommand\";\r\nimport { CameraCommandType } from \"../../../_models/IPulseRecord\";\r\nimport { PulseService } from \"../pulse.service\";\r\nimport './pulse-response.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'pulse-response',\r\n template: require('./pulse-response.component.html')\r\n})\r\nexport class PulseResponseComponent {\r\n @Input() pulseRecordId: number;\r\n\r\n pulseResponse: ICameraCommand;\r\n\r\n CameraCommandType = CameraCommandType;\r\n\r\n constructor(\r\n private readonly pulseService: PulseService) { }\r\n\r\n ngOnInit(): void {\r\n this.getPulseResponse();\r\n }\r\n\r\n //--\r\n\r\n private getPulseResponse(): void {\r\n this.pulseService.getPulseResponse(this.pulseRecordId).pipe(\r\n untilDestroyed(this),\r\n tap(response => {\r\n this.pulseResponse = response;\r\n })\r\n ).subscribe()\r\n }\r\n}\r\n","module.exports = \" done {{ 'Common.Success' | translate }}
  • {{ command.requestDate | vDate : { dateTime: true } }} - {{ command.command }}
{{ 'PulseResponse.NoCommands' | translate }}
{{ pulseResponse.CreatedTime | vDate : { dateTime: true } }}
{{ 'PulseResponse.NoRequests' | translate }}
{{ pulseResponse.parsedCommand.assets | json }}
\";","import { Component, EventEmitter, Input, Output } from \"@angular/core\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { AccountFeatures } from \"@app/enum/account/AccountFeature\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { IPeripheral, IUnit } from \"@app/interfaces/IPeripheral\";\r\nimport { ISim } from \"@app/interfaces/ISim\";\r\nimport { ISimMapping } from \"@app/interfaces/ISimMapping\";\r\nimport { FoundationNavigationModule } from \"@app/main/modules/foundation/foundation.navigation\";\r\nimport { PeripheralService } from \"@app/main/modules/foundation/_services/peripheral.service\";\r\nimport { SimMappingService } from \"@app/main/modules/foundation/_services/sim-mapping.service\";\r\nimport { UnitsService } from \"@app/main/modules/foundation/_services/unit.service\";\r\nimport { AccountFeatureService } from \"@app/services/accountFeature.service\";\r\nimport { NavigationService } from \"@app/services/navigation.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { EMPTY, Observable, of } from \"rxjs\";\r\nimport { map, mergeMap, tap } from \"rxjs/operators\";\r\nimport './sim-detail.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'sim-detail',\r\n template: require('./sim-detail.component.html')\r\n})\r\nexport class SimDetailComponent {\r\n @Input() sim: ISim;\r\n\r\n @Output() mappingUpdate = new EventEmitter();\r\n\r\n allMappings: ISimMapping[];\r\n currentMapping: ISimMapping;\r\n mappedHardware: IPeripheral;\r\n\r\n isPeripheral: boolean;\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n loading: boolean = true;\r\n\r\n constructor(\r\n private readonly accountFeatureService: AccountFeatureService,\r\n private readonly navigationService: NavigationService,\r\n private readonly peripheralService: PeripheralService,\r\n private readonly simMappingService: SimMappingService,\r\n private readonly translationService: TranslationService,\r\n private readonly unitService: UnitsService,\r\n private readonly vTableService: VTableService\r\n ) { }\r\n\r\n ngOnChanges(): void {\r\n this.createTable();\r\n this.getMappingForSelectedSim();\r\n }\r\n\r\n\r\n goToUnitOrPeripheral(): void {\r\n let isCamera: boolean;\r\n let navigationPath: string = FoundationNavigationModule.Units;\r\n let params: any = { unitSerial: this.mappedHardware.Serial };\r\n\r\n if (this.isPeripheral) {\r\n isCamera = this.accountFeatureService.featureFlagsHaveFeatureAccess(this.mappedHardware.Product?.Features, AccountFeatures.Camera)\r\n navigationPath = isCamera ? FoundationNavigationModule.Cameras : FoundationNavigationModule.Peripherals;\r\n params = { serial: this.mappedHardware.Serial }\r\n }\r\n\r\n this.navigationService.go(`${navigationPath}.view`, params);\r\n }\r\n\r\n goToVehicle(): void {\r\n if (!this.mappedHardware?.vehicleMapping) {\r\n return;\r\n }\r\n\r\n this.navigationService.go(FoundationNavigationModule.VehicleView, { vehicleId: this.mappedHardware.vehicleMapping.VehicleId });\r\n }\r\n\r\n unassignSim(confirm: boolean): void {\r\n if (!confirm) {\r\n return;\r\n }\r\n\r\n this.loading = true;\r\n\r\n this.simMappingService.endSimMapping(this.currentMapping).pipe(\r\n untilDestroyed(this),\r\n tap(() => {\r\n this.allMappings.find(mapping => mapping.Id == this.currentMapping.Id).EndUtc = new Date().toISOString();\r\n this.clearAllSimData();\r\n this.mappingUpdate.emit(null);\r\n this.createSimHistoryTableRows();\r\n })\r\n ).subscribe({\r\n complete: () => this.loading = false\r\n });\r\n }\r\n\r\n //--\r\n\r\n private getMappingForSelectedSim(): void {\r\n this.loading = true;\r\n\r\n this.simMappingService.getSimMappings({ SimId: this.sim.Id }).pipe(\r\n untilDestroyed(this),\r\n mergeMap(mappings => {\r\n this.allMappings = mappings;\r\n this.currentMapping = mappings.find(mapping => !mapping.EndUtc);\r\n this.mappingUpdate.emit(this.currentMapping)\r\n\r\n this.createSimHistoryTableRows();\r\n\r\n return this.currentMapping ? this.peripheralService.getPeripheralBySerial(this.currentMapping.Serial) : EMPTY;\r\n }),\r\n mergeMap(peripheral => {\r\n if (!this.currentMapping) {\r\n return EMPTY;\r\n }\r\n\r\n if (peripheral) {\r\n this.isPeripheral = true;\r\n return of(peripheral);\r\n }\r\n\r\n return this.getMappedUnit();\r\n })\r\n )\r\n .subscribe({\r\n next: hardware => {\r\n this.mappedHardware = hardware;\r\n },\r\n complete: () => this.loading = false,\r\n error: () => this.loading = false\r\n })\r\n }\r\n\r\n private getMappedUnit(): Observable {\r\n return this.unitService.getUnitBySerial(this.currentMapping.Serial).pipe(\r\n map(searchResponse => {\r\n return searchResponse.Unit;\r\n })\r\n )\r\n }\r\n\r\n private clearAllSimData(): void {\r\n this.currentMapping = null;\r\n this.mappedHardware = null;\r\n }\r\n\r\n private createSimHistoryTableRows(): void {\r\n this.tableRows = this.vTableService.createTableRows(this.allMappings, this.tableColumns);\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Serial\" }),\r\n createCellFunction: simMapping => this.vTableService.createTableCell(simMapping.Serial)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"Common.Start\" }),\r\n createCellFunction: simMapping => this.vTableService.createDateCell(simMapping.StartUtc)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"Common.End\", sorted: true, sortDirection: SortDirection.Descending }),\r\n createCellFunction: simMapping => {\r\n if (simMapping.EndUtc) {\r\n return this.vTableService.createDateCell(simMapping.EndUtc)\r\n }\r\n\r\n return this.vTableService.createTableCell(this.translationService.t(\"FoundationHardware.Current\"));\r\n }\r\n }\r\n ];\r\n }\r\n}\r\n","module.exports = \"
{{ 'FoundationSims.ViewVehicle' | translate }} {{ 'FoundationSims.View' | translate }}
{{ 'FoundationSims.NoHardware' | translate }}
\";","module.exports = \"
{{ 'FoundationSims.ICCID' | translate }}: {{selectedSim.Iccid}} {{ 'FoundationSims.Imsi' | translate }} {{ selectedSim.Imsi }} {{ selectedSim.Type | enumAsString : SimType : \\\"SimType\\\" }} {{ selectedSim.Status | enumAsString : SimStatus : \\\"SimStatus\\\" }}
\";","import { Component, Input, OnInit } from '@angular/core';\r\nimport { IVTableColumn } from '@app/directives/_layout/v-table/_models/IVTableColumn';\r\nimport { VTableService } from '@app/directives/_layout/v-table/_services/v-table.service';\r\nimport { IUnit } from '@app/interfaces/IPeripheral';\r\nimport { ISimMapping } from '@app/interfaces/ISimMapping';\r\nimport { SimMappingService } from '@app/main/modules/foundation/_services/sim-mapping.service';\r\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\r\nimport { Observable, Subscription } from 'rxjs';\r\nimport { tap } from 'rxjs/operators';\r\nimport './sim-unit-summary.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'sim-unit-summary',\r\n template: require('./sim-unit-summary.component.html')\r\n})\r\nexport class SimUnitSummaryComponent implements OnInit {\r\n @Input() unit: IUnit;\r\n\r\n\r\n showUpdateSim: boolean;\r\n newSimIccid: string;\r\n simExists: boolean;\r\n validationError: string = \"\";\r\n\r\n loading: boolean;\r\n loadingValidation: boolean;\r\n\r\n simMappingHistory$: Observable;\r\n tableColumns: IVTableColumn[];\r\n\r\n simValidationSubscription: Subscription;\r\n\r\n constructor(\r\n private readonly simMappingService: SimMappingService,\r\n private readonly vTableService: VTableService) { }\r\n\r\n ngOnInit(): void {\r\n this.loadData();\r\n }\r\n\r\n onSimUpdated(): void {\r\n this.getSimMappingHistory();\r\n }\r\n\r\n //--\r\n\r\n private loadData(): void {\r\n this.createTable();\r\n this.getSimMappingHistory();\r\n }\r\n\r\n private getSimMappingHistory(): void {\r\n this.simMappingService.getSimMappings({ IsActive: true, Serial: this.unit.Serial }).pipe(\r\n untilDestroyed(this),\r\n tap(mappings => {\r\n if (!mappings.length) {\r\n return;\r\n }\r\n\r\n this.simMappingHistory$ = this.simMappingService.getSimMappings({ SimId: mappings[0]?.SimId });\r\n })\r\n ).subscribe();\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'FoundationUnits.Unit', sortable: true, width: 100, minTableWidth: 300 }),\r\n createCellFunction: mapping => this.vTableService.createTableCell(mapping.Serial)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: 'Common.From' }),\r\n createCellFunction: mapping => this.vTableService.createDateCell(mapping.StartUtc)\r\n },\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: 'Common.To' }),\r\n createCellFunction: mapping => this.vTableService.createDateCell(mapping.EndUtc)\r\n }\r\n ]\r\n }\r\n}\r\n","module.exports = \"
{{ 'FoundationUnits.SimData' | translate }}
{{ 'FoundationUnits.SimStatus' | translate }}
{{ 'FoundationUnits.SimHistory' | translate }}
\";","module.exports = \" {{ 'FoundationUnits.DeviceImport' | translate }} \";","module.exports = \" {{selectedLog.EventType}}: {{selectedLog.Timestamp | vDate : { dateTime: true } }} {{ 'FoundationUnits.ProcessedSuccessfully' | translate }} {{ 'FoundationUnits.ErrorProcessing' | translate }} Processing Time {{ selectedLog.ProcessingTime | number }}ms

Raw Data

{{selectedLog.Raw}}

Error

{{selectedLog.ErrorMessage}}
\";","import { Component, Input, OnInit } from '@angular/core';\r\nimport { IVTableColumn } from '@app/directives/_layout/v-table/_models/IVTableColumn';\r\nimport { VTableService } from '@app/directives/_layout/v-table/_services/v-table.service';\r\nimport { SortDirection } from '@app/enum/SortDirection';\r\nimport { SortType } from '@app/enum/SortType';\r\nimport { IAccountUnitMappingExtended } from '@app/interfaces/IAccountUnitMappingExtended';\r\nimport { IVehicleUnitMappingExtended } from '@app/interfaces/IVehicleUnitMappingExtended';\r\nimport { IConfigMappings, IFirmwareMappings, UnitConfigAndFirmwareStatus } from '@app/main/modules/foundation/_services/peripheral.service.ajs';\r\nimport { Observable } from 'rxjs';\r\nimport { HardwareMappingService } from '../../../_services/hardware-mapping.service';\r\nimport './unit-overview.component.scss';\r\n\r\n@Component({\r\n selector: 'unit-overview',\r\n template: require('./unit-overview.component.html')\r\n})\r\nexport class UnitOverviewComponent implements OnInit {\r\n @Input() serial: string;\r\n\r\n accountMapping$: Observable\r\n configData$: Observable;\r\n firmwareData$: Observable;\r\n vehicleData$: Observable;\r\n\r\n accountTableColumns: IVTableColumn[];\r\n configTableColumns: IVTableColumn[];\r\n firmwareTableColumns: IVTableColumn[];\r\n vehicleTableColumns: IVTableColumn[];\r\n\r\n loading: boolean;\r\n\r\n constructor(\r\n private readonly hardwareMappingService: HardwareMappingService,\r\n private readonly vTableService: VTableService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.loadData();\r\n }\r\n\r\n //--\r\n\r\n private loadData(): void {\r\n this.loading = true;\r\n this.createTables();\r\n\r\n this.accountMapping$ = this.hardwareMappingService.getAccountMappings(this.serial);\r\n this.configData$ = this.hardwareMappingService.getConfigMappings(this.serial);\r\n this.firmwareData$ = this.hardwareMappingService.getFirmwareMappings(this.serial);\r\n this.vehicleData$ = this.hardwareMappingService.getVehicleMappings(this.serial);\r\n }\r\n\r\n private createTables(): void {\r\n\r\n this.configTableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Config\", width: 180 }),\r\n createCellFunction: config => this.vTableService.createTableCell(`${config.Identifier} - ${config.Description}`)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Status\", width: 100 }),\r\n createCellFunction: config => this.vTableService.createEnumCell(UnitConfigAndFirmwareStatus, \"UnitConfigAndFirmwareStatus\", config.UnitConfigStatus)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Start\", width: 200, sorted: true, sortType: SortType.Date, sortDirection: SortDirection.Descending }),\r\n createCellFunction: config => {\r\n const formattedDate = this.hardwareMappingService.getDateDescription(config.StartUtc);\r\n return this.vTableService.createTableCell(formattedDate, { sortData: new Date(config.StartUtc) });\r\n }\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.End\", width: 200 }),\r\n createCellFunction: config => {\r\n const formattedDate = this.hardwareMappingService.getDateDescription(config.EndUtc);\r\n return this.vTableService.createTableCell(formattedDate);\r\n }\r\n }\r\n ];\r\n\r\n this.firmwareTableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Firmware\", width: 180 }),\r\n createCellFunction: config => this.vTableService.createTableCell(config.Description)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Status\", width: 100 }),\r\n createCellFunction: config => this.vTableService.createEnumCell(UnitConfigAndFirmwareStatus, \"UnitConfigAndFirmwareStatus\", config.UnitFirmwareStatus)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Start\", width: 200, sorted: true, sortType: SortType.Date, sortDirection: SortDirection.Descending }),\r\n createCellFunction: config => {\r\n const formattedDate = this.hardwareMappingService.getDateDescription(config.StartUtc);\r\n return this.vTableService.createTableCell(formattedDate, { sortData: new Date(config.StartUtc) });\r\n }\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.End\", width: 200 }),\r\n createCellFunction: config => {\r\n const formattedDate = this.hardwareMappingService.getDateDescription(config.EndUtc);\r\n return this.vTableService.createTableCell(formattedDate);\r\n }\r\n }\r\n ];\r\n\r\n this.vehicleTableColumns = [\r\n {\r\n header: this.vTableService.createVehicleTableHeader(),\r\n createCellFunction: vehicle => this.vTableService.createVehicleRegCell(vehicle)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Start\", width: 200, sorted: true, sortType: SortType.Date, sortDirection: SortDirection.Descending }),\r\n createCellFunction: vehicle => {\r\n const formattedDate = this.hardwareMappingService.getDateDescription(vehicle.StartUtc);\r\n return this.vTableService.createTableCell(formattedDate, { sortData: new Date(vehicle.StartUtc) });\r\n }\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.End\", width: 200 }),\r\n createCellFunction: vehicle => {\r\n const formattedDate = this.hardwareMappingService.getDateDescription(vehicle.EndUtc);\r\n return this.vTableService.createTableCell(formattedDate);\r\n }\r\n }\r\n ];\r\n\r\n this.accountTableColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Company\", width: 180 }),\r\n createCellFunction: account => this.vTableService.createTableCell(account.CompanyName)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Start\", width: 200, sorted: true, sortType: SortType.Date, sortDirection: SortDirection.Descending }),\r\n createCellFunction: account => {\r\n const formattedDate = this.hardwareMappingService.getDateDescription(account.StartUtc);\r\n return this.vTableService.createTableCell(formattedDate, { sortData: new Date(account.StartUtc) });\r\n }\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.End\", width: 200 }),\r\n createCellFunction: account => {\r\n const formattedDate = this.hardwareMappingService.getDateDescription(account.EndUtc);\r\n return this.vTableService.createTableCell(formattedDate);\r\n }\r\n }\r\n ];\r\n }\r\n\r\n}\r\n","module.exports = \"
{{ \\\"FoundationUnits.DeviceConfig\\\" | translate }}
{{ \\\"FoundationUnits.FirmwareHistory\\\" | translate }}
{{ \\\"FoundationUnits.VehicleHistory\\\" | translate }}
{{ \\\"FoundationUnits.AccountHistory\\\" | translate }}
\";","import { Component, Input, OnInit } from \"@angular/core\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { IAggregateFilterEvent } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { SortDirection } from \"@app/enum/SortDirection\";\r\nimport { SortType } from \"@app/enum/SortType\";\r\nimport { IGoogleMapsMarker } from \"@app/interfaces/IGoogleMapsMarkerOptions\";\r\nimport { IUnit } from \"@app/interfaces/IPeripheral\";\r\nimport { IPlot } from \"@app/interfaces/IPlot\";\r\nimport { IVehicle } from \"@app/interfaces/IVehicle\";\r\nimport { UnitsService } from \"@app/main/modules/foundation/_services/unit.service\";\r\nimport { FoundationVehiclesService } from \"@app/main/modules/foundation/_services/vehicle.service\";\r\nimport { DateService } from \"@app/services/date.service\";\r\nimport { MapService } from \"@app/services/map.service\";\r\nimport { ReasonCodeService } from \"@app/services/reasonCode.service\";\r\nimport { UnitConversionService, UnitConversionType } from \"@app/services/unitConversion.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { Observable, of, Subscription } from \"rxjs\";\r\nimport { finalize, switchMap, tap } from \"rxjs/operators\";\r\nimport './unit-plots.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'unit-plots',\r\n template: require('./unit-plots.component.html')\r\n})\r\nexport class UnitPlotsComponent implements OnInit {\r\n @Input() unit: IUnit;\r\n\r\n plots: IPlot[];\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n\r\n startDate: Date;\r\n endDate: Date;\r\n\r\n lastPlotDate: Date;\r\n selectedPlot: IPlot;\r\n selectedPlotVehicle: IVehicle;\r\n locationMarker: IGoogleMapsMarker;\r\n\r\n loading: boolean;\r\n\r\n plotsSubscription: Subscription;\r\n plotVehicleSubscription: Subscription;\r\n\r\n constructor(\r\n private readonly dateService: DateService,\r\n private readonly mapService: MapService,\r\n private readonly reasonCodeService: ReasonCodeService,\r\n private readonly unitConversionService: UnitConversionService,\r\n private readonly unitService: UnitsService,\r\n private readonly vehicleService: FoundationVehiclesService,\r\n private readonly vTableService: VTableService) { }\r\n\r\n ngOnInit(): void {\r\n this.loadData();\r\n }\r\n\r\n onFilterChanged(filterEvent: IAggregateFilterEvent): void {\r\n if (filterEvent.trigger == \"date\" && filterEvent.sourcedata != undefined) {\r\n this.startDate = filterEvent.date[0];\r\n this.endDate = filterEvent.date[1];\r\n this.onDateChanged();\r\n }\r\n }\r\n\r\n onDateChanged(): void {\r\n this.loading = true;\r\n this.plotsSubscription?.unsubscribe();\r\n this.plotsSubscription = this.unitService.getUnitPlotsByImei(this.unit.Imei, this.startDate, this.endDate).pipe(untilDestroyed(this), finalize(() => this.loading = false)).subscribe(plots => {\r\n this.plots = plots;\r\n this.tableRows = this.vTableService.createTableRows(plots, this.tableColumns);\r\n })\r\n }\r\n\r\n onRowClicked(row: IVTableRow): void {\r\n this.selectedPlot = row.data;\r\n this.locationMarker = this.mapService.createMapMarker(row.data, { label: row.data.Velocity.toString(), showLabel: true });\r\n this.getPlotVehicle();\r\n }\r\n\r\n closeSidebar(): void {\r\n this.selectedPlot = null;\r\n this.locationMarker = null;\r\n this.plotVehicleSubscription?.unsubscribe();\r\n }\r\n\r\n getLastAvailablePlots(): void {\r\n this.startDate = this.dateService.getStartOfDay(this.lastPlotDate);\r\n this.endDate = this.dateService.getEndOfDay(this.lastPlotDate);\r\n this.onDateChanged();\r\n }\r\n\r\n //--\r\n\r\n private loadData(): void {\r\n this.createTables();\r\n this.initialiseStartAndEndDates();\r\n this.loading = true;\r\n this.plotsSubscription = this.getPlots().pipe(untilDestroyed(this), finalize(() => this.loading = false)).subscribe();\r\n }\r\n\r\n private getPlots(): Observable {\r\n return this.unitService.getUnitPlotsByImei(this.unit.Imei, this.startDate, this.endDate).pipe(\r\n switchMap(plots => {\r\n if (plots.length) {\r\n this.plots = plots;\r\n this.tableRows = this.vTableService.createTableRows(plots, this.tableColumns);\r\n return of(true);\r\n }\r\n return this.unitService.getLatestUnitPlotsByImei(this.unit.Imei, 1).pipe(\r\n tap(plot => {\r\n this.lastPlotDate = plot.length && new Date(plot[0].Utc);\r\n })\r\n )\r\n })\r\n )\r\n }\r\n\r\n private initialiseStartAndEndDates(): void {\r\n this.startDate = this.dateService.getStartOfDay(new Date());\r\n this.endDate = this.dateService.getEndOfDay(new Date());\r\n }\r\n\r\n private getPlotVehicle(): void {\r\n this.plotVehicleSubscription = this.vehicleService.getVehicle(this.selectedPlot.VehicleId).pipe(untilDestroyed(this)).subscribe(vehicle => {\r\n this.selectedPlotVehicle = vehicle;\r\n })\r\n }\r\n\r\n private createTables(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader({ tKey: \"Common.Time\", width: 180, sorted: true, sortDirection: SortDirection.Descending }),\r\n createCellFunction: plot => this.vTableService.createDateCell(plot.Utc)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Satellites\", width: 120, sortType: SortType.Number }),\r\n createCellFunction: plot => this.vTableService.createTableCell(plot.Sats)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Rssi\", width: 60, sortType: SortType.Number }),\r\n createCellFunction: plot => this.vTableService.createTableCell(plot.Rssi)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Reason\", width: 120 }),\r\n createCellFunction: plot => this.vTableService.createTableCell(this.reasonCodeService.getReasonCodeLabel(plot.Reason))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Velocity\", width: 100, sortType: SortType.Number }),\r\n createCellFunction: plot => this.vTableService.createTableCell(plot.Velocity + \" kph\", { sortData: plot.Velocity })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Odometer\", width: 140, sortType: SortType.Number }),\r\n createCellFunction: plot => this.vTableService.createTableCell(this.unitConversionService.smartConvert(plot.Odometer / 1000, UnitConversionType.Distance), { sortData: plot.Odometer })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Location\", sortable: false }),\r\n createCellFunction: plot => this.vTableService.createLocationInformationCell({ plot })\r\n }\r\n ]\r\n }\r\n}\r\n","module.exports = \" {{ 'FoundationUnits.GetPlotsFromDate' | translate : ( lastPlotDate | vDate ) }}
{{ selectedPlot.Utc | vDate : {dateTime: true} }}
\";","module.exports = \" {{ unit.name }} {{ 'Common.Serial' | translate }}: {{ unit.Serial }} IMEI: {{ unit.Imei }} \";","module.exports = \" {{ 'ReleaseNotes.ViewCustomerReleaseNotes' | translate }}
{{rn.CreatedOn | veriDate : 'date'}}
{{ 'ReleaseNotes.DraftNextRelease' | translate }}
{{rn.Classification}}
{{env}}
{{ 'ReleaseNotes.Version' | translate }}: {{rn.Version}}
{{ 'ReleaseNotes.ChangesOnNextDeployment' | translate }}
{{rn.PBIs.length}} {{ 'ReleaseNotes.Enhancements' | translate }}
{{rn.CustomerBugs.length}} {{ 'ReleaseNotes.CustomerBugfixes' | translate }}
{{rn.Bugs.length}} {{ 'ReleaseNotes.Bugfixes' | translate }}
  • {{ 'ReleaseNotes.CustomerRequest' | translate }}
{{ 'ReleaseNotes.Display' | translate }} #{{selectedChange.Id}} {{ 'ReleaseNotes.OnAzureDevops' | translate }}
\";","import { CommonModule } from \"@angular/common\";\r\nimport { CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA, NgModule } from \"@angular/core\";\r\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\r\nimport { VTableModule } from \"@app/directives/_layout/v-table/v-table.module\";\r\nimport { MapDirectivesModule } from \"@app/directives/_map/_map.directives.module\";\r\nimport { ResourceFiltersDirectivesModule } from \"@app/directives/_resourceFilters/_resourceFilters.directives.module\";\r\nimport { ResourceManagementModule } from \"@app/main/components/resourceManagement/resourceManagement.module\";\r\nimport { CommserverMigration } from \"@app/main/modules/foundation/_routes/rv-lite/commserver-migration/commserver-migration.component\";\r\nimport { CoreDirectivesModule } from \"@directives/_core/_core.directives.module\";\r\nimport { FormsDirectivesModule } from \"@directives/_forms/_form.directives.module\";\r\nimport { LayoutDirectivesModule } from \"@directives/_layout/_layout.directives.module\";\r\nimport { MiscDirectivesModule } from \"@directives/_misc/_misc.directives.module\";\r\nimport { VeriDirectivesModule } from \"@directives/_veri/_veri.directives.module\";\r\nimport { PipesModule } from \"src/app/_pipes/_pipes.module\";\r\nimport { VehicleDirectivesModule } from \"../../../../../directives/_vehicle/_vehicle.directives.module\";\r\nimport { FoundationComponentsModule } from \"../../_components/components.modules\";\r\nimport { CommissionModule } from \"../commissions/commission.module\";\r\nimport { AppEditorComponent } from \"./application/_components/application-editor/application-editor.component\";\r\nimport { ApplicationManagerComponent } from \"./application/_components/application-manager/application-manager.component\";\r\nimport { CameraConfigurationComponent } from \"./camera-config/camera-configuration.component\";\r\nimport { ConfigEditorComponent } from \"./config/_components/config-editor/config-editor.component\";\r\nimport { ConfigManagerComponent } from \"./config/_components/config-manager/config-manager.component\";\r\nimport { RVLiteComponent } from \"./rv-lite.component\";\r\n\r\nconst privateComponents: any[] = [\r\n];\r\n\r\nconst publicComponents: any[] = [\r\n RVLiteComponent,\r\n ConfigManagerComponent,\r\n ConfigEditorComponent,\r\n ApplicationManagerComponent,\r\n AppEditorComponent,\r\n CameraConfigurationComponent,\r\n CommserverMigration\r\n];\r\n\r\nconst declarations: any[] = [\r\n];\r\n\r\nconst providers: any[] = [\r\n\r\n];\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n PipesModule,\r\n FormsModule,\r\n FormsDirectivesModule,\r\n ReactiveFormsModule,\r\n VeriDirectivesModule,\r\n VehicleDirectivesModule,\r\n MiscDirectivesModule,\r\n LayoutDirectivesModule,\r\n CoreDirectivesModule,\r\n VTableModule,\r\n ResourceFiltersDirectivesModule,\r\n ResourceManagementModule,\r\n FoundationComponentsModule,\r\n MapDirectivesModule,\r\n CommissionModule\r\n ],\r\n providers: providers,\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents, ...declarations],\r\n exports: [...publicComponents, ...declarations],\r\n schemas: [CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA]\r\n})\r\nexport class RVLiteModule {\r\n constructor() {\r\n }\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Component, OnInit, TemplateRef, ViewChild } from \"@angular/core\";\r\nimport { IFileUploadDetails } from \"@app/directives/_forms/fileUpload/fileUpload.component\";\r\nimport { VDialogRef } from \"@app/directives/_layout/v-dialog/v-dialog-ref\";\r\nimport { DialogService } from \"@app/directives/_layout/v-dialog/v-dialog.service\";\r\nimport { VTableRowStatus } from \"@app/directives/_layout/v-table/_enums/VTableRowStatus.enum\";\r\nimport { IVTableColumn } from \"@app/directives/_layout/v-table/_models/IVTableColumn\";\r\nimport { IVTableRow } from \"@app/directives/_layout/v-table/_models/IVTableRow\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport { IFilterBarTab } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { FilterBarService } from \"@app/directives/_resourceFilters/filter-bar/filter-bar.service\";\r\nimport { VTableSelectionType } from \"@app/enum/VTableSelectionType\";\r\nimport { CommserverMigrationStatus, IConfigurableCameraDevice, IPeripheral } from \"@app/interfaces/IPeripheral\";\r\nimport { IReseller } from \"@app/main/modules/foundation/_models/IReseller\";\r\nimport { CommServerRequestState } from \"@app/main/modules/foundation/_routes/hardware/_enums/CommServerRequestState\";\r\nimport { IConfigCameraRequest } from \"@app/main/modules/foundation/_routes/rv-lite/camera-config/camera-configuration.models\";\r\nimport { ICameraConfiguration } from \"@app/main/modules/foundation/_routes/rv-lite/config/_models/ICameraConfiguration\";\r\nimport { CameraConfigurationRequestService } from \"@app/main/modules/foundation/_routes/rv-lite/config/_services/cameraConfigurationRequestService\";\r\nimport { ConfigManagerService } from \"@app/main/modules/foundation/_routes/rv-lite/config/_services/config.service\";\r\nimport { AccountService } from \"@app/main/modules/foundation/_services/account.service\";\r\nimport { PeripheralService } from \"@app/main/modules/foundation/_services/peripheral.service\";\r\nimport { IAccount } from \"@app/services/account.service\";\r\nimport { CameraCommunicationServerService } from \"@app/services/camera/camera-communication-server.service\";\r\nimport { IDeviceInfo } from \"@app/services/cameraCommunicationServer.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { copy } from \"angular\";\r\nimport { combineLatest, forkJoin, Observable } from \"rxjs\";\r\nimport { map, tap } from \"rxjs/operators\";\r\nimport './commserver-migration.component.scss';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'commserver-migration',\r\n template: require('./commserver-migration.component.html')\r\n})\r\nexport class CommserverMigration implements OnInit {\r\n cameras: IConfigurableCameraDevice[];\r\n accounts: Map;\r\n accountsList: IAccount[];\r\n\r\n loading: boolean;\r\n processingSerials: boolean;\r\n filterTabs: IFilterBarTab[];\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n VTableSelectionType = VTableSelectionType;\r\n selectedRows: IVTableRow[];\r\n selectedDeviceColumns: IVTableColumn[];\r\n selectedDevices: IConfigurableCameraDevice[] = [];\r\n\r\n csvSerialsList: string[];\r\n csvRows: IVTableRow[];\r\n csvDevices: IConfigurableCameraDevice[] = [];\r\n failedSerials: ICsvSerialFail[] = [];\r\n failRows: IVTableRow[];\r\n failedColumns: IVTableColumn[];\r\n\r\n allConfigs: ICameraConfiguration[];\r\n migrationConfigIds: number[];\r\n\r\n showMigrationSideBar: boolean = false;\r\n showCsvSidebar: boolean = false;\r\n configRequests: IConfigCameraRequest[];\r\n\r\n resellers: IReseller[] = []\r\n\r\n @ViewChild('confirmApplyTemplate') confirmApplyTemplate: TemplateRef;\r\n dialog: VDialogRef;\r\n\r\n constructor(\r\n private readonly http: HttpClient,\r\n private readonly accountService: AccountService,\r\n private readonly filterBarService: FilterBarService,\r\n private readonly vTableService: VTableService,\r\n private readonly configService: ConfigManagerService,\r\n private readonly peripheralService: PeripheralService,\r\n private readonly configRequestService: CameraConfigurationRequestService,\r\n private readonly translationService: TranslationService,\r\n private readonly dialogService: DialogService,\r\n private readonly cameraCommunicationService: CameraCommunicationServerService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.loadData();\r\n }\r\n\r\n onMigrate() {\r\n this.dialog = this.dialogService.open(this.confirmApplyTemplate, null);\r\n }\r\n\r\n confirmMigrationAndCloseDialog() {\r\n const migrationDevices: IApiMigrationDevice[] = this.csvDevices.map(device => ({\r\n Serial: device.Serial,\r\n VehicleId: device.vehicleMapping?.vehicle?.Id\r\n }));\r\n\r\n migrationDevices.forEach(d => this.cameras.find(c => c.Serial === d.Serial).migrationStatus = CommserverMigrationStatus.InProgress);\r\n\r\n this.tableRows = this.vTableService.createTableRows(this.cameras, this.tableColumns);\r\n\r\n this.configService.applyMigration(migrationDevices).pipe(untilDestroyed(this)).subscribe({\r\n complete: () => {\r\n this.closeDialog();\r\n this.showMigrationSideBar = false;\r\n }\r\n });\r\n }\r\n\r\n closeDialog(): void {\r\n this.dialog.close();\r\n }\r\n\r\n onSelectedRowsChanged(rows: IVTableRow[]) {\r\n const selectedRowsCopy = copy(rows);\r\n this.selectedRows = selectedRowsCopy.map(row => {\r\n row.cells = row.cells.slice(2, 5);\r\n return row;\r\n });\r\n\r\n this.selectedDevices = rows.map(row => row.data);\r\n }\r\n\r\n toggleActionSidebar(): void {\r\n\r\n this.cleanRows();\r\n\r\n this.showMigrationSideBar = !this.showMigrationSideBar;\r\n\r\n if (this.showMigrationSideBar) {\r\n this.processingSerials = true;\r\n\r\n this.getDeviceInfos(this.selectedDevices.map(d => d.Serial)).pipe(untilDestroyed(this), tap(deviceInfos => {\r\n\r\n this.selectedDevices.forEach(d => {\r\n const deviceInfo = deviceInfos.find(i => i.SerialNumber === d.Serial);\r\n\r\n const updaterVersion = deviceInfo?.UpdaterVersion;\r\n const telematicsVersion = deviceInfo?.TelematicsVersion;\r\n\r\n if (updaterVersion == null || telematicsVersion == null || updaterVersion == undefined || telematicsVersion == undefined) {\r\n this.failedSerials.push({\r\n Serial: d.Serial,\r\n Reason: this.translationService.t(\"CommserverMigration.NoAppVersion\")\r\n })\r\n } else if (!this.isVersionHighEnoughToMigrate(updaterVersion, [\"3\", \"17\"]) ||\r\n !this.isVersionHighEnoughToMigrate(telematicsVersion, [\"3\", \"24\"])) {\r\n this.failedSerials.push({\r\n Serial: d.Serial,\r\n Reason: this.translationService.t(\"CommserverMigration.InsufficientAppVersion\")\r\n });\r\n } else if (d.migrationStatus === CommserverMigrationStatus.Completed) {\r\n this.failedSerials.push({\r\n Serial: d.Serial,\r\n Reason: this.translationService.t(\"CommserverMigration.AlreadyMigrated\")\r\n });\r\n } else if (d.migrationStatus === CommserverMigrationStatus.InProgress) {\r\n this.failedSerials.push({\r\n Serial: d.Serial,\r\n Reason: this.translationService.t(\"CommserverMigration.MigrationInProgress\")\r\n });\r\n } else {\r\n this.csvDevices.push(d);\r\n }\r\n });\r\n\r\n this.csvRows = this.vTableService.createTableRows(this.csvDevices, this.selectedDeviceColumns);\r\n this.failRows = this.vTableService.createTableRows(this.failedSerials, this.failedColumns);\r\n this.processingSerials = false;\r\n })).subscribe();\r\n } else {\r\n this.showCsvSidebar = false;\r\n }\r\n }\r\n\r\n private getDeviceInfos(serials: string[]): Observable {\r\n return this.http.post(`/api/communicationServer/device/infos`, serials)\r\n }\r\n\r\n private isVersionHighEnoughToMigrate(deviceVersion: string, requiredVersionArray: string[]): boolean {\r\n const splitVersionStringDevice = deviceVersion.split(\".\");\r\n\r\n return splitVersionStringDevice[0] === requiredVersionArray[0] && splitVersionStringDevice[1] === requiredVersionArray[1];\r\n }\r\n\r\n toggleCsvSidebar(): void {\r\n this.cleanRows();\r\n\r\n this.showCsvSidebar = !this.showCsvSidebar;\r\n this.showMigrationSideBar = !this.showMigrationSideBar;\r\n }\r\n\r\n cleanRows(): void {\r\n this.csvRows = [];\r\n this.failRows = [];\r\n this.csvSerialsList = [];\r\n this.csvDevices = [];\r\n this.failedSerials = [];\r\n }\r\n\r\n filterCameraByAccount(camera: IConfigurableCameraDevice, account: IAccount): boolean {\r\n return camera.vehicleMapping?.vehicle?.AccountId === account.Id;\r\n }\r\n\r\n accountSearchPredicate(account: IAccount, searchText: string): boolean {\r\n return account.CompanyName.toLowerCase().indexOf(searchText.toLowerCase()) >= 0;\r\n }\r\n\r\n filterCameraByReseller(camera: IConfigurableCameraDevice, reseller: IReseller): boolean {\r\n return camera.resellerId === reseller.Id;\r\n }\r\n\r\n resellerSearchPredicate(reseller: IReseller, searchText: string): boolean {\r\n return reseller.Description.toLowerCase().indexOf(searchText.toLowerCase()) >= 0;\r\n }\r\n\r\n ingressFile(file: IFileUploadDetails): void {\r\n this.csvRows = [];\r\n this.failRows = [];\r\n\r\n const fileReader = new FileReader();\r\n\r\n fileReader.onload = () => {\r\n const fileContent = fileReader.result as string;\r\n\r\n this.csvSerialsList = fileContent.split(',').map(serial => serial.trim());\r\n\r\n this.getDeviceInfos(this.csvSerialsList).pipe(untilDestroyed(this), tap(rtlDeviceInfos => {\r\n this.csvSerialsList.forEach(serial => {\r\n const matchingDevice = this.cameras?.find(c => c.Serial == serial);\r\n const matchingRtlInfo = rtlDeviceInfos.find(i => i.SerialNumber == serial);\r\n\r\n const updaterVersion = matchingRtlInfo?.UpdaterVersion;\r\n const telematicsVersion = matchingRtlInfo?.TelematicsVersion;\r\n\r\n if (!matchingDevice) {\r\n this.failedSerials.push({ Serial: serial, Reason: this.translationService.t(\"CommserverMigration.DoesNotExist\") });\r\n } else if (matchingDevice.migrationStatus === CommserverMigrationStatus.Completed) {\r\n this.failedSerials.push({ Serial: serial, Reason: this.translationService.t(\"CommserverMigration.AlreadyMigrated\") });\r\n } else if (matchingDevice.migrationStatus === CommserverMigrationStatus.InProgress) {\r\n this.failedSerials.push({ Serial: serial, Reason: this.translationService.t(\"CommserverMigration.MigrationInProgress\") });\r\n } else if (updaterVersion == null || telematicsVersion == null || updaterVersion == undefined || telematicsVersion == undefined) {\r\n this.failedSerials.push({\r\n Serial: serial,\r\n Reason: this.translationService.t(\"CommserverMigration.NoAppVersion\")\r\n })\r\n } else if (!this.isVersionHighEnoughToMigrate(updaterVersion, [\"3\", \"17\"]) ||\r\n !this.isVersionHighEnoughToMigrate(telematicsVersion, [\"3\", \"24\"])) {\r\n this.failedSerials.push({\r\n Serial: serial,\r\n Reason: this.translationService.t(\"CommserverMigration.InsufficientAppVersion\")\r\n });\r\n } else {\r\n this.csvDevices.push(matchingDevice);\r\n }\r\n });\r\n\r\n this.csvRows = this.vTableService.createTableRows(this.csvDevices, this.selectedDeviceColumns);\r\n this.failRows = this.vTableService.createTableRows(this.failedSerials, this.failedColumns);\r\n })).subscribe();\r\n\r\n\r\n };\r\n\r\n fileReader.readAsText(file.file);\r\n }\r\n\r\n private loadData(): void {\r\n this.loading = true;\r\n this.createTabs();\r\n this.createTable();\r\n\r\n combineLatest([\r\n this.loadAccounts(),\r\n this.loadCameras()\r\n ]).pipe(\r\n untilDestroyed(this)\r\n ).subscribe({\r\n next: () => {\r\n this.cameras.forEach(camera => {\r\n camera.resellerId = this.accountsList?.find(acc => acc.Id == camera.vehicleMapping?.vehicle?.AccountId)?.ResellerId;\r\n });\r\n\r\n this.getConfigsAndRequests();\r\n }\r\n });\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createStatusTableHeader({ sorted: false }),\r\n createCellFunction: (camera) => this.vTableService.createStatusCell(this.setStatusSymbol(camera.migrationStatus))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"CommserverMigration.Migration\", width: 150 }),\r\n createCellFunction: (camera) => this.vTableService.createEnumCell(CommserverMigrationStatus, \"CommserverMigrationStatus\", camera.migrationStatus)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"FoundationHardware.Serial\", width: 150\r\n }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.Serial)\r\n },\r\n {\r\n header: this.vTableService.createVehicleTableHeader(),\r\n createCellFunction: (camera) => this.vTableService.createVehicleRegCell(camera.vehicleMapping?.vehicle)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"FoundationHardware.Name\", minTableWidth: 500 }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.name)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"CameraConfiguration.CurrentConfig\" }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(camera.currentConfig, { tooltip: true })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Account\", width: 250, minTableWidth: 450 }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(this.getCustomerAccountName(camera))\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Reseller\", width: 250, minTableWidth: 450 }),\r\n createCellFunction: (camera) => this.vTableService.createTableCell(this.getCustomerResellerName(camera))\r\n }\r\n ]\r\n\r\n this.selectedDeviceColumns = copy(this.tableColumns.slice(2, 5));\r\n\r\n this.failedColumns = [\r\n {\r\n header: this.vTableService.createTableHeader({\r\n tKey: \"FoundationHardware.Serial\", width: 150\r\n }),\r\n createCellFunction: (failedModel) => this.vTableService.createTableCell(failedModel.Serial)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"Common.Reason\", minTableWidth: 500 }),\r\n createCellFunction: (failedModel) => this.vTableService.createTableCell(failedModel.Reason)\r\n }\r\n ]\r\n }\r\n\r\n private setStatusSymbol(commserverMigrationStatus: CommserverMigrationStatus): VTableRowStatus {\r\n switch (commserverMigrationStatus) {\r\n case CommserverMigrationStatus.Completed:\r\n return VTableRowStatus.Success;\r\n case CommserverMigrationStatus.InProgress:\r\n return VTableRowStatus.Pending;\r\n case CommserverMigrationStatus.Required:\r\n return VTableRowStatus.Warning;\r\n }\r\n }\r\n\r\n private loadAccounts(): Observable {\r\n return combineLatest([\r\n this.accountService.getCustomerAccounts(),\r\n this.accountService.getResellers()\r\n ]).pipe(\r\n tap(([accounts, resellers]) => {\r\n accounts.forEach(account => {\r\n account.resellerName = this.accountService.getResellerName(resellers, account?.ResellerId);\r\n });\r\n\r\n this.accounts = new Map(accounts.map(account => [account.Id, account]));\r\n this.accountsList = accounts;\r\n this.resellers = resellers;\r\n })\r\n );\r\n }\r\n\r\n private loadCameras(): Observable {\r\n return this.peripheralService.getAllConfigurableCameras().pipe(\r\n tap(cameras => {\r\n this.cameras = cameras;\r\n })\r\n );\r\n }\r\n\r\n private setConfigNameString(): void {\r\n this.cameras.forEach(c => {\r\n c.currentConfig = this.allConfigs?.find(config => config.Id == Number(c.currentConfig))?.Name ?? this.translationService.t(\"Common.Unknown\");\r\n });\r\n }\r\n\r\n private getConfigsAndRequests(): void {\r\n combineLatest([\r\n this.configService.getConfigs(),\r\n this.configService.getMigrationConfigIds(),\r\n this.configRequestService.getConfigurationRequests({\r\n RequestStates: [CommServerRequestState.Pending, CommServerRequestState.Requested]\r\n })\r\n ]).pipe(untilDestroyed(this),\r\n tap(([configs, migrationConfigIds, pendingConfigRequests]) => {\r\n this.allConfigs = configs;\r\n this.migrationConfigIds = migrationConfigIds;\r\n this.configRequests = pendingConfigRequests.filter(r =>\r\n this.migrationConfigIds.some(id => id == r.ConfigurationId)\r\n );\r\n\r\n this.cameras.filter(c =>\r\n c.migrationStatus === CommserverMigrationStatus.Required &&\r\n this.configRequests?.some(r => r.DeviceSerial == c.Serial)\r\n ).forEach(m => {\r\n m.migrationStatus = CommserverMigrationStatus.InProgress\r\n });\r\n\r\n this.setConfigNameString();\r\n this.createTabs();\r\n this.loading = false;\r\n this.tableRows = this.vTableService.createTableRows(this.cameras, this.tableColumns);\r\n })\r\n\r\n ).subscribe();\r\n }\r\n\r\n private getCustomerAccountName(peripheral: IPeripheral): string {\r\n if (!this.accounts?.size ||\r\n !peripheral?.vehicleMapping?.vehicle ||\r\n !this.accounts?.has(peripheral.vehicleMapping.vehicle.AccountId)) {\r\n return;\r\n }\r\n\r\n return this.accounts.get(peripheral.vehicleMapping.vehicle.AccountId).CompanyName;\r\n }\r\n\r\n private getCustomerResellerName(peripheral: IPeripheral): string {\r\n if (!this.accounts?.size ||\r\n !peripheral?.vehicleMapping?.vehicle ||\r\n !this.accounts?.has(peripheral.vehicleMapping.vehicle.AccountId)) {\r\n return;\r\n }\r\n\r\n return this.accounts.get(peripheral.vehicleMapping.vehicle.AccountId).resellerName;\r\n }\r\n\r\n private createTabs(): void {\r\n this.filterTabs = [];\r\n\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"Common.All\", () => true));\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"CameraConfiguration.Requried\", (device) => device?.migrationStatus === CommserverMigrationStatus.Required));\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"CameraConfiguration.Pending\", (device) => device?.migrationStatus === CommserverMigrationStatus.InProgress));\r\n this.filterTabs.push(this.filterBarService.createTabDefinition(\"CameraConfiguration.Completed\", (device) => device?.migrationStatus === CommserverMigrationStatus.Completed));\r\n }\r\n}\r\n\r\nexport interface IApiMigrationDevice {\r\n Serial: string;\r\n VehicleId?: number\r\n}\r\n\r\nexport interface ICsvSerialFail {\r\n Serial: string;\r\n Reason: string;\r\n}\r\n","module.exports = \" 0 || loading\\\"> {{ account.CompanyName }} {{ reseller.Description }}

{{ 'CameraConfiguration.ConfirmMigration' | translate }}

{{ 'CameraConfiguration.ConfirmMessage' | translate : csvDevices.length }}
{{ \\\"Common.Cancel\\\" | translate }} {{ \\\"Common.Confirm\\\" | translate }}
\";","import { Component, EventEmitter, Input, OnChanges, OnInit, Output } from \"@angular/core\";\r\nimport { FormControl, FormGroup, Validators } from \"@angular/forms\";\r\nimport { getValuesFromEnum } from \"@app/class/Utilities\";\r\nimport { IFileUploadDetails } from \"@app/directives/_forms/fileUpload/fileUpload.component\";\r\nimport { untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { take } from \"rxjs/operators\";\r\nimport { CameraApplicationState, CameraAppType, ICameraApp } from \"../../_models/ICameraApp\";\r\nimport { CameraAppService } from \"../../_services/camera-app.service\";\r\nimport './application-editor.component.scss';\r\n\r\n@Component({\r\n selector: 'app-editor',\r\n template: require('./application-editor.component.html')\r\n})\r\nexport class AppEditorComponent implements OnInit, OnChanges {\r\n @Input() app: ICameraApp;\r\n @Output() appSaved: EventEmitter = new EventEmitter();\r\n @Output() formUpdated: EventEmitter = new EventEmitter();\r\n //--\r\n\r\n appForm: FormGroup;\r\n\r\n appTypes = getValuesFromEnum(CameraAppType).filter(type => type !== CameraAppType.Firmware);\r\n CameraAppType = CameraAppType;\r\n\r\n applicationStates = getValuesFromEnum(CameraApplicationState);\r\n CameraApplicationState = CameraApplicationState;\r\n\r\n\r\n selectedType: CameraAppType;\r\n selectedState: CameraApplicationState;\r\n\r\n file: File;\r\n editMode: boolean;\r\n\r\n constructor(\r\n private readonly cameraAppService: CameraAppService) { }\r\n\r\n ngOnInit(): void {\r\n this.createForm();\r\n }\r\n\r\n ngOnChanges(): void {\r\n if (this.app.Id > 0) {\r\n this.editMode = true;\r\n }\r\n }\r\n\r\n onStateChanged(value: CameraApplicationState): void {\r\n this.selectedState = value;\r\n this.appForm.get(\"State\").setValue(value);\r\n this.app.State = this.selectedState;\r\n }\r\n\r\n onTypeChanged(value: CameraAppType): void {\r\n this.selectedType = value;\r\n this.appForm.get(\"CameraAppType\").setValue(value);\r\n }\r\n\r\n saveApp(): void {\r\n if (!this.appForm.valid || !this.file) {\r\n return;\r\n }\r\n const formData = new FormData();\r\n\r\n formData.append('file', this.file);\r\n\r\n for (const key in this.app) {\r\n if (this.app.hasOwnProperty(key)) {\r\n formData.append(key, this.app[key]);\r\n }\r\n }\r\n\r\n this.appSaved.emit(formData);\r\n }\r\n\r\n addFile(file: IFileUploadDetails): void {\r\n this.file = file.file;\r\n this.appForm.get(\"File\").setValue(this.file);\r\n }\r\n\r\n downloadFile(): void {\r\n this.getFile();\r\n }\r\n //--\r\n\r\n private createForm(): void {\r\n this.appForm = new FormGroup({\r\n CameraAppType: new FormControl(this.app.CameraAppType),\r\n Name: new FormControl(this.app.Name, [Validators.required]),\r\n Description: new FormControl(this.app.Description, [Validators.required]),\r\n State: new FormControl(this.app.State),\r\n Version: new FormControl(this.app.Version),\r\n File: new FormControl(this.file, [Validators.required])\r\n })\r\n\r\n this.selectedState = this.app.State;\r\n this.selectedType = this.app.CameraAppType;\r\n\r\n this.appForm.statusChanges.pipe(untilDestroyed(this)).subscribe((status: string) => {\r\n if (status == \"INVALID\") {\r\n return;\r\n }\r\n\r\n this.app = {\r\n ...this.app,\r\n CameraAppType: this.appForm.get(\"CameraAppType\").value,\r\n Name: this.appForm.get(\"Name\").value,\r\n Description: this.appForm.get(\"Description\").value,\r\n State: this.appForm.get(\"State\").value,\r\n Version: this.appForm.get(\"Version\").value\r\n }\r\n\r\n this.file = this.appForm.get(\"File\").value;\r\n\r\n this.formUpdated.emit();\r\n })\r\n }\r\n\r\n private getFile(): void {\r\n this.cameraAppService.downloadFile(this.app.FileGuid).pipe(\r\n take(1)\r\n ).subscribe({\r\n next: file => {\r\n const url = window.URL.createObjectURL(file);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = `${this.app.Name}.apk`; \r\n document.body.appendChild(a);\r\n a.click();\r\n window.URL.revokeObjectURL(url);\r\n document.body.removeChild(a);\r\n }\r\n })\r\n }\r\n}\r\n","module.exports = \" {{ app.CameraAppType | enumAsString : CameraAppType : 'CameraAppType' }}
{{ 'Common.Download' | translate }}
\";","module.exports = \" {{ type.translatedString }} {{ state.translatedString }} {{ selectedApp.Name || ('AppManagement.NewApp' | translate ) }} \";","module.exports = \" {{ account.CompanyName }} \";","import { Component, EventEmitter, Input, Output } from \"@angular/core\";\r\nimport { FormBuilder, FormControl, FormGroup } from \"@angular/forms\";\r\nimport { CustomFormValidators, FormValidationService } from \"@app/directives/_forms/form-validation.service\";\r\nimport { untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { ICameraConfiguration } from \"../../_models/ICameraConfiguration\";\r\nimport './config-editor.component.scss';\r\n\r\n@Component({\r\n selector: 'config-editor',\r\n template: require('./config-editor.component.html')\r\n})\r\nexport class ConfigEditorComponent {\r\n @Input() config: ICameraConfiguration;\r\n @Input() configs: ICameraConfiguration[];\r\n @Output() configSaved: EventEmitter = new EventEmitter();\r\n configData: any;\r\n configForm: FormGroup;\r\n formCategories: { title: string, formGroup: FormGroup }[];\r\n\r\n constructor(\r\n private readonly formBuilder: FormBuilder,\r\n private readonly formValidationService: FormValidationService) { }\r\n\r\n ngOnInit(): void {\r\n this.createFormCategories();\r\n }\r\n\r\n saveConfig(): void {\r\n if (!this.formValidationService.checkFormValid(this.configForm)) {\r\n return;\r\n }\r\n\r\n let updatedConfigData: any = {};\r\n\r\n this.formCategories.forEach(formCategory => {\r\n updatedConfigData[formCategory.title] = {};\r\n Object.assign(updatedConfigData[formCategory.title], formCategory.formGroup.value);\r\n })\r\n \r\n const updatedConfigJsonString = JSON.stringify(updatedConfigData);\r\n\r\n this.config.ConfigJson = updatedConfigJsonString;\r\n\r\n this.configSaved.emit(this.config);\r\n }\r\n\r\n getControlType(control: FormControl): string {\r\n if (control.value instanceof Boolean || typeof control.value === 'boolean') {\r\n return 'boolean';\r\n } else if (typeof control.value === 'number') {\r\n return 'number';\r\n } else {\r\n return 'text';\r\n }\r\n }\r\n\r\n //--\r\n\r\n private createFormCategories(): void {\r\n this.formCategories = [];\r\n\r\n this.configData = JSON.parse(this.config.ConfigJson);\r\n\r\n for (const category in this.configData) {\r\n let formCategory = {\r\n title: category,\r\n formGroup: this.createFormGroup(category)\r\n }\r\n\r\n formCategory.formGroup.statusChanges.pipe(untilDestroyed(this)).subscribe(status => {\r\n this.updateNewConfig(status);\r\n })\r\n\r\n this.formCategories.push(formCategory);\r\n }\r\n this.formCategories.sort((a, b) => {\r\n if (a.title < b.title) {\r\n return -1;\r\n }\r\n if (a.title > b.title) {\r\n return 1;\r\n }\r\n return 0;\r\n });\r\n this.createStandardFormCategories();\r\n }\r\n\r\n private createFormGroup(categoryName: string): FormGroup {\r\n\r\n const formGroupConfig = {};\r\n\r\n for (const key in this.configData[categoryName]) {\r\n if (this.configData[categoryName].hasOwnProperty(key)) {\r\n formGroupConfig[key] = new FormControl(this.configData[categoryName][key]);\r\n }\r\n }\r\n\r\n return this.formBuilder.group(formGroupConfig);\r\n }\r\n\r\n private createStandardFormCategories(): void {\r\n this.configForm = new FormGroup({\r\n \"Name\": new FormControl(this.config.Name, CustomFormValidators.duplicateConfigName(this.configs))\r\n })\r\n\r\n this.configForm.statusChanges.pipe(untilDestroyed(this))\r\n .subscribe(status => {\r\n this.updateNewConfig(status);\r\n })\r\n }\r\n\r\n private updateNewConfig(status: string): void {\r\n if (status == \"INVALID\") {\r\n return;\r\n }\r\n\r\n this.config = {\r\n ...this.config,\r\n Id: 0, // If config has changed, save as new\r\n Name: this.configForm.get(\"Name\").value\r\n }\r\n }\r\n}\r\n","module.exports = \" {{ control.key }} \";","module.exports = \" \";","module.exports = \" {{ 'AppManagement.AddApp' | translate }} \";","module.exports = \" \";","module.exports = \" {{vehicle.Reg}} / {{vehicle.ShortReg}}edit {{ 'Common.Created' | translate }} {{ vehicle.Created | vDate : {dateTime: true} }} {{ 'Common.Updated' | translate }} {{ vehicle.Updated | vDate : {dateTime: true} }} {{ vehicle.Make }} {{ vehicle.Model }}
{{ 'Common.Map' | translate }}
{{ 'FoundationVehicles.RecentData' | translate }}
{{ 'FoundationVehicles.InstalledUnit' | translate }}
{{ 'FoundationVehicles.InstalledPeripherals' | translate }}
{{ peripheral.showDiagnostics ? ('FoundationVehicles.RefreshDiagnostics' | translate) : ('FoundationVehicles.RunDiagnostics' | translate) }}
\";","module.exports = \" {{ 'EngineerJobItemList.ReportIssue' | translate }} {{ account.CompanyName }}
{{ \\\"EngineerJobItemList.ReportIssue\\\" | translate }} {{account.CompanyName}} {{ selectedVisitFailureRecord.VisitFailureReason | enumAsString : VisitFailureReason : 'VisitFailureReason' }} {{ selectedVisitFailureRecord.FailureTimestampUTC | vDate : { dateTime: true } }} {{ getUsername(selectedVisitFailureRecord) }} {{ 'VisitFailures.JobId' | translate }}: {{ selectedVisitFailureRecord.jobId }}
\";","import { DragDropModule } from \"@angular/cdk/drag-drop\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { CUSTOM_ELEMENTS_SCHEMA, NgModule } from \"@angular/core\";\r\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\nimport { VTableModule } from \"@app/directives/_layout/v-table/v-table.module\";\r\nimport { VehicleDirectivesModule } from \"@app/directives/_vehicle/_vehicle.directives.module\";\r\nimport { VisualisationsModule } from \"@app/directives/_visualisations/visualisations.module\";\r\nimport { CoreDirectivesModule } from \"@directives/_core/_core.directives.module\";\r\nimport { FormsDirectivesModule } from \"@directives/_forms/_form.directives.module\";\r\nimport { LayoutDirectivesModule } from \"@directives/_layout/_layout.directives.module\";\r\nimport { MiscDirectivesModule } from \"@directives/_misc/_misc.directives.module\";\r\nimport { ResourceFiltersDirectivesModule } from \"@directives/_resourceFilters/_resourceFilters.directives.module\";\r\nimport { VeriDirectivesModule } from \"@directives/_veri/_veri.directives.module\";\r\nimport { providerCreator } from \"@services/_services.module\";\r\nimport { PipesModule } from \"src/app/_pipes/_pipes.module\";\r\nimport { GroupsModule } from \"../resourceManagement/groups/groups.module\";\r\nimport { ReportCardComponent } from \"./_components/report-card/report-card.component\";\r\nimport { ReportCategorySelectorComponent } from \"./_components/report-category-selector/report-category-selector.component\";\r\nimport { FilterTitleRowColumnHeaderPipe, ReportColumnHeadersSelectorComponent } from \"./_components/report-column-headers-selector/report-column-headers-selector.component\";\r\nimport { ReportEditorComponent } from \"./_components/report-editor/report-editor.component\";\r\nimport { ReportFiltersComponent } from \"./_components/report-filters/report-filters.component\";\r\nimport { ReportInternationalisationOptionsComponent } from \"./_components/report-internationalisation-options/report-internationalisation-options.component\";\r\nimport { ReportParametersComponent } from \"./_components/report-parameters/report-parameters.component\";\r\nimport { ReportScheduleEditorComponent } from \"./_components/report-schedule-editor/report-schedule-editor.component\";\r\nimport { ReportSchedulesComponent } from \"./_components/report-schedules/report-schedules.component\";\r\nimport { RowDataSourceSelectorComponent2 } from \"./_components/row-data-source-selector2/row-data-source-selector2.component\";\r\nimport { ReportHistoryPageComponent } from \"./_routes/report-history-page/report-history-page.component\";\r\nimport { ReportHistoryViewComponent } from \"./_routes/report-history-view/report-history-view.component\";\r\nimport { ReportListPageComponent } from \"./_routes/report-list-page/report-list-page.component\";\r\nimport { ReportSchedulePageComponent } from \"./_routes/report-schedule-page/report-schedule-page.component\";\r\nimport { ReportViewComponent } from \"./_routes/report-view/report-view.component\";\r\nimport { DynamicReportService } from \"./_services/dynamicReports.service\";\r\n\r\nconst privateComponents: any[] = [\r\n\r\n];\r\n\r\nconst publicComponents: any[] = [\r\n ReportViewComponent,\r\n ReportSchedulePageComponent,\r\n ReportListPageComponent,\r\n ReportHistoryPageComponent,\r\n\r\n ReportFiltersComponent,\r\n ReportColumnHeadersSelectorComponent,\r\n ReportParametersComponent,\r\n ReportCardComponent,\r\n ReportCategorySelectorComponent,\r\n ReportSchedulesComponent,\r\n ReportScheduleEditorComponent,\r\n ReportEditorComponent,\r\n ReportInternationalisationOptionsComponent,\r\n RowDataSourceSelectorComponent2,\r\n ReportHistoryViewComponent\r\n];\r\n\r\nconst declarations: any[] = [\r\n FilterTitleRowColumnHeaderPipe\r\n];\r\n\r\nconst providers: any[] = [\r\n providerCreator(DynamicReportService, \"dynamicReportService\")\r\n];\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n DragDropModule,\r\n BrowserAnimationsModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n\r\n PipesModule,\r\n LayoutDirectivesModule,\r\n VeriDirectivesModule,\r\n MiscDirectivesModule,\r\n FormsDirectivesModule,\r\n CoreDirectivesModule,\r\n VisualisationsModule,\r\n ResourceFiltersDirectivesModule,\r\n VTableModule,\r\n VehicleDirectivesModule,\r\n GroupsModule\r\n ],\r\n providers: providers,\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents, ...declarations],\r\n exports: [...publicComponents, ...declarations],\r\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\r\n})\r\nexport class ReportsModule {\r\n constructor() {\r\n }\r\n}\r\n","module.exports = \"
description
{{ 'ReportCard.NoPreviewAvailable' }}
{{ icon }}
{{ title }}
{{ (reportDefinitionHistory?.latest?.CreatedTime | vDate : {dateTime: true} ) || ('Common.Never' | translate) }}
\";","module.exports = \"
{{option.Icon}} {{option.Name}}
\";","module.exports = \"
{{ columnHeader.dataSourceDefinition ? columnHeader.dataSourceDefinition.icon : \\\"category\\\" }}
{{ columnHeader.ColumnDefinition.TranslatedTitle }}
{{ columnHeader.dataSourceDefinition.TranslatedDisplayName ? columnHeader.dataSourceDefinition.TranslatedDisplayName : (\\\"Common.Unknown\\\" | translate) }}
{{ 'ReportColumnHeadersSelector.NoAvailableColumnHeaders' | translate }}
{{ 'ReportColumnHeadersSelector.RevertButton' | translate }}
\";","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild } from \"@angular/core\";\r\nimport { AbstractControl, FormBuilder, FormGroup, ValidationErrors, ValidatorFn, Validators } from \"@angular/forms\";\r\nimport { CustomFormValidators } from \"@app/directives/_forms/form-validation.service\";\r\nimport { DateService } from \"@app/services/date.service\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { VAutocompleteComponent } from \"@directives/_forms/v-autocomplete/v-autocomplete.component\";\r\nimport { ICombinedPreferences } from \"@interfaces/ICombinedPreferences\";\r\nimport { IJourney } from \"@interfaces/IJourney\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { DynamicReportService } from \"@reports/_services/dynamicReports.service\";\r\nimport { ChartDefinition } from \"@reports/enums/ChartDefinition\";\r\nimport { IDataSourceDefinition } from \"@reports/models/IDataSourceDefinition\";\r\nimport { IColumnHeader } from \"@reports/models/IColumnHeader\";\r\nimport { IReportDefinition } from \"@reports/models/IReportDefinition\";\r\nimport { JourneyService } from \"@services/journey.service\";\r\nimport { PreferencesService } from \"@services/preferences.service\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport { copy } from \"angular\";\r\nimport { IRowDataSourceChange } from \"../row-data-source-selector2/row-data-source-selector2.component\";\r\nimport \"./report-editor.component.scss\";\r\nimport { NavigationService } from \"@app/services/navigation.service\";\r\nimport { ReportsNavigationModule } from \"../../reports.navigation\";\r\n\r\nexport interface IReportEditorSave {\r\n savedReport: IReportDefinition;\r\n savedAsCopy?: boolean;\r\n deleted?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: \"report-editor\",\r\n template: require(\"./report-editor.component.html\")\r\n})\r\nexport class ReportEditorComponent implements OnInit, OnChanges {\r\n\r\n showDebugButtons: boolean = true;\r\n\r\n @Input() reportDefinition: IReportDefinition;\r\n @Input() reportId: number;\r\n @Input() hideDate: boolean;\r\n\r\n @Output() validate = new EventEmitter();\r\n @Output() save = new EventEmitter();\r\n\r\n @ViewChild(\"columnHeaderAutocomplete\", { static: false }) columnHeaderAutocomplete: VAutocompleteComponent;\r\n\r\n\r\n // ---\r\n\r\n reports: IReportDefinition[];\r\n\r\n loading = false;\r\n reportEditorForm: FormGroup;\r\n\r\n allColumnHeaders: IColumnHeader[] = [];\r\n availableColumnHeaders: IColumnHeader[] = [];\r\n availableDataSources: IDataSourceDefinition[] = [];\r\n remainingAvailableColumns: IColumnHeader[];\r\n\r\n reportDataSources: IDataSourceDefinition[] = [];\r\n headersForReportDataSource: IColumnHeader[] = [];\r\n\r\n vehicles: IVehicle[];\r\n journeys: IJourney[];\r\n combinedPreferences: ICombinedPreferences;\r\n vehicleWithMostJourneys: IVehicle;\r\n\r\n rowTitleHeader: IColumnHeader;\r\n\r\n previewPdfUrl: string;\r\n gettingData: boolean;\r\n loadingPreview: boolean;\r\n saving: boolean;\r\n\r\n showTemperatureChartCheckBox: boolean;\r\n showDataSources: boolean;\r\n\r\n primaryDataSource: string;\r\n secondaryDataSource: string;\r\n\r\n readonly saveAsCopySuffix: string = \" (Copy)\";\r\n\r\n get sortHeaderId(): number {\r\n return this.reportEditorForm?.get(\"sortHeaderId\").value;\r\n }\r\n\r\n get sortAscending(): boolean {\r\n return this.reportEditorForm?.get(\"sortAscending\").value;\r\n }\r\n\r\n constructor(\r\n private readonly dynamicReportService: DynamicReportService,\r\n private readonly formBuilder: FormBuilder,\r\n private readonly vehicleService: VehicleService,\r\n private readonly journeyService: JourneyService,\r\n private readonly preferencesService: PreferencesService,\r\n private readonly dateService: DateService,\r\n private readonly translationService: TranslationService,\r\n private readonly navigationService: NavigationService\r\n ) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.prepare();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[\"report\"]) {\r\n\r\n this.reportDefinition = copy(this.reportDefinition);\r\n\r\n this.dynamicReportService.getDataSourceDefinitionsAndMapToColumns(this.reportDefinition.TableDefinition.Headers);\r\n }\r\n }\r\n\r\n saveReport(saveAsCopy: boolean): void {\r\n if (!this.validateModelExists() || !this.validateSaveProgress()) {\r\n return;\r\n }\r\n\r\n this.saving = true;\r\n\r\n if (saveAsCopy) {\r\n this.reportDefinition.newReport = true;\r\n this.reportDefinition.Id = 0;\r\n\r\n this.setSaveAsCopyReportName();\r\n }\r\n\r\n this.reportDefinition.isSystemReport = false;\r\n\r\n this.dynamicReportService.saveReportDefinition(this.reportDefinition).then((result: IReportDefinition) => {\r\n this.save.emit({\r\n savedReport: result,\r\n savedAsCopy: saveAsCopy,\r\n deleted: !this.reportDefinition.Active\r\n });\r\n }).finally(() => {\r\n this.saving = false;\r\n\r\n\r\n this.navigationService.go(ReportsNavigationModule.ReportList);\r\n });\r\n }\r\n\r\n deleteReport() {\r\n this.reportDefinition.Active = false;\r\n\r\n this.saveReport(false);\r\n }\r\n\r\n previewReport(): void {\r\n this.loadingPreview = true;\r\n\r\n const previewReportModel = this.createReportPreviewModel(this.reportDefinition);\r\n\r\n this.dynamicReportService\r\n .populateReport(previewReportModel, true)\r\n .then(reportLog => {\r\n window.open(reportLog.pdfUrl, '_blank')?.focus();\r\n })\r\n .catch(error => {\r\n console.log(\"previewReport error\", error);\r\n })\r\n .finally(() => {\r\n this.loadingPreview = false;\r\n });\r\n }\r\n\r\n prepare(): void {\r\n if (!this.reportDefinition) {\r\n this.setupNewReport();\r\n }\r\n\r\n this.reportDefinition = copy(this.reportDefinition);\r\n\r\n if (this.gettingData) {\r\n return;\r\n }\r\n\r\n this.getData().then(() => {\r\n\r\n if (!this.reportDefinition.TableDefinition.Headers?.find(header => header.IsRowTitle)) {\r\n this.dynamicReportService.setReportDefinitionRowTitle(this.reportDefinition, this.rowTitleHeader);\r\n }\r\n this.dynamicReportService.setReportDefinitionColumnIds(this.reportDefinition);\r\n this.dynamicReportService.ensureUniqueReportColumnHeadersIds(this.reportDefinition);\r\n this.dynamicReportService.ensureUniqueColumnHeadersIds(this.availableColumnHeaders);\r\n this.dynamicReportService.updateFilterOptionsForColumnHeaders(this.reportDefinition.TableDefinition.Headers, true);\r\n this.dynamicReportService.updateFilterOptionsForColumnHeaders(this.availableColumnHeaders);\r\n\r\n this.checkForTemperatureChartColumns();\r\n\r\n this.createForm();\r\n this.validateForm();\r\n });\r\n }\r\n\r\n onSortColumnHeaderChanged(columnHeader: IColumnHeader): void {\r\n this.checkForTemperatureChartColumns();\r\n this.reportEditorForm.get(\"sortHeaderId\").setValue(columnHeader.Id);\r\n this.updateSortedHeader();\r\n }\r\n\r\n onSortOrderChanged(ascending: boolean): void {\r\n this.checkForTemperatureChartColumns();\r\n this.reportEditorForm.get(\"sortAscending\").setValue(ascending);\r\n this.updateSortedHeader();\r\n }\r\n\r\n onPrimaryDataSourceChanged(data: string): void {\r\n this.primaryDataSource = data;\r\n this.selectNewDataSources(data, this.getCurrentDataSources()[1]);\r\n this.filterHeadersByReportDataSource();\r\n }\r\n\r\n onSecondaryDataSourceChanged(data: string): void {\r\n this.secondaryDataSource = data;\r\n this.selectNewDataSources(this.getCurrentDataSources()[0], data);\r\n this.filterHeadersByReportDataSource();\r\n }\r\n\r\n updateSortedHeader(): void {\r\n if (!this.reportDefinition?.TableDefinition?.Headers?.length) {\r\n return;\r\n }\r\n\r\n this.reportDefinition.TableDefinition.Headers.forEach(header => {\r\n header.Sorted = header.Id === this.sortHeaderId;\r\n\r\n if (header.Sorted) {\r\n header.SortAscending = this.sortAscending;\r\n }\r\n });\r\n }\r\n\r\n onColumnHeadersUpdated(columnHeaders: IColumnHeader[]): void {\r\n this.checkForTemperatureChartColumns();\r\n this.validateForm();\r\n }\r\n\r\n validateForm(): void {\r\n this.validate.emit(this.reportEditorForm.valid);\r\n }\r\n\r\n onRowDataSourceChanged(change: IRowDataSourceChange): void {\r\n if (!this.reportDefinition) {\r\n return;\r\n }\r\n\r\n const rowDataSourceChanged = this.reportDefinition.RowDataSource !== change.row;\r\n\r\n this.reportDefinition.RowDataSource = change.row;\r\n this.reportDefinition.SubRowDataSource = change.subRow;\r\n\r\n if (!rowDataSourceChanged) {\r\n return;\r\n }\r\n\r\n this.dynamicReportService.setReportDefinitionRowTitle(this.reportDefinition, this.rowTitleHeader);\r\n\r\n const titleRowId: number = this.dynamicReportService.findRowTitleColumn(this.reportDefinition.TableDefinition.Headers).Id;\r\n\r\n this.reportEditorForm?.get(\"sortHeaderId\")?.setValue(titleRowId);\r\n\r\n this.updateSortedHeader();\r\n }\r\n\r\n onTemperatureChartsToggleChanged(value: boolean): void {\r\n this.updateChartsSettings(value);\r\n }\r\n\r\n onColumnsTabSelected(): void {\r\n this.showDataSources = true;\r\n }\r\n\r\n // ---\r\n\r\n private validateModelExists(): boolean {\r\n if (!this.reportDefinition) {\r\n console.warn(\"Tried to save a report definition when no model exists\");\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n private validateSaveProgress(): boolean {\r\n if (this.saving) {\r\n console.warn(\"Report already being saved\");\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n private setupNewReport(): void {\r\n this.reportDefinition = this.dynamicReportService.createReportTemplate();\r\n }\r\n\r\n private getData(): Promise {\r\n this.gettingData = true;\r\n\r\n const promises: Promise[] = [\r\n this.dynamicReportService.getDisplayColumnHeaders().then(columnHeaders => this.allColumnHeaders = columnHeaders) as Promise,\r\n this.dynamicReportService.getDataSourceDefinitions().then(definitions => this.availableDataSources = definitions) as Promise,\r\n this.dynamicReportService.getReports().then(reports => this.reports = reports) as Promise\r\n ];\r\n\r\n promises.push(this.loadCombinedPreferences());\r\n promises.push(this.loadVehicles());\r\n promises.push(this.loadJourneys());\r\n\r\n return Promise.all(promises).then(() => {\r\n this.findAndSetVehicleWithMostJourneys(this.vehicles, this.journeys);\r\n\r\n this.availableColumnHeaders = this.dynamicReportService.filterAvailableColumnHeaders(this.allColumnHeaders);\r\n this.rowTitleHeader = this.dynamicReportService.findRowTitleColumn(this.allColumnHeaders);\r\n\r\n this.renderDataSourceFiltering();\r\n\r\n }).finally(() => {\r\n this.gettingData = false;\r\n });\r\n }\r\n\r\n private renderDataSourceFiltering(): void {\r\n this.detectReportDataSources();\r\n this.filterHeadersByReportDataSource();\r\n }\r\n\r\n private loadCombinedPreferences(): Promise {\r\n return (this.preferencesService.getAllPreferences() as Promise).then(combinedPreferences => {\r\n this.combinedPreferences = combinedPreferences;\r\n });\r\n }\r\n\r\n private loadVehicles(): Promise {\r\n return (this.vehicleService.getVehicles({ includePeripheralMappings: true }) as Promise).then(vehicles => {\r\n this.vehicles = vehicles;\r\n });\r\n }\r\n\r\n private loadJourneys(): Promise {\r\n const startDate = this.dateService.getStartOfDay(new Date());\r\n const endDate = this.dateService.getEndOfDay(new Date());\r\n\r\n return (this.journeyService.getAllJourneys(startDate, endDate) as Promise).then(journeys => {\r\n this.journeys = journeys;\r\n });\r\n }\r\n\r\n private createForm(): void {\r\n const sortSettings = this.dynamicReportService.getSortSettings(this.reportDefinition);\r\n\r\n this.reportEditorForm = this.formBuilder.group({\r\n reportName: [this.reportDefinition?.Title, [Validators.required, Validators.minLength(5), Validators.maxLength(50), CustomFormValidators.emptyWhiteSpace, this.uniqueReportNameValidator()]],\r\n sortHeaderId: [sortSettings.headerId, [Validators.required]],\r\n sortAscending: [sortSettings.ascending || false, [Validators.required]]\r\n });\r\n\r\n this.reportEditorForm.statusChanges.subscribe(x => {\r\n this.validateForm();\r\n });\r\n }\r\n\r\n private setSaveAsCopyReportName(): void {\r\n\r\n let proposedReportName = `${this.reportDefinition.Title}`\r\n\r\n while (this.reportNameInUse(proposedReportName)) {\r\n proposedReportName = `${proposedReportName}${this.saveAsCopySuffix}`\r\n }\r\n\r\n this.reportDefinition.Title = proposedReportName;\r\n }\r\n\r\n private uniqueReportNameValidator(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n\r\n if (!this.reports?.length || !control.value) {\r\n return null;\r\n }\r\n\r\n const lowerCaseScheduleName = control.value.toLowerCase();\r\n\r\n const isDuplicate = this.reportNameInUse(lowerCaseScheduleName);\r\n\r\n return isDuplicate ? { customMessage: this.translationService.t(\"ReportEditor.UniqueReportNameWarning\") } : null;\r\n };\r\n }\r\n\r\n private reportNameInUse(reportName: string): boolean {\r\n if (!reportName) {\r\n return false;\r\n }\r\n\r\n const matchingReports = this.reports.filter(report => {\r\n return report.Title.toLowerCase() === reportName.toLowerCase()\r\n && report.Id !== this.reportDefinition.Id;\r\n });\r\n\r\n return matchingReports?.length > 0;\r\n }\r\n\r\n private createReportPreviewModel(report: IReportDefinition): IReportDefinition {\r\n if (!report) {\r\n console.warn(\"No report definiton provided for preview model\");\r\n return;\r\n }\r\n\r\n const copiedReport = copy(this.reportDefinition);\r\n\r\n copiedReport.Parameters = {\r\n Start: this.dateService.getStartOfDay(new Date()),\r\n End: this.dateService.getEndOfDay(new Date()),\r\n };\r\n\r\n copiedReport.ShowCharts = false;\r\n\r\n this.updateChartsSettings(this.reportDefinition.ShowCharts);\r\n\r\n if (this.vehicleWithMostJourneys && this.dynamicReportService.restrictReportToSingleResource(copiedReport)) {\r\n copiedReport.Parameters.VehicleId = this.vehicleWithMostJourneys.Id;\r\n }\r\n\r\n if (this.combinedPreferences) {\r\n copiedReport.DistanceMeasurement = this.combinedPreferences.DistanceMeasurement.Value;\r\n copiedReport.VolumeMeasurement = this.combinedPreferences.VolumeMeasurement.Value;\r\n copiedReport.TemperatureMeasurement = this.combinedPreferences.TemperatureMeasurement.Value;\r\n copiedReport.Currency = this.combinedPreferences.Currency.Value\r\n }\r\n\r\n return copiedReport;\r\n }\r\n\r\n private updateChartsSettings(showTemperatureCharts: boolean = false): void {\r\n if (showTemperatureCharts && this.showTemperatureChartCheckBox) {\r\n this.reportDefinition.ChartDefinition = ChartDefinition.Temperature;\r\n }\r\n\r\n this.reportDefinition.ShowCharts = showTemperatureCharts;\r\n }\r\n\r\n private findAndSetVehicleWithMostJourneys(vehicles: IVehicle[], journeys: IJourney[]) {\r\n if (!vehicles?.length || !journeys?.length) {\r\n return;\r\n }\r\n\r\n var currentMaxCount = 0;\r\n\r\n vehicles.forEach(vehicle => {\r\n vehicle.rangeJourneyCount = 0;\r\n\r\n journeys.forEach(journey => {\r\n if (journey.VehicleId === vehicle.Id) {\r\n vehicle.rangeJourneyCount++;\r\n }\r\n });\r\n\r\n if (vehicle.rangeJourneyCount > currentMaxCount) {\r\n this.vehicleWithMostJourneys = vehicle;\r\n }\r\n });\r\n }\r\n\r\n private checkForTemperatureChartColumns(): void {\r\n this.showTemperatureChartCheckBox = this.dynamicReportService.findColumn(\"ProbeTemperatures\", \"Temperature\", this.reportDefinition.TableDefinition.Headers) != null;\r\n\r\n if (!this.showTemperatureChartCheckBox) {\r\n this.reportDefinition.ShowCharts = false;\r\n }\r\n }\r\n\r\n private getCurrentDataSources(): string[] {\r\n // Map data sources in report\r\n const res = this.reportDefinition.TableDefinition.Headers.reduce((obj, v) => {\r\n obj[v.dataSourceDefinition.DataSourceType] = (obj[v.dataSourceDefinition.DataSourceType] || 0) + 1;\r\n return obj;\r\n }, {});\r\n\r\n let highestCount = 0;\r\n let highestKey: string;\r\n\r\n let highestCount2 = 0;\r\n let highestKey2: string;\r\n\r\n // Count data sources in report\r\n Object.keys(res).forEach((key, index) => {\r\n\r\n if (key == \"SharedReportDataSource\") {\r\n return;\r\n }\r\n\r\n if (highestCount < res[key]) {\r\n highestCount2 = highestCount;\r\n highestKey2 = highestKey;\r\n\r\n highestCount = res[key];\r\n highestKey = key;\r\n }\r\n else if (highestCount2 < res[key]) {\r\n highestCount2 = res[key];\r\n highestKey2 = key;\r\n }\r\n });\r\n\r\n if (!highestKey) {\r\n highestKey = this.primaryDataSource;\r\n }\r\n\r\n if (!highestKey2) {\r\n highestKey2 = this.secondaryDataSource;\r\n }\r\n\r\n return [highestKey, highestKey2];\r\n }\r\n\r\n private detectReportDataSources() {\r\n const dataSourceKeys: string[] = this.getCurrentDataSources();\r\n\r\n this.selectNewDataSources(dataSourceKeys[0], dataSourceKeys[1]);\r\n }\r\n\r\n private selectNewDataSources(dataSourceKey1: string, dataSourceKey2: string): void {\r\n this.reportDataSources = [];\r\n\r\n // Find matching data source to data source keys\r\n var highestSource = this.availableDataSources.find(s => s.DataSourceType == dataSourceKey1);\r\n var highestSource2 = this.availableDataSources.find(s => s.DataSourceType == dataSourceKey2);\r\n\r\n if (highestSource) {\r\n this.reportDataSources.push(highestSource);\r\n }\r\n\r\n if (highestSource2 && highestSource != highestSource2) {\r\n this.reportDataSources.push(highestSource2);\r\n }\r\n }\r\n\r\n private filterHeadersByReportDataSource() {\r\n this.headersForReportDataSource = this.availableColumnHeaders.filter(h => {\r\n\r\n if (h.dataSourceDefinition.DataSourceType == \"SharedReportDataSource\") {\r\n return true;\r\n }\r\n\r\n if (!this.reportDataSources?.length) {\r\n return false;\r\n }\r\n\r\n if (h.dataSourceDefinition.DataSourceType == this.reportDataSources[0].DataSourceType) {\r\n return true;\r\n }\r\n\r\n if (this.reportDataSources.length == 2 && h.dataSourceDefinition.DataSourceType == this.reportDataSources[1].DataSourceType) {\r\n return true;\r\n }\r\n\r\n return false;\r\n });\r\n }\r\n}\r\n","module.exports = \"
{{ 'ReportEditor.ShowTemperatureCharts' | translate }}
\";","export enum DurationFormat {\r\n Days,\r\n DaysHours,\r\n DaysHoursMinutes,\r\n DaysHoursMinutesSeconds,\r\n Hours,\r\n HoursMinutes,\r\n HoursMinutesSeconds,\r\n Minutes,\r\n MinutesSeconds,\r\n Seconds\r\n}\r\n","module.exports = \"
\";","module.exports = \"
{{param.parameterName}} {{param.parameterName}} {{param.parameterName}}

{{ 'ReportParameters2.TemperatureProbesTitle' | translate }}

{{ displayProbe.displayName }}
{{ 'ReportParameters2.NoProbesForVehicle' | translate }}
{{ 'ReportParameters2.AssignVehicleForProbes' | translate }}
\";","module.exports = \"
{{\\\"ReportFilters.ResourceMustBeSelected\\\" | translate}}
{{\\\"ReportFilters.ResourceMustBeSelected\\\" | translate}}
{{ 'ReportEditor.ShowTemperatureCharts' | translate }} \";","module.exports = \"
{{getReportSummaryText()}}
{{\\\"FormValidationService.Required\\\" | translate}}
{{'ReportSchedules.SelectStart' | translate}} {{'ReportSchedules.SelectEnd' | translate}}
{{'ReportSchedules.Range' | translate}}: {{dirtySchedule.RepeatOn.length >= 1 ? (dirtySchedule.RepeatOn[0] | enumAsString : dayOfWeek : 'DayOfWeek') : '(' + ('ReportScheduleEditor.PleaseSelect' | translate) + ')'}} - {{dirtySchedule.RepeatOn.length > 1 ? (dirtySchedule.RepeatOn.slice(-1)[0] | enumAsString : dayOfWeek : 'DayOfWeek') : '(' + ('ReportScheduleEditor.PleaseSelect' | translate) + ')'}}
1\\\" (onClick)=removeEmailRecipient(i) icon=clear class=\\\"flat-transparent remove-recipient-button\\\" [iconOnly]=true>
{{ 'ReportScheduleEditor.AddRecipientButton' | translate }}
\";","module.exports = \" {{ 'ReportScheduleEditor.ScheduleReport' | translate }} \";","module.exports = \"
\";","import { ReasonCode } from \"@app/enum/ReasonCode\";\r\nimport { RoadType } from \"@app/enum/RoadType.enum\";\r\nimport { VehicleType } from \"@app/enum/VehicleType.enum\";\r\nimport { GeofenceCategory } from \"@app/interfaces/IGeofences\";\r\nimport { AlcolockEventGroup } from \"@app/main/components/tacho/alcolockCompliance/alcolock.enums\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { ReportParameterType } from \"../../models/IReportParameters\";\r\n\r\ntype ReportParameterMapping = {\r\n parameterType: ReportParameterType;\r\n values: { Name: string, Value: number }[];\r\n}\r\n\r\nexport function reportParameterMappings(translationService: TranslationService): ReportParameterMapping[] {\r\n const mappings: ReportParameterMapping[] = [\r\n {\r\n parameterType: ReportParameterType.ShowOnlyAlcolockEventGroup,\r\n values: [\r\n { Name: \"Any\", Value: -1 },\r\n { Name: \"Fail\", Value: AlcolockEventGroup.Fail },\r\n { Name: \"Circumvention\", Value: AlcolockEventGroup.Circumvention },\r\n { Name: \"Pass\", Value: AlcolockEventGroup.Pass },\r\n { Name: \"SignificantEvent\", Value: AlcolockEventGroup.SignificantEvent }\r\n ]\r\n },\r\n {\r\n\r\n parameterType: ReportParameterType.ReasonCode,\r\n values: [\r\n { Name: translationService.t(\"Reports.Speeding\"), Value: ReasonCode.ContextualSpeeding },\r\n { Name: translationService.t(\"Reports.HarshAcceleration\"), Value: ReasonCode.HarshAcceleration },\r\n { Name: translationService.t(\"Reports.HarshSteering\"), Value: ReasonCode.HarshSteering },\r\n { Name: translationService.t(\"Reports.HarshBraking\"), Value: ReasonCode.HarshBraking },\r\n { Name: translationService.t(\"Reports.BadAnticipation\"), Value: ReasonCode.BadAnticipation },\r\n { Name: translationService.t(\"Reports.Idling\"), Value: ReasonCode.IdlingOverThreshold },\r\n { Name: \"PTO\", Value: ReasonCode.CanbusPto },\r\n ]\r\n },\r\n {\r\n\r\n parameterType: ReportParameterType.GeofenceCategory,\r\n values: [\r\n { Name: translationService.tEnum(GeofenceCategory, \"GeofenceCategory\", GeofenceCategory.Standard), Value: GeofenceCategory.Standard },\r\n { Name: translationService.tEnum(GeofenceCategory, \"GeofenceCategory\", GeofenceCategory.Zone), Value: GeofenceCategory.Zone },\r\n ]\r\n },\r\n {\r\n\r\n parameterType: ReportParameterType.RoadType,\r\n values: [\r\n { Name: translationService.tEnum(RoadType, \"RoadType\", RoadType.Unknown), Value: RoadType.Unknown },\r\n { Name: translationService.tEnum(RoadType, \"RoadType\", RoadType.Motorway), Value: RoadType.Motorway },\r\n { Name: translationService.tEnum(RoadType, \"RoadType\", RoadType.DualCarriageway), Value: RoadType.DualCarriageway },\r\n { Name: translationService.tEnum(RoadType, \"RoadType\", RoadType.SingleCarriageway), Value: RoadType.SingleCarriageway },\r\n { Name: translationService.tEnum(RoadType, \"RoadType\", RoadType.BuiltUpArea), Value: RoadType.BuiltUpArea },\r\n ]\r\n },\r\n {\r\n\r\n parameterType: ReportParameterType.VehicleType,\r\n values: [\r\n { Name: translationService.tEnum(VehicleType, \"VehicleType\", VehicleType.Trailer), Value: VehicleType.Trailer },\r\n { Name: translationService.tEnum(VehicleType, \"VehicleType\", VehicleType.Car), Value: VehicleType.Car },\r\n { Name: translationService.tEnum(VehicleType, \"VehicleType\", VehicleType.BusOrPSV), Value: VehicleType.BusOrPSV },\r\n { Name: translationService.tEnum(VehicleType, \"VehicleType\", VehicleType.HgvLessThan12T), Value: VehicleType.HgvLessThan12T },\r\n { Name: translationService.tEnum(VehicleType, \"VehicleType\", VehicleType.Hgv12Tto22T), Value: VehicleType.Hgv12Tto22T },\r\n { Name: translationService.tEnum(VehicleType, \"VehicleType\", VehicleType.HgvGreaterThan22T), Value: VehicleType.HgvGreaterThan22T },\r\n { Name: translationService.tEnum(VehicleType, \"VehicleType\", VehicleType.Lcv), Value: VehicleType.Lcv },\r\n { Name: translationService.tEnum(VehicleType, \"VehicleType\", VehicleType.Motorcycle), Value: VehicleType.Motorcycle },\r\n { Name: translationService.tEnum(VehicleType, \"VehicleType\", VehicleType.Unknown), Value: VehicleType.Unknown },\r\n { Name: translationService.tEnum(VehicleType, \"VehicleType\", VehicleType.Asset), Value: VehicleType.Asset },\r\n { Name: translationService.tEnum(VehicleType, \"VehicleType\", VehicleType.Plant), Value: VehicleType.Plant }\r\n ]\r\n },\r\n {\r\n parameterType: ReportParameterType.FilterVehicleRowsByVehicleType,\r\n values: [\r\n { Name: translationService.tEnum(VehicleType, \"VehicleType\", VehicleType.Trailer), Value: VehicleType.Trailer },\r\n { Name: translationService.tEnum(VehicleType, \"VehicleType\", VehicleType.Car), Value: VehicleType.Car },\r\n { Name: translationService.tEnum(VehicleType, \"VehicleType\", VehicleType.BusOrPSV), Value: VehicleType.BusOrPSV },\r\n { Name: translationService.tEnum(VehicleType, \"VehicleType\", VehicleType.HgvLessThan12T), Value: VehicleType.HgvLessThan12T },\r\n { Name: translationService.tEnum(VehicleType, \"VehicleType\", VehicleType.Hgv12Tto22T), Value: VehicleType.Hgv12Tto22T },\r\n { Name: translationService.tEnum(VehicleType, \"VehicleType\", VehicleType.HgvGreaterThan22T), Value: VehicleType.HgvGreaterThan22T },\r\n { Name: translationService.tEnum(VehicleType, \"VehicleType\", VehicleType.Lcv), Value: VehicleType.Lcv },\r\n { Name: translationService.tEnum(VehicleType, \"VehicleType\", VehicleType.Motorcycle), Value: VehicleType.Motorcycle },\r\n { Name: translationService.tEnum(VehicleType, \"VehicleType\", VehicleType.Unknown), Value: VehicleType.Unknown },\r\n { Name: translationService.tEnum(VehicleType, \"VehicleType\", VehicleType.Asset), Value: VehicleType.Asset },\r\n { Name: translationService.tEnum(VehicleType, \"VehicleType\", VehicleType.Plant), Value: VehicleType.Plant }\r\n ]\r\n }\r\n ];\r\n\r\n return mappings;\r\n}\r\n","export enum RoadType {\r\n Unknown,\r\n Motorway,\r\n DualCarriageway,\r\n SingleCarriageway,\r\n BuiltUpArea\r\n}\r\n","module.exports = \" {{ selectedHistory.ReportTitle }} {{ selectedHistory.CreatedTime | vDate : {dateTime: true} }} {{ selectedHistory.ProgressState | enumAsString : ReportRunProgressState: \\\"ReportRunProgressState\\\" }}
{{ selectedHistory.Parameters.Start | vDate : {dateTime: true} }} - {{ selectedHistory.Parameters.End | vDate : {dateTime: true} }}
{{ getEnumValue(param) }}
{{ param.Value.length }} {{ 'Reports.' + (ReportParameterType[param.ParameterType]) | translate }}
{{param.Value | unitConversion : true : getUnitConversionType(param.ParameterType) : 0}} {{ param.Value }} {{ \\\"Common.Days\\\" | translate }} {{ param.Value }}%
{{ group.groupName }}
\";","module.exports = \" {{ reportHistory?.ReportTitle }}
\";","module.exports = \" {{ 'ReportListPage.CreateNewReportButton' | translate }}
\";","module.exports = \" {{ 'ReportSchedules.ScheduleReport' | translate }} \";","module.exports = \" {{ report?.Title || report?.ReportTitle }} {{ 'ReportView.LastRunDateLabel' | translate: (lastReportRun?.CreatedTime | vDate) }} {{ 'ReportView.NotYetRunLabel' | translate }} {{ 'ReportView.ActiveScheduleCount' | translate: activeSchedules.length }} {{ 'Reports.EditReport' | translate }} {{ 'ReportView.ScheduleReportButton' | translate }} {{ 'ReportView.RunNowButton' | translate }}
{{ 'ReportView.ScheduleReportButton' | translate }} {{ 'ReportView.RunNowButton' | translate }}
{{ 'ReportView.ViewHistory' | translate }}
{{ 'ReportView.TabTitleViewReport' | translate }}
{{ 'ReportView.FailedToRun' | translate }}
\";","export enum ReeferEngineSpeedModeCategory {\r\n Unknown = -1,\r\n NormalSpeed = 0,\r\n HighSpeed = 1\r\n}\r\n","export enum ReeferInterfaceStatusCategory {\r\n Unknown = -1,\r\n ModeA = 0,\r\n ModeB = 1,\r\n ModeC = 2\r\n}\r\n","export enum DiagnosticTroubleCodeCategory {\r\n Default,\r\n Ibox,\r\n Carrier\r\n}\r\n\r\nexport interface IReeferTroubleCodeHistory {\r\n Id: number;\r\n VehicleId: number;\r\n FirstSeenTime: Date;\r\n LastSeenTime: Date;\r\n ClearedTime?: Date;\r\n DiagnosticTroubleCodeId: number;\r\n Category: DiagnosticTroubleCodeCategory;\r\n CreatedTime: Date;\r\n UpdatedTime: Date;\r\n}\r\n","module.exports = \" {{ reeferUnit?.Make | enumAsString : ReeferMake : 'ReeferMake' }} : {{ \\\"ReeferDetail.ReeferDetailTitle\\\" | translate }} {{ 'ReeferDetail.ActiveAlertCount' | translate: diagnosticErrors.length }} {{reeferUnit?.lastUpdated | relativeTime }}
{{reeferUnit?.operatingMode | enumAsString : ReeferOperatingModeCategory : 'ReeferOperatingModeCategory'}} {{reeferUnit?.engineMode | enumAsString : ReeferOperatingModeCategory : 'ReeferOperatingModeCategory'}}
\";","module.exports = \"
{{ icon }} {{ displayText }}
\";","module.exports = \" \";","import { Component, Input, OnChanges, TemplateRef, ViewChild } from '@angular/core';\r\nimport { IVTableColumn } from '@app/directives/_layout/v-table/_models/IVTableColumn';\r\nimport { IVTableRow } from '@app/directives/_layout/v-table/_models/IVTableRow';\r\nimport { VTableService } from '@app/directives/_layout/v-table/_services/v-table.service';\r\nimport { TemperatureReadingComponent } from '@app/directives/_misc/temperatureReading/temperatureReading.component';\r\nimport { SortType } from '@app/enum/SortType';\r\nimport { IPlotTemperatureRecord } from '@interfaces/IPlot';\r\nimport { DateService } from '@services/date.service';\r\nimport { TranslationService } from '@services/translation.service';\r\nimport { UnitConversionType } from '@services/unitConversion.service';\r\nimport { VehicleService } from '@services/vehicle.service';\r\nimport { ITemperatureSetpointWithHistories } from '@temperature/_components/tempGraph/temperature-graph.component';\r\nimport { TemperatureProbeCategory } from '@temperature/_enums/temperature/TemperatureProbeCategory.enum';\r\nimport { IMultiStateInputWithHistories } from '@temperature/_models/multiStateInputs/IMultiStateInput';\r\nimport { IZoneWithProbes } from '@temperature/_models/temperature/ITemperatureZone';\r\nimport { IZoneTemperatureOutOfBoundsHistory } from '@temperature/_models/temperature/ITemperatureZoneOutOfBoundsHistory';\r\nimport { MultiStateInputService } from '@temperature/_services/multi-state-input.service';\r\nimport { ReeferService } from '@temperature/_services/reefer.service';\r\nimport { TemperatureProbeService } from '@temperature/_services/temperature-probe.service';\r\nimport { TemperatureSetpointService } from '@temperature/_services/temperature-setpoint.service';\r\nimport { ZoneService } from '@temperature/_services/zone.service';\r\nimport { lastValueFrom } from 'rxjs';\r\nimport { ZoneOperatingModeWidget } from '../zone/zoneOperatingModeWidget/zone-operating-mode-widget.component';\r\nimport './temperature-source-data.component.scss';\r\n\r\n@Component({\r\n selector: 'temp-source-data',\r\n template: require('./temperature-source-data.component.html')\r\n})\r\nexport class TemperatureSourceDataComponent implements OnChanges {\r\n\r\n @Input() zone: IZoneWithProbes;\r\n\r\n @Input() startDate: Date;\r\n @Input() endDate: Date;\r\n\r\n @ViewChild('outOfBounds') outOfBoundsTemplate: TemplateRef;\r\n\r\n loading: boolean;\r\n\r\n sourceData: any[];\r\n\r\n tableColumns: IVTableColumn[];\r\n tableRows: IVTableRow[];\r\n // ---\r\n\r\n temperatureRecords: IPlotTemperatureRecord[];\r\n temperatureSetpoints: ITemperatureSetpointWithHistories[];\r\n multiStateInputs: IMultiStateInputWithHistories[];\r\n zoneTemperatureOutOfBoundsHistory: IZoneTemperatureOutOfBoundsHistory[];\r\n\r\n UnitConversionType = UnitConversionType;\r\n\r\n constructor(\r\n private readonly dateService: DateService,\r\n private readonly multiStateInputService: MultiStateInputService,\r\n private readonly reeferService: ReeferService,\r\n private readonly temperatureProbeService: TemperatureProbeService,\r\n private readonly temperatureSetpointService: TemperatureSetpointService,\r\n private readonly translationService: TranslationService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly vTableService: VTableService,\r\n private readonly zoneService: ZoneService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.createTable();\r\n }\r\n\r\n ngOnChanges() {\r\n this.getData();\r\n }\r\n\r\n showProbeData(): void {\r\n if (!this.zone || !this.zone.probes) {\r\n return;\r\n }\r\n\r\n this.sourceData = [];\r\n\r\n this.zone.probes.forEach(probe => {\r\n probe.records.forEach(record => {\r\n var tableRecord = this.sourceData.find(h => h.timestamp === record.Timestamp)\r\n if (!tableRecord) {\r\n tableRecord = {\r\n timestamp: record.Timestamp,\r\n operatingMode: this.reeferService.getOperatingModeForTemperatureRecord(record, this.multiStateInputs, this.zone.Id)?.TriggerState,\r\n setpoint: this.temperatureSetpointService.getSetpointForTemperatureRecord(record, this.temperatureSetpoints, this.zone.Id)?.SetpointValue,\r\n outOfBounds: false,\r\n plotId: record.PlotId\r\n }\r\n\r\n this.sourceData.push(tableRecord);\r\n }\r\n\r\n switch (probe.Category) {\r\n case TemperatureProbeCategory.Return: {\r\n tableRecord.return = record.Temperature;\r\n break;\r\n }\r\n case TemperatureProbeCategory.Supply: {\r\n tableRecord.supply = record.Temperature;\r\n break;\r\n }\r\n case TemperatureProbeCategory.Evaporator: {\r\n tableRecord.evaporator = record.Temperature;\r\n break;\r\n }\r\n }\r\n\r\n tableRecord.outOfBounds = this.getZoneOutOfBounds(tableRecord);\r\n })\r\n })\r\n }\r\n\r\n //--\r\n\r\n private getZoneOutOfBounds(tableRecord: any): boolean {\r\n if (this.tableRecordHasOutOfBoundsHistory(tableRecord)) {\r\n return true;\r\n }\r\n }\r\n\r\n private tableRecordHasOutOfBoundsHistory(tableRecord: any): boolean {\r\n if (!this.zoneTemperatureOutOfBoundsHistory) {\r\n return false;\r\n }\r\n\r\n return this.zoneTemperatureOutOfBoundsHistory.some(history => {\r\n return this.dateService.date1IsAfterDate2(tableRecord.timestamp, history.StartTime) && (this.dateService.date1IsAfterDate2(history.EndTime, tableRecord.timestamp) || !history.EndTime);\r\n })\r\n }\r\n\r\n private getData(): void {\r\n this.loading = true;\r\n const promises = [];\r\n promises.push(this.vehicleService.getVehicleTemperatureRecords(this.zone.VehicleId, this.startDate, this.endDate));\r\n promises.push(this.temperatureSetpointService.loadSetpoints(this.zone.VehicleId, this.startDate, this.endDate));\r\n promises.push(lastValueFrom(this.multiStateInputService.getMultiStateInputs({ VehicleId: this.zone.VehicleId })));\r\n promises.push(lastValueFrom(this.multiStateInputService.getMultiStateInputHistories({ VehicleId: this.zone.VehicleId, Start: this.startDate, End: this.endDate })));\r\n promises.push(lastValueFrom(this.zoneService.getZonesTemperatureOutOfBoundsHistory({ ZoneId: this.zone.Id })));\r\n\r\n Promise.all(promises).then(([temperatureRecords, setpoints, multiStateInputs, multiStateInputHistories, outOfBoundsHistory]) => {\r\n this.temperatureRecords = temperatureRecords;\r\n this.temperatureSetpoints = setpoints;\r\n\r\n this.multiStateInputs = multiStateInputs;\r\n this.multiStateInputService.mapHistoriesToInputs(this.multiStateInputs, multiStateInputHistories);\r\n this.temperatureProbeService.mapTemperatureRecordsToProbes(this.zone.probes, this.temperatureRecords);\r\n this.zoneTemperatureOutOfBoundsHistory = outOfBoundsHistory;\r\n }).finally(() => {\r\n this.showProbeData();\r\n this.tableRows = this.vTableService.createTableRows(this.sourceData, this.tableColumns);\r\n this.loading = false;\r\n })\r\n }\r\n\r\n private createTable(): void {\r\n this.tableColumns = [\r\n {\r\n header: this.vTableService.createDateTableHeader({sorted: true}),\r\n createCellFunction: (item) => this.vTableService.createDateCell(item.timestamp)\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: \"ReeferDetail.Mode\", width: 80 }),\r\n createCellFunction: (item) => this.vTableService.createTableCell(\r\n item.operatingMode,\r\n {\r\n classes: \"text-center\",\r\n component: ZoneOperatingModeWidget,\r\n componentInputs: { category: item.operatingMode }\r\n })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'ReeferList.SetPoint', width: 90, sortType: SortType.Number }),\r\n createCellFunction: (item) => this.vTableService.createTableCell(\r\n item.setpoint,\r\n {\r\n component: TemperatureReadingComponent,\r\n componentInputs: { temperatureReading: item.setpoint }\r\n })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'ReeferList.Return', width: 90, sortType: SortType.Number }),\r\n createCellFunction: (item) => this.vTableService.createTableCell(\r\n item.return,\r\n {\r\n component: TemperatureReadingComponent,\r\n componentInputs: { temperatureReading: item.return }\r\n })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'ReeferList.Supply', width: 90, sortType: SortType.Number }),\r\n createCellFunction: (item) => this.vTableService.createTableCell(\r\n item.supply,\r\n {\r\n component: TemperatureReadingComponent,\r\n componentInputs: { temperatureReading: item.supply }\r\n })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'ReeferList.Evaporator', width: 100, sortType: SortType.Number }),\r\n createCellFunction: (item) => this.vTableService.createTableCell(\r\n item.evaporator,\r\n {\r\n component: TemperatureReadingComponent,\r\n componentInputs: { temperatureReading: item.evaporator }\r\n })\r\n },\r\n {\r\n header: this.vTableService.createLocationInformationHeader(),\r\n createCellFunction: (item) => this.vTableService.createLocationInformationCell({ plotId: item.plotId })\r\n },\r\n {\r\n header: this.vTableService.createTableHeader({ tKey: 'Common.Notes' }),\r\n createCellFunction: (item) => this.vTableService.createTableTemplateCell(item.outOfBounds, this.outOfBoundsTemplate)\r\n }\r\n ]\r\n }\r\n}\r\n","module.exports = \"
warning {{\\\"ReeferList.OutOfBounds\\\" | translate }}
\";","import { AfterViewInit, Component, ElementRef, Input, OnChanges, OnInit, ViewChild } from \"@angular/core\";\r\nimport { ChartService } from \"@services/charts.service\";\r\nimport { DateService, DateUnit } from \"@services/date.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport { TemperatureProbeCategory } from \"@temperature/_enums/temperature/TemperatureProbeCategory.enum\";\r\nimport { ITemperatureProbeWithTemperatureData } from \"@temperature/_models/temperature/ITemperatureProbe\";\r\nimport { ITemperatureRecordWithDiff } from \"@temperature/_models/temperature/ITemperatureRecord\";\r\nimport './temperature-trend.component.scss';\r\n\r\ndeclare const Highcharts: any;\r\n\r\n@Component({\r\n selector: 'temperature-trend',\r\n template: require('./temperature-trend.component.html')\r\n})\r\nexport class TemperatureTrendComponent implements OnChanges {\r\n @Input() probe: ITemperatureProbeWithTemperatureData;\r\n\r\n @ViewChild('trendGraph') trendGraph: ElementRef;\r\n\r\n // ---\r\n\r\n\r\n iconClass: string = '';\r\n icon: string;\r\n diff: number;\r\n\r\n latestRecords: ITemperatureRecordWithDiff[];\r\n latestRecordIsMoreThan24Hours: boolean;\r\n\r\n chartOptions: Highcharts.Options;\r\n\r\n constructor(\r\n private readonly chartService: ChartService,\r\n private readonly dateService: DateService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly translationService: TranslationService) {\r\n }\r\n\r\n\r\n ngOnChanges(): void {\r\n\r\n this.getProbeLatestRecords();\r\n }\r\n\r\n isLessThan24Hours(timestamp: Date | string) {\r\n if (!timestamp) {\r\n return false;\r\n }\r\n\r\n const cutOff = this.dateService.addOrSubtractTime(new Date(), -24, DateUnit.Hour);\r\n\r\n if (this.dateService.date1IsAfterDate2(cutOff, timestamp)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n // ---\r\n\r\n private getProbeLatestRecords() {\r\n this.setProbeName();\r\n\r\n const endTime = new Date(this.probe.latestRecord?.Timestamp);\r\n const startTime = this.dateService.addOrSubtractTime(endTime, -24, DateUnit.Hour);\r\n\r\n this.latestRecordIsMoreThan24Hours = false;\r\n if (!this.isLessThan24Hours(endTime)) {\r\n this.latestRecordIsMoreThan24Hours = true;\r\n return;\r\n }\r\n\r\n return this.vehicleService.getVehicleTemperatureRecords(this.probe.VehicleId, startTime, endTime).then((records) => {\r\n this.probe.latestRecords = records.filter(record => record.TemperatureProbeId === this.probe.Id);\r\n }).finally(() => {\r\n this.calculateDiff();\r\n this.createSparklineChart();\r\n });\r\n }\r\n\r\n private createSparklineChart() {\r\n if (this.chartOptions) {\r\n return;\r\n }\r\n\r\n this.chartOptions = this.chartService.createDashboardChartOptions(\"areaspline\");\r\n this.chartOptions.tooltip.enabled = false;\r\n\r\n const yAxis = this.chartOptions.yAxis as Highcharts.AxisOptions;\r\n yAxis.labels.enabled = false;\r\n yAxis.min = -25;\r\n yAxis.max = 25;\r\n\r\n this.chartOptions.chart.backgroundColor = null;\r\n this.chartOptions.chart.plotBackgroundColor = null;\r\n\r\n this.chartOptions.series = [{\r\n type: \"spline\",\r\n data: this.createSparklineData() as any\r\n }];\r\n\r\n const a = this.chartOptions.series[0] as any;\r\n a.lineWidth = 1;\r\n a.opacity = 0.5;\r\n a.zoneAxis = \"y\";\r\n a.zones = [\r\n { color: \"#004C93\", value: -30 },\r\n { color: \"#004C93\", value: 0 },\r\n { color: \"#cf4946\", value: 0 },\r\n { color: \"#cf4946\", value: 30 }\r\n ];\r\n\r\n\r\n Highcharts.chart(this.trendGraph.nativeElement, this.chartOptions);\r\n }\r\n\r\n private createSparklineData(): number[][] {\r\n if (!this.probe?.latestRecords?.length) {\r\n return [];\r\n }\r\n\r\n const data: number[][] = [];\r\n\r\n this.probe.latestRecords.sort((x, y) => x.Id - y.Id);\r\n\r\n var lastRecord: ITemperatureRecordWithDiff = null\r\n\r\n this.probe.latestRecords.forEach(record => {\r\n const t = new Date(record.Timestamp);\r\n if (lastRecord != null && Math.abs(this.dateService.getDiff(lastRecord.Timestamp, record.Timestamp, DateUnit.Hour)) > 2) {\r\n data.push([new Date(t).valueOf(), null]);\r\n }\r\n\r\n data.push([t.valueOf(), record.Temperature]);\r\n\r\n lastRecord = record;\r\n });\r\n\r\n return data;\r\n }\r\n private calculateDiff() {\r\n if (!this.probe || !this.probe.latestRecord || !this.probe.latestRecords.length) {\r\n return;\r\n }\r\n\r\n const cutOff = this.dateService.addOrSubtractTime(this.probe.latestRecord.Timestamp, -30, DateUnit.Min);\r\n this.probe.latestRecords.sort((x, y) => x.Id - y.Id);\r\n\r\n this.latestRecords = this.probe.latestRecords.filter(rec => {\r\n return this.dateService.date1IsAfterDate2(rec.Timestamp, cutOff);\r\n });\r\n\r\n this.createHistoricalDiffData();\r\n\r\n this.diff = this.probe.latestRecord.Temperature - this.latestRecords[0].Temperature;\r\n }\r\n\r\n private createHistoricalDiffData() {\r\n let maxDiffCalculation = 0;\r\n\r\n this.probe.latestRecords.forEach((record, i) => {\r\n if (i == this.probe.latestRecords.length - 1) {\r\n return;\r\n }\r\n\r\n const nextRecord = this.probe.latestRecords[i + 1];\r\n record.diff = record.Temperature - nextRecord.Temperature;\r\n record.diff = Math.round(record.diff * 10) / 10;\r\n\r\n maxDiffCalculation = Math.max(Math.abs(record.diff), maxDiffCalculation);\r\n });\r\n\r\n this.probe.latestRecords.forEach(record => {\r\n if (!record.diff) {\r\n return;\r\n }\r\n\r\n record.graphDiff = Math.round(record.diff / maxDiffCalculation * 10);\r\n });\r\n }\r\n\r\n private setProbeName() {\r\n\r\n if (this.probe && !this.probe.Name) {\r\n this.probe.Name = this.translationService.tEnum(TemperatureProbeCategory, \"TemperatureProbeCategory\", this.probe.Category);\r\n }\r\n }\r\n}\r\n","module.exports = \"
{{probe.Name}} schedule {{'Common.LastUpdated' | translate}}: {{probe.latestRecord.Timestamp | vDate : {dateTime: true} }}
{{probe.latestRecord.Temperature | unitConversion : true : 'temperature'}} N/A
= 0\\\" tooltip=\\\"{{ 'ZoneSummaryView.VsBefore' | translate}}\\\"> arrow_upward +{{diff | unitConversion : true : 'temperature' }}
arrow_downward {{diff | unitConversion : true : 'temperature'}}
\";","module.exports = \"
{{'temperatureGraph.resetZoom' | translate}} {{ \\\"ExportButton.\\\"+(exporting ? \\\"Exporting\\\" : \\\"Export\\\") | translate }}
{{tooltipDate}}
0\\\">
{{'temperatureGraph.temperatures' | translate}}
{{ probePoint?.y?.toFixed(1) }} {{ probePoint?.series?.name }}
{{'temperatureGraph.inputs' | translate}}
0\\\">
{{'temperatureGraph.on' | translate : inputPoint?.name}} {{'temperatureGraph.open' | translate : inputPoint?.name}}
{{ 'temperatureGraph.MultiStateInputStatus' | translate : [inputPoint.name, inputPoint.custom?.inputStateDescription] }}
{{'temperatureGraph.off' | translate : category?.name}} {{'temperatureGraph.closed' | translate : category?.name}}
{{'temperatureGraph.noTemperatureData' | translate}}
{{\\\"Common.LastUpdated\\\" | translate }}: {{lastUpdated | veriDate: 'fulltime' }}
screen_rotation {{ \\\"Temperature.PleaseRotateDevice\\\" | translate }}
\";","module.exports = \"
{{data?.date | vDate : {dateTime: true} }}
{{ \\\"VehicleTimeline.Current\\\" | translate }}
\";","module.exports = \" \";","module.exports = \"
{{data.probeName}} schedule
{{data.temperature}}
\";","import { Component, Input, OnInit, ViewChild } from \"@angular/core\";\r\nimport { AccountFeatureService, UserRole } from \"@app/services/accountFeature.service\";\r\nimport { ConstantsService } from \"@app/services/constantsService\";\r\nimport { VTabComponent } from \"@directives/_layout/v-tabs/v-tab.component\";\r\nimport { IAggregateFilterEvent } from \"@directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { DateService } from \"@services/date.service\";\r\nimport { IVehicleWithTemperatureData } from \"@temperature/_models/temperature/IVehicleWithTemperatureData\";\r\nimport { InputListComponent } from \"../input-list/input-list.component\";\r\nimport { ProbeDetailComponent } from \"../probe-detail/probe-detail.component\";\r\nimport { TemperatureLogComponent } from \"../temperature-log/temperature-log.component\";\r\nimport './temperature-compliance-detail.component.scss';\r\n\r\n@Component({\r\n selector: 'temperature-compliance-detail',\r\n template: require('./temperature-compliance-detail.component.html')\r\n})\r\nexport class TemperatureComplianceDetailComponent implements OnInit {\r\n @Input() vehicle: IVehicleWithTemperatureData;\r\n\r\n //--\r\n\r\n start: Date;\r\n end: Date;\r\n\r\n rangeStartTime: string;\r\n rangeEndTime: string;\r\n\r\n showGraph: boolean;\r\n selectedTab: VTabComponent;\r\n\r\n isMobile: boolean;\r\n\r\n @ViewChild('tempLog') tempLog: TemperatureLogComponent;\r\n @ViewChild('inputList') inputList: InputListComponent;\r\n @ViewChild('probeDetail') probeDetail: ProbeDetailComponent;\r\n\r\n userHasHistoricalAccess: boolean;\r\n\r\n constructor(\r\n private readonly dateService: DateService,\r\n private readonly constantsService: ConstantsService,\r\n private readonly accountFeatureService: AccountFeatureService\r\n ) {\r\n this.isMobile = this.constantsService.getIsMobile();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.userHasHistoricalAccess = this.accountFeatureService.currentUserHasRole([UserRole.History]);\r\n\r\n this.initDates();\r\n }\r\n\r\n onFilterChanged(event: IAggregateFilterEvent): void {\r\n if (!event.trigger) {\r\n return;\r\n }\r\n\r\n if (event.trigger === 'date') {\r\n this.start = event.date[0];\r\n this.end = event.date[1];\r\n }\r\n }\r\n\r\n resetGraph(showGraph): void {\r\n this.showGraph = showGraph;\r\n }\r\n\r\n resetTables(): void {\r\n this.resetGraph(false);\r\n\r\n }\r\n\r\n updateSelectedTab(tab: VTabComponent): void {\r\n this.selectedTab = tab;\r\n }\r\n\r\n //--\r\n\r\n private initDates(): void {\r\n this.start = this.dateService.getStartOfDay(new Date());\r\n this.end = this.dateService.getEndOfDay(new Date());\r\n }\r\n}\r\n","module.exports = \" \";","module.exports = \" \";","module.exports = \" {{'TempCompliance.AudibleAlert' | translate}} \";","import { Component, Input, OnChanges } from \"@angular/core\";\r\nimport { IDiagnosticTroubleCode } from \"@app/main/components/maintenance/faultCodes/_models/IDiagnosticTroubleCode\";\r\nimport \"./reefer-error-list.component.scss\";\r\n\r\n@Component({\r\n selector: \"reefer-error-list\",\r\n template: require(\"./reefer-error-list.component.html\")\r\n})\r\nexport class ReeferErrorListComponent implements OnChanges {\r\n // Todo, move related logic into this component or into service\r\n @Input() diagnosticErrors: IDiagnosticTroubleCode[];\r\n\r\n constructor() {\r\n }\r\n\r\n ngOnChanges() {\r\n }\r\n}\r\n","module.exports = \"

{{ 'ReeferDetail.Alerts' | translate }}

{{ dError.dateRaised | veriDate }} - {{ 'ReeferDetail.AlarmLevel' | translate : dError.AlarmLevel || 'N/A'}}
7 ? 'high' : 'low'\\\">error {{ dError.Description }}
\";","import { Component, Input, OnInit } from \"@angular/core\";\r\nimport { ITimelineEntryWithData } from \"@directives/_veri/v-timeline/v-timeline.component\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { IZoneWithProbes } from \"@temperature/_models/temperature/ITemperatureZone\";\r\nimport './zone-detail-page.component.scss';\r\n\r\n@Component({\r\n selector: 'zone-detail-page',\r\n template: require('./zone-detail-page.component.html')\r\n})\r\nexport class ZoneDetailPageComponent implements OnInit {\r\n @Input() vehicle: IVehicle;\r\n @Input() zone: IZoneWithProbes;\r\n\r\n @Input() startDate: Date;\r\n @Input() endDate: Date;\r\n\r\n @Input() timelineEntries: ITimelineEntryWithData[] = [];\r\n\r\n // ---\r\n\r\n zoneTimelineEntries: ITimelineEntryWithData[] = [];\r\n\r\n // ---\r\n\r\n constructor() {\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n ngOnChanges() {\r\n if (this.zone && this.timelineEntries) {\r\n this.zoneTimelineEntries = this.timelineEntries.filter(t => t.data == this.zone.Id || t.data === undefined)\r\n }\r\n }\r\n\r\n // ---\r\n}\r\n","module.exports = \"

{{ 'ReeferDetail.Last24Hours' | translate }}

\";","import { Component, EventEmitter, Input, OnInit, Output, SimpleChanges } from \"@angular/core\";\r\nimport { IDiagnosticTroubleCode } from \"@app/main/components/maintenance/faultCodes/_models/IDiagnosticTroubleCode\";\r\nimport { ITimelineEntry } from \"@directives/_veri/v-timeline/v-timeline.component\";\r\nimport { IGoogleMapsMarkerOptions } from \"@interfaces/IGoogleMapsMarkerOptions\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { GoogleMarkerService } from \"@services/googleMarker.service\";\r\nimport { PlotService } from \"@services/plot.service\";\r\nimport { ReeferMake } from \"@temperature/_enums/reefer/ReeferMake.enum\";\r\nimport { IReeferWithMappings } from \"@temperature/_models/reefer/IReeferWithMappings\";\r\nimport { IZoneWithProbes } from \"@temperature/_models/temperature/ITemperatureZone\";\r\nimport './zone-overview-page.component.scss';\r\n\r\n@Component({\r\n selector: 'zone-overview-page',\r\n template: require('./zone-overview-page.component.html')\r\n})\r\nexport class ZoneOverviewPageComponent implements OnInit {\r\n @Input() vehicle: IVehicle;\r\n @Input() zones: IZoneWithProbes[];\r\n\r\n @Input() diagnosticErrors: IDiagnosticTroubleCode[];\r\n @Input() timelineEntries: ITimelineEntry[] = [];\r\n @Input() reeferUnit: IReeferWithMappings;\r\n @Output() zoneSelected = new EventEmitter();\r\n\r\n // ---\r\n\r\n ReeferMake = ReeferMake;\r\n reeferLocationMarker: IGoogleMapsMarkerOptions;\r\n\r\n constructor(private readonly plotService: PlotService, private readonly googleMarkerService: GoogleMarkerService) {\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (this.vehicle && changes[\"vehicle\"]) {\r\n this.createVehicleMarker();\r\n }\r\n }\r\n\r\n selectZone(id: number) {\r\n this.zoneSelected.emit(id);\r\n }\r\n\r\n get fuelClass(): string {\r\n if (this.reeferUnit.fuelLevel < 15) {\r\n return 'error';\r\n }\r\n\r\n return 'ok';\r\n }\r\n\r\n // ---\r\n\r\n private createVehicleMarker() {\r\n this.plotService.getLatestPlotForVehicle(this.vehicle.Id).then(plot => {\r\n this.vehicle.Plot = plot;\r\n\r\n this.googleMarkerService.generateGoogleMapsMarkerOptionsForVehicle(this.vehicle).then(options => {\r\n\r\n this.reeferLocationMarker = options;\r\n });\r\n });\r\n }\r\n}\r\n","module.exports = \"
SN: {{reeferUnit.SerialNumber}} | {{'ZoneOverview.Protocol' | translate}}: {{reeferUnit.ProtocolVersion}} | {{'ZoneOverview.SoftwareVersion' | translate}}: {{reeferUnit.SoftwareVersion}}
= 0\\\">

{{ 'ReeferDetail.FuelLevel' | translate }}

{{ 'ReeferDetail.RunningTimes' | translate }}

local_shipping
{{ reeferUnit.engineHours | number }}
{{ 'ReeferDetail.EngineHours' | translate }} {{ 'ReeferDetail.Hours' | translate }}
electric_bolt
{{ reeferUnit.electricHours | number }}
{{ 'ReeferDetail.ElectricHours' | translate }} {{ 'ReeferDetail.Hours' | translate }}
no_backpack
{{ reeferUnit.standbyDuration | number }}
{{ 'ReeferDetail.StandbyHours' | translate }} {{ 'ReeferDetail.Hours' | translate }}

{{ 'ReeferDetail.Last24Hours' | translate }}

\";","import { Component, Input } from \"@angular/core\";\r\nimport { IZoneWithProbes } from \"@temperature/_models/temperature/ITemperatureZone\";\r\nimport { ZoneService } from \"@temperature/_services/zone.service\";\r\nimport './zone-setpoint.component.scss';\r\n\r\n@Component({\r\n selector: 'zone-setpoint',\r\n template: require('./zone-setpoint.component.html')\r\n})\r\nexport class ZoneSetPointComponent {\r\n @Input() zones: IZoneWithProbes[];\r\n @Input() zonePosition: number;\r\n\r\n //--\r\n zone: IZoneWithProbes;\r\n temperature: number;\r\n\r\n constructor(private readonly zoneService: ZoneService) { }\r\n\r\n ngOnInit(): void {\r\n this.render();\r\n }\r\n\r\n ngOnChanges(): void {\r\n this.render();\r\n }\r\n\r\n // ---\r\n\r\n private render(): void {\r\n if (typeof this.zones === \"string\") {\r\n return;\r\n }\r\n\r\n this.zone = this.zoneService.getZoneAtPosition(this.zones, this.zonePosition);\r\n this.temperature = this.zone?.setpointReading;\r\n }\r\n}\r\n","module.exports = \"{{ temperature | unitConversion : true : \\\"temperature\\\" }} \";","import { Component, EventEmitter, Input, OnInit, Output } from \"@angular/core\";\r\nimport { DateService, DateUnit } from \"@services/date.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { IZoneWithProbes } from \"@temperature/_models/temperature/ITemperatureZone\";\r\nimport './zone-summary-view.component.scss';\r\n\r\n@Component({\r\n selector: 'zone-summary-view',\r\n template: require('./zone-summary-view.component.html')\r\n})\r\nexport class ZoneSummaryViewComponent implements OnInit {\r\n @Input() zone: IZoneWithProbes;\r\n @Input() clickable: boolean;\r\n\r\n @Output() zoneSelected = new EventEmitter();\r\n\r\n setpointLastUpdated: string;\r\n latestTimes: Date[] = []\r\n dateRangeStart: Date;\r\n zoneInactive: boolean;\r\n zoneActiveAgo: string;\r\n // ---\r\n\r\n constructor(\r\n private readonly dateService: DateService,\r\n private readonly translationService: TranslationService) {\r\n this.dateRangeStart = this.dateService.addOrSubtractTime(new Date, -1, DateUnit.Day)\r\n }\r\n\r\n ngOnInit() {\r\n this.getZoneLastUpdated();\r\n\r\n }\r\n\r\n selectZone(id: number) {\r\n this.zoneSelected.emit(id);\r\n }\r\n\r\n getSetpointLastUpdated(): void {\r\n\r\n if (this.zone?.setpoint?.histories.length) {\r\n const formattedDate = this.dateService.formatDate(this.zone.setpoint.histories[0].StartTime, { dateTime: true });\r\n this.latestTimes.push(this.zone.setpoint.histories[0].StartTime);\r\n this.setpointLastUpdated = `${this.translationService.t(\"Common.LastUpdated\")} ${formattedDate}`;\r\n }\r\n else {\r\n this.setpointLastUpdated = this.translationService.t(\"ZoneSummaryView.UnknownDate\");\r\n }\r\n }\r\n\r\n getZoneLastUpdated() {\r\n this.getSetpointLastUpdated();\r\n\r\n if (this.zone.zoneOperatingMode && this.zone.zoneOperatingMode.latestRecord) {\r\n this.latestTimes.push(this.zone.zoneOperatingMode.latestRecord.EventTime)\r\n }\r\n\r\n this.zone.probes.forEach(probe => {\r\n if (probe.latestRecord) {\r\n this.latestTimes.push(probe.latestRecord.Timestamp)\r\n }\r\n });\r\n\r\n var latestZoneUpdate = this.dateService.getLatestDate(this.latestTimes);\r\n this.zoneInactive = !this.dateService.date1IsAfterDate2(latestZoneUpdate, this.dateRangeStart);\r\n this.zoneActiveAgo = this.dateService.relativeTime(latestZoneUpdate);\r\n }\r\n\r\n // ---\r\n}\r\n","module.exports = \"

{{zone.Name}}

warning {{ 'TempCompliance.OutOfBounds' | translate}}
{{ 'ReeferList.SetPoint' | translate}}: {{zone?.setpointReading | unitConversion : true : 'temperature' }}
{{ 'ReeferList.Active' | translate }} {{ zoneActiveAgo }}
\";","import { Component, Input, OnChanges } from \"@angular/core\";\r\nimport { UnitConversionService } from \"@services/unitConversion.service\";\r\nimport { TemperatureProbeCategory } from \"@temperature/_enums/temperature/TemperatureProbeCategory.enum\";\r\nimport { IZoneWithProbes } from \"@temperature/_models/temperature/ITemperatureZone\";\r\nimport { ZoneService } from \"@temperature/_services/zone.service\";\r\n\r\n@Component({\r\n selector: 'zone-temperature',\r\n template: `{{temperature | unitConversion : true : \"temperature\"}}`\r\n})\r\nexport class ZoneTemperatureComponent implements OnChanges {\r\n @Input() zones: IZoneWithProbes[];\r\n @Input() zonePosition: number;\r\n @Input() probeType: TemperatureProbeCategory;\r\n\r\n //--\r\n\r\n temperature: number;\r\n\r\n constructor(\r\n private readonly zoneService: ZoneService) { }\r\n\r\n ngOnChanges(): void {\r\n if (this.zones?.length) {\r\n\r\n this.getDisplayTemperature();\r\n }\r\n }\r\n\r\n //--\r\n\r\n private getDisplayTemperature() {\r\n const zone = this.zoneService.getZoneAtPosition(this.zones, this.zonePosition);\r\n const probe = zone?.probes?.find(probe => probe.Category === this.probeType);\r\n if (!probe) {\r\n return;\r\n }\r\n\r\n this.temperature = probe.latestRecord.Temperature;\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output } from \"@angular/core\";\r\nimport { IDiagnosticRecord } from \"@app/main/components/maintenance/faultCodes/_models/IDiagnosticRecord\";\r\nimport { IDiagnosticTroubleCode } from \"@app/main/components/maintenance/faultCodes/_models/IDiagnosticTroubleCode\";\r\nimport { FaultCodesService } from \"@app/main/components/maintenance/faultCodes/fault-codes.service\";\r\nimport { IVehicleWithSensorDataValues } from \"@app/main/components/maintenance/sensorData/_models/IVehicleWithSensorData\";\r\nimport { SensorDataService } from \"@app/main/components/maintenance/sensorData/sensor-data.service\";\r\nimport { IAggregateFilterEvent } from \"@directives/_resourceFilters/filter-bar/filter-bar.models\";\r\nimport { ITimelineEntryWithData } from \"@directives/_veri/v-timeline/v-timeline.component\";\r\nimport { LatestSensorDataValues } from \"@interfaces/ISensorDataValue\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { DateService, DateUnit } from \"@services/date.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport { ZoneStatus } from \"@temperature/_enums/temperature/ZoneStatus.enum\";\r\nimport { IMultiStateInput } from \"@temperature/_models/multiStateInputs/IMultiStateInput\";\r\nimport { IMultiStateInputRecord } from \"@temperature/_models/multiStateInputs/IMultiStateInputRecord\";\r\nimport { IReefer } from \"@temperature/_models/reefer/IReefer\";\r\nimport { IReeferWithMappings } from \"@temperature/_models/reefer/IReeferWithMappings\";\r\nimport { ITemperatureOutOfBoundsHistory } from \"@temperature/_models/temperature/ITemperatureOutOfBoundsHistory\";\r\nimport { ITemperatureProbe, ITemperatureProbeWithTemperatureData } from \"@temperature/_models/temperature/ITemperatureProbe\";\r\nimport { ITemperatureRecord } from \"@temperature/_models/temperature/ITemperatureRecord\";\r\nimport { ITemperatureSetpoint } from \"@temperature/_models/temperature/ITemperatureSetpoint\";\r\nimport { ITemperatureSetpointHistory } from \"@temperature/_models/temperature/ITemperatureSetpointHistory\";\r\nimport { IZone, IZoneWithProbes } from \"@temperature/_models/temperature/ITemperatureZone\";\r\nimport { IZoneTemperatureOutOfBoundsHistory } from \"@temperature/_models/temperature/ITemperatureZoneOutOfBoundsHistory\";\r\nimport { MultiStateInputService } from \"@temperature/_services/multi-state-input.service\";\r\nimport { ReeferService } from \"@temperature/_services/reefer.service\";\r\nimport { TemperatureOutOfBoundsHistoryService } from \"@temperature/_services/temperature-out-of-bounds.service\";\r\nimport { TemperatureProbeService } from \"@temperature/_services/temperature-probe.service\";\r\nimport { TemperatureSetpointService } from \"@temperature/_services/temperature-setpoint.service\";\r\nimport { ZoneService } from \"@temperature/_services/zone.service\";\r\nimport './zoned-temperature-detail.component.scss';\r\nimport { lastValueFrom } from \"rxjs\";\r\n\r\n@Component({\r\n selector: 'zoned-temperature-detail',\r\n template: require('./zoned-temperature-detail.component.html')\r\n})\r\nexport class ZonedTemperatureDetailComponent implements OnInit, OnChanges {\r\n\r\n @Input() vehicleId: number;\r\n\r\n\r\n @Output() lastUpdateChanged = new EventEmitter();\r\n\r\n // ---\r\n\r\n loading: boolean;\r\n\r\n start: Date;\r\n end: Date;\r\n selectedZone: IZoneWithProbes;\r\n\r\n timelineEntries: ITimelineEntryWithData[] = [];\r\n\r\n reeferUnit: IReeferWithMappings;\r\n zones: IZoneWithProbes[];\r\n vehicle: IVehicle;\r\n\r\n sensorDataValues: LatestSensorDataValues[];\r\n\r\n temperatureSetpoints: ITemperatureSetpoint[];\r\n temperatureSetpointHistories: ITemperatureSetpointHistory[];\r\n temperatureProbes: ITemperatureProbeWithTemperatureData[];\r\n temperatureRecords: ITemperatureRecord[];\r\n allTemperatureRecords: ITemperatureRecord[];\r\n zoneTemperatureOutOfBoundsHistory: IZoneTemperatureOutOfBoundsHistory[];\r\n\r\n diagnosticErrors: IDiagnosticTroubleCode[];\r\n allDiagnosticRecords: IDiagnosticRecord[];\r\n diagnosticRecords: IDiagnosticRecord[];\r\n diagnosticTroubleCodes: IDiagnosticTroubleCode[];\r\n\r\n latestMultiStateInputRecords: IMultiStateInputRecord[];\r\n multiStateInputs: IMultiStateInput[];\r\n\r\n constructor(\r\n private readonly dateService: DateService,\r\n private readonly faultCodeService: FaultCodesService,\r\n private readonly multiStateInputService: MultiStateInputService,\r\n private readonly outOfBoundsService: TemperatureOutOfBoundsHistoryService,\r\n private readonly reeferService: ReeferService,\r\n private readonly sensorDataService: SensorDataService,\r\n private readonly temperatureProbeService: TemperatureProbeService,\r\n private readonly temperatureSetpointService: TemperatureSetpointService,\r\n private readonly translationService: TranslationService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly zoneService: ZoneService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.getData(true);\r\n }\r\n\r\n\r\n ngOnChanges(): void {\r\n this.setDefaultDateRange();\r\n }\r\n\r\n showZoneData(id: number) {\r\n this.selectedZone = this.zones.find(zone => {\r\n return zone.Id === id;\r\n });\r\n }\r\n\r\n onFilterChanged(event: IAggregateFilterEvent) {\r\n if (!event.trigger) {\r\n return;\r\n }\r\n\r\n if (event.trigger === 'date') {\r\n this.start = event.date[0];\r\n this.end = event.date[1];\r\n }\r\n }\r\n\r\n //--\r\n\r\n private getData(first = false) {\r\n if (first) {\r\n this.loading = true;\r\n }\r\n Promise.all([\r\n lastValueFrom(this.reeferService.getReeferData({ vehicleId: this.vehicleId })),\r\n this.getPropertiesForReeferData()])\r\n .then(([reeferUnits, _]) => {\r\n this.reeferUnit = reeferUnits[0];\r\n\r\n this.reeferService.santitiseReeferSerialNumber(this.reeferUnit);\r\n\r\n this.reeferService.setupSensorDataForReefer(this.reeferUnit, this.vehicle as IVehicleWithSensorDataValues, this.sensorDataValues);\r\n this.multiStateInputService.getModes(this.reeferUnit, this.latestMultiStateInputRecords);\r\n this.temperatureSetpointService.mapHistoriesToSetPoints(this.temperatureSetpoints, this.temperatureSetpointHistories);\r\n\r\n this.diagnosticErrors = this.reeferService.getActiveReeferErrors(this.diagnosticRecords, this.diagnosticTroubleCodes);\r\n this.reeferUnit.multiStateInputRecords = this.latestMultiStateInputRecords;\r\n this.mapPropertiesToZones();\r\n this.reeferUnit.lastUpdated = this.reeferService.getLastUpdated(this.reeferUnit.zones, []);\r\n this.outputLastUpdated();\r\n }).finally(() => {\r\n this.setupTimeline();\r\n this.loading = false;\r\n })\r\n }\r\n\r\n private outputLastUpdated() {\r\n if (!this.reeferUnit.lastUpdated) {\r\n return;\r\n }\r\n this.lastUpdateChanged.emit(this.reeferUnit.lastUpdated);\r\n }\r\n\r\n private setDefaultDateRange() {\r\n this.end = new Date();\r\n this.start = this.dateService.addOrSubtractTime(this.end, -24, DateUnit.Hour);\r\n }\r\n\r\n private getPropertiesForReeferData() {\r\n const promises: PromiseLike[] = [\r\n this.getVehicleData(),\r\n this.getZones(),\r\n this.getDiagnosticData(),\r\n this.getTemperatureData(),\r\n this.getMultiStateInputData()\r\n ]\r\n return Promise.all(promises);\r\n }\r\n\r\n private getVehicleData() {\r\n const vehiclePromise = this.vehicleService.getVehicle(this.vehicleId, { includePeripheralMappings: true }) as Promise;\r\n const sensorDataPromise = this.sensorDataService.getLatestSensorDataValues({ VehicleId: this.vehicleId });\r\n\r\n return Promise.all([vehiclePromise, sensorDataPromise]).then(([vehicle, sensorDataValues]) => {\r\n this.vehicle = vehicle;\r\n this.sensorDataValues = sensorDataValues;\r\n })\r\n }\r\n\r\n private getZones() {\r\n return lastValueFrom(this.zoneService.getZones({ VehicleId: this.vehicleId, Status: ZoneStatus.Active })).then(zones => {\r\n this.zones = zones.sort((a, b) => a.Position - b.Position);\r\n })\r\n }\r\n\r\n private getDiagnosticData() {\r\n const faultCodePromises: any[] = [\r\n this.faultCodeService.getVehicleDiagnosticRecords(this.vehicleId),\r\n this.faultCodeService.getActiveDiagnosticRecordsForVehicle(this.vehicleId),\r\n this.faultCodeService.getReeferDiagnosticTroubleCodes()\r\n ]\r\n\r\n return Promise.all(faultCodePromises).then(([allDiagnosticRecords, diagnosticRecords, troubleCodes]) => {\r\n this.allDiagnosticRecords = this.reeferService.filterReeferErrorCodes(allDiagnosticRecords);\r\n this.diagnosticRecords = this.reeferService.filterReeferErrorCodes(diagnosticRecords);\r\n this.diagnosticTroubleCodes = troubleCodes;\r\n })\r\n }\r\n\r\n private getTemperatureData() {\r\n const temperaturePromises: any[] = [\r\n this.vehicleService.getLatestVehicleTemperatureRecordsForVehicle(this.vehicleId),\r\n this.vehicleService.getVehicleTemperatureRecords(this.vehicleId, this.start, this.end),\r\n lastValueFrom(this.temperatureSetpointService.getTemperatureSetpoints({ VehicleId: this.vehicleId })),\r\n lastValueFrom(this.temperatureSetpointService.getTemperatureSetpointHistories({ VehicleId: this.vehicleId })),\r\n lastValueFrom(this.temperatureProbeService.getTemperatureProbesForVehicle(this.vehicleId)),\r\n lastValueFrom(this.zoneService.getZonesTemperatureOutOfBoundsHistory({ VehicleId: this.vehicleId }))\r\n ];\r\n\r\n return Promise.all(temperaturePromises).then(([temperatureRecords, allTemperatureRecords, temperatureSetpoints, setpointHistories, temperatureProbes, outOfBoundsHistory]) => {\r\n this.temperatureRecords = temperatureRecords;\r\n this.allTemperatureRecords = allTemperatureRecords;\r\n this.temperatureSetpoints = temperatureSetpoints;\r\n this.temperatureSetpointHistories = setpointHistories;\r\n this.temperatureProbes = temperatureProbes;\r\n this.zoneTemperatureOutOfBoundsHistory = outOfBoundsHistory;\r\n })\r\n }\r\n\r\n private getMultiStateInputData() {\r\n const multiStateInputPromises: Promise[] = [\r\n lastValueFrom(this.multiStateInputService.getLatestMultiStateInputRecords()),\r\n lastValueFrom(this.multiStateInputService.getMultiStateInputs({ VehicleId: this.vehicleId }))\r\n ];\r\n return Promise.all(multiStateInputPromises).then(([latestMultiStateInputRecords, multiStateInputs]) => {\r\n this.latestMultiStateInputRecords = latestMultiStateInputRecords.filter(record => record.VehicleId === this.vehicleId);\r\n this.multiStateInputs = multiStateInputs;\r\n })\r\n }\r\n\r\n private mapPropertiesToZones() {\r\n if (!this.zones || !this.zones.length) {\r\n this.reeferUnit.zones = [];\r\n return;\r\n }\r\n this.zones.forEach(zone => {\r\n if (!zone.Name) {\r\n zone.Name = this.translationService.t('ReeferList.ZoneNo', zone.Position);\r\n }\r\n })\r\n this.temperatureProbeService.mapTemperatureRecordsToProbes(this.temperatureProbes, this.allTemperatureRecords)\r\n\r\n const reeferZoneModes = this.zoneService.getLatestReeferZoneOperatingModes(this.latestMultiStateInputRecords, this.multiStateInputs, this.reeferService.getHardwareSource(this.reeferUnit.Make));\r\n this.zoneService.mapProbesToZone(this.zones, this.temperatureProbes);\r\n this.zoneService.mapZoneStatuses(this.zones, reeferZoneModes);\r\n this.zoneService.mapTemperatureSetpointsToZones(this.zones, this.temperatureSetpoints);\r\n this.temperatureProbeService.mapProbesLatestRecord(this.zones, this.temperatureRecords);\r\n this.zoneService.mapOutOfBoundsHistoryToZones(this.zones, this.zoneTemperatureOutOfBoundsHistory);\r\n this.zoneService.setZonesOperatingMode(this.zones);\r\n\r\n this.reeferUnit.zones = this.zones;\r\n }\r\n\r\n private setupTimeline(): void {\r\n\r\n this.timelineEntries = [];\r\n\r\n if (!this.vehicle || !this.zones?.length) {\r\n return;\r\n }\r\n\r\n const historyStartTime = this.dateService.addOrSubtractTime(new Date(), -1, DateUnit.Day);\r\n\r\n // Setpoint changes\r\n this.timelineEntries.push(...this.temperatureSetpointService.createTimelineEntriesForSetpointChanges(this.zones, historyStartTime));\r\n\r\n\r\n // Errors\r\n this.timelineEntries.push(...this.reeferService.createTimelineEntriesForDiagnosticErrors(this.allDiagnosticRecords, historyStartTime));\r\n\r\n\r\n // Out of bounds\r\n const recentOutOfBoundsHistory = this.zoneTemperatureOutOfBoundsHistory.filter(history => {\r\n return this.dateService.date1IsAfterDate2(history.StartTime, historyStartTime) || this.dateService.date1IsAfterDate2(history.EndTime, historyStartTime);\r\n })\r\n\r\n this.timelineEntries.push(...this.outOfBoundsService.createTimelineEntriesForOutOfBoundsHistory(recentOutOfBoundsHistory, this.zones, historyStartTime));\r\n\r\n }\r\n}\r\n","module.exports = \" \";","module.exports = \"

{{ 'Common.Vehicles' | translate }}

{{ 'Common.Drivers' | translate }}

{{driver.Name}}

{{ 'Common.Geofences' | translate }}

{{geofence.Description}}
\";","import { CommonModule } from \"@angular/common\";\r\nimport { NgModule, Type } from \"@angular/core\";\r\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\r\nimport { PipesModule } from \"@app/_pipes/_pipes.module\";\r\nimport { CoreDirectivesModule } from \"@app/directives/_core/_core.directives.module\";\r\nimport { FormsDirectivesModule } from \"@app/directives/_forms/_form.directives.module\";\r\nimport { LayoutDirectivesModule } from \"@app/directives/_layout/_layout.directives.module\";\r\nimport { VTableModule } from \"@app/directives/_layout/v-table/v-table.module\";\r\nimport { MiscDirectivesModule } from \"@app/directives/_misc/_misc.directives.module\";\r\nimport { ResourceFiltersDirectivesModule } from \"@app/directives/_resourceFilters/_resourceFilters.directives.module\";\r\nimport { VeriDirectivesModule } from \"@app/directives/_veri/_veri.directives.module\";\r\nimport { providerCreator } from \"@app/services/_services.module\";\r\nimport { DriverService } from \"@app/services/driver.service\";\r\nimport { DriverAssignmentService } from \"@app/services/driverAssignment.service\";\r\nimport { GroupService } from \"@app/services/group.service.ajs\";\r\nimport { TranslationService } from \"@app/services/translation.service\";\r\nimport { VehicleService } from \"@app/services/vehicle.service\";\r\nimport { VehicleInputService } from \"@app/services/vehicleInput.service\";\r\nimport { AlertReviewService } from \"./_services/alert-review.service\";\r\nimport { AlertsService } from \"./_services/alerts.service\";\r\nimport { AlertCategoryComponent } from \"./components/alert-category/alert-category.component\";\r\nimport { AlertDetailComponent } from \"./components/alert-detail/alert-detail.component\";\r\nimport { AxleWeightAlertDetailComponent } from \"./components/alert-detail/axle-weight-alert-detail/axle-weight-alert-detail.component\";\r\nimport { AxleWeightAlertDetailService } from \"./components/alert-detail/axle-weight-alert-detail/axle-weight-alert-detail.service\";\r\nimport { GeofenceAlertDetailComponent } from \"./components/alert-detail/geofence-alert-detail/geofence-alert-detail.component\";\r\nimport { GeofenceAlertDetailService } from \"./components/alert-detail/geofence-alert-detail/geofence-alert-detail.service\";\r\nimport { InputAlertDetailComponent } from \"./components/alert-detail/input-alert-detail/input-alert-detail.component\";\r\nimport { InputAlertDetailService } from \"./components/alert-detail/input-alert-detail/input-alert-detail.service\";\r\nimport { PowerLossAlertDetailComponent } from \"./components/alert-detail/power-loss-alert-detail/power-loss-alert-detail.component\";\r\nimport { PowerLossAlertDetailService } from \"./components/alert-detail/power-loss-alert-detail/power-loss-alert-detail.service\";\r\nimport { TemperatureAlertDetailComponent } from \"./components/alert-detail/temperature-alert-detail/temperature-alert-detail.component\";\r\nimport { TollAlertDetailComponent } from \"./components/alert-detail/toll-alert-detail/toll-alert-detail.component\";\r\nimport { TollAlertDetailService } from \"./components/alert-detail/toll-alert-detail/toll-alert-detail.service\";\r\nimport { TyreRecordAlertDetailComponent } from \"./components/alert-detail/tyre-record-alert-detail/tyre-record-alert-detail.component\";\r\nimport { TyreRecordAlertDetailService } from \"./components/alert-detail/tyre-record-alert-detail/tyre-record-detail.service\";\r\nimport { VehicleDiagnosticAlertDetailComponent } from \"./components/alert-detail/vehicle-diagnostic-detail/vehicle-diagnostic-alert-detail.component\";\r\nimport { VehicleDiagnosticAlertDetailService } from \"./components/alert-detail/vehicle-diagnostic-detail/vehicle-diagnostic-detail.service\";\r\nimport { VideoAlertDetailComponent } from \"./components/alert-detail/video-alert-detail/video-alert-detail.component\";\r\nimport { VideoAlertDetailService } from \"./components/alert-detail/video-alert-detail/video-alert-detail.service\";\r\nimport { AlertReviewDialogComponent } from \"./components/alert-review-dialog/alert-review-dialog.component\";\r\nimport { AlertReviewHistoryComponent } from \"./components/alert-review-history/alert-review-history.component\";\r\nimport { ResolutionCodeEditorComponent } from \"./components/resolution-code-editor/resolution-code-editor.component\";\r\nimport { GroupsModule } from \"@app/main/components/resourceManagement/groups/groups.module\";\r\n\r\n\r\nconst privateComponents: any[] = [\r\n];\r\n\r\nconst publicComponents: any[] = [\r\n AlertReviewDialogComponent,\r\n ResolutionCodeEditorComponent,\r\n AlertDetailComponent,\r\n GeofenceAlertDetailComponent,\r\n TemperatureAlertDetailComponent,\r\n AxleWeightAlertDetailComponent,\r\n InputAlertDetailComponent,\r\n PowerLossAlertDetailComponent,\r\n TollAlertDetailComponent,\r\n TyreRecordAlertDetailComponent,\r\n VehicleDiagnosticAlertDetailComponent,\r\n VideoAlertDetailComponent,\r\n AlertCategoryComponent,\r\n AlertReviewHistoryComponent\r\n];\r\n\r\nconst declarations: Type[] = [\r\n];\r\n\r\nconst providers: any[] = [\r\n providerCreator(AlertReviewService, \"alertReviewService\"),\r\n providerCreator(AlertsService, \"alertsService\"),\r\n providerCreator(VehicleInputService, 'vehicleInputService'),\r\n providerCreator(DriverService, 'driverService'),\r\n providerCreator(DriverAssignmentService, 'driverAssignmentService'),\r\n providerCreator(GroupService, 'groupService'),\r\n providerCreator(TranslationService, 'translationService'),\r\n providerCreator(VehicleService, 'vehicleService'),\r\n \r\n providerCreator(AxleWeightAlertDetailService, \"axleWeightAlertDetailService\"),\r\n providerCreator(GeofenceAlertDetailService, \"geofenceAlertDetailService\"),\r\n providerCreator(InputAlertDetailService, \"inputAlertDetailService\"),\r\n providerCreator(PowerLossAlertDetailService, \"powerLossAlertDetailService\"),\r\n providerCreator(TollAlertDetailService, \"tollAlertDetailService\"),\r\n providerCreator(TyreRecordAlertDetailService, \"tyreRecordAlertDetailService\"),\r\n providerCreator(VehicleDiagnosticAlertDetailService, \"vehicleDiagnosticAlertDetailService\"),\r\n providerCreator(VideoAlertDetailService, \"videoAlertDetailService\")\r\n];\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n VeriDirectivesModule,\r\n LayoutDirectivesModule,\r\n FormsDirectivesModule,\r\n CoreDirectivesModule,\r\n MiscDirectivesModule,\r\n PipesModule,\r\n VTableModule,\r\n ResourceFiltersDirectivesModule,\r\n GroupsModule\r\n ],\r\n providers: providers,\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents, ...declarations],\r\n exports: [...publicComponents, ...declarations]\r\n})\r\nexport class AlertsModule {\r\n\r\n}\r\n","module.exports = \"
{{ category }}
{{subCategory}}
\";","module.exports = \"
{{'Alerts.NoAlarmData' | translate}}
\";","export enum ProfileBound {\r\n Upper,\r\n Lower\r\n}\r\n\r\nexport enum VehicleAxle {\r\n None,\r\n Total,\r\n Axle1,\r\n Axle2,\r\n Axle3,\r\n Axle4\r\n}\r\n\r\nexport interface IAxleWeightOutOfBoundsHistory {\r\n Id: number;\r\n VehicleId: number;\r\n DriverId?: number;\r\n StartTime: Date;\r\n EndTime?: Date;\r\n StartPlotId: number;\r\n EndPlotId?: number;\r\n AxleWeightProfileId?: number;\r\n VehicleAxle: VehicleAxle;\r\n Bound: ProfileBound;\r\n AxleWeightExtreme: number;\r\n}\r\n","module.exports = \"
{{ 'Common.Updating' | translate }}...
{{tableModeLabel}}
{{alertDetailData.profile?.Name}} {{alertDetailData.history?.VehicleAxle}} {{alertDetailData.history?.AxleWeightExtreme}} ({{alertDetailData.weightDiffExtreme}} {{alertDetailData.weightDiffMessageExtreme}}) {{'Alerts.Lower' | translate}} {{alertDetailData.lowerBound}} / {{'Alerts.Upper' | translate}} {{alertDetailData.upperBound}}
\";","module.exports = \"
{{ 'Common.Updating' | translate }}...
{{tableModeLabel}}
{{alertDetailData.geofence?.Description}} {{alertDetailData.geofence?.Addr1}}, {{alertDetailData.geofence?.Addr2}}, {{alertDetailData.geofence?.Addr3}}, {{alertDetailData.geofence?.Addr4}}
\";","module.exports = \"
{{ 'Common.Updating' | translate }}...
{{tableModeLabel}}
{{alertDetailData.inputType?.Name}}
\";","module.exports = \"
{{ 'Common.Updating' | translate }}...
{{tableModeLabel}}
{{alertDetailData.history?.Source}}
\";","module.exports = \"
{{ 'Common.Updating' | translate }}...
{{alertDetailData.temperatureProbe?.Name}}
{{tableModeLabel}}
{{alertDetailData.temperatureProfile?.Name}} {{alertDetailData.temperatureProbe?.Name}} {{alertDetailData.temperatureExtreme | unitConversion : true : 'temperature'}} ({{alertDetailData.temperatureDiffExtreme | unitConversion : true : 'temperature'}} {{alertDetailData.temperatureDiffMessageExtreme}}) {{'Alerts.Lower' | translate}} {{alertDetailData.lowerBound | unitConversion : true : 'temperature'}} / {{'Alerts.Upper' | translate}} {{alertDetailData.upperBound | unitConversion : true : 'temperature'}}
\";","module.exports = \"
{{ 'Common.Updating' | translate }}...
{{tableModeLabel}}
\";","module.exports = \"
{{ 'Common.Updating' | translate }}...
{{tableModeLabel}}
\";","module.exports = \"
{{ 'Common.Updating' | translate }}...
{{tableModeLabel}}
\";","module.exports = \"
{{ 'Common.Updating' | translate }}...
{{tableModeLabel}}
\";","module.exports = \"
{{ 'Alerts.ManageResolutions' | translate}}
{{ noteText.length || 0 }}/1000
\";","import { IAlertRuleRecord } from \"../../_models/alerts.interfaces\";\r\nimport { TemperatureAlertDetailService } from \"./temperature-alert-detail/temperature-alert-detail.service\";\r\nimport { AxleWeightAlertDetailService } from\r\n \"src/app/main/modules/alerts/components/alert-detail/axle-weight-alert-detail/axle-weight-alert-detail.service\";\r\nimport { GeofenceAlertDetailService } from\r\n \"src/app/main/modules/alerts/components/alert-detail/geofence-alert-detail/geofence-alert-detail.service\";\r\nimport { InputAlertDetailService } from\r\n \"src/app/main/modules/alerts/components/alert-detail/input-alert-detail/input-alert-detail.service\";\r\nimport { PowerLossAlertDetailService } from\r\n \"src/app/main/modules/alerts/components/alert-detail/power-loss-alert-detail/power-loss-alert-detail.service\";\r\nimport { TollAlertDetailService } from\r\n \"src/app/main/modules/alerts/components/alert-detail/toll-alert-detail/toll-alert-detail.service\";\r\nimport { TyreRecordAlertDetailService } from\r\n \"src/app/main/modules/alerts/components/alert-detail/tyre-record-alert-detail/tyre-record-detail.service\";\r\nimport { VehicleDiagnosticAlertDetailService } from\r\n \"src/app/main/modules/alerts/components/alert-detail/vehicle-diagnostic-detail/vehicle-diagnostic-detail.service\";\r\nimport { VideoAlertDetailService } from\r\n \"src/app/main/modules/alerts/components/alert-detail/video-alert-detail/video-alert-detail.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { Injectable } from \"@angular/core\";\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class AlertDetailService {\r\n\r\n constructor(\r\n private readonly axleWeightAlertDetailService: AxleWeightAlertDetailService,\r\n private readonly geofenceAlertDetailService: GeofenceAlertDetailService,\r\n private readonly inputAlertDetailService: InputAlertDetailService,\r\n private readonly powerLossAlertDetailService: PowerLossAlertDetailService,\r\n private readonly temperatureAlertDetailService: TemperatureAlertDetailService,\r\n private readonly tollAlertDetailService: TollAlertDetailService,\r\n private readonly translationService: TranslationService,\r\n private readonly tyreRecordAlertDetailService: TyreRecordAlertDetailService,\r\n private readonly vehicleDiagnosticAlertDetailService: VehicleDiagnosticAlertDetailService,\r\n private readonly videoAlertDetailService: VideoAlertDetailService) {\r\n }\r\n\r\n getAlertDetailExport(record: IAlertRuleRecord): Promise {\r\n if (!record || !record.alertMetadata) {\r\n return Promise.resolve(this.translationService.t('Alerts.NoAlarmData'));\r\n }\r\n\r\n if (record.alertMetadata.AxleWeightOutOfBoundsHistoryId) {\r\n return new Promise((res, rej) => {\r\n return this.axleWeightAlertDetailService.getAlertExport(record).then(result => {\r\n res(result);\r\n });\r\n })\r\n }\r\n if (record.alertMetadata.GeofenceId) {\r\n return new Promise((res, rej) => {\r\n return this.geofenceAlertDetailService.getAlertExport(record).then(result => {\r\n res(result);\r\n });\r\n })\r\n }\r\n if (record.alertMetadata.InputRecordHistoryId) {\r\n return new Promise((res, rej) => {\r\n return this.inputAlertDetailService.getAlertExport(record).then(result => {\r\n res(result);\r\n });\r\n })\r\n }\r\n if (record.alertMetadata.PowerLossHistoryId) {\r\n return new Promise((res, rej) => {\r\n return this.powerLossAlertDetailService.getAlertExport(record).then(result => {\r\n res(result);\r\n });\r\n })\r\n }\r\n if (record.alertMetadata.TemperatureRecordId || record.alertMetadata.TemperatureAlarmRecordId) {\r\n return new Promise((res, rej) => {\r\n return this.temperatureAlertDetailService.getAlertExport(record).then(result => {\r\n res(result);\r\n });\r\n })\r\n }\r\n if (record.alertMetadata.TollId) {\r\n return new Promise((res, rej) => {\r\n return this.tollAlertDetailService.getAlertExport(record).then(result => {\r\n res(result);\r\n });\r\n })\r\n }\r\n if (record.alertMetadata.TyreRecordDataId) {\r\n return new Promise((res, rej) => {\r\n return this.tyreRecordAlertDetailService.getAlertExport(record).then(result => {\r\n res(result);\r\n });\r\n })\r\n }\r\n if (record.alertMetadata.VehicleDiagnosticRecordId) {\r\n return new Promise((res, rej) => {\r\n return this.vehicleDiagnosticAlertDetailService.getAlertExport(record).then(result => {\r\n res(result);\r\n });\r\n })\r\n }\r\n if (record.alertMetadata.VideoEntryId) {\r\n return new Promise((res, rej) => {\r\n return this.videoAlertDetailService.getAlertExport(record).then(result => {\r\n res(result);\r\n });\r\n })\r\n }\r\n return Promise.resolve(this.translationService.t('Alerts.NoAlarmData'));\r\n }\r\n}\r\n","module.exports = \" \";","module.exports = \"
\";","import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { ConstantsService } from \"@services/constantsService\";\r\nimport { Observable } from 'rxjs';\r\nimport { tap } from 'rxjs/operators';\r\nimport { SettingsName } from \"./class/SettingsName\";\r\n\r\n@Injectable()\r\nexport class AuthInterceptor implements HttpInterceptor {\r\n constructor(\r\n private readonly constantsService: ConstantsService) { }\r\n\r\n intercept(req: HttpRequest, next: HttpHandler): Observable> {\r\n if (req.headers.get('No-Auth') === 'True') {\r\n return next.handle(req.clone());\r\n }\r\n\r\n if (req.url.indexOf(\"/api/\") === 0 || req.url.indexOf(\"/commserver/\") === 0) {\r\n\r\n req = this.addAPIUrlPrefix(req);\r\n }\r\n\r\n if (this.getAccessToken()) {\r\n const clonedreq = this.addBearerToken(req);\r\n\r\n return next.handle(clonedreq).pipe(\r\n tap(\r\n succ => { },\r\n err => {\r\n if (err.status === 401) {\r\n // this.router.navigateByUrl('/login');\r\n } else if ((err.status = 403)) {\r\n // this.router.navigateByUrl('/forbidden');\r\n // alert(err.localStorage.getItem('userToken'));\r\n }\r\n }\r\n )\r\n );\r\n }\r\n else {\r\n //this.router.navigateByUrl('/login');\r\n }\r\n\r\n return next.handle(req);\r\n }\r\n\r\n // ---\r\n\r\n private addAPIUrlPrefix(request: HttpRequest): HttpRequest {\r\n return request.clone({ url: `${this.constantsService.getApiUrl()}${request.url}` });\r\n }\r\n\r\n private addBearerToken(request: HttpRequest): HttpRequest {\r\n const bearer = this.getAccessToken();\r\n\r\n return request.clone({\r\n headers: request.headers.set('Authorization', `Bearer ${bearer}`)\r\n });\r\n }\r\n\r\n private getAccessToken(): string {\r\n return window.sessionStorage.getItem(SettingsName.AccessToken.toString());\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule, Type } from '@angular/core';\r\nimport { DiagnosticsModule } from './diagnostics/diagnostics.module';\r\nimport { ResourceManagementModule } from './resourceManagement/resourceManagement.module';\r\nimport { LiveMapModule } from './livemap/livemap.module';\r\nimport { TemperatureModule } from \"@temperature/temperature.module\";\r\nimport { ExploreModule } from \"./insights/insights.module\";\r\nimport { NpsModule } from \"./nps/nps.module\";\r\n\nconst privateComponents: Type[] = [\n\n];\r\n\nconst publicComponents: Type[] = [\n\r\n];\r\n\n@NgModule({\r\n imports: [\r\n CommonModule,\n ResourceManagementModule,\n DiagnosticsModule,\n LiveMapModule,\n TemperatureModule,\n ExploreModule,\n NpsModule\r\n ],\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents],\r\n exports: [...publicComponents]\r\n})\r\nexport class ComponentsModule {\r\n constructor() { }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { CUSTOM_ELEMENTS_SCHEMA, NgModule, Type } from '@angular/core';\r\nimport { CoreDirectivesModule } from '@directives/_core/_core.directives.module';\r\nimport { LayoutDirectivesModule } from '@directives/_layout/_layout.directives.module';\r\nimport { MiscDirectivesModule } from '@directives/_misc/_misc.directives.module';\r\nimport { ResourceFiltersDirectivesModule } from '@directives/_resourceFilters/_resourceFilters.directives.module';\r\nimport { TranslationDirectivesModule } from '@directives/_translations/_translations.directives.module';\r\nimport { VeriDirectivesModule } from '@directives/_veri/_veri.directives.module';\r\nimport { UserAccessTesterComponent } from './permissions/user-access-tester/user-access-tester.component';\r\n\r\n\r\nconst privateComponents: Type[] = [\n\r\n];\r\n\r\nconst publicComponents: Type[] = [\n UserAccessTesterComponent\r\n];\r\n\r\n@NgModule({\n providers: [],\r\n imports: [\r\n CommonModule,\n VeriDirectivesModule,\n TranslationDirectivesModule,\n MiscDirectivesModule,\n CoreDirectivesModule,\n LayoutDirectivesModule,\n ResourceFiltersDirectivesModule\r\n ],\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents],\r\n exports: [...publicComponents],\r\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\r\n})\r\nexport class DiagnosticsModule {\r\n}\r\n","module.exports = \" Reset to original
Feature
Account Access
Read Access
Manage Access
{{ accountFeatureDescription.name }}
accountData.Features: {{ accountData.Features }} {{ AccountFeature[accountData.Features] }}
user.CurrentAccountUserMapping.ReadFeatures: {{ user.CurrentAccountUserMapping.ReadFeatures }}
user.CurrentAccountUserMapping.ManageFeatures: {{ user.CurrentAccountUserMapping.ManageFeatures }}
user.CurrentAccountUserMapping.Type: {{ UserType[user.CurrentAccountUserMapping.Type] }}
user.CurrentAccountUserMapping.SpecialUserPermissions: {{ user.CurrentAccountUserMapping.SpecialUserPermissions }}
\";","import { CommonModule } from \"@angular/common\";\r\nimport { NgModule } from \"@angular/core\";\r\nimport { MiscDirectivesModule } from \"@app/directives/_misc/_misc.directives.module\";\r\nimport { PipesModule } from \"@app/_pipes/_pipes.module\";\r\n\r\nimport { VideoRestrictionComponent } from \"./components/videoRestriction.component\";\r\nimport { TemperatureRowComponent } from \"./temperature-row.component\";\r\n\r\nconst privateComponents: any[] = [\r\n\r\n];\r\n\r\nconst publicComponents: any[] = [\r\n VideoRestrictionComponent,\n TemperatureRowComponent\r\n];\r\n\r\n\r\n@NgModule({\r\n imports: [\n CommonModule,\n MiscDirectivesModule,\n PipesModule\n ],\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents,],\r\n exports: [...publicComponents]\r\n})\r\nexport class LiveMapModule {\r\n constructor() {\r\n }\r\n}\r\n","module.exports = \"
-- {{temperatureRecord.Temperature | unitConversion : true : \\\"temperature\\\"}}
\";","import { ScrollingModule } from \"@angular/cdk/scrolling\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { HttpClientModule } from \"@angular/common/http\";\r\nimport { NgModule, Type, NO_ERRORS_SCHEMA } from \"@angular/core\";\r\nimport { BrowserAnimationsModule } from \"@angular/platform-browser/animations\";\r\nimport { VTableModule } from \"@app/directives/_layout/v-table/v-table.module\";\r\nimport { providerCreator } from \"@app/services/_services.module\";\r\nimport { CoreDirectivesModule } from \"@directives/_core/_core.directives.module\";\r\nimport { FormsDirectivesModule } from \"@directives/_forms/_form.directives.module\";\r\nimport { LayoutDirectivesModule } from \"@directives/_layout/_layout.directives.module\";\r\nimport { MiscDirectivesModule } from \"@directives/_misc/_misc.directives.module\";\r\nimport { ResourceFiltersDirectivesModule } from \"@directives/_resourceFilters/_resourceFilters.directives.module\";\r\nimport { VehicleDirectivesModule } from \"@directives/_vehicle/_vehicle.directives.module\";\r\nimport { VeriDirectivesModule } from \"@directives/_veri/_veri.directives.module\";\r\nimport { PipesModule } from \"src/app/_pipes/_pipes.module\";\r\nimport { DashboardServiceV2 } from \"../dashboardV2/dashboard.service\";\r\nimport { GroupsModule } from \"../resourceManagement/groups/groups.module\";\r\nimport { DepotComplianceComponent } from \"./depot-compliance/depot-compliance.component\";\r\nimport { DriverBehaviourComparisonComponent } from \"./driver-behaviour/driver-behaviour-comparison.component\";\r\nimport { DriverBehaviourStackComponent } from \"./driver-behaviour/driver-behaviour-stack/driver-behaviour-stack.component\";\r\nimport { DriverScoreGraphComponent } from \"./driver-behaviour/driver-score-graph/driver-score-graph.component\";\r\nimport { VehicleUtilisationComponent } from \"./vehicleUtilisation/vehicle-utilisation.component\";\r\n\r\nconst privateComponents: Type[] = [\r\n VehicleUtilisationComponent,\r\n DepotComplianceComponent,\r\n DriverBehaviourComparisonComponent,\r\n DriverBehaviourStackComponent,\r\n DriverScoreGraphComponent\r\n];\r\n\r\nconst publicComponents: any[] = [\r\n\r\n];\r\n\r\nconst declarations: Type[] = [\r\n];\r\n\r\nconst providers: any[] = [\r\n providerCreator(DashboardServiceV2, \"dashboardServiceV2\")\r\n];\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n HttpClientModule,\r\n BrowserAnimationsModule,\r\n ScrollingModule,\r\n VeriDirectivesModule,\r\n LayoutDirectivesModule,\r\n PipesModule,\r\n ResourceFiltersDirectivesModule,\r\n MiscDirectivesModule,\r\n VehicleDirectivesModule,\r\n FormsDirectivesModule,\r\n CoreDirectivesModule,\r\n VTableModule,\r\n GroupsModule\r\n ],\r\n providers: providers,\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents, ...declarations],\r\n exports: [...publicComponents, ...declarations],\r\n schemas: [NO_ERRORS_SCHEMA] //needed for highcharts\r\n})\r\nexport class ExploreModule {\r\n constructor() {\r\n }\r\n}\r\n","module.exports = \"
({{ data?.percentage | number : '1.0-1' }}%)
{{'geofenceVisits.noVisits' | translate}}
{{ visit.geofence.Description }}
{{visit.StartUtc | veriDate}}
{{visit.EndUtc | veriDate}}
{{'geofenceVisits.ended' | translate : visit.durationFormatted }}
{{'geofenceVisits.active' | translate : visit.durationFormatted }}
\";","module.exports = \" Add Driver
Remove Add Driver
\";","module.exports = \"{{driver?.title}}

Driving Style

{{subscore.title}} 7%

Other Data

{{metric.title}}
{{metric.value}}
\";","module.exports = \"
{{messageString}}
\";","module.exports = \"
{{\\\"Common.HomeLocation\\\" | translate}} / {{\\\"Common.Depot\\\" | translate}}
{{label.label}}
{{label.subLabel}}
{{displayVehicle.homeGeofence.Description}}
\";","import { OverlayModule } from \"@angular/cdk/overlay\";\r\nimport { ScrollingModule } from '@angular/cdk/scrolling';\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { HttpClientModule } from \"@angular/common/http\";\r\nimport { NgModule, Type } from \"@angular/core\";\r\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\nimport { VTableModule } from \"@app/directives/_layout/v-table/v-table.module\";\r\nimport { CoreDirectivesModule } from \"@directives/_core/_core.directives.module\";\r\nimport { FormsDirectivesModule } from \"@directives/_forms/_form.directives.module\";\r\nimport { LayoutDirectivesModule } from \"@directives/_layout/_layout.directives.module\";\r\nimport { MapDirectivesModule } from \"@directives/_map/_map.directives.module\";\r\nimport { MiscDirectivesModule } from \"@directives/_misc/_misc.directives.module\";\r\nimport { ResourceFiltersDirectivesModule } from \"@directives/_resourceFilters/_resourceFilters.directives.module\";\r\nimport { VehicleDirectivesModule } from \"@directives/_vehicle/_vehicle.directives.module\";\r\nimport { VeriDirectivesModule } from \"@directives/_veri/_veri.directives.module\";\r\nimport { PipesModule } from \"@pipes/_pipes.module\";\r\nimport { NPSDashboardComponent } from \"./nps-dashboard/nps-dashboard.component\";\r\nimport { NpsGaugeHorizontal } from \"./nps-gauge-horizontal/nps-gauge-horizontal.component\";\r\nimport { NPSRaterComponent } from \"./nps-rater.component\";\r\nimport { NPSService } from \"./nps.service\";\r\n\r\nconst privateComponents: Type[] = [\r\n\r\n];\r\n\r\nconst publicComponents: any[] = [\r\n NPSRaterComponent,\r\n NPSDashboardComponent,\r\n NpsGaugeHorizontal\r\n];\r\n\r\nconst declarations: Type[] = [\r\n];\r\n\r\nconst providers: any[] = [\r\n NPSService\r\n];\r\n\r\n@NgModule({\r\n imports: [\r\n OverlayModule,\r\n ReactiveFormsModule,\r\n CommonModule,\r\n ScrollingModule,\r\n FormsModule,\r\n HttpClientModule,\r\n BrowserAnimationsModule,\r\n VeriDirectivesModule,\r\n LayoutDirectivesModule,\r\n PipesModule,\r\n ResourceFiltersDirectivesModule,\r\n MiscDirectivesModule,\r\n VehicleDirectivesModule,\r\n FormsDirectivesModule,\r\n VTableModule,\r\n MapDirectivesModule,\r\n CoreDirectivesModule\r\n ],\r\n providers: providers,\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents, ...declarations],\r\n exports: [...publicComponents, ...declarations]\r\n})\r\nexport class NpsModule {\r\n constructor() {\r\n }\r\n}\r\n","module.exports = \"

{{ \\\"NpsRater.Rate\\\" | translate }}

{{ \\\"NpsRater.HowLikely\\\" | translate }}
{{rating}}
{{ \\\"NpsRater.Disappointing\\\" | translate }}
{{ \\\"NpsRater.Improve\\\" | translate }}
= 9 || selectedRating === undefined\\\">{{ \\\"NpsRater.Reason\\\" | translate }}
{{ saving ? (\\\"Common.Saving\\\" | translate) : (\\\"Common.Submit\\\" | translate) }}

{{ \\\"NpsRater.ThankYou\\\" | translate }}

\";","module.exports = \"
\";","module.exports = \"
{{score.score}}
{{score.promoter.count}} ({{score.promoter.percentage | number: '1.0-0'}})
{{ 'NpsRater.Promoters' | translate }}
{{score.passive.count}} ({{score.passive.percentage | number: '1.0-0'}})
{{ 'NpsRater.Passives' | translate }}
{{score.detractor.count}} ({{score.detractor.percentage | number: '1.0-0'}})
{{ 'NpsRater.Detractors' | translate }}
{{ 'NpsRater.VoteFrequency' | translate }}
{{h.count}}
{{h.score}}

Recent Results

{{ 'NpsRater.ByReseller' | translate }}

{{ 'NpsRater.HappiestCustomers' | translate }}

{{ 'NpsRater.UnhappyCustomers' | translate }}

{{ selectedRating.DateTime | vDate : {dateTime: 'dateTime'} }} {{selectedRating.UserDescription}} {{selectedUserEmail}}

Rating

fiber_manual_record {{selectedRating.Score}} {{selectedRating.scoreLabel}}

Comments

{{ selectedRating.Comments || \\\"None entered\\\" }}

Other Ratings

fiber_manual_record {{data?.Score}} {{data?.scoreLabel}}
\";","import { CommonModule } from \"@angular/common\";\r\nimport { CUSTOM_ELEMENTS_SCHEMA, NgModule } from \"@angular/core\";\r\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\r\nimport { BrowserAnimationsModule } from \"@angular/platform-browser/animations\";\r\nimport { PipesModule } from \"@app/_pipes/_pipes.module\";\r\nimport { CoreDirectivesModule } from \"@app/directives/_core/_core.directives.module\";\r\nimport { FormsDirectivesModule } from \"@app/directives/_forms/_form.directives.module\";\r\nimport { LayoutDirectivesModule } from \"@app/directives/_layout/_layout.directives.module\";\r\nimport { VTableModule } from \"@app/directives/_layout/v-table/v-table.module\";\r\nimport { MiscDirectivesModule } from \"@app/directives/_misc/_misc.directives.module\";\r\nimport { ResourceFiltersDirectivesModule } from \"@app/directives/_resourceFilters/_resourceFilters.directives.module\";\r\nimport { VehicleDirectivesModule } from \"@app/directives/_vehicle/_vehicle.directives.module\";\r\nimport { VeriDirectivesModule } from \"@app/directives/_veri/_veri.directives.module\";\r\nimport { VisualisationsModule } from \"@app/directives/_visualisations/visualisations.module\";\r\nimport { FaultCodeVehicleHistoryComponent } from \"./faultCodes/_components/fault-code-vehicle-history/fault-code-vehicle-history.component\";\r\nimport { FaultCodesComponent } from \"./faultCodes/_components/fault-codes/fault-codes.component\";\r\nimport { SensorDataHistoryComponent } from \"./sensorData/_components/sensor-data-history/sensor-data-history.component\";\r\nimport { SensorDataComponent } from \"./sensorData/_components/sensor-data/sensor-data.component\";\r\nimport { GroupsModule } from \"../resourceManagement/groups/groups.module\";\r\n\r\nconst privateComponents: any[] = [];\r\n\r\nconst publicComponents: any[] = [\r\n FaultCodesComponent,\r\n FaultCodeVehicleHistoryComponent,\r\n SensorDataComponent,\r\n SensorDataHistoryComponent\r\n];\r\n\r\nconst declarations: any[] = [];\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n BrowserAnimationsModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n\r\n PipesModule,\r\n LayoutDirectivesModule,\r\n VeriDirectivesModule,\r\n MiscDirectivesModule,\r\n FormsDirectivesModule,\r\n CoreDirectivesModule,\r\n VisualisationsModule,\r\n ResourceFiltersDirectivesModule,\r\n VTableModule,\r\n VehicleDirectivesModule,\n GroupsModule\r\n ],\r\n\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents, ...declarations],\r\n exports: [...publicComponents, ...declarations],\r\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\r\n})\r\nexport class MaintenanceModule {\r\n constructor() {\r\n }\r\n}\r\n","module.exports = \" \";","module.exports = \" \";","module.exports = \" \";","module.exports = \" \";","import { CommonModule } from \"@angular/common\";\r\nimport { NgModule } from \"@angular/core\";\r\nimport { CoreDirectivesModule } from \"@app/directives/_core/_core.directives.module\";\r\nimport { VTableModule } from \"@app/directives/_layout/v-table/v-table.module\";\r\nimport { LayoutDirectivesModule } from \"@app/directives/_layout/_layout.directives.module\";\r\nimport { MiscDirectivesModule } from \"@app/directives/_misc/_misc.directives.module\";\r\nimport { ResourceFiltersDirectivesModule } from \"@app/directives/_resourceFilters/_resourceFilters.directives.module\";\r\nimport { VeriDirectivesModule } from \"@app/directives/_veri/_veri.directives.module\";\r\nimport { PipesModule } from \"@app/_pipes/_pipes.module\";\r\nimport { TachoComplianceComponent } from \"./tacho-compliance-page/tacho-compliance-page.component\";\r\n\r\nconst privateComponents: any[] = [\r\n];\r\n\r\nconst publicComponents: any[] = [\r\n TachoComplianceComponent\r\n];\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n LayoutDirectivesModule,\r\n VeriDirectivesModule,\r\n PipesModule,\r\n MiscDirectivesModule,\r\n VTableModule,\r\n CoreDirectivesModule,\r\n ResourceFiltersDirectivesModule\r\n ],\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents,],\r\n exports: [...publicComponents]\r\n})\r\nexport class TachoModule {\r\n constructor() {\r\n }\r\n}\r\n","module.exports = \" {{selectedDriver.Driver.Name}}

{{ \\\"TachoCompliancePage.PeriodSummary\\\" | translate }}

{{summary.DurationString}}
{{summary.Label}}

{{tachoDay.date | vDate : 'date'}}

{{summary.DurationString}}
{{summary.ModeString}}
0\\\">
{{i | number:'2.0'}}:00
{{ \\\"TachoCompliancePage.NoActivity\\\" | translate }}
= 3\\\" [tachoMode]=period.Mode> = 8\\\">{{period.DurationString}}
\";","import { CommonModule } from \"@angular/common\";\r\nimport { NgModule, Type } from \"@angular/core\";\r\nimport { LayoutDirectivesModule } from \"@directives/_layout/_layout.directives.module\";\r\nimport { MiscDirectivesModule } from \"@directives/_misc/_misc.directives.module\";\r\nimport { ResourceFiltersDirectivesModule } from \"@directives/_resourceFilters/_resourceFilters.directives.module\";\r\nimport { VehicleDirectivesModule } from \"@directives/_vehicle/_vehicle.directives.module\";\r\nimport { VeriDirectivesModule } from \"@directives/_veri/_veri.directives.module\";\r\nimport { PipesModule } from \"src/app/_pipes/_pipes.module\";\r\nimport { VehiclesPageRouteComponent } from \"./_routes/vehicles/vehicles.component\";\r\n\r\nconst privateComponents: Type[] = [\r\n\r\n];\r\n\r\nconst publicComponents: any[] = [\r\n VehiclesPageRouteComponent\r\n];\r\n\r\nconst declarations: Type[] = [\r\n];\r\n\r\nconst providers: any[] = [\r\n];\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n VeriDirectivesModule,\r\n LayoutDirectivesModule,\r\n PipesModule,\r\n ResourceFiltersDirectivesModule,\r\n MiscDirectivesModule,\r\n VehicleDirectivesModule\r\n ],\r\n providers: providers,\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents, ...declarations],\r\n exports: [...publicComponents, ...declarations]\r\n})\r\nexport class FleetModule {\r\n constructor() {\r\n }\r\n}\r\n","module.exports = \" stuff positions drivers video ting temp ting maintenance ting \";","import { ScrollingModule } from '@angular/cdk/scrolling';\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { HttpClientModule } from \"@angular/common/http\";\r\nimport { NgModule, Type } from \"@angular/core\";\r\nimport { ReactiveFormsModule } from \"@angular/forms\";\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\nimport { CoreDirectivesModule } from \"@directives/_core/_core.directives.module\";\r\nimport { FormsDirectivesModule } from \"@directives/_forms/_form.directives.module\";\r\nimport { LayoutDirectivesModule } from \"@directives/_layout/_layout.directives.module\";\r\nimport { MapDirectivesModule } from \"@directives/_map/_map.directives.module\";\r\nimport { MiscDirectivesModule } from \"@directives/_misc/_misc.directives.module\";\r\nimport { ResourceFiltersDirectivesModule } from \"@directives/_resourceFilters/_resourceFilters.directives.module\";\r\nimport { VehicleDirectivesModule } from \"@directives/_vehicle/_vehicle.directives.module\";\r\nimport { VeriDirectivesModule } from \"@directives/_veri/_veri.directives.module\";\r\nimport { PipesModule } from \"src/app/_pipes/_pipes.module\";\r\nimport { ContactPageComponent } from \"./_routes/contact-page/contact-page.component\";\r\n\r\nconst privateComponents: Type[] = [\r\n\r\n];\r\n\r\nconst publicComponents: any[] = [\r\n ContactPageComponent\r\n];\r\n\r\nconst declarations: Type[] = [\r\n];\r\n\r\nconst providers: any[] = [\r\n];\r\n\r\n@NgModule({\r\n imports: [\r\n ReactiveFormsModule,\r\n CommonModule,\r\n ScrollingModule,\r\n HttpClientModule,\r\n BrowserAnimationsModule,\r\n VeriDirectivesModule,\r\n LayoutDirectivesModule,\r\n PipesModule,\r\n ResourceFiltersDirectivesModule,\r\n MiscDirectivesModule,\r\n VehicleDirectivesModule,\r\n FormsDirectivesModule,\r\n MapDirectivesModule,\r\n CoreDirectivesModule\r\n ],\r\n providers: providers,\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents, ...declarations],\r\n exports: [...publicComponents, ...declarations]\r\n})\r\nexport class HelpModule {\r\n constructor() {\r\n }\r\n}\r\n","module.exports = \"
{{ 'ContactPage.HowCanWeHelp' | translate}}
{{ 'ContactPage.GetInTouch' | translate}}
chat
{{ 'ContactPage.Support' | translate}}
{{ 'ContactPage.GetHelp' | translate}}
{{ 'ContactPage.EmailSupport' | translate}} {{ 'ContactPage.CallSupport' | translate}}
headphones
{{ 'ContactPage.Sales' | translate}}
{{ 'ContactPage.LoveToTalk' | translate}}
{{ 'ContactPage.CallSales' | translate}}
settings
{{ 'ContactPage.APIDocumentation' | translate}}
{{ 'ContactPage.WeHaveAPI' | translate}}
{{ 'ContactPage.SeeAPI' | translate}}
menu_book
{{ 'ContactPage.ReleaseNotes' | translate}}
{{ 'ContactPage.WeRelease' | translate}}
{{ 'ContactPage.ViewReleaseNotes' | translate}}
\";","import { ScrollingModule } from '@angular/cdk/scrolling';\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { HttpClientModule } from \"@angular/common/http\";\r\nimport { NgModule, Type } from \"@angular/core\";\r\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\nimport { VTableModule } from '@app/directives/_layout/v-table/v-table.module';\r\nimport { DeliveryProfileEditComponent } from '@app/main/components/resourceManagement/geofences/geofenceEditor/delivery-profile/delivery-profile-edit.component';\r\nimport { DeliveryProfileViewComponent } from '@app/main/components/resourceManagement/geofences/geofenceEditor/delivery-profile/delivery-profile-view.component';\r\nimport { GroupsModule } from '@app/main/components/resourceManagement/groups/groups.module';\r\nimport { OptimiserService } from \"@components/planning/optimiser.service\";\r\nimport { CoreDirectivesModule } from \"@directives/_core/_core.directives.module\";\r\nimport { FormsDirectivesModule } from \"@directives/_forms/_form.directives.module\";\r\nimport { LayoutDirectivesModule } from \"@directives/_layout/_layout.directives.module\";\r\nimport { MapDirectivesModule } from \"@directives/_map/_map.directives.module\";\r\nimport { MiscDirectivesModule } from \"@directives/_misc/_misc.directives.module\";\r\nimport { ResourceFiltersDirectivesModule } from \"@directives/_resourceFilters/_resourceFilters.directives.module\";\r\nimport { VehicleDirectivesModule } from \"@directives/_vehicle/_vehicle.directives.module\";\r\nimport { VeriDirectivesModule } from \"@directives/_veri/_veri.directives.module\";\r\nimport { providerCreator } from \"@services/_services.module\";\r\nimport { PvaBarChartComponent } from \"@tms/_components/pva-bar-chart/pva-bar-chart.component\";\r\nimport { PvaChartLegend } from \"@tms/_components/pva-bar-chart/pva-chart-legend.component\";\r\nimport { RoutePerformanceBarComponent } from \"@tms/_components/route-performance-bar/route-performance-bar.component\";\r\nimport { ActiveRouteProgressComponent } from \"@tms/_routes/activeRoutes/active-route-progress/active-route-progress.component\";\r\nimport { ActiveRouteVisitComponent } from \"@tms/_routes/activeRoutes/active-route-visit/active-route-visit.component\";\r\nimport { ActiveRoutesComponent } from \"@tms/_routes/activeRoutes/active-routes.component\";\r\nimport { HistoryNotesComponent } from \"@tms/_routes/history/notes/notes.component\";\r\nimport { RoutePerformanceComponent } from \"@tms/_routes/route-performance/route-performance.component\";\r\nimport { ScheduleImportComponent } from \"@tms/_routes/scheduling/_components/schedule-import/schedule-import.component\";\r\nimport { AheadBehindComponent } from \"@tms/_routes/visit-performance/ahead-behind/ahead-behind.component\";\r\nimport { VisitPerformanceComponent } from \"@tms/_routes/visit-performance/visit-performance.component\";\r\nimport { ActiveRoutesService } from \"@tms/_services/active-routes.service\";\r\nimport { PlannedRouteAuditService } from \"@tms/_services/planned-route-audit.service\";\r\nimport { PlannedRouteMapService } from \"@tms/_services/planned-route-map.service\";\r\nimport { PlannedRouteNoteService } from \"@tms/_services/planned-route-note.service\";\r\nimport { PlannedRouteVisitService } from \"@tms/_services/planned-route-visit.service\";\r\nimport { PlannedRouteService } from \"@tms/_services/planned-route.service\";\r\nimport { SchedulingService } from \"@tms/_services/scheduling.service\";\r\nimport { UnplannedStopService } from \"@tms/_services/unplanned-stop.service\";\r\nimport { PipesModule } from 'src/app/_pipes/_pipes.module';\r\nimport { CloseRouteReasonComponent } from './_components/close-route/close-route-reason.component';\r\nimport { TmsHistoryComponent } from './_routes/history/tms-history.component';\r\n\r\n\r\nconst privateComponents: Type[] = [\r\n\r\n];\r\n\r\nconst publicComponents: any[] = [\r\n HistoryNotesComponent,\r\n TmsHistoryComponent,\r\n ActiveRoutesComponent,\r\n ActiveRouteVisitComponent,\r\n ActiveRouteProgressComponent,\r\n\r\n ScheduleImportComponent,\r\n RoutePerformanceComponent,\r\n RoutePerformanceBarComponent,\r\n VisitPerformanceComponent,\r\n AheadBehindComponent,\r\n PvaBarChartComponent,\r\n PvaChartLegend,\r\n\r\n DeliveryProfileViewComponent,\r\n DeliveryProfileEditComponent,\r\n CloseRouteReasonComponent\r\n];\r\n\r\nconst declarations: Type[] = [\r\n];\r\n\r\nconst providers: any[] = [\r\n providerCreator(PlannedRouteService, \"plannedRouteService\"),\r\n providerCreator(PlannedRouteVisitService, \"plannedRouteVisitService\"),\r\n providerCreator(PlannedRouteNoteService, \"plannedRouteNoteService\"),\r\n providerCreator(UnplannedStopService, \"unplannedStopService\"),\r\n providerCreator(SchedulingService, \"schedulingService\"),\r\n providerCreator(PlannedRouteAuditService, \"plannedRouteAuditService\"),\r\n providerCreator(PlannedRouteMapService, \"plannedRouteMapService\"),\r\n providerCreator(OptimiserService, \"optimiserService\"),\r\n ActiveRoutesService\r\n];\r\n\r\n@NgModule({\r\n imports: [\r\n ReactiveFormsModule,\r\n CommonModule,\r\n ScrollingModule,\r\n HttpClientModule,\r\n BrowserAnimationsModule,\r\n VeriDirectivesModule,\r\n LayoutDirectivesModule,\r\n PipesModule,\r\n ResourceFiltersDirectivesModule,\r\n MiscDirectivesModule,\r\n VehicleDirectivesModule,\r\n FormsDirectivesModule,\r\n MapDirectivesModule,\r\n CoreDirectivesModule,\r\n VTableModule,\r\n FormsModule,\r\n GroupsModule\r\n ],\r\n providers: providers,\r\n entryComponents: [...publicComponents, ...privateComponents],\r\n declarations: [...publicComponents, ...privateComponents, ...declarations],\r\n exports: [...publicComponents, ...declarations]\r\n})\r\nexport class TmsModule {\r\n constructor() {\r\n }\r\n}\r\n","module.exports = \"
({{ geofence.Notes?.length || 0 }}/500)
({{ geofence.DeliveryInformation?.length || 0 }}/500)
({{ geofence.AdditionalInformation?.length || 0 }}/500)
0 && !loading\\\" [formTitle]=\\\"'geofenceEditor.metaData' | translate\\\" [subtitle]=\\\"\\\">
{{'geofenceEditor.updatedOn' | translate}} {{ geofence.Updated | veriDate }}
{{'geofenceEditor.createdOn' | translate}} {{ geofence.Created | veriDate }}
\";","module.exports = \"
{{ geofence.Notes }}
{{ geofence.DeliveryInformation }}
{{ geofence.AdditionalInformation }}
\";","module.exports = \"
{{ differenceLabel }}
{{ chartLabel }} ()
\";","module.exports = \"
{{ 'Tms.Planned' | translate }}
{{ 'Tms.Actual' | translate }}
\";","module.exports = \"
{{ segment.percentage | number : '1.0-0' }}%
{{ segment.label }}
\";","module.exports = \" \";","module.exports = \" {{visitIcon}} {{visit.displayLabel}}
{{visit.displayLabel}}
arrow_downward {{visit.PlannedArrivalTime | veriDate : 'time'}} arrow_upward {{visit.PlannedDepartureTime | veriDate : 'time'}}
{{statusString}}
\";","import { animate, keyframes, state, style, transition, trigger } from \"@angular/animations\";\r\n\r\nexport const visibleStateTrigger = trigger('visibleState', [\r\n transition(':enter', [\r\n\r\n animate(300, keyframes([\r\n style({\r\n transform: 'translate(-50px, -50%)',\r\n opacity: 0\r\n }),\r\n style({\r\n transform: 'translate(-20px, -50%)',\r\n opacity: 1\r\n })\r\n ]))\r\n ]),\r\n transition(':leave', [\r\n animate(300, keyframes([\r\n style({\r\n transform: 'translate(-20px, -50%)',\r\n opacity: 1\r\n }),\r\n style({\r\n transform: 'translate(-50px, -50%)',\r\n opacity: 0\r\n })\r\n ]))\r\n ])\r\n])\r\n\r\nexport const showStateTrigger = trigger('showState', [\r\n state('hidden', style({\r\n display: 'none'\r\n })),\r\n state('fadeInLeft', style({\r\n })),\r\n transition('fadeInLeft => hidden', [\r\n animate('300ms ease-out', style({\r\n transform: 'translate(-10px, -50%)',\r\n opacity: 0\r\n }))\r\n ]),\r\n transition('hidden => fadeInLeft', [\r\n style({\r\n transform: 'translate(-10px, -50%)',\r\n opacity: 0,\r\n display: 'block'\r\n }),\r\n animate('300ms ease-out')\r\n ]),\r\n\r\n state('fadeInRight', style({\r\n })),\r\n transition('fadeInRight => hidden', [\r\n animate('300ms ease-out', style({\r\n transform: 'translate(10px, -50%)',\r\n opacity: 0\r\n }))\r\n ]),\r\n transition('hidden => fadeInRight', [\r\n style({\r\n transform: 'translate(10px, -50%)',\r\n opacity: 0,\r\n display: 'block'\r\n }),\r\n animate('300ms ease-out')\r\n ])\r\n])\r\n","module.exports = \" {{ 'Tms.ViewList' | translate }} {{ 'Tms.ViewCalendar' | translate }} \";","module.exports = \"
{{note.author}} @ {{note?.Utc | veriDate}}
{{note?.Note}}
{{noteTextToAdd.value.length}} / {{noteTextToAdd.maxLength}}
{{ 'Notes.AddNoteButton' | translate}}
\";","module.exports = \" \";","module.exports = \" {{importFilename }} {{ 'ScheduleImport.DownloadExample' | translate }}

{{ 'ScheduleImport.UploadFile' | translate }}

{{ 'ScheduleImport.UploadFileDesc' | translate }}

{{ 'ScheduleImport.StartDate' | translate }}

{{ 'ScheduleImport.DateError' | translate }} {{ 'ScheduleImport.DateInfo' | translate }}

{{ 'ScheduleImport.DefaultArea' | translate }}

{{'ScheduleImport.Metres' | translate}}
{{ 'ScheduleImport.DefaultAreaInfo' | translate }}

{{ 'ScheduleImport.SupportedFileTypes' | translate }}

  • {{ 'ScheduleImport.CsvFile' | translate }}
  • {{ 'ScheduleImport.DownloadExampleDesc' | translate }}

{{ 'ScheduleImport.Conditions' | translate }}

  • {{ 'ScheduleImport.Condition1' | translate }}
  • {{ 'ScheduleImport.Condition2' | translate }}
  • {{ 'ScheduleImport.Condition3' | translate }}
  • {{ 'ScheduleImport.Condition4' | translate }}
  • {{ 'ScheduleImport.Condition5' | translate }}

{{ 'ScheduleImport.FileValidation' | translate }}

{{ 'ScheduleImport.FileValidationDesc' | translate }}
{{summary.label}}

{{ 'ScheduleImport.ErrorsWarnings' | translate }}

{{ 'ScheduleImport.UploadedCSV' | translate }}

{{ 'ScheduleImport.ReviewRoutes' | translate }}

{{ 'ScheduleImport.ReviewRoutesDesc' | translate }}
{{summary.label}}

{{ 'ScheduleImport.SavedRoutes' | translate }}

{{ 'ScheduleImport.SavedRoutesDesc' | translate : [saveSuccessCount, saveErrorCount] }}

{{ 'ScheduleImport.PlannedVisits' | translate }}

{{ 'ScheduleImport.Errors' | translate }}

\";","module.exports = \"
{{left}}
{{right}}
\";","module.exports = \" \";","export enum RouteEndCondition {\r\n ArriveAllVisits,\r\n ArriveEndLocation\r\n}\r\n\r\n","export enum RouteStartCondition {\r\n JourneyStart,\r\n DepartFromAnyVisit,\r\n DepartStartLocation\r\n}\r\n\r\n","export enum PlannedRouteClosureReason\r\n{\r\n DriverAllocationIssue = 1,\r\n DriverNotLoggedOn = 2,\r\n JobCancelled = 3,\r\n JobNotExecuted = 4,\r\n NoTracking = 5,\r\n PlanningOrVettingIssue = 6,\r\n SystemIssue = 7,\r\n SystemOutage = 8,\r\n UnroadworthyEquipment = 9,\r\n VehicleAllocationIssue = 10,\r\n VehicleBreakdown = 11,\r\n OtherReason = 12\r\n}\r\n","module.exports = \" {{ 'PlannedRouteClosureReasonEnum.' + option.Name | translate }} \";","module.exports = \" \";","import { Injectable } from '@angular/core';\r\nimport {\r\n HttpRequest,\r\n HttpHandler,\r\n HttpInterceptor,\r\n HttpEvent,\r\n} from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { finalize, shareReplay } from 'rxjs/operators';\r\n\r\n/*\r\nWill intercept any http request and prevent it being made if the same url request is already in progress.\r\nThe currently in progress request will be returned instead.\r\n*/\r\n\r\n@Injectable()\r\nexport class RequestInterceptor implements HttpInterceptor {\r\n private requestsInProgress = new Map>>();\r\n\r\n intercept(\r\n request: HttpRequest,\r\n next: HttpHandler\r\n ): Observable> {\r\n if (request.method !== 'GET') {\r\n return next.handle(request);\r\n }\r\n\r\n const url = request.urlWithParams;\r\n const existingRequest = this.requestsInProgress.get(url);\r\n\r\n if (existingRequest) {\r\n console.warn(`Request to ${url} has been cancelled because it is already in progress.`);\r\n return existingRequest;\r\n }\r\n\r\n const newRequest = next.handle(request).pipe(\r\n shareReplay(1), // Cache the response for future subscribers\r\n finalize(() => {\r\n this.requestsInProgress.delete(url);\r\n })\r\n );\r\n\r\n this.requestsInProgress.set(url, newRequest);\r\n\r\n return newRequest;\r\n }\r\n}\r\n","import { downgradeComponent } from \"@angular/upgrade/static\";\r\nimport * as angular from \"angular\";\r\nimport \"ng-debounce-throttle\";\r\nimport { SplashScreenComponent } from \"./splash-screen/splash-screen.component\";\r\nimport { UnauthorizedViewComponent } from \"./unauthorized-view/unauthorized-view.component\";\r\n//import { VideoCategoriesComponent } from \"./videoCategories/videoCategories.component\";\r\n\r\nimport { CoreModuleName } from \"./_core/_core.directives.module.ajs\";\r\nimport { FormModuleName } from \"./_forms/_form.directives.module.ajs\";\r\nimport \"./_layout/_layout.directives.module.ajs\";\r\nimport \"./_layout/v-table/v-table.directives.module.ajs\";\r\nimport \"./_map/_map.directives.module.ajs\";\r\nimport \"./_misc/_misc.directives.module.ajs\";\r\nimport \"./_mouse/_mouse.directives.module\";\r\nimport \"./_resourceFilters/_resourceFilters.directives.module.ajs\";\r\nimport \"./_translations/_translations.directives.module.ajs\";\r\nimport \"./_vehicle/_vehicle.directives.module.ajs\";\r\n\r\n// We want the veri items first, so that later CSS can override these defaults\r\nimport \"./_veri/_veri.directives.module.ajs\";\r\nimport \"./_visualisations/visualisations.module.ajs\";\r\n\r\n//const allowAttribute = directiveFactory => [\r\n// '$injector',\r\n// ($injector: angular.auto.IInjectorService) =>\r\n// Object.assign($injector.invoke(directiveFactory), { restrict: 'EA' }),\r\n//];\r\n\r\n//const downgradeAttributeComponent = info => allowAttribute(downgradeComponent(info));\r\n\r\nangular\r\n .module(\"app.directives\", [\r\n \"ngDebounceThrottle\",\r\n\r\n CoreModuleName,\r\n FormModuleName,\r\n \"app.map.directives\",\r\n \"app.layout.directives\",\r\n \"app.vtable.directives\",\r\n \"app.resourceFilters.directives\",\r\n \"app.misc.directives\",\r\n \"app.translate.directives\",\r\n \"app.mouse.directives\",\r\n \"app.veri.directives\",\r\n \"app.vehicle.directives\",\r\n \"app.visualisations\"\r\n /*\"app.components.livemap\"*/])\r\n\r\n .directive(\"splashScreen\", downgradeComponent({ component: SplashScreenComponent }))\r\n .directive(\"unauthorizedView\", downgradeComponent({ component: UnauthorizedViewComponent }))\r\n\r\n\r\n\r\n //.directive(\"resourceGroupDisplay\", downgradeComponent({ component: ResourceGroupDisplayComponent }))\r\n\r\n //.component(\"pageFilterOptions\", new PageFilterOptionsComponent())\r\n\r\n\r\n //.component(\"videoCategories\", new VideoCategoriesComponent())\r\n\r\n .directive('bindHtmlCompile',\r\n [\r\n '$compile', function ($compile) {\r\n return {\r\n restrict: 'A',\r\n link: function (scope: angular.IScope, element, attrs) {\r\n scope.$watch(\r\n () => {\r\n return scope.$eval(attrs.bindHtmlCompile);\r\n },\r\n (value) => {\r\n var rscript = /)<[^<]*)*<\\/script>/gi;\r\n var sanitizedValue = (value && value.toString() || \"\").replace(rscript, \"\");\r\n\r\n // In case value is a TrustedValueHolderType, sometimes it\r\n // needs to be explicitly called into a string in order to\r\n // get the HTML string.\r\n //var value = scope.$eval(attrs.bindHtmlCompile);\r\n element.html(sanitizedValue);\r\n\r\n // If scope is provided use it, otherwise use parent scope\r\n var compileScope = scope;\r\n\r\n if (attrs.bindHtmlScope) {\r\n compileScope = scope.$eval(attrs.bindHtmlScope);\r\n }\r\n\r\n $compile(element.contents())(compileScope);\r\n });\r\n }\r\n };\r\n }\r\n ])\r\n \r\n .directive('fastBindAttrOnNotify', ['$parse', function ($parse) {\r\n var DEFAULT_EVENT_NAME = 'fast-bind-notify';\r\n\r\n return {\r\n compile: function compile(element, attributes) {\r\n var expr = $parse(attributes.fastBindAttrOnNotify),\r\n name = attributes.fastBindOnNotifyName || DEFAULT_EVENT_NAME;\r\n\r\n return function link(scope, element, attrs) {\r\n var lastValues = {};\r\n\r\n scope.$on(name, () => {\r\n var values = expr(scope);\r\n\r\n angular.forEach(values, (value, key) => {\r\n\r\n if (value !== lastValues[key]) {\r\n attrs.$set(key as any, value);\r\n }\r\n\r\n lastValues[key] = value;\r\n })\r\n });\r\n };\r\n }\r\n };\r\n }])\r\n .directive('fastBindOnNotify', ['$parse', function ($parse) {\r\n var DEFAULT_EVENT_NAME = 'fast-bind-notify';\r\n\r\n return {\r\n compile: function compile(element, attributes) {\r\n var expr = $parse(attributes.fastBindOnNotify),\r\n name = attributes.fastBindOnNotifyName || DEFAULT_EVENT_NAME;\r\n\r\n return function link(scope, element) {\r\n var lastValue;\r\n scope.$on(name, function () {\r\n var value = expr(scope);\r\n\r\n if (value !== lastValue) {\r\n element.text(value);\r\n }\r\n lastValue = value;\r\n });\r\n };\r\n }\r\n };\r\n }])\r\n .directive('fastBindAttrOnce', ['$parse', function ($parse) {\r\n return {\r\n compile: function compile(element, attributes) {\r\n var expr = $parse(attributes.fastBindAttrOnce);\r\n\r\n return function link(scope, element, attrs) {\r\n var values = expr(scope);\r\n\r\n angular.forEach(values, (value, key) => {\r\n attributes.$set(key as any, value);\r\n });\r\n };\r\n }\r\n };\r\n }])\r\n .directive('fastBindNotifier', ['$parse', function ($parse) {\r\n var Mode = {\r\n SHALLOW: 'shallow',\r\n DEEP: 'deep',\r\n COLLECTION: 'collection'\r\n };\r\n\r\n var DEFAULT_EVENT_NAME = 'fast-bind-notify',\r\n DEFAULT_MODE = Mode.SHALLOW;\r\n\r\n return {\r\n scope: true,\r\n compile: function compile(element, attributes) {\r\n var expr = $parse(attributes.fastBindNotifier),\r\n name = attributes.fastBindNotifierName || DEFAULT_EVENT_NAME,\r\n mode = attributes.fastBindNotifierMode || DEFAULT_MODE;\r\n\r\n return function link(scope, element) {\r\n var handler = function handler(newValue, oldValue, scope) {\r\n scope.$broadcast(name, newValue, oldValue);\r\n };\r\n\r\n switch (mode) {\r\n case Mode.SHALLOW:\r\n case Mode.DEEP:\r\n scope.$watch(expr, handler, mode === Mode.DEEP);\r\n break;\r\n\r\n case Mode.COLLECTION:\r\n scope.$watchCollection(expr, handler);\r\n break;\r\n\r\n default:\r\n throw Error('fast-bind-notifier: Invalid mode \"' + mode + '\"');\r\n }\r\n };\r\n }\r\n };\r\n }])\r\n .directive('fastBindOnce', ['$parse', function ($parse) {\r\n return {\r\n compile: function compile(element, attributes) {\r\n var expr = $parse(attributes.fastBindOnce);\r\n\r\n return function link(scope, element) {\r\n element.text(expr(scope));\r\n };\r\n }\r\n };\r\n }])\r\n //;\r\n\r\n\r\n //.directive('dynamic', function ($compile) {\r\n // return {\r\n // restrict: 'A',\r\n // replace: true,\r\n // link: function (scope, ele, attrs) {\r\n // scope.$watch(attrs.dynamic, (html: string) => {\r\n // ele.html(html);\r\n // $compile(ele.contents())(scope);\r\n // });\r\n // }\r\n // };\r\n //});\r\n\r\n //https://github.com/spongessuck/gm.dragDrop\r\n //angular\r\n //.module('gm.dragDrop', [])\r\n .directive('gmDraggable', ['$window', '$document', gmDraggable])\r\n .directive('gmOnHover', gmOnHover)\r\n .directive('gmOnDrop', gmOnDrop);\r\n\r\nvar dragOb = null;\r\n\r\nfunction apply(scope, attr, event = null) {\r\n scope.$apply(function () {\r\n scope.$eval(attr)(dragOb, event);\r\n });\r\n}\r\n\r\nfunction gmDraggable($window, $document) {\r\n return function (scope, element, attrs) {\r\n\r\n var startX = 0,\r\n startY = 0,\r\n clone = null,\r\n absParent = angular.element('
');\r\n\r\n var cancelWatch = null;\r\n\r\n // Handle will become a regular element, so if anything is returned,\r\n // we need to wrap that in angular.element(...) to bind events to it\r\n var handle = element[0].querySelectorAll('gm-drag-handle, [gm-drag-handle], .gm-drag-handle');\r\n (handle.length ? angular.element(handle) : element).on('mousedown', function (event) {\r\n // Prevent default dragging of selected content\r\n event.preventDefault();\r\n\r\n cancelWatch = scope.$watch(function () {\r\n return element.prop('innerHTML');\r\n }, function (val) {\r\n if (clone)\r\n clone.prop('innerHTML', val);\r\n });\r\n\r\n dragOb = scope.$eval(attrs.gmDraggable);\r\n dragOb.$$gmDropZone = attrs.gmDropZone;\r\n\r\n clone = element.clone();\r\n element.addClass('gm-drag-element').after(clone);\r\n\r\n clone.css({\r\n position: 'relative',\r\n pointerEvents: 'none'\r\n }).addClass('gm-dragging');\r\n\r\n var elBoundingRect = element[0].getBoundingClientRect();\r\n\r\n absParent.css({\r\n position: 'absolute',\r\n zIndex: '2000',\r\n top: elBoundingRect.top + $window.scrollY + 'px',\r\n left: elBoundingRect.left + 'px',\r\n width: elBoundingRect.width + 'px'\r\n });\r\n $document.find('body').append(absParent);\r\n absParent.append(clone);\r\n\r\n startX = event.pageX;\r\n startY = event.pageY;\r\n $document.on('mousemove', mousemove);\r\n $document.on('mouseup', mouseup);\r\n });\r\n\r\n function mousemove(event) {\r\n clone.css({\r\n top: event.pageY - startY + 'px',\r\n left: event.pageX - startX + 'px'\r\n });\r\n }\r\n\r\n function mouseup() {\r\n if (dragOb) {\r\n if (attrs.gmOnInvalidDrop) {\r\n apply(scope, attrs.gmOnInvalidDrop);\r\n }\r\n dragOb = null;\r\n }\r\n\r\n cancelWatch();\r\n\r\n //return;\r\n element.removeClass('gm-drag-element');\r\n\r\n clone.remove();\r\n absParent.remove();\r\n $document.off('mousemove', mousemove);\r\n $document.off('mouseup', mouseup);\r\n }\r\n };\r\n}\r\n\r\nfunction gmOnHover() {\r\n return function (scope, element, attr) {\r\n\r\n element.on('mouseover', function (e) {\r\n if (!dragOb)\r\n return;\r\n\r\n if (dragOb.$$gmDropZone == attr.gmDropZone) {\r\n apply(scope, attr.gmOnHover, e);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction gmOnDrop() {\r\n return function (scope, element, attr) {\r\n element.on('mouseover', function () {\r\n if (!dragOb)\r\n return;\r\n\r\n if (dragOb.$$gmDropZone == attr.gmDropZone) {\r\n element.addClass('gm-dropping');\r\n }\r\n });\r\n\r\n element.on('mouseout', function () {\r\n if (!dragOb)\r\n return;\r\n\r\n element.removeClass('gm-dropping');\r\n });\r\n\r\n element.on('mouseup', function () {\r\n if (!dragOb)\r\n return;\r\n\r\n if (dragOb.$$gmDropZone == attr.gmDropZone) {\r\n apply(scope, attr.gmOnDrop);\r\n dragOb = null;\r\n }\r\n\r\n element.removeClass('gm-dropping');\r\n });\r\n }\r\n}\r\n\r\n\r\n;\r\n","import { downgradeComponent } from \"@angular/upgrade/static\";\r\nimport { VNavBarComponent } from \"@directives/_core/v-nav-bar/v-nav-bar.component\";\r\nimport { VNavItemComponent } from \"@directives/_core/v-nav-bar/v-nav-item/v-nav-item.component\";\r\nimport * as angular from \"angular\";\r\nimport { VButtonComponent } from \"./v-button/v-button.component\";\r\nimport { VButtonDropdownComponent } from \"./v-dropdown/v-button-dropdown/v-button-dropdown.component\";\r\nimport { VDropdownComponent } from \"./v-dropdown/v-dropdown.component\";\r\nimport { VItemDropdownComponent } from \"./v-dropdown/v-item-dropdown/v-item-dropdown.component\";\r\n\r\nexport const CoreModuleName = \"app.core.directives\";\r\n\r\nangular\r\n .module(CoreModuleName, [])\r\n\r\n .directive(\"vDropdown\", downgradeComponent({ component: VDropdownComponent }))\r\n .directive(\"vItemDropdown\", downgradeComponent({ component: VItemDropdownComponent }))\r\n\r\n .directive(\"vButton\", downgradeComponent({ component: VButtonComponent }))\r\n .directive(\"vButtonDropdown\", downgradeComponent({ component: VButtonDropdownComponent }))\r\n .directive(\"vNavBar\", downgradeComponent({ component: VNavBarComponent }))\r\n .directive(\"vNavItem\", downgradeComponent({ component: VNavItemComponent }))\r\n\r\n ;\r\n","import { downgradeComponent } from \"@angular/upgrade/static\";\r\nimport { CheckboxComponent } from \"@directives/_forms/checkbox/checkbox.component\";\r\nimport { CheckboxesComponent } from \"@directives/_forms/checkboxes/checkboxes.component\";\r\nimport { VFlagToggleListItemComponent } from \"@directives/_forms/v-flag-toggle-list-item/v-flag-toggle-list-item.component\";\r\nimport { VFlagToggleComponent } from \"@directives/_forms/v-flag-toggle/v-flag-toggle.component\";\r\nimport { VInputComponent } from \"@directives/_forms/v-input/v-input.component\";\r\nimport { VToggleListItemComponent } from \"@directives/_forms/v-toggle-list-item/v-toggle-list-item.component\";\r\nimport * as angular from \"angular\";\r\nimport { AutocompleteComponent } from \"./autocomplete/autocomplete.component\";\r\nimport { AutoFocus } from \"./autocomplete/autocompleteFocus.directive\";\r\nimport { CompareToDirective } from \"./compareTo.directive\";\r\nimport { FileDragDropDirective } from \"./fileDragDrop.directive\";\r\nimport { FileSelectedDirective } from \"./fileSelected.directive\";\r\nimport { FileUploadComponent } from \"./fileUpload/fileUpload.component\";\r\nimport { FormDetailsComponent } from \"./formDetails/formDetails.component\";\r\nimport { SmsInputComponent } from \"./smsInput/sms-input.component\";\r\nimport { TextareaComponent } from \"./textarea/textarea.component\";\r\nimport { VEnumSelectComponent } from \"./v-enum-select/v-enum-select.component\";\r\nimport { VOrderButtonsComponent } from \"./v-order-buttons/v-order-buttons.component\";\r\nimport { VRadioButtonComponent } from \"./v-radio-button/v-radio-button.component\";\r\nimport { VSelectOptionComponent } from \"./v-select/v-select-option/v-select-option.component\";\r\nimport { VSelectComponent } from \"./v-select/v-select.component\";\r\nimport { VSliderComponent } from \"./v-slider/v-slider.component\";\r\nimport { VToggleComponent } from \"./v-toggle/v-toggle.component\";\r\nimport { ValidatePasswordDirective } from \"./validatePassword.directive\";\r\nimport { ValidationFunctionDirective } from \"./validationFunction.directive\";\r\nimport { GroupNameValidator } from \"./validators/groupNameValidator\";\r\nimport { ReportNameValidator } from \"./validators/reportNameValidator\";\r\nimport { UserEmailDirective } from \"./validators/userEmail\";\r\nimport { VerifyCurrentPasswordDirective } from \"./verifyCurrentPassword\";\r\nimport { RadioButtonBaseComponent } from \"./_radio-buttons/radio-button-base/radio-button-base.component\";\r\nimport { RadioButtonCardsComponent } from \"./_radio-buttons/radio-button-cards/radio-button-cards.component\";\r\nimport { RadioButtonSmallCardsComponent } from \"./_radio-buttons/radio-button-small-cards/radio-button-small-cards.component\";\r\n\r\nexport const FormModuleName = \"app.form.directives\";\r\n\r\nangular\r\n .module(FormModuleName ,[])\r\n .component(\"veriAutocomplete\", new AutocompleteComponent())\r\n .directive(\"fileUpload\", downgradeComponent({ component: FileUploadComponent }))\r\n .directive(\"smsInput\", downgradeComponent({ component: SmsInputComponent }))\r\n .directive(\"formDetails\", downgradeComponent({ component: FormDetailsComponent }))\r\n\r\n .directive(\"vInput\", downgradeComponent({ component: VInputComponent }))\r\n .directive(\"vTextarea\", downgradeComponent({ component: TextareaComponent }))\r\n\r\n .directive(\"fileDragDrop\", FileDragDropDirective.factory())\r\n .directive(\"fileSelected\", FileSelectedDirective.factory())\r\n .directive(\"compareTo\", CompareToDirective.factory())\r\n .directive(\"userEmail\", UserEmailDirective.factory())\r\n\r\n .directive(\"autoFocus\", AutoFocus.factory())\r\n .directive(\"validatePassword\", ValidatePasswordDirective.factory())\r\n .directive(\"verifyCurrentPassword\", VerifyCurrentPasswordDirective.factory())\r\n .directive(\"groupNameValidator\", GroupNameValidator.factory())\r\n .directive(\"reportNameValidator\", ReportNameValidator.factory())\r\n .directive(\"validationFunction\", ValidationFunctionDirective.factory())\r\n\r\n .directive(\"vToggle\", downgradeComponent({ component: VToggleComponent }))\r\n .directive(\"vSelect\", downgradeComponent({ component: VSelectComponent }))\r\n .directive(\"vSelectOption\", downgradeComponent({ component: VSelectOptionComponent }))\r\n .directive(\"vEnumSelect\", downgradeComponent({ component: VEnumSelectComponent }))\r\n\r\n .directive(\"vToggleListItem\", downgradeComponent({ component: VToggleListItemComponent }))\r\n .directive(\"vFlagToggle\", downgradeComponent({ component: VFlagToggleComponent }))\r\n .directive(\"vFlagToggleListItem\", downgradeComponent({ component: VFlagToggleListItemComponent }))\r\n .directive(\"vCheckbox\", downgradeComponent({ component: CheckboxComponent }))\r\n .directive(\"vCheckboxes\", downgradeComponent({ component: CheckboxesComponent }))\r\n\r\n .directive(\"vSlider\", downgradeComponent({ component: VSliderComponent }))\r\n .directive(\"vOrderButtons\", downgradeComponent({ component: VOrderButtonsComponent }))\r\n\r\n .directive(\"vRadioButtonBase\", downgradeComponent({ component: RadioButtonBaseComponent }))\r\n .directive(\"vRadioButtonCards\", downgradeComponent({ component: RadioButtonCardsComponent }))\r\n .directive(\"vRadioButtonSmallCards\", downgradeComponent({ component: RadioButtonSmallCardsComponent }))\r\n .directive(\"vRadioButton\", downgradeComponent({ component: VRadioButtonComponent }))\r\n","import { Component, EventEmitter, Input, OnDestroy, Output } from '@angular/core';\r\nimport { AbstractControl, ControlValueAccessor, ValidationErrors, Validator } from '@angular/forms';\r\nimport { Subscription } from 'rxjs';\r\nimport { CheckboxComponent } from '../checkbox/checkbox.component';\r\n\r\n@Component({\r\n selector: 'v-checkboxes',\r\n templateUrl: './checkboxes.component.html',\r\n styleUrls: ['./checkboxes.component.scss']\r\n})\r\nexport class CheckboxesComponent implements ControlValueAccessor, Validator, OnDestroy {\r\n\r\n @Input() value: boolean = false;\r\n @Input() required: boolean;\r\n @Input() info: string;\r\n\r\n @Output() onChanged = new EventEmitter();\r\n\r\n private cachedChanges: any[];\r\n private checkboxes: CheckboxComponent[] = [];\r\n private subscriptions = new Subscription();\r\n\r\n constructor() { }\r\n\r\n ngOnDestroy(): void {\r\n this.subscriptions?.unsubscribe();\r\n }\r\n\r\n triggerChanges(): void {\r\n this.emitChanges();\r\n }\r\n\r\n registerCheckbox(checkboxComponent: CheckboxComponent): void {\r\n if (this.checkboxes.indexOf(checkboxComponent) > -1) {\r\n return;\r\n }\r\n\r\n this.checkboxes.push(checkboxComponent);\r\n }\r\n\r\n unregisterCheckbox(checkboxComponent: CheckboxComponent): void {\r\n const indexOfCheckbox = this.checkboxes.indexOf(checkboxComponent);\r\n\r\n if (indexOfCheckbox === -1) {\r\n return;\r\n }\r\n\r\n this.checkboxes.splice(indexOfCheckbox, 1);\r\n }\r\n\r\n // ---\r\n\r\n private emitChanges(): void {\r\n const checkedValues: any[] = [];\r\n\r\n this.checkboxes.forEach(checkbox => {\r\n if (!checkbox.checked) {\r\n return;\r\n }\r\n\r\n checkedValues.push(checkbox.value);\r\n });\r\n\r\n if (JSON.stringify(checkedValues) == JSON.stringify(this.cachedChanges)) {\r\n return;\r\n }\r\n\r\n this.cachedChanges = checkedValues;\r\n\r\n this.onChanged.emit(checkedValues);\r\n }\r\n\r\n // --- Validator\r\n\r\n validate(control: AbstractControl): ValidationErrors {\r\n return null;\r\n }\r\n\r\n registerOnValidatorChange?(fn: () => void): void {\r\n\r\n }\r\n\r\n // --- ControlValueAccessor\r\n\r\n writeValue(obj: any): void {\r\n\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n\r\n }\r\n\r\n setDisabledState?(isDisabled: boolean): void {\r\n\r\n }\r\n}\r\n","import { GeofenceType } from \"@enums/GeofenceType\";\r\nimport { UserStatus } from \"@enums/UserType\";\r\nimport { ICombinedPreferences } from \"@interfaces/ICombinedPreferences\";\r\nimport { IDriver } from \"@interfaces/IDriver\";\r\nimport { GeofenceCategory, IGeofence } from \"@interfaces/IGeofences\";\r\nimport { IUser } from \"@interfaces/IUser\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { IGroup } from \"@interfaces/IVehicleGroup\";\r\nimport { IInputType } from \"@interfaces/IInputType\";\r\nimport { DriverService } from \"@services/driver.service\";\r\nimport { GeofenceService } from \"@services/geofence.service\";\r\nimport { GroupService } from \"@services/group.service.ajs\";\r\nimport { IAutocompleteResponse, MapzenService } from \"@services/mapzen.service\";\r\nimport { SessionService } from \"@services/session.service\";\r\nimport { UsersService } from \"@services/users.service\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { InputTypeService } from \"@services/inputType.service\";\r\nimport * as angular from \"angular\";\r\nimport { SettingsName } from \"src/app/class/SettingsName\";\r\nimport \"./autocomplete.scss\";\r\n\r\nexport interface IAutocompleteMatch {\r\n label: string;\r\n icon: string;\r\n source?: string;\r\n location?: google.maps.LatLngLiteral;\r\n\r\n objectId?: number;\r\n object?: T;\r\n}\r\n\r\ninterface IAutocompleteComponentBindings {\r\n includeDrivers: boolean;\r\n includeGeofences: boolean;\r\n includeZones: boolean;\r\n includePlaces: boolean;\r\n includeVehicles: boolean;\r\n includeUsers: boolean;\r\n includeDepots: boolean;\r\n includeInputTypes: boolean;\r\n\r\n includeVehicleLatestPlot: boolean;\r\n\r\n isRequired: boolean;\r\n inputName: string;\r\n\r\n filterByGroupId: number;\r\n disabled: boolean;\r\n eagerLoad: boolean;\r\n\r\n selectedMatch: any;\r\n selectedMatchId: number;\r\n querySource: (args: { $searchText: string }) => angular.IPromise;\r\n querySourceLabel: string;\r\n\r\n label: string;\r\n placeHolderText: string;\r\n customPlaceHolderText: string;\r\n maxMatches: number;\r\n searchOnClick: boolean;\r\n onSelect: (args: { $match: IAutocompleteMatch }) => void;\r\n onSearchTextChanged: (args: { text: string }) => void;\r\n onClear: () => void;\r\n\r\n}\r\n\r\nexport class AutocompleteComponentController implements angular.IComponentController, IAutocompleteComponentBindings {\r\n externallyUpdated = false;\r\n label = \"\";\r\n searchText: string;\r\n\r\n includeDrivers: boolean;\r\n includeGeofences: boolean;\r\n includeZones: boolean;\r\n includePlaces: boolean;\r\n includeVehicles: boolean;\r\n includeGroups: boolean;\r\n includeUsers: boolean;\r\n includeDepots: boolean;\r\n includeInputTypes: boolean;\r\n\r\n includeVehicleLatestPlot: boolean;\r\n\r\n isRequired: boolean = false;\r\n inputName: string;\r\n\r\n filterByGroupId: number;\r\n disabled: boolean;\r\n eagerLoad: boolean;\r\n\r\n loading: boolean;\r\n\r\n searchOnClick: boolean;\r\n\r\n onSelect: (args: { $match: IAutocompleteMatch }) => void;\r\n onSearchTextChanged: (args: { text: string }) => void;\r\n onClear: () => void;\r\n\r\n\r\n placeHolderText = \"\";\r\n customPlaceHolderText = \"\";\r\n maxMatches: number;\r\n\r\n selectedMatch: any;\r\n selectedMatchId: number;\r\n querySource: (args: { $searchText: string }) => angular.IPromise;\r\n querySourceLabel: string;\r\n\r\n matches: IAutocompleteMatch[] = [];\r\n\r\n geofences: IGeofence[];\r\n zones: IGeofence[];\r\n vehicles: IVehicle[];\r\n drivers: IDriver[];\r\n groups: IGroup[];\r\n users: IUser[];\r\n depots: IGroup[];\r\n inputTypes: IInputType[];\r\n\r\n countryCode: string;\r\n\r\n lastSelectedItem: number;\r\n lastSelectedSource: string;\r\n\r\n dataLoadedPromise: angular.IPromise;\r\n\r\n static $inject = [\"$element\", \"$q\", \"$timeout\", \"geofenceService\", \"mapzenService\", \"vehicleService\", \"driverService\", \"groupService\", \"usersService\", \"sessionService\", \"translationService\", \"inputTypeService\"];\r\n\r\n constructor(\r\n private readonly $element: JQLite,\r\n private readonly $q: angular.IQService,\r\n private readonly $timeout: angular.ITimeoutService,\r\n private readonly geofenceService: GeofenceService,\r\n private readonly mapzenService: MapzenService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly driverService: DriverService,\r\n private readonly groupService: GroupService,\r\n private readonly usersService: UsersService,\r\n private readonly sessionService: SessionService,\r\n private readonly translationService: TranslationService,\r\n private readonly inputTypeService: InputTypeService\r\n ) { }\r\n\r\n $onInit() {\r\n this.removeBrowserAutocomplete();\r\n\r\n this.lastSelectedItem = -1;\r\n this.lastSelectedSource = \"\";\r\n\r\n if (!this.customPlaceHolderText?.length) {\r\n this.placeHolderText = this.translationService.t('autocomplete.searchInitial');\r\n }\r\n\r\n if (!this.maxMatches) {\r\n this.maxMatches = 0;\r\n }\r\n\r\n //if ((this.selectedMatchId && this.selectedMatchId > 0) || this.eagerLoad) {\r\n // this.getData();\r\n //}\r\n\r\n this.buildPlaceHolderText();\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject): void {\r\n if (onChangesObj[\"selectedMatchId\"] && onChangesObj[\"selectedMatch\"]) {\r\n console.warn(\"Using both 'selectedMatchId' and 'selectedMatch' bindings at the same time can lead to unexpected behavior\")\r\n }\r\n\r\n const labelChange = onChangesObj[\"label\"];\r\n\r\n if (this.selectedMatchId === null) {\r\n this.clear();\r\n\r\n return;\r\n }\r\n\r\n if (labelChange) {\r\n if (!labelChange.isFirstChange() || (labelChange.currentValue && labelChange.currentValue.length > 0)) {\r\n this.searchText = labelChange.currentValue;\r\n this.label = labelChange.currentValue;\r\n this.externallyUpdated = true;\r\n }\r\n }\r\n\r\n if (onChangesObj[\"selectedMatchId\"] && this.selectedMatchId) {\r\n this.getData().then(() => {\r\n this.setSelectedMatchById(onChangesObj[\"selectedMatchId\"].currentValue);\r\n });\r\n }\r\n\r\n if (this.querySource) {\r\n return;\r\n }\r\n\r\n if (onChangesObj[\"filterByGroupId\"] && this.dataLoadedPromise) {\r\n this.getData(true);\r\n }\r\n }\r\n\r\n onSearchTextChange(): void {\r\n if (this.onSearchTextChanged) {\r\n this.onSearchTextChanged({ text: this.searchText });\r\n }\r\n\r\n if (!this.searchText?.length && this.onClear) {\r\n this.clear();\r\n }\r\n }\r\n\r\n onSelectedItemChange(match: IAutocompleteMatch) {\r\n if (match) {\r\n this.selectedMatchId = match.objectId;\r\n }\r\n if (this.onSelect && !this.externallyUpdated && this.uniqueCallback(match)) {\r\n this.onSelect({ $match: match });\r\n }\r\n\r\n this.externallyUpdated = false;\r\n }\r\n\r\n querySearch(searchText: string): angular.IPromise {\r\n if (typeof searchText === \"undefined\" || searchText === null) {\r\n searchText = \"\";\r\n }\r\n\r\n this.matches = [];\r\n\r\n const lowercaseSearchText = searchText.toLowerCase();\r\n\r\n const dataUpdatePromise = this.getData();\r\n const mapzenAutocompletePromise = this.includePlaces ? this.mapzenService.autocomplete(searchText, this.countryCode) : this.$q.when({ results: [] });\r\n const querySourcePromise = this.querySource ? this.querySource({ $searchText: searchText }) : this.$q.when([]);\r\n\r\n return this.$q\r\n .all([dataUpdatePromise, mapzenAutocompletePromise, querySourcePromise])\r\n .then(([dataResults, placeResults, querySourceResults]) => {\r\n\r\n const driverMatches = this.findDriverMatches(lowercaseSearchText);\r\n const geofenceMatches = this.findGeofenceMatches(lowercaseSearchText);\r\n const zoneMatches = this.findZoneMatches(lowercaseSearchText);\r\n const vehicleMatches = this.findVehicleMatches(lowercaseSearchText);\r\n const groupMatches = this.findGroupMatches(lowercaseSearchText);\r\n const userMatches = this.findUserMatches(lowercaseSearchText);\r\n const depotMatches = this.findDepotMatches(lowercaseSearchText);\r\n const inputTypeMatches = this.findInputTypeMatches(lowercaseSearchText);\r\n const placeMatches = this.findMapzenPlaceMatches(lowercaseSearchText, placeResults);\r\n const querySourceMatches = this.findQuerySourceMatches(lowercaseSearchText, querySourceResults);\r\n\r\n this.populateMatches([\r\n driverMatches,\r\n geofenceMatches,\r\n zoneMatches,\r\n vehicleMatches,\r\n groupMatches,\r\n userMatches,\r\n depotMatches,\r\n inputTypeMatches,\r\n placeMatches,\r\n querySourceMatches]);\r\n\r\n return this.matches.sort((a: IAutocompleteMatch, b: IAutocompleteMatch) => {\r\n return a.label.localeCompare(b.label);\r\n });\r\n });\r\n }\r\n\r\n private removeBrowserAutocomplete(): void {\r\n this.$timeout(() => {\r\n const inputElement = this.$element.find(\"input\")[0];\r\n\r\n if (!inputElement) {\r\n return;\r\n }\r\n\r\n inputElement.setAttribute(\"name\", `notDefaultBrowserAutoComplete-${Date.now()}`);\r\n }, 10);\r\n }\r\n\r\n private clear(): void {\r\n this.searchText = null;\r\n this.selectedMatch = null;\r\n this.selectedMatchId = null;\r\n this.externallyUpdated = false;\r\n\r\n if (this.onClear) {\r\n this.onClear();\r\n }\r\n }\r\n\r\n private uniqueCallback(match: IAutocompleteMatch): boolean {\r\n if (!match) {\r\n this.lastSelectedItem = -1;\r\n this.lastSelectedSource = \"\";\r\n return true;\r\n }\r\n\r\n const isUnique = this.lastSelectedItem !== match.objectId || this.lastSelectedSource !== match.source;\r\n\r\n this.lastSelectedItem = match.objectId;\r\n this.lastSelectedSource = match.source;\r\n\r\n return isUnique;\r\n }\r\n\r\n private buildPlaceHolderText() {\r\n\r\n if (!this.customPlaceHolderText || this.customPlaceHolderText.length === 0) {\r\n\r\n this.placeHolderText = this.translationService.t('autocomplete.search');\r\n const whatsIncluded = this.getWhatsIncluded();\r\n\r\n // To build the appropriate text e.g. \r\n // - 'Search geofences'\r\n // - 'Search places, geofences or vehicles'\r\n for (let i = 0; i < whatsIncluded.length; i++) {\r\n if (i === 0) {\r\n this.placeHolderText += ` ${whatsIncluded[i]}`;\r\n }\r\n else {\r\n if (whatsIncluded.length - (i + 1) === 0) {\r\n this.placeHolderText += ` or ${whatsIncluded[i]}`;\r\n }\r\n else {\r\n this.placeHolderText += `, ${whatsIncluded[i]}`;\r\n }\r\n }\r\n }\r\n }\r\n else {\r\n this.placeHolderText = this.customPlaceHolderText;\r\n }\r\n\r\n }\r\n\r\n private getWhatsIncluded(includeNumbers = true): string[] {\r\n\r\n const whatsIncluded: string[] = [];\r\n\r\n includeNumbers = false;\r\n\r\n if (this.includePlaces) {\r\n whatsIncluded.push(this.translationService.t('autocomplete.places'));\r\n }\r\n\r\n if (this.includeDrivers) {\r\n let label = this.translationService.t('autocomplete.drivers');\r\n\r\n if (includeNumbers && this.drivers) {\r\n label += ` (${this.drivers.length})`;\r\n }\r\n\r\n whatsIncluded.push(label);\r\n }\r\n\r\n if (this.includeGeofences) {\r\n let label = this.translationService.t('autocomplete.geofences');\r\n\r\n if (includeNumbers && this.geofences) {\r\n label += ` (${this.geofences.length})`;\r\n }\r\n\r\n whatsIncluded.push(label);\r\n }\r\n\r\n if (this.includeZones) {\r\n let label = this.translationService.t('autocomplete.zones');\r\n\r\n if (includeNumbers && this.zones) {\r\n label += ` (${this.zones.length})`;\r\n }\r\n\r\n whatsIncluded.push(label);\r\n }\r\n\r\n if (this.includeVehicles) {\r\n let label = this.translationService.t('autocomplete.vehicles');\r\n\r\n if (includeNumbers && this.vehicles) {\r\n label += ` (${this.vehicles.length})`;\r\n }\r\n\r\n whatsIncluded.push(label);\r\n }\r\n\r\n if (this.includeGroups) {\r\n let label = this.translationService.t('autocomplete.groups');\r\n if (includeNumbers && this.groups) {\r\n label += ` (${this.groups.length})`;\r\n }\r\n\r\n whatsIncluded.push(label);\r\n }\r\n\r\n if (this.includeUsers) {\r\n let label = this.translationService.t('autocomplete.users');\r\n\r\n if (includeNumbers && this.users) {\r\n label += ` (${this.users.length})`;\r\n }\r\n\r\n whatsIncluded.push(label);\r\n }\r\n\r\n if (this.includeDepots) {\r\n let label = this.translationService.t('autocomplete.depots');\r\n\r\n if (includeNumbers && this.depots) {\r\n label += ` (${this.depots.length})`;\r\n }\r\n\r\n whatsIncluded.push(label);\r\n }\r\n\r\n if (this.includeInputTypes) {\r\n let label = this.translationService.t('autocomplete.InputTypes');\r\n if (includeNumbers && this.groups) {\r\n label += ` (${this.groups.length})`;\r\n }\r\n\r\n whatsIncluded.push(label);\r\n }\r\n\r\n if (this.querySource && this.querySourceLabel) {\r\n whatsIncluded.push(`${this.querySourceLabel}`);\r\n }\r\n\r\n if (whatsIncluded.length > 1 && includeNumbers) {\r\n return this.getWhatsIncluded(false);\r\n }\r\n\r\n return whatsIncluded;\r\n }\r\n\r\n private populateMatches(matches: IAutocompleteMatch[][]) {\r\n\r\n while (this.matches.length < this.maxMatches || this.maxMatches === 0) {\r\n let numAdded = 0;\r\n for (let i = 0; i < matches.length; i++) {\r\n if (this.addMatch(matches[i])) {\r\n numAdded++;\r\n }\r\n }\r\n\r\n if (numAdded === 0) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n private addMatch(matchSource: IAutocompleteMatch[]): boolean {\r\n if (matchSource.length > 0 && (this.matches.length < this.maxMatches || this.maxMatches === 0) && matchSource[0].label) {\r\n this.matches.push(matchSource[0]);\r\n matchSource.splice(0, 1);\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private findDriverMatches(lowercaseSearchText: string): IAutocompleteMatch[] {\r\n const driverMatches: IAutocompleteMatch[] = [];\r\n\r\n if (!this.includeDrivers) {\r\n return driverMatches;\r\n }\r\n\r\n if (this.drivers) {\r\n for (let i = 0; i < this.drivers.length; i++) {\r\n const driver = this.drivers[i];\r\n\r\n if (driver.Name.length > 0 && this.matchSearchText(driver.Name, lowercaseSearchText)) {\r\n driverMatches.push(this.createDriverMatch(driver));\r\n }\r\n }\r\n }\r\n\r\n return driverMatches;\r\n }\r\n\r\n private findGeofenceMatches(lowercaseSearchText: string): IAutocompleteMatch[] {\r\n const geofenceMatches: IAutocompleteMatch[] = [];\r\n\r\n if (!this.includeGeofences) {\r\n return geofenceMatches;\r\n }\r\n\r\n if (this.geofences) {\r\n for (let i = 0; i < this.geofences.length; i++) {\r\n const geofence = this.geofences[i];\r\n\r\n if (geofence.Description && this.matchSearchText(geofence.Description, lowercaseSearchText)) {\r\n if (geofence.GeofenceType === GeofenceType.Polygon && geofence.Points?.length > 0) {\r\n this.geofenceService.setPolygonGeofenceVisualCenter(geofence);\r\n }\r\n\r\n geofenceMatches.push(this.createGeofenceMatch(geofence));\r\n }\r\n };\r\n }\r\n\r\n return geofenceMatches;\r\n }\r\n\r\n private findZoneMatches(lowercaseSearchText: string): IAutocompleteMatch[] {\r\n const zoneMatches: IAutocompleteMatch[] = [];\r\n\r\n if (!this.includeZones) {\r\n return zoneMatches;\r\n }\r\n\r\n if (this.zones) {\r\n for (let i = 0; i < this.zones.length; i++) {\r\n const zone = this.zones[i];\r\n\r\n if (zone.Description && this.matchSearchText(zone.Description, lowercaseSearchText)) {\r\n if (zone.GeofenceType === GeofenceType.Polygon && zone.Points?.length > 0) {\r\n this.geofenceService.setPolygonGeofenceVisualCenter(zone);\r\n }\r\n\r\n zoneMatches.push(this.createZoneMatch(zone));\r\n }\r\n };\r\n }\r\n\r\n return zoneMatches;\r\n }\r\n\r\n private findVehicleMatches(lowercaseSearchText: string): IAutocompleteMatch[] {\r\n\r\n const vehicleMatches: IAutocompleteMatch[] = [];\r\n\r\n if (!this.includeVehicles) {\r\n return vehicleMatches;\r\n }\r\n\r\n if (this.vehicles) {\r\n for (let i = 0; i < this.vehicles.length; i++) {\r\n const vehicle = this.vehicles[i];\r\n\r\n if (/*vehicle.Plot && */this.matchSearchText(vehicle.Reg, lowercaseSearchText)) {\r\n\r\n vehicleMatches.push(this.createVehicleMatch(vehicle));\r\n }\r\n }\r\n }\r\n\r\n return vehicleMatches;\r\n }\r\n\r\n private findGroupMatches(lowercaseSearchText: string): IAutocompleteMatch[] {\r\n const matches: IAutocompleteMatch[] = [];\r\n\r\n if (!this.includeGroups) {\r\n return matches;\r\n }\r\n\r\n if (this.groups) {\r\n for (let i = 0; i < this.groups.length; i++) {\r\n const group = this.groups[i];\r\n\r\n if (group && this.matchSearchText(group.Name, lowercaseSearchText)) {\r\n\r\n matches.push(this.createGroupMatch(group));\r\n }\r\n }\r\n }\r\n\r\n return matches;\r\n }\r\n\r\n private findUserMatches(lowercaseSearchText: string): IAutocompleteMatch[] {\r\n const matches: IAutocompleteMatch[] = [];\r\n\r\n if (!this.includeUsers) {\r\n return matches;\r\n }\r\n\r\n if (this.users) {\r\n for (let i = 0; i < this.users.length; i++) {\r\n const user = this.users[i];\r\n\r\n if (user && user.CurrentAccountUserMapping.Name && this.matchSearchText(user.CurrentAccountUserMapping.Name, lowercaseSearchText)) {\r\n\r\n matches.push(this.createUserMatch(user));\r\n }\r\n }\r\n }\r\n\r\n return matches;\r\n }\r\n\r\n private findDepotMatches(lowercaseSearchText: string): IAutocompleteMatch[] {\r\n const matches: IAutocompleteMatch[] = [];\r\n\r\n if (!this.includeDepots) {\r\n return matches;\r\n }\r\n\r\n if (this.depots) {\r\n for (let i = 0; i < this.depots.length; i++) {\r\n const depot = this.depots[i];\r\n\r\n if (depot && this.matchSearchText(depot.Name, lowercaseSearchText)) {\r\n\r\n matches.push(this.createDepotMatch(depot));\r\n }\r\n }\r\n }\r\n\r\n return matches;\r\n }\r\n\r\n private findInputTypeMatches(lowercaseSearchText: string): IAutocompleteMatch[] {\r\n const matches: IAutocompleteMatch[] = [];\r\n\r\n if (!this.includeInputTypes) {\r\n return matches;\r\n }\r\n\r\n if (this.inputTypes) {\r\n for (let i = 0; i < this.inputTypes.length; i++) {\r\n const inputType = this.inputTypes[i];\r\n\r\n if (inputType && this.matchSearchText(inputType.Name, lowercaseSearchText)) {\r\n\r\n matches.push(this.createInputTypeMatch(inputType));\r\n }\r\n }\r\n }\r\n\r\n return matches;\r\n }\r\n\r\n private findMapzenPlaceMatches(lowercaseSearchText: string, mapzenAutocompleteResponse: IAutocompleteResponse): IAutocompleteMatch[] {\r\n\r\n if (!mapzenAutocompleteResponse) {\r\n console.warn(\"No autocomplete results\");\r\n return [];\r\n }\r\n\r\n var transformedResults: IAutocompleteMatch[] = [];\r\n\r\n mapzenAutocompleteResponse.results.forEach(result => {\r\n transformedResults.push({\r\n label: result.formatted,\r\n object: result.geometry,\r\n location: { lat: result.geometry.lat, lng: result.geometry.lng },\r\n icon: \"location_on\",\r\n source: \"Place\"\r\n });\r\n });\r\n\r\n return transformedResults;\r\n }\r\n\r\n private findQuerySourceMatches(lowercaseSearchText: string, matches: IAutocompleteMatch[]): IAutocompleteMatch[] {\r\n const transformedResults: IAutocompleteMatch[] = [];\r\n\r\n if (matches) {\r\n matches.forEach(match => {\r\n if (this.matchSearchText(match.label, lowercaseSearchText)) {\r\n transformedResults.push(match);\r\n }\r\n });\r\n }\r\n\r\n return transformedResults;\r\n }\r\n\r\n private matchSearchText(inputString: string, searchText: string) {\r\n if (!inputString || !searchText) {\r\n return true;\r\n }\r\n\r\n return inputString.toLocaleLowerCase().indexOf(searchText.toLocaleLowerCase()) >= 0;\r\n }\r\n\r\n private findGooglePlaceMatches(lowercaseSearchText: string, placeResults: google.maps.places.PlaceResult[]): IAutocompleteMatch[] {\r\n const placeMatches: IAutocompleteMatch[] = [];\r\n\r\n if (!this.includePlaces) {\r\n return placeMatches;\r\n }\r\n\r\n // Place i.e. business results\r\n for (let i = 0; i < placeResults.length; i++) {\r\n const result = placeResults[i];\r\n\r\n let matchLabel = `${result.formatted_address}`;\r\n\r\n if (result.types.indexOf(\"establishment\") >= 0 || result.types.indexOf(\"point_of_interest\") >= 0) {\r\n matchLabel = `${result.name} - ${result.formatted_address}`;\r\n }\r\n\r\n placeMatches.push({\r\n location: { lat: result.geometry.location.lat(), lng: result.geometry.location.lng() },\r\n label: matchLabel,\r\n icon: \"location_on\",\r\n source: \"Place\"\r\n });\r\n }\r\n\r\n return placeMatches;\r\n }\r\n\r\n private createDriverMatch(driver: IDriver): IAutocompleteMatch {\r\n return {\r\n label: driver.DisplayName,\r\n objectId: driver.Id,\r\n icon: \"person\",\r\n source: \"Driver\",\r\n object: driver\r\n };\r\n }\r\n\r\n private createGeofenceMatch(geofence: IGeofence): IAutocompleteMatch {\r\n return {\r\n label: geofence.Description,\r\n objectId: geofence.Id,\r\n object: geofence,\r\n location: { lat: geofence.Latitude, lng: geofence.Longitude },\r\n icon: \"filter_tilt_shift\",\r\n source: \"Geofence\"\r\n };\r\n }\r\n\r\n private createZoneMatch(zone: IGeofence): IAutocompleteMatch {\r\n return {\r\n label: zone.Description,\r\n objectId: zone.Id,\r\n object: zone,\r\n location: { lat: zone.Latitude, lng: zone.Longitude },\r\n icon: \"filter_tilt_shift\",\r\n source: \"Zone\"\r\n };\r\n }\r\n\r\n private createVehicleMatch(vehicle: IVehicle): IAutocompleteMatch {\r\n return {\r\n label: vehicle.ShortReg,\r\n icon: \"directions_car\",\r\n objectId: vehicle.Id,\r\n object: vehicle,\r\n location: vehicle.Plot ? { lat: vehicle.Plot.Latitude, lng: vehicle.Plot.Longitude } : null,\r\n source: \"Vehicle\"\r\n };\r\n }\r\n\r\n private createGroupMatch(group: IGroup): IAutocompleteMatch {\r\n return {\r\n label: group.Name,\r\n icon: \"group\",\r\n objectId: group.Id,\r\n object: group,\r\n source: \"Group\"\r\n };\r\n }\r\n\r\n private createUserMatch(user: IUser): IAutocompleteMatch {\r\n return {\r\n label: user.CurrentAccountUserMapping.Name,\r\n icon: \"account_box\",\r\n objectId: user.Id,\r\n object: user,\r\n source: \"User\"\r\n };\r\n }\r\n\r\n private createDepotMatch(depot: IGroup): IAutocompleteMatch {\r\n return {\r\n label: depot.Name,\r\n icon: \"home\",\r\n objectId: depot.Id,\r\n object: depot,\r\n source: \"Depot\"\r\n };\r\n }\r\n\r\n\r\n private createInputTypeMatch(inputType: IInputType): IAutocompleteMatch {\r\n return {\r\n label: inputType.Name,\r\n icon: \"sensors\",\r\n objectId: inputType.Id,\r\n object: inputType,\r\n source: \"Input Type\"\r\n };\r\n }\r\n\r\n private setSelectedMatchById(matchId?: any): void {\r\n this.selectedMatch = null;\r\n\r\n if (matchId && !this.selectedMatchId) {\r\n this.selectedMatchId = matchId;\r\n }\r\n\r\n if (!this.selectedMatchId) {\r\n return;\r\n }\r\n\r\n if (this.includeGeofences) {\r\n this.geofences.forEach(geofence => {\r\n if (geofence.Id === this.selectedMatchId) {\r\n this.selectedMatch = this.createGeofenceMatch(geofence);\r\n }\r\n });\r\n }\r\n\r\n if (this.includeZones) {\r\n this.zones.forEach(zone => {\r\n if (zone.Id === this.selectedMatchId) {\r\n this.selectedMatch = this.createZoneMatch(zone);\r\n }\r\n });\r\n }\r\n\r\n if (this.includeGroups) {\r\n this.groups.forEach(group => {\r\n if (group.Id === this.selectedMatchId) {\r\n this.selectedMatch = this.createGroupMatch(group);\r\n }\r\n });\r\n }\r\n\r\n if (this.includeDepots) {\r\n this.depots.forEach(depot => {\r\n if (depot.Id === this.selectedMatchId) {\r\n this.selectedMatch = this.createDepotMatch(depot);\r\n }\r\n });\r\n }\r\n\r\n if (this.includeUsers) {\r\n this.users.forEach(user => {\r\n if (user.Id === this.selectedMatchId) {\r\n this.selectedMatch = this.createUserMatch(user);\r\n }\r\n });\r\n }\r\n\r\n if (this.includeDrivers) {\r\n this.drivers.forEach(driver => {\r\n if (driver.Id === this.selectedMatchId) {\r\n this.selectedMatch = this.createDriverMatch(driver);\r\n }\r\n });\r\n }\r\n\r\n if (this.includeVehicles) {\r\n this.vehicles.forEach(vehicle => {\r\n if (vehicle.Id === this.selectedMatchId) {\r\n this.selectedMatch = this.createVehicleMatch(vehicle);\r\n }\r\n });\r\n }\r\n\r\n if (this.includeInputTypes) {\r\n this.inputTypes.forEach(inputType => {\r\n if (inputType.Id === this.selectedMatchId) {\r\n this.selectedMatch = this.createInputTypeMatch(inputType);\r\n }\r\n });\r\n }\r\n }\r\n\r\n private getData(forceRefresh = false): angular.IPromise {\r\n // For now only update once, to mimick original behaviour\r\n if (this.dataLoadedPromise && !forceRefresh) {\r\n this.filterResourcesByGroup();\r\n this.buildPlaceHolderText();\r\n\r\n return this.dataLoadedPromise;\r\n }\r\n\r\n this.loading = true;\r\n\r\n const promiseArray: angular.IPromise[] = [];\r\n\r\n if (this.includeGeofences || this.includeZones) {\r\n const p = this.geofenceService.getGeofences().then(geofences => {\r\n this.geofences = geofences.filter(geofence => geofence.Category === GeofenceCategory.Standard);\r\n this.zones = geofences.filter(geofence => geofence.Category === GeofenceCategory.Zone);\r\n });\r\n\r\n promiseArray.push(p);\r\n }\r\n\r\n if (this.includeVehicles) {\r\n const p = this.vehicleService.getVehicles({ includeLatestPlots: this.includeVehicleLatestPlot, dontCopy: true, includePeripheralMappings: true }).then(vehicles => {\r\n vehicles.forEach(vehicle => {\r\n if (vehicle.vorRecord) {\r\n vehicle.ShortReg = `[VOR] ${vehicle.ShortReg}`;\r\n }\r\n });\r\n\r\n this.vehicles = vehicles;\r\n });\r\n\r\n promiseArray.push(p);\r\n }\r\n\r\n if (this.includeDrivers) {\r\n const p = this.driverService.getDrivers().then(drivers => {\r\n this.drivers = drivers;\r\n });\r\n\r\n promiseArray.push(p);\r\n }\r\n\r\n if (this.includeGroups || (this.filterByGroupId && this.filterByGroupId > 0)) {\r\n const p = this.groupService.getGroups().then(groups => {\r\n this.groups = groups;\r\n });\r\n\r\n promiseArray.push(p);\r\n }\r\n\r\n if (this.includeUsers) {\r\n const p = this.usersService.getUsers({\r\n includeMappings: false,\r\n includeAdmins: true\r\n }).then(users => {\r\n this.users = users.filter(user => user.CurrentAccountUserMapping?.Status === UserStatus.Active);\r\n });\r\n\r\n promiseArray.push(p);\r\n }\r\n\r\n if (this.includeDepots) {\r\n const p = this.groupService.getGroups().then(groups => {\r\n\r\n this.depots = groups.filter(group => group.IsDepot);\r\n });\r\n\r\n promiseArray.push(p);\r\n }\r\n\r\n if (this.includeInputTypes) {\r\n const p = this.inputTypeService.getInputTypes().then(inputTypes => {\r\n\r\n this.inputTypes = inputTypes;\r\n });\r\n\r\n promiseArray.push(p);\r\n }\r\n\r\n if (this.includePlaces) {\r\n var userOptions = this.sessionService.getItem(SettingsName.UserOptions);\r\n this.countryCode = userOptions.CountryCode.Value;\r\n }\r\n\r\n this.dataLoadedPromise = this.$q.all(promiseArray);\r\n\r\n this.dataLoadedPromise\r\n .then(() => {\r\n this.filterResourcesByGroup();\r\n this.buildPlaceHolderText();\r\n this.setSelectedMatchById();\r\n })\r\n .finally(() => {\r\n this.loading = false;\r\n\r\n // Disable auto complete\r\n var input = this.$element.find(\"input\");\r\n input.attr(\"autocomplete\", \"no\");\r\n })\r\n\r\n return this.dataLoadedPromise;\r\n }\r\n\r\n private filterResourcesByGroup() {\r\n if (!this.filterByGroupId || this.filterByGroupId < 0 || !this.groups) {\r\n return;\r\n }\r\n\r\n const groupDrivers: IDriver[] = [];\r\n const groupVehicles: IVehicle[] = [];\r\n const groupGeofences: IGeofence[] = [];\r\n const groupUsers: IUser[] = [];\r\n\r\n this.groups.forEach(group => {\r\n if (group.Id !== this.filterByGroupId) {\r\n return;\r\n }\r\n\r\n if (this.drivers) {\r\n group.DriverIds.forEach(driverId => {\r\n this.drivers.forEach(driver => {\r\n if (driver.Id === driverId) {\r\n groupDrivers.push(driver);\r\n }\r\n });\r\n });\r\n }\r\n\r\n if (this.vehicles) {\r\n group.VehicleIds.forEach(vehicleId => {\r\n this.vehicles.forEach(vehicle => {\r\n if (vehicle.Id === vehicleId) {\r\n groupVehicles.push(vehicle);\r\n }\r\n });\r\n });\r\n }\r\n\r\n if (this.geofences) {\r\n group.GeofenceIds.forEach(geofenceId => {\r\n this.geofences.forEach(geofence => {\r\n if (geofence.Id === geofenceId) {\r\n groupGeofences.push(geofence);\r\n }\r\n });\r\n });\r\n }\r\n\r\n if (this.users) {\r\n group.UserIds.forEach(userId => {\r\n this.users.forEach(user => {\r\n if (user.Id === userId) {\r\n groupUsers.push(user);\r\n }\r\n });\r\n });\r\n }\r\n });\r\n\r\n this.drivers = groupDrivers;\r\n this.vehicles = groupVehicles;\r\n this.geofences = groupGeofences;\r\n this.users = groupUsers;\r\n }\r\n}\r\n\r\nexport class AutocompleteComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n template: string;\r\n controller: any;\r\n require: { [index: string]: string; };\r\n\r\n constructor() {\r\n this.bindings = {\r\n label: \"<\",\r\n\r\n includeDrivers: \"<\",\r\n includeGeofences: \"<\",\r\n includeZones: \"<\",\r\n includeVehicles: \"<\",\r\n includePlaces: \"<\",\r\n includeGroups: \"<\",\r\n includeUsers: \"<\",\r\n includeDepots: \"<\",\r\n includeInputTypes: \"<\",\r\n\r\n includeVehicleLatestPlot: \" {{match.label}} {{ 'autocomplete.noMatchesFound' | translate : $ctrl.searchText }} {{match.label}} {{ 'autocomplete.noMatchesFound' | translate : $ctrl.searchText}} \";","\r\nimport * as angular from \"angular\";\r\n\r\nexport class AutoFocus implements angular.IDirective {\r\n\r\n restrict = \"A\";\r\n\r\n link: (scope: angular.IScope, element: ng.IAugmentedJQuery, attrs: ng.IAttributes) => void;\r\n\r\n constructor(private readonly $timeout: angular.ITimeoutService) {\r\n\r\n AutoFocus.prototype.link = ($scope: angular.IScope, $element: angular.IAugmentedJQuery, $attrs: ng.IAttributes) => {\r\n\r\n $scope.$watch($attrs[\"autoFocus\"], (focus: boolean) => {\r\n // If we did not pass an argument then assume auto-focus=true\r\n if ($attrs[\"autoFocus\"].length == 0) {\r\n focus = true;\r\n }\r\n\r\n this.setFocus(focus, $element);\r\n });\r\n }\r\n }\r\n\r\n setFocus(focus: boolean, $element: JQuery) {\r\n if (!focus) {\r\n return;\r\n }\r\n\r\n this.$timeout(() => {\r\n var elementToFocus = $element;\r\n\r\n if (!elementToFocus.is(\"input\")) {\r\n elementToFocus = $element.find(\"input\").first();\r\n }\r\n\r\n if (!elementToFocus || !elementToFocus.get(0)) {\r\n return;\r\n }\r\n\r\n (elementToFocus.get(0) as any).focus();\r\n }, 100);\r\n }\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n const directive = ($timeout: angular.ITimeoutService) => new AutoFocus($timeout);\r\n\r\n directive.$inject = [\"$timeout\"];\r\n\r\n return directive;\r\n }\r\n}\r\n","\r\nimport * as angular from \"angular\";\r\n\r\ninterface ICompareToDirectiveScope extends angular.IScope {\r\n otherModelValue: any;\r\n}\r\n\r\nexport class CompareToDirective implements angular.IDirective {\r\n\r\n restrict = \"A\";\r\n require = \"ngModel\";\r\n scope = {\r\n otherModelValue: \"=compareTo\"\r\n };\r\n\r\n link: (scope: ICompareToDirectiveScope, element: ng.IAugmentedJQuery, attrs: ng.IAttributes, ngModel) => void;\r\n\r\n constructor() {\r\n\r\n CompareToDirective.prototype.link = ($scope: ICompareToDirectiveScope, $element: angular.IAugmentedJQuery, $attrs: ng.IAttributes, ngModel: angular.INgModelController) => {\r\n\r\n if (!ngModel) {\r\n return;\r\n }\r\n\r\n ngModel.$validators[\"compareTo\"] = (modelValue) => {\r\n return modelValue === $scope.otherModelValue;\r\n };\r\n\r\n $scope.$watch(\"otherModelValue\", () => {\r\n ngModel.$validate();\r\n });\r\n\r\n $attrs.$observe('ngModel', () => {\r\n ngModel.$validate();\r\n });\r\n }\r\n }\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n const directive = () => new CompareToDirective();\r\n\r\n directive.$inject = [];\r\n\r\n return directive;\r\n }\r\n}\r\n","\r\nimport * as angular from \"angular\";\r\nimport { FileReaderService } from \"@services/fileReader.service\";\r\n\r\nexport class FileDragDropDirective implements angular.IDirective {\r\n\r\n restrict = \"A\";\r\n scope = false;\r\n\r\n link: (scope: angular.IScope, element: ng.IAugmentedJQuery, attrs: ng.IAttributes, ngModel) => void;\r\n\r\n constructor(private fileReaderService: FileReaderService) {\r\n\r\n FileDragDropDirective.prototype.link = ($scope: angular.IScope, $element: angular.IAugmentedJQuery, $attrs: angular.IAttributes) => {\r\n\r\n $element.bind(\"dragover\", (event) => { return this.processDragOverOrEnter(event.originalEvent as any); });\r\n $element.bind(\"dragenter\", (event) => { return this.processDragOverOrEnter(event.originalEvent as any); });\r\n $element.bind(\"drop\", (event) => { return this.processDragDrop(event.originalEvent as any, $scope, $attrs); });\r\n\r\n $scope.$on(\"$destroy\", () => {\r\n $element.unbind(\"dragover\");\r\n $element.unbind(\"dragenter\");\r\n $element.unbind(\"drop\");\r\n });\r\n }\r\n }\r\n\r\n private processDragDrop(event: DragEvent, $scope: angular.IScope, $attrs: angular.IAttributes) {\r\n if (!event) {\r\n return false;\r\n }\r\n\r\n event.preventDefault();\r\n\r\n //$scope.$apply(() => {\r\n // $scope[\"fileDragDrop\"] = event.dataTransfer.files[0];\r\n //});\r\n\r\n $scope.$eval($attrs.fileDragDrop, { file: event.dataTransfer.files[0] });\r\n\r\n return false;\r\n }\r\n\r\n private processDragOverOrEnter(event: DragEvent) {\r\n if (event != null) {\r\n event.preventDefault();\r\n event.dataTransfer.effectAllowed = \"copy\";\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private isTypeValid(type: string, validMimeTypes: string) {\r\n if (!validMimeTypes || validMimeTypes.indexOf(type) >= 0) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private isValidSize(size: number, maxFileSize: number) {\r\n return (size / 1024) / 1024 < maxFileSize;\r\n }\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n const directive = (fileReaderService: FileReaderService) => new FileDragDropDirective(fileReaderService);\r\n\r\n directive.$inject = [\"fileReaderService\"];\r\n\r\n return directive;\r\n }\r\n}\r\n","\r\n// NOT SURE THIS NEEDED ANYMORE IN ANGULAR 11 - DK\r\nimport * as angular from \"angular\";\r\n\r\nexport class FileSelectedDirective implements angular.IDirective {\r\n\r\n restrict = \"A\";\r\n scope = false;\r\n\r\n link: ($scope: angular.IScope, $element: ng.IAugmentedJQuery, $attrs: ng.IAttributes, ngModel) => void;\r\n\r\n constructor() {\r\n\r\n FileSelectedDirective.prototype.link = ($scope: angular.IScope, $element: angular.IAugmentedJQuery, $attrs: ng.IAttributes) => {\r\n\r\n $element.bind(\"change\", (event) => {\r\n var file = ((event.srcElement || event.target) as any).files[0];\r\n $scope.$eval($attrs.fileSelected, { file: file });\r\n });\r\n\r\n $scope.$on(\"$destroy\", () => {\r\n $element.unbind(\"change\");\r\n });\r\n }\r\n }\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n const directive = () => new FileSelectedDirective();\r\n\r\n directive.$inject = [];\r\n\r\n return directive;\r\n }\r\n}\r\n","\r\nimport * as angular from \"angular\";\r\n\r\nexport class ValidatePasswordDirective implements angular.IDirective {\r\n\r\n restrict = \"A\";\r\n require = \"ngModel\";\r\n\r\n link: (scope: angular.IScope, element: ng.IAugmentedJQuery, attrs: ng.IAttributes, ngModel) => void;\r\n\r\n constructor() {\r\n\r\n ValidatePasswordDirective.prototype.link = ($scope: angular.IScope, $element: angular.IAugmentedJQuery, $attrs: ng.IAttributes, ngModel: angular.INgModelController) => {\r\n ngModel.$validators[\"validatePasswordLength\"] = (modelValue: string) => {\r\n if (!modelValue) return true;\r\n\r\n return modelValue.length >= 8;\r\n };\r\n\r\n ngModel.$validators[\"validatePasswordLowercase\"] = (modelValue: string) => {\r\n if (!modelValue) return true;\r\n\r\n return modelValue.toUpperCase() !== modelValue;\r\n };\r\n\r\n ngModel.$validators[\"validatePasswordUppercase\"] = (modelValue: string) => {\r\n if (!modelValue) return true;\r\n\r\n return modelValue.toLowerCase() !== modelValue;\r\n };\r\n\r\n ngModel.$validators[\"validatePasswordNumber\"] = (modelValue: string) => {\r\n if (!modelValue) return true;\r\n\r\n return modelValue.match(/\\d+/g) != null;\r\n };\r\n\r\n ngModel.$validators[\"validatePasswordSpecial\"] = (modelValue: string) => {\r\n if (!modelValue) return true;\r\n\r\n return modelValue.replace(/[0-9a-zA-Z]/gi, \"\").length > 0;\r\n };\r\n }\r\n }\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n const directive = () => new ValidatePasswordDirective();\r\n\r\n directive.$inject = [];\r\n\r\n return directive;\r\n }\r\n}\r\n","\r\nimport * as angular from \"angular\";\r\n\r\ninterface IValidationFunctionDirectiveScope extends angular.IScope {\r\n function: any;\r\n}\r\n\r\nexport class ValidationFunctionDirective implements angular.IDirective {\r\n\r\n restrict = \"A\";\r\n require = \"ngModel\";\r\n scope = {\r\n function: \"&validationFunction\"\r\n };\r\n\r\n link: (scope: IValidationFunctionDirectiveScope, element: ng.IAugmentedJQuery, attrs: ng.IAttributes, ngModel) => void;\r\n\r\n constructor() {\r\n\r\n ValidationFunctionDirective.prototype.link = ($scope: IValidationFunctionDirectiveScope, $element: angular.IAugmentedJQuery, $attrs: ng.IAttributes, ngModel: angular.INgModelController) => {\r\n\r\n if (!ngModel) {\r\n return;\r\n }\r\n\r\n ngModel.$validators.validationFunction = (modelValue, viewValue) => {\r\n const $value = modelValue || viewValue;\r\n\r\n return $scope.function({ $value });\r\n };\r\n }\r\n }\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n const directive = () => new ValidationFunctionDirective();\r\n\r\n directive.$inject = [];\r\n\r\n return directive;\r\n }\r\n}\r\n","\r\nimport * as angular from \"angular\";\r\nimport { GroupService } from \"@services/group.service.ajs\";\r\n\r\n\r\nexport interface IUserEmailScope extends angular.IScope {\r\n groupNameValidator: number;\r\n}\r\n\r\nexport class GroupNameValidator implements angular.IDirective {\r\n\r\n restrict = 'A';\r\n require = 'ngModel';\r\n scope = { groupNameValidator: \"<\" }\r\n\r\n static $inject = ['$q', '$window', 'groupService'];\r\n\r\n constructor(\r\n private $q: angular.IQService,\r\n private $window: angular.IWindowService,\r\n private groupService: GroupService) {\r\n }\r\n\r\n link(scope: IUserEmailScope, element: angular.IAugmentedJQuery, attrs: angular.IAttributes, ngModel: angular.INgModelController) {\r\n ngModel.$asyncValidators[\"groupName\"] = modelValue => {\r\n return this.groupService.groupNameExists(modelValue, scope.groupNameValidator).then(result => {\r\n if (result) {\r\n return this.$q.reject(\"Group name is already in use.\");\r\n }\r\n return this.$q.resolve();\r\n });\r\n };\r\n }\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n const directive = ($q: angular.IQService, $window: angular.IWindowService, groupService: GroupService) => new GroupNameValidator($q, $window, groupService);\r\n directive.$inject = ['$q', '$window', 'groupService'];\r\n return directive;\r\n }\r\n\r\n}\r\n","import * as angular from \"angular\";\r\nimport { DynamicReportService } from \"../../../main/components/reports/_services/dynamicReports.service\";\r\nimport { IReportDefinition } from \"../../../main/components/reports/models/IReportDefinition\";\r\n\r\nexport interface IReportNameValidatorScope extends angular.IScope {\r\n reportNameValidator: number;\r\n reports: IReportDefinition[];\r\n}\r\n\r\nexport class ReportNameValidator implements angular.IDirective {\r\n\r\n restrict = 'A';\r\n require = 'ngModel';\r\n scope = { reportNameValidator: \"<\", reports: \"<\" }\r\n\r\n static $inject = ['$q', '$window', 'dynamicReportService'];\r\n\r\n constructor(\r\n private $q: angular.IQService,\r\n private $window: angular.IWindowService,\r\n private reportService: DynamicReportService) {\r\n }\r\n\r\n link(scope: IReportNameValidatorScope, element: angular.IAugmentedJQuery, attrs: angular.IAttributes, ngModel: angular.INgModelController) {\r\n ngModel.$asyncValidators[\"reportName\"] = modelValue => {\r\n if (scope.reports) {\r\n var foundMatch = false;\r\n\r\n scope.reports.forEach(report => {\r\n if (report.Id === scope.reportNameValidator) {\r\n return;\r\n }\r\n if (report.Title === modelValue) {\r\n foundMatch = true;\r\n }\r\n });\r\n\r\n if (foundMatch) {\r\n return this.$q.reject(\"Report name is already in use.\");\r\n }\r\n }\r\n\r\n return this.reportService.reportNameExists(modelValue, scope.reportNameValidator).then(result => {\r\n if (result) {\r\n return this.$q.reject(\"Report name is already in use.\");\r\n }\r\n return this.$q.resolve();\r\n });\r\n };\r\n }\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n const directive = ($q: angular.IQService, $window: angular.IWindowService, reportService: DynamicReportService) => new ReportNameValidator($q, $window, reportService);\r\n directive.$inject = ['$q', '$window', 'dynamicReportService'];\r\n return directive;\r\n }\r\n}\r\n","\r\nimport * as angular from \"angular\";\r\nimport { FoundationUserService } from \"@foundation/_services/user.service.ajs\";\r\nimport { UsersService } from \"@services/users.service\";\r\n\r\nexport interface IUserEmailScope extends angular.IScope {\r\n userEmail: IUserEmailChange;\r\n}\r\n\r\ninterface IUserEmailChange {\r\n originalUserEmail: string;\r\n customerId: number;\r\n}\r\n\r\nexport class UserEmailDirective implements angular.IDirective {\r\n\r\n restrict = 'A';\r\n require = 'ngModel';\r\n scope = { userEmail: \" {\r\n if (!formValue) {\r\n return this.$q.resolve();\r\n }\r\n\r\n if (scope.userEmail.originalUserEmail?.toLowerCase() == formValue.toLowerCase()) {\r\n return this.$q.resolve();\r\n }\r\n return this.usersService.emailBelongsToAccount(formValue, scope.userEmail.customerId).then(result => {\r\n if (result) {\r\n return this.$q.reject(\"Email address is already in use.\");\r\n }\r\n\r\n return this.$q.resolve();\r\n });\r\n };\r\n }\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n const directive = ($q: angular.IQService, $window: angular.IWindowService, usersService: UsersService, foundationUserService: FoundationUserService) => new UserEmailDirective($q, $window, usersService, foundationUserService);\r\n directive.$inject = ['$q', '$window', 'usersService', 'foundationUserService'];\r\n return directive;\r\n }\r\n\r\n}\r\n","\r\nimport * as angular from \"angular\";\r\nimport { UsersService } from \"@services/users.service\";\r\n\r\nexport interface IUserPasswordScope extends angular.IScope {\r\n verifyCurrentPassword: string;\r\n\r\n}\r\n\r\nexport class VerifyCurrentPasswordDirective implements angular.IDirective {\r\n\r\n restrict = 'A';\r\n require = 'ngModel';\r\n scope = { verifyCurrentPassword: \"<\" }\r\n\r\n static $inject = ['$q', '$window', 'usersService'];\r\n\r\n constructor(\r\n private $q: angular.IQService,\r\n private $window: angular.IWindowService,\r\n private usersService: UsersService) {\r\n }\r\n\r\n link(scope: IUserPasswordScope, element: angular.IAugmentedJQuery, attrs: angular.IAttributes, ngModel: angular.INgModelController) {\r\n\r\n ngModel.$asyncValidators[\"verifyCurrentPassword\"] = modelValue => {\r\n return this.usersService.verifyCurrentPassword(modelValue).then(result => {\r\n if (result) {\r\n return this.$q.resolve();\r\n }\r\n\r\n return this.$q.reject();\r\n });\r\n\r\n };\r\n }\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n const directive = ($q: angular.IQService, $window: angular.IWindowService, usersService: UsersService) => new VerifyCurrentPasswordDirective($q, $window, usersService);\r\n directive.$inject = ['$q', '$window', 'usersService'];\r\n return directive;\r\n }\r\n\r\n}\r\n","import { downgradeComponent } from \"@angular/upgrade/static\";\r\nimport { RouteBreadcrumbsComponent } from \"@directives/_layout/_page-design/route-breadcrumbs/route-breadcrumbs.component\";\r\nimport * as angular from \"angular\";\r\nimport { EmptyStateComponent } from \"./empty-state/empty-state.component\";\r\nimport { ResourceGroupDisplayComponent } from \"./resourceGroupDisplay/resourceGroupDisplay.component\";\r\nimport { RevealingColumnsComponent } from \"./revealingColumns/revealingColumns.component\";\r\nimport { TimelineComponent } from \"./timeline/timeline.component\";\r\nimport { TimelineEntryComponent } from \"./timeline/timelineEntry.component\";\r\nimport { VTabComponent } from \"./v-tabs/v-tab.component\";\r\nimport { VTabsComponent } from \"./v-tabs/v-tabs.component\";\r\nimport { VeriPanelComponent } from \"./veri-panel/veri-panel.component\";\r\nimport { DetailPageComponent } from \"./_page-design/detail-page/detail-page.component\";\r\nimport { PageActionsComponent } from \"./_page-design/page-actions/page-actions.component\";\r\nimport { PageTitlePillComponent } from \"./_page-design/page-title-pill/page-title-pill.component\";\r\nimport { PageTitleComponent } from \"./_page-design/page-title/page-title.component\";\r\nimport { DefaultLayoutComponent } from \"./_page-design/_layouts/default-layout/default-layout.component\";\r\nimport { HorizontalLayoutComponent } from \"./_page-design/_layouts/horizontal-layout/horizontal-layout.component\";\r\nimport { VerticalLayoutComponent } from \"./_page-design/_layouts/vertical-layout/vertical-layout.component\";\r\nimport { VerticalMapLayoutComponent } from \"./_page-design/_layouts/vertical-map-layout/vertical-map-layout.component\";\r\n\r\nangular\r\n .module(\"app.layout.directives\", [])\r\n\r\n .directive(\"revealingColumns\", downgradeComponent({ component: RevealingColumnsComponent }))\r\n .directive(\"resourceGroupDisplay\", downgradeComponent({ component: ResourceGroupDisplayComponent }))\r\n .directive(\"emptyState\", downgradeComponent({ component: EmptyStateComponent }))\r\n\r\n .component(\"timeline\", new TimelineComponent())\r\n .component(\"timelineEntry\", new TimelineEntryComponent())\r\n\r\n .directive(\"veriPanel\", downgradeComponent({ component: VeriPanelComponent }))\r\n\r\n // page layouts\r\n .directive(\"defaultLayout\", downgradeComponent({ component: DefaultLayoutComponent }))\r\n .directive(\"detailPage\", downgradeComponent({ component: DetailPageComponent }))\r\n .directive(\"verticalMapLayout\", downgradeComponent({ component: VerticalMapLayoutComponent }))\r\n .directive(\"horizontalLayout\", downgradeComponent({ component: HorizontalLayoutComponent }))\r\n .directive(\"verticalLayout\", downgradeComponent({ component: VerticalLayoutComponent }))\r\n .directive(\"routeBreadcrumbs\", downgradeComponent({ component: RouteBreadcrumbsComponent }))\r\n\r\n .directive(\"pageActions\", downgradeComponent({ component: PageActionsComponent }))\r\n .directive(\"pageTitle\", downgradeComponent({ component: PageTitleComponent }))\r\n .directive(\"pageTitlePill\", downgradeComponent({ component: PageTitlePillComponent }))\r\n\r\n .directive(\"vTab\", downgradeComponent({ component: VTabComponent }))\r\n .directive(\"vTabs\", downgradeComponent({ component: VTabsComponent }))\r\n ;\r\n","\r\nimport * as angular from \"angular\";\r\nimport * as moment from \"moment\";\r\nimport \"./timeline.scss\";\r\n\r\n/* Usage\r\n *\r\n\r\n\r\n \r\n * */\r\n\r\ninterface IComponentController {\r\n entries: ITimelineEntry[];\r\n}\r\n\r\nexport interface ITimelineEntry {\r\n current?: boolean;\r\n start: moment.Moment;\r\n end: moment.Moment;\r\n data: any;\r\n}\r\n\r\nclass ComponentController implements angular.IComponentController, IComponentController {\r\n\r\n loading: boolean;\r\n\r\n entries: ITimelineEntry[] = [];\r\n\r\n static $inject = [\"$element\", \"$transclude\"];\r\n\r\n constructor(\r\n private readonly $element: angular.IAugmentedJQuery,\r\n private readonly $transclude: angular.ITranscludeFunction) {\r\n }\r\n\r\n $onInit() {\r\n this.$transclude((transEl, transScope: any) => {\r\n\r\n this.$element.empty();\r\n this.$element.append(transEl);\r\n });\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject): void {\r\n }\r\n}\r\n\r\nexport class TimelineComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n transclude: boolean;\r\n\r\n constructor() {\r\n this.bindings = {\r\n entries: \"<\",\r\n };\r\n\r\n this.transclude = true;\r\n\r\n this.controller = ComponentController;\r\n this.template = require(\"./timeline.html\");\r\n }\r\n}\r\n","module.exports = \" \";","\r\nimport * as angular from \"angular\";\r\nimport { ITimelineEntry } from \"./timeline.component\";\r\nimport \"./timelineEntry.scss\";\r\n\r\ninterface IComponentController {\r\n entry: ITimelineEntry;\r\n}\r\n\r\nclass ComponentController implements angular.IComponentController, IComponentController {\r\n\r\n loading: boolean;\r\n\r\n entry: ITimelineEntry;\r\n\r\n static $inject = [\"$element\", \"$transclude\"];\r\n\r\n constructor(\r\n private readonly $element: angular.IAugmentedJQuery,\r\n private readonly $transclude: angular.ITranscludeFunction) {\r\n }\r\n\r\n $onInit() {\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject): void {\r\n }\r\n}\r\n\r\nexport class TimelineEntryComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n transclude: boolean;\r\n\r\n constructor() {\r\n this.bindings = {\r\n entry: \"<\",\r\n };\r\n\r\n this.transclude = true;\r\n\r\n this.controller = ComponentController;\r\n this.template = require(\"./timelineEntry.html\");\r\n }\r\n}\r\n","module.exports = \"
{{$ctrl.entry.end | veriDate : 'date'}} Current Ended: {{$ctrl.entry.end | veriDate : 'time'}} {{$ctrl.entry.start | veriDate : 'date'}} Started: {{$ctrl.entry.start | veriDate : 'time'}} \";","import { downgradeComponent, downgradeInjectable } from \"@angular/upgrade/static\";\r\nimport { VTableService } from \"@app/directives/_layout/v-table/_services/v-table.service\";\r\nimport * as angular from \"angular\";\r\nimport { CheckboxCell } from \"./_components/cells/checkbox-cell/checkbox-cell.component\";\r\nimport { EnumCellComponent } from \"./_components/cells/enum-cell/v-enum-cell.component\";\r\nimport { VTableHeader } from \"./_components/cells/header/v-table-header.component\";\r\nimport { PercentageBarCellComponent } from \"./_components/cells/percentage-bar/percentage-bar-cell.component\";\r\nimport { RagCellComponent } from \"./_components/cells/rag-cell/rag-cell.component\";\r\nimport { StackedCell } from \"./_components/cells/stacked-cell/stacked-cell.component\";\r\nimport { DateCell } from \"./_components/cells/stacked-date/date-cell.component\";\r\nimport { StatusCell } from \"./_components/cells/status-cell/status-cell.component\";\r\nimport { VTableCell } from \"./_components/cells/v-table-cell.component\";\r\nimport { VTableActionsComponent } from \"./_components/v-table-actions/v-table-actions.component\";\r\nimport { VTableLayoutContainer } from \"./_components/v-table-layout-container/v-table-layout-container.component\";\r\nimport { VTableComponent } from \"./_components/v-table.component\";\r\nimport { TableSummaryBox } from \"./_components/visualisations/table-summary-box/table-summary-box.component\";\r\n\r\nangular\r\n .module(\"app.vtable.directives\", [])\r\n .directive(\"vTableLayoutContainer\", downgradeComponent({ component: VTableLayoutContainer }))\r\n .directive(\"vTable\", downgradeComponent({ component: VTableComponent }))\r\n .directive(\"vTableHeader\", downgradeComponent({ component: VTableHeader }))\r\n .directive(\"vTableCell\", downgradeComponent({ component: VTableCell }))\r\n .directive(\"stackedCell\", downgradeComponent({ component: StackedCell }))\r\n .directive(\"dateCell\", downgradeComponent({ component: DateCell }))\r\n .directive(\"checkboxCell\", downgradeComponent({ component: CheckboxCell }))\r\n .directive(\"statusCell\", downgradeComponent({ component: StatusCell }))\r\n .directive(\"enumCell\", downgradeComponent({ component: EnumCellComponent }))\r\n .directive(\"vTableActions\", downgradeComponent({ component: VTableActionsComponent }))\r\n .directive(\"tableSummaryBox\", downgradeComponent({ component: TableSummaryBox }))\r\n .directive(\"ragCell\", downgradeComponent({ component: RagCellComponent }))\r\n .directive(\"percentageBarCell\", downgradeComponent({ component: PercentageBarCellComponent }))\r\n .service(\"vTableService\", downgradeInjectable(VTableService));\r\n\r\n","import { downgradeComponent } from \"@angular/upgrade/static\";\r\nimport { UIGmapMarkerComponent } from \"@directives/_map/angularGoogleMaps/uiGmapMarker.component\";\r\nimport { UIGmapMarkersComponent } from \"@directives/_map/angularGoogleMaps/uiGmapMarkers.component\";\r\nimport { UIGmapPolygonComponent } from \"@directives/_map/angularGoogleMaps/uiGmapPolygon.component\";\r\nimport { UIGmapPolylineComponent } from \"@directives/_map/angularGoogleMaps/uiGmapPolyline.component\";\r\nimport { UIGmapPolylinesComponent } from \"@directives/_map/angularGoogleMaps/uiGmapPolylines.component\";\r\nimport { GeoAreasComponent } from \"@directives/_map/geofences/geoarea.directive\";\r\nimport { VeriMapHeatMapComponent } from \"@directives/_map/veriMap/veriMapHeatMap/veriMapHeatMap.component\";\r\nimport { VeriMapJourneyComponent } from \"@directives/_map/veriMap/veriMapJourneys/veriMapJourneys.component\";\r\nimport { VeriMapLocationComponent } from \"@directives/_map/veriMap/veriMapLocation/veriMapLocation.component\";\r\nimport { VeriMapVideoEventComponent } from \"@directives/_map/veriMap/veriMapVideoEvent/veriMapVideoEvent.component\";\r\nimport * as angular from \"angular\";\r\nimport { GeofenceNavPointsComponent } from \"./geofences/geofenceNavPoints/geofenceNavPoints.component\";\r\nimport { GeofencesComponent } from \"./geofences/geofences.directive\";\r\nimport { GeofenceShapeComponent } from \"./geofences/geofenceShape/geofenceShape.component\";\r\nimport { VeriMapControlsComponent } from \"./mapControls/mapControls.directive\";\r\nimport { VMapComponent } from \"./v-map/v-map/v-map.component\";\r\nimport { VeriMapAlternativeRoutesComponent } from \"./veriMap/veriMapAlternativeRoutes/veriMapAlternativeRoutes.component\";\r\nimport { VeriMapComponent } from \"./veriMap/veriMapComponent/veriMap.component\";\r\nimport { VeriMapContainerComponent } from \"./veriMap/veriMapContainer/veriMapContainer.component\";\r\nimport { VeriMapCurrentJourneyComponent } from \"./veriMap/veriMapCurrentJourney/veriMapCurrentJourney.component\";\r\nimport { VeriMapJourneysNewComponent } from \"./veriMap/veriMapJourneysNew/veriMapJourneysNew.component\";\r\nimport { VeriMapPlotComponent } from \"./veriMap/veriMapPlot/veriMapPlot.component\";\r\nimport { VeriMapPlotHistoryComponent } from \"./veriMap/veriMapPlotHistory/veriMapPlotHistory.component\";\r\nimport { VeriMapPopupComponent } from \"./veriMap/veriMapPopup/veriMapPopup.component\";\r\nimport { VeriMapRouteComponent } from \"./veriMap/veriMapRoute/veriMapRoute.component\";\r\nimport { VeriMapRouteOldComponent } from \"./veriMap/veriMapRouteOld/veriMapRoute.old\";\r\nimport { VeriMapSingleGeofenceComponent } from \"./veriMap/veriMapSingleGeofence/veriMapSingleGeofence.component\";\r\nimport { VeriMapTMSAuditComponent } from \"./veriMap/veriMapTMSAudit/veriMapTMSAudit.component\";\r\nimport { VeriMapVehiclesComponent } from \"./veriMap/veriMapVehicles/veriMapVehicles.component\";\r\n\r\nangular\r\n .module(\"app.map.directives\", [\"ngDebounceThrottle\"/*\"app.components.livemap\"*/])\r\n\r\n .component(\"veriMapContainer\", new VeriMapContainerComponent())\r\n .component(\"veriMap\", new VeriMapComponent())\r\n .component(\"veriMapAlternativeRoutes\", new VeriMapAlternativeRoutesComponent())\r\n .directive(\"veriMapCurrentJourney\", downgradeComponent({ component: VeriMapCurrentJourneyComponent }))\r\n .component(\"veriMapHeatMap\", new VeriMapHeatMapComponent())\r\n .component(\"veriMapJourneys\", new VeriMapJourneyComponent())\r\n .component(\"veriMapPlot\", new VeriMapPlotComponent())\r\n .component(\"veriMapLocation\", new VeriMapLocationComponent())\r\n .component(\"veriMapPlotHistory\", new VeriMapPlotHistoryComponent())\r\n .component(\"veriMapPopup\", new VeriMapPopupComponent())\r\n .component(\"veriMapRoute\", new VeriMapRouteComponent())\r\n .component(\"veriMapRouteOld\", new VeriMapRouteOldComponent())\r\n .component(\"veriMapVehicles\", new VeriMapVehiclesComponent())\r\n .component(\"veriMapVideoEvent\", new VeriMapVideoEventComponent())\r\n .component(\"veriMapControls\", new VeriMapControlsComponent())\r\n .component(\"veriMapTmsAudit\", new VeriMapTMSAuditComponent())\r\n .component(\"veriMapSingleGeofence\", new VeriMapSingleGeofenceComponent())\r\n .component(\"geofences\", new GeofencesComponent())\r\n .component(\"geoAreas\", new GeoAreasComponent())\r\n .component(\"geofenceNavPoints\", new GeofenceNavPointsComponent())\r\n .component(\"geofenceShape\", new GeofenceShapeComponent())\r\n\r\n //.directive(\"ngxDc\", downgradeComponent({ component: NgxDynamicCompilerComponent }))\r\n\r\n .directive(\"uiGmapMarker\", downgradeComponent({ component: UIGmapMarkerComponent }))\r\n .directive(\"uiGmapMarkers\", downgradeComponent({ component: UIGmapMarkersComponent }))\r\n .directive(\"uiGmapPolyline\", downgradeComponent({ component: UIGmapPolylineComponent }))\r\n .directive(\"uiGmapPolylines\", downgradeComponent({ component: UIGmapPolylinesComponent }))\r\n .directive(\"uiGmapPolygon\", downgradeComponent({ component: UIGmapPolygonComponent }))\r\n\r\n .directive(\"veriMapJourneysNew\", downgradeComponent({ component: VeriMapJourneysNewComponent }))\r\n\r\n\r\n .directive(\"vMap\", downgradeComponent({ component: VMapComponent }))\r\n ;\r\n","import * as angular from \"angular\";\r\nimport { IOnChangesObject } from \"angular\";\r\nimport \"./geofenceOverlay.scss\";\r\nimport { IGeoArea } from \"src/app/main/modules/tms/_models/IGeoArea\";\r\nimport { IVeriMapChildComponent, IVeriMapComponent } from \"@directives/_map/veriMap/veriMapComponent/veriMap.component\";\r\nimport { GeoAreaOverlay } from \"@directives/_map/geofences/GeoareaOverlay\";\r\nimport { Debounce } from \"@services/debounce.service\";\r\nimport { GeofenceService } from \"@services/geofence.service\";\r\nimport { GeofenceType } from \"@enums/GeofenceType\";\r\n\r\nexport interface IGeoAreaDirectiveScope extends angular.IScope {\r\n geoareas: IGeoArea[];\r\n}\r\n\r\ninterface IGeoAreaPolygonGroup {\r\n geoarea: IGeoArea;\r\n polygons: google.maps.Polygon[];\r\n}\r\n\r\nexport class GeoAreaComponentController implements angular.IComponentController, IVeriMapChildComponent {\r\n // map\r\n veriMap: IVeriMapComponent;\r\n map: google.maps.Map;\r\n mapEventListeners: google.maps.MapsEventListener[] = [];\r\n\r\n geoAreaOverlays: GeoAreaOverlay[] = [];\r\n\r\n //\r\n geoareas: IGeoArea[];\r\n previousBounds: google.maps.LatLngBounds;\r\n\r\n //private lastMouseLatLng: google.maps.LatLng;\r\n private debouncedToggleVisibility: () => void;\r\n private loadingGeofences = false;\r\n\r\n static $inject = [\"$scope\", \"geofenceService\", \"debounceService\"];\r\n\r\n constructor(\r\n private readonly $scope: angular.IScope,\r\n private readonly geofenceService: GeofenceService,\r\n private readonly debounceService: Debounce) {\r\n }\r\n\r\n $onInit() {\r\n this.veriMap.registerChildComponent(this);\r\n\r\n this.veriMap.mapInitialisedPromise.then(map => {\r\n this.setMap(map);\r\n });\r\n\r\n this.debouncedToggleVisibility = this.debounceService.debounce(() => { this.toggleViewportGeoAreas(); }, 100, false);\r\n }\r\n\r\n $onChanges(onChangesObj: IOnChangesObject): void {\r\n if (onChangesObj[\"hideGeofence\"]) {\r\n this.toggleViewportGeoAreas();\r\n }\r\n\r\n if (onChangesObj[\"geoareas\"] && this.geoareas) {\r\n if (!this.map) {\r\n this.veriMap.mapInitialisedPromise.then(map => {\r\n this.setMap(map);\r\n this.createGeofencesOverlays();\r\n });\r\n }\r\n else {\r\n this.createGeofencesOverlays();\r\n }\r\n }\r\n }\r\n\r\n $onDestroy() {\r\n this.mapEventListeners.forEach(listener => {\r\n google.maps.event.removeListener(listener);\r\n });\r\n\r\n this.destroyOverlays();\r\n\r\n this.veriMap.deregisterChildComponent(this);\r\n }\r\n\r\n setMap(map: google.maps.Map) {\r\n if (this.map) {\r\n return;\r\n }\r\n\r\n this.map = map;\r\n\r\n const zoomListener = this.map.addListener(\"zoom_changed\", () => {\r\n this.debouncedToggleVisibility();\r\n });\r\n\r\n const idleListener = this.map.addListener(\"idle\", () => {\r\n this.debouncedToggleVisibility();\r\n });\r\n\r\n const mapTypeListener = this.map.addListener(\"maptypeid_changed\", () => {\r\n this.geoAreaOverlays.forEach(go => {\r\n go.updateColoursForMapType();\r\n go.drawGeofence(true);\r\n });\r\n });\r\n\r\n this.mapEventListeners.push(mapTypeListener);\r\n this.mapEventListeners.push(idleListener);\r\n this.mapEventListeners.push(zoomListener);\r\n }\r\n\r\n onMouseMove(mousePosition: google.maps.LatLng, event: Event): boolean {\r\n\r\n let closestOverlayMatch: GeoAreaOverlay = null;\r\n const closestOverlayMatchDistance = 0;\r\n\r\n for (let i = 0; i < this.geoAreaOverlays.length; i++) {\r\n const overlay = this.geoAreaOverlays[i];\r\n\r\n if (!overlay || !overlay.overlay || !overlay.visible) {\r\n continue;\r\n }\r\n\r\n // Reset hover status\r\n overlay.setHover(false);\r\n\r\n // Note this works on a square so isnt 100% accurate for polygons and edges of circles\r\n if (overlay.bounds.contains(mousePosition) && this.geofenceService.pointIsInsideGeofence(mousePosition, overlay.geoArea)) {\r\n\r\n const distanceFromPointToGeofence = google.maps.geometry.spherical.computeDistanceBetween(mousePosition, overlay.geoArea.MapCoords);\r\n\r\n if (closestOverlayMatch == null || distanceFromPointToGeofence < closestOverlayMatchDistance) {\r\n\r\n closestOverlayMatch = overlay;\r\n }\r\n }\r\n }\r\n\r\n if (closestOverlayMatch) {\r\n this.highlightGeofenceOverlay(closestOverlayMatch);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private highlightGeofenceOverlay(overlay: GeoAreaOverlay, event?: google.maps.MouseEvent): void {\r\n\r\n if (!overlay.visible) {\r\n return;\r\n }\r\n\r\n overlay.setHover(true);\r\n\r\n this.$scope.$apply();\r\n }\r\n\r\n // -------------------------------------------------\r\n\r\n private createGeofencesOverlays() {\r\n this.destroyOverlays();\r\n\r\n this.geoAreaOverlays = this.createGeoAreaOverlays();\r\n this.toggleGeoareas(this.map.getBounds());\r\n }\r\n\r\n createGeoAreaOverlays() {\r\n window.performance.mark(\"createGeofenceOverlays\");\r\n const overlays: GeoAreaOverlay[] = [];\r\n\r\n if (!this.geoareas) {\r\n return overlays;\r\n }\r\n\r\n let i = this.geoareas.length;\r\n while (i--) {\r\n const geofence = this.geoareas[i];\r\n const overlay = this.createGeoAreaOverlay(geofence, this.map);\r\n\r\n if (overlay) {\r\n overlays.push(overlay);\r\n }\r\n }\r\n window.performance.measure(\"createGeofenceOverlays\");\r\n\r\n return overlays;\r\n }\r\n\r\n createGeoAreaOverlay(geoArea: IGeoArea, map: google.maps.Map): GeoAreaOverlay {\r\n\r\n if (!geoArea) {\r\n return null;\r\n }\r\n\r\n if (geoArea.GeofenceType == GeofenceType.Circle) {\r\n }\r\n else if (geoArea.GeofenceType == GeofenceType.Polygon) {\r\n const coords = [];\r\n\r\n if (!geoArea.Points) {\r\n //console.error(\"Geofence set to polygon but has no points\", geofence);\r\n\r\n return null;\r\n }\r\n\r\n for (let i = 0; i < geoArea.Points.length; i++) {\r\n const [lat, lng] = geoArea.Points[i];\r\n coords.push({ lat, lng });\r\n }\r\n }\r\n else {\r\n return null;\r\n }\r\n\r\n this.createGeoAreaCoords(geoArea);\r\n\r\n return new GeoAreaOverlay(geoArea, map, true, true);\r\n }\r\n\r\n createGeoAreaCoords(geoArea: IGeoArea) {\r\n if (!geoArea.MapCoords) {\r\n geoArea.MapCoords = new google.maps.LatLng(geoArea.Latitude, geoArea.Longitude);\r\n }\r\n }\r\n\r\n private toggleViewportGeoAreas() {\r\n\r\n if (!this.map) {\r\n return;\r\n }\r\n\r\n const bounds = this.map.getBounds();\r\n\r\n if (this.previousBounds != null && this.previousBounds === bounds) {\r\n // If our viewport hasnt changed don't re-render\r\n return;\r\n }\r\n\r\n this.toggleGeoareas(bounds);\r\n }\r\n\r\n private toggleGeoareas(bounds: google.maps.LatLngBounds) {\r\n if (this.loadingGeofences) {\r\n return;\r\n }\r\n\r\n this.previousBounds = bounds;\r\n const zoomLevel = this.map.getZoom();\r\n const visibleForZoomLevel = zoomLevel > 10;\r\n\r\n for (let i = 0; i < this.geoAreaOverlays.length; i++) {\r\n const overlay = this.geoAreaOverlays[i];\r\n\r\n if (!overlay || !overlay.geoArea) {\r\n continue;\r\n }\r\n\r\n if (visibleForZoomLevel && bounds.intersects(overlay.bounds)) {\r\n\r\n overlay.showElement();\r\n overlay.setHover(false);\r\n }\r\n else {\r\n overlay.hideElement();\r\n }\r\n }\r\n }\r\n\r\n private destroyOverlays() {\r\n this.geoAreaOverlays.forEach((overlay) => {\r\n overlay.hideElement();\r\n overlay.setHover(false);\r\n\r\n if (overlay && overlay.overlay) {\r\n overlay.overlay.setMap(null);\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport class GeoAreasComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n require: { [index: string]: string; };\r\n\r\n constructor() {\r\n this.bindings = {\r\n geoareas: \"<\",\r\n };\r\n\r\n this.require = {\r\n veriMap: \"^veriMap\"\r\n };\r\n\r\n this.controller = GeoAreaComponentController;\r\n }\r\n}\r\n","import { IGeofenceOverlaySize } from \"@directives/_map/geofences/geofenceoverlay\";\r\nimport { GeofenceType } from \"@enums/GeofenceType\";\r\nimport { IGeoArea } from \"src/app/main/modules/tms/_models/IGeoArea\";\r\nimport * as angular from \"angular\";\r\n\r\nexport class GeoAreaOverlay {\r\n bounds: google.maps.LatLngBounds;\r\n overlay: google.maps.OverlayView;\r\n overlayProjection: google.maps.MapCanvasProjection;\r\n\r\n protected className = \"geofenceOverlay\";\r\n protected previousClassname: string;\r\n\r\n visible = false;\r\n protected descriptionLines: string[];\r\n protected longestLine: string;\r\n protected backgroundColor: string;\r\n protected strokeStyle: string;\r\n protected isReadable = false;\r\n protected hover = false;\r\n\r\n protected canvas: HTMLCanvasElement = null;\r\n protected div: HTMLDivElement = null;\r\n protected context: CanvasRenderingContext2D;\r\n protected previousSize: IGeofenceOverlaySize = {};\r\n\r\n\r\n constructor(\r\n public geoArea: IGeoArea,\r\n protected readonly map: google.maps.Map,\r\n protected readonly showLabelWhenZoomedOut: boolean,\r\n protected readonly drawOnAdd = false) {\r\n\r\n performance.mark(\"GCreation\");\r\n\r\n this.canvas = null;\r\n this.div = null;\r\n\r\n this.init();\r\n performance.measure(\"GCreation\");\r\n }\r\n\r\n init() {\r\n if (this.geoArea.GeofenceType === GeofenceType.Circle) {\r\n const location = new google.maps.LatLng(this.geoArea.Latitude, this.geoArea.Longitude);\r\n this.bounds = this.getBoundingBoxForCircle(location, this.geoArea.Radius);\r\n }\r\n else {\r\n this.bounds = this.getBoundingBoxForPolygonArray(this.geoArea.Points);\r\n }\r\n\r\n if (this.drawOnAdd) {\r\n this.showElement();\r\n }\r\n }\r\n\r\n showElement() {\r\n if (!this.div) {\r\n this.initOverlay();\r\n\r\n this.createElements();\r\n }\r\n\r\n if (this.div && !this.visible) {\r\n this.visible = true;\r\n this.overlay.setMap(this.map);\r\n }\r\n }\r\n\r\n drawGeofence(forceRedraw = false) {\r\n\r\n if (!this.overlay || !this.overlay.getMap()) {\r\n return;\r\n }\r\n\r\n window.performance.mark(\"drawGeofence\");\r\n\r\n const hasResized = this.resizeContainingElement();\r\n if (!forceRedraw && !hasResized) {\r\n return;\r\n }\r\n\r\n if (forceRedraw) {\r\n this.context.clearRect(0, 0, this.previousSize.width, this.previousSize.height);\r\n }\r\n\r\n this.context.strokeStyle = this.strokeStyle;\r\n this.context.lineWidth = this.hover ? 3 : 1;\r\n this.context.fillStyle = this.backgroundColor;\r\n\r\n this.setGeofenceClass();\r\n\r\n if (this.geoArea.GeofenceType === GeofenceType.Circle) {\r\n this.drawCircleGeofence(this.isReadable);\r\n }\r\n else {\r\n this.drawPolygonGeofence(this.isReadable);\r\n }\r\n\r\n window.performance.measure(\"drawGeofence\");\r\n }\r\n\r\n removeChild() {\r\n angular.element(this.div).remove();\r\n }\r\n\r\n updateColoursForMapType() {\r\n if (this.backgroundColor && this.strokeStyle) {\r\n return;\r\n }\r\n\r\n const defaultStrokeStyle = \"rgba(50, 50, 50, 0.8)\";\r\n const defaultBackgroundColor = \"rgba(50, 50, 50, 0.4)\";\r\n const satelliteBackgroundColor = \"rgba(250, 250, 250, 0.4)\";\r\n\r\n if (this.map.getMapTypeId() === google.maps.MapTypeId.SATELLITE || this.map.getMapTypeId() === google.maps.MapTypeId.HYBRID) {\r\n this.backgroundColor = satelliteBackgroundColor;\r\n this.strokeStyle = defaultStrokeStyle;\r\n }\r\n else {\r\n this.backgroundColor = defaultBackgroundColor;\r\n this.strokeStyle = defaultStrokeStyle;\r\n }\r\n\r\n }\r\n\r\n setGeofenceClass(forceShowLabel: boolean = false) {\r\n const showLabel = (forceShowLabel || this.showLabelWhenZoomedOut) && !this.isReadable;\r\n\r\n let className = this.className;\r\n\r\n if (this.hover) {\r\n className += \" hover\";\r\n }\r\n\r\n if (showLabel) {\r\n className += ` showLabel`;\r\n\r\n if (forceShowLabel) {\r\n className += ` force`;\r\n }\r\n }\r\n\r\n if (className != this.previousClassname) {\r\n this.div.className = className;\r\n this.previousClassname = className;\r\n }\r\n }\r\n\r\n hideElement() {\r\n if (this.div && this.visible) {\r\n this.visible = false;\r\n this.overlay.setMap(null);\r\n }\r\n }\r\n\r\n setHover(hover: boolean) {\r\n if (this.hover === hover) {\r\n return;\r\n }\r\n\r\n this.hover = hover;\r\n\r\n this.updateColoursForMapType();\r\n\r\n this.hideElement();\r\n this.showElement();\r\n\r\n if (this.visible) {\r\n\r\n // Quick hack to clear canvas\r\n this.canvas.width = this.canvas.width;\r\n this.drawGeofence(true);\r\n }\r\n }\r\n\r\n protected drawPolygonGeofence(drawText: boolean) {\r\n const totalWidth = this.bounds.getNorthEast().lng() - this.bounds.getSouthWest().lng();\r\n const totalHeight = this.bounds.getNorthEast().lat() - this.bounds.getSouthWest().lat();\r\n\r\n this.context.beginPath();\r\n for (let i = 0; i < this.geoArea.Points.length; i++) {\r\n const pixel = this.convertLatLngToPixelCoordinates(this.geoArea.Points[i], totalWidth, totalHeight);\r\n\r\n this.context.lineTo(pixel[0], pixel[1]);\r\n }\r\n\r\n this.context.stroke();\r\n this.context.fill();\r\n\r\n if (drawText) {\r\n const middleLng = (this.bounds.getNorthEast().lng() + this.bounds.getSouthWest().lng()) / 2;\r\n\r\n const pixel = this.convertLatLngToPixelCoordinates([this.geoArea.Latitude, middleLng], totalWidth, totalHeight);\r\n this.fillText(pixel[0], pixel[1]);\r\n }\r\n }\r\n\r\n protected convertLatLngToPixelCoordinates(p: [number, number], totalWidth: number, totalHeight: number) {\r\n const mappedXpercent = (p[1] - this.bounds.getSouthWest().lng()) / totalWidth;\r\n const mappedYpercent = (p[0] - this.bounds.getSouthWest().lat()) / totalHeight;\r\n\r\n // Whole numbers are far faster for the browser to render\r\n const pixelX = Math.round(this.previousSize.width * mappedXpercent);\r\n const pixelY = Math.round(this.previousSize.height - (this.previousSize.height * mappedYpercent));\r\n\r\n return [pixelX, pixelY];\r\n }\r\n\r\n private initOverlay() {\r\n this.overlay = new google.maps.OverlayView();\r\n\r\n this.overlay.onAdd = () => {\r\n this.addOverlayElements();\r\n\r\n if (this.drawOnAdd) {\r\n this.showElement();\r\n this.drawGeofence();\r\n }\r\n };\r\n\r\n this.overlay.draw = () => {\r\n this.drawGeofence();\r\n }\r\n\r\n this.overlay.onRemove = () => {\r\n this.removeChild();\r\n }\r\n }\r\n\r\n private addOverlayElements() {\r\n if (!this.div) {\r\n this.createElements();\r\n }\r\n\r\n const panes = this.overlay.getPanes();\r\n panes.overlayLayer.appendChild(this.div);\r\n\r\n // We use the south-west and north-east coordinates of the overlay to peg it to the correct position and size.\r\n // To do this, we need to retrieve the projection from the overlay.\r\n this.overlayProjection = this.overlay.getProjection();\r\n\r\n this.updateColoursForMapType();\r\n }\r\n\r\n private createElements() {\r\n\r\n window.performance.mark(\"createElements\");\r\n this.div = document.createElement(\"div\") as HTMLDivElement;\r\n this.div.className = this.className;\r\n\r\n if (this.showLabelWhenZoomedOut) {\r\n const textElement = document.createElement(\"div\");\r\n textElement.className = \"description\";\r\n textElement.textContent = \"\";\r\n\r\n if (this.descriptionLines) {\r\n this.descriptionLines.forEach(line => {\r\n textElement.innerHTML += `${line}
`;\r\n });\r\n }\r\n\r\n this.div.appendChild(textElement);\r\n }\r\n\r\n this.canvas = document.createElement(\"canvas\") as HTMLCanvasElement;\r\n this.context = this.canvas.getContext(\"2d\");\r\n\r\n this.div.appendChild(this.canvas);\r\n\r\n window.performance.measure(\"createElements\");\r\n }\r\n\r\n private getBoundingBoxForCircle(point: google.maps.LatLng, radius: number) {\r\n const north = google.maps.geometry.spherical.computeOffset(point, radius, 0);\r\n const east = google.maps.geometry.spherical.computeOffset(point, radius, 90);\r\n const south = google.maps.geometry.spherical.computeOffset(point, radius, 180);\r\n const west = google.maps.geometry.spherical.computeOffset(point, radius, 270);\r\n\r\n const bounds = new google.maps.LatLngBounds();\r\n\r\n bounds.extend(north);\r\n bounds.extend(east);\r\n bounds.extend(south);\r\n bounds.extend(west);\r\n\r\n return bounds;\r\n }\r\n\r\n private getBoundingBoxForPolygonArray(polygon: [number, number][]) {\r\n const bounds = new google.maps.LatLngBounds();\r\n\r\n for (let i = 0; i < polygon.length; i++) {\r\n const latLng = new google.maps.LatLng(polygon[i][0], polygon[i][1]);\r\n bounds.extend(latLng);\r\n }\r\n\r\n return bounds;\r\n }\r\n\r\n private resizeContainingElement(): boolean {\r\n const size = this.getOverlaySize();\r\n\r\n if (!size || !size.sw || !size.ne) {\r\n return false;\r\n }\r\n\r\n if (this.previousSize.ne &&\r\n this.previousSize.sw &&\r\n this.previousSize.ne.equals(size.ne) &&\r\n this.previousSize.sw.equals(size.sw)) {\r\n return false;\r\n }\r\n\r\n this.div.style.left = size.sw.x + \"px\";\r\n this.div.style.top = size.ne.y + \"px\";\r\n\r\n this.previousSize.ne = size.ne;\r\n this.previousSize.sw = size.sw;\r\n\r\n if (size.width == this.previousSize.width && size.height == this.previousSize.height) {\r\n return false;\r\n }\r\n\r\n this.div.style.width = size.width + \"px\";\r\n this.div.style.height = size.height + \"px\";\r\n\r\n this.canvas.width = size.width;\r\n this.canvas.height = size.height;\r\n\r\n this.previousSize = size;\r\n\r\n this.isReadable = this.isGeofenceTextReadable();\r\n\r\n return true;\r\n }\r\n\r\n private drawCircleGeofence(drawText: boolean) {\r\n if (this.previousSize.width <= this.context.lineWidth * 2) {\r\n return;\r\n }\r\n\r\n const centerX = this.previousSize.width / 2;\r\n const centerY = this.previousSize.height / 2;\r\n\r\n // Check we're trying to draw a valid circle.\r\n const radius = centerX - Math.ceil(this.context.lineWidth / 4);\r\n\r\n if (radius <= 0) {\r\n console.warn(\"no radius\", radius, centerX, this.context.lineWidth, this.previousSize.width, this.geoArea);\r\n return;\r\n }\r\n\r\n this.drawCircle(centerX, centerY, radius);\r\n\r\n if (drawText) {\r\n this.fillText(centerX, centerY);\r\n }\r\n }\r\n\r\n private drawCircle(x: number, y: number, radius: number, backgroundColor: string = this.backgroundColor) {\r\n window.performance.mark(\"drawCircle\");\r\n\r\n this.context.beginPath();\r\n this.context.arc(x, y, radius, 0, 2 * Math.PI, false);\r\n this.context.closePath();\r\n this.context.fillStyle = (backgroundColor) ? backgroundColor : \"rgba(250, 250, 250, 0.4)\";\r\n\r\n this.context.stroke();\r\n this.context.fill();\r\n\r\n\r\n window.performance.measure(\"drawCircle\");\r\n }\r\n\r\n private fillText(x: number, y: number) {\r\n window.performance.mark(\"fillText\");\r\n\r\n this.context.fillStyle = \"black\";\r\n this.context.textAlign = \"center\";\r\n\r\n const fontSize = this.getFontSizeForLine(this.longestLine);\r\n this.context.font = `${fontSize}px Roboto`;\r\n\r\n if (this.descriptionLines.length === 1) {\r\n this.context.textBaseline = \"middle\";\r\n this.context.fillText(this.descriptionLines[0], x, y);\r\n }\r\n else {\r\n this.context.textBaseline = \"bottom\";\r\n this.context.fillText(this.descriptionLines[0], x, y);\r\n this.context.textBaseline = \"top\";\r\n this.context.fillText(this.descriptionLines[1], x, y);\r\n }\r\n\r\n window.performance.measure(\"fillText\");\r\n }\r\n\r\n private getFontSizeForLine(line: string) {\r\n if (!line) {\r\n return 0;\r\n }\r\n\r\n window.performance.mark(\"getFontSizeForLine\");\r\n\r\n const fractionModifier = line.length < 5 ? 1 : 1.2;\r\n const letterFraction = fractionModifier / line.length;\r\n let pixelSize = Math.min(this.previousSize.width, this.previousSize.height) * letterFraction;\r\n\r\n // Makes wider polygons text bigger, works best on boxes rather than irregular polygon\r\n const widthModifier = 0.75;\r\n if (this.previousSize.width * widthModifier > this.previousSize.height) {\r\n pixelSize *= this.previousSize.width * widthModifier / this.previousSize.height;\r\n }\r\n\r\n // Set max size\r\n pixelSize = Math.min(pixelSize, 60);\r\n\r\n window.performance.measure(\"getFontSizeForLine\");\r\n\r\n return pixelSize;\r\n }\r\n\r\n private isGeofenceTextReadable() {\r\n const fontSize = this.getFontSizeForLine(this.longestLine);\r\n return fontSize >= 7;\r\n }\r\n getOverlaySize(): IGeofenceOverlaySize {\r\n if (!this.overlayProjection) {\r\n return {};\r\n }\r\n\r\n const sw = this.overlayProjection.fromLatLngToDivPixel(this.bounds.getSouthWest());\r\n const ne = this.overlayProjection.fromLatLngToDivPixel(this.bounds.getNorthEast());\r\n\r\n const width = Math.round(ne.x - sw.x);\r\n const height = Math.round(sw.y - ne.y);\r\n\r\n return {\r\n sw,\r\n ne,\r\n width,\r\n height\r\n }\r\n }\r\n}\r\n","\r\nimport * as angular from \"angular\";\r\n\r\nimport { IPlot } from \"@interfaces/IPlot\";\r\nimport { PlotService } from \"@services/plot.service\";\r\n\r\nimport \"./veriMapHeatMap.html\";\r\nimport { IJourney } from \"@interfaces/IJourney\";\r\nimport { IVeriMapComponent } from \"@directives/_map/veriMap/veriMapComponent/veriMap.component\";\r\n\r\ninterface IVeriMapHeatMapComponentBindings {\r\n\r\n veriMap: IVeriMapComponent;\r\n\r\n plots: IPlot[];\r\n journeys: IJourney[];\r\n locations: google.maps.LatLng[] | google.maps.visualization.WeightedLocation[];\r\n\r\n fit: boolean;\r\n}\r\n\r\nclass VeriMapHeatMapComponentController implements angular.IComponentController, IVeriMapHeatMapComponentBindings {\r\n veriMap: IVeriMapComponent;\r\n\r\n plots: IPlot[];\r\n journeys: IJourney[];\r\n locations: google.maps.LatLng[] | google.maps.visualization.WeightedLocation[];\r\n\r\n latLngs: google.maps.LatLng[] /*| google.maps.visualization.WeightedLocation[]*/;\r\n\r\n fit: boolean;\r\n\r\n // Heatmap settings\r\n heatMapLayer: google.maps.visualization.HeatmapLayer;\r\n\r\n static $inject = [\"plotService\"];\r\n\r\n constructor(\r\n private plotService: PlotService) {\r\n }\r\n\r\n $onInit() {\r\n this.veriMap.greyscale = true;\r\n }\r\n\r\n $onDestroy() {\r\n this.veriMap.greyscale = false;\r\n this.heatMapLayer.setMap(null);\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n\r\n if (onChangesObj[\"plots\"] && this.plots /*&& this.heatMapLayer*/) {\r\n this.createPlotLatLngs();\r\n }\r\n\r\n if (onChangesObj[\"journeys\"] && this.journeys /*&& this.heatMapLayer*/) {\r\n this.createJourneyLatLngs();\r\n }\r\n\r\n if (onChangesObj[\"locations\"]) {\r\n this.latLngs = this.locations as google.maps.LatLng[];\r\n }\r\n\r\n this.showHeatMap();\r\n }\r\n\r\n //heatLayerCallback = (function (heatLayer: google.maps.visualization.HeatmapLayer) {\r\n // this.setHeatMapLayer(heatLayer);\r\n\r\n // this.showHeatMap();\r\n //}).bind(this);\r\n\r\n // -----------------------------\r\n\r\n private createJourneyLatLngs() {\r\n this.latLngs = [];\r\n\r\n this.journeys.forEach(journey => {\r\n if (!journey.LinePoints) {\r\n return;\r\n }\r\n\r\n journey.LinePoints.forEach(point => {\r\n this.latLngs.push(new google.maps.LatLng(point[0], point[1]));\r\n });\r\n });\r\n }\r\n\r\n private createPlotLatLngs() {\r\n\r\n if (this.plots == null || this.plots.length == 0) {\r\n console.error(\"createPlotLatLngs - No plots\");\r\n return;\r\n }\r\n\r\n // For each vehicle get the days plots and turn that into lat lngs\r\n //var mvcArray = this.heatMapLayer.getData();\r\n //this.latLngs = this.plotService.convertPlotsToGoogleLatLng(this.plots);\r\n\r\n //latLngsForVehicle.forEach(latlng => {\r\n // mvcArray.push(latlng);\r\n //});\r\n }\r\n\r\n private showHeatMap() {\r\n if (this.heatMapLayer == null) {\r\n //console.error(\"ShowHeatMap - NO LAYER\");\r\n\r\n //return;\r\n this.createHeatMapLayer();\r\n }\r\n\r\n if (!this.latLngs || this.latLngs.length == 0) {\r\n console.warn(\"No latlngs for Heatmap\");\r\n }\r\n\r\n this.heatMapLayer.setData(new google.maps.MVCArray(this.latLngs));\r\n\r\n this.fitMap(this.latLngs);\r\n }\r\n\r\n private createHeatMapLayer() {\r\n this.heatMapLayer = new google.maps.visualization.HeatmapLayer({\r\n //data: [],\r\n //dissipating: true,\r\n //radius: 50\r\n data: [],\r\n dissipating: true,\r\n maxIntensity: 20,\r\n radius: 6,\r\n opacity: 0.9,\r\n //dissipating: false\r\n });\r\n\r\n this.setHeatMapLayer();\r\n }\r\n\r\n private setHeatMapLayer() {\r\n\r\n this.heatMapLayer.setMap(this.veriMap.getMap());\r\n\r\n //this.heatMapLayer.set('radius', 20);\r\n //this.heatMapLayer.set('opacity', 0.5);\r\n //this.heatMapLayer.set('opacity', 0.8);\r\n\r\n // Change gradient\r\n var gradient = [\r\n 'rgba(0, 255, 255, 0)',\r\n //'rgba(0, 255, 255, 1)',\r\n //'rgba(0, 191, 255, 1)',\r\n //'rgba(0, 127, 255, 1)',\r\n //'rgba(0, 63, 255, 1)',\r\n //'rgba(0, 0, 255, 0.25)',\r\n //'rgba(0, 0, 255, 0.5)',\r\n 'rgba(0, 0, 255, 0.75)',\r\n 'rgba(0, 0, 255, 1)',\r\n 'rgba(0, 0, 223, 1)',\r\n 'rgba(0, 0, 191, 1)',\r\n 'rgba(0, 0, 159, 1)',\r\n 'rgba(0, 0, 127, 1)',\r\n 'rgba(63, 0, 91, 1)',\r\n 'rgba(127, 0, 63, 1)',\r\n 'rgba(191, 0, 31, 1)',\r\n 'rgba(255, 0, 0, 1)'\r\n ];\r\n\r\n this.heatMapLayer.set('gradient', this.heatMapLayer.get('gradient') ? null : gradient);\r\n\r\n this.showHeatMap();\r\n }\r\n\r\n private fitMap(latLngsForVehicle: google.maps.LatLng[]) {\r\n if (this.veriMap == null || !this.fit) {\r\n return;\r\n }\r\n\r\n this.veriMap.fitMap(latLngsForVehicle);\r\n }\r\n}\r\n\r\nexport class VeriMapHeatMapComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n require: { [index: string]: string; };\r\n\r\n constructor() {\r\n this.bindings = {\r\n plots: \"<\",\r\n journeys: \"<\",\r\n locations: \"<\",\r\n \r\n fit: \"<\"\r\n };\r\n\r\n this.require = {\r\n veriMap: \"^veriMap\"\r\n };\r\n\r\n this.controller = VeriMapHeatMapComponentController;\r\n this.template = require(\"./veriMapHeatMap.html\");\r\n }\r\n}\r\n","\r\nimport { IVeriMapChildComponent, IVeriMapComponent } from \"@directives/_map/veriMap/veriMapComponent/veriMap.component\";\r\nimport { IGoogleMapsMarkerOptions } from \"@interfaces/IGoogleMapsMarkerOptions\";\r\nimport { IJourney } from \"@interfaces/IJourney\";\r\nimport { IPlot, IPlotEvent } from \"@interfaces/IPlot\";\r\nimport { GoogleService } from \"@services/google.service\";\r\nimport { EventMarkerType, GoogleMarkerService } from \"@services/googleMarker.service\";\r\nimport { JourneyService } from \"@services/journey.service\";\r\nimport { MapService } from \"@services/map.service\";\r\nimport { PlotService } from \"@services/plot.service\";\r\nimport { VeriMarkerService } from \"@services/veriMarker.service\";\r\nimport { ClusterIcon, IMarkerEvents, IMarkerOptions, IPolyline, NgMapMarkerClusterer } from \"@typings/google.maps.angular\";\r\nimport * as angular from \"angular\";\r\nimport copy from \"fast-copy/dist/fast-copy.esm.js\";\r\nimport * as moment from \"moment\";\r\nimport { IJourneyGraphExtremes } from \"../../../../main/components/livemap/journeys/journeyGraph.component\";\r\n\r\ninterface IVeriMapJourneyBindings {\r\n\r\n veriMap: IVeriMapComponent;\r\n\r\n highlightedPlot: IPlot;\r\n selectedPlot: IPlot;\r\n journeys: IJourney[];\r\n\r\n highlightedJourney: IJourney;\r\n selectedJourney: IJourney;\r\n\r\n selectedEvent: IPlotEvent;\r\n highlightedEvent: IPlotEvent;\r\n\r\n fit: boolean;\r\n\r\n displayPlots: IPlot[];\r\n showPlots: boolean;\r\n showEvents: boolean;\r\n showCurrentPositionOnly: boolean;\r\n showJourneyHover: boolean;\r\n snapRoads: boolean;\r\n\r\n onJourneyPlotHover(args: { $plot: IPlot });\r\n onJourneyExtremesChange(extremes: { $extremes: IJourneyGraphExtremes });\r\n onEventMarkerClicked(args: { $event: IPlotEvent, mouseEvent: MouseEvent });\r\n onPlotMarkerClicked(args: { $event: IPlot, mouseEvent: MouseEvent });\r\n onPlotMarkerRightClicked(args: { $event: IPlot, mouseEvent: MouseEvent });\r\n}\r\n\r\nclass VeriMapJourneyComponentController implements angular.IComponentController, IVeriMapJourneyBindings, IVeriMapChildComponent {\r\n journeyEventMarkerEvents: IMarkerEvents = {\r\n click: (markerObj, eventName: string, plotEvent: IPlotEvent, mouseEvent: MouseEvent) => {\r\n if (this.onEventMarkerClicked) {\r\n this.onEventMarkerClicked({ $event: plotEvent, mouseEvent: mouseEvent });\r\n }\r\n }\r\n }\r\n\r\n plotMarkerEvents: IMarkerEvents = {\r\n click: (markerObj, eventName: string, plot: IPlot, mouseEvent: MouseEvent) => {\r\n if (!(plot as IPlot).Id) {\r\n if (!this.highlightedPlot) {\r\n return;\r\n }\r\n\r\n plot = this.highlightedPlot;\r\n }\r\n\r\n if (this.onPlotMarkerClicked) {\r\n this.onPlotMarkerClicked({ $event: plot, mouseEvent: mouseEvent });\r\n this.$scope.$apply();\r\n }\r\n },\r\n rightclick: (markerObj, eventName: string, plot: IPlot, mouseEvent: MouseEvent) => {\r\n if (this.onPlotMarkerRightClicked) {\r\n this.onPlotMarkerRightClicked({ $event: plot, mouseEvent: mouseEvent });\r\n this.$scope.$apply();\r\n }\r\n },\r\n mouseover: (markerObj, eventName: string, plot: IPlot, mouseEvent: MouseEvent) => {\r\n if (!(plot as IPlot).Id) {\r\n if (!this.highlightedPlot) {\r\n return;\r\n }\r\n\r\n plot = this.highlightedPlot;\r\n }\r\n\r\n this.setHighlightedPlot(plot);\r\n }\r\n }\r\n\r\n veriMap: IVeriMapComponent;\r\n\r\n highlightedPlot: IPlot;\r\n selectedPlot: IPlot;\r\n journeyPlotOptions: IGoogleMapsMarkerOptions;\r\n\r\n journeys: IJourney[] = [];\r\n journeyPolylines: IPolyline[] = [];\r\n journeyEvents: IPlotEvent[] = [];\r\n videoEvents: IPlotEvent[] = [];\r\n\r\n highlightedJourney: IJourney;\r\n selectedJourney: IJourney;\r\n selectedEvent: IPlotEvent;\r\n highlightedEvent: IPlotEvent;\r\n\r\n extremes: IJourneyGraphExtremes;\r\n\r\n latLngsToFitTo: google.maps.LatLng[] = [];\r\n\r\n fit: boolean;\r\n\r\n displayPlots: IPlot[];\r\n internalDisplayPlots: IPlot[];\r\n showPlots: boolean;\r\n showEvents: boolean;\r\n showCurrentPositionOnly: boolean;\r\n showJourneyHover: boolean = true;\r\n snapRoads: boolean;\r\n\r\n journeyExtremes: IJourneyGraphExtremes;\r\n ignoreNextExtremesUpdated = false;\r\n\r\n onJourneyPlotHover: (args: { $plot: IPlot }) => void;\r\n onJourneyExtremesChange: (extremes: { $extremes: IJourneyGraphExtremes }) => void;\r\n onEventMarkerClicked: (args: { $event: IPlotEvent, mouseEvent: MouseEvent }) => void;\r\n onPlotMarkerClicked: (args: { $event: IPlot, mouseEvent: MouseEvent }) => void;\r\n onPlotMarkerRightClicked: (args: { $event: IPlot, mouseEvent: MouseEvent }) => void;\r\n\r\n eventMarkerOptions: IMarkerOptions = {\r\n events: {},\r\n control: {},\r\n type: \"cluster\",\r\n typeOptions: {\r\n imagePath: \"https://rawgit.com/googlemaps/js-marker-clusterer/gh-pages/images/m\",\r\n maxZoom: 13,\r\n gridSize: 40 // default 60\r\n },\r\n typeEvents: {}\r\n };\r\n\r\n static $inject = [\"$scope\", \"$q\", \"journeyService\", \"plotService\", \"mapService\", \"veriMarkerService\", \"googleMarkerService\"];\r\n\r\n constructor(\r\n private readonly $scope: angular.IScope,\r\n private readonly $q: angular.IQService,\r\n private readonly journeyService: JourneyService,\r\n private readonly plotService: PlotService,\r\n private readonly mapService: MapService,\r\n private readonly veriMarkerService: VeriMarkerService,\r\n private readonly googleMarkerService: GoogleMarkerService) {\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject): void {\r\n var parseJourneys = false;\r\n var parseJourneyEvents = false;\r\n var showHideJourneyEvents = false;\r\n\r\n if (onChangesObj[\"journeys\"]) {\r\n if (this.journeys && !(this.journeys instanceof Array)) {\r\n this.journeys = [this.journeys as any];\r\n }\r\n\r\n parseJourneys = true;\r\n parseJourneyEvents = true;\r\n\r\n this.highlightedPlot = null;\r\n if (this.showCurrentPositionOnly) {\r\n showHideJourneyEvents = true;\r\n }\r\n }\r\n\r\n if (onChangesObj[\"highlightedJourney\"]) {\r\n this.highlightJourneyPath();\r\n showHideJourneyEvents = true;\r\n }\r\n\r\n if (onChangesObj[\"selectedJourney\"]) {\r\n this.highlightJourneyPath();\r\n showHideJourneyEvents = true;\r\n this.createLatLngsForJourneys();\r\n\r\n this.fitMap();\r\n }\r\n\r\n if (onChangesObj[\"highlightedPlot\"] && onChangesObj[\"highlightedPlot\"].previousValue !== onChangesObj[\"highlightedPlot\"].currentValue) {\r\n this.setHighlightedPlot(this.highlightedPlot);\r\n }\r\n\r\n if (onChangesObj[\"selectedPlot\"] && onChangesObj[\"selectedPlot\"].previousValue !== onChangesObj[\"selectedPlot\"].currentValue) {\r\n this.setHighlightedPlot(this.selectedPlot);\r\n\r\n this.fitMap();\r\n }\r\n\r\n if (onChangesObj[\"highlightedEvent\"]) {\r\n showHideJourneyEvents = true;\r\n }\r\n\r\n if (onChangesObj[\"selectedEvent\"]) {\r\n if (this.selectedEvent) {\r\n this.panToSelectedEvent();\r\n }\r\n else {\r\n this.fitMap();\r\n }\r\n }\r\n\r\n if (onChangesObj[\"extremes\"] && !onChangesObj[\"extremes\"].isFirstChange()) {\r\n if (!this.ignoreNextExtremesUpdated) {\r\n this.createLatLngsForExtremes();\r\n this.fitMap();\r\n }\r\n else {\r\n this.ignoreNextExtremesUpdated = false;\r\n }\r\n }\r\n\r\n if (onChangesObj[\"displayPlots\"]) {\r\n this.hidePlotsBasedOnZoomLevel();\r\n }\r\n\r\n if (parseJourneys) { this.parseJourneys(this.journeys); }\r\n if (parseJourneyEvents) { this.parseJourneyEvents(this.journeys); }\r\n if (showHideJourneyEvents) { this.showHideJourneyEvents(); }\r\n }\r\n\r\n $onInit(): void {\r\n this.veriMap.mapInitialisedPromise\r\n .then(map => {\r\n this.setJourneyExtremes();\r\n\r\n this.fitMap();\r\n })\r\n .catch(e => {\r\n console.error(\"onInit error\", e);\r\n });\r\n\r\n this.veriMap.registerChildComponent(this);\r\n\r\n this.eventMarkerOptions.typeEvents.clusteringend = (ngMapMarkerClusterer) => { this.onClusteringEnd(ngMapMarkerClusterer); };\r\n\r\n if (this.showJourneyHover === undefined) {\r\n this.showJourneyHover = true;\r\n }\r\n }\r\n\r\n $onDestroy(): void {\r\n this.veriMap.deregisterChildComponent(this);\r\n }\r\n\r\n createLatLngsForJourneys() {\r\n const plotsFitToFilter = this.getPlotsForJourneys();\r\n\r\n this.latLngsToFitTo = this.mapService.convertPlotsToGoogleLatLng(plotsFitToFilter);\r\n }\r\n\r\n createLatLngsForExtremes() {\r\n this.latLngsToFitTo = [];\r\n const plotsFitToFilter = this.getPlotsForJourneys();\r\n\r\n for (let i = 0; i < plotsFitToFilter.length; i++) {\r\n const plot = plotsFitToFilter[i];\r\n const plotUtcValue = plot.UtcMoment.valueOf();\r\n\r\n if (!this.extremes || plotUtcValue >= this.extremes.min && plotUtcValue <= this.extremes.max) {\r\n this.latLngsToFitTo.push(new google.maps.LatLng(plot.Latitude, plot.Longitude));\r\n }\r\n }\r\n }\r\n\r\n getLatLngsForFitMap(): google.maps.LatLng[] {\r\n\r\n if (this.selectedPlot) {\r\n return [new google.maps.LatLng(this.selectedPlot.Latitude, this.selectedPlot.Longitude)];\r\n }\r\n\r\n return this.latLngsToFitTo;\r\n }\r\n\r\n onMapIdle() {\r\n this.setJourneyExtremes();\r\n this.hidePlotsBasedOnZoomLevel();\r\n this.snapJourneyBasedOnZoomLevel();\r\n }\r\n\r\n // -------------------------------------\r\n\r\n snapToRoadWorking = false;\r\n\r\n private snapJourneyBasedOnZoomLevel() {\r\n //console.log(\"snapJourneyBasedOnZoomLevel\");\r\n //if (!this.snapRoads) {\r\n // return;\r\n //}\r\n\r\n const map = this.veriMap.getMap();\r\n const currentZoom = map.getZoom();\r\n\r\n if (currentZoom < 12 || !this.journeys || this.journeys.length === 0) {\r\n return;\r\n }\r\n\r\n const mapBounds = this.mapService.getBoundsWithOffset(this.veriMap.getMap(), this.veriMap.mapOffset);\r\n\r\n var snappingPromises: angular.IPromise[] = [];\r\n\r\n const copyOfJourneys = copy(this.journeys);\r\n\r\n copyOfJourneys.forEach(journey => {\r\n if (journey.Id <= 0 || !journey.plots) {\r\n return false;\r\n }\r\n\r\n var totalMinutes = moment(journey.EndUtc).diff(journey.StartUtc, \"minutes\");\r\n\r\n if (journey.plots.length < totalMinutes * 3) {\r\n return false;\r\n }\r\n // if more than 60 plots a min then skip this journey\r\n\r\n var snapThisJourney = false;\r\n for (let i = 0; i < journey.plots.length; i++) {\r\n if (snapThisJourney) {\r\n continue;\r\n }\r\n\r\n const plot = journey.plots[i];\r\n\r\n const plotLatLng = new google.maps.LatLng(plot.Latitude, plot.Longitude);\r\n\r\n if (mapBounds.contains(plotLatLng)) {\r\n snapThisJourney = true;\r\n }\r\n }\r\n\r\n // Todo, causes polylines to go mental everywhere\r\n //console.log(\"snapThisJourney\", snapThisJourney, journey);\r\n //// For now, never snap as its just not reliable enough\r\n ////snapThisJourney = false;\r\n\r\n //if (snapThisJourney && !this.snapToRoadWorking && (!journey.SnappedLinePoints || journey.SnappedLinePoints.length === 0)) {\r\n // journey.plots = null;\r\n // journey.driver = null;\r\n // journey.events = null;\r\n\r\n // snappingPromises.push(this.googleService.snapJourneyToRoad(journey));\r\n //}\r\n });\r\n\r\n if (snappingPromises.length > 0) {\r\n this.snapToRoadWorking = true;\r\n this.$q.all(snappingPromises).then(results => {\r\n\r\n this.journeys.forEach(journey => {\r\n results.forEach(snappedJourneys => {\r\n if (snappedJourneys && journey.Id === snappedJourneys.Id) {\r\n journey.SnappedLinePoints = snappedJourneys.SnappedLinePoints;\r\n }\r\n });\r\n });\r\n\r\n this.parseJourneys(this.journeys, false);\r\n this.snapToRoadWorking = false;\r\n });\r\n }\r\n }\r\n\r\n private showHideJourneyEvents() {\r\n //console.log(\"showHideJourneyEvents\");\r\n\r\n if (this.journeys == null) {\r\n return;\r\n }\r\n\r\n var journeyToHighlight = this.highlightedJourney || this.selectedJourney;\r\n\r\n this.journeyEvents.forEach(event => {\r\n let isVisible = false;\r\n\r\n if (this.highlightedEvent) {\r\n isVisible = event == this.highlightedEvent;\r\n }\r\n else if (journeyToHighlight && event && event.plot && event.plot.UtcMoment) {\r\n isVisible = event.plot.UtcMoment.isBetween(journeyToHighlight.StartUtc, journeyToHighlight.EndUtc, null, \"[]\");\r\n }\r\n else {\r\n isVisible = true;\r\n }\r\n\r\n if (event && event.options && event.options.visible != isVisible) {\r\n event.options.visible = isVisible;\r\n // Removed by CJE 4.6.21 - May not be needed\r\n //event.options = copy(event.options);\r\n }\r\n });\r\n\r\n if (this.showCurrentPositionOnly && this.showEvents) {\r\n // If we only want to see current position and no other events\r\n\r\n this.journeyEvents = this.journeyEvents.filter(event => {\r\n return event.eventType === EventMarkerType.CurrentPosition;\r\n })\r\n }\r\n this.journeyEvents = this.journeyEvents.slice();\r\n }\r\n\r\n private parseJourneyEvents(journeys: IJourney[]) {\r\n\r\n this.journeyEvents = [];\r\n\r\n if (journeys == null) {\r\n return;\r\n }\r\n\r\n journeys.forEach(journey => {\r\n //journey.events.forEach(e => {\r\n // this.journeyEvents.push(e);\r\n //});\r\n this.journeyEvents = this.journeyEvents.concat(journey.events);\r\n });\r\n }\r\n\r\n private parseJourneys(journeys: IJourney[], fitmap = true) {\r\n this.journeyPolylines = [];\r\n\r\n if (journeys == null) {\r\n return;\r\n }\r\n\r\n this.parseJourneyEvents(journeys);\r\n\r\n journeys.forEach(journey => {\r\n if (journey.plots || journey.LinePoints) {\r\n const events = {\r\n mouseover: (p: google.maps.Polyline, eventName: string, model: any, args: any[]) => {\r\n var mouseEvent: google.maps.MouseEvent = args[0];\r\n this.journeyMouseOverEvent(mouseEvent.latLng, journey);\r\n }\r\n }\r\n\r\n var polyline = this.journeyService.createJourneyPolyline(journey, events);\r\n if (polyline) {\r\n this.journeyPolylines.push(polyline);\r\n }\r\n }\r\n else {\r\n console.error(\"Journey contains no plots\", journey, journey.plots);\r\n }\r\n });\r\n\r\n this.createLatLngsForJourneys();\r\n\r\n if (fitmap) {\r\n this.fitMap();\r\n }\r\n }\r\n\r\n private journeyMouseOverEvent(latLng: google.maps.LatLng, journey: IJourney) {\r\n if (this.showJourneyHover) {\r\n\r\n const closestPlot = this.plotService.findPlotClosestToLatLng(journey.plots, latLng);\r\n\r\n this.setHighlightedPlot(closestPlot);\r\n\r\n if (closestPlot != null) {\r\n if (this.onJourneyPlotHover != null) {\r\n this.onJourneyPlotHover({ $plot: closestPlot });\r\n }\r\n }\r\n }\r\n }\r\n\r\n private setHighlightedPlot(plot: IPlot) {\r\n if (!plot) {\r\n return;\r\n }\r\n\r\n plot.veriMarkerOptions = this.veriMarkerService.createVeriMarkerOptions(plot, true);\r\n\r\n if (plot.veriMarkerOptions) {\r\n this.googleMarkerService.generateMarkerOptions(plot, plot.veriMarkerOptions).then(options => {\r\n\r\n plot.markerModel.options = options;\r\n\r\n this.highlightedPlot = plot;\r\n });\r\n }\r\n\r\n }\r\n\r\n private highlightJourneyPath() {\r\n\r\n var journeyToHighlight = this.highlightedJourney || this.selectedJourney;\r\n\r\n this.eventMarkerOptions.type = journeyToHighlight ? null : \"cluster\";\r\n\r\n this.journeyPolylines.forEach(p => {\r\n\r\n if (!journeyToHighlight || p.id === journeyToHighlight.Id) {\r\n //p.options.stroke.color = \"#00426a\";\r\n p.options.stroke.opacity = 0.9;\r\n p.options.stroke.weight = 4;\r\n }\r\n else {\r\n //p.options.stroke.color = \"#00426a\";\r\n p.options.stroke.opacity = 0.5;\r\n p.options.stroke.weight = 2;\r\n }\r\n });\r\n\r\n this.journeyPolylines = this.journeyPolylines.slice();\r\n }\r\n\r\n private hidePlotsBasedOnZoomLevel() {\r\n if (!this.showPlots) {\r\n return;\r\n }\r\n\r\n //this.displayPlots = this.plots;\r\n if (!this.displayPlots) {\r\n this.internalDisplayPlots = [];\r\n return;\r\n }\r\n\r\n //this.displayPlots = this.plotService.simplifyPlots(this.displayPlots, this.selectedPlot || this.highlightedPlot, 0.00001);\r\n this.plotService.getVisisblePlotsBasedOnZoomLevel(this.displayPlots, this.veriMap.getMap(), this.selectedPlot || this.highlightedPlot).then(displayPlots => {\r\n this.internalDisplayPlots = displayPlots;\r\n });\r\n\r\n //console.log(this.displayPlots.length);\r\n\r\n //if (this.selectedPlot && this.displayPlots) {\r\n // this.displayPlots.forEach((plot, i) => {\r\n // if (plot.Id === this.selectedPlot.Id) {\r\n // this.displayPlots[i] = angular.copy(plot);\r\n // }\r\n // });\r\n //}\r\n }\r\n\r\n private getPlotsForJourneys(): IPlot[] {\r\n const plotsToFitTo: IPlot[] = [];\r\n\r\n if (!this.journeys) {\r\n return plotsToFitTo;\r\n }\r\n\r\n this.journeys.forEach(journey => {\r\n if (!journey.plots) {\r\n return;\r\n }\r\n\r\n if (!this.selectedJourney || (this.selectedJourney && journey.Id === this.selectedJourney.Id)) {\r\n for (let i = 0; i < journey.plots.length; i++) {\r\n plotsToFitTo.push(journey.plots[i]);\r\n }\r\n }\r\n });\r\n\r\n return plotsToFitTo;\r\n }\r\n\r\n private fitMap() {\r\n if (!this.fit || !this.journeyPolylines || this.journeyPolylines.length === 0) {\r\n return;\r\n }\r\n\r\n var latLngs = this.getLatLngsForFitMap();\r\n this.veriMap.fitMap(latLngs);\r\n }\r\n\r\n private panToSelectedEvent() {\r\n if (this.selectedEvent != null) {\r\n this.veriMap.panMap(new google.maps.LatLng(this.selectedEvent.plot.Latitude, this.selectedEvent.plot.Longitude));\r\n return;\r\n }\r\n }\r\n\r\n private setJourneyExtremes() {\r\n if (this.journeys == null || this.journeys.length === 0 || this.ignoreNextExtremesUpdated) {\r\n\r\n this.ignoreNextExtremesUpdated = false;\r\n return;\r\n }\r\n\r\n let journeysMin = Number.MAX_VALUE;\r\n let journeysMax = Number.MIN_VALUE;\r\n\r\n if (this.selectedJourney) {\r\n journeysMin = moment(this.selectedJourney.StartUtc).valueOf();\r\n journeysMax = moment(this.selectedJourney.EndUtc).valueOf();\r\n }\r\n else if (this.journeys && this.journeys.length) {\r\n this.journeys.forEach(journey => {\r\n var journeyStart = moment(journey.StartUtc);\r\n journeysMin = Math.min(journeysMin, journeyStart.valueOf());\r\n\r\n var journeyEnd = moment(journey.EndUtc);\r\n journeysMax = Math.max(journeysMax, journeyEnd.valueOf());\r\n });\r\n }\r\n\r\n // If we are displaying a journey then see what portion of the journey is visible and update the graph extremes accordingly\r\n const extremes: IJourneyGraphExtremes = {\r\n min: Number.MAX_VALUE,\r\n max: Number.MIN_VALUE\r\n };\r\n\r\n const mapBounds = this.mapService.getBoundsWithOffset(this.veriMap.getMap(), this.veriMap.mapOffset);\r\n\r\n this.journeys.forEach(journey => {\r\n if (!journey.plots) {\r\n return;\r\n }\r\n\r\n for (let i = 0; i < journey.plots.length; i++) {\r\n const plot = journey.plots[i];\r\n\r\n const plotLatLng = new google.maps.LatLng(plot.Latitude, plot.Longitude);\r\n\r\n if (mapBounds.contains(plotLatLng) && plot.UtcMoment.isBetween(journeysMin, journeysMax, null, \"[]\")) {\r\n extremes.min = Math.min(extremes.min, plot.UtcMoment.valueOf());\r\n extremes.max = Math.max(extremes.max, plot.UtcMoment.valueOf());\r\n }\r\n }\r\n });\r\n\r\n // Only update if we have a minimum difference of N minutes\r\n //if (extremes.max - extremes.min > 2 * 60 * 1000) {\r\n // this.journeyExtremes = extremes;\r\n //}\r\n\r\n this.journeyExtremes = extremes;\r\n this.ignoreNextExtremesUpdated = true;\r\n\r\n if (this.onJourneyExtremesChange != null) {\r\n //console.log(\"$extremes\", this.journeyExtremes);\r\n this.onJourneyExtremesChange({ $extremes: this.journeyExtremes });\r\n }\r\n }\r\n\r\n private onClusteringEnd(ngMapMarkerClusterer: NgMapMarkerClusterer) {\r\n\r\n ngMapMarkerClusterer.getClusters().forEach(c => {\r\n this.updateClusterIconFunction(c.clusterIcon_);\r\n });\r\n }\r\n\r\n private updateClusterIconFunction(cluster: ClusterIcon) {\r\n\r\n if (cluster._show) {\r\n return;\r\n }\r\n\r\n // Extend our prototype here\r\n cluster._show = cluster.show;\r\n cluster.show = function () {\r\n\r\n const clusterIcon: ClusterIcon = this;\r\n\r\n clusterIcon._show();\r\n\r\n if (clusterIcon.div_ && clusterIcon.visible_) {\r\n\r\n this.div_.className = `event-cluster`;\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport class VeriMapJourneyComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n require: { [index: string]: string; };\r\n\r\n constructor() {\r\n this.bindings = {\r\n journeys: \"<\",\r\n highlightedPlot: \"<\",\r\n selectedPlot: \"<\",\r\n\r\n displayPlots: \"<\",\r\n showPlots: \"<\",\r\n showEvents: \"<\",\r\n showCurrentPositionOnly: \"<\",\r\n showJourneyHover: \"<\",\r\n snapRoads: \"<\",\r\n\r\n highlightedJourney: \"<\",\r\n selectedJourney: \"<\",\r\n selectedEvent: \"<\",\r\n highlightedEvent: \"<\",\r\n\r\n extremes: \"<\",\r\n\r\n fit: \"<\",\r\n\r\n onJourneyPlotHover: \"&\",\r\n onJourneyExtremesChange: \"&\",\r\n onEventMarkerClicked: \"&\",\r\n onPlotMarkerClicked: \"&\",\r\n onPlotMarkerRightClicked: \"&\"\r\n };\r\n\r\n this.require = {\r\n veriMap: \"^veriMap\"\r\n };\r\n\r\n this.controller = VeriMapJourneyComponentController;\r\n this.template = require(\"./veriMapJourneys.html\");\r\n }\r\n}\r\n","module.exports = \" 0\\\" [polylines]=$ctrl.journeyPolylines> 0 && $ctrl.showEvents\\\" [models]=$ctrl.journeyEvents [events]=$ctrl.journeyEventMarkerEvents [control]=$ctrl.eventMarkerOptions.control [type]=$ctrl.eventMarkerOptions.type [typeOptions]=$ctrl.eventMarkerOptions.typeOptions [typeEvents]=$ctrl.eventMarkerOptions.typeEvents> 0 && $ctrl.showCurrentPosition && !$ctrl.showEvents\\\" [models]=$ctrl.journeyEvents [events]=$ctrl.journeyEventMarkerEvents [control]=$ctrl.eventMarkerOptions.control [type]=$ctrl.eventMarkerOptions.type [typeOptions]=$ctrl.eventMarkerOptions.typeOptions [typeEvents]=$ctrl.eventMarkerOptions.typeEvents> \";","import { IVeriMapComponent } from \"@directives/_map/veriMap/veriMapComponent/veriMap.component\";\r\nimport { IGoogleMapsMarker } from \"@interfaces/IGoogleMapsMarkerOptions\";\r\nimport { GoogleMarkerService } from \"@services/googleMarker.service\";\r\nimport { VeriMarkerService } from \"@services/veriMarker.service\";\r\nimport * as angular from \"angular\";\r\n\r\ninterface IVeriMapPlotBindings {\r\n\r\n veriMap: IVeriMapComponent;\r\n location: google.maps.LatLngLiteral;\r\n\r\n label: string;\r\n icon: string;\r\n}\r\n\r\nclass Controller implements angular.IComponentController, IVeriMapPlotBindings {\r\n veriMap: IVeriMapComponent;\r\n location: google.maps.LatLngLiteral;\r\n\r\n label: string;\r\n icon: string;\r\n\r\n marker: IGoogleMapsMarker;\r\n\r\n static $inject = [\"veriMarkerService\", \"googleMarkerService\"];\r\n\r\n constructor(\r\n private readonly veriMarkerService: VeriMarkerService,\r\n private readonly googleMarkerService: GoogleMarkerService) {\r\n }\r\n\r\n $onInit() { }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n if (onChangesObj[\"location\"]) {\r\n this.veriMap.mapInitialisedPromise.then(() => {\r\n this.createMarker();\r\n });\r\n }\r\n }\r\n\r\n // ---------------------\r\n\r\n private createMarker() {\r\n const markerOptions = this.googleMarkerService.createEventMarkerOptions({\r\n label: this.label,\r\n markerClass: \"marker-event-start\",\r\n subIcon: this.icon || \"place\",\r\n showLabel: true,\r\n position: this.location\r\n });\r\n\r\n this.marker = {\r\n id: 1,\r\n options: markerOptions\r\n };\r\n\r\n this.veriMap.fitMap([new google.maps.LatLng(this.location)]);\r\n this.veriMap.getMap().setZoom(10);\r\n }\r\n}\r\n\r\nexport class VeriMapLocationComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n require: { [index: string]: string; };\r\n\r\n constructor() {\r\n this.bindings = {\r\n location: \"<\",\r\n label: \"@\",\r\n icon: \"@\"\r\n };\r\n\r\n this.require = {\r\n veriMap: \"^veriMap\"\r\n };\r\n\r\n this.controller = Controller;\r\n this.template = require(\"./veriMapLocation.html\");\r\n }\r\n}\r\n","module.exports = \" \";","\r\nimport * as angular from \"angular\";\r\nimport * as moment from \"moment\";\r\nimport { IPolyline } from \"@typings/google.maps.angular\";\r\nimport { IPlot, IPlotEvent } from \"@interfaces/IPlot\";\r\nimport { CoordsModel } from \"../../../../main/components/livemap/model/CoordsModel\";\r\nimport { GoogleMarkerService, MarkerAnchorPosition } from \"@services/googleMarker.service\";\r\nimport { MapService } from \"@services/map.service\";\r\nimport { PlotService } from \"@services/plot.service\";\r\nimport { VeriMarkerService } from \"@services/veriMarker.service\";\r\nimport { IVideoPlaybackEvent } from \"../../../../main/components/videos/models/IVideoPlaybackEvent\";\r\nimport { VideoPlaybackState } from \"../../../../main/components/videos/enums/VideoPlaybackState\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { IVeriMapComponent } from \"@directives/_map/veriMap/veriMapComponent/veriMap.component\";\r\n\r\ninterface IVeriMapVideoEventBindings {\r\n\r\n veriMap: IVeriMapComponent;\r\n\r\n videoPlaybackEvent: IVideoPlaybackEvent;\r\n}\r\n\r\nclass VeriMapVideoEventComponentController implements angular.IComponentController, IVeriMapVideoEventBindings {\r\n veriMap: IVeriMapComponent;\r\n\r\n videoPlaybackEvent: IVideoPlaybackEvent;\r\n\r\n videoPolyline: IPolyline;\r\n videoEvents: IPlotEvent[] = [];\r\n videoPlot: IPlot;\r\n\r\n static $inject = [\"plotService\", \"veriMarkerService\", \"googleMarkerService\", \"mapService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly plotService: PlotService,\r\n private readonly veriMarkerService: VeriMarkerService,\r\n private readonly googleMarkerService: GoogleMarkerService,\r\n private readonly mapService: MapService,\r\n private readonly translationService: TranslationService ) {\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n if (onChangesObj[\"videoPlaybackEvent\"]) {\r\n if (this.videoPlaybackEvent.state === VideoPlaybackState.Started) {\r\n if (!this.videoPlaybackEvent.video.VideoExtensionData) {\r\n this.videoPlaybackEvent.video.VideoExtensionData = {};\r\n }\r\n\r\n if (!this.videoPlaybackEvent.video.VideoExtensionData.VideoGpsData) {\r\n this.videoPlaybackEvent.video.VideoExtensionData.VideoGpsData = [this.videoPlaybackEvent.currentGpsData];\r\n }\r\n\r\n this.createVideoMapEvents();\r\n this.updateVideoPolyline();\r\n }\r\n\r\n this.updateGpsPlot();\r\n }\r\n }\r\n\r\n $onInit(): void {\r\n }\r\n\r\n // ---------------\r\n\r\n private updateVideoPolyline() {\r\n var latLngs: google.maps.LatLng[] = [];\r\n\r\n this.videoPlaybackEvent.video.VideoExtensionData.VideoGpsData.forEach(gps => {\r\n latLngs.push(new google.maps.LatLng(gps.Latitude, gps.Longitude));\r\n });\r\n\r\n this.videoPolyline = this.mapService.createPolyline(1, latLngs, null, null);\r\n this.veriMap.fitMap(latLngs);\r\n }\r\n\r\n private createVideoMapEvents() {\r\n this.videoEvents = [];\r\n\r\n let startGps = this.videoPlaybackEvent.video.VideoExtensionData.VideoGpsData[0];\r\n let endGps = this.videoPlaybackEvent.video.VideoExtensionData.VideoGpsData[this.videoPlaybackEvent.video.VideoExtensionData.VideoGpsData.length - 1];\r\n\r\n if (!startGps) {\r\n startGps = this.videoPlaybackEvent.currentGpsData;\r\n }\r\n\r\n if (!endGps) {\r\n endGps = this.videoPlaybackEvent.currentGpsData;\r\n }\r\n\r\n if (startGps && this.videoPlaybackEvent.video.VideoExtensionData.VideoGpsData.length <= 1) {\r\n this.videoEvents.push(this.googleMarkerService.createEventMarker(\r\n {\r\n Utc: moment(this.videoPlaybackEvent.video.VideoStartTime).toISOString(),\r\n },\r\n {\r\n label: this.translationService.t(\"veriMapVideoEvent.videoLocation\"),\r\n subIcon: \"flag\",\r\n showLabel: true,\r\n position: { lat: startGps.Latitude, lng: startGps.Longitude }\r\n }));\r\n\r\n this.veriMap.fitMap([new google.maps.LatLng(startGps.Latitude, startGps.Longitude)]);\r\n return;\r\n }\r\n\r\n if (!startGps || !endGps) {\r\n console.log(\"No start or end gps for\", this.videoPlaybackEvent, startGps, endGps);\r\n return;\r\n }\r\n\r\n const leftToRight = startGps.Longitude < endGps.Longitude;\r\n const startAnchorPosition = leftToRight ? MarkerAnchorPosition.Left : MarkerAnchorPosition.Right;\r\n const endAnchorPosition = leftToRight ? MarkerAnchorPosition.Right : MarkerAnchorPosition.Left;\r\n\r\n const fakeStartPlot = {\r\n Utc: moment(this.videoPlaybackEvent.video.VideoStartTime).toISOString(),\r\n Latitude: startGps.Latitude,\r\n Longitude: startGps.Longitude\r\n };\r\n\r\n const fakeEndPlot = {\r\n Utc: moment(this.videoPlaybackEvent.video.VideoEndTime).toISOString(),\r\n Latitude: endGps.Latitude,\r\n Longitude: endGps.Longitude\r\n };\r\n\r\n var startEvent = this.googleMarkerService.createEventMarker(fakeStartPlot, { label: this.translationService.t(\"veriMapVideoEvent.videoStart\"), subIcon: \"play_arrow\", showLabel: true, anchorPosition: startAnchorPosition });\r\n const endEvent = this.googleMarkerService.createEventMarker(fakeEndPlot, { label: this.translationService.t(\"veriMapVideoEvent.videoEnd\"), subIcon: \"flag\", showLabel: true, anchorPosition: endAnchorPosition });\r\n\r\n this.videoEvents.push(startEvent);\r\n this.videoEvents.push(endEvent);\r\n }\r\n\r\n private updateGpsPlot() {\r\n if (!this.videoPlaybackEvent || this.videoPlaybackEvent.video.VideoExtensionData.VideoGpsData.length <= 1) {\r\n return;\r\n }\r\n\r\n this.videoPlot = {\r\n Id: Math.random(),\r\n Latitude: this.videoPlaybackEvent.currentGpsData.Latitude,\r\n Longitude: this.videoPlaybackEvent.currentGpsData.Longitude,\r\n Utc: this.videoPlaybackEvent.currentGpsData.Timestamp,\r\n Velocity: this.videoPlaybackEvent.currentGpsData.Speed,\r\n Direction: this.videoPlaybackEvent.currentGpsData.Heading\r\n };\r\n\r\n this.plotService.preparePlotForMap(this.videoPlot);\r\n\r\n // Should prepare plot for map do this?\r\n this.videoPlot.veriMarkerOptions = this.veriMarkerService.createVeriMarkerOptions(this.videoPlot, true);\r\n this.googleMarkerService.generateMarkerOptions(this.videoPlot, this.videoPlot.veriMarkerOptions).then(options => {\r\n this.videoPlot.markerModel = {\r\n id: this.videoPlot.Id,\r\n options: options\r\n };\r\n });\r\n }\r\n}\r\n\r\nexport class VeriMapVideoEventComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n require: { [index: string]: string; };\r\n\r\n constructor() {\r\n this.bindings = {\r\n videoPlaybackEvent: \"<\"\r\n };\r\n\r\n this.require = {\r\n veriMap: \"^veriMap\"\r\n };\r\n\r\n this.controller = VeriMapVideoEventComponentController;\r\n this.template = require(\"./veriMapVideoEvent.html\");\r\n }\r\n}\r\n","export enum VideoPlaybackState {\r\n Started,\r\n Playing\r\n}","module.exports = \" 0\\\" [models]=$ctrl.videoEvents> \";","\r\nimport { IVeriMapComponent } from \"@directives/_map/veriMap/veriMapComponent/veriMap.component\";\r\nimport { IGeofence } from \"@interfaces/IGeofences\";\r\nimport { IGoogleMapsMarkerOptions } from \"@interfaces/IGoogleMapsMarkerOptions\";\r\nimport { GoogleMarkerService, ICreateEventMarkerOptions, MarkerAnchorPosition } from \"@services/googleMarker.service\";\r\nimport { IMarkerEvents } from \"@typings/google.maps.angular\";\r\nimport * as angular from \"angular\";\r\nimport { IOnChangesObject } from \"angular\";\r\nimport { CoordsModel } from \"../../../../main/components/livemap/model/CoordsModel\";\r\nimport { IGeofenceNavigationPoint } from \"../geofences.interfaces\";\r\nimport \"./geofenceNavPoints.component.scss\";\r\n\r\ninterface IGeofenceMapMarker {\r\n id: number;\r\n geofence: IGeofence\r\n navigationPoint?: IGeofenceNavigationPoint;\r\n coords: CoordsModel;\r\n options?: IGoogleMapsMarkerOptions;\r\n}\r\n\r\nexport class GeofenceNavPointsComponentController implements angular.IComponentController {\r\n\r\n // bindings\r\n navigationPoints: IGeofenceNavigationPoint[] = [];\r\n enableEdit: boolean = false;\r\n onNavPointPositionChanged: (args: { navigationPoint: IGeofenceNavigationPoint, position: google.maps.LatLng }) => void;\r\n\r\n veriMap: IVeriMapComponent;\r\n map: google.maps.Map;\r\n\r\n navigationPointMarkers: IGeofenceMapMarker[] = [];\r\n navigationPointMarkerEvents: IMarkerEvents = {\r\n dragend: (marker: google.maps.Marker, eventName: string, model: IGeofenceMapMarker, mouseEvent: any) => {\r\n this.onNavigationPointMarkerDragEnd(marker, eventName, model, mouseEvent);\r\n }\r\n }\r\n\r\n static $inject = [\"googleMarkerService\"];\r\n\r\n constructor(private readonly googleMarkerService: GoogleMarkerService) {\r\n }\r\n\r\n $onInit() {\r\n this.veriMap.mapInitialisedPromise.then(map => {\r\n this.map = map;\r\n\r\n this.updateMarkers();\r\n });\r\n }\r\n\r\n $onChanges(onChangesObj: IOnChangesObject): void {\r\n if (!this.veriMap.mapInitialised) {\r\n return;\r\n }\r\n\r\n if (onChangesObj[\"navigationPoints\"] || onChangesObj[\"enableEdit\"]) {\r\n this.updateMarkers();\r\n }\r\n }\r\n\r\n private updateMarkers(): void {\r\n this.clearCurrentMarkers();\r\n this.addMarkersForNavigationPoints(this.navigationPoints);\r\n }\r\n\r\n private clearCurrentMarkers(): void {\r\n this.navigationPointMarkers = [];\r\n }\r\n\r\n private addMarkersForNavigationPoints(navigationPoints: IGeofenceNavigationPoint[]): void {\r\n if (!navigationPoints?.length || navigationPoints?.length <= 0) {\r\n return;\r\n }\r\n\r\n const newMarkers: IGeofenceMapMarker[] = [];\r\n\r\n navigationPoints?.forEach((navigationPoint, index) => {\r\n navigationPoint.coords = new CoordsModel(navigationPoint.Latitude, navigationPoint.Longitude);\r\n newMarkers.push(this.createMapMarkerForNavigationPoint(navigationPoint, index, `${navigationPoint?.Name}`, `pin_drop`, `#ff6e40`));\r\n });\r\n\r\n this.navigationPointMarkers = [...newMarkers];\r\n }\r\n\r\n private createMapMarkerForNavigationPoint(navigationPoint: IGeofenceNavigationPoint, id: number, label: string, icon: string, color: string): IGeofenceMapMarker {\r\n if (!navigationPoint?.Latitude || !navigationPoint?.Longitude || !icon) {\r\n return;\r\n }\r\n\r\n const markerOptions: ICreateEventMarkerOptions = {\r\n label: label,\r\n subIcon: icon,\r\n showLabel: true,\r\n anchorPosition: MarkerAnchorPosition.Top,\r\n colour: color\r\n };\r\n\r\n const eventMarkerOptions: IGoogleMapsMarkerOptions = this.googleMarkerService.createEventMarkerOptions(markerOptions);\r\n eventMarkerOptions.draggable = this.enableEdit;\r\n eventMarkerOptions.position = {\r\n lat: navigationPoint.Latitude,\r\n lng: navigationPoint.Longitude\r\n };\r\n\r\n const locationCoords: CoordsModel = new CoordsModel(navigationPoint.Latitude, navigationPoint.Longitude);\r\n\r\n const marker: IGeofenceMapMarker = {\r\n id: id,\r\n geofence: null,\r\n navigationPoint: navigationPoint,\r\n coords: locationCoords,\r\n options: eventMarkerOptions\r\n };\r\n\r\n return marker;\r\n }\r\n\r\n private onNavigationPointMarkerDragEnd(marker: google.maps.Marker, eventName: string, model: IGeofenceMapMarker, mouseEvent: MouseEvent): void {\r\n const newPosition = marker?.getPosition();\r\n\r\n if (!model?.navigationPoint || !newPosition) {\r\n return;\r\n }\r\n\r\n if (this.onNavPointPositionChanged) {\r\n this.onNavPointPositionChanged({ navigationPoint: model?.navigationPoint, position: marker?.getPosition() });\r\n }\r\n }\r\n}\r\n\r\nexport class GeofenceNavPointsComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n require: { [index: string]: string; };\r\n\r\n constructor() {\r\n this.bindings = {\r\n navigationPoints: \"<\",\r\n enableEdit: \"<\",\r\n onNavPointPositionChanged: \"&\"\r\n };\r\n\r\n this.require = {\r\n veriMap: \"^veriMap\"\r\n };\r\n\r\n this.controller = GeofenceNavPointsComponentController;\r\n this.template = require(\"./geofenceNavPoints.component.html\");\r\n }\r\n}\r\n","module.exports = \" 0\\\" [models]=$ctrl.navigationPointMarkers [events]=$ctrl.navigationPointMarkerEvents> \";","import { IVeriMapChildComponent, IVeriMapComponent, MapPopupType } from \"@directives/_map/veriMap/veriMapComponent/veriMap.component\";\r\nimport { BroadcastEvent } from \"@enums/BroadcastEvent\";\r\nimport { GeofenceType } from \"@enums/GeofenceType\";\r\nimport { ICombinedPreferences } from \"@interfaces/ICombinedPreferences\";\r\nimport { GeofenceCategory, IGeofence } from \"@interfaces/IGeofences\";\r\nimport { IPlot } from \"@interfaces/IPlot\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { Debounce } from \"@services/debounce.service\";\r\nimport { GeofenceService, IShowGeofenceEditorOptions } from \"@services/geofence.service\";\r\nimport { SessionService } from \"@services/session.service\";\r\nimport * as angular from \"angular\";\r\nimport { IOnChangesObject } from \"angular\";\r\nimport { SettingsName } from \"../../../class/SettingsName\";\r\nimport { GeofenceOverlay } from \"./geofenceoverlay\";\r\nimport \"./geofenceOverlay.scss\";\r\n\r\nexport interface IGeofencesDirectiveScope extends angular.IScope {\r\n geofences: IGeofence[];\r\n selectedGeofence: IGeofence;\r\n highlightOnHover: boolean;\r\n showZones: boolean;\r\n hideGeofence: IGeofence;\r\n hidePopupControls: boolean;\r\n hideGeofencePopup: boolean;\r\n onlyRightClick: boolean;\r\n onlyShowSelectedGeofence: boolean;\r\n geofenceClicked: (args: { geofence: IGeofence, leftClick: boolean }) => void;\r\n}\r\n\r\ninterface IGeofencePolygonGroup {\r\n geofence: IGeofence;\r\n polygons: google.maps.Polygon[];\r\n}\r\n\r\nexport class GeofencesComponentController implements angular.IComponentController, IVeriMapChildComponent {\r\n // map\r\n veriMap: IVeriMapComponent;\r\n map: google.maps.Map;\r\n geofenceOverlays: GeofenceOverlay[] = [];\r\n mapEventListeners: google.maps.MapsEventListener[] = [];\r\n\r\n //\r\n geofences: IGeofence[];\r\n selectedGeofence: IGeofence;\r\n hideGeofence: IGeofence;\r\n showZones: boolean = false;\r\n onlyRightClick: boolean = false;\r\n previousBounds: google.maps.LatLngBounds;\r\n onlyShowSelectedGeofence: boolean;\r\n userOptions: ICombinedPreferences;\r\n\r\n hidePopupControls: boolean;\r\n hideGeofencePopup: boolean = false;\r\n\r\n //private lastMouseLatLng: google.maps.LatLng;\r\n private debouncedToggleVisibility: () => void;\r\n private highlightOnHover: boolean;\r\n private loadingGeofences = false;\r\n private geofenceClicked: (args: { geofence: IGeofence, leftClick: boolean }) => void;\r\n\r\n // zones\r\n private zonePolygonGroups: IGeofencePolygonGroup[] = [];\r\n\r\n static $inject = [\"$scope\", \"$timeout\", \"geofenceService\", \"sessionService\", \"debounceService\"];\r\n\r\n constructor(\r\n private readonly $scope: angular.IScope,\r\n private readonly $timeout: angular.ITimeoutService,\r\n private readonly geofenceService: GeofenceService,\r\n private readonly sessionService: SessionService,\r\n private readonly debounceService: Debounce,) {\r\n }\r\n\r\n $onInit() {\r\n this.$scope.$on(BroadcastEvent.openGeofenceEditor, (event, geofence: IGeofence, position: google.maps.LatLng = null, resource: IVehicle | IPlot = null) => {\r\n this.openGeofenceEditor(geofence, position, resource);\r\n });\r\n\r\n this.veriMap.registerChildComponent(this);\r\n\r\n this.veriMap.mapInitialisedPromise.then(map => {\r\n this.setMap(map);\r\n });\r\n\r\n this.debouncedToggleVisibility = this.debounceService.debounce(() => { this.toggleViewportGeofences(); }, 100, false);\r\n\r\n this.userOptions = this.sessionService.getItem(SettingsName.UserOptions);\r\n }\r\n\r\n $onChanges(onChangesObj: IOnChangesObject): void {\r\n if (onChangesObj[\"hideGeofence\"]) {\r\n this.toggleViewportGeofences();\r\n }\r\n\r\n if ((onChangesObj[\"geofences\"] || onChangesObj[\"showZones\"] || onChangesObj[\"selectedGeofence\"]) && this.geofences) {\r\n if (!this.map) {\r\n this.veriMap.mapInitialisedPromise.then(map => {\r\n this.setMap(map);\r\n this.createGeofencesOverlays();\r\n this.createGeofenceZones();\r\n });\r\n }\r\n else {\r\n this.createGeofencesOverlays();\r\n this.createGeofenceZones();\r\n }\r\n }\r\n }\r\n\r\n $onDestroy() {\r\n this.mapEventListeners.forEach(listener => {\r\n google.maps.event.removeListener(listener);\r\n });\r\n\r\n this.destroyOverlays();\r\n\r\n this.veriMap.deregisterChildComponent(this);\r\n }\r\n\r\n setMap(map: google.maps.Map) {\r\n if (this.map) {\r\n return;\r\n }\r\n\r\n this.map = map;\r\n\r\n const zoomListener = this.map.addListener(\"zoom_changed\", () => {\r\n this.debouncedToggleVisibility();\r\n });\r\n\r\n const idleListener = this.map.addListener(\"idle\", () => {\r\n this.debouncedToggleVisibility();\r\n });\r\n\r\n const mapTypeListener = this.map.addListener(\"maptypeid_changed\", () => {\r\n this.geofenceOverlays.forEach(go => {\r\n go.updateColoursForMapType();\r\n go.drawGeofence(true);\r\n });\r\n });\r\n\r\n const clickListener = this.map.addListener(\"click\", (mouseEvent: google.maps.MouseEvent) => {\r\n this.mapClicked(mouseEvent.latLng);\r\n\r\n // used it Geofences UI to cancel out the add geofence popup on map click\r\n if (this.onlyRightClick) {\r\n this.veriMap.hidePopup(MapPopupType.RightClick, true);\r\n }\r\n });\r\n\r\n const rightClickListener = this.map.addListener(\"rightclick\", (mouseEvent: google.maps.MouseEvent) => {\r\n this.mapClicked(mouseEvent.latLng, false);\r\n });\r\n\r\n //const mouseMoveListener = this.map.addListener(\"mousemove\", (mouseEvent: google.maps.MouseEvent) => {\r\n // this.lastMouseLatLng = mouseEvent.latLng;\r\n // this.debouncedMapMouseMove();\r\n //});\r\n\r\n this.mapEventListeners.push(mapTypeListener);\r\n this.mapEventListeners.push(idleListener);\r\n this.mapEventListeners.push(clickListener);\r\n this.mapEventListeners.push(rightClickListener);\r\n this.mapEventListeners.push(zoomListener);\r\n //this.mapEventListeners.push(mouseMoveListener);\r\n }\r\n\r\n onMouseMove(mousePosition: google.maps.LatLng, event: Event): boolean {\r\n\r\n var closestOverlayMatch: GeofenceOverlay = null;\r\n var closestOverlayMatchDistance = 0;\r\n\r\n for (var i = 0; i < this.geofenceOverlays.length; i++) {\r\n const overlay = this.geofenceOverlays[i];\r\n\r\n if (!overlay || !overlay.overlay || !overlay.visible) {\r\n continue;\r\n }\r\n\r\n // Reset hover status\r\n overlay.setHover(false);\r\n\r\n // Note this works on a square so isnt 100% accurate for polygons and edges of circles\r\n if (overlay.bounds.contains(mousePosition) && this.geofenceService.pointIsInsideGeofence(mousePosition, overlay.geofence)) {\r\n\r\n if (!this.userOptions.GeofenceLabelWhenZoomedOut.Value) {\r\n overlay.setGeofenceClass(true);\r\n }\r\n\r\n var distanceFromPointToGeofence = google.maps.geometry.spherical.computeDistanceBetween(mousePosition, overlay.geofence.MapCoords);\r\n\r\n if (closestOverlayMatch == null || distanceFromPointToGeofence < closestOverlayMatchDistance) {\r\n\r\n closestOverlayMatch = overlay;\r\n }\r\n }\r\n }\r\n\r\n if (closestOverlayMatch) {\r\n this.highlightGeofenceOverlay(closestOverlayMatch);\r\n }\r\n else if (!this.selectedGeofence) {\r\n this.veriMap.hidePopup(MapPopupType.Geofence, false);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n // -------------------------------------------------\r\n\r\n private highlightGeofenceOverlay(overlay: GeofenceOverlay, event?: google.maps.MouseEvent): void {\r\n\r\n if (!overlay.visible) {\r\n return;\r\n }\r\n\r\n // hides geofence popup in geofences tab\r\n if (this.onlyRightClick || this.hideGeofencePopup) {\r\n this.veriMap.hidePopup(MapPopupType.Geofence, true);\r\n\r\n return;\r\n\r\n }\r\n else {\r\n overlay.setHover(true);\r\n\r\n const ne = overlay.bounds.getNorthEast();\r\n const center = overlay.bounds.getCenter();\r\n const latLng = new google.maps.LatLng(ne.lat(), center.lng());\r\n\r\n this.veriMap.showPopup(MapPopupType.Geofence, latLng, overlay.geofence, this.hidePopupControls);\r\n }\r\n\r\n this.$scope.$apply();\r\n }\r\n\r\n private loadGeofences(invalidateCache = false) {\r\n this.loadingGeofences = true;\r\n\r\n return this.geofenceService\r\n .getGeofences({ includeTags: true, invalidateCache })\r\n .then((geofences) => {\r\n this.loadingGeofences = false;\r\n this.geofences = geofences;\r\n this.geofences = this.addNonexistentUnsavedSelectedGeofence(this.geofences, this.selectedGeofence);\r\n\r\n this.createGeofencesOverlays();\r\n this.createGeofenceZones();\r\n\r\n return this.geofences;\r\n })\r\n .finally(() => {\r\n this.loadingGeofences = false;\r\n });\r\n }\r\n\r\n private addNonexistentUnsavedSelectedGeofence(geofences: IGeofence[] = [], selectedGeofence: IGeofence): IGeofence[] {\r\n // this method allows us to display a preview of a geofence that is being created but not saved (doesn't exist)\r\n if (!selectedGeofence || selectedGeofence?.Id !== -1) {\r\n return geofences;\r\n }\r\n\r\n return [...geofences, { ...selectedGeofence, Description: `New Geofence` }];\r\n }\r\n\r\n private createGeofencesOverlays() {\r\n if (!this.userOptions.Geofences?.Value) {\r\n return;\r\n }\r\n\r\n const standardGeofences = this.geofences.filter(category => category?.Category === GeofenceCategory.Standard);\r\n\r\n this.destroyOverlays();\r\n\r\n this.geofenceOverlays = this.geofenceService.createGeofenceOverlays(this.map, standardGeofences, this.userOptions.GeofenceLabelWhenZoomedOut.Value/*, true*/);\r\n this.toggleGeofences(this.map.getBounds());\r\n }\r\n\r\n private createGeofenceZones(): void {\r\n this.removeDisplayZones();\r\n\r\n const zoneGeofences = this.geofences.filter(geofence => geofence.Category === GeofenceCategory.Zone);\r\n\r\n let shownZones: IGeofence[] = [];\r\n\r\n if (this.userOptions.ShowZones?.Value) {\r\n shownZones.push(...zoneGeofences.filter(geofence => geofence.AccountId != null));\r\n }\r\n \r\n if (this.userOptions.ViewSystemGeofences?.Value) {\r\n shownZones.push(...zoneGeofences.filter(geofence => geofence.AccountId == null));\r\n }\r\n\r\n shownZones.forEach(zone => {\r\n if (zone?.GeofenceType !== GeofenceType.Polygon) {\r\n return;\r\n }\r\n\r\n const polygons = this.geofenceService.createPolygonGroupForGeofence(zone);\r\n this.zonePolygonGroups.push({\r\n geofence: zone,\r\n polygons: polygons\r\n });\r\n\r\n polygons.forEach(polygon => {\r\n polygon.setMap(this.map);\r\n });\r\n });\r\n\r\n this.processZoneVisibility(this.map?.getBounds());\r\n }\r\n\r\n private removeDisplayZones(): void {\r\n this.zonePolygonGroups?.forEach(zonePolygonGroup => zonePolygonGroup?.polygons?.forEach(zonePolygon => zonePolygon.setMap(null)));\r\n this.zonePolygonGroups = [];\r\n }\r\n\r\n private processZoneVisibility(mapBounds: google.maps.LatLngBounds): void {\r\n const currentMapZoomLevel = this.map?.getZoom();\r\n const minimumVisibilityZoomLevel = 6;\r\n\r\n const maxZoomLevel = 10;\r\n const minZoomLevel = 5;\r\n\r\n const maxZoomOpacity = 0;\r\n const minZoomOpacity = 0.2;\r\n\r\n const maxZoomLevels = maxZoomLevel - minZoomLevel;\r\n const maxZoomOpacityChange = maxZoomOpacity - minZoomOpacity;\r\n\r\n const opacityChangePerZoomLevel = maxZoomOpacityChange / maxZoomLevels;\r\n\r\n let opacity = minZoomOpacity;\r\n\r\n if (currentMapZoomLevel > minZoomLevel) {\r\n opacity += opacityChangePerZoomLevel * (currentMapZoomLevel - minZoomLevel);\r\n opacity = Math.min(Math.max(opacity, 0), 100);\r\n }\r\n\r\n this.zonePolygonGroups?.forEach(zonePolygonGroup => {\r\n const isSelectedGeofence = this.selectedGeofence?.Id === zonePolygonGroup?.geofence?.Id;\r\n\r\n zonePolygonGroup?.polygons?.forEach(zonePolygon => {\r\n if (currentMapZoomLevel >= minimumVisibilityZoomLevel) {\r\n zonePolygon?.setOptions({\r\n strokeOpacity: 0.3,\r\n strokeColor: \"rgb(0, 0, 0)\",\r\n strokeWeight: 1,\r\n fillColor: \"rgb(0, 0, 0)\",\r\n fillOpacity: isSelectedGeofence ? 0.1 : opacity,\r\n clickable: false,\r\n draggable: false\r\n });\r\n }\r\n });\r\n });\r\n }\r\n\r\n private toggleViewportGeofences() {\r\n\r\n if (!this.map) {\r\n return;\r\n }\r\n\r\n const bounds = this.map.getBounds();\r\n\r\n if (this.previousBounds != null && this.previousBounds === bounds) {\r\n // If our viewport hasnt changed don't re-render\r\n return;\r\n }\r\n\r\n this.toggleGeofences(bounds);\r\n this.processZoneVisibility(bounds);\r\n }\r\n\r\n private toggleGeofences(bounds: google.maps.LatLngBounds) {\r\n if (this.loadingGeofences) {\r\n return;\r\n }\r\n\r\n this.previousBounds = bounds;\r\n const zoomLevel = this.map.getZoom();\r\n const visibleForZoomLevel = zoomLevel > 10;\r\n\r\n // This allows for lazy loading\r\n if (visibleForZoomLevel && !this.geofences) {\r\n this.loadGeofences();\r\n\r\n return;\r\n }\r\n\r\n for (let i = 0; i < this.geofenceOverlays.length; i++) {\r\n const overlay = this.geofenceOverlays[i];\r\n\r\n if (!overlay || !overlay.geofence) {\r\n continue;\r\n }\r\n\r\n if (this.hideGeofence && this.hideGeofence.Id === overlay.geofence.Id) {\r\n overlay.hideElement();\r\n overlay.setHover(false);\r\n continue;\r\n }\r\n\r\n if (visibleForZoomLevel && !overlay.geofence.HideFromMap && bounds.intersects(overlay.bounds)) {\r\n\r\n overlay.showElement();\r\n overlay.setHover(false);\r\n\r\n if (this.selectedGeofence && this.selectedGeofence.Id === overlay.geofence.Id) {\r\n this.$timeout(() => {\r\n this.highlightGeofenceOverlay(overlay);\r\n }, 250);\r\n }\r\n }\r\n else {\r\n overlay.hideElement();\r\n }\r\n\r\n if (this.onlyShowSelectedGeofence && this.selectedGeofence && overlay.geofence.Id != this.selectedGeofence.Id) {\r\n overlay.hideElement();\r\n overlay.setHover(false);\r\n }\r\n }\r\n }\r\n\r\n private mapClicked(latLng: google.maps.LatLng, leftClick = true) {\r\n if (!this.geofenceClicked) {\r\n return;\r\n }\r\n\r\n for (let i = 0; i < this.geofenceOverlays.length; i++) {\r\n const overlay = this.geofenceOverlays[i];\r\n\r\n if (overlay && overlay.bounds.contains(latLng)) {\r\n this.geofenceClicked({ geofence: overlay.geofence, leftClick: leftClick });\r\n break;\r\n }\r\n }\r\n }\r\n\r\n private destroyOverlays() {\r\n this.geofenceOverlays.forEach((overlay) => {\r\n overlay.hideElement();\r\n overlay.setHover(false);\r\n\r\n if (overlay && overlay.overlay) {\r\n overlay.overlay.setMap(null);\r\n }\r\n });\r\n }\r\n\r\n private openGeofenceEditor(geofence?: IGeofence, position: google.maps.LatLng = null, resource: IVehicle | IPlot = null) {\r\n position = (position) ? position : new google.maps.LatLng(geofence?.Latitude, geofence?.Longitude);\r\n\r\n let options: IShowGeofenceEditorOptions = {\r\n focusedLatLngs: position,\r\n resource: resource,\r\n onGeofenceEditorCancelled: () => { this.onGeofenceEditorCancelled(); },\r\n onGeofenceEditorSaved: (savedGeofence: IGeofence) => { this.onGeofenceEditorSaved(savedGeofence); },\r\n onGeofenceEditorDeleted: (deletedGeofence: IGeofence) => { this.onGeofenceEditorDeleted(deletedGeofence); }\r\n };\r\n\r\n this.geofenceService.showGeofenceEditor(geofence, null, options);\r\n }\r\n\r\n private onGeofenceEditorCancelled(): void { }\r\n\r\n private onGeofenceEditorSaved(savedGeofence: IGeofence): void {\r\n this.loadGeofences(true);\r\n }\r\n\r\n private onGeofenceEditorDeleted(deletedGeofence: IGeofence): void {\r\n this.loadGeofences(true);\r\n }\r\n}\r\n\r\nexport class GeofencesComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n require: { [index: string]: string; };\r\n\r\n constructor() {\r\n this.bindings = {\r\n hidePopupControls: \"<\",\r\n hideGeofence: \"<\",\r\n showZones: \" traffic {{'veriMap.traffic' | translate}} aspect_ratio {{'veriMap.fullScreen' | translate}} bug_report {{'veriMap.zoomTest' | translate}}
visibility_off {{'veriMap.hideResource' | translate}}
visibility {{'veriMap.showResource' | translate}}
0\\\" layout=row layout-align=\\\"center center\\\"> visibility_off {{'veriMap.hideMarkers' | translate : $ctrl.ignitionOffCount}}
0\\\" layout=row layout-align=\\\"center center\\\"> visibility {{'veriMap.showMarkers' | translate : $ctrl.ignitionOffCount}}
visibility_off {{'veriMap.noMarkers' | translate}}
{{'veriMap.vehiclesUtilised' | translate}}
{{'veriMap.vehiclesNotUtilised' | translate}}
{{$ctrl.popupModel.DescriptionExt}}
{{$ctrl.popupModel.Addr1}}
{{$ctrl.popupModel.Addr2}}
{{$ctrl.popupModel.Addr3}}
{{$ctrl.popupModel.Addr4}}
{{'veriMap.editGeofence' | translate}} {{'veriMap.viewVisits' | translate}}
\";","\r\nimport * as angular from \"angular\";\r\nimport { IDeleteVertexParams } from \"@interfaces/IDeleteVertexParams\";\r\nimport { IGeofence } from \"@interfaces/IGeofences\";\r\nimport { GeofenceService } from \"@services/geofence.service\";\r\nimport { IOnChangesObject } from \"angular\";\r\nimport { GeofenceType } from \"@enums/GeofenceType\";\r\nimport \"../geofenceOverlay.scss\";\r\nimport \"./geofenceShape.component.scss\";\r\nimport { GoogleMarkerService } from \"@services/googleMarker.service\";\r\nimport { IVeriMapComponent } from \"@directives/_map/veriMap/veriMapComponent/veriMap.component\";\r\n\r\nexport class GeofenceShapeComponentController implements angular.IComponentController {\r\n\r\n // bindings\r\n geofence: IGeofence;\r\n geofenceType: GeofenceType;\r\n editable: boolean = false;\r\n ignoreMaxSize: boolean = false;\r\n\r\n onChange: ({ ignoringMaxSize: boolean }) => void;\r\n\r\n veriMap: IVeriMapComponent;\r\n map: google.maps.Map;\r\n\r\n geofenceVisual: google.maps.Circle | google.maps.Polygon;\r\n\r\n // size restrictions\r\n maxRadius: number = 2000;\r\n maxDiameter: number;\r\n minRadius: number;\r\n minDiameter: number;\r\n minPolygonArea: number;\r\n maxPolygonArea: number;\r\n\r\n static $inject = [\"$scope\", \"geofenceService\"];\r\n\r\n constructor(\r\n private readonly $scope: angular.IScope,\r\n private readonly geofenceService: GeofenceService) {\r\n }\r\n\r\n $onInit() {\r\n this.prepareMaximumSize();\r\n\r\n this.veriMap.mapInitialisedPromise.then(map => {\r\n this.map = map;\r\n this.createGeofenceVisual();\r\n });\r\n }\r\n\r\n $onChanges(onChangesObj: IOnChangesObject): void {\r\n if (!this.veriMap.mapInitialised) {\r\n return;\r\n }\r\n\r\n if (this.geofence) {\r\n this.geofenceType = Number(this.geofenceType);\r\n }\r\n\r\n if (onChangesObj[\"removeMaxSize\"]) {\r\n this.prepareMaximumSize();\r\n }\r\n\r\n if (onChangesObj[\"geofenceType\"] || onChangesObj[\"geofence\"]) {\r\n if (this.geofence) {\r\n this.geofence.GeofenceType = this.geofenceType;\r\n this.createGeofenceVisual();\r\n }\r\n }\r\n\r\n if (this.geofence && !this.geofence.Addr1) {\r\n this.geofenceService.setGeofenceAddressFromPosition(this.geofence);\r\n }\r\n }\r\n\r\n $onDestroy() {\r\n this.geofenceService.destroyGeofence(this.geofenceVisual);\r\n }\r\n\r\n private prepareMaximumSize(): void {\r\n this.maxRadius = (this.ignoreMaxSize) ? 99999 : 2000;\r\n this.maxDiameter = this.maxRadius * 2;\r\n this.minRadius = 50;\r\n this.minDiameter = this.minRadius; // CJE Changed at customer request to be half of what it used to be - Seb implemented\r\n this.minPolygonArea = this.minDiameter * this.minDiameter;\r\n this.maxPolygonArea = this.maxDiameter * this.maxDiameter;\r\n }\r\n\r\n private createGeofenceVisual() {\r\n this.geofenceService.removeDeleteVertexButtonFromPolygon();\r\n this.geofenceService.destroyGeofence(this.geofenceVisual);\r\n\r\n if (!this.geofence) {\r\n return;\r\n }\r\n\r\n if (this.geofence.GeofenceType == GeofenceType.Circle) {\r\n if (!this.geofence.Radius) {\r\n this.geofence.Radius = 100;\r\n }\r\n\r\n const circle = new google.maps.Circle({\r\n map: this.map,\r\n radius: this.geofence.Radius,\r\n center: new google.maps.LatLng(this.geofence.Latitude, this.geofence.Longitude)\r\n });\r\n\r\n this.geofenceVisual = circle;\r\n\r\n // Always make sure we have corresponding polygon points\r\n if (!this.geofence.Points?.length) {\r\n this.createBasicSquarePolygon(circle.getBounds());\r\n }\r\n }\r\n else {\r\n var path: google.maps.LatLng[] = [];\r\n\r\n this.geofence?.Points?.forEach(p => {\r\n path.push(new google.maps.LatLng(p[0], p[1]));\r\n });\r\n\r\n const polygon = new google.maps.Polygon({\r\n map: this.map,\r\n paths: path\r\n });\r\n\r\n this.geofenceVisual = polygon;\r\n }\r\n\r\n this.geofenceVisual.setOptions((this.editable) ? this.geofenceService.selectedGeofenceColors : this.geofenceService.defaultGeofenceColors);\r\n this.setGeofenceEditable(true);\r\n\r\n this.geofenceChanged();\r\n\r\n if (!this.geofenceVisual.getMap()) {\r\n this.geofenceVisual.setMap(this.veriMap.getMap());\r\n }\r\n }\r\n\r\n private createBasicSquarePolygon(bounds: google.maps.LatLngBounds) {\r\n this.geofence.Points = [];\r\n const latlngs = this.getPolygonFromBoundingBox(bounds);\r\n\r\n latlngs.forEach(latlng => {\r\n this.geofence.Points.push([latlng.lat(), latlng.lng()]);\r\n });\r\n }\r\n\r\n private geofenceChanged() {\r\n if (this.onChange) {\r\n this.onChange({ ignoringMaxSize: this.ignoreMaxSize });\r\n }\r\n }\r\n\r\n private getPolygonFromBoundingBox(bounds: google.maps.LatLngBounds) {\r\n const ne = bounds.getNorthEast();\r\n const sw = bounds.getSouthWest();\r\n const se = new google.maps.LatLng(sw.lat(), ne.lng());\r\n const nw = new google.maps.LatLng(ne.lat(), sw.lng());\r\n\r\n return [ne, se, sw, nw];\r\n }\r\n\r\n private polygonUpdated() {\r\n this.updateGeofenceModelFromVisual();\r\n this.geofenceService.setPolygonGeofenceVisualCenter(this.geofence);\r\n }\r\n\r\n private updateGeofenceModelFromVisual() {\r\n if (this.geofence.GeofenceType == GeofenceType.Circle) {\r\n\r\n this.syncGeofenceTypes();\r\n\r\n var circle = this.geofenceVisual as google.maps.Circle;\r\n var circleCenter = circle.getCenter();\r\n\r\n this.geofence.Latitude = circleCenter.lat();\r\n this.geofence.Longitude = circleCenter.lng();\r\n this.geofence.Radius = circle.getRadius();\r\n }\r\n else {\r\n this.geofence.Points = [];\r\n var polygon = this.geofenceVisual as google.maps.Polygon;\r\n var pathArray: google.maps.LatLng[] = polygon.getPath().getArray();\r\n\r\n pathArray.forEach(p => {\r\n this.geofence.Points.push([p.lat(), p.lng()]);\r\n });\r\n\r\n this.syncGeofenceTypes();\r\n }\r\n }\r\n\r\n private setGeofenceEditable(setting: boolean) {\r\n const editable = setting && this.editable;\r\n this.geofenceVisual.setDraggable(editable);\r\n this.geofenceVisual.setEditable(editable);\r\n this.geofenceVisual.setOptions({ clickable: editable });\r\n\r\n if (!editable) {\r\n return;\r\n }\r\n\r\n google.maps.event.addListener(this.geofenceVisual, \"radius_changed\", () => {\r\n this.updateGeofenceModelFromVisual();\r\n this.geofenceChanged();\r\n this.$scope.$apply();\r\n });\r\n\r\n google.maps.event.addListener(this.geofenceVisual, \"center_changed\", () => {\r\n this.updateGeofenceModelFromVisual();\r\n this.geofenceChanged();\r\n this.$scope.$apply();\r\n });\r\n\r\n // On drag end address will be updated\r\n google.maps.event.addListener(this.geofenceVisual, \"dragend\", () => {\r\n this.updateGeofenceModelFromVisual();\r\n this.geofenceService.setGeofenceAddressFromPosition(this.geofence);\r\n this.geofenceChanged();\r\n this.$scope.$apply();\r\n });\r\n\r\n if (this.geofence.GeofenceType === GeofenceType.Polygon) {\r\n const poly = this.geofenceVisual as google.maps.Polygon;\r\n const deleteVertexParams: IDeleteVertexParams = { polygon: poly, geofence: this.geofence };\r\n this.geofenceService.addDeleteVertexButtonToPolygon(deleteVertexParams);\r\n\r\n const path = poly.getPath();\r\n\r\n google.maps.event.addListener(path, \"set_at\", (index: number) => {\r\n this.polygonUpdated();\r\n this.geofenceChanged();\r\n this.$scope.$apply();\r\n });\r\n google.maps.event.addListener(path, \"insert_at\", (index: number) => {\r\n this.polygonUpdated();\r\n this.geofenceChanged();\r\n this.$scope.$apply();\r\n });\r\n }\r\n }\r\n\r\n private syncGeofenceTypes() {\r\n if (!this.geofence || !this.geofenceVisual) {\r\n return;\r\n }\r\n\r\n if (this.geofence.GeofenceType == GeofenceType.Circle) {\r\n\r\n if (this.geofence.Points) {\r\n let circleVisual = this.geofenceVisual as google.maps.Circle;\r\n if (!circleVisual || !circleVisual.getBounds) {\r\n this.createGeofenceVisual();\r\n circleVisual = this.geofenceVisual as google.maps.Circle;\r\n }\r\n // move points by the same amount as the circle was moved\r\n const circleCenter = circleVisual.getCenter();\r\n\r\n var differenceLat = circleCenter.lat() - this.geofence.Latitude;\r\n var differenceLng = circleCenter.lng() - this.geofence.Longitude;\r\n\r\n this.geofence.Points.forEach(p => {\r\n p[0] += differenceLat;\r\n p[1] += differenceLng;\r\n });\r\n }\r\n else {\r\n this.createGeofenceVisual();\r\n }\r\n }\r\n else {\r\n this.geofenceService.setPolygonGeofenceVisualCenter(this.geofence);\r\n }\r\n }\r\n}\r\n\r\nexport class GeofenceShapeComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n require: { [index: string]: string; };\r\n\r\n constructor() {\r\n this.bindings = {\r\n geofence: \"<\",\r\n geofenceType: \"<\",\r\n editable: \" {\r\n this.clearExistingMarker();\r\n });\r\n\r\n this.marker.addListener('rightclick', () => {\r\n this.clearExistingMarker();\r\n });\r\n }\r\n }\r\n\r\n private clearExistingMarker() {\r\n if (this.marker) {\r\n this.marker.setMap(null);\r\n\r\n this.marker = null;\r\n }\r\n }\r\n\r\n private initSearchBox(map: google.maps.Map, $element: angular.IAugmentedJQuery) {\r\n var position = this.veriMap.showControlsOnRight ? google.maps.ControlPosition.TOP_RIGHT : google.maps.ControlPosition.TOP_LEFT;\r\n map.controls[position].push($element[0]);\r\n }\r\n}\r\n\r\nexport class VeriMapControlsComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n transclude: { [slot: string]: string } | boolean;\r\n require: { [index: string]: string; };\r\n\r\n constructor() {\r\n this.bindings = {\r\n includeVehicleSearch: \"<\",\r\n showSearch: \"<\",\r\n hideFitMap: \"<\",\r\n\r\n fitMap: \"&\"\r\n };\r\n\r\n this.require = {\r\n veriMap: \"^veriMap\"\r\n };\r\n\r\n this.transclude = true;\r\n this.controller = ComponentController;\r\n this.template = require(\"./mapControls.html\");\r\n }\r\n}\r\n","module.exports = \"
search
crop_free {{'mapControls.fitMap' | translate}} \";","import { IVeriMapComponent } from \"@directives/_map/veriMap/veriMapComponent/veriMap.component\";\r\nimport { IGoogleMapsMarker } from \"@interfaces/IGoogleMapsMarkerOptions\";\r\nimport { ColourService } from \"@services/colour.service\";\r\nimport { GoogleMarkerService } from \"@services/googleMarker.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { VeriMarkerService } from \"@services/veriMarker.service\";\r\nimport { IPolyline, IPolylineOptions } from \"@typings/google.maps.angular\";\r\nimport * as angular from \"angular\";\r\nimport { IRouteStop } from \"../../../../main/components/planning/interfaces/IRouteStop\";\r\nimport { IRouteResult } from \"../../../../main/components/planning/routePlanner/routePlanner.component\";\r\n\r\ninterface IVeriMapAlternativeRoutesBindings {\r\n\r\n veriMap: IVeriMapComponent;\r\n\r\n routes: IRouteResult[];\r\n selectedRoute: IRouteResult;\r\n fit: boolean;\r\n}\r\n\r\nclass VeriMapAlternativeRoutesComponentController implements angular.IComponentController, IVeriMapAlternativeRoutesBindings {\r\n veriMap: IVeriMapComponent;\r\n\r\n routes: IRouteResult[];\r\n selectedRoute: IRouteResult;\r\n\r\n polylines: IPolyline[] = [];\r\n markers: IGoogleMapsMarker[] = [];\r\n fit: boolean;\r\n\r\n static $inject = [\"colourService\", \"veriMarkerService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly colourService: ColourService,\r\n private readonly veriMarkerService: VeriMarkerService,\r\n private readonly googleMarkerService: GoogleMarkerService,\r\n private readonly translationService: TranslationService) {\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n\r\n if (!this.veriMap.mapInitialised) {\r\n return;\r\n }\r\n\r\n if (onChangesObj[\"routes\"]) {\r\n this.updateRouteDisplay();\r\n }\r\n\r\n if (onChangesObj[\"selectedRoute\"]) {\r\n this.updateRouteDisplay();\r\n }\r\n }\r\n\r\n $onInit(): void {\r\n this.veriMap.mapInitialisedPromise.then(map => {\r\n this.updateRouteDisplay();\r\n this.fitMap();\r\n });\r\n }\r\n\r\n updateRouteDisplay() {\r\n this.polylines = [];\r\n\r\n if (this.routes) {\r\n this.routes.forEach((route, index) => {\r\n\r\n const polyline = this.createRoutePolyline(route, index - 1);\r\n\r\n if (polyline) {\r\n this.polylines.push(polyline);\r\n\r\n //let offRoadPoly: IPolyline;\r\n\r\n //if (index === 0) {\r\n // offRoadPoly = this.createRouteStopOffRoadPolyline(routeStop, polyline, true);\r\n // this.polylines.push(offRoadPoly);\r\n //}\r\n\r\n //offRoadPoly = this.createRouteStopOffRoadPolyline(routeStop, polyline);\r\n //this.polylines.push(offRoadPoly);\r\n }\r\n });\r\n }\r\n\r\n this.updateMarkerIcons();\r\n }\r\n\r\n private updateMarkerIcons() {\r\n this.markers = [];\r\n\r\n if (!this.polylines || this.polylines.length < 1) {\r\n return;\r\n }\r\n\r\n const path = this.polylines[0].path;\r\n\r\n const start = path[0];\r\n\r\n const endIndex = path.length - 1;\r\n const end = path[endIndex];\r\n\r\n this.markers.push(\r\n {\r\n id: 1,\r\n options: this.googleMarkerService.createEventMarkerOptions({ label: this.translationService.t(\"veriMapAlternativeRoutes.start\"), markerClass: \"marker-event-start\", subIcon: \"play_arrow\", showLabel: true, position: this.getLatLngLiteral(start) }),\r\n model: start\r\n } as any,\r\n {\r\n id: 2,\r\n options: this.googleMarkerService.createEventMarkerOptions({ label: this.translationService.t(\"veriMapAlternativeRoutes.end\"), markerClass: \"marker-event-end\", subIcon: \"stop\", showLabel: true, position: this.getLatLngLiteral(end) }),\r\n model: start\r\n } as any\r\n );\r\n }\r\n\r\n private getLatLngLiteral(latLng: google.maps.LatLng): google.maps.LatLngLiteral {\r\n\r\n return { lat: latLng.lat(), lng: latLng.lng() };\r\n }\r\n\r\n private createRoutePolyline(route: IRouteResult, index: number): IPolyline {\r\n\r\n if (!route) {\r\n return null;\r\n }\r\n\r\n const latlngs: google.maps.LatLng[] = [];\r\n route.legs.forEach((leg, i) => {\r\n leg.steps.forEach(step => {\r\n step.path.forEach(latlng => {\r\n latlngs.push(latlng);\r\n });\r\n });\r\n });\r\n\r\n let opacity = 1;\r\n let weight = 4;\r\n\r\n if (this.selectedRoute && this.selectedRoute.summary !== route.summary) {\r\n opacity = 0.5;\r\n weight = 3;\r\n }\r\n\r\n const polylineOptions: IPolylineOptions = {\r\n stroke: {\r\n color: this.colourService.getColour(index, true).solidColour,\r\n weight: weight,\r\n opacity: opacity,\r\n }\r\n }\r\n\r\n const polyline: IPolyline = {\r\n id: this.polylines.length,\r\n path: latlngs,\r\n options: polylineOptions,\r\n data: route\r\n };\r\n\r\n return polyline;\r\n }\r\n\r\n private fitMap() {\r\n if (this.fit === false || (this.polylines.length === 0 && this.markers.length === 0)) {\r\n return;\r\n }\r\n\r\n if (this.polylines.length > 0) {\r\n let latLngs: google.maps.LatLng[] = [];\r\n\r\n this.polylines.forEach(line => {\r\n latLngs = latLngs.concat(line.path);\r\n });\r\n\r\n this.veriMap.fitMap(latLngs);\r\n }\r\n else {\r\n console.warn(\"Unable to fit map for veriMapRoute\");\r\n }\r\n }\r\n}\r\n\r\nexport class VeriMapAlternativeRoutesComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n require: { [index: string]: string; };\r\n\r\n constructor() {\r\n this.bindings = {\r\n routes: \"<\",\r\n selectedRoute: \"<\",\r\n fit: \"<\"\r\n };\r\n\r\n this.require = {\r\n veriMap: \"^veriMap\"\r\n };\r\n\r\n this.controller = VeriMapAlternativeRoutesComponentController;\r\n this.template = require(\"./veriMapAlternativeRoutes.html\");\r\n }\r\n}\r\n","module.exports = \" 0\\\" ng-repeat=\\\"polyline in $ctrl.polylines\\\" path=polyline.path stroke=polyline.options.stroke clickable=false icons=polyline.options.icons events=polyline.options.events static=true chunk=false> 0\\\" [models]=$ctrl.markers> \";","import { IGoogleMapsMarker } from \"@app/interfaces/IGoogleMapsMarkerOptions\";\r\nimport { IJourney } from \"@app/interfaces/IJourney\";\r\nimport { IPlot } from \"@app/interfaces/IPlot\";\r\nimport * as angular from \"angular\";\r\nimport { IVeriMapComponent } from \"../veriMapComponent/veriMap.component\";\r\nimport './veriMapContainer.component.scss';\r\n\r\nclass VeriMapContainerComponentController implements angular.IComponentController {\r\n locationMarker: IGoogleMapsMarker;\r\n plots: IPlot[];\r\n journeys: IJourney[];\r\n hideGeofences: boolean;\r\n selectedPlot: IPlot;\r\n veriMap: IVeriMapComponent;\r\n mapCenter: any;\r\n\r\n static $inject = [\"$scope\"];\r\n\r\n constructor(private readonly $scope: angular.IScope) {\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n this.$scope.$applyAsync();\r\n }\r\n\r\n mapIdle(veriMap: IVeriMapComponent): void {\r\n this.veriMap = veriMap;\r\n }\r\n}\r\n\r\nexport class VeriMapContainerComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n require: { [index: string]: string; };\r\n constructor() {\r\n this.bindings = {\r\n hideGeofences: '<',\r\n journeys: '<',\r\n plots: '<',\r\n selectedPlot: '<',\r\n locationMarker: '<'\r\n };\r\n this.controller = VeriMapContainerComponentController;\r\n this.template = require(\"./veriMapContainer.component.html\");\r\n }\r\n}\r\n","module.exports = \" 0\\\" selected-plot=$ctrl.selectedPlot> \";","import { IVeriMapComponent } from \"@directives/_map/veriMap/veriMapComponent/veriMap.component\";\r\nimport { IPlot } from \"@interfaces/IPlot\";\r\nimport { GoogleMarkerService } from \"@services/googleMarker.service\";\r\nimport { VeriMarkerService } from \"@services/veriMarker.service\";\r\nimport * as angular from \"angular\";\r\nimport copy from \"fast-copy/dist/fast-copy.esm.js\";\r\n\r\ninterface IVeriMapPlotBindings {\r\n\r\n veriMap: IVeriMapComponent;\r\n\r\n plot: IPlot;\r\n fit: boolean;\r\n}\r\n\r\nclass VeriMapPlotComponentController implements angular.IComponentController, IVeriMapPlotBindings {\r\n veriMap: IVeriMapComponent;\r\n\r\n plot: IPlot;\r\n displayPlot: IPlot;\r\n fit: boolean;\r\n\r\n static $inject = [\"veriMarkerService\", \"googleMarkerService\"];\r\n\r\n constructor(\r\n private readonly veriMarkerService: VeriMarkerService,\r\n private readonly googleMarkerService: GoogleMarkerService) {\r\n }\r\n\r\n $onInit() { }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n\r\n if (onChangesObj[\"plot\"]) {\r\n this.veriMap.mapInitialisedPromise.then(() => {\r\n this.updateDisplayPlot();\r\n });\r\n }\r\n }\r\n\r\n // ---------------------\r\n\r\n private updateDisplayPlot() {\r\n const options = this.veriMarkerService.createVeriMarkerOptions(this.plot);\r\n\r\n this.googleMarkerService.generateMarkerOptions(this.plot, options).then(options => {\r\n this.displayPlot = copy(this.plot);\r\n this.displayPlot.markerModel.options = options;\r\n this.fitMap(this.veriMap.getMap());\r\n });\r\n }\r\n\r\n private fitMap(map: google.maps.Map) {\r\n if (map == null || !this.fit) {\r\n return;\r\n }\r\n\r\n map.setZoom(12);\r\n map.setCenter({ lat: this.plot.Latitude, lng: this.plot.Longitude });\r\n }\r\n}\r\n\r\nexport class VeriMapPlotComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n require: { [index: string]: string; };\r\n\r\n constructor() {\r\n this.bindings = {\r\n plot: \"<\",\r\n fit: \"<\"\r\n };\r\n\r\n this.require = {\r\n veriMap: \"^veriMap\"\r\n };\r\n\r\n this.controller = VeriMapPlotComponentController;\r\n this.template = require(\"./veriMapPlot.html\");\r\n }\r\n}\r\n","module.exports = \" \";","\r\nimport { IVeriMapChildComponent, IVeriMapComponent } from \"@directives/_map/veriMap/veriMapComponent/veriMap.component\";\r\nimport { IPlot } from \"@interfaces/IPlot\";\r\nimport { GoogleMarkerService } from \"@services/googleMarker.service\";\r\nimport { JourneyService } from \"@services/journey.service\";\r\nimport { MapService } from \"@services/map.service\";\r\nimport { PlotService } from \"@services/plot.service\";\r\nimport { VeriMarkerService } from \"@services/veriMarker.service\";\r\nimport { IMarkerOptions, IPolyline } from \"@typings/google.maps.angular\";\r\nimport * as angular from \"angular\";\r\nimport copy from \"fast-copy/dist/fast-copy.esm.js\";\r\nimport \"./veriMapPlotHistory.html\";\r\n\r\ninterface IVeriMapPlotHistoryBindings {\r\n\r\n veriMap: IVeriMapComponent;\r\n\r\n plots: IPlot[];\r\n polylinePlots: IPlot[];\r\n hideSimilarPlots: boolean;\r\n fit: boolean;\r\n\r\n highlightedPlot: IPlot;\r\n lastHighlightedPlot: IPlot;\r\n selectedPlot: IPlot;\r\n\r\n onPlotHighlighted: (plot: { $plot: IPlot }) => void;\r\n onPlotLeave: (plot: { $plot: IPlot }) => void;\r\n onPlotSelected: (plot: { $plot: IPlot }) => void;\r\n}\r\n\r\nclass VeriMapPlotHistoryComponentController implements angular.IComponentController, IVeriMapPlotHistoryBindings, IVeriMapChildComponent {\r\n veriMap: IVeriMapComponent;\r\n\r\n plots: IPlot[];\r\n polylinePlots: IPlot[];\r\n displayPlots: IPlot[];\r\n hideSimilarPlots: boolean;\r\n fit: boolean;\r\n highlightedPlot: IPlot;\r\n lastHighlightedPlot: IPlot;\r\n selectedPlot: IPlot;\r\n\r\n onPlotHighlighted: (plot: { $plot: IPlot }) => void;\r\n onPlotLeave: (plot: { $plot: IPlot }) => void;\r\n onPlotSelected: (plot: { $plot: IPlot }) => void;\r\n\r\n plotPolyline: IPolyline;\r\n\r\n idleListener: google.maps.MapsEventListener;\r\n\r\n markerOptions: IMarkerOptions = {\r\n events: {\r\n click: (markerObj: google.maps.Marker, eventName: string, plot: IPlot/*, args: any[]*/) => {\r\n this.setSelectedPlot(plot);\r\n },\r\n mouseover: (markerObj: google.maps.Marker, eventName: string, plot: IPlot/*, args: any[]*/) => {\r\n if (plot.markerModel?.options.isPip) {\r\n this.veriMarkerService.createVeriMarkerOptions(plot);\r\n this.googleMarkerService.generateMarkerOptions(plot, plot.veriMarkerOptions).then(options => {\r\n plot.markerModel.options = options;\r\n });\r\n }\r\n\r\n this.setHighlightedPlot(plot);\r\n },\r\n mouseout: (markerObj: google.maps.Marker, eventName: string, plot: IPlot) => {\r\n this.setHighlightedPlot(plot, false);\r\n }\r\n },\r\n control: {}\r\n };\r\n\r\n static $inject = [\"plotService\", \"journeyService\", \"veriMarkerService\", \"googleMarkerService\", \"mapService\"];\r\n\r\n constructor(\r\n private readonly plotService: PlotService,\r\n private readonly journeyService: JourneyService,\r\n private readonly veriMarkerService: VeriMarkerService,\r\n private readonly googleMarkerService: GoogleMarkerService,\r\n private readonly mapService: MapService) {\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n\r\n if (onChangesObj[\"plots\"]) {\r\n\r\n if (!onChangesObj[\"polylinePlots\"] && this.polylinePlots === undefined) {\r\n this.polylinePlots = this.plots;\r\n }\r\n\r\n this.setSelectedPlot(null);\r\n this.setHighlightedPlot(null);\r\n\r\n if (this.veriMap.getMap()) {\r\n this.hidePlotsBasedOnZoomLevel();\r\n this.fitMap();\r\n }\r\n }\r\n\r\n if (onChangesObj[\"selectedPlot\"]) {\r\n if (this.veriMap.getMap()) {\r\n this.hidePlotsBasedOnZoomLevel();\r\n }\r\n }\r\n\r\n if (onChangesObj[\"plots\"] || onChangesObj[\"polylinePlots\"]) {\r\n this.createPolyline();\r\n }\r\n }\r\n\r\n $onInit(): void {\r\n this.veriMap.mapInitialisedPromise\r\n .then(map => {\r\n this.fitMap();\r\n\r\n this.idleListener = this.veriMap.getMap().addListener(\"idle\", () => {\r\n this.hidePlotsBasedOnZoomLevel();\r\n });\r\n })\r\n .catch(e => {\r\n console.error(\"mapReady error\", e);\r\n });\r\n\r\n this.veriMap.registerChildComponent(this);\r\n }\r\n\r\n $onDestroy(): void {\r\n this.veriMap.deregisterChildComponent(this);\r\n this.idleListener.remove();\r\n }\r\n\r\n getLatLngsForFitMap(): google.maps.LatLng[] {\r\n\r\n const latLngs: google.maps.LatLng[] = [];\r\n\r\n if (!this.plots) {\r\n return latLngs;\r\n }\r\n\r\n this.plots.forEach(plot => {\r\n latLngs.push(new google.maps.LatLng(plot.Latitude, plot.Longitude));\r\n });\r\n\r\n return latLngs;\r\n }\r\n\r\n private setSelectedPlot(plot: IPlot) {\r\n this.selectedPlot = plot;\r\n\r\n this.setHighlightedPlot(plot);\r\n\r\n if (this.onPlotSelected) {\r\n this.onPlotSelected({ $plot: plot });\r\n }\r\n }\r\n\r\n private setHighlightedPlot(plot: IPlot, highlight: boolean = true) {\r\n if (highlight) {\r\n this.highlightedPlot = plot;\r\n\r\n if (this.onPlotHighlighted) {\r\n this.onPlotHighlighted({ $plot: plot });\r\n }\r\n }\r\n else {\r\n this.highlightedPlot = this.lastHighlightedPlot;\r\n this.lastHighlightedPlot = plot;\r\n\r\n if (this.onPlotLeave) {\r\n this.onPlotLeave({ $plot: plot });\r\n }\r\n }\r\n }\r\n\r\n private hidePlotsBasedOnZoomLevel() {\r\n //this.displayPlots = this.plots;\r\n //this.displayPlots = this.plotService.simplifyPlots(this.displayPlots, this.selectedPlot, 0.00001);\r\n this.plotService.getVisisblePlotsBasedOnZoomLevel(this.displayPlots, this.veriMap.getMap(), this.selectedPlot).then(displayPlots => {\r\n this.displayPlots = displayPlots;\r\n\r\n if (this.selectedPlot && this.displayPlots) {\r\n this.displayPlots.forEach((plot, i) => {\r\n if (plot.Id === this.selectedPlot.Id) {\r\n this.displayPlots[i] = copy(plot);\r\n }\r\n });\r\n }\r\n });\r\n\r\n //console.log(this.displayPlots.length, simplifiedPlots.length);\r\n\r\n // COmmented by CJE 27/06/2019 - unsure if needed\r\n\r\n }\r\n\r\n private createPolyline() {\r\n const journeyEvents = {\r\n mouseover: (p: google.maps.Polyline, eventName: string, model: any, args: any[]) => {\r\n var mouseEvent: google.maps.MouseEvent = args[0];\r\n }\r\n };\r\n\r\n const latLngArray = this.mapService.convertPlotsToGoogleLatLng(this.polylinePlots);\r\n this.plotPolyline = this.mapService.createPolyline(1, latLngArray, null, journeyEvents);\r\n }\r\n\r\n private fitMap() {\r\n if (!this.fit) {\r\n return;\r\n }\r\n\r\n const latLngs = this.getLatLngsForFitMap();\r\n\r\n this.veriMap.fitMap(latLngs);\r\n }\r\n}\r\n\r\nexport class VeriMapPlotHistoryComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n require: { [index: string]: string; };\r\n\r\n constructor() {\r\n this.bindings = {\r\n plots: \"<\",\r\n polylinePlots: \"<\",\r\n fit: \"<\",\r\n highlightedPlot: \"<\",\r\n selectedPlot: \"<\",\r\n\r\n onPlotHighlighted: \"&\",\r\n onPlotSelected: \"&\",\r\n onPlotLeave: \"&\"\r\n };\r\n\r\n this.require = {\r\n veriMap: \"^veriMap\"\r\n };\r\n\r\n this.controller = VeriMapPlotHistoryComponentController;\r\n this.template = require(\"./veriMapPlotHistory.html\");\r\n }\r\n}\r\n","\r\nimport * as angular from \"angular\";\r\n\r\nimport { MapService } from \"@services/map.service\";\r\n\r\nimport \"./veriMapPopup.scss\";\r\nimport { IVeriMapComponent } from \"@directives/_map/veriMap/veriMapComponent/veriMap.component\";\r\n\r\ninterface IVeriMapPopupBindings {\r\n\r\n veriMap: IVeriMapComponent;\r\n\r\n show: boolean;\r\n position: google.maps.LatLng;\r\n}\r\n\r\nclass VeriMapPopupComponentController implements angular.IComponentController, IVeriMapPopupBindings {\r\n veriMap: IVeriMapComponent;\r\n\r\n show = false;\r\n showPopup = false;\r\n\r\n position: google.maps.LatLng;\r\n point: google.maps.Point;\r\n showFromBottom = false;\r\n\r\n popupHideTimeout: angular.IPromise;\r\n\r\n static $inject = [\"$element\", \"$timeout\", \"mapService\"];\r\n\r\n constructor(\r\n private $element: JQLite,\r\n private $timeout: angular.ITimeoutService,\r\n private mapService: MapService) {\r\n }\r\n\r\n $onInit(): void {\r\n //console.warn(this.$element[0], this.$element[0].offsetHeight, this.$element[0].clientHeight); \r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n if (onChangesObj[\"position\"]) {\r\n if (this.position) {\r\n var map = this.veriMap.getMap();\r\n if (!map) {\r\n console.warn(\"VeriMapPopup - no map!\");\r\n\r\n this.show = false;\r\n this.showHidePopup();\r\n\r\n return;\r\n }\r\n\r\n // We do this to ensure we have the correct height\r\n this.$timeout(() => {\r\n this.setPopupPosition(map);\r\n });\r\n }\r\n }\r\n\r\n if (onChangesObj[\"show\"]) {\r\n this.showHidePopup();\r\n } \r\n }\r\n\r\n // ---------------------\r\n\r\n private setPopupPosition(map: google.maps.Map) {\r\n if (!this.position) {\r\n console.error(\"No posistion set when showing map\");\r\n this.showPopup = false;\r\n return;\r\n }\r\n\r\n this.point = this.mapService.convertLatLngToPoint(this.position, map);\r\n\r\n var popupHeight = this.$element[0].clientHeight;\r\n var popupWidth = this.$element[0].clientWidth;\r\n var mapWidth = this.veriMap.getMap().getDiv().clientWidth;\r\n\r\n var popupIsTooHigh = this.point.y < popupHeight;\r\n var isOnLeftSide = this.point.x * 2 < mapWidth;\r\n var isAtExtremes = this.point.x < popupWidth / 2 || this.point.x > mapWidth - (popupWidth / 2);\r\n\r\n //this.showFromBottom = this.point.y < 300;\r\n\r\n //this.$element.removeClass(\"top-arrow\");\r\n this.$element.removeClass(\"bottom-arrow\");\r\n this.$element.removeClass(\"right-top-arrow\");\r\n this.$element.removeClass(\"left-top-arrow\");\r\n\r\n if (popupIsTooHigh || isAtExtremes) {\r\n this.point.y += popupHeight;\r\n\r\n if (isOnLeftSide) {\r\n this.point.x += popupWidth / 2;\r\n this.point.x += 20;\r\n this.$element.addClass(\"left-top-arrow\");\r\n }\r\n else {\r\n this.point.x -= popupWidth / 2;\r\n this.point.x -= 20;\r\n this.$element.addClass(\"right-top-arrow\");\r\n }\r\n }\r\n else {\r\n this.$element.addClass(\"bottom-arrow\");\r\n }\r\n\r\n this.$element[0].style[\"top\"] = `${this.point.y}px`;\r\n this.$element[0].style[\"left\"] = `${this.point.x}px`; \r\n }\r\n\r\n private showHidePopup() {\r\n\r\n if (this.popupHideTimeout) {\r\n this.$timeout.cancel(this.popupHideTimeout);\r\n }\r\n\r\n if (this.show) {\r\n\r\n this.popupHideTimeout = this.$timeout(() => {\r\n this.showPopup = true;\r\n this.$element.addClass(\"show\");\r\n }, 300);\r\n }\r\n else {\r\n this.popupHideTimeout = this.$timeout(() => {\r\n this.showPopup = false;\r\n this.popupHideTimeout = null;\r\n\r\n this.$element.removeClass(\"show\");\r\n }, 500);\r\n }\r\n }\r\n}\r\n\r\nexport class VeriMapPopupComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n require: { [index: string]: string; };\r\n transclude: boolean;\r\n\r\n constructor() {\r\n this.bindings = {\r\n show: \"<\",\r\n position: \"<\"\r\n };\r\n\r\n this.require = {\r\n veriMap: \"^veriMap\"\r\n };\r\n\r\n this.transclude = true;\r\n\r\n this.controller = VeriMapPopupComponentController;\r\n this.template = require(\"./veriMapPopup.html\");\r\n }\r\n}\r\n","module.exports = \" \";","\r\nimport { IVeriMapComponent } from \"@directives/_map/veriMap/veriMapComponent/veriMap.component\";\r\nimport { IGoogleMapsMarker } from \"@interfaces/IGoogleMapsMarkerOptions\";\r\nimport * as angular from \"angular\";\r\nimport { IPolyline, IPolylineOptions } from \"@typings/google.maps.angular\";\r\nimport { IPlannedRouteVisit } from \"../../../../main/modules/tms/_models/IPlannedRouteVisit\";\r\nimport { IPlannedRoute } from \"src/app/main/modules/tms/_models/IPlannedRoute\";\r\nimport { IUnplannedStop } from \"src/app/main/modules/tms/_models/IUnplannedStop\";\r\nimport { SchedulingService } from \"src/app/main/modules/tms/_services/scheduling.service\";\r\nimport { PlannedRouteMapService } from \"src/app/main/modules/tms/_services/planned-route-map.service\";\r\nimport { IJourney } from \"@interfaces/IJourney\";\r\n\r\ninterface IVeriMapRouteBindings {\r\n\r\n veriMap: IVeriMapComponent;\r\n\r\n route: IPlannedRoute;\r\n scheduleMode?: boolean;\r\n unplannedStops: IUnplannedStop[];\r\n selectedVisit: IPlannedRouteVisit;\r\n markers: IGoogleMapsMarker[];\r\n\r\n fit: boolean;\r\n}\r\n\r\nclass VeriMapRouteComponentController implements angular.IComponentController, IVeriMapRouteBindings {\r\n\r\n veriMap: IVeriMapComponent;\r\n\r\n route: IPlannedRoute;\r\n scheduleMode: boolean;\r\n actualJourneys: IJourney[];\r\n unplannedStops: IUnplannedStop[];\r\n selectedVisit: IPlannedRouteVisit;\r\n routeVisits: IPlannedRouteVisit[];\r\n\r\n markers: IGoogleMapsMarker[] = [];\r\n\r\n showPlannedRoute: boolean;\r\n showActualRoute: boolean;\r\n showUnplannedStops: boolean;\r\n\r\n fit: boolean;\r\n\r\n polylines: IPolyline[] = [];\r\n\r\n static $inject = [\"schedulingService\", \"plannedRouteMapService\"];\r\n\r\n constructor(\r\n private readonly schedulingService: SchedulingService,\r\n private readonly plannedRouteMapService: PlannedRouteMapService) {\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n\r\n if (!this.veriMap.mapInitialised) {\r\n return;\r\n }\r\n \r\n if (onChangesObj[\"route\"] && this.route) {\r\n this.updatePlannedVisits(this.route);\r\n this.updateRouteDisplay();\r\n this.fitMap();\r\n }\r\n\r\n if (onChangesObj[\"unplannedStops\"] || onChangesObj[\"showUnplannedStops\"]) {\r\n this.updateMarkerIcons();\r\n }\r\n\r\n if (onChangesObj[\"markers\"] && this.markers) {\r\n this.fitMap();\r\n }\r\n\r\n if (onChangesObj[\"selectedStop\"]) {\r\n this.fitMap();\r\n }\r\n }\r\n\r\n $onInit(): void {\r\n this.veriMap.mapInitialisedPromise.then(map => {\r\n this.updateRouteDisplay();\r\n this.fitMap();\r\n });\r\n }\r\n\r\n updateRouteDisplay() {\r\n //\r\n this.polylines = [];\r\n if (this.routeVisits) {\r\n\r\n this.routeVisits.forEach((routeStop, index) => {\r\n\r\n const polyline = this.createVisitPolyline(routeStop, index);\r\n\r\n if (polyline) {\r\n this.polylines.push(polyline);\r\n }\r\n });\r\n\r\n this.updateMarkerIcons();\r\n }\r\n }\r\n private updatePlannedVisits(route: IPlannedRoute): void {\r\n if (!route) {\r\n this.routeVisits = null;\r\n return;\r\n }\r\n\r\n this.routeVisits = route.PlannedVisits;\r\n }\r\n\r\n private createVisitPolyline(routeVisit: IPlannedRouteVisit, index: number): IPolyline {\r\n if (!routeVisit.LinePoints || routeVisit.LinePoints.length === 0) {\r\n const previousStop = this.routeVisits[index - 1];\r\n\r\n if (!previousStop) {\r\n return null;\r\n }\r\n }\r\n\r\n\r\n return this.schedulingService.createPolylineForVisit(routeVisit, index);\r\n }\r\n\r\n createPolyline(routeVisit: IPlannedRouteVisit): IPolyline {\r\n\r\n const latLngArray: google.maps.LatLng[] = [];\r\n\r\n routeVisit.LinePoints.forEach(x => {\r\n latLngArray.push(new google.maps.LatLng(x[0], x[1]));\r\n });\r\n\r\n const polylineOptions: IPolylineOptions = {\r\n stroke: {\r\n color: \"#000000\",\r\n weight: 4,\r\n opacity: 1\r\n }\r\n }\r\n \r\n const polyline: IPolyline = {\r\n id: this.polylines.length,\r\n path: latLngArray,\r\n options: polylineOptions,\r\n data: routeVisit\r\n };\r\n\r\n return polyline;\r\n }\r\n\r\n private updateMarkerIcons() {\r\n this.markers = [];\r\n\r\n if (!this.routeVisits) {\r\n return;\r\n }\r\n \r\n const options = {\r\n showEveryStop: this.route.PlannedVisits?.length <= 10,\r\n showUnplannedStops: this.showUnplannedStops,\r\n showPlannedStops: true,\r\n bypassStatus: this.scheduleMode,\r\n route: this.route,\r\n unplannedStops: this.unplannedStops\r\n };\r\n\r\n this.markers = this.plannedRouteMapService.createMapMarkersForRoute(options);\r\n }\r\n\r\n private getRouteStopCoords(visit: IPlannedRouteVisit): google.maps.LatLngLiteral {\r\n\r\n if (visit.RouteStopLocationJson) {\r\n const routeStopLocation = JSON.parse(visit.RouteStopLocationJson);\r\n return {\r\n lat: routeStopLocation.Latitude,\r\n lng: routeStopLocation.Longitude\r\n }\r\n }\r\n else if (visit.GeocodedAddress) {\r\n return {\r\n lat: visit.GeocodedAddress.CenterPoint.Latitude,\r\n lng: visit.GeocodedAddress.CenterPoint.Longitude\r\n }\r\n }\r\n else if (visit.Geofence) {\r\n return {\r\n lat: visit.Geofence.Latitude,\r\n lng: visit.Geofence.Longitude\r\n }\r\n }\r\n }\r\n\r\n private fitMap() {\r\n if (this.fit === false || (this.polylines.length === 0 && this.markers.length === 0)) {\r\n return;\r\n }\r\n\r\n if (this.selectedVisit) {\r\n const coords = this.getRouteStopCoords(this.selectedVisit);\r\n\r\n this.veriMap.fitMap([new google.maps.LatLng(coords)]);\r\n this.veriMap.getMap().setZoom(12);\r\n }\r\n else if (this.polylines.length > 0) {\r\n let latLngs: google.maps.LatLng[] = [];\r\n\r\n this.polylines.forEach(line => {\r\n latLngs = latLngs.concat(line.path);\r\n });\r\n\r\n this.veriMap.fitMap(latLngs);\r\n }\r\n else {\r\n\r\n this.veriMap.fitMap(this.markers.map(m => new google.maps.LatLng(m.options.position)));\r\n }\r\n }\r\n}\r\n\r\nexport class VeriMapRouteComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n require: { [index: string]: string; };\r\n\r\n constructor() {\r\n this.bindings = {\r\n route: \"<\",\r\n actualJourneys: \" 0\\\" [polylines]=$ctrl.polylines> 0\\\" [models]=$ctrl.markers [events]=$ctrl.markerEvents> \";","\r\nimport * as angular from \"angular\";\r\nimport { IVeriMapComponent } from \"@directives/_map/veriMap/veriMapComponent/veriMap.component\";\r\nimport { IGoogleMapsMarker } from \"@interfaces/IGoogleMapsMarkerOptions\";\r\nimport { ColourService } from \"@services/colour.service\";\r\nimport { JourneyService } from \"@services/journey.service\";\r\nimport { IMarkerEvents, IPolyline, IPolylineOptions } from \"@typings/google.maps.angular\";\r\nimport { IRouteStop } from \"@components/planning/interfaces/IRouteStop\";\r\nimport { PlannedRouteMapService } from \"@tms/_services/planned-route-map.service\";\r\n\r\ninterface IVeriMapRouteBindings {\r\n\r\n veriMap: IVeriMapComponent;\r\n\r\n routeStops: IRouteStop[];\r\n selectedStop: IRouteStop;\r\n markers: IGoogleMapsMarker[];\r\n\r\n onMarkerUpdate(args: { $marker: IGoogleMapsMarker });\r\n\r\n fit: boolean;\r\n readOnly: boolean;\r\n}\r\n\r\nclass VeriMapRouteOldComponentController implements angular.IComponentController, IVeriMapRouteBindings {\r\n\r\n markerEvents: IMarkerEvents> = {\r\n dragend: (markerObj, eventName: string, marker: IGoogleMapsMarker) => {\r\n if (this.onMarkerUpdate) {\r\n //console.log(\"onmarkerupdate\", marker);\r\n\r\n marker.options.position = { lat: markerObj.getPosition().lat(), lng: markerObj.getPosition().lng() };\r\n\r\n this.onMarkerUpdate({ $marker: marker });\r\n }\r\n }\r\n }\r\n\r\n veriMap: IVeriMapComponent;\r\n\r\n routeStops: IRouteStop[];\r\n selectedStop: IRouteStop;\r\n\r\n markers: IGoogleMapsMarker[] = [];\r\n\r\n onMarkerUpdate: (args: { $marker: IGoogleMapsMarker }) => void;\r\n\r\n fit: boolean;\r\n readOnly: boolean;\r\n\r\n polylines: IPolyline[] = [];\r\n\r\n static $inject = [\"journeyService\", \"plannedRouteMapService\", \"colourService\"];\r\n\r\n constructor(\r\n private readonly journeyService: JourneyService,\r\n private readonly plannedRouteMapService: PlannedRouteMapService,\r\n private readonly colourService: ColourService) {\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n\r\n if (!this.veriMap.mapInitialised) {\r\n return;\r\n }\r\n\r\n if (onChangesObj[\"routeStops\"]/* && this.routeStops*/) {\r\n //var fitMap = !onChangesObj[\"job\"].previousValue || onChangesObj[\"job\"].previousValue.Id != onChangesObj[\"job\"].currentValue.Id;\r\n\r\n this.updateRouteDisplay();\r\n this.fitMap();\r\n }\r\n\r\n if (onChangesObj[\"markers\"] && this.markers) {\r\n this.fitMap();\r\n }\r\n\r\n if (onChangesObj[\"selectedStop\"]) {\r\n this.fitMap();\r\n }\r\n }\r\n\r\n $onInit(): void {\r\n this.veriMap.mapInitialisedPromise.then(map => {\r\n this.updateRouteDisplay();\r\n this.fitMap();\r\n });\r\n }\r\n\r\n updateRouteDisplay() {\r\n this.polylines = [];\r\n\r\n if (this.routeStops) {\r\n this.routeStops.forEach((routeStop, index) => {\r\n\r\n const polyline = this.createRoutePolyline(routeStop, index);\r\n\r\n if (polyline) {\r\n this.polylines.push(polyline);\r\n\r\n let offRoadPoly: IPolyline;\r\n\r\n //if (index === 0) {\r\n // offRoadPoly = this.createRouteStopOffRoadPolyline(routeStop, polyline, true);\r\n // this.polylines.push(offRoadPoly);\r\n //}\r\n\r\n offRoadPoly = this.createRouteStopOffRoadPolyline(routeStop, polyline);\r\n this.polylines.push(offRoadPoly);\r\n }\r\n });\r\n }\r\n\r\n this.updateMarkerIcons();\r\n }\r\n\r\n private createRoutePolyline(routeStop: IRouteStop, index: number): IPolyline {\r\n\r\n const latLngArray: google.maps.LatLng[] = [];\r\n\r\n if (!routeStop.LinePoints || routeStop.LinePoints.length === 0) {\r\n //console.error(\"No line points for RouteStop\", routeStop);\r\n //return null;\r\n if (index != 0) {\r\n const routeStopPosition = this.getRouteStopCoords(routeStop);\r\n const nextStopPosition = this.getRouteStopCoords(this.routeStops[index + 1]);\r\n\r\n routeStop.LinePoints = [\r\n [routeStopPosition.lat, routeStopPosition.lng],\r\n [nextStopPosition.lat, nextStopPosition.lng]\r\n ];\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n\r\n routeStop.LinePoints.forEach(x => {\r\n latLngArray.push(new google.maps.LatLng(x[0], x[1]));\r\n });\r\n\r\n //console.log(\"createRoutePolyline\", routeStop, routeStop.LinePoints);\r\n\r\n const polylineOptions: IPolylineOptions = {\r\n stroke: {\r\n color: this.colourService.getColour(index, true).solidColour,\r\n weight: 4,\r\n opacity: 1//0.9,\r\n //events: events // - fill this in later when we have start and end points\r\n }\r\n }\r\n\r\n const polyline: IPolyline = {\r\n id: this.polylines.length,\r\n path: latLngArray,\r\n options: polylineOptions,\r\n data: routeStop\r\n };\r\n\r\n return polyline;\r\n }\r\n\r\n private createRouteStopOffRoadPolyline(routeStop: IRouteStop, basePolyline: IPolyline, isStartPoint = false): IPolyline {\r\n // This createa a dashed line from the road to the stop, if the stop isnt at that point, \r\n // it helps to indicate that its off road\r\n\r\n const latLngArray: google.maps.LatLng[] = [];\r\n\r\n if (isStartPoint) {\r\n latLngArray.push(basePolyline.path[0]);\r\n }\r\n else {\r\n latLngArray.push(basePolyline.path[basePolyline.path.length - 1]);\r\n }\r\n\r\n if (routeStop.Geofence) {\r\n latLngArray.push(new google.maps.LatLng(routeStop.Geofence.Latitude, routeStop.Geofence.Longitude));\r\n }\r\n else if (routeStop.GeocodedAddress) {\r\n latLngArray.push(new google.maps.LatLng(routeStop.GeocodedAddress.CenterPoint.Latitude, routeStop.GeocodedAddress.CenterPoint.Longitude));\r\n }\r\n\r\n const options = angular.copy(basePolyline.options);\r\n options.stroke.opacity = 0;\r\n options.icons = [\r\n {\r\n icon: {\r\n path: \"M 0,-1 0,1\",\r\n strokeOpacity: 1,\r\n scale: 2,\r\n strokeWeight: 2\r\n },\r\n offset: \"0\",\r\n repeat: \"10px\"\r\n }\r\n ];\r\n\r\n const polyline: IPolyline = {\r\n id: this.polylines.length,\r\n path: latLngArray,\r\n options: options,\r\n data: routeStop\r\n };\r\n\r\n return polyline;\r\n }\r\n\r\n private updateMarkerIcons() {\r\n this.markers = [];\r\n\r\n if (!this.routeStops) {\r\n return;\r\n }\r\n\r\n this.routeStops.forEach((routeStop, index, visibleWaypoints) => {\r\n\r\n const markerOptions = this.plannedRouteMapService.createRouteMarkerOptions(routeStop, index, visibleWaypoints.length);\r\n\r\n markerOptions.draggable = !this.readOnly;\r\n\r\n markerOptions.position = this.getRouteStopCoords(routeStop);\r\n\r\n this.markers.push({\r\n id: index,\r\n options: markerOptions,\r\n model: routeStop\r\n });\r\n });\r\n }\r\n\r\n private getRouteStopCoords(stop: IRouteStop): google.maps.LatLngLiteral {\r\n\r\n if (stop.GeocodedAddress) {\r\n return {\r\n lat: stop.GeocodedAddress.CenterPoint.Latitude,\r\n lng: stop.GeocodedAddress.CenterPoint.Longitude\r\n }\r\n }\r\n else if (stop.Geofence) {\r\n return {\r\n lat: stop.Geofence.Latitude,\r\n lng: stop.Geofence.Longitude\r\n }\r\n }\r\n }\r\n\r\n private fitMap() {\r\n if (this.fit === false || (this.polylines.length === 0 && this.markers.length === 0)) {\r\n return;\r\n }\r\n\r\n if (this.selectedStop) {\r\n const coords = this.getRouteStopCoords(this.selectedStop);\r\n\r\n this.veriMap.fitMap([new google.maps.LatLng(coords)]);\r\n this.veriMap.getMap().setZoom(12);\r\n }\r\n else if (this.polylines.length > 0) {\r\n let latLngs: google.maps.LatLng[] = [];\r\n\r\n this.polylines.forEach(line => {\r\n latLngs = latLngs.concat(line.path);\r\n });\r\n\r\n this.veriMap.fitMap(latLngs);\r\n }\r\n else {\r\n\r\n this.veriMap.fitMap(this.markers.map(m => new google.maps.LatLng(m.options.position)));\r\n }\r\n }\r\n}\r\n\r\nexport class VeriMapRouteOldComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n require: { [index: string]: string; };\r\n\r\n constructor() {\r\n this.bindings = {\r\n routeStops: \"<\",\r\n onMarkerUpdate: \"&\",\r\n readOnly: \" 0\\\" [polylines]=$ctrl.polylines> 0\\\" [models]=$ctrl.markers [events]=$ctrl.markerEvents> \";","import * as angular from \"angular\";\r\nimport \"./veriMapSingleGeofence.scss\";\r\n\r\nimport { GeofenceService } from \"@services/geofence.service\";\r\nimport { IGeofence } from \"@interfaces/IGeofences\";\r\nimport { IVeriMapComponent } from \"@directives/_map/veriMap/veriMapComponent/veriMap.component\";\r\n\r\nclass VeriMapSingleGeofenceComponentController implements angular.IComponentController {\r\n veriMap: IVeriMapComponent;\r\n geofence: IGeofence;\r\n geofences: IGeofence[] = [];\r\n\r\n static $inject = [\"geofenceService\"];\r\n\r\n constructor(\r\n private readonly geofenceService: GeofenceService\r\n ) { }\r\n\r\n $onInit() {\r\n this.fitmap();\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n if (onChangesObj[\"geofence\"]) {\r\n this.fitmap();\r\n }\r\n }\r\n\r\n $onDestroy() {\r\n this.mapUnloaded();\r\n }\r\n\r\n mapLoaded(veriMap: IVeriMapComponent) {\r\n this.veriMap = veriMap;\r\n this.fitmap();\r\n }\r\n\r\n mapUnloaded() {\r\n this.veriMap = null;\r\n }\r\n\r\n private fitmap() {\r\n this.geofenceService.fitMapToGeofences(this.veriMap, this.geofence, this.geofences);\r\n }\r\n\r\n}\r\n\r\nexport class VeriMapSingleGeofenceComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n transclude: { [slot: string]: string };\r\n\r\n constructor() {\r\n this.bindings = {\r\n geofences: \"<\",\r\n geofence: \"<\"\r\n };\r\n\r\n this.controller = VeriMapSingleGeofenceComponentController;\r\n this.template = require(\"./veriMapSingleGeofence.html\");\r\n }\r\n}\r\n","module.exports = \"
\";","import { IVeriMapChildComponent, IVeriMapComponent } from \"@directives/_map/veriMap/veriMapComponent/veriMap.component\";\r\nimport { IGoogleMapsMarker } from \"@interfaces/IGoogleMapsMarkerOptions\";\r\nimport { IPlot, IPlotEvent } from \"@interfaces/IPlot\";\r\nimport { GoogleMarkerService } from \"@services/googleMarker.service\";\r\nimport { MapService } from \"@services/map.service\";\r\nimport { PlotService } from \"@services/plot.service\";\r\nimport { VeriMarkerService } from \"@services/veriMarker.service\";\r\nimport { IMarkerEvents, IMarkerOptions, IPolyline } from \"@typings/google.maps.angular\";\r\nimport { IRouteStop } from \"src/app/main/components/planning/interfaces/IRouteStop\";\r\nimport { ITmsReplayResult } from \"src/app/main/components/planning/interfaces/ITmsReplayResult\";\r\nimport { IPlannedRouteAudit } from \"../../../../main/components/planning/interfaces/IPlannedRouteAudit\";\r\nimport { OldTmsService } from \"../../../../main/components/planning/tmsService\";\r\n\r\n\r\ninterface IComponentBindings {\r\n routeStops: IRouteStop[];\r\n routeReplay: ITmsReplayResult;\r\n plots: IPlot[];\r\n fit: boolean;\r\n\r\n selectedAudit: IPlannedRouteAudit;\r\n\r\n veriMap: IVeriMapComponent;\r\n\r\n onAuditSelected(args: { audit: IPlannedRouteAudit, plot: IPlot, $event: MouseEvent });\r\n}\r\n\r\nclass ComponentController implements angular.IComponentController, IComponentBindings, IVeriMapChildComponent {\r\n routeStops: IRouteStop[];\r\n routeReplay: ITmsReplayResult;\r\n plots: IPlot[];\r\n fit: boolean;\r\n\r\n highlightedPlot: IPlot;\r\n selectedAudit: IPlannedRouteAudit;\r\n\r\n veriMap: IVeriMapComponent;\r\n\r\n onAuditSelected: (args: { audit: IPlannedRouteAudit, plot: IPlot, $event: MouseEvent }) => void;\r\n\r\n mapPlots: IPlot[];\r\n polylines: IPolyline[] = [];\r\n\r\n latLngsToFitTo: google.maps.LatLng[] = [];\r\n\r\n eventMarkerOptions: IMarkerOptions = {\r\n events: {},\r\n control: {},\r\n type: \"cluster\",\r\n typeOptions: {\r\n imagePath: \"https://rawgit.com/googlemaps/js-marker-clusterer/gh-pages/images/m\",\r\n maxZoom: 13,\r\n gridSize: 40 // default 60\r\n },\r\n typeEvents: {}\r\n };\r\n\r\n plotMarkerEvents: IMarkerEvents = {\r\n click: (markerObj, eventName: string, plot: IPlot, mouseEvent: MouseEvent) => {\r\n var matchingAudit = this.routeReplay.Audits.find(a => a.Update.PlotId === plot.Id)[0];\r\n\r\n if (this.onAuditSelected) {\r\n this.onAuditSelected({ audit: matchingAudit, plot: plot, $event: mouseEvent });\r\n }\r\n },\r\n mouseover: (markerObj, eventName: string, plot: IPlot, mouseEvent: MouseEvent) => {\r\n this.setHighlightedPlot(plot);\r\n }\r\n }\r\n\r\n polylineEvents = {\r\n mouseover: (p: google.maps.Polyline, eventName: string, model: any, args: any[]) => {\r\n var mouseEvent: google.maps.MouseEvent = args[0];\r\n this.polylineMouseOverEvent(mouseEvent.latLng);\r\n }\r\n };\r\n\r\n static $inject = [\"tmsService\", \"plotService\", \"mapService\", \"veriMarkerService\", \"googleMarkerService\"];\r\n constructor(\r\n private readonly tmsService: OldTmsService,\r\n private readonly plotService: PlotService,\r\n private readonly mapService: MapService,\r\n private readonly veriMarkerService: VeriMarkerService,\r\n private readonly googleMarkerService: GoogleMarkerService) {\r\n }\r\n\r\n $onInit(): void {\r\n this.veriMap.mapInitialisedPromise\r\n .then(map => {\r\n this.fitMap();\r\n })\r\n .catch(e => {\r\n console.error(\"onInit error\", e);\r\n });\r\n\r\n this.veriMap.registerChildComponent(this);\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject): void {\r\n\r\n if (onChangesObj[\"plots\"] || onChangesObj[\"audits\"]) {\r\n //this.createMapPlots().then((mapPlots) => {\r\n // this.mapPlots = mapPlots;\r\n //});\r\n this.createPolylines();\r\n this.hidePlotsBasedOnZoomLevel();\r\n\r\n this.fitMap();\r\n }\r\n\r\n if (onChangesObj[\"routeStops\"]) {\r\n this.updateMarkerIcons();\r\n }\r\n\r\n if (onChangesObj[\"selectedAudit\"] && this.selectedAudit) {\r\n const matchingPlot = this.plots.find(p => p.Id === this.selectedAudit.PlotId);\r\n\r\n if (matchingPlot) {\r\n this.setHighlightedPlot(matchingPlot);\r\n }\r\n }\r\n }\r\n\r\n getLatLngsForFitMap(): google.maps.LatLng[] {\r\n\r\n //if (this.selectedPlot) {\r\n // return [new google.maps.LatLng(this.selectedPlot.Latitude, this.selectedPlot.Longitude)];\r\n //}\r\n\r\n return this.mapService.convertPlotsToGoogleLatLng(this.plots);\r\n }\r\n\r\n\r\n onMapIdle(): void {\r\n this.hidePlotsBasedOnZoomLevel();\r\n }\r\n\r\n stopsMarkers: IGoogleMapsMarker[] = [];\r\n\r\n private updateMarkerIcons() {\r\n this.stopsMarkers = [];\r\n\r\n if (!this.routeStops) {\r\n return;\r\n }\r\n\r\n this.routeStops.forEach((routeStop, index, visibleWaypoints) => {\r\n\r\n const markerOptions = this.tmsService.createRouteMarkerOptions(routeStop, index, visibleWaypoints.length);\r\n\r\n markerOptions.draggable = false;\r\n\r\n markerOptions.position = this.getRouteStopCoords(routeStop);\r\n\r\n this.stopsMarkers.push({\r\n id: index,\r\n options: markerOptions,\r\n model: routeStop\r\n });\r\n });\r\n }\r\n\r\n private getRouteStopCoords(stop: IRouteStop): google.maps.LatLngLiteral {\r\n if (stop.GeocodedAddress) {\r\n return {\r\n lat: stop.GeocodedAddress.CenterPoint.Latitude,\r\n lng: stop.GeocodedAddress.CenterPoint.Longitude\r\n }\r\n }\r\n else if (stop.Geofence) {\r\n return {\r\n lat: stop.Geofence.Latitude,\r\n lng: stop.Geofence.Longitude\r\n }\r\n }\r\n }\r\n\r\n private hidePlotsBasedOnZoomLevel() {\r\n if (!this.plots) {\r\n this.mapPlots = [];\r\n return;\r\n }\r\n\r\n var plotsWithAudit: IPlot[] = [];\r\n\r\n if (this.routeReplay.Audits) {\r\n this.routeReplay.Audits.forEach(audit => {\r\n plotsWithAudit.push(this.plots.find(p => p.Id === audit.PlotId));\r\n });\r\n } else {\r\n plotsWithAudit = this.plots;\r\n }\r\n\r\n //this.displayPlots = this.plotService.simplifyPlots(this.displayPlots, this.selectedPlot || this.highlightedPlot, 0.00001);\r\n this.plotService.getVisisblePlotsBasedOnZoomLevel(plotsWithAudit, this.veriMap.getMap()).then(displayPlots => {\r\n this.mapPlots = displayPlots;\r\n });\r\n }\r\n\r\n\r\n private fitMap() {\r\n const latLngs = this.getLatLngsForFitMap();\r\n this.veriMap.fitMap(latLngs);\r\n }\r\n\r\n private polylineMouseOverEvent(latLng: google.maps.LatLng) {\r\n\r\n const closestPlot = this.plotService.findPlotClosestToLatLng(this.plots, latLng);\r\n\r\n this.setHighlightedPlot(closestPlot);\r\n this.highlightPloyline();\r\n }\r\n\r\n private getPolylineId(): number {\r\n return Math.floor(Math.random() * 100) + 1;\r\n }\r\n\r\n private createPolylines() {\r\n this.polylines = [];\r\n\r\n this.polylines.push(this.mapService.createPolyline(this.getPolylineId(), this.mapService.convertPlotsToGoogleLatLng(this.plots), \"#27ae60\", this.polylineEvents));\r\n }\r\n\r\n private highlightPloyline() {\r\n if (!this.highlightedPlot) {\r\n return;\r\n }\r\n\r\n this.polylines = [];\r\n const primaryPlots: IPlot[] = [];\r\n const secondaryPlots: IPlot[] = [];\r\n\r\n for (let i = 0; i < this.plots.length; i++) {\r\n const plot = this.plots[i];\r\n\r\n if (this.highlightedPlot.Id < plot.Id) {\r\n primaryPlots.push(plot);\r\n }\r\n else if (this.highlightedPlot.Id === plot.Id) {\r\n primaryPlots.push(plot);\r\n secondaryPlots.push(plot);\r\n }\r\n else {\r\n secondaryPlots.push(plot);\r\n }\r\n }\r\n\r\n if (primaryPlots.length > 0) {\r\n this.polylines.push(this.mapService.createPolyline(this.getPolylineId(), this.mapService.convertPlotsToGoogleLatLng(primaryPlots), \"#696969\", this.polylineEvents));\r\n }\r\n\r\n if (secondaryPlots.length > 0) {\r\n this.polylines.push(this.mapService.createPolyline(this.getPolylineId(), this.mapService.convertPlotsToGoogleLatLng(secondaryPlots), \"#27ae60\", this.polylineEvents));\r\n }\r\n }\r\n\r\n private setHighlightedPlot(plot: IPlot) {\r\n if (!plot) {\r\n return;\r\n }\r\n\r\n plot.veriMarkerOptions = this.veriMarkerService.createVeriMarkerOptions(plot, true);\r\n this.googleMarkerService.generateMarkerOptions(plot, plot.veriMarkerOptions).then(options => {\r\n\r\n plot.markerModel.options = options;\r\n\r\n this.highlightedPlot = plot;\r\n this.highlightPloyline();\r\n });\r\n }\r\n}\r\n\r\nexport class VeriMapTMSAuditComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n require: { [index: string]: string; };\r\n\r\n constructor() {\r\n this.bindings = {\r\n routeStops: \"<\",\r\n routeReplay: \"<\",\r\n plots: \"<\",\r\n fit: \"<\",\r\n selectedAudit: \"<\",\r\n\r\n onAuditSelected: \"&\"\r\n };\r\n\r\n this.require = {\r\n veriMap: \"^veriMap\"\r\n };\r\n\r\n this.controller = ComponentController;\r\n this.template = require(\"./veriMapTMSAudit.html\");\r\n }\r\n}\r\n","module.exports = \" \";","import { IMarkerModelMap } from \"@directives/_map/angularGoogleMaps/uiGmapMarkers.component\";\r\nimport { IVeriMapChildComponent, IVeriMapComponent, MapPopupType } from \"@directives/_map/veriMap/veriMapComponent/veriMap.component\";\r\nimport { IGoogleMapsMarker } from \"@interfaces/IGoogleMapsMarkerOptions\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { CanvasService, IPieDataSeries } from \"@services/canvas.service\";\r\nimport { GoogleMarkerService } from \"@services/googleMarker.service\";\r\nimport { MapService } from \"@services/map.service\";\r\nimport { PlotService } from \"@services/plot.service\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport * as angular from \"angular\";\r\nimport copy from \"fast-copy/dist/fast-copy.esm.js\";\r\nimport { ClusterIcon, IMarkerOptions, NgMapCluster } from \"@typings/google.maps.angular\";\r\n\r\nexport interface IUtilisationMetrics {\r\n numUtilised: number;\r\n numNotUtilised: number;\r\n utilisationPercentage: number;\r\n}\r\n\r\ninterface IVeriMapVehiclesBindings {\r\n\r\n veriMap: IVeriMapComponent;\r\n\r\n vehicleClicked(vehicle: { $vehicle: IVehicle });\r\n vehicleRightClicked(vehicle: { $vehicle: IVehicle });\r\n\r\n vehicleMouseOver(vehicle: { $vehicle: IVehicle, $event: Event });\r\n vehicleMouseOut(vehicle: { $vehicle: IVehicle });\r\n\r\n clusterMouseOver(ngMapCluster: { $ngMapCluster: NgMapCluster, $metrics: IUtilisationMetrics });\r\n clusterMouseOut(ngMapCluster: { $ngMapCluster: NgMapCluster, $metrics: IUtilisationMetrics });\r\n\r\n vehicles: IVehicle[];\r\n selectedVehicle: IVehicle;\r\n\r\n fit: boolean;\r\n showPlotTime: boolean;\r\n disableClustering: boolean;\r\n showOutOfBoundsIndicator: boolean;\r\n}\r\n\r\nclass VeriMapVehiclesComponentController implements angular.IComponentController, IVeriMapVehiclesBindings, IVeriMapChildComponent {\r\n veriMap: IVeriMapComponent;\r\n\r\n vehicleClicked: (vehicle: { $vehicle: IVehicle }) => void;\r\n vehicleRightClicked: (vehicle: { $vehicle: IVehicle }) => void;\r\n\r\n vehicleMouseOver: (vehicle: { $vehicle: IVehicle, $event: Event }) => void;\r\n vehicleMouseOut: (vehicle: { $vehicle: IVehicle }) => void;\r\n\r\n clusterMouseOver: (ngMapCluster: { $ngMapCluster: NgMapCluster, $metrics: IUtilisationMetrics }) => void;\r\n clusterMouseOut: (ngMapCluster: { $ngMapCluster: NgMapCluster, $metrics: IUtilisationMetrics }) => void;\r\n\r\n vehicles: IVehicle[] = [];\r\n displayMarkers: IGoogleMapsMarker[] = [];\r\n selectedVehicle: IVehicle;\r\n\r\n fit: boolean;\r\n showPlotTime: boolean = false;\r\n disableClustering: boolean = false;\r\n showOutOfBoundsIndicator: boolean = false; // prototype functionality\r\n\r\n vehicleMarkerOptions: IMarkerOptions = {\r\n events: {},\r\n control: {},\r\n type: \"cluster\",\r\n typeOptions: {\r\n imagePath: \"https://rawgit.com/googlemaps/js-marker-clusterer/gh-pages/images/m\",\r\n maxZoom: 13,\r\n gridSize: 40 // default 60\r\n },\r\n typeEvents: {}\r\n };\r\n\r\n // Might want to put this into veriMap rather than keep it here\r\n hasFitMap = false;\r\n\r\n static $inject = [\"$scope\", \"$q\", \"vehicleService\", \"googleMarkerService\", \"plotService\", \"mapService\", \"canvasService\"];\r\n\r\n constructor(\r\n private readonly $scope: angular.IScope,\r\n private readonly $q: angular.IQService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly googleMarkerService: GoogleMarkerService,\r\n private readonly plotService: PlotService,\r\n private readonly mapService: MapService,\r\n private readonly canvasService: CanvasService) {\r\n }\r\n\r\n $onInit(): void {\r\n this.vehicleMarkerOptions.type = (this.disableClustering) ? \"\" : \"cluster\";\r\n\r\n this.vehicleMarkerOptions.events.click = (markerObj: google.maps.Marker, eventName: string, clickedVehicle: IVehicle/*, args: any[]*/) => {\r\n\r\n if (this.vehicleClicked != null) {\r\n this.vehicleClicked({ $vehicle: clickedVehicle[\"model\"] });\r\n }\r\n }\r\n\r\n this.vehicleMarkerOptions.events.rightclick = (markerObj: google.maps.Marker, eventName: string, clickedVehicle: IVehicle/*, args: any[]*/) => {\r\n if (this.vehicleRightClicked != null) {\r\n this.vehicleRightClicked({ $vehicle: clickedVehicle });\r\n }\r\n }\r\n\r\n this.vehicleMarkerOptions.events.mouseover = (marker, eventName, clickedVehicle, mouseEvent) => {\r\n this.onVehicleMouseOver(marker, clickedVehicle as any, mouseEvent);\r\n this.stopEventPropogation(mouseEvent);\r\n mouseEvent.cancelBubble = true;\r\n };\r\n\r\n this.vehicleMarkerOptions.events.mouseout = (marker, eventName, clickedVehicle) => { this.onVehicleMouseOut(marker, clickedVehicle as any); };\r\n\r\n this.vehicleMarkerOptions.typeEvents.postClusterShow = (clusterIcon) => { this.clusteringFunction(clusterIcon); }\r\n this.vehicleMarkerOptions.typeEvents.click = (markers, models) => { this.onClusterClick(markers, models); };\r\n this.vehicleMarkerOptions.typeEvents.mouseover = (ngMapCluster) => { this.onClusterMouseOver(ngMapCluster); };\r\n this.vehicleMarkerOptions.typeEvents.mouseout = (ngMapCluster) => { this.onClusterMouseOut(ngMapCluster); };\r\n \r\n this.vehicleMarkerOptions.typeOptions.maxZoom = this.veriMap.userOptions.Clustering.Value ? 12 : 1;\r\n\r\n this.veriMap.registerChildComponent(this);\r\n }\r\n\r\n $onDestroy() {\r\n this.veriMap.deregisterChildComponent(this);\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n if (onChangesObj[\"vehicles\"]) {\r\n this.onVehiclesUpdated();\r\n }\r\n\r\n if (onChangesObj[\"selectedVehicle\"]) {\r\n\r\n // If we are a trailer, then we should actually select the tractor\r\n if (this.selectedVehicle && this.selectedVehicle.tractor) {\r\n\r\n var foundTractor = this.vehicleService.findVehicle(this.vehicles, this.selectedVehicle.tractor.Id);\r\n if (foundTractor) {\r\n this.selectedVehicle = foundTractor;\r\n }\r\n }\r\n\r\n this.updateSelectedVehicleStatus();\r\n }\r\n\r\n //if (onChangesObj[\"updateTrigger\"]) {\r\n // //console.log(\"update trigger\");\r\n // this.onVehiclesUpdated();\r\n //}\r\n }\r\n\r\n modelMap: IMarkerModelMap[] = [];\r\n\r\n onMarkersUpdated(modelMap: IMarkerModelMap[]) {\r\n this.modelMap = modelMap;\r\n\r\n //if (this.selectedVehicle) {\r\n // modelMap.forEach(map => {\r\n // console.log(map, this.selectedVehicle.Id);\r\n // if (map.id == this.selectedVehicle.Id) {\r\n // console.log(\"selected vehicle\", map);\r\n // }\r\n // });\r\n //}\r\n\r\n // Set to true to track vehicle\r\n this.updateSelectedVehicleStatus(false);\r\n }\r\n\r\n // --------------------------\r\n\r\n private stopEventPropogation(event: any) {\r\n if (event.length > 0) {\r\n event = event[0];\r\n }\r\n\r\n //var methods = Object.getOwnPropertyNames(Object.getPrototypeOf(event)).filter(m => 'function' === typeof event[m])\r\n\r\n event.cancelBubble = true;\r\n\r\n if (event.stop) {\r\n event.stop();\r\n }\r\n\r\n if (event.stopPropagation) {\r\n event.stopPropagation();\r\n }\r\n\r\n if (event.preventDefault) {\r\n event.preventDefault();\r\n }\r\n else {\r\n event.returnValue = false;\r\n }\r\n }\r\n\r\n private showVehicleOnMap(vehicle: IVehicle): boolean {\r\n return !vehicle.tractor || vehicle === this.selectedVehicle;\r\n }\r\n\r\n private onVehiclesUpdated() {\r\n var promiseList: angular.IPromise[] = [];\r\n\r\n if (this.vehicles) {\r\n for (var i = 0; i < this.vehicles.length; i++) {\r\n const vehicle = this.vehicles[i];\r\n\r\n // Trailers are shown underneath tractors, so we shouldnt show them on here\r\n if (!this.showVehicleOnMap(vehicle) || !vehicle.Plot) {\r\n continue;\r\n }\r\n\r\n const isSelected = this.selectedVehicle && this.selectedVehicle.Id == vehicle.Id;\r\n\r\n var promise = this.googleMarkerService.generateGoogleMapsMarkerOptionsForVehicle(vehicle, isSelected, this.showPlotTime).then(options => {\r\n\r\n vehicle.Plot.markerModel = {\r\n id: vehicle.Plot.Id,\r\n options: options\r\n };\r\n });\r\n\r\n promiseList.push(promise);\r\n };\r\n }\r\n\r\n this.$q.all(promiseList).then(() => {\r\n\r\n this.displayMarkers = [];\r\n\r\n for (var i = 0; i < this.vehicles.length; i++) {\r\n const vehicle = this.vehicles[i];\r\n\r\n if (this.showVehicleOnMap(vehicle) && vehicle.Plot) {\r\n var markerModel: IGoogleMapsMarker = copy(vehicle.Plot.markerModel);\r\n markerModel.model = vehicle;\r\n\r\n this.displayMarkers.push(markerModel);\r\n }\r\n };\r\n });\r\n\r\n // Add remove vehicles from display list\r\n\r\n //console.time(\"onVehiclesUpdated\");\r\n //var promiseList: angular.IPromise[] = [];\r\n\r\n //this.vehicles.forEach(v => {\r\n // var shouldDisplay = this.showVehicleOnMap(v) && v.Plot;\r\n // if (!shouldDisplay) {\r\n // return;\r\n // }\r\n\r\n // var currentlyDisplayed = this.vehicleService.findVehicle(this.displayVehicles, v.Id);\r\n // if (shouldDisplay && !currentlyDisplayed) {\r\n // this.displayVehicles.push(v);\r\n // }\r\n\r\n // const isSelected = this.selectedVehicle && this.selectedVehicle.Id == v.Id;\r\n // var promise = this.googleMarkerService.generateGoogleMapsMarkerOptionsForVehicle(v, isSelected).then(options => {\r\n // v.Plot.options = options;\r\n // });\r\n\r\n // promiseList.push(promise);\r\n //});\r\n\r\n //this.$q.all(promiseList).then(() => {\r\n\r\n // this.displayVehicles = this.displayVehicles.slice();\r\n\r\n // console.timeEnd(\"onVehiclesUpdated\");\r\n // console.log(this.displayVehicles.length);\r\n //});\r\n\r\n\r\n //if (this.vehicles) {\r\n // for (var i = 0; i < this.vehicles.length; i++) {\r\n // const vehicle = this.vehicles[i];\r\n\r\n // // Trailers are shown underneath tractors, so we shouldnt show them on here\r\n // if (!this.showVehicleOnMap(vehicle) || !vehicle.Plot) {\r\n // continue;\r\n // }\r\n\r\n // const isSelected = this.selectedVehicle && this.selectedVehicle.Id == vehicle.Id;\r\n // var promise = this.googleMarkerService.generateGoogleMapsMarkerOptionsForVehicle(vehicle, isSelected).then(options => {\r\n // vehicle.Plot.options = options;\r\n // });\r\n\r\n // promiseList.push(promise);\r\n // };\r\n //}\r\n\r\n //this.$q.all(promiseList).then(() => {\r\n\r\n // this.displayVehicles = [];\r\n\r\n // for (var i = 0; i < this.vehicles.length; i++) {\r\n // const vehicle = this.vehicles[i];\r\n\r\n // if (this.showVehicleOnMap(vehicle) && vehicle.Plot) {\r\n // this.displayVehicles.push(vehicle);\r\n // }\r\n // };\r\n\r\n // //this.displayVehicles = this.vehicles.slice();\r\n // console.timeEnd(\"onVehiclesUpdated\");\r\n //});\r\n\r\n this.fitMap();\r\n }\r\n\r\n getLatLngsForFitMap(): google.maps.LatLng[] {\r\n\r\n const latLngs: google.maps.LatLng[] = [];\r\n\r\n if (this.selectedVehicle) {\r\n this.addVehicleLatestPlot(this.selectedVehicle, latLngs);\r\n }\r\n else if (this.vehicles) {\r\n this.vehicles.forEach(vehicle => {\r\n this.addVehicleLatestPlot(vehicle, latLngs);\r\n });\r\n }\r\n\r\n return latLngs;\r\n }\r\n\r\n private addVehicleLatestPlot(vehicle: IVehicle, latLngs: google.maps.LatLng[]) {\r\n var latestPlot = vehicle.Plot;\r\n if (latestPlot && latestPlot.Latitude && latestPlot.Longitude) {\r\n const latLng = new google.maps.LatLng(latestPlot.Latitude, latestPlot.Longitude);\r\n latLngs.push(latLng);\r\n }\r\n }\r\n\r\n private getMarkerModel(id: number): IMarkerModelMap {\r\n\r\n for (var i = 0; i < this.modelMap.length; i++) {\r\n const map = this.modelMap[i];\r\n if (map.id == id) {\r\n return map\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private updateSelectedVehicleStatus(forceFitMap = true) {\r\n\r\n if (!this.veriMap.mapInitialised) {\r\n this.veriMap.mapInitialisedPromise.then(() => {\r\n this.updateSelectedVehicleStatus(forceFitMap);\r\n });\r\n\r\n return;\r\n }\r\n\r\n if (!this.vehicles) {\r\n return;\r\n }\r\n\r\n this.vehicles.forEach(v => {\r\n\r\n const marker = this.getMarkerModel(v.Id);\r\n\r\n if (!marker) {\r\n return;\r\n }\r\n\r\n var selected = v == this.selectedVehicle;\r\n var markerLabel = (marker.googleMarker as any);\r\n var wasSelected = markerLabel.labelClass.indexOf(\"selected\") >= 0;\r\n\r\n // No change, do nothing\r\n if (selected == wasSelected) {\r\n return;\r\n }\r\n\r\n this.googleMarkerService.generateGoogleMapsMarkerOptionsForVehicle(v, selected, this.showPlotTime).then(newOptions => {\r\n if (!marker.googleMarker) {\r\n return;\r\n }\r\n\r\n if (selected) {\r\n markerLabel.labelClass = markerLabel.labelClass + \" selected\";\r\n }\r\n else {\r\n markerLabel.labelClass = markerLabel.labelClass.replace(\"selected\", \"\");\r\n }\r\n\r\n marker.googleMarker.setOpacity(selected || !this.selectedVehicle ? 1 : 0.5);\r\n marker.googleMarker.setZIndex(selected ? 100 : 1);\r\n marker.googleMarker.setIcon(newOptions.icon);\r\n });\r\n });\r\n\r\n if (this.selectedVehicle && this.shouldFitMap(forceFitMap) && this.selectedVehicle.Plot) {\r\n var fast = navigator.hardwareConcurrency >= 6;\r\n fast = false; // permanently disable for now\r\n\r\n //if (fast) {\r\n // this.mapService.smoothPanAndZoomTo(this.veriMap.getMap(), new google.maps.LatLng(vehicle.Plot.Latitude, vehicle.Plot.Longitude), 13);\r\n //}\r\n //else {\r\n if (this.veriMap.getMap().getZoom() < 13) {\r\n this.veriMap.getMap().setZoom(13);\r\n this.veriMap.panMap(new google.maps.LatLng(this.selectedVehicle.Plot.Latitude, this.selectedVehicle.Plot.Longitude));\r\n // Smooth pan and zoom ONLY if zooming is required, otherwise just snap\r\n //this.mapService.smoothPanAndZoomTo(this.veriMap.getMap(), new google.maps.LatLng(vehicle.Plot.Latitude, vehicle.Plot.Longitude), 13);\r\n }\r\n else {\r\n this.veriMap.panMap(new google.maps.LatLng(this.selectedVehicle.Plot.Latitude, this.selectedVehicle.Plot.Longitude));\r\n }\r\n //}\r\n\r\n this.hasFitMap = true;\r\n }\r\n else {\r\n //this.hasFitMap = false;\r\n //this.fitMap();\r\n }\r\n }\r\n\r\n private shouldFitMap(force = false) {\r\n if (force) {\r\n this.hasFitMap = false;\r\n }\r\n\r\n return this.fit && !this.hasFitMap && this.vehicles.length !== 0;\r\n }\r\n\r\n private fitMap() {\r\n if (!this.shouldFitMap()) {\r\n return;\r\n }\r\n\r\n var latLngs = this.getLatLngsForFitMap();\r\n this.hasFitMap = latLngs.length > 0;\r\n\r\n if (this.hasFitMap) {\r\n this.veriMap.fitMap(latLngs);\r\n }\r\n }\r\n\r\n private onClusterClick(markers: google.maps.Marker[], models: any[]) {\r\n\r\n this.veriMap.hidePopup(MapPopupType.Cluster, true);\r\n\r\n this.$scope.$applyAsync();\r\n }\r\n\r\n private onClusterMouseOver(ngMapCluster: NgMapCluster) {\r\n // CJE disabling cluster popups...TRIAL...\r\n\r\n //if (this.clusterMouseOver) {\r\n // var utilisationMetrics = this.calculateClusterUtilisation(ngMapCluster.clusterIcon_)\r\n // var position = this.mapService.applyOffsetToLatLng(this.veriMap.getMap(), ngMapCluster.center_, new google.maps.Point(0, -30));\r\n\r\n // this.clusterMouseOver({ $ngMapCluster: ngMapCluster, $metrics: utilisationMetrics });\r\n // this.veriMap.showPopup(MapPopupType.Cluster, position, utilisationMetrics);\r\n\r\n // this.$scope.$applyAsync();\r\n //}\r\n }\r\n\r\n private onClusterMouseOut(ngMapCluster: NgMapCluster) {\r\n if (this.clusterMouseOut) {\r\n //var utilisationMetrics = this.calculateClusterUtilisation(ngMapCluster.clusterIcon_)\r\n\r\n //this.clusterMouseOut({ $ngMapCluster: ngMapCluster, $metrics: utilisationMetrics });\r\n //this.updateClusterSelectionStatus(ngMapCluster.clusterIcon_);\r\n this.$scope.$applyAsync();\r\n }\r\n\r\n this.veriMap.hidePopup(MapPopupType.Cluster, false);\r\n }\r\n\r\n private onVehicleMouseOver(marker: google.maps.Marker, vehicle: IGoogleMapsMarker, mouseEvent?: Event) {\r\n\r\n if (this.vehicleMouseOver) {\r\n this.vehicleMouseOver({ $vehicle: vehicle.model, $event: mouseEvent });\r\n }\r\n\r\n mouseEvent.cancelBubble = true;\r\n }\r\n\r\n private onVehicleMouseOut(marker: google.maps.Marker, vehicle: IGoogleMapsMarker) {\r\n if (this.vehicleMouseOut) {\r\n this.vehicleMouseOut({ $vehicle: vehicle.model });\r\n }\r\n }\r\n\r\n clusteringFunction(clusterIcon: ClusterIcon) {\r\n if (this.disableClustering) {\r\n return;\r\n }\r\n\r\n if (!clusterIcon.div_) {\r\n return;\r\n }\r\n\r\n const utilisationColorRaw = this.plotService.getUtilisationColor(true);\r\n const nonUtilisationColorRaw = this.plotService.getUtilisationColor(false);\r\n\r\n const utilisation = this.calculateClusterUtilisation(clusterIcon);\r\n\r\n var data: IPieDataSeries[] = [];\r\n data.push({\r\n color: utilisationColorRaw,\r\n value: utilisation.numUtilised\r\n });\r\n\r\n data.push({\r\n color: nonUtilisationColorRaw,\r\n value: utilisation.numNotUtilised\r\n });\r\n\r\n var pieCanvas = this.canvasService.getPieCanvas(clusterIcon.width_, data);\r\n clusterIcon.div_.appendChild(pieCanvas);\r\n\r\n this.updateClusterSelectionStatus(clusterIcon);\r\n }\r\n\r\n updateClusterSelectionStatus(clusterIcon: ClusterIcon) {\r\n\r\n if (!clusterIcon.div_ || !clusterIcon.visible_) {\r\n return;\r\n }\r\n\r\n const currentImageString = clusterIcon.url_.substr(clusterIcon.url_.lastIndexOf(\"/\") + 1, 2);\r\n\r\n clusterIcon.div_.className = `cluster ${currentImageString}`;\r\n\r\n // Check for selected status\r\n for (let i = 0; i < clusterIcon.cluster_.markers_.length; i++) {\r\n const marker = clusterIcon.cluster_.markers_[i];\r\n\r\n if (marker.model.model.Plot.selected) {\r\n clusterIcon.div_.className += \" selected\";\r\n break;\r\n }\r\n }\r\n }\r\n\r\n private calculateClusterUtilisation(clusterIcon: ClusterIcon): IUtilisationMetrics {\r\n var vehicleUtilisisationCount = 0;\r\n var vehicleUnderUtilisisationCount = 0;\r\n\r\n const markers = clusterIcon.cluster_.markers_;\r\n\r\n markers.forEach(marker => {\r\n\r\n if (this.plotService.isPlotUtilised(marker.model.model.Plot.Reason)) {\r\n vehicleUtilisisationCount++;\r\n }\r\n else {\r\n vehicleUnderUtilisisationCount++;\r\n }\r\n });\r\n\r\n const utilisationPercentage = Math.round(vehicleUtilisisationCount * 100 / markers.length);\r\n\r\n return {\r\n numUtilised: vehicleUtilisisationCount,\r\n numNotUtilised: vehicleUnderUtilisisationCount,\r\n utilisationPercentage: utilisationPercentage\r\n };\r\n }\r\n}\r\n\r\nexport class VeriMapVehiclesComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n require: { [index: string]: string; };\r\n\r\n constructor() {\r\n this.bindings = {\r\n\r\n vehicles: \"<\",\r\n selectedVehicle: \"<\",\r\n updateTrigger: \"<\",\r\n\r\n vehicleClicked: \"&\",\r\n vehicleRightClicked: \"&\",\r\n\r\n vehicleMouseOver: \"&\",\r\n vehicleMouseOut: \"&\",\r\n\r\n clusterMouseOver: \"&\",\r\n clusterMouseOut: \"&\",\r\n\r\n fit: \"@\",\r\n showPlotTime: \" \";","import { downgradeComponent, downgradeInjectable } from \"@angular/upgrade/static\";\r\nimport { GroupDeleteConfirmationComponent } from \"@app/directives/_misc/delete-confirm/group-delete-confirm/group-delete-confirm.component\";\r\nimport { BackgroundImageDirective } from \"@directives/_misc/backgroundImage\";\r\nimport { DepotNameComponent } from \"@directives/_misc/depotName/depotName.component\";\r\nimport { MultiStepIndicatorComponent } from \"@directives/_misc/multiStepIndicator/multiStepIndicator.component\";\r\nimport { TooltipDirectiveAJS } from \"@directives/_misc/tooltip/tooltip.directive.ajs\";\r\nimport { TooltipService } from \"@directives/_misc/tooltip/tooltip.service\";\r\nimport * as angular from \"angular\";\r\nimport { AccountSwitcherComponent } from \"./accountSwitcher/accountSwitcher.component\";\r\nimport { BatteryIndicatorComponent } from \"./batteryIndicator/batteryIndicator.component\";\r\nimport { BreadcrumbsComponent } from \"./breadcrumbs/breadcrumbs.component\";\r\nimport { ConvertToNumberDirective } from \"./convertToNumber\";\r\nimport { CountToDirective } from \"./countTo.directive.ajs\";\r\nimport { DayOfWeekPickerComponent } from \"./day-of-week-picker/day-of-week-picker.component\";\r\nimport { DelayCreationDirective } from \"./delayCreation.directive\";\r\nimport { DeleteConfirmationComponent } from \"./delete-confirm/delete-confirm.component\";\r\nimport { DeleteConfirmComponent } from \"./deleteConfirm/deleteConfirm\";\r\nimport { DriverImageComponent } from \"./driverImage/driverImage.component\";\r\nimport { DriverUsernameDirective } from \"./driverUsername\";\r\nimport { VFlvPlayer } from \"./flvPlayer/flv-player.component\";\r\nimport { FullScreenButtonComponent } from \"./fullScreenButton/fullScreenButton.component\";\r\nimport { HideInProduction } from \"./hideInProduction/hideInProduction\";\r\nimport { HideOnIe } from \"./hideOnIE/hideOnIE\";\r\nimport { IfEnabled } from \"./ifEnabled.directive.ajs\";\r\nimport { IfUserInternal } from \"./ifUserInternal.directive\";\r\nimport { IfUserInternalOrFoundation } from \"./ifUserInternalOrFoundation.directive\";\r\nimport { IfUserNotInternal } from \"./ifUserNotInternal.directive\";\r\nimport { KeyWordTriggerDirective } from \"./keyWordTrigger.directive\";\r\nimport { LoadingIndicatorComponent } from \"./loadingIndicator/loadingIndicator.component\";\r\nimport { LocationInformationComponent } from \"./location-information/location-information.component\";\r\n//import { NavCountComponent } from \"@connexas/common-ui/navigation/navCount/navCount.component\";\r\nimport { NavCountComponent } from \"./navCount/navCount.component\";\r\nimport { PopupComponent } from \"./popup/popup.directive\";\r\nimport { PrintElementDirective } from \"./printElement/printElement.directive\";\r\nimport { SiteStatusIndicatorComponent } from \"./site-status-indicator/site-status-indicator.component\";\r\nimport { SiteUpdatedIndicator } from \"./site-updated-indicator/site-updated-indicator.component\";\r\nimport { SnowComponent } from \"./snow/snow.component\";\r\nimport { TachoModeComponent, TachoModeStatusComponent } from \"./tachoMode/tachoMode.directive\";\r\nimport { TemperatureReadingComponent } from \"./temperatureReading/temperatureReading.component\";\r\nimport { TimeAgoComponent } from \"./timeAgo.component\";\r\nimport { TrendArrowComponent } from \"./trendArrow/trendArrow.component\";\r\nimport { UnitConversionSuffixComponent } from \"./unitConversionSuffix.component\";\r\nimport { VectorDotsComponent } from \"./vector-dots/vector-dots.component\";\r\nimport { VehicleOnlineStatusComponent } from \"./vehicle-online-status-indicator/vehicle-online-status.component\";\r\nimport { VeriDialogController } from \"./veriDialog.controller\";\r\nimport { VeriMarkerComponent } from \"./veriMarker/veriMarker.directive\";\r\nimport { VerticalCollapsableDivider } from \"./vertical-collapsable-divider/vertical-collapsable-divider.component\";\r\nimport { VideoDownloadStatusComponent } from \"./video-download-status/video-download-status.component\";\r\n\r\nangular\r\n .module(\"app.misc.directives\", [])\r\n\r\n .component(\"deleteConfirm\", new DeleteConfirmComponent())\r\n .directive(\"deleteConfirmation\", downgradeComponent({ component: DeleteConfirmationComponent }))\r\n .directive(\"groupDeleteConfirmation\", downgradeComponent({ component: GroupDeleteConfirmationComponent }))\r\n .directive(\"accountSwitcher\", downgradeComponent({ component: AccountSwitcherComponent }))\r\n\r\n .directive(\"convertToNumber\", ConvertToNumberDirective.factory())\r\n .directive(\"backgroundImage\", BackgroundImageDirective.factory())\r\n\r\n .directive(\"countTo\", CountToDirective.factory())\r\n //.directive(\"countTo\", downgradeComponent({ component: countToDirective }))\r\n .directive(\"delayCreation\", DelayCreationDirective.factory())\r\n .directive('driverUsername', DriverUsernameDirective.factory())\r\n .directive(\"vFlvPlayer\", downgradeComponent({ component: VFlvPlayer }))\r\n .directive(\"hideInProduction\", HideInProduction.factory())\r\n .directive(\"hideOnIe\", HideOnIe.factory())\r\n\r\n .service(\"tooltipService\", downgradeInjectable(TooltipService))\r\n .directive(\"tooltip\", TooltipDirectiveAJS.factory())\r\n\r\n .directive(\"ifUserInternal\", IfUserInternal.factory())\r\n .directive(\"ifUserNotInternal\", IfUserNotInternal.factory())\r\n .directive(\"ifUserInternalOrFoundation\", IfUserInternalOrFoundation.factory())\r\n .directive(\"ifEnabled\", IfEnabled.factory())\r\n .directive(\"keyWordTrigger\", KeyWordTriggerDirective.factory())\r\n .directive(\"locationInformation\", downgradeComponent({ component: LocationInformationComponent }))\r\n .directive(\"temperatureReading\", downgradeComponent({ component: TemperatureReadingComponent }))\r\n .directive(\"multiStepIndicator\", downgradeComponent({ component: MultiStepIndicatorComponent }))\r\n .directive(\"breadcrumbs\", downgradeComponent({ component: BreadcrumbsComponent }))\r\n .directive(\"vehicleOnlineStatus\", downgradeComponent({ component: VehicleOnlineStatusComponent }))\r\n .directive(\"videoDownloadStatus\", downgradeComponent({ component: VideoDownloadStatusComponent }))\r\n .directive(\"navCount\", downgradeComponent({ component: NavCountComponent }))\r\n .directive('printElement', PrintElementDirective.factory())\r\n\r\n .component(\"snow\", new SnowComponent())\r\n .directive(\"driverImage\", downgradeComponent({ component: DriverImageComponent }))\r\n .directive(\"vectorDots\", downgradeComponent({ component: VectorDotsComponent }))\r\n\r\n .directive(\"dayOfWeekPicker\", downgradeComponent({ component: DayOfWeekPickerComponent }))\r\n .directive(\"fullScreenButton\", downgradeComponent({ component: FullScreenButtonComponent }))\r\n .directive(\"verticalCollapsableDivider\", downgradeComponent({ component: VerticalCollapsableDivider }))\r\n\r\n .component(\"popup\", new PopupComponent())\r\n .directive(\"batteryIndicator\", downgradeComponent({ component: BatteryIndicatorComponent }))\r\n .directive(\"tachoMode\", downgradeComponent({ component: TachoModeComponent }))\r\n .directive(\"tachoModeStatus\", downgradeComponent({ component: TachoModeStatusComponent }))\r\n .component(\"timeAgo\", new TimeAgoComponent())\r\n .directive(\"veriMarker\", downgradeComponent({ component: VeriMarkerComponent }))\r\n .directive(\"unitConversionSuffix\", downgradeComponent({ component: UnitConversionSuffixComponent }))\r\n .directive(\"trendArrow\", downgradeComponent({ component: TrendArrowComponent }))\r\n .directive(\"loadingIndicator\", downgradeComponent({ component: LoadingIndicatorComponent }))\r\n .directive(\"depotName\", downgradeComponent({ component: DepotNameComponent }))\r\n .directive(\"siteStatusIndicator\", downgradeComponent({ component: SiteStatusIndicatorComponent }))\r\n .component(\"siteUpdatedIndicator\", new SiteUpdatedIndicator())\r\n\r\n .controller(\"veriDialogController\", VeriDialogController as any)\r\n ;\r\n","import * as angular from \"angular\";\r\n\r\nexport class BackgroundImageDirective implements angular.IDirective {\r\n\r\n restrict = 'A';\r\n\r\n link(scope: angular.IScope, element: angular.IAugmentedJQuery, attrs: angular.IAttributes) {\r\n \r\n const backgroundImage = attrs[\"backgroundImage\"];\r\n\r\n let observerOptions = {\r\n root: null,\r\n rootMargin: \"0px\",\r\n threshold: []\r\n };\r\n\r\n const intersectionCallback: IntersectionObserverCallback = (entries, self) => {\r\n\r\n entries.forEach((entry) => {\r\n let box = entry.target as HTMLElement;\r\n\r\n if (entry.isIntersecting && !box.style.backgroundImage) {\r\n box.style.backgroundImage = `url(${backgroundImage})`;\r\n self.disconnect();\r\n }\r\n });\r\n }\r\n\r\n const observer = new IntersectionObserver(intersectionCallback, observerOptions);\r\n observer.observe(element[0]);\r\n }\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n return () => new BackgroundImageDirective();\r\n }\r\n}\r\n","import * as angular from \"angular\";\r\nimport \"./tooltip.scss\";\r\nimport { TooltipService } from \"./tooltip.service\";\r\n\r\ninterface IDirectiveScope extends angular.IScope {\r\n title: \"string\",\r\n fixedPosition: '=',\r\n titleClass: '@',\r\n\r\n createTooltip(event?: JQueryEventObject): any;\r\n removeTooltip(event?: JQueryEventObject);\r\n\r\n getDirection(): string;\r\n tooltipElement: JQuery;\r\n\r\n stringContains(searchString: string, findString: string);\r\n stringStartsWith(searchString: string, findString: string);\r\n\r\n calculatePosition(x: any, y: any);\r\n updateTooltip(title: string);\r\n}\r\n\r\n// https://github.com/Intellipharm/angular-tooltips/tree/master/src\r\nexport class TooltipDirectiveAJS implements angular.IDirective {\r\n\r\n restrict = \"A\";\r\n scope = {\r\n title: '@',\r\n fixedPosition: '<',\r\n titleClass: '@',\r\n }\r\n\r\n link: ($scope: IDirectiveScope, element: angular.IAugmentedJQuery, attrs: angular.IAttributes) => void;\r\n\r\n constructor($timeout: angular.ITimeoutService, $compile: angular.ICompileService, tooltipService: TooltipService) {\r\n\r\n TooltipDirectiveAJS.prototype.link = ($scope: IDirectiveScope, $element: angular.IAugmentedJQuery, $attrs: ng.IAttributes) => {\r\n\r\n $scope.createTooltip = (event?: JQueryEventObject) => {\r\n\r\n if ($attrs.title || $attrs.tooltip) {\r\n var direction = $scope.getDirection();\r\n\r\n // create the tooltip\r\n $scope.tooltipElement = angular.element('
').addClass('angular-tooltip').addClass($scope.titleClass);\r\n\r\n // append to the body\r\n angular.element(document).find('body').append($scope.tooltipElement);\r\n\r\n // update the contents and position\r\n $scope.updateTooltip($attrs.title || $attrs.tooltip);\r\n\r\n // Disable animation\r\n if ($attrs.tooltipNoAnimate !== undefined) {\r\n $scope.tooltipElement.addClass('no-animate');\r\n }\r\n\r\n // show\r\n $scope.tooltipElement.addClass('angular-tooltip-fade-in');\r\n }\r\n };\r\n\r\n $scope.updateTooltip = (title: string) => {\r\n // insert html into tooltip\r\n $scope.tooltipElement.html(title);\r\n\r\n // compile html contents into angularjs\r\n $compile($scope.tooltipElement.contents())($scope);\r\n\r\n // calculate the position of the tooltip\r\n var pos = $scope.calculatePosition($scope.tooltipElement, $scope.getDirection());\r\n $scope.tooltipElement.addClass('angular-tooltip-' + pos.direction).css(pos);\r\n\r\n // stop the standard tooltip from being shown\r\n $timeout(function () {\r\n $element.removeAttr('ng-attr-title');\r\n $element.removeAttr('title');\r\n });\r\n };\r\n\r\n // if the title changes the update the tooltip\r\n $scope.$watch('title', (newTitle: string) => {\r\n if ($scope.tooltipElement) {\r\n $scope.updateTooltip(newTitle);\r\n }\r\n });\r\n\r\n // removes all tooltips from the document to reduce ghosts\r\n $scope.removeTooltip = (event: JQueryEventObject) => {\r\n //return;\r\n\r\n var tooltip = angular.element(document.querySelectorAll('.angular-tooltip'));\r\n // tooltip.removeClass('angular-tooltip-fade-in');\r\n\r\n // $timeout(function() {\r\n tooltip.remove();\r\n // }, 300);\r\n };\r\n\r\n // gets the current direction value\r\n $scope.getDirection = () => {\r\n return $element.attr('tooltip-direction') || $element.attr('title-direction') || 'top';\r\n };\r\n\r\n // calculates the position of the tooltip\r\n $scope.calculatePosition = (tooltip, direction: string) => {\r\n var tooltipBounding = tooltip[0].getBoundingClientRect();\r\n var elBounding = $element[0].getBoundingClientRect();\r\n var scrollLeft = window.scrollX || document.documentElement.scrollLeft;\r\n var scrollTop = window.scrollY || document.documentElement.scrollTop;\r\n var arrow_padding = 12;\r\n var pos: { left?: any, top?: any, direction?: string } = {};\r\n var newDirection = null;\r\n\r\n // calculate the left position\r\n if ($scope.stringStartsWith(direction, 'left')) {\r\n pos.left = elBounding.left - tooltipBounding.width - (arrow_padding / 2) + scrollLeft;\r\n }\r\n else if ($scope.stringStartsWith(direction, 'right')) {\r\n pos.left = elBounding.left + elBounding.width + (arrow_padding / 2) + scrollLeft;\r\n }\r\n else if ($scope.stringContains(direction, 'left')) {\r\n pos.left = elBounding.left - tooltipBounding.width + arrow_padding + scrollLeft;\r\n }\r\n else if ($scope.stringContains(direction, 'right')) {\r\n pos.left = elBounding.left + elBounding.width - arrow_padding + scrollLeft;\r\n }\r\n else {\r\n pos.left = elBounding.left + (elBounding.width / 2) - (tooltipBounding.width / 2) + scrollLeft;\r\n }\r\n\r\n // calculate the top position\r\n if ($scope.stringStartsWith(direction, 'top')) {\r\n pos.top = elBounding.top - tooltipBounding.height - (arrow_padding / 2) + scrollTop;\r\n }\r\n else if ($scope.stringStartsWith(direction, 'bottom')) {\r\n pos.top = elBounding.top + elBounding.height + (arrow_padding / 2) + scrollTop;\r\n }\r\n else if ($scope.stringContains(direction, 'top')) {\r\n pos.top = elBounding.top - tooltipBounding.height + arrow_padding + scrollTop;\r\n }\r\n else if ($scope.stringContains(direction, 'bottom')) {\r\n pos.top = elBounding.top + elBounding.height - arrow_padding + scrollTop;\r\n }\r\n else {\r\n pos.top = elBounding.top + (elBounding.height / 2) - (tooltipBounding.height / 2) + scrollTop;\r\n }\r\n\r\n // check if the tooltip is outside the bounds of the window\r\n if ($scope.fixedPosition) {\r\n if (pos.left < scrollLeft) {\r\n newDirection = direction.replace('left', 'right');\r\n }\r\n else if ((pos.left + tooltipBounding.width) > (window.innerWidth + scrollLeft)) {\r\n newDirection = direction.replace('right', 'left');\r\n }\r\n\r\n if (pos.top < scrollTop) {\r\n newDirection = direction.replace('top', 'bottom');\r\n }\r\n else if ((pos.top + tooltipBounding.height) > (window.innerHeight + scrollTop)) {\r\n newDirection = direction.replace('bottom', 'top');\r\n }\r\n\r\n if (newDirection) {\r\n return $scope.calculatePosition(tooltip, newDirection);\r\n }\r\n }\r\n\r\n pos.left += 'px';\r\n pos.top += 'px';\r\n pos.direction = direction;\r\n\r\n return pos;\r\n };\r\n\r\n $scope.stringStartsWith = (searchString, findString) => {\r\n return searchString.substr(0, findString.length) === findString;\r\n };\r\n\r\n $scope.stringContains = (searchString, findString) => {\r\n return searchString.indexOf(findString) !== -1;\r\n };\r\n\r\n var showTootipViaAttr = $element.attr('tooltip-show');\r\n if (showTootipViaAttr != null) {\r\n setTimeout(() => {\r\n if (showTootipViaAttr == \"true\") {\r\n $scope.createTooltip();\r\n }\r\n else {\r\n $scope.removeTooltip();\r\n }\r\n }, 150);\r\n }\r\n else if ($attrs.title || $attrs.tooltip) {\r\n // attach events to show tooltip\r\n $element.on(\"mouseenter\" as any, $scope.createTooltip);\r\n $element.on(\"mouseleave\", $scope.removeTooltip);\r\n } else {\r\n // remove events\r\n $element.off(\"mouseenter\" as any, $scope.createTooltip);\r\n $element.off(\"mouseleave\", $scope.removeTooltip);\r\n }\r\n\r\n $element.on('destroy', $scope.removeTooltip);\r\n $scope.$on('$destroy', $scope.removeTooltip as any);\r\n\r\n //$scope.$on(\"$destroy\", () => {\r\n // $element.off(\"keydown\");\r\n //});\r\n }\r\n }\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n const directive = ($timeout: angular.ITimeoutService, $compile: angular.ICompileService, tooltipService: TooltipService) => new TooltipDirectiveAJS($timeout, $compile, tooltipService);\r\n\r\n directive.$inject = [\"$timeout\", \"$compile\", \"tooltipService\"];\r\n\r\n return directive;\r\n }\r\n}\r\n","import * as angular from \"angular\";\r\n\r\nexport class ConvertToNumberDirective implements angular.IDirective {\r\n\r\n restrict = 'A';\r\n require = 'ngModel';\r\n\r\n link(scope: angular.IScope, element: angular.IAugmentedJQuery, attrs: angular.IAttributes, ngModel: angular.INgModelController) {\r\n ngModel.$parsers.push((val) => {\r\n return val != null ? parseInt(val, 10) : null;\r\n });\r\n ngModel.$formatters.push((val) => {\r\n return val != null ? \"\" + val : null;\r\n });\r\n }\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n return () => new ConvertToNumberDirective();\r\n }\r\n}\r\n","\r\nimport * as angular from \"angular\";\r\n\r\ninterface ICountToData {\r\n element: HTMLElement;\r\n timeoutPromise?: angular.IPromise;\r\n refreshInterval?: number;\r\n duration?: number;\r\n step?: number;\r\n steps?: number;\r\n countFrom?: number;\r\n countTo?: number;\r\n value?: number;\r\n increment?: number;\r\n num?: number;\r\n\r\n filter?: string;\r\n filterParam?: any;\r\n}\r\n\r\nexport class CountToDirective implements angular.IDirective {\r\n\r\n restrict = \"A\";\r\n\r\n link: (scope: angular.IScope, element: ng.IAugmentedJQuery, attrs: ng.IAttributes) => void;\r\n\r\n constructor(\r\n private $timeout: angular.ITimeoutService,\r\n private $filter: angular.IFilterService) {\r\n\r\n CountToDirective.prototype.link = ($scope: angular.IScope, $element: angular.IAugmentedJQuery, attrs: ng.IAttributes) => {\r\n\r\n var countToData: ICountToData = {\r\n element: $element[0]\r\n };\r\n\r\n this.setFilters(countToData, attrs);\r\n\r\n attrs.$observe(\"countTo\", (val) => {\r\n if (val) {\r\n this.start(countToData, attrs);\r\n }\r\n else {\r\n this.setContent(countToData, 0);\r\n }\r\n });\r\n }\r\n }\r\n\r\n private start(countToData: ICountToData, attrs: ng.IAttributes) {\r\n if (countToData && countToData.timeoutPromise) {\r\n this.$timeout.cancel(countToData.timeoutPromise);\r\n }\r\n\r\n this.calculate(countToData, attrs);\r\n this.tick(countToData);\r\n }\r\n\r\n private setFilters(countToData: ICountToData, attrs: ng.IAttributes) {\r\n\r\n countToData.filter = attrs[\"filter\"] || \"number\";\r\n countToData.filterParam = attrs[\"filterParam\"] || 0;\r\n }\r\n\r\n private calculate(countToData: ICountToData, attrs: ng.IAttributes) {\r\n countToData.refreshInterval = 30;\r\n countToData.step = 0;\r\n countToData.timeoutPromise = null;\r\n\r\n countToData.value = countToData.countTo || 0;\r\n countToData.countFrom = countToData.value;\r\n let countToString: string = attrs[\"countTo\"] || \"0\";\r\n\r\n // If we have any commas (from number formatting) remove them\r\n if (countToData && countToString.indexOf(\",\")) {\r\n countToString = countToString.split(\",\").join(\"\");\r\n }\r\n\r\n countToData.countTo = parseFloat(countToString);\r\n\r\n countToData.duration = (parseFloat(attrs[\"duration\"]) * 1000) || 300; // default half second\r\n\r\n countToData.steps = Math.ceil(countToData.duration / countToData.refreshInterval);\r\n countToData.increment = ((countToData.countTo - countToData.value) / countToData.steps);\r\n countToData.num = countToData.value;\r\n }\r\n\r\n private tick(countToData: ICountToData) {\r\n countToData.timeoutPromise = this.$timeout(() => {\r\n var newData = this.easeOutCubic(countToData.step + 1, countToData.countFrom, countToData.countTo - countToData.countFrom, countToData.steps);\r\n countToData.num = newData;\r\n\r\n countToData.step++;\r\n\r\n if (countToData.step >= countToData.steps) {\r\n this.$timeout.cancel(countToData.timeoutPromise);\r\n countToData.num = countToData.countTo;\r\n\r\n this.setContent(countToData, countToData.countTo);\r\n }\r\n else {\r\n this.setContent(countToData, countToData.num);\r\n\r\n this.tick(countToData);\r\n }\r\n\r\n }, countToData.refreshInterval);\r\n }\r\n\r\n private setContent(countToData: ICountToData, value: number) {\r\n countToData.element.textContent = this.$filter(countToData.filter)(value, countToData.filterParam);\r\n }\r\n\r\n private easeOutCubic(t_currentTime: number, b_startValue: number, c_endValue: number, d_duration: number) {\r\n // Source: https://joshondesign.com/2013/03/01/improvedEasingEquations\r\n // Source: https://github.com/danro/jquery-easing/blob/master/jquery.easing.js\r\n return c_endValue * ((t_currentTime = t_currentTime / d_duration - 1) * t_currentTime * t_currentTime + 1) + b_startValue;\r\n }\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n const directive = ($timeout: angular.ITimeoutService, $filter: angular.IFilterService) => new CountToDirective($timeout, $filter);\r\n\r\n directive.$inject = [\"$timeout\", \"$filter\"];\r\n\r\n return directive;\r\n }\r\n}\r\n","\r\nimport * as angular from \"angular\";\r\n\r\nexport class DelayCreationDirective implements angular.IDirective {\r\n\r\n restrict = \"A\";\r\n terminal = true;\r\n priority = 1000;\r\n\r\n public link: (scope: angular.IScope, element: ng.IAugmentedJQuery, attrs: ng.IAttributes) => void;\r\n\r\n constructor($compile: angular.ICompileService, $timeout: angular.ITimeoutService) {\r\n\r\n DelayCreationDirective.prototype.link = ($scope: angular.IScope, $element: angular.IAugmentedJQuery, $attrs: ng.IAttributes) => {\r\n\r\n var delay = parseInt($attrs[\"delayCreation\"]) || 1000;\r\n var placeholder = angular.element(document.createComment(\"delayCreation placeholder\"));\r\n\r\n $element.after(placeholder);\r\n $element.remove();\r\n\r\n $timeout(() => {\r\n $element.removeAttr(\"delay-creation\");\r\n $element.attr(\"ng-if\", $attrs[\"delayCreation\"]);\r\n\r\n if (placeholder) {\r\n placeholder.after($element);\r\n placeholder.remove();\r\n }\r\n\r\n $compile($element)($scope);\r\n }, delay);\r\n }\r\n }\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n const directive = ($compile: angular.ICompileService, $timeout: angular.ITimeoutService) => new DelayCreationDirective($compile, $timeout);\r\n\r\n directive.$inject = [\"$compile\", \"$timeout\"];\r\n\r\n return directive;\r\n }\r\n}\r\n","import { TranslationService } from \"@services/translation.service\";\r\nimport * as angular from \"angular\";\r\n\r\nimport \"./deleteConfirm.scss\";\r\n\r\ninterface IDeleteConfirmComponentBindings {\r\n inlineConfirm: boolean;\r\n small: boolean;\r\n isDisabled: boolean;\r\n subjectName: string;\r\n subjectVerb: string;\n reference: string;\r\n onYes: () => void;\r\n onNo: () => void;\r\n}\r\n\r\nexport class DeleteConfirmComponentController implements angular.IComponentController, IDeleteConfirmComponentBindings {\r\n inlineConfirm: boolean;\r\n small: boolean;\r\n isDisabled: boolean;\r\n subjectName: string;\r\n subjectVerb = this.translationService.t(\"Common.Delete\");\r\n label: string;\n\n reference: string;\r\n\r\n onYes: () => void;\r\n onNo: () => void;\r\n\r\n showDeleteConfirm: boolean;\r\n\r\n static $inject = [\"$mdDialog\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly $mdDialog: angular.material.IDialogService,\n private readonly translationService: TranslationService\r\n ) {\r\n\r\n }\r\n\r\n onDeleteClick($event: MouseEvent) {\r\n if (this.inlineConfirm) {\r\n this.showDeleteConfirm = true;\r\n }\n else {\r\n this.showDeleteDialog($event);\r\n }\r\n }\r\n\r\n showDeleteDialog($event: MouseEvent) {\r\n const lowercaseSubjectVerb = (this.subjectVerb || \"\").toLowerCase();\r\n const dialog = this.$mdDialog\r\n .confirm()\n .multiple(true)\r\n .title(`${this.subjectVerb} ${this.subjectName}?`)\r\n .htmlContent(this.translationService.t('deleteConfirm.confirmMessage', [lowercaseSubjectVerb, (this.reference || this.translationService.t('deleteConfirm.this')), this.subjectName]))\r\n .targetEvent($event)\r\n .ok(this.subjectVerb)\r\n .cancel(this.translationService.t(\"Common.Cancel\"));\r\n\r\n this.$mdDialog\r\n .show(dialog)\r\n .then(\r\n () => {\r\n this.onYesClick();\r\n },\r\n () => {\r\n this.onNoClick();\r\n });\r\n }\r\n\r\n onYesClick() {\r\n this.showDeleteConfirm = false;\r\n\r\n if (this.onYes) {\r\n this.onYes();\r\n }\r\n }\r\n\r\n onNoClick() {\r\n this.showDeleteConfirm = false;\r\n\r\n if (this.onNo) {\r\n this.onNo();\r\n }\r\n }\r\n}\r\n\r\nexport class DeleteConfirmComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n template: string;\r\n controller: any;\r\n\r\n constructor() {\r\n this.bindings = {\r\n inlineConfirm: \" {{ $ctrl.label ? $ctrl.label : $ctrl.subjectVerb }}
{{'Common.No' | translate }} {{'Common.Yes' | translate }}
{{'deleteConfirm.confirmMessage' | translate : [ $ctrl.subjectVerb, ('deleteConfirm.this' | translate), $ctrl.subjectName ]}}
\";","\r\nimport * as angular from \"angular\";\r\n\r\nimport { DriverService } from \"@services/driver.service\";\r\n\r\nexport interface IDriverUsernameScope extends angular.IScope {\r\n driverUsername: string;\r\n}\r\n\r\nexport class DriverUsernameDirective implements angular.IDirective {\r\n\r\n restrict = 'A';\r\n require = 'ngModel';\r\n scope = { driverUsername: \"<\" }\r\n\r\n static $inject = ['$window', 'driverService', \"$q\"];\r\n constructor(private $window: angular.IWindowService, private driverService: DriverService, private $q: angular.IQService) { }\r\n\r\n link(scope: IDriverUsernameScope, element: angular.IAugmentedJQuery, attrs: angular.IAttributes, ngModel: angular.INgModelController) {\r\n\r\n ngModel.$asyncValidators[\"driverUsername\"] = modelValue => {\r\n if (scope.driverUsername === modelValue) {\r\n return this.$q.resolve();\r\n }\r\n return this.driverService.isDriverUsernameInUse(modelValue).then(result => {\r\n if (result) {\r\n return this.$q.reject(\"User name is in use\");\r\n }\r\n\r\n return this.$q.resolve();\r\n });\r\n };\r\n }\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n const directive = ($window: angular.IWindowService, driverService: DriverService, $q: angular.IQService) => new DriverUsernameDirective($window, driverService, $q);\r\n directive.$inject = ['$window', 'driverService', \"$q\"];\r\n return directive;\r\n }\r\n\r\n}\r\n","import { FleetNavigationModule } from \"@app/main/modules/fleet/fleet.navigation\";\r\nimport { StateService } from \"@uirouter/angularjs\";\r\nimport * as angular from \"angular\";\r\nimport \"./hideInProduction.scss\";\r\n\r\nexport class HideInProduction implements angular.IDirective {\r\n\r\n restrict = \"A\";\r\n terminal = true;\r\n priority = 1000;\r\n\r\n link: (scope: angular.IScope, element: ng.IAugmentedJQuery, attrs: ng.IAttributes) => void;\r\n\r\n constructor(\r\n private readonly $compile: angular.ICompileService,\r\n private readonly $state: StateService,\r\n private readonly $location: angular.ILocationService\r\n ) {\r\n HideInProduction.prototype.link = ($scope: angular.IScope, $element: angular.IAugmentedJQuery, $attrs: ng.IAttributes) => {\r\n\r\n var url = $location.absUrl();\r\n\r\n var developmentDomains: string[] = [\r\n \"localhost:\",\r\n \"dev.\",\r\n \"uat.\"\r\n ];\r\n\r\n const localhostOnly = $attrs[\"localhostOnly\"] as boolean;\r\n const redirect = $attrs[\"redirect\"] as string;\r\n\r\n const isUsingLocahost: boolean = url.indexOf(\"localhost\") === -1 || apiUrl.indexOf(\"localhost\") === -1;\r\n const isUsingDevelopment: boolean = developmentDomains.some(developmentDomain => url.indexOf(developmentDomain) > 1);\r\n\r\n const removeElement = localhostOnly ? isUsingLocahost : !isUsingDevelopment;\r\n\r\n if (removeElement) {\r\n if (redirect && redirect.toLowerCase() === \"true\") {\r\n this.$state.go(FleetNavigationModule.Default);\r\n }\r\n else {\r\n $element.remove();\r\n }\r\n }\r\n else {\r\n $element.removeAttr(\"hide-in-production\");\r\n $element.removeAttr(\"localhost-only\");\r\n $compile($element)($scope);\r\n $element.addClass(\"hide-in-production\");\r\n }\r\n }\r\n }\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n const directive = ($compile: angular.ICompileService, $state: StateService, $location: angular.ILocationService) => new HideInProduction($compile, $state, $location);\r\n\r\n directive.$inject = [\"$compile\", \"$state\", \"$location\"];\r\n\r\n return directive;\r\n }\r\n}\r\n","import * as angular from \"angular\";\r\nimport \"./hideOnIE.scss\";\r\n\r\nexport class HideOnIe implements angular.IDirective {\r\n\r\n restrict = \"A\";\r\n terminal = true;\r\n priority = 599; // One less than ng-if to allow ng-if to happen first\r\n\r\n link: (scope: angular.IScope, element: ng.IAugmentedJQuery, attrs: ng.IAttributes) => void;\r\n\r\n constructor($compile: angular.ICompileService) {\r\n HideOnIe.prototype.link = ($scope: angular.IScope, $element: angular.IAugmentedJQuery, $attrs: ng.IAttributes) => {\r\n \r\n // Do this if we need to test for IE11 specifically\r\n var isIE = /MSIE|Trident|Edge/.test(window.navigator.userAgent);\r\n \r\n var isIE11 = !!window[\"MSInputMethodContext\"] && !!document[\"documentMode\"];\r\n\r\n if (isIE) {\r\n $element.html(`
\r\n
This feature is not available on this browser
\r\n
Please try Chrome or Firefox
\r\n
`);\r\n }\r\n else {\r\n $element.removeAttr(\"hide-on-ie\");\r\n $compile($element)($scope);\r\n }\r\n }\r\n }\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n const directive = ($compile: angular.ICompileService) => new HideOnIe($compile);\r\n\r\n directive.$inject = [\"$compile\"];\r\n\r\n return directive;\r\n }\r\n}\r\n","\r\nimport { FleetNavigationModule } from \"@app/main/modules/fleet/fleet.navigation\";\r\nimport { AccountService } from \"@services/account.service\";\r\nimport { AccountOption } from \"@services/class/AccountOption\";\r\nimport { SessionService } from \"@services/session.service\";\r\nimport { StateService } from \"@uirouter/angularjs\";\r\nimport * as angular from \"angular\";\r\nimport { SettingsName } from \"../../class/SettingsName\";\r\nimport { AccountFeatures } from \"../../enum/account/AccountFeature\";\r\nimport { AccountFeatureService, FeatureAccessType } from \"../../services/accountFeature.service\";\r\n\r\nexport class IfEnabled implements angular.IDirective {\r\n\r\n restrict = \"A\";\r\n terminal = true;\r\n priority = 1000;\r\n\r\n link: (scope: angular.IScope, element: ng.IAugmentedJQuery, attrs: ng.IAttributes) => void;\r\n\r\n constructor(\r\n private readonly $compile: angular.ICompileService,\r\n private readonly $state: StateService,\r\n private readonly accountService: AccountService,\r\n private readonly accountFeatureService: AccountFeatureService,\r\n private readonly sessionService: SessionService\r\n ) {\r\n IfEnabled.prototype.link = ($scope: angular.IScope, $element: angular.IAugmentedJQuery, $attrs: ng.IAttributes) => {\r\n const readFeature = $attrs[\"ifFeatureReadAccess\"] as string;\r\n const manageFeature = $attrs[\"ifFeatureManageAccess\"] as string;\r\n\r\n const roles = $attrs[\"ifUserRole\"] as string;\r\n const option = $attrs[\"ifAccountOption\"] as string;\r\n\r\n if (!readFeature && !manageFeature && !roles && !option) {\r\n return;\r\n }\r\n\r\n const allRoles = $attrs[\"allRoles\"] as string;\r\n let requireAllRoles = false;\r\n\r\n if (allRoles && allRoles.toLowerCase() === \"true\") {\r\n requireAllRoles = true;\r\n }\r\n\r\n const redirectAttr = $attrs[\"redirect\"] as string;\r\n\r\n let redirect = false;\r\n if (redirectAttr && redirectAttr.toLowerCase() === \"true\") {\r\n redirect = true;\r\n }\r\n\r\n let removeElement = false;\r\n\r\n if (this.removeDueToFeatureAccess(readFeature, manageFeature) || this.removeDueToUserRole(roles, option, requireAllRoles)) {\r\n removeElement = true;\r\n }\r\n\r\n if (removeElement && redirect) {\r\n this.$state.go(FleetNavigationModule.Default);\r\n }\r\n else if (removeElement) {\r\n setTimeout(() => {\r\n $element.remove();\r\n });\r\n }\r\n else {\r\n $element.removeAttr(\"if-enabled\");\r\n $element.removeAttr(\"if-feature-read-access\"); // previously if-account-feature\r\n $element.removeAttr(\"if-feature-manage-access\");\r\n $element.removeAttr(\"if-user-role\");\r\n $element.removeAttr(\"if-account-option\");\r\n $element.removeAttr(\"all-roles\");\r\n $element.removeAttr(\"redirect\");\r\n $element.removeAttr(\"account-id\");\r\n\r\n this.$compile($element)($scope);\r\n }\r\n }\r\n\r\n }\r\n\r\n removeDueToFeatureAccess(readFeature: string, manageFeature: string): boolean {\r\n if (!readFeature && !manageFeature) {\r\n return false\r\n }\r\n\r\n const accountData = this.accountService.getAccountDataFromCache();\r\n const accountFeatureDescriptions = this.accountFeatureService.getFeatureDescriptionsForAccount(accountData);\r\n\r\n let hasReadFeatureAccess = true;\r\n let hasManageFeatureAccess = true;\r\n\r\n if (readFeature) {\r\n const matchingReadFeature = accountFeatureDescriptions.find(f => AccountFeatures[f.feature].toLowerCase() === readFeature.toLowerCase());\r\n\r\n if (matchingReadFeature) {\r\n hasReadFeatureAccess = this.accountFeatureService.currentUserHasFeatureAccess(matchingReadFeature.feature, FeatureAccessType.Read);\r\n }\r\n }\r\n\r\n if (manageFeature) {\r\n const matchingManageFeature = accountFeatureDescriptions.find(f => AccountFeatures[f.feature].toLowerCase() === manageFeature.toLowerCase());\r\n\r\n if (matchingManageFeature) {\r\n hasManageFeatureAccess = this.accountFeatureService.currentUserHasFeatureAccess(matchingManageFeature.feature, FeatureAccessType.Manage);\r\n }\r\n }\r\n\r\n return !hasReadFeatureAccess || !hasManageFeatureAccess;\r\n }\r\n\r\n removeDueToUserRole(roles: string, option: string, requireAllRoles: boolean): boolean {\r\n if (!roles && !option) {\r\n return false;\r\n }\r\n\r\n let removeElement = false;\r\n\r\n if (roles) {\r\n if (!this.accountFeatureService.currentUserHasRole(roles.split(\",\"), requireAllRoles)) {\r\n removeElement = true;\r\n }\r\n }\r\n\r\n if (option) {\r\n const accountOptions = this.sessionService.getItem(SettingsName.AccountOptions);\r\n\r\n if (!accountOptions || !accountOptions[option]) {\r\n removeElement = true;\r\n }\r\n }\r\n\r\n return removeElement;\r\n }\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n const directive = ($compile: angular.ICompileService, $state: StateService, accountService: AccountService, accountFeatureService: AccountFeatureService, sessionService: SessionService) => new IfEnabled($compile, $state, accountService, accountFeatureService, sessionService);\r\n\r\n directive.$inject = [\"$compile\", \"$state\", \"accountService\", \"accountFeatureService\", \"sessionService\", \"foundationAccountService\"];\r\n\r\n return directive;\r\n }\r\n}\r\n","import { UsersService } from \"@services/users.service\";\r\nimport { StateService } from \"@uirouter/angularjs\";\r\nimport * as angular from \"angular\";\r\n\r\nexport class IfUserInternal implements angular.IDirective {\r\n\r\n restrict = \"A\";\r\n terminal = true;\r\n priority = 1000;\r\n\r\n link: (scope: angular.IScope, element: ng.IAugmentedJQuery, attrs: ng.IAttributes) => void;\r\n\r\n constructor(\r\n private readonly $compile: angular.ICompileService,\r\n private readonly $state: StateService,\r\n private readonly usersService: UsersService) {\r\n IfUserInternal.prototype.link = ($scope: angular.IScope, $element: angular.IAugmentedJQuery, $attrs: ng.IAttributes) => {\r\n if (!usersService.isCurrentUserInternal()) {\r\n $element.remove();\r\n } else {\r\n $element.removeAttr(\"if-user-internal\");\r\n $compile($element)($scope);\r\n }\r\n }\r\n }\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n const directive = ($compile: angular.ICompileService, $state: StateService, usersService: UsersService) => new IfUserInternal($compile, $state, usersService);\r\n\r\n directive.$inject = [\"$compile\", \"$state\", \"usersService\"];\r\n\r\n return directive;\r\n }\r\n}\r\n","import { UsersService } from \"@services/users.service\";\r\nimport { StateService } from \"@uirouter/angularjs\";\r\nimport * as angular from \"angular\";\r\n\r\nexport class IfUserInternalOrFoundation implements angular.IDirective {\r\n\r\n restrict = \"A\";\r\n terminal = true;\r\n priority = 1000;\r\n\r\n link: (scope: angular.IScope, element: ng.IAugmentedJQuery, attrs: ng.IAttributes) => void;\r\n\r\n constructor(\r\n private readonly $compile: angular.ICompileService,\r\n private readonly $state: StateService,\r\n private readonly usersService: UsersService) {\r\n IfUserInternalOrFoundation.prototype.link = ($scope: angular.IScope, $element: angular.IAugmentedJQuery, $attrs: ng.IAttributes) => {\r\n if (!usersService.isCurrentUserInternal() && !usersService.isCurrentUserOnFoundationPlatform()) {\r\n $element.remove();\r\n } else {\r\n $element.removeAttr(\"if-user-internal-or-foundation\");\r\n $compile($element)($scope);\r\n }\r\n }\r\n }\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n const directive = ($compile: angular.ICompileService, $state: StateService, usersService: UsersService) => new IfUserInternalOrFoundation($compile, $state, usersService);\r\n\r\n directive.$inject = [\"$compile\", \"$state\", \"usersService\"];\r\n\r\n return directive;\r\n }\r\n}\r\n","import { UsersService } from \"@services/users.service\";\r\nimport { StateService } from \"@uirouter/angularjs\";\r\nimport * as angular from \"angular\";\r\n\r\nexport class IfUserNotInternal implements angular.IDirective {\r\n\r\n restrict = \"A\";\r\n terminal = true;\r\n priority = 1000;\r\n\r\n link: (scope: angular.IScope, element: ng.IAugmentedJQuery, attrs: ng.IAttributes) => void;\r\n\r\n constructor(\r\n private readonly $compile: angular.ICompileService,\r\n private readonly $state: StateService,\r\n private readonly usersService: UsersService) {\r\n IfUserNotInternal.prototype.link = ($scope: angular.IScope, $element: angular.IAugmentedJQuery, $attrs: ng.IAttributes) => {\r\n if (usersService.isCurrentUserInternal()) {\r\n $element.remove();\r\n } else {\r\n $element.removeAttr(\"if-user-not-internal\");\r\n $compile($element)($scope);\r\n }\r\n }\r\n }\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n const directive = ($compile: angular.ICompileService, $state: StateService, usersService: UsersService) => new IfUserNotInternal($compile, $state, usersService);\r\n\r\n directive.$inject = [\"$compile\", \"$state\", \"usersService\"];\r\n\r\n return directive;\r\n }\r\n}\r\n","\r\nimport * as angular from \"angular\";\r\n\r\nexport interface IKeyWordTriggerDirectiveScope extends angular.IScope {\r\n keyWordTrigger: () => void;\r\n}\r\n\r\nexport class KeyWordTriggerDirective implements angular.IDirective {\r\n\r\n restrict = \"A\";\r\n scope = {\r\n keyWordTrigger: \"&\"\r\n }\r\n\r\n link: ($scope: IKeyWordTriggerDirectiveScope, element: angular.IAugmentedJQuery, attrs: angular.IAttributes) => void;\r\n\r\n constructor($timeout: angular.ITimeoutService, $document: angular.IDocumentService) {\r\n\r\n KeyWordTriggerDirective.prototype.link = ($scope: IKeyWordTriggerDirectiveScope, $element: angular.IAugmentedJQuery, $attrs: ng.IAttributes) => {\r\n\r\n const triggerWord = $attrs[\"wordTrigger\"];\r\n if (!triggerWord) {\r\n console.error(\"KeyWordTrigger requires a trigger word\", $attrs, $element[0]);\r\n return;\r\n }\r\n\r\n const triggerWordArray: string[] = [];\r\n const keyBuffer: string[] = [];\r\n\r\n for (let i = 0; i < triggerWord.length; i++) {\r\n triggerWordArray.push(triggerWord[i]);\r\n }\r\n\r\n $element.on(\"keydown\", (eventObject: JQueryEventObject) => {\r\n keyBuffer.push(String.fromCharCode(eventObject.keyCode).toLowerCase());\r\n while (keyBuffer.length > triggerWordArray.length) {\r\n keyBuffer.shift();\r\n }\r\n\r\n if (triggerWordArray.join(\"\") === keyBuffer.join(\"\")) {\r\n if ($scope.keyWordTrigger) {\r\n $scope.keyWordTrigger();\r\n $scope.$applyAsync();\r\n }\r\n }\r\n });\r\n\r\n $scope.$on(\"$destroy\", () => {\r\n $element.off(\"keydown\");\r\n });\r\n }\r\n }\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n const directive = ($timeout: angular.ITimeoutService, $document: angular.IDocumentService) => new KeyWordTriggerDirective($timeout, $document);\r\n\r\n directive.$inject = [\"$timeout\", \"$document\"];\r\n\r\n return directive;\r\n }\r\n}\r\n","\r\nimport { BroadcastEvent } from \"@enums/BroadcastEvent\";\r\nimport * as angular from \"angular\";\r\nimport { ConstantsService } from \"@services/constantsService\";\r\nimport \"./popup.scss\";\r\n\r\ninterface IPopupPositionInfo {\r\n top: number;\r\n left: number;\r\n yOverrun: number;\r\n}\r\n\r\nexport interface IPopupBindings extends angular.IComponentController {\r\n mouseEvent: MouseEvent;\r\n popupLocation: google.maps.Point;\r\n arrowPosition: \"top\" | \"bottom\" | \"left\" | \"right\";\r\n showOnRight: boolean;\r\n\r\n showDelay: number;\r\n hideDelay: number;\r\n\r\n minShowTime: number;\r\n onClose: () => void;\r\n}\r\n\r\nclass PopupComponentController implements angular.IComponentController, IPopupBindings {\r\n\r\n mouseEvent: MouseEvent;\r\n previousMouseEvent: MouseEvent;\r\n popupLocation: google.maps.Point;\r\n arrowPosition: \"top\" | \"bottom\" | \"left\" | \"right\";\r\n showOnRight: boolean;\r\n\r\n showDelay: number;\r\n hideDelay: number;\r\n\r\n minShowTime: number;\r\n\r\n onClose: () => void;\r\n\r\n uniqueCode: string;\r\n transEl: JQuery;\r\n\r\n requireSameElement = true;\r\n showCenter: boolean;\r\n\r\n isMobile: boolean;\r\n\r\n static isDisplayed: boolean;\r\n\r\n static popupPosition: IPopupPositionInfo;\r\n static previousPopupPosition: IPopupPositionInfo;\r\n\r\n static popupWrapper: JQuery;\r\n\r\n static showPromise: angular.IPromise;\r\n static hidePromise: angular.IPromise;\r\n\r\n static lastUniqueCodeDisplayed: string;\r\n\r\n readonly popupClassName = \"show-popup\";\r\n static $inject = [\"$scope\", \"$element\", \"$transclude\", \"$timeout\", \"constantsService\"];\r\n\r\n constructor(\r\n private readonly $scope: angular.IScope,\r\n private readonly $element: angular.IAugmentedJQuery,\r\n private readonly $transclude: angular.ITranscludeFunction,\r\n private readonly $timeout: angular.ITimeoutService,\r\n private readonly constantsService: ConstantsService) {\r\n this.uniqueCode = Math.random().toString(36).substring(2) + Date.now().toString(36);\r\n }\r\n\r\n $onInit() {\r\n this.isMobile = this.constantsService.getIsMobile();\r\n if (this.isMobile) {\r\n this.showCenter = true;\r\n }\r\n\r\n PopupComponentController.popupWrapper = angular.element(\"popup-wrapper\");\r\n //if (this.popupWrapper.length == 0) {\r\n // this.popupWrapper = angular.element(\"\");\r\n // angular.element(document.body).append(this.popupWrapper);\r\n //}\r\n\r\n this.showDelay = this.showDelay || 350;\r\n this.hideDelay = this.hideDelay || 350;\r\n // Todo: Make this only happen once per static instance as we are duplicating handlers...\r\n this.registerHandlers();\r\n\r\n this.$scope.$on(BroadcastEvent.hidePopup, () => {\r\n this.hidePopup(true);\r\n });\r\n }\r\n\r\n $onDestroy() {\r\n if (this.transEl) {\r\n this.transEl.remove();\r\n }\r\n\r\n this.unregisterHandlers();\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n\r\n if (!PopupComponentController.popupWrapper) {\r\n return;\r\n }\r\n\r\n if (this.requireSameElement && this.previousMouseEvent) {\r\n if (!PopupComponentController.isDisplayed) {\r\n\r\n // If we are not the same target object, then abort the show\r\n if (this.getEventTargetElement(this.mouseEvent, true) != this.getEventTargetElement(this.previousMouseEvent, true)) {\r\n this.hidePopup();\r\n }\r\n }\r\n }\r\n\r\n this.arrowPosition = this.arrowPosition || \"left\";\r\n\r\n if (PopupComponentController.lastUniqueCodeDisplayed != this.uniqueCode) {\r\n\r\n var $$element = PopupComponentController.popupWrapper;\r\n\r\n this.$transclude((transEl, transScope: any) => {\r\n\r\n $$element.empty();\r\n\r\n // Now append transcluded element to your element\r\n this.transEl = transEl;\r\n $$element.append(transEl);\r\n });\r\n\r\n PopupComponentController.lastUniqueCodeDisplayed = this.uniqueCode;\r\n\r\n this.updateArrowPosition();\r\n }\r\n\r\n if (this.mouseEvent || this.popupLocation) {\r\n this.updatePopupPosition();\r\n\r\n this.showPopup();\r\n }\r\n else {\r\n this.hidePopup();\r\n }\r\n\r\n this.previousMouseEvent = this.mouseEvent;\r\n }\r\n\r\n // ----------------------------------------\r\n\r\n private updatePopupPosition() {\r\n PopupComponentController.previousPopupPosition = PopupComponentController.popupPosition;\r\n\r\n if (this.mouseEvent) {\r\n var element = this.getEventTargetElement(this.mouseEvent);\r\n PopupComponentController.popupPosition = this.getElementPositionInfo(element);\r\n }\r\n\r\n if (this.popupLocation) {\r\n PopupComponentController.popupPosition = PopupComponentController.popupPosition || { left: 0, top: 0, yOverrun: 0 };\r\n PopupComponentController.popupPosition.left = this.popupLocation.x;\r\n PopupComponentController.popupPosition.top = this.popupLocation.y;\r\n\r\n // Now adjust for arrow location - lets just assume bottom for now to make things easier\r\n //const popupWidth = this.popupWrapper.width();\r\n //const popupHeight = this.popupWrapper.height();\r\n //this.popupPosition.left += popupWidth / 2;\r\n //this.popupPosition.top -= popupHeight;\r\n }\r\n\r\n if (!PopupComponentController.previousPopupPosition || PopupComponentController.previousPopupPosition.top != PopupComponentController.popupPosition.top || PopupComponentController.previousPopupPosition.left != PopupComponentController.popupPosition.left) {\r\n PopupComponentController.popupWrapper[0].style.left = PopupComponentController.popupPosition.left + 'px';\r\n PopupComponentController.popupWrapper[0].style.top = PopupComponentController.popupPosition.top + 'px';\r\n }\r\n\r\n this.updateOverrunClass();\r\n }\r\n\r\n private updateOverrunClass() {\r\n var classes = PopupComponentController.popupWrapper[0].className.split(\" \");\r\n\r\n var classesToKeep: string[] = [];\r\n\r\n classes.forEach(c => {\r\n if (!c.startsWith(\"ao-\")) {\r\n classesToKeep.push(c);\r\n }\r\n });\r\n\r\n if (PopupComponentController.popupPosition.yOverrun > 0) {\r\n classesToKeep.push(`ao-${PopupComponentController.popupPosition.yOverrun}`);\r\n }\r\n\r\n PopupComponentController.popupWrapper[0].className = classesToKeep.join(\" \");\r\n }\r\n\r\n private updateArrowPosition() {\r\n\r\n PopupComponentController.popupWrapper.removeClass(\"top\");\r\n PopupComponentController.popupWrapper.removeClass(\"bottom\");\r\n PopupComponentController.popupWrapper.removeClass(\"left\");\r\n PopupComponentController.popupWrapper.removeClass(\"right\");\r\n PopupComponentController.popupWrapper.addClass(this.arrowPosition);\r\n }\r\n\r\n private showPopup() {\r\n this.cancelHide();\r\n\r\n if (PopupComponentController.isDisplayed) {\r\n return;\r\n }\r\n\r\n if (PopupComponentController.showPromise) {\r\n return;\r\n }\r\n\r\n PopupComponentController.showPromise = this.$timeout(() => {\r\n PopupComponentController.popupWrapper.addClass(this.popupClassName);\r\n this.updateArrowPosition();\r\n\r\n PopupComponentController.showPromise = null;\r\n PopupComponentController.isDisplayed = true;\r\n\r\n }, this.showDelay);\r\n }\r\n\r\n private hidePopup(ignoreDelay = false) {\r\n this.cancelShow();\r\n this.cancelHide();\r\n\r\n if (!PopupComponentController.isDisplayed) {\r\n return;\r\n }\r\n\r\n var delay = ignoreDelay ? 0 : this.hideDelay;\r\n\r\n PopupComponentController.hidePromise = this.$timeout(() => {\r\n PopupComponentController.popupWrapper.removeClass(this.popupClassName);\r\n\r\n // All animations are 0.3s so gives the transition chance to occur BEFORE we call OnClose\r\n this.$timeout(() => {\r\n if (this.onClose) {\r\n PopupComponentController.isDisplayed = false;\r\n this.onClose();\r\n }\r\n }, 300);\r\n }, delay);\r\n }\r\n\r\n\r\n private cancelShow() {\r\n if (PopupComponentController.showPromise) {\r\n this.$timeout.cancel(PopupComponentController.showPromise);\r\n PopupComponentController.showPromise = null;\r\n }\r\n }\r\n\r\n private cancelHide() {\r\n if (PopupComponentController.hidePromise) {\r\n this.$timeout.cancel(PopupComponentController.hidePromise);\r\n PopupComponentController.hidePromise = null;\r\n }\r\n }\r\n\r\n private getElementPositionInfo(targetElement: HTMLElement): IPopupPositionInfo {\r\n if (!targetElement || targetElement?.children[0]?.nodeName == 'HTML') {\r\n console.warn(\"getElementPositionInfo - No Target Element provided\");\r\n return null;\r\n }\r\n\r\n var elementHeight = Math.max(PopupComponentController.popupWrapper[0].offsetHeight, PopupComponentController.popupWrapper[0].scrollHeight);\r\n\r\n const padding = 10;\r\n const leftPadding = 8;\r\n\r\n var rect = targetElement.getBoundingClientRect(),\r\n scrollLeft = window.pageXOffset || document.documentElement.scrollLeft,\r\n scrollTop = window.pageYOffset || document.documentElement.scrollTop;\r\n\r\n var position: IPopupPositionInfo = {\r\n top: rect.top + scrollTop,\r\n left: rect.left + scrollLeft - leftPadding,\r\n yOverrun: 0\r\n }\r\n\r\n if (this.showOnRight) {\r\n position.left = rect.left + targetElement.offsetWidth + leftPadding;\r\n\r\n PopupComponentController.popupWrapper.addClass(\"show-on-right\");\r\n }\r\n else {\r\n PopupComponentController.popupWrapper.removeClass(\"show-on-right\");\r\n }\r\n\r\n const defaultTriangleOffset = 30;\r\n\r\n // 30 is the default triangle position for the dialog\r\n if (rect.height < defaultTriangleOffset) {\r\n\r\n position.top -= defaultTriangleOffset - rect.height;\r\n }\r\n\r\n if (this.showCenter) {\r\n position.left = 45;\r\n position.top = rect.top + 5;\r\n PopupComponentController.popupWrapper.addClass(\"show-on-right\");\r\n }\r\n\r\n // Todo: Make sure AO only gets added once (i.e. cache previous)\r\n // Make sure things dont happen if we are not visible, i.e. class changes\r\n // Dont re-add any class, including show-popup if already added\r\n\r\n position.yOverrun = position.top + elementHeight - document.documentElement.scrollHeight;\r\n\r\n if (position.yOverrun > 0) {\r\n\r\n position.top -= position.yOverrun + padding;\r\n\r\n // Round to nearest 5\r\n position.yOverrun = Math.ceil(position.yOverrun / 5) * 5;\r\n\r\n while (position.yOverrun + defaultTriangleOffset + 10 > elementHeight) {\r\n position.yOverrun -= 5;\r\n }\r\n }\r\n\r\n return position;\r\n }\r\n\r\n private getEventTargetElement(event: MouseEvent, startAtLeafNode = false): HTMLElement {\r\n if (!event) {\r\n return null;\r\n }\r\n\r\n if (startAtLeafNode) {\r\n return (event.target || event.currentTarget) as HTMLElement;\r\n }\r\n\r\n return (event.currentTarget || event.target) as HTMLElement;\r\n }\r\n\r\n private registerHandlers() {\r\n document.body.addEventListener('click', this.bodyClickHandler);\r\n\r\n PopupComponentController.popupWrapper[0].addEventListener('mouseenter', this.mouseEnterHandler);\r\n PopupComponentController.popupWrapper[0].addEventListener('mouseleave', this.mouseLeaveHandler);\r\n }\r\n\r\n private unregisterHandlers() {\r\n document.body.removeEventListener('click', this.bodyClickHandler);\r\n PopupComponentController.popupWrapper[0].removeEventListener('mouseenter', this.mouseEnterHandler);\r\n PopupComponentController.popupWrapper[0].removeEventListener('mouseleave', this.mouseLeaveHandler);\r\n }\r\n\r\n private bodyClickHandler = (event: MouseEvent) => {\r\n var element = this.getEventTargetElement(event, true);\r\n\r\n if (!element) {\r\n return;\r\n }\r\n\r\n while (element.parentElement) {\r\n if (element.parentElement.nodeName.toLocaleLowerCase() == \"popup-wrapper\") {\r\n return;\r\n }\r\n\r\n element = element.parentElement;\r\n }\r\n\r\n this.hidePopup(true);\r\n }\r\n\r\n private mouseEnterHandler = (event: MouseEvent) => {\r\n this.cancelHide();\r\n }\r\n\r\n private mouseLeaveHandler = (event: MouseEvent) => {\r\n this.hidePopup();\r\n }\r\n}\r\n\r\nexport class PopupComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n transclude?: boolean | { [slot: string]: string };\r\n\r\n constructor() {\r\n this.bindings = {\r\n mouseEvent: \"<\",\r\n popupLocation: \"<\",\r\n\r\n arrowPosition: \"@\",\r\n requireSameElement: \"@\",\r\n showOnRight: \"<\",\r\n\r\n showDelay: \"<\",\r\n hideDelay: \"<\",\r\n onClose: \"&\"\r\n };\r\n\r\n this.transclude = true;\r\n\r\n this.controller = PopupComponentController;\r\n }\r\n}\r\n","\r\nimport * as angular from \"angular\";\r\nimport { PrintService } from \"@services/print.service\";\r\nimport \"./printElement.scss\";\r\n\r\nexport class PrintElementDirective implements angular.IDirective {\r\n\r\n restrict = 'A';\r\n\r\n printSection: HTMLElement;\r\n\r\n static $inject = [\"printService\"];\r\n\r\n constructor(private readonly printService: PrintService) {\r\n }\r\n\r\n link(scope: angular.IScope, element: angular.IAugmentedJQuery, attrs: angular.IAttributes, ngModel: angular.INgModelController) {\r\n element.bind(\"click\", (evt) => {\r\n evt.preventDefault();\r\n \r\n this.printService.print(attrs[\"printElement\"]);\r\n });\r\n }\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n const directive = (printService: PrintService) => new PrintElementDirective(printService);\r\n\r\n directive.$inject = [\"printService\"];\r\n\r\n return directive;\r\n }\r\n}\r\n","\r\nimport { VersionService } from \"@services/version.service\";\r\nimport * as angular from \"angular\";\r\nimport \"./site-updated-indicator.component.scss\";\r\n\r\nclass SiteUpdatedIndicatorComponentController implements angular.IComponentController {\r\n\r\n show: boolean;\r\n\r\n static $inject = [\"$rootScope\", \"$window\", \"versionService\"];\r\n\r\n constructor(\r\n private $rootScope: angular.IRootScopeService,\r\n private $window: angular.IWindowService,\r\n private versionService: VersionService) {\r\n\r\n this.$rootScope.$on(\"versionUpdated\", (event, newVersion: string, previousVersion: string) => {\r\n this.versionUpdated();\r\n });\r\n }\r\n\r\n $onInit(): void {\r\n }\r\n\r\n refresh() {\r\n this.$window.location.reload(true);\r\n }\r\n\r\n dismiss() {\r\n this.show = false;\r\n }\r\n\r\n // ---\r\n\r\n private versionUpdated() {\r\n this.show = true;\r\n }\r\n}\r\n\r\nexport class SiteUpdatedIndicator implements angular.IComponentOptions {\r\n bindings: any;\r\n template: string;\r\n controller: any;\r\n\r\n constructor() {\r\n this.bindings = {};\r\n\r\n this.controller = SiteUpdatedIndicatorComponentController;\r\n\r\n this.template = require(\"./site-updated-indicator.component.html\");\r\n }\r\n}\r\n","module.exports = \"
clear
{{ 'Common.UpdateAvailable' | translate }}
{{ 'Common.PortalUpdated' | translate }}
\";","import { CanvasService } from \"@services/canvas.service\";\r\nimport * as angular from \"angular\";\r\nimport \"./snow.scss\";\r\n\r\ninterface ISnowflakeArgs {\r\n\r\n w?: number;\r\n h?: number;\r\n\r\n particleMaxPer: number;\r\n particleSinus: number[];\r\n particleOpacity: number[];\r\n particleSpeed: number[];\r\n particleSize: number[];\r\n\r\n summer?: number;\r\n}\r\n\r\ninterface ISnowflake {\r\n delta?: number,\r\n alpha?: number,\r\n speed?: number,\r\n x?: number,\r\n y?: number,\r\n r?: number\r\n}\r\n\r\nclass Controller implements angular.IComponentController {\r\n canvas: HTMLCanvasElement;\r\n ctx: CanvasRenderingContext2D;\r\n stop: boolean;\r\n\r\n snowflakes?: ISnowflake[];\r\n\r\n platform = { left: 0, width: 0, top: 0 };\r\n\r\n config: ISnowflakeArgs = {\r\n particleMaxPer: navigator.hardwareConcurrency\r\n ? Math.floor(navigator.hardwareConcurrency * 100 /*/ 3*/)\r\n : 100,\r\n particleSize: [1.5, 6],\r\n particleOpacity: [.3, 1],\r\n particleSpeed: [30, 100],\r\n particleSinus: [1, 100]\r\n };\r\n\r\n static $inject = [\"$element\", \"$timeout\", \"canvasService\"];\r\n\r\n constructor(\r\n private readonly $element: JQuery,\r\n private readonly $timeout: angular.ITimeoutService,\r\n private readonly canvasService: CanvasService) {\r\n }\r\n\r\n $onInit() {\r\n\r\n this.snowflakes = [];\r\n\r\n this.canvas = this.$element.find(\"canvas\")[0] as HTMLCanvasElement;\r\n this.ctx = this.canvas.getContext(\"2d\");\r\n\r\n //console.log(canvas, this.ctx);\r\n this.config.w = this.$element.outerWidth() || this.canvas.width;\r\n this.config.h = this.$element.outerHeight() || this.canvas.height;\r\n\r\n this.canvas.width = this.config.w;\r\n this.canvas.height = this.config.h;\r\n\r\n for (var c = this.config.w * this.config.h / 15E5; this.snowflakes.length < this.config.particleMaxPer * c;) {\r\n this.snowflakes.push(this.createSnowFlake());\r\n }\r\n\r\n // On init skip forward a number of frames so we start with snow\r\n for (var i = 0; i < 200; i++) {\r\n this.iterateSnowFlakes(false);\r\n }\r\n\r\n this.animateFrame();\r\n\r\n console.log(\"Starting snow with\", this.config.particleMaxPer, \"particles\");\r\n }\r\n\r\n $onDestroy() {\r\n this.stop = true;\r\n\r\n this.$timeout(() => { \r\n this.canvasService.destroyCachedImageCanvases();\r\n });\r\n }\r\n\r\n // ---\r\n\r\n private animateFrame() {\r\n if (this.stop) {\r\n return;\r\n }\r\n\r\n window.requestAnimationFrame(() => {\r\n performance.mark(\"iterateSnowFlakes\");\r\n this.iterateSnowFlakes();\r\n performance.measure(\"iterateSnowFlakes\");\r\n\r\n this.animateFrame();\r\n });\r\n }\r\n\r\n private iterateSnowFlakes(draw = true) {\r\n\r\n if (draw) {\r\n this.ctx.clearRect(0, 0, this.config.w, this.config.h);\r\n }\r\n\r\n var d = this.config.h / 3,\r\n e = this.config.h / 3 * 2,\r\n b;\r\n\r\n for (b in this.snowflakes) {\r\n let snowFlake = this.snowflakes[b];\r\n\r\n if (!(0 > snowFlake.y + .1 * snowFlake.r && 1 == this.config.summer || snowFlake.y > this.config.h + snowFlake.r && 1 == this.config.summer)) {\r\n // Check for platform hit\r\n var originalY = snowFlake.y;\r\n var originalX = snowFlake.x;\r\n\r\n this.snowflakes[b].delta += snowFlake.delta == Math.PI / 2\r\n ? -this.snowflakes[b].delta\r\n : Math.random() / 500 - .01;\r\n\r\n this.config.summer\r\n ? snowFlake.y += this.snowflakes[b].speed / 50 + .1 * this.snowflakes[b].r\r\n : snowFlake.y += this.snowflakes[b].speed / 100 + .1 * this.snowflakes[b].r;\r\n\r\n this.snowflakes[b].x += .1 * Math.sin(snowFlake.delta) * this.snowflakes[b].r;\r\n this.snowflakes[b].y > this.config.h + snowFlake.r && 1 != this.config.summer && (this.snowflakes[b] = this.createSnowFlake(), snowFlake = this.snowflakes[b], this.snowflakes[b].y = 0 - this.snowflakes[b].r);\r\n\r\n var h = snowFlake.y - d,\r\n f = snowFlake.r,\r\n l = snowFlake.alpha;\r\n\r\n if (0 < h || 1 == this.config.summer) h = 1 - h / e,\r\n f = this.snowflakes[b].r * h,\r\n l = this.snowflakes[b].alpha * h;\r\n\r\n f = .1 > f ? .1 : f;\r\n l = .1 > l ? .1 : l;\r\n\r\n this.snowflakes[b].x = this.snowflakes[b].x > this.config.w + this.snowflakes[b].r\r\n ? 0\r\n : this.snowflakes[b].x < -f\r\n ? this.config.w\r\n : this.snowflakes[b].x;\r\n\r\n if (this.snowflakes[b].x >= this.platform.left && this.snowflakes[b].x < this.platform.left + this.platform.width && this.snowflakes[b].y /*+ 10*/ + Math.ceil(this.snowflakes[b].r + 1.5) > this.platform.top) {\r\n this.snowflakes[b].x = originalX;\r\n this.snowflakes[b].y = originalY;\r\n this.snowflakes[b].y = originalY + 0.04;\r\n\r\n //this.snowflakes[b].y -= 1;\r\n this.snowflakes[b].alpha -= 0.002;\r\n if (this.snowflakes[b].alpha <= 0) {\r\n this.snowflakes[b] = this.createSnowFlake();\r\n }\r\n }\r\n\r\n if (draw) {\r\n this.drawSnowFlake(this.snowflakes[b], l, f);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private drawSnowFlake(snowflake: ISnowflake, alpha: number, radius: number) {\r\n if (typeof radius === \"undefined\") {\r\n return;\r\n }\r\n\r\n ////return;\r\n\r\n //console.log(\"drawSnowFlake\", snowflake.x, snowflake.y, radius, Math.ceil(radius * 2));\r\n\r\n var useNewFancy = false;\r\n\r\n if (useNewFancy) {\r\n var diameter = Math.ceil(radius * 2);\r\n var imageCanvas = this.canvasService.getCachedImageCanvas(diameter, diameter);\r\n if (!imageCanvas) {\r\n imageCanvas = this.canvasService.createCachedImageCanvas(diameter, diameter);\r\n var cachedCtx = imageCanvas.getContext(\"2d\");\r\n\r\n cachedCtx.beginPath();\r\n cachedCtx.arc(radius, radius, radius, 2 * Math.PI, 0);\r\n cachedCtx.fillStyle = \"white\";\r\n cachedCtx.fill();\r\n\r\n //console.log(\"cache miss\", radius, diameter);\r\n }\r\n\r\n this.ctx.globalAlpha = alpha;\r\n this.ctx.drawImage(imageCanvas, snowflake.x, snowflake.y);\r\n }\r\n else {\r\n this.ctx.beginPath();\r\n this.ctx.arc(snowflake.x, snowflake.y, radius, 2 * Math.PI, 0);\r\n this.ctx.fillStyle = \"rgba(255,255,255,\" + alpha + \")\";\r\n this.ctx.fill();\r\n }\r\n }\r\n\r\n private createSnowFlake(): ISnowflake {\r\n\r\n var snowflake: ISnowflake = {\r\n delta: (this.config.particleSinus[0] + Math.random() * (this.config.particleSinus[1] - this.config.particleSinus[0])) * Math.round(2 * Math.random() - 1),\r\n r: this.config.particleSize[0] + Math.random() * (this.config.particleSize[1] - this.config.particleSize[0]),\r\n alpha: this.config.particleOpacity[0] + Math.random() * (this.config.particleOpacity[1] - this.config.particleOpacity[0]),\r\n\r\n x: Math.random() * this.config.w,\r\n y: Math.random() * -this.config.h,\r\n };\r\n\r\n snowflake.speed = (this.config.particleSpeed[0] + Math.random() * (this.config.particleSpeed[1] - this.config.particleSpeed[0])) * snowflake.r / 3;\r\n\r\n return snowflake;\r\n }\r\n}\r\n\r\nexport class SnowComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n\r\n constructor() {\r\n this.bindings = {\r\n };\r\n\r\n this.controller = Controller;\r\n this.template = \"\";\r\n }\r\n}\r\n","\r\nimport * as angular from \"angular\";\r\nimport * as moment from \"moment\";\r\n\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\n\r\nclass TimeAgoController implements angular.IComponentController {\r\n\r\n date: Date | moment.Moment;\r\n timeAgo: string;\r\n intervalPromise: angular.IPromise;\r\n\r\n static $inject = [\"$interval\", \"veriDate\"];\r\n\r\n constructor(\r\n private readonly $interval: angular.IIntervalService,\r\n private readonly veriDate: VeriDate) {\r\n }\r\n\r\n $onInit(): void {\r\n this.render();\r\n\r\n this.intervalPromise = this.$interval(() => { this.render(); }, 60 * 1000);\r\n }\r\n\r\n $onDestroy(): void {\r\n this.$interval.cancel(this.intervalPromise);\r\n }\r\n\r\n private render() {\r\n this.timeAgo = this.veriDate.formatDate(this.date, \"timeago\");\r\n }\r\n}\r\n\r\nexport class TimeAgoComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n\r\n constructor() {\r\n this.bindings = {\r\n date: \"<\"\r\n };\r\n\r\n this.controller = TimeAgoController;\r\n this.template = \"{{$ctrl.timeAgo}}\";\r\n }\r\n}\r\n","\r\nimport * as angular from \"angular\";\r\n\r\nexport class VeriDialogController {\r\n\r\n static $inject = [ \"$mdDialog\"];\r\n\r\n constructor(private readonly $mdDialog: angular.material.IDialogService) {\r\n }\r\n\r\n cancel(): void {\r\n this.$mdDialog.cancel();\r\n }\r\n\r\n hide(): void {\r\n this.$mdDialog.hide();\r\n }\r\n}\r\n","import * as angular from \"angular\";\r\nimport { ClickOutDirective } from \"./clickOut/clickOut.directive\";\r\nimport { FastScrollDirective } from \"./fastScroll.directive\";\r\nimport { ngMouseWheelDown } from \"./ngMouseWheelDown.directive\";\r\nimport { ngMouseWheelUp } from \"./ngMouseWheelUp.directive\";\r\nimport { ngRightClick } from \"./rightClick.directive\";\r\nimport { ScrollToDirective } from \"./scrollTo.directive\";\r\nimport { ScrollShadowDirective } from \"./scrollShadow.directive\";\r\n\r\nangular\r\n .module(\"app.mouse.directives\", [])\r\n\r\n .directive(\"fastScroll\", FastScrollDirective.factory())\r\n .directive(\"clickOut\", ClickOutDirective.factory())\r\n .directive(\"ngMouseWheelDown\", ngMouseWheelDown)\r\n .directive(\"ngMouseWheelUp\", ngMouseWheelUp)\r\n .directive(\"ngRightClick\", ['$parse', ngRightClick])\r\n .directive(\"scrollShadow\", ScrollShadowDirective.factory())\r\n .directive(\"scrollTo\", ScrollToDirective.factory())\r\n ;\r\n","\r\nimport * as angular from \"angular\";\r\n\r\nexport interface IClickOutDirectiveScope extends angular.IScope {\r\n\r\n clickOut: () => void;\r\n}\r\n\r\nexport class ClickOutDirective implements angular.IDirective {\r\n\r\n restrict = \"A\";\r\n\r\n link: ($scope: IClickOutDirectiveScope, element: angular.IAugmentedJQuery, attrs: angular.IAttributes) => void;\r\n\r\n constructor($timeout: angular.ITimeoutService, $document: angular.IDocumentService) {\r\n\r\n ClickOutDirective.prototype.link = ($scope: IClickOutDirectiveScope, $element: angular.IAugmentedJQuery, attrs: ng.IAttributes) => {\r\n\r\n const onClick = (event: JQueryEventObject) => {\r\n const isChild = $element[0].contains(event.target);\r\n const isSelf = $element[0] === event.target;\r\n const isInside = isChild || isSelf;\r\n\r\n let isIgnored = false; // clickout shouldn't be ignored unless...\r\n if (attrs.clickOutIgnoreClasses) {\r\n isIgnored = ClickOutDirective.shouldIgnoreElement(\r\n event.target,\r\n attrs.clickOutIgnoreClasses.split(' ').map(classNameStr => classNameStr.trim())\r\n );\r\n }\r\n\r\n const doClickOut = !isInside && !isIgnored;\r\n\r\n if (doClickOut && attrs.clickOut) {\r\n $scope.$eval(attrs.clickOut)\r\n\r\n $scope.$applyAsync();\r\n }\r\n\r\n event.stopPropagation();\r\n event.cancelBubble = true;\r\n }\r\n\r\n $timeout(() => {\r\n $document.bind(\"click\", onClick);\r\n }, 500);\r\n\r\n $scope.$on(\"$destroy\", () => {\r\n $document.unbind(\"click\", onClick);\r\n });\r\n }\r\n }\r\n\r\n // decides whether click out should be ignored for passed element\r\n static shouldIgnoreElement(element: Element, classesToIgnore: string[]): boolean {\r\n ClickOutDirective.shouldIgnoreElement[\"parentCounter\"] = ClickOutDirective.shouldIgnoreElement[\"parentCounter\"] ?? 0\r\n ClickOutDirective.shouldIgnoreElement[\"parentCounter\"]++\r\n\r\n // we don't want to go too high up the parents tree\r\n // when the limit is exceeded, the timer gets reset and element considered to trigger a click out\r\n if (ClickOutDirective.shouldIgnoreElement[\"parentCounter\"] > 20) {\r\n ClickOutDirective.shouldIgnoreElement[\"parentCounter\"] = 0;\r\n\r\n return false;\r\n }\r\n\r\n // this is recursive to increase chances of finding the element to ignore\r\n return classesToIgnore.some(item => element?.classList?.contains(item)) ||\r\n !!element.parentElement && ClickOutDirective.shouldIgnoreElement(element.parentElement, classesToIgnore);\r\n };\r\n\r\n // ----------------\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n const directive = ($timeout: angular.ITimeoutService, $document: angular.IDocumentService) => new ClickOutDirective($timeout, $document);\r\n\r\n directive.$inject = [\"$timeout\", \"$document\"];\r\n\r\n return directive;\r\n }\r\n}\r\n","\r\nimport * as angular from \"angular\";\r\n\r\nimport \"./fastScroll.scss\";\r\n\r\nexport class FastScrollDirective implements angular.IDirective {\r\n\r\n restrict = \"A\";\r\n\r\n public link: (scope: angular.IScope, element: ng.IAugmentedJQuery, attrs: ng.IAttributes) => void;\r\n\r\n constructor($timeout: angular.ITimeoutService) {\r\n FastScrollDirective.prototype.link = ($scope: angular.IScope, $element: angular.IAugmentedJQuery, attrs: ng.IAttributes) => {\r\n\r\n var timer: angular.IPromise;\r\n var classAdded = false;\r\n\r\n var scrollingElement = $element.find(\".md-virtual-repeat-scroller\");\r\n\r\n if (scrollingElement.length === 0) {\r\n scrollingElement = $element;\r\n }\r\n\r\n scrollingElement.on(\"scroll\", () => {\r\n classAdded = classAdded || this.enableFastScroll(scrollingElement, classAdded);\r\n\r\n if (timer) {\r\n $timeout.cancel(timer);\r\n }\r\n\r\n timer = $timeout(() => {\r\n classAdded = false;\r\n this.disableFastScroll(scrollingElement as any);\r\n }, 100);\r\n });\r\n\r\n $scope.$on(\"$destroy\", () => {\r\n scrollingElement.off(\"scroll\");\r\n });\r\n }\r\n }\r\n\r\n private enableFastScroll(element: JQuery, classAdded: boolean): boolean {\r\n if (classAdded) {\r\n return false;\r\n }\r\n\r\n element.addClass(\"fast-scroll\");\r\n return true;\r\n }\r\n\r\n private disableFastScroll(element: JQuery) {\r\n element.removeClass(\"fast-scroll\");\r\n }\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n const directive = ($timeout: angular.ITimeoutService) => new FastScrollDirective($timeout);\r\n\r\n directive.$inject = [\"$timeout\"];\r\n\r\n return directive;\r\n }\r\n}\r\n","export function ngMouseWheelDown() {\r\n return function (scope: angular.IScope, element, attrs) {\r\n\r\n const elementHeight = element[0].clientHeight\r\n\r\n element.bind(\"DOMMouseScroll mousewheel onmousewheel\",\r\n function (event) {\r\n\r\n // cross-browser wheel delta\r\n var event = window.event || event; // old IE support\r\n var delta = Math.max(-1, Math.min(1, (event.wheelDelta || -event.detail)));\r\n\r\n //console.log(element[0]);\r\n\r\n if (delta < 0) {\r\n scope.$eval(attrs.ngMouseWheelDown, { $event: event, $scrollPosition: element[0].scrollTop, $elementHeight: element[0].clientHeight });\r\n scope.$digest();\r\n\r\n // for IE\r\n //event.returnValue = false;\r\n //// for Chrome and Firefox\r\n //if (event.preventDefault) {\r\n // event.preventDefault();\r\n //}\r\n }\r\n });\r\n }\r\n}\r\n","\r\nexport function ngMouseWheelUp() {\r\n return function (scope, element, attrs) {\r\n element.bind(\"DOMMouseScroll mousewheel onmousewheel\", function (event) {\r\n\r\n // cross-browser wheel delta\r\n var event = window.event || event; // old IE support\r\n var delta = Math.max(-1, Math.min(1, (event.wheelDelta || -event.detail)));\r\n\r\n if (delta > 0) {\r\n\r\n scope.$eval(attrs.ngMouseWheelDown, { $event: event, $scrollPosition: element[0].scrollTop, $elementHeight: element[0].clientHeight });\r\n scope.$digest();\r\n\r\n // for IE\r\n //event.returnValue = false;\r\n //// for Chrome and Firefox\r\n //if (event.preventDefault) {\r\n // event.preventDefault();\r\n //}\r\n }\r\n });\r\n };\r\n} \r\n","export function ngRightClick($parse) {\r\n return function (scope: angular.IScope, element, attrs) {\r\n const fn = $parse(attrs.ngRightClick);\r\n element.bind('contextmenu', function (event) {\r\n scope.$apply(function () {\r\n event.preventDefault();\r\n fn(scope, { $event: event });\r\n });\r\n });\r\n }\r\n}\r\n","\r\nimport * as angular from \"angular\";\r\n\r\nexport class ScrollToDirective implements angular.IDirective {\r\n\r\n public restrict = \"A\";\r\n\r\n constructor(private $timeout: angular.ITimeoutService) {\r\n }\r\n\r\n public link = (scope: angular.IScope, element: angular.IAugmentedJQuery, attributes: angular.IAttributes) => {\r\n\r\n attributes.$observe(\"scrollTo\", () => {\r\n\r\n this.$timeout(() => {\r\n this.scrollTo(element, attributes[\"scrollTo\"]);\r\n });\r\n });\r\n\r\n attributes.$observe(\"scrollOn\", () => {\r\n\r\n this.$timeout(() => {\r\n this.scrollTo(element, attributes[\"scrollTo\"]);\r\n });\r\n });\r\n }\r\n\r\n scrollTo(element: angular.IAugmentedJQuery, position: string) {\r\n\r\n if (position === \"bottom\") {\r\n element.scrollTop(element[0].scrollHeight);\r\n }\r\n else if (position === \"top\") {\r\n element.scrollTop(0);\r\n } else {\r\n element.scrollTop(parseInt(position));\r\n }\r\n }\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n const directive = ($timeout: angular.ITimeoutService) => new ScrollToDirective($timeout);\r\n\r\n directive.$inject = [\"$timeout\"];\r\n\r\n return directive;\r\n }\r\n}\r\n","\r\nimport * as angular from \"angular\";\r\nimport * as $ from \"jquery\";\r\n\r\nimport \"./scrollShadow.scss\";\r\nimport { ThrottleService } from \"@services/throttle.service\";\r\n\r\nexport class ScrollShadowDirective implements angular.IDirective {\r\n\r\n restrict = \"A\";\r\n\r\n link: (scope: angular.IScope, element: ng.IAugmentedJQuery, attrs: ng.IAttributes) => void;\r\n\r\n constructor(\r\n private readonly $timeout: angular.ITimeoutService,\r\n private readonly $throttle: any) {\r\n\r\n var isIE11 = !!window[\"MSInputMethodContext\"] && !!document[\"documentMode\"];\r\n\r\n ScrollShadowDirective.prototype.link = ($scope: angular.IScope, $element: angular.IAugmentedJQuery, attrs: ng.IAttributes) => {\r\n if (isIE11) {\r\n return;\r\n }\r\n\r\n $timeout(() => {\r\n this.setup($scope, $element, attrs);\r\n }, /*2500*/500);\r\n }\r\n }\r\n\r\n private setup($scope: angular.IScope, $element: angular.IAugmentedJQuery, attrs: ng.IAttributes) {\r\n\r\n var topShadowElement: JQuery = null;\r\n var bottomShadowElement: JQuery = null;\r\n\r\n var scrollingElement = $element.find(\"> .md-virtual-repeat-scroller\");\r\n\r\n if (scrollingElement.length === 0) {\r\n scrollingElement = $element;\r\n }\r\n\r\n var el = scrollingElement[0];\r\n var clientHeight = el.clientHeight;\r\n\r\n const scrollShadowBoth = attrs[\"scrollShadow\"] === \"both\";\r\n var scrollShadowBottom = scrollShadowBoth || attrs[\"scrollShadow\"] === \"bottom\";\r\n\r\n var throttle = this.$throttle(() => {\r\n\r\n window.performance.mark(\"scrollShadow\");\r\n var scrollTop = el.scrollTop;\r\n var scrollHeight = el.scrollHeight;\r\n\r\n var scrollBuffer = 5;\r\n\r\n // Top Shadow\r\n if (scrollTop > scrollBuffer) {\r\n\r\n if (!topShadowElement) {\r\n topShadowElement = this.addShadow(scrollingElement, \"radialShadowTop\", false);\r\n }\r\n }\r\n else if (topShadowElement) {\r\n topShadowElement.remove();\r\n topShadowElement = null;\r\n }\r\n\r\n // Bottom Shadow\r\n if (scrollShadowBottom) {\r\n if (scrollTop + clientHeight + scrollBuffer < scrollHeight) {\r\n if (!bottomShadowElement) {\r\n bottomShadowElement = this.addShadow(scrollingElement, \"radialShadowBottom\", true);\r\n }\r\n }\r\n else if (bottomShadowElement) {\r\n bottomShadowElement.remove();\r\n bottomShadowElement = null;\r\n }\r\n }\r\n\r\n window.performance.measure(\"scrollShadow\");\r\n }, 25);\r\n\r\n scrollingElement.on(\"scroll\", (eventObject: JQueryEventObject, args: any[]) => {\r\n throttle();\r\n });\r\n\r\n $scope.$on(\"$destroy\", () => {\r\n scrollingElement.off(\"scroll\");\r\n });\r\n\r\n $element.trigger(\"scroll\");\r\n }\r\n\r\n private getStyle(oElm: any, strCssRule: any) {\r\n var strValue = \"\";\r\n\r\n if (document.defaultView && document.defaultView.getComputedStyle) {\r\n strValue = document.defaultView.getComputedStyle(oElm, \"\").getPropertyValue(strCssRule);\r\n }\r\n else if (oElm.currentStyle) {\r\n strCssRule = strCssRule.replace(/\\-(\\w)/g, function (strMatch, p1) {\r\n return p1.toUpperCase();\r\n });\r\n\r\n strValue = oElm.currentStyle[strCssRule];\r\n }\r\n\r\n return strValue;\r\n }\r\n\r\n private addShadow(parentElement: JQuery, className: string, append: boolean): JQuery {\r\n var shadowString = `
`;\r\n\r\n var parentElementPropString = \"\";\r\n var targetElementProperty = \"\";\r\n if (append) {\r\n parentElement.append(shadowString);\r\n\r\n parentElementPropString = \"padding-top\";\r\n targetElementProperty = \"bottom\";\r\n }\r\n else {\r\n parentElement.prepend(shadowString);\r\n\r\n parentElementPropString = \"padding-bottom\";\r\n targetElementProperty = \"top\";\r\n }\r\n\r\n var shadow = parentElement.children(`.${className}`).eq(0);\r\n\r\n return shadow;\r\n }\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n const directive = ($timeout: angular.ITimeoutService, $throttle: any) => new ScrollShadowDirective($timeout, $throttle);\r\n\r\n directive.$inject = [\"$timeout\", \"$throttle\"];\r\n\r\n return directive;\r\n }\r\n}\r\n","import { downgradeComponent } from \"@angular/upgrade/static\";\r\nimport * as angular from \"angular\";\r\nimport { DateButtonFilterComponent } from \"./filter-bar/date-button-filter/date-button-filter.component\";\r\nimport { DriverButtonFilterComponent } from \"./filter-bar/driver-button-filter/driver-button-filter.component\";\r\nimport { FilterBarComponent } from \"./filter-bar/filter-bar.component\";\r\nimport { GroupButtonFilterComponent } from \"./filter-bar/group-button-filter/group-button-filter.component\";\r\nimport { ItemFilterComponent } from \"./filter-bar/item-filter/item-filter.component\";\r\nimport { CombinedResourceFilterComponent } from \"./filters/combinedResourceFilter.component\";\r\nimport { DateResourceFilterComponent } from \"./filters/dateResourceFilter.component\";\r\nimport { DriverResourceFilterComponent } from \"./filters/driverResourceFilter.component\";\r\nimport { GeofenceResourceFilterComponent } from \"./filters/geofenceResourceFilter.component\";\r\nimport { GroupResourceFilterComponent } from \"./filters/groupResourceFilter.component\";\r\nimport { ObservationsResourceFilterComponent } from \"./filters/observationsResourceFilter.component\";\r\nimport { TableColumnResourceFilterComponent } from \"./filters/tableColumnResourceFilter.component\";\r\nimport { TagsResourceFilterComponent } from \"./filters/tagsResourceFilter.component\";\r\nimport { VehicleResourceFilterComponent } from \"./filters/vehicleResourceFilter.component\";\r\nimport { NewResourceFilterBarComponent } from \"./newResourceFilterBar.component\";\r\nimport { ResourceFilterBarModalComponent } from \"./resourceFilterBarModal.component\";\r\n\r\nangular\r\n .module(\"app.resourceFilters.directives\", [])\r\n\r\n .component(\"newResourceFilterBar\", new NewResourceFilterBarComponent())\r\n .component(\"combinedResourceFilter\", new CombinedResourceFilterComponent())\r\n .component(\"driverResourceFilter\", new DriverResourceFilterComponent())\r\n .component(\"vehicleResourceFilter\", new VehicleResourceFilterComponent())\r\n .component(\"tagsResourceFilter\", new TagsResourceFilterComponent())\r\n .component(\"observationsResourceFilter\", new ObservationsResourceFilterComponent())\r\n .component(\"geofenceResourceFilter\", new GeofenceResourceFilterComponent())\r\n .component(\"groupResourceFilter\", new GroupResourceFilterComponent())\r\n .component(\"dateResourceFilter\", new DateResourceFilterComponent())\r\n .component(\"tableColumnResourceFilter\", new TableColumnResourceFilterComponent())\r\n .component(\"resourceFilterBarModal\", new ResourceFilterBarModalComponent())\r\n\r\n .directive(\"filterBar\", downgradeComponent({ component: FilterBarComponent }))\r\n .directive(\"itemFilter\", downgradeComponent({ component: ItemFilterComponent }))\r\n .directive(\"driverButtonFilter\", downgradeComponent({ component: DriverButtonFilterComponent }))\r\n .directive(\"dateButtonFilter\", downgradeComponent({ component: DateButtonFilterComponent }))\r\n .directive(\"groupButtonFilter\", downgradeComponent({ component: GroupButtonFilterComponent }))\r\n ;\r\n","import { IVeriTableHeader, IVeriTableRow } from \"@directives/_veri/veriTable/veriTable.component\";\r\nimport { IDriverFilter } from \"@interfaces/filters/IDriverFilter\";\r\nimport { IGroupFilter } from \"@interfaces/filters/IGroupFilter\";\r\nimport { IDriver } from \"@interfaces/IDriver\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport * as angular from \"angular\";\r\nimport { IFilterBar, IFilterBarFilter } from \"../newResourceFilterBar.component\";\r\nimport \"./combinedResourceFilter.component.scss\";\r\n\r\ninterface IComponentBindings {\r\n selectedDriver: IDriver;\r\n driverId: number;\r\n groupFilter: IGroupFilter;\r\n}\r\n\r\nclass ComponentController implements angular.IComponentController, IComponentBindings, IFilterBarFilter {\r\n\r\n parent: IFilterBar;\r\n show = false;\r\n isDirty = false;\r\n\r\n filterName = \"CombinedResource\";\r\n filterLabel: string;\r\n filterTitle: string;\r\n filterIcon: string;\r\n showClearFilterButton = true;\r\n\r\n drivers: IDriver[];\r\n selectedDriver: IDriver;\r\n\r\n driverId: number;\r\n\r\n groupFilter: IGroupFilter;\r\n\r\n previousFilter: IDriverFilter;\r\n\r\n tableHeaders: IVeriTableHeader[];\r\n tableRows: IVeriTableRow[];\r\n\r\n onChange: (args: { filter: IDriverFilter }) => void;\r\n\r\n static $inject = [\"$element\", \"translationService\"];\r\n\r\n constructor(public readonly $element: HTMLElement, private readonly translationService: TranslationService) {\r\n }\r\n\r\n $onInit() {\r\n if (parent) {\r\n this.parent.registerFilter(this);\r\n }\r\n }\r\n\r\n $onDestroy() {\r\n this.show = false;\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n this.updateFilterLabel();\r\n\r\n //if (onChangesObj[\"driverId\"]) {\r\n // this.selectedDriver = null;\r\n // this.getDrivers();\r\n //}\r\n\r\n //if (onChangesObj[\"groupFilter\"]) {\r\n // this.getDrivers();\r\n //}\r\n }\r\n\r\n toggleFilter(show: boolean) {\r\n this.show = show;\r\n\r\n if (this.show) {\r\n //this.getDrivers();\r\n }\r\n }\r\n\r\n selectedDriverChanged(driver: IDriver) {\r\n }\r\n\r\n clearFilter() {\r\n this.selectedDriver = null;\r\n this.driverId = null;\r\n\r\n this.updateFilterLabel();\r\n }\r\n\r\n createFilterObject(): IDriverFilter {\r\n return {\r\n driver: this.selectedDriver\r\n };\r\n }\r\n\r\n // ------------------\r\n\r\n private updateFilterLabel() {\r\n this.filterLabel = this.translationService.t('filters.combinedResourceFilter.allDrivers');\r\n this.filterIcon = \"person\";\r\n\r\n if (this.drivers && this.driverId) {\r\n this.selectedDriver = this.drivers.find(driver => driver.Id === this.driverId);\r\n }\r\n\r\n if (this.selectedDriver) {\r\n this.filterLabel = this.selectedDriver.DisplayName;\r\n }\r\n\r\n this.isDirty = !!this.selectedDriver;\r\n\r\n\r\n this.filterLabel = this.translationService.t('filters.combinedResourceFilter.allResources');\r\n this.filterIcon = \"filter_alt\";\r\n }\r\n\r\n}\r\n\r\nexport class CombinedResourceFilterComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n require: { [index: string]: string; };\r\n template: string;\r\n\r\n constructor() {\r\n this.bindings = {\r\n //selectedDriver: \"
{{'filters.combinedResourceFilter.noFilter' | translate}}
keyboard_arrow_right
{{'filters.combinedResourceFilter.noFilter' | translate}}
keyboard_arrow_right
{{'filters.combinedResourceFilter.noFilter' | translate}}
keyboard_arrow_right
\";","import { DateRange } from \"@enums/DateRange.enum\";\r\nimport { IDateFilter } from \"@interfaces/filters/IDateFilter\";\r\nimport { IComboBox } from \"@interfaces/IComboBox\";\r\nimport { IReportParameters } from \"@reports/models/IReportParameters\";\r\nimport { ConstantsService } from \"@services/constantsService\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport * as moment from \"moment\";\r\nimport { TimeFilterType } from \"@reports/enums/TimeFilterType\";\r\nimport { IFilterBar, IFilterBarFilter } from \"../newResourceFilterBar.component\";\r\nimport \"./dateResourceFilter.scss\";\r\n\r\ninterface IComponentBindings {\r\n startDate: Date;\r\n endDate: Date;\r\n futureDates: boolean;\r\n isInvalid: boolean;\r\n\r\n reportParameters: IReportParameters;\r\n\r\n restrictToSingleDay: boolean;\r\n restrictToSingleWeek: boolean;\r\n includeTimeRange: boolean;\r\n hideDateRange: boolean;\r\n\r\n maxDateRange: number;\r\n maxDateRangeUnit: string;\r\n\r\n dateRange: DateRange;\r\n\r\n startHour: number;\r\n startMinute: number;\r\n\r\n endHour: number;\r\n endMinute: number;\r\n\r\n timeOnly: boolean;\r\n}\r\n\r\nclass ComponentController implements angular.IComponentController, IComponentBindings, IFilterBarFilter\r\n{\r\n reportParameters: IReportParameters;\r\n\r\n parent: IFilterBar;\r\n\r\n filterName = \"Date\";\r\n filterLabel: string;\r\n filterTitle: string;\r\n filterIcon: string = \"today\";\r\n\r\n show = false;\r\n isDirty = true;\r\n showClearFilterButton = false;\r\n isInvalid = false;\r\n\r\n showNextPrev = true;\r\n disableNext = false;\r\n disablePrev = false;\r\n\r\n restrictToSingleDay: boolean = false;\r\n restrictToSingleWeek: boolean = false;\r\n includeTimeRange: boolean = true;\r\n hideDateRange = false;\r\n timeOnly = false;\r\n\r\n startDate: Date;\r\n endDate: Date;\r\n\r\n startTime: string;\r\n endTime: string;\r\n\r\n restrictTimeRange: boolean;\r\n displayTimeRangeInfo: boolean;\r\n\r\n startHour: number = 0;\r\n startMinute: number = 0;\r\n\r\n endHour: number = 23;\r\n endMinute: number = 59;\r\n\r\n dateRange = DateRange.Today;\r\n\r\n previousFilter: IDateFilter;\r\n\r\n onChange: (args: { filter: IDateFilter }) => void;\r\n\r\n dateRangeOptions: IComboBox[] = [];\r\n dateDayOptions: { label: string, day: string }[] = [];\r\n\r\n displayMaxDateRange: boolean;\r\n\r\n futureDates: boolean;\r\n minStartDate: Date;\r\n maxEndDate: Date;\r\n\r\n maxDateRange: number;\r\n maxDateRangeUnit: string = `M`;\r\n maxDateRangeUnitName: string;\r\n\r\n isMobile: boolean;\r\n\r\n static $inject = [\"$scope\", \"$element\", \"veriDate\", \"constantsService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly $scope: angular.IScope,\r\n public readonly $element: HTMLElement,\r\n private readonly veriDate: VeriDate,\r\n private readonly constantsService: ConstantsService,\r\n private readonly translationService: TranslationService) {\r\n }\r\n\r\n $onInit() {\r\n this.isMobile = this.constantsService.getIsMobile();\r\n this.updateMaxDateRangeUnitName();\r\n this.addDateRangeOptions();\r\n\r\n if (this.parent) {\r\n this.parent.registerFilter(this);\r\n }\r\n\r\n // If we are on mobile reduce the number of options we show\r\n if (this.isMobile) {\r\n this.dateRangeOptions.pop();\r\n }\r\n\r\n this.dateDayOptions = [];\r\n for (let i = 0; i < 5; i++) {\r\n const date = moment().add(-i, \"d\");\r\n let label = this.veriDate.getDayOfWeek(date.day(), true);\r\n\r\n if (i === 0) { label = this.translationService.tEnum(DateRange, \"DateRange\", DateRange.Today) }\r\n if (i === 1) { label = this.translationService.tEnum(DateRange, \"DateRange\", DateRange.Yesterday) }\r\n\r\n this.dateDayOptions.push({\r\n label: label,\r\n day: date.format('Do')\r\n });\r\n }\r\n\r\n this.sendUpdate();\r\n }\r\n\r\n $onDestroy() {\r\n this.show = false;\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n if (this.timeOnly) {\r\n this.restrictTimeRange = true;\r\n }\r\n\r\n if (onChangesObj[\"futureDates\"]) {\r\n this.setMinMaxDates();\r\n }\r\n\r\n if (onChangesObj[\"dateRange\"] && this.dateRange !== undefined) {\r\n this.setMinMaxDates();\r\n\r\n this.dateRangeChanged(this.dateRange);\r\n }\r\n\r\n if (onChangesObj[\"reportParameters\"] && this.reportParameters) {\r\n this.startDate = this.reportParameters.Start;\r\n this.endDate = this.reportParameters.End;\r\n\r\n this.setTimeFilterFromReportParameters();\r\n\r\n this.updateFilterLabel();\r\n }\r\n\r\n // Allow us to trigger an initial update for default timeframe\r\n if (!this.startDate && !this.endDate) {\r\n this.createDefaults();\r\n }\r\n else {\r\n this.dateChanged();\r\n }\r\n }\r\n\r\n setMinMaxDates() {\r\n if (this.futureDates) {\r\n this.maxEndDate = null;\r\n this.minStartDate = moment().toDate();\r\n }\r\n else {\r\n this.maxEndDate = moment().toDate();\r\n }\r\n }\r\n\r\n setTimeFilterFromReportParameters() {\r\n this.startHour = 0;\r\n this.startMinute = 0;\r\n\r\n this.endHour = 0;\r\n this.endMinute = 0;\r\n\r\n if (this.reportParameters.TimeFilterStart) {\r\n const timeFilterStart = moment.duration(this.reportParameters.TimeFilterStart);\r\n this.startHour = timeFilterStart.hours();\r\n this.startMinute = timeFilterStart.minutes();\r\n this.startTime = this.reportParameters.TimeFilterStart;\r\n this.restrictTimeRange = true;\r\n }\r\n\r\n if (this.reportParameters.TimeFilterEnd) {\r\n const timeFilterEnd = moment.duration(this.reportParameters.TimeFilterEnd);\r\n this.endHour = timeFilterEnd.hours();\r\n this.endMinute = timeFilterEnd.minutes();\r\n this.endTime = this.reportParameters.TimeFilterEnd;\r\n this.restrictTimeRange = true;\r\n }\r\n\r\n if (this.startHour + this.startMinute + this.endHour + this.endMinute == 0) {\r\n this.startTimeChanged(0, 0);\r\n this.endTimeChanged(23, 59);\r\n\r\n if (this.timeOnly) {\r\n this.isDirty = false;\r\n }\r\n }\r\n }\r\n\r\n clearFilter() {\r\n\r\n }\r\n\r\n toggleFilter(show: boolean) {\r\n this.show = show;\r\n }\r\n\r\n startDateChanged() {\r\n this.dateChanged();\r\n }\r\n\r\n endDateChanged() {\r\n this.dateChanged();\r\n }\r\n\r\n dateRangeChanged(dateRange: DateRange) {\r\n this.dateRange = dateRange;\r\n const dates = this.veriDate.dateRangeFromEnum(this.dateRange);\r\n\r\n this.startDate = dates.start;\r\n this.endDate = dates.end;\r\n\r\n this.isInvalid = false;\r\n this.displayMaxDateRange = false;\r\n\r\n this.checkTimeRanges();\r\n\r\n this.updateFilterLabel();\r\n }\r\n\r\n createFilterObject(): IDateFilter {\r\n return {\r\n start: this.startDate,\r\n end: this.endDate,\r\n startTime: this.restrictTimeRange ? this.startTime : null,\r\n endTime: this.restrictTimeRange ? this.endTime : null,\r\n filterType: this.restrictTimeRange ? TimeFilterType.Daily : null\r\n };\r\n }\r\n\r\n startTimeChanged(hour: number, minute: number) {\r\n this.startHour = hour || 0;\r\n this.startMinute = minute || 0;\r\n\r\n this.startTime = this.toTimespan(this.startHour, this.startMinute, 0);\r\n this.checkTimeRanges();\r\n this.updateFilterLabel();\r\n }\r\n\r\n endTimeChanged(hour: number, minute: number) {\r\n this.endHour = hour || 0;\r\n this.endMinute = minute || 0;\r\n\r\n this.endTime = this.toTimespan(this.endHour, this.endMinute, 59);\r\n this.checkTimeRanges();\r\n\r\n this.updateFilterLabel();\r\n }\r\n\r\n restrictTimeRangeChanged() {\r\n\r\n this.startTimeChanged(this.startHour, this.startMinute);\r\n this.endTimeChanged(this.endHour, this.endMinute);\r\n }\r\n\r\n nextClicked() {\r\n var currentRange = this.getDateRangeInDays();\r\n\r\n this.startDate = moment(this.startDate).add(currentRange, \"d\").toDate();\r\n this.endDate = moment(this.endDate).add(currentRange, \"d\").toDate();\r\n\r\n this.dateChanged();\r\n this.sendUpdate();\r\n\r\n this.$scope.$applyAsync();\r\n }\r\n\r\n prevClicked() {\r\n var currentRange = this.getDateRangeInDays();\r\n\r\n this.startDate = moment(this.startDate).add(-currentRange, \"d\").toDate();\r\n this.endDate = moment(this.endDate).add(-currentRange, \"d\").toDate();\r\n\r\n this.dateChanged();\r\n this.sendUpdate();\r\n\r\n this.$scope.$applyAsync();\r\n }\r\n\r\n // ------------------\r\n\r\n private updateMaxDateRangeUnitName(): void {\r\n const unit = this.maxDateRangeUnit;\r\n\r\n if (unit === \"year\" || unit === \"years\" || unit === \"y\") {\r\n this.maxDateRangeUnitName = `year`;\r\n\r\n }\r\n else if (unit === \"month\" || unit === \"months\" || unit === \"M\") {\r\n this.maxDateRangeUnitName = `month`;\r\n\r\n }\r\n else if (unit === \"week\" || unit === \"weeks\" || unit === \"w\") {\r\n this.maxDateRangeUnitName = `week`;\r\n\r\n }\r\n else if (unit === \"day\" || unit === \"days\" || unit === \"d\") {\r\n this.maxDateRangeUnitName = `day`;\r\n }\r\n }\r\n\r\n private addDateRangeOptions(): void {\r\n\r\n this.dateRangeOptions.push({ Name: this.translationService.tEnum(DateRange, \"DateRange\", DateRange.Today), Value: DateRange.Today });\r\n this.dateRangeOptions.push({ Name: this.translationService.tEnum(DateRange, \"DateRange\", DateRange.Yesterday), Value: DateRange.Yesterday });\r\n\r\n if (this.restrictToSingleDay) {\r\n return;\r\n }\r\n\r\n this.dateRangeOptions.push({ Name: this.translationService.tEnum(DateRange, \"DateRange\", DateRange.Last7Days), Value: DateRange.Last7Days });\r\n\r\n if (this.restrictToSingleWeek) {\r\n return;\r\n }\r\n\r\n this.dateRangeOptions.push({ Name: this.translationService.tEnum(DateRange, \"DateRange\", DateRange.Last30Days), Value: DateRange.Last30Days });\r\n this.dateRangeOptions.push({ Name: this.translationService.tEnum(DateRange, \"DateRange\", DateRange.LastMonth), Value: DateRange.LastMonth });\r\n }\r\n\r\n private toTimespan(hour: number, minute: number, seconds: number): string {\r\n return moment().hour(hour).minutes(minute).seconds(seconds).format(\"HH:mm:ss\");\r\n }\r\n\r\n private fromTimespan(time: string): moment.Moment {\r\n return moment.utc(time, \"HH:mm:ss\").local();\r\n }\r\n\r\n private createDefaults() {\r\n\r\n this.dateRangeChanged(DateRange.Today);\r\n this.sendUpdate();\r\n }\r\n\r\n private checkTimeRanges() {\r\n this.displayTimeRangeInfo = false;\r\n\r\n if (this.startTime > this.endTime && this.startDate.toLocaleDateString() == this.endDate.toLocaleDateString()) {\r\n this.displayTimeRangeInfo = true;\r\n }\r\n }\r\n\r\n private sendUpdate() {\r\n const filter = this.createFilterObject();\r\n\r\n if (this.onChange) {\r\n this.onChange({ filter: filter });\r\n }\r\n }\r\n\r\n private dateChanged() {\r\n this.endDate = (this.restrictToSingleDay) ? this.startDate : this.endDate;\r\n this.dateRange = this.veriDate.dateRangeIntoEnum({ start: this.startDate, end: this.endDate });\r\n\r\n if (moment(this.startDate).isAfter(moment(this.endDate))) {\r\n this.isInvalid = true;\r\n this.updateFilterLabel();\r\n return;\r\n }\r\n\r\n this.maxDateRange = this.maxDateRange || 1;\r\n\r\n const duration: moment.unitOfTime.DurationConstructor = `${this.maxDateRangeUnit}` as any;\r\n this.displayMaxDateRange = moment(this.startDate).isBefore(moment(this.endDate).add(-this.maxDateRange, duration), \"day\");\r\n\r\n if (this.displayMaxDateRange || !this.startDate || !this.endDate) {\r\n this.isInvalid = true;\r\n }\r\n else {\r\n this.isInvalid = false;\r\n }\r\n\r\n this.checkTimeRanges();\r\n\r\n this.updateFilterLabel();\r\n\r\n if (!this.futureDates) {\r\n this.disableNext = moment(this.endDate).isSameOrAfter(moment(), \"d\");\r\n\r\n } else {\r\n this.disablePrev = moment(this.startDate).isSameOrBefore(moment(), \"d\");\r\n }\r\n }\r\n\r\n private updateFilterLabel() {\r\n\r\n if (!this.hideDateRange) {\r\n this.filterLabel = this.veriDate.getReadableDateRangeLabel(this.startDate, this.endDate, this.dateRange);\r\n }\r\n\r\n if (this.timeOnly) {\r\n this.filterLabel = \"\";\r\n }\r\n\r\n if (this.restrictTimeRange && this.startTime && this.endTime) {\r\n if (this.filterLabel != \"\") {\r\n this.filterLabel += \". \";\r\n }\r\n\r\n this.filterLabel += `${this.startTime.slice(0, -3)} to ${this.endTime.slice(0, -3)}`;\r\n }\r\n\r\n if (this.filterLabel == \"\") {\r\n this.filterLabel = this.translationService.t('filters.dateResourceFilter.anyTime');\r\n }\r\n\r\n if (this.isInvalid) {\r\n this.filterLabel = this.translationService.t('filters.dateResourceFilter.invalidDateRange');\r\n }\r\n }\r\n\r\n private getDateRangeInDays(): number {\r\n var currentRange = (this.endDate.valueOf() - this.startDate.valueOf()) / 1000 / 60 / 60 / 24;\r\n\r\n return currentRange == 0\r\n ? 1 // If we are the same date, then assume its one day (e.g. Today or Yesterday)\r\n : Math.ceil(currentRange);\r\n }\r\n}\r\n\r\nexport class DateResourceFilterComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n require: { [index: string]: string; };\r\n template: string;\r\n\r\n constructor() {\r\n this.bindings = {\r\n dateRange: \"<\",\r\n futureDates: \"
{{'filters.dateResourceFilter.quickRange' | translate}}
{{item.Name}}
{{'filters.dateResourceFilter.customiseRange' | translate}}
{{'filters.dateResourceFilter.restrictTimeRange' | translate}}
arrow_forward
{{'filters.dateResourceFilter.maxDateRangeExceeded.year' | translate : $ctrl.maxDateRange}} {{'filters.dateResourceFilter.maxDateRangeExceeded.month' | translate : $ctrl.maxDateRange}} {{'filters.dateResourceFilter.maxDateRangeExceeded.week' | translate : $ctrl.maxDateRange}} {{'filters.dateResourceFilter.maxDateRangeExceeded.day' | translate : $ctrl.maxDateRange}}
{{'filters.dateResourceFilter.invalidDate' | translate}}
{{'filters.dateResourceFilter.startTimeGreater' | translate}}
\";","import { IVeriTableHeader, IVeriTableRow, IVeriTableRowCell } from \"@directives/_veri/veriTable/veriTable.component\";\r\nimport { BroadcastEvent } from \"@enums/BroadcastEvent\";\r\nimport { IDriverFilter } from \"@interfaces/filters/IDriverFilter\";\r\nimport { IGroupFilter } from \"@interfaces/filters/IGroupFilter\";\r\nimport { IDriver } from \"@interfaces/IDriver\";\r\nimport { IRunBlockRootScope } from \"@interfaces/IRunBlockRootScope\";\r\nimport { DriverService } from \"@services/driver.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport * as angular from \"angular\";\r\nimport { IFilterBar, IFilterBarFilter } from \"../newResourceFilterBar.component\";\r\nimport \"./driverResourceFilter.scss\";\r\n\r\ninterface IComponentBindings {\r\n selectedDriver: IDriver;\r\n driverId: number;\r\n groupFilter: IGroupFilter;\r\n}\r\n\r\nclass ComponentController implements angular.IComponentController, IComponentBindings, IFilterBarFilter {\r\n\r\n parent: IFilterBar;\r\n show = false;\r\n isDirty = false;\r\n\r\n filterName = \"Drivers\";\r\n filterLabel: string;\r\n filterTitle: string;\r\n filterIcon: string;\r\n showClearFilterButton = true;\r\n\r\n drivers: IDriver[];\r\n selectedDriver: IDriver;\r\n\r\n driverId: number;\r\n\r\n groupFilter: IGroupFilter;\r\n\r\n previousFilter: IDriverFilter;\r\n\r\n tableHeaders: IVeriTableHeader[];\r\n tableRows: IVeriTableRow[];\r\n\r\n onChange: (args: { filter: IDriverFilter }) => void;\r\n\r\n static $inject = [\"$rootScope\", \"$element\", \"$timeout\", \"driverService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly $rootScope: IRunBlockRootScope,\r\n public readonly $element: HTMLElement,\r\n private readonly $timeout: angular.ITimeoutService,\r\n private readonly driverService: DriverService,\r\n private readonly translationService: TranslationService) {\r\n }\r\n\r\n $onInit() {\r\n if (parent) {\r\n this.parent.registerFilter(this);\r\n }\r\n\r\n this.createTableHeaders();\r\n }\r\n\r\n $onDestroy() {\r\n this.show = false;\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n this.updateFilterLabel();\r\n\r\n if (onChangesObj[\"driverId\"]) {\r\n this.selectedDriver = null;\r\n this.getDrivers();\r\n }\r\n\r\n if (onChangesObj[\"groupFilter\"]) {\r\n this.getDrivers();\r\n }\r\n }\r\n\r\n toggleFilter(show: boolean) {\r\n this.show = show;\r\n\r\n if (this.show) {\r\n this.getDrivers();\r\n }\r\n }\r\n\r\n selectedDriverChanged(driver: IDriver) {\r\n this.driverId = null;\r\n\r\n if (this.selectedDriver && this.selectedDriver.Id === driver.Id) {\r\n this.selectedDriver = null;\r\n } else {\r\n this.selectedDriver = driver;\r\n }\r\n\r\n this.updateFilterLabel();\r\n\r\n this.createFilterObject();\r\n\r\n this.$rootScope.$broadcast(BroadcastEvent.closeResourceFilterBar);\r\n }\r\n\r\n clearFilter() {\r\n this.selectedDriver = null;\r\n this.driverId = null;\r\n\r\n this.updateFilterLabel();\r\n }\r\n\r\n createFilterObject(): IDriverFilter {\r\n return {\r\n driver: this.selectedDriver\r\n };\r\n }\r\n\r\n // ------------------\r\n\r\n private createTableHeaders() {\r\n this.tableHeaders = [\r\n { title: this.translationService.t('Common.Name'), sortable: true }\r\n ];\r\n }\r\n\r\n private getDrivers() : angular.IPromise {\r\n return this.driverService.getDrivers().then(drivers => {\r\n if (this.groupFilter && this.groupFilter.group) {\r\n drivers = drivers.filter(d => this.groupFilter.group.DriverIds.indexOf(d.Id) >= 0);\r\n }\r\n\r\n this.drivers = drivers;\r\n\r\n }).finally(() => {\r\n this.createTableRows();\r\n this.updateFilterLabel();\r\n });\r\n }\r\n\r\n private updateFilterLabel() {\r\n this.filterLabel = this.translationService.t('Common.Drivers');\r\n this.filterIcon = \"person\";\r\n\r\n if (this.drivers && this.driverId) {\r\n this.selectedDriver = this.drivers.find(driver => driver.Id === this.driverId);\r\n\r\n if (!this.selectedDriver) {\r\n this.driverId = null;\r\n this.onChange({ filter: this.createFilterObject() });\r\n }\r\n }\r\n\r\n if (this.selectedDriver) {\r\n this.filterLabel = this.selectedDriver.DisplayName;\r\n }\r\n\r\n this.isDirty = !!this.selectedDriver;\r\n }\r\n\r\n private createTableRows() {\r\n this.tableRows = [];\r\n\r\n this.drivers.forEach(driver => {\r\n this.tableRows.push({\r\n data: driver,\r\n cells: this.createTableCells(driver)\r\n });\r\n });\r\n }\r\n\r\n private createTableCells(driver: IDriver): IVeriTableRowCell[] {\r\n const cells: IVeriTableRowCell[] = [\r\n { contents: driver.DisplayName }\r\n ];\r\n\r\n return cells;\r\n }\r\n}\r\n\r\nexport class DriverResourceFilterComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n require: { [index: string]: string; };\r\n template: string;\r\n\r\n constructor() {\r\n this.bindings = {\r\n selectedDriver: \" \";","import { IVeriTableHeader, IVeriTableRow, IVeriTableRowCell } from \"@directives/_veri/veriTable/veriTable.component\";\r\nimport * as angular from \"angular\";\r\nimport { IFilterBar, IFilterBarFilter } from \"../newResourceFilterBar.component\";\r\nimport { IGeofence, GeofenceCategory } from \"@interfaces/IGeofences\";\r\nimport { GeofenceService } from \"@services/geofence.service\";\r\nimport { IGeofenceFilter } from \"@interfaces/filters/IGeofenceFilter\";\r\nimport \"./geofenceResourceFilter.scss\";\r\nimport { IRunBlockRootScope } from \"@interfaces/IRunBlockRootScope\";\r\nimport { BroadcastEvent } from \"@enums/BroadcastEvent\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\n\r\ninterface IComponentBindings {\r\n selectedGeofence: IGeofence;\r\n geofenceId: number;\r\n}\r\n\r\nclass ComponentController implements angular.IComponentController, IComponentBindings, IFilterBarFilter{\r\n parent: IFilterBar;\r\n show = false;\r\n isDirty = false;\r\n\r\n filterName = \"Geofence\";\r\n filterLabel: string;\r\n filterTitle: string;\r\n filterIcon: string;\r\n showClearFilterButton = true;\r\n\r\n geofences: IGeofence[];\r\n selectedGeofence: IGeofence;\r\n geofenceId: number;\r\n\r\n previousFilter: IGeofenceFilter;\r\n\r\n tableHeaders: IVeriTableHeader[];\r\n tableRows: IVeriTableRow[];\r\n\r\n hideZones: boolean;\r\n\r\n onChange: (args: { filter: IGeofenceFilter }) => void;\r\n\r\n static $inject = [\"$rootScope\", \"$element\", \"$timeout\", \"geofenceService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly $rootScope: IRunBlockRootScope,\r\n public readonly $element: HTMLElement,\r\n private readonly $timeout: angular.ITimeoutService,\r\n private readonly geofenceService: GeofenceService,\r\n private readonly translationService: TranslationService ) {\r\n }\r\n\r\n $onInit() {\r\n this.parent.registerFilter(this);\r\n\r\n this.createTableHeaders(); \r\n }\r\n\r\n $onDestroy() {\r\n this.show = false;\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n this.updateFilterLabel();\r\n\r\n if (onChangesObj['geofenceId']) {\r\n this.selectedGeofence = null;\r\n this.getGeofences();\r\n } \r\n }\r\n\r\n toggleFilter(show: boolean) {\r\n this.show = show;\r\n\r\n if (this.show) {\r\n this.getGeofences();\r\n }\r\n } \r\n\r\n clearFilter() {\r\n this.selectedGeofence = null;\r\n this.geofenceId = null;\r\n\r\n this.updateFilterLabel();\r\n }\r\n\r\n selectedGeofenceChanged(geofence: IGeofence) {\r\n this.geofenceId = null;\r\n\r\n if (this.selectedGeofence == geofence) {\r\n this.selectedGeofence = null;\r\n } else {\r\n this.selectedGeofence = geofence;\r\n }\r\n\r\n this.updateFilterLabel();\r\n\r\n this.createFilterObject();\r\n\r\n this.$rootScope.$broadcast(BroadcastEvent.closeResourceFilterBar);\r\n }\r\n\r\n createFilterObject(): IGeofenceFilter {\r\n return {\r\n geofence: this.selectedGeofence\r\n };\r\n } \r\n\r\n // ------------------\r\n\r\n private createTableHeaders() {\r\n this.tableHeaders = [\r\n { title: this.translationService.t('Common.Geofences'), sortable: true },\r\n ];\r\n }\r\n\r\n private getGeofences() {\r\n this.geofenceService.getGeofences().then(geofences => {\r\n \r\n if (this.hideZones) {\r\n this.geofences = geofences.filter(geofence => geofence.Category === GeofenceCategory.Standard);\r\n } else {\r\n this.geofences = geofences;\r\n }\r\n\r\n\r\n }).finally(() => {\r\n this.createTableRows();\r\n this.updateFilterLabel();\r\n });\r\n }\r\n\r\n private updateFilterLabel() {\r\n this.filterLabel = this.translationService.t('filters.geofenceResourceFilter.allGeofences');\r\n this.filterIcon = \"filter_tilt_shift\";\r\n\r\n if (this.geofences && this.geofenceId) {\r\n this.selectedGeofence = this.geofences.find(geofence => geofence.Id === this.geofenceId);\r\n }\r\n\r\n if (this.selectedGeofence) {\r\n this.filterLabel = this.selectedGeofence.Description;\r\n }\r\n\r\n this.isDirty = !!this.selectedGeofence;\r\n }\r\n\r\n private createTableRows() {\r\n this.tableRows = [];\r\n\r\n this.geofences.forEach(geofence => {\r\n this.tableRows.push({\r\n data: geofence,\r\n cells: this.createTableCells(geofence)\r\n });\r\n });\r\n }\r\n\r\n private createTableCells(geofence: IGeofence): IVeriTableRowCell[] {\r\n const cells: IVeriTableRowCell[] = [\r\n {\r\n contents: geofence.Description, data: geofence, sortData: geofence.Description\r\n },\r\n ];\r\n\r\n return cells;\r\n }\r\n}\r\n\r\nexport class GeofenceResourceFilterComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n require: { [index: string]: string; };\r\n template: string;\r\n\r\n constructor() {\r\n this.bindings = {\r\n selectedGeofence: \" \";","import { BroadcastEvent } from \"@enums/BroadcastEvent\";\r\nimport { ResourceType } from \"@enums/ResourceType\";\r\nimport { IGroupFilter } from \"@interfaces/filters/IGroupFilter\";\r\nimport { IRunBlockRootScope } from \"@interfaces/IRunBlockRootScope\";\r\nimport { IGroup } from \"@interfaces/IVehicleGroup\";\r\nimport { GroupService } from \"@services/group.service.ajs\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport * as angular from \"angular\";\r\nimport { IFilterBar, IFilterBarFilter } from \"../newResourceFilterBar.component\";\r\nimport \"./groupResourceFilter.scss\";\r\n\r\ninterface IComponentBindings {\r\n selectedGroup: IGroup;\r\n groupId: number;\r\n placeholder: string;\r\n}\r\n\r\nclass ComponentController implements angular.IComponentController, IComponentBindings, IFilterBarFilter {\r\n\r\n parent: IFilterBar;\r\n show = false;\r\n isDirty = false;\r\n\r\n filterName = \"Group\";\r\n filterLabel: string;\r\n filterTitle: string;\r\n filterIcon: string;\r\n showClearFilterButton = true;\r\n\r\n placeholder: string;\r\n\r\n loading = false;\r\n groups: IGroup[];\r\n selectedGroup: IGroup;\r\n selectedResourceType: ResourceType;\r\n\r\n groupId: number;\r\n\r\n previousFilter: IGroupFilter;\r\n\r\n onChange: (args: { filter: IGroupFilter }) => void;\r\n\r\n static $inject = [\"$rootScope\", \"$element\", \"$timeout\", \"groupService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly $rootScope: IRunBlockRootScope,\r\n public readonly $element: HTMLElement,\r\n private readonly $timeout: angular.ITimeoutService,\r\n private readonly groupService: GroupService,\r\n private readonly translationService: TranslationService) {\r\n }\r\n\r\n $onInit() {\r\n this.parent.registerFilter(this);\r\n }\r\n\r\n $onDestroy() {\r\n this.show = false;\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n this.updateFilterLabel();\r\n\r\n if (onChangesObj['groupId'] && this.groupId) {\r\n\r\n this.selectedGroup = null;\r\n this.getGroups();\r\n }\r\n }\r\n\r\n toggleFilter(show: boolean) {\r\n this.show = show;\r\n\r\n if (this.show) {\r\n this.getGroups();\r\n }\r\n }\r\n\r\n groupClicked(group: IGroup) {\r\n this.groupId = null;\r\n\r\n if (this.selectedGroup && group.Id === this.selectedGroup.Id) {\r\n this.selectedGroup = null;\r\n }\r\n else {\r\n this.selectedGroup = group;\r\n }\r\n\r\n this.updateFilterLabel();\r\n\r\n this.createFilterObject();\r\n\r\n this.$rootScope.$broadcast(BroadcastEvent.closeResourceFilterBar);\r\n }\r\n\r\n clearFilter() {\r\n this.selectedGroup = null;\r\n this.groupId = null;\r\n\r\n this.updateFilterLabel();\r\n }\r\n\r\n createFilterObject(): IGroupFilter {\r\n return {\r\n resourceType: this.selectedResourceType,\r\n group: this.selectedGroup\r\n };\r\n }\r\n\r\n // ------------------\r\n\r\n private getGroups() {\r\n this.loading = true;\r\n\r\n this.groupService.getGroupsWithFullMappings().then(groups => {\r\n this.groups = groups;\r\n\r\n }).finally(() => {\r\n this.updateFilterLabel();\r\n\r\n this.loading = false;\r\n });\r\n }\r\n\r\n private updateFilterLabel() {\r\n this.filterLabel = this.placeholder ? this.translationService.t('filters.groupResourceFilter.resourceGroup', this.placeholder) : this.translationService.t('Common.Groups');\r\n\r\n //this.filterIcon = \"grid_on\"; // good for table filter?\r\n this.filterIcon = \"topic\";\r\n\r\n if (this.groups && this.groupId) {\r\n this.selectedGroup = this.groups.find(group => group.Id === this.groupId);\r\n }\r\n\r\n if (this.selectedGroup) {\r\n this.filterLabel = this.selectedGroup.Name;\r\n }\r\n\r\n this.isDirty = !!this.selectedGroup;\r\n }\r\n}\r\n\r\nexport class GroupResourceFilterComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n require: { [index: string]: string; };\r\n template: string;\r\n\r\n constructor() {\r\n this.bindings = {\r\n selectedGroup: \" \";","import { IVeriTag } from \"@directives/_veri/v-tags/v-tags.component\";\r\nimport { IVeriTableHeader, IVeriTableRow, IVeriTableRowCell } from \"@directives/_veri/veriTable/veriTable.component\";\r\nimport { BroadcastEvent } from \"@enums/BroadcastEvent\";\r\nimport { SortType } from \"@enums/SortType\";\r\nimport { IObservationFilter } from \"@interfaces/filters/IObservationFilter\";\r\nimport { IRunBlockRootScope } from \"@interfaces/IRunBlockRootScope\";\r\nimport { IObservationCategory, ObservationsService } from \"@services/observations.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport * as angular from \"angular\";\r\nimport { IVideoEntry } from \"../../../main/components/videos/models/IVideoEntry\";\r\nimport { IFilterBar, IFilterBarFilter } from \"../newResourceFilterBar.component\";\r\nimport \"./observationsResourceFilter.scss\";\r\n\r\nclass ComponentController implements angular.IComponentController, IFilterBarFilter{\r\n parent: IFilterBar;\r\n show = false;\r\n isDirty = false;\r\n\r\n filterName = \"Observation\";\r\n filterLabel: string;\r\n filterTitle: string;\r\n filterIcon: string;\r\n showClearFilterButton = true;\r\n\r\n observations: IObservationCategory[] = [];\r\n eventsToFilter: IVideoEntry[];\r\n\r\n loading: boolean;\r\n\r\n selectedObservation: IVeriTag;\r\n\r\n previousFilter: IObservationFilter;\r\n\r\n tableHeaders: IVeriTableHeader[];\r\n tableRows: IVeriTableRow>[];\r\n\r\n onChange: (args: { filter: IObservationFilter }) => void;\r\n\r\n static $inject = [\"$rootScope\", \"$element\", \"observationsService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly $rootScope: IRunBlockRootScope,\r\n public readonly $element: HTMLElement,\r\n private readonly observationsService: ObservationsService,\r\n private readonly translationService: TranslationService) {\r\n }\r\n\r\n $onInit() {\r\n this.parent.registerFilter(this);\r\n this.createTableHeaders();\r\n }\r\n\r\n $onDestroy() {\r\n this.show = false;\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n this.updateFilterLabel();\r\n }\r\n\r\n toggleFilter(show: boolean) {\r\n this.show = show;\r\n\r\n if (this.show) {\r\n this.getObservations();\r\n }\r\n }\r\n\r\n clearFilter() {\r\n this.selectedObservation = null;\r\n this.updateFilterLabel();\r\n }\r\n\r\n selectedObservationChanged(observation: IVeriTag) {\r\n if (this.selectedObservation?.label == observation.label) {\r\n this.selectedObservation = null;\r\n }\r\n else {\r\n this.selectedObservation = observation;\r\n }\r\n\r\n this.updateFilterLabel();\r\n this.createFilterObject();\r\n\r\n this.$rootScope.$broadcast(BroadcastEvent.closeResourceFilterBar);\r\n }\r\n\r\n createFilterObject(): IObservationFilter {\r\n return {\r\n observation: this.selectedObservation\r\n };\r\n }\r\n\r\n // ------------------\r\n\r\n private createTableHeaders() {\r\n this.tableHeaders = [\r\n {\r\n title: this.translationService.t(\"filters.observationsResourceFilter.observations\"),\r\n sortable: true\r\n },\r\n {\r\n title: this.translationService.t(\"filters.observationsResourceFilter.count\"),\r\n sortable: true,\r\n sortType: SortType.Number,\r\n width: 60\r\n }\r\n ];\r\n }\r\n\r\n private getObservations() {\r\n this.loading = true;\r\n\r\n this.observations = [];\r\n\r\n this.observations = this.observationsService.getObservations(this.eventsToFilter);\r\n\r\n this.createTableRows();\r\n this.updateFilterLabel();\r\n\r\n this.loading = false;\r\n }\r\n\r\n private updateFilterLabel() {\r\n this.filterLabel = this.translationService.t(\"filters.observationsResourceFilter.observations\");\r\n this.filterIcon = \"style\";\r\n\r\n if (this.selectedObservation) {\r\n this.filterLabel = this.selectedObservation.label;\r\n }\r\n\r\n this.isDirty = !!this.selectedObservation;\r\n }\r\n\r\n private createTableRows() {\r\n this.tableRows = [];\r\n\r\n this.observations.forEach(observation => {\r\n this.tableRows.push({\r\n data: observation,\r\n cells: this.createTableCells(observation),\r\n rowClassName: observation.count == 0 ? \"disabled\" : \"\"\r\n });\r\n });\r\n }\r\n\r\n private createTableCells(observation: IObservationCategory): IVeriTableRowCell[] {\r\n const obsTitle = this.translationService.t(`VideoObservationEnum.${observation.label}`);\r\n\r\n const cells: IVeriTableRowCell[] = [\r\n {\r\n contents: obsTitle,\r\n data: observation,\r\n sortData: obsTitle\r\n },\r\n {\r\n contents: observation.count.toString(),\r\n sortData: observation.count\r\n }\r\n ];\r\n\r\n return cells;\r\n }\r\n}\r\n\r\nexport class ObservationsResourceFilterComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n require: { [index: string]: string; };\r\n template: string;\r\n\r\n constructor() {\r\n this.bindings = {\r\n selectedObservation: \"<\",\r\n onChange: \"&\",\r\n eventsToFilter: \" \";","import { IResourceGroupListEntry } from \"@app/main/components/resourceManagement/groups/_models/IResourceGroupListEntry\";\r\nimport { IVeriTableHeader, IVeriTableRow } from \"@directives/_veri/veriTable/veriTable.component\";\r\nimport { BroadcastEvent } from \"@enums/BroadcastEvent\";\r\nimport { IDateFilter } from \"@interfaces/filters/IDateFilter\";\r\nimport { IRunBlockRootScope } from \"@interfaces/IRunBlockRootScope\";\r\nimport { HTMLService } from \"@services/htmlService.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport * as angular from \"angular\";\r\nimport { IFilterBar, IFilterBarFilter, ResourceFilterBarComponentController } from \"../newResourceFilterBar.component\";\r\nimport \"./tableColumnResourceFilter.scss\";\r\n\r\ninterface IComponentBindings {\r\n filterIcon: string;\r\n column: string | number;\r\n}\r\n\r\ninterface IColumnVariation {\r\n name: string;\r\n rows: IVeriTableRow[];\r\n count: number;\r\n}\r\n\r\nexport interface ITableColumnResourceFilter { }\r\n\r\nclass ComponentController implements angular.IComponentController, IComponentBindings, IFilterBarFilter{\r\n\r\n parent: IFilterBar;\r\n //veriTable: IVeriTableBindings;\r\n\r\n column: string | number;\r\n columnHeader: IVeriTableHeader;\r\n\r\n filterName = \"Column\";\r\n filterLabel: string = \"What\";\r\n filterTitle: string;\r\n filterIcon: string;\r\n\r\n previousFilter: ITableColumnResourceFilter;\r\n\r\n show = false;\r\n isDirty = false;\r\n showClearFilterButton = true;\r\n\r\n onChange: (args: { filter: IDateFilter }) => void;\r\n\r\n columnVariations: IColumnVariation[] = [];\r\n selectedColumnVariations: IColumnVariation[] = [];\r\n\r\n parentResourceFilterBar: ResourceFilterBarComponentController;\r\n\r\n static $inject = [\"$rootScope\", \"$q\", \"$element\", \"$timeout\", \"htmlService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly $rootScope: IRunBlockRootScope,\r\n private readonly $q: angular.IQService,\r\n public readonly $element: HTMLElement,\r\n private readonly $timeout: angular.ITimeoutService,\r\n private readonly htmlService: HTMLService,\r\n private readonly translationService: TranslationService\r\n ) {\r\n var parent = this.htmlService.findNearest(this.$element[0], \"new-resource-filter-bar\");\r\n this.parentResourceFilterBar = this.htmlService.getAngularJSComponentFromElement(parent);\r\n }\r\n\r\n $onInit() {\r\n this.waitForTable().then(() => {\r\n this.filterIcon = this.filterIcon || \"subject\";\r\n this.updateColumnDetails();\r\n this.parent.registerFilter(this);\r\n });\r\n }\r\n\r\n $onDestroy() {\r\n this.show = false;\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n this.updateColumnDetails();\r\n }\r\n\r\n toggleFilter(show: boolean) {\r\n this.show = show;\r\n\r\n if (this.show) {\r\n this.createColumnVariations(this.parentResourceFilterBar.veriTable.rows);\r\n }\r\n }\r\n\r\n clearFilter() {\r\n this.selectedColumnVariations = [];\r\n this.show = 1 as any;\r\n\r\n this.onIncludedItemChanged();\r\n this.updateFilterLabel();\r\n }\r\n\r\n createFilterObject(): ITableColumnResourceFilter {\r\n return {\r\n };\r\n }\r\n\r\n createEntityCallback(columnVariation: IColumnVariation, newInclusionState?: boolean): IResourceGroupListEntry {\r\n var included = newInclusionState;\r\n\r\n if (typeof newInclusionState != \"boolean\") {\r\n included = this.selectedColumnVariations.find(c => c.name == columnVariation.name) != null;\r\n }\r\n\r\n var entity = {\r\n id: columnVariation.name as any,\r\n data: columnVariation,\r\n title: columnVariation.name,\r\n subTitle: this.translationService.t(\"filters.tableColumnResourceFilter.items\", columnVariation.count),\r\n included: included,\r\n };\r\n\r\n return entity;\r\n }\r\n\r\n onIncludedItemChanged(item?: IResourceGroupListEntry) {\r\n if (item) {\r\n if (item.included) {\r\n this.selectedColumnVariations.push(item.data);\r\n }\r\n else {\r\n this.selectedColumnVariations = this.selectedColumnVariations.filter(cv => cv.name !== item.data.name);\r\n }\r\n }\r\n\r\n var filterRows: IVeriTableRow[] = [];\r\n\r\n if (this.selectedColumnVariations && this.selectedColumnVariations.length) {\r\n filterRows = this.selectedColumnVariations && this.selectedColumnVariations.map(x => x.rows).reduce((a, b) => a.concat(b));\r\n }\r\n\r\n this.parentResourceFilterBar.veriTable.setFilterRows(filterRows);\r\n\r\n this.updateFilterLabel();\r\n\r\n this.createFilterObject();\r\n\r\n this.$rootScope.$broadcast(BroadcastEvent.closeResourceFilterBar);\r\n }\r\n\r\n // ------------------\r\n\r\n private getTableHeaderIndexForColumn(): number {\r\n const columnNumber = this.parentResourceFilterBar.veriTable.headers.findIndex(h => {\r\n return h.title == this.column\r\n || h.title == this.translationService.t(`Common.${this.column}`)\r\n || h.id && h.id == this.column\r\n });\r\n\r\n if (columnNumber < 0) {\r\n console.error(\"Could not find\", this.column);\r\n }\r\n\r\n return columnNumber;\r\n }\r\n\r\n private createColumnVariations(rows: IVeriTableRow[]) {\r\n this.columnVariations = [];\r\n var columnNumber = this.getTableHeaderIndexForColumn();\r\n\r\n rows.forEach(row => {\r\n const cell = row.cells[columnNumber];\r\n\r\n const cellTitle = cell.summaryLabel || cell.contents;\r\n let cv = this.columnVariations.find(c => c.name == cellTitle);\r\n\r\n if (!cv) {\r\n cv = {\r\n name: cellTitle,\r\n count: 0,\r\n rows: []\r\n };\r\n\r\n this.columnVariations.push(cv);\r\n }\r\n\r\n cv.count++;\r\n cv.rows.push(row);\r\n });\r\n\r\n //this.columnVariations.sort((x, y) => x.name.localeCompare(y.name));\r\n }\r\n\r\n private updateFilterLabel() {\r\n this.filterTitle = \"\";\r\n this.filterLabel = \"\";\r\n\r\n this.isDirty = false;\r\n\r\n if (this.selectedColumnVariations && this.selectedColumnVariations.length) {\r\n\r\n this.selectedColumnVariations.forEach(cv => {\r\n if (this.filterLabel.length > 0) { this.filterLabel += \", \"; }\r\n\r\n this.filterLabel += cv.name;\r\n });\r\n\r\n this.isDirty = true;\r\n }\r\n else {\r\n this.filterLabel = this.columnHeader ? this.columnHeader.title : \"Translation Missing\";\r\n }\r\n\r\n this.filterName = this.filterLabel;\r\n }\r\n\r\n private waitForTable(waitCount = 5): angular.IPromise {\r\n var promise = this.$q.when();\r\n\r\n if (!this.parentResourceFilterBar?.veriTable && waitCount > 0) {\r\n\r\n promise = this.$timeout(() => {\r\n return this.waitForTable(--waitCount);\r\n });\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private updateColumnDetails() {\r\n if (!this.parentResourceFilterBar?.veriTable) {\r\n return;\r\n }\r\n\r\n if (typeof this.column == \"number\") {\r\n this.column = this.parentResourceFilterBar.veriTable.headers[this.column].title;\r\n }\r\n\r\n var columnPosition = this.getTableHeaderIndexForColumn();\r\n if (columnPosition >= 0) {\r\n this.columnHeader = this.parentResourceFilterBar.veriTable.headers[columnPosition];\r\n }\r\n\r\n this.updateFilterLabel();\r\n }\r\n}\r\n\r\nexport class TableColumnResourceFilterComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n require: { [index: string]: string; };\r\n template: string;\r\n\r\n constructor() {\r\n this.bindings = {\r\n filterIcon: \"@icon\",\r\n column: \"@\",\r\n\r\n onChange: \"&\"\r\n };\r\n\r\n this.require = {\r\n parent: \"^newResourceFilterBar\"\r\n };\r\n\r\n this.controller = ComponentController;\r\n this.template = require(\"./tableColumnResourceFilter.html\");\r\n }\r\n}\r\n","module.exports = \" \";","import { ITag } from \"@app/interfaces/ITag\";\r\nimport { IVeriTableHeader, IVeriTableRow, IVeriTableRowCell } from \"@directives/_veri/veriTable/veriTable.component\";\r\nimport { BroadcastEvent } from \"@enums/BroadcastEvent\";\r\nimport { ResourceAllocation } from \"@enums/ResourceType\";\r\nimport { SortType } from \"@enums/SortType\";\r\nimport { ITagFilter } from \"@interfaces/filters/ITagFilter\";\r\nimport { IRunBlockRootScope } from \"@interfaces/IRunBlockRootScope\";\r\nimport { TagsService } from \"@services/tags.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport * as angular from \"angular\";\r\nimport { IFilterBar, IFilterBarFilter } from \"../newResourceFilterBar.component\";\r\nimport \"./tagsResourceFilter.scss\";\r\n\r\ninterface IComponentBindings {\r\n selectedTag: ITag;\r\n tagId: number;\r\n resourceType: string;\r\n}\r\n\r\nclass ComponentController implements angular.IComponentController, IComponentBindings, IFilterBarFilter{\r\n parent: IFilterBar;\r\n show = false;\r\n isDirty = false;\r\n\r\n filterName = \"Tags\";\r\n filterLabel: string;\r\n filterTitle: string;\r\n filterIcon: string;\r\n showClearFilterButton = true;\r\n\r\n resourceType: string;\r\n\r\n tags: ITag[] = [];\r\n\r\n loading: boolean;\r\n\r\n tagId: number;\r\n selectedTag: ITag;\r\n\r\n previousFilter: ITagFilter;\r\n\r\n tableHeaders: IVeriTableHeader[];\r\n tableRows: IVeriTableRow[];\r\n\r\n onChange: (args: { filter: ITagFilter }) => void;\r\n\r\n static $inject = [\"$rootScope\", \"$element\", \"$timeout\", \"tagsService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly $rootScope: IRunBlockRootScope,\r\n public readonly $element: HTMLElement,\r\n private readonly $timeout: angular.ITimeoutService,\r\n private readonly tagsService: TagsService,\r\n private readonly translationService: TranslationService ) {\r\n }\r\n\r\n $onInit() {\r\n this.parent.registerFilter(this);\r\n this.createTableHeaders(); \r\n }\r\n\r\n $onDestroy() {\r\n this.show = false;\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n this.updateFilterLabel();\r\n\r\n if (onChangesObj['tagId']) {\r\n this.selectedTag = null;\r\n this.getTags();\r\n }\r\n }\r\n\r\n toggleFilter(show: boolean) {\r\n this.show = show;\r\n\r\n if (this.show) {\r\n this.getTags();\r\n }\r\n }\r\n\r\n clearFilter() {\r\n this.selectedTag = null;\r\n this.tagId = null;\r\n\r\n this.updateFilterLabel();\r\n }\r\n\r\n selectedTagChanged(tag: ITag) {\r\n this.tagId = null;\r\n\r\n if (this.selectedTag == tag) {\r\n this.selectedTag = null;\r\n }\r\n else {\r\n this.selectedTag = tag;\r\n }\r\n\r\n this.updateFilterLabel();\r\n this.createFilterObject();\r\n\r\n this.$rootScope.$broadcast(BroadcastEvent.closeResourceFilterBar);\r\n }\r\n\r\n createFilterObject(): ITagFilter {\r\n return {\r\n tag: this.selectedTag\r\n };\r\n } \r\n\r\n // ------------------\r\n\r\n private createTableHeaders() {\r\n this.tableHeaders = [\r\n { title: this.translationService.t('filters.tagsResourceFilter.tag'), sortable: true, sortType: SortType.Number },\r\n { title: this.translationService.t('filters.tagsResourceFilter.resourceType'), alignRight: true },\r\n ];\r\n }\r\n\r\n private getTags() { \r\n this.loading = true;\r\n this.tags = [];\r\n\r\n this.tagsService.getTags().then(tags => {\r\n if (this.resourceType) {\r\n this.tags = tags.filter(tag => tag.ResourceAllocation == ResourceAllocation[this.resourceType] || tag.ResourceAllocation == ResourceAllocation.All);\r\n }\r\n else {\r\n this.tags = tags;\r\n }\r\n\r\n }).finally(() => {\r\n this.createTableRows();\r\n this.updateFilterLabel();\r\n this.loading = false;\r\n });\r\n }\r\n\r\n private updateFilterLabel() {\r\n this.filterLabel = this.translationService.t('filters.tagsResourceFilter.tags');\r\n this.filterIcon = \"local_offer\";\r\n\r\n if (this.tags && this.tagId) {\r\n this.selectedTag = this.tags.find(tag => tag.Id === this.tagId);\r\n }\r\n\r\n if (this.selectedTag) {\r\n this.filterLabel = this.selectedTag.Name;\r\n }\r\n\r\n this.isDirty = !!this.selectedTag;\r\n }\r\n\r\n private createTableRows() {\r\n this.tableRows = [];\r\n\r\n this.tags.forEach(tag => {\r\n this.tableRows.push({\r\n data: tag,\r\n cells: this.createTableCells(tag)\r\n });\r\n });\r\n }\r\n\r\n private createTableCells(tag: ITag): IVeriTableRowCell[] {\r\n var resourceType = ResourceAllocation[tag.ResourceAllocation];\r\n\r\n const cells: IVeriTableRowCell[] = [\r\n {\r\n contents: `
\r\n ${tag.Name}\r\n
`,\r\n data: tag,\r\n sortData: tag.Name + ResourceAllocation[tag.ResourceAllocation],\r\n exportData: tag.Name\r\n },\r\n\r\n { contents: resourceType, className: 'text-muted' }\r\n ];\r\n\r\n return cells;\r\n }\r\n}\r\n\r\nexport class TagsResourceFilterComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n require: { [index: string]: string; };\r\n template: string;\r\n\r\n constructor() {\r\n this.bindings = {\r\n selectedTag: \" \";","import { IVeriTableHeader, IVeriTableRow, IVeriTableRowCell } from \"@directives/_veri/veriTable/veriTable.component\";\r\nimport { IGroupFilter } from \"@interfaces/filters/IGroupFilter\";\r\nimport { IVehicleFilter } from \"@interfaces/filters/IVehicleFilter\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport * as angular from \"angular\";\r\nimport { IFilterBar, IFilterBarFilter } from \"../newResourceFilterBar.component\";\r\nimport \"./vehicleResourceFilter.scss\";\r\nimport { BroadcastEvent } from \"@enums/BroadcastEvent\";\r\nimport { IRunBlockRootScope } from \"@interfaces/IRunBlockRootScope\";\r\nimport { VeriTableService } from \"@directives/_veri/veriTable/veriTable.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\n\r\ninterface IComponentBindings {\r\n selectedVehicle: IVehicle;\r\n vehicleId: number;\r\n groupFilter: IGroupFilter;\r\n onlyTemperatureVehicles: boolean;\r\n}\r\n\r\nclass ComponentController implements angular.IComponentController, IComponentBindings, IFilterBarFilter{\r\n\r\n parent: IFilterBar;\r\n show = false;\r\n isDirty = false;\r\n\r\n filterName = \"Vehicles\";\r\n filterLabel: string;\r\n filterTitle: string;\r\n filterIcon: string;\r\n showClearFilterButton = true;\r\n\r\n vehicles: IVehicle[];\r\n selectedVehicle: IVehicle;\r\n\r\n vehicleId: number;\r\n\r\n groupFilter: IGroupFilter;\r\n\r\n onlyTemperatureVehicles: boolean;\r\n\r\n previousFilter: IVehicleFilter;\r\n\r\n tableHeaders: IVeriTableHeader[];\r\n tableRows: IVeriTableRow[];\r\n\r\n onChange: (args: { filter: IVehicleFilter }) => void;\r\n\r\n static $inject = [\"$rootScope\", \"$element\", \"vehicleService\", \"veriTableService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly $rootScope: IRunBlockRootScope,\r\n public readonly $element: HTMLElement,\r\n private readonly vehicleService: VehicleService,\r\n private readonly veriTableService: VeriTableService,\r\n private readonly translationService: TranslationService) {\r\n }\r\n\r\n $onInit() {\r\n this.parent.registerFilter(this);\r\n this.createTableHeaders();\r\n }\r\n\r\n $onDestroy() {\r\n this.show = false;\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n this.updateFilterLabel();\r\n\r\n if (onChangesObj[\"groupFilter\"]) {\r\n this.getVehicles();\r\n }\r\n\r\n if (onChangesObj['vehicleId']) {\r\n this.selectedVehicle = null;\r\n this.getVehicles();\r\n }\r\n }\r\n\r\n toggleFilter(show: boolean) {\r\n this.show = show;\r\n\r\n if (this.show) {\r\n this.getVehicles();\r\n }\r\n }\r\n\r\n clearFilter() {\r\n this.selectedVehicle = null;\r\n this.vehicleId = null;\r\n\r\n this.updateFilterLabel();\r\n }\r\n\r\n selectedVehicleChanged(vehicle: IVehicle) {\r\n this.vehicleId = null;\r\n\r\n if (this.selectedVehicle && vehicle.Id === this.selectedVehicle.Id) {\r\n this.selectedVehicle = null;\r\n } else {\r\n this.selectedVehicle = vehicle;\r\n }\r\n\r\n this.updateFilterLabel();\r\n\r\n this.createFilterObject();\r\n\r\n this.$rootScope.$broadcast(BroadcastEvent.closeResourceFilterBar);\r\n }\r\n\r\n createFilterObject(): IVehicleFilter {\r\n return {\r\n vehicle: this.selectedVehicle\r\n };\r\n }\r\n\r\n // ------------------\r\n private createTableHeaders() {\r\n this.tableHeaders = [\r\n { title: this.translationService.t('Common.Vehicle'), sortable: true }\r\n ];\r\n }\r\n\r\n private getVehicles(): angular.IPromise {\r\n return this.vehicleService.getVehicles({ includeProbes: this.onlyTemperatureVehicles, includePeripheralMappings: true }).then(vehicles => {\r\n if (this.groupFilter && this.groupFilter.group) {\r\n vehicles = vehicles.filter(v => this.groupFilter.group.VehicleIds.indexOf(v.Id) >= 0);\r\n }\r\n\r\n if (this.onlyTemperatureVehicles) {\r\n vehicles = vehicles.filter(v => v.probes && v.probes.length > 0);\r\n }\r\n\r\n this.vehicles = vehicles;\r\n\r\n\r\n }).finally(() => {\r\n this.createTableRows();\r\n this.updateFilterLabel();\r\n });\r\n }\r\n\r\n private updateFilterLabel() {\r\n this.filterLabel = this.translationService.t('Common.Vehicles');\r\n this.filterIcon = \"directions_car\";\r\n\r\n if (this.vehicles && this.vehicleId) {\r\n this.selectedVehicle = this.vehicles.find(vehicle => vehicle.Id === this.vehicleId);\r\n\r\n if (!this.selectedVehicle) {\r\n this.vehicleId = null;\r\n this.onChange({filter: this.createFilterObject()});\r\n }\r\n }\r\n\r\n if (this.selectedVehicle) {\r\n this.filterLabel = this.selectedVehicle.Reg;\r\n }\r\n\r\n this.isDirty = !!this.selectedVehicle;\r\n }\r\n\r\n private createTableRows() {\r\n this.tableRows = [];\r\n\r\n this.vehicles.forEach(vehicle => {\r\n this.tableRows.push({\r\n data: vehicle,\r\n cells: this.createTableCells(vehicle),\r\n searchString: `${vehicle.ShortReg}${vehicle.Reg}`\r\n });\r\n });\r\n }\r\n\r\n private createTableCells(vehicle: IVehicle): IVeriTableRowCell[] {\r\n const cells: IVeriTableRowCell[] = [\r\n this.veriTableService.createVehicleRegCell(vehicle)\r\n ];\r\n\r\n return cells;\r\n }\r\n}\r\n\r\nexport class VehicleResourceFilterComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n require: { [index: string]: string; };\r\n template: string;\r\n\r\n constructor() {\r\n this.bindings = {\r\n onlyTemperatureVehicles: \" \";","\r\nimport { IVButtonDropDownItem } from \"@directives/_core/v-button/v-button.component\";\r\nimport { IVeriTableBindings } from \"@directives/_veri/veriTable/veriTable.component\";\r\nimport { BroadcastEvent } from \"@enums/BroadcastEvent\";\r\nimport { ConstantsService } from \"@services/constantsService\";\r\nimport { HTMLService } from \"@services/htmlService.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport * as angular from \"angular\";\r\nimport \"./newResourceFilterBar.scss\";\r\n\r\nexport interface IFilterBar {\r\n registerFilter(filter: IFilterBarFilter);\r\n}\r\n\r\nexport interface IFilterBarFilter {\r\n $element: HTMLElement;\r\n\r\n filterName: string;\r\n filterLabel: string;\r\n filterTitle: string;\r\n filterIcon?: string;\r\n\r\n show: boolean; // Shows dialog\r\n visible?: boolean; // Visible in list\r\n isDirty: boolean;\r\n\r\n toggleFilter(show: boolean);\r\n showClearFilterButton: boolean;\r\n isInvalid?: boolean;\r\n clearFilter();\r\n\r\n // Ensure common onChange pattern\r\n onChange: (args: { filter: T }) => void;\r\n nextClicked?: () => void;\r\n prevClicked?: () => void;\r\n\r\n showNextPrev?: boolean;\r\n disableNext?: boolean;\r\n disablePrev?: boolean;\r\n\r\n createFilterObject(): T;\r\n previousFilter: T;\r\n\r\n // showFilterBy: boolean;\r\n}\r\n\r\ninterface IComponentBindings {\r\n isDisabled?: boolean;\r\n showFilterBy: boolean;\r\n filterBoxRight?: boolean;\r\n hideFilterDropdownArrow: boolean;\r\n}\r\n\r\nexport class ResourceFilterBarComponentController implements angular.IComponentController, IComponentBindings, IFilterBar {\r\n\r\n children: IFilterBarFilter[] = [];\r\n openChild: IFilterBarFilter;\r\n\r\n popupRight: number;\r\n showInline: boolean;\r\n showSettingsCenter: boolean;\r\n compactView: boolean = false;\r\n compactViewCenter: boolean = false;\r\n showFilterLabel: boolean = true;\r\n showFilterBy: boolean;\r\n filterBoxRight: boolean;\r\n isDisabled: boolean = false;\r\n hideFilterDropdownArrow: boolean = false; supressClose = false;\r\n newLayout = false;\r\n\r\n dropDownItems: IVButtonDropDownItem>[] = [];\r\n showAddFilterDropDown = false;\r\n\r\n isMobile: boolean;\r\n\r\n veriTable: IVeriTableBindings;\r\n\r\n static $inject = [\"$rootScope\", \"$scope\", \"$timeout\", \"$element\", \"$attrs\", \"$mdMedia\", \"htmlService\", \"constantsService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly $rootScope: angular.IRootScopeService,\r\n private readonly $scope: angular.IScope,\r\n private readonly $timeout: angular.ITimeoutService,\r\n private readonly $element: angular.IAugmentedJQuery,\r\n private readonly $attrs: angular.IAttributes,\r\n private readonly $mdMedia: angular.material.IMedia,\r\n private readonly htmlService: HTMLService,\r\n private readonly constantsService: ConstantsService,\r\n private readonly translationService: TranslationService\r\n ) {\r\n console.warn(\"New Resource Filer Bar is deprecated\");\r\n this.newLayout = $attrs[\"new\"] == \"true\";\r\n }\r\n\r\n $onInit() {\r\n this.setDefaults();\r\n\r\n this.$scope.$on(BroadcastEvent.closeResourceFilterBar, () => {\r\n this.toggleFilter(null);\r\n });\r\n }\r\n\r\n $onDestroy() {\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n\r\n this.setDefaults();\r\n }\r\n\r\n registerFilter(filter: IFilterBarFilter) {\r\n filter.filterName = this.translationService.t(`Common.${filter.filterName.replace(/\\s/g, \"\")}`);\r\n this.children.push(filter);\r\n\r\n this.showFilterLabel = this.newLayout || !this.isMobile || this.children.length == 1;\r\n\r\n if (filter.isDirty) {\r\n this.setChildFilterVisibility(filter, true);\r\n }\r\n\r\n // A better name for this would be isPermanent or preventRemoval\r\n // Either way, if we cannot clear this, then it cannot be removed, so dont show on the drop down\r\n if (filter.showClearFilterButton) {\r\n this.dropDownItems.push({\r\n icon: filter.filterIcon,\r\n label: filter.filterName,\r\n data: filter\r\n });\r\n\r\n this.showAddFilterDropDown = true;\r\n }\r\n }\r\n\r\n toggleFilter(childFilter: IFilterBarFilter, $event: MouseEvent = null) {\r\n if (childFilter == this.openChild && this.openChild != null) {\r\n this.toggleFilter(null, $event);\r\n return;\r\n }\r\n\r\n // If we have an existing open filter, then close it and optionally send update\r\n if (this.openChild && !this.openChild.isInvalid) {\r\n this.openChild.toggleFilter(false);\r\n\r\n this.sendOnChangeEvent();\r\n }\r\n\r\n // If we have a new filter to open, then open it and set current state\r\n if (childFilter) {\r\n childFilter.previousFilter = childFilter.createFilterObject();\r\n }\r\n\r\n //console.warn(\"Here - opening child\", childFilter)\r\n this.openChild = childFilter;\r\n\r\n this.setPopupPosition($event);\r\n this.broadcast($event);\r\n this.setVisibilityOnChildren(childFilter == null);\r\n }\r\n\r\n clearFilter(child: IFilterBarFilter) {\r\n child = child || this.openChild;\r\n\r\n this.toggleChildFilterVisibility(child);\r\n child.clearFilter();\r\n this.toggleFilter(null);\r\n }\r\n\r\n closeFilter() {\r\n if (!this.openChild || this.supressClose) {\r\n return;\r\n }\r\n\r\n this.toggleFilter(null);\r\n\r\n if (this.newLayout) {\r\n // Clear up and tidy up NON changed items\r\n this.children.forEach(c => {\r\n this.setChildFilterVisibility(c, c.isDirty);\r\n });\r\n }\r\n }\r\n\r\n openFilterPicker($event: MouseEvent) {\r\n //console.log(\"openFilterPicker\");\r\n this.$scope.$applyAsync();\r\n\r\n //console.log(\"showFilterPicker\", this.showFilterPicker);\r\n\r\n this.filterBoxRight = false;\r\n this.setPopupPosition($event);\r\n this.closeFilter();\r\n }\r\n\r\n toggleChildFilterVisibility(childFilter: IFilterBarFilter) {\r\n this.setChildFilterVisibility(childFilter, !childFilter.visible);\r\n\r\n if (childFilter.visible) {\r\n this.toggleFilter(childFilter);\r\n }\r\n }\r\n\r\n private setChildFilterVisibility(childFilter: IFilterBarFilter, visible: boolean) {\r\n childFilter.visible = visible;\r\n\r\n var matchingDropDownItem = this.dropDownItems.find(i => i.data == childFilter);\r\n if (matchingDropDownItem) {\r\n matchingDropDownItem.disabled = childFilter.visible;\r\n }\r\n }\r\n\r\n onFilterItemClicked(item: IVButtonDropDownItem>) {\r\n this.toggleChildFilterVisibility(item.data);\r\n }\r\n\r\n // ---\r\n\r\n private setVisibilityOnChildren(delay = false) {\r\n\r\n this.children.forEach(child => {\r\n\r\n child.toggleFilter(false);\r\n\r\n if (delay) {\r\n this.$timeout(() => {\r\n child.$element[0].style.display = \"none\";\r\n }, 300);\r\n }\r\n else {\r\n child.$element[0].style.display = \"none\";\r\n }\r\n });\r\n\r\n if (this.openChild && !this.openChild.show) {\r\n this.openChild.toggleFilter(true);\r\n this.openChild.$element[0].style.display = \"\";\r\n }\r\n\r\n this.$scope.$applyAsync();\r\n }\r\n\r\n private setPopupPositionBasedOnButton() {\r\n\r\n this.$timeout(() => {\r\n\r\n var allButtons = this.$element.find(\"v-button\");\r\n var buttonIndex = this.children.indexOf(this.openChild);\r\n var matchingButton = allButtons[buttonIndex];\r\n\r\n var parent = matchingButton?.parentElement;\r\n\r\n if (!parent || matchingButton.offsetWidth == 0) {\r\n this.setPopupPositionBasedOnButton();\r\n return;\r\n }\r\n\r\n this.popupRight = parent.getBoundingClientRect().right - matchingButton.getBoundingClientRect().right; this.supressClose = false;\r\n });\r\n }\r\n\r\n private setPopupPosition($event: MouseEvent) {\r\n if (!this.openChild) {\r\n return;\r\n }\r\n\r\n this.supressClose = true;\r\n\r\n if (!$event) {\r\n this.setPopupPositionBasedOnButton();\r\n return;\r\n }\r\n\r\n var target: HTMLElement = ($event.target || $event.currentTarget) as HTMLElement;\r\n var filterDropDown = this.htmlService.getParentByTag(target, \"div\", \"filter-drop-down\") || target;\r\n var parent = filterDropDown.parentElement;\r\n\r\n if (this.filterBoxRight) {\r\n this.popupRight = filterDropDown.offsetLeft - parent.offsetLeft + 5;\r\n }\r\n else {\r\n this.popupRight = parent.offsetWidth - filterDropDown.offsetLeft - filterDropDown.offsetWidth;\r\n }\r\n\r\n // Strange edge case\r\n if (this.popupRight == 1) {\r\n this.popupRight = 0;\r\n }\r\n\r\n this.supressClose = false;\r\n }\r\n\r\n private broadcast($event: MouseEvent) {\r\n if (this.openChild) {\r\n this.$rootScope.$broadcast(BroadcastEvent.onShowResourceFilterBar, { event: $event });\r\n }\r\n else {\r\n this.$rootScope.$broadcast(BroadcastEvent.onHideResourceFilterBar);\r\n }\r\n }\r\n\r\n private sendOnChangeEvent() {\r\n // Only send updates if there has been changes\r\n if (!angular.equals(this.openChild.previousFilter, this.openChild.createFilterObject())) {\r\n var filter = this.openChild.createFilterObject();\r\n var openChild = this.openChild;\r\n\r\n // This small timeout allows the filter to close properly before (potentially) starting an expensive load operation\r\n this.$timeout(() => {\r\n openChild.onChange({ filter: filter });\r\n }, 0);\r\n }\r\n }\r\n\r\n private setDefaults() {\r\n this.isMobile = this.constantsService.getIsMobile();\r\n\r\n this.showInline = this.showInline === undefined ? true : this.showInline;\r\n this.showFilterBy = this.showFilterBy === undefined ? !this.isMobile : this.showFilterBy;\r\n\r\n if (this.isMobile) {\r\n this.showInline = true;\r\n this.showSettingsCenter = true;\r\n this.showFilterLabel = false;\r\n }\r\n\r\n if (this.compactView) {\r\n this.showFilterLabel = false;\r\n }\r\n\r\n if (this.compactViewCenter) {\r\n this.showSettingsCenter = true;\r\n this.showFilterLabel = false;\r\n }\r\n }\r\n}\r\n\r\nexport class NewResourceFilterBarComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string | angular.Injectable<(...args: any[]) => string>;\r\n transclude: boolean | { [index: string]: string; };\r\n\r\n constructor() {\r\n this.bindings = {\r\n showInline: \"<\",\r\n showSettingsCenter: \"<\",\r\n compactView: \"<\",\r\n compactViewCenter: \"<\",\r\n showFilterBy: \"<\",\r\n isDisabled: \" {\r\n\r\n if ($attrs[\"new\"] == \"true\") {\r\n return require(\"./newResourceFilterBar2.html\");\r\n }\r\n\r\n return require(\"./newResourceFilterBar.html\");\r\n }\r\n\r\n this.transclude = true;\r\n\r\n this.template.$inject = [\"$element\", \"$attrs\"];\r\n }\r\n}\r\n","module.exports = \"
{{childFilter.filterLabel}} {{'newResourceFilterBar.filters' | translate}}
{{'newResourceFilterBar.reset' | translate}}
{{'newResourceFilterBar.apply' | translate}}
\";","module.exports = \"
{{'newResourceFilterBar.filters' | translate}}
{{childFilter.filterIcon}} {{childFilter.filterTitle}} {{childFilter.filterLabel}}
{{'newResourceFilterBar.reset' | translate}}
{{'newResourceFilterBar.apply' | translate}}
\";","\r\nimport * as angular from \"angular\";\r\nimport { BroadcastEvent } from \"@enums/BroadcastEvent\";\r\nimport { FilterBarService } from \"@services/resourceFilterBar.service\";\r\nimport \"./resourceFilterBarModal.scss\";\r\n\r\nexport interface IResourceFilterBarEvent {\r\n event: MouseEvent;\r\n\r\n modalList?: {\r\n element: HTMLElement;\r\n controller: IResourceFilterBarModalController;\r\n distanceToCommonParent: number;\r\n }[];\r\n}\r\n\r\nexport interface IResourceFilterBarModalController {\r\n show: boolean;\r\n}\r\n\r\nclass ComponentController implements angular.IComponentController, IResourceFilterBarModalController {\r\n\r\n show: boolean;\r\n\r\n static $inject = [\"$scope\", \"$element\", \"filterBarService\"];\r\n\r\n constructor(\r\n private readonly $scope: angular.IScope,\r\n private readonly $element: JQuery,\r\n private readonly filterBarService: FilterBarService\r\n ) {\r\n }\r\n\r\n $onInit() {\r\n this.$scope.$on(BroadcastEvent.onShowResourceFilterBar, (event, filterBarEvent: IResourceFilterBarEvent) => {\r\n\r\n const distance = this.commonAncestorDistance(this.$element[0], filterBarEvent.event?.target as any);\r\n\r\n filterBarEvent.modalList = filterBarEvent.modalList || [];\r\n\r\n var iAmClosest = filterBarEvent.modalList.length == 0;\r\n\r\n filterBarEvent.modalList.forEach(modal => {\r\n iAmClosest = iAmClosest || distance < modal.distanceToCommonParent;\r\n });\r\n\r\n if (iAmClosest) {\r\n filterBarEvent.modalList.forEach(modal => {\r\n modal.controller.show = false;\r\n });\r\n }\r\n\r\n filterBarEvent.modalList.push({\r\n controller: this,\r\n distanceToCommonParent: distance,\r\n element: this.$element[0]\r\n });\r\n\r\n this.show = iAmClosest;\r\n });\r\n\r\n this.$scope.$on(BroadcastEvent.onHideResourceFilterBar, (event) => {\r\n this.show = false;\r\n });\r\n }\r\n \r\n closeResourceFilterBar() {\r\n this.show = false;\r\n this.filterBarService.closeFilterBar();\r\n }\r\n\r\n // ---\r\n\r\n private parents(node: Node): Node[] {\r\n var nodes = [node]\r\n\r\n for (; node; node = node.parentNode) {\r\n nodes.unshift(node)\r\n }\r\n\r\n return nodes\r\n }\r\n\r\n private commonAncestorDistance(node1: Node, node2: Node): number {\r\n var parents1 = this.parents(node1);\r\n var parents2 = this.parents(node2);\r\n\r\n //console.log(parents1);\r\n //console.log(parents2);\r\n\r\n if (parents1[0] != parents2[0]) {\r\n throw \"No common ancestor!\"\r\n }\r\n\r\n for (var i = 0; i < parents1.length; i++) {\r\n if (parents1[i] != parents2[i]) {\r\n //console.log(parents1.length, parents2.length, i);\r\n return Math.min(parents1.length, parents2.length) - i + 1;\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport class ResourceFilterBarModalComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n\r\n constructor() {\r\n this.bindings = {\r\n };\r\n\r\n this.controller = ComponentController;\r\n this.template = `
`;\r\n }\r\n}\r\n","import { downgradeComponent } from \"@angular/upgrade/static\";\r\nimport * as angular from \"angular\";\r\nimport { LanguageSelectorComponent } from \"./languageSelector/languageSelector.component\";\r\nimport { Translate } from \"./translate/translate.directive.ajs\";\r\n\r\nangular\r\n .module(\"app.translate.directives\", [])\r\n\r\n .directive(\"languageSelector\", downgradeComponent({ component: LanguageSelectorComponent }))\r\n .directive(\"translate\", Translate.factory())\r\n ;\r\n","import { TranslationService } from \"@services/translation.service\";\r\nimport * as angular from \"angular\";\r\n\r\nexport class Translate implements angular.IDirective {\r\n\r\n restrict = \"A\";\r\n\r\n link: (scope: angular.IScope, element: ng.IAugmentedJQuery, attrs: ng.IAttributes) => void;\r\n\r\n constructor(private readonly translationService: TranslationService) {\r\n\r\n Translate.prototype.link = ($scope: angular.IScope, $element: angular.IAugmentedJQuery, $attrs: ng.IAttributes) => { \r\n let translatedPhrase = this.translatePhrase($attrs.translate, $attrs.translateParams);\r\n\r\n $element.empty().append(translatedPhrase);\r\n }\r\n }\r\n\r\n translatePhrase(phrase: string, params?: any) {\r\n return this.translationService.t(phrase, params);\r\n }\r\n\r\n static factory(): angular.IDirectiveFactory {\r\n const directive = (translationService: TranslationService) => new Translate(translationService);\r\n\r\n directive.$inject = [\"translationService\"];\r\n\r\n return directive;\r\n }\r\n}\r\n","import { downgradeComponent } from \"@angular/upgrade/static\";\r\nimport * as angular from \"angular\";\r\nimport { DriverSummaryPanelComponent } from \"./driverSummaryPanel/driverSummaryPanel.component\";\r\nimport { JourneySummaryComponent } from \"./journeySummary/journeySummary.component\";\r\nimport { VehicleButtonFilterComponent } from \"./vehicle-button-filter/vehicle-button-filter.component\";\r\nimport { VehicleInfoCardComponent } from \"./vehicleInfoCard/vehicleInfoCard.component\";\r\nimport { VehicleListComponent } from \"./vehicleList/vehicleList.component\";\r\nimport { VehiclePlotTimeComponent } from \"./vehiclePlotTime/vehiclePlotTime.component\";\r\nimport { VehicleRegComponent } from \"./vehicleReg/vehicleReg.component\";\r\nimport { VVehicleVideoStreamComponent } from \"./VehicleVideoStream/v-vehicle-video-stream.component\";\r\n\r\nangular\r\n .module(\"app.vehicle.directives\", [])\r\n\r\n .directive(\"vehicleInfoCard\", downgradeComponent({ component: VehicleInfoCardComponent }))\r\n .directive(\"vVehicleVideoStream\", downgradeComponent({ component: VVehicleVideoStreamComponent }))\r\n .component(\"vehicleList\", new VehicleListComponent())\r\n .directive(\"vehicleReg\", downgradeComponent({ component: VehicleRegComponent }))\r\n .directive(\"vehiclePlotTime\", downgradeComponent({ component: VehiclePlotTimeComponent }))\r\n\r\n .directive(\"driverSummaryPanel\", downgradeComponent({ component: DriverSummaryPanelComponent }))\r\n\r\n .directive(\"vehicleListNew\", downgradeComponent({ component: VehicleListComponent }))\r\n .directive(\"vehicleButtonFilter\", downgradeComponent({ component: VehicleButtonFilterComponent }))\r\n\r\n .component(\"journeySummary\", new JourneySummaryComponent())\r\n ;\r\n","module.exports = \"
{{ $ctrl.selected ? 'zoom_out' : 'zoom_in' }} {{ $ctrl.selected ? ('journeySummary.zoomOut' | translate) : ('journeySummary.zoomIn' | translate) }} 2\\\"> {{ ($ctrl.hideEvents ? 'journeySummary.showEvents' : 'journeySummary.hideEvents') | translate: $ctrl.journey.events.length - 2 }}
local_parking {{::$ctrl.journey.timeToNextJourney}} @ {{::$ctrl.journey.EndLocationInformation.LocationDescription}}
\";","module.exports = \"
{{'vehicleList.orderBy' | translate}} {{orderBy.name}}
{{'vehicleList.reverse' | translate}}
{{'vehicleList.trailer' | translate}}
{{'vehicleList.attachedSince' | translate : (vehicle.trailerMapping.StartUtc | veriDate)}}
{{ (vehicle.Distance) ? ('vehicleList.distanceMiles' | translate : vehicle.Distance) : ('vehicleList.unknown' | translate) }}
\";","import { downgradeComponent } from \"@angular/upgrade/static\";\r\nimport { CalendarComponent } from \"@directives/calendar/veriCalendar.component\";\r\nimport { VExportButtonComponent } from \"@directives/_veri/export/v-export-button/v-export-button.component\";\r\nimport { VCalendarComponent } from \"@directives/_veri/v-calendar/v-calendar.component\";\r\nimport { VDateSelectorComponent } from \"@directives/_veri/v-date-selector/v-date-selector.component\";\r\nimport { VListComponent } from \"@directives/_veri/v-list/v-list.component\";\r\nimport { VTimelineComponent } from \"@directives/_veri/v-timeline/v-timeline.component\";\r\nimport { VeriNavPillsComponent } from \"@directives/_veri/veriPills/veriPills.component\";\r\nimport { VeriRouteTabsComponent } from \"@directives/_veri/veriTab/routeTabs.component\";\r\nimport * as angular from \"angular\";\r\nimport { DashboardBoxSmallComponent } from \"./dashboard/dashboardBoxSmall.component\";\r\nimport { DownloadAsReportComponent } from \"./downloadAsReport/downloadAsReport.component\";\r\nimport { EventsExportComponent } from \"./export/eventsExport/eventsExport.component\";\r\nimport { LegacyExportService } from \"./export/legacyExport.service\";\r\nimport { JourneysExportComponent } from \"./export/journeysExport/journeysExport.component\";\r\nimport { PlotsExportComponent } from \"./export/plotsExport/plotsExport.component\";\r\nimport { ExternalReferenceComponent } from \"./externalReference/externalReference.component\";\r\nimport { ExternalReferenceService } from \"./externalReference/externalReference.service\";\r\nimport { ExternalReferenceRecordComponent } from \"./externalReference/externalReferenceDialog/externalReferenceRecord.component\";\r\nimport { GroupAutocompleteComponent } from \"./group-autocomplete/group-autocomplete.component\";\r\nimport { GroupHierarchyComponent } from \"./groupHierarchy/groupHierarchy.component\";\r\nimport { GroupSelectorComponent } from \"./groupHierarchy/groupSelector.component\";\r\nimport { TagsComponent } from \"./tags/tags.component\";\r\nimport { VDescriptiveListItemComponent } from \"./v-descriptive-list-item/v-descriptive-list-item.component\";\r\nimport { VPillsComponent } from \"./v-pills/v-pills.component\";\r\nimport { VTagsComponent } from \"./v-tags/v-tags.component\";\r\nimport { VTimeFiltersComponent } from \"./v-time-filters/v-time-filters.component\";\r\nimport { VeriBadgeComponent } from \"./veriBadge/veriBadge.component\";\r\nimport { VeriCardComponent } from \"./veriCard/veriCard.component\";\r\nimport { VeriColourPickerComponent } from \"./veriColourPicker/veriColourPicker.component\";\r\nimport { VeriDateRangeComponent } from \"./veriDateRange/veriDateRange.component\";\r\nimport { VeriInfoPanelComponent } from \"./veriInfoPanel/veriInfoPanel.component\";\r\nimport { VeriInlineDatePickerComponent } from \"./veriInlineDatePicker/veriInlineDatePicker.component\";\r\nimport { VeriListComponent } from \"./veriList/veriList.component\";\r\nimport { VeriNumberFieldComponent } from \"./veriNumberField/veriNumberField.component\";\r\nimport { VeriPageComponent } from \"./veriPage/veriPage.component\";\r\nimport { VeriSearchBoxComponent } from \"./veriSearchBox/veriSearchBox.directive\";\r\nimport { VeriSimpleNavComponent } from \"./veriSimpleNav/veriSimpleNav.component\";\r\nimport { VeriTabComponent } from \"./veriTab/veriTab.component\";\r\nimport { VeriTabsComponent } from \"./veriTab/veriTabs.component\";\r\nimport { DrillDownReportTableComponent } from \"./veriTable/drillDownReportTable/drillDownReportTable.component\";\r\nimport { ReportTableComponent } from \"./veriTable/reportTable/reportTable.component\";\r\nimport { VeriTableComponent } from \"./veriTable/veriTable.component\";\r\nimport { VeriTableService } from \"./veriTable/veriTable.service\";\r\nimport { VeriTableContainerComponent } from \"./veriTable/veriTableContainer/veriTableContainer.component\";\r\nimport { VeriTableSummaryComponent } from \"./veriTable/veriTableSummary/veriTableSummary.component\";\r\nimport { VeriVideoComponent } from \"./veriVideo/veriVideo.component\";\r\nimport { VeriVideoThumbnailsComponent } from \"./veriVideoThumbnails/veriVideoThumbnails.component\";\r\nimport { VVideoComponent } from \"./veriVideo/v-video.component\";\r\nimport { VVideoControlsComponent } from \"./veriVideo/videoControls/video-controls.component\";\r\nimport { VVideoProgressComponent } from \"./veriVideo/videoProgress/video-progress.component\";\r\nimport { VVideoCollectionComponent } from \"./veriVideo/v-video-collection/v-video-collection.component\";\r\nimport { VStreamCollectionComponent } from \"./veriVideo/v-stream-collection/v-stream-collection.component\";\r\nimport { GroupHierarchyComponent2 } from \"@components/resourceManagement/groups/group-hierarchy/group-hierarchy.component\";\r\n\r\nangular\r\n .module(\"app.veri.directives\", [\"app.map.directives\"])\r\n .directive(\"dashboardBoxSmall\", downgradeComponent({ component: DashboardBoxSmallComponent }))\r\n\r\n .service(\"externalReferenceService\", ExternalReferenceService)\r\n .component(\"externalReferenceRecord\", new ExternalReferenceRecordComponent())\r\n .component(\"externalReference\", new ExternalReferenceComponent())\r\n\r\n .component(\"veriList\", new VeriListComponent())\r\n .directive(\"veriColourPicker\", downgradeComponent({ component: VeriColourPickerComponent }))\r\n .component(\"veriDateRange\", new VeriDateRangeComponent())\r\n .component(\"veriInlineDatePicker\", new VeriInlineDatePickerComponent())\r\n .directive(\"veriSearchBox\", downgradeComponent({ component: VeriSearchBoxComponent }))\r\n .directive(\"veriSimpleNav\", downgradeComponent({ component: VeriSimpleNavComponent }))\r\n .directive(\"veriBadge\", downgradeComponent({ component: VeriBadgeComponent }))\r\n .directive(\"vTimeline\", downgradeComponent({ component: VTimelineComponent }))\r\n .directive(\"vList\", downgradeComponent({ component: VListComponent }))\r\n .directive(\"vPills\", downgradeComponent({ component: VPillsComponent }))\r\n\r\n .directive(\"vTags\", downgradeComponent({ component: VTagsComponent }))\r\n .component(\"tags\", new TagsComponent())\r\n .directive(\"veriCard\", downgradeComponent({ component: VeriCardComponent }))\r\n .directive(\"veriNavPills\", downgradeComponent({ component: VeriNavPillsComponent }))\r\n .directive(\"veriInfoPanel\", downgradeComponent({ component: VeriInfoPanelComponent }))\r\n .directive(\"vExportButton\", downgradeComponent({ component: VExportButtonComponent }))\r\n .directive(\"veriNumberField\", downgradeComponent({ component: VeriNumberFieldComponent }))\r\n\r\n .directive(\"vCalendar\", downgradeComponent({ component: VCalendarComponent }))\r\n .directive(\"vDateSelector\", downgradeComponent({ component: VDateSelectorComponent }))\r\n .directive(\"vTimeFilters\", downgradeComponent({ component: VTimeFiltersComponent }))\r\n\r\n .component(\"veriPage\", new VeriPageComponent())\r\n .component(\"veriTab\", new VeriTabComponent())\r\n .component(\"veriTabs\", new VeriTabsComponent())\r\n .component(\"veriRouteTabs\", new VeriRouteTabsComponent())\r\n .component(\"veriVerticalTabs\", new VeriTabsComponent(true))\r\n\r\n .directive(\"veriTableContainer\", downgradeComponent({ component: VeriTableContainerComponent }))\r\n .directive(\"veriTableSummary\", downgradeComponent({ component: VeriTableSummaryComponent }))\r\n .component(\"veriTable\", new VeriTableComponent())\r\n .component(\"reportTable\", new ReportTableComponent())\r\n .component(\"drillDownReportTable\", new DrillDownReportTableComponent())\r\n .component(\"downloadAsReport\", new DownloadAsReportComponent())\r\n\r\n .component(\"veriVideo\", new VeriVideoComponent())\r\n .directive(\"vVideo\", downgradeComponent({component: VVideoComponent}))\r\n .directive(\"vVideoCollection\", downgradeComponent({ component: VVideoCollectionComponent }))\r\n .directive(\"vStreamCollection\", downgradeComponent({ component: VStreamCollectionComponent }))\r\n\r\n .directive(\"vVideoControls\", downgradeComponent({ component: VVideoControlsComponent }))\r\n .directive(\"vVideoProgress\", downgradeComponent({ component: VVideoProgressComponent }))\r\n\r\n .directive(\"veriVideoThumbnails\", downgradeComponent({ component: VeriVideoThumbnailsComponent }))\r\n\r\n .component(\"groupHierarchy\", new GroupHierarchyComponent())\r\n .directive(\"groupHierarchy2\", downgradeComponent({ component: GroupHierarchyComponent2 }))\r\n .component(\"groupSelector\", new GroupSelectorComponent())\r\n .component(\"groupAutocomplete\", downgradeComponent({ component: GroupAutocompleteComponent }))\r\n\r\n .component(\"plotsExport\", new PlotsExportComponent())\r\n .component(\"journeysExport\", new JourneysExportComponent())\r\n .component(\"eventsExport\", new EventsExportComponent())\r\n .service(\"exportService\", LegacyExportService)\r\n\r\n .service(\"veriTableService\", VeriTableService)\r\n\r\n .component(\"veriCalendar\", new CalendarComponent())\r\n\r\n .directive(\"vDescriptiveListItem\", downgradeComponent({ component: VDescriptiveListItemComponent }))\r\n ;\r\n","import * as moment from \"moment\";\r\nimport \"./veriCalendar.scss\";\r\n\r\nclass CalendarComponentController implements angular.IComponentController {\r\n loading: boolean = true;\r\n\r\n selectedDate: Date;\r\n\r\n selectableDates: Date[];\r\n\r\n onDateChanged: (args: { date: Date }) => void;\r\n\r\n dateFilterFn: (date: Date) => void;\r\n\r\n $onInit() {\r\n this.dateFilterFn = (date) => {\r\n for (let i = 0; i < this.selectableDates.length; i++) {\r\n if (moment(this.selectableDates[i]).isSame(date, \"day\")) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n }\r\n\r\n $onChanges() {\r\n if (this.selectableDates) {\r\n this.loading = false;\r\n }\r\n }\r\n\r\n dateChanged() {\r\n if (this.onDateChanged) {\r\n this.onDateChanged({ date: this.selectedDate });\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\nexport class CalendarComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n\r\n constructor() {\r\n this.bindings = {\r\n selectedDate: \"<\",\r\n\r\n selectableDates: \"<\",\r\n\r\n onDateChanged: \"&\"\r\n };\r\n\r\n this.controller = CalendarComponentController;\r\n this.template = require(\"./veriCalendar.html\");\r\n }\r\n}\r\n","module.exports = \" \";","import { AuthorizationService } from \"@services/authorization.service\";\r\nimport { IStateData } from \"@services/routeConfigHelper.provider\";\r\nimport { StateRegistry } from \"@uirouter/angularjs\";\r\nimport { StateService } from \"@uirouter/core\";\r\nimport \"./routeTabs.component.scss\";\r\n\r\ninterface IRouteTab {\r\n\r\n tabTitle: string;\r\n routeName: string;\r\n icon: string;\r\n selected?: boolean;\r\n count: number | string;\r\n location: string;\r\n}\r\n\r\nclass Controller implements angular.IComponentController/*, IRegisterTab */ {\r\n route: string;\r\n routeTabs: IRouteTab[] = [];\r\n counts: { [key: string]: number | string }\r\n\r\n static $inject = [\"$state\", \"$stateRegistry\", \"authorizationService\"];\r\n\r\n constructor(\r\n private readonly $state: StateService,\r\n private readonly $stateRegistry: StateRegistry,\r\n private readonly authorizationService: AuthorizationService) {\r\n }\r\n\r\n $onInit() {\r\n // Find all child states\r\n var parentState = this.route || this.$state.$current.name;\r\n //var stateTokens = parentState.split(\".\");\r\n //parentState = stateTokens.slice(0, -1).join(\".\");\r\n\r\n var children = this.$stateRegistry.get().filter((cState) => { return cState.name.indexOf(parentState) === 0 && cState.name != parentState });\r\n\r\n children.forEach(childState => {\r\n\r\n if (childState.abstract) {\r\n return;\r\n }\r\n\r\n var data: IStateData = childState.data;\r\n if (!data?.translation) {\r\n return;\r\n }\r\n\r\n if (data?.roles || data?.features) {\r\n if (!this.authorizationService.isUserAuthorized(data.roles, data.features)) {\r\n return;\r\n }\r\n }\r\n\r\n this.routeTabs.push({\r\n tabTitle: data.translation,\r\n routeName: childState.name,\r\n icon: data.icon,\r\n count: this.counts && this.counts[data.countKey],\r\n location: data.location,\r\n selected: this.$state.$current.name == childState.name\r\n });\r\n });\r\n\r\n // Auto select first, if we have none\r\n if (!this.routeTabs.some(t => t.selected)) {\r\n this.routeTabs[0].selected = true;\r\n }\r\n }\r\n\r\n tabSelected(tab: IRouteTab) {\r\n // Dont recurse\r\n if (this.$state.$current.name == tab.routeName) {\r\n return;\r\n }\r\n\r\n this.$state.go(tab.routeName);\r\n }\r\n}\r\n\r\nexport class VeriRouteTabsComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n require: { [index: string]: string; };\r\n controller: any;\r\n template: string | angular.Injectable<(...args: any[]) => string>;\r\n\r\n constructor() {\r\n this.bindings = {\r\n route: \"@\",\r\n counts: \"<\"\r\n };\r\n\r\n this.controller = Controller;\r\n this.template = require(\"./routeTabs.component.html\");\r\n }\r\n}\r\n","module.exports = \"
\";","import { IVeriTableHeader, IVeriTableRow } from \"@directives/_veri/veriTable/veriTable.component\";\r\nimport { DynamicReportService, ExportType } from \"@reports/_services/dynamicReports.service\";\r\nimport { LegacyExportService, IExportTableParams } from \"@directives/_veri/export/legacyExport.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport * as angular from \"angular\";\r\nimport copy from \"fast-copy/dist/fast-copy.esm.js\";\r\nimport { IDataDefinition, IReportDefinition } from \"../../../main/components/reports/models/IReportDefinition\";\r\nimport \"./downloadAsReport.scss\";\r\n\r\nclass DownloadAsReportComponentController implements angular.IComponentController {\r\n\r\n showDownloadOptions: boolean;\r\n downloadOptionsLeft: boolean = false;\r\n tooltipAlignRight: boolean = false;\r\n\r\n downloadOptions: string[] = [\r\n 'pdf',\r\n 'csv',\r\n 'excel'\r\n ];\r\n\r\n headers: IVeriTableHeader[];\r\n rows: IVeriTableRow[];\r\n\r\n exportTitle: string;\r\n\r\n definition: IDataDefinition;\r\n report: IReportDefinition;\r\n\r\n reportDefinition: IReportDefinition;\r\n\r\n //reportColumns: IColumnHeader[];\r\n\r\n loading: boolean;\r\n\r\n disabled: boolean;\r\n\r\n exportAsLandscape: boolean;\r\n\r\n showText: boolean;\r\n\r\n promiseArray: angular.IPromise[];\r\n\r\n static $inject = [\"$q\", \"exportService\", \"dynamicReportService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly exportService: LegacyExportService,\r\n private readonly dynamicReportService: DynamicReportService,\r\n private readonly translationService: TranslationService) {\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject): void {\r\n if (this.definition || this.report) {\r\n this.reportDefinition = copy(this.definition || this.report);\r\n }\r\n }\r\n\r\n onOptionClick(option: string): void {\r\n\r\n this.loading = true;\r\n var exportType = ExportType.PDF;\r\n\r\n switch (option) {\r\n case 'csv':\r\n exportType= ExportType.CSV;\r\n break;\r\n\r\n case 'excel':\r\n exportType = ExportType.Excel;\r\n break;\r\n }\r\n\r\n var params: IExportTableParams = {\r\n exportTitle: this.getExportTitle(),\r\n exportType: exportType,\r\n headers: this.headers,\r\n rows: this.rows,\r\n exportAsLandscape: this.exportAsLandscape,\r\n reportDefinition: this.reportDefinition\r\n };\r\n\r\n this.exportService.downloadOldTableAsReport(params).then(() => {\r\n this.loading = false;\r\n });\r\n }\r\n\r\n openDownloadOptions(): void {\r\n if (this.disabled) {\r\n return;\r\n }\r\n\r\n this.showDownloadOptions = !this.showDownloadOptions;\r\n }\r\n\r\n hideDownloadOptions(): void {\r\n this.showDownloadOptions = false;\r\n }\r\n\r\n // ---\r\n\r\n private getExportTitle(): string {\r\n return this.exportTitle ? this.exportTitle : this.translationService.t('downloadAsReport.export');\r\n }\r\n}\r\n\r\nexport class DownloadAsReportComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n\r\n constructor() {\r\n this.bindings = {\r\n report: \" get_app {{'downloadAsReport.downloadExport' | translate}}
  • {{'downloadAsReport.downloadAs' | translate : option}} keyboard_arrow_right
\";","import \"./eventsExport.scss\";\r\nimport { IVeriTableRow, IVeriTableHeader } from \"@directives/_veri/veriTable/veriTable.component\";\r\nimport { IPlotEvent } from \"@interfaces/IPlot\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport { SortType } from \"@enums/SortType\";\r\nimport { VeriTableService } from \"@directives/_veri/veriTable/veriTable.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { IDateFilter } from \"@interfaces/filters/IDateFilter\";\r\nimport { DateRange } from \"@enums/DateRange.enum\";\r\n\r\ninterface IComponentBindings {\r\n events: IPlotEvent[];\r\n}\r\n\r\nclass ComponentController implements angular.IComponentController, IComponentBindings {\r\n tableRows: IVeriTableRow[] = [];\r\n tableHeaders: IVeriTableHeader[] = [\r\n { title: this.translationService.t(\"eventsExport.time\"), sortType: SortType.Date },\r\n { title: this.translationService.t(\"eventsExport.label\") },\r\n { title: this.translationService.t(\"eventsExport.location\") }\r\n ];\r\n\r\n events: IPlotEvent[];\r\n\r\n defaultDateRange: DateRange = DateRange.Today;\r\n dateFilter: IDateFilter;\r\n\r\n static $inject = [\"veriDate\", \"veriTableService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly veriDate: VeriDate,\r\n private readonly veriTableService: VeriTableService,\r\n private readonly translationService: TranslationService) {\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n\r\n this.dateFilter = this.veriDate.dateRangeFromEnum(this.defaultDateRange);\r\n this.updateEventsTable();\r\n\r\n }\r\n\r\n onDateFilterChanged(filter: IDateFilter): void {\r\n this.dateFilter = filter;\r\n this.updateEventsTable();\r\n }\r\n\r\n private updateEventsTable() {\r\n\r\n this.tableRows = [];\r\n\r\n if (this.events) {\r\n this.tableRows = this.createExportDataFromJourneyEvents(this.events);\r\n }\r\n }\r\n\r\n private createExportDataFromJourneyEvents(events: IPlotEvent[]): IVeriTableRow[] {\r\n\r\n let startTimeMinutes = this.veriDate.parseTimeSpan(this.dateFilter.startTime ?? \"00:00:00\") / 60;\r\n let endTimeMinutes = this.veriDate.parseTimeSpan(this.dateFilter.endTime ?? \"23:59:59\") / 60;\r\n\r\n return this.veriTableService.createTableRowsWithCells(events.filter(e => {\r\n let eventTimeMinutes = this.veriDate.getMinuteOfDayFromDate(this.veriDate.createDate(e.Utc));\r\n return eventTimeMinutes >= startTimeMinutes && eventTimeMinutes <= endTimeMinutes\r\n }),\r\n (event) => {\r\n return [\r\n this.veriTableService.createDateTimeCell(event.Utc),\r\n { contents: event.label },\r\n this.veriTableService.createLocationInformationCell(event.plot.Id, \"row.data.plot\", event.plot)\r\n ];\r\n },\r\n (event) => {\r\n return `${this.veriDate.formatDate(event.Utc)}${event.label}`;\r\n });\r\n }\r\n}\r\n\r\nexport class EventsExportComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n\r\n constructor() {\r\n this.bindings = {\r\n events: \"<\"\r\n };\r\n\r\n this.controller = ComponentController;\r\n this.template = require(\"./eventsExport.html\");\r\n }\r\n}\r\n","module.exports = \" \";","import \"./journeysExport.scss\";\r\nimport { IVeriTableRow, IVeriTableHeader } from \"@directives/_veri/veriTable/veriTable.component\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport { SortType } from \"@enums/SortType\";\r\nimport { VeriTableService } from \"@directives/_veri/veriTable/veriTable.service\";\r\nimport { IJourney } from \"@interfaces/IJourney\";\r\nimport { UnitConversionType } from \"@services/unitConversion.service\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { IDateFilter } from \"@interfaces/filters/IDateFilter\";\r\nimport { DateRange } from \"@enums/DateRange.enum\";\r\n\r\ninterface IComponentBindings {\r\n journeys: IJourney[];\r\n additionalData: IVehicle;\r\n}\r\n\r\nclass ComponentController implements angular.IComponentController, IComponentBindings {\r\n tableRows: IVeriTableRow[] = [];\r\n tableHeaders: IVeriTableHeader[] = [\r\n { title: this.translationService.t(\"Common.Driver\"), sortType: SortType.String },\r\n { title: this.translationService.t(\"journeysExport.startTime\"), sortType: SortType.Date },\r\n { title: this.translationService.t(\"journeysExport.startLocation\"), sortType: SortType.String },\r\n { title: this.translationService.t(\"journeysExport.startOdometer\"), sortType: SortType.Number },\r\n { title: this.translationService.t(\"journeysExport.endTime\"), sortType: SortType.Date },\r\n { title: this.translationService.t(\"journeysExport.endLocation\"), sortType: SortType.String },\r\n { title: this.translationService.t(\"journeysExport.endOdometer\"), sortType: SortType.Number },\r\n //{ title: \"Duration\", sortType: SortType.Number },\r\n { title: this.translationService.t(\"journeysExport.averageSpeed\"), sortType: SortType.Number },\r\n //{ title: \"Max Speed\", sortType: SortType.Number },\r\n { title: this.translationService.t(\"Common.Distance\"), sortType: SortType.Number },\r\n ];\r\n\r\n journeys: IJourney[];\r\n additionalData: IVehicle;\r\n\r\n defaultDateRange: DateRange = DateRange.Today;\r\n dateFilter: IDateFilter;\r\n\r\n exportTitle = this.translationService.t(\"Common.Journeys\");\r\n\r\n static $inject = [\"veriDate\", \"veriTableService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly veriDate: VeriDate,\r\n private readonly veriTableService: VeriTableService,\r\n private readonly translationService: TranslationService) {\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n\r\n this.dateFilter = this.veriDate.dateRangeFromEnum(this.defaultDateRange);\r\n this.updateJourneysTable();\r\n\r\n }\r\n\r\n onDateFilterChanged(filter: IDateFilter): void {\r\n this.dateFilter = filter;\r\n this.updateJourneysTable();\r\n }\r\n\r\n private updateJourneysTable() {\r\n\r\n this.tableRows = [];\r\n\r\n if (this.journeys) {\r\n this.tableRows = this.createExportDataFromJourneys(this.journeys);\r\n }\r\n\r\n if (this.additionalData) {\r\n this.exportTitle = `${this.additionalData.ShortReg} Journeys`;\r\n } else {\r\n this.tableHeaders.unshift({ title: this.translationService.t(\"Common.Vehicle\"), sortType: SortType.String });\r\n }\r\n }\r\n\r\n private createExportDataFromJourneys(journeys: IJourney[]): IVeriTableRow[] {\r\n\r\n let startTimeMinutes = this.veriDate.parseTimeSpan(this.dateFilter.startTime ?? \"00:00:00\") / 60;\r\n let endTimeMinutes = this.veriDate.parseTimeSpan(this.dateFilter.endTime ?? \"23:59:59\") / 60;\r\n\r\n return this.veriTableService.createTableRowsWithCells(journeys.filter(j => {\r\n let journeyStartTimeMinutes = this.veriDate.getMinuteOfDayFromDate(this.veriDate.createDate(j.StartUtc));\r\n let journeyEndTimeMinutes = this.veriDate.getMinuteOfDayFromDate(this.veriDate.createDate(j.EndUtc));\r\n return (journeyStartTimeMinutes >= startTimeMinutes && journeyStartTimeMinutes <= endTimeMinutes) ||\r\n (journeyEndTimeMinutes >= startTimeMinutes && journeyEndTimeMinutes <= endTimeMinutes)\r\n }),\r\n (journey) => {\r\n var cells = [\r\n { contents: journey.driver ? journey.driver.Name : \"\" },\r\n this.veriTableService.createDateTimeCell(journey.StartUtc),\r\n { contents: journey.plots.find(p => p.Id == journey.StartPlotId)?.LocationInformation?.LocationDescription },\r\n this.veriTableService.createConvertedValueCell(journey.OdometerKmStart, UnitConversionType.Distance),\r\n this.veriTableService.createDateTimeCell(journey.EndUtc),\r\n { contents: journey.plots.find(p => p.Id == journey.EndPlotId)?.LocationInformation?.LocationDescription },\r\n this.veriTableService.createConvertedValueCell(journey.OdometerKmEnd, UnitConversionType.Distance),\r\n //{ contents: journey.duration },\r\n this.veriTableService.createConvertedValueCell(journey.AverageSpeed, UnitConversionType.Speed),\r\n //this.veriTableService.createConvertedValueCell(journey.MaxSpeedKph, UnitConversionType.Speed),\r\n this.veriTableService.createConvertedValueCell(journey.DistanceKm, UnitConversionType.Distance)\r\n ];\r\n\r\n if (!this.additionalData) {\r\n cells.unshift({ contents: journey.vehicle ? journey.vehicle.ShortReg : \"\" });\r\n }\r\n\r\n return cells;\r\n },\r\n (journey) => {\r\n const driverName = journey.driver ? journey.driver.Name : \"\";\r\n const locationStart = journey.plots.find(p => p.Id == journey.StartPlotId)?.LocationInformation?.LocationDescription;\r\n const locationEnd = journey.plots.find(p => p.Id == journey.EndPlotId)?.LocationInformation?.LocationDescription;\r\n const timeStart = this.veriDate.formatDate(journey.StartUtc);\r\n const timeEnd = this.veriDate.formatDate(journey.EndUtc);\r\n\r\n return `${driverName}${locationStart}${locationEnd}${timeStart}${timeEnd}`;\r\n });\r\n }\r\n}\r\n\r\nexport class JourneysExportComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n\r\n constructor() {\r\n this.bindings = {\r\n journeys: \"<\",\r\n additionalData: \" \";","import \"./plotsExport.scss\";\r\nimport { IVeriTableRow, IVeriTableHeader } from \"@directives/_veri/veriTable/veriTable.component\";\r\nimport { IPlot } from \"@interfaces/IPlot\";\r\nimport { ReasonCode } from \"@enums/ReasonCode\";\r\nimport { PlotService } from \"@services/plot.service\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport { SortType } from \"@enums/SortType\";\r\nimport { VeriTableService } from \"@directives/_veri/veriTable/veriTable.service\";\r\nimport { UnitConversionType } from \"@services/unitConversion.service\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { IDateFilter } from \"@interfaces/filters/IDateFilter\";\r\nimport { DateRange } from \"@enums/DateRange.enum\";\r\n\r\ninterface IComponentBindings {\r\n plots: IPlot[];\r\n additionalData: IVehicle;\r\n}\r\n\r\nclass ComponentController implements angular.IComponentController, IComponentBindings {\r\n tableRows: IVeriTableRow[] = [];\r\n tableHeaders: IVeriTableHeader[] = [\r\n { title: this.translationService.t(\"plotsExport.time\"), sortType: SortType.Date },\r\n { title: this.translationService.t(\"plotsExport.speed\") },\r\n { title: this.translationService.t(\"plotsExport.direction\") },\r\n { title: this.translationService.t(\"plotsExport.reason\") },\r\n { title: this.translationService.t(\"plotsExport.odometer\") },\r\n { title: this.translationService.t(\"plotsExport.location\") }\r\n ];\r\n\r\n plots: IPlot[];\r\n additionalData: IVehicle;\r\n\r\n defaultDateRange: DateRange = DateRange.Today;\r\n dateFilter: IDateFilter;\r\n\r\n exportTitle = this.translationService.t(\"plotsExport.plots\");\r\n\r\n static $inject = [\"plotService\", \"veriDate\", \"veriTableService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly plotService: PlotService,\r\n private readonly veriDate: VeriDate,\r\n private readonly veriTableService: VeriTableService,\r\n private readonly translationService: TranslationService) {\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n\r\n this.dateFilter = this.veriDate.dateRangeFromEnum(this.defaultDateRange);\r\n\r\n this.updatePlotsTable();\r\n }\r\n\r\n\r\n\r\n onDateFilterChanged(filter: IDateFilter): void {\r\n this.dateFilter = filter;\r\n this.updatePlotsTable();\r\n }\r\n\r\n private updatePlotsTable() {\r\n\r\n this.tableRows = [];\r\n\r\n if (this.plots) {\r\n this.tableRows = this.createExportDataFromJourneyPlots(this.plots);\r\n }\r\n\r\n if (this.additionalData) {\r\n this.exportTitle = this.translationService.t('plotsExport.vehiclePlots', this.additionalData.ShortReg);\r\n }\r\n }\r\n private createExportDataFromJourneyPlots(plots: IPlot[]): IVeriTableRow[] {\r\n\r\n let startTimeMinutes = this.veriDate.parseTimeSpan(this.dateFilter.startTime??\"00:00:00\") / 60;\r\n let endTimeMinutes = this.veriDate.parseTimeSpan(this.dateFilter.endTime ?? \"23:59:59\") / 60;\r\n\r\n return this.veriTableService.createTableRowsWithCells(plots.filter(p => {\r\n let plotTimeMinutes = this.veriDate.getMinuteOfDayFromDate(this.veriDate.createDate(p.Utc));\r\n return plotTimeMinutes >= startTimeMinutes && plotTimeMinutes <= endTimeMinutes\r\n }),\r\n (plot) => {\r\n const odometerKm = plot.Odometer / 1000;\r\n return [\r\n this.veriTableService.createDateTimeCell(plot.Utc),\r\n this.veriTableService.createConvertedValueCell(plot.Velocity, UnitConversionType.Speed),\r\n { contents: this.plotService.convertDirectionToWords(plot.Direction) },\r\n { contents: ReasonCode[plot.Reason] },\r\n this.veriTableService.createConvertedValueCell(odometerKm, UnitConversionType.Distance),\r\n this.veriTableService.createLocationInformationCell(plot.Id, \"row.data\", plot)\r\n ];\r\n },\r\n (plot) => {\r\n return `${this.veriDate.formatDate(plot.Utc)}${this.plotService.convertDirectionToWords(plot.Direction)}${ReasonCode[plot.Reason]}${plot?.LocationInformation?.LocationDescription}`;\r\n });\r\n }\r\n}\r\n\r\nexport class PlotsExportComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n\r\n constructor() {\r\n this.bindings = {\r\n plots: \"<\",\r\n additionalData: \" \";","import { ResourceType } from \"@enums/ResourceType\";\r\nimport { SortType } from \"@enums/SortType\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport * as angular from \"angular\";\r\nimport { IVeriTableHeader, IVeriTableRow, IVeriTableRowCell } from \"../veriTable/veriTable.component\";\r\nimport { ExternalReferenceService } from \"./externalReference.service\";\r\nimport { IExternalReference, IExternalReferenceType } from \"./externalReferences.interfaces\";\r\nimport \"./externalReferences.scss\";\r\n\r\nexport class ExternalReferenceComponentController implements angular.IComponentController {\r\n loading: boolean = false;\r\n tableHeaders: IVeriTableHeader[] = [];\r\n tableRows: IVeriTableRow[] = [];\r\n selectedRecord: IExternalReference;\r\n\r\n driverId: number;\r\n geofenceId: number;\r\n vehicleId: number;\r\n\r\n disableAdd: boolean;\r\n\r\n reloadParent: () => void;\r\n\r\n static $inject = [\"$mdDialog\", \"externalReferenceService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly $mdDialog: angular.material.IDialogService,\r\n private readonly externalReferenceService: ExternalReferenceService,\r\n private readonly translationService: TranslationService ) {\r\n }\r\n\r\n $onInit() {\r\n this.loadData(true);\r\n this.createHeaders();\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject): void {\r\n this.loadData(true);\r\n\r\n if (this.getId() < 0) {\r\n this.disableAdd = true;\r\n }\r\n }\r\n\r\n getId(): number {\r\n return this.driverId || this.vehicleId || this.geofenceId;\r\n }\r\n\r\n getType(): ResourceType {\r\n if (this.driverId) {\r\n return ResourceType.Driver;\r\n }\r\n else if (this.vehicleId) {\r\n return ResourceType.Vehicle;\r\n }\r\n else {\r\n return ResourceType.Geofence;\r\n }\r\n }\r\n\r\n onRowClicked($event: MouseEvent, row: IVeriTableRow) {\r\n var externalReference: IExternalReference = {\r\n DriverId: row.data.DriverId,\r\n VehicleId: row.data.VehicleId,\r\n GeofenceId: row.data.GeofenceId,\r\n Id: row.data.Id,\r\n ExternalReference: row.data.ExternalReference,\r\n ExternalReferenceTypeId: row.data.ExternalReferenceTypeId\r\n };\r\n\r\n this.openExternalReferenceRecordTaskDialog($event, externalReference);\r\n }\r\n\r\n openExternalReferenceRecordTaskDialog($event: MouseEvent, externalReference: IExternalReference) {\r\n\r\n const controller = ($mdDialog) => {\r\n return {\r\n hide: (record: IExternalReference) => { $mdDialog.hide(record); },\r\n externalReference: externalReference\r\n }\r\n };\r\n\r\n controller.$inject = [\"$mdDialog\"];\r\n\r\n const dialogOptions: angular.material.IDialogOptions = {\r\n targetEvent: $event,\r\n escapeToClose: true,\r\n clickOutsideToClose: true,\r\n template: require(\"./externalReferenceDialog/externalReferenceRecord.dialog.html\"), // Use scope\r\n controller: controller,\r\n controllerAs: \"$ctrl\"\r\n };\r\n\r\n return this.$mdDialog\r\n .show(dialogOptions)\r\n .then(() => {\r\n this.loadData(true,true)\r\n .then(() => {\r\n this.reloadParent();\r\n });\r\n });\r\n }\r\n\r\n loadData(loading = true, invalidateCache = false): angular.IPromise {\r\n this.loading = loading;\r\n\r\n return this.externalReferenceService.getExternalTypes(invalidateCache)\r\n .then(externalTypes => {\r\n this.externalReferenceService.getExtReferenceData(externalTypes, this.getId(), this.getType(), invalidateCache)\r\n .then((externalReferences) => {\r\n if (invalidateCache) {\r\n this.externalReferenceService.updateCachedValues(externalReferences, externalTypes);\r\n }\r\n\r\n this.tableRows = [];\r\n\r\n externalReferences.forEach(externalReference => {\r\n\r\n externalReference.externalReferenceType = externalTypes.firstOrDefault( type =>type.Id == externalReference.ExternalReferenceTypeId);\r\n\r\n var tableRow: IVeriTableRow = {\r\n data: externalReference,\r\n cells: this.createTableCells(externalReference)\r\n };\r\n\r\n this.tableRows.push(tableRow);\r\n });\r\n\r\n this.loading = false;\r\n })\r\n .catch((err) => {\r\n console.log(\"Error retrieving external reference data: \", err);\r\n throw (err);\r\n });\r\n });\r\n }\r\n\r\n addExternalReference($event: MouseEvent) {\r\n this.selectedRecord = {\r\n GeofenceId: this.geofenceId,\r\n DriverId: this.driverId,\r\n VehicleId: this.vehicleId,\r\n Id: 0,\r\n ExternalReference: \"\",\r\n ExternalReferenceTypeId: 0\r\n };\r\n\r\n this.openExternalReferenceRecordTaskDialog($event, this.selectedRecord);\r\n }\r\n\r\n // ----------------------------------\r\n\r\n private createHeaders() {\r\n this.tableHeaders = [\r\n {\r\n title: this.translationService.t(\"externalReference.externalId\"),\r\n sortable: true,\r\n sortType: SortType.String\r\n },\r\n {\r\n title: this.translationService.t(\"externalReference.type\"),\r\n sortable: true,\r\n sortType: SortType.String\r\n }];\r\n }\r\n\r\n private createTableCells(result: IExternalReference): IVeriTableRowCell[] {\r\n const cells: IVeriTableRowCell[] = [\r\n { contents: result.ExternalReference, sortData: result.ExternalReference, sanitize: true },\r\n { contents: result.externalReferenceType.Type, sortData: result.externalReferenceType.Type, sanitize: true }\r\n ];\r\n\r\n return cells;\r\n }\r\n}\r\n\r\nexport class ExternalReferenceComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: any;\r\n\r\n constructor() {\r\n this.bindings = {\r\n driverId: \"

{{'externalReferenceRecord.externalIdEntry' | translate}}

clear
\";","module.exports = \" {{'externalReference.disabledMessage' | translate}} {{'externalReference.addExternalId' | translate}} \";","import * as angular from \"angular\";\r\nimport { ResourceType } from \"@enums/ResourceType\";\r\nimport { IResponse } from \"@interfaces/IResponse\";\r\nimport { IExternalReference, IExternalReferenceType } from \"./externalReferences.interfaces\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { CacheService } from \"@services/cache.Service\";\r\n\r\nexport class ExternalReferenceService {\r\n\r\n static $inject = [\"$q\", \"$http\", \"translationService\", \"cacheService\"];\r\n\r\n updatedExternalRef: IExternalReference = null;\r\n addedExternalRef: IExternalReference = null;\r\n deleteExternalRef: IExternalReference = null;\r\n\r\n private externalReferenceTypesCacheName = \"externalReferenceTypesCacheName\"\r\n\r\n private driverExternalReferenceCacheName = \"driverExternalReverenceCache\";\r\n private vehicleExternalReferenceCacheName = \"vehicleExternalReverenceCache\";\r\n private geofenceExternalReferenceCacheName = \"geofenceExternalReverenceCache\";\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $http: angular.IHttpService,\r\n private readonly translationService: TranslationService,\r\n private readonly cacheService: CacheService\r\n ) {\r\n\r\n this.cacheService.createCache(this.externalReferenceTypesCacheName, { maxAge: 30 * 60 * 1000 });\r\n\r\n this.cacheService.createCache(this.driverExternalReferenceCacheName, { maxAge: 30 * 60 * 1000 });\r\n this.cacheService.createCache(this.vehicleExternalReferenceCacheName, { maxAge: 30 * 60 * 1000 });\r\n this.cacheService.createCache(this.geofenceExternalReferenceCacheName, { maxAge: 30 * 60 * 1000 });\r\n }\r\n\r\n getExternalTypes(invalidateCache = false): angular.IPromise {\r\n const cacheName = this.externalReferenceTypesCacheName;\r\n\r\n return this.cacheService.getOrRetrieveData(cacheName, () => this.getExternalTypesFromDB(), invalidateCache);\r\n }\r\n\r\n getExternalTypesFromDB(): angular.IPromise {\r\n return this.$http({\r\n url: \"/api/externalreference/types/\",\r\n method: \"GET\"\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => response.data);\r\n }\r\n\r\n getExternalTypesByType(type: string, invalidateCache = false): angular.IPromise {\r\n\r\n if (!type || type.trim().length === 0) {\r\n return this.$q.when([]);\r\n }\r\n\r\n return this.$http({\r\n url: `/api/externalreference/types/${type}/`,\r\n method: \"GET\",\r\n params: { minsToLive: 30, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n private setUpdatedExtReferenceType(externalTypes: IExternalReferenceType[]) {\r\n const extTypes = externalTypes.filter(x => x.Id === +this.updatedExternalRef.ExternalReferenceTypeId);\r\n if (extTypes && extTypes.length > 0) {\r\n this.updatedExternalRef.externalReferenceType = angular.copy(extTypes[0]);\r\n }\r\n }\r\n\r\n private getExtRefIndex(id: number, externalReferenceList: IExternalReference[]): number {\r\n for (let i = 0; i < externalReferenceList.length; i++) {\r\n if (externalReferenceList[i].Id === id) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n updateCachedValues(externalReferenceList: IExternalReference[], externalTypes: IExternalReferenceType[]): void {\r\n if (this.updatedExternalRef) {\r\n const index = this.getExtRefIndex(this.updatedExternalRef.Id, externalReferenceList);\r\n if (index >= 0) {\r\n if (!this.updatedExternalRef.externalReferenceType) {\r\n this.setUpdatedExtReferenceType(externalTypes);\r\n }\r\n externalReferenceList.splice(index, 1, angular.copy(this.updatedExternalRef));\r\n }\r\n this.updatedExternalRef = null;\r\n }\r\n\r\n if (this.addedExternalRef) {\r\n const index = this.getExtRefIndex(this.addedExternalRef.Id, externalReferenceList);\r\n if (index < 0) {\r\n externalReferenceList.push(angular.copy(this.addedExternalRef));\r\n this.addedExternalRef = null;\r\n }\r\n }\r\n\r\n if (this.deleteExternalRef) {\r\n const index = this.getExtRefIndex(this.deleteExternalRef.Id, externalReferenceList);\r\n if (index >= 0) {\r\n externalReferenceList.splice(index, 1);\r\n }\r\n this.deleteExternalRef = null;\r\n }\r\n }\r\n\r\n getReferencesById(cacheName: string, id: number, matchingPredicate: (item) => boolean, retrievalCallback: () => angular.IPromise ): angular.IPromise {\r\n const externalReferences = this.cacheService.get(cacheName)?.filter(matchingPredicate);\r\n\r\n return externalReferences?.length ? this.$q.when(externalReferences) : retrievalCallback();\r\n }\r\n\r\n getAllDriverExternalReferences(invalidateCache = false): angular.IPromise {\r\n const cacheName = this.driverExternalReferenceCacheName;\r\n\r\n return this.cacheService.getOrRetrieveData(cacheName, () => this.getAllDriverExternalReferencesFromDB(), invalidateCache);\r\n }\r\n\r\n getAllDriverExternalReferencesFromDB(): angular.IPromise {\r\n return this.$http({\r\n url: \"/api/externalreference/driver/all/\",\r\n method: \"GET\"\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => response.data);\r\n }\r\n\r\n getDriverExternalReferences(driverId: number): angular.IPromise {\r\n\r\n const cacheName = this.driverExternalReferenceCacheName;\r\n const matchingPredicate = (externalReference) => externalReference.DriverId == driverId;\r\n const retrievalCallback = () => this.getDriverExternalReferencesFromDB(driverId);\r\n\r\n return this.getReferencesById(cacheName, driverId, matchingPredicate, retrievalCallback);\r\n }\r\n\r\n getDriverExternalReferencesFromDB(driverId: number): angular.IPromise {\r\n return this.$http({\r\n url: `/api/externalreference/driver/${driverId}/`,\r\n method: \"GET\"\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n\r\n response.data?.forEach(externalReference => {\r\n this.cacheService.addOrUpdateItem(this.driverExternalReferenceCacheName, externalReference, (i1, i2) => i1.Id == i2.Id);\r\n })\r\n\r\n return response.data;\r\n });\r\n }\r\n\r\n getAllGeofenceExternalReferences(invalidateCache = false): angular.IPromise {\r\n const cacheName = this.geofenceExternalReferenceCacheName;\r\n\r\n return this.cacheService.getOrRetrieveData(cacheName, () => this.getAllGeofenceExternalReferencesFromDB(), invalidateCache);\r\n }\r\n\r\n getAllGeofenceExternalReferencesFromDB(): angular.IPromise {\r\n return this.$http({\r\n url: \"/api/externalreference/geofence/all/\",\r\n method: \"GET\"\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => response.data);\r\n }\r\n\r\n getGeofenceExternalReferences(geofenceId: number): angular.IPromise {\r\n const cacheName = this.geofenceExternalReferenceCacheName;\r\n const matchingPredicate = (externalReference) => externalReference.GeofenceId == geofenceId;\r\n const retrievalCallback = () => this.getGeofenceExternalReferencesFromDB(geofenceId);\r\n\r\n return this.getReferencesById(cacheName, geofenceId, matchingPredicate, retrievalCallback);\r\n }\r\n\r\n\r\n getGeofenceExternalReferencesFromDB(geofenceId: number): angular.IPromise {\r\n return this.$http({\r\n url: `/api/externalreference/geofence/${geofenceId}/`,\r\n method: \"GET\"\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n\r\n response.data?.forEach(externalReference => {\r\n this.cacheService.addOrUpdateItem(this.geofenceExternalReferenceCacheName, externalReference, (i1, i2) => i1.Id == i2.Id);\r\n })\r\n\r\n return response.data;\r\n });\r\n }\r\n\r\n getAllVehicleExternalReferences(invalidateCache = false): angular.IPromise {\r\n const cacheName = this.vehicleExternalReferenceCacheName;\r\n\r\n return this.cacheService.getOrRetrieveData(cacheName, () => this.getAllVehicleExternalReferencesFromDB(), invalidateCache);\r\n }\r\n\r\n getAllVehicleExternalReferencesFromDB(): angular.IPromise {\r\n return this.$http({\r\n url: \"/api/externalreference/vehicle/all/\",\r\n method: \"GET\"\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => response.data);\r\n }\r\n\r\n getVehicleExternalReferences(vehicleId: number, invalidateCache = false): angular.IPromise {\r\n const cacheName = this.vehicleExternalReferenceCacheName;\r\n const matchingPredicate = (externalReference) => externalReference.VehicleId == vehicleId;\r\n const retrievalCallback = () => this.getVehicleExternalReferencesFromDB(vehicleId);\r\n\r\n return this.getReferencesById(cacheName, vehicleId, matchingPredicate, retrievalCallback);\r\n }\r\n\r\n getVehicleExternalReferencesFromDB(vehicleId: number): angular.IPromise {\r\n return this.$http({\r\n url: `/api/externalreference/vehicle/${vehicleId}/`,\r\n method: \"GET\"\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n\r\n response.data?.forEach(externalReference => {\r\n this.cacheService.addOrUpdateItem(this.vehicleExternalReferenceCacheName, externalReference, (i1, i2) => i1.Id == i2.Id);\r\n })\r\n\r\n return response.data\r\n });\r\n }\r\n\r\n deleteDriverExternalReference(referenceId: number, invalidateCache = false) {\r\n return this.$http({\r\n url: `/api/externalreference/driver/${referenceId}/`,\r\n method: \"DELETE\",\r\n params: { minsToLive: 30, invalidateCache: invalidateCache }\r\n }).then(result => {\r\n\r\n this.cacheService.deleteItem>(this.driverExternalReferenceCacheName, { Id: referenceId }, (i1, i2) => i1.Id == i2.Id);\r\n\r\n return this.getAllDriverExternalReferences().then(() => { return result });\r\n });\r\n }\r\n\r\n deleteGeofenceExternalReference(referenceId: number, invalidateCache = false) {\r\n return this.$http({\r\n url: `/api/externalreference/geofence/${referenceId}/`,\r\n method: \"DELETE\",\r\n params: { minsToLive: 30, invalidateCache: invalidateCache }\r\n }).then(result => {\r\n\r\n this.cacheService.deleteItem>(this.geofenceExternalReferenceCacheName, { Id: referenceId }, (i1, i2) => i1.Id == i2.Id);\r\n\r\n return this.getAllGeofenceExternalReferences().then(() => { return result });\r\n });\r\n }\r\n\r\n deleteVehicleExternalReference(referenceId: number, invalidateCache = false) {\r\n return this.$http({\r\n url: `/api/externalreference/vehicle/${referenceId}/`,\r\n method: \"DELETE\",\r\n params: { minsToLive: 30, invalidateCache: invalidateCache }\r\n }).then(result => {\r\n\r\n this.cacheService.deleteItem>(this.vehicleExternalReferenceCacheName, { Id: referenceId }, (i1, i2) => i1.Id == i2.Id);\r\n\r\n return this.getAllVehicleExternalReferences().then(() => { return result });\r\n });\r\n }\r\n\r\n updateDriverExternalReference(externalReference: IExternalReference, invalidateCache = false): angular.IPromise {\r\n return this.$http({\r\n url: \"/api/externalreference/drivers/\",\r\n method: \"POST\",\r\n data: externalReference,\r\n params: { minsToLive: 30, invalidateCache: invalidateCache }\r\n }).then((result: angular.IHttpPromiseCallbackArg) => {\r\n (externalReference.Id <= 0) && (externalReference.Id = result.data);\r\n this.cacheService.addOrUpdateItem(this.driverExternalReferenceCacheName, externalReference, (i1, i2) => i1.Id == i2.Id);\r\n\r\n return this.getAllDriverExternalReferences().then(() => result);\r\n });\r\n }\r\n\r\n updateGeofenceExternalReference(externalReference: IExternalReference, invalidateCache = false): angular.IPromise {\r\n return this.$http({\r\n url: \"/api/externalreference/geofences/\",\r\n method: \"POST\",\r\n data: externalReference,\r\n params: { minsToLive: 30, invalidateCache: invalidateCache }\r\n }).then((result: angular.IHttpPromiseCallbackArg) => {\r\n (externalReference.Id <= 0) && (externalReference.Id = result.data);\r\n this.cacheService.addOrUpdateItem(this.geofenceExternalReferenceCacheName, externalReference, (i1, i2) => i1.Id == i2.Id);\r\n\r\n return this.getAllGeofenceExternalReferences().then(() => result);\r\n });\r\n }\r\n\r\n updateVehicleExternalReference(externalReference: IExternalReference, invalidateCache = false): angular.IPromise {\r\n return this.$http({\r\n url: \"/api/externalreference/vehicles/\",\r\n method: \"POST\",\r\n data: externalReference,\r\n params: { minsToLive: 30, invalidateCache: invalidateCache }\r\n }).then((result: angular.IHttpPromiseCallbackArg) => {\r\n (externalReference.Id <= 0) && (externalReference.Id = result.data);\r\n this.cacheService.addOrUpdateItem(this.vehicleExternalReferenceCacheName, externalReference, (i1, i2) => i1.Id == i2.Id);\r\n\r\n return this.getAllVehicleExternalReferences().then(() => result);\r\n });\r\n }\r\n\r\n getResourceType(externalReference: IExternalReference): ResourceType {\r\n if (externalReference.DriverId) return ResourceType.Driver;\r\n if (externalReference.GeofenceId) return ResourceType.Geofence;\r\n if (externalReference.VehicleId) return ResourceType.Vehicle;\r\n\r\n return null;\r\n }\r\n\r\n validateExternalReference(externalReference: IExternalReference): angular.IPromise {\r\n\r\n return this.getByExternalReference(externalReference.ExternalReference, this.getResourceType(externalReference), true)\r\n .then(externalReferences => {\r\n const response: IResponse = {\r\n Success: true,\r\n Message: \"\"\r\n };\r\n\r\n if (!externalReferences) {\r\n response.Success = false;\r\n response.Message = this.translationService.t(\"externalReference.checkDuplicateReferenceError\");\r\n return response;\r\n }\r\n\r\n const results = externalReferences\r\n .filter(ref => externalReference.Id === 0 || externalReference.Id !== ref.Id)\r\n .firstOrDefault();\r\n\r\n if (results) {\r\n response.Success = false;\r\n response.Message = this.translationService.t(\"externalReference.duplicateReference\");\r\n }\r\n return response;\r\n });\r\n\r\n }\r\n\r\n\r\n getByExternalReference(externalReference: string, resourceType: ResourceType, invalidateCache = false): angular.IPromise {\r\n let url: string = \"\";\r\n\r\n if (!externalReference || externalReference.trim().length === 0) {\r\n return this.$q.when([]);\r\n }\r\n\r\n switch (resourceType) {\r\n case ResourceType.Driver:\r\n url = `/api/externalreference/driver/ref/${externalReference}/`;\r\n break;\r\n\r\n case ResourceType.Geofence:\r\n url = `/api/externalreference/geofence/ref/${externalReference}/`;\r\n break;\r\n\r\n case ResourceType.Vehicle:\r\n url = `/api/externalreference/vehicle/ref/${externalReference}/`;\r\n break;\r\n }\r\n\r\n return (this.$http({\r\n url: url,\r\n method: \"GET\",\r\n params: { minsToLive: 30, invalidateCache: invalidateCache, failureMessage: 'Failed to get external references' }\r\n }).then(results => {\r\n return results.data;\r\n })\r\n .catch(e => {\r\n return null;\r\n })\r\n ) as angular.IPromise;\r\n }\r\n\r\n getAllReferenceData(resourceType: ResourceType, invalidateCache = false): angular.IPromise {\r\n switch (resourceType) {\r\n case ResourceType.Driver:\r\n\r\n return this.getAllDriverExternalReferences(invalidateCache);\r\n\r\n case ResourceType.Geofence:\r\n\r\n return this.getAllGeofenceExternalReferences(invalidateCache);\r\n\r\n case ResourceType.Vehicle:\r\n\r\n return this.getAllVehicleExternalReferences(invalidateCache);\r\n\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n getExtReferenceData(externalTypes: IExternalReferenceType[], id: number, resourceType: ResourceType, invalidateCache = false): angular.IPromise {\r\n\r\n let promise: angular.IPromise;\r\n\r\n switch (resourceType) {\r\n case ResourceType.Driver:\r\n promise = this.getDriverExternalReferences(id);\r\n break;\r\n\r\n case ResourceType.Geofence:\r\n promise = this.getGeofenceExternalReferences(id);\r\n break;\r\n\r\n case ResourceType.Vehicle:\r\n promise = this.getVehicleExternalReferences(id);\r\n break;\r\n\r\n default:\r\n return null;\r\n }\r\n\r\n return promise.then(externalReferences => {\r\n\r\n externalReferences.forEach(er => {\r\n er.externalReferenceType = externalTypes.filter(type => type.Id === er.ExternalReferenceTypeId).firstOrDefault();\r\n });\r\n\r\n return externalReferences;\r\n });\r\n }\r\n\r\n deleteReference(externalReference: IExternalReference): angular.IPromise> {\r\n this.initExternalRefChangeFields();\r\n\r\n switch (this.getResourceType(externalReference)) {\r\n case ResourceType.Driver:\r\n this.deleteExternalRef = externalReference;\r\n return this.deleteDriverExternalReference(externalReference.Id, true);\r\n\r\n case ResourceType.Geofence:\r\n return this.deleteGeofenceExternalReference(externalReference.Id, true);\r\n\r\n case ResourceType.Vehicle:\r\n return this.deleteVehicleExternalReference(externalReference.Id, true);\r\n\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n updateReference(externalReference: IExternalReference): angular.IPromise {\r\n\r\n this.initExternalRefChangeFields();\r\n\r\n return this.validateExternalReference(externalReference).then(result => {\r\n\r\n if (result.Success) {\r\n\r\n switch (this.getResourceType(externalReference)) {\r\n case ResourceType.Driver:\r\n result.Data = this.updateDriverExternalReference(externalReference).then((response) => {\r\n result.Data = response;\r\n this.setExternalRefChangeFields(externalReference, response.data);\r\n });\r\n break;\r\n\r\n case ResourceType.Geofence:\r\n result.Data = this.updateGeofenceExternalReference(externalReference);\r\n break;\r\n\r\n case ResourceType.Vehicle:\r\n result.Data = this.updateVehicleExternalReference(externalReference).then((response) => {\r\n result.Data = response;\r\n this.setExternalRefChangeFields(externalReference, response.data);\r\n });\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n });\r\n }\r\n\r\n updateExternalReferenceType(externalReferenceType: IExternalReferenceType): angular.IPromise {\r\n\r\n if (!externalReferenceType) {\r\n return this.$q.when(null);\r\n }\r\n\r\n return this.getExternalTypesByType(externalReferenceType.Type, true).then(types => {\r\n var existingType = types.firstOrDefault();\r\n if (existingType) {\r\n return existingType.Id;\r\n }\r\n\r\n return this.addExternalReferenceType(externalReferenceType);\r\n });\r\n }\r\n\r\n addExternalReferenceType(externalReferenceType: IExternalReferenceType): angular.IPromise {\r\n\r\n return this\r\n .$http({\r\n url: \"/api/externalreference/types\",\r\n method: \"POST\",\r\n data: externalReferenceType\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n this.cacheService.addOrUpdateItem(this.externalReferenceTypesCacheName, { ...externalReferenceType, Id: response.data }, (i1, i2) => i1.Id == i2.Id);\r\n return response.data;\r\n });\r\n }\r\n\r\n setExternalRefChangeFields(externalReference, refId: number) {\r\n const addMode = externalReference.Id ? false : true;\r\n switch (addMode) {\r\n case true:\r\n this.addedExternalRef = externalReference;\r\n this.addedExternalRef.Id = refId;\r\n break;\r\n default:\r\n this.updatedExternalRef = externalReference;\r\n break;\r\n }\r\n }\r\n\r\n initExternalRefChangeFields() {\r\n this.updatedExternalRef = null;\r\n this.addedExternalRef = null;\r\n this.deleteExternalRef = null;\r\n }\r\n}\r\n\r\n","import * as angular from \"angular\";\r\nimport \"./externalReferenceRecord.dialog.scss\";\r\nimport { IExternalReference, IExternalReferenceType } from \"../externalReferences.interfaces\";\r\nimport { ExternalReferenceService } from \"../externalReference.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\n\r\nclass ExternalReferenceRecordComponentController implements angular.IComponentController {\r\n\r\n loading: boolean = true;\r\n saving = false;\r\n errorMessage: string;\r\n externalReference: IExternalReference;\r\n externalReferenceTypes: IExternalReferenceType[] = [];\r\n externalReferenceType: IExternalReferenceType;\r\n showExternalReferenceType = false;\r\n\r\n static $inject = [\"$mdDialog\", \"externalReferenceService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly $mdDialog: angular.material.IDialogService,\r\n private readonly externalReferenceService: ExternalReferenceService,\r\n private readonly translationService: TranslationService ) {\r\n }\r\n\r\n $onInit() {\r\n this.externalReferenceService.initExternalRefChangeFields();\r\n this.externalReferenceService.getExternalTypes().then(results => {\r\n this.externalReferenceTypes = results;\r\n\r\n if (!this.externalReferenceTypes.any()) {\r\n this.showExternalReferenceType = true;\r\n }\r\n\r\n if (this.externalReference.Id === 0 && this.externalReferenceTypes.any()) {\r\n this.externalReference.ExternalReferenceTypeId = this.externalReferenceTypes.firstOrDefault().Id;\r\n }\r\n\r\n this.loading = false;\r\n });\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject): void {\r\n this.clearErrorMessage();\r\n\r\n if (this.hasSpecialCharacters(this.externalReference.ExternalReference)) {\r\n return;\r\n }\r\n\r\n this.externalReferenceService.validateExternalReference(this.externalReference).then(response => {\r\n if (!response?.Success) {\r\n this.errorMessage = response?.Message;\r\n }\r\n });\r\n }\r\n\r\n deleteRecord() {\r\n this.saving = true;\r\n this.externalReferenceService.deleteReference(this.externalReference).finally(() => {\r\n this.$mdDialog.hide();\r\n this.saving = false;\r\n });\r\n }\r\n\r\n cancel() {\r\n this.externalReference = null;\r\n this.$mdDialog.hide();\r\n }\r\n\r\n saveRecord($event: MouseEvent) {\r\n this.saving = true;\r\n this.externalReferenceService\r\n .updateExternalReferenceType(this.externalReferenceType).then(typeId => {\r\n\r\n if (typeId) {\r\n this.externalReference.ExternalReferenceTypeId = typeId;\r\n }\r\n\r\n if (!this.externalReference.externalReferenceType) {\r\n const extRefType = this.externalReferenceTypes.firstOrDefault(x => x.Id == this.externalReference.ExternalReferenceTypeId);\r\n this.externalReference.externalReferenceType = extRefType ? angular.copy(extRefType) : null;\r\n }\r\n\r\n this.externalReferenceService.updateReference(this.externalReference)\r\n .then((response) => {\r\n this.saving = false;\r\n if (response.Success) {\r\n this.$mdDialog.hide();\r\n } else {\r\n this.errorMessage = response.Message;\r\n }\r\n });\r\n });\r\n }\r\n\r\n cancelAddNewReferenceType() {\r\n this.showExternalReferenceType = false;\r\n this.externalReferenceType = null;\r\n }\r\n\r\n showNewReferenceTypeDialog(ev: MouseEvent) {\r\n this.externalReferenceType = { Type: \"\" };\r\n this.showExternalReferenceType = true;\r\n }\r\n\r\n private hasSpecialCharacters(input: string): boolean {\r\n const specialCharacters: string[] = [\"/\", \".\", \":\", \"%\", \"*\"];\r\n const foundedSC: string[] = specialCharacters.filter(character => input?.indexOf(character) > -1);\r\n const hasSpecialCharacters: boolean = foundedSC?.length > 0;\r\n\r\n this.errorMessage = (hasSpecialCharacters) ? this.translationService.t(`externalReferenceRecord.notContainMessage`, foundedSC.join(' ')) : null;\r\n\r\n return hasSpecialCharacters;\r\n }\r\n\r\n private clearErrorMessage(): void {\r\n this.errorMessage = null;\r\n }\r\n}\r\n\r\nexport class ExternalReferenceRecordComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: any;\r\n\r\n constructor() {\r\n this.bindings = {\r\n externalReference: \"=\"\r\n };\r\n\r\n this.controller = ExternalReferenceRecordComponentController;\r\n this.template = require(\"./externalReferenceRecord.html\");\r\n }\r\n}\r\n","module.exports = \"

{{$ctrl.externalReference.Id ? (\\\"externalReferenceRecord.editExternalId\\\" | translate) : (\\\"externalReferenceRecord.createExternalId\\\" | translate)}}

{{\\\"externalReferenceRecord.details\\\" | translate}}
{{type.Type}} {{'externalReferenceRecord.addNewType' | translate}} {{'externalReferenceRecord.cancelAddNewType' | translate}}
{{$ctrl.errorMessage}}
{{$ctrl.externalReference.Id ? (\\\"externalReferenceRecord.saveExternalId\\\" | translate) : (\\\"externalReferenceRecord.createExternalId\\\" | translate)}}
\";","import { IGroup } from \"@interfaces/IVehicleGroup\";\r\nimport { DriverService } from \"@services/driver.service\";\r\nimport { GroupService } from \"@services/group.service.ajs\";\r\nimport { SessionService } from \"@services/session.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport * as angular from \"angular\";\r\nimport copy from \"fast-copy/dist/fast-copy.esm.js\";\r\nimport \"./groupHierarchy.component.scss\";\r\n\r\ninterface INestedGroup extends IGroup {\r\n open?: boolean;\r\n hide?: boolean;\r\n nestCount?: number;\r\n nestSpacers?: boolean[];\r\n}\r\n\r\ninterface IComponentBindings {\r\n selectedGroup: INestedGroup;\r\n groups: INestedGroup[];\r\n openAll: boolean;\r\n readOnly: boolean;\r\n showSearch: boolean;\r\n multiSelect: boolean;\r\n showUngroupedResources: boolean;\r\n onGroupClicked: (args: { group: INestedGroup }) => void;\r\n onGroupSelectionChanged: (args: { group: INestedGroup }) => void;\r\n}\r\n\r\nclass Controller implements angular.IComponentController, IComponentBindings {\r\n selectedGroup: INestedGroup;\r\n scrollToGroup: INestedGroup;\r\n scrollIndex: number;\r\n sourceGroups: INestedGroup[];\r\n groups: INestedGroup[];\r\n displayGroups: INestedGroup[];\r\n parentGroups: INestedGroup[];\r\n openAll: boolean;\r\n readOnly: boolean;\r\n showSearch: boolean;\r\n multiSelect: boolean;\r\n showUngroupedResources: boolean;\r\n showGeofenceCount: boolean;\r\n showVehiclesCount: boolean;\r\n showOnlyDepots: boolean = false;\r\n onGroupClicked: (args: { group: INestedGroup }) => void;\r\n onGroupSelectionChanged: (args: { group: INestedGroup }) => void;\r\n searchString = \"\";\r\n uniqueInstanceReference = Math.round(Math.random() * 1000);\r\n\r\n static $inject = [\"$q\", \"$timeout\", \"$element\", \"groupService\", \"sessionService\", \"driverService\", \"vehicleService\", \"translationService\"];\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $timeout: angular.ITimeoutService,\r\n private readonly $element: JQLite,\r\n private readonly groupService: GroupService,\r\n private readonly sessionService: SessionService,\r\n private readonly driverService: DriverService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly translationService: TranslationService) {\r\n }\r\n\r\n $onInit() {\r\n if (this.showGeofenceCount) {\r\n this.showGeofenceCount = true;\r\n }\r\n if (this.showVehiclesCount) {\r\n this.showVehiclesCount = true;\r\n }\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n //console.log(\"$onChanges\");\r\n if (this.openAll === undefined) {\r\n this.openAll = true;\r\n }\r\n\r\n if (onChangesObj[\"sourceGroups\"]) {\r\n if (this.sourceGroups) {\r\n this.groups = copy(this.sourceGroups);\r\n // if there is only one group and it has parent group it will not show up in the group hierarchy in the groups editor\r\n if (this.groups.length === 1 && this.groups[0].parent) {\r\n this.groups[0].parent = null;\r\n }\r\n }\r\n\r\n this.updateDisplayGroups();\r\n\r\n //this.resetGroupOpenStatus();\r\n if (this.showGeofenceCount) {\r\n this.showGeofenceCount = true;\r\n }\r\n\r\n // Create parent list\r\n this.parentGroups = [];\r\n if (this.groups) {\r\n this.groups.forEach(group => {\r\n // Note that if we are displaying a sub group, the parents may be attached but not visible in our current list\r\n // To fix this we try to find the parent in our list, if it doesnt exist we assume its a parent\r\n var hasParent = false;\r\n if (group.parent != null) {\r\n const foundGroup = this.groupService.findGroup(this.groups, group.ParentId);\r\n hasParent = foundGroup != null;\r\n }\r\n\r\n if (!hasParent) {\r\n this.parentGroups.push(group);\r\n }\r\n\r\n if (this.showOnlyDepots) {\r\n this.filterByDepots();\r\n }\r\n\r\n this.searchString = '';\r\n });\r\n }\r\n\r\n if (this.scrollToGroup) {\r\n this.updateScrollPosition();\r\n }\r\n }\r\n\r\n this.updateComponentHeight();\r\n }\r\n\r\n onSearch() {\r\n if (!this.groups) {\r\n return;\r\n }\r\n // Reset visibility & parent status\r\n this.groups.forEach(group => {\r\n this.showHideGroup(group, false);\r\n });\r\n var lcSearchString = this.searchString.toLocaleLowerCase();\r\n this.groups.forEach(group => {\r\n if (!this.doesGroupNameContainSearchParameter(group, lcSearchString)) {\r\n this.showHideGroup(group, true);\r\n }\r\n });\r\n //this.resetGroupOpenStatus();\r\n this.updateDisplayGroups();\r\n }\r\n\r\n filterByDepots() {\r\n this.updateDisplayGroups();\r\n }\r\n\r\n groupClicked(group: INestedGroup) {\r\n\r\n if (group == this.selectedGroup) {\r\n group = null;\r\n }\r\n\r\n this.selectedGroup = group;\r\n if (this.onGroupClicked) {\r\n this.onGroupClicked({ group: group });\r\n }\r\n }\r\n\r\n // ----------------\r\n\r\n private updateScrollPosition(largeDelay = false) {\r\n if (!this.groups || this.groups.length == 0) {\r\n return;\r\n }\r\n\r\n this.scrollIndex = this.displayGroups.findIndex(g => g.Id == this.scrollToGroup.Id);\r\n }\r\n\r\n private updateDisplayGroups() {\r\n this.displayGroups = [];\r\n if (!this.groups) {\r\n return;\r\n }\r\n\r\n this.displayGroups = this.flattenGroups(this.groups.filter(g => g.parent == null));\r\n if (this.showUngroupedResources) {\r\n // if this mode is on then make sure that isInGroup method is defined on a row\r\n // otherwise no-groups filtering not going to work\r\n this.displayGroups.unshift({\r\n Id: 0,\r\n AccountId: 37,\r\n Name: this.translationService.t(\"groupHierarchy.ungroupedResources\"),\r\n VehicleIds: [],\r\n DriverIds: [],\r\n GeofenceIds: [],\r\n UserIds: [],\r\n GroupDriverMappings: [],\r\n GroupGeofenceMappings: [],\r\n GroupVehicleMappings: [],\r\n });\r\n }\r\n\r\n if (this.showOnlyDepots) {\r\n this.displayGroups = this.displayGroups.filter(g => g.IsDepot);\r\n }\r\n\r\n this.filterUnusedResourcesAndGetTotals();\r\n }\r\n\r\n private filterUnusedResourcesAndGetTotals() {\r\n var vehiclesPromise = this.vehicleService.getVehicles({ includePeripheralMappings: true }).then(vehicles => {\r\n this.displayGroups.forEach(group => {\r\n this.groupService.removeVehiclesWithNoUnitFromGroup(group, vehicles)\r\n });\r\n });\r\n var driverPromise = this.driverService.getDrivers().then(drivers => {\r\n this.displayGroups.forEach(group => {\r\n this.groupService.removeInactiveDriversFromGroup(group, drivers)\r\n });\r\n });\r\n this.$q.all([vehiclesPromise, driverPromise]).then(() => {\r\n this.calculateGroupResourceTotals();\r\n })\r\n }\r\n\r\n private calculateGroupResourceTotals() {\r\n this.displayGroups.forEach(group => {\r\n group.totalVehicles = this.groupService.countResourceTotals(group, \"GroupVehicleMappings\");\r\n group.totalDrivers = this.groupService.countResourceTotals(group, \"GroupDriverMappings\");\r\n group.totalGeofences = this.groupService.countResourceTotals(group, \"GroupGeofenceMappings\");\r\n });\r\n }\r\n\r\n private flattenGroups(groups: INestedGroup[], parentGroup: INestedGroup = null, nesting = 0): INestedGroup[] {\r\n var flattenedGroups: INestedGroup[] = [];\r\n if (!groups) {\r\n return flattenedGroups;\r\n }\r\n groups.forEach((group, i) => {\r\n if (group.hide) {\r\n return;\r\n }\r\n flattenedGroups.push(group);\r\n group.nestCount = nesting;\r\n group.nestSpacers = [];\r\n var groupHasChildrenAndSibling = group.children && group.children.length && i < groups.length - 1;\r\n if (parentGroup) {\r\n group.nestSpacers = Array.from(parentGroup.nestSpacers);\r\n group.nestSpacers.push(groupHasChildrenAndSibling);\r\n }\r\n var childGroups = this.flattenGroups(group.children, group, nesting + 1);\r\n flattenedGroups = flattenedGroups.concat(childGroups);\r\n });\r\n return flattenedGroups;\r\n }\r\n\r\n private updateComponentHeight() {\r\n\r\n if (!this.readOnly) {\r\n return;\r\n }\r\n this.$timeout(() => {\r\n const sizer = this.$element.find(\".md-virtual-repeat-sizer\");\r\n this.$element.height(sizer[0].clientHeight + 30);\r\n // Force the list to redraw\r\n window.dispatchEvent(new Event('resize'));\r\n });\r\n }\r\n\r\n private showHideGroup(group: INestedGroup, hide: boolean = true) {\r\n group.hide = hide;\r\n }\r\n\r\n //private resetGroupOpenStatus() {\r\n // if (this.openAll && this.groups) {\r\n // this.groups.forEach(g => {\r\n // this.setOpenStatus(g, true);\r\n // });\r\n // }\r\n //}\r\n //private setOpenStatus(group: IGroup, openStatus: boolean) {\r\n // if (!group) {\r\n // return;\r\n // }\r\n // group.open = openStatus;\r\n // if (!group.children) {\r\n // return;\r\n // }\r\n // group.children.forEach(g => {\r\n // this.setOpenStatus(g, openStatus);\r\n // });\r\n //}\r\n\r\n private doesGroupNameContainSearchParameter(group: INestedGroup, searchString: string, shallowCheck = false): boolean {\r\n //group.open = !!group.children;\r\n group.open = true;\r\n if (group.Name.toLocaleLowerCase().indexOf(searchString) >= 0) {\r\n return true;\r\n }\r\n if (!shallowCheck) {\r\n // Now search children\r\n if (group.children) {\r\n for (var i = 0; i < group.children.length; i++) {\r\n const childGroup = group.children[i];\r\n if (this.doesGroupNameContainSearchParameter(childGroup, searchString)) {\r\n return true;\r\n }\r\n }\r\n }\r\n // Also search parents\r\n if (group.parent && this.doesGroupNameContainSearchParameter(group.parent, searchString, true)) {\r\n return true;\r\n }\r\n }\r\n group.open = false;\r\n return false;\r\n }\r\n}\r\n\r\nexport class GroupHierarchyComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n template: string;\r\n controller: any;\r\n\r\n constructor() {\r\n this.bindings = {\r\n sourceGroups: \"
{{'groupHierarchy.showDepots' | translate}}
label_important_outline
{{group.Name}}
{{'groupHierarchy.ungroupedResourcesDescription' | translate}}
folder keyboard_arrow_right {{group.selected ? 'check' : 'clear' }}
{{group.Name}}
directions_car {{group.totalVehicles| formatNumber}} person {{group.totalDrivers | formatNumber}} filter_tilt_shift {{group.totalGeofences | formatNumber}}
\";","import * as angular from \"angular\";\r\nimport { isNumber } from \"util\";\r\nimport { IGroup } from \"@interfaces/IVehicleGroup\";\r\nimport { GroupService } from \"@services/group.service.ajs\";\r\nimport \"./groupSelector.scss\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\n\r\nexport enum AttachmentPosition {\r\n TopLeft,\r\n TopRight,\r\n BottomLeft,\r\n BottomRight\r\n}\r\n\r\ninterface IComponentBindings {\r\n selectedGroup: IGroup;\r\n resourceCount: number;\r\n attachmentPosition: string;\r\n\r\n onGroupClicked: (args: { group: IGroup }) => void;\r\n}\r\n\r\nclass Controller implements angular.IComponentController, IComponentBindings {\r\n\r\n selectedGroup: IGroup;\r\n resourceCount: number;\r\n attachmentPosition: string;\r\n\r\n onGroupClicked: (args: { group: IGroup }) => void;\r\n\r\n loadingGroups: boolean;\r\n showGroupFilterDialog: boolean;\r\n\r\n noSelectionLabel: string;\r\n\r\n // ---\r\n\r\n private groups: IGroup[];\r\n\r\n static $inject = [\"groupService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly groupService: GroupService,\r\n private readonly translationService: TranslationService ) {\r\n }\r\n\r\n $onInit() {\r\n\r\n this.noSelectionLabel = this.translationService.t(\"groupSelector.all\");\r\n if (this.attachmentPosition === undefined) {\r\n this.attachmentPosition = AttachmentPosition[AttachmentPosition.TopRight];\r\n }\r\n else if (!isNumber(this.attachmentPosition)) {\r\n if (AttachmentPosition[this.attachmentPosition] === undefined) {\r\n console.error(this.attachmentPosition, \" isnt valid position\", AttachmentPosition[this.attachmentPosition]);\r\n }\r\n }\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n //console.log(\"selectedGroup\", this.selectedGroup);\r\n }\r\n\r\n groupClicked(group: IGroup) {\r\n\r\n this.selectedGroup = group;\r\n this.showGroupFilterDialog = false;\r\n\r\n if (this.onGroupClicked) {\r\n this.onGroupClicked({ group: group });\r\n }\r\n }\r\n\r\n toggleGroupFilterDropDown() {\r\n\r\n this.showGroupFilterDialog = !this.showGroupFilterDialog;\r\n\r\n // we need groups updated to see the current group hierarchy\r\n if (this.showGroupFilterDialog) {\r\n\r\n this.loadingGroups = true;\r\n this.groupService.getGroupsWithFullMappings().then(groups => {\r\n this.groups = groups;\r\n this.loadingGroups = false;\r\n });\r\n }\r\n }\r\n\r\n // ----------------\r\n\r\n}\r\n\r\nexport class GroupSelectorComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n template: string;\r\n controller: any;\r\n\r\n constructor() {\r\n this.bindings = {\r\n selectedGroup: \"<\",\r\n resourceCount: \"<\",\r\n attachmentPosition: \"@\",\r\n noSelectionLabel: \"@\",\r\n\r\n onGroupClicked: \"&\",\r\n };\r\n\r\n this.controller = Controller;\r\n this.template = require(\"./groupSelector.html\");\r\n }\r\n}\r\n","module.exports = \"
{{ $ctrl.selectedGroup ? $ctrl.selectedGroup.Name : $ctrl.noSelectionLabel }} ({{$ctrl.resourceCount}})
{{'groupSelector.clearSelection' | translate}} \";","import { ITag } from \"@app/interfaces/ITag\";\r\nimport { ResourceAllocation, ResourceType } from \"@enums/ResourceType\";\r\nimport { TagsService } from \"@services/tags.service\";\r\nimport * as angular from \"angular\";\r\nimport \"./tags.scss\";\r\n\r\ninterface ITagsComponentBindings {\r\n resource: any;\r\n editMode: boolean;\r\n max: number;\r\n onTagDeleted: (args: { tag: ITag }) => void;\r\n}\r\n\r\nclass TagsComponentController implements angular.IComponentController, ITagsComponentBindings {\r\n allTags: ITag[] = [];\r\n assignedTags: ITag[] = [];\r\n hiddenTags: ITag[] = [];\r\n resource: any;\r\n showSelect: boolean = false;\r\n editMode: boolean = true;\r\n selectedTag: ITag;\r\n\r\n onChange: () => void;\r\n onTagDeleted: (args: { tag: ITag }) => void;\r\n\r\n resourceAllocationEnum = ResourceAllocation;\r\n\r\n resourceType: string;\r\n\r\n tooltipLabel: string;\r\n max: number;\r\n\r\n minLength = 0;\r\n\r\n static $inject = [\"$scope\", \"$timeout\", \"$mdDialog\", \"tagsService\"];\r\n\r\n constructor(\r\n private readonly $scope: angular.IScope,\r\n private readonly $timeout: angular.ITimeoutService,\r\n private readonly $mdDialog: angular.material.IDialogService,\r\n private readonly tagsService: TagsService) {\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject): void {\r\n if (onChangesObj[\"resource\"]) {\r\n this.getTags();\r\n }\r\n }\r\n\r\n $onDestroy() {\r\n this.updateTags();\r\n }\r\n\r\n onGeofenceTagDeleted(tag: ITag): void {\r\n if (this.onTagDeleted) {\r\n this.onTagDeleted({ tag });\r\n }\r\n }\r\n\r\n addItemToList(tag: ITag) {\r\n this.assignedTags.push(tag);\r\n this.updateTags();\r\n }\r\n\r\n openEditTagsDialog($event: MouseEvent) {\r\n const controller = ($mdDialog) => {\r\n return {\r\n hide: () => { $mdDialog.hide(); },\r\n onGeofenceTagDeleted: (tag: ITag) => { this.onGeofenceTagDeleted(tag) }\r\n }\r\n };\r\n controller.$inject = [\"$mdDialog\"];\r\n const dialogOptions: angular.material.IDialogOptions = {\r\n targetEvent: $event,\r\n escapeToClose: true,\r\n clickOutsideToClose: true,\r\n multiple: true,\r\n template: require(\"../../../main/components/resourceManagement/geofences/geofenceTagsEdit/geofenceTagsEdit.dialog.html\"), // Use scope\r\n controller: controller,\r\n controllerAs: \"$ctrl\"\r\n };\r\n\r\n this.$mdDialog.show(dialogOptions).then(() => {\r\n this.getTags();\r\n });\r\n }\r\n\r\n removeItemFromList(tag: ITag) {\r\n const index = this.assignedTags.indexOf(tag);\r\n\r\n if (index >= 0) {\r\n this.assignedTags.splice(index, 1);\r\n }\r\n if (this.onChange) {\r\n this.onChange();\r\n }\r\n this.updateTags();\r\n }\r\n\r\n //searchText: string;\r\n querySearch(searchText: string) {\r\n\r\n var unselectedTags = this.allTags.filter(tag => this.assignedTags.indexOf(tag) < 0);\r\n\r\n unselectedTags = unselectedTags.filter(tag => !tag.AutoTag);\r\n\r\n if (this.resourceType) {\r\n unselectedTags = unselectedTags.filter(tag => tag.ResourceAllocation == ResourceAllocation[this.resourceType] || tag.ResourceAllocation == ResourceAllocation.All);\r\n }\r\n\r\n if (!searchText) {\r\n return unselectedTags;\r\n }\r\n\r\n searchText = searchText.toLocaleLowerCase();\r\n\r\n unselectedTags = unselectedTags.filter(tag => tag.Name.toLowerCase().includes(searchText) || ResourceAllocation[tag.ResourceAllocation].toLowerCase().includes(searchText));\r\n\r\n unselectedTags.sort((a, b) => { return a.Position - b.Position });\r\n\r\n return unselectedTags;\r\n }\r\n\r\n selectedItemChanged(item) {\r\n this.minLength = 0;\r\n\r\n this.$timeout(() => {\r\n this.minLength = 0;\r\n\r\n (document.activeElement as HTMLElement).blur();\r\n }, 500);\r\n if (this.onChange) {\r\n this.onChange();\r\n }\r\n }\r\n\r\n //------------------------------------------------\r\n\r\n private getTags() {\r\n this.tagsService\r\n .getTags()\r\n .then(tags => {\r\n // Remove duplicates (from testing), start with auto tags as they should take priority\r\n\r\n tags = this.deDupeTags(tags);\r\n\r\n this.assignedTags = [];\r\n\r\n if (this.resource && this.resource.TagIds) {\r\n\r\n this.resource.TagIds.forEach(resourceTagId => {\r\n tags.forEach(tag => {\r\n if (tag.Id === resourceTagId) {\r\n this.assignedTags.push(tag);\r\n this.assignedTags.sort((tag1: ITag, tag2: ITag) => { return tag1.Position - tag2.Position; });\r\n }\r\n });\r\n });\r\n }\r\n\r\n this.assignedTags = this.deDupeTags(this.assignedTags);\r\n\r\n if (this.max) {\r\n this.assignHiddenTags();\r\n }\r\n\r\n this.allTags = tags;\r\n })\r\n .catch(e => {\r\n console.error(e)\r\n });\r\n }\r\n\r\n private updateTags() {\r\n if (!this.resource) {\r\n return;\r\n }\r\n\r\n this.resource.TagIds = [];\r\n\r\n this.assignedTags.forEach(tag => {\r\n this.resource.TagIds.push(tag.Id);\r\n });\r\n }\r\n\r\n private deDupeTags(tags: ITag[]): ITag[] {\r\n var deDupedTags: ITag[] = [];\r\n\r\n tags.filter(t => t.AutoTag).forEach(t => {\r\n deDupedTags.push(t);\r\n });\r\n\r\n tags.filter(t => !t.AutoTag).forEach(t => {\r\n if (!deDupedTags.find(npTag => t.Name == npTag.Name)) {\r\n deDupedTags.push(t);\r\n }\r\n });\r\n\r\n return deDupedTags;\r\n }\r\n\r\n private assignHiddenTags() {\r\n this.hiddenTags = [];\r\n\r\n if (this.max > this.assignedTags.length) {\r\n return;\r\n }\r\n\r\n this.hiddenTags = angular.copy(this.assignedTags.splice(1, this.assignedTags.length - this.max));\r\n\r\n if (this.hiddenTags.length >= 1) {\r\n var hiddenTagCount = {\r\n Name: `+ ${this.hiddenTags.length}`,\r\n ResourceType: ResourceType.Geofence,\r\n Position: 100,\r\n ResourceAllocation: 3\r\n }\r\n\r\n this.assignedTags.push(hiddenTagCount);\r\n }\r\n\r\n this.tooltipLabel = '';\r\n this.tooltipLabel += this.assignedTags[0].Name;\r\n this.hiddenTags.forEach(tag => this.addTagToTooltip(tag));\r\n }\r\n\r\n private addTagToTooltip(tag: ITag) {\r\n if (!tag) {\r\n return;\r\n }\r\n\r\n if (this.tooltipLabel && this.tooltipLabel.length != 0) {\r\n this.tooltipLabel += \", \";\r\n }\r\n\r\n this.tooltipLabel += tag.Name;\r\n }\r\n}\r\n\r\nexport class TagsComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n\r\n constructor() {\r\n this.bindings = {\r\n resource: \"<\",\r\n editMode: \"<\",\r\n resourceType: \"<\",\r\n max: \"@\",\r\n onChange: '&',\r\n onTagDeleted: '&'\r\n };\r\n\r\n this.controller = TagsComponentController;\r\n this.template = require(\"./tags.html\");\r\n }\r\n}\r\n","module.exports = \"

{{ 'geofenceTagsEdit.title' | translate }}

clear
\";","module.exports = \"
{{item.Name}}
({{'tags.' + $ctrl.resourceAllocationEnum[item.ResourceAllocation].toLowerCase() | translate}})
{{$chip.Name}}
{{'tags.manageTags' | translate}}
\";","\r\nimport * as moment from \"moment\";\r\n\r\nimport \"./veriDateRange.scss\";\r\n\r\nimport { IComboBox } from \"@interfaces/IComboBox\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { DateRange } from \"@reports/_services/dynamicReports.service\";\r\n\r\nexport interface IVeriDateRangeComponentBindings {\r\n selectedDateRange: DateRange;\r\n startDate: Date;\r\n endDate: Date;\r\n\r\n onRangeChanged: (args: { startDate: Date, endDate: Date, selectedDateRange: DateRange }) => void;\r\n}\r\n\r\nclass VeriDateRangeComponentController implements angular.IComponentController {\r\n\r\n dateRange = DateRange;\r\n selectedDateRange = DateRange.Today;\r\n\r\n startDate: Date;\r\n startHour: number;\r\n startMinute: number;\r\n\r\n endDate: Date;\r\n endHour: number;\r\n endMinute: number;\r\n\r\n onRangeChanged: (args: { startDate: Date, endDate: Date, selectedDateRange: DateRange }) => void;\r\n\r\n static $inject = [\"translationService\"];\r\n constructor( private readonly translationService: TranslationService) {}\r\n\r\n dateRangeOptions: IComboBox[] = [\r\n { Name: this.translationService.t(\"veriDateRange.dateRangeOptions.oneDay\"), Value: DateRange.Today },\r\n { Name: this.translationService.t(\"veriDateRange.dateRangeOptions.twoDays\"), Value: DateRange.Yesterday },\r\n { Name: this.translationService.t(\"veriDateRange.dateRangeOptions.thisWeek\"), Value: DateRange.ThisWeek },\r\n { Name: this.translationService.t(\"veriDateRange.dateRangeOptions.lastWeek\"), Value: DateRange.LastWeek },\r\n { Name: this.translationService.t(\"veriDateRange.dateRangeOptions.thisMonth\"), Value: DateRange.ThisMonth },\r\n { Name: this.translationService.t(\"veriDateRange.dateRangeOptions.lastMonth\"), Value: DateRange.LastMonth },\r\n { Name: this.translationService.t(\"veriDateRange.dateRangeOptions.custom\"), Value: DateRange.Custom }\r\n ];\r\n\r\n $onInit(): void {\r\n this.syncDates();\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject): void {\r\n if (onChangesObj[\"startDate\"] || onChangesObj[\"endDate\"]) {\r\n this.syncDates();\r\n }\r\n \r\n if (onChangesObj[\"selectedDateRange\"]) {\r\n this.setSelectDateRange();\r\n }\r\n }\r\n\r\n timeChanged(updateDateRange: boolean = true): void {\r\n this.startDate = moment(this.startDate).hour(this.startHour).minute(this.startMinute).toDate();\r\n\r\n this.endDate = moment(this.endDate).hour(this.endHour).minute(this.endMinute).toDate();\r\n\r\n if (updateDateRange) {\r\n this.setSelectDateRange();\r\n }\r\n\r\n if (this.onRangeChanged) {\r\n this.onRangeChanged({\r\n startDate: this.startDate,\r\n endDate: this.endDate,\r\n selectedDateRange: this.selectedDateRange\r\n });\r\n }\r\n }\r\n\r\n selectedDateRangeChanged() {\r\n this.selectedDateRange = Number(this.selectedDateRange);\r\n\r\n if (this.selectedDateRange === DateRange.Today ||\r\n this.selectedDateRange === DateRange.Yesterday ||\r\n this.selectedDateRange === DateRange.Week ||\r\n this.selectedDateRange === DateRange.Month ||\r\n this.selectedDateRange === DateRange.ThisWeek ||\r\n this.selectedDateRange === DateRange.ThisMonth ||\r\n this.selectedDateRange === DateRange.Latest3Weeks) {\r\n this.endDate = moment().toDate();\r\n }\r\n\r\n switch (this.selectedDateRange) {\r\n case DateRange.Today:\r\n this.startDate = moment().toDate();\r\n break;\r\n case DateRange.Yesterday:\r\n this.startDate = moment().add(-1, \"days\").toDate();\r\n break;\r\n case DateRange.Week:\r\n this.startDate = moment().add(-1, \"weeks\").toDate();\r\n break;\r\n case DateRange.Month:\r\n this.startDate = moment().add(-1, \"months\").toDate();\r\n break;\r\n case DateRange.ThisWeek:\r\n this.startDate = moment().startOf(\"isoWeek\").toDate();\r\n break;\r\n case DateRange.ThisMonth:\r\n this.startDate = moment().startOf(\"month\").toDate();\r\n break;\r\n case DateRange.Latest3Weeks:\r\n this.startDate = moment().startOf(\"isoWeek\").add(-2, \"weeks\").toDate();\r\n break;\r\n case DateRange.LastWeek:\r\n this.startDate = moment().add(-1, \"weeks\").startOf(\"isoWeek\").toDate();\r\n this.endDate = moment().add(-1, \"weeks\").endOf(\"isoWeek\").toDate();\r\n break;\r\n case DateRange.LastMonth:\r\n this.startDate = moment().add(-1, \"months\").startOf(\"month\").toDate();\r\n this.endDate = moment().add(-1, \"months\").endOf(\"month\").toDate();\r\n break;\r\n }\r\n\r\n this.timeChanged(false);\r\n }\r\n\r\n private setSelectDateRange() {\r\n const startDate = moment(this.startDate);\r\n\r\n if (startDate.isSame(moment(), \"days\")) {\r\n this.selectedDateRange = DateRange.Today;\r\n } else if (startDate.isSame(moment().add(-1, \"days\"), \"day\")) {\r\n this.selectedDateRange = DateRange.Yesterday;\r\n } else {\r\n this.selectedDateRange = DateRange.Custom;\r\n }\r\n }\r\n\r\n private syncDates(): void {\r\n const startMoment = moment(this.startDate);\r\n this.startDate = startMoment.toDate();\r\n this.startHour = startMoment.hour();\r\n this.startMinute = startMoment.minute();\r\n\r\n const endMoment = moment(this.endDate);\r\n this.endDate = endMoment.toDate();\r\n this.endHour = endMoment.hour();\r\n this.endMinute = endMoment.minute();\r\n }\r\n}\r\n\r\nexport class VeriDateRangeComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n\r\n constructor() {\r\n this.bindings = {\r\n startDate: \"<\",\r\n endDate: \"<\",\r\n selectedDateRange: \"
query_builder
{{ item.Name }}
query_builder
\";","\r\nimport * as moment from \"moment\"\r\nimport * as angular from \"angular\"\r\nimport \"./veriInlineDatePicker.scss\";\r\n\r\n\r\ninterface IVeriInlineDatePickerBindings {\r\n disableButtons: boolean;\r\n date: Date;\r\n maxDate: Date;\r\n maxDateIsToday: boolean;\r\n minDate: Date;\r\n minDateIsToday: boolean;\r\n\r\n onChange(args: { date: Date });\r\n}\r\n\r\nclass VeriInlineDatePickerComponentController implements angular.IComponentController, IVeriInlineDatePickerBindings {\r\n disableButtons: boolean;\r\n date: Date;\r\n maxDate: Date;\r\n maxDateIsToday: boolean;\r\n minDate: Date;\r\n minDateIsToday: boolean;\r\n canGotoNextDay: boolean;\r\n canGotoPreviousDay: boolean;\r\n\r\n onChange: (args: { date: Date }) => void;\r\n\r\n $onInit(): void {\r\n if (!this.date) {\r\n this.date = moment().toDate();\r\n }\r\n\r\n this.dateChanged(false);\r\n\r\n this.canGotoNextDay = true;\r\n this.canGotoPreviousDay = true;\r\n\r\n if (this.maxDateIsToday) {\r\n this.maxDate = moment().toDate();\r\n }\r\n\r\n if (this.minDateIsToday) {\r\n this.minDate = moment().toDate();\r\n }\r\n\r\n if (this.minDate && moment(this.minDate).dayOfYear() === moment(this.date).dayOfYear()) {\r\n this.canGotoPreviousDay = false;\r\n }\r\n else {\r\n this.canGotoPreviousDay = true;\r\n }\r\n\r\n if (this.maxDate && moment(this.maxDate).dayOfYear() === moment(this.date).dayOfYear()) {\r\n this.canGotoNextDay = false;\r\n }\r\n else {\r\n this.canGotoNextDay = true;\r\n }\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject): void {\r\n if (onChangesObj[\"date\"] && !onChangesObj[\"date\"].isFirstChange()) {\r\n this.dateChanged(false);\r\n }\r\n }\r\n\r\n goToPreviousDay() {\r\n this.date = moment(this.date).subtract(1, \"d\").toDate();\r\n this.dateChanged();\r\n }\r\n\r\n goToNextDay() {\r\n this.date = moment(this.date).add(1, \"d\").toDate();\r\n this.dateChanged();\r\n }\r\n\r\n dateChanged(notify = true) {\r\n if (!this.date) {\r\n return;\r\n }\r\n\r\n // If this is set (true by default) then we will sync the max date with today\r\n if (this.maxDateIsToday) {\r\n this.maxDate = moment().toDate();\r\n }\r\n\r\n if (this.minDateIsToday) {\r\n this.minDate = moment().toDate();\r\n }\r\n\r\n if (this.maxDate) {\r\n this.canGotoNextDay = moment(this.date).isBefore(moment(this.maxDate), \"d\");\r\n }\r\n\r\n if (this.minDate) {\r\n this.canGotoPreviousDay = moment(this.date).isAfter(moment(this.minDate), \"d\");\r\n }\r\n\r\n if (notify && this.onChange) {\r\n this.onChange({ date: this.date });\r\n }\r\n }\r\n}\r\n\r\nexport class VeriInlineDatePickerComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n\r\n constructor() {\r\n this.bindings = {\r\n disableButtons: \"<\",\r\n date: \"<\",\r\n maxDate: \"<\",\r\n maxDateIsToday: \"<\",\r\n minDate: \"<\",\r\n minDateIsToday: \"<\",\r\n\r\n onChange: \"&\"\r\n };\r\n\r\n this.controller = VeriInlineDatePickerComponentController;\r\n this.template = require(\"./veriInlineDatePicker.html\");\r\n }\r\n}\r\n","module.exports = \" keyboard_arrow_left keyboard_arrow_right \";","import { SortDirection } from \"@enums/SortDirection\";\r\nimport { SortType } from \"@enums/SortType\";\r\nimport { IComboBox } from \"@interfaces/IComboBox\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport * as angular from \"angular\";\r\nimport * as moment from \"moment\";\r\nimport { IVeriPillNavLabel } from \"../veriSimpleNav/veriSimpleNav.component\";\r\nimport \"./veriList.scss\";\r\n\r\ninterface IVeriListBindings {\r\n showSearch: boolean;\r\n searchPlaceholder: string;\r\n\r\n onRowClicked: (args: { row: IVeriListRow }) => void;\r\n onRowHover: (args: { row: IVeriListRow }) => void;\r\n onRowsUpdated: (args: { rows: IVeriListRow[] }) => void;\r\n\r\n selectedItem: any;\r\n templateUrl: string;\r\n filterOptions: IComboBox[];\r\n selectedFilterOption: number;\r\n rowClassName: string;\r\n itemLabel: string;\r\n\r\n showOptionsAsNav: boolean;\r\n clickable: boolean;\r\n loading: boolean;\r\n}\r\n\r\nexport interface IVeriListRow {\r\n id?: number;\r\n data?: T;\r\n searchString?: string;\r\n sortData?: any;\r\n contents?: string;\r\n filterData?: number[];\r\n className?: string;\r\n}\r\n\r\n//interface IVeriListComboBox extends IComboBox {\r\n// count?: number;\r\n//}\r\n\r\nclass VeriListComponentController implements angular.IComponentController, IVeriListBindings {\r\n\r\n sortDirection: SortDirection;\r\n sortType: SortType;\r\n showSearch: boolean;\r\n clickable: boolean;\r\n\r\n loading: boolean;\r\n\r\n rows: IVeriListRow[] = [];\r\n displayRows: IVeriListRow[] = [];\r\n\r\n searchString: string;\r\n searchPlaceholder: string;\r\n\r\n customSorter: (args: { row1: IVeriListRow, row2: IVeriListRow }) => number;\r\n\r\n onRowClicked: (args: { row: IVeriListRow }) => void;\r\n onRowHover: (args: { row: IVeriListRow, mouseEvent: MouseEvent }) => void;\r\n onRowsUpdated: (args: { rows: IVeriListRow[] }) => void;\r\n\r\n rowClassName: string;\r\n templateUrl: string;\r\n itemLabel = this.translationService.t('veriList.items');\r\n\r\n showOptionsAsNav: boolean;\r\n filterOptions: IComboBox[];\r\n navLabels: IVeriPillNavLabel[];\r\n\r\n selectedFilterOption: number;\r\n\r\n selectedItem: any;\r\n selectedRowId: number;\r\n selectedRowIndex: number;\r\n\r\n resourceCount: number;\r\n\r\n static $inject = ['translationService','$scope'];\r\n\r\n constructor(\r\n private readonly translationService: TranslationService,\r\n private readonly $scope: angular.IScope\r\n ) {\r\n\r\n }\r\n\r\n $onInit(): void {\r\n this.itemLabel = this.itemLabel;\r\n this.sortType = this.sortType || SortType.String;\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n\r\n var sortRows = false;\r\n var searchRows = false;\r\n\r\n if (onChangesObj[\"rows\"] && this.rows) {\r\n\r\n this.cleanRows();\r\n\r\n sortRows = true;\r\n searchRows = true;\r\n }\r\n\r\n if (onChangesObj[\"selectedRowId\"] && this.displayRows) {\r\n if (this.selectedItem &&\r\n this.selectedItem.Id &&\r\n this.selectedRowId &&\r\n this.selectedItem.Id === this.selectedRowId) {\r\n return;\r\n }\r\n\r\n //console.log(\"Selected\", this.selectedRowId);\r\n this.displayRows.forEach((row, index) => {\r\n if (this.selectedRowId === row.id) {\r\n\r\n this.selectedRowIndex = index - 1;\r\n //console.log(\"Index: \", this.selectedRowIndex, row.id, this.selectedRowId);\r\n }\r\n });\r\n }\r\n\r\n if (onChangesObj[\"selectedFilterOption\"]) {\r\n this.onFilterOptionChanged();\r\n }\r\n\r\n if (sortRows) {\r\n //console.log(\"Sorting rows\");\r\n this.sortRows();\r\n }\r\n\r\n if (searchRows) {\r\n this.searchRows();\r\n }\r\n\r\n if (this.filterOptions) {\r\n this.calculateNumFilterOptions();\r\n }\r\n this.resourceCount = this.displayRows.length;\r\n }\r\n\r\n rowClicked(row: IVeriListRow) {\r\n\r\n if (this.onRowClicked) {\r\n this.onRowClicked({ row: row });\r\n }\r\n\r\n if (this.selectedItem && this.selectedItem.data === row.data) {\r\n this.selectedItem = null;\r\n }\r\n else {\r\n this.selectedItem = row.data;\r\n }\r\n }\r\n\r\n rowMouseEnter(row: IVeriListRow, mouseEvent: MouseEvent) {\r\n if (this.onRowHover) {\r\n this.onRowHover({ row: row, mouseEvent: mouseEvent });\r\n }\r\n }\r\n\r\n mouseLeave() {\r\n if (this.onRowHover) {\r\n this.onRowHover({ row: null, mouseEvent: null });\r\n }\r\n }\r\n\r\n onFilterOptionChanged() {\r\n\r\n this.selectedFilterOption = Number(this.selectedFilterOption)\r\n this.searchRows();\r\n }\r\n\r\n onNavLabelClicked($label: IVeriPillNavLabel) {\r\n this.selectedFilterOption = this.navLabels.indexOf($label);\r\n this.onFilterOptionChanged();\r\n }\r\n\r\n onSearch() {\r\n this.$scope.$applyAsync(() => this.searchRows());\r\n }\r\n\r\n // ----------------------------------------------\r\n\r\n private cleanRows() {\r\n\r\n this.rows.forEach(row => {\r\n row.searchString = row.searchString || row.contents || \"\";\r\n\r\n if (!row.sortData) {\r\n row.sortData = row.contents;\r\n }\r\n\r\n if (this.sortType == SortType.String) {\r\n row.sortData = row.sortData.toLocaleLowerCase();\r\n }\r\n\r\n row.searchString += row.sortData;\r\n row.searchString = row.searchString.toLocaleLowerCase();\r\n });\r\n }\r\n\r\n private searchRows() {\r\n\r\n const safeSearchString = this.searchString ? this.searchString.trim().toLocaleLowerCase() : null;\r\n\r\n if ((safeSearchString || this.selectedFilterOption) && this.rows) {\r\n this.displayRows = [];\r\n\r\n for (let ri = 0; ri < this.rows.length; ri++) {\r\n const row = this.rows[ri];\r\n let rowMatched = false;\r\n\r\n if (safeSearchString && row.searchString.indexOf(safeSearchString) >= 0) {\r\n rowMatched = true;\r\n }\r\n else if (!safeSearchString) {\r\n rowMatched = true;\r\n }\r\n\r\n if (this.selectedFilterOption && this.selectedFilterOption != -1 && rowMatched) {\r\n rowMatched = row.filterData && row.filterData.indexOf(this.selectedFilterOption) >= 0;\r\n }\r\n\r\n if (rowMatched) {\r\n this.displayRows.push(row);\r\n }\r\n }\r\n }\r\n else {\r\n this.displayRows = this.rows;\r\n }\r\n\r\n if (this.onRowsUpdated) {\r\n this.onRowsUpdated({ rows: this.displayRows });\r\n }\r\n }\r\n\r\n private sortRows() {\r\n if (!this.rows) {\r\n return;\r\n }\r\n\r\n this.sortType = this.sortType || SortType.String;\r\n\r\n if (this.sortDirection === undefined) {\r\n this.sortDirection = SortDirection.Ascending;\r\n }\r\n\r\n this.rows.sort((row1, row2) => {\r\n\r\n if (!row1.sortData || !row2.sortData) {\r\n return;\r\n }\r\n\r\n if (this.customSorter && this.customSorter({ row1: row1, row2: row2 })) {\r\n var response = this.customSorter({ row1: row1, row2: row2 });\r\n\r\n // If both are the same, then allow us to continue to filter\r\n if (response != 0) { return response; }\r\n }\r\n\r\n if (this.sortType === SortType.Date) {\r\n return this.sortDirection === SortDirection.Ascending\r\n ? moment(row1.sortData).diff(row2.sortData, \"s\")\r\n : moment(row2.sortData).diff(row1.sortData, \"s\");\r\n }\r\n else if (this.sortType === SortType.Number) {\r\n return this.sortDirection === SortDirection.Ascending\r\n ? row1.sortData < row2.sortData ? 1 : -1\r\n : row1.sortData < row2.sortData ? -1 : 1;\r\n }\r\n else {\r\n return this.sortDirection === SortDirection.Ascending\r\n ? row1.sortData.localeCompare(row2.sortData)\r\n : row2.sortData.localeCompare(row1.sortData);\r\n }\r\n });\r\n }\r\n\r\n private calculateNumFilterOptions() {\r\n if (!this.rows) {\r\n return;\r\n }\r\n\r\n var hasAllOption = false;\r\n this.filterOptions.forEach(filterOption => {\r\n if (filterOption.Value <= 0) {\r\n hasAllOption = true;\r\n }\r\n });\r\n\r\n if (!hasAllOption) {\r\n this.filterOptions.unshift({\r\n Name: this.translationService.t(\"veriList.all\"),\r\n Value: 0\r\n });\r\n }\r\n\r\n if (!this.selectedFilterOption) {\r\n this.selectedFilterOption = this.filterOptions[0].Value;\r\n }\r\n\r\n this.filterOptions.forEach(filterOption => {\r\n filterOption.Count = 0;\r\n });\r\n\r\n for (var i = 0; i < this.rows.length; i++) {\r\n const row = this.rows[i];\r\n\r\n if (!row.filterData) {\r\n continue;\r\n }\r\n\r\n for (var j = 0; j < this.filterOptions.length; j++) {\r\n const option = this.filterOptions[j];\r\n\r\n if (option.Value <= 0 || row.filterData.indexOf(option.Value) >= 0) {\r\n option.Count++;\r\n }\r\n }\r\n }\r\n\r\n this.updateNavPillLabels();\r\n }\r\n\r\n private updateNavPillLabels() {\r\n this.navLabels = [];\r\n\r\n this.filterOptions.forEach(option => {\r\n this.navLabels.push({\r\n count: option.Count,\r\n label: option.Name\r\n });\r\n });\r\n }\r\n}\r\n\r\nexport class VeriListComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n\r\n constructor() {\r\n this.bindings = {\r\n rows: \"<\",\r\n\r\n selectedItem: \"<\",\r\n sortType: \" {{ item.Name }} ({{ item.Count }})
{{'veriList.noLabelDisplay' | translate : $ctrl.itemLabel}}
\";","\r\nimport * as angular from \"angular\";\r\n\r\nimport \"./veriPage.scss\";\r\n\r\ninterface IVeriPageBindings {\r\n pageTitle: string;\r\n}\r\n\r\nexport class VeriPageComponentController implements angular.IComponentController, IVeriPageBindings {\r\n\r\n pageTitle: string = \"unset\";\r\n\r\n static $inject = [];\r\n}\r\n\r\nexport class VeriPageComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n transclude: boolean | { [index: string]: string; };\r\n\r\n constructor() {\r\n this.bindings = {\r\n pageTitle: \"@\"\r\n };\r\n\r\n this.controller = VeriPageComponentController;\r\n this.template = require(\"./veriPage.html\");\r\n this.transclude = true;\r\n }\r\n}\r\n","module.exports = \"

Should be removed \";","\r\nimport * as angular from \"angular\";\r\nimport { IRegisterTab } from \"./IRegisterTab\";\r\nimport \"./veriTab.scss\";\r\n\r\nexport interface IVeriTab {\r\n tabTitle: string;\r\n url?: string;\r\n tabCount?: number\r\n tabDisabled?: boolean;\r\n location?: string;\r\n\r\n data?: T;\r\n}\r\n\r\nexport interface IVeriTabBindings extends IVeriTab {\r\n tabSubtitle: string;\r\n preferredOrder: number;\r\n\r\n scroll: boolean;\r\n tabVisible: boolean;\r\n warn: boolean;\r\n loading: boolean;\r\n alignRight: boolean;\r\n borderLeft: boolean;\r\n tabCountLabel: string;\r\n icon: string;\r\n\r\n stepWidth?: number;\r\n\r\n tabTooltip: string;\r\n tabTooltipDirection: string;\r\n\r\n tabReference: number;\r\n\r\n onTabSelected: () => void;\r\n\r\n show(animate: boolean);\r\n hide(animate: boolean);\r\n setClassName(className: string);\r\n\r\n disableNextButton?: boolean;\r\n nextButtonLabel: string;\r\n nextButtonFunction: () => angular.IPromise;\r\n}\r\n\r\nexport class VeriTabComponentController implements angular.IComponentController, IVeriTabBindings {\r\n\r\n tabTitle: string = \"unset\";\r\n tabSubtitle: string;\r\n preferredOrder: number = 0;\r\n\r\n tabCount: number = null;\r\n tabCountLabel: string;\r\n badgeCount: number = null;\r\n scroll: boolean;\r\n tabDisabled: boolean;\r\n tabVisible: boolean;\r\n url: string;\r\n warn: boolean;\r\n loading: boolean;\r\n alignRight: boolean;\r\n borderLeft: boolean;\r\n icon: string;\r\n\r\n tabTooltip: string;\r\n tabTooltipDirection: string;\r\n tabReference: number;\r\n\r\n onTabSelected: () => void;\r\n\r\n hideTimeout: angular.IPromise;\r\n className = \"\";\r\n visible = false;\r\n\r\n parent: IRegisterTab;\r\n veriTabs: IRegisterTab;\r\n veriVerticalTabs: IRegisterTab;\r\n\r\n disableNextButton?: boolean;\r\n nextButtonLabel: string;\r\n nextButtonFunction: () => angular.IPromise;\r\n\r\n static $inject = [\"$element\", \"$timeout\"];\r\n\r\n constructor(private readonly $element: JQuery, private readonly $timeout: angular.ITimeoutService) {}\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n\r\n if (onChangesObj[\"tabVisible\"] && !onChangesObj[\"tabVisible\"].isFirstChange()) {\r\n this.parent.tabVisibilityChanged(this);\r\n }\r\n\r\n if (onChangesObj[\"tabSelected\"] && onChangesObj[\"tabSelected\"].currentValue) {\r\n this.$timeout(() => {\r\n this.parent.showTab(this, false);\r\n });\r\n }\r\n }\r\n\r\n $onInit() {\r\n this.parent = this.veriVerticalTabs || this.veriTabs;\r\n this.hide(false);\r\n\r\n if (this.parent) {\r\n this.parent.registerTab(this);\r\n }\r\n else {\r\n console.error(\"VeriTab used outside of VeriTabs\");\r\n return;\r\n }\r\n\r\n if (this.scroll !== false) {\r\n this.scroll = true;\r\n }\r\n\r\n this.tabVisible = this.tabVisible === false ? false : true;\r\n }\r\n\r\n $onDestroy() {\r\n this.parent.unregisterTab(this);\r\n }\r\n\r\n show(animate: boolean) {\r\n if (this.hideTimeout) {\r\n this.$timeout.cancel(this.hideTimeout);\r\n }\r\n\r\n this.visible = true;\r\n\r\n if (this.onTabSelected) {\r\n this.onTabSelected();\r\n }\r\n\r\n // This allows the tabs to autoresize, not perfect, commented out for now\r\n //this.$timeout(() => {\r\n\r\n // var child = this.$element.children().first();\r\n // var subchild = child.children().first();\r\n\r\n // var elementToUse = child;\r\n\r\n // //if (subchild.length > 0) {\r\n // // elementToUse = subchild;\r\n // //}\r\n\r\n // var height = elementToUse.outerHeight();\r\n // console.log(\"e\", elementToUse);\r\n // console.log(\"c\", subchild);\r\n // //console.log(\"outer height\", height);\r\n\r\n // if (elementToUse[0]) {\r\n // console.log(\"scroll height\", elementToUse[0].scrollHeight);\r\n // height = Math.max(height, elementToUse[0].scrollHeight);\r\n // }\r\n\r\n // //this.$element[0].style[\"min-height\"] = `${height}px`;\r\n\r\n // //this.$timeout(() => {\r\n // // this.parent.setContentHeight(null);\r\n // //}, 1000);\r\n\r\n // this.parent.setContentHeight(height);\r\n //}, 100);\r\n }\r\n\r\n hide(animate: boolean) {\r\n if (animate) {\r\n this.hideTimeout = this.$timeout(() => { this.visible = false; }, 500);\r\n }\r\n else {\r\n this.visible = false;\r\n }\r\n }\r\n\r\n setClassName(className: string) {\r\n if (this.className === className) {\r\n return;\r\n }\r\n\r\n if (this.className) {\r\n this.$element.removeClass(this.className);\r\n }\r\n\r\n if (className) {\r\n this.className = className;\r\n this.$element.addClass(this.className);\r\n }\r\n }\r\n}\r\n\r\nexport class VeriTabComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n require: any;\r\n controller: any;\r\n template: string;\r\n transclude: boolean | { [index: string]: string; };\r\n\r\n constructor() {\r\n this.bindings = {\r\n url: \"@\",\r\n tabTitle: \"@\",\r\n tabSubtitle: \"@\",\r\n preferredOrder: \" \";","import { ConstantsService } from \"@services/constantsService\";\r\nimport { StateRegistry, Transition } from \"@uirouter/angularjs\";\r\nimport { StateService } from \"@uirouter/core\";\r\nimport { IRegisterTab } from \"./IRegisterTab\";\r\nimport { IVeriTabBindings } from \"./veriTab.component\";\r\nimport \"./veriTabs.scss\";\r\nimport \"./veriVerticalTabs.scss\";\r\n\r\nexport class VeriTabsComponentController implements angular.IComponentController, IRegisterTab {\r\n tabs: IVeriTabBindings[] = [];\r\n\r\n selectedTabComponent: IVeriTabBindings;\r\n selectedTab: string;\r\n selectedTabIndex: number;\r\n\r\n nextTab: IVeriTabBindings;\r\n previousTab: IVeriTabBindings;\r\n\r\n hasResourceFilterBar: boolean;\r\n hasTitleEnd: boolean;\r\n hasTitleStart: boolean;\r\n\r\n stepper: boolean;\r\n slimStepper: boolean = false;\r\n stepperValidationError: string;\r\n stepperOffset: number;\r\n\r\n autoSize: boolean;\r\n onTabChanged: (args: { tabIndex: number, tabTitle: string, tabReference: number }) => void;\r\n onFinish: () => void;\r\n\r\n finishMessage: string;\r\n disableBack: boolean;\r\n disableNext: boolean;\r\n disableFinish: boolean;\r\n disableAutoTabSelect: boolean;\r\n hideNav: boolean = false;\r\n\r\n // ---\r\n\r\n processingNextButtonFunction: boolean = false;\r\n\r\n isMobile: boolean = false;\r\n\r\n static $inject = [\"$q\", \"$element\", \"$transclude\", \"$state\", \"$stateRegistry\", \"$timeout\", \"$transitions\", \"$animateCss\", \"$mdUtil\", \"constantsService\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $element: JQLite,\r\n private readonly $transclude: angular.ITranscludeFunction,\r\n private readonly $state: StateService,\r\n private readonly $stateRegistry: StateRegistry,\r\n private readonly $timeout: angular.ITimeoutService,\r\n private readonly $transitions: Transition,\r\n private readonly $animateCss: any,\r\n private readonly $mdUtil: any,\r\n private readonly constantsService: ConstantsService) {\r\n\r\n $transitions.onSuccess({}, (trans) => {\r\n trans.promise.then(result => {\r\n if (this.tabs.some(tab => !!tab.location)) {\r\n this.reflectTransition(trans);\r\n }\r\n var pageName = this.$state.params[\"page\"];\r\n if (pageName) {\r\n this.showTabUrl(pageName);\r\n }\r\n });\r\n });\r\n }\r\n\r\n reflectTransition(trans: Transition) {\r\n const lastSegment = trans.router.urlService.path().split('/').pop();\r\n const tabToShow = this.tabs.find(tab => tab.location === lastSegment);\r\n\r\n !!tabToShow && this.showTab(tabToShow, false);\r\n }\r\n\r\n $onInit() {\r\n this.isMobile = this.constantsService.getIsMobile();\r\n this.hasResourceFilterBar = this.$transclude.isSlotFilled(\"resourceFilterBar\");\r\n this.hasTitleStart = this.$transclude.isSlotFilled(\"veriTabsTitleStart\");\r\n this.hasTitleEnd = this.$transclude.isSlotFilled(\"veriTabsTitleEnd\");\r\n\r\n this.calculateStepperSize();\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n\r\n if (onChangesObj[\"selectedTab\"] && this.selectedTab !== undefined) {\r\n const tab = this.findTab(this.selectedTab);\r\n\r\n if (tab) {\r\n this.showTab(tab);\r\n }\r\n }\r\n }\r\n\r\n registerTab(tab: IVeriTabBindings) {\r\n this.tabs.push(tab);\r\n this.tabs.sort((tab1, tab2) => tab1?.preferredOrder - tab2?.preferredOrder);\r\n this.updateSelectedTabIndex();\r\n\r\n if (this.$state.params[\"page\"] && tab.url) {\r\n if (this.$state.params[\"page\"] === tab.url) {\r\n this.showTab(tab, false);\r\n }\r\n }\r\n else if (!this.disableAutoTabSelect && (this.tabs.length === 1 || this.selectedTab == tab.tabTitle)) {\r\n this.showTab(tab, false);\r\n }\r\n\r\n this.updateNextPreviousTabs();\r\n\r\n this.calculateLeftyRighty();\r\n this.calculateStepperSize();\r\n }\r\n\r\n unregisterTab(tab: IVeriTabBindings) {\r\n var tabIndex = this.tabs.indexOf(tab);\r\n if (tabIndex >= 0) {\r\n this.tabs.splice(tabIndex, 1);\r\n }\r\n }\r\n\r\n tabVisibilityChanged(tab: IVeriTabBindings) {\r\n if (tab.tabVisible) {\r\n return;\r\n }\r\n\r\n var currentIndex = this.tabs.indexOf(tab);\r\n const nextTab = this.findTab(`${currentIndex + 1}`);\r\n this.showTab(nextTab);\r\n }\r\n\r\n showTabViaStepper(tabToShow: IVeriTabBindings, animate = true): void {\r\n const indexOfCurrentTab = this.tabs.indexOf(this.selectedTabComponent);\r\n const indexOfClickedTab = this.tabs.indexOf(tabToShow);\r\n\r\n if ((indexOfClickedTab === indexOfCurrentTab + 1 && (this.disableNext || this.stepperValidationError))\r\n || indexOfClickedTab > indexOfCurrentTab + 1) {\r\n return;\r\n }\r\n\r\n this.showTab(tabToShow, animate);\r\n }\r\n\r\n showTab(tabToShow: IVeriTabBindings, animate = true) {\r\n if (this.selectedTabComponent === tabToShow || !tabToShow) {\r\n return;\r\n }\r\n\r\n this.tabs.forEach(tab => {\r\n if (tab === tabToShow) {\r\n this.selectedTabComponent = tab;\r\n this.updateSelectedTabIndex();\r\n\r\n tab.show(animate);\r\n this.notifyTabChange(tab);\r\n }\r\n else {\r\n tab.hide(animate);\r\n }\r\n });\r\n\r\n this.updateNextPreviousTabs();\r\n\r\n this.calculateLeftyRighty();\r\n this.calculateStepperSize();\r\n\r\n if (tabToShow.url) {\r\n const transitionObject = { \"page\": tabToShow.url, option: null };\r\n\r\n this.$state.go(this.$state.current.name, transitionObject, { location: true, notify: false, reload: false });\r\n\r\n this.$state.current.params[\"subTitle\"] = tabToShow.tabTitle;\r\n }\r\n }\r\n\r\n updateNextPreviousTabs() {\r\n this.previousTab = this.tabs[this.selectedTabIndex - 1];\r\n this.nextTab = this.tabs[this.selectedTabIndex + 1];\r\n }\r\n\r\n next() {\r\n const nextTabIndex = this.selectedTabIndex + 1;\r\n\r\n // TODO - revisit promise binding\r\n if (this.selectedTabComponent && this.selectedTabComponent.nextButtonFunction) {\r\n this.processingNextButtonFunction = true;\r\n\r\n const nextButtonPromise = this.selectedTabComponent.nextButtonFunction();\r\n\r\n this.$q.when(nextButtonPromise).then(() => {\r\n this.showTab(this.tabs[nextTabIndex]);\r\n }).finally(() => {\r\n this.processingNextButtonFunction = false;\r\n });\r\n }\r\n\r\n this.showTab(this.tabs[nextTabIndex]);\r\n }\r\n\r\n previous() {\r\n var prevTabIndex = this.selectedTabIndex - 1;\r\n this.showTab(this.tabs[prevTabIndex]);\r\n }\r\n\r\n finish() {\r\n if (this.onFinish) {\r\n this.onFinish();\r\n }\r\n }\r\n\r\n setContentHeight(height: number) {\r\n if (!this.autoSize) {\r\n return;\r\n }\r\n\r\n var container = this.$element.children(\".veri-tab-container\").first() as JQLite;\r\n\r\n if (height) {\r\n container[0].style[\"height\"] = `${height}px`;\r\n }\r\n else {\r\n //container[0].style[\"height\"] = null;\r\n }\r\n\r\n //console.log(\"setContentHeight\", container, height);\r\n //console.log(this.$element);\r\n //this.$animateCss(this.$element, {\r\n // from: 100,\r\n // to: height,\r\n // //easing: 'cubic-bezier(0.35, 0, 0.25, 1)',\r\n // duration: 0.5\r\n //})\r\n //.start().done(function () {\r\n // // Then (to fix the same iOS issue as above), disable transitions and remove the specific\r\n // // pixel height so the height can size with browser width/content changes, etc.\r\n // this.$element.css({\r\n // transition: 'none',\r\n // height: ''\r\n // });\r\n\r\n // // In the next tick, re-allow transitions (if we do it all at once, $element.css is \"smart\"\r\n // // enough to batch it for us instead of doing it immediately, which undoes the original\r\n // // transition: none)\r\n // //this.$mdUtil.nextTick(function () {\r\n // // this.$element.css('transition', '');\r\n // //});\r\n //});\r\n }\r\n\r\n // -------------------\r\n\r\n private updateSelectedTabIndex(): void {\r\n this.selectedTabIndex = this.tabs.indexOf(this.selectedTabComponent);\r\n }\r\n\r\n private showTabUrl(tabUrl: string) {\r\n this.tabs.forEach(tab => {\r\n if (tab.url && tab.url === tabUrl && tab !== this.selectedTabComponent) {\r\n this.showTab(tab, false);\r\n }\r\n });\r\n }\r\n\r\n private notifyTabChange(tabToShow: IVeriTabBindings) {\r\n const index = this.tabs.indexOf(tabToShow);\r\n\r\n if (this.onTabChanged) {\r\n this.onTabChanged({ tabIndex: index, tabTitle: tabToShow.tabTitle, tabReference: tabToShow.tabReference });\r\n }\r\n }\r\n\r\n private findTab(tabToFind: string) {\r\n var foundTab: IVeriTabBindings = null;\r\n const tabIndex = Number(tabToFind);\r\n if (!this.isNaN(tabIndex)) {\r\n foundTab = this.tabs[tabIndex];\r\n }\r\n\r\n if (!foundTab) {\r\n this.tabs.forEach(tab => {\r\n if (tab?.tabTitle?.toUpperCase() === tabToFind?.toUpperCase()) {\r\n foundTab = tab;\r\n }\r\n });\r\n }\r\n\r\n return foundTab;\r\n }\r\n\r\n // IE11 doesnt have an isNan function\r\n private isNaN(o) {\r\n return typeof (o) === 'number' && isNaN(o);\r\n }\r\n\r\n private calculateLeftyRighty() {\r\n\r\n var hasSeenSelected = false;\r\n\r\n this.tabs.forEach(tab => {\r\n var stateChanged = tab.url ? \"state-changed\" : \"\";\r\n if (tab === this.selectedTabComponent) {\r\n hasSeenSelected = true;\r\n\r\n tab.setClassName(`is-active ${stateChanged}`);\r\n }\r\n else if (hasSeenSelected) {\r\n tab.setClassName(`is-right ${stateChanged}`);\r\n }\r\n else {\r\n tab.setClassName(`is-left ${stateChanged}`);\r\n }\r\n });\r\n }\r\n\r\n private calculateStepperSize(): void {\r\n if (!this.stepper || (!this.slimStepper && !this.isMobile)) {\r\n return;\r\n }\r\n\r\n this.$timeout(() => {\r\n const stepperBarListItems: HTMLCollection = this.$element.find(\".stepper-bar\")[0]?.children;\r\n const leftMargin = 18;\r\n\r\n for (var i = 0; i < stepperBarListItems.length; i++) {\r\n this.tabs[i].stepWidth = stepperBarListItems.item(i)?.clientWidth + leftMargin;\r\n }\r\n\r\n this.calculateStepperOffset();\r\n });\r\n }\r\n\r\n private calculateStepperOffset(): void {\r\n this.stepperOffset = 0;\r\n }\r\n}\r\n\r\nexport class VeriTabsComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n require: { [index: string]: string; };\r\n controller: any;\r\n template: string | angular.Injectable<(...args: any[]) => string>;\r\n transclude: boolean | { [index: string]: string; };\r\n\r\n constructor(\r\n vertical = false\r\n ) {\r\n this.bindings = {\r\n selectedTab: \" {\r\n\r\n if (vertical) {\r\n return require(\"./veriVerticalTabs.html\");\r\n }\r\n\r\n return require(\"./veriTabs.html\");\r\n }\r\n\r\n this.template.$inject = [\"$element\", \"$attrs\"];\r\n this.transclude = {\r\n \"resourceFilterBar\": \"?resourceFilterBar\",\r\n \"veriTabsTitleEnd\": \"?veriTabsTitleEnd\",\r\n \"veriTabsTitleStart\": \"?veriTabsTitleStart\",\r\n };\r\n }\r\n}\r\n","module.exports = \"
{{tab.icon}}
{{tab.tabTitle}}
{{tab.tabCount | number}} {{tab.tabCountLabel}} warning keyboard_arrow_right
\";","module.exports = \"
  • {{tab.icon}} {{tab.tabTitle}} {{tab.tabSubtitle}} {{tab.tabCount | number}} {{tab.tabCountLabel}} warning autorenew
    • $index }\\\"> {{tab.tabTitle}} chevron_right
    0\\\" icon=chevron_left [disabled]=\\\"!$ctrl.previousTab || $ctrl.previousTab.tabDisabled || $ctrl.disableBack\\\"> {{ 'Common.Back' | translate }}
    {{ $ctrl.stepperValidationError }}
    {{ ( $ctrl.processingNextButtonFunction) ? 'Working..' : $ctrl.selectedTabComponent.nextButtonLabel || ('Common.Next' | translate) }} {{ $ctrl.finishMessage ? $ctrl.finishMessage : ('Common.Finish' | translate) }}
    \";","import { CameraDisplayService } from \"@components/videos/cameraDisplay.service\";\r\nimport { IFilterOptions } from \"@interfaces/filters/IFilterOptions\";\r\nimport { IDriver } from \"@interfaces/IDriver\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { DynamicReportService } from \"@reports/_services/dynamicReports.service\";\r\nimport { ReportTableRowDataSource } from \"@reports/enums/ReportTableRowDataSource\";\r\nimport { IColumnHeader } from \"@reports/models/IColumnHeader\";\r\nimport { IDataDefinition, IReportDefinition } from \"@reports/models/IReportDefinition\";\r\nimport { IReportParameters, ReportParameterType } from \"@reports/models/IReportParameters\";\r\nimport { IReportRow } from \"@reports/models/IReportRow\";\r\nimport { DriverService } from \"@services/driver.service\";\r\nimport { FilterOptionsService } from \"@services/filterOptions.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport * as angular from \"angular\";\r\nimport copy from \"fast-copy/dist/fast-copy.esm.js\";\r\nimport * as moment from \"moment\";\r\nimport { DashboardServiceV2 } from \"src/app/main/components/dashboardV2/dashboard.service\";\r\nimport { IDashboardWidget } from \"src/app/main/components/dashboardV2/widgets/models/IDashboardWidget\";\r\nimport { IBreadcrumb } from \"../../../_misc/breadcrumbs/breadcrumbs.component\";\r\nimport { IVeriTableRow } from \"../veriTable.component\";\r\nimport \"./drillDownReportTable.scss\";\r\n\r\nexport interface IComponentBindings {\r\n initialReport: IReportDefinition;\r\n initialDrillRow: IReportRow;\r\n filterOptions: IFilterOptions;\r\n}\r\n\r\ninterface IDrillDownReport extends IDataDefinition {\r\n Title: string;\r\n subtitle: string;\r\n clickable: boolean;\r\n\r\n loading: boolean;\r\n}\r\n\r\nclass ComponentController implements angular.IComponentController, IComponentBindings {\r\n title: string;\r\n\r\n initialReport: IDrillDownReport;\r\n displayReport: IDrillDownReport;\r\n\r\n initialDrillRow: IReportRow;\r\n\r\n filterOptions: IFilterOptions;\r\n\r\n reportList: IDrillDownReport[];\r\n\r\n showColumnEditor = false;\r\n\r\n allColumns: IColumnHeader[];\r\n breadcrumbs: IBreadcrumb[];\r\n chartWidgetConfig: IDashboardWidget;\r\n\r\n vehicles: IVehicle[];\r\n drivers: IDriver[];\r\n\r\n reportBreadcrumbs: any;\r\n filters: IFilterOptions;\r\n\r\n loading = false;\r\n\r\n static $inject = [\"$q\", \"$timeout\", \"vehicleService\", \"driverService\", \"dashboardServiceV2\", \"veriDate\", \"dynamicReportService\", \"filterOptionsService\", \"translationService\", \"cameraDisplayService\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $timeout: angular.ITimeoutService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly driverService: DriverService,\r\n private readonly dashboardServiceV2: DashboardServiceV2,\r\n private readonly veriDate: VeriDate,\r\n private readonly dynamicReportService: DynamicReportService,\r\n private readonly filterOptionsService: FilterOptionsService,\r\n private readonly translationService: TranslationService,\r\n private readonly cameraDisplayService: CameraDisplayService\r\n ) {\r\n }\r\n\r\n $onInit() {\r\n // Inefficient, ideally would do this on demand\r\n this.loadRelatedData();\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject): void {\r\n this.reportList = [];\r\n\r\n if (this.initialReport) {\r\n // Create a copy to prevent us making changes to any original\r\n this.initialReport = copy(this.initialReport);\r\n\r\n //console.log(\"Initial report\", this.initialReport.RowDataSource, this.initialReport.SubRowDataSource)\r\n\r\n this.initialReport.Title = this.initialReport.Title || this.translationService.t(\"Common.Report\");\r\n this.title = this.initialReport.Title;\r\n\r\n this.setReportClickable(this.initialReport);\r\n\r\n // If we have no filter options create them from the report parameters\r\n if (!this.filterOptions) {\r\n this.filterOptions = this.filterOptionsService.createFilterOptions(this.initialReport);\r\n }\r\n\r\n this.initialReport.Parameters.Start = this.filterOptions.dateFilter.start\r\n this.initialReport.Parameters.End = this.filterOptions.dateFilter.end;\r\n\r\n // If we have no data, auto collect\r\n if (!this.initialReport.TableDefinition.Rows || this.initialReport.TableDefinition.Rows.length == 0) {\r\n this.loadReportData(this.initialReport).then(report => {\r\n\r\n this.selectReport(report);\r\n });\r\n }\r\n else {\r\n this.selectReport(this.initialReport);\r\n }\r\n\r\n this.$timeout(() => {\r\n this.updateChartData();\r\n }, 300);\r\n }\r\n }\r\n\r\n rowDataSourceChanged(report: IDrillDownReport, $row: ReportTableRowDataSource, $subRow: ReportTableRowDataSource) {\r\n report.RowDataSource = $row;\r\n\r\n this.loadReportData(report);\r\n }\r\n\r\n onBreadcrumbClick(event: any) {\r\n this.selectReport(this.reportList[event.index]);\r\n }\r\n\r\n onRowClicked(report: IDrillDownReport, row: IVeriTableRow, $event: MouseEvent) {\r\n if (this.performCustomClickAction(report, row, $event)) {\r\n return;\r\n }\r\n\r\n this.drillDown(report, row);\r\n }\r\n\r\n onRowsUpdated(rows: IVeriTableRow[]) {\r\n if (this.initialDrillRow) {\r\n const tableRow = rows.find(row => row.data == this.initialDrillRow);\r\n\r\n if (tableRow) {\r\n this.drillDown(this.displayReport, tableRow);\r\n this.initialDrillRow = null;\r\n }\r\n }\r\n }\r\n\r\n toggleShowColumnEditor(forceState?: boolean) {\r\n this.showColumnEditor = !this.showColumnEditor;\r\n\r\n if (forceState !== undefined) {\r\n this.showColumnEditor = forceState;\r\n }\r\n\r\n if (!this.showColumnEditor) {\r\n var reportCopy = copy(this.displayReport);\r\n this.addReportToList(reportCopy);\r\n\r\n this.loadReportData(reportCopy).then(() => {\r\n this.selectReport(reportCopy);\r\n });\r\n }\r\n }\r\n\r\n selectedHeadersChanged(columns: IColumnHeader[]) {\r\n this.displayReport.TableDefinition.Headers = columns;\r\n }\r\n\r\n back() {\r\n this.selectReport(this.reportList[this.reportList.length - 2]);\r\n }\r\n\r\n showCustomView = ReportTableRowDataSource.None;\r\n\r\n toggleCustomView(rowDataSource: ReportTableRowDataSource) {\r\n if (this.showCustomView == rowDataSource) {\r\n this.showCustomView = ReportTableRowDataSource.None;\r\n return;\r\n }\r\n\r\n this.showCustomView = rowDataSource;\r\n }\r\n\r\n // ---\r\n\r\n private performCustomClickAction(report: IDrillDownReport, row: IVeriTableRow, $event: MouseEvent): boolean {\r\n if (!row?.data?.Parameters?.PrimaryReportParameter) {\r\n return false;\r\n }\r\n\r\n switch (row.data.Parameters.PrimaryReportParameter.ParameterType) {\r\n case ReportParameterType.CameraEventId:\r\n this.cameraDisplayService.showVideoPlayerById(row.data.Parameters.PrimaryReportParameter.Value, $event);\r\n return true;\r\n\r\n case ReportParameterType.GeofenceVisitId:\r\n console.log(\"Geofence visit it\", row.data.Parameters.PrimaryReportParameter.Value);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private createBreadcrumbs() {\r\n this.breadcrumbs = this.reportList.map(r => { return { title: r.Title } });\r\n }\r\n\r\n private selectReport(report: IDrillDownReport) {\r\n this.displayReport = report;\r\n\r\n this.title = this.initialReport.Title;\r\n\r\n // Clear out any reports (and thus breadcrumbs) deeper than myself\r\n const index = this.reportList.indexOf(report);\r\n this.reportList.splice(index + 1);\r\n this.addReportToList(this.initialReport/*, false*/);\r\n\r\n this.createBreadcrumbs();\r\n this.createBreadCrumbsFromReportParameters(report.Parameters);\r\n this.filters = this.filterOptionsService.createFilterOptions(report);\r\n }\r\n\r\n // Todo:\r\n // If going from DATE to something, we may need to decide what, i.e. by VEHICLE or by DRIVER?\r\n private drillDown(report: IReportDefinition, row: IVeriTableRow) {\r\n const reportCopy: IDrillDownReport = copy(report);\r\n\r\n this.setNextParameters(reportCopy, row);\r\n this.setNextDrillDownDataSource(reportCopy);\r\n\r\n if (reportCopy.RowDataSource == ReportTableRowDataSource.Journey) {\r\n // Journeys do not have a title column, so remove it and replace with Start and End time\r\n reportCopy.TableDefinition.Headers.splice(0, 1);\r\n reportCopy.TableDefinition.Headers.unshift(this.dynamicReportService.findColumn(\"EndLocation\", \"Journey\", this.allColumns));\r\n reportCopy.TableDefinition.Headers.unshift(this.dynamicReportService.findColumn(\"JourneyEnd\", \"Journey\", this.allColumns));\r\n reportCopy.TableDefinition.Headers.unshift(this.dynamicReportService.findColumn(\"StartLocation\", \"Journey\", this.allColumns));\r\n reportCopy.TableDefinition.Headers.unshift(this.dynamicReportService.findColumn(\"JourneyStart\", \"Journey\", this.allColumns));\r\n reportCopy.TableDefinition.Headers.unshift(this.dynamicReportService.findColumn(\"RowTitle\", \"SharedReport\", this.allColumns));\r\n }\r\n\r\n reportCopy.TableDefinition.Rows = [];\r\n\r\n this.addReportToList(reportCopy);\r\n this.loadReportData(reportCopy).then(() => {\r\n\r\n this.selectReport(reportCopy);\r\n });\r\n }\r\n\r\n private addReportToList(report: IDrillDownReport, generateReportTitle = true) {\r\n\r\n // Check to see if we have this report in here already, based on our data source\r\n const index = this.reportList.findIndex(r => r.RowDataSource == report.RowDataSource);\r\n if (index >= 0) {\r\n this.reportList[index] = report;\r\n }\r\n else {\r\n this.reportList.push(report);\r\n }\r\n\r\n this.createBreadcrumbs();\r\n }\r\n\r\n private getNextDrillDownDataSource(report: IDrillDownReport): ReportTableRowDataSource {\r\n\r\n switch (report.RowDataSource) {\r\n case ReportTableRowDataSource.Week:\r\n return ReportTableRowDataSource.Day;\r\n\r\n case ReportTableRowDataSource.Day:\r\n case ReportTableRowDataSource.VehicleGroup:\r\n return ReportTableRowDataSource.Vehicle;\r\n\r\n case ReportTableRowDataSource.DriverGroup:\r\n return ReportTableRowDataSource.Driver;\r\n\r\n case ReportTableRowDataSource.Vehicle:\r\n case ReportTableRowDataSource.Driver:\r\n return this.determineNextMostLikeleyDataSource(report);\r\n\r\n default:\r\n return ReportTableRowDataSource.None;\r\n }\r\n }\r\n\r\n private setNextDrillDownDataSource(report: IDrillDownReport): void {\r\n\r\n report.RowDataSource = this.getNextDrillDownDataSource(report);\r\n\r\n this.setReportClickable(report);\r\n }\r\n\r\n private setReportClickable(report: IDrillDownReport) {\r\n if (report.SubRowDataSource) {\r\n report.clickable = this.dataSourceSupportsClicking(report.SubRowDataSource);\r\n }\r\n else {\r\n report.clickable = this.dataSourceSupportsClicking(report.RowDataSource);\r\n }\r\n\r\n //console.log(\"setReportClickable\", ReportTableRowDataSource[report.RowDataSource], ReportTableRowDataSource[report.SubRowDataSource])\r\n\r\n }\r\n\r\n private dataSourceSupportsClicking(dataSource: ReportTableRowDataSource): boolean {\r\n\r\n switch (dataSource) {\r\n case ReportTableRowDataSource.Journey:\r\n case ReportTableRowDataSource.Route:\r\n case ReportTableRowDataSource.CommonEvent:\r\n case ReportTableRowDataSource.GeofenceVisits: // remove when adding click logic\r\n //case ReportTableRowDataSource.CameraEvent:\r\n case ReportTableRowDataSource.None:\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private setNextParameters(report: IDrillDownReport, row: IVeriTableRow): void {\r\n //report.Parameters.CustomParameters = [];\r\n\r\n report.Parameters = row.data.Parameters;\r\n }\r\n\r\n private determineNextMostLikeleyDataSource(report: IDrillDownReport): ReportTableRowDataSource {\r\n\r\n if (report.SubRowDataSource) {\r\n return report.SubRowDataSource;\r\n }\r\n\r\n var reportType = ReportTableRowDataSource.None\r\n\r\n var index = 0\r\n\r\n while (reportType === ReportTableRowDataSource.None && index < report.TableDefinition.Headers.length) {\r\n const header = report.TableDefinition.Headers[index];\r\n if (ReportTableRowDataSource[header.ReportType]) {\r\n reportType = ReportTableRowDataSource[header.ReportType];\r\n break;\r\n }\r\n\r\n switch (header.ReportType) {\r\n case \"Tms\":\r\n reportType = ReportTableRowDataSource.Route;\r\n break;\r\n case \"Camera\":\r\n reportType = ReportTableRowDataSource.CameraEvent;\r\n break;\r\n case \"Alcolock\":\r\n reportType = ReportTableRowDataSource.AlcolockRecord;\r\n break;\r\n case \"CommonEvent\":\r\n reportType = ReportTableRowDataSource.CommonEvent;\r\n break;\r\n case \"StationaryLocation\":\r\n reportType = ReportTableRowDataSource.StationaryLocations;\r\n break;\r\n case \"Tacho\":\r\n reportType = ReportTableRowDataSource.TachoRecord;\r\n break;\r\n case \"Temperature\":\r\n reportType = ReportTableRowDataSource.TemperatureRecord;\r\n break;\r\n case \"TemperatureOutOfBounds\":\r\n reportType = ReportTableRowDataSource.TemperatureOutOfBoundsRecord;\r\n break;\r\n case \"VehicleActivity\":\r\n //// Maybe needs to be something else?\r\n reportType = ReportTableRowDataSource.Journey;\r\n break;\r\n }\r\n\r\n index++;\r\n }\r\n\r\n return reportType;\r\n }\r\n\r\n private loadReportData(report: IDrillDownReport): angular.IPromise {\r\n report.TableDefinition.Rows = [];\r\n\r\n report.Parameters.CustomParameters = [\r\n {\r\n ParameterType: ReportParameterType.InclusiveGroupFiltering,\r\n Active: true,\r\n Value: true\r\n },\r\n {\r\n ParameterType: ReportParameterType.ExcludeGpsJourneys,\r\n Active: true,\r\n Value: true\r\n }\r\n ];\r\n\r\n // Clear subrow as its not required for drill downs\r\n //console.log(\"Testy point\", report.SubRowDataSource, ReportTableRowDataSource[report.SubRowDataSource]);\r\n //report.SubRowDataSource = null;\r\n\r\n const reportPromise = this.dashboardServiceV2.populateDataDefinition(report);\r\n const minimumTimeout = this.$timeout(() => { }, 500); // This makes it 'feel' nicer\r\n\r\n this.loading = true;\r\n\r\n return this.$q.all([reportPromise, minimumTimeout])\r\n .then(([results]) => {\r\n\r\n report.TableDefinition.Rows = results.TableDefinition.Rows;\r\n report.Parameters = results.Parameters;\r\n\r\n // If we have no sub row data source, set to be most likely so we can understand the data type\r\n if (report.SubRowDataSource === null) {\r\n report.SubRowDataSource = this.getNextDrillDownDataSource(report);\r\n }\r\n\r\n return report;\r\n })\r\n .finally(() => {\r\n this.loading = false;\r\n\r\n this.updateChartData();\r\n });\r\n }\r\n\r\n private createParameterString(report: IDrillDownReport): string {\r\n const dateString = this.createDateParameterString(report);\r\n\r\n if (report && report.Parameters.VehicleId) {\r\n const vehicle = this.vehicleService.findVehicle(this.vehicles, report.Parameters.VehicleId);\r\n\r\n if (vehicle) {\r\n return `${vehicle.ShortReg} on ${dateString}`\r\n }\r\n }\r\n\r\n return dateString;\r\n }\r\n\r\n private createDateParameterString(report: IDrillDownReport) {\r\n if (report && report.Parameters.Start && report.Parameters.End) {\r\n if (moment(report.Parameters.Start).isSame(report.Parameters.End, \"day\")) {\r\n return this.veriDate.formatDate(report.Parameters.Start, \"date\");\r\n }\r\n else {\r\n const start = this.veriDate.formatDate(report.Parameters.Start, \"date\");\r\n const end = this.veriDate.formatDate(report.Parameters.End, \"date\");\r\n\r\n return `${start} to ${end}`;\r\n }\r\n }\r\n\r\n return \"\";\r\n }\r\n\r\n private loadRelatedData() {\r\n\r\n const columnPromise = this.dynamicReportService.getDisplayColumnHeaders().then(headers => { this.allColumns = headers; });\r\n const vehiclesPromise = this.vehicleService.getVehicles({ includePeripheralMappings: true }).then(vehicles => { this.vehicles = vehicles });\r\n const driversPromise = this.driverService.getDrivers().then(drivers => { this.drivers = drivers });\r\n\r\n this.$q.all([columnPromise, vehiclesPromise, driversPromise]).finally(() => {\r\n });\r\n }\r\n\r\n private updateChartData() {\r\n if (!this.displayReport || !this.chartWidgetConfig) {\r\n return;\r\n }\r\n\r\n this.chartWidgetConfig.dataDefinition = this.displayReport;\r\n this.chartWidgetConfig.onDataDefinitionUpdated();\r\n }\r\n\r\n private createBreadCrumbsFromReportParameters(reportParameters: IReportParameters) {\r\n\r\n this.reportBreadcrumbs = [];\r\n\r\n if (reportParameters.VehicleId) {\r\n var vehicle = this.vehicleService.findVehicle(this.vehicles, reportParameters.VehicleId);\r\n if (vehicle) {\r\n this.reportBreadcrumbs.push({ title: `Vehicle: ${vehicle.ShortReg}` });\r\n }\r\n }\r\n else if (reportParameters.VehicleGroupId) {\r\n this.reportBreadcrumbs.push({ title: \"Vehicles in Group X\" });\r\n }\r\n else if (reportParameters.DriverId) {\r\n var driver = this.driverService.findDriver(this.drivers, reportParameters.DriverId);\r\n if (driver) {\r\n this.reportBreadcrumbs.push({ title: `Driver: ${driver.DisplayName}` });\r\n }\r\n }\r\n else if (reportParameters.DriverGroupId) {\r\n this.reportBreadcrumbs.push({ title: \"Drivers in Group X\" });\r\n }\r\n else {\r\n this.reportBreadcrumbs.push({ title: \"All Vehicles and Drivers\" });\r\n }\r\n\r\n if (this.veriDate.isSameDate(reportParameters.Start, reportParameters.End)) {\r\n this.reportBreadcrumbs.push({ title: this.veriDate.formatDate(reportParameters.Start, \"date\") });\r\n }\r\n else {\r\n var startDate = this.veriDate.formatDate(reportParameters.Start, \"date\");\r\n var endDate = this.veriDate.formatDate(reportParameters.End, \"date\");\r\n\r\n this.reportBreadcrumbs.push({ title: `${startDate} to ${endDate}` });\r\n }\r\n }\r\n}\r\n\r\nexport class DrillDownReportTableComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n transclude: any;\r\n\r\n constructor() {\r\n this.bindings = {\r\n initialReport: \"

    {{$ctrl.title || ('Common.Report' | translate)}}

    {{breadcrumb.title}}
    {{ $ctrl.showCustomView == 0 ? 'View on Events Page' : 'View Table' }} {{ $ctrl.showCustomView == 0 ? 'View on Camera Page' : 'View Table' }}
    1\\\"> chevron_left {{'Common.Back' | translate}} playlist_add {{'DrillDownReportTable.EditColumns' | translate}}
    \";","import { TranslationService } from \"@app/services/translation.service\";\r\nimport { VeriTableService } from \"@directives/_veri/veriTable/veriTable.service\";\r\nimport { ResourceType } from \"@enums/ResourceType\";\r\nimport { SortDirection } from \"@enums/SortDirection\";\r\nimport { SortType } from \"@enums/SortType\";\r\nimport { IGPSLocation } from \"@interfaces/ICoords\";\r\nimport { ColumnDataType } from \"@reports/enums/ColumnDataType\";\r\nimport { ReportTableRowDataSource } from \"@reports/enums/ReportTableRowDataSource\";\r\nimport { IColumnHeader } from \"@reports/models/IColumnHeader\";\r\nimport { IDrivingStyleMetricScore } from \"@reports/models/IDrivingStyleMetricScore\";\r\nimport { IDataDefinition } from \"@reports/models/IReportDefinition\";\r\nimport { IReportRow } from \"@reports/models/IReportRow\";\r\nimport { IMetaDataResourceInformation, IReportRowCell } from \"@reports/models/IReportRowCell\";\r\nimport { CanvasService } from \"@services/canvas.service\";\r\nimport { PopupService } from \"@services/popup.service\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport * as angular from \"angular\";\r\nimport { IVeriTableHeader, IVeriTableRow, IVeriTableRowCell } from \"../veriTable.component\";\r\nimport \"./reportTable.scss\";\r\n\r\nexport interface IComponentBindings {\r\n report: IDataDefinition;\r\n maxRows: number;\r\n clickable: boolean;\r\n showSearch: boolean;\r\n loading: boolean;\r\n\r\n onRowClicked: (args: { row: IVeriTableRow, $event: MouseEvent }) => void;\r\n onRowsUpdated: (args: { rows: IVeriTableRow[] }) => void;\r\n}\r\n\r\nclass ComponentController implements angular.IComponentController, IComponentBindings {\r\n report: IDataDefinition;\r\n clickable: boolean;\r\n showSearch: boolean;\r\n maxRows: number;\r\n loading: boolean;\r\n exportTitle: string;\r\n\r\n onRowClicked: (args: { row: IVeriTableRow, $event: MouseEvent }) => void;\r\n onRowsUpdated: (args: { rows: IVeriTableRow[] }) => void;\r\n\r\n // ---\r\n\r\n tableHeaders: IVeriTableHeader[] = [];\r\n tableRows: IVeriTableRow[] = [];\r\n\r\n sortColumn = 0;\r\n sortDirection = 0;\r\n\r\n hasChildRows = false;\r\n isActualReport = false;\r\n\r\n static $inject = [\"$element\", \"$q\", \"$timeout\", \"canvasService\", \"veriTableService\", \"popupService\", \"veriDate\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly $element: JQuery,\r\n private readonly $q: angular.IQService,\r\n private readonly $timeout: angular.ITimeoutService,\r\n private readonly canvasService: CanvasService,\r\n private readonly veriTableService: VeriTableService,\r\n private readonly popupService: PopupService,\r\n private readonly veriDate: VeriDate,\r\n private readonly translationService: TranslationService\r\n ) {\r\n }\r\n\r\n $onInit() {\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject): void {\r\n if (this.report && onChangesObj[\"report\"]) {\r\n //console.log(\"$onChanges\", onChangesObj);\r\n\r\n this.hasChildRows = this.detectChildRows();\r\n this.isActualReport = this.report[\"ReportType\"] != undefined;\r\n\r\n this.completeWhenFinishedAnimating(null, onChangesObj[\"report\"]?.isFirstChange()).then(() => {\r\n this.createTableContents();\r\n });\r\n }\r\n\r\n if (this.clickable === undefined) {\r\n this.clickable == !!this.onRowClicked;\r\n }\r\n\r\n this.showMap = false;\r\n }\r\n\r\n private completeWhenFinishedAnimating(previousReading: number = null, showLoadingIndicator = false): angular.IPromise {\r\n\r\n var currentTableWidth = this.getTableWidth();\r\n if (previousReading != null && currentTableWidth == previousReading) {\r\n if (showLoadingIndicator) {\r\n this.loading = false;\r\n }\r\n\r\n return this.$q.when();\r\n }\r\n\r\n if (showLoadingIndicator) {\r\n this.loading = true;\r\n }\r\n\r\n return this.$timeout(() => {\r\n return this.completeWhenFinishedAnimating(currentTableWidth, showLoadingIndicator);\r\n }, 50);\r\n }\r\n\r\n private createTableContents() {\r\n this.createHeaders();\r\n this.createRows(this.report);\r\n\r\n this.parseSortingInformation();\r\n }\r\n\r\n // ---\r\n\r\n private getRowDataSourceSortType(rowDataSource: ReportTableRowDataSource): SortType {\r\n\r\n switch (rowDataSource) {\r\n\r\n case ReportTableRowDataSource.Day:\r\n case ReportTableRowDataSource.Week:\r\n case ReportTableRowDataSource.CommonEvent:\r\n return SortType.Date;\r\n\r\n case ReportTableRowDataSource.Journey:\r\n return SortType.Number;\r\n\r\n default:\r\n return SortType.String;\r\n }\r\n }\r\n\r\n private createHeaders() {\r\n this.tableHeaders = [];\r\n\r\n if (!this.isActualReport) {\r\n const title = this.translationService.tEnum(ReportTableRowDataSource, \"ReportTableRowDataSource\", this.report.RowDataSource);\r\n this.tableHeaders.push(this.createTableHeader(title, this.getRowDataSourceSortType(this.report.RowDataSource)));\r\n }\r\n\r\n this.report.TableDefinition.Headers.forEach((columnHeader, columnIndex) => {\r\n if (!columnHeader || columnHeader.Title == \"Row Title\") {\r\n return;\r\n }\r\n\r\n var tableHeader = this.createTableHeader(columnHeader.Title, columnHeader.SortType);\r\n this.tableHeaders.push(tableHeader);\r\n });\r\n\r\n if (this.hasChildRows) {\r\n const title = this.translationService.tEnum(ReportTableRowDataSource, \"ReportTableRowDataSource\", this.report.SubRowDataSource);\r\n var tableHeader = this.createTableHeader(title, this.getRowDataSourceSortType(this.report.SubRowDataSource));\r\n this.tableHeaders.splice(1, 0, tableHeader);\r\n }\r\n }\r\n\r\n private createTableHeader(title: string, sortType: SortType): IVeriTableHeader {\r\n //console.log(\"createTableHeader\", title, sortType);\r\n\r\n return {\r\n title: title,\r\n sortable: true,\r\n sortType: sortType,\r\n className: \"multi-line\"\r\n }\r\n }\r\n\r\n private getTableWidth(): number {\r\n return this.$element[0].getBoundingClientRect().width;\r\n }\r\n\r\n private setColumnWidths() {\r\n var longestWordCount: number[] = [];\r\n var longestWord: string[] = [];\r\n\r\n var longestWordsCalculator = (word: string, index: number) => {\r\n if (!word) {\r\n return;\r\n }\r\n\r\n if (!longestWordCount[index]) {\r\n longestWordCount[index] = 0;\r\n }\r\n\r\n if (word.length > longestWordCount[index]) {\r\n longestWord[index] = word;\r\n longestWordCount[index] = word.length;\r\n }\r\n };\r\n\r\n // Pre populate with header information\r\n const reportTableWidth = this.getTableWidth();\r\n let combinedHeadersWidth = 0;\r\n this.tableHeaders.forEach((header, index) => {\r\n combinedHeadersWidth += this.measureWordSize(header.title);\r\n });\r\n\r\n // Now split if necessary\r\n this.tableHeaders.forEach((header, index) => {\r\n // Todo\r\n // Look at overall report width\r\n // Measure each title, (perhaps we ensure auto width columns count as 150px)\r\n // if we have enough room for all titles then dont split words, else split words\r\n if (combinedHeadersWidth < reportTableWidth) {\r\n longestWordsCalculator(header.title, index);\r\n }\r\n else {\r\n var words = header.title.split(\" \");\r\n words.forEach(word => {\r\n longestWordsCalculator(word, index);\r\n });\r\n }\r\n });\r\n\r\n // Now look at individual cells\r\n this.tableRows.forEach(row => {\r\n\r\n row.cells.forEach((cell, index) => {\r\n longestWordsCalculator(cell.data || cell.contents, index);\r\n });\r\n });\r\n\r\n longestWord.forEach((word, i) => {\r\n var tableHeader = this.tableHeaders[i];\r\n tableHeader.width = this.measureWordSize(word);\r\n });\r\n\r\n // Set auto width columns?!\r\n this.tableHeaders.forEach((header, i) => {\r\n if (i == 0 || header.title == \"Driver\") {\r\n header.width = null;\r\n }\r\n\r\n // If we are including child rows, then we will have a column discrepency to deal with\r\n if (this.tableHeaders.length != this.report.TableDefinition.Headers.length) {\r\n if (i == 1) {\r\n return;\r\n }\r\n else if (i > 1) {\r\n i--;\r\n }\r\n }\r\n\r\n var columnHeader = this.report.TableDefinition.Headers[i];\r\n header.alignRight = this.shouldColumnAlignRight(columnHeader);\r\n\r\n this.forceColumnWidthForType(header, columnHeader);\r\n });\r\n }\r\n\r\n private shouldColumnAlignRight(columnHeader: IColumnHeader) {\r\n\r\n switch (columnHeader?.ColumnDefinition.Type) {\r\n\r\n //case ColumnDataType.Score:\r\n case ColumnDataType.Double:\r\n case ColumnDataType.Int:\r\n return true;\r\n\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n private forceColumnWidthForType(header: IVeriTableHeader, columnHeader: IColumnHeader) {\r\n header.width = this.getColumnWidthForType(header, columnHeader);\r\n }\r\n\r\n private getColumnWidthForType(header: IVeriTableHeader, columnHeader: IColumnHeader) {\r\n switch (columnHeader?.ColumnDefinition.Type) {\r\n\r\n case ColumnDataType.Score:\r\n return 80;\r\n\r\n case ColumnDataType.Location:\r\n return null;\r\n\r\n default:\r\n return header.width;\r\n }\r\n }\r\n\r\n private measureWordSize(word: string) {\r\n const padding = 8 * 2;\r\n const textSize = this.canvasService.getTextWidth(word, \"bold 1.3em roboto\");\r\n let adjustedSize = textSize + padding;\r\n adjustedSize = Math.ceil(adjustedSize / 10);\r\n adjustedSize = adjustedSize * 10;\r\n\r\n return adjustedSize + 20;\r\n }\r\n\r\n private createRows(reportDefinition: IDataDefinition) {\r\n this.tableRows = [];\r\n\r\n const tableDefinition = reportDefinition.TableDefinition;\r\n\r\n if (!tableDefinition.Rows) {\r\n return;\r\n }\r\n\r\n tableDefinition.Rows.forEach((dashboardRow, rowIndex) => {\r\n\r\n if (this.hasChildRows && dashboardRow.ChildRows) {\r\n dashboardRow.ChildRows.forEach((childRow, childRowIndex) => {\r\n var row = this.createTableRow(childRow, reportDefinition.TableDefinition.Headers, rowIndex);\r\n\r\n var newCell = this.createRowCell(tableDefinition.Headers[0], dashboardRow.Cells[0], rowIndex, 0);\r\n row.cells.unshift(newCell);\r\n\r\n this.tableRows.push(row);\r\n });\r\n }\r\n else {\r\n var row = this.createTableRow(dashboardRow, reportDefinition.TableDefinition.Headers, rowIndex);\r\n this.tableRows.push(row);\r\n }\r\n });\r\n\r\n this.setColumnWidths();\r\n }\r\n\r\n private createTableRow(dashboardRow: IReportRow, headers: IColumnHeader[], rowIndex: number): IVeriTableRow {\r\n var cells = this.createTableRowCells(dashboardRow.Cells, headers, rowIndex);\r\n return { cells: cells, data: dashboardRow };\r\n }\r\n\r\n private createTableRowCells(reportRowCells: IReportRowCell[], headers: IColumnHeader[], rowIndex: number): IVeriTableRowCell[] {\r\n var tableCells: IVeriTableRowCell[] = [];\r\n\r\n reportRowCells.forEach((reportRowCell, cellIndex) => {\r\n const header = headers[cellIndex];\r\n\r\n const veriTableRowCell = this.createRowCell(header, reportRowCell, rowIndex, cellIndex);\r\n\r\n tableCells.push(veriTableRowCell);\r\n });\r\n\r\n return tableCells;\r\n }\r\n\r\n private createRowCell(header: IColumnHeader, reportRowCell: IReportRowCell, rowIndex: number, cellIndex: number): IVeriTableRowCell {\r\n if (header.ColumnDefinition.Type == ColumnDataType.Date) {\r\n\r\n return this.veriTableService.createDateTimeCell(reportRowCell.Data);\r\n }\r\n\r\n //if (reportDefinition.RowDataSource == ReportTableRowDataSource.Vehicle && i === 0) {\r\n // cells.push(this.veriTableService.createVehicleRegCell(dashboardRowCell.Data));\r\n // return;\r\n //}\r\n\r\n if (this.report.RowDataSource === ReportTableRowDataSource.Journey && cellIndex === 0) {\r\n reportRowCell.Data = rowIndex + 1;\r\n reportRowCell.Contents = `#${reportRowCell.Data}`;\r\n }\r\n\r\n const veriTableRowCell: IVeriTableRowCell = {\r\n data: reportRowCell.Data,\r\n contents: this.formatContents(reportRowCell),\r\n sortData: reportRowCell.Data,\r\n exportData: reportRowCell.Contents\r\n };\r\n\r\n if (reportRowCell.MetaData) {\r\n const metricScore = reportRowCell.MetaData as IDrivingStyleMetricScore;\r\n const gpsLocation = reportRowCell.MetaData as IGPSLocation;\r\n const resourceInformation = reportRowCell.MetaData as IMetaDataResourceInformation;\r\n\r\n if (resourceInformation && resourceInformation.ResourceId) {\r\n switch (resourceInformation.ResourceType) {\r\n case ResourceType.Vehicle:\r\n return this.veriTableService.createVehicleRegCell(resourceInformation.Resource);\r\n }\r\n }\r\n\r\n if (metricScore.Colour !== undefined) {\r\n return this.veriTableService.createScoreCell(reportRowCell);\r\n }\r\n\r\n if (gpsLocation.Latitude !== undefined && gpsLocation.Longitude !== undefined) {\r\n gpsLocation.LocationString = reportRowCell.Contents;\r\n veriTableRowCell[\"gpsMouseOver\"] = (gpsLocation: IGPSLocation, $event: MouseEvent) => this.showGPSLocationPopup(gpsLocation, $event);\r\n veriTableRowCell.data = gpsLocation;\r\n veriTableRowCell.contents = `${reportRowCell.Contents}`;\r\n\r\n veriTableRowCell.contents = `${reportRowCell.Contents}`\r\n }\r\n }\r\n\r\n return veriTableRowCell;\r\n }\r\n\r\n private formatContents(cell: IReportRowCell): string {\r\n\r\n if (cell.DataSourceValue !== \"RowTitle\" || this.report.RowDataSource !== ReportTableRowDataSource.Day) {\r\n return cell.Contents;\r\n }\r\n\r\n const dataDate = this.veriDate.createMoment(cell.Data);\r\n\r\n if (!dataDate.isValid()) {\r\n return cell.Contents;\r\n }\r\n\r\n return dataDate.format(\"dddd, DD/MM/YYYY\");\r\n }\r\n\r\n private parseSortingInformation() {\r\n this.report.TableDefinition.Headers.forEach((header, i) => {\r\n if (header.Sorted) {\r\n this.sortColumn = i;\r\n this.sortDirection = header.SortAscending ? SortDirection.Ascending : SortDirection.Descending;\r\n }\r\n });\r\n }\r\n\r\n private detectChildRows(): boolean {\r\n var hasChildRows = this.report.TableDefinition.Rows?.some(r => r.HasChildRows);\r\n\r\n //console.log(\"hasChildRows\", hasChildRows);\r\n return hasChildRows;\r\n }\r\n\r\n showMap = false;\r\n gpsLocation: google.maps.LatLngLiteral;\r\n gpsLocationLabel: string;\r\n\r\n private showGPSLocationPopup(gpsLocation: IGPSLocation, $event: MouseEvent) {\r\n this.gpsLocation = { lat: gpsLocation.Latitude, lng: gpsLocation.Longitude };\r\n this.gpsLocationLabel = gpsLocation.LocationString;\r\n this.showMap = true;\r\n return;\r\n\r\n var template = `\r\n \r\n \r\n \r\n `;\r\n\r\n this.popupService.showPopup(template, $event, { label: gpsLocation.LocationString, location: { lat: gpsLocation.Latitude, lng: gpsLocation.Longitude } });\r\n }\r\n}\r\n\r\nexport class ReportTableComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n transclude: any;\r\n\r\n constructor() {\r\n this.bindings = {\r\n report: \" \";","import { BroadcastEvent } from \"@enums/BroadcastEvent\";\r\nimport { IVideoConfigSource } from \"@interfaces/IVideo\";\r\nimport { CanvasService } from \"@services/canvas.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport * as angular from \"angular\";\r\nimport { IOnChangesObject } from \"angular\";\r\nimport Hls from \"hls.js\";\r\nimport { IVideoSectionLoaded } from \"./interfaces/IVideoSectionLoaded\";\r\nimport \"./veriVideo.scss\";\r\n\r\ninterface IVeriVideoComponentBindings {\r\n\r\n onTimeUpdate: (args: { secondsPlayed: number }) => void;\r\n onLoad: () => void;\r\n onCanPlay: () => void;\r\n onPause: () => void;\r\n onPlay: () => void;\r\n onSeeking: (args: { currentTime: number }) => void;\r\n onSeeked: (args: { currentTime: number }) => void;\r\n onSectionLoaded: (args: { sections: IVideoSectionLoaded[] }) => void;\r\n\r\n videoLabel: string;\r\n}\r\n\r\n//interface ICanvasDimensions {\r\n// x: number;\r\n// y: number;\r\n// width: number;\r\n// height: number;\r\n//}\r\n\r\nexport interface IVeriVideoComponent {\r\n play();\r\n pause();\r\n restart();\r\n seek(time: number);\r\n isPlaying(): boolean;\r\n\r\n getDuration();\r\n getCurrentTime(): number;\r\n drawVideoFrame();\r\n}\r\n\r\nclass VeriVideoComponentController implements angular.IComponentController, IVeriVideoComponentBindings, IVeriVideoComponent {\r\n sources: IVideoConfigSource[];\r\n mp4VideoUrl: string;\r\n webmVideoUrl: string;\r\n m3u8VideoUrl: string;\r\n poster: string;\r\n autoplay: boolean;\r\n controls: boolean;\r\n currentposition: number;\r\n streamPaused: boolean;\r\n\r\n videoLabel: string;\r\n\r\n onTimeUpdate: (args: { secondsPlayed: number }) => void;\r\n onLoad: () => void;\r\n onCanPlay: () => void;\r\n onPause: () => void;\r\n onPlay: () => void;\r\n onSeeking: (args: { currentTime: number }) => void;\r\n onSeeked: (args: { currentTime: number }) => void;\r\n onSectionLoaded: (args: { sections: IVideoSectionLoaded[] }) => void;\r\n onError: (args: { error: any }) => void;\r\n\r\n loading: boolean;\r\n loadingProgress: number;\r\n showError: boolean;\r\n\r\n videoElement: JQuery;\r\n videoPlayer: HTMLVideoElement;\r\n videoElementId: number;\r\n\r\n playbackSpeed = 1;\r\n\r\n //canvasDimensions: ICanvasDimensions;\r\n //canvasElement: HTMLCanvasElement;\r\n //canvasContext: CanvasRenderingContext2D;\r\n\r\n lastSecondPlayed = 0;\r\n correctVideoSizeCount = 0;\r\n\r\n rafNumber: number;\r\n\r\n hlsPlayer: Hls;\r\n\r\n static $inject = [\"$timeout\", \"$scope\", \"$sce\", \"$element\", \"canvasService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly $timeout: angular.ITimeoutService,\r\n private readonly $scope: angular.IScope,\r\n private readonly $sce: angular.ISCEService,\r\n private readonly $element: JQuery,\r\n private readonly canvasService: CanvasService,\r\n private readonly translationService: TranslationService ) {\r\n }\r\n\r\n $onChanges(onChangesObj: IOnChangesObject) {\r\n if (onChangesObj[\"currentposition\"] && this.videoElement && this.videoPlayer) {\r\n this.videoPlayer.currentTime = this.currentposition || 0;\r\n }\r\n\r\n if (onChangesObj[\"m3u8VideoUrl\"] && this.m3u8VideoUrl && this.videoElement && this.videoPlayer) {\r\n this.loading = true;\r\n\r\n this.hlsPlayer.loadSource(this.m3u8VideoUrl);\r\n this.hlsPlayer.attachMedia(this.videoPlayer);\r\n }\r\n if (onChangesObj[\"playbackSpeed\"] && this.videoElement && this.videoPlayer) {\r\n this.videoPlayer.playbackRate = this.playbackSpeed;\r\n }\r\n }\r\n\r\n $onInit(): void {\r\n this.sources = [];\r\n\r\n if (this.mp4VideoUrl) {\r\n this.addVideoSource(\"mp4\");\r\n }\r\n\r\n if (this.webmVideoUrl) {\r\n //this.addVideoSource(\"webm\");\r\n }\r\n\r\n this.updateVideo();\r\n\r\n this.$scope.$on(BroadcastEvent.updateVideoSize, () => {\r\n //this.setCanvasSize(true);\r\n });\r\n }\r\n\r\n $onDestroy() {\r\n this.destroyPlayer();\r\n }\r\n\r\n play() {\r\n this.streamPaused = false;\r\n this.videoPlayer.play();\r\n }\r\n\r\n pause() {\r\n this.streamPaused = true;\r\n this.videoPlayer.pause();\r\n if (this.hlsPlayer) {\r\n this.hlsPlayer.stopLoad();\r\n }\r\n }\r\n\r\n restart() {\r\n this.videoPlayer.currentTime = 0;\r\n this.videoPlayer.pause();\r\n\r\n if (this.hlsPlayer) {\r\n this.hlsPlayer.startLoad();\r\n this.startPauseStreamTimer();\r\n }\r\n }\r\n\r\n seek(time: number) {\r\n this.videoPlayer.currentTime = time;\r\n }\r\n\r\n getDuration(): number {\r\n return this.videoPlayer.duration;\r\n }\r\n\r\n getCurrentTime(): number {\r\n //console.log(\"this.videoPlayer.currentTime\", this.videoPlayer.currentTime);\r\n return this.videoPlayer.currentTime;\r\n }\r\n\r\n isPlaying(): boolean {\r\n return !this.videoPlayer.paused;\r\n }\r\n\r\n drawVideoFrame() {\r\n //if (!this.canvasContext) {\r\n // return;\r\n //}\r\n\r\n //this.canvasContext.drawImage(this.videoPlayer, this.canvasDimensions.x, this.canvasDimensions.y, this.canvasDimensions.width, this.canvasDimensions.height);\r\n }\r\n\r\n\r\n // --------------------------------------------\r\n\r\n private addVideoSource(contentType: string) {\r\n\r\n //src:\"https://veruatstorage.file.core.windows.net/commonfiles/37/Videos/db5a4aa6-957e-408a-bc02-45bbec686d28.mp4?sv=2018-03-28&sr=f&sig=6UKX7ctli9uXZjWnwRNixnSbJailPOvlvrdT4L2cKwg%3D&se=2019-11-01T14%3A30%3A49Z&sp=r&rscc=no-cache%2C%20no-store%2C%20must-revalidate\",// this.$sce.trustAsResourceUrl(this.videoUrl),\r\n\r\n this.sources.push({\r\n src: this.$sce.trustAsResourceUrl(this.mp4VideoUrl),\r\n type: `video/${contentType}`,\r\n contentType: contentType\r\n });\r\n }\r\n\r\n private setupStreamPlayer() {\r\n //if (Hls.isSupported()) {\r\n // return;\r\n //}\r\n\r\n this.destroyPlayer();\r\n\r\n this.hlsPlayer = new Hls({\r\n debug: true,\r\n enableWebVTT: false,\r\n liveDurationInfinity: true,\r\n //hlsse\r\n //capLevelToPlayerSize\r\n //liveSyncDurationCount: 3,\r\n autoStartLoad: true,\r\n enableWorker: true,\r\n capLevelToPlayerSize: true,\r\n //capLevelController: true,\r\n startFragPrefetch: true,\r\n fragLoadingTimeOut: 60 * 1000 // 5 s timeout\r\n });\r\n\r\n this.hlsPlayer.attachMedia(this.videoPlayer);\r\n\r\n this.hlsPlayer.on(Hls.Events.MEDIA_ATTACHED, () => {\r\n console.log(\"MEDIA_ATTACHED\");\r\n\r\n if (this.m3u8VideoUrl) {\r\n //this.m3u8VideoUrl = this.m3u8VideoUrl.replace(\"substream\", \"main\");\r\n //this.m3u8VideoUrl = this.m3u8VideoUrl.replace(\"9100\", \"9105\");\r\n //var old = this.m3u8VideoUrl;\r\n //this.m3u8VideoUrl = \"https://mydvr.live:9100/play/0099003A92/1/20200616135555_20200616145742_main.m3u8\";\r\n //this.m3u8VideoUrl = \"https://mydvr.live:9100/play/0088021CC4/2/20200615080123_20200615090123_main.m3u8\";\r\n\r\n //console.log(\" YOYOYOYOYOY\", old, this.m3u8VideoUrl);\r\n\r\n //console.warn(\"playback url\", this.m3u8VideoUrl);\r\n\r\n //console.log(\"time china\", 20200616145742 - 20200616135555)\r\n //console.log(\"time uk\", 20200615090123 - 20200615080123)\r\n\r\n // https://mydvr.live:9100/play/0088021CC4/6/20200615080123_20200615080323_substream.m3u8\r\n // https://mydvr.live:9100/play/0099003A92/1/20200616135555_20200616145742_main.m3u8\r\n }\r\n\r\n this.hlsPlayer.loadSource(this.m3u8VideoUrl);\r\n });\r\n\r\n this.hlsPlayer.on(Hls.Events.MANIFEST_PARSED, (event, data) => {\r\n console.log(\"MANIFEST_PARSED\", event, data);\r\n console.log(\"manifest loaded, found \" + data.levels.length + \" quality level\");\r\n\r\n this.videoPlayer.play();\r\n\r\n console.log(\"levels\", this.hlsPlayer.levels /*this.hlsPlayer.levels this.hlsPlayer.levels*/);\r\n });\r\n\r\n //this.startPauseStreamTimer();\r\n\r\n this.hlsPlayer.once(Hls.Events.FRAG_LOADED, () => {\r\n console.log(\"---LOADEWD\");\r\n //this.videoPlayer.play();\r\n this.startPauseStreamTimer();\r\n });\r\n\r\n this.hlsPlayer.on(Hls.Events.ERROR, (event, data) => {\r\n //console.log('%c Oh my heavens! ', 'background: #eee; color: #bada55', event);\r\n\r\n if (data.fatal) {\r\n switch (data.type) {\r\n case Hls.ErrorTypes.NETWORK_ERROR:\r\n // try to recover network error\r\n console.log(\"fatal network error encountered, try to recover\");\r\n this.hlsPlayer.startLoad();\r\n break;\r\n\r\n case Hls.ErrorTypes.MEDIA_ERROR:\r\n console.log(\"fatal media error encountered, try to recover\");\r\n this.hlsPlayer.recoverMediaError();\r\n break;\r\n\r\n default:\r\n // cannot recover\r\n this.hlsPlayer.destroy();\r\n if (this.onError) {\r\n this.onError({ error: data });\r\n }\r\n\r\n this.videoElement.remove();\r\n this.showError = true;\r\n break;\r\n }\r\n }\r\n });\r\n\r\n //this.hlsPlayer.on(Hls.Events.ERROR, (event, data) => {\r\n // console.log(\"ERROR\", event, data);\r\n\r\n // if (data.fatal) {\r\n // if (this.onError) {\r\n // this.onError({ error: data });\r\n // }\r\n\r\n // this.videoElement.remove();\r\n // this.showError = true;\r\n // }\r\n //});\r\n }\r\n\r\n private startPauseStreamTimer() {\r\n\r\n this.$timeout(() => {\r\n this.pause();\r\n }, 60 * 1000);\r\n }\r\n\r\n private updateFakeLoadingProgress() {\r\n\r\n this.$timeout(() => {\r\n this.loadingProgress += 1;\r\n //console.log(\"this.loadingProgress\", this.loadingProgress);\r\n\r\n if (this.loading && this.loadingProgress < 100) {\r\n this.updateFakeLoadingProgress();\r\n }\r\n }, 100);\r\n }\r\n\r\n private updateVideo() {\r\n this.loading = true;\r\n this.loadingProgress = 0;\r\n this.updateFakeLoadingProgress();\r\n\r\n let controlsMarkup = \"\";\r\n if (this.controls) {\r\n controlsMarkup = \"controls='controls'\";\r\n }\r\n\r\n let autoplayMarkup = \"\";\r\n if (this.autoplay) {\r\n autoplayMarkup = \"autoplay\";\r\n }\r\n\r\n this.videoElementId = Math.floor(Math.random() * 1000);\r\n\r\n // Note this is artififically muted for now\r\n // For video to play sound remove muted attribute\r\n var videoHtml = ``;\r\n\r\n this.$element.append(videoHtml);\r\n this.videoElement = this.$element.find(\"video\");\r\n this.videoPlayer = this.videoElement[0] as HTMLVideoElement;\r\n\r\n if (this.m3u8VideoUrl) {\r\n console.log(\"this.m3u8VideoUrl\", this.m3u8VideoUrl)\r\n this.setupStreamPlayer();\r\n }\r\n\r\n this.videoElement.on(\"loadedmetadata\", () => {\r\n // Add our player canvas\r\n //this.setCanvasSize();\r\n\r\n //this.canvasElement = this.canvasService.createHiDPICanvas(this.canvasDimensions.width, this.canvasDimensions.height);\r\n //this.canvasContext = this.canvasElement.getContext(\"2d\");\r\n //this.$element.append(this.canvasElement);\r\n\r\n if (this.onLoad) {\r\n this.$scope.$applyAsync(() => {\r\n this.onLoad();\r\n });\r\n }\r\n\r\n this.loading = false;\r\n });\r\n\r\n this.videoElement.on(\"canplay\", () => {\r\n // console.log(\"Can play\");\r\n\r\n //this.setCanvasSize();\r\n\r\n if (this.onCanPlay) {\r\n this.$scope.$applyAsync(() => {\r\n this.onCanPlay();\r\n });\r\n }\r\n });\r\n\r\n this.videoElement.on(\"play\", (event) => {\r\n if (this.onPlay) {\r\n this.$scope.$applyAsync(() => {\r\n this.onPlay();\r\n });\r\n }\r\n });\r\n\r\n this.videoElement.on(\"pause\", (event) => {\r\n if (this.onPause) {\r\n this.$scope.$applyAsync(() => {\r\n this.onPause();\r\n });\r\n }\r\n });\r\n\r\n this.videoElement.on(\"seeked\", (event) => {\r\n //console.log(\"Video seek end\");\r\n\r\n if (this.onSeeked) {\r\n this.$scope.$applyAsync(() => {\r\n var currentTime = this.getCurrentTime();\r\n this.onSeeked({ currentTime: currentTime });\r\n });\r\n }\r\n });\r\n\r\n this.videoElement.on(\"seeking\", (event) => {\r\n //this.drawVideoFrame();\r\n\r\n //console.log(\"Video seeking\");\r\n if (this.onSeeking) {\r\n this.$scope.$applyAsync(() => {\r\n var currentTime = this.getCurrentTime();\r\n this.onSeeking({ currentTime: currentTime });\r\n });\r\n }\r\n });\r\n\r\n this.videoElement.on(\"progress\", (event) => {\r\n var seekable: TimeRanges = (this.videoPlayer as any).buffered;\r\n var sections: IVideoSectionLoaded[] = [];\r\n\r\n for (var si = 0; si < seekable.length; si++) {\r\n var startSecond = seekable.start(si);\r\n var endSecond = seekable.end(si);\r\n\r\n sections.push({ startSecond: startSecond, endSecond: endSecond });\r\n }\r\n\r\n if (this.onSectionLoaded && sections.length) {\r\n this.$scope.$applyAsync(() => {\r\n this.onSectionLoaded({ sections: sections });\r\n });\r\n }\r\n });\r\n }\r\n\r\n private destroyPlayer() {\r\n if (!this.hlsPlayer) {\r\n return;\r\n }\r\n\r\n this.hlsPlayer.detachMedia();\r\n this.hlsPlayer.destroy();\r\n }\r\n\r\n //private setCanvasSize(reset = false) {\r\n // if (reset) {\r\n // this.correctVideoSizeCount = 0;\r\n // }\r\n\r\n // var currentSize = angular.copy(this.canvasDimensions);\r\n\r\n // var videoWidth = (this.videoElement[0] as any).videoWidth;\r\n // var videoHeight = (this.videoElement[0] as any).videoHeight;\r\n\r\n // // scale to fit\r\n // var containerWidth = this.$element[0].offsetWidth;\r\n // var containerHeight = this.$element[0].offsetHeight;\r\n\r\n // var widthRatio = videoWidth / containerWidth;\r\n // var heightRatio = videoHeight / containerHeight;\r\n\r\n // var scaleByWidth = widthRatio < heightRatio;\r\n\r\n // var adjustedWidth = scaleByWidth ? videoWidth / widthRatio : videoWidth / heightRatio;\r\n // var adjustedHeight = scaleByWidth ? videoHeight / widthRatio : videoHeight / heightRatio;\r\n\r\n // videoWidth = adjustedWidth;\r\n // videoHeight = adjustedHeight;\r\n\r\n // var videoX = (containerWidth - videoWidth) / 2;\r\n // var videoY = (containerHeight - videoHeight) / 2;\r\n\r\n // this.canvasDimensions = {\r\n // x: videoX,\r\n // y: videoY,\r\n // width: videoWidth,\r\n // height: videoHeight\r\n // };\r\n\r\n // this.canvasService.setCanvasDimensions(this.canvasElement, this.canvasContext, this.canvasDimensions.width, this.canvasDimensions.height);\r\n\r\n // var isCorrectSize = containerHeight != 0 && angular.equals(this.canvasDimensions, currentSize);\r\n // if (isCorrectSize) {\r\n // this.correctVideoSizeCount++;\r\n // }\r\n\r\n // var timeoutValue = 50;\r\n // if (this.correctVideoSizeCount <= 1000 / timeoutValue) {\r\n // this.$timeout(() => {\r\n // this.setCanvasSize();\r\n // }, timeoutValue);\r\n // }\r\n //}\r\n}\r\n\r\nexport class VeriVideoComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n require: { [index: string]: string; };\r\n\r\n constructor() {\r\n this.bindings = {\r\n sources: \"<\",\r\n poster: \"<\",\r\n controls: \"<\",\r\n mp4VideoUrl: \"
    {{'veriVideo.connectingToVideo' | translate}}
    {{'veriVideo.restart' | translate}}
    {{$ctrl.videoLabel}}
    \";","import { downgradeComponent } from \"@angular/upgrade/static\";\r\nimport * as angular from \"angular\";\r\nimport { ActiveRangeBarChartComponent } from \"./activeRangeBarChart/active-range-bar-chart.component\";\r\nimport { BarChartComponent } from \"./barChart/barChart.component\";\r\nimport { DriverActivityGanttComponent } from \"./ganttChart/ganttChart.component\";\r\nimport { HorizontalBarChartComponent } from \"./horizontalBarChart/horizontalBarChart.component\";\r\nimport { ListogramComponent } from \"./listogram/listogram.component\";\r\nimport { RagRangeBarChartComponent } from \"./ragRangeBarChart/ragRangeBarChart.component\";\r\n\r\nangular\r\n .module(\"app.visualisations\", [])\r\n .component(\"ragRangeBarChart\", new RagRangeBarChartComponent())\r\n .component(\"ganttChart\", new DriverActivityGanttComponent())\r\n .component(\"barChart\", new BarChartComponent())\r\n .component(\"horizontalBarChart\", new HorizontalBarChartComponent())\r\n .component(\"listogram\", new ListogramComponent())\r\n\r\n .directive(\"activeRangeBarChart\", downgradeComponent({ component: ActiveRangeBarChartComponent }))\r\n ;\r\n","\r\nimport * as angular from \"angular\";\r\n\r\nimport \"./barChart.scss\";\r\n\r\nexport interface IBarChartBar {\r\n label: string;\r\n count: number;\r\n height: number;\r\n className?: string\r\n bgColor?: string;\r\n}\r\n\r\ninterface IComponentBindings {\r\n bars: IBarChartBar[];\r\n useBarThresholds: boolean;\r\n}\r\n\r\nclass ComponentController implements angular.IComponentController, IComponentBindings {\r\n bars: IBarChartBar[];\r\n useBarThresholds: boolean;\r\n\r\n maxValue = 0;\r\n\r\n static $inject = [];\r\n\r\n constructor() {\r\n }\r\n\r\n $onInit(): void {\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n this.updateMaxValue();\r\n this.updateBarHeights();\r\n }\r\n\r\n // ---\r\n\r\n private updateMaxValue() {\r\n\r\n this.maxValue = 0;\r\n this.bars.forEach(bar => {\r\n this.maxValue = Math.max(this.maxValue, bar.count);\r\n });\r\n }\r\n\r\n private updateBarHeights() {\r\n\r\n this.bars.forEach(bar => {\r\n bar.height = bar.count / this.maxValue * 100;\r\n\r\n if (this.useBarThresholds) {\r\n if (bar.height > 75) { bar.className = \"red-bg\"; }\r\n else if (bar.height > 50) { bar.className = \"orange-bg\"; }\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport class BarChartComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n transclude: boolean | { [index: string]: string; };\r\n\r\n constructor() {\r\n this.bindings = {\r\n bars: \"<\",\r\n useBarThresholds: \"<\"\r\n };\r\n\r\n this.transclude = true;\r\n this.controller = ComponentController;\r\n this.template = require(\"./barChart.html\");\r\n }\r\n}\r\n","module.exports = \"
    {{bar.count}}
    {{bar.label}}
    \";","\r\nimport * as angular from \"angular\";\r\nimport * as moment from \"moment\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport \"./ganttChart.scss\";\r\n\r\nexport interface IGanttEventIcon {\r\n labelClass?: string;\r\n labelContent?: string;\r\n}\r\n\r\nexport interface IGanttEvent {\r\n startUtc: moment.Moment;\r\n endUtc?: moment.Moment;\r\n\r\n startPercentage?: number;\r\n widthPercentage?: number;\r\n\r\n icon?: IGanttEventIcon;\r\n className?: string;\r\n\r\n highlighted?: boolean; \r\n\r\n data?: any;\r\n}\r\n\r\nexport interface IGanttSeries {\r\n title: string;\r\n className?: string;\r\n events: IGanttEvent[];\r\n isIconSeries?: boolean;\r\n}\r\n\r\n//export interface ITimeSeriesObject {\r\n// boundingRect: DOMRect | ClientRect;\r\n//}\r\n\r\n//export class TimeSeriesService {\r\n// createTimeMapping($element: HTMLElement): ITimeSeriesObject {\r\n\r\n// var timeSeriesObject: ITimeSeriesObject = {\r\n// boundingRect: $element.getBoundingClientRect()\r\n// };\r\n\r\n// return timeSeriesObject;\r\n// }\r\n//}\r\n\r\nclass DriverActivityGanttController implements angular.IComponentController {\r\n\r\n ganttSeries: IGanttSeries[] = []; // rename to display series?\r\n timeSeries: { startPercentage: number, time: moment.Moment, hide?: boolean }[] = [];\r\n\r\n minTime: moment.Moment;\r\n maxTime: moment.Moment;\r\n\r\n showIndicator = false;\r\n sidePadding = 32;\r\n labelWidth = 100;\r\n elementClientX: number;\r\n indicatorX: number;\r\n indicatorTime: moment.Moment;\r\n minutesPerPixel: number;\r\n\r\n showNoDataMessage: boolean;\r\n\r\n onMousemove: (args: { time: moment.Moment }) => void;\r\n onMouseClick: (args: { time: moment.Moment }) => void;\r\n\r\n private throttleMouseMove: ($event: MouseEvent) => void;\r\n\r\n static $inject = [\"$element\", \"veriDate\", \"$throttle\"];\r\n\r\n constructor(\r\n private readonly $element: JQLite,\r\n private readonly veriDate: VeriDate,\r\n private readonly $throttle: any) {\r\n\r\n //this.debounceMouseMove = this.debounceService.debounce(($event: MouseEvent) => { this.mousemove($event, false); }, 10, true);\r\n this.throttleMouseMove = this.$throttle(($event: MouseEvent) => { this.mousemove($event, false); }, 10);\r\n }\r\n\r\n $onInit(): void {\r\n this.elementClientX = this.$element[0].getBoundingClientRect().left;\r\n //console.log(this.$element[0].clientLeft/*.clientLeft, this.$element[0].offsetLeft*/);\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject): void {\r\n this.labelWidth = this.labelWidth || 100;\r\n\r\n if (onChangesObj[\"labelWidth\"] && this.ganttSeries) {\r\n this.calculateMinMaxTime();\r\n }\r\n\r\n if (onChangesObj[\"ganttSeries\"] && this.ganttSeries) {\r\n\r\n this.processUpdate();\r\n }\r\n }\r\n\r\n mousemove($event: MouseEvent, requiresDebounce = true) {\r\n\r\n if (requiresDebounce) {\r\n this.throttleMouseMove($event);\r\n return;\r\n }\r\n\r\n var newTime = this.getEventIndicatorTime($event);\r\n if (!newTime) {\r\n return;\r\n }\r\n\r\n this.indicatorTime = newTime;\r\n\r\n this.showIndicator =\r\n this.indicatorTime.isSameOrAfter(this.minTime /*this.timeSeries[0].time*/) &&\r\n this.indicatorTime.isSameOrBefore(this.maxTime/*this.timeSeries[this.timeSeries.length - 1].time*/);\r\n\r\n if (this.onMousemove) {\r\n this.onMousemove({ time: this.indicatorTime });\r\n }\r\n }\r\n\r\n mouseClick($event: MouseEvent) {\r\n var clickTime = this.getEventIndicatorTime($event);\r\n\r\n this.indicatorTime = clickTime || this.indicatorTime;\r\n\r\n if (this.onMouseClick) {\r\n this.onMouseClick({ time: this.indicatorTime });\r\n }\r\n }\r\n\r\n mouseleave($event: MouseEvent) {\r\n this.showIndicator = false;\r\n }\r\n\r\n // -------------------------\r\n\r\n private getEventIndicatorTime($event: MouseEvent): moment.Moment {\r\n var roundedMouseX = Math.round($event.clientX - this.elementClientX);\r\n if (roundedMouseX == this.indicatorX) {\r\n return null;\r\n }\r\n\r\n this.indicatorX = roundedMouseX /*+ sidePadding*/;\r\n const timePosition = this.indicatorX - this.labelWidth - this.sidePadding;\r\n return this.minTime.clone().add(this.minutesPerPixel * timePosition, \"m\");\r\n }\r\n\r\n private reset() {\r\n this.timeSeries = [];\r\n this.minTime = null;\r\n this.maxTime = null;\r\n }\r\n\r\n private processUpdate() {\r\n\r\n this.reset();\r\n\r\n if (this.ganttSeries.length == 0) {\r\n return;\r\n }\r\n\r\n this.calculateTimeSeries();\r\n this.postProcessGanttEvents();\r\n }\r\n\r\n private calculateTimeSeries() {\r\n this.calculateMinMaxTime();\r\n\r\n this.timeSeries = [];\r\n const graphDurationMins = this.maxTime.diff(this.minTime, \"m\", true);\r\n\r\n let roundTo = 60;\r\n if (graphDurationMins < 60) {\r\n roundTo = 15;\r\n }\r\n else if (graphDurationMins < 120) {\r\n roundTo = 30;\r\n }\r\n\r\n const intervals = Math.floor(graphDurationMins / roundTo);\r\n const currentSeriesTime = this.minTime.clone();\r\n\r\n this.veriDate.roundDate(currentSeriesTime, roundTo, true);\r\n\r\n if (intervals > 2) {\r\n for (let i = 0; i <= intervals; i++) {\r\n this.timeSeries.push({ startPercentage: 0, time: currentSeriesTime.clone() });\r\n currentSeriesTime.add(roundTo, \"m\");\r\n }\r\n }\r\n\r\n if (this.timeSeries.length === 0) {\r\n this.timeSeries.push({ startPercentage: 0, time: this.minTime.clone() });\r\n this.timeSeries.push({ startPercentage: 0, time: this.maxTime.clone() });\r\n }\r\n\r\n // If we have lots of time series then hide them for a better view\r\n if (this.timeSeries.length > 7) {\r\n this.timeSeries.forEach((t, i) => {\r\n if (i % 2 != 0) {\r\n t.hide = true;\r\n }\r\n });\r\n }\r\n }\r\n\r\n private calculateMinMaxTime() {\r\n\r\n for (var gi = 0; gi < this.ganttSeries.length; gi++) {\r\n const series = this.ganttSeries[gi];\r\n\r\n if (!series.events) {\r\n console.error(\"Gantt Series contains NULL events - requires an empty array\");\r\n series.events = [];\r\n }\r\n\r\n for (var ei = 0; ei < series.events.length; ei++) {\r\n const event = series.events[ei];\r\n if (event.startUtc) {\r\n if (!this.minTime || event.startUtc.isBefore(this.minTime)) {\r\n this.minTime = event.startUtc;\r\n }\r\n }\r\n\r\n if (event.endUtc) {\r\n if (!this.maxTime || event.endUtc.isAfter(this.maxTime)) {\r\n this.maxTime = event.endUtc;\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.showNoDataMessage = false;\r\n\r\n if (!this.minTime || !this.maxTime) {\r\n //console.error(\"GanttChat: No min or max time, setting defaults\");\r\n this.minTime = moment();\r\n this.maxTime = moment().add(1, \"h\");\r\n this.showNoDataMessage = true;\r\n }\r\n else {\r\n //console.log(this.minTime.format(), this.maxTime.format());\r\n }\r\n\r\n var adjustedWidth = this.$element[0].offsetWidth - this.labelWidth - (this.sidePadding * 2);\r\n this.minutesPerPixel = this.maxTime.diff(this.minTime, \"m\") / adjustedWidth;\r\n //console.log(\"minutesPerPixel\", this.$element[0].offsetWidth, this.minutesPerPixel, this.maxTime.diff(this.minTime, \"m\"));\r\n //console.log(\"adustedwidth\", adjustedWidth, this.labelWidth);\r\n }\r\n\r\n private postProcessGanttEvents() {\r\n const graphDurationSecs = this.maxTime.diff(this.minTime, \"s\");\r\n\r\n const percentPerSec = 100 / graphDurationSecs;\r\n\r\n for (var gi = 0; gi < this.ganttSeries.length; gi++) {\r\n const series = this.ganttSeries[gi];\r\n\r\n for (var ei = 0; ei < series.events.length; ei++) {\r\n const event = series.events[ei];\r\n\r\n if (!event.endUtc) {\r\n event.endUtc = this.maxTime;\r\n }\r\n\r\n if (event.startUtc && event.endUtc) {\r\n event.startPercentage = event.startUtc.diff(this.minTime, \"s\") * percentPerSec;\r\n event.widthPercentage = event.endUtc.diff(event.startUtc, \"s\") * percentPerSec;\r\n }\r\n }\r\n }\r\n\r\n this.timeSeries.forEach(series => {\r\n series.startPercentage = series.time.diff(this.minTime, \"s\") * percentPerSec;\r\n });\r\n }\r\n}\r\n\r\nexport class DriverActivityGanttComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n\r\n constructor() {\r\n this.bindings = {\r\n labelWidth: \"<\",\r\n ganttSeries: \"<\",\r\n onMousemove: \"&\",\r\n onMouseClick: \"&\"\r\n };\r\n\r\n this.controller = DriverActivityGanttController;\r\n this.template = require(\"./ganttChart.html\");\r\n }\r\n}\r\n","module.exports = \"
    {{::series.title}}
    x
    {{$ctrl.indicatorTime | veriDate : 'time'}}
    {{ 'Common.NoData' | translate}}
    \";","\r\nimport * as angular from \"angular\";\r\n\r\nimport \"./horizontalBarChart.scss\";\r\n\r\ninterface IHorizontalBarChartBindings {\r\n percentage: number;\r\n value: number;\r\n maxValue: number;\r\n className: string;\r\n showValue: boolean;\r\n}\r\n\r\nclass HorizontalBarChartComponentController implements angular.IComponentController, IHorizontalBarChartBindings {\r\n percentage: number;\r\n\r\n value: number;\r\n maxValue: number;\r\n className: string;\r\n showValue: boolean;\r\n\r\n static $inject = [];\r\n\r\n constructor() {\r\n }\r\n\r\n $onInit(): void {\r\n this.maxValue = 100;\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n\r\n if (onChangesObj[\"value\"] && this.value || onChangesObj[\"maxValue\"] && this.maxValue) {\r\n this.percentage = this.value * 100 / this.maxValue;\r\n this.percentage = Math.min(100, this.percentage);\r\n }\r\n }\r\n}\r\n\r\nexport class HorizontalBarChartComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n transclude: boolean | { [index: string]: string; };\r\n\r\n constructor() {\r\n this.bindings = {\r\n percentage: \"<\",\r\n value: \"<\",\r\n maxValue: \"<\",\r\n className: \"@\",\r\n showValue: \"<\"\r\n };\r\n\r\n this.transclude = true;\r\n this.controller = HorizontalBarChartComponentController;\r\n this.template = require(\"./horizontalBarChart.html\");\r\n }\r\n}\r\n","module.exports = \"
    {{$ctrl.value}}
    \";","\r\nimport * as angular from \"angular\";\r\nimport { ColourService } from \"@services/colour.service\";\r\nimport { JourneyService } from \"@services/journey.service\";\r\nimport \"./listogram.scss\";\r\n\r\nexport interface ISummaryHistogram {\r\n id: number;\r\n description: string;\r\n color?: string;\r\n count: number;\r\n duration: number;\r\n percentage: number;\r\n\r\n object?: T;\r\n}\r\n\r\ninterface IListogramComponentBindings {\r\n title: string;\r\n timePeriodTitle: string;\r\n list: ISummaryHistogram[];\r\n maxResults: number;\r\n loading: boolean;\r\n}\r\n\r\nclass ListogramComponentController implements angular.IComponentController, IListogramComponentBindings {\r\n title: string;\r\n timePeriodTitle: string;\r\n list: ISummaryHistogram[];\r\n displayList: ISummaryHistogram[];\r\n maxResults: number;\r\n loading: boolean;\r\n\r\n static $inject = [\"journeyService\", \"colourService\"];\r\n\r\n constructor(\r\n private readonly journeyService: JourneyService,\r\n private readonly colourService: ColourService) {\r\n }\r\n\r\n $onInit() {\r\n this.maxResults = this.maxResults || 3;\r\n //this.loading = true;\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n if (onChangesObj[\"list\"]) {\r\n this.updateColours();\r\n }\r\n }\r\n\r\n private updateColours() {\r\n var listToDisplay = this.list.sort((a, b) => {\r\n return b.duration - a.duration;\r\n });\r\n\r\n this.displayList = [];\r\n listToDisplay.forEach(item => {\r\n\r\n if (item.percentage > 1 && this.displayList.length < this.maxResults) {\r\n this.displayList.push(item);\r\n }\r\n });\r\n\r\n this.displayList.forEach((item, i) => {\r\n item.color = this.colourService.getColour(i, true).solidColour;\r\n });\r\n }\r\n}\r\n\r\nexport class ListogramComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n template: string;\r\n controller: any;\r\n\r\n constructor() {\r\n this.bindings = {\r\n title: \"@\",\r\n timePeriodTitle: \"@\",\r\n list: \"<\",\r\n maxResults: \"<\",\r\n loading: \"<\"\r\n };\r\n\r\n this.controller = ListogramComponentController;\r\n this.template = require(\"./listogram.html\");\r\n }\r\n}\r\n","module.exports = \"
    No data to display
    fiber_manual_record
    {{visit.description}}
    {{visit.duration | minutesToDuration}} ({{visit.percentage | number: 0}}%)
    \";","import * as angular from \"angular\";\r\nimport \"./ragRangeBarChart.scss\";\r\n\r\ninterface IRagBarChartBindings {\r\n upperRagBound: number;\r\n lowerRagBound: number;\r\n hideExample: boolean;\r\n exampleValue: number;\r\n examplePercentage: number;\r\n exampleUnit: string;\r\n exampleNoun: string;\r\n}\r\n\r\nclass RagRangeBarChartComponentController implements angular.IComponentController, IRagBarChartBindings {\r\n\r\n // bindings\r\n upperRagBound: number = 2;\r\n lowerRagBound: number = 4;\r\n upperValue: number = 2;\r\n lowerValue: number = 4;\r\n hideExample: boolean;\r\n exampleValue: number;\r\n examplePercentage: number;\r\n exampleUnit: string;\r\n exampleNoun: string;\r\n\r\n // state\r\n showExample: boolean;\r\n displayPercentage: number;\r\n displayClass: string;\r\n displayLabel: string;\r\n\r\n constructor() { }\r\n\r\n $onInit(): void {\r\n this.render();\r\n }\r\n\r\n $onChanges(): void {\r\n this.render();\r\n }\r\n\r\n // ---\r\n\r\n private render(): void {\r\n this.showExample = !this.hideExample\r\n && !isNaN(this.exampleValue)\r\n && !isNaN(this.examplePercentage)\r\n && isFinite(this.examplePercentage);\r\n\r\n if (!this.showExample) {\r\n return;\r\n }\r\n\r\n this.displayPercentage = Number(this.examplePercentage.toFixed(2));\r\n this.displayClass = this.getExampleClass(this.displayPercentage);\r\n this.displayLabel = (this.exampleUnit === \"%\")\r\n ? `Example of ${this.exampleValue}${this.exampleUnit} ${this.exampleNoun}`\r\n : `Example of ${this.exampleValue} ${this.exampleUnit}`;\r\n }\r\n\r\n private getExampleClass(percentage: number): string {\r\n if (percentage < this.lowerRagBound) {\r\n return \"red\";\r\n }\r\n\r\n if (percentage > this.upperRagBound) {\r\n return \"green\";\r\n }\r\n\r\n return \"amber\";\r\n }\r\n}\r\n\r\nexport class RagRangeBarChartComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n transclude: boolean | { [index: string]: string; };\r\n\r\n constructor() {\r\n this.bindings = {\r\n upperRagBound: \"<\",\r\n lowerRagBound: \"<\",\r\n hideExample: \"
    {{ 'RagRangeBarChart.Amber' | translate }} <= {{ $ctrl.upperRagBound }}%\\\" tooltip-direction=top class=segment ng-style=\\\"{'flex-basis': ($ctrl.upperRagBound - $ctrl.lowerRagBound) + '%'}\\\">
    {{ $ctrl.upperRagBound }}%\\\" tooltip-direction=top class=segment ng-style=\\\"{'flex-basis': 100 - $ctrl.upperRagBound + '%'}\\\">
    {{ $ctrl.displayLabel }}
    \";","import * as angular from \"angular\";\r\nimport { capitalise } from \"./capitalise\";\r\nimport { degreesToCompassTerm } from \"./degreesToCompassTerm\";\r\nimport { enumNames } from \"./enumNames.filter\";\r\nimport { formatNumberFilter } from \"./formatNumber.filter.ajs\";\r\nimport { minutesToDuration } from \"./minutesToDurationFilter\";\r\nimport { positiveFilter } from \"./positive.filter\";\r\nimport { splitPascalCase } from \"./splitPascalCase.filter\";\r\nimport { splitPascalCaseCustom } from \"./splitPascalCaseCustom.filter\";\r\nimport { trustedHtml } from \"./trustedHtml.filter\";\r\nimport { trustedSource } from \"./trustedSource.filter\";\r\nimport { minuteOfDayToTimeFilter } from \"./minuteOfDayToTime.filter\";\r\nimport { formatBytes } from \"./formatBytes.filter\";\r\nimport { translateFilter } from \"./translate.filter.ajs\";\r\nimport { markdownFilter } from \"src/app/filters/markdown.filter\";\r\nimport { phoneNumberFilter } from \"./phoneNumber.filter.ajs\";\r\nimport { unitConversionFilter } from \"src/app/filters/unitConversion.filter.ajs\";\r\nimport { veriDate } from \"./veriDate.filter\";\r\nimport { geocodeFilter } from \"./geocode.filter\";\r\n\r\nangular\r\n .module(\"app.filters\", [])\r\n\r\n .filter(\"formatNumber\", formatNumberFilter)\r\n .filter(\"unitConversion\", [\"unitConversionService\", unitConversionFilter])\r\n .filter(\"capitalise\", capitalise)\r\n .filter(\"enumNames\", enumNames)\r\n .filter(\"minutesToDuration\", [\"veriDate\", minutesToDuration])\r\n .filter(\"positive\", [positiveFilter])\r\n .filter(\"splitPascalCase\", splitPascalCase)\r\n .filter(\"splitPascalCaseCustom\", splitPascalCaseCustom)\r\n .filter(\"trustedHtml\", [\"$sce\", trustedHtml])\r\n .filter(\"trustedSource\", [\"$sce\", trustedSource])\r\n .filter(\"veriDate\", [\"veriDate\", veriDate])\r\n .filter(\"geocode\", [\"geocodeService\", \"translationService\", geocodeFilter])\r\n .filter(\"degreesToCompassTerm\", [\"plotService\", degreesToCompassTerm])\r\n .filter(\"minuteOfDayToTime\", [minuteOfDayToTimeFilter])\r\n .filter(\"translate\", [\"translationService\", translateFilter])\r\n .filter(\"phoneNumberFilter\", phoneNumberFilter)\r\n .filter(\"markdown\", [\"$sce\", markdownFilter])\r\n .filter(\"formatBytes\", [formatBytes]);\r\n","\nimport * as angular from \"angular\";\n\r\nexport function capitalise() {\r\n\r\n return (input: string) => {\r\n return (!!input) ? input.charAt(0).toUpperCase() + input.substr(1).toLowerCase() : \"\";\r\n }\r\n}\n","import * as angular from \"angular\";\r\nimport { PlotService } from \"@services/plot.service\";\r\n\r\nexport function degreesToCompassTerm(plotService: PlotService) {\r\n return (input: number) => {\r\n return plotService.convertDirectionToWords(input);\r\n }\r\n}\r\n","export function formatNumberFilter() {\r\n\r\n return (input: string) => {\r\n\r\n var inputNumber = Number(input);\r\n\r\n if (inputNumber > 1000) {\r\n var thousands = inputNumber / 1000;\r\n thousands = Math.round(thousands * 10) / 10;\r\n return `${thousands}k`;\r\n }\r\n\r\n return input;\r\n }\r\n}\r\n","\nimport * as angular from \"angular\";\nimport { VeriDate } from \"@services/veriDate.service\";\r\n\r\nexport function minutesToDuration(veriDate: VeriDate) {\r\n\r\n return (inputMinutes: number, exceptionValue?: number, exceptionString?: string, shortHand = true) => {\r\n\r\n return veriDate.minutesToDurationString(inputMinutes, exceptionValue, exceptionString, shortHand);\r\n }\r\n}\n","\nimport * as angular from \"angular\";\n\r\nexport function positiveFilter() {\r\n\r\n return (input: number) => {\r\n\r\n if (!input) {\r\n return 0;\r\n }\r\n\r\n return Math.abs(input);\r\n }\r\n}\n","import * as angular from \"angular\";\n\ninterface SplitPascalCaseParams {\n ignoreDigits?: boolean;\r\n}\n\r\nexport function splitPascalCase() {\r\n\r\n return (input: string, params?: SplitPascalCaseParams) => {\n\n if (params?.ignoreDigits) {\n return (!!input)\n ? input.replace(/([A-Z][a-z])/g, \" $1\").trim()\n : \"\";\r\n }\n\r\n return (!!input)\n ? input.replace(/([A-Z][a-z])/g, \" $1\").replace(/(\\d)/g, \" $1\").trim()\n : \"\";\r\n }\r\n}\n","// pascal case input filter to convert text to pascal case - new version created for vehicle types because existing one was not suitable\r\nexport function splitPascalCaseCustom() {\r\n\r\n // this replace function assumes required pattern is 1st matched char + \" \" + 2nd matched char\r\n function replacer(match) {\r\n return match.substr(0, 1) + \" \" + match.substr(1);\r\n }\r\n\r\n // Regex explanation: the first replace is to pre-pend any sequence of uppercase char (A-Z) followed by lower case (a-z) with a space\r\n // the second replace - for any matched pattern (each is pipe delimited, the first pattern selects a numeric digit followed by a letter),\r\n // call the replacer function - which will insert a space between the 2 matched chars\r\n return (input: string) => {\r\n return (!!input)\r\n ? input.replace(/([A-Z][a-z])/g, \" $1\").replace(/([0-9][A-Za-z]|[A-Za-z][0-9]|[a-z][A-Z]|[T][t])/g, replacer).trim()\r\n : \"\";\r\n }\r\n}\r\n","import * as angular from \"angular\";\r\n\r\nexport function trustedHtml($sce) {\r\n\r\n return (url: string) => {\r\n return $sce.trustAsHtml(url);\r\n }\r\n}\r\n","\nimport * as angular from \"angular\";\n\r\nexport function trustedSource($sce) {\r\n\r\n return (url: string) => {\r\n return $sce.trustAsResourceUrl(url);\r\n }\r\n}\r\n","export function minuteOfDayToTimeFilter() {\r\n return (minuteOfDay: number) => {\r\n const minuteOfDayNumber: number = Number(minuteOfDay);\r\n\r\n const hour = Math.floor(minuteOfDayNumber / 60);\r\n const minute = Math.floor(minuteOfDayNumber % 60);\r\n\r\n const hourString = (hour < 10) ? `0${hour}` : `${hour}`;\r\n const minuteString = (minute < 10) ? `0${minute}` : `${minute}`;\r\n\r\n return `${hourString}:${minuteString}`;\r\n }\r\n}\r\n","import { TranslationService } from \"@services/translation.service\";\r\n\r\nexport function translateFilter(translationService: TranslationService ) {\r\n return (input: string, params?: any) => {\r\n return translationService.t(input, params);\r\n }\r\n}\r\n","\r\nimport * as marked from \"marked\";\r\n\r\nexport function markdownFilter($sce: angular.ISCEService) {\r\n\r\n return (input: string) => {\r\n\r\n return $sce.trustAsHtml(marked(input));\r\n }\r\n}\r\n","import { parsePhoneNumberWithError, ParseError } from \"libphonenumber-js/min\";\r\n\r\nexport function phoneNumberFilter() {\r\n return (value: string, params?: any) => {\r\n try {\r\n const phoneNumber = parsePhoneNumberWithError(value);\r\n return phoneNumber.isValid() ? phoneNumber.format('INTERNATIONAL') : value;\r\n } catch (error) {\r\n if (error instanceof ParseError) {\r\n console.log(error.message)\r\n }\r\n return value;\r\n }\r\n }\r\n}\r\n","\r\n\r\nimport { UnitConversionService, UnitConversionType } from \"@services/unitConversion.service\";\r\n\r\nexport function unitConversionFilter(unitConversionService: UnitConversionService) {\r\n\r\n return (input: string, includeUnit?: boolean, conversionTypeString?: string, precision?: number) => {\r\n\r\n let conversionType = UnitConversionType.Speed;\r\n if (conversionTypeString) {\r\n conversionType = unitConversionService.getConversionType(conversionTypeString);\r\n }\r\n\r\n if (includeUnit) {\r\n return unitConversionService.convertUnitWithSuffix(input, conversionType, precision);\r\n }\r\n else {\r\n return unitConversionService.convertUnitWithFormatting(input, conversionType, precision);\r\n }\r\n }\r\n}\r\n","import { VeriDate } from \"@services/veriDate.service\";\r\n\r\nexport function veriDate(veriDate: VeriDate) {\r\n\r\n return (input: string, outputFormat: string) => {\r\n\r\n return veriDate.formatDate(input, outputFormat);\r\n }\r\n}\r\n","import { IPlot } from \"@interfaces/IPlot\";\r\nimport { GeocodeService } from \"@services/geocode.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\n\r\nexport function geocodeFilter(geocodeService: GeocodeService, translationService: TranslationService) {\r\n return (plot: IPlot, isLatLng: boolean) => {\r\n\r\n const failureString = translationService.t('resourceGeofences.FailedToGetLocation');\r\n if (!plot || !plot.LocationInformation) {\r\n return \"N/A\";\r\n }\r\n\r\n let locationString = plot.LocationInformation.LocationDescription;\r\n\r\n if (!locationString) {\r\n\r\n locationString = translationService.t('Common.Updating') + \"...\";\r\n\r\n geocodeService\r\n .getLocationInformationFromPlotId(plot.Id)\r\n .then(location => {\r\n plot.LocationInformation = location;\r\n locationString = plot.LocationInformation.LocationDescription;\r\n })\r\n .catch(() => {\r\n locationString = failureString;\r\n });\r\n }\r\n\r\n return locationString;\r\n };\r\n}\r\n","\r\nimport * as angular from \"angular\";\r\nimport * as moment from \"moment\";\r\nimport \"./index.scss\";\r\nimport { VeriCacheInterceptor } from \"./services/veriCacheInterceptor.service\";\r\nimport { VeriDate } from \"./services/veriDate.service\";\r\nimport { VeriHttpInterceptor } from \"./services/veriHttpInterceptor.service\";\r\n\r\nexport class Config {\r\n\r\n static $inject = [\"$compileProvider\", \"$mdDateLocaleProvider\", \"$mdThemingProvider\", \"$httpProvider\", \"$sceDelegateProvider\", \"apiUrl\", \"reportsApiUrl\", \"isLocalDevelopment\"];\r\n\r\n constructor(\r\n $compileProvider: angular.ICompileProvider,\r\n $mdDateLocaleProvider: angular.material.IDateLocaleProvider,\r\n $mdThemingProvider: angular.material.IThemingProvider,\r\n $httpProvider: angular.IHttpProvider,\r\n $sceDelegateProvider: angular.ISCEDelegateProvider,\r\n apiUrl: string,\n reportsApiUrl: string,\r\n isLocalDevelopment: boolean) {\r\n\n // When all components are angular, disabled angularjs theming with\n // $mdThemingProvider.disableTheming();\n\r\n $mdThemingProvider\r\n .theme(\"default\")\r\n .primaryPalette(\"blue\")\r\n .accentPalette(\"deep-orange\");\n\r\n // set to false for production builds for speed increase\r\n // use angular.reloadWithDebugInfo() to load debug info\r\n var loadDebugInfo = isLocalDevelopment;\r\n if (loadDebugInfo) {\r\n $compileProvider.debugInfoEnabled(loadDebugInfo);\r\n //console.info(\"Debug Info Enabled\");\r\n }\r\n\r\n $mdDateLocaleProvider.formatDate = (date: Date): string => {\r\n // Unless we use $injector at runtime we don\"t have access to the veriDate service here, so lets just create it the old fashioned way\r\n var veriDate = new VeriDate(null);\r\n return veriDate.formatDate(date, \"date\");\r\n }\r\n\r\n $httpProvider.useApplyAsync(true);\r\n\r\n if (!$httpProvider.defaults.headers.get) {\r\n $httpProvider.defaults.headers.get = {};\r\n }\r\n\r\n //disable IE ajax request caching\r\n //$httpProvider.defaults.headers.get[\"If-Modified-Since\"] = \"Mon, 26 Jul 1997 05:00:00 GMT\";\r\n //// extra\r\n //$httpProvider.defaults.headers.get[\"Cache-Control\"] = \"no-cache\";\r\n ////$httpProvider.defaults.headers.get[\"Pragma\"] = \"no-cache\";\r\n //$httpProvider.defaults.cache\r\n\r\n $httpProvider.interceptors.push(VeriHttpInterceptor.Factory);\r\n $httpProvider.interceptors.push(VeriCacheInterceptor.Factory);\r\n\r\n $sceDelegateProvider.resourceUrlWhitelist([\r\n \"self\",\r\n \"http://localhost**\",\n \"http://m.highwaysengland.co.uk**\",\r\n `${apiUrl}**`,\n `${reportsApiUrl}**`\r\n ]);\r\n\r\n /**\r\n * Angular Material dynamically generates Style tags\r\n * based on themes and palletes; for each ng-app.\r\n * Let's disable generation and `;\r\n\r\n //this.printSection.innerHTML = html;\r\n //this.$window.print();\r\n\r\n var printWindow = this.$window.open(\"\");\r\n\r\n $(printWindow.document.body)\r\n .html(html)\r\n .ready(() => {\r\n printWindow.focus();\r\n printWindow.print();\r\n printWindow.close();\r\n });\r\n }\r\n\r\n private printElement(elem: HTMLElement) {\r\n // clones the element you want to print\r\n const domClone = elem.cloneNode(true);\r\n\r\n this.printSection.innerHTML = \"\";\r\n this.printSection.appendChild(domClone);\r\n\r\n this.$window.print();\r\n }\r\n\r\n private afterPrint() {\r\n this.printSection.innerHTML = \"\";\r\n }\r\n}\r\n","\r\nimport * as angular from \"angular\";\r\nimport { IRunBlockRootScope } from \"@interfaces/IRunBlockRootScope\";\r\nimport { BroadcastEvent } from \"../enum/BroadcastEvent\";\r\n\r\nexport class FilterBarService {\r\n\r\n static $inject = [\"$rootScope\"];\r\n\r\n constructor(\r\n private $rootScope: IRunBlockRootScope) {\r\n }\r\n\r\n //public showFilterBar(): void {\r\n // this.$rootScope.$broadcast(BroadcastEvent.showResourceFilterBar, true);\r\n //}\r\n\r\n //public hideFilterBar(): void {\r\n // this.$rootScope.$broadcast(BroadcastEvent.showResourceFilterBar, false);\r\n //}\r\n\r\n public closeFilterBar(): void {\r\n this.$rootScope.$broadcast(BroadcastEvent.closeResourceFilterBar, false);\r\n }\r\n}\r\n","\r\nimport * as angular from \"angular\";\r\n\r\n// Scrolling through report fires a lot of 'scroll' events.\r\n// This has an effect on browser performance. This service, used by the reportDisplayer directive,\r\n// prevents these events being called repeatedly by introducing a 'pause' till the next time the scroll event is called.\r\n// This is called a 'debouncer'.\r\nexport class ThrottleService {\r\n\r\n static $inject = [\"$q\", \"$timeout\"];\r\n\r\n constructor(\r\n private $q: angular.IQService,\r\n private $timeout: angular.ITimeoutService) {\r\n }\r\n\r\n // Create a deferred object that will be resolved when we need to actually call the func\r\n throttle(callback: Function) {\r\n\r\n //return throttled;\r\n var deferred = this.$q.defer();\r\n var timeout: angular.IPromise;\r\n var self = this;\r\n let requestId = null;\r\n\r\n return function () {\r\n const context = self, args = arguments;\r\n\r\n const later = (context, args) => () => {\r\n\r\n deferred.resolve(callback.apply(context, args));\r\n deferred = self.$q.defer();\r\n\r\n // This halves our framerate and further throttles\r\n //requestAnimationFrame(() => {\r\n requestId = null\r\n //});\r\n }\r\n\r\n if ((requestId === null) || (requestId === undefined)) {\r\n requestId = requestAnimationFrame(later(this, args));\r\n }\r\n\r\n return deferred.promise;\r\n };\r\n }\r\n}\r\n","import * as angular from \"angular\";\r\nimport { IGroupUserMapping, IUserDriverMapping, IUserGeofenceMapping, IUserVehicleMapping } from \"@interfaces/IUser\";\r\n\r\n\r\n\r\nexport class UserMappingsService {\r\n\r\n static $inject = [\"$http\"];\r\n\r\n constructor(\r\n private readonly $http: angular.IHttpService,\r\n ) {\r\n }\r\n\r\n getDriverMappings(invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/userMappings/driverMappings`,\r\n method: \"GET\",\r\n params: { minsToLive: 60, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getDriverMappingsByUserId(userId:number,invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/userMappings/driverMappings/${userId}`,\r\n method: \"GET\",\r\n params: { minsToLive: 60, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getVehicleMappings(invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/userMappings/vehicleMappings`,\r\n method: \"GET\",\r\n params: { minsToLive: 60, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getVehicleMappingsByUserId(userId: number, invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/userMappings/vehicleMappings/${userId}`,\r\n method: \"GET\",\r\n params: { minsToLive: 60, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getGeofenceMappings(invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/userMappings/geofenceMappings`,\r\n method: \"GET\",\r\n params: { minsToLive: 60, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getGeofenceMappingsByUserId(userId: number, invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/userMappings/geofenceMappings/${userId}`,\r\n method: \"GET\",\r\n params: { minsToLive: 60, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getGroupMappings(invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/userMappings/groupMappings`,\r\n method: \"GET\",\r\n params: { minsToLive: 60, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getGroupMappingsByUserId(userId: number, invalidateCache = false): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/userMappings/groupMappings/${userId}`,\r\n method: \"GET\",\r\n params: { minsToLive: 60, invalidateCache: invalidateCache }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return response.data;\r\n });\r\n }\r\n\r\n updateUserDriverMappings(userId: number,driverIds:number[]): angular.IPromise {\r\n return this\r\n .$http({\r\n method: \"POST\",\r\n url: `/api/userMappings/driverMappings/${userId}`,\r\n data: driverIds\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return;\r\n });\r\n }\r\n\r\n updateUserVehicleMappings(userId: number, vehicleIds: number[]): angular.IPromise {\r\n return this\r\n .$http({\r\n method: \"POST\",\r\n url: `/api/userMappings/vehicleMappings/${userId}`,\r\n data: vehicleIds\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return;\r\n });\r\n }\r\n\r\n updateUserGeofenceMappings(userId: number, geofenceIds: number[]): angular.IPromise {\r\n return this\r\n .$http({\r\n method: \"POST\",\r\n url: `/api/userMappings/geofenceMappings/${userId}`,\r\n data: geofenceIds\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return;\r\n });\r\n }\r\n\r\n updateUserGroupMappings(userId: number, groupIds: number[]): angular.IPromise {\r\n return this\r\n .$http({\r\n method: \"POST\",\r\n url: `/api/userMappings/groupMappings/${userId}`,\r\n data: groupIds\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n return;\r\n });\r\n }\r\n}\r\n","import { IUserResellerMapping } from \"../main/modules/foundation/_models/IUserResellerMapping\";\r\nimport { IUserResellerMappingQueryOptions } from \"../main/modules/foundation/_models/IUserResellerMappingQueryOptions\";\r\n\r\nexport class UserResellerMappingService {\r\n static $inject = [\"$q\", \"$http\"];\r\n\r\n constructor(private readonly $q: angular.IQService, private readonly $http: angular.IHttpService) { }\r\n\r\n getMappings(options: IUserResellerMappingQueryOptions = {}): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/foundation/userResellerMappings`,\r\n method: \"GET\",\r\n params: { options }\r\n })\r\n .then(response => {\r\n return response.data;\r\n });\r\n }\r\n\r\n getCurrentUserMappings(): angular.IPromise {\r\n return this\r\n .$http({\r\n url: `/api/foundation/userResellerMappings/current`,\r\n method: \"GET\"\r\n })\r\n .then(response => {\r\n return response.data;\r\n });\r\n }\r\n}\r\n","\nimport { TranslationService } from \"@services/translation.service\";\r\nimport * as angular from \"angular\";\r\n//import * as rg4js from 'raygun4js';\r\n\r\nexport class VersionService {\r\n\r\n private localStorageKey = \"valkyrieVersion\";\n\n private firstCheck = true;\r\n\r\n static $inject = [\"$rootScope\", \"$http\", \"$interval\", \"$window\", \"$mdDialog\", \"translationService\"];\r\n\r\n constructor(\n private readonly $rootScope: angular.IRootScopeService,\r\n private readonly $http: angular.IHttpService,\r\n private readonly $interval: angular.IIntervalService,\r\n private readonly $window: angular.IWindowService,\r\n private readonly $mdDialog: angular.material.IDialogService,\n private readonly translationService: TranslationService) {\r\n\r\n this.startVersionMonitoring();\r\n }\r\n\r\n getAPIVersion(): angular.IPromise {\n //console.warn(\"getAPIVersion\");\n\n return this\r\n .$http({\r\n url: \"/api/version\",\r\n method: \"GET\",\r\n cache: true,\r\n params: { minsToLive: 5 * 60 }\r\n })\r\n .then((response: angular.IHttpPromiseCallbackArg) => {\r\n var previousVersion = this.getCachedAPIVersion();\r\n\r\n localStorage.setItem(this.localStorageKey, response.data);\n //rg4js('setVersion', response.data);\n\r\n if (previousVersion != null && previousVersion !== response.data) {\r\n this.showVersionUpdatedNotification(response.data, previousVersion);\r\n }\r\n\n this.firstCheck = false;\n\r\n return response.data;\r\n });\r\n }\r\n\r\n getCachedAPIVersion() {\n return localStorage.getItem(this.localStorageKey);\r\n }\n\n // ---\r\n\r\n private startVersionMonitoring() {\n // Changed from 5min to 60min by CJE 27th June\r\n this.$interval(() => {\r\n this.getAPIVersion();\r\n }, 15 * 60 * 1000);\r\n }\r\n\r\n private showVersionUpdatedNotification(newVersion: string, previousVersion: string) {\n console.warn(`New version detected, gone from ${previousVersion} to ${newVersion}`);\r\n\r\n if (this.firstCheck) {\r\n this.$window.location.reload(true);\r\n return;\r\n }\n\n this.$rootScope.$broadcast(\"versionUpdated\", newVersion, previousVersion);\r\n }\r\n}\n","\r\nimport * as angular from \"angular\";\r\n\r\nimport { IRunBlockRootScope } from \"@interfaces/IRunBlockRootScope\";\r\nimport { SettingsName } from \"../class/SettingsName\";\r\nimport { ConstantsService } from \"./constantsService\";\r\n\r\nexport class WebSocketService {\r\n\r\n connected = false;\r\n apiUrl: string;\n\r\n private listeners: { dataType: string, initialCommand: string, callback: (data: any) => void }[] = [];\r\n\r\n private webSocket: WebSocket;\r\n private autoReconnect;\r\n private loggingEnabled = false;\r\n\r\n private messageQueue: string[] = [];\r\n\r\n static $inject = [\"$rootScope\", \"$q\", \"$timeout\", \"$window\", \"$interval\", \"constantsService\"];\r\n\r\n constructor(\r\n private $rootScope: IRunBlockRootScope,\r\n private $q: angular.IQService,\r\n private $timeout: angular.ITimeoutService,\r\n private $window: angular.IWindowService,\r\n private $interval: angular.IIntervalService,\r\n private constantsService: ConstantsService)\n {\r\n this.apiUrl = this.constantsService.getApiUrl();\r\n // Auto enable logging on localhost\r\n //this.enableLogging(apiUrl.indexOf(\"fleet.\") != 0);\r\n\r\n this.$interval(() => {\r\n this.ping();\r\n }, 60 * 1000);\r\n }\r\n\r\n enableLogging(enabled: boolean) {\r\n this.loggingEnabled = enabled;\r\n }\r\n\r\n open(autoReconnect = true): angular.IPromise {\r\n\r\n return;\r\n this.autoReconnect = autoReconnect;\r\n\r\n let url = this.apiUrl.replace(\"http\", \"ws\");\r\n if (url.indexOf(\"//\") === 0) {\r\n url = `ws:${url}`;\r\n }\r\n\r\n //url += `/api/realtime/?accountId=${this.$rootScope.currentUser.AccountId}`;\r\n url += `/api/realtime/`;\r\n //console.log(url);\r\n\r\n const accessToken = this.$window.sessionStorage.getItem(SettingsName.AccessToken.toString());\r\n\r\n //console.log(\"accessToken\", accessToken.length);\r\n\r\n this.webSocket = new WebSocket(url, accessToken);\r\n\r\n const defer = this.$q.defer();\r\n\r\n this.webSocket.onopen = (ev) => { this.onOpen(ev); defer.resolve(); };\r\n this.webSocket.onclose = (ev) => { this.onClose(ev); defer.reject(); };\r\n this.webSocket.onerror = (ev) => { this.onError(ev); defer.reject(); };\r\n this.webSocket.onmessage = (message) => { this.onMessage(message); };\r\n\r\n defer.promise.catch(angular.noop);\r\n\r\n return defer.promise;\r\n }\r\n\r\n close() {\r\n this.autoReconnect = false;\r\n\r\n if (this.webSocket) {\r\n this.webSocket.close();\r\n this.webSocket = null;\r\n }\r\n }\r\n\r\n send(message: string) {\r\n //this.webSocket.send(command);\r\n this.messageQueue.push(message);\r\n this.sendQueue();\r\n }\r\n\r\n registerListener(dataType: \"PlotDataStream\" | \"MessageDataStream\", callback: (data: T) => void) {\r\n const command = `--command,subscribe:${dataType}`;\r\n\r\n this.send(command);\r\n\r\n this.listeners.push({\r\n dataType: dataType,\r\n initialCommand: command,\r\n callback: callback\r\n });\r\n }\r\n\r\n unregisterListener(dataType: \"PlotDataStream\" | \"MessageDataStream\") {\r\n //console.log(`Websocket unregister for ${dataType}...`);\r\n\r\n const command = `--command,unsubscribe:${dataType}`;\r\n this.send(command);\r\n\r\n let i = this.listeners.length;\r\n while (i--) {\r\n const listener = this.listeners[i];\r\n\r\n if (listener.dataType === dataType) {\r\n this.listeners.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n private sendQueue() {\r\n if (!this.webSocket || this.webSocket.readyState !== 1) {\r\n //console.warn(\"Websocket not ready, delaying send\");\r\n this.logWarning(\"Websocket not ready, delaying send\");\r\n return;\r\n }\r\n\r\n if (this.messageQueue.length > 1) {\r\n this.logWarning(`WS - Sending backlog of ${this.messageQueue.length}`);\r\n }\r\n\r\n this.messageQueue.forEach(message => {\r\n //this.log(\"WS.Send\", message);\r\n this.webSocket.send(message);\r\n });\r\n\r\n this.messageQueue = [];\r\n }\r\n\r\n private onMessage(message: MessageEvent) {\r\n\r\n const parsedData = this.getMessageDataType(message.data);\r\n\r\n const messageObj = JSON.parse(parsedData.data);\r\n\r\n this.listeners.forEach(listener => {\r\n if (listener.dataType == parsedData.dataType) {\r\n listener.callback(messageObj);\r\n }\r\n });\r\n }\r\n\r\n private getMessageDataType(message: string): { dataType: string, data: string } {\r\n if (message.indexOf(\"--dataType:\") === 0) {\r\n const firstSemiColon = message.indexOf(\":\");\r\n const firstComma = message.indexOf(\",\");\r\n\r\n const dataType = message.substring(firstSemiColon + 1, firstComma);\r\n const data = message.substring(firstComma + 1, message.length);\r\n\r\n return { dataType: dataType, data: data };\r\n }\r\n\r\n return { dataType: null, data: message };\r\n }\r\n\r\n private onOpen(ev: Event) {\r\n // We always want to know when its connected\r\n this.log(\"WebSocket connected...\");\r\n\r\n this.connected = true;\r\n this.sendQueue();\r\n\r\n // We should also re-subscribe to any listeners we set up\r\n this.listeners.forEach(listener => {\r\n this.send(listener.initialCommand);\r\n });\r\n }\r\n\r\n private onClose(ev: CloseEvent) {\r\n this.log(\"WebSocket Closed\", ev);\r\n\r\n this.connected = false;\r\n\r\n if (this.autoReconnect) {\r\n const retryTimeout = 10 * 1000;\r\n\r\n this.$timeout(() => {\r\n this.log(\"WebSocket - Attempting auto reconnect\");\r\n\r\n this.open(this.autoReconnect)\r\n .then(() => {\r\n this.listeners.forEach(listener => {\r\n this.webSocket.send(listener.initialCommand);\r\n });\r\n })\r\n .catch(() => {\r\n this.logError(\"catch, closing socket\");\r\n if (this.webSocket) {\r\n this.webSocket.close();\n }\r\n });\r\n }, retryTimeout);\r\n }\r\n }\r\n\r\n private ping() {\r\n if (!this.connected) {\r\n return;\r\n }\r\n\r\n this.send(\"--ping\");\r\n }\r\n\r\n private onError(ev: Event) {\r\n this.connected = false;\r\n this.logError(\"WebSocket error\", true, ev);\r\n }\r\n\r\n private log(message: any, ...optionalParams: any[]) {\r\n if (this.loggingEnabled) {\r\n console.log(message, optionalParams);\r\n }\r\n }\r\n\r\n private logWarning(message: any, ...optionalParams: any[]) {\r\n if (this.loggingEnabled) {\r\n console.warn(message, optionalParams);\r\n }\r\n }\r\n\r\n private logError(message: any, ...optionalParams: any[]) {\r\n if (this.loggingEnabled) {\r\n console.error(message, optionalParams);\r\n }\r\n }\r\n}\r\n","\r\nimport * as angular from \"angular\";\r\n\nimport { UserPreferencesService } from \"./service/userpreferences.service\";\r\nimport { UserPreferencesDirective } from \"./userpreferences.directive\";\r\n\r\nangular\r\n .module(\"app.userpreferences\", [\"ngMaterial\"])\n .service(\"userPreferencesService\", UserPreferencesService)\n .directive(\"userPreferences\", UserPreferencesDirective.factory());\n","import { ICountry } from \"@directives/_forms/smsInput/ICountry\";\r\nimport { IAccountOptions } from \"@services/class/AccountOption\";\r\nimport * as angular from \"angular\";\r\nimport { ITimeZoneInfo } from \"../model/ITimeZoneInfo\";\r\nimport { SettingsModel } from \"../model/preferences.model\";\r\n\r\nexport class UserPreferencesService {\r\n\r\n static $inject = [\"$http\"];\r\n\r\n constructor(\r\n private readonly $http: angular.IHttpService) {\r\n }\r\n\r\n getUserOptions(): angular.IPromise {\r\n return this.$http\r\n .get(\"/api/useroptions/\")\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n var userPreferences = result.data;\r\n\r\n userPreferences.Geofence.ShowLabelsWhenZoomedOut = userPreferences.Geofence.VisibleAt === \"High\";\r\n\r\n return userPreferences;\r\n });\r\n }\r\n\r\n getAccountOptions(): angular.IPromise {\r\n return this.$http\r\n .get(\"/api/accountoptions/\")\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n // This is for updating Vehicle Owner Credential Options\r\n saveUserOptions(userPreferences: SettingsModel): angular.IPromise {\r\n // Convert low / medium / high into something we can use as a bool for showing geofence labels when zoomed out\r\n userPreferences.Geofence.VisibleAt = userPreferences.Geofence.ShowLabelsWhenZoomedOut ? \"High\" : \"Low\";\r\n\r\n const promise = this.$http(\r\n {\r\n method: \"POST\",\r\n url: \"/api/useroptions\",\r\n data: userPreferences\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n // This is for updating Vehicle Owner Options (i.e. Journey Cost Value)\r\n saveAccountOptions(userPreferences: { key: string, value: string }[]): angular.IPromise {\r\n const promise = this.$http(\r\n {\r\n method: \"POST\",\r\n url: \"/api/accountoptions\",\r\n data: userPreferences\r\n })\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n getTimezones(): angular.IPromise {\r\n return this.$http\r\n .get(\"/api/useroptions/timezones/\")\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n getCountryCodes(): angular.IPromise {\r\n return this.$http\r\n .get(\"/api/useroptions/countrycodes/\")\r\n .then((result: angular.IHttpPromiseCallbackArg) => {\r\n return result.data;\r\n });\r\n }\r\n\r\n getTimezone(timeZoneName: string): angular.IPromise {\r\n return this.$http\r\n .get(`/api/useroptions/timezone/${timeZoneName}`)\r\n .then((result: angular.IHttpResponse) => {\r\n return result.data;\r\n });\r\n }\r\n}\r\n","import { downgradeComponent } from \"@angular/upgrade/static\";\r\nimport { UserRole } from \"@services/accountFeature.service\";\r\nimport { AuthorizationService } from \"@services/authorization.service\";\r\nimport { RouteConfigHelperProvider } from \"@services/routeConfigHelper.provider\";\r\nimport { StateProvider } from \"@uirouter/angularjs\";\r\nimport * as angular from \"angular\";\r\nimport { AlertDetailComponent } from \"src/app/main/modules/alerts/components/alert-detail/alert-detail.component\";\r\nimport { AxleWeightAlertDetailService } from \"src/app/main/modules/alerts/components/alert-detail/axle-weight-alert-detail/axle-weight-alert-detail.service\";\r\nimport { GeofenceAlertDetailComponent } from \"src/app/main/modules/alerts/components/alert-detail/geofence-alert-detail/geofence-alert-detail.component\";\r\nimport { GeofenceAlertDetailService } from \"src/app/main/modules/alerts/components/alert-detail/geofence-alert-detail/geofence-alert-detail.service\";\r\nimport { InputAlertDetailService } from \"src/app/main/modules/alerts/components/alert-detail/input-alert-detail/input-alert-detail.service\";\r\nimport { PowerLossAlertDetailService } from \"src/app/main/modules/alerts/components/alert-detail/power-loss-alert-detail/power-loss-alert-detail.service\";\r\nimport { TemperatureAlertDetailComponent } from \"src/app/main/modules/alerts/components/alert-detail/temperature-alert-detail/temperature-alert-detail.component\";\r\nimport { TollAlertDetailService } from \"src/app/main/modules/alerts/components/alert-detail/toll-alert-detail/toll-alert-detail.service\";\r\nimport { TyreRecordAlertDetailService } from \"src/app/main/modules/alerts/components/alert-detail/tyre-record-alert-detail/tyre-record-detail.service\";\r\nimport { VehicleDiagnosticAlertDetailService } from \"src/app/main/modules/alerts/components/alert-detail/vehicle-diagnostic-detail/vehicle-diagnostic-detail.service\";\r\nimport { VideoAlertDetailService } from \"src/app/main/modules/alerts/components/alert-detail/video-alert-detail/video-alert-detail.service\";\r\nimport { AlertReviewDialogComponent } from \"src/app/main/modules/alerts/components/alert-review-dialog/alert-review-dialog.component\";\r\nimport { AlertReviewComplianceComponent } from \"src/app/main/modules/alerts/components/alertReviewCompliance/alertReviewCompliance.component\";\r\nimport { IncidentDetailComponent } from \"src/app/main/modules/alerts/components/incidentView/incidentDetail.component\";\r\nimport { ResolutionCodeEditorComponent } from \"src/app/main/modules/alerts/components/resolution-code-editor/resolution-code-editor.component\";\r\nimport { AlertReviewService } from \"src/app/main/modules/alerts/_services/alert-review.service\";\r\nimport { AlertsNavigationModule } from \"./alerts.navigation\";\r\nimport { AlertCategoryComponent } from \"./components/alert-category/alert-category.component\";\r\nimport { AlertReviewHistoryComponent } from \"./components/alert-review-history/alert-review-history.component\";\r\nimport { AlertEditorComponent } from \"./components/alertEditor/alertEditor.component\";\r\nimport { AlertHistoryComponent } from \"./components/alertHistory/alertHistory.component\";\r\nimport { AlertsManagerComponent } from \"./components/alertsManager/alertsManager.component\";\r\nimport { RecentAlertsComponent } from \"./components/recentAlerts/recentAlerts.component\";\r\nimport { AlertsService } from \"./_services/alerts.service\";\r\n\r\n\r\nexport class Config {\r\n\r\n static $inject = [\"$stateProvider\", \"routeConfigHelperProvider\"];\r\n\r\n constructor(\r\n private $stateProvider: StateProvider,\r\n private routeConfigHelperProvider: RouteConfigHelperProvider) {\r\n\r\n $stateProvider.state(AlertsNavigationModule.ParentRoot, {\r\n abstract: true,\r\n url: \"/alerts\",\r\n redirectTo: AlertsNavigationModule.Default,\r\n views: { \"module-navigation\": {} },\r\n data: { translation: 'Common.Alerts' },\r\n params: {\r\n title: \"Alerts\",\r\n page: { squash: true, value: null, dynamic: true },\r\n option: { squash: true, value: null, dynamic: true },\r\n model: { squash: true, value: null, dynamic: true }\r\n },\r\n resolve: {\r\n authorize: [\"authorizationService\", (authorization: AuthorizationService) => authorization.authorizeForUser([\r\n UserRole.ManageAlerts, UserRole.ManageAlertReviews\r\n ])]\r\n }\r\n });\r\n $stateProvider.state(AlertsNavigationModule.AlertHistory, {\r\n url: \"/history\",\r\n views: { \"content@app\": { component: \"alertHistory\" } },\r\n data: { translation: 'Common.History' },\r\n resolve: {\r\n authorize: [\"authorizationService\", (authorization: AuthorizationService) => authorization.authorizeForUser([\r\n UserRole.ManageAlerts\r\n ])]\r\n }\r\n });\r\n $stateProvider.state(AlertsNavigationModule.ReviewAlerts, {\r\n url: \"/review\",\r\n views: { \"content@app\": { component: \"alertReviewHistory\" } },\r\n data: { translation: 'Alerts.ActionRequired' },\r\n resolve: {\r\n authorize: [\"authorizationService\", (authorization: AuthorizationService) => authorization.authorizeForUser([\r\n UserRole.ManageAlerts, UserRole.ManageAlertReviews\r\n ])]\r\n }\r\n });\r\n\r\n $stateProvider.state(AlertsNavigationModule.Compliance, {\r\n url: \"/compliance\",\r\n views: { \"content@app\": { component: \"alertReviewCompliance\" } },\r\n data: { translation: 'Alerts.Compliance' },\r\n resolve: {\r\n authorize: [\"authorizationService\", (authorization: AuthorizationService) => authorization.authorizeForUser([\r\n UserRole.ManageAlerts, UserRole.ManageAlertReviews\r\n ])]\r\n }\r\n });\r\n\r\n $stateProvider.state(AlertsNavigationModule.ManageAlerts, {\r\n url: \"/manage\",\r\n views: { \"content@app\": { component: \"alertsManager\" } },\r\n data: { translation: 'Alerts.ManageAlerts' },\r\n resolve: {\r\n authorize: [\"authorizationService\", (authorization: AuthorizationService) => authorization.authorizeForUser([\r\n UserRole.ManageAlerts\r\n ])]\r\n }\r\n });\r\n\r\n this.createAlertView(AlertsNavigationModule.ReviewAlerts);\r\n this.createAlertView(AlertsNavigationModule.Compliance);\r\n }\r\n private createAlertView(parentViewName: string) {\r\n this.routeConfigHelperProvider.createDetailStateWithBoundParams({\r\n stateName: `${parentViewName}.view`,\r\n translation: 'Common.Alerts',\r\n bindingName: \"incidentId\",\r\n component: \"incidentDetail\",\r\n breadcrumbNameResolverKey: \"incidentName\"\r\n });\r\n }\r\n}\r\n\r\nangular\r\n .module(\"app.alerts\", [\r\n \"ui.router\",\r\n \"ngMaterial\"\r\n ])\r\n .config(Config)\r\n .service(\"alertsService\", AlertsService)\r\n\r\n .component(\"alertsManager\", new AlertsManagerComponent())\r\n .component(\"alertHistory\", new AlertHistoryComponent())\r\n .component(\"alertEditor\", new AlertEditorComponent())\r\n .component(\"recentAlerts\", new RecentAlertsComponent())\r\n .component(\"recentAlerts\", new RecentAlertsComponent())\r\n .service(\"alertReviewService\", AlertReviewService)\r\n .component(\"alertReviewCompliance\", new AlertReviewComplianceComponent())\r\n .component(\"incidentDetail\", new IncidentDetailComponent())\r\n .directive(\"alertReviewHistory\", downgradeComponent({ component: AlertReviewHistoryComponent }))\r\n .directive(\"alertReviewDialog\", downgradeComponent({ component: AlertReviewDialogComponent }))\r\n .directive(\"resolutionCodeEditor\", downgradeComponent({ component: ResolutionCodeEditorComponent }))\r\n .directive(\"alertDetail\", downgradeComponent({ component: AlertDetailComponent }))\r\n .directive(\"geofenceAlertDetail\", downgradeComponent({ component: GeofenceAlertDetailComponent }))\r\n .directive(\"temperatureAlertDetail\", downgradeComponent({ component: TemperatureAlertDetailComponent }))\r\n .directive(\"alertCategoryComponent\", downgradeComponent({ component: AlertCategoryComponent }))\r\n .service(\"axleWeightAlertDetailService\", AxleWeightAlertDetailService)\r\n .service(\"geofenceAlertDetailService\", GeofenceAlertDetailService)\r\n .service(\"inputAlertDetailService\", InputAlertDetailService)\r\n .service(\"powerLossAlertDetailService\", PowerLossAlertDetailService)\r\n .service(\"tollAlertDetailService\", TollAlertDetailService)\r\n .service(\"tyreRecordAlertDetailService\", TyreRecordAlertDetailService)\r\n .service(\"vehicleDiagnosticAlertDetailService\", VehicleDiagnosticAlertDetailService)\r\n .service(\"videoAlertDetailService\", VideoAlertDetailService);\r\n","\r\nimport { DateService } from \"@app/services/date.service\";\r\nimport { IVeriNavPill } from \"@directives/_veri/veriPills/veriPills.component\";\r\nimport { IVeriTableHeader, IVeriTableRow, IVeriTableRowCell, VeriTableRowStatus } from \"@directives/_veri/veriTable/veriTable.component\";\r\nimport { VeriTableService } from \"@directives/_veri/veriTable/veriTable.service\";\r\nimport { DateRange } from \"@enums/DateRange.enum\";\r\nimport { SortType } from \"@enums/SortType\";\r\nimport { IDateFilter } from \"@interfaces/filters/IDateFilter\";\r\nimport { IGroup } from \"@interfaces/IVehicleGroup\";\r\nimport { IDateQueryOptions } from \"@services/accelerometerRecord.service\";\r\nimport { DriverService } from \"@services/driver.service\";\r\nimport { DriverAssignmentService } from \"@services/driverAssignment.service\";\r\nimport { GroupService } from \"@services/group.service.ajs\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { UsersService } from \"@services/users.service\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport * as angular from \"angular\";\r\nimport { Subscription } from \"rxjs\";\r\nimport { AlertReviewStatus } from \"src/app/main/modules/alerts/_enums/AlertReviewStatus.enums\";\r\nimport { AlertCategory } from \"src/app/main/modules/alerts/_enums/alerts.enums\";\r\nimport { IAlertRule } from \"src/app/main/modules/alerts/_models/alerts.interfaces\";\r\nimport { IAlertResolutionCode } from \"src/app/main/modules/alerts/_models/IAlertResolutionCode\";\r\nimport { IAlertReviewHistory } from \"src/app/main/modules/alerts/_models/IAlertReviewHistory\";\r\nimport { AlertReviewService } from \"src/app/main/modules/alerts/_services/alert-review.service\";\r\nimport { AlertRecordMaterialisationOptions, AlertsService, IAlertRecordQueryOptions } from \"src/app/main/modules/alerts/_services/alerts.service\";\r\nimport \"./alertReviewCompliance.component.scss\";\r\n\r\n\r\nclass AlertReviewComplianceComponentController implements angular.IComponentController {\r\n loading = false;\r\n tableHeaders: IVeriTableHeader[];\r\n tableRows: IVeriTableRow[] = [];\r\n\r\n alertReviewHistory: IAlertReviewHistory[];\r\n alertRules: IAlertRule[];\r\n depots: IGroup[];\r\n\r\n defaultDateRange: DateRange = DateRange.Latest7Days;\r\n dateFilter: IDateFilter;\r\n groupFilter: IGroup;\r\n\r\n resolutionCodes: IAlertResolutionCode[];\r\n\r\n navPills: IVeriNavPill[];\r\n tabIndex: number = 0;\r\n\r\n intervalPromise: angular.IPromise;\r\n\r\n subscriptions = new Subscription();\r\n\r\n static $inject = [\"$q\", \"$interval\", \"$scope\", \"alertsService\", \"alertReviewService\", \"driverService\", \"driverAssignmentService\", \"groupService\", \"translationService\", \"usersService\", \"vehicleService\", \"dateService\", \"veriTableService\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $interval: angular.IIntervalService,\r\n private readonly $scope: angular.IScope,\r\n private readonly alertsService: AlertsService,\r\n private readonly alertReviewService: AlertReviewService,\r\n private readonly driverService: DriverService,\r\n private readonly driverAssignmentService: DriverAssignmentService,\r\n private readonly groupService: GroupService,\r\n private readonly translationService: TranslationService,\r\n private readonly usersService: UsersService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly dateService: DateService,\r\n private readonly veriTableService: VeriTableService\r\n ) {\r\n }\r\n\r\n $onInit() {\r\n\r\n this.navPills = [\r\n {\r\n title: this.translationService.t(\"Alerts.All\"),\r\n data: [],\r\n count: 0,\r\n selected: true\r\n },\r\n {\r\n title: this.translationService.t(\"Alerts.Open\"),\r\n data: [],\r\n count: 0\r\n },\r\n {\r\n title: this.translationService.t(\"Alerts.Closed\"),\r\n data: [],\r\n count: 0\r\n }\r\n ];\r\n this.dateFilter = this.dateService.dateRangeFromEnum(this.defaultDateRange);\r\n this.intervalPromise = this.$interval(() => {\r\n this.loadData(false);\r\n }, 5 * 60_000)\r\n\r\n this.subscriptions.add(this.alertReviewService.alertReviewHistoryUpdated$.subscribe((history) => {\r\n this.alertReviewService.updateAlertReviewHistoryItem(this.alertReviewHistory, history);\r\n\r\n this.updateDisplay();\r\n }));\r\n }\r\n\r\n $onDestroy(): void {\r\n this.$interval.cancel(this.intervalPromise);\r\n this.subscriptions.unsubscribe();\r\n }\r\n\r\n onDateFilterChanged(filter) {\r\n this.dateFilter = filter;\r\n this.loadData(true, true);\r\n }\r\n\r\n selectedItemChanged(data) {\r\n this.alertReviewService.openIncidentDetailsDialog(data, 'app.alerts.compliance');\r\n }\r\n\r\n groupFilterChanged(filter) {\r\n\r\n this.groupFilter = filter.group;\r\n\r\n this.loadData(false);\r\n\r\n }\r\n\r\n onNavPillSelected(selectedNavPill: IVeriNavPill) {\r\n this.tabIndex = this.navPills.indexOf(selectedNavPill);\r\n\r\n this.alertReviewHistory = selectedNavPill.data;\r\n this.createTableRows();\r\n\r\n // Needed for Hybrid apps\r\n this.$scope.$apply();\r\n }\r\n\r\n // ---\r\n\r\n private loadData(showLoadingSpinner = false, invalidateCache = false) {\r\n\r\n if (showLoadingSpinner) {\r\n this.loading = true;\r\n }\r\n\r\n this.createTableHeaders();\r\n\r\n const vehiclesPromise = this.vehicleService.getVehicles({ includePeripheralMappings: true });\r\n const driversPromise = this.driverService.getDrivers();\r\n const assignmentsPromise = this.driverAssignmentService.getDriverAssignments(true);\r\n const groupsPromise = this.groupService.getGroups();\r\n const alertRulesPromise = this.alertsService.getAlertRules();\r\n const usersPromise = this.usersService.getUsers({ includeMappings: true, includeAdmins: true });\r\n const resolutionCodesPromise = this.alertsService.getAlertResolutionCodes();\r\n\r\n const dateQueryOptions: IDateQueryOptions = {\r\n Start: this.dateFilter.start,\r\n End: this.dateFilter.end,\r\n invalidateCache: invalidateCache\r\n }\r\n\r\n const alertReviewHistoryPromise = this.alertReviewService.getAlertReviewHistory(dateQueryOptions);\r\n const alertReviewEventsPromise = this.alertReviewService.getAlertReviewEvents(dateQueryOptions);\r\n\r\n const alertRecordQueryOptions = dateQueryOptions as IAlertRecordQueryOptions;\r\n alertRecordQueryOptions.MaterialisationOptions = AlertRecordMaterialisationOptions.WithMetadata;\r\n\r\n const alertRecordsPromise = this.alertsService.getAlertRuleRecordsUsingQueryOptions(alertRecordQueryOptions);\r\n\r\n this.$q.all([vehiclesPromise, groupsPromise, driversPromise, assignmentsPromise, alertReviewHistoryPromise, alertReviewEventsPromise, alertRecordsPromise, alertRulesPromise, usersPromise, resolutionCodesPromise])\r\n .then(([vehicles, groups, drivers, assignments, alertReviewHistory, alertReviewEvents, alertRecords, alertRules, users, resolutionCodes]) => {\r\n this.alertReviewHistory = alertReviewHistory;\r\n this.resolutionCodes = resolutionCodes;\r\n this.depots = groups.filter(group => group.IsDepot);\r\n\r\n this.driverAssignmentService.mapDriversToVehicles(drivers, assignments, vehicles);\r\n\r\n this.alertRules = alertRules;\r\n\r\n this.alertReviewHistory.forEach(history => {\r\n this.alertReviewService.mapVehicleToHistory(history, vehicles);\r\n this.alertReviewService.mapEventsToHistory(history, alertReviewEvents);\r\n this.alertReviewService.mapAlertRecordToHistory(history, alertRecords);\r\n this.alertReviewService.mapUsersToEvents(history, users);\r\n\r\n if (history.AlertRecord) {\r\n this.alertsService.parseAlertRecordMetadata(history.AlertRecord);\r\n }\r\n\r\n });\r\n\r\n if (this.groupFilter) {\r\n\r\n const vehicleIds = this.groupFilter.VehicleIds;\r\n this.alertReviewHistory = this.alertReviewHistory.filter(history => {\r\n if (vehicleIds.includes(history.VehicleId)) {\r\n return history;\r\n }\r\n })\r\n }\r\n\r\n this.updateDisplay();\r\n\r\n }).finally(() => {\r\n this.loading = false;\r\n });\r\n }\r\n\r\n private updateDisplay(): void {\r\n this.setupNavPillData();\r\n this.alertReviewHistory = this.navPills[this.tabIndex].data;\r\n this.createTableRows();\r\n }\r\n\r\n private setupNavPillData() {\r\n\r\n this.navPills[0].data = this.alertReviewHistory;\r\n\r\n this.navPills[1].data = this.alertReviewHistory.filter(alert => {\r\n return this.alertReviewService.getCurrentStatusOfHistoryItem(alert) === AlertReviewStatus.Open;\r\n });\r\n\r\n this.navPills[2].data = this.alertReviewHistory.filter(alert => {\r\n return this.alertReviewService.getCurrentStatusOfHistoryItem(alert) === AlertReviewStatus.Closed;\r\n });\r\n\r\n this.navPills[0].count = this.navPills[0].data.length;\r\n this.navPills[1].count = this.navPills[1].data.length;\r\n this.navPills[2].count = this.navPills[2].data.length;\r\n }\r\n\r\n private createTableHeaders(): void {\r\n this.tableHeaders = [\r\n { title: \"ID\", sortable: true, sortType: SortType.Number, width: 80 },\r\n { title: this.translationService.t('Alerts.Status'), sortable: true, graphOptions: { show: true, chartType: 'column', stacked: true, dateColumn: 5, title: this.translationService.t('Alerts.RaisedResolved') }, hideOnMobile: true },\r\n { title: this.translationService.t('Alerts.Depot'), sortable: true, graphOptions: { show: true, chartType: 'pie' }, hideOnMobile: true },\r\n { title: this.translationService.t('Alerts.Category'), sortable: true },\r\n { title: this.translationService.t('Alerts.AlertRaised'), sortable: true, sortType: SortType.Date, hideOnMobile: true },\r\n { title: this.translationService.t('Alerts.AlertEnd'), sortable: true, sortType: SortType.Date, hideOnMobile: true },\r\n { title: this.translationService.t('Alerts.OpenDuration'), sortable: true, sortType: SortType.Number },\r\n { title: this.translationService.t('Alerts.ResCode'), sortable: true, graphOptions: { show: true, chartType: 'pie' }, hideOnMobile: true },\r\n { title: this.translationService.t('Alerts.ResolvedBy'), sortable: true, hideOnMobile: true }\r\n ];\r\n }\r\n\r\n\r\n private createTableRows(): void {\r\n this.tableRows = [];\r\n\r\n this.alertReviewHistory?.forEach(historyItem => {\r\n const row: IVeriTableRow = {\r\n data: historyItem,\r\n cells: this.createTableCells(historyItem)\r\n };\r\n row.rowWarningStatus = this.setRowWarningStatus(row, historyItem);\r\n this.tableRows.push(row);\r\n });\r\n }\r\n\r\n private createTableCells(historyItem: IAlertReviewHistory): IVeriTableRowCell[] {\r\n const status: string = this.translationService.tEnum(AlertReviewStatus, 'AlertReviewStatus', this.alertReviewService.getCurrentStatusOfHistoryItem(historyItem));\r\n const category: string = this.translationService.tEnum(AlertCategory, 'AlertCategory', this.alertReviewService.getAlertRuleCategory(historyItem, this.alertRules));\r\n const { subCategoryEnum, subCategoryString } = this.alertsService.getAlertRuleSubcategoryEnum(this.alertReviewService.getAlertRuleCategory(historyItem, this.alertRules));\r\n const subCategory: string = this.translationService.tEnum(subCategoryEnum, subCategoryString, this.alertReviewService.getAlertRuleSubCategory(historyItem, this.alertRules));\r\n\r\n const depot: IGroup = this.vehicleService.getVehicleDepot(historyItem.VehicleId, this.depots);\r\n const { startTime, endTime } = this.alertReviewService.getStartAndEndDates(historyItem);\r\n const openDuration: string = this.dateService.formatDuration(startTime, endTime);\r\n\r\n const user: string = this.alertReviewService.getResolvingUser(historyItem);\r\n const resCodeId = this.alertReviewService.getResolutionCode(historyItem);\r\n let resolutionCode: IAlertResolutionCode;\r\n\r\n if (resCodeId) {\r\n resolutionCode = this.resolutionCodes.find(code => code.Id === resCodeId);\r\n }\r\n\r\n const cells: IVeriTableRowCell[] = [\r\n { contents: historyItem.Id.toString(), sortData: historyItem.Id },\r\n { contents: status },\r\n depot ? {\r\n contents: ``, exportData: depot?.Name,\r\n data: depot,\r\n sortData: depot?.Name,\r\n graphLabel: depot?.Name\r\n } : this.veriTableService.createNACell(),\r\n category ? {\r\n contents: `
    ${category}
    ${subCategory ? ' ' + subCategory : ''}
    `,\r\n exportData: `${category} ${subCategory ? ' ' + subCategory : ''}`\r\n } : this.veriTableService.createNACell(),\r\n this.veriTableService.createDateTimeCell(historyItem.StartTime),\r\n historyItem.EndTime ? this.veriTableService.createDateTimeCell(historyItem.EndTime) : this.veriTableService.createNACell(),\r\n openDuration ? {\r\n contents: openDuration,\r\n sortData: openDuration\r\n } : this.veriTableService.createNACell(),\r\n resolutionCode ? { contents: resolutionCode.Name } : this.veriTableService.createNACell(),\r\n user ? { contents: user } : this.veriTableService.createNACell()\r\n ];\r\n\r\n return cells;\r\n }\r\n\r\n private setRowWarningStatus(row: IVeriTableRow, historyItem: IAlertReviewHistory): VeriTableRowStatus {\r\n let status: VeriTableRowStatus = VeriTableRowStatus.Error;\r\n\r\n if (this.alertReviewService.getCurrentStatusOfHistoryItem(historyItem) === AlertReviewStatus.Closed) {\r\n status = VeriTableRowStatus.OkChecked;\r\n }\r\n return status;\r\n }\r\n\r\n\r\n}\r\n\r\nexport class AlertReviewComplianceComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: any;\r\n\r\n constructor() {\r\n this.bindings = {\r\n };\r\n\r\n this.controller = AlertReviewComplianceComponentController;\r\n this.template = require(\"./alertReviewCompliance.component.html\");\r\n }\r\n}\r\n\r\n","module.exports = \" \";","import { CoordsModel } from \"@components/livemap/model/CoordsModel\";\r\nimport { IVeriMapComponent } from \"@directives/_map/veriMap/veriMapComponent/veriMap.component\";\r\nimport { ITimelineEntry } from \"@directives/_veri/v-timeline/v-timeline.component\";\r\nimport { IVeriTableHeader, IVeriTableRow, IVeriTableRowCell } from \"@directives/_veri/veriTable/veriTable.component\";\r\nimport { VeriTableService } from \"@directives/_veri/veriTable/veriTable.service\";\r\nimport { IGoogleMapsMarker } from \"@interfaces/IGoogleMapsMarkerOptions\";\r\nimport { IUser } from \"@interfaces/IUser\";\r\nimport { IDateQueryOptions } from \"@services/accelerometerRecord.service\";\r\nimport { UserRole } from \"@services/accountFeature.service\";\r\nimport { AuthorizationService } from \"@services/authorization.service\";\r\nimport { CurrentUserService } from \"@services/currentUser.service\";\r\nimport { DateService, DateUnit } from \"@services/date.service\";\r\nimport { DisplayService, IDialogOptionsJson } from \"@services/display.service\";\r\nimport { DriverService } from \"@services/driver.service\";\r\nimport { DriverAssignmentService } from \"@services/driverAssignment.service\";\r\nimport { MapService } from \"@services/map.service\";\r\nimport { NavigationService } from \"@services/navigation.service\";\r\nimport { PlotService } from \"@services/plot.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { UsersService } from \"@services/users.service\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport { IPolyline } from \"@typings/google.maps.angular\";\r\nimport * as angular from \"angular\";\r\nimport { AlertReviewStatus } from \"src/app/main/modules/alerts/_enums/AlertReviewStatus.enums\";\r\nimport { AlertCategory } from \"src/app/main/modules/alerts/_enums/alerts.enums\";\r\nimport { IAlertRule } from \"src/app/main/modules/alerts/_models/alerts.interfaces\";\r\nimport { IAlertResolutionCode } from \"src/app/main/modules/alerts/_models/IAlertResolutionCode\";\r\nimport { IAlertReviewEvent } from \"src/app/main/modules/alerts/_models/IAlertReviewEvent\";\r\nimport { IAlertReviewHistory } from \"src/app/main/modules/alerts/_models/IAlertReviewHistory\";\r\nimport { AlertReviewService, IReviewEventQueryOptions, IReviewHistoryQueryOptions } from \"src/app/main/modules/alerts/_services/alert-review.service\";\r\nimport { AlertRecordMaterialisationOptions, AlertsService, IAlertRecordQueryOptions } from \"src/app/main/modules/alerts/_services/alerts.service\";\r\nimport \"./incidentDetail.component.scss\";\r\n\r\n\r\nclass IncidentDetailComponentComponentController implements angular.IComponentController {\r\n loading = false;\r\n previousAlertsLoading = false;\r\n\r\n prevAlertsTableHeaders: IVeriTableHeader[];\r\n prevAlertsTableRows: IVeriTableRow[];\r\n\r\n alertRules: IAlertRule[];\r\n\r\n incidentId: number;\r\n\r\n incident: IAlertReviewHistory;\r\n previousAlerts: IAlertReviewHistory[];\r\n\r\n tempGraphStart: Date;\r\n tempGraphEnd: Date;\r\n\r\n timelineEntries: ITimelineEntry[] = [];\r\n\r\n category: string;\r\n subCategory: string;\r\n\r\n event: IAlertReviewEvent;\r\n status: AlertReviewStatus;\r\n resolution: IAlertResolutionCode;\r\n resolutionCodes: IAlertResolutionCode[];\r\n\r\n incidentResolutionCode: string;\r\n incidentDurationToResolve: string;\r\n incidentResolveByUser: string;\r\n incidentResolutionComment: string;\r\n\r\n statusString: string;\r\n statusClass: string;\r\n currentUser: IUser;\r\n isAuthorized: boolean;\r\n\r\n dateStartAndEndLabel: string;\r\n dateStartIsEqualToEnd = false;\r\n\r\n alertRaisedDateTime: Date;\r\n\r\n veriMap: IVeriMapComponent;\r\n alertPolyline: IPolyline;\r\n alertLocationMarker: IGoogleMapsMarker;\r\n endMapMarker: IGoogleMapsMarker;\r\n showMapMarkers: boolean = false;\r\n mapCenter: CoordsModel;\r\n\r\n formSubmitting = false;\r\n\r\n agreement = false;\r\n\r\n noteString: string;\r\n noteLoading = false;\r\n\r\n showTemperatureGraph = false;\r\n showGeofences = false;\r\n\r\n plotReasonText: string;\r\n\r\n AlertReviewStatus = AlertReviewStatus;\r\n\r\n showPreviousAlertsSidebar: boolean;\r\n\r\n static $inject = [\"$q\", \"$scope\", \"$timeout\", \"alertReviewService\", \"alertsService\", \"currentUserService\", \"dateService\", \"driverService\", \"driverAssignmentService\", \"mapService\", \"plotService\", \"translationService\", \"usersService\", \"vehicleService\", \"veriTableService\", \"displayService\", \"navigationService\", \"authorizationService\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $scope: angular.IScope,\r\n private readonly $timeout: angular.ITimeoutService,\r\n private readonly alertReviewService: AlertReviewService,\r\n private readonly alertsService: AlertsService,\r\n private readonly currentUserService: CurrentUserService,\r\n private readonly dateService: DateService,\r\n private readonly driverService: DriverService,\r\n private readonly driverAssignmentService: DriverAssignmentService,\r\n private readonly mapService: MapService,\r\n private readonly plotService: PlotService,\r\n private readonly translationService: TranslationService,\r\n private readonly usersService: UsersService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly veriTableService: VeriTableService,\r\n private readonly displayService: DisplayService,\r\n private readonly navigationService: NavigationService,\r\n private readonly authorizationService: AuthorizationService\r\n ) { }\r\n\r\n $onInit(): void {\r\n this.isAuthorized = this.authorizationService.isUserAuthorized([UserRole.History]);\r\n\r\n if (this.isAuthorized) {\r\n this.loadData();\r\n }\r\n\r\n this.currentUserService.getCurrentUser().then(user => {\r\n this.currentUser = user;\r\n });\r\n }\r\n\r\n selectedItemChanged(data): void {\r\n this.alertReviewService.openIncidentDetailsDialog(data);\r\n }\r\n\r\n openResolutionDialog($event): void {\r\n let dialogHTML = ``;\r\n\r\n const dialogOptions: IDialogOptionsJson = {\r\n title: this.translationService.t('Alerts.ResolveIncident'),\r\n dialogHTML: dialogHTML,\r\n dialogId: `alertReviewDialog`,\r\n bindings: {\r\n incident: this.incident, status: this.status, onAlertReviewEventAdded: (alertReviewEvent: IAlertReviewEvent) => { this.onAlertReviewEventAdded(alertReviewEvent) }\r\n },\r\n event: $event,\r\n clickOutsideToClose: true,\r\n escapeToClose: true\r\n };\r\n\r\n this.displayService.showDialog(dialogOptions);\r\n }\r\n\r\n onAlertReviewEventAdded(alertReviewEvent: IAlertReviewEvent): void {\r\n this.loading = true;\r\n\r\n if (this.incident.Id === alertReviewEvent.AlertReviewHistoryId) {\r\n this.incident.latestAlertReviewEvent = alertReviewEvent;\r\n this.incident.EndTime = alertReviewEvent.CreatedTime;\r\n }\r\n\r\n this.alertReviewService.emitAlertReviewHistoryUpdate(this.incident);\r\n\r\n this.$timeout(() => {\r\n this.loadData();\r\n }, 1000);\r\n }\r\n\r\n mapIdle(veriMap: IVeriMapComponent): void {\r\n this.veriMap = veriMap;\r\n }\r\n\r\n openPreviousAlertsSidebar(): void {\r\n this.showPreviousAlertsSidebar = true;\r\n\r\n this.$scope.$applyAsync();\r\n }\r\n\r\n closePreviousAlertsSidebar(): void {\r\n this.showPreviousAlertsSidebar = false;\r\n\r\n this.$scope.$applyAsync();\r\n }\r\n\r\n // ---\r\n\r\n private loadData(): void {\r\n this.loading = true;\r\n\r\n const vehiclesPromise = this.vehicleService.getVehicles({ includeProbes: true, includePeripheralMappings: true });\r\n const driversPromise = this.driverService.getDrivers();\r\n const assignmentsPromise = this.driverAssignmentService.getDriverAssignments(true);\r\n const incidentPromise = this.alertReviewService.getAlertReviewHistory({ Id: this.incidentId, invalidateCache: true });\r\n const alertEventsPromise = this.alertReviewService.getAlertReviewEvents({ AlertReviewHistoryId: this.incidentId, invalidateCache: true });\r\n const usersPromise = this.usersService.getUsers({ includeAdmins: true, includeMappings: true });\r\n const resolutionCodesPromise = this.alertsService.getAlertResolutionCodes();\r\n\r\n this.$q.all([vehiclesPromise, driversPromise, assignmentsPromise, incidentPromise, alertEventsPromise, usersPromise, resolutionCodesPromise])\r\n .then(([vehicles, drivers, assignments, incident, alertEvents, users, resolutionCodes]) => {\r\n this.driverAssignmentService.mapDriversToVehicles(drivers, assignments, vehicles);\r\n this.incident = incident[0];\r\n this.resolutionCodes = resolutionCodes;\r\n this.alertReviewService.mapEventsToHistory(this.incident, alertEvents);\r\n this.alertReviewService.mapUsersToEvents(this.incident, users);\r\n this.alertReviewService.mapVehicleToHistory(this.incident, vehicles);\r\n this.getAlertRecords();\r\n this.getStatus();\r\n this.getPreviousAlertsForVehicle();\r\n this.navigationService.updateBreadcrumbNameResolver({ incidentName: this.incident.AlertRule?.Name });\r\n })\r\n .finally(() => {\r\n this.setupTimeline();\r\n this.setupPageElements();\r\n\r\n this.loading = false;\r\n });\r\n }\r\n\r\n private getPreviousAlertsForVehicle(): void {\r\n this.previousAlertsLoading = true;\r\n this.createPrevAlertsTableHeaders();\r\n\r\n const dateQueryOptions: IDateQueryOptions = {\r\n Start: this.dateService.addOrSubtractTime(new Date(), -14, DateUnit.Day),\r\n End: new Date()\r\n }\r\n\r\n const previousAlertsPromise = this.createPreviousAlertsPromise(dateQueryOptions);\r\n const alertEventsPromise = this.createAlertEventsPromise(dateQueryOptions);\r\n const alertRulesPromise = this.alertsService.getAlertRules();\r\n const alertRecordsPromise = this.createAlertRecordsPromise(dateQueryOptions);\r\n\r\n this.$q.all([previousAlertsPromise, alertEventsPromise, alertRulesPromise, alertRecordsPromise]).then(\r\n ([alerts, events, rules, records]) => {\r\n\r\n this.previousAlerts = alerts.filter(alert => {\r\n return alert.Id !== this.incident.Id; // We don't want to include the current incident in the list\r\n });\r\n this.alertRules = rules;\r\n\r\n this.previousAlerts.forEach(alert => {\r\n alert.AlertRecord = records.find(record => {\r\n return record.Id === alert.AlertRecordId;\r\n });\r\n alert.AlertReviewEvents = events.filter(event => {\r\n return event.AlertReviewHistoryId === alert.Id;\r\n });\r\n });\r\n this.createPrevAlertsTableRows();\r\n }).finally(() => {\r\n this.navigationService.updateBreadcrumbNameResolver({ incidentName: this.incident.AlertRule?.Name });\r\n this.previousAlertsLoading = false;\r\n });\r\n }\r\n\r\n createAlertEventsPromise(dateQueryOptions: IDateQueryOptions) {\r\n const alertEventsQueryOptions = dateQueryOptions as IReviewEventQueryOptions;\r\n alertEventsQueryOptions.VehicleId = this.incident.VehicleId;\r\n\r\n return this.alertReviewService.getAlertReviewEvents(alertEventsQueryOptions);\r\n }\r\n\r\n createAlertRecordsPromise(dateQueryOptions: IDateQueryOptions) {\r\n const alertRecordQueryOptions = dateQueryOptions as IAlertRecordQueryOptions;\r\n alertRecordQueryOptions.MaterialisationOptions = AlertRecordMaterialisationOptions.WithMetadata;\r\n alertRecordQueryOptions.VehicleId = this.incident.VehicleId;\r\n alertRecordQueryOptions.invalidateCache = true;\r\n\r\n return this.alertsService.getAlertRuleRecordsUsingQueryOptions(alertRecordQueryOptions);\r\n }\r\n\r\n createPreviousAlertsPromise(dateQueryOptions: IDateQueryOptions) {\r\n const previousAlertQueryOptions = dateQueryOptions as IReviewHistoryQueryOptions;\r\n previousAlertQueryOptions.VehicleId = this.incident.VehicleId;\r\n previousAlertQueryOptions.invalidateCache = true;\r\n\r\n return this.alertReviewService.getAlertReviewHistory(previousAlertQueryOptions);\r\n }\r\n\r\n private createPrevAlertsTableHeaders() {\r\n this.prevAlertsTableHeaders = [\r\n this.veriTableService.createDateHeader(),\r\n { title: this.translationService.t('Alerts.Category'), sortable: true },\r\n { title: this.translationService.t('Alerts.Status'), sortable: true, width: 60 },\r\n { title: this.translationService.t('Alerts.Resolution'), sortable: true },\r\n ];\r\n }\r\n\r\n private createPrevAlertsTableRows() {\r\n this.prevAlertsTableRows = [];\r\n\r\n this.previousAlerts.forEach(historyItem => {\r\n this.prevAlertsTableRows.push({\r\n data: historyItem,\r\n cells: this.createPrevAlertsTableCells(historyItem)\r\n });\r\n });\r\n }\r\n\r\n private createPrevAlertsTableCells(historyItem: IAlertReviewHistory): IVeriTableRowCell[] {\r\n const status = this.translationService.tEnum(AlertReviewStatus, 'AlertReviewStatus', this.alertReviewService.getCurrentStatusOfHistoryItem(historyItem));\r\n const category = this.translationService.tEnum(AlertCategory, 'AlertCategory', this.alertReviewService.getAlertRuleCategory(historyItem, this.alertRules)) || 'N/A';\r\n const resolutionCode = historyItem.latestAlertReviewEvent ? this.resolutionCodes.find(c => c.Id === historyItem.latestAlertReviewEvent.ResolutionCodeId).Name : 'N/A';\r\n\r\n const cells: IVeriTableRowCell[] = [\r\n this.veriTableService.createDateTimeCell(historyItem.AlertRecord.ActionAtDataTimestamp || historyItem.CreatedTime),\r\n { contents: category },\r\n { contents: status },\r\n { contents: resolutionCode }\r\n ];\r\n\r\n return cells;\r\n }\r\n\r\n private setupPageElements() {\r\n\r\n switch (this.incident?.AlertRule?.Category) {\r\n case AlertCategory.TemperatureProfile:\r\n case AlertCategory.Transcan:\r\n this.setupTempGraph();\r\n break;\r\n }\r\n }\r\n\r\n private setupTempGraph() {\r\n this.showTemperatureGraph = true;\r\n this.tempGraphStart = this.dateService.addOrSubtractTime(this.incident.AlertRecord.TriggeredAtDataTimestamp, -60, DateUnit.Min);\r\n\r\n this.tempGraphEnd = this.incident.AlertRecord.ClosedAtDataTime ? this.dateService.addOrSubtractTime(this.incident.AlertRecord.ClosedAtDataTime, -60, DateUnit.Min) : this.dateService.addOrSubtractTime(new Date(), 10, DateUnit.Min);; //If temperature is still out of bounds we want the graph to show the start of the OOB to now\r\n }\r\n\r\n\r\n\r\n private getStatus() {\r\n\r\n if (this.incident.AlertReviewEvents && this.incident.AlertReviewEvents.length > 0) {\r\n let mostRecentEvent = this.incident.AlertReviewEvents.find(event => {\r\n return event.Id === this.incident.LatestAlertReviewEventId;\r\n });\r\n if (!mostRecentEvent) {\r\n mostRecentEvent = this.incident.AlertReviewEvents.slice(-1)[0];\r\n }\r\n this.status = mostRecentEvent.Status;\r\n this.statusString = this.translationService.tEnum(AlertReviewStatus, 'AlertReviewStatus', mostRecentEvent.Status);\r\n }\r\n else {\r\n this.status = AlertReviewStatus.Open;\r\n this.statusString = this.translationService.tEnum(AlertReviewStatus, 'AlertReviewStatus', 0);\r\n }\r\n this.statusClass = AlertReviewStatus[this.status].toLowerCase();\r\n }\r\n\r\n private getResolution(): void {\r\n\r\n this.resolution = this.resolutionCodes.find(code => code.Id === this.alertReviewService.getResolutionCode(this.incident));\r\n this.incidentResolutionCode = this.resolution?.Name || 'N/A';\r\n this.incidentDurationToResolve = this.alertReviewService.getDurationInAlarm(this.incident);\r\n this.incidentResolveByUser = this.alertReviewService.getResolvingUser(this.incident);\r\n this.incidentResolutionComment = this.alertReviewService.getResolutionComment(this.incident);\r\n }\r\n\r\n private getDateStartAndEndLabel() {\r\n this.alertRaisedDateTime = new Date(this.incident.StartTime);\r\n if (!this.incident.AlertRecord.ClosedAtDataTime) {\r\n const formattedStartDate = this.dateService.formatDate(this.incident.AlertRecord.TriggeredAtDataTimestamp);\r\n this.dateStartAndEndLabel = this.translationService.t(\"Alerts.FromStartToNow\", [formattedStartDate]);\r\n return;\r\n }\r\n if (this.dateService.getDiff(this.incident.AlertRecord.TriggeredAtDataTimestamp, this.incident.AlertRecord.ClosedAtDataTime, DateUnit.Sec) === 0) {\r\n this.dateStartAndEndLabel = this.dateService.formatDate(this.incident.AlertRecord.TriggeredAtDataTimestamp, { dateTime: true });\r\n this.dateStartIsEqualToEnd = true;\r\n } else {\r\n this.dateStartAndEndLabel = this.dateService.formatDatesFromAndTo(this.incident.AlertRecord.TriggeredAtDataTimestamp, this.incident.AlertRecord.ClosedAtDataTime);\r\n }\r\n }\r\n\r\n private getAlertRecords(): void {\r\n if (!this.incident.AlertRuleId && !this.incident.AlertRecordId) {\r\n return;\r\n }\r\n const alertRulePromise = this.incident.AlertRuleId ? this.alertsService.getAlertRule(this.incident.AlertRuleId) : null;\r\n const alertRecordPromise = this.incident.AlertRecordId ? this.alertsService.getAlertRuleRecord(this.incident.AlertRecordId, AlertRecordMaterialisationOptions.WithMetadata) : null;\r\n\r\n this.$q.all([alertRulePromise, alertRecordPromise]).then(([rule, record]) => {\r\n this.incident.AlertRule = rule;\r\n this.incident.AlertRecord = record;\r\n\r\n\r\n this.category = this.translationService.tEnum(AlertCategory, 'AlertCategory', this.incident.AlertRule.Category);\r\n const { subCategoryEnum, subCategoryString } = this.alertsService.getAlertRuleSubcategoryEnum(this.incident.AlertRule.Category);\r\n this.subCategory = this.translationService.tEnum(subCategoryEnum, subCategoryString, this.incident.AlertRule.SubCategory);\r\n\r\n this.alertsService.parseAlertRecordMetadata(this.incident.AlertRecord);\r\n\r\n\r\n if (this.incident.AlertRecord.alertMetadata) {\r\n this.loadPlot();\r\n };\r\n this.getAllPlotsForAlert();\r\n this.getResolution();\r\n this.getDateStartAndEndLabel();\r\n this.setupPageElements();\r\n this.setupTimeline();\r\n });\r\n }\r\n\r\n private loadPlot() {\r\n if (!this.incident.AlertRecord) {\r\n return;\r\n }\r\n this.plotService.getPlot(this.incident.VehicleId, this.incident.AlertRecord.alertMetadata.PlotId).then(plot => {\r\n if (!plot) {\r\n return;\r\n }\r\n this.incident.AlertRecord.plot = plot;\r\n this.mapCenter = new CoordsModel(this.incident.AlertRecord.plot.Latitude, this.incident.AlertRecord.plot.Longitude);\r\n });\r\n }\r\n\r\n private getAllPlotsForAlert() {\r\n const startTime = new Date(this.incident.StartTime);\r\n const endTime = this.incident.AlertRecord.ClosedAtDataTime ? this.dateService.addOrSubtractTime(this.incident.AlertRecord.ClosedAtDataTime, 1, DateUnit.Min) : new Date();\r\n this.plotService.getPlotsForDateRange(this.incident.VehicleId, startTime, endTime).then(plots => {\r\n if (plots.length > 1 && plots.some(plot => plot.Velocity > 0)) {\r\n const endLabel = this.incident.AlertRecord.ClosedAtDataTime ? this.translationService.t(\"Alerts.AlertEnd\") : this.translationService.t(\"Alerts.CurrLocationOngoing\");\r\n const endIcon = this.incident.AlertRecord.ClosedAtDataTime ? \"flag\" : \"directions_car\";\r\n this.alertPolyline = this.mapService.createPolylineFromPlots(plots);\r\n this.alertLocationMarker = this.mapService.createMapMarker(plots[0], { label: this.translationService.t(\"Alerts.AlertLocation\"), subIcon: \"play_arrow\", showLabel: true });\r\n this.endMapMarker = this.mapService.createMapMarker(plots.slice(-1)[0], { label: endLabel, subIcon: endIcon, showLabel: true });\r\n this.showMapMarkers = true;\r\n }\r\n });\r\n }\r\n\r\n private isAlarmOutsideActiveTimeRange(): boolean {\r\n\r\n if (!this.incident.AlertRecord || !this.incident.AlertRule || !this.incident.AlertRule?.AlertRuleExclusionTimePeriods) {\r\n return;\r\n }\r\n const incidentDayOfWeek = new Date(this.incident.AlertRecord.TriggeredAtDataTimestamp).getDay();\r\n const alertRestrictions = this.incident.AlertRule.AlertRuleExclusionTimePeriods.find(period => {\r\n return period.DayOfWeek === incidentDayOfWeek;\r\n });\r\n\r\n if (!alertRestrictions) {\r\n return false;\r\n }\r\n\r\n const alarmTime = new Date(this.incident.AlertRecord.TriggeredAtDataTimestamp);\r\n\r\n const rationalisedStart = new Date(alertRestrictions.StartTimeAdjusted);\r\n const rationalisedEnd = new Date(alertRestrictions.EndTimeAdjusted);\r\n\r\n if (this.dateService.date1IsAfterDate2(rationalisedEnd, rationalisedStart)) {\r\n return this.dateService.date1IsAfterDate2(alarmTime, rationalisedStart) && this.dateService.date1IsAfterDate2(rationalisedEnd, alarmTime);\r\n }\r\n\r\n return this.dateService.date1IsAfterDate2(alarmTime, rationalisedStart) || this.dateService.date1IsAfterDate2(rationalisedEnd, alarmTime);\r\n }\r\n\r\n\r\n private setupTimeline(): void {\r\n this.timelineEntries = [];\r\n if (!this.incident || !this.incident.AlertRecord || !this.incident.AlertRule) {\r\n return;\r\n }\r\n\r\n let alertRuleHasDelay = false;\r\n\r\n if (this.incident.AlertRule.FirstNotificationDelay > 0) {\r\n alertRuleHasDelay = true;\r\n }\r\n\r\n const alertSendTime: Date = new Date(this.incident.StartTime);\r\n const alarmStartTime: Date = new Date(this.incident.AlertRecord.TriggeredAtDataTimestamp);\r\n\r\n // Alarm Start\r\n\r\n const alarmStartTimelineEntry: ITimelineEntry = {\r\n icon: \"report\",\r\n date: new Date(alarmStartTime),\r\n largeDetails: {\r\n title: this.translationService.t(\"Alerts.AlarmStarted\"),\r\n listItems: [{\r\n verb: `${this.category} ${this.subCategory ? ' > ' + this.subCategory : ''}`\r\n }]\r\n }\r\n }\r\n\r\n if (this.isAlarmOutsideActiveTimeRange()) {\r\n alarmStartTimelineEntry.largeDetails.listItems.push({\r\n verb: this.translationService.t(\"Alerts.AlarmOutsideTimeRange\")\r\n })\r\n }\r\n\r\n this.timelineEntries.push(alarmStartTimelineEntry);\r\n\r\n // Alert Start\r\n\r\n const firstNotificationSentTimelineEntry: ITimelineEntry = {\r\n icon: \"notifications\",\r\n date: new Date(alertSendTime),\r\n largeDetails: {\r\n title: this.translationService.t(\"Alerts.NotificationFirstSent\"),\r\n listItems: [{\r\n verb: this.translationService.t(\"Alerts.AlarmSentToRecipients\", this.incident.AlertRule.Recipients?.length)\r\n }]\r\n }\r\n }\r\n\r\n if (this.isAlarmOutsideActiveTimeRange()) {\r\n firstNotificationSentTimelineEntry.largeDetails.listItems.unshift({\r\n verb: this.translationService.t(\"Alerts.DelayedByTimeRange\")\r\n })\r\n }\r\n\r\n if (alertRuleHasDelay) {\r\n firstNotificationSentTimelineEntry.largeDetails.listItems.unshift({\r\n verb: this.translationService.t(\"Alerts.DelayedByMinutes\", this.incident.AlertRule.FirstNotificationDelay)\r\n })\r\n }\r\n\r\n this.timelineEntries.push(firstNotificationSentTimelineEntry);\r\n\r\n // Alert resend\r\n\r\n if (this.incident.AlertRule?.ResendAlerts && this.incident.AlertRecord.SentCount > 1) {\r\n const mostRecentNotificationSentTimelineEntry: ITimelineEntry = {\r\n icon: \"notifications\",\r\n date: new Date(String(this.incident.AlertRecord.LastSent)),\r\n largeDetails: {\r\n title: this.translationService.t(\"Alerts.MostRecentNotification\"),\r\n listItems: [{\r\n verb: this.translationService.t(\"Alerts.ResendsOn\")\r\n },\r\n {\r\n verb: this.translationService.t(\"Alerts.AlertSentCount\", this.incident.AlertRecord.SentCount)\r\n }]\r\n }\r\n }\r\n\r\n\r\n this.timelineEntries.push(mostRecentNotificationSentTimelineEntry);\r\n }\r\n // Alarm end time\r\n if (this.incident.AlertRecord.ClosedAtDataTime) {\r\n this.timelineEntries.push({\r\n icon: \"stop\",\r\n date: this.incident.AlertRecord.ClosedAtDataTime as Date,\r\n largeDetails: {\r\n title: this.translationService.t(\"Alerts.AlarmEnded\"),\r\n }\r\n });\r\n }\r\n\r\n if (this.incident.AlertReviewEvents.length) {\r\n this.incident.AlertReviewEvents.forEach(event => {\r\n let icon = \"update\";\r\n let listItems: { verb: string; date?: Date }[] = [];\r\n let text: string = '';\r\n\r\n if (event.Notes) {\r\n text = event.Notes;\r\n }\r\n\r\n if (event.ResolutionCodeId && event.Status === AlertReviewStatus.Closed) {\r\n icon = \"check_circle\";\r\n listItems.push({\r\n verb: this.resolutionCodes.find(code => code.Id === event.ResolutionCodeId).Name,\r\n });\r\n }\r\n\r\n this.timelineEntries.push({\r\n icon: icon,\r\n date: event.CreatedTime,\r\n largeDetails: {\r\n title: `${this.translationService.t(\"Alerts.ResolvedBy\")} ${event.User?.CurrentAccountUserMapping?.Name ||\r\n this.translationService.t(\"Common.UnknownUser\")}`,\r\n text: text,\r\n listItems: listItems\r\n }\r\n });\r\n });\r\n\r\n }\r\n }\r\n}\r\n\r\nexport class IncidentDetailComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: any;\r\n\r\n constructor() {\r\n this.bindings = {\r\n incidentId: \"<\"\r\n };\r\n\r\n this.controller = IncidentDetailComponentComponentController;\r\n this.template = require(\"./incidentDetail.component.html\");\r\n }\r\n}\r\n\r\n","module.exports = \"

    {{ 'Alerts.ManageAlertsAccessDenied' | translate}}

    {{ 'Alerts.ManageAlertsAccessDeniedDescription' | translate}}

    {{$ctrl.incident.AlertRule.Name}} {{ $ctrl.statusString }} {{ $ctrl.incident.Vehicle.Driver.Name || 'No Driver' }} {{ 'DriverSummaryPanel.NoDriver' | translate }} {{ $ctrl.incident.CreatedTime | veriDate : 'full' }} {{ 'IncidentDetails.ShowPreviousAlertsButton' | translate }} {{ 'Alerts.ResolveIncident' | translate}}

    {{ 'Alerts.AlertInfo' | translate}}

    {{$ctrl.category}} {{$ctrl.subCategory ? '> ' + $ctrl.subCategory : ''}} {{ $ctrl.alertRaisedDateTime | veriDate : 'full' }} {{ $ctrl.dateStartAndEndLabel }} ({{ $ctrl.incident.AlertRecord.ClosedAtDataTime ? $ctrl.incidentDurationToResolve : 'Ongoing'}})
    {{$ctrl.incidentResolutionCode}} {{$ctrl.incidentResolutionComment}} {{$ctrl.incidentResolveByUser}} {{$ctrl.incident.EndTime | veriDate : 'full'}}

    {{'Alerts.AlarmData' | translate}}

    {{ 'Common.Temperature' | translate}}

    {{ 'Alerts.AlertLocation' | translate}} ({{'Alerts.VehicleMoving' | translate}}{{'Alerts.VehicleStationary' | translate}})

    {{'Alerts.AuditTrail' | translate}}

    \";","import { IAutocompleteMatch } from \"@directives/_forms/autocomplete/autocomplete.component\";\r\nimport { IPhoneNumberOutput } from \"@directives/_forms/smsInput/smsInput.interfaces\";\r\nimport { DayOfWeek } from \"@enums/DayOfWeek\";\r\nimport { NotificationRecipientType } from \"@enums/NotificationRecipientType\";\r\nimport { NotificationRecordStatus } from \"@enums/NotificationRecordStatus\";\r\nimport { ResourceType } from \"@enums/ResourceType\";\r\nimport { IKeyValuePair } from \"@interfaces/IKeyValuePair\";\r\nimport { IUser } from \"@interfaces/IUser\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { IGroup } from \"@interfaces/IVehicleGroup\";\r\nimport { EnumService } from \"@services/enum.service\";\r\nimport { GroupService } from \"@services/group.service.ajs\";\r\nimport { SessionService } from \"@services/session.service\";\r\nimport { ITranslationLocale, TranslationService } from \"@services/translation.service\";\r\nimport { UnitConversionService, UnitConversionType } from \"@services/unitConversion.service\";\r\nimport { UsersService } from \"@services/users.service\";\r\nimport { ValidationService } from \"@services/validation.service\";\r\nimport { Currency, DistanceMeasurement, PreferencesService, TemperatureMeasurement, VolumeMeasurement } from \"@services/preferences.service\"\r\nimport { SettingsName } from \"src/app/class/SettingsName\";\r\nimport * as angular from \"angular\";\r\nimport copy from \"fast-copy/dist/fast-copy.esm.js\";\r\nimport { AlertCategory, RecipientDeliveryType, RecipientType, ResourceFilterType, TriggerValueOperator, VehicleAlertSubCategory, AlertPreferenceType } from \"src/app/main/modules/alerts/_enums/alerts.enums\";\r\nimport { IAlertFilterCriteria, IAlertRule, IAlertRuleRecipient } from \"../../_models/alerts.interfaces\";\r\nimport { AlertsService, IAlertCategoryTrigger } from \"../../_services/alerts.service\";\r\nimport './alertEditor.component.scss';\r\nimport { ICombinedPreferences } from \"@interfaces/ICombinedPreferences\";\r\nimport { ResendIntervalType } from \"src/app/main/modules/alerts/_enums/alertEditor.enums\";\r\nimport { AlertRuleStatus } from \"src/app/main/modules/alerts/_enums/AlertRuleStatus.enums\";\r\nimport { ReasonCode } from \"@enums/ReasonCode\";\r\nimport { ITimeZoneInfo } from \"src/app/userPreferences/model/ITimeZoneInfo\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport { DateService } from \"@app/services/date.service\";\r\n\r\ninterface ITimeRangeSelection {\r\n from?: IHourMinute;\r\n to?: IHourMinute;\r\n}\r\n\r\ninterface IHourMinute {\r\n hour?: number;\r\n minute?: number;\r\n}\r\n\r\ninterface IRecipientValidation {\r\n valid?: boolean;\r\n error?: string;\r\n}\r\n\r\ninterface IConversationalSegment {\r\n id?: number;\r\n label: string;\r\n styleClass?: string;\r\n}\r\n\r\ninterface IComponentBindings {\r\n alertRule: IAlertRule;\r\n autoLoadedRecordId: number;\r\n onAlertEditorCancelled: () => void;\r\n onAlertEditorSaved: () => void;\r\n}\r\n\r\n\r\nclass AlertEditorComponentController implements angular.IComponentController, IComponentBindings {\r\n\r\n // bindings\r\n alertRule: IAlertRule;\r\n autoLoadedRecordId: number;\r\n onAlertEditorCancelled: () => void;\r\n onAlertEditorDeleted: () => void;\r\n onAlertEditorSaved: () => void;\r\n\r\n dirtyAlertRule: IAlertRule;\r\n\r\n // misc\r\n alertForm: any;\r\n\r\n // enums\r\n AlertCategory = AlertCategory;\r\n VehicleSubAlertCatagory = VehicleAlertSubCategory;\r\n ReasonCode = ReasonCode;\r\n ResourceType = ResourceType;\r\n DayOfWeek = DayOfWeek;\r\n daysOfWeek: IKeyValuePair[];\r\n recipientTypes: IKeyValuePair[] = [];\r\n recipientDeliveryTypes: IKeyValuePair[] = [];\r\n distanceUnitTypes: IKeyValuePair[] = [];\r\n temperatureUnitTypes: IKeyValuePair[] = [];\r\n volumeUnitTypes: IKeyValuePair[] = [];\r\n currencyTypes: IKeyValuePair[] = [];\r\n\r\n alertCategories: any[] = [];\r\n reasonCodes: any[] = [];\r\n\r\n // prepared for DayOfWeekSelector component\r\n allDays: DayOfWeek[] = [DayOfWeek.Sunday, DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Friday, DayOfWeek.Saturday];\r\n weekDays: DayOfWeek[] = [DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Friday];\r\n weekendDays: DayOfWeek[] = [DayOfWeek.Sunday, DayOfWeek.Saturday];\r\n\r\n // raw data\r\n groups: IGroup[] = [];\r\n users: IUser[] = [];\r\n vehicles: IVehicle[] = [];\r\n existingAlertRules: IAlertRule[] = [];\r\n locales: ITranslationLocale[];\r\n timezones: ITimeZoneInfo[];\r\n\r\n // spinners\r\n isLoadingAlertNotifications = false;\r\n isLoadingAlertRecords: boolean = false;\r\n isSavingAlertRule: boolean = false;\r\n isFormReady: boolean = false;\r\n\r\n recipientAddError: string;\r\n enableDelay: boolean = false;\r\n resendMinuteInterval: number;\r\n resendIntervalType: ResendIntervalType = ResendIntervalType.Minutes;\r\n alertRuleRecordVehicles: any[] = [];\r\n timeRange: ITimeRangeSelection;\r\n inputTypeFilter: IAlertFilterCriteria = null;\r\n subCategoryUnits: IKeyValuePair[] = [];\r\n\r\n alertExclusionDays: boolean[] = [];\r\n\r\n newRecipient: IAlertRuleRecipient = {\r\n type: RecipientType.Group\r\n };\r\n\r\n weekDaysDescriptor: string;\r\n currentTabIndex: number = 0;\r\n\r\n alertCategoryTriggers: IAlertCategoryTrigger[] = [];\r\n\r\n selectedHistoryDate: Date;\r\n delayResendIcon: string;\r\n\r\n filteredStartMinuteOfDay: number;\r\n filteredEndMinuteOfDay: number;\r\n timeRangeValid: boolean;\r\n\r\n newRecipientSmsInput: string;\r\n\r\n defaultDelayValue: number = 10;\r\n defaultResendValue: number = 60;\r\n\r\n conversationalSegments: IConversationalSegment[] = [];\r\n conversationalSegmentsString: string;\r\n\r\n alertPreferences: string[] = [];\r\n\r\n alertPreferenceTypes: AlertPreferenceType;\r\n\r\n combinedPreferences: ICombinedPreferences;\r\n languagePreferenceValue: number = AlertPreferenceType.Language;\r\n timezonePreferenceValue: number = AlertPreferenceType.Timezone;\r\n\r\n validationError: string;\r\n\r\n alertIsActive: boolean;\r\n\r\n get errorMessage(): string {\r\n if (this.dirtyAlertRule?.Name === undefined) {\r\n return this.translationService.t(\"AlertEditor.errorCompleteRequiredFields\")\r\n }\r\n\r\n if (this.dirtyAlertRule?.Recipients?.length === 0) {\r\n return this.translationService.t(\"AlertEditor.errorAddRecipientRequired\");\r\n }\r\n\r\n if (this.isSavingAlertRule) {\r\n return this.translationService.t(\"AlertEditor.SavingAlertRule\");\r\n }\r\n\r\n return this.translationService.t(\"AlertEditor.UnknownAlertError\");\r\n } \r\n\r\n get canSaveRule(): boolean {\r\n\r\n return !!this.dirtyAlertRule?.Name\r\n && this.dirtyAlertRule.Recipients?.length >= 1\r\n && !this.alertForm.$invalid\r\n && !this.isSavingAlertRule;\r\n }\r\n\r\n static $inject = [\"$q\", \"alertsService\", \"dateService\", \"groupService\", \"usersService\", \"vehicleService\", \"unitConversionService\", \"translationService\", \"validationService\", \"sessionService\", \"preferencesService\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly alertsService: AlertsService,\r\n private readonly dateService: DateService,\r\n private readonly groupService: GroupService,\r\n private readonly usersService: UsersService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly unitConversionService: UnitConversionService,\r\n private readonly translationService: TranslationService,\r\n private readonly validationService: ValidationService,\r\n private readonly sessionService: SessionService,\r\n private readonly preferencesService: PreferencesService) {\r\n }\r\n\r\n $onInit() {\r\n this.alertCategoryTriggers = this.alertsService.createAlertTriggerMappings();\r\n this.setupEnumArrays();\r\n this.selectedHistoryDate = new Date();\r\n this.combinedPreferences = this.sessionService.getItem(SettingsName.UserOptions);\r\n this.setupRule();\r\n\r\n }\r\n\r\n onAlertCategoryChanged(): void {\r\n this.resetDelayAndResendIfNeeded();\r\n this.updateConversationalSegments();\r\n this.setDefaultValueOfCategoryTrigger();\r\n this.setInputTypeFilter();\r\n this.setUIAlertPreferences();\r\n }\r\n\r\n onAlertCategoryTriggerChanged(): void {\r\n if (this.dirtyAlertRule.SubCategory == VehicleAlertSubCategory.PlotReason) {\r\n this.dirtyAlertRule.TriggerValue = ReasonCode.IgnitionOn;\r\n this.dirtyAlertRule.TriggerValueOperator = TriggerValueOperator.Equals;\r\n } else {\r\n this.dirtyAlertRule.TriggerValue = undefined;\r\n }\r\n\r\n this.resetDelayAndResendIfNeeded();\r\n this.updateConversationalSegments();\r\n this.getSubCategoryUnitsList();\r\n }\r\n\r\n onEnableDelayChanged(enabled: boolean): void {\r\n this.dirtyAlertRule.FirstNotificationDelay = (!enabled) ? null : this.dirtyAlertRule?.FirstNotificationDelay || this.defaultDelayValue;\r\n\r\n this.setLocalDelayVars();\r\n this.updateConversationalSegments();\r\n }\r\n\r\n onDelayChanged(): void {\r\n this.updateConversationalSegments();\r\n }\r\n\r\n onEnableResendAlertsChanged(enabled: boolean): void {\r\n this.dirtyAlertRule.ResendMinuteInterval = (!enabled) ? null : this.dirtyAlertRule?.ResendMinuteInterval || this.defaultResendValue;\r\n\r\n this.setLocalResendVars();\r\n this.updateConversationalSegments();\r\n }\r\n\r\n onResendMinuteIntervalChanged(): void {\r\n this.updateResendMinuteInterval(this.resendIntervalType, this.resendMinuteInterval);\r\n }\r\n\r\n onResendIntervalTypeChanged(): void {\r\n this.updateResendMinuteInterval(this.resendIntervalType, this.resendMinuteInterval);\r\n }\r\n\r\n onSmsOutputChanged($event: IPhoneNumberOutput): void {\r\n this.newRecipient.Custom = $event?.internationalized;\r\n }\r\n\r\n changeTabIndex(tabIndex: number): void {\r\n this.currentTabIndex = tabIndex;\r\n }\r\n\r\n validateAlertName(value: string): boolean {\r\n if (!value) {\r\n return false;\r\n }\r\n\r\n return !this.hasForDuplicateAlertName(value) && !this.inputContainsInvalidChars(value);\r\n }\r\n\r\n inputContainsInvalidChars(input: string) {\r\n /* Test if input contains anything other than\r\n * alphanumeric characters or - or :\r\n * and display the relevant error if so.\r\n * Prevents malicious input such as script tags.\r\n */\r\n\r\n const regex: RegExp = /[^\\u00C0-\\u024F\\u1E00-\\u1EFF\\w\\d\\s:-]/;\r\n const invalidInput = regex.test(input);\r\n if (invalidInput) {\r\n this.validationError = this.translationService.t('AlertEditor.InvalidChars');\r\n }\r\n return invalidInput;\r\n }\r\n\r\n phoneNumberIsValid(phoneNumber: string): boolean {\r\n \r\n return this.isInternationalPhoneNumberValid(phoneNumber);\r\n\r\n }\r\n\r\n isInternationalPhoneNumberValid(phoneNumber: string): boolean {\r\n const regex: RegExp = /^\\+(?:[0-9] ?){6,14}[0-9]$/;\r\n\r\n return regex.test(phoneNumber);\r\n }\r\n\r\n addRecipient(): void {\r\n this.clearRecipientAddError();\r\n\r\n let newRecipient: IAlertRuleRecipient = copy(this.newRecipient);\r\n const currentRecipientType: RecipientType = newRecipient?.type;\r\n const currentRecipientDeliveryType: RecipientDeliveryType = newRecipient?.RecipientType;\r\n\r\n this.replaceEmailRecipientWithUser(newRecipient);\r\n\r\n const recipientValidation: IRecipientValidation = this.isValidRecipient(newRecipient);\r\n\r\n if (!recipientValidation.valid) {\r\n const retainCustomValue: boolean = (currentRecipientType == RecipientType.Custom);\r\n const errorReason: string = (recipientValidation?.error) ? recipientValidation?.error : this.translationService.t(`AlertEditor.errorAddingRecipient`);\r\n this.recipientAddError = `${errorReason}`;\r\n\r\n this.resetNewRecipientPlaceholder(currentRecipientType, currentRecipientDeliveryType, retainCustomValue);\r\n return;\r\n }\r\n\r\n this.addLabelsToRecipient(newRecipient);\r\n newRecipient.deliveryTypeTooltip = this.getRecipientDeliveryTypeTooltip(newRecipient);\r\n\r\n this.dirtyAlertRule.Recipients.push(newRecipient);\r\n this.resetNewRecipientPlaceholder(currentRecipientType, currentRecipientDeliveryType);\r\n this.updateConversationalSegments();\r\n }\r\n\r\n removeRecipient(recipient: IAlertRuleRecipient): void {\r\n this.dirtyAlertRule.Recipients = this.dirtyAlertRule?.Recipients.filter(currentRecipient => currentRecipient !== recipient);\r\n this.updateConversationalSegments();\r\n }\r\n\r\n onChangeRecipientType(type: RecipientType): void {\r\n this.resetNewRecipientPlaceholder(type, this.newRecipient.RecipientType);\r\n }\r\n\r\n onChangeRecipientDeliveryType(deliveryType: RecipientDeliveryType): void {\r\n this.resetNewRecipientPlaceholder(this.newRecipient.type, deliveryType);\r\n }\r\n\r\n onRecipientUserChange(recipient: IAlertRuleRecipient, $match: IAutocompleteMatch): void {\r\n if (!recipient || !$match?.objectId) {\r\n return;\r\n }\r\n\r\n recipient.UserId = $match.objectId;\r\n }\r\n\r\n onRecipientGroupChange(recipient: IAlertRuleRecipient, $match: IAutocompleteMatch): void {\r\n if (!recipient || !$match?.objectId) {\r\n return;\r\n }\r\n\r\n recipient.GroupId = $match.objectId;\r\n }\r\n\r\n onTimeRangeFromChanged(hour: number, minute: number): void {\r\n this.timeRange.from.hour = hour;\r\n this.timeRange.from.minute = minute;\r\n this.updateStartMinuteOfDay(this.timeRange.from);\r\n\r\n this.generateExclusionTimePeriodsForAlert(this.dirtyAlertRule);\r\n }\r\n\r\n onTimeRangeToChanged(hour: number, minute: number): void {\r\n this.timeRange.to.hour = hour;\r\n this.timeRange.to.minute = minute;\r\n this.updateEndMinuteOfDay(this.timeRange.to);\r\n\r\n this.generateExclusionTimePeriodsForAlert(this.dirtyAlertRule);\r\n }\r\n\r\n selectedFilterChange(filter: IAlertFilterCriteria, $match: IAutocompleteMatch) {\r\n filter.All = false;\r\n filter.GroupId = null;\r\n filter.ResourceId = $match?.objectId;\r\n }\r\n\r\n selectedVehicleGroupChange(filter: IAlertFilterCriteria, $match: IAutocompleteMatch) {\r\n filter.All = false;\r\n filter.GroupId = $match?.objectId;\r\n filter.ResourceId = null;\r\n }\r\n\r\n onFilterTypeUpdate(filter: IAlertFilterCriteria): void {\r\n\r\n switch (filter.filterType as any) { \r\n case \"1\":\r\n filter.ResourceId = null;\r\n break;\r\n case \"2\":\r\n filter.GroupId = null;\r\n break;\r\n default:\r\n filter.ResourceId = null;\r\n filter.GroupId = null;\r\n break;\r\n }\r\n }\r\n\r\n deleteRule() {\r\n this.alertsService\r\n .deleteRule(this.alertRule)\r\n .then(() => {\r\n if (this.onAlertEditorDeleted) {\r\n this.onAlertEditorDeleted();\r\n }\r\n });\r\n }\r\n\r\n saveRule() {\r\n this.isSavingAlertRule = true;\r\n\r\n this.dirtyAlertRule.FirstNotificationDelay = (this.dirtyAlertRule.FirstNotificationDelay === 0) ? null : this.dirtyAlertRule.FirstNotificationDelay;\r\n this.dirtyAlertRule.ResendMinuteInterval = (this.dirtyAlertRule.ResendMinuteInterval === 0) ? null : this.dirtyAlertRule.ResendMinuteInterval;\r\n this.dirtyAlertRule.AlertRuleExclusionTimePeriods?.forEach(period => period.TimeZoneId = this.dateService.getLocalTimezone());\r\n\r\n this.runConversionForModel();\r\n this.setAlertRulePreferences();\r\n\r\n this.alertsService\r\n .saveRule(this.dirtyAlertRule)\r\n .then(alert => {\r\n this.alertRule = alert;\r\n this.dirtyAlertRule = copy(alert);\r\n\r\n if (this.onAlertEditorSaved) {\r\n this.onAlertEditorSaved();\r\n }\r\n })\r\n .finally(() => {\r\n this.runConversionForView();\r\n this.isSavingAlertRule = false;\r\n });\r\n }\r\n\r\n getNotificationStatus(notificationStatus: number): string {\r\n if (notificationStatus in NotificationRecordStatus) {\r\n return NotificationRecordStatus[notificationStatus];\r\n }\r\n return \"\";\r\n }\r\n\r\n getRecipientType(recipientType: number): string {\r\n if (recipientType in NotificationRecipientType) {\r\n return NotificationRecipientType[recipientType];\r\n }\r\n return \"\";\r\n }\r\n\r\n\r\n toggleDayOfWeek(toggledDayOfWeek: DayOfWeek, forceOverride: boolean = false, overrideValue: boolean = false): void {\r\n const newExclusionDays: boolean[] = [];\r\n\r\n this.daysOfWeek?.forEach((dayOfWeek, index) => {\r\n const currentDayOfWeekValue: any = dayOfWeek.value;\r\n const isToggledDay: boolean = toggledDayOfWeek == currentDayOfWeekValue;\r\n\r\n if (isToggledDay) {\r\n newExclusionDays[index] = (forceOverride) ? overrideValue : !this.alertExclusionDays[index];\r\n } else {\r\n const existingDayValue: boolean | undefined = this.alertExclusionDays[index];\r\n newExclusionDays[index] = (existingDayValue === undefined) ? false : this.alertExclusionDays[index];\r\n }\r\n });\r\n\r\n this.alertExclusionDays = [...newExclusionDays];\r\n\r\n if (!forceOverride) {\r\n this.generateExclusionTimePeriodsForAlert(this.dirtyAlertRule);\r\n }\r\n }\r\n\r\n selectDaysOfWeek(includedDaysOfWeek: DayOfWeek[]): void {\r\n const excludedDaysOfWeek: DayOfWeek[] = this.allDays.filter(day => includedDaysOfWeek.indexOf(day) === -1);\r\n\r\n includedDaysOfWeek.forEach(dayOfWeek => {\r\n this.toggleDayOfWeek(dayOfWeek, true, false);\r\n });\r\n\r\n excludedDaysOfWeek.forEach(dayOfWeek => {\r\n this.toggleDayOfWeek(dayOfWeek, true, true);\r\n });\r\n\r\n this.generateExclusionTimePeriodsForAlert(this.dirtyAlertRule);\r\n }\r\n\r\n cancel(): void {\r\n if (this.onAlertEditorCancelled) {\r\n this.onAlertEditorCancelled();\r\n }\r\n }\r\n\r\n updateDirtyAlertRuleStatus() {\r\n this.dirtyAlertRule.Status = this.alertIsActive ? AlertRuleStatus.Active : AlertRuleStatus.Paused;\r\n }\r\n\r\n //-----\r\n\r\n private setDefaultValueOfCategoryTrigger(): void {\r\n const triggerKeys: any[] = Object.keys(this.alertCategoryTriggers[this.dirtyAlertRule.Category].enum);\r\n\r\n this.dirtyAlertRule.SubCategory = triggerKeys[0];\r\n this.getSubCategoryUnitsList();\r\n }\r\n\r\n private updateResendMinuteInterval(intervalType: ResendIntervalType, minuteInterval: number): void {\r\n this.dirtyAlertRule.ResendMinuteInterval = (intervalType == ResendIntervalType.Minutes) ? minuteInterval : minuteInterval * 60;\r\n\r\n this.updateConversationalSegments();\r\n }\r\n\r\n private updateConversationalSegments(): void {\r\n const newConversationalSegments: IConversationalSegment[] = [];\r\n\r\n if (!this.dirtyAlertRule) {\r\n return;\r\n }\r\n\r\n if (AlertCategory[this.dirtyAlertRule.Category]) {\r\n newConversationalSegments.push({\r\n styleClass: `value`,\r\n label: this.translationService.t(`AlertCategoryEnum.${this.AlertCategory[this.dirtyAlertRule?.Category]}`)\r\n });\r\n }\r\n\r\n if (this.alertCategoryTriggers[this.dirtyAlertRule.Category] && this.alertCategoryTriggers[this.dirtyAlertRule.Category].enum[this.dirtyAlertRule.SubCategory]) {\r\n newConversationalSegments.push({\r\n styleClass: `conditional`,\r\n label: this.translationService.t(`AlertEditor.conversationalWordTriggers`)\r\n });\r\n\r\n newConversationalSegments.push({\r\n styleClass: `value`,\r\n label: this.translationService.t(\r\n `${this.alertCategoryTriggers[this.dirtyAlertRule.Category].enumName}Enum.${this.alertCategoryTriggers[this.dirtyAlertRule.Category].enum[this.dirtyAlertRule.SubCategory]}`\r\n )\r\n });\r\n }\r\n\r\n if (this.dirtyAlertRule.FirstNotificationDelay > 0) {\r\n newConversationalSegments.push({\r\n styleClass: `conditional`,\r\n label: this.translationService.t(`AlertEditor.conversationalWordAfter`)\r\n });\r\n\r\n newConversationalSegments.push({\r\n styleClass: `value`,\r\n label: this.translationService.t(`AlertEditor.conversationalDelayMinutes`, this.dirtyAlertRule.FirstNotificationDelay)\r\n });\r\n }\r\n\r\n if (this.dirtyAlertRule.Recipients?.length) {\r\n newConversationalSegments.push({\r\n styleClass: `conditional`,\r\n label: this.translationService.t(`AlertEditor.conversationalWordSendingTo`)\r\n });\r\n\r\n const recipientLabel = `${this.dirtyAlertRule.Recipients[0].primaryLabel}`;\r\n const totalRecipientCount = this.getTotalRecipientCount(this.dirtyAlertRule.Recipients);\r\n const totalOtherCount = totalRecipientCount - 1;\r\n\r\n const otherWordage = this.translationService.t(`AlertEditor.conversationalWordOther`, totalOtherCount);\r\n const recipientMoreLabel = (totalRecipientCount > 1)\r\n ? this.translationService.t(`Common.AndXY`, [totalOtherCount, otherWordage])\r\n : ``;\r\n\r\n const finalLabel = `${recipientLabel} ${recipientMoreLabel}`;\r\n\r\n newConversationalSegments.push({\r\n styleClass: `value`,\r\n label: finalLabel\r\n });\r\n }\r\n\r\n if (this.dirtyAlertRule.ResendAlerts && this.dirtyAlertRule.ResendMinuteInterval > 0) {\r\n newConversationalSegments.push({\r\n styleClass: `conditional`,\r\n label: this.translationService.t(`AlertEditor.conversationalWordResendingEvery`)\r\n });\r\n\r\n const pluralNumber: number = (this.resendIntervalType == ResendIntervalType.Minutes)\r\n ? this.dirtyAlertRule.ResendMinuteInterval\r\n : this.dirtyAlertRule.ResendMinuteInterval / 60;\r\n\r\n const pluralWord = (this.resendIntervalType == ResendIntervalType.Minutes)\r\n ? this.translationService.t(`AlertEditor.resendIntervalTypeMinutes`, pluralNumber)\r\n : this.translationService.t(`AlertEditor.resendIntervalTypeHours`, pluralNumber);\r\n\r\n newConversationalSegments.push({\r\n styleClass: `value`,\r\n label: `${pluralNumber} ${pluralWord}`\r\n });\r\n }\r\n\r\n if (this.weekDaysDescriptor) {\r\n newConversationalSegments.push({\r\n styleClass: `conditional`,\r\n label: this.translationService.t(`AlertEditor.conversationalWordOn`)\r\n });\r\n\r\n newConversationalSegments.push({\r\n styleClass: `value`,\r\n label: `${this.weekDaysDescriptor}`\r\n });\r\n }\r\n\r\n newConversationalSegments.forEach((segment, index) => segment.id = index);\r\n\r\n this.conversationalSegments = newConversationalSegments;\r\n }\r\n\r\n private getTotalRecipientCount(recipients: IAlertRuleRecipient[] = []): number {\r\n let recipientCount = 0;\r\n\r\n recipients?.forEach((recipient, index) => {\r\n if (recipient?.GroupId && index > 0) {\r\n recipientCount += this.getUserCountFromGroupId(recipient.GroupId);\r\n } else {\r\n recipientCount++;\r\n }\r\n });\r\n\r\n return recipientCount;\r\n }\r\n\r\n private getUserCountFromGroupId(groupId: number): number {\r\n const group: IGroup = this.groups.find(group => group.Id === groupId);\r\n\r\n return group?.UserIds?.length;\r\n }\r\n\r\n private getData(): angular.IPromise {\r\n const alertRulesPromise = this.alertsService.getActiveAlertRules();\r\n const groupsPromise = this.groupService.getGroups();\r\n const usersPromise = this.usersService.getUsers({ includeAdmins: true });\r\n const vehiclesPromise = this.vehicleService.getVehicles({ includePeripheralMappings: true });\r\n const timezonesPromise = this.preferencesService.getTimezones();\r\n const localesPromise = this.translationService.getListOfLocales();\r\n\r\n return this.$q\r\n .all([groupsPromise, usersPromise, vehiclesPromise, alertRulesPromise, timezonesPromise, localesPromise ])\r\n .then(([groups, users, vehicles, alertRules, timezones, locales]) => {\r\n this.groups = groups;\r\n this.users = users; \r\n this.vehicles = vehicles;\r\n this.existingAlertRules = alertRules;\r\n this.timezones = timezones;\r\n this.locales = locales.filter(locale => locale.Locale != \"qa\");\r\n });\r\n } \r\n\r\n private resetDelayAndResendIfNeeded(): void {\r\n const alertCategory = this.dirtyAlertRule?.Category;\r\n\r\n if (!alertCategory) {\r\n return;\r\n }\r\n\r\n const alertCategoryTrigger = this.alertCategoryTriggers[this.dirtyAlertRule.Category]\r\n\r\n if (!alertCategoryTrigger) {\r\n return;\r\n }\r\n\r\n const categoryAllowedDelayResend = alertCategoryTrigger.categoryAllowedDelayResend;\r\n const categoryTriggerAllowedDelayResend = alertCategoryTrigger.categoryAllowedDelayResend || alertCategoryTrigger.subCategoriesAllowedDelayResend?.[this.dirtyAlertRule?.SubCategory]\r\n\r\n if (!categoryAllowedDelayResend && !categoryTriggerAllowedDelayResend) {\r\n this.resetAlertDelayAndResend(this.dirtyAlertRule);\r\n }\r\n }\r\n\r\n private resetAlertDelayAndResend(alertRule: IAlertRule): void {\r\n if (!alertRule) {\r\n return;\r\n }\r\n\r\n this.enableDelay = false;\r\n this.resendMinuteInterval = 0;\r\n\r\n alertRule.ResendAlerts = false;\r\n alertRule.ResendMinuteInterval = null;\r\n alertRule.FirstNotificationDelay = null;\r\n }\r\n\r\n private availablePlotReasonsForAlerting: string[] = [\"IgnitionOn\", \"IgnitionOff\"];\r\n\r\n private setupEnumArrays(): void {\r\n this.reasonCodes = EnumService.enumToArray(\"ReasonCode\", ReasonCode);\r\n\r\n this.reasonCodes = this.reasonCodes.filter(code => {\r\n return this.availablePlotReasonsForAlerting.includes(code.name);\r\n });\r\n this.reasonCodes.sort((reasonCode1, resaonCode2) => (reasonCode1.value > resaonCode2.value) ? 1 : -1);\r\n\r\n this.alertCategories = EnumService.enumToArray(\"AlertCategory\", AlertCategory);\r\n this.alertCategories.sort((category1, category2) => (category1.value > category2.value) ? 1 : -1);\r\n\r\n this.daysOfWeek = EnumService.enumToArray(\"DayOfWeek\", DayOfWeek);\r\n this.daysOfWeek.sort((day1, day2) => (day1.value > day2.value) ? 1 : -1);\r\n\r\n this.recipientTypes = EnumService.enumToArray(\"RecipientType\", RecipientType);\r\n this.recipientTypes.sort((recipientType1, recipientType2) => (recipientType1.value > recipientType2.value) ? 1 : -1);\r\n\r\n this.recipientDeliveryTypes = EnumService.enumToArray(\"RecipientDeliveryType\", RecipientDeliveryType);\r\n this.recipientDeliveryTypes.sort((recipientDeliveryType1, recipientDeliveryType2) => (recipientDeliveryType1.value > recipientDeliveryType2.value) ? 1 : -1);\r\n\r\n this.distanceUnitTypes = EnumService.enumToArray(\"DistanceMeasurement\", DistanceMeasurement);\r\n this.distanceUnitTypes.sort((distanceUnitType1, distanceUnitType2) => (distanceUnitType1.value > distanceUnitType2.value) ? 1 : -1);\r\n\r\n this.temperatureUnitTypes = EnumService.enumToArray(\"TemperatureMeasurement\", TemperatureMeasurement);\r\n this.temperatureUnitTypes.sort((temperatureUnitType1, temperatureUnitType2) => (temperatureUnitType1.value > temperatureUnitType2.value) ? 1 : -1);\r\n\r\n this.volumeUnitTypes = EnumService.enumToArray(\"VolumeMeasurement\", VolumeMeasurement);\r\n this.volumeUnitTypes.sort((volumeUnitType1, volumeUnitType2) => (volumeUnitType1.value > volumeUnitType2.value) ? 1 : -1);\r\n\r\n this.currencyTypes = EnumService.enumToArray(\"Currency\", Currency);\r\n this.currencyTypes.sort((currencyType1, currencyType2) => (currencyType1.value > currencyType2.value) ? 1 : -1);\r\n }\r\n\r\n private setupRule(): void {\r\n this.getData().finally(() => {\r\n\r\n if (!this.alertRule) {\r\n this.alertRule = this.createDefaultRule();\r\n this.setDefaultAlertRulePreferences();\r\n }\r\n\r\n this.setDelayResendIcon();\r\n\r\n this.resetNewRecipientPlaceholder(RecipientType.Group, RecipientDeliveryType.Email);\r\n\r\n this.getSubCategoryUnitsList();\r\n this.processAlertRule(this.alertRule);\r\n\r\n this.setUIAlertPreferences();\r\n this.runConversionForView();\r\n\r\n\r\n this.isFormReady = true;\r\n });\r\n }\r\n\r\n private clearRecipientAddError(): void {\r\n this.recipientAddError = ``;\r\n }\r\n\r\n private replaceEmailRecipientWithUser(recipient: IAlertRuleRecipient): void {\r\n if (recipient?.RecipientType !== RecipientDeliveryType.Email) {\r\n return;\r\n }\r\n\r\n const user: IUser = this.users.find(user => user.Email?.toLowerCase()?.trim() === recipient?.Custom?.toLowerCase()?.trim());\r\n\r\n if (user && user?.Id) {\r\n recipient.RecipientType = RecipientDeliveryType.Email;\r\n recipient.type = RecipientType.User;\r\n recipient.UserId = user.Id;\r\n }\r\n }\r\n\r\n private isDuplicateRecipient(recipient: IAlertRuleRecipient): boolean {\r\n const isDuplicateGroup: boolean = (recipient?.type == 0) && this.dirtyAlertRule.Recipients?.filter(ruleRecipient => ruleRecipient?.type == 0 && ruleRecipient?.GroupId === recipient?.GroupId)?.length > 0;\r\n const isDuplicateUser: boolean = (recipient?.type == 1) && this.dirtyAlertRule.Recipients?.filter(ruleRecipient => ruleRecipient?.type == 1 && ruleRecipient.RecipientType == recipient.RecipientType && ruleRecipient?.UserId === recipient?.UserId)?.length > 0;\r\n const isDuplicateCustom: boolean = (recipient?.type == 2) && this.dirtyAlertRule.Recipients?.filter(ruleRecipient => ruleRecipient?.type == 2 && ruleRecipient?.Custom === recipient?.Custom)?.length > 0;\r\n\r\n return isDuplicateGroup || isDuplicateUser || isDuplicateCustom;\r\n }\r\n\r\n private addLabelsToRecipient(recipient: IAlertRuleRecipient): void {\r\n if (!recipient || !RecipientType[recipient?.type]) {\r\n return null;\r\n }\r\n\r\n if (recipient.type == RecipientType.Group) {\r\n const group: IGroup = this.groups.find(group => group.Id === recipient?.GroupId);\r\n const userCount = group?.UserIds?.length || 0;\r\n const label: string = `${userCount} ${this.translationService.t(`AlertEditor.recipientGroupUsers`, userCount)}`;\r\n recipient.primaryLabel = `${group?.Name}`;\r\n recipient.secondaryLabel = `${label}`;\r\n\r\n } else if (recipient.type == RecipientType.User) {\r\n const user: IUser = this.users.find(user => user.Id === recipient?.UserId);\r\n const emailString: string = (recipient?.RecipientType === RecipientDeliveryType.Email) ? `${user?.Email}` : ``;\r\n\r\n recipient.primaryLabel = user?.CurrentAccountUserMapping?.Name ? `${user?.CurrentAccountUserMapping.Name}` : `${emailString}`;\r\n recipient.secondaryLabel = user?.CurrentAccountUserMapping?.Name ? `${emailString}` : ``;\r\n\r\n } else if (recipient.type == RecipientType.Custom) {\r\n recipient.primaryLabel = `${recipient?.Custom}`;\r\n recipient.secondaryLabel = ``;\r\n\r\n } else {\r\n return null;\r\n\r\n }\r\n }\r\n\r\n private getRecipientDeliveryTypeTooltip(recipient: IAlertRuleRecipient): string {\r\n if (!RecipientDeliveryType[recipient?.RecipientType]) {\r\n return null;\r\n }\r\n\r\n if (recipient.RecipientType === RecipientDeliveryType.Email) {\r\n return this.translationService.t(`AlertEditor.sendingEmail`);\r\n\r\n } else if (recipient.RecipientType === RecipientDeliveryType.Sms) {\r\n return this.translationService.t(`AlertEditor.sendingSms`);\r\n\r\n }\r\n }\r\n\r\n private setAlertRulePreferences() {\r\n \r\n for (let prefType of Object.values(AlertPreferenceType)) {\r\n\r\n const prefTypeId:number = AlertPreferenceType[prefType];\r\n\r\n if (!this.alertPreferences[prefTypeId]) {\r\n continue;\r\n }\r\n\r\n let index = this.dirtyAlertRule.Preferences.findIndex(pref => pref.PreferenceTypeId === prefTypeId);\r\n if (index == -1) {\r\n this.dirtyAlertRule.Preferences.push({\r\n Value: this.alertPreferences[prefTypeId],\r\n PreferenceTypeId: prefTypeId\r\n })\r\n }\r\n else {\r\n this.dirtyAlertRule.Preferences[index].Value = this.alertPreferences[prefTypeId]\r\n }\r\n\r\n }\r\n \r\n }\r\n\r\n private setUIAlertPreferences() {\r\n \r\n if (this.dirtyAlertRule != null) {\r\n this.dirtyAlertRule.Preferences.forEach(preference => {\r\n\r\n let prefType;\r\n\r\n switch (preference.PreferenceTypeId) {\r\n case AlertPreferenceType.DistanceMeasurement:\r\n prefType = AlertPreferenceType.DistanceMeasurement;\r\n break;\r\n case AlertPreferenceType.VolumeMeasurement:\r\n prefType = AlertPreferenceType.VolumeMeasurement;\r\n break;\r\n case AlertPreferenceType.TemperatureMeasurement:\r\n prefType = AlertPreferenceType.TemperatureMeasurement;\r\n break;\r\n case AlertPreferenceType.Currency:\r\n prefType = AlertPreferenceType.Currency;\r\n break;\r\n case AlertPreferenceType.Language:\r\n prefType = AlertPreferenceType.Language;\r\n break;\r\n case AlertPreferenceType.Timezone:\r\n prefType = AlertPreferenceType.Timezone;\r\n break;\r\n }\r\n\r\n this.alertPreferences[prefType] = preference.Value;\r\n\r\n });\r\n } else {// set default user preferences\r\n if (!this.combinedPreferences) {\r\n\r\n this.alertPreferences[AlertPreferenceType.DistanceMeasurement] = this.combinedPreferences.DistanceMeasurement.Value.toString();\r\n this.alertPreferences[AlertPreferenceType.VolumeMeasurement] = this.combinedPreferences.VolumeMeasurement.Value.toString();\r\n this.alertPreferences[AlertPreferenceType.TemperatureMeasurement] = this.combinedPreferences.TemperatureMeasurement.Value.toString();\r\n this.alertPreferences[AlertPreferenceType.Currency] = this.combinedPreferences.Currency.Value.toString();\r\n this.alertPreferences[AlertPreferenceType.Language] = this.combinedPreferences.Language.Value.toString();\r\n this.alertPreferences[AlertPreferenceType.Timezone] = this.combinedPreferences.Timezone.Value.toString();\r\n return;\r\n }\r\n\r\n \r\n }\r\n }\r\n\r\n\r\n private isValidRecipient(recipient: IAlertRuleRecipient): IRecipientValidation {\r\n let recipientValidation: IRecipientValidation = {\r\n valid: true\r\n };\r\n\r\n if (recipient?.type == RecipientType.Group && !this.isGroupIdValid(recipient?.GroupId)) {\r\n recipientValidation.error = this.translationService.t(`AlertEditor.groupNotValid`);\r\n recipientValidation.valid = false;\r\n\r\n } else if (recipient?.type == RecipientType.User && !this.isUserIdValid(recipient?.UserId)) {\r\n recipientValidation.error = this.translationService.t(`AlertEditor.userNotValid`);\r\n recipientValidation.valid = false;\r\n\r\n } else if (recipient?.type == RecipientType.Custom) {\r\n\r\n if (recipient?.RecipientType == RecipientDeliveryType.Email) {\r\n if (recipient?.Custom == null) {\r\n recipientValidation.error = this.translationService.t(`AlertEditor.emailNotProvided`);\r\n recipientValidation.valid = false;\r\n\r\n } else if (!this.validationService.emailIsValid(recipient?.Custom)) {\r\n recipientValidation.error = this.translationService.t(`AlertEditor.emailNotValid`);\r\n recipientValidation.valid = false;\r\n }\r\n } else if (recipient?.RecipientType == RecipientDeliveryType.Sms) {\r\n if (recipient?.Custom == null) {\r\n recipientValidation.error = this.translationService.t(`AlertEditor.phoneNotProvided`);\r\n recipientValidation.valid = false;\r\n\r\n } else if (!this.phoneNumberIsValid(recipient?.Custom)) {\r\n recipientValidation.error = this.translationService.t(`AlertEditor.phoneNotValid`);\r\n recipientValidation.valid = false;\r\n }\r\n }\r\n }\r\n\r\n if (this.isDuplicateRecipient(recipient)) {\r\n recipientValidation.error = this.translationService.t(`AlertEditor.recipientAlreadyListed`);\r\n recipientValidation.valid = false;\r\n }\r\n\r\n return recipientValidation;\r\n }\r\n\r\n private isGroupIdValid(groupId: number): boolean {\r\n if (!groupId) {\r\n return false;\r\n }\r\n\r\n return this.groups.find(group => group.Id === groupId) !== null;\r\n }\r\n\r\n private isUserIdValid(userId: number): boolean {\r\n if (!userId) {\r\n return false;\r\n }\r\n\r\n return this.users.find(user => user.Id === userId) !== null;\r\n }\r\n\r\n private resetNewRecipientPlaceholder(currentRecipientType: RecipientType, currentRecipientDeliveryType: RecipientDeliveryType, retainPreviousCustomValue: boolean = false): void {\r\n this.newRecipient = {\r\n Id: 0,\r\n RuleId: this.dirtyAlertRule?.Id,\r\n GroupId: null,\r\n UserId: null,\r\n Custom: (retainPreviousCustomValue) ? this.newRecipient.Custom : null,\r\n RecipientType: currentRecipientDeliveryType | RecipientDeliveryType.Email,\r\n countryDialCode: null,\r\n type: currentRecipientType | RecipientType.Group\r\n };\r\n\r\n if (!retainPreviousCustomValue) {\r\n this.newRecipientSmsInput = ``;\r\n }\r\n }\r\n\r\n private updateStartMinuteOfDay(range: IHourMinute): void {\r\n this.filteredStartMinuteOfDay = (range.hour * 60) + range.minute;\r\n\r\n this.validateTimeRange();\r\n }\r\n\r\n private updateEndMinuteOfDay(range: IHourMinute): void {\r\n this.filteredEndMinuteOfDay = (range.hour * 60) + range.minute\r\n\r\n this.validateTimeRange();\r\n }\r\n\r\n private validateTimeRange(): void {\r\n this.timeRangeValid = this.filteredStartMinuteOfDay < this.filteredEndMinuteOfDay;\r\n }\r\n\r\n private getExcludedDaysOfWeek(): DayOfWeek[] {\r\n const excludedDaysOfWeek: DayOfWeek[] = [];\r\n\r\n this.alertExclusionDays.forEach((exclusionDay, index) => {\r\n if (exclusionDay) {\r\n excludedDaysOfWeek.push(index);\r\n }\r\n });\r\n\r\n return excludedDaysOfWeek;\r\n }\r\n\r\n private generateExclusionTimePeriodsForAlert(alertRule: IAlertRule): void {\r\n if (!alertRule) {\r\n return;\r\n }\r\n \r\n const excludedDayStartTime: Date = this.dateService.getStartOfDay(new Date());\r\n const excludedDayEndTime: Date = this.dateService.getEndOfDay(new Date());\r\n const excludedDaysOfWeek: DayOfWeek[] = this.getExcludedDaysOfWeek();\r\n\r\n const timeRangeToMinuteOfDay: number = (this.timeRange.to.hour * 60) + this.timeRange.to.minute;\r\n const timeRangeFromMinuteOfDay: number = (this.timeRange.from.hour * 60) + this.timeRange.from.minute;\r\n\r\n const includedDayStartTime: Date = this.dateService.getStartOfDay(new Date());\r\n includedDayStartTime.setMinutes(timeRangeToMinuteOfDay);\r\n\r\n const includedDayEndTime: Date = this.dateService.getStartOfDay(new Date())\r\n includedDayEndTime.setMinutes(timeRangeFromMinuteOfDay);\r\n\r\n const includedDaysOfWeek: DayOfWeek[] = this.allDays.filter(day => excludedDaysOfWeek.indexOf(day) === -1);\r\n\r\n const isFullDayPeriod: boolean = (timeRangeToMinuteOfDay + timeRangeFromMinuteOfDay === 1439);\r\n\r\n alertRule.AlertRuleExclusionTimePeriods = [];\r\n\r\n excludedDaysOfWeek?.forEach(dayOfWeek => {\r\n alertRule.AlertRuleExclusionTimePeriods.push({\r\n Id: 0,\r\n AlertRuleId: this.dirtyAlertRule.Id,\r\n DayOfWeek: dayOfWeek,\r\n StartTimeAdjusted: excludedDayStartTime,\r\n EndTimeAdjusted: excludedDayEndTime\r\n });\r\n });\r\n\r\n if (!isFullDayPeriod) {\r\n includedDaysOfWeek?.forEach(dayOfWeek => {\r\n alertRule.AlertRuleExclusionTimePeriods.push({\r\n Id: 0,\r\n AlertRuleId: this.dirtyAlertRule.Id,\r\n DayOfWeek: dayOfWeek,\r\n StartTimeAdjusted: includedDayStartTime,\r\n EndTimeAdjusted: includedDayEndTime\r\n });\r\n });\r\n }\r\n\r\n this.updateWeekDaysDescriptor();\r\n }\r\n\r\n private processAlertRule(alertRule: IAlertRule): void {\r\n this.dirtyAlertRule = copy(alertRule);\r\n\r\n this.setLocalDelayVars();\r\n this.setLocalResendVars();\r\n this.addRecipientLabelsToRecipients(this.dirtyAlertRule?.Recipients);\r\n this.setInputTypeFilter();\r\n this.alertIsActive = alertRule.Status === AlertRuleStatus.Active ? true : false;\r\n this.timeRange = this.getTimeRangeFromAlertRule(this.dirtyAlertRule);\r\n this.updateStartMinuteOfDay(this.timeRange.from);\r\n this.updateEndMinuteOfDay(this.timeRange.to);\r\n this.alertExclusionDays = this.getExclusionsDaysFromAlertRule(this.dirtyAlertRule);\r\n this.updateWeekDaysDescriptor();\r\n\r\n this.resetDelayAndResendIfNeeded();\r\n this.updateConversationalSegments();\r\n }\r\n\r\n private runConversionForView(): void {\r\n if (!this.dirtyAlertRule) {\r\n return;\r\n }\r\n\r\n // speeding\r\n if (this.dirtyAlertRule.Category == AlertCategory.Vehicle && this.dirtyAlertRule.SubCategory == VehicleAlertSubCategory.Speeding && this.alertPreferences[AlertPreferenceType.DistanceMeasurement] == '1') {\r\n this.dirtyAlertRule.TriggerValue = this.unitConversionService.convert(this.dirtyAlertRule.TriggerValue, UnitConversionType.Speed, 0, false, parseInt(this.alertPreferences[AlertPreferenceType.DistanceMeasurement]));\r\n }\r\n\r\n // volume\r\n if (this.dirtyAlertRule.Category == AlertCategory.Vehicle && this.dirtyAlertRule.SubCategory == VehicleAlertSubCategory.FuelLevelChange && this.alertPreferences[AlertPreferenceType.VolumeMeasurement] != '0') {\r\n this.dirtyAlertRule.TriggerValue = this.unitConversionService.convert(this.dirtyAlertRule.TriggerValue, UnitConversionType.FuelCapacity, 0, false, parseInt(this.alertPreferences[AlertPreferenceType.VolumeMeasurement]));\r\n }\r\n }\r\n\r\n private runConversionForModel(): void {\r\n if (!this.dirtyAlertRule) {\r\n return;\r\n }\r\n\r\n // speeding\r\n if (this.dirtyAlertRule.Category == AlertCategory.Vehicle && this.dirtyAlertRule.SubCategory == VehicleAlertSubCategory.Speeding && this.alertPreferences[AlertPreferenceType.DistanceMeasurement] == '1') {\r\n this.dirtyAlertRule.TriggerValue = this.unitConversionService.convert(this.dirtyAlertRule.TriggerValue, UnitConversionType.Speed, 0, true, parseInt(this.alertPreferences[AlertPreferenceType.DistanceMeasurement]));\r\n }\r\n // volume\r\n if (this.dirtyAlertRule.Category == AlertCategory.Vehicle && this.dirtyAlertRule.SubCategory == VehicleAlertSubCategory.FuelLevelChange && this.alertPreferences[AlertPreferenceType.VolumeMeasurement] != '0') {\r\n this.dirtyAlertRule.TriggerValue = this.unitConversionService.convert(this.dirtyAlertRule.TriggerValue, UnitConversionType.FuelCapacity, 0, true, parseInt(this.alertPreferences[AlertPreferenceType.VolumeMeasurement]));\r\n }\r\n }\r\n\r\n private setLocalDelayVars(): void {\r\n this.enableDelay = this.dirtyAlertRule?.FirstNotificationDelay > 0;\r\n }\r\n\r\n private setLocalResendVars(): void {\r\n this.resendIntervalType = (!this.dirtyAlertRule?.ResendMinuteInterval || this.dirtyAlertRule?.ResendMinuteInterval < 60)\r\n ? ResendIntervalType.Minutes\r\n : ResendIntervalType.Hours;\r\n this.resendMinuteInterval = (this.resendIntervalType == ResendIntervalType.Minutes)\r\n ? this.dirtyAlertRule?.ResendMinuteInterval\r\n : this.dirtyAlertRule?.ResendMinuteInterval / 60;\r\n }\r\n\r\n private updateWeekDaysDescriptor(): void {\r\n const excludedDaysOfWeek: DayOfWeek[] = this.getExcludedDaysOfWeek();\r\n const includedDaysOfWeek: DayOfWeek[] = this.allDays.filter(day => excludedDaysOfWeek.indexOf(day) === -1);\r\n\r\n const includesWholeWeekend: boolean = this.weekendDays.filter(day => includedDaysOfWeek.indexOf(day) > -1)?.length === 2;\r\n const includesWholeWorkWeek: boolean = this.weekDays.filter(day => includedDaysOfWeek.indexOf(day) > -1)?.length === 5;\r\n const isEntireWeek: boolean = includesWholeWeekend && includesWholeWorkWeek;\r\n\r\n if (isEntireWeek) {\r\n this.weekDaysDescriptor = this.translationService.t(`Common.AllDays`);\r\n\r\n } else if (includesWholeWorkWeek && !includesWholeWeekend && includedDaysOfWeek?.length === 5) {\r\n this.weekDaysDescriptor = this.translationService.t(`Common.Weekdays`);\r\n\r\n } else if (!includesWholeWorkWeek && includesWholeWeekend && includedDaysOfWeek?.length === 2) {\r\n this.weekDaysDescriptor = this.translationService.t(`Common.WeekendDays`);\r\n\r\n } else if (includedDaysOfWeek?.length > 2) {\r\n this.weekDaysDescriptor = this.translationService.t(`AlertEditor.totalSelectedFilterDays`, includedDaysOfWeek.length);\r\n\r\n } else if (includedDaysOfWeek?.length === 2) {\r\n const day1Translation = this.translationService.t(`DayOfWeekEnum.${this.DayOfWeek[this.DayOfWeek[this.daysOfWeek[includedDaysOfWeek[0]].name]]}`);\r\n const day2Translation = this.translationService.t(`DayOfWeekEnum.${this.DayOfWeek[this.DayOfWeek[this.daysOfWeek[includedDaysOfWeek[1]].name]]}`);\r\n\r\n this.weekDaysDescriptor = this.translationService.t(`Common.XAndY`, [day1Translation, day2Translation]);\r\n\r\n } else if (includedDaysOfWeek?.length === 1) {\r\n this.weekDaysDescriptor = this.translationService.t(`DayOfWeekEnum.${this.DayOfWeek[this.DayOfWeek[this.daysOfWeek[includedDaysOfWeek[0]].name]]}`);\r\n\r\n } else {\r\n this.weekDaysDescriptor = this.translationService.t(`Common.NoDays`);\r\n }\r\n\r\n this.updateConversationalSegments();\r\n }\r\n\r\n private getTimeRangeFromAlertRule(alertRule: IAlertRule): ITimeRangeSelection {\r\n let timeRangeSelection: ITimeRangeSelection = this.createDefaultTimeRangeSelection();\r\n \r\n alertRule?.AlertRuleExclusionTimePeriods.forEach((exclusionTimePeriod, index) => {\r\n const fixedStartTime = this.fixCeEpochTime(new Date(exclusionTimePeriod.StartTimeAdjusted));\r\n const fixedEndTime = this.fixCeEpochTime(new Date(exclusionTimePeriod.EndTimeAdjusted));\r\n\r\n const startTimeMinuteOfDay: number = (fixedStartTime.getHours() * 60) + fixedStartTime.getMinutes();\r\n const endTimeMinuteOfDay: number = (fixedEndTime.getHours() * 60) + fixedEndTime.getMinutes();\r\n\r\n const currentTimeRangeFromMinuteOfDay: number = (timeRangeSelection.from.hour * 60) + timeRangeSelection.from.minute;\r\n const currentTimeRangeToMinuteOfDay: number = (timeRangeSelection.to.hour * 60) + timeRangeSelection.to.minute;\r\n\r\n const isFullDayPeriod: boolean = this.timeRangeIsFullDay(fixedStartTime, fixedEndTime);\r\n\r\n if (isFullDayPeriod) {\r\n return;\r\n }\r\n\r\n if (startTimeMinuteOfDay < currentTimeRangeToMinuteOfDay) {\r\n timeRangeSelection.to.hour = fixedStartTime.getHours();\r\n timeRangeSelection.to.minute = fixedStartTime.getMinutes();\r\n }\r\n\r\n if (endTimeMinuteOfDay > currentTimeRangeFromMinuteOfDay) {\r\n timeRangeSelection.from.hour = fixedEndTime.getHours();\r\n timeRangeSelection.from.minute = fixedEndTime.getMinutes();\r\n }\r\n });\r\n\r\n return timeRangeSelection;\r\n }\r\n\r\n private fixCeEpochTime(date: Date): Date {\r\n const fixedTime = new Date();\r\n const timezoneOffsetMs: number = fixedTime.getTimezoneOffset() * 60 * 1000;\r\n\r\n fixedTime.setHours(\r\n date.getUTCHours(),\r\n date.getUTCMinutes(),\r\n date.getUTCSeconds(),\r\n date.getUTCMilliseconds()\r\n );\r\n\r\n return new Date(fixedTime.getTime() - timezoneOffsetMs);\r\n }\r\n\r\n private createDefaultTimeRangeSelection(): ITimeRangeSelection {\r\n const newTimeRange: ITimeRangeSelection = {\r\n from: {\r\n hour: 0,\r\n minute: 0\r\n },\r\n to: {\r\n hour: 23,\r\n minute: 59\r\n }\r\n };\r\n\r\n return newTimeRange;\r\n }\r\n\r\n private getExclusionsDaysFromAlertRule(alertRule: IAlertRule): boolean[] {\r\n const exclusionDays: boolean[] = [];\r\n\r\n this.daysOfWeek?.forEach((dayOfWeek, index) => {\r\n exclusionDays[index] = false;\r\n\r\n alertRule?.AlertRuleExclusionTimePeriods.forEach(exclusionTimePeriod => {\r\n // have we found the correct day\r\n if (exclusionTimePeriod.DayOfWeek === index) {\r\n const fixedStartTime = this.fixCeEpochTime(new Date(exclusionTimePeriod.StartTimeAdjusted));\r\n const fixedEndTime = this.fixCeEpochTime(new Date(exclusionTimePeriod.EndTimeAdjusted));\r\n\r\n const isFullDayExclusion: boolean = this.timeRangeIsFullDay(fixedStartTime, fixedEndTime);\r\n\r\n if (isFullDayExclusion) {\r\n exclusionDays[index] = true;\r\n }\r\n }\r\n })\r\n });\r\n\r\n return exclusionDays;\r\n }\r\n\r\n private addRecipientLabelsToRecipients(recipients: IAlertRuleRecipient[] = []): void {\r\n recipients.forEach(recipient => {\r\n this.addLabelsToRecipient(recipient);\r\n recipient.deliveryTypeTooltip = this.getRecipientDeliveryTypeTooltip(recipient);\r\n });\r\n }\r\n\r\n private timeRangeIsFullDay(from: Date, to: Date): boolean {\r\n const fromMinutes: number = (from.getHours() * 60) + from.getMinutes();\r\n const toMinutes: number = (to.getHours() * 60) + to.getMinutes();\r\n\r\n return fromMinutes === 0 && toMinutes >= 1439;\r\n }\r\n\r\n private createDefaultRule(): IAlertRule {\r\n const newAlertRule: IAlertRule = {\r\n Id: 0,\r\n Recipients: [],\r\n Preferences: [],\r\n Status: AlertRuleStatus.Active,\r\n FirstNotificationDelay: null,\r\n ResendAlerts: false,\r\n ResendMinuteInterval: null,\r\n Category: AlertCategory.Geofence,\r\n SubCategory: 0,\r\n TriggerValueOperator: TriggerValueOperator.GreaterThan,\r\n Filters: [\r\n { filterType: ResourceFilterType.Any, ResourceType: ResourceType.Geofence },\r\n { filterType: ResourceFilterType.Any, ResourceType: ResourceType.Vehicle },\r\n { filterType: ResourceFilterType.Any, ResourceType: ResourceType.Driver },\r\n { filterType: ResourceFilterType.Specific, ResourceType: ResourceType.InputType }\r\n ],\r\n AlertRuleExclusionTimePeriods: []\r\n };\r\n\r\n return newAlertRule;\r\n }\r\n\r\n private setDefaultAlertRulePreferences() {\r\n\r\n\r\n this.alertRule.Preferences.push({\r\n Value: this.combinedPreferences.DistanceMeasurement.Value.toString(),\r\n PreferenceTypeId: AlertPreferenceType.DistanceMeasurement\r\n })\r\n\r\n this.alertRule.Preferences.push({\r\n Value: this.combinedPreferences.VolumeMeasurement.Value.toString(),\r\n PreferenceTypeId: AlertPreferenceType.VolumeMeasurement\r\n })\r\n\r\n this.alertRule.Preferences.push({\r\n Value: this.combinedPreferences.TemperatureMeasurement.Value.toString(),\r\n PreferenceTypeId: AlertPreferenceType.TemperatureMeasurement\r\n })\r\n\r\n this.alertRule.Preferences.push({\r\n Value: this.combinedPreferences.Currency.Value.toString(),\r\n PreferenceTypeId: AlertPreferenceType.Currency\r\n })\r\n\r\n this.alertRule.Preferences.push({\r\n Value: this.combinedPreferences.Language.Value.toString(),\r\n PreferenceTypeId: AlertPreferenceType.Language\r\n })\r\n\r\n this.alertRule.Preferences.push({\r\n Value: this.combinedPreferences.Timezone.Value.toString(),\r\n PreferenceTypeId: AlertPreferenceType.Timezone\r\n })\r\n }\r\n\r\n private setDelayResendIcon() {\r\n if (this.dirtyAlertRule\r\n && !this.alertCategoryTriggers[this.dirtyAlertRule.Category].categoryAllowedDelayResend\r\n && !this.alertCategoryTriggers[this.dirtyAlertRule.Category].subCategoriesAllowedDelayResend?.[this.dirtyAlertRule.SubCategory]) {\r\n this.delayResendIcon = 'lock';\r\n return;\r\n }\r\n\r\n this.delayResendIcon = 'update';\r\n }\r\n\r\n private setInputTypeFilter(): void {\r\n if (!this.dirtyAlertRule) return;\r\n\r\n this.inputTypeFilter = null;\r\n\r\n if (this.dirtyAlertRule.Category == AlertCategory.Inputs)\r\n this.inputTypeFilter = this.dirtyAlertRule.Filters.find(x => x.ResourceType == ResourceType.InputType);\r\n }\r\n\r\n private hasForDuplicateAlertName(name: string): boolean {\r\n name = name?.toLowerCase()?.trim();\r\n this.validationError = this.translationService.t('AlertEditor.formFieldNameExists');\r\n return !!this.existingAlertRules.find(rule => rule.Name?.toLowerCase()?.trim() === name && rule.Id !== this.dirtyAlertRule.Id);\r\n }\r\n\r\n private getSubCategoryUnitsList() {\r\n \r\n if (this.dirtyAlertRule == null || !this.alertCategoryTriggers[this.dirtyAlertRule.Category].subCategoriesUnits || !this.alertCategoryTriggers[this.dirtyAlertRule.Category].subCategoriesUnits[this.dirtyAlertRule.SubCategory])\r\n return;\r\n\r\n switch (this.alertCategoryTriggers[this.dirtyAlertRule.Category].subCategoriesUnits[this.dirtyAlertRule.SubCategory]){\r\n\r\n case AlertPreferenceType.DistanceMeasurement:\r\n\r\n this.subCategoryUnits = this.distanceUnitTypes;\r\n break;\r\n\r\n case AlertPreferenceType.VolumeMeasurement:\r\n\r\n this.subCategoryUnits = this.volumeUnitTypes;\r\n break;\r\n\r\n case AlertPreferenceType.TemperatureMeasurement:\r\n\r\n this.subCategoryUnits = this.temperatureUnitTypes;\r\n break;\r\n\r\n case AlertPreferenceType.Currency:\r\n\r\n this.subCategoryUnits = this.currencyTypes;\r\n break;\r\n }\r\n }\r\n\r\n}\r\n\r\nexport class AlertEditorComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n\r\n constructor() {\r\n this.bindings = {\r\n alertRule: \"<\",\r\n autoLoadedRecordId: \" send
    {{ segment.label }}
    list_alt
    {{ 'AlertEditor.headerBasicDetails' | translate }}
    {{ 'AlertEditor.subheaderBasicDetails' | translate }}
    {{ 'AlertEditor.formFieldNameRequired' | translate }}
    {{ $ctrl.validationError }}
    {{ 'AlertEditor.infoFieldLocked' | translate }}
    {{ 'AlertCategoryEnum.' + alertCategory.name | translate }}
    {{ ($ctrl.dirtyAlertRule.Category == $ctrl.AlertCategory.Zone) ? ('AlertEditor.filterZonesInfo' | translate) : ('AlertEditor.filterGeofencesInfo' | translate) }}
    {{ 'AlertEditor.infoFieldLocked' | translate }}
    {{ $ctrl.alertCategoryTriggers[$ctrl.dirtyAlertRule.Category].enumName + 'Enum.' + $ctrl.alertCategoryTriggers[$ctrl.dirtyAlertRule.Category].enum[$ctrl.alertCategoryTriggers[$ctrl.dirtyAlertRule.Category].enum[type]] | translate }}
    {{ 'Common.GreaterThan' | translate }} {{ 'Common.Equals' | translate }} {{ 'Common.LessThan' | translate }} {{ 'Common.' + unit.name + ($ctrl.dirtyAlertRule.Category == 1 && ($ctrl.dirtyAlertRule.SubCategory == 1 || $ctrl.dirtyAlertRule.SubCategory == 2) ?\\\"PerHour\\\":\\\"\\\") | translate }} {{ 'ReasonCodeEnum.' + reasonCode.name | translate }}
    {{ 'AlertEditor.CheckboxRequiresReview' | translate }}
    {{ 'AlertEditor.infoVehicleConfig' | translate }}
    {{ 'AlertEditor.checkboxEnableDelay' | translate }}
    {{ 'Common.Minutes' | translate }}
    {{ 'AlertEditor.checkboxEnableResendAlerts' | translate }} {{ 'Common.Minutes' | translate }} {{ 'Common.Hours' | translate }}
    outlined_flag
    {{ 'AlertEditor.headerConditions' | translate }}
    {{ 'AlertEditor.subheaderConditions' | translate }}
    {{ 'AlertEditor.formDetailsActiveTimeRangeTitleSubtitle' | translate }}
    {{ 'AlertEditor.infoNightShift' | translate }}
    {{ 'Common.From' | translate }}
    {{ 'Common.To' | translate }}
    {{ 'AlertEditor.optionNoFilter' | translate }} {{ 'AlertEditor.optionAnyResourceInGroup' | translate : (($ctrl.ResourceType[filter.ResourceType] == 'Geofence' && $ctrl.dirtyAlertRule.Category == $ctrl.AlertCategory.Zone) ? ('Common.Zone' | translate) : 'ResourceTypeEnum.' + $ctrl.ResourceType[filter.ResourceType] | translate) }} {{ 'AlertEditor.optionSpecificResource' | translate : (($ctrl.ResourceType[filter.ResourceType] == 'Geofence' && $ctrl.dirtyAlertRule.Category == $ctrl.AlertCategory.Zone) ? ('Common.Zone' | translate) : 'ResourceTypeEnum.' + $ctrl.ResourceType[filter.ResourceType] | translate) }} {{ ($ctrl.dirtyAlertRule.Category == $ctrl.AlertCategory.Zone) ? ('AlertEditor.optionOutsideAllZones' | translate) : ('AlertEditor.optionOutsideAllGeofences' | translate)}}
    {{ 'AlertEditor.CheckboxIgnoreVor' | translate }}
    forward_to_inbox
    {{ 'AlertEditor.headerRecipients' | translate }}
    {{ 'AlertEditor.subheaderRecipients' | translate }}
    {{ 'RecipientTypeEnum.' + recipientType.name | translate }}
    {{ 'RecipientDeliveryTypeEnum.' + recipientDeliveryType.name | translate }}
    {{ 'Common.ValidEmail' | translate }}
    {{ 'AlertEditor.buttonAddRecipient' | translate }}
    {{ $ctrl.recipientAddError }}
    {{'AlertEditor.FormDetailsTimezoneSelectorSubtitle' | translate}}
    {{item.DisplayName}}
    {{\\\"Locales.\\\" + item.Locale | translate }}
    0\\\" ng-repeat=\\\"recipient in $ctrl.dirtyAlertRule.Recipients\\\">
    {{ (recipient.RecipientType == 0) ? 'forward_to_inbox' : 'add_to_home_screen' }}
    {{ recipient.primaryLabel }}
    {{ recipient.secondaryLabel }}
    {{ 'Common.Remove' | translate }}
    {{ 'AlertEditor.infoNoRecipientsAdded' | translate }}
    \";","import { IVeriTableHeader, IVeriTableRow, IVeriTableRowCell } from \"@directives/_veri/veriTable/veriTable.component\";\r\nimport { VeriTableService } from \"@directives/_veri/veriTable/veriTable.service\";\r\nimport { DateRange } from \"@enums/DateRange.enum\";\r\nimport { NotificationRecipientType } from \"@enums/NotificationRecipientType\";\r\nimport { IDateFilter } from \"@interfaces/filters/IDateFilter\";\r\nimport { IUser } from \"@interfaces/IUser\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { IGroup } from \"@interfaces/IVehicleGroup\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport * as angular from \"angular\";\r\nimport * as moment from \"moment\";\r\nimport { NotificationRecordStatus } from \"@enums/NotificationRecordStatus\";\r\nimport { NotificationStatus } from \"src/app/main/modules/alerts/_enums/alerts.enums\";\r\nimport { IAlertRule, IAlertRuleRecord, INotification, INotificationRecord } from \"../../_models/alerts.interfaces\";\r\nimport { AlertsService } from \"../../_services/alerts.service\";\r\nimport './alertHistory.component.scss';\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { DateService } from \"@app/services/date.service\";\r\n\r\ninterface IComponentBindings {\r\n alertRule: IAlertRule;\r\n}\r\n\r\nclass AlertHistoryComponentController implements angular.IComponentController, IComponentBindings {\r\n\r\n alertRule: IAlertRule;\r\n\r\n // raw data\r\n groups: IGroup[] = [];\r\n users: IUser[] = [];\r\n vehicles: IVehicle[] = [];\r\n\r\n selectedAlertRuleRecord: IAlertRuleRecord;\r\n alertRecords: IAlertRuleRecord[] = [];\r\n\r\n lastAlertNotification: INotification;\r\n alertNotifications: INotification[];\r\n\r\n // dataview\r\n tableHeaders: IVeriTableHeader[] = [];\r\n tableRows: IVeriTableRow[] = [];\r\n\r\n recipientTableHeaders: IVeriTableHeader[] = [];\r\n recipientTableRows: IVeriTableRow[] = [];\r\n\r\n historyTableHeaders: IVeriTableHeader[] = [];\r\n historyTableRows: IVeriTableRow[] = [];\r\n\r\n loadingAlertRecords = false;\r\n\r\n defaultDateRange: DateRange = DateRange.Latest7Days;\r\n dateFilter: IDateFilter;\r\n\r\n static $inject = [\"$q\", \"alertsService\", \"dateService\", \"vehicleService\", \"veriTableService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly alertsService: AlertsService,\r\n private readonly dateService: DateService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly veriTableService: VeriTableService,\r\n private readonly translationService: TranslationService ) {\r\n }\r\n\r\n $onInit() {\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject): void {\r\n\r\n this.dateFilter = this.dateService.dateRangeFromEnum(this.defaultDateRange);\r\n\r\n this.createTableHeaders();\r\n this.loadAlertRecords();\r\n }\r\n\r\n selectAlertRecord(alertRuleRecord: IAlertRuleRecord) {\r\n this.selectedAlertRuleRecord = alertRuleRecord;\r\n\r\n this.alertsService.getAlertNotifications(this.selectedAlertRuleRecord.RuleId, this.selectedAlertRuleRecord.Id)\r\n .then(notifications => {\r\n this.alertNotifications = notifications;\r\n this.lastAlertNotification = notifications[notifications.length - 1];\r\n this.fixNotificationRichHtmlLink(this.lastAlertNotification);\r\n\r\n this.getNotificationRecords(this.lastAlertNotification);\r\n });\r\n }\r\n\r\n clearSelectedAlertRecord() {\r\n this.selectedAlertRuleRecord = null;\r\n }\r\n\r\n\r\n getNotificationRecords(notification: INotification): void {\r\n this.alertsService.getAlertNotificationRecords(notification?.Id).then(notificationRecords => {\r\n notification.NotificationRecords = [...notificationRecords];\r\n\r\n this.createHistoryTable();\r\n this.createRecipientTable();\r\n });\r\n }\r\n\r\n onDateFilterChanged(filter: IDateFilter): void {\r\n this.dateFilter = filter;\r\n\r\n this.loadAlertRecords();\r\n }\r\n\r\n editRule(ruleRecord: IAlertRuleRecord, $event: MouseEvent) {\r\n this.alertsService.showAlertEditor(ruleRecord.rule, $event);\r\n }\r\n\r\n //-----\r\n\r\n private fixNotificationRichHtmlLink(notification: INotification): string {\r\n if (!notification?.Rich) {\r\n return;\r\n }\r\n\r\n notification.Rich = notification.Rich.replace('href=\"https://www.google.co.uk/maps/search', 'target=\"_blank\" href=\"https://www.google.co.uk/maps/search');\r\n notification.Rich = notification.Rich.replace('href=\"http://www.verilocation.com', 'target=\"_blank\" href=\"http://www.verilocation.com');\r\n }\r\n\r\n private loadAlertRecords() {\r\n this.loadingAlertRecords = true;\r\n\r\n const rulePromise = this.alertsService.getActiveAlertRules();\r\n const vehiclePromise = this.vehicleService.getVehicles({ includePeripheralMappings: true });\r\n const recordsPromise = this.alertRule\r\n ? this.alertsService.getAlertRuleRecords(this.alertRule.Id, moment(this.dateFilter.start), moment(this.dateFilter.end))\r\n : this.alertsService.getAlertRuleRecordsForAccount(moment(this.dateFilter.start), moment(this.dateFilter.end));\r\n\r\n this.$q.all([rulePromise, vehiclePromise, recordsPromise])\r\n .then(([rules, vehiclePromise, records]) => {\r\n this.alertRecords = records;\r\n\r\n this.populateRecordsWithMetaData(records, rules, vehiclePromise);\r\n\r\n this.createTableRows();\r\n })\r\n .finally(() => {\r\n this.loadingAlertRecords = false;\r\n });\r\n }\r\n\r\n private populateRecordsWithMetaData(records: IAlertRuleRecord[], rules: IAlertRule[], vehiclePromise: IVehicle[]) {\r\n if (!records) {\r\n return;\r\n }\r\n\r\n records.forEach(record => {\r\n record.rule = rules.find(r => r.Id == record.RuleId);\r\n record.vehicle = vehiclePromise.find(v => v.Id == record.VehicleId);\r\n\r\n if (record?.vehicle?.TagIds) {\r\n record.tagIds = [];\r\n\r\n record.tagIds = record.tagIds.concat(record.vehicle.TagIds);\r\n }\r\n });\r\n }\r\n\r\n private createTableHeaders() {\r\n this.tableHeaders = [\r\n this.veriTableService.createDateTimeHeader(this.translationService.t(\"AlertHistoryComponent.lastSent\")),\r\n this.veriTableService.createVehicleRegHeader(),\r\n { title: this.translationService.t(\"AlertHistoryComponent.alertRule\"), width: 200, sortable: true, hide: this.alertRule != null },\r\n { title: this.translationService.t(\"AlertHistoryComponent.Description\"), sortable: true, hideOnMobile: true },\r\n ];\r\n }\r\n\r\n private createTableRows() {\r\n this.tableRows = [];\r\n\r\n if (!this.alertRecords) {\r\n return;\r\n }\r\n\r\n // Hide all records without a rule\r\n // Hide all sent count 0, this just means raised but not sent (i.e. delay not been hit)\r\n const rulesToShow = this.alertRecords.filter(r => r.rule && r.SentCount > 0);\r\n\r\n this.tableRows = this.veriTableService.createTableRowsWithCells(rulesToShow, record => this.createTableRowCells(record));\r\n }\r\n\r\n private createTableRowCells(record: IAlertRuleRecord): IVeriTableRowCell[] {\r\n return [\r\n this.veriTableService.createDateTimeCell(record.LastSent),\r\n this.veriTableService.createVehicleRegCell(record.vehicle),\r\n { contents: record.rule?.Name },\r\n { contents: record.Subject }\r\n ];\r\n }\r\n\r\n private createHistoryTable() {\r\n this.historyTableHeaders = [\r\n { title: this.translationService.t(\"AlertHistoryComponent.status\"), sortable: true, width: 80 },\r\n this.veriTableService.createDateTimeHeader(),\r\n { title: this.translationService.t(\"AlertHistoryComponent.recipients\"), sortable: true },\r\n ];\r\n\r\n let recipients = this.alertNotifications?.filter(n => n.NotificationRecords.length > 0)[0]?.NotificationRecords?.map(r => r.Recipient)?.join(\", \");\r\n\r\n this.historyTableRows = this.veriTableService.createTableRowsWithCells(this.alertNotifications, notification => {\r\n var cells: IVeriTableRowCell[] = [];\r\n\r\n cells.push({ contents: NotificationStatus[notification.NotificationStatus] });\r\n cells.push(this.veriTableService.createDateTimeCell(notification.Processed));\r\n cells.push({ contents: recipients });\r\n\r\n return cells;\r\n });\r\n }\r\n\r\n private createRecipientTable() {\r\n this.recipientTableHeaders = [\r\n { title: this.translationService.t(\"AlertHistoryComponent.status\"), sortable: true, width: 80 },\r\n this.veriTableService.createDateTimeHeader(),\r\n { title: this.translationService.t(\"AlertHistoryComponent.method\"), sortable: true, width: 100 },\r\n { title: this.translationService.t(\"AlertHistoryComponent.recipient\"), sortable: true },\r\n ];\r\n\r\n this.recipientTableRows = [];\r\n\r\n if (!this.lastAlertNotification) {\r\n return;\r\n }\r\n\r\n this.recipientTableRows = this.veriTableService.createTableRowsWithCells(this.lastAlertNotification.NotificationRecords, record => {\r\n var cells: IVeriTableRowCell[] = [];\r\n\r\n cells.push({ contents: NotificationRecordStatus[record.NotificationStatus] });\r\n cells.push(this.veriTableService.createDateTimeCell(record.TimestampSent));\r\n cells.push({ contents: NotificationRecipientType[record.RecipientType] });\r\n cells.push({ contents: record.Recipient });\r\n\r\n return cells;\r\n });\r\n }\r\n}\r\n\r\nexport class AlertHistoryComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n\r\n constructor() {\r\n this.bindings = {\r\n alertRule: \"<\",\r\n };\r\n\r\n this.controller = AlertHistoryComponentController;\r\n this.template = require(\"./alertHistory.component.html\");\r\n }\r\n}\r\n","module.exports = \" {{'AlertHistoryComponent.editRule' | translate}} clear
    {{$ctrl.selectedAlertRuleRecord.TriggeredAtDataTimestamp | veriDate}} {{$ctrl.selectedAlertRuleRecord.LastSent | veriDate}}
    {{'AlertHistoryComponent.unableToShow' | translate}}
    \";","import { IVeriTableHeader, IVeriTableRow, IVeriTableRowCell } from \"@directives/_veri/veriTable/veriTable.component\";\r\nimport { VeriTableService } from \"@directives/_veri/veriTable/veriTable.service\";\r\nimport { ResourceType } from \"@enums/ResourceType\";\r\nimport { SpecialUserPermissions } from \"@enums/SpecialUserPermissions\";\r\nimport { IRunBlockRootScope } from \"@interfaces/IRunBlockRootScope\";\r\nimport { IUser } from \"@interfaces/IUser\";\r\nimport { EnumService } from \"@services/enum.service\";\r\nimport { AccountFeatureService } from \"@services/accountFeature.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport * as angular from \"angular\";\r\nimport \"angular-material\";\r\nimport copy from \"fast-copy/dist/fast-copy.esm.js\";\r\nimport { AlertCategory } from \"src/app/main/modules/alerts/_enums/alerts.enums\";\r\nimport { IAlertFilterCriteria, IAlertRule, INotificationQuota } from \"../../_models/alerts.interfaces\";\r\nimport { AlertsService, IAlertCategoryTrigger } from \"../../_services/alerts.service\";\r\nimport { SortType } from \"@enums/SortType\";\r\nimport \"./alertsManager.component.scss\";\r\nimport { AlertRuleStatus } from \"src/app/main/modules/alerts/_enums/AlertRuleStatus.enums\";\r\nimport { DateService } from \"@app/services/date.service\";\r\n\r\ninterface IAlertUsageDashboardBoxInfo {\r\n emailUsageTitle: string;\r\n emailUsageSubtitle: string;\r\n\r\n smsUsageTitle: string;\r\n smsUsageSubtitle: string;\r\n}\r\n\r\nclass AlertsManagerComponentController implements angular.IComponentController {\r\n\r\n // raw data\r\n alertRules: IAlertRule[] = [];\r\n notificationQuotas: INotificationQuota;\r\n\r\n // loaders\r\n loadingAlertRules = false;\r\n\r\n // --\r\n alertCategory = AlertCategory;\r\n alertCategoryTriggers: IAlertCategoryTrigger[] = [];\r\n resourceType = ResourceType;\r\n\r\n selectedAlert: IAlertRule;\r\n filteredAlertRules: IAlertRule[] = [];\r\n displayRules: IAlertRule[] = [];\r\n\r\n alertCategories: any[] = [];\r\n\r\n // access\r\n currentUser: IUser;\r\n isSystemUser = false;\r\n canManageAlerts: boolean = false;\r\n\r\n alertsDate: Date;\r\n\r\n // dataview\r\n tableHeaders: IVeriTableHeader[] = [];\r\n tableRows: IVeriTableRow[] = [];\r\n\r\n usageDashboardBoxInfo: IAlertUsageDashboardBoxInfo;\r\n\r\n static $inject = [\"$q\", \"$rootScope\", \"$filter\", \"accountFeatureService\", \"alertsService\", \"veriTableService\", \"translationService\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $rootScope: IRunBlockRootScope,\r\n private readonly $filter: angular.IFilterService,\r\n private readonly accountFeatureService: AccountFeatureService,\r\n private readonly alertsService: AlertsService,\r\n private readonly veriTableService: VeriTableService,\r\n private readonly translationService: TranslationService\r\n ) {\r\n\r\n this.currentUser = angular.copy($rootScope.currentUser);\r\n this.isSystemUser = this.currentUser.CurrentAccountUserMapping.Type === 0;\r\n this.canManageAlerts = this.accountFeatureService.doesCurrentUserHaveSpecialPermission(SpecialUserPermissions.ManageAlerts);\r\n }\r\n\r\n $onInit() {\r\n this.alertCategoryTriggers = this.alertsService.createAlertTriggerMappings();\r\n\r\n this.configureDataViewTable();\r\n this.alertCategories = EnumService.enumToArray(\"AlertCategory\", AlertCategory);\r\n this.alertCategories.sort((cat1, cat2) => (cat1.value > cat2.value) ? 1 : -1);\r\n\r\n this.alertsDate = new Date();\r\n\r\n this.refreshData();\r\n }\r\n\r\n onAlertEditorCancelled(): void {\r\n this.clearSelectedAlertRule();\r\n this.refreshData();\r\n }\r\n\r\n onAlertEditorDeleted(): void {\r\n this.clearSelectedAlertRule();\r\n this.refreshData();\r\n }\r\n\r\n onAlertEditorSaved(): void {\r\n this.clearSelectedAlertRule();\r\n this.refreshData();\r\n }\r\n\r\n selectAlert($event: MouseEvent, alert: IAlertRule): void {\r\n this.selectedAlert = copy(alert);\r\n\r\n this.showAlertEditorDialog($event);\r\n }\r\n\r\n createNewAlertRule($event: MouseEvent): void {\r\n this.showAlertEditorDialog($event, true);\r\n }\r\n\r\n searchAlertRules(searchString: string) {\r\n this.filteredAlertRules = [];\r\n\r\n this.alertRules?.forEach(alertRule => {\r\n if (this.isSystemUser || this.canAccessAlert(alertRule)) {\r\n this.filteredAlertRules.push(alertRule);\r\n }\r\n });\r\n\r\n if (!searchString) {\r\n this.displayRules = this.filteredAlertRules;\r\n return;\r\n }\r\n\r\n searchString = searchString.toLowerCase();\r\n\r\n this.displayRules = [];\r\n this.filteredAlertRules?.forEach(rule => {\r\n if (rule.Name.toLowerCase().indexOf(searchString) >= 0) {\r\n this.displayRules.push(rule);\r\n }\r\n });\r\n }\r\n\r\n // -----\r\n\r\n private refreshData(): void {\r\n this.loadingAlertRules = true;\r\n\r\n this.getData().then(() => {\r\n this.createDataViewTableRows();\r\n this.renderDashboardBoxes();\r\n\r\n this.loadingAlertRules = false;\r\n });\r\n }\r\n\r\n private getData(): angular.IPromise {\r\n const alertRulesPromise = this.alertsService.getActiveAlertRules();\r\n const quotasPromise = this.alertsService.getNotificationQuotas(new Date());\r\n\r\n return this.$q.all([alertRulesPromise, quotasPromise]).then(([alertRules, notificationQuotas]) => {\r\n this.alertRules = alertRules;\r\n this.notificationQuotas = notificationQuotas;\r\n this.addNotificationQuotaPercentages(this.notificationQuotas);\r\n this.searchAlertRules(null);\r\n });\r\n }\r\n\r\n private clearSelectedAlertRule(): void {\r\n this.selectedAlert = null;\r\n }\r\n\r\n private showAlertEditorDialog($event: MouseEvent, forceNewRuleMode: boolean = false) {\r\n const newRuleMode: boolean = forceNewRuleMode || !this.selectedAlert?.Id;\r\n const alertRule: IAlertRule = (newRuleMode) ? null : this.selectedAlert;\r\n\r\n this.alertsService.showAlertEditor(alertRule, $event, {\r\n onAlertEditorCancelled: () => { this.onAlertEditorCancelled(); },\r\n onAlertEditorDeleted: () => { this.onAlertEditorDeleted(); },\r\n onAlertEditorSaved: () => { this.onAlertEditorSaved(); }\r\n });\r\n }\r\n\r\n private canAccessAlert(alertRule: IAlertRule): boolean {\r\n if (!this.canManageAlerts) {\r\n return false;\r\n }\r\n\r\n let canAccessAlert = true;\r\n alertRule.Filters.forEach(filter => {\r\n canAccessAlert = canAccessAlert && this.hasFilterAccess(filter) && this.hasGroupAccess(filter.GroupId);\r\n });\r\n\r\n return canAccessAlert;\r\n }\r\n\r\n private hasFilterAccess(filter: IAlertFilterCriteria) {\r\n return filter.All || this.hasResourceTypeAccess(filter.ResourceType);\r\n }\r\n\r\n private hasGroupAccess(groupId: number): boolean {\r\n return !groupId || this.currentUser.GroupIds && this.currentUser.GroupIds.firstOrDefault(g => g === groupId) > 0;\r\n }\r\n\r\n private hasResourceTypeAccess(resourceType: ResourceType): boolean {\r\n switch (resourceType) {\r\n case ResourceType.Driver:\r\n return this.currentUser.CurrentAccountUserMapping.AllowAllDrivers;\r\n\r\n case ResourceType.Geofence:\r\n return this.currentUser.CurrentAccountUserMapping.AllowAllGeofences;\r\n\r\n case ResourceType.Vehicle:\r\n return this.currentUser.CurrentAccountUserMapping.AllowAllVehicles;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private addNotificationQuotaPercentages(notificationQuotas: INotificationQuota): void {\r\n const emailPercentageUsed: number = (notificationQuotas.TotalUsed.Email / notificationQuotas.TotalAllowed.Email) * 100;\r\n const smsPercentageUsed: number = (notificationQuotas.TotalUsed.Sms / notificationQuotas.TotalAllowed.Sms) * 100;\r\n\r\n notificationQuotas.emailPercentageUsed = +emailPercentageUsed.toFixed(2);\r\n notificationQuotas.smsPercentageUsed = +smsPercentageUsed.toFixed(2);\r\n }\r\n\r\n private configureDataViewTable(): void {\r\n this.createDataViewTableHeaders();\r\n }\r\n\r\n private createDataViewTableHeaders() {\r\n this.tableHeaders = [\r\n { title: this.translationService.t(\"AlertsManager.name\"), sortable: true },\r\n { title: this.translationService.t(\"AlertsManager.category\"), sortable: true, width: 220 },\r\n { title: this.translationService.t(\"AlertsManager.subCategory\"), sortable: true, width: 220 },\r\n { title: this.translationService.t(\"AlertsManager.resendInterval\"), sortable: true, width: 160 },\r\n { title: this.translationService.t(\"AlertsManager.delay\"), sortable: true, width: 160 },\r\n { title: this.translationService.t(\"Common.Status\"), sortable: true, sortType: SortType.String },\r\n this.veriTableService.createDateTimeHeader(this.translationService.t(\"AlertsManager.lastSentTime\"))\r\n ];\r\n }\r\n\r\n private createDataViewTableRows() {\r\n this.tableRows = this.veriTableService.createTableRowsWithCells(this.displayRules, rule => this.createTableRowCells(rule));\r\n }\r\n\r\n private createTableRowCells(alertRule: IAlertRule): IVeriTableRowCell[] {\r\n\r\n const category = this.translationService.tEnum(AlertCategory, 'AlertCategory', alertRule.Category);\r\n const { subCategoryEnum, subCategoryString } = this.alertsService.getAlertRuleSubcategoryEnum(alertRule.Category);\r\n const subCategory = this.translationService.tEnum(subCategoryEnum, subCategoryString, alertRule.SubCategory);\r\n const resendPluralWord = (alertRule.ResendMinuteInterval < 60) ? 'minute' : 'hour';\r\n const resendPluralNumber = (alertRule.ResendMinuteInterval < 60) ? alertRule.ResendMinuteInterval : alertRule.ResendMinuteInterval / 60;\r\n\r\n const resendLabel: string = (alertRule.ResendMinuteInterval) ? `${resendPluralNumber} ${this.pluralize(resendPluralWord, resendPluralNumber)}` : `-`;\r\n const delayLabel: string = (alertRule.FirstNotificationDelay) ? `${alertRule.FirstNotificationDelay} ${this.pluralize('minute', alertRule.FirstNotificationDelay)}` : `-`;\r\n\r\n return [\r\n { contents: `${alertRule.Name}` },\r\n { contents: category },\r\n { contents: subCategory },\r\n { contents: `${resendLabel}` },\r\n { contents: `${delayLabel}` },\r\n { contents: alertRule.Status === AlertRuleStatus.Active ? this.translationService.t(\"AlertsManager.Active\") : this.translationService.t(\"AlertsManager.Paused\") },\r\n this.veriTableService.createDateTimeCell(alertRule.LastSentTime)\r\n ];\r\n }\r\n\r\n private pluralize(label: string, length: number): string {\r\n return (length === 1) ? `${label}` : `${label}s`;\r\n }\r\n\r\n private renderDashboardBoxes(): void {\r\n\r\n const numberFilter: angular.IFilterNumber = this.$filter(\"number\");\r\n\r\n const emailPercentageUsed = this.notificationQuotas.emailPercentageUsed;\r\n const totalEmailsUsed = numberFilter(this.notificationQuotas.TotalUsed.Email);\r\n const totalEmailsAllowed = numberFilter(this.notificationQuotas.TotalAllowed.Email);\r\n\r\n const smsPercentageUsed = this.notificationQuotas.smsPercentageUsed;\r\n const totalSmsUsed = numberFilter(this.notificationQuotas.TotalUsed.Sms);\r\n const totalSmsAllowed = numberFilter(this.notificationQuotas.TotalAllowed.Sms);\r\n\r\n this.usageDashboardBoxInfo = {\r\n emailUsageTitle: this.translationService.t(\"AlertsManager.dashboardBoxTitleEmailUsage\", emailPercentageUsed),\r\n emailUsageSubtitle: this.translationService.t(\"AlertsManager.dashboardBoxSubtitleEmailUsage\", [totalEmailsUsed, totalEmailsAllowed]),\r\n smsUsageTitle: this.translationService.t(\"AlertsManager.dashboardBoxTitleSmsUsage\", smsPercentageUsed),\r\n smsUsageSubtitle: this.translationService.t(\"AlertsManager.dashboardBoxSubtitleSmsUsage\", [totalSmsUsed, totalSmsAllowed])\r\n }\r\n }\r\n}\r\n\r\nexport class AlertsManagerComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n\r\n constructor() {\r\n this.bindings = {\r\n };\r\n\r\n this.controller = AlertsManagerComponentController;\r\n this.template = require(\"./alertsManager.component.html\");\r\n }\r\n}\r\n","module.exports = \" {{'AlertsManager.createNewRule' | translate}}
    \";","import { SortDirection } from \"@enums/SortDirection\";\r\nimport { SpecialUserPermissions } from \"@enums/SpecialUserPermissions\";\r\nimport { IRunBlockRootScope } from \"@interfaces/IRunBlockRootScope\";\r\nimport { IUser } from \"@interfaces/IUser\";\r\nimport { EnumService } from \"@services/enum.service\";\r\nimport { AccountFeatureService } from \"@services/accountFeature.service\";\r\nimport * as angular from \"angular\";\r\nimport \"angular-material\";\r\nimport copy from \"fast-copy/dist/fast-copy.esm.js\";\r\nimport { AlertCategory } from \"src/app/main/modules/alerts/_enums/alerts.enums\";\r\nimport { IAlertRuleRecord } from \"../../_models/alerts.interfaces\";\r\nimport { AlertsService } from \"../../_services/alerts.service\";\r\nimport \"./recentAlerts.component.scss\";\r\nimport { DateService } from \"@app/services/date.service\";\r\n\r\ninterface IComponentBindings {\r\n maxListLength: number;\r\n}\r\n\r\nclass RecentAlertsComponentController implements angular.IComponentController, IComponentBindings {\r\n\r\n // bindings\r\n maxListLength: number;\r\n\r\n // loaders\r\n initialLoadComplete: boolean = false;\r\n loadingRecentAlerts: boolean = false;\r\n loadingAlertRule: boolean = false;\r\n\r\n // raw data\r\n alertRuleRecords: IAlertRuleRecord[] = [];\r\n alertCategories: any[] = [];\r\n\r\n // access\r\n currentUser: IUser;\r\n isSystemUser = false;\r\n canManageAlerts: boolean = false;\r\n\r\n static $inject = [\"$q\", \"$rootScope\", \"alertsService\", \"accountFeatureService\", \"dateService\"];\r\n\r\n constructor(\r\n private readonly $q: angular.IQService,\r\n private readonly $rootScope: IRunBlockRootScope,\r\n private readonly alertsService: AlertsService,\r\n private readonly accountFeatureService: AccountFeatureService,\r\n private readonly dateService: DateService) {\r\n\r\n }\r\n\r\n $onInit() {\r\n this.maxListLength = this.maxListLength || 5;\r\n\r\n this.initUser();\r\n this.alertCategories = EnumService.enumToArray(\"AlertCategory\", AlertCategory);\r\n this.alertCategories.sort((cat1, cat2) => (cat1.value > cat2.value) ? 1 : -1);\r\n\r\n this.refreshData();\r\n }\r\n\r\n onClickRecentAlertRuleRecord($event: MouseEvent, alertRuleRecord: IAlertRuleRecord) {\r\n if (!alertRuleRecord || this.loadingAlertRule) {\r\n return;\r\n }\r\n\r\n this.loadingAlertRule = true;\r\n\r\n this.alertsService\r\n .getAlertRule(alertRuleRecord?.RuleId)\r\n .then(alertRule => {\r\n if (!alertRule) {\r\n return;\r\n }\r\n\r\n this.alertsService.showAlertEditor(alertRule, $event, {\r\n autoLoadedRecordId: alertRuleRecord?.Id,\r\n onAlertEditorCancelled: () => { this.onAlertEditorCancelled(); },\r\n onAlertEditorDeleted: () => { this.onAlertEditorDeleted(); },\r\n onAlertEditorSaved: () => { this.onAlertEditorSaved(); }\r\n });\r\n })\r\n .finally(() => {\r\n this.loadingAlertRule = false;\r\n });\r\n }\r\n\r\n onAlertEditorCancelled(): void {\r\n this.refreshData();\r\n }\r\n\r\n onAlertEditorDeleted(): void {\r\n this.refreshData();\r\n }\r\n\r\n onAlertEditorSaved(): void {\r\n this.refreshData();\r\n }\r\n\r\n private initUser(): void {\r\n this.currentUser = copy(this.$rootScope.currentUser);\r\n this.isSystemUser = this.currentUser.CurrentAccountUserMapping.Type === 0;\r\n this.canManageAlerts = this.accountFeatureService.doesCurrentUserHaveSpecialPermission(SpecialUserPermissions.ManageAlerts);\r\n }\r\n\r\n private refreshData(): void {\r\n if (this.loadingRecentAlerts) {\r\n return;\r\n }\r\n\r\n this.loadingRecentAlerts = true;\r\n\r\n this.getData().finally(() => {\r\n this.initialLoadComplete = true;\r\n this.loadingRecentAlerts = false;\r\n });\r\n }\r\n\r\n private getData(): angular.IPromise {\r\n const yesterdaysDate: Date = new Date();\r\n yesterdaysDate.setDate(yesterdaysDate.getDate() - 5);\r\n\r\n const from: Date = new Date(yesterdaysDate);\r\n const to: Date = new Date;\r\n\r\n const alertRuleRecordsPromise = this.alertsService.getAlertRuleRecordsForAccount(from, to);\r\n\r\n return this.$q.all([alertRuleRecordsPromise]).then(([alertRuleRecords]) => {\r\n\r\n this.alertRuleRecords = this.prepareAlertRuleRecords(alertRuleRecords)\r\n });\r\n }\r\n\r\n private prepareAlertRuleRecords(alertRuleRecords: IAlertRuleRecord[] = []): IAlertRuleRecord[] {\r\n const preparedAlertRuleRecords: IAlertRuleRecord[] = [];\r\n\r\n alertRuleRecords = alertRuleRecords.filter(record => record?.TriggeredAtDataTimestamp && record?.SentCount > 0);\r\n alertRuleRecords.sort((record1, record2) => new Date(record2.TriggeredAtDataTimestamp).getTime() - new Date(record1.TriggeredAtDataTimestamp).getTime());\r\n\r\n for (var i = 0; i < alertRuleRecords?.length; i++) {\r\n if (preparedAlertRuleRecords?.length >= this.maxListLength) {\r\n break;\r\n }\r\n\r\n const alertRuleRecord: IAlertRuleRecord = alertRuleRecords[i];\r\n\r\n if (alertRuleRecord?.SentCount > 0) {\r\n preparedAlertRuleRecords.push(alertRuleRecord);\r\n }\r\n }\r\n\r\n return preparedAlertRuleRecords;\r\n }\r\n}\r\n\r\nexport class RecentAlertsComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n\r\n constructor() {\r\n this.bindings = {\r\n maxListLength: \"<\",\r\n };\r\n\r\n this.controller = RecentAlertsComponentController;\r\n this.template = require(\"./recentAlerts.component.html\");\r\n }\r\n}\r\n","module.exports = \"
    Recent Alerts
    0\\\">
    {{ alertRuleRecord.Title }}
    {{ alertRuleRecord.TriggeredAtDataTimestamp | veriDate:'timeago' }}
    {{ alertRuleRecord.Subject }}
    There are no recent Alerts
    Loading recent Alerts..
    \";","import { downgradeComponent } from \"@angular/upgrade/static\";\r\nimport { AccountFeatures } from \"@enums/account/AccountFeature\";\r\nimport { AuthorizationService } from \"@services/authorization.service\";\r\nimport { HighChartsService } from \"@services/highcharts.service\";\r\nimport { RouteConfigHelperProvider } from \"@services/routeConfigHelper.provider\";\r\nimport { TemperatureNavigationModule } from \"@temperature/temperature.navigation\";\r\nimport { ReeferDetailComponent } from \"@temperature/_components/reefer-detail/reefer-detail.component\";\r\nimport { ReeferListComponent } from \"@temperature/_components/reefer-list/reefer-list.component\";\r\nimport { TemperatureGraphComponent } from \"@temperature/_components/temperatureGraph/temperatureGraph.component\";\r\nimport { TemperatureGraphComponent2 } from \"@temperature/_components/tempGraph/temperature-graph.component\";\r\nimport { StateProvider } from \"@uirouter/angularjs\";\r\nimport * as angular from \"angular\";\r\nimport { TemperatureComplianceComponent } from \"./_components/compliance/temperature-compliance/temperature-compliance.component\";\r\n\r\nexport class Config {\r\n static $inject = [\"$stateProvider\", \"routeConfigHelperProvider\"];\r\n\r\n constructor(\r\n private $stateProvider: StateProvider,\r\n private routeConfigHelperProvider: RouteConfigHelperProvider) {\r\n\r\n $stateProvider.state(TemperatureNavigationModule.ParentRoot, {\r\n abstract: true,\r\n url: \"/temperature\",\r\n redirectTo: TemperatureNavigationModule.Default,\r\n views: { \"module-navigation\": {} },\r\n data: { translation: 'Common.Temperature' }\r\n });\r\n\r\n $stateProvider.state(TemperatureNavigationModule.TemperatureCompliance, {\r\n url: \"/vehicles/:page/:option\",\r\n views: { \"content@app\": { component: \"temperatureCompliance\" } },\r\n params: {\r\n page: { squash: true, value: null, dynamic: true },\r\n option: { squash: true, value: null, dynamic: true }\r\n },\r\n data: { translation: \"Common.Vehicles\", subtitleTranslationKey: \"Temperature.ComplianceSubtitle\" },\r\n resolve: {\r\n authorize: [\"authorizationService\", (authorization: AuthorizationService) => authorization.authorizeForUser([], [AccountFeatures.Temperature])]\r\n }\r\n });\r\n\r\n $stateProvider.state(TemperatureNavigationModule.Reefer, {\r\n url: \"/reefer\",\r\n views: { \"content@app\": { component: \"reeferList\" } },\r\n params: {\r\n page: { squash: true, value: null, dynamic: true },\r\n option: { squash: true, value: null, dynamic: true }\r\n },\r\n data: { translation: \"Temperature.Reefer\", subtitleTranslationKey: \"Temperature.ReeferSubtitle\" },\r\n resolve: {\r\n authorize: [\"authorizationService\", (authorization: AuthorizationService) => authorization.authorizeForUser([], [AccountFeatures.Reefer])]\r\n }\r\n });\r\n\r\n this.createReeferRecordView(TemperatureNavigationModule.Reefer);\r\n\r\n }\r\n private createReeferRecordView(parentViewName: string) {\r\n this.routeConfigHelperProvider.createDetailStateWithBoundParams({\r\n stateName: `${parentViewName}.view`,\r\n translation: 'Temperature.Reefer',\r\n bindingName: \"vehicleId\",\r\n component: \"reeferDetail\",\r\n breadcrumbNameResolverKey: \"reeferDetailNameKey\"\r\n });\r\n }\r\n}\r\n\r\nangular\r\n .module(\"app.temperature\", [\r\n \"app.directives\",\r\n \"ui.router\",\r\n \"ngMaterial\",\r\n \"highcharts-ng\"])\r\n .config(Config)\r\n .component(\"temperatureGraph\", new TemperatureGraphComponent())\r\n\r\n .service(\"highChartsService\", HighChartsService)\r\n\r\n .directive(\"reeferList\", downgradeComponent({ component: ReeferListComponent }))\r\n .directive(\"reeferDetail\", downgradeComponent({ component: ReeferDetailComponent }))\r\n .directive(\"tempGraph\", downgradeComponent({ component: TemperatureGraphComponent2 }))\r\n .directive(\"temperatureCompliance\", downgradeComponent({ component: TemperatureComplianceComponent }))\r\n\r\n ;\r\n","import { IVButtonDropDownItem } from \"@core/v-button/v-button.component\";\r\nimport { SortDirection } from \"@enums/SortDirection\";\r\nimport { IPlot, IPlotTemperatureRecord } from \"@interfaces/IPlot\";\r\nimport { IVehicle } from \"@interfaces/IVehicle\";\r\nimport { IVehicleInput } from \"@interfaces/IVehicleInput\";\r\nimport { ChartService, ChartType } from \"@services/charts.service\";\r\nimport { ColourService } from \"@services/colour.service\";\r\nimport { TranslationService } from \"@services/translation.service\";\r\nimport { UnitConversionService, UnitConversionType } from \"@services/unitConversion.service\";\r\nimport { VehicleService } from \"@services/vehicle.service\";\r\nimport { IVehicleInputRecordHistory, VehicleInputService } from \"@services/vehicleInput.service\";\r\nimport { VeriDate } from \"@services/veriDate.service\";\r\nimport { TemperatureProfileMaterialisationOptions } from \"@temperature/_enums/temperature/TemperatureProfileMaterialisationOptions.enum\";\r\nimport { IInputCategories } from \"@temperature/_models/temperature/IInputCategories\";\r\nimport { IProfileQueryOptions } from \"@temperature/_models/temperature/IProfileQueryOptions\";\r\nimport { ITemperatureProfile } from \"@temperature/_models/temperature/ITemperatureProfile\";\r\nimport { TemperatureService } from \"@temperature/_services/temperature.service\";\r\nimport * as angular from \"angular\";\r\nimport \"./temperatureGraph.scss\";\r\n\r\n\r\n\r\nclass TemperatureGraphComponentController implements angular.IComponentController {\r\n vehicle: IVehicle;\r\n start: Date;\r\n end: Date;\r\n\r\n loading = false;\r\n probeGraphLoading = false;\r\n inputChartLoading = false;\r\n\r\n showTooltip: boolean;\r\n showInputChart: boolean = true;\r\n legendTopRight: boolean;\r\n showResetZoom: boolean;\r\n\r\n tooltipElement: any;\r\n\r\n tooltipDate: string;\r\n lastUpdated: string;\r\n\r\n tooltipLeft: number;\r\n tooltipTop: number;\r\n tooltipWidth: number = 220;\r\n\r\n profileUpper: number;\r\n profileLower: number;\r\n\r\n plotlinePosition: number;\r\n\r\n tempProfiles: ITemperatureProfile[] = [];\r\n\r\n tooltipInputPoints: any[] = [];\r\n tooltipProbePoints: any[] = [];\r\n inputCategories: IInputCategories[] = [];\r\n\r\n plots: IPlot[];\r\n\r\n probeGraphConfig: Highcharts.Options;\r\n inputChartConfig: Highcharts.Options;\r\n\r\n inputChart: Highcharts.ChartObject;\r\n probeGraph: Highcharts.ChartObject;\r\n\r\n exporting: boolean = false;\r\n exportTypes: IVButtonDropDownItem[];\r\n\r\n onPlotPointHover: (event: { $plotPoint: IPlot, $mouseXPos: number }) => void;\r\n\r\n colours = [\"#0d3c55\", \"#0f5b78\", \"#117899\", \"#1395ba\", \"#5ca793\", \"#a2b86c\", \"#ebc844\", \"#ecaa38\", \"#ef8b2c\", \"#f16c20\", \"#d94e1f\", \"#c02e1d\", \"#c01d4e\", \"#b4189a\", \"#e42ed4\", \"#aa47dd\"];\r\n\r\n static $inject = [\"$scope\", \"$element\", \"$q\", \"$timeout\", \"vehicleService\", \"chartService\", \"vehicleInputService\", \"colourService\", \"veriDate\", \"temperatureService\", \"unitConversionService\", \"translationService\", \"veriDate\"];\r\n\r\n constructor(\r\n private readonly $scope: angular.IScope,\r\n private readonly $element: JQLite,\r\n private readonly $q: angular.IQService,\r\n private readonly $timeout: angular.ITimeoutService,\r\n private readonly vehicleService: VehicleService,\r\n private readonly chartService: ChartService,\r\n private readonly vehicleInputService: VehicleInputService,\r\n private readonly colourService: ColourService,\r\n private readonly veriDateService: VeriDate,\r\n private readonly temperatureService: TemperatureService,\r\n private readonly unitConversionService: UnitConversionService,\r\n private readonly translationService: TranslationService,\r\n private readonly veriDate: VeriDate\r\n ) {\r\n }\r\n\r\n $onChanges(onChangesObj: angular.IOnChangesObject) {\r\n if (onChangesObj[\"vehicle\"] || onChangesObj[\"start\"] || onChangesObj[\"end\"]) {\r\n this.resetState();\r\n\r\n this.tooltipElement = null;\r\n this.loadGraphData();\r\n }\r\n }\r\n\r\n private resetState() {\r\n this.exportTypes = [];\r\n\r\n delete this.probeGraph;\r\n delete this.inputChart;\r\n delete this.probeGraphConfig;\r\n delete this.inputChartConfig;\r\n }\r\n\r\n tooltipMovement($event: MouseEvent) {\r\n if (!this.probeGraphConfig) {\r\n return;\r\n }\r\n\r\n // min margin of yaxis label\r\n const yAxisMinLabelPadding = 80;\r\n\r\n //series label padding\r\n const seriesLabelPadding = this.probeGraphConfig.series[0]?.data ? 45 : 10;\r\n\r\n // min margin of xaxis label\r\n const XAxisLabelPadding = 41;\r\n\r\n if ($event.offsetX < yAxisMinLabelPadding || $event.offsetY <= seriesLabelPadding || this.tooltipProbePoints.length == 0 && this.tooltipInputPoints.length == 0) {\r\n this.hideTooltip();\r\n }\r\n else {\r\n this.showTooltip = true;\r\n }\r\n\r\n const tooltipContainer = $event.currentTarget as HTMLElement;\r\n if (!this.tooltipElement?.length) {\r\n this.tooltipElement = this.$element[0].getElementsByClassName('tooltip');\r\n }\r\n\r\n if (this.tooltipElement[0]) {\r\n this.tooltipLeft = $event.offsetX;\r\n this.tooltipLeft = Math.min(this.tooltipLeft, tooltipContainer.offsetWidth - this.tooltipWidth);\r\n\r\n const tooltipYOffset = 30;\r\n this.tooltipTop = $event.clientY - tooltipContainer.getBoundingClientRect().top - tooltipYOffset;\r\n this.tooltipTop = Math.min(this.tooltipTop, tooltipContainer.getBoundingClientRect().height - (this.tooltipElement[0].getBoundingClientRect().height + XAxisLabelPadding));\r\n }\r\n }\r\n\r\n hideTooltip() {\r\n this.showTooltip = false;\r\n }\r\n\r\n setPlotline($event: MouseEvent) {\r\n const charts = [this.inputChart, this.probeGraph];\r\n charts.forEach(currentchart => {\r\n if (!currentchart || !currentchart.xAxis) {\r\n return;\r\n }\r\n\r\n const xaxis = currentchart.xAxis[0] as any;\r\n\r\n this.plotlinePosition = xaxis.toValue($event.offsetX, false);\r\n\r\n this.chartService.addOrUpdateChartCrossHairFromMouseX(xaxis, $event.offsetX);\r\n this.tooltipDate = this.veriDateService.formatDate(new Date(this.plotlinePosition));\r\n this.updateTooltipData(currentchart, this.plotlinePosition);\r\n\r\n this.DisplayPlotOnMap(this.plotlinePosition);\r\n });\r\n }\r\n\r\n resetZoom() {\r\n const charts = [this.inputChart, this.probeGraph];\r\n\r\n charts.forEach(currentchart => {\r\n if (!currentchart || !currentchart.xAxis) {\r\n return;\r\n }\r\n\r\n currentchart.xAxis[0].setExtremes(null, null);\r\n\r\n this.showResetZoom = false;\r\n });\r\n }\r\n\r\n //-----------\r\n\r\n private displayTempProfilesOnGraph() {\r\n\r\n this.tempProfiles.forEach((profile, index) => {\r\n const yaxis = this.probeGraphConfig.yAxis as Highcharts.AxisOptions;\r\n\r\n yaxis.plotBands = yaxis.plotBands || [];\r\n yaxis.plotLines = yaxis.plotLines || [];\r\n\r\n const seriesColour = this.colourService.getVigetColor(index, 4, 3);\r\n\r\n yaxis.plotBands.push({\r\n from: profile.LowerBound,\r\n to: profile.UpperBound,\r\n id: profile.Name,\r\n color: this.colourService.createTransparentColor(seriesColour, 0.08),\r\n });\r\n\r\n yaxis.plotLines.push({\r\n value: profile.LowerBound,\r\n color: 'rgba(145,145,145, 0.4)',\r\n dashStyle: 'longdash',\r\n width: 1,\r\n zIndex: 3,\r\n label: {\r\n text: `${profile.Name} Min`,\r\n style: {\r\n color: '#919191',\r\n fontSize: \"12\",\r\n fontWeight: \"400\"\r\n }\r\n }\r\n });\r\n\r\n yaxis.plotLines.push({\r\n value: profile.UpperBound,\r\n color: 'rgba(145,145,145, 0.4)',\r\n dashStyle: 'longdash',\r\n width: 1,\r\n zIndex: 3,\r\n label: {\r\n text: `${profile.Name} Max`,\r\n y: 15,\r\n style: {\r\n color: '#919191',\r\n fontSize: \"12\",\r\n fontWeight: \"400\"\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n private createInputChart(vehicleInputList: IVehicleInput[], inputHistoryList: IVehicleInputRecordHistory[]) {\r\n\r\n if (!inputHistoryList.length) {\r\n return;\r\n }\r\n\r\n const categories: string[] = [];\r\n const xRangeSeries: any[] = [];\r\n const seriesData: any[] = [];\r\n const seriesColour: string[] = [];\r\n\r\n vehicleInputList.forEach((vehicleInput, index) => {\r\n this.inputCategories = [];\r\n\r\n this.inputCategories.push({\r\n name: vehicleInput.name,\r\n inputStateDescription: vehicleInput.InputStateDescription,\r\n isMultiStateInput: false\r\n });\r\n\r\n categories.push(vehicleInput.name);\r\n\r\n seriesColour.push(this.colourService.getVigetColor(index, inputHistoryList.length, 7, this.colours));\r\n\r\n inputHistoryList.forEach(historyListItem => {\r\n if (vehicleInput.Id == historyListItem.InputId) {\r\n historyListItem.inputName = vehicleInput.name;\r\n }\r\n\r\n if (!historyListItem.inputName) {\r\n return;\r\n }\r\n\r\n let x: number;\r\n let x2 = historyListItem.EndUtc ? new Date(historyListItem.EndUtc).valueOf() : Date.now();\r\n\r\n if (this.veriDateService.date1IsBeforeDate2(historyListItem.StartUtc, this.start)) {\r\n x = this.veriDateService.createMoment(this.start).valueOf();\r\n }\r\n else {\r\n x = this.veriDateService.createMoment(historyListItem.StartUtc).valueOf();\r\n }\r\n\r\n if (this.veriDateService.date1IsAfterDate2(historyListItem.EndUtc, this.end)) {\r\n x2 = this.veriDateService.createMoment(this.end).valueOf();\r\n }\r\n\r\n seriesData.push({\r\n x: x,\r\n x2: x2,\r\n y: categories.indexOf(`${historyListItem.inputName}`),\r\n name: `${historyListItem.inputName}`,\r\n custom: {\r\n inputStateDescription: vehicleInput.InputStateDescription\r\n }\r\n });\r\n });\r\n });\r\n\r\n xRangeSeries.push({\r\n name: `${this.vehicle.Reg}`,\r\n type: 'xrange',\r\n pointWidth: 20,\r\n pointPadding: 0.4,\r\n data: seriesData,\r\n showInLegend: false\r\n });\r\n\r\n this.inputChartConfig = this.chartService.createBasicXRangeChart(xRangeSeries);\r\n this.inputChartConfig.exporting = this.getExportingOptions();\r\n\r\n this.chartService.setChartXAxisExtremes(this.inputChartConfig, Number(this.end), Number(this.start));\r\n\r\n const yAxis = this.inputChartConfig.yAxis as Highcharts.AxisOptions;\r\n\r\n yAxis.categories = [...categories];\r\n yAxis.minPadding = 100;\r\n\r\n this.inputChartConfig.chart.marginLeft = 90;\r\n this.inputChartConfig.colors = seriesColour;\r\n\r\n this.chartService.setOnLoadCallback(this.inputChartConfig, (chart) => {\r\n this.inputChart = chart;\r\n\r\n this.exportTypes.push({ id: 1, label: this.translationService.t(\"Common.Inputs\"), icon: \"panorama\", data: this.inputChart });\r\n this.sortOutExportLabels();\r\n\r\n this.$timeout(() => {\r\n window.dispatchEvent(new Event('resize'));\r\n }, 1000);\r\n });\r\n\r\n this.inputChartConfig.chart.resetZoomButton = { position: { y: -100 } }; // hides reset button on the chart\r\n\r\n this.syncChartZooming(this.inputChartConfig);\r\n }\r\n\r\n\r\n private createProbeChart(records: IPlotTemperatureRecord[]) {\r\n if (!records.length) {\r\n return;\r\n }\r\n\r\n records.sort((a, b) => {\r\n return this.veriDateService.sort(a.Timestamp, b.Timestamp, SortDirection.Ascending);\r\n });\r\n\r\n const temperatureSeries: any[] = [];\r\n\r\n this.vehicle.probes.forEach((probe, index) => {\r\n\r\n const foundRecords = [];\r\n\r\n records.forEach(record => {\r\n if (record.Position === probe.Position && record.Source == probe.Source) {\r\n foundRecords.push([new Date(record.Timestamp).valueOf(), this.unitConversionService.convertTemperature(record.Temperature)]);\r\n }\r\n });\r\n\r\n const seriesColour = this.colourService.getVigetColor(index, 16, 3, this.colours);\r\n\r\n if (foundRecords.length > 0) {\r\n temperatureSeries.push(\r\n {\r\n name: probe.cleanName,\r\n data: foundRecords,\r\n id: probe.Id,\r\n zoneAxis: 'y',\r\n color: `${seriesColour}`,\r\n lineWidth: 1,\r\n zones: [\r\n {\r\n value: probe.MinPrimaryThreshold,\r\n dashStyle: 'ShortDot',\r\n //color: \"#005ab3\"\r\n color: seriesColour,\r\n },\r\n {\r\n value: probe.MaxPrimaryThreshold,\r\n dashStyle: 'solid',\r\n color: seriesColour,\r\n },\r\n {\r\n dashStyle: 'ShortDot',\r\n //color: this.colourService.redColor\r\n color: seriesColour,\r\n }\r\n ]\r\n }\r\n );\r\n }\r\n });\r\n\r\n temperatureSeries.sort((a, b) => {\r\n //Ensure legend labels appear alphabetically\r\n if (a.name < b.name) {\r\n return -1;\r\n }\r\n })\r\n\r\n this.probeGraphConfig = this.createTempChartConfig(\"line\", temperatureSeries, chart => {\r\n this.probeGraph = chart;\r\n\r\n this.exportTypes.push({ id: 0, label: this.translationService.t(\"Common.Temperature\"), icon: \"panorama\", data: this.probeGraph });\r\n this.sortOutExportLabels();\r\n\r\n this.$timeout(() => {\r\n window.dispatchEvent(new Event('resize'));\r\n });\r\n });\r\n\r\n this.probeGraphConfig.exporting = this.getExportingOptions();\r\n\r\n this.chartService.setChartXAxisExtremes(this.probeGraphConfig, Number(this.end), Number(this.start));\r\n\r\n const series = this.probeGraphConfig.plotOptions as any;\r\n\r\n series.series = {\r\n states: {\r\n inactive: {\r\n opacity: 1\r\n }\r\n },\r\n marker: {\r\n enabled: false,\r\n states: {\r\n hover: {\r\n enabled: false\r\n }\r\n }\r\n }\r\n };\r\n\r\n this.probeGraphConfig.chart.marginLeft = 90;\r\n\r\n this.probeGraphConfig.chart.spacing = [10, 10, 10, 10];\r\n\r\n this.probeGraphConfig.chart.plotBackgroundColor = 'rgba(251,251,251,0.8)';\r\n\r\n this.probeGraphConfig.yAxis = {\r\n title: {\r\n text: `${this.translationService.t('Common.Temperature')} (${this.unitConversionService.getConversionLabel(UnitConversionType.Temperature)})`,\r\n margin: 20\r\n }\r\n };\r\n\r\n this.displayTempProfilesOnGraph();\r\n\r\n this.probeGraphConfig.chart.resetZoomButton = { position: { y: -100 } }; // hides reset button on the chart\r\n\r\n this.probeGraphConfig.tooltip = { enabled: false, shared: false };\r\n\r\n this.probeGraphConfig.legend = {\r\n enabled: true,\r\n layout: 'horizontal',\r\n align: 'right',\r\n verticalAlign: 'top',\r\n itemMarginTop: 0,\r\n itemMarginBottom: 0\r\n }\r\n\r\n this.syncChartZooming(this.probeGraphConfig);\r\n }\r\n\r\n private DisplayPlotOnMap(graphPlotLine: number) {\r\n if (!this.plots || !graphPlotLine) {\r\n return;\r\n }\r\n\r\n for (let i = 0; i < this.plots.length; i++) {\r\n\r\n if (!this.plots[i]) {\r\n return;\r\n }\r\n\r\n const plot = this.plots[i];\r\n\r\n if (this.tooltipDate == this.veriDateService.formatDate(plot.Utc)) {\r\n\r\n this.$scope.$applyAsync(() => {\r\n this.onPlotPointHover({ $plotPoint: plot, $mouseXPos: graphPlotLine });\r\n });\r\n }\r\n }\r\n }\r\n\r\n private createTempChartConfig(chartType: ChartType, series: Highcharts.IndividualSeriesOptions[], callback: (chartObject: Highcharts.ChartObject, event: MouseEvent) => void): Highcharts.Options {\r\n const options = this.chartService.createChartOptions(chartType);\r\n options.series = series;\r\n options.plotOptions.line.states.hover.lineWidth = 3;\r\n\r\n this.chartService.setOnLoadCallback(options, callback);\r\n\r\n return options;\r\n }\r\n\r\n private doesLatestRequested(): boolean {\r\n const now = new Date();\r\n return this.veriDateService.date1IsBeforeDate2(now, this.end)\r\n }\r\n\r\n private loadGraphData(invalidateCache = false) {\r\n\r\n if (this.doesLatestRequested()) {\r\n invalidateCache = true;\r\n }\r\n\r\n this.probeGraphLoading = true;\r\n this.inputChartLoading = true;\r\n this.tempProfiles = [];\r\n\r\n if (!this.vehicle) {\r\n return;\r\n }\r\n\r\n const vehicleInputPromise = this.vehicleInputService.getVehicleInputs(this.vehicle.Id, invalidateCache);\r\n const inputHistoryPromise = this.vehicleInputService.getVehicleInputHistory(this.vehicle.Id, this.start, this.end, true, invalidateCache);\r\n const tempRecordPromise = this.vehicleService.getVehicleTemperatureRecords(this.vehicle.Id, this.veriDateService.createMoment(this.start), this.veriDateService.createMoment(this.end), invalidateCache);\r\n const queryOptions: IProfileQueryOptions = {\r\n MaterialisationOptions: TemperatureProfileMaterialisationOptions.WithHistories\r\n }\r\n const profilePromise = this.temperatureService.getTemperatureProfiles(invalidateCache, queryOptions);\r\n\r\n this.$q.all([vehicleInputPromise, inputHistoryPromise, tempRecordPromise, profilePromise])\r\n .then(([vehicleInputList, inputHistoryList, records, profiles]) => {\r\n this.vehicle.probes.forEach(probe => {\r\n\r\n const profile = profiles.find(profile => probe.TemperatureProfileId === profile.Id);\r\n\r\n if (!profile) {\r\n return;\r\n }\r\n\r\n let relevantProfile = profile.TemperatureProfileHistories.find(history => {\r\n //Find relevant profile data for the time period that is being viewed\r\n return this.veriDate.createMoment(this.start).isBetween(this.veriDate.createMoment(history.Start), this.veriDate.createMoment(history.End));\r\n }) as ITemperatureProfile;\r\n if (!relevantProfile) {\r\n relevantProfile = profile;\r\n }\r\n relevantProfile.LowerBound = this.unitConversionService.convertTemperature(relevantProfile.LowerBound);\r\n relevantProfile.UpperBound = this.unitConversionService.convertTemperature(relevantProfile.UpperBound);\r\n relevantProfile.Name = profile.Name;\r\n\r\n probe.MinPrimaryThreshold = relevantProfile.LowerBound;\r\n probe.MaxPrimaryThreshold = relevantProfile.UpperBound;\r\n\r\n // If not added already, add to our list\r\n if (!this.tempProfiles.find(p => p.Id == relevantProfile.Id)) {\r\n this.tempProfiles.push(relevantProfile);\r\n }\r\n });\r\n this.createProbeChart(records);\r\n this.createInputChart(vehicleInputList, inputHistoryList);\r\n })\r\n .finally(() => {\r\n this.showInputChart = this.inputChartConfig && this.inputChartConfig.series[0].data.length > 0;\r\n this.inputChartLoading = false;\r\n this.probeGraphLoading = false;\r\n if (invalidateCache) {\r\n this.lastUpdated = new Date().toString();\r\n } else {\r\n this.lastUpdated = null;\r\n }\r\n });\r\n }\r\n\r\n private syncChartZooming(currentChart: Highcharts.Options) {\r\n this.showResetZoom = false;\r\n const xAxis = currentChart.xAxis as Highcharts.AxisOptions;\r\n\r\n xAxis.startOnTick = true;\r\n\r\n xAxis.events = {\r\n afterSetExtremes: (event: any) => {\r\n if (event.userMax) {\r\n this.showResetZoom = true;\r\n }\r\n\r\n if (event.trigger == \"zoom\") {\r\n if (this.inputChart && currentChart == this.probeGraphConfig) {\r\n this.inputChart.xAxis[0].setExtremes(event.min, event.max, true, true);\r\n }\r\n\r\n if (currentChart == this.inputChartConfig) {\r\n this.probeGraph.xAxis[0].setExtremes(event.min, event.max, true, true);\r\n }\r\n }\r\n }\r\n };\r\n\r\n }\r\n\r\n private updateTooltipData(chart: Highcharts.ChartObject, axisPoint: number) {\r\n const xaxis = chart.xAxis[0] as any;\r\n\r\n if (chart == this.probeGraph) {\r\n this.tooltipProbePoints = [];\r\n\r\n xaxis.series.forEach(seriesItem => {\r\n const foundProbePoint = seriesItem.data.find(p => p && p.x >= axisPoint);\r\n\r\n if (foundProbePoint) {\r\n this.tooltipProbePoints.push(foundProbePoint);\r\n }\r\n });\r\n }\r\n\r\n if (chart == this.inputChart) {\r\n this.tooltipInputPoints = [];\r\n\r\n xaxis.series.forEach(seriesItem => {\r\n seriesItem.data.forEach(point => {\r\n if (axisPoint >= point.x && axisPoint <= point.x2) {\r\n this.tooltipInputPoints.push(point);\r\n }\r\n });\r\n });\r\n }\r\n }\r\n\r\n sortOutExportLabels() {\r\n this.exportTypes.sort((a, b) =>\r\n a.label < b.label ? -1 : a.label > b.label ? 1 : 0\r\n ).reverse(); // reversed to match the order of the charts (1 temp. 2 inputs)\r\n }\r\n\r\n private getExportingOptions(): Highcharts.ExportingOptions {\r\n return {\r\n enabled: true,\r\n buttons: null,\r\n chartOptions: {\r\n title: {\r\n text: this.vehicle.Reg\r\n },\r\n chart: {\r\n backgroundColor: 'white'\r\n }\r\n }\r\n }\r\n }\r\n\r\n onItemClick(event: IVButtonDropDownItem) {\r\n this.exporting = true;\r\n\r\n const filename = `${this.vehicle.Reg} ${event.label} ${this.veriDateService.formatDate(new Date(), 'Date')}`;\r\n\r\n event.data.exportChart({ filename });\r\n\r\n this.resetState();\r\n\r\n this.loadGraphData();\r\n\r\n this.$timeout(1000).then(() => {\r\n this.exporting = false;\r\n });\r\n }\r\n}\r\n\r\nexport class TemperatureGraphComponent implements angular.IComponentOptions {\r\n bindings: any;\r\n controller: any;\r\n template: string;\r\n\r\n constructor() {\r\n this.bindings = {\r\n vehicle: \"<\",\r\n start: \"<\",\r\n end: \"<\",\r\n legendTopRight: \"<\",\r\n\r\n onPlotPointHover: \"&\",\r\n highlightedPlot: \"<\",\r\n plots: \"<\",\r\n\r\n };\r\n\r\n this.controller = TemperatureGraphComponentController;\r\n this.template = require(\"./temperatureGraph.html\");\r\n }\r\n}\r\n","module.exports = \"
    {{'temperatureGraph.resetZoom' | translate}} {{ 'Common.Exporting' | translate}}... {{ 'Common.Export' | translate}}
    {{$ctrl.tooltipDate}}
    0\\\" class=tooltip-title>{{'temperatureGraph.temperatures' | translate}}
    {{'temperatureGraph.probeCount' | translate : [ probePoint.series.name, probePoint.y.toFixed(1) ]}}
    {{'temperatureGraph.inputs' | translate}}
    {{'temperatureGraph.on' | translate : inputPoint.name}} {{'temperatureGraph.open' | translate : inputPoint.name}}
    {{'temperatureGraph.off' | translate : category.name}} {{'temperatureGraph.closed' | translate : category.name}}
    {{'temperatureGraph.noTemperatureData' | translate}}
    {{\\\"Common.LastUpdated\\\" | translate }}: {{$ctrl.lastUpdated | veriDate: 'fulltime' }}
    \";"],"sourceRoot":""}