{"version":3,"file":"integrations-cloudoffis-analytics-tracker.mjs","sources":["../../../src/lib/analytics-config.ts","../../../src/lib/analytics-tracker.service.ts","../../../src/lib/track-click.directive.ts","../../../src/lib/analytics-tracker.module.ts","../../../src/lib/analytics-tracker.component.ts","../../../src/integrations-cloudoffis-analytics-tracker.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\nexport interface AnalyticsConfig {\r\n  apiKey: string;\r\n  apiUrl: string;\r\n}\r\n\r\nexport const ANLYTCS_CFG = new InjectionToken<AnalyticsConfig>('AnalyticsConfig');","import { Injectable, Inject } from '@angular/core';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { ANLYTCS_CFG, AnalyticsConfig } from './analytics-config';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class AnalyticsTrackerService {\r\n\r\n  private apiKey: string;\r\n  private apiUrl: string;\r\n  private sessionId: string;\r\n  private tabId: string;\r\n  private windowId: string; // Unique ID for this window instance (not stored in storage)\r\n\r\n  constructor(\r\n    private http: HttpClient,\r\n    @Inject(ANLYTCS_CFG) private config: AnalyticsConfig\r\n  ) {\r\n    this.apiKey = config.apiKey;\r\n    this.apiUrl = config.apiUrl;\r\n    \r\n    // Generate a unique window ID that only exists in memory\r\n    this.windowId = `win-${Math.random().toString(36).substring(2, 15)}-${Date.now()}`;\r\n    \r\n    this.sessionId = this.getOrCreateSessionId();\r\n    this.tabId = this.generateUniqueTabId();\r\n  }\r\n\r\n\r\n  private generateUUID(): string {\r\n    // A simple non-crypto UUID for session IDs\r\n    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n      const r = (Math.random() * 16) | 0,\r\n        v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n      return v.toString(16);\r\n    });\r\n  }\r\n\r\n  private getOrCreateSessionId(): string {\r\n    // Use localStorage instead of sessionStorage so session is shared across all tabs\r\n    let id = localStorage.getItem('analytics_session_id');\r\n    if (!id) {\r\n      id = this.generateUUID();\r\n      localStorage.setItem('analytics_session_id', id);\r\n\r\n      localStorage.setItem('analytics_session_start', Date.now().toString());\r\n    }\r\n    return id;\r\n  }\r\n\r\n  private getUserId(): string {\r\n    // Reads the user ID set by the main app's login logic\r\n    return sessionStorage.getItem('analytics_user_id') || 'anonymous';\r\n  }\r\n\r\n  private getUserName(): string {\r\n    // Reads the user name set by the main app's login logic\r\n    return sessionStorage.getItem('analytics_user_name') || 'anonymous';\r\n  }\r\n\r\n  private getSessionDuration(): number {\r\n    // Calculate session duration in seconds\r\n    // Use localStorage since session is browser-wide\r\n    const sessionStart = localStorage.getItem('analytics_session_start');\r\n    if (sessionStart) {\r\n      return Math.floor((Date.now() - parseInt(sessionStart)) / 1000);\r\n    }\r\n    return 0;\r\n  }\r\n\r\n  private getJobId(): string {\r\n    // Reads the job ID set by the main app\r\n    return sessionStorage.getItem('analytics_job_id') || '';\r\n  }\r\n\r\n  private getJobName(): string {\r\n    // Reads the job name set by the main app\r\n    return sessionStorage.getItem('analytics_job_name') || '';\r\n  }\r\n\r\n  private getToken(): string {\r\n    // Reads the token set by the main app\r\n    return sessionStorage.getItem('analytics_token') || '';\r\n  }\r\n\r\n  private getFirmName(): string {\r\n    // Reads the firm name set by the main app\r\n    return sessionStorage.getItem('analytics_firm_name') || '';\r\n  }\r\n\r\n  private getISTTimestamp(): string {\r\n    // Get current time in IST (Indian Standard Time - UTC+5:30)\r\n    const now = new Date();\r\n    const utcTime = now.getTime();\r\n    const istOffset = 5.5 * 60 * 60 * 1000; // IST is UTC+5:30\r\n    const istTime = new Date(utcTime + istOffset);\r\n    \r\n    // Format: YYYY-MM-DDTHH:mm:ss.sss (without timezone offset)\r\n    return istTime.toISOString().replace('Z', '');\r\n  }\r\n  \r\n  private generateUniqueTabId(): string {\r\n    // Strategy: Check if the existing tab ID is already registered as \"active\" in localStorage\r\n    // If yes, it means another tab is using it, so this must be a duplicate tab\r\n    \r\n    const existingTabId = sessionStorage.getItem('analytics_tab_id');\r\n    const activeTabsRegistry = 'analytics_active_tab_registry';\r\n    \r\n    // Get the registry of active tabs from localStorage\r\n    let activeTabs: { [key: string]: number } = {};\r\n    try {\r\n      activeTabs = JSON.parse(localStorage.getItem(activeTabsRegistry) || '{}');\r\n    } catch (e) {\r\n      activeTabs = {};\r\n    }\r\n    \r\n    // Clean up old entries (older than 5 seconds - tabs that closed or crashed)\r\n    const fiveSecondsAgo = Date.now() - 5000;\r\n    Object.keys(activeTabs).forEach(tabId => {\r\n      if (activeTabs[tabId] < fiveSecondsAgo) {\r\n        delete activeTabs[tabId];\r\n      }\r\n    });\r\n    \r\n    // Check if we have an existing tab ID\r\n    if (existingTabId) {\r\n      // Is this tab ID currently active in another tab?\r\n      const isActiveElsewhere = activeTabs[existingTabId] && (Date.now() - activeTabs[existingTabId] < 2000);\r\n      \r\n      if (isActiveElsewhere) {\r\n        // This tab ID is active in another tab - this must be a duplicate\r\n        // Generate a new tab ID\r\n        const newTabId = this.createNewTabId();\r\n        sessionStorage.setItem('analytics_tab_id', newTabId);\r\n        sessionStorage.setItem('analytics_window_id', this.windowId);\r\n        \r\n        // Register this new tab ID as active\r\n        activeTabs[newTabId] = Date.now();\r\n        localStorage.setItem(activeTabsRegistry, JSON.stringify(activeTabs));\r\n        \r\n        // Start heartbeat to keep this tab registered as active\r\n        this.startTabHeartbeat(newTabId);\r\n        \r\n        return newTabId;\r\n      } else {\r\n        // This tab ID is not active elsewhere - normal page reload\r\n        // Keep the same tab ID and register it as active\r\n        sessionStorage.setItem('analytics_window_id', this.windowId);\r\n        activeTabs[existingTabId] = Date.now();\r\n        localStorage.setItem(activeTabsRegistry, JSON.stringify(activeTabs));\r\n        \r\n        // Start heartbeat\r\n        this.startTabHeartbeat(existingTabId);\r\n        \r\n        return existingTabId;\r\n      }\r\n    }\r\n    \r\n    // First time initialization - create new tab ID\r\n    const newTabId = this.createNewTabId();\r\n    sessionStorage.setItem('analytics_tab_id', newTabId);\r\n    sessionStorage.setItem('analytics_window_id', this.windowId);\r\n    \r\n    // Register as active\r\n    activeTabs[newTabId] = Date.now();\r\n    localStorage.setItem(activeTabsRegistry, JSON.stringify(activeTabs));\r\n    \r\n    // Start heartbeat\r\n    this.startTabHeartbeat(newTabId);\r\n    \r\n    return newTabId;\r\n  }\r\n  \r\n  private startTabHeartbeat(tabId: string): void {\r\n    // Update the tab's timestamp in localStorage every 1 second to mark it as active\r\n    setInterval(() => {\r\n      const activeTabsRegistry = 'analytics_active_tab_registry';\r\n      try {\r\n        const activeTabs = JSON.parse(localStorage.getItem(activeTabsRegistry) || '{}');\r\n        activeTabs[tabId] = Date.now();\r\n        localStorage.setItem(activeTabsRegistry, JSON.stringify(activeTabs));\r\n      } catch (e) {\r\n        // Ignore errors\r\n      }\r\n    }, 1000);\r\n  }\r\n  \r\n  private createNewTabId(): string {\r\n    const timestamp = Date.now();\r\n    const random = Math.random().toString(36).substring(2, 15);\r\n    const performanceId = performance.now().toString(36).substring(2, 8);\r\n    const microTimestamp = (performance.now() * 1000).toString(36).substring(2, 6);\r\n    \r\n    return `tab-${timestamp}-${random}-${performanceId}-${microTimestamp}`;\r\n  }\r\n\r\n  /**\r\n   * Get the current tab ID for debugging purposes\r\n   * @returns The unique tab ID for this tab\r\n   */\r\n  public getCurrentTabId(): string {\r\n    return this.tabId;\r\n  }\r\n\r\n  /**\r\n   * Get the current session ID for debugging purposes\r\n   * @returns The session ID\r\n   */\r\n  public getCurrentSessionId(): string {\r\n    return this.sessionId;\r\n  }\r\n\r\n  /**\r\n   * Set user information for analytics tracking\r\n   * @param userId The user ID\r\n   * @param userName The user name\r\n   * @param firmName The firm name\r\n   */\r\n  public setUserInfo(userId: string, userName: string, firmName: string = ''): void {\r\n    sessionStorage.setItem('analytics_user_id', userId);\r\n    sessionStorage.setItem('analytics_user_name', userName);\r\n    sessionStorage.setItem('analytics_firm_name', firmName);\r\n  \r\n  }\r\n\r\n  /**\r\n   * Set job information for analytics tracking\r\n   * @param jobId The job ID\r\n   * @param jobName The job name\r\n   */\r\n  public setJobInfo(jobId: string, jobName: string): void {\r\n    sessionStorage.setItem('analytics_job_id', jobId);\r\n    sessionStorage.setItem('analytics_job_name', jobName);\r\n  }\r\n\r\n  /**\r\n   * Set authentication token for analytics tracking\r\n   * @param token The authentication token\r\n   */\r\n  public setToken(token: string): void {\r\n    sessionStorage.setItem('analytics_token', token);\r\n  }\r\n\r\n  /**\r\n   * Set firm information for analytics tracking\r\n   * @param firmName The firm name\r\n   */\r\n  public setFirmName(firmName: string): void {\r\n    sessionStorage.setItem('analytics_firm_name', firmName);\r\n  }\r\n\r\n  /**\r\n   * Clear session and create a new one (call this on user logout)\r\n   * This will generate a new session ID and reset the session start time\r\n   * Session is shared across all tabs in the browser\r\n   */\r\n  public resetSession(): void {\r\n    // Clear existing session data from localStorage (browser-wide)\r\n    localStorage.removeItem('analytics_session_id');\r\n    localStorage.removeItem('analytics_session_start');\r\n    \r\n    // Generate new session ID and start time\r\n    this.sessionId = this.getOrCreateSessionId();\r\n  }\r\n\r\n  /**\r\n   * Clear all analytics data (call this on user logout)\r\n   * This clears session (browser-wide), user, job, firm, and token information\r\n   * Note: Session ID is cleared from localStorage (affects all tabs)\r\n   * Tab ID is cleared from sessionStorage (only affects current tab)\r\n   */\r\n  public clearAllAnalyticsData(): void {\r\n    // Clear session data from localStorage (browser-wide)\r\n    localStorage.removeItem('analytics_session_id');\r\n    localStorage.removeItem('analytics_session_start');\r\n    \r\n    // Clear tab-specific data from sessionStorage\r\n    sessionStorage.removeItem('analytics_tab_id');\r\n    sessionStorage.removeItem('analytics_window_id');\r\n    \r\n    // Clear user/job/firm data from sessionStorage\r\n    sessionStorage.removeItem('analytics_user_id');\r\n    sessionStorage.removeItem('analytics_user_name');\r\n    sessionStorage.removeItem('analytics_job_id');\r\n    sessionStorage.removeItem('analytics_job_name');\r\n    sessionStorage.removeItem('analytics_firm_name');\r\n    sessionStorage.removeItem('analytics_token');\r\n    \r\n    // Generate new session ID and tab ID\r\n    this.sessionId = this.getOrCreateSessionId();\r\n    this.tabId = this.generateUniqueTabId();\r\n  }\r\n\r\n  \r\n  private sendEvent(payload: object): void {\r\n    const finalPayload = {\r\n      ...payload,\r\n      sessionId: this.sessionId,\r\n      tabId: this.tabId,\r\n      userId: this.getUserId(),\r\n      userName: this.getUserName(),\r\n      duration: this.getSessionDuration(),\r\n      jobId: this.getJobId(),\r\n      jobName: this.getJobName(),\r\n      firmName: this.getFirmName(),\r\n      eventTimestamp: this.getISTTimestamp(),\r\n      dataSource: 'FRONTEND',\r\n      token: this.getToken()\r\n    };\r\n    \r\n    const headers = new HttpHeaders({\r\n      'Content-Type': 'application/json',\r\n      'X-API-KEY': this.apiKey\r\n    });\r\n\r\n \r\n    this.http.post(this.apiUrl, finalPayload, { headers })\r\n      .subscribe({\r\n        next: () => console.log('Analytics Event Sent:', finalPayload),\r\n        error: (err) => console.error('Error sending analytics event:', err)\r\n      });\r\n  }\r\n\r\n\r\n\r\n  public trackPageview(screenName: string, moduleName: string = 'Navigation'): void {\r\n    this.sendEvent({\r\n      Module: moduleName,\r\n      Action: 'ScreenView',\r\n      Screen: screenName,\r\n      type: 'Navigation'\r\n    });\r\n  }\r\n  \r\n  public trackFeatureClick(actionName: string, screenName: string, moduleName: string, extraData: object = {}): void {\r\n    this.sendEvent({\r\n      Module: moduleName,\r\n      Action: actionName,\r\n      Screen: screenName,\r\n      type: 'UserInteraction', \r\n      ...extraData\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Track a custom event with full control over the payload\r\n   * @param eventName The name of the event\r\n   * @param screenName The screen where the event occurred\r\n   * @param moduleName The module name\r\n   * @param extraData Additional data to include in the event\r\n   */\r\n  public trackCustomEvent(eventName: string, screenName: string, moduleName: string, extraData: object = {}): void {\r\n    this.sendEvent({\r\n      Module: moduleName,\r\n      Action: eventName,\r\n      Screen: screenName,\r\n      type: 'CustomEvent',\r\n      ...extraData\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Track a simple event with just the event name (for backward compatibility)\r\n   * @param eventName The name of the event\r\n   * @param extraData Additional data to include in the event\r\n   */\r\n  public trackSimpleEvent(eventName: string, extraData: object = {}): void {\r\n    this.sendEvent({\r\n      Module: 'Custom',\r\n      Action: eventName,\r\n      Screen: 'Unknown',\r\n      type: 'CustomEvent',\r\n      ...extraData\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Track a simple event with just the event name (public method for backward compatibility)\r\n   * @param eventName The name of the event\r\n   * @param extraData Additional data to include in the event\r\n   */\r\n  public trackEvent(eventName: string, extraData: object = {}): void {\r\n    this.sendEvent({\r\n      Module: 'Custom',\r\n      Action: eventName,\r\n      Screen: 'Unknown',\r\n      type: 'CustomEvent',\r\n      ...extraData\r\n    });\r\n  }\r\n}","import { Directive, HostListener, Input } from '@angular/core';\r\nimport { AnalyticsTrackerService } from './analytics-tracker.service';\r\n\r\n@Directive({\r\n  selector: '[trackClick]',\r\n  standalone: true \r\n})\r\nexport class TrackClickDirective {\r\n  @Input('trackClick') actionName!: string;\r\n  @Input() screenName!: string;\r\n  @Input() moduleName!: string;\r\n  @Input() trackData: object = {}; \r\n  @Input() type: string = 'UserInteraction';\r\n  @Input() jobId?: string;\r\n  @Input() jobName?: string;\r\n  @Input() firmName?: string;\r\n  @Input() debugMode: boolean = false;\r\n\r\n  constructor(private analyticsService: AnalyticsTrackerService) {}\r\n\r\n  @HostListener('click')\r\n  onClick() {\r\n    if (this.actionName && this.screenName && this.moduleName) {\r\n      if (this.debugMode) {\r\n        console.log('TrackClick Directive Debug:', {\r\n          jobId: this.jobId,\r\n          jobName: this.jobName,\r\n          firmName: this.firmName,\r\n          type: this.type,\r\n          jobIdType: typeof this.jobId,\r\n          jobNameType: typeof this.jobName,\r\n          firmNameType: typeof this.firmName\r\n        });\r\n      }\r\n\r\n      // Temporarily store job and firm info if provided\r\n      if (this.jobId !== undefined && this.jobId !== null) {\r\n        sessionStorage.setItem('analytics_job_id', this.jobId);\r\n        if (this.debugMode) console.log('Set jobId:', this.jobId);\r\n      }\r\n      if (this.jobName !== undefined && this.jobName !== null) {\r\n        sessionStorage.setItem('analytics_job_name', this.jobName);\r\n        if (this.debugMode) console.log('Set jobName:', this.jobName);\r\n      }\r\n      if (this.firmName !== undefined && this.firmName !== null) {\r\n        sessionStorage.setItem('analytics_firm_name', this.firmName);\r\n        if (this.debugMode) console.log('Set firmName:', this.firmName);\r\n      }\r\n\r\n      // Merge type with trackData\r\n      const eventData = {\r\n        type: this.type,\r\n        ...this.trackData\r\n      };\r\n\r\n      this.analyticsService.trackFeatureClick(\r\n        this.actionName,\r\n        this.screenName,\r\n        this.moduleName,\r\n        eventData\r\n      );\r\n    } else {\r\n      console.warn('trackClick directive is missing required fields (trackClick, screenName, moduleName)');\r\n    }\r\n  }\r\n}","import { NgModule, ModuleWithProviders } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { HttpClientModule } from '@angular/common/http';\r\nimport { TrackClickDirective } from './track-click.directive';\r\nimport { ANLYTCS_CFG, AnalyticsConfig } from './analytics-config';\r\nimport { AnalyticsTrackerService } from './analytics-tracker.service';\r\n\r\n@NgModule({\r\n  imports: [ \r\n    CommonModule, \r\n    HttpClientModule,\r\n    TrackClickDirective  // Import standalone directive\r\n  ],\r\n  declarations: [],\r\n  exports: [\r\n    TrackClickDirective  // Export so it's available when module is imported\r\n  ] \r\n})\r\nexport class AnalyticsTrackerModule {\r\n  public static forRoot(config: AnalyticsConfig): ModuleWithProviders<AnalyticsTrackerModule> {\r\n    return {\r\n      ngModule: AnalyticsTrackerModule,\r\n      providers: [\r\n        AnalyticsTrackerService, // Provide the service\r\n        { provide: ANLYTCS_CFG, useValue: config } // Provide the configuration\r\n      ]\r\n    };\r\n  }\r\n}","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n  selector: 'lib-analytics-tracker',\r\n  imports: [],\r\n  template: `\r\n    <p>\r\n      analytics-tracker works!\r\n    </p>\r\n  `,\r\n  styles: ``\r\n})\r\nexport class AnalyticsTrackerComponent {\r\n\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.AnalyticsTrackerService"],"mappings":"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"}