{"version":3,"file":"c8y-ngx-components-tracking.mjs","sources":["../../tracking/tracking.service.ts","../../tracking/tracking-marker-popup.component.ts","../../tracking/tracking-marker-popup.component.html","../../tracking/tracking-tab.guard.ts","../../tracking/tracking.component.ts","../../tracking/tracking.component.html","../../tracking/tracking.feature.ts","../../tracking/c8y-ngx-components-tracking.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { EventService, IEvent, IResultList } from '@c8y/client';\nimport { ForOfFilterPipe, GeoService, TimeInterval } from '@c8y/ngx-components';\nimport { PositionManagedObject } from '@c8y/ngx-components/map';\nimport { first, identity, isEmpty, last } from 'lodash-es';\nimport { BehaviorSubject, Observable, Subject, combineLatest, pipe } from 'rxjs';\nimport { distinctUntilChanged, map, share, switchMap, tap } from 'rxjs/operators';\n\nconst LOCATION_UPDATE_EVENT_TYPE = 'c8y_LocationUpdate';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class TrackingService {\n  private static readonly BASE_FILTER = {\n    pageSize: 1000,\n    withTotalPages: true,\n    type: LOCATION_UPDATE_EVENT_TYPE\n  };\n\n  events$: Observable<IResultList<IEvent>>;\n  polyline$: Observable<L.LatLngExpression[]>;\n  pipe: ForOfFilterPipe;\n  trackVisible = true;\n  hasEvents = false;\n\n  private _polylineEventsSubject$ = new BehaviorSubject<IEvent[]>([]);\n\n  private deviceId$: Subject<string | number> = new Subject();\n  private timeInterval$: Subject<TimeInterval> = new Subject();\n  private reload$: BehaviorSubject<void> = new BehaviorSubject(null);\n\n  constructor(\n    private eventService: EventService,\n    private geo: GeoService\n  ) {\n    this.polyline$ = this._polylineEventsSubject$.asObservable().pipe(\n      map(events => (events || []).map(event => this.geo.getLatLong(event)).filter(identity)),\n      share()\n    );\n\n    this.events$ = combineLatest([\n      this.deviceId$.pipe(distinctUntilChanged()),\n      this.timeInterval$,\n      this.reload$\n    ]).pipe(\n      switchMap(([source, interval]) => {\n        const { dateFrom, dateTo } = interval;\n        return this.eventService.list({\n          ...TrackingService.BASE_FILTER,\n          source,\n          dateFrom: dateFrom.toISOString(),\n          dateTo: dateTo.toISOString()\n        });\n      }),\n      tap(() => this._polylineEventsSubject$.next([])),\n      share()\n    );\n\n    this.pipe = pipe(\n      tap(events => (this.hasEvents = !isEmpty(events))),\n      map((events: IEvent[]) => (events || []).filter(event => this.isMatchingEvent(event))),\n      tap((events: IEvent[]) => {\n        const prepend =\n          this.compareEvents(last(this._polylineEventsSubject$.value), first(events)) < 0;\n        const polyline: IEvent[] = prepend\n          ? [...events, ...this._polylineEventsSubject$.value]\n          : [...this._polylineEventsSubject$.value, ...events];\n\n        this._polylineEventsSubject$.next(polyline);\n      })\n    );\n  }\n\n  setDeviceId(deviceId: string | number) {\n    this.deviceId$.next(deviceId);\n  }\n\n  setInterval(interval: TimeInterval) {\n    this.timeInterval$.next(interval);\n  }\n\n  clearTrack() {\n    this._polylineEventsSubject$.next([]);\n  }\n\n  reload() {\n    this.reload$.next();\n  }\n\n  async latestPositionUpdate(mo: PositionManagedObject): Promise<Date> {\n    const dateTo = new Date();\n    dateTo.setDate(dateTo.getDate() + 1);\n\n    const filters = {\n      fragmentType: 'c8y_Position',\n      dateFrom: new Date(0).toISOString(),\n      dateTo: dateTo.toISOString(),\n      pageSize: 1,\n      source: mo.id\n    };\n    const events = await this.eventService.list(filters);\n    return events?.data?.length ? new Date(events.data[0].time) : undefined;\n  }\n\n  toggleTrack() {\n    if (this.trackVisible) {\n      this.clearTrack();\n    } else {\n      this.reload();\n    }\n    this.trackVisible = !this.trackVisible;\n  }\n\n  isLocationUpdateEvent(event: IEvent): boolean {\n    return event.type === LOCATION_UPDATE_EVENT_TYPE;\n  }\n\n  private isMatchingEvent(event: IEvent): boolean {\n    return this.isLocationUpdateEvent(event);\n  }\n\n  private compareEvents(a: IEvent, b: IEvent): number {\n    return Date.parse(a?.time) - Date.parse(b?.time);\n  }\n}\n","import { Component, Input, OnInit } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { RouterModule } from '@angular/router';\nimport { IEvent } from '@c8y/client';\nimport { CoreModule } from '@c8y/ngx-components';\nimport { PositionManagedObject } from '@c8y/ngx-components/map';\nimport { TrackingService } from './tracking.service';\n\n@Component({\n  standalone: true,\n  selector: 'c8y-tracking-marker-popup',\n  templateUrl: './tracking-marker-popup.component.html',\n  imports: [CoreModule, RouterModule, FormsModule]\n})\nexport class TrackingMarkerPopupComponent implements OnInit {\n  @Input()\n  context: PositionManagedObject | IEvent;\n\n  /**\n   * Displays link to device tracking tab.\n   */\n  @Input()\n  showTrackingLink = false;\n\n  isDevice: boolean;\n  date: Date;\n\n  constructor(public trackingService: TrackingService) {}\n\n  async ngOnInit() {\n    this.isDevice = !this.trackingService.isLocationUpdateEvent(this.context as unknown as IEvent);\n    if (this.isDevice) {\n      this.trackingService.setDeviceId(this.context.id);\n      this.date = await this.trackingService.latestPositionUpdate(\n        this.context as PositionManagedObject\n      );\n    } else {\n      this.date = this.context.time;\n    }\n  }\n}\n","<div class=\"map-marker\">\n  <a\n    class=\"text-truncate text-14 text-medium p-0 m-b-8 deviceLink\"\n    [title]=\"context?.name\"\n    *ngIf=\"isDevice\"\n    [routerLink]=\"['/device/', context?.id]\"\n  >\n    {{ context?.name }}\n  </a>\n  <div\n    class=\"m-b-8\"\n    ng-if=\"lastUpdated\"\n  >\n    <p class=\"m-0\">{{ 'Position:' | translate }}</p>\n    <div class=\"text-muted\">\n      <p class=\"m-b-0\">{{ context?.c8y_Position?.lat }},</p>\n      <p class=\"m-t-0\">{{ context?.c8y_Position?.lng }}</p>\n    </div>\n    @if (!!context?.c8y_Position?.alt || context?.c8y_Position?.alt === 0) {\n      <p class=\"m-0\">{{ 'Altitude:' | translate }}</p>\n      <div class=\"text-muted\">\n        <p\n          class=\"m-b-0\"\n          [translate]=\"'{{alt}} m`meters, altitude`'\"\n          [translateParams]=\"{ alt: context?.c8y_Position?.alt }\"\n        ></p>\n      </div>\n    }\n    @if (!!date) {\n      <p class=\"m-0 p-t-4\">{{ 'Date and time:' | translate }}</p>\n      <span class=\"text-muted\">{{ date | c8yDate }}</span>\n    }\n  </div>\n\n  @if (isDevice) {\n    @if (showTrackingLink) {\n      <span>\n        Go to\n        <a [routerLink]=\"['/device', context?.id, 'tracking']\">Tracking</a>\n      </span>\n    } @else {\n      <div class=\"d-flex a-i-center\">\n        <label\n          class=\"c8y-switch\"\n          for=\"switch\"\n        >\n          <input\n            id=\"switch\"\n            type=\"checkbox\"\n            [checked]=\"trackingService.trackVisible\"\n            (change)=\"trackingService.toggleTrack()\"\n          />\n          <span></span>\n        </label>\n        <div class=\"description p-b-0\">\n          {{ 'Show track' | translate }}\n        </div>\n      </div>\n    }\n  }\n</div>\n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivate } from '@angular/router';\nimport { IManagedObject } from '@c8y/client';\nimport { ContextRouteService, GeoService, ViewContext } from '@c8y/ngx-components';\nimport { isEmpty } from 'lodash-es';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class TrackingTabFactory implements CanActivate {\n  constructor(\n    private contextRouteService: ContextRouteService,\n    private geoService: GeoService\n  ) {}\n\n  canActivate(snapshot: ActivatedRouteSnapshot): boolean {\n    const contextData = this.contextRouteService.getContextData(snapshot);\n    return (\n      contextData?.context === ViewContext.Device &&\n      !isEmpty(this.geoService.getLatLong(contextData?.contextData as IManagedObject))\n    );\n  }\n}\n","import { AfterViewInit, Component, OnInit, ViewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ActivatedRoute } from '@angular/router';\nimport { IEvent } from '@c8y/client';\nimport {\n  ActionBarModule,\n  ContextRouteService,\n  CoreModule,\n  DateRangePickerConfig,\n  EventRealtimeService,\n  LoadMoreComponent,\n  TimeInterval,\n  TimeIntervalComponent\n} from '@c8y/ngx-components';\nimport { MapComponent, MapConfig, MapModule, PositionManagedObject } from '@c8y/ngx-components/map';\nimport { TrackingMarkerPopupComponent } from './tracking-marker-popup.component';\nimport { TrackingService } from './tracking.service';\n\n@Component({\n  standalone: true,\n  templateUrl: './tracking.component.html',\n  imports: [\n    MapModule,\n    ActionBarModule,\n    CoreModule,\n    TimeIntervalComponent,\n    FormsModule,\n    TrackingMarkerPopupComponent\n  ],\n  providers: [EventRealtimeService],\n  selector: 'c8y-tracking'\n})\nexport class TrackingComponent implements OnInit, AfterViewInit {\n  @ViewChild(MapComponent)\n  map: MapComponent;\n\n  dateRangePickerConfig: DateRangePickerConfig = {\n    adaptivePosition: true,\n    showPreviousMonth: true,\n    preventChangeToNextMonth: true\n  };\n\n  config: MapConfig = {\n    realtime: true,\n    follow: false,\n    zoomLevel: 12,\n    fitBoundsOptions: {\n      padding: [50, 50]\n    }\n  };\n\n  maxDate = new Date();\n  activeMarkers: { [key: string]: boolean } = {};\n  realtimeDisabled = false;\n  device: PositionManagedObject;\n  loadMoreComponent: LoadMoreComponent;\n\n  constructor(\n    public service: TrackingService,\n    public realtime: EventRealtimeService,\n    private contextRouteService: ContextRouteService,\n    private activatedRoute: ActivatedRoute\n  ) {}\n\n  async ngOnInit() {\n    const { contextData } = this.contextRouteService.getContextData(this.activatedRoute);\n    this.device = contextData as PositionManagedObject;\n  }\n\n  async ngAfterViewInit() {\n    this.service.setDeviceId(this.device.id);\n    this.togglePositionRealtime(this.realtime.active);\n  }\n\n  toggleMarker(event: IEvent) {\n    let marker = this.map.findMarker(event);\n\n    if (marker) {\n      this.map.removeMarker(marker);\n      delete this.activeMarkers[`p${event.id}`];\n    } else {\n      marker = this.map.getTrackingMarker(event);\n      this.map.addMarkerToMap(marker);\n      this.activeMarkers[`p${event.id}`] = true;\n    }\n  }\n\n  togglePositionRealtime(active: boolean) {\n    this.config = { ...this.config, realtime: active };\n  }\n\n  toggleRealtime(interval: TimeInterval) {\n    const currentTimeInRange = Date.now() <= interval?.dateTo?.getTime();\n    this.togglePositionRealtime(currentTimeInRange);\n    this.realtimeDisabled = !currentTimeInRange;\n\n    if (currentTimeInRange) {\n      this.realtime.start();\n    } else {\n      this.realtime.stop();\n    }\n  }\n}\n","<c8y-action-bar-item\n  [placement]=\"'right'\"\n  [priority]=\"100\"\n>\n  <c8y-realtime-btn\n    [service]=\"realtime\"\n    [disabled]=\"realtimeDisabled\"\n    (onToggle)=\"togglePositionRealtime($event)\"\n  ></c8y-realtime-btn>\n</c8y-action-bar-item>\n<c8y-action-bar-item\n  [placement]=\"'right'\"\n  [priority]=\"60\"\n>\n  <c8y-time-interval\n    [maxCustomDate]=\"maxDate\"\n    [dateRangePickerConfig]=\"dateRangePickerConfig\"\n    (interval)=\"service.setInterval($event); toggleRealtime($event)\"\n  ></c8y-time-interval>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid content-fullpage d-grid grid__col--8-4--md\">\n  <div class=\"bg-white p-relative\">\n    <c8y-map\n      [config]=\"config\"\n      [assets]=\"device\"\n      [polyline$]=\"service.polyline$\"\n      [polylineOptions]=\"{ color: 'darkblue' }\"\n    >\n      <div *c8yMapPopup=\"let context\">\n        <c8y-tracking-marker-popup [context]=\"context\"></c8y-tracking-marker-popup>\n      </div>\n    </c8y-map>\n  </div>\n\n  <div class=\"d-flex d-col bg-inherit content-fullpage bg-gray-white\">\n    <div class=\"card-header large-padding separator sticky-top\">\n      <span\n        class=\"card-title\"\n        translate\n      >\n        Tracking events\n      </span>\n    </div>\n    <div class=\"inner-scroll\">\n      <c8y-list-group class=\"c8y-list__group--strip\">\n        <ng-template\n          c8yFor\n          let-event\n          [c8yForOf]=\"service.events$\"\n          [c8yForPipe]=\"service.pipe\"\n          [c8yForRealtime]=\"realtime\"\n          [c8yForRealtimeOptions]=\"{ entityOrId: device }\"\n          [c8yForLoadMore]=\"'hidden'\"\n          [c8yForNotFound]=\"empty\"\n          (c8yForLoadMoreComponent)=\"\n            loadMoreComponent = $event; loadMoreComponent.useIntersection = false\n          \"\n        >\n          <c8y-li\n            class=\"pointer\"\n            [ngClass]=\"{ 'text-primary text-bold': activeMarkers['p' + event?.id] }\"\n            (click)=\"toggleMarker(event)\"\n            [attr.data-cy]=\"'c8y-tracking--tracking-event-item-' + event?.id\"\n          >\n            <c8y-li-icon [ngClass]=\"{ 'text-primary': activeMarkers['p' + event?.id] }\">\n              <i c8yIcon=\"c8y-location\"></i>\n            </c8y-li-icon>\n            <c8y-li-body>\n              <div class=\"d-flex\">\n                <span>\n                  {{ event.time | date: 'mediumDate' }}\n                </span>\n                <span class=\"m-l-auto\">\n                  {{ event.time | date: 'mediumTime' }}\n                </span>\n              </div>\n            </c8y-li-body>\n          </c8y-li>\n        </ng-template>\n      </c8y-list-group>\n    </div>\n\n    <!-- empty state -->\n    <ng-template #empty>\n      <c8y-ui-empty-state\n        icon=\"c8y-location\"\n        [title]=\"'No tracking events found.' | translate\"\n        [subtitle]=\"'Select another time range.' | translate\"\n        *ngIf=\"!service.hasEvents\"\n        [horizontal]=\"true\"\n      ></c8y-ui-empty-state>\n    </ng-template>\n\n    <div *ngIf=\"loadMoreComponent?.hasMore\">\n      <button\n        class=\"btn btn-link fit-w sticky-bottom separator-top\"\n        [title]=\"'Load more' | translate\"\n        type=\"button\"\n        [disabled]=\"loadMoreComponent?.isLoading\"\n        (click)=\"loadMoreComponent.loadMore()\"\n        data-cy=\"c8y-tracking--load-more\"\n      >\n        {{ 'Load more' | translate }}\n      </button>\n    </div>\n\n    <div class=\"card-footer separator\">\n      <button\n        class=\"btn btn-default\"\n        [title]=\"'Deselect all markers' | translate\"\n        type=\"button\"\n        [disabled]=\"(activeMarkers | json) === '{}'\"\n        (click)=\"map.clearMarkers('event'); activeMarkers = {}\"\n      >\n        {{ 'Deselect all markers' | translate }}\n      </button>\n    </div>\n  </div>\n</div>\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { gettext, hookRoute, ViewContext } from '@c8y/ngx-components';\nimport { TrackingTabFactory } from './tracking-tab.guard';\nimport { TrackingComponent } from './tracking.component';\n\nexport const trackingFeatureProvider: EnvironmentProviders = makeEnvironmentProviders([\n  TrackingTabFactory,\n  hookRoute({\n    path: 'tracking',\n    component: TrackingComponent,\n    context: ViewContext.Device,\n    label: gettext('Tracking'),\n    icon: 'crosshairs',\n    canActivate: [TrackingTabFactory]\n  })\n]);\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.TrackingService","i3","i1"],"mappings":"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"}