{"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  @if (isDevice) {\n    <a\n      class=\"text-truncate text-14 text-medium p-0 m-b-8 deviceLink\"\n      [title]=\"context?.name\"\n      [routerLink]=\"['/device/', context?.id]\"\n    >\n      {{ context?.name }}\n    </a>\n  }\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\n    class=\"bg-white p-relative\"\n    style=\"min-height: 30vh\"\n  >\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      @if (!service.hasEvents) {\n        <c8y-ui-empty-state\n          icon=\"c8y-location\"\n          [title]=\"'No tracking events found.' | translate\"\n          [subtitle]=\"'Select another time range.' | translate\"\n          [horizontal]=\"true\"\n        ></c8y-ui-empty-state>\n      }\n    </ng-template>\n\n    @if (loadMoreComponent?.hasMore) {\n      <div>\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\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 } from '@c8y/ngx-components/gettext';\nimport { 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","i1"],"mappings":"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"}