{"version":3,"file":"kitea-galen-portal.mjs","sources":["../../../projects/kitea-galen-portal/src/lib/kitea-galen-portal.service.ts","../../../projects/kitea-galen-portal/src/lib/models/base-entity.ts","../../../projects/kitea-galen-portal/src/lib/models/data-collection.ts","../../../projects/kitea-galen-portal/src/lib/models/symptom.ts","../../../projects/kitea-galen-portal/src/lib/services/galen-http/galen-http.service.ts","../../../projects/kitea-galen-portal/src/lib/enums/role-type.ts","../../../projects/kitea-galen-portal/src/lib/utils/http-response.ts","../../../projects/kitea-galen-portal/src/lib/models/activity-log.ts","../../../projects/kitea-galen-portal/src/lib/utils/array-utils.ts","../../../projects/kitea-galen-portal/src/lib/utils/string-formatter.ts","../../../projects/kitea-galen-portal/src/lib/utils/table-utils.ts","../../../projects/kitea-galen-portal/src/lib/models/patient-info.ts","../../../projects/kitea-galen-portal/src/lib/models/galen-user.ts","../../../projects/kitea-galen-portal/src/lib/enums/data-model-type.ts","../../../projects/kitea-galen-portal/src/lib/models/icp-record.ts","../../../projects/kitea-galen-portal/src/lib/models/surgery-details.ts","../../../projects/kitea-galen-portal/src/lib/services/galen-data/galen-data.service.ts","../../../projects/kitea-galen-portal/src/lib/enums/chart-type.ts","../../../projects/kitea-galen-portal/src/lib/constants.ts","../../../projects/kitea-galen-portal/src/lib/utils/csv-file-helpers.ts","../../../projects/kitea-galen-portal/src/lib/services/polynomial-regression/polynomial-regression.service.ts","../../../projects/kitea-galen-portal/src/lib/styles.ts","../../../projects/kitea-galen-portal/src/lib/utils/trendline-utility-service.ts","../../../projects/kitea-galen-portal/src/lib/utils/error-handler.ts","../../../projects/kitea-galen-portal/src/lib/utils/zoom-data.ts","../../../projects/kitea-galen-portal/src/lib/utils/input-changes.ts","../../../projects/kitea-galen-portal/src/lib/interfaces/http-error.ts","../../../projects/kitea-galen-portal/src/lib/components/icp-trend-chart/icp-trend-chart.component.ts","../../../projects/kitea-galen-portal/src/lib/components/icp-trend-chart/icp-trend-chart.component.html","../../../projects/kitea-galen-portal/src/lib/components/generic-chart/generic-chart.component.ts","../../../projects/kitea-galen-portal/src/lib/components/generic-chart/generic-chart.component.html","../../../projects/kitea-galen-portal/src/lib/components/symptoms-bubble-chart/symptoms-bubble-chart.component.ts","../../../projects/kitea-galen-portal/src/lib/components/symptoms-bubble-chart/symptoms-bubble-chart.component.html","../../../projects/kitea-galen-portal/src/lib/components/blood-pressure-line-chart/blood-pressure-line-chart.component.ts","../../../projects/kitea-galen-portal/src/lib/components/blood-pressure-line-chart/blood-pressure-line-chart.component.html","../../../projects/kitea-galen-portal/src/lib/components/body-temperature-line-chart/body-temperature-line-chart.component.ts","../../../projects/kitea-galen-portal/src/lib/components/body-temperature-line-chart/body-temperature-line-chart.component.html","../../../projects/kitea-galen-portal/src/lib/components/feeling-rating-line-chart/feeling-rating-line-chart.component.ts","../../../projects/kitea-galen-portal/src/lib/components/feeling-rating-line-chart/feeling-rating-line-chart.component.html","../../../projects/kitea-galen-portal/src/lib/components/patient-position-chart/patient-position-chart.component.ts","../../../projects/kitea-galen-portal/src/lib/components/patient-position-chart/patient-position-chart.component.html","../../../projects/kitea-galen-portal/src/lib/kitea-galen-portal.component.ts","../../../projects/kitea-galen-portal/src/lib/kitea-galen-portal.component.html","../../../projects/kitea-galen-portal/src/lib/components/activity-tracker-table/activity-tracker-table.component.ts","../../../projects/kitea-galen-portal/src/lib/components/activity-tracker-table/activity-tracker-table.component.html","../../../projects/kitea-galen-portal/src/lib/kitea-galen-portal.module.ts","../../../projects/kitea-galen-portal/src/public-api.ts","../../../projects/kitea-galen-portal/src/kitea-galen-portal.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class KiteaGalenPortalService {\r\n\r\n  constructor() { }\r\n}\r\n","export class BaseEntity {\r\n  deviceDataId?: string;\r\n  ownerId?: string;\r\n  minValueProvidedOn?: string;\r\n  maxValueProvidedOn?: string;\r\n\r\n  constructor(\r\n    deviceDataId?: string,\r\n    ownerId?: string,\r\n    minValueProvidedOn?: string,\r\n    maxValueProvidedOn?: string\r\n  ) {\r\n    this.deviceDataId = deviceDataId\r\n    this.ownerId = ownerId\r\n    this.minValueProvidedOn = minValueProvidedOn\r\n    this.maxValueProvidedOn = maxValueProvidedOn\r\n  }\r\n}\r\n","import { BaseEntity } from \"./base-entity\";\r\n\r\nexport type patientPositionType = 'Lying down' | 'Sitting down' | 'Standing up'\r\n\r\nexport function isPatientPositionType(value: any): value is patientPositionType {\r\n    return value === 'Lying down' || value === 'Sitting down' || value === 'Standing up';\r\n}\r\n\r\n// Represents the data collection record that is stored in the Galen Cloud\r\nexport class DataCollection extends BaseEntity {\r\n  // The time this data collection was recorded, in milliseconds since midnight, January 1, 1970 UTC.\r\n  timestamp?: Date;\r\n\r\n  // The ICP value in mmHg\r\n  meanIcpMmhg?: number;\r\n\r\n  bloodPressureMmhg?: string;\r\n\r\n  bodyTemperatureCelsius?: number;\r\n\r\n  userFeeling?: string;\r\n\r\n  constructor(\r\n    deviceDataId: string,\r\n    timestamp?: Date,\r\n    meanIcpMmhg?: number,\r\n    bloodPressureMmhg?: string,\r\n    bodyTemperatureCelsius?: number,\r\n    userFeeling?: string,\r\n    public patientPosition?: patientPositionType\r\n  ) {\r\n    super(deviceDataId)\r\n\r\n    this.timestamp = timestamp;\r\n    this.meanIcpMmhg = meanIcpMmhg;\r\n    this.bloodPressureMmhg = bloodPressureMmhg;\r\n    this.bodyTemperatureCelsius = bodyTemperatureCelsius;\r\n    this.userFeeling = userFeeling;\r\n  }\r\n\r\n  /**\r\n   * Returns the properties of this instance stored in an array.\r\n   *\r\n   * The indices of the array contain:\r\n   *    * 0: time\r\n   *    * 1: icpValue\r\n   */\r\n  createTimeIcpPair(): any[] {\r\n    let arr: any[] = [this.timestamp, this.meanIcpMmhg];\r\n    return arr;\r\n  }\r\n\r\n  createTimeSystolicPair(): any[] {\r\n    let arr: any[] = [];\r\n    if (this.bloodPressureMmhg && this.bloodPressureMmhg.includes('/'))\r\n      arr = [this.timestamp, +this.bloodPressureMmhg.split('/')[0]];\r\n    else arr = [this.timestamp, null];\r\n    return arr;\r\n  }\r\n\r\n  createTimeDiastolicPair(): any[] {\r\n    let arr: any[] = [];\r\n    if (this.bloodPressureMmhg && this.bloodPressureMmhg.includes('/'))\r\n      arr = [this.timestamp, +this.bloodPressureMmhg.split('/')[1]];\r\n    else arr = [this.timestamp, null];\r\n    return arr;\r\n  }\r\n\r\n  createTimeFeelingPair(): any[] {\r\n    let arr: any[] = [];\r\n    if (this.userFeeling) arr = [this.timestamp, this.userFeeling];\r\n    else arr = [this.timestamp, null];\r\n    return arr;\r\n  }\r\n\r\n  createTimeBodyTemperaturePair(): any[] {\r\n    let arr: any[] = [];\r\n    if (this.bodyTemperatureCelsius)\r\n      arr = [this.timestamp, this.bodyTemperatureCelsius];\r\n    else arr = [this.timestamp, null];\r\n    return arr;\r\n  }\r\n\r\n  createPositionPair(): any[] {\r\n    let arr: any[] = [];\r\n    if (this.patientPosition)\r\n      arr = [this.timestamp, this.patientPosition];\r\n    else arr = [this.timestamp, null];\r\n    return arr;\r\n  }\r\n}\r\n","// Represents the Symptom data that is stored in the Galen Cloud\r\nexport class Symptom {\r\n  dataCollectionId: string;\r\n\r\n  // The timestamp for when this symptom was recorded\r\n  timestamp?: Date;\r\n\r\n  // Symptom type\r\n  symptom?: string;\r\n\r\n  // The severity of a symptom\r\n  severity?: number;\r\n\r\n  constructor(\r\n    dataCollectionId: string,\r\n    timestamp?: Date,\r\n    symptom?: string,\r\n    severity?: number\r\n  ) {\r\n    this.dataCollectionId = dataCollectionId;\r\n    this.timestamp = timestamp;\r\n    this.symptom = symptom;\r\n    this.severity = severity;\r\n  }\r\n\r\n  /**\r\n   * Returns the properties of this instance stored in an array.\r\n   *\r\n   * The indices of the array contain:\r\n   *    * 0: time\r\n   *    * 1: symptom\r\n   *    * 2: severity\r\n   */\r\n  convertToArray(): any[] {\r\n    let arr: any[] = [this.timestamp, this.symptom, this.severity];\r\n    return arr;\r\n  }\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\r\n\r\nconst API = `https://api.galencloud.com`;\r\n\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class GalenHttpService {\r\n  http: HttpClient = inject(HttpClient);\r\n\r\n  constructor() {}\r\n\r\n  private createQueryParams(params: Map<string, string>) {\r\n    let uri = '';\r\n    let flag = true;\r\n\r\n    if (params.size > 0) {\r\n      uri = '?';\r\n      params.forEach((value, key) => {\r\n        if (flag) {\r\n          uri += `${key}=${value}`;\r\n          flag = false;\r\n        } else {\r\n          uri += `&${key}=${value}`;\r\n        }\r\n      });\r\n    }\r\n\r\n    return uri;\r\n  }\r\n\r\n  getDeviceData(\r\n    deviceDataModelId: string,\r\n    rangeStartDateTime?: Date,\r\n    rangeEndDateTime?: Date,\r\n    pageNumber?: number,\r\n    pageSize?: number,\r\n    sortBy?: string,\r\n    sortOrder?: 'ASC' | 'DESC'\r\n  ) {\r\n    let pMap = new Map<string, any>();\r\n    pMap.set(`deviceDataModelId`, deviceDataModelId);\r\n\r\n    if (rangeStartDateTime)\r\n      pMap.set(\r\n        `rangeStartDateTime`,\r\n        this.handleDateTimeQueryParam(rangeStartDateTime)\r\n      );\r\n    if (rangeEndDateTime)\r\n      pMap.set(\r\n        `rangeEndDateTime`,\r\n        this.handleDateTimeQueryParam(rangeEndDateTime)\r\n      );\r\n    if (pageNumber) pMap.set(`pageNumber`, pageNumber);\r\n    if (pageSize) pMap.set(`pageSize`, pageSize);\r\n    if (sortBy) pMap.set(`sortBy`, sortBy);\r\n    if (sortOrder) pMap.set(`sortOrder`, sortOrder);\r\n\r\n    let params = this.createQueryParams(pMap);\r\n\r\n    return this.http.get(`${API}/data/devicedata${params}`, {\r\n      headers: new HttpHeaders({\r\n        'Content-Type': 'application/json',\r\n      }),\r\n      observe: 'response',\r\n    });\r\n  }\r\n\r\n  getDeviceDataAdvanced(\r\n    deviceDataModelId: string,\r\n    ownerId: string,\r\n    startTimestamp?: {\r\n      timestampProperty: string;\r\n      datetime: Date | undefined;\r\n    },\r\n    endTimestamp?: {\r\n      timestampProperty: string;\r\n      datetime: Date | undefined;\r\n    },\r\n    rangeStartDateTime?: Date,\r\n    rangeEndDateTime?: Date,\r\n    pageNumber?: number,\r\n    pageSize?: number,\r\n    sortBy?: string,\r\n    sortOrder?: 'ASC' | 'DESC',\r\n    deviceCriteria: Object[] = []\r\n  ) {\r\n    let body = {\r\n      deviceDataModelId: deviceDataModelId,\r\n    };\r\n    let params = new Map<string, any>();\r\n\r\n    if (rangeStartDateTime)\r\n      Object.assign(body, {\r\n        rangeStartDateTime: this.handleDateTimeQueryParam(rangeStartDateTime),\r\n      });\r\n    if (rangeEndDateTime)\r\n      Object.assign(body, {\r\n        rangeEndDateTime: this.handleDateTimeQueryParam(rangeEndDateTime),\r\n      });\r\n    if (pageNumber != null) params.set('pageNumber', pageNumber);\r\n    if (pageSize != null) params.set('pageSize', pageSize);\r\n    if (sortBy != null) params.set('sortBy', sortBy);\r\n    if (sortOrder) params.set('sortOrder', sortOrder);\r\n\r\n    if (startTimestamp && startTimestamp.datetime) {\r\n      deviceCriteria.push({\r\n        key: startTimestamp.timestampProperty,\r\n        operator: 'GreaterThanOrEqual',\r\n        value: this.handleDateTimeQueryParam(startTimestamp.datetime),\r\n      });\r\n    }\r\n    if (endTimestamp && endTimestamp.datetime) {\r\n      deviceCriteria.push({\r\n        key: endTimestamp.timestampProperty,\r\n        operator: 'LessThanOrEqual',\r\n        value: this.handleDateTimeQueryParam(endTimestamp.datetime),\r\n      });\r\n    }\r\n\r\n    if (deviceCriteria.length > 0)\r\n      Object.assign(body, {\r\n        deviceCriteria: deviceCriteria,\r\n      });\r\n\r\n    if (ownerId && ownerId.length > 0) {\r\n      Object.assign(body, {\r\n        ownerFilter: {\r\n          users: [ownerId],\r\n        },\r\n      });\r\n    }\r\n\r\n    return this.http.post(\r\n      `${API}/data/devicedata-advanced${this.createQueryParams(params)}`,\r\n      body,\r\n      {\r\n        observe: 'response',\r\n      }\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Makes a post request to /data/devicedata/aggregate-advanced\r\n   * @param deviceDataModelId \r\n   * @param ownerId \r\n   * @param startTimestamp \r\n   * @param endTimestamp \r\n   * @param rangeStartDateTime \r\n   * @param rangeEndDateTime \r\n   * @param pageNumber \r\n   * @param pageSize \r\n   * @param sortBy \r\n   * @param sortOrder \r\n   * @param deviceCriteriaGroup \r\n   * @param aggregationPropertyOptions \r\n   * @param groupingPropertyOptions \r\n   * @returns \r\n   */\r\n  getDeviceDataAggregate(\r\n    deviceDataModelId: string,\r\n    ownerId: string,\r\n    startTimestamp?: {\r\n      timestampProperty: string;\r\n      datetime: Date | undefined;\r\n    },\r\n    endTimestamp?: {\r\n      timestampProperty: string;\r\n      datetime: Date | undefined;\r\n    },\r\n    rangeStartDateTime?: Date,\r\n    rangeEndDateTime?: Date,\r\n    pageNumber?: number,\r\n    pageSize?: number,\r\n    sortBy?: string,\r\n    sortOrder?: 'ASC' | 'DESC',\r\n    deviceCriteriaGroup: Object = {},\r\n    aggregationPropertyOptions: {\r\n      propertyCode: string;\r\n      aggregationType:\r\n        | 'Average'\r\n        | 'Count'\r\n        | 'First'\r\n        | 'Last'\r\n        | 'Max'\r\n        | 'Median'\r\n        | 'Min'\r\n        | 'Sum';\r\n    }[] = [],\r\n    groupingPropertyOptions: {\r\n      propertyCode: string;\r\n      groupType?:\r\n        | 'Day'\r\n        | 'Hour'\r\n        | 'Millisecond'\r\n        | 'Minute'\r\n        | 'Month'\r\n        | 'Second'\r\n        | 'Week'\r\n        | 'Year';\r\n    }[] = []\r\n  ) {\r\n    let body = {\r\n      deviceDataModelId: deviceDataModelId,\r\n    };\r\n    let params = new Map<string, any>();\r\n\r\n    if (rangeStartDateTime)\r\n      Object.assign(body, {\r\n        rangeStartDateTime: this.handleDateTimeQueryParam(rangeStartDateTime),\r\n      });\r\n    if (rangeEndDateTime)\r\n      Object.assign(body, {\r\n        rangeEndDateTime: this.handleDateTimeQueryParam(rangeEndDateTime),\r\n      });\r\n    if (pageNumber != null) params.set('pageNumber', pageNumber);\r\n    if (pageSize != null) params.set('pageSize', pageSize);\r\n    if (sortBy != null) params.set('sortBy', sortBy);\r\n    if (sortOrder) params.set('sortOrder', sortOrder);\r\n\r\n    let groupElems: Object[] = [];\r\n    if (\r\n      (startTimestamp && startTimestamp.datetime) ||\r\n      (endTimestamp && endTimestamp.datetime)\r\n    ) {\r\n      if (Object.keys(deviceCriteriaGroup).includes('groupElements')) {\r\n        groupElems = deviceCriteriaGroup['groupElements'];\r\n      }\r\n\r\n      if (startTimestamp && startTimestamp.datetime) {\r\n        groupElems.push({\r\n          key: startTimestamp.timestampProperty,\r\n          operator: 'GreaterThanOrEqual',\r\n          value: this.handleDateTimeQueryParam(startTimestamp.datetime),\r\n        });\r\n      }\r\n      if (endTimestamp && endTimestamp.datetime) {\r\n        groupElems.push({\r\n          key: endTimestamp.timestampProperty,\r\n          operator: 'LessThanOrEqual',\r\n          value: this.handleDateTimeQueryParam(endTimestamp.datetime),\r\n        });\r\n      }\r\n\r\n      Object.assign(deviceCriteriaGroup, {\r\n        groupElements: groupElems,\r\n      });\r\n    }\r\n\r\n    if (Object.keys(deviceCriteriaGroup).length > 0)\r\n      Object.assign(body, {\r\n        deviceCriteriaGroup: deviceCriteriaGroup,\r\n      });\r\n\r\n    if (aggregationPropertyOptions.length > 0)\r\n      Object.assign(body, {\r\n        aggregationPropertyOptions: aggregationPropertyOptions,\r\n      });\r\n\r\n    if (groupingPropertyOptions.length > 0)\r\n      Object.assign(body, {\r\n        groupingPropertyOptions: groupingPropertyOptions,\r\n      });\r\n\r\n    if (ownerId && ownerId.length > 0) {\r\n      Object.assign(body, {\r\n        ownerFilter: {\r\n          users: [ownerId],\r\n        },\r\n      });\r\n    }\r\n\r\n    return this.http.post(\r\n      `${API}/data/devicedata/aggregate-advanced${this.createQueryParams(\r\n        params\r\n      )}`,\r\n      body,\r\n      {\r\n        observe: 'response',\r\n      }\r\n    );\r\n  }\r\n\r\n  getDeviceId() {\r\n    let deviceName = 'Kitea Health App';\r\n\r\n    let pMap = new Map<string, any>();\r\n    pMap.set(`nameLike`, deviceName);\r\n    pMap.set(`status`, 'Active');\r\n\r\n    let params = this.createQueryParams(pMap);\r\n\r\n    return this.http.get(`${API}/user/device${params}`, {\r\n      headers: new HttpHeaders({\r\n        'Content-Type': 'application/json',\r\n      }),\r\n      observe: 'response',\r\n    });\r\n  }\r\n\r\n  getDataModelIds(deviceId: string) {\r\n    let pMap = new Map<string, any>();\r\n    pMap.set(`deviceId`, deviceId);\r\n\r\n    let params = this.createQueryParams(pMap);\r\n    return this.http.get(`${API}/user/devicedatamodel${params}`, {\r\n      headers: new HttpHeaders({\r\n        'Content-Type': 'application/json',\r\n      }),\r\n      observe: 'response',\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Fetches the user information belonging to the given [patientId]\r\n   * @param patientId the userId of the patient (must be a patient account) you want to filter for\r\n   * @returns Observable<HttpResponse<Object>>\r\n   */\r\n  getGalenUserInfo(patientId: string) {\r\n    let pMap = new Map<string, any>();\r\n    if (patientId.length > 0) pMap.set('patientId', patientId);\r\n\r\n    let params = this.createQueryParams(pMap);\r\n    return this.http.get(`${API}/user/user/${patientId}`, {\r\n      headers: new HttpHeaders({\r\n        'Content-Type': 'application/json',\r\n      }),\r\n      observe: 'response',\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Fetches the user information belonging to the currently logged in user\r\n   * @returns Observable<HttpResponse<Object>>\r\n   */\r\n  getMyGalenUserInfo() {\r\n    return this.http.get(`${API}/user/me`, {\r\n      headers: new HttpHeaders({\r\n        'Content-Type': 'application/json',\r\n      }),\r\n      observe: 'response',\r\n    });\r\n  }\r\n\r\n  private handleDateTimeQueryParam(dateTime: Date) {\r\n    let dateTimeString = '';\r\n    let dateTimeSplit = dateTime.toISOString().split(':');\r\n    if (dateTimeSplit.length == 3) {\r\n      dateTimeSplit.pop();\r\n      dateTimeString = dateTimeSplit.join(':');\r\n    } else {\r\n      dateTimeString = `${dateTime.getFullYear()}-${dateTime.getMonth()}-${dateTime.getDate()}T${dateTime.getHours()}:${dateTime.getMinutes()}`;\r\n    }\r\n    return dateTimeString;\r\n  }\r\n}\r\n","export enum RoleType {\r\n  Guest = 'Guest',\r\n  Patient = 'Patient',\r\n  PracticeAdmin = 'PracticeAdmin',\r\n  PracticeUser = 'PracticeUser',\r\n  SupplierAdmin = 'SupplierAdmin',\r\n  SupplierUser = 'SupplierUser',\r\n  TenantAdmin = 'TenantAdmin',\r\n  TenantUser = 'TenantUser',\r\n}\r\n","import { RoleType } from '../enums/role-type';\r\nimport { Record, RecordData } from '../interfaces/record-data';\r\nimport { GalenUser } from '../models/galen-user';\r\n\r\nfunction parseRecord(\r\n  record: { data?: Object; deviceDataId?: string },\r\n  properties: string[]\r\n): RecordData {\r\n  let recordObj = new Map<string, Record>();\r\n\r\n  let deviceDataId = Object.keys(record).includes('deviceDataId')\r\n    ? record['deviceDataId']\r\n    : '';\r\n\r\n  if (Object.keys(record).includes('data')) {\r\n    let recordData: { [key: string]: any } = record['data']!!;\r\n\r\n    if (properties.length > 0) {\r\n      properties.forEach((value: string) => {\r\n        let valMeta = Object.keys(recordData).includes(value)\r\n          ? recordData[value]\r\n          : undefined;\r\n        if (valMeta) recordObj.set(value, valMeta);\r\n      });\r\n    } else {\r\n      let props = Object.keys(recordData);\r\n      props.forEach((prop: string) => {\r\n        recordObj.set(prop, recordData[prop]);\r\n      });\r\n    }\r\n  }\r\n\r\n  return {\r\n    deviceDataId: deviceDataId ? deviceDataId : '',\r\n    record: recordObj,\r\n  };\r\n}\r\n\r\n/**\r\n * Extracts the records and their given [properties] from the [responseBody]\r\n * @param responseBody the response body as returned from Galen\r\n * @param properties The list of properties whose values are to be extracted from the\r\n * records in the [responseBody]. If this is left empty, then all the properties belonging\r\n * to each records will be extracted\r\n * @returns The extracted records, where the data is stored in RecordData.Record. The keys\r\n * of RecordData.Record represent the record's properties as specified by [properties].\r\n */\r\nexport function getRecordsFromResponseBody(\r\n  responseBody: Object,\r\n  properties: string[]\r\n): RecordData[] {\r\n  let records: RecordData[] = [];\r\n\r\n  // Parsing the response body\r\n  let body = Object(responseBody);\r\n  if (Object.keys(body).includes('content')) {\r\n    let content = body['content'];\r\n\r\n    // Looping through each record\r\n    for (let i = 0; i < content.length; i++) {\r\n      let record = Object(content[i]);\r\n      let extractedRecord = parseRecord(record, properties);\r\n      records.push(extractedRecord);\r\n    }\r\n  }\r\n\r\n  return records;\r\n}\r\n\r\nexport function getCurrentRole(value: GalenUser) {\r\n  let currentRoleType: RoleType = RoleType.SupplierAdmin;\r\n\r\n  let currentRole = value.currentRole;\r\n  if (currentRole) {\r\n    let currentRoleString = String(currentRole['role' as keyof Object])\r\n      .toLowerCase()\r\n      .trim();\r\n    if (currentRoleString.startsWith('practiceuser'))\r\n      currentRoleType = RoleType.PracticeUser;\r\n    else if (currentRoleString.startsWith('practiceadmin'))\r\n      currentRoleType = RoleType.PracticeAdmin;\r\n    else if (currentRoleString.startsWith('tenantadmin'))\r\n      currentRoleType = RoleType.TenantAdmin;\r\n    else if (currentRoleString.startsWith('tenantuser'))\r\n      currentRoleType = RoleType.TenantUser;\r\n  }\r\n\r\n  return currentRoleType;\r\n}\r\n","import { BaseEntity } from './base-entity';\r\n\r\nexport class ActivityLog extends BaseEntity {\r\n  activity?: string;\r\n  qualityOfActivity?: string;\r\n  timeSpent?: number;\r\n  notes?: string;\r\n  startTimestamp?: Date;\r\n  activityImageUrl?: string;\r\n\r\n  constructor(\r\n    deviceDataId?: string,\r\n    activity?: string,\r\n    qualityOfActivity?: string,\r\n    timeSpent?: number,\r\n    notes?: string,\r\n    startTimestamp?: Date\r\n  ) {\r\n    super(deviceDataId);\r\n    this.activity = activity;\r\n    this.qualityOfActivity = qualityOfActivity;\r\n    this.timeSpent = timeSpent;\r\n    this.notes = notes;\r\n    this.startTimestamp = startTimestamp;\r\n\r\n    if (activity?.toLocaleLowerCase().startsWith('aerobics')) {\r\n      this.activityImageUrl = 'assets/patient_aerobics.jpg';\r\n    } else if (activity?.toLocaleLowerCase().startsWith('cycling')) {\r\n      this.activityImageUrl = 'assets/patient_cycling.jpg';\r\n    } else if (activity?.toLocaleLowerCase().startsWith('running')) {\r\n      this.activityImageUrl = 'assets/patient_running.jpg';\r\n    } else if (activity?.toLocaleLowerCase().startsWith('swimming')) {\r\n      this.activityImageUrl = 'assets/patient_swimming.jpg';\r\n    } else if (activity?.toLocaleLowerCase().startsWith('walking')) {\r\n      this.activityImageUrl = 'assets/patient_walking.jpg';\r\n    } else if (activity?.toLocaleLowerCase().startsWith('weight')) {\r\n      this.activityImageUrl = 'assets/patient_weight_lifting.jpg';\r\n    } else {\r\n      this.activityImageUrl = 'assets/patient_other_activity.jpg';\r\n    }\r\n  }\r\n}\r\n","/**\r\n * Returns a copy of the given `arrayOfObjects` with all null values that satisfy `valueChecker` removed\r\n * @param arrayOfObjects The array to remove null elements from\r\n * @param valueChecker A function that is used to access a specific sub-element within `arrayOfObjects`.\r\n * If the sub-element is `null`, then that entry will be removed from the array.\r\n * @returns any[]\r\n */\r\nexport function removeNullElements(\r\n  arrayOfObjects: any[],\r\n  valueChecker: (i: number) => any[]\r\n) {\r\n  let arrayCopy = [...arrayOfObjects]; // Creating a deep copy of the given array\r\n  let indicesToPop = []; // Storing the indices that need to be removed\r\n  for (let i = 0; i < arrayCopy.length; i++) {\r\n    let valsToCheck = valueChecker(i);\r\n    for (let j = 0; j < valsToCheck.length; j++) {\r\n      let elem = valsToCheck[j];\r\n      if (!elem) {\r\n        indicesToPop.push(i);\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  indicesToPop.reverse();\r\n  indicesToPop.forEach((ind) => {\r\n    arrayCopy.splice(ind, 1);\r\n  });\r\n  return arrayCopy;\r\n}\r\n\r\nexport function removeElement(array: any[], element: any) {\r\n  let indToRemove = -1;\r\n  for (let i = 0; i < array.length; i++) {\r\n    const elem = array[i];\r\n    if (elem === element) {\r\n      array.splice(i, 1);\r\n      indToRemove = i;\r\n      break;\r\n    }\r\n  }\r\n  return indToRemove;\r\n}\r\n","// SEE: https://www.30secondsofcode.org/js/s/iso-format-date-with-timezone/\r\n\r\n// Pad a number to 2 digits\r\nexport const pad = (n: number, padding: number = 2) =>\r\n  `${Math.floor(Math.abs(n))}`.padStart(padding, '0');\r\n\r\n// Get timezone offset in ISO format (+hh:mm or -hh:mm)\r\nconst getTimezoneOffset = (date: Date) => {\r\n  const tzOffset = -date.getTimezoneOffset();\r\n  const diff = tzOffset >= 0 ? '+' : '-';\r\n  return diff + pad(tzOffset / 60) + ':' + pad(tzOffset % 60);\r\n};\r\n\r\nexport const toISOStringWithTimezone = (date: Date) => {\r\n  return (\r\n    date.getFullYear() +\r\n    '-' +\r\n    pad(date.getMonth() + 1) +\r\n    '-' +\r\n    pad(date.getDate()) +\r\n    'T' +\r\n    pad(date.getHours()) +\r\n    ':' +\r\n    pad(date.getMinutes()) +\r\n    ':' +\r\n    pad(date.getSeconds()) +\r\n    '.' +\r\n    pad(date.getMilliseconds(), 3) +\r\n    getTimezoneOffset(date)\r\n  );\r\n};\r\n\r\nexport const toUsDateString = (date: Date, utc: boolean = true) => {\r\n  let opts: any = {\r\n    year: 'numeric',\r\n    month: 'short',\r\n    day: 'numeric',\r\n  };\r\n  if (utc == true)\r\n    Object.assign(opts, {\r\n      timeZone: 'UTC',\r\n    });\r\n  return date.toLocaleString('en-us', opts);\r\n};\r\n\r\nexport const symptomHeaderFormat = (symptom: string) => {\r\n  symptom = symptom.toLowerCase().trim();\r\n\r\n  if (symptom == 'fatigue/lethargy') symptom = 'fatigue/Lethargy';\r\n\r\n  let newSymptom = '';\r\n  for (let i = 0; i < symptom.length; i++) {\r\n    let char = symptom[i];\r\n    if (i == 0) char = char.toUpperCase();\r\n    newSymptom += char;\r\n  }\r\n\r\n  return newSymptom.length > 0 ? `${newSymptom} Severity` : '';\r\n};\r\n","import { pad } from './string-formatter';\r\n\r\n/**\r\n * Sorts and returns all of the columns in [tableColumns] based off the sorted-ordering of the\r\n * anchor column [colNameToSort]\r\n * @param tableColumns A map of column names to their corresponding column\r\n * @param colNameToSort The name of the column to sort whose new ordering will be the anchor for the\r\n * other columns in [tableColumns] to match\r\n * @returns the sorted version of [tableColumns]\r\n */\r\nexport function sortTableColumns(\r\n  tableColumns: Map<string, string[]>,\r\n  colNameToSort: string\r\n) {\r\n  // Setting up the variables. The reason [sortMap] has an array of maps as its values is to account\r\n  // for rows that may have duplicate [sortHeader] values (e.g., multiple rows may have the value\r\n  // \"1\" for their [sortHeader] column)\r\n  let sortMap: Map<string, Array<Map<string, string>>> = new Map();\r\n  let sortCol = tableColumns.get(colNameToSort);\r\n\r\n  if (sortCol) {\r\n    sortCol.forEach((sortVal, ind) => {\r\n      // Setting the current row as a map. Keys = headerName, value = corresponding header's row value\r\n      let correspondingRow: Map<string, string> = new Map();\r\n      tableColumns.forEach((col, header) => {\r\n        if (header != colNameToSort) correspondingRow.set(header, col[ind]);\r\n      });\r\n\r\n      // Storing each row into its corresponding bucket inside of [sortMap]\r\n      if (!sortMap.has(sortVal)) sortMap.set(sortVal, []);\r\n      let sortedRecs = sortMap.get(sortVal);\r\n      if (sortedRecs) {\r\n        sortedRecs.push(correspondingRow);\r\n        sortMap.set(sortVal, sortedRecs);\r\n      }\r\n    });\r\n\r\n    // Sorting the [sortHeader] column\r\n    sortCol.sort((a, b) => {\r\n      let ats = new Date(a).getTime();\r\n      let bts = new Date(b).getTime();\r\n\r\n      if (!ats) return 1;\r\n      if (!bts) return -1;\r\n\r\n      if (ats > bts) return 1;\r\n      else if (ats == bts) return 0;\r\n      else return -1;\r\n    });\r\n\r\n    tableColumns.set(colNameToSort, sortCol);\r\n    sortCol.forEach((sortVal, ind) => {\r\n      let corrRecs = sortMap.get(sortVal);\r\n\r\n      if (corrRecs) {\r\n        let rec = corrRecs.pop();\r\n\r\n        if (rec)\r\n          rec.forEach((recVal, header) => {\r\n            let col = tableColumns.get(header);\r\n\r\n            if (col) {\r\n              if (col.length > ind) col[ind] = recVal;\r\n              else col.push(recVal);\r\n              tableColumns.set(header, col);\r\n            }\r\n          });\r\n\r\n        sortMap.set(sortVal, corrRecs);\r\n      }\r\n    });\r\n  }\r\n\r\n  return tableColumns;\r\n}\r\n\r\n/**\r\n * Splits the given table into separate tables by month\r\n * @param tableColumns The table to split\r\n * @param dateTimeColumnName The column containing the date-time string to split the table with\r\n * @returns A map:\r\n *  - key: the US-EN formatted month and year of the separate table\r\n *  - value: The table for each corresponding month\r\n */\r\nexport function splitTableColumnsByMonth(\r\n  tableColumns: Map<string, string[]>,\r\n  dateTimeColumnName: string\r\n): Map<string, Map<string, string[]>> {\r\n  // Stores the final set of tables\r\n  let splitTables: Map<string, Map<string, string[]>> = new Map();\r\n\r\n  // Fetching the date-time column\r\n  let dateTimeCol = tableColumns.get(dateTimeColumnName);\r\n  if (dateTimeCol) {\r\n    // Iterating over the rows in the date time column\r\n    for (let ind = 0; ind < dateTimeCol.length; ind++) {\r\n      const dateTimeStr = dateTimeCol[ind];\r\n\r\n      // Parsing each date-time row into a Date object\r\n      let date: Date;\r\n      if (!isNaN(Date.parse(dateTimeStr))) date = new Date(dateTimeStr);\r\n      else continue;\r\n\r\n      // Parsing the US-EN month and year of this row's date\r\n      let month = pad(date.getMonth() + 1);\r\n      let year = date.getFullYear();\r\n      let tableName = `${year}-${month}`;\r\n\r\n      // Creating a new table for this month-year if itr doesn't already exist\r\n      if (!splitTables.has(tableName)) {\r\n        let newTable: Map<string, string[]> = new Map();\r\n        tableColumns.forEach((_col, colName) => {\r\n          newTable.set(colName, []);\r\n        });\r\n        splitTables.set(tableName, newTable);\r\n      }\r\n\r\n      // Extracting the corresponding row values of the other columns in [tableColumn] and\r\n      // accordingly storing them in [targetTable]\r\n      let targetTable = splitTables.get(tableName);\r\n      if (targetTable)\r\n        targetTable.forEach((col, colName) => {\r\n          let tCol = tableColumns.get(colName);\r\n          if (tCol) {\r\n            let value = tCol[ind];\r\n            col.push(value);\r\n          }\r\n        });\r\n    }\r\n  } else {\r\n    console.error(`${dateTimeColumnName} not found in [tableColumns]`);\r\n  }\r\n\r\n  return splitTables;\r\n}\r\n","import { BaseEntity } from './base-entity';\r\n\r\nexport class PatientInfo extends BaseEntity {\r\n  nhiNumber?: string;\r\n  shuntBrand?: string;\r\n  shuntType?: string;\r\n  hydrocephalusType?: string;\r\n  shuntLocation?: string;\r\n  gpName?: string;\r\n  clinicName?: string;\r\n\r\n  constructor(\r\n    deviceDataId: string,\r\n    nhiNumber?: string,\r\n    shuntBrand?: string,\r\n    shuntType?: string,\r\n    hydrocephalusType?: string,\r\n    shuntLocation?: string,\r\n    gpName?: string,\r\n    clinicName?: string\r\n  ) {\r\n    super(deviceDataId);\r\n    this.nhiNumber = nhiNumber;\r\n    this.shuntBrand = shuntBrand;\r\n    this.shuntType = shuntType;\r\n    this.hydrocephalusType = hydrocephalusType;\r\n    this.shuntLocation = shuntLocation\r\n    this.gpName = gpName\r\n    this.clinicName = clinicName\r\n  }\r\n}\r\n","export class GalenUser {\r\n  constructor(\r\n    public userId?: string,\r\n    public firstName?: string,\r\n    public middleName?: string,\r\n    public lastName?: string,\r\n    public emailAddress?: string,\r\n    public dateOfBirth?: Date,\r\n    public gender?: string,\r\n    public contactInfo?: Object,\r\n    public currentRole?: Object,\r\n    public fullName?: string\r\n  ) {}\r\n}\r\n","export enum DataModelType {\r\n  ActivityLog = 'activity log',\r\n  DataCollection = 'data collection',\r\n  IcpRecord = 'icp record',\r\n  HousekeepingRecord = 'housekeeping record',\r\n  Symptom = 'symptom',\r\n  SurgeryDetails = 'surgery details',\r\n  PatientInformation = 'patient information',\r\n  Implant = \"Implant\",\r\n  Wand = \"Wand\"\r\n}\r\n\r\nexport let toDataModelType = (dataModel: string): DataModelType | undefined => {\r\n  let returnValue: DataModelType | undefined = undefined;\r\n  let dataModelPrime = dataModel.trim().toLowerCase();\r\n  if (dataModelPrime.includes(' ')) {\r\n    let dataModelPrimeSplit = dataModelPrime.split(' ');\r\n    if (dataModelPrimeSplit.length == 2) {\r\n      if (\r\n        dataModelPrimeSplit[0] == 'activity' &&\r\n        dataModelPrimeSplit[1] == 'log'\r\n      )\r\n        returnValue = DataModelType.ActivityLog;\r\n      else if (\r\n        dataModelPrimeSplit[0] == 'data' &&\r\n        dataModelPrimeSplit[1] == 'collection'\r\n      )\r\n        returnValue = DataModelType.DataCollection;\r\n      else if (\r\n        dataModelPrimeSplit[0] == 'icp' &&\r\n        dataModelPrimeSplit[1] == 'record'\r\n      )\r\n        returnValue = DataModelType.IcpRecord;\r\n      else if (\r\n        dataModelPrimeSplit[0] == 'patient' &&\r\n        dataModelPrimeSplit[1] == 'information'\r\n      )\r\n        returnValue = DataModelType.PatientInformation;\r\n      else if (\r\n        dataModelPrimeSplit[0] == 'housekeeping' &&\r\n        dataModelPrimeSplit[1] == 'record'\r\n      )\r\n        returnValue = DataModelType.HousekeepingRecord;\r\n      else if (\r\n        dataModelPrimeSplit[0] == 'surgery' &&\r\n        dataModelPrimeSplit[1] == 'details'\r\n      )\r\n        returnValue = DataModelType.SurgeryDetails;\r\n    }\r\n  } else {\r\n    if (dataModelPrime == 'symptom') returnValue = DataModelType.Symptom;\r\n    else if (\r\n      dataModelPrime.includes('activity') &&\r\n      dataModelPrime.includes('log')\r\n    )\r\n      returnValue = DataModelType.ActivityLog;\r\n    else if (\r\n      dataModelPrime.includes('data') &&\r\n      dataModelPrime.includes('collection')\r\n    )\r\n      returnValue = DataModelType.DataCollection;\r\n    else if (\r\n      dataModelPrime.includes('icp') &&\r\n      dataModelPrime.includes('record')\r\n    )\r\n      returnValue = DataModelType.IcpRecord;\r\n    else if (\r\n      dataModelPrime.includes('patient') &&\r\n      dataModelPrime.includes('information')\r\n    )\r\n      returnValue = DataModelType.PatientInformation;\r\n    else if (\r\n      dataModelPrime.includes('housekeeping') &&\r\n      dataModelPrime.includes('record')\r\n    )\r\n      returnValue = DataModelType.HousekeepingRecord;\r\n    else if (\r\n      dataModelPrime.includes('surgery') &&\r\n      dataModelPrime.includes('details')\r\n    )\r\n      returnValue = DataModelType.SurgeryDetails;\r\n    else if (\r\n      dataModelPrime.includes('implant')\r\n    )\r\n      returnValue = DataModelType.Implant;\r\n    else if (\r\n      dataModelPrime.includes('wand')\r\n    )\r\n      returnValue = DataModelType.Wand;\r\n  }\r\n  return returnValue;\r\n};\r\n","import { BaseEntity } from './base-entity';\r\n\r\nexport class IcpRecord extends BaseEntity {\r\n  // The foreign key that ties this table to the data collection table\r\n  dataCollectionId?: string;\r\n\r\n  // The time this ICP value was recorded, in milliseconds since midnight, January 1, 1970 UTC.\r\n  timestamp?: Date;\r\n\r\n  icpMmhg?: number;\r\n  isDataValid?: boolean;\r\n\r\n  constructor(\r\n    deviceDataId: string,\r\n    dataCollectionId: string,\r\n    timestamp?: Date,\r\n    icpMmhg?: number,\r\n    isDataValid?: boolean\r\n  ) {\r\n    super(deviceDataId);\r\n    this.dataCollectionId = dataCollectionId;\r\n    this.timestamp = timestamp;\r\n    this.icpMmhg = icpMmhg;\r\n    this.isDataValid = isDataValid;\r\n  }\r\n}\r\n","import { BaseEntity } from './base-entity';\r\n\r\nexport class SurgeryDetails extends BaseEntity {\r\n  procedureDate?: Date;\r\n  surgeonName?: string;\r\n  verifiedBySurgeon?: boolean;\r\n  hospital?: string;\r\n\r\n  constructor(\r\n    deviceDataId: string,\r\n    procedureDate?: Date,\r\n    surgeonName?: string,\r\n    verifiedBySurgeon?: boolean,\r\n    hospital?: string\r\n  ) {\r\n    super(deviceDataId);\r\n    this.deviceDataId = deviceDataId;\r\n    this.procedureDate = procedureDate;\r\n    this.surgeonName = surgeonName;\r\n    this.verifiedBySurgeon = verifiedBySurgeon;\r\n    this.hospital = hospital\r\n  }\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport {\r\n  DataCollection,\r\n  isPatientPositionType,\r\n} from '../../models/data-collection';\r\nimport { Symptom } from '../../models/symptom';\r\nimport { GalenChartDataPoint } from '../../interfaces/galen-chart-data-point';\r\nimport { GalenChartDataPointsWithFeatures } from '../../interfaces/galen-chart-data-points-with-features';\r\nimport { GalenHttpService } from '../galen-http/galen-http.service';\r\nimport { HttpResponse } from '@angular/common/http';\r\nimport { getRecordsFromResponseBody as getRecordsFromResponseBody } from '../../utils/http-response';\r\nimport { ActivityLog } from '../../models/activity-log';\r\nimport { removeNullElements } from '../../utils/array-utils';\r\nimport { sortTableColumns } from '../../utils/table-utils';\r\nimport { PatientInfo } from '../../models/patient-info';\r\nimport { RecordData } from '../../interfaces/record-data';\r\nimport { GalenUser } from '../../models/galen-user';\r\nimport { DataModelType, toDataModelType } from '../../enums/data-model-type';\r\nimport { IcpRecord } from '../../models/icp-record';\r\nimport { SurgeryDetails } from '../../models/surgery-details';\r\n\r\nconst MAXIMUM_SET_OF_ICP_RECORDS = 10;\r\n\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class GalenDataService {\r\n  private galenHttpService: GalenHttpService = inject(GalenHttpService);\r\n\r\n  /** Contains the userId of the patient whose data you want to filter for */\r\n  private ownerId: string = '';\r\n\r\n  private dataCollectionTable: {\r\n    data: Map<string, DataCollection>;\r\n    minDate: Date | undefined;\r\n    maxDate: Date | undefined;\r\n  } = {\r\n    data: new Map<string, DataCollection>(),\r\n    minDate: undefined,\r\n    maxDate: undefined,\r\n  };\r\n\r\n  private dataCollectionIdToIcpRecords = new Map<\r\n    string,\r\n    GalenChartDataPointsWithFeatures<number>\r\n  >();\r\n\r\n  private deviceId = '';\r\n  private dataModelData: {\r\n    dataModel: DataModelType;\r\n    dataModelId: string;\r\n  }[] = [];\r\n\r\n  constructor() {}\r\n\r\n  private async getDeviceId(): Promise<string> {\r\n    return new Promise((resolve, reject) => {\r\n      this.galenHttpService.getDeviceId().subscribe({\r\n        next: async (res: HttpResponse<Object>) => {\r\n          try {\r\n            if (res.body) {\r\n              let body = Object(res.body);\r\n              if (Object.keys(body).includes('content')) {\r\n                let content = body['content'];\r\n\r\n                for (let i = 0; i < content.length; i++) {\r\n                  let device = content[i];\r\n                  if (device['name'] == 'Kitea Health App') {\r\n                    this.deviceId = device['deviceId'];\r\n                  }\r\n                }\r\n              }\r\n            }\r\n          } catch (err) {\r\n            reject(err);\r\n          }\r\n          resolve(this.deviceId);\r\n        },\r\n        error: (err) => {\r\n          reject(err);\r\n        },\r\n      });\r\n    });\r\n  }\r\n\r\n  private async getDataModelIdAsync(dataModel: DataModelType): Promise<string> {\r\n    /**\r\n     * Returns the correponding dataModelId of the given dataModel that was passed to the outer function\r\n     * @returns string\r\n     */\r\n    let getDataModelId = () => {\r\n      let dataModelId = '';\r\n      this.dataModelData.forEach((val) => {\r\n        if (val.dataModel == dataModel) {\r\n          dataModelId = val.dataModelId;\r\n        }\r\n      });\r\n      return dataModelId;\r\n    };\r\n\r\n    // If we don't have the deviceId for the Kitea Device, then we need to fetch it from\r\n    // Galen in order to retrieve the dataModel information belonging to the Kitea Device in Galen\r\n    if (this.deviceId.length == 0) {\r\n      this.deviceId = await this.getDeviceId();\r\n    }\r\n\r\n    return new Promise((resolve, reject) => {\r\n      // We first check if the dataModelId is already stored inside of memory. If so, then we\r\n      // don't need to make any HTTP requests to Galen and can instead just fetch and return\r\n      // the dataModeId from memory.\r\n      let _dataModelId = getDataModelId();\r\n      if (_dataModelId.length != 0) resolve(_dataModelId);\r\n      else {\r\n        // The given dataModel's information is currently NOT stored in memory, so we need to fetch\r\n        // it from Galen\r\n        this.galenHttpService.getDataModelIds(this.deviceId).subscribe({\r\n          next: async (res: HttpResponse<Object>) => {\r\n            try {\r\n              if (res.body) {\r\n                // Casting the response body as a JavaScript Object, and then extracting the 'content'\r\n                // tag, which contains the relevant dataModel data that we need, from the response body\r\n                let body = Object(res.body);\r\n                if (Object.keys(body).includes('content')) {\r\n                  let content = body['content'];\r\n\r\n                  // Parsing and extracting the name and IDs of ALL of the dataModels that are currently\r\n                  // stored in Galen under the Kitea Device, and then storing them into memory so that\r\n                  // we don't have to make any more HTTP requests in the future\r\n                  for (let i = 0; i < content.length; i++) {\r\n                    let model = content[i];\r\n                    let name = toDataModelType(model['name']);\r\n\r\n                    let found = false;\r\n                    this.dataModelData.forEach((dataModel) => {\r\n                      if (dataModel.dataModel == name) found = true;\r\n                    });\r\n\r\n                    if (!found && name) {\r\n                      let deviceDataModelId = model['deviceDataModelId'];\r\n                      this.dataModelData.push({\r\n                        dataModel: name,\r\n                        dataModelId: deviceDataModelId,\r\n                      });\r\n                    }\r\n                  }\r\n                }\r\n              }\r\n\r\n              // We resolve with the given dataModel's ID\r\n              resolve(getDataModelId());\r\n            } catch (err) {\r\n              reject(err);\r\n            }\r\n          },\r\n          error: (err) => {\r\n            reject(err);\r\n          },\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Returns a sorted copy of the given [records] based on each entry's given [timestampProperty] key inside of their `RecordData.record` Map\r\n   * @param records The records to sort. Each entry's `RecordData.record` map MUST contain [timestampProperty] as a key\r\n   * @param removeUndefined A flag to indicate whether the function should remove any records that have `undefined` as their [timestampProperty]\r\n   * @param timestampProperty\r\n   * @returns RecordData[] - The sorted record data\r\n   */\r\n  private sortRecordsOnTimestamp(\r\n    records: RecordData[],\r\n    removeUndefined: boolean = false,\r\n    timestampProperty: string = 'Timestamp'\r\n  ) {\r\n    let newRecords = [...records]; // Deep copying the given array of records\r\n\r\n    // Removing all entries that have 'undefined' as their timestamp, if the removeUndefined flag is set\r\n    if (removeUndefined) {\r\n      newRecords = removeNullElements(newRecords, (i) => {\r\n        return [newRecords[i].record.get(timestampProperty)];\r\n      });\r\n    }\r\n\r\n    // Sorting the array based off the 'Timestamp' key\r\n    return newRecords.sort((a, b) => {\r\n      let ats = a.record.has(timestampProperty)\r\n        ? new Date(String(a.record.get(timestampProperty)!!.value)).getTime()\r\n        : undefined;\r\n      let bts = b.record.has(timestampProperty)\r\n        ? new Date(String(b.record.get(timestampProperty)!!.value)).getTime()\r\n        : undefined;\r\n\r\n      if (!ats) return 1;\r\n      if (!bts) return -1;\r\n\r\n      if (ats > bts) return 1;\r\n      else if (ats == bts) return 0;\r\n      else return -1;\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Fetches all the unique values belonging to a property\r\n   * @param ownerId UUID of the account whose data you want to fetch\r\n   * @param dataModel The data model to fetch from\r\n   * @param propertyCode The property in [dataModel] whose unique values you want\r\n   * @returns any[] - An array of unique values belonging to this propertyCode\r\n   */\r\n  async getUniqueValues(\r\n    ownerId: string,\r\n    dataModel: DataModelType,\r\n    propertyCode: string\r\n  ): Promise<any[]> {\r\n    const dataModelId = await this.getDataModelIdAsync(dataModel);\r\n    return new Promise((resolve, reject) => {\r\n      this.galenHttpService\r\n        .getDeviceDataAggregate(\r\n          dataModelId,\r\n          ownerId,\r\n          undefined,\r\n          undefined,\r\n          undefined,\r\n          undefined,\r\n          undefined,\r\n          undefined,\r\n          undefined,\r\n          undefined,\r\n          undefined,\r\n          [{ propertyCode, aggregationType: 'Count' }],\r\n          [{ propertyCode }]\r\n        )\r\n        .subscribe({\r\n          next: async (res: HttpResponse<Object>) => {\r\n            let uniqueVals = [];\r\n            try {\r\n              if (res.body) {\r\n                // Extracting the relevant properties from the response body\r\n                let records = getRecordsFromResponseBody(res.body, []);\r\n\r\n                for (let i = 0; i < records.length; i++) {\r\n                  // Parsing the relevant data\r\n                  let record = records[i].record;\r\n                  let val = record.has(propertyCode)\r\n                    ? record.get(propertyCode)!!.value\r\n                    : undefined;\r\n                  uniqueVals.push(val);\r\n                }\r\n\r\n                resolve(uniqueVals);\r\n              }\r\n            } catch (err) {\r\n              reject(err);\r\n            }\r\n          },\r\n          error: (err) => {\r\n            reject(err);\r\n          },\r\n        });\r\n    });\r\n  }\r\n\r\n  async getWandAndImplantIdToSerialNumber(): Promise<{\r\n    wandData: Map<number, string>;\r\n    implantData: Map<number, number>;\r\n  }> {\r\n    let wandIdToSerialNumber: Map<number, string> = new Map();\r\n    let implantIdToSerialNumber: Map<number, number> = new Map();\r\n\r\n    try {\r\n      // Fetching the maps for:\r\n      //  - randomWandId -> wandSerialNumber\r\n      //  - randomImplantId -> implantSerialNumber\r\n      let idToSerialNumber = await Promise.all([\r\n        this.getWandIdToSerialNumber(),\r\n        this.getImplantIdToSerialNumber(),\r\n      ]);\r\n      wandIdToSerialNumber = idToSerialNumber[0];\r\n      implantIdToSerialNumber = idToSerialNumber[1];\r\n    } catch (err) {\r\n      // If there's an error with the HTTP requests for the Wand and Implant tables,\r\n      // it will be caught over here\r\n      console.log(`Unable to fetch data from Wand or Implant tables`);\r\n    }\r\n\r\n    return {\r\n      wandData: wandIdToSerialNumber,\r\n      implantData: implantIdToSerialNumber,\r\n    };\r\n  }\r\n\r\n  async getWandIdToSerialNumber(): Promise<Map<number, string>> {\r\n    let dataModelId = await this.getDataModelIdAsync(DataModelType.Wand);\r\n    return new Promise((resolve, reject) => {\r\n      this.galenHttpService\r\n        .getDeviceDataAdvanced(\r\n          dataModelId,\r\n          this.ownerId,\r\n          undefined,\r\n          undefined,\r\n          undefined,\r\n          undefined,\r\n          undefined,\r\n          undefined,\r\n          undefined,\r\n          undefined,\r\n          undefined\r\n        )\r\n        .subscribe({\r\n          next: async (res: HttpResponse<Object>) => {\r\n            let wands: Map<number, string> = new Map();\r\n            try {\r\n              if (res.body) {\r\n                // Extracting the relevant properties from the response body\r\n                let records = getRecordsFromResponseBody(res.body, []);\r\n\r\n                for (let i = 0; i < records.length; i++) {\r\n                  // Parsing the relevant data\r\n                  let record = records[i].record;\r\n                  let id = record.has('Id')\r\n                    ? Number(record.get('Id')!!.value)\r\n                    : undefined;\r\n                  let serialNumber = record.has('SerialNumber')\r\n                    ? String(record.get('SerialNumber')!!.value)\r\n                    : undefined;\r\n\r\n                  if (id && serialNumber) wands.set(id, serialNumber);\r\n                }\r\n                resolve(wands);\r\n              }\r\n            } catch (err) {\r\n              reject(err);\r\n            }\r\n          },\r\n          error: (err) => {\r\n            reject(err);\r\n          },\r\n        });\r\n    });\r\n  }\r\n\r\n  async getImplantIdToSerialNumber(): Promise<Map<number, number>> {\r\n    let dataModelId = await this.getDataModelIdAsync(DataModelType.Implant);\r\n    return new Promise((resolve, reject) => {\r\n      this.galenHttpService\r\n        .getDeviceDataAdvanced(\r\n          dataModelId,\r\n          this.ownerId,\r\n          undefined,\r\n          undefined,\r\n          undefined,\r\n          undefined,\r\n          undefined,\r\n          undefined,\r\n          undefined,\r\n          undefined,\r\n          undefined\r\n        )\r\n        .subscribe({\r\n          next: async (res: HttpResponse<Object>) => {\r\n            let implants: Map<number, number> = new Map();\r\n            try {\r\n              if (res.body) {\r\n                // Extracting the relevant properties from the response body\r\n                let records = getRecordsFromResponseBody(res.body, []);\r\n\r\n                for (let i = 0; i < records.length; i++) {\r\n                  // Parsing the relevant data\r\n                  let record = records[i].record;\r\n                  let id = record.has('Id')\r\n                    ? Number(record.get('Id')!!.value)\r\n                    : undefined;\r\n                  let serialNumber = record.has('SerialNumber')\r\n                    ? Number(record.get('SerialNumber')!!.value)\r\n                    : undefined;\r\n\r\n                  if (id && serialNumber) implants.set(id, serialNumber);\r\n                }\r\n                resolve(implants);\r\n              }\r\n            } catch (err) {\r\n              reject(err);\r\n            }\r\n          },\r\n          error: (err) => {\r\n            reject(err);\r\n          },\r\n        });\r\n    });\r\n  }\r\n\r\n  async joinDataModels(\r\n    ownerId: string,\r\n    headers: Map<string, { table: 'primary' | 'foreign'; property: string }>,\r\n    foreignKeyRelationship: {\r\n      primaryKeyProp: string;\r\n      foreignKeyProp: string;\r\n    },\r\n    tables: {\r\n      primaryTable: DataModelType;\r\n      foreignTable: DataModelType;\r\n    },\r\n    headerToSortBy: string,\r\n    timestampRange?: {\r\n      primaryTableProperty: string;\r\n      foreignTableProperty: string;\r\n      startDateTime?: Date;\r\n      endDateTime?: Date;\r\n    },\r\n    sortBy?: {\r\n      primaryTableAttribute?: string;\r\n      foreignTableAttribute: string;\r\n      sortOrder: 'ASC' | 'DESC';\r\n    }\r\n  ): Promise<{ tableData: Map<string, string[]>; rowCount: number }> {\r\n    let pageSize = 10000;\r\n\r\n    // Parsing the timestampData\r\n    let primaryStartTimestamp:\r\n      | {\r\n          timestampProperty: string;\r\n          datetime: Date;\r\n        }\r\n      | undefined = undefined;\r\n    let primaryEndTimestamp:\r\n      | {\r\n          timestampProperty: string;\r\n          datetime: Date;\r\n        }\r\n      | undefined = undefined;\r\n    let foreignStartTimestamp:\r\n      | {\r\n          timestampProperty: string;\r\n          datetime: Date;\r\n        }\r\n      | undefined = undefined;\r\n    let foreignEndTimestamp:\r\n      | {\r\n          timestampProperty: string;\r\n          datetime: Date;\r\n        }\r\n      | undefined = undefined;\r\n    if (timestampRange) {\r\n      if (timestampRange.primaryTableProperty) {\r\n        if (timestampRange.startDateTime) {\r\n          primaryStartTimestamp = {\r\n            datetime: timestampRange.startDateTime,\r\n            timestampProperty: timestampRange.primaryTableProperty,\r\n          };\r\n        }\r\n        if (timestampRange.endDateTime) {\r\n          primaryEndTimestamp = {\r\n            datetime: timestampRange.endDateTime,\r\n            timestampProperty: timestampRange.primaryTableProperty,\r\n          };\r\n        }\r\n      }\r\n      if (timestampRange.foreignTableProperty) {\r\n        if (timestampRange.startDateTime) {\r\n          foreignStartTimestamp = {\r\n            datetime: timestampRange.startDateTime,\r\n            timestampProperty: timestampRange.foreignTableProperty,\r\n          };\r\n        }\r\n        if (timestampRange.endDateTime) {\r\n          foreignEndTimestamp = {\r\n            datetime: timestampRange.endDateTime,\r\n            timestampProperty: timestampRange.foreignTableProperty,\r\n          };\r\n        }\r\n      }\r\n    }\r\n\r\n    // Extracting the sortBy argument\r\n    let primarySortBy: string | undefined = undefined;\r\n    let foreignSortBy: string | undefined = undefined;\r\n    let sortOrder: 'ASC' | 'DESC' | undefined = undefined;\r\n    if (sortBy) {\r\n      if (sortBy.primaryTableAttribute)\r\n        primarySortBy = sortBy.primaryTableAttribute;\r\n      if (sortBy.foreignTableAttribute)\r\n        foreignSortBy = sortBy.foreignTableAttribute;\r\n      if (sortBy.sortOrder) sortOrder = sortBy.sortOrder;\r\n    }\r\n\r\n    // Getting the data model IDs for the primary and foreign tables\r\n    let dataModelIds = await Promise.all([\r\n      this.getDataModelIdAsync(tables.primaryTable),\r\n      this.getDataModelIdAsync(tables.foreignTable),\r\n    ]);\r\n    let primaryId = dataModelIds[0];\r\n    let foreignId = dataModelIds[1];\r\n\r\n    // Mapping each table's property name to its corresponding header\r\n    let primaryPropToHeader: Map<string, string> = new Map();\r\n    let foreignPropToHeader: Map<string, string> = new Map();\r\n    headers.forEach((value, header) => {\r\n      let table = value.table;\r\n      if (table == 'primary') primaryPropToHeader.set(value.property, header);\r\n      else foreignPropToHeader.set(value.property, header);\r\n    });\r\n\r\n    // Function for making the request to fetch a data model's rows\r\n    let primaryTotalPages = 0;\r\n    let foreignTotalPages = 0;\r\n    let getTableData = async (\r\n      tableId: string,\r\n      startTimestamp?: {\r\n        timestampProperty: string;\r\n        datetime: Date;\r\n      },\r\n      endTimestamp?: {\r\n        timestampProperty: string;\r\n        datetime: Date;\r\n      },\r\n      sortBy?: string,\r\n      pageNumber?: number\r\n    ): Promise<Map<string, Array<RecordData>>> => {\r\n      return new Promise((resolve, reject) => {\r\n        this.galenHttpService\r\n          .getDeviceDataAdvanced(\r\n            tableId,\r\n            ownerId,\r\n            startTimestamp,\r\n            endTimestamp,\r\n            undefined,\r\n            undefined,\r\n            pageNumber,\r\n            pageSize,\r\n            sortBy,\r\n            sortOrder\r\n          )\r\n          .subscribe({\r\n            next: async (res: HttpResponse<Object>) => {\r\n              if (res.body) {\r\n                let body = Object(res.body);\r\n\r\n                // Storing the total number of pages that each table has\r\n                let isPrimary = false;\r\n                if (tableId == primaryId) {\r\n                  isPrimary = true;\r\n                  if (primaryTotalPages == 0)\r\n                    primaryTotalPages = body.totalPages;\r\n                }\r\n                if (tableId == foreignId && foreignTotalPages == 0) {\r\n                  foreignTotalPages = body.totalPages;\r\n                }\r\n\r\n                // Parsing the records from the response body\r\n                let records = getRecordsFromResponseBody(body, []);\r\n                let recordMap: Map<string, Array<RecordData>> = new Map();\r\n                records.forEach((record) => {\r\n                  if (isPrimary) {\r\n                    // Mapping each primary table's record to its corresponding\r\n                    // primary key value of the entity-relationship. Since the relationship\r\n                    // between primary table and foreign table is 1-to-many, only 1 primary record\r\n                    // is stored\r\n                    if (\r\n                      record.record.has(foreignKeyRelationship.primaryKeyProp)\r\n                    )\r\n                      recordMap.set(\r\n                        record.record.get(\r\n                          foreignKeyRelationship.primaryKeyProp\r\n                        )!!.value,\r\n                        [record]\r\n                      );\r\n                    else recordMap.set(record.deviceDataId, [record]); // Mapping deviceDataId to record\r\n                  } else {\r\n                    // Mapping each foreign record to its corresponding foreign key value's bucket\r\n                    if (\r\n                      record.record.has(foreignKeyRelationship.foreignKeyProp)\r\n                    ) {\r\n                      let fkv = record.record.get(\r\n                        foreignKeyRelationship.foreignKeyProp\r\n                      )!!.value;\r\n                      if (!recordMap.has(fkv)) recordMap.set(fkv, []);\r\n\r\n                      let recordsFromMaps = recordMap.get(fkv);\r\n                      recordsFromMaps!!.push(record);\r\n                      recordMap.set(fkv, recordsFromMaps!!);\r\n                    }\r\n                  }\r\n                });\r\n\r\n                resolve(recordMap);\r\n              }\r\n            },\r\n            error: (err) => reject(err),\r\n          });\r\n      });\r\n    };\r\n\r\n    let primaryPageNumber = 0;\r\n    let foreignPageNumber = 0;\r\n\r\n    /** keys => primary-key value of the entity relationship; value => corresponding record */\r\n    let primaryRecords: Map<string, RecordData> = new Map();\r\n\r\n    /** keys => foreign-key value of the entity relationship; value => corresponding records */\r\n    let foreignRecords: Map<string, Array<RecordData>> = new Map();\r\n\r\n    // Fetches all the user's data that is stored in both the primary and foreign tables\r\n    // Stores the data in [praimaryRecords] and [foreignRecords], respectively.\r\n    let getAllData = () => {\r\n      // Stores the primary records in this local scope to the primary records in the outer\r\n      // scope\r\n      let extractPrimaryRecords = (records: Map<string, RecordData[]>) => {\r\n        records.forEach((value, key) => {\r\n          primaryRecords.set(key, value[0]);\r\n        });\r\n        records.clear();\r\n      };\r\n\r\n      // Stores the foreign records in this local scope to the foreign records in the outer\r\n      // scope\r\n      let extractForeignRecords = (records: Map<string, RecordData[]>) => {\r\n        records.forEach((value, key) => {\r\n          if (foreignRecords.has(key))\r\n            foreignRecords.set(key, foreignRecords.get(key)!!.concat(value));\r\n          else foreignRecords.set(key, value);\r\n        });\r\n        records.clear();\r\n      };\r\n\r\n      let initialRequests = () => {\r\n        return new Promise((resolve, reject) => {\r\n          let totalReqs = 0;\r\n          getTableData(\r\n            primaryId,\r\n            primaryStartTimestamp,\r\n            primaryEndTimestamp,\r\n            primarySortBy,\r\n            primaryPageNumber\r\n          )\r\n            .then((value) => {\r\n              primaryPageNumber += 1;\r\n              extractPrimaryRecords(value);\r\n            })\r\n            .catch((err) => {\r\n              console.error(err);\r\n            })\r\n            .finally(() => {\r\n              totalReqs += 1;\r\n              if (totalReqs == 2) resolve(true);\r\n            });\r\n\r\n          getTableData(\r\n            foreignId,\r\n            foreignStartTimestamp,\r\n            foreignEndTimestamp,\r\n            foreignSortBy,\r\n            foreignPageNumber\r\n          )\r\n            .then((value) => {\r\n              foreignPageNumber += 1;\r\n              extractForeignRecords(value);\r\n            })\r\n            .catch((err) => {\r\n              console.error(err);\r\n            })\r\n            .finally(() => {\r\n              totalReqs += 1;\r\n              if (totalReqs == 2) resolve(true);\r\n            });\r\n        });\r\n      };\r\n\r\n      return new Promise((resolve, reject) => {\r\n        initialRequests().then((values) => {\r\n          // Tallying the total number of requests that need to be made based on how many pages\r\n          // we need to fetch\r\n          let totalRequestNeeded = primaryTotalPages + foreignTotalPages;\r\n          let requestsMade = primaryPageNumber + foreignPageNumber;\r\n\r\n          if (requestsMade >= totalRequestNeeded) resolve(true);\r\n\r\n          let postRequestHandling = () => {\r\n            requestsMade += 1;\r\n            if (requestsMade >= totalRequestNeeded) resolve(true);\r\n          };\r\n\r\n          while (primaryPageNumber < primaryTotalPages) {\r\n            getTableData(\r\n              primaryId,\r\n              primaryStartTimestamp,\r\n              primaryEndTimestamp,\r\n              primarySortBy,\r\n              primaryPageNumber\r\n            ).then((records) => {\r\n              extractPrimaryRecords(records);\r\n              postRequestHandling();\r\n            });\r\n            primaryPageNumber += 1;\r\n          }\r\n\r\n          while (foreignPageNumber < foreignTotalPages) {\r\n            getTableData(\r\n              foreignId,\r\n              foreignStartTimestamp,\r\n              foreignEndTimestamp,\r\n              foreignSortBy,\r\n              foreignPageNumber\r\n            ).then((records) => {\r\n              extractForeignRecords(records);\r\n              postRequestHandling();\r\n            });\r\n            foreignPageNumber += 1;\r\n          }\r\n        });\r\n      });\r\n    };\r\n\r\n    let totalElems = 0;\r\n    let headersToCol: Map<string, Array<string>> = new Map();\r\n    return new Promise((resolve, reject) => {\r\n      getAllData().then(() => {\r\n        // Useful for debugging\r\n        let getTotalForeignRecords = (records: any) => {\r\n          let total = 0;\r\n          records.forEach((recs: any) => {\r\n            total += recs.length;\r\n          });\r\n          return total;\r\n        };\r\n\r\n        // Parses [recordData] and stores it in [headersToCols] based on its [propertyToHeader] relationship\r\n        let handleRecord = (\r\n          recordData: RecordData,\r\n          propertyToHeader: Map<string, string>\r\n        ) => {\r\n          propertyToHeader.forEach((header, property) => {\r\n            if (!headersToCol.has(header)) headersToCol.set(header, []);\r\n            let col = headersToCol.get(header)!!;\r\n            let dataValue = recordData.record.has(property)\r\n              ? String(recordData.record.get(property)!!.value)\r\n              : '';\r\n\r\n            if (property.toLowerCase().trim() == 'devicedataid')\r\n              dataValue = recordData.deviceDataId;\r\n\r\n            col.push(dataValue);\r\n            headersToCol.set(header, col);\r\n          });\r\n        };\r\n\r\n        primaryRecords.forEach((primaryRec, pkv) => {\r\n          // Getting the corresponding foreign records that are related to this primary record\r\n          let corrForeignRecs = foreignRecords.has(pkv)\r\n            ? foreignRecords.get(pkv)\r\n            : [];\r\n          if (!corrForeignRecs) corrForeignRecs = [];\r\n\r\n          if (corrForeignRecs.length > 0)\r\n            // Parsing foreign records and primary records together\r\n            corrForeignRecs.forEach((foreignRec) => {\r\n              handleRecord(foreignRec, foreignPropToHeader);\r\n              handleRecord(primaryRec, primaryPropToHeader);\r\n              totalElems += 1;\r\n            });\r\n          else {\r\n            // Only parsing the primary record\r\n            handleRecord(\r\n              { deviceDataId: '', record: new Map() },\r\n              foreignPropToHeader\r\n            );\r\n            handleRecord(primaryRec, primaryPropToHeader);\r\n            totalElems += 1;\r\n          }\r\n        });\r\n\r\n        resolve({\r\n          tableData: sortTableColumns(headersToCol, headerToSortBy),\r\n          rowCount: totalElems,\r\n        });\r\n      });\r\n    });\r\n  }\r\n\r\n  async getIcpRecords(\r\n    ownerId: string,\r\n    pageNumber?: number,\r\n    pageSize?: number,\r\n    sortOrder: 'DESC' | 'ASC' = 'DESC'\r\n  ): Promise<{\r\n    icpRecords: IcpRecord[];\r\n    totalElements: number;\r\n    totalPages: number;\r\n  }> {\r\n    let icpRecordId = await this.getDataModelIdAsync(DataModelType.IcpRecord);\r\n    return new Promise((resolve, reject) => {\r\n      // Fetching the rows from the Activity Log data model with the given filters in DESCENDING order based on\r\n      // the Timestamp property (i.e., the rows with a more-recent Timestamp are at the top of the list)\r\n      this.galenHttpService\r\n        .getDeviceDataAdvanced(\r\n          icpRecordId,\r\n          ownerId,\r\n          undefined,\r\n          undefined,\r\n          undefined,\r\n          undefined,\r\n          pageNumber,\r\n          pageSize,\r\n          'data.Timestamp.value',\r\n          sortOrder\r\n        )\r\n        .subscribe({\r\n          next: async (res: HttpResponse<Object>) => {\r\n            let icpRecords: IcpRecord[] = []; // Will store the extracted ActivityLog rows\r\n            try {\r\n              if (res.body) {\r\n                // Extracting the relevant properties from the response body\r\n                let totalElements = Object(res.body).totalElements;\r\n                let totalPages = Object(res.body).totalPages;\r\n                let records = getRecordsFromResponseBody(res.body, []);\r\n\r\n                for (let i = 0; i < records.length; i++) {\r\n                  // Parsing the relevant data\r\n                  let deviceDataId = records[i].deviceDataId;\r\n                  let record = records[i].record;\r\n\r\n                  let dataCollectionId = record.has('DataCollectionId')\r\n                    ? String(record.get('DataCollectionId')!!.value)\r\n                    : undefined;\r\n                  let timestamp = record.has('Timestamp')\r\n                    ? new Date(String(record.get('Timestamp')!!.value))\r\n                    : undefined;\r\n                  // let icpRaw = record.has('IcpRaw')\r\n                  // ? Number(record.get('IcpRaw').value)\r\n                  // : undefined;\r\n                  let icpMmhg = record.has('IcpMmhg')\r\n                    ? Number(record.get('IcpMmhg')!!.value)\r\n                    : undefined;\r\n                  let isDataValid = record.has('IsDataValid')\r\n                    ? Boolean(record.get('IsDataValid')!!.value)\r\n                    : false;\r\n                  // let housekeepingRecordId = record.has('HousekeepingRecordId')\r\n                  // ? String(record.get('HousekeepingRecordId').value)\r\n                  // : undefined;\r\n\r\n                  // Storing the parsed record\r\n                  let icpRecord = new IcpRecord(\r\n                    deviceDataId,\r\n                    dataCollectionId ? dataCollectionId : '',\r\n                    timestamp,\r\n                    icpMmhg,\r\n                    isDataValid\r\n                  );\r\n                  icpRecords.push(icpRecord);\r\n                }\r\n                resolve({\r\n                  icpRecords,\r\n                  totalElements,\r\n                  totalPages,\r\n                });\r\n              }\r\n            } catch (err) {\r\n              reject(err);\r\n            }\r\n          },\r\n          error: (err) => {\r\n            reject(err);\r\n          },\r\n        });\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Fetches all the rows of data in the ActivityLogs data model that match the provided filters\r\n   * for the current patient.\r\n   * @param ownerId The patientId of the Galen account to filter for\r\n   * @param timestampStartDateTime The start-date filter to apply to the dataModel's 'Timestamp' property\r\n   * when fetching the data-rows from Galen\r\n   * @param timestampEndDateTime The end-date filter to apply to the dataModel's 'Timestamp' property\r\n   * when fetching the data-rows from Galen\r\n   * @param pageNumber The page number of the page of data you would like to retrieve from Galen\r\n   * @param pageSize The size of each page of data\r\n   * @returns Promise<{ activityLogs: ActivityLog[]; totalElements: number; }> - A Promise containing the\r\n   * given `pageNumber`'s page-data, along with the total number of rows that satisfy the given filters\r\n   * for this patient\r\n   */\r\n  async getActivityRows(\r\n    ownerId: string,\r\n    timestampStartDateTime?: Date,\r\n    timestampEndDateTime?: Date,\r\n    pageNumber?: number,\r\n    pageSize?: number,\r\n    sortOrder: 'ASC' | 'DESC' = 'DESC'\r\n  ): Promise<{\r\n    activityLogs: ActivityLog[];\r\n    totalElements: number;\r\n    totalPages: number;\r\n  }> {\r\n    let activityLogId = await this.getDataModelIdAsync(\r\n      DataModelType.ActivityLog\r\n    ); // Getting the 'Activity Log' dataModelId\r\n    return new Promise((resolve, reject) => {\r\n      // Fetching the rows from the Activity Log data model with the given filters in DESCENDING order based on\r\n      // the Timestamp property (i.e., the rows with a more-recent Timestamp are at the top of the list)\r\n      this.galenHttpService\r\n        .getDeviceDataAdvanced(\r\n          activityLogId,\r\n          ownerId,\r\n          {\r\n            timestampProperty: 'StartTimestamp',\r\n            datetime: timestampStartDateTime,\r\n          },\r\n          {\r\n            timestampProperty: 'StartTimestamp',\r\n            datetime: timestampEndDateTime,\r\n          },\r\n          undefined,\r\n          undefined,\r\n          pageNumber,\r\n          pageSize,\r\n          'data.StartTimestamp.value',\r\n          sortOrder\r\n        )\r\n        .subscribe({\r\n          next: async (res: HttpResponse<Object>) => {\r\n            let activityLogs: ActivityLog[] = []; // Will store the extracted ActivityLog rows\r\n            try {\r\n              if (res.body) {\r\n                // Extracting the relevant properties from the response body\r\n                let totalElements = Object(res.body).totalElements;\r\n                let totalPages = Object(res.body).totalPages;\r\n                let records = getRecordsFromResponseBody(res.body, []);\r\n\r\n                for (let i = 0; i < records.length; i++) {\r\n                  // Parsing the relevant data\r\n                  let deviceDataId = records[i].deviceDataId;\r\n                  let record = records[i].record;\r\n\r\n                  let startTimestamp = record.has('StartTimestamp')\r\n                    ? new Date(String(record.get('StartTimestamp')!!.value))\r\n                    : undefined;\r\n                  let activity = record.has('Activity')\r\n                    ? String(record.get('Activity')!!.value)\r\n                    : undefined;\r\n                  let timeSpent = record.has('TimeSpent')\r\n                    ? Number(record.get('TimeSpent')!!.value)\r\n                    : undefined;\r\n                  let qualityOfActivity = record.has('QualityOfActivity')\r\n                    ? String(record.get('QualityOfActivity')!!.value)\r\n                    : undefined;\r\n                  let notes = record.has('Notes')\r\n                    ? String(record.get('Notes')!!.value)\r\n                    : undefined;\r\n\r\n                  // Storing the parsed record\r\n                  let activityLog = new ActivityLog(\r\n                    deviceDataId,\r\n                    activity,\r\n                    qualityOfActivity,\r\n                    timeSpent,\r\n                    notes,\r\n                    startTimestamp\r\n                  );\r\n                  activityLogs.push(activityLog);\r\n                }\r\n                resolve({\r\n                  activityLogs,\r\n                  totalElements,\r\n                  totalPages,\r\n                });\r\n              }\r\n            } catch (err) {\r\n              reject(err);\r\n            }\r\n          },\r\n          error: (err) => {\r\n            reject(err);\r\n          },\r\n        });\r\n    });\r\n  }\r\n\r\n  async getSymptomPoints(): Promise<{\r\n    data: Map<string, GalenChartDataPoint[]>;\r\n    minDate?: Date;\r\n    maxDate?: Date;\r\n  }> {\r\n    let symptomId = await this.getDataModelIdAsync(DataModelType.Symptom);\r\n    return new Promise((resolve, reject) => {\r\n      let symptomData: Map<string, GalenChartDataPoint[]> = new Map<\r\n        string,\r\n        GalenChartDataPoint[]\r\n      >();\r\n\r\n      this.galenHttpService\r\n        .getDeviceDataAdvanced(symptomId, this.ownerId)\r\n        .subscribe({\r\n          next: async (res: HttpResponse<Object>) => {\r\n            try {\r\n              if (res.body) {\r\n                // Extracting the records from the body\r\n                let records = getRecordsFromResponseBody(res.body, [\r\n                  'DataCollectionId',\r\n                  'Symptom',\r\n                  'Severity',\r\n                ]);\r\n\r\n                for (let i = 0; i < records.length; i++) {\r\n                  let deviceDataId = records[i].deviceDataId;\r\n                  let record = records[i].record;\r\n\r\n                  let dataCollectionId = record.has('DataCollectionId')\r\n                    ? String(record.get('DataCollectionId')!!.value)\r\n                    : undefined;\r\n                  let symptom = record.has('Symptom')\r\n                    ? String(record.get('Symptom')!!.value)\r\n                    : undefined;\r\n                  let severity = record.has('Severity')\r\n                    ? Number(record.get('Severity')!!.value)\r\n                    : undefined;\r\n\r\n                  if (dataCollectionId) {\r\n                    // Extracting this symptom's timestamp value from its corresponding row in the data collection\r\n                    // data model\r\n                    let dc = this.getDataCollectionItem(dataCollectionId);\r\n                    let timestamp = dc?.timestamp;\r\n\r\n                    // Checking if the symptom's corresponding timestamp matches the criteria before saving it\r\n                    let sym: Symptom | undefined = undefined;\r\n                    if (\r\n                      this.dataCollectionTable.minDate &&\r\n                      this.dataCollectionTable.maxDate\r\n                    ) {\r\n                      if (\r\n                        timestamp &&\r\n                        timestamp >= this.dataCollectionTable.minDate &&\r\n                        timestamp <= this.dataCollectionTable.maxDate\r\n                      ) {\r\n                        sym = new Symptom(\r\n                          dataCollectionId,\r\n                          timestamp,\r\n                          symptom,\r\n                          severity\r\n                        );\r\n                      } else {\r\n                        sym = undefined;\r\n                      }\r\n                    } else {\r\n                      sym = new Symptom(\r\n                        dataCollectionId,\r\n                        timestamp,\r\n                        symptom,\r\n                        severity\r\n                      );\r\n                    }\r\n\r\n                    if (symptom && sym) {\r\n                      // Adding this record to the symptom in the set of symptoms that have ALREADY been extracted.\r\n                      let symRecs: GalenChartDataPoint[] = [];\r\n                      if (\r\n                        symptomData.has(symptom) &&\r\n                        symptomData.get(symptom)\r\n                      ) {\r\n                        symRecs = symptomData.get(symptom)!;\r\n                      }\r\n                      symRecs.push({\r\n                        name: deviceDataId,\r\n                        value: sym.convertToArray(),\r\n                      });\r\n\r\n                      // Updating the extracted set of symptom datapoints\r\n                      symptomData.set(symptom, symRecs);\r\n                    }\r\n                  }\r\n                }\r\n              }\r\n              resolve({\r\n                data: symptomData,\r\n                minDate: this.dataCollectionTable.minDate,\r\n                maxDate: this.dataCollectionTable.maxDate,\r\n              });\r\n            } catch (err) {\r\n              reject(err);\r\n            }\r\n          },\r\n          error: (err) => {\r\n            reject(err);\r\n          },\r\n        });\r\n    });\r\n  }\r\n\r\n  getBloodPressurePoints() {\r\n    let sysPts = this.extractDataCollectionProperty('systolic');\r\n    let diaPts = this.extractDataCollectionProperty('diastolic');\r\n    return {\r\n      data: new Map<string, GalenChartDataPoint[]>([\r\n        ['systolic', sysPts],\r\n        ['diastolic', diaPts],\r\n      ]),\r\n      minDate: this.dataCollectionTable.minDate,\r\n      maxDate: this.dataCollectionTable.maxDate,\r\n    };\r\n  }\r\n\r\n  async getMeanIcpPoints(\r\n    timestampStartDateTime?: Date,\r\n    timestampEndDateTime?: Date\r\n  ) {\r\n    this.dataCollectionIdToIcpRecords.clear();\r\n    await this.getDataCollectionRecords(\r\n      timestampStartDateTime,\r\n      timestampEndDateTime\r\n    );\r\n    return this.extractDataCollectionProperty('icp');\r\n  }\r\n\r\n  getBodyTemperaturePoints() {\r\n    let btPts: GalenChartDataPointsWithFeatures<Date> = {\r\n      dataPoints: this.extractDataCollectionProperty('bodyTemperature'),\r\n      minXValue: this.dataCollectionTable.minDate,\r\n      maxXValue: this.dataCollectionTable.maxDate,\r\n    };\r\n    return btPts;\r\n  }\r\n\r\n  getFeelingRatingPoints() {\r\n    let frPts: GalenChartDataPointsWithFeatures<Date> = {\r\n      dataPoints: this.extractDataCollectionProperty('feeling'),\r\n      minXValue: this.dataCollectionTable.minDate,\r\n      maxXValue: this.dataCollectionTable.maxDate,\r\n    };\r\n    return frPts;\r\n  }\r\n\r\n  getPatientPositionPoints() {\r\n    let pts: GalenChartDataPointsWithFeatures<Date> = {\r\n      dataPoints: this.extractDataCollectionProperty('position'),\r\n      minXValue: this.dataCollectionTable.minDate,\r\n      maxXValue: this.dataCollectionTable.maxDate,\r\n    };\r\n    return pts;\r\n  }\r\n\r\n  async getIcpRecordPoints(\r\n    dataCollectionId: string\r\n  ): Promise<GalenChartDataPointsWithFeatures<number>> {\r\n    let icpRecordId = await this.getDataModelIdAsync(DataModelType.IcpRecord);\r\n    return new Promise((resolve, reject) => {\r\n      let icpRecordPoints: GalenChartDataPointsWithFeatures<number> = {\r\n        dataPoints: [],\r\n        minYValue: Infinity,\r\n        maxYValue: -1 * Infinity,\r\n        lastAccessed: new Date(),\r\n      };\r\n\r\n      if (this.dataCollectionIdToIcpRecords.has(dataCollectionId)) {\r\n        // Updating the 'lastAccessed' property of this set of IcpRecords\r\n        icpRecordPoints =\r\n          this.dataCollectionIdToIcpRecords.get(dataCollectionId)!;\r\n        icpRecordPoints.lastAccessed = new Date();\r\n        this.dataCollectionIdToIcpRecords.set(\r\n          dataCollectionId,\r\n          icpRecordPoints\r\n        );\r\n\r\n        // Resolving with the already stored set of icp records\r\n        resolve(icpRecordPoints);\r\n      } else {\r\n        let startTimestamp: number | undefined = undefined;\r\n        this.galenHttpService\r\n          .getDeviceDataAdvanced(\r\n            icpRecordId,\r\n            this.ownerId,\r\n            undefined,\r\n            undefined,\r\n            undefined,\r\n            undefined,\r\n            undefined,\r\n            undefined,\r\n            undefined,\r\n            undefined,\r\n            [\r\n              {\r\n                key: 'DataCollectionId',\r\n                operator: 'Equal',\r\n                value: dataCollectionId,\r\n              },\r\n            ]\r\n          )\r\n          .subscribe({\r\n            next: async (res: HttpResponse<Object>) => {\r\n              try {\r\n                // Contains the datapoints representing this current set of IcpRecords\r\n                let gcdp: GalenChartDataPoint[] = [];\r\n\r\n                let min = Infinity; // The smallest MeanIcpMmhg value from this current set of IcpRecords\r\n                let max = -1 * Infinity; // The largest MeanIcpMmhg value from this current set of IcpRecords\r\n\r\n                if (res.body) {\r\n                  let records = getRecordsFromResponseBody(res.body, [\r\n                    'Timestamp',\r\n                    'IcpMmhg',\r\n                    'IsDataValid',\r\n                  ]);\r\n\r\n                  // NOTE: This removes records that have their timestamp as undefined\r\n                  records = this.sortRecordsOnTimestamp(records, true);\r\n\r\n                  for (let i = 0; i < records.length; i++) {\r\n                    let deviceDataId = records[i].deviceDataId;\r\n                    let record = records[i].record;\r\n\r\n                    let isDataValid = record.has('IsDataValid')\r\n                      ? Boolean(record.get('IsDataValid')!!.value)\r\n                      : false;\r\n                    if (isDataValid) {\r\n                      // Parsing the timestamp\r\n                      let timestamp = record.has('Timestamp')\r\n                        ? new Date(String(record.get('Timestamp')!!.value))\r\n                        : undefined;\r\n\r\n                      // NOTE: This will only render data points that have a valid timestamp\r\n                      if (timestamp) {\r\n                        // Saving the start timestamp to be the tiemstamp of the first ICP record that was returned\r\n                        if (!startTimestamp) {\r\n                          startTimestamp = timestamp.getTime();\r\n                        }\r\n\r\n                        // If this row doesn't have an IcpMmhg, set it to -50\r\n                        let icpMmhg = record.has('IcpMmhg')\r\n                          ? Number(record.get('IcpMmhg')!!.value)\r\n                          : -50;\r\n\r\n                        // Updating the min and max icpMmhg of this set\r\n                        if (icpMmhg > max) {\r\n                          max = icpMmhg;\r\n                        }\r\n                        if (icpMmhg < min) {\r\n                          min = icpMmhg;\r\n                        }\r\n\r\n                        // NOTE: The time stored is the time in secs. that have elapsed since the first icp record in this set\r\n                        gcdp.push({\r\n                          name: deviceDataId,\r\n                          value: [\r\n                            (timestamp.getTime() - startTimestamp) / 1000.0,\r\n                            icpMmhg,\r\n                          ],\r\n                        });\r\n                      }\r\n                    }\r\n                  }\r\n                }\r\n\r\n                // Removing the least recently used set of IcpRecords if there are currently too many\r\n                // IcpRecords in memory\r\n                if (\r\n                  this.dataCollectionIdToIcpRecords.size >\r\n                  MAXIMUM_SET_OF_ICP_RECORDS\r\n                ) {\r\n                  let keyToDelete = '';\r\n                  let LRUDate = new Date();\r\n                  this.dataCollectionIdToIcpRecords.forEach(\r\n                    (\r\n                      value: GalenChartDataPointsWithFeatures<number>,\r\n                      key: string\r\n                    ) => {\r\n                      if (value.lastAccessed && value.lastAccessed < LRUDate) {\r\n                        LRUDate = value.lastAccessed;\r\n                        keyToDelete = key;\r\n                      }\r\n                    }\r\n                  );\r\n                  this.dataCollectionIdToIcpRecords.delete(keyToDelete);\r\n                }\r\n\r\n                // Updating properties and resolving with the extracted icpRecordPoints\r\n                icpRecordPoints = {\r\n                  dataPoints: gcdp,\r\n                  minYValue: min,\r\n                  maxYValue: max,\r\n                  lastAccessed: new Date(),\r\n                };\r\n                this.dataCollectionIdToIcpRecords.set(\r\n                  dataCollectionId,\r\n                  icpRecordPoints\r\n                );\r\n                resolve(icpRecordPoints);\r\n              } catch (err) {\r\n                reject(err);\r\n              }\r\n            },\r\n            error: (err) => {\r\n              reject(err);\r\n            },\r\n          });\r\n      }\r\n    });\r\n  }\r\n\r\n  async getPatientInformation(): Promise<PatientInfo> {\r\n    let patientInfo = await this.getDataModelIdAsync(\r\n      DataModelType.PatientInformation\r\n    );\r\n    return new Promise((resolve, reject) => {\r\n      this.galenHttpService\r\n        .getDeviceDataAdvanced(patientInfo, this.ownerId)\r\n        .subscribe({\r\n          next: async (res: HttpResponse<Object>) => {\r\n            if (res.body) {\r\n              let records = getRecordsFromResponseBody(res.body, [\r\n                'NhiNumber',\r\n                'ShuntBrand',\r\n                'ShuntType',\r\n                'HydrocephalusType',\r\n                'ShuntLocation',\r\n                'GpName',\r\n                'ClinicName',\r\n              ]);\r\n\r\n              let deviceDataId = records[0].deviceDataId;\r\n              let patientInfoRecord = records[0].record;\r\n\r\n              let nhiNumber = patientInfoRecord.has('NhiNumber')\r\n                ? String(patientInfoRecord.get('NhiNumber')!!.value)\r\n                : undefined;\r\n              let shuntBrand = patientInfoRecord.has('ShuntBrand')\r\n                ? String(patientInfoRecord.get('ShuntBrand')!!.value)\r\n                : undefined;\r\n              let shuntType = patientInfoRecord.has('ShuntType')\r\n                ? String(patientInfoRecord.get('ShuntType')!!.value)\r\n                : undefined;\r\n              let hydrocephalusType = patientInfoRecord.has('HydrocephalusType')\r\n                ? String(patientInfoRecord.get('HydrocephalusType')!!.value)\r\n                : undefined;\r\n              let shuntLocation = patientInfoRecord.has('ShuntLocation')\r\n                ? String(patientInfoRecord.get('ShuntLocation')!!.value)\r\n                : undefined;\r\n              let gpName = patientInfoRecord.has('GpName')\r\n                ? String(patientInfoRecord.get('GpName')!!.value)\r\n                : undefined;\r\n              let clinicName = patientInfoRecord.has('ClinicName')\r\n                ? String(patientInfoRecord.get('ClinicName')!!.value)\r\n                : undefined;\r\n\r\n              resolve(\r\n                new PatientInfo(\r\n                  deviceDataId,\r\n                  nhiNumber,\r\n                  shuntBrand,\r\n                  shuntType,\r\n                  hydrocephalusType,\r\n                  shuntLocation,\r\n                  gpName,\r\n                  clinicName\r\n                )\r\n              );\r\n            }\r\n          },\r\n          error: (err) => {\r\n            reject(err);\r\n          },\r\n        });\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Fetches the user information belonging to [this.patientId]\r\n   * @returns Promise<GalenUser>\r\n   */\r\n  async getGalenUserInformation(): Promise<GalenUser> {\r\n    return new Promise((resolve, reject) => {\r\n      this.galenHttpService.getGalenUserInfo(this.ownerId).subscribe({\r\n        next: async (res: HttpResponse<Object>) => {\r\n          try {\r\n            if (res.body) {\r\n              // Parsing the response body\r\n              let data = Object(res.body);\r\n\r\n              // Extracting the relevant data from the response body\r\n              let userId = data['userId'] ? String(data['userId']) : undefined;\r\n              let firstName = data['firstName']\r\n                ? String(data['firstName'])\r\n                : undefined;\r\n              let middleName = data['middleName']\r\n                ? String(data['middleName'])\r\n                : undefined;\r\n              let lastName = data['lastName']\r\n                ? String(data['lastName'])\r\n                : undefined;\r\n              let fullName = data['fullName']\r\n                ? String(data['fullName'])\r\n                : undefined;\r\n              let emailAddress = data['emailAddress']\r\n                ? String(data['emailAddress'])\r\n                : undefined;\r\n              let contactInfo = data['contactInfo']\r\n                ? Object(data['contactInfo'])\r\n                : undefined;\r\n              let currentRole = data['currentRole']\r\n                ? Object(data['currentRole'])\r\n                : undefined;\r\n              let dateOfBirth = data['dateOfBirth']\r\n                ? new Date(String(data['dateOfBirth']))\r\n                : undefined;\r\n              let gender = data['gender'] ? String(data['gender']) : undefined;\r\n\r\n              resolve(\r\n                new GalenUser(\r\n                  userId,\r\n                  firstName,\r\n                  middleName,\r\n                  lastName,\r\n                  emailAddress,\r\n                  dateOfBirth,\r\n                  gender,\r\n                  contactInfo,\r\n                  currentRole,\r\n                  fullName\r\n                )\r\n              );\r\n            }\r\n          } catch (err) {\r\n            reject(err);\r\n          }\r\n        },\r\n        error: (err) => {\r\n          reject(err);\r\n        },\r\n      });\r\n    });\r\n  }\r\n\r\n  getPatientData = async (): Promise<{\r\n    patientUser?: GalenUser;\r\n    patientName?: string;\r\n    patientInfo?: PatientInfo;\r\n  }> => {\r\n    let patientUser: GalenUser | undefined = undefined;\r\n    let patientName: string | undefined = undefined;\r\n    let patientInfo: PatientInfo | undefined = undefined;\r\n\r\n    let requestsMade = 0;\r\n    let requestsNeeded = 2;\r\n    return new Promise((resolve, reject) => {\r\n      let postRequestHandling = () => {\r\n        requestsMade += 1;\r\n        if (requestsMade == requestsNeeded)\r\n          resolve({\r\n            patientUser,\r\n            patientName,\r\n            patientInfo,\r\n          });\r\n      };\r\n\r\n      this.getGalenUserInformation()\r\n        .then((value) => {\r\n          patientUser = value;\r\n          patientName = `${\r\n            patientUser.firstName ? patientUser.firstName : ''\r\n          } ${patientUser.lastName ? patientUser.lastName : ''}`;\r\n        })\r\n        .catch((err) => {})\r\n        .finally(() => {\r\n          postRequestHandling();\r\n        });\r\n\r\n      this.getPatientInformation()\r\n        .then((value) => {\r\n          patientInfo = value;\r\n        })\r\n        .catch((err) => {})\r\n        .finally(() => {\r\n          postRequestHandling();\r\n        });\r\n    });\r\n  };\r\n\r\n  /**\r\n   * Fetches the user information belonging to the currently logged in user\r\n   * @returns Promise<GalenUser>\r\n   */\r\n  async getMyGalenUserInformation(): Promise<GalenUser> {\r\n    return new Promise((resolve, reject) => {\r\n      this.galenHttpService.getMyGalenUserInfo().subscribe({\r\n        next: async (res: HttpResponse<Object>) => {\r\n          try {\r\n            if (res.body) {\r\n              let data = Object(res.body);\r\n\r\n              // extracting the relevant data\r\n              let userId = data['userId'] ? String(data['userId']) : undefined;\r\n              let firstName = data['firstName']\r\n                ? String(data['firstName'])\r\n                : undefined;\r\n              let middleName = data['middleName']\r\n                ? String(data['middleName'])\r\n                : undefined;\r\n              let lastName = data['lastName']\r\n                ? String(data['lastName'])\r\n                : undefined;\r\n              let emailAddress = data['emailAddress']\r\n                ? String(data['emailAddress'])\r\n                : undefined;\r\n              let contactInfo = data['contactInfo']\r\n                ? Object(data['contactInfo'])\r\n                : undefined;\r\n              let dateOfBirth = data['dateOfBirth']\r\n                ? new Date(String(data['dateOfBirth']))\r\n                : undefined;\r\n              let gender = data['gender'] ? String(data['gender']) : undefined;\r\n              let currentRole = data['currentRole']\r\n                ? Object(data['currentRole'])\r\n                : undefined;\r\n              let fullName = data['fullName']\r\n                ? String(data['fullName'])\r\n                : undefined;\r\n\r\n              resolve(\r\n                new GalenUser(\r\n                  userId,\r\n                  firstName,\r\n                  middleName,\r\n                  lastName,\r\n                  emailAddress,\r\n                  dateOfBirth,\r\n                  gender,\r\n                  contactInfo,\r\n                  currentRole,\r\n                  fullName\r\n                )\r\n              );\r\n            }\r\n          } catch (err) {\r\n            reject(err);\r\n          }\r\n        },\r\n        error: (err) => {\r\n          reject(err);\r\n        },\r\n      });\r\n    });\r\n  }\r\n\r\n  getDataCollectionItem(key: string) {\r\n    if (this.dataCollectionTable.data.has(key)) {\r\n      return this.dataCollectionTable.data.get(key);\r\n    } else {\r\n      return undefined;\r\n    }\r\n  }\r\n\r\n  async getSurgeryDetails(): Promise<SurgeryDetails> {\r\n    let sdId = await this.getDataModelIdAsync(DataModelType.SurgeryDetails);\r\n    return new Promise((resolve, reject) => {\r\n      this.galenHttpService\r\n        .getDeviceDataAdvanced(sdId, this.ownerId)\r\n        .subscribe({\r\n          next: async (res: HttpResponse<Object>) => {\r\n            try {\r\n              if (res.body) {\r\n                let records = getRecordsFromResponseBody(res.body, [\r\n                  'ProcedureDate',\r\n                  'SurgeonName',\r\n                  'VerifiedBySurgeon',\r\n                  'Hospital',\r\n                ]);\r\n\r\n                for (let i = 0; i < records.length; i++) {\r\n                  let deviceDataId = records[i].deviceDataId;\r\n                  let record = records[i].record;\r\n\r\n                  let procedureDate = record.has('ProcedureDate')\r\n                    ? new Date(String(record.get('ProcedureDate')!!.value))\r\n                    : undefined;\r\n                  let surgeonName = record.has('SurgeonName')\r\n                    ? String(record.get('SurgeonName')!!.value)\r\n                    : undefined;\r\n                  let verifiedBySurgeon = record.has('VerifiedBySurgeon')\r\n                    ? Boolean(record.get('VerifiedBySurgeon')!!.value)\r\n                    : undefined;\r\n                  let hospital = record.has('Hospital')\r\n                    ? String(record.get('Hospital')!!.value)\r\n                    : undefined;\r\n\r\n                  resolve(\r\n                    new SurgeryDetails(\r\n                      deviceDataId,\r\n                      procedureDate,\r\n                      surgeonName,\r\n                      verifiedBySurgeon,\r\n                      hospital\r\n                    )\r\n                  );\r\n                }\r\n              }\r\n            } catch (err) {\r\n              reject(err);\r\n            }\r\n          },\r\n          error: (err) => {\r\n            reject(err);\r\n          },\r\n        });\r\n    });\r\n  }\r\n\r\n  private async getDataCollectionRecords(\r\n    timestampStartDateTime?: Date,\r\n    timestampEndDateTime?: Date\r\n  ) {\r\n    let dcId = await this.getDataModelIdAsync(DataModelType.DataCollection);\r\n\r\n    return new Promise((resolve, reject) => {\r\n      this.galenHttpService\r\n        .getDeviceDataAdvanced(\r\n          dcId,\r\n          this.ownerId,\r\n          { timestampProperty: 'Timestamp', datetime: timestampStartDateTime },\r\n          { timestampProperty: 'Timestamp', datetime: timestampEndDateTime }\r\n        )\r\n        .subscribe({\r\n          next: async (res: HttpResponse<Object>) => {\r\n            try {\r\n              let minDate: Date | undefined = undefined;\r\n              let mostRecentDate: Date | undefined = undefined;\r\n\r\n              if (res.body) {\r\n                let records = getRecordsFromResponseBody(res.body, [\r\n                  'Timestamp',\r\n                  'MeanIcp',\r\n                  'BloodPressure',\r\n                  'BodyTemperature',\r\n                  'UserFeeling',\r\n                  'PatientPosition',\r\n                ]);\r\n\r\n                // NOTE: This removes records that have their timestamp as undefined\r\n                records = this.sortRecordsOnTimestamp(records, true);\r\n\r\n                // Clearing this.dataCollectionTable and refilling it only with the valid set of data collecion\r\n                // records\r\n                this.dataCollectionTable.data.clear();\r\n                for (let i = 0; i < records.length; i++) {\r\n                  let deviceDataId = records[i].deviceDataId;\r\n                  let record = records[i].record;\r\n\r\n                  let timestamp = record.has('Timestamp')\r\n                    ? new Date(String(record.get('Timestamp')!!.value))\r\n                    : undefined;\r\n\r\n                  // NOTE: This will only render data points that have a valid timestamp\r\n                  if (timestamp) {\r\n                    if (minDate == undefined) {\r\n                      minDate = timestamp;\r\n                    }\r\n                    mostRecentDate = timestamp;\r\n\r\n                    let meanIcp = record.has('MeanIcp')\r\n                      ? Number(record.get('MeanIcp')!!.value)\r\n                      : -50;\r\n                    let bloodPressure = record.has('BloodPressure')\r\n                      ? String(record.get('BloodPressure')!!.value)\r\n                      : undefined;\r\n                    let bodyTemperature = record.has('BodyTemperature')\r\n                      ? Number(record.get('BodyTemperature')!!.value)\r\n                      : undefined;\r\n                    let userFeeling = record.has('UserFeeling')\r\n                      ? String(record.get('UserFeeling')!!.value)\r\n                      : undefined;\r\n                    let patientPosition = record.has('PatientPosition')\r\n                      ? String(record.get('PatientPosition').value)\r\n                      : undefined;\r\n\r\n                    this.dataCollectionTable.data.set(\r\n                      deviceDataId,\r\n                      new DataCollection(\r\n                        deviceDataId,\r\n                        timestamp,\r\n                        meanIcp,\r\n                        bloodPressure,\r\n                        bodyTemperature,\r\n                        userFeeling,\r\n                        isPatientPositionType(patientPosition)\r\n                          ? patientPosition\r\n                          : undefined\r\n                      )\r\n                    );\r\n                  }\r\n                }\r\n\r\n                this.dataCollectionTable.minDate = minDate;\r\n                this.dataCollectionTable.maxDate = mostRecentDate;\r\n                resolve(true);\r\n              }\r\n            } catch (err) {\r\n              reject(err);\r\n            }\r\n          },\r\n          error: (err) => {\r\n            reject(err);\r\n          },\r\n        });\r\n    });\r\n  }\r\n\r\n  setOwnerId(ownerId: string) {\r\n    this.ownerId = ownerId;\r\n  }\r\n\r\n  private extractDataCollectionProperty(\r\n    property:\r\n      | 'icp'\r\n      | 'systolic'\r\n      | 'diastolic'\r\n      | 'feeling'\r\n      | 'bodyTemperature'\r\n      | 'position'\r\n  ) {\r\n    let data: GalenChartDataPoint[] = [];\r\n    this.dataCollectionTable.data.forEach(\r\n      (value: DataCollection, key: string) => {\r\n        let newData: any[] = [];\r\n        if (property == 'icp') newData = value.createTimeIcpPair();\r\n        else if (property == 'systolic')\r\n          newData = value.createTimeSystolicPair();\r\n        else if (property == 'diastolic')\r\n          newData = value.createTimeDiastolicPair();\r\n        else if (property == 'feeling') newData = value.createTimeFeelingPair();\r\n        else if (property == 'bodyTemperature')\r\n          newData = value.createTimeBodyTemperaturePair();\r\n        else if (property == 'position') newData = value.createPositionPair();\r\n\r\n        if (newData.length >= 2 && newData[1] != null) {\r\n          data.push({\r\n            name: key,\r\n            value: newData,\r\n          });\r\n        }\r\n      }\r\n    );\r\n    return data;\r\n  }\r\n}\r\n","export enum ChartType {\r\n  BloodPressure = \"Blood Pressure\",\r\n  BodyTemperature = \"Body Temperature\",\r\n  FeelingRating = \"Feeling Rating\",\r\n  IcpTrend = \"ICP Trend\",\r\n  Symptoms = \"Symptoms\",\r\n  PatientPosition = \"Patient Position\"\r\n}\r\n","let ICP_HK_HEADERS = [\r\n  'Time/date',\r\n  'ICP Raw',\r\n  'ICP',\r\n  'Data Valid',\r\n  'Sensor Temperature Raw',\r\n  'Sensor Temperature Celsius',\r\n  'Sensor Error',\r\n  'Wand Battery Percentage',\r\n  'Wand Battery Voltage Raw',\r\n  'Wand Battery Voltage mV',\r\n  'Wand Current Raw',\r\n  'Wand Current mA',\r\n  'Wand Power Raw',\r\n  'Wand Power Watts',\r\n  'Wand Battery Temperature Raw',\r\n  'Wand Battery Temperature Celsius',\r\n  'Wand Circuit Temperature Raw',\r\n  'Wand Circuit Temperature Celsius',\r\n  'Atmospheric Pressure Pa',\r\n  'Atmospheric Pressure mmHg',\r\n  'Wand Error',\r\n  'Wand Component Error',\r\n  'Bluetooth Connection Interval',\r\n];\r\n\r\nlet ICP_HK_HEADERS_TO_PROP: Map<\r\n  string,\r\n  { table: 'foreign' | 'primary'; property: string }\r\n> = new Map([\r\n  [\r\n    ICP_HK_HEADERS[0],\r\n    {\r\n      table: 'foreign',\r\n      property: 'Timestamp',\r\n    },\r\n  ],\r\n  [\r\n    ICP_HK_HEADERS[1],\r\n    {\r\n      table: 'foreign',\r\n      property: 'IcpRaw',\r\n    },\r\n  ],\r\n  [\r\n    ICP_HK_HEADERS[2],\r\n    {\r\n      table: 'foreign',\r\n      property: 'IcpMmhg',\r\n    },\r\n  ],\r\n  [\r\n    ICP_HK_HEADERS[3],\r\n    {\r\n      table: 'foreign',\r\n      property: 'IsDataValid',\r\n    },\r\n  ],\r\n  [\r\n    ICP_HK_HEADERS[4],\r\n    {\r\n      table: 'primary',\r\n      property: 'ImplantTemperature',\r\n    },\r\n  ],\r\n  [\r\n    ICP_HK_HEADERS[5],\r\n    {\r\n      table: 'primary',\r\n      property: 'ImplantTemperatureCelsius',\r\n    },\r\n  ],\r\n  [\r\n    ICP_HK_HEADERS[6],\r\n    {\r\n      table: 'primary',\r\n      property: 'ImplantError',\r\n    },\r\n  ],\r\n  [\r\n    ICP_HK_HEADERS[7],\r\n    {\r\n      table: 'primary',\r\n      property: 'WandBatteryPercentage',\r\n    },\r\n  ],\r\n  [\r\n    ICP_HK_HEADERS[8],\r\n    {\r\n      table: 'primary',\r\n      property: 'WandBatteryVoltageRaw',\r\n    },\r\n  ],\r\n  [\r\n    ICP_HK_HEADERS[9],\r\n    {\r\n      table: 'primary',\r\n      property: 'WandBatteryVoltageMv',\r\n    },\r\n  ],\r\n  [\r\n    ICP_HK_HEADERS[10],\r\n    {\r\n      table: 'primary',\r\n      property: 'WandCurrentRaw',\r\n    },\r\n  ],\r\n  [\r\n    ICP_HK_HEADERS[11],\r\n    {\r\n      table: 'primary',\r\n      property: 'WandCurrentMa',\r\n    },\r\n  ],\r\n  [\r\n    ICP_HK_HEADERS[12],\r\n    {\r\n      table: 'primary',\r\n      property: 'WandPowerRaw',\r\n    },\r\n  ],\r\n  [\r\n    ICP_HK_HEADERS[13],\r\n    {\r\n      table: 'primary',\r\n      property: 'WandPowerWatts',\r\n    },\r\n  ],\r\n  [\r\n    ICP_HK_HEADERS[14],\r\n    {\r\n      table: 'primary',\r\n      property: 'WandBatteryTemperatureRaw',\r\n    },\r\n  ],\r\n  [\r\n    ICP_HK_HEADERS[15],\r\n    {\r\n      table: 'primary',\r\n      property: 'WandBatteryTemperatureCelsius',\r\n    },\r\n  ],\r\n  [\r\n    ICP_HK_HEADERS[16],\r\n    {\r\n      table: 'primary',\r\n      property: 'WandCircuitTemperatureRaw',\r\n    },\r\n  ],\r\n  [\r\n    ICP_HK_HEADERS[17],\r\n    {\r\n      table: 'primary',\r\n      property: 'WandCircuitTemperatureCelsius',\r\n    },\r\n  ],\r\n  [\r\n    ICP_HK_HEADERS[18],\r\n    {\r\n      table: 'primary',\r\n      property: 'AtmosphericPressurePascal',\r\n    },\r\n  ],\r\n  [\r\n    ICP_HK_HEADERS[19],\r\n    {\r\n      table: 'primary',\r\n      property: 'AtmosphericPressureMmhg',\r\n    },\r\n  ],\r\n  [\r\n    ICP_HK_HEADERS[20],\r\n    {\r\n      table: 'primary',\r\n      property: 'WandError',\r\n    },\r\n  ],\r\n  [\r\n    ICP_HK_HEADERS[21],\r\n    {\r\n      table: 'primary',\r\n      property: 'WandComponentError',\r\n    },\r\n  ],\r\n  [\r\n    ICP_HK_HEADERS[22],\r\n    {\r\n      table: 'primary',\r\n      property: 'BluetoothConnectionInterval',\r\n    },\r\n  ],\r\n]);\r\n\r\nexport {\r\n  ICP_HK_HEADERS,\r\n  ICP_HK_HEADERS_TO_PROP,\r\n};\r\n","import JSZip from 'jszip';\r\nimport { GalenUser } from '../models/galen-user';\r\nimport { PatientInfo } from '../models/patient-info';\r\nimport { SurgeryDetails } from '../models/surgery-details';\r\nimport { toUsDateString } from './string-formatter';\r\n\r\nexport let convertToCsv = (\r\n  rowCount: number,\r\n  headers: Array<string>,\r\n  tableData: Map<string, string[]>,\r\n  patientName?: string,\r\n  patientUser?: GalenUser,\r\n  patientInfo?: PatientInfo,\r\n  surgeryDetails?: SurgeryDetails\r\n) => {\r\n  let tableDataCopy: Map<string, string[]> = new Map();\r\n  tableData.forEach((val, key) => {\r\n    tableDataCopy.set(key, [...val]);\r\n  });\r\n\r\n  let headersWithCommas: string[] = [];\r\n  tableDataCopy.forEach((column, header) => {\r\n    tableDataCopy.set(header, column.reverse());\r\n    if (header.includes(',')) {\r\n      headersWithCommas.push(header);\r\n    }\r\n  });\r\n\r\n  // Replacing all \",\" in the headers in headersToCol to \"-\" and removing all non-words\r\n  headersWithCommas.forEach((header) => {\r\n    let newHeader: string = header.slice().split(',').join('-');\r\n    tableDataCopy.set(newHeader, tableDataCopy.get(header)!!);\r\n    tableDataCopy.delete(header);\r\n  });\r\n\r\n  // Replacing all \",\" in the headers to \"-\"\r\n  headers.forEach((header, ind) => {\r\n    if (header.includes(',')) {\r\n      header = header.split(',').join('-');\r\n      headers[ind] = header;\r\n    }\r\n  });\r\n\r\n  let csvData = '';\r\n\r\n  if (patientInfo) {\r\n    let dobString = '';\r\n    let genderString = '';\r\n    let phoneNumberString = '';\r\n    let procedureDate = '';\r\n    let surgeonName = '';\r\n    let verifiedBySurgeon = '';\r\n    let hospital = '';\r\n\r\n    if (patientUser) {\r\n      if (patientUser.dateOfBirth) {\r\n        patientUser.dateOfBirth.setHours(\r\n          patientUser.dateOfBirth.getHours() +\r\n            patientUser.dateOfBirth.getTimezoneOffset() / 60\r\n        );\r\n        dobString = toUsDateString(patientUser.dateOfBirth).replace(',', '');\r\n      }\r\n\r\n      if (patientUser.gender) genderString = patientUser.gender;\r\n\r\n      if (patientUser.contactInfo) {\r\n        if (Object.keys(patientUser.contactInfo).includes('primaryPhone'))\r\n          phoneNumberString = String(\r\n            patientUser.contactInfo['primaryPhone' as keyof Object]\r\n          );\r\n      }\r\n    }\r\n\r\n    if (surgeryDetails) {\r\n      if (surgeryDetails.procedureDate)\r\n        procedureDate = toUsDateString(surgeryDetails.procedureDate).replace(',', '');\r\n\r\n      if (surgeryDetails.surgeonName) surgeonName = surgeryDetails.surgeonName;\r\n\r\n      if (surgeryDetails.verifiedBySurgeon != null)\r\n        verifiedBySurgeon = surgeryDetails.verifiedBySurgeon ? 'YES' : 'NO';\r\n\r\n      if (surgeryDetails.hospital) hospital = surgeryDetails.hospital;\r\n    }\r\n\r\n    csvData += 'Patient header\\n';\r\n    csvData += 'Name,'\r\n      .concat(patientName ? patientName.split(',').join('-') : '')\r\n      .concat('\\n');\r\n    csvData += 'Date of Birth,'.concat(dobString).concat('\\n');\r\n    csvData += 'Sex,'.concat(genderString).concat('\\n');\r\n    csvData += 'Email Address,'\r\n      .concat(\r\n        patientUser && patientUser.emailAddress ? patientUser.emailAddress : ''\r\n      )\r\n      .concat('\\n');\r\n    csvData += 'Phone Number,'.concat(phoneNumberString).concat('\\n');\r\n    csvData += 'NHI Number,'\r\n      .concat(\r\n        patientInfo.nhiNumber ? patientInfo.nhiNumber.split(',').join('-') : ''\r\n      )\r\n      .concat('\\n');\r\n    csvData += 'Shunt Brand,'\r\n      .concat(\r\n        patientInfo.shuntBrand\r\n          ? patientInfo.shuntBrand.split(',').join('-')\r\n          : ''\r\n      )\r\n      .concat('\\n');\r\n    csvData += 'Shunt Type,'\r\n      .concat(\r\n        patientInfo.shuntType ? patientInfo.shuntType.split(',').join('-') : ''\r\n      )\r\n      .concat('\\n');\r\n    csvData += 'Shunt Location,'\r\n      .concat(\r\n        patientInfo.shuntLocation\r\n          ? patientInfo.shuntLocation.split(',').join('-')\r\n          : ''\r\n      )\r\n      .concat('\\n');\r\n    csvData += 'Hydrocephalus Type,'\r\n      .concat(\r\n        patientInfo.hydrocephalusType\r\n          ? patientInfo.hydrocephalusType.split(',').join('-')\r\n          : ''\r\n      )\r\n      .concat('\\n');\r\n    csvData += 'GP Name,'\r\n      .concat(patientInfo.gpName ? patientInfo.gpName.split(',').join('-') : '')\r\n      .concat('\\n');\r\n    csvData += 'Clinic Name,'\r\n      .concat(\r\n        patientInfo.clinicName\r\n          ? patientInfo.clinicName.split(',').join('-')\r\n          : ''\r\n      )\r\n      .concat('\\n');\r\n    csvData += 'Surgery Procedure Date,'.concat(procedureDate).concat('\\n');\r\n    csvData += 'Surgeon Name,'.concat(surgeonName).concat('\\n');\r\n    csvData += 'Hospital,'.concat(hospital).concat('\\n');\r\n    csvData += 'Verified by Surgeon Yes/No,'\r\n      .concat(verifiedBySurgeon)\r\n      .concat('\\n');\r\n\r\n    csvData += '\\n\\n';\r\n  }\r\n\r\n  csvData += headers.join() + '\\n';\r\n  for (let i = 0; i < rowCount; i++) {\r\n    // Extracting each row from the data and then storing it as a CSV string\r\n    let row: Array<string> = [];\r\n    headers.forEach((header) => {\r\n      let col = tableDataCopy.get(header);\r\n      if (col) {\r\n        let last = col.pop();\r\n        let value = last ? last : '';\r\n        value = value.includes(',') ? value.split(',').join('-') : value;\r\n        row.push(value);\r\n      }\r\n    });\r\n    csvData += row.join() + '\\n';\r\n  }\r\n\r\n  return csvData;\r\n};\r\n\r\nlet saveFile = (fileName: string, content: Blob) => {\r\n  var link = document.createElement('a');\r\n  if (link.download !== undefined) {\r\n    link.setAttribute('href', URL.createObjectURL(content));\r\n    link.setAttribute('download', fileName);\r\n    link.style.visibility = 'hidden';\r\n\r\n    document.body.appendChild(link);\r\n    link.click();\r\n    document.body.removeChild(link);\r\n  }\r\n};\r\n\r\nexport let downloadToCsvFile = (fileName: string, csvData: string) => {\r\n  if (!fileName.endsWith('.csv')) fileName += '.csv';\r\n\r\n  // Saving the [csvData] to a CSV file and then downloading it on the browser\r\n  let blob = new Blob([csvData], { type: 'text/csv;charset=utf-8;' });\r\n  saveFile(fileName, blob);\r\n};\r\n\r\nexport let zipCsvFiles = (\r\n  zipFileName: string,\r\n  fileNameToContent: Map<string, string>\r\n) => {\r\n  fileNameToContent.forEach((val, key) => {\r\n    if (!key.endsWith('.csv')) {\r\n      fileNameToContent.set(`${key}.csv`, val);\r\n      fileNameToContent.delete(key);\r\n    }\r\n  });\r\n\r\n  const zip = new JSZip();\r\n\r\n  fileNameToContent.forEach((content, filename) => {\r\n    zip.file(filename, content);\r\n  });\r\n\r\n  zip.generateAsync({ type: 'blob' }).then((content: any) => {\r\n    saveFile(zipFileName, content);\r\n  });\r\n};\r\n","import { Injectable } from '@angular/core';\r\nimport { create, all, Matrix } from 'mathjs';\r\n\r\nconst math = create(all, {});\r\n\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class PolynomialRegressionService {\r\n  private createModelMatrix(x: number[], order: number): number[][] {\r\n    let model_matrix: number[][] = [];\r\n    x.forEach((x_i) => {\r\n      let row: number[] = [];\r\n      for (let i = 0; i < order + 1; i++) {\r\n        row.push(Math.pow(x_i, i));\r\n      }\r\n      model_matrix.push(row);\r\n    });\r\n    return model_matrix;\r\n  }\r\n\r\n  /**\r\n   * TODO: Make this async\r\n   *\r\n   * Reference: https://www.omnicalculator.com/statistics/cubic-regression\r\n   *\r\n   * @param X\r\n   * @param Y\r\n   * @param order\r\n   */\r\n  generateIcpRegressionParams(\r\n    X: number[],\r\n    Y: number[],\r\n    order: number = 2\r\n  ): Matrix {\r\n    let X_mat = math.matrix(this.createModelMatrix(X, order));\r\n    let Y_mat = math.matrix(Y);\r\n    let X_T_mat = math.transpose(X_mat);\r\n\r\n    return math.multiply(\r\n      math.multiply(math.inv(math.multiply(X_T_mat, X_mat)), X_T_mat),\r\n      Y_mat\r\n    );\r\n  }\r\n\r\n  evaluatePolynomialRegression(x: number, parameters: number[]): number {\r\n    let y_hat = 0;\r\n    for (let i = 0; i < parameters.length; i++) {\r\n      y_hat += parameters[i] * Math.pow(x, i);\r\n    }\r\n    return y_hat;\r\n  }\r\n\r\n  constructor() {}\r\n}\r\n","export const KITEA_GRAY = '0xFF757575';\r\nexport const KITEA_BLUE = '0xFF004C6B'\r\nexport const FONT_FAMILY = 'Calibri';\r\nexport const SYMPTOM_TO_RGB: Map<string, string> = new Map<string, string>([\r\n  ['headache', 'rgb(230, 39, 39)'],\r\n  ['nausea', 'rgb(113, 235, 113)'],\r\n  ['muscle weakness', 'rgb(0, 0, 255)'],\r\n  ['difficulty focusing eyes', 'rgb(255, 123, 255)'],\r\n  ['speech cognition problem', 'rgb(255, 0, 255)'],\r\n  ['fatigue/lethargy', 'rgb(0, 255, 255)'],\r\n  ['appetite change', 'rgb(255, 123, 0)'],\r\n  ['urgency to urinate', 'rgb(255, 0, 123)'],\r\n  ['night sweats', 'rgb(66, 207, 94)'],\r\n  ['loss of coordination or balance', 'rgb(0, 255, 123)'],\r\n  ['change in behavior', 'rgb(123, 0, 255)'],\r\n  ['forgetful', 'rgb(0, 123, 255)'],\r\n]);\r\n\r\nexport function getSymptomRGB(symptom: string): string {\r\n  // Fetching the rgb value for the given `symptom`\r\n  let color: string = '';\r\n  let lowerKey = symptom.toLowerCase().trim();\r\n  if (SYMPTOM_TO_RGB.has(lowerKey)) {\r\n    color = SYMPTOM_TO_RGB.get(lowerKey)!;\r\n  } else {\r\n    // If the current symptom isn't in the SYMPTOM_TO_RGB lookup table, then we need to\r\n    // assign it a unique and random RGB value\r\n    let taken_rgb = Array.from(SYMPTOM_TO_RGB.values());\r\n    let isColorTaken: boolean = true;\r\n    while (isColorTaken) {\r\n      let r = Math.round(Math.random() * 255);\r\n      let g = Math.round(Math.random() * 255);\r\n      let b = Math.round(Math.random() * 255);\r\n      color = `rgb(${r}, ${g}, ${b})`;\r\n\r\n      if (!taken_rgb.includes(color)) {\r\n        SYMPTOM_TO_RGB.set(symptom, color);\r\n        isColorTaken = false;\r\n      }\r\n    }\r\n  }\r\n\r\n  return color\r\n}\r\n","import * as math from 'mathjs';\r\n\r\nexport class TrendlineUtilityService {\r\n  public calculateMovingAverage(data: any[], period: number): any[] {\r\n    const movingAverage = [];\r\n    let sum = 0;\r\n    for (let idx = 0; idx < data.length; idx++) {\r\n      sum += data[idx][1];\r\n      if (idx + 1 >= period) {\r\n        // we have enough data, average it\r\n        const average = sum / period;\r\n        movingAverage.push([data[idx][0], average]);\r\n        if (idx + 1 - period >= 0) {\r\n          // since we only want to average the values within the period,\r\n          // we remove the one that does not fall into that period\r\n          sum -= data[idx + 1 - period][1];\r\n        }\r\n      }\r\n    }\r\n    return movingAverage;\r\n  }\r\n\r\n  public calculatePolynomialTrendline(data: any[], order: number): any[] {\r\n    const polyTrendline: any[] = [];\r\n\r\n    if (order < 1) {\r\n      return polyTrendline;\r\n    }\r\n    try {\r\n      // polynomail trendline is calculated using the standard line equation with the right order\r\n      // e.g. order1 -> y = c1x + b\r\n      // e.g. order2 -> y = c1x + c2x2 + b\r\n      // e.g. order3 -> y = c1x + c2x2 + c3x3 + b and so on.\r\n      // so we need to first find all co-efficients and the resolve them\r\n      // with existing x values\r\n      // since our x values are date/time we use a proxy of index as x values for trend calculation\r\n      const y = data.map((aPair) => aPair[1]);\r\n\r\n      // calculate co-efficients with matrix algebra\r\n      // see https://en.wikipedia.org/wiki/Polynomial_regression\r\n      const xMatrix = [];\r\n      let xTemp = [];\r\n      let idx = 0;\r\n      const yMatrixMath = math.transpose([y]);\r\n      for (idx = 0; idx < data.length; idx++) {\r\n        xTemp = [];\r\n        for (let i = 0; i <= order; i++) {\r\n          xTemp.push(1 * Math.pow(idx, i));\r\n        }\r\n        xMatrix.push(xTemp);\r\n      }\r\n      const xMatrixT = math.transpose(xMatrix);\r\n      const coefficients = math\r\n        .chain(xMatrixT)\r\n        .multiply(xMatrix)\r\n        .inv()\r\n        .multiply(xMatrixT)\r\n        .multiply(yMatrixMath)\r\n        .done();\r\n      idx = 1;\r\n      data.forEach((aPair: [Date, number]) => {\r\n        let yPoly = coefficients[0][0]; // this is the constant, b\r\n        for (let i = 1; i <= order; i++) {\r\n          yPoly += coefficients[i][0] * Math.pow(idx, i); // c1...cn times x power\r\n        }\r\n        polyTrendline.push([aPair[0], yPoly]);\r\n        idx++;\r\n      });\r\n    } catch (error) {\r\n      console.error('Error calculating polynomial trendline ' + error);\r\n    }\r\n    return polyTrendline;\r\n  }\r\n\r\n  public calculateExponentialTrendline(data: any[]): any[] {\r\n    const exponentialTrendline: any[] = [];\r\n    // exponential trendline can be expressed as\r\n    // y = a × bˣ\r\n    // which can be simplified with applying logarithmic function on both sides\r\n    //  => ln(y) = ln(a × bˣ).\r\n    //  => ln(y) = ln(a) + ln(bˣ)\r\n    //  => ln(y) = ln(a) + x × ln(b)\r\n    // so now this is simplified into a linear expression of line y = mx + bI where m = ln(b) and bI = ln(a)\r\n    // so using linear regression method we can determine a and b and calculate the exponential trendline.\r\n\r\n    // calculate slope (m) and Y intercept (b)\r\n    // see https://classroom.synonym.com/calculate-trendline-2709.html\r\n    const n = data.length;\r\n    let aSum = 0;\r\n    let bx = 0;\r\n    let by = 0;\r\n    let cx = 0;\r\n    let dx = 0;\r\n    let idx = 0;\r\n    data.forEach((aPair: [Date, number]) => {\r\n      const x = idx;\r\n      const y = Math.log(aPair[1]);\r\n      aSum += x * y;\r\n      bx += x;\r\n      by += y;\r\n      cx += x * x;\r\n      dx += x;\r\n\r\n      idx++;\r\n    });\r\n\r\n    const a1 = n * aSum;\r\n    const b1 = bx * by;\r\n    const c1 = n * cx;\r\n    const d1 = dx * dx;\r\n\r\n    const m = (a1 - b1) / (c1 - d1);\r\n\r\n    const e = by;\r\n    const f = m * dx;\r\n    const bI = (e - f) / n;\r\n\r\n    // now calculate a and b from m and bI\r\n    // a = exp(bI) and b = exp(m).\r\n    const a = Math.exp(bI);\r\n    const b = Math.exp(m);\r\n    // now calcualte the exponential values\r\n    idx = 0;\r\n    data.forEach((aPair: [Date, number]) => {\r\n      const y = a * Math.pow(b, idx);\r\n      exponentialTrendline.push([aPair[0], y]);\r\n      idx++;\r\n    });\r\n    return exponentialTrendline;\r\n  }\r\n}\r\n","import { HttpError } from '../interfaces/http-error';\r\n\r\nexport function handleError(chartInstance: echarts.ECharts, errorMsg: string) {\r\n  var errorMsgOption: echarts.EChartsOption = {\r\n    title: {\r\n      show: true,\r\n      textStyle: {\r\n        color: 'grey',\r\n        fontSize: 20,\r\n      },\r\n      text: errorMsg,\r\n      left: 'center',\r\n      top: 'center',\r\n    },\r\n    xAxis: {\r\n      show: false,\r\n    },\r\n    yAxis: {\r\n      show: false,\r\n    },\r\n    series: [],\r\n  };\r\n\r\n  chartInstance.clear();\r\n  chartInstance.hideLoading();\r\n  chartInstance.setOption(errorMsgOption);\r\n}\r\n\r\nexport function handleGetDeviceDataHttpError(\r\n  chartInstance: echarts.ECharts,\r\n  err: HttpError,\r\n  widgetName?: string\r\n) {\r\n  let errorMsg = widgetName\r\n    ? `${widgetName}:\\n\\n${extractGetDeviceDataHttpErrorMsg(err)}`\r\n    : `${extractGetDeviceDataHttpErrorMsg(err)}`;\r\n  handleError(chartInstance, errorMsg);\r\n}\r\n\r\nexport function extractGetDeviceDataHttpErrorMsg(err: HttpError) {\r\n  let errMsg = 'Error';\r\n  if (err.status != 0) {\r\n    if (err.status == 404) errMsg = 'No data found';\r\n    else {\r\n      let errError = err.error;\r\n      if (typeof errError === 'string' && errError.includes(' ')) {\r\n        let errSplit = errError.split(' ');\r\n        if (errSplit.length > 1) {\r\n          let newError = errSplit[1];\r\n          if (newError.includes('-')) {\r\n            errMsg = newError.replace(/-/g, ' ');\r\n            errMsg = errMsg.charAt(0).toLocaleUpperCase() + errMsg.slice(1);\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return errMsg;\r\n}\r\n","import { ZoomData } from '../interfaces/zoom-data';\r\n\r\nexport function isZoomXAxis(zoomData: ZoomData) {\r\n  let isYAxis = false;\r\n\r\n  // zoomData.dataZoomId indicates which axis from the icp-trend-chart component was zoomed.\r\n  // The pattern for the dataZoomId is similar to: ` series 0 0`. When the x-axis is zoomed,\r\n  // the first digit is 2, so since we only care about the x axis, we need to\r\n  // check if that digit is NOT 0\r\n  if (zoomData.dataZoomId) {\r\n    let isFirstDigit = true;\r\n    for (let i = 0; i < zoomData.dataZoomId.length; i++) {\r\n      if (zoomData.dataZoomId[i] >= '0' && zoomData.dataZoomId[i] <= '9') {\r\n        if (zoomData.dataZoomId[i] == '2' && isFirstDigit) {\r\n          isYAxis = true;\r\n          break;\r\n        }\r\n\r\n        isFirstDigit = false;\r\n      }\r\n    }\r\n  }\r\n\r\n  return !isYAxis;\r\n}\r\n","import { SimpleChange } from '@angular/core';\r\nimport { EChartsType } from 'echarts';\r\nimport { isZoomXAxis } from './zoom-data';\r\nimport { ChartType } from '../enums/chart-type';\r\n\r\nexport function onRestoreChartAlarmChange(\r\n  chartInstance: EChartsType,\r\n  currentChartType: ChartType,\r\n  alarmChartType: SimpleChange\r\n) {\r\n  if (\r\n    chartInstance &&\r\n    currentChartType &&\r\n    alarmChartType.currentValue &&\r\n    alarmChartType.currentValue != currentChartType\r\n  ) {\r\n    chartInstance.dispatchAction({\r\n      type: 'restore',\r\n    });\r\n  }\r\n}\r\n\r\nexport function onZoomDataChange(chartInstance: EChartsType, zoomData: any) {\r\n  let isXAxis = isZoomXAxis(zoomData);\r\n\r\n  if (isXAxis) {\r\n    // Aligns the chart's zoom-level to match the data from the given zoomData\r\n    chartInstance.dispatchAction({\r\n      type: 'dataZoom',\r\n      dataZoomIndex: 0, // Only zooming the x-axis\r\n      start: zoomData.start,\r\n      end: zoomData.end,\r\n    });\r\n  }\r\n}\r\n","export interface HttpError {\r\n  error: string;\r\n  message: string;\r\n  name: string;\r\n  ok: boolean;\r\n  status: number;\r\n  statusText: string;\r\n  url: string;\r\n}\r\n\r\nexport function instanceOfHttpError(obj: any): obj is HttpError {\r\n  return (\r\n    'error' in obj &&\r\n    'message' in obj &&\r\n    'name' in obj &&\r\n    'ok' in obj &&\r\n    'status' in obj &&\r\n    'statusText' in obj &&\r\n    'url' in obj\r\n  );\r\n}\r\n","import {\r\n  Component,\r\n  Input,\r\n  OnInit,\r\n  inject,\r\n  OnChanges,\r\n  SimpleChanges,\r\n  Output,\r\n  EventEmitter,\r\n} from '@angular/core';\r\nimport { PolynomialRegressionService } from '../../services/polynomial-regression/polynomial-regression.service';\r\n\r\nimport * as echarts from 'echarts';\r\nimport * as styles from '../../styles';\r\nimport { GalenChartDataPoint } from '../../interfaces/galen-chart-data-point';\r\nimport { GalenChartDataPointsWithFeatures } from '../../interfaces/galen-chart-data-points-with-features';\r\nimport { GalenDataService } from '../../services/galen-data/galen-data.service';\r\nimport { TrendlineUtilityService } from '../../utils/trendline-utility-service';\r\nimport { GenericComponentInputs } from '../../interfaces/generic-component-inputs';\r\nimport {\r\n  handleError,\r\n  handleGetDeviceDataHttpError,\r\n} from '../../utils/error-handler';\r\nimport { ZoomData } from '../../interfaces/zoom-data';\r\nimport { ChartImageData } from '../../interfaces/chart-image-data';\r\nimport {\r\n  onRestoreChartAlarmChange,\r\n  onZoomDataChange,\r\n} from '../../utils/input-changes';\r\nimport { instanceOfHttpError } from '../../interfaces/http-error';\r\nimport { ChartType } from '../../enums/chart-type';\r\n\r\nconst ICP_LINE_NAME = 'ICP Trend';\r\n\r\n@Component({\r\n  selector: 'lib-icp-trend-chart',\r\n  templateUrl: './icp-trend-chart.component.html',\r\n  styleUrls: ['./icp-trend-chart.component.css'],\r\n})\r\nexport class IcpTrendChartComponent implements OnInit, OnChanges {\r\n  chartType: ChartType = ChartType.IcpTrend;\r\n\r\n  trendlineType: 'polynomial' | 'linear' | 'moving-average' = 'moving-average';\r\n  movingAveragePeriod: number = 3;\r\n  polynomialOrder: number = 2;\r\n\r\n  @Input() genericComponentInputs!: GenericComponentInputs;\r\n  @Input() generatePdfDataAlarm!: boolean;\r\n  @Input() zoomData: any;\r\n\r\n  /** An alarm received from the main component for when to reset the current chart. The type\r\n   * indicates the sub-component that call for the restore\r\n   */\r\n  @Input() restoreChartAlarm?: ChartType;\r\n\r\n  /** Sends this chart's pdf data, which captures the chart's instance at the moment as an image, to the parent\r\n   * component */\r\n  @Output() chartImageData = new EventEmitter<ChartImageData>();\r\n\r\n  /**\r\n   * Indicates whether the data for the dataCollectionTable in the galenDataService has\r\n   * been successfully retreieved via an HTTP request\r\n   * * If *undefined* => The HTTP request is still underway\r\n   * * If *true* => Data collection table has been successfully retrieved\r\n   * * If *false* => Data collection table was NOT successfully retrieved\r\n   */\r\n  @Output() dataCollectionRetrievedEvent = new EventEmitter<\r\n    boolean | undefined\r\n  >();\r\n\r\n  /** A signal to alert the other charts to reset their state */\r\n  @Output() restoreChartEvent = new EventEmitter<ChartType>();\r\n\r\n  /**\r\n   * Exports the relevant zoom-event data to the parent component\r\n   */\r\n  @Output() zoomDataEvent = new EventEmitter<ZoomData>();\r\n\r\n  private galenDataService: GalenDataService = inject(GalenDataService);\r\n  private polynomialRegressionService: PolynomialRegressionService = inject(\r\n    PolynomialRegressionService\r\n  );\r\n  private icpRegressionParams: number[] = [];\r\n  private icpRegressionPoints: any[][] = [];\r\n  private dataPointWasClicked: boolean = false;\r\n\r\n  currentDataCollectionId?: string;\r\n\r\n  mainChartOption: echarts.EChartsOption = {};\r\n  waveFormChartOption?: echarts.EChartsOption;\r\n\r\n  mainChartInstance?: echarts.ECharts;\r\n  waveFormChartInstance?: echarts.ECharts;\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['generatePdfDataAlarm']) {\r\n      this.generatePdfDataAlarm = changes['generatePdfDataAlarm'].currentValue;\r\n\r\n      if (this.generatePdfDataAlarm && this.mainChartInstance) {\r\n        // Emitting the current instance of this chart as a png image. Setting the pixel ratio as 2\r\n        // drastically imporves the image's resolution\r\n        this.emitChartImageData({\r\n          chartType: this.chartType,\r\n          chartDataUrl: this.mainChartInstance.getDataURL({\r\n            type: 'png',\r\n            excludeComponents: ['toolbox', 'dataZoom'],\r\n          }),\r\n        });\r\n      }\r\n    }\r\n\r\n    if (changes['restoreChartAlarm']) {\r\n      let restoreChartAlarmChange = changes['restoreChartAlarm'];\r\n      if (this.mainChartInstance)\r\n        onRestoreChartAlarmChange(\r\n          this.mainChartInstance,\r\n          this.chartType,\r\n          restoreChartAlarmChange\r\n        );\r\n    }\r\n\r\n    if (changes['genericComponentInputs']) {\r\n      this.genericComponentInputs =\r\n        changes['genericComponentInputs'].currentValue;\r\n\r\n      // Removing the current waveform chart, if there's one being displayed\r\n      if (this.waveFormChartOption) {\r\n        this.waveFormChartOption = undefined;\r\n      }\r\n\r\n      this.loadData();\r\n    }\r\n\r\n    // Updating the zoom-level of this chart to match the other charts' zoom-level\r\n    if (changes['zoomData']) {\r\n      this.zoomData = changes['zoomData'].currentValue;\r\n      if (this.zoomData && this.mainChartInstance) {\r\n        onZoomDataChange(this.mainChartInstance, this.zoomData);\r\n      }\r\n    }\r\n  }\r\n\r\n  ngOnInit(): void {\r\n    this.updateChartOption([]);\r\n  }\r\n\r\n  private updateChartOption(seriesData: any[]) {\r\n    this.mainChartOption = {\r\n      title: {\r\n        textStyle: {\r\n          fontFamily: styles.FONT_FAMILY,\r\n          fontSize: 22,\r\n        },\r\n        left: 'center',\r\n        text: 'ICP Trend',\r\n      },\r\n      legend: {\r\n        left: 'center',\r\n        top: '6.5%',\r\n        orient: 'horizontal',\r\n        itemHeight: 0,\r\n      },\r\n      dataZoom: [\r\n        {\r\n          type: 'slider',\r\n          xAxisIndex: [0],\r\n          filterMode: 'none',\r\n        },\r\n        {\r\n          type: 'slider',\r\n          yAxisIndex: [0],\r\n          filterMode: 'none',\r\n          right: '5.75%',\r\n        },\r\n      ],\r\n      toolbox: {\r\n        show: true,\r\n        feature: {\r\n          dataZoom: {\r\n            yAxisIndex: 'none',\r\n          },\r\n          restore: {},\r\n        },\r\n      },\r\n      xAxis: {\r\n        nameLocation: 'middle',\r\n        nameTextStyle: {\r\n          color: styles.KITEA_GRAY,\r\n          fontFamily: styles.FONT_FAMILY,\r\n          align: 'center',\r\n          verticalAlign: 'bottom',\r\n          fontSize: 16,\r\n        },\r\n        nameGap: 50,\r\n        type: 'time',\r\n        name: 'Time',\r\n        splitLine: {\r\n          show: true,\r\n        },\r\n      },\r\n      yAxis: {\r\n        nameLocation: 'middle',\r\n        nameRotate: 90,\r\n        nameTextStyle: {\r\n          color: styles.KITEA_GRAY,\r\n          fontFamily: styles.FONT_FAMILY,\r\n          verticalAlign: 'bottom',\r\n          fontSize: 16,\r\n        },\r\n        nameGap: 40,\r\n        type: 'value',\r\n        name: 'ICP (auto scale)',\r\n      },\r\n      // NOTE: Do not remove this tooltip option or else no tooltips will show up in the chart\r\n      tooltip: {\r\n        show: true,\r\n        trigger: 'item',\r\n        formatter: function (param) {\r\n          return [];\r\n        },\r\n      },\r\n      series: seriesData,\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Emits the `@Output chartImageData` with the given `chartImageData`\r\n   *\r\n   * @param chartImageData\r\n   */\r\n  emitChartImageData(chartImageData: ChartImageData) {\r\n    this.chartImageData.emit(chartImageData);\r\n  }\r\n\r\n  /**\r\n   * Emits the given `retrieved` to `@Output dataCollectionRetrievedEvent`\r\n   *\r\n   * @param retrieved Indicates whether the data for the dataCollectionTable in the galenDataService\r\n   * has been successfully retreieved via an HTTP request\r\n   * * If *undefined* => The HTTP request is still underway\r\n   * * If *true* => Data collection table has been successfully retrieved\r\n   * * If *false* => Data collection table was NOT successfully retrieved\r\n   */\r\n  emitDataCollectionRetrievedEvent(retrieved: boolean | undefined) {\r\n    this.dataCollectionRetrievedEvent.emit(retrieved);\r\n  }\r\n\r\n  /**\r\n   * Emits the given `zoomData` to the `zoomDataEvent` `Output` directive\r\n   * @param zoomData\r\n   */\r\n  emitZoomDataRetrievedEvent(zoomData: { type: string; dataZoomId: string }) {\r\n    if (this.mainChartInstance) {\r\n      let trueZoomData = this.mainChartInstance.getOption()['dataZoom'] as any;\r\n      trueZoomData = trueZoomData[0];\r\n      this.zoomDataEvent.emit({\r\n        type: zoomData.type,\r\n        start: trueZoomData.start,\r\n        end: trueZoomData.end,\r\n        dataZoomId: zoomData.dataZoomId,\r\n      });\r\n    }\r\n  }\r\n\r\n  onChartDataZoom(ec: any) {\r\n    // Extracting the relevant zoom data from the event and then emitting it\r\n    this.emitZoomDataRetrievedEvent({\r\n      type: ec.type,\r\n      dataZoomId: ec.dataZoomId,\r\n    });\r\n  }\r\n\r\n  onChartRestore(ec: any) {\r\n    if ('from' in ec) this.restoreChartEvent.emit(this.chartType);\r\n  }\r\n\r\n  onDataPointClick(params: any) {\r\n    this.dataPointWasClicked = true;\r\n    this.currentDataCollectionId = params.name;\r\n\r\n    if (!this.waveFormChartOption) {\r\n      this.waveFormChartOption = {\r\n        grid: {\r\n          top: 20,\r\n          bottom: 50,\r\n          left: 70,\r\n          right: 20,\r\n        },\r\n        xAxis: {\r\n          nameLocation: 'middle',\r\n          nameTextStyle: {\r\n            color: styles.KITEA_GRAY,\r\n            fontFamily: styles.FONT_FAMILY,\r\n            align: 'center',\r\n            verticalAlign: 'bottom',\r\n            fontSize: 16,\r\n          },\r\n          nameGap: 45,\r\n          type: 'value',\r\n          name: 'Time (s)',\r\n          splitLine: {\r\n            show: true,\r\n          },\r\n        },\r\n        yAxis: {\r\n          nameLocation: 'middle',\r\n          nameRotate: 90,\r\n          nameTextStyle: {\r\n            color: styles.KITEA_GRAY,\r\n            fontFamily: styles.FONT_FAMILY,\r\n            verticalAlign: 'bottom',\r\n            fontSize: 16,\r\n          },\r\n          nameGap: 40,\r\n          type: 'value',\r\n          name: 'ICP (mmHg)',\r\n          splitLine: {\r\n            show: true,\r\n          },\r\n        },\r\n        dataZoom: [\r\n          {\r\n            type: 'slider',\r\n            xAxisIndex: [0],\r\n            filterMode: 'filter',\r\n            maxValueSpan: 60 * 1000,\r\n            bottom: 10,\r\n            height: 20,\r\n          },\r\n          {\r\n            type: 'inside',\r\n            xAxisIndex: 0,\r\n            filterMode: 'filter',\r\n          },\r\n          {\r\n            type: 'slider',\r\n            yAxisIndex: [0],\r\n            filterMode: 'none',\r\n            left: 6,\r\n          },\r\n        ],\r\n        series: [\r\n          {\r\n            name: ICP_LINE_NAME,\r\n            type: 'line',\r\n            data: [],\r\n          },\r\n        ],\r\n      };\r\n    } else {\r\n      this.handleWaveChartData();\r\n    }\r\n  }\r\n\r\n  onMainChartInit(ec: any) {\r\n    this.mainChartInstance = ec;\r\n    if (this.mainChartInstance) this.mainChartInstance.group = 'Chart'; // Grouping this component as a 'Chart'\r\n    this.loadData();\r\n  }\r\n\r\n  onWaveChartInit(ec: any) {\r\n    this.waveFormChartInstance = ec;\r\n    this.handleWaveChartData();\r\n  }\r\n\r\n  /**\r\n   * This is a callback for whenever the user clicks anywhere on the chart.\r\n   *\r\n   * If a ICP waveform chart is currently displayed, and the user clicks away from it, then\r\n   * this callback should remove the current waveform chart.\r\n   *\r\n   * @param e $event\r\n   */\r\n  onChartClick(e: any) {\r\n    // The method is always immediately called after a user presses a data point, which makes it clash\r\n    // with the onDataPointClick callback. So, for whenever a user clicks on any data point, we want\r\n    // this callback to have no effect, and we're able to achieve this by handling the\r\n    // dataPointWasClicked flag\r\n    if (this.dataPointWasClicked) {\r\n      this.dataPointWasClicked = false;\r\n    } else if (this.waveFormChartOption) {\r\n      // Removing the current waveform chart, if there's one being displayed\r\n      this.waveFormChartOption = undefined;\r\n    }\r\n  }\r\n\r\n  loadData() {\r\n    if (this.mainChartInstance) {\r\n      this.mainChartInstance.showLoading();\r\n      this.emitDataCollectionRetrievedEvent(undefined);\r\n\r\n      this.galenDataService\r\n        .getMeanIcpPoints(\r\n          this.genericComponentInputs.rangeStartDateTime,\r\n          this.genericComponentInputs.rangeEndDateTime\r\n        )\r\n        .then((pts) => {\r\n          let icpPoints: GalenChartDataPoint[] = pts;\r\n          let extractedIcpPts: any[][] = [];\r\n          for (let i = 0; i < icpPoints.length; i++) {\r\n            extractedIcpPts.push(icpPoints[i].value);\r\n          }\r\n\r\n          let tus = new TrendlineUtilityService();\r\n          let trendlineData: any[] = [];\r\n          let regressionLineName = '';\r\n\r\n          if (extractedIcpPts.length > 0) {\r\n            if (this.trendlineType == 'linear') {\r\n              trendlineData = tus.calculatePolynomialTrendline(\r\n                extractedIcpPts,\r\n                1\r\n              );\r\n              regressionLineName = 'Linear';\r\n            } else if (this.trendlineType == 'polynomial') {\r\n              trendlineData = tus.calculatePolynomialTrendline(\r\n                extractedIcpPts,\r\n                this.polynomialOrder\r\n              );\r\n              regressionLineName = `Poly. (n=${this.polynomialOrder})`;\r\n            } else if (this.trendlineType == 'moving-average') {\r\n              trendlineData = tus.calculateMovingAverage(\r\n                extractedIcpPts,\r\n                this.movingAveragePeriod\r\n              );\r\n              regressionLineName = `Moving Avg. (n=${this.movingAveragePeriod})`;\r\n            }\r\n          }\r\n\r\n          if (icpPoints.length == 0 && trendlineData.length == 0) {\r\n            if (this.mainChartInstance)\r\n              handleError(this.mainChartInstance, `ICP Trend: No data found`);\r\n            this.emitDataCollectionRetrievedEvent(false);\r\n          } else {\r\n            this.emitDataCollectionRetrievedEvent(true);\r\n\r\n            this.mainChartInstance?.clear();\r\n            this.mainChartInstance?.hideLoading();\r\n            this.updateChartOption([\r\n              {\r\n                name: ICP_LINE_NAME,\r\n                type: 'line',\r\n                data: icpPoints,\r\n                symbolSize: 8,\r\n                symbol: 'circle',\r\n                tooltip: {\r\n                  trigger: 'item',\r\n                  formatter: (param: any) => {\r\n                    let deviceDataId = param.name;\r\n                    try {\r\n                      let dc =\r\n                        this.galenDataService.getDataCollectionItem(\r\n                          deviceDataId\r\n                        );\r\n                      let bp = dc?.bloodPressureMmhg;\r\n                      let t = dc?.bodyTemperatureCelsius?.toString();\r\n                      let meanIcp = dc?.meanIcpMmhg?.toString();\r\n                      let position = dc?.patientPosition?.toString();\r\n\r\n                      if (bp == null || bp.includes('null')) bp = '-';\r\n                      if (t == null || t.includes('null')) t = '-';\r\n                      if (meanIcp == null || meanIcp.includes('null'))\r\n                        meanIcp = '-';\r\n\r\n                      if (position == null || position.includes('null'))\r\n                        position = '-';\r\n                      else if (position.includes(' ')) {\r\n                        let split = position.split(' ');\r\n                        if (split.length > 0) position = split[0];\r\n                      }\r\n\r\n                      return [\r\n                        'Mean ICP: ' + meanIcp + '<br />',\r\n                        'BP: ' + bp + '<br />',\r\n                        'T: ' + t + '<br />',\r\n                        'Position: ' + position + '<br />',\r\n                      ].join('');\r\n                    } catch (err) {\r\n                      // TODO: Handle the error\r\n                      return 'Error';\r\n                    }\r\n                  },\r\n                },\r\n              },\r\n              {\r\n                name: regressionLineName,\r\n                type: 'line',\r\n                smooth: true,\r\n                // data: this.icpRegressionPoints,\r\n                data: trendlineData,\r\n                symbol: 'none',\r\n                lineStyle: {\r\n                  type: 'dashed',\r\n                  color: '#FFA500',\r\n                },\r\n              },\r\n            ]);\r\n            this.mainChartInstance?.setOption(this.mainChartOption);\r\n          }\r\n        })\r\n        .catch((err) => {\r\n          this.emitDataCollectionRetrievedEvent(false);\r\n          if (this.mainChartInstance && instanceOfHttpError(err))\r\n            handleGetDeviceDataHttpError(\r\n              this.mainChartInstance,\r\n              err,\r\n              'ICP Trend'\r\n            );\r\n        });\r\n    }\r\n  }\r\n\r\n  private handleWaveChartData() {\r\n    if (this.waveFormChartInstance && this.currentDataCollectionId) {\r\n      this.waveFormChartInstance.showLoading();\r\n      this.galenDataService\r\n        .getIcpRecordPoints(this.currentDataCollectionId)\r\n        .then((gcdpwf: GalenChartDataPointsWithFeatures<number>) => {\r\n          let min = gcdpwf.minYValue;\r\n          let max = gcdpwf.maxYValue;\r\n\r\n          if (min) {\r\n            min = Math.floor(min) - 1;\r\n          }\r\n          if (max) {\r\n            max = Math.ceil(max) + 1;\r\n          }\r\n\r\n          this.waveFormChartInstance?.clear();\r\n          this.waveFormChartInstance?.hideLoading();\r\n          this.waveFormChartInstance?.setOption({\r\n            grid: {\r\n              top: 20,\r\n              bottom: 50,\r\n              left: 70,\r\n              right: 20,\r\n            },\r\n            xAxis: {\r\n              nameLocation: 'middle',\r\n              nameTextStyle: {\r\n                color: styles.KITEA_GRAY,\r\n                fontFamily: styles.FONT_FAMILY,\r\n                align: 'center',\r\n                verticalAlign: 'bottom',\r\n                fontSize: 16,\r\n              },\r\n              nameGap: 45,\r\n              type: 'value',\r\n              name: 'Time (s)',\r\n              splitLine: {\r\n                show: true,\r\n              },\r\n              max: gcdpwf.dataPoints[gcdpwf.dataPoints.length - 1].value[0],\r\n            },\r\n            yAxis: {\r\n              nameLocation: 'middle',\r\n              nameRotate: 90,\r\n              nameTextStyle: {\r\n                color: styles.KITEA_GRAY,\r\n                fontFamily: styles.FONT_FAMILY,\r\n                verticalAlign: 'bottom',\r\n                fontSize: 16,\r\n              },\r\n              nameGap: 40,\r\n              type: 'value',\r\n              name: 'ICP (mmHg)',\r\n              splitLine: {\r\n                show: true,\r\n              },\r\n            },\r\n            dataZoom: [\r\n              {\r\n                type: 'slider',\r\n                xAxisIndex: [0],\r\n                filterMode: 'filter',\r\n                maxValueSpan: 60 * 1000,\r\n                bottom: 10,\r\n                height: 20,\r\n              },\r\n              {\r\n                type: 'inside',\r\n                xAxisIndex: 0,\r\n                filterMode: 'filter',\r\n              },\r\n              {\r\n                type: 'slider',\r\n                yAxisIndex: [0],\r\n                filterMode: 'none',\r\n                left: 6,\r\n              },\r\n            ],\r\n            series: [\r\n              {\r\n                name: ICP_LINE_NAME,\r\n                type: 'line',\r\n                data: gcdpwf.dataPoints,\r\n                showSymbol: false,\r\n              },\r\n            ],\r\n          });\r\n        })\r\n        .catch((err) => {\r\n          if (this.waveFormChartInstance && instanceOfHttpError(err))\r\n            handleGetDeviceDataHttpError(this.waveFormChartInstance, err);\r\n        });\r\n    }\r\n  }\r\n\r\n  getIcpRegression(icpPoints: GalenChartDataPoint[], order: number): void {\r\n    if (icpPoints.length > 0) {\r\n      // Separating the all the x and y values from icpPoints into their own arrays.\r\n      // If the 1st and 2nd entries for each entry in icpPoints are not of type 'number', then the\r\n      // for-loop will return\r\n      let X: number[] = [];\r\n      let Y: number[] = [];\r\n      for (let i = 0; i < icpPoints.length; i++) {\r\n        let point = icpPoints[i].value;\r\n        if (point.length >= 2) {\r\n          if (typeof point[0] == 'number' && typeof point[1] == 'number') {\r\n            X.push(point[0]);\r\n            Y.push(point[1]);\r\n          } else {\r\n            return;\r\n          }\r\n        }\r\n      }\r\n\r\n      // Calculating the polynomial regression's parameters\r\n      let params = this.polynomialRegressionService.generateIcpRegressionParams(\r\n        X,\r\n        Y,\r\n        order\r\n      );\r\n\r\n      // Storing the regression's parameters\r\n      params.forEach((param) => {\r\n        this.icpRegressionParams.push(param);\r\n      });\r\n\r\n      // Evaluating the polynomial regression for each corresponding x value in icpPoints\r\n      X.forEach((x_i) => {\r\n        this.icpRegressionPoints.push([\r\n          x_i,\r\n          this.polynomialRegressionService.evaluatePolynomialRegression(\r\n            x_i,\r\n            this.icpRegressionParams\r\n          ),\r\n        ]);\r\n      });\r\n    }\r\n  }\r\n}\r\n","<div class=\"parent\">\r\n  <div *ngIf=\"waveFormChartOption\">\r\n    <div\r\n      echarts\r\n      class=\"child2\"\r\n      [options]=\"waveFormChartOption\"\r\n      (chartInit)=\"onWaveChartInit($event)\"\r\n    ></div>\r\n  </div>\r\n\r\n  <div\r\n    echarts\r\n    class=\"child1\"\r\n    [options]=\"mainChartOption\"\r\n    (chartClick)=\"onDataPointClick($event)\"\r\n    (click)=\"onChartClick($event)\"\r\n    (chartInit)=\"onMainChartInit($event)\"\r\n    (chartDataZoom)=\"onChartDataZoom($event)\"\r\n    (chartRestore)=\"onChartRestore($event)\"\r\n  ></div>\r\n</div>\r\n","import {\r\n  Component,\r\n  Input,\r\n  OnInit,\r\n  OnChanges,\r\n  SimpleChanges,\r\n  EventEmitter,\r\n  Output,\r\n} from '@angular/core';\r\nimport { EChartsOption } from 'echarts';\r\nimport * as styles from '../../styles';\r\nimport {\r\n  handleError,\r\n  handleGetDeviceDataHttpError,\r\n} from '../../utils/error-handler';\r\nimport { ChartImageData } from '../../interfaces/chart-image-data';\r\nimport { ZoomData } from '../../interfaces/zoom-data';\r\nimport {\r\n  onRestoreChartAlarmChange,\r\n  onZoomDataChange,\r\n} from '../../utils/input-changes';\r\nimport { instanceOfHttpError } from '../../interfaces/http-error';\r\nimport { ChartType } from '../../enums/chart-type';\r\nimport { ChartSeriesDataOptions } from '../../interfaces/chart-series-data-options';\r\n\r\n@Component({\r\n  selector: 'lib-generic-chart',\r\n  templateUrl: './generic-chart.component.html',\r\n  styleUrls: ['./generic-chart.component.css'],\r\n})\r\nexport class GenericChartComponent implements OnInit, OnChanges {\r\n  @Input() legendOptions!: Object;\r\n  @Input() yAxisOptions!: Object;\r\n  @Input() otherChartOptions!: Object;\r\n  @Input() chartType!: ChartType;\r\n  @Input() getDataPoints!: () => Promise<ChartSeriesDataOptions>;\r\n\r\n  @Input() generatePdfDataAlarm!: boolean;\r\n  @Input() isDataCollectionRetrieved: boolean | undefined;\r\n  @Input() zoomData: any;\r\n\r\n  /** An alarm received from the main component that this chart should reset its state. The value assigned\r\n   * to this variable is the [ChartType] that set off the alarm */\r\n  @Input() chartRestoreAlarm?: ChartType;\r\n\r\n  /** Sends this chart's pdf data, which captures the chart's instance at the moment as an image, to the parent\r\n   * component */\r\n  @Output() chartImageData = new EventEmitter<ChartImageData>();\r\n\r\n  /** A signal to alert the other charts to reset their state */\r\n  @Output() chartRestoreEvent = new EventEmitter<ChartType>();\r\n\r\n  /** Exports the relevant zoom-event data to the parent component */\r\n  @Output() zoomDataEvent = new EventEmitter<ZoomData>();\r\n\r\n  eChartsOption: EChartsOption = {};\r\n  chartInstance?: echarts.ECharts;\r\n\r\n  ngOnInit(): void {\r\n    this.legendOptions = this.legendOptions ? this.legendOptions : {};\r\n\r\n    this.yAxisOptions = this.yAxisOptions ? this.yAxisOptions : {};\r\n\r\n    if (!Object.keys(this.yAxisOptions).includes('axisLabel'))\r\n      Object.assign(this.yAxisOptions, { axisLabel: {} });\r\n    Object.assign(this.yAxisOptions['axisLabel'], {\r\n      width: 90,\r\n      overflow: 'truncate',\r\n    });\r\n\r\n    this.otherChartOptions = this.otherChartOptions\r\n      ? this.otherChartOptions\r\n      : {};\r\n    this.updateChartOption({\r\n      seriesData: [],\r\n      minDate: undefined,\r\n      maxDate: undefined,\r\n    });\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['generatePdfDataAlarm']) {\r\n      this.generatePdfDataAlarm = changes['generatePdfDataAlarm'].currentValue;\r\n\r\n      if (this.generatePdfDataAlarm && this.chartInstance) {\r\n        // Emitting the current instance of this chart as a png image. Setting the pixel ratio as 2\r\n        // drastically imporves the image's resolution\r\n        this.chartImageData.emit({\r\n          chartType: this.chartType,\r\n          chartDataUrl: this.chartInstance.getDataURL({\r\n            type: 'png',\r\n            excludeComponents: ['toolbox', 'dataZoom'],\r\n          }),\r\n        });\r\n      }\r\n    }\r\n\r\n    // Updating this chart's dataset whenever the dataCollectionTable inside the galenDataService\r\n    // has been updated\r\n    if (changes['isDataCollectionRetrieved']) {\r\n      this.isDataCollectionRetrieved =\r\n        changes['isDataCollectionRetrieved'].currentValue;\r\n      this.loadData();\r\n    }\r\n\r\n    // Updating the zoom-level of this chart to match the icp-trend-chart component's zoom level\r\n    if (changes['zoomData']) {\r\n      this.zoomData = changes['zoomData'].currentValue;\r\n      if (this.zoomData && this.chartInstance) {\r\n        onZoomDataChange(this.chartInstance, this.zoomData);\r\n      }\r\n    }\r\n\r\n    if (changes['chartRestoreAlarm'] && this.chartInstance) {\r\n      onRestoreChartAlarmChange(\r\n        this.chartInstance,\r\n        this.chartType,\r\n        changes['chartRestoreAlarm']\r\n      );\r\n    }\r\n  }\r\n\r\n  onChartInit(ec: any) {\r\n    this.chartInstance = ec;\r\n    if (this.chartInstance) this.chartInstance.group = 'Chart'; // Grouping this component as a 'Chart'\r\n    this.loadData();\r\n  }\r\n\r\n  onChartDataZoom(ec: any) {\r\n    if (this.chartInstance) {\r\n      // Extracting the relevant zoom data from the event and then emitting it\r\n      let zoomData: ZoomData = {\r\n        type: ec.type,\r\n        start: ec.start,\r\n        end: ec.end,\r\n        dataZoomId: ec.dataZoomId,\r\n      };\r\n      let trueZoomData = this.chartInstance.getOption()['dataZoom'] as any;\r\n      trueZoomData = trueZoomData[0];\r\n      if (trueZoomData) {\r\n        this.zoomDataEvent.emit({\r\n          type: zoomData.type,\r\n          start: trueZoomData.start,\r\n          end: trueZoomData.end,\r\n          dataZoomId: zoomData.dataZoomId,\r\n        });\r\n      }\r\n    }\r\n  }\r\n\r\n  onChartRestore(ec: any) {\r\n    if ('from' in ec) this.chartRestoreEvent.emit(this.chartType);\r\n  }\r\n\r\n  loadData() {\r\n    if (this.chartInstance) {\r\n      if (this.isDataCollectionRetrieved == undefined) {\r\n        this.chartInstance.showLoading();\r\n      } else {\r\n        if (this.isDataCollectionRetrieved) {\r\n          this.getDataPoints()\r\n            .then((chartOpts) => {\r\n              this.chartInstance?.clear();\r\n              this.chartInstance?.hideLoading();\r\n              this.updateChartOption(chartOpts);\r\n              this.chartInstance?.setOption(this.eChartsOption);\r\n            })\r\n            .catch((err) => {\r\n              if (this.chartInstance) {\r\n                if (instanceOfHttpError(err))\r\n                  handleGetDeviceDataHttpError(\r\n                    this.chartInstance,\r\n                    err,\r\n                    this.chartType\r\n                  );\r\n                else\r\n                  handleError(this.chartInstance, `${this.chartType}: ${err}`);\r\n              }\r\n            });\r\n        } else {\r\n          handleError(this.chartInstance, `${this.chartType}: No data found`);\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  private updateChartOption(chartSeriesDataOptions: ChartSeriesDataOptions) {\r\n    this.eChartsOption = {\r\n      title: {\r\n        textStyle: {\r\n          fontFamily: styles.FONT_FAMILY,\r\n          fontSize: 22,\r\n        },\r\n        left: 'center',\r\n        text: this.chartType,\r\n      },\r\n      legend: {\r\n        left: 'center',\r\n        top: '6.5%',\r\n        orient: 'horizontal',\r\n        ...this.legendOptions,\r\n      },\r\n      dataZoom: [\r\n        {\r\n          type: 'slider',\r\n          xAxisIndex: [0],\r\n          filterMode: 'none',\r\n        },\r\n        {\r\n          type: 'slider',\r\n          yAxisIndex: [0],\r\n          filterMode: 'none',\r\n          right: '5.75%',\r\n        },\r\n      ],\r\n      toolbox: {\r\n        show: true,\r\n        feature: {\r\n          dataZoom: {\r\n            yAxisIndex: 'none',\r\n          },\r\n          restore: {},\r\n        },\r\n      },\r\n      xAxis: {\r\n        nameLocation: 'middle',\r\n        nameTextStyle: {\r\n          color: styles.KITEA_GRAY,\r\n          fontFamily: styles.FONT_FAMILY,\r\n          align: 'center',\r\n          verticalAlign: 'bottom',\r\n          fontSize: 16,\r\n        },\r\n        splitLine: {\r\n          show: this.chartType == ChartType.Symptoms ? false : true,\r\n        },\r\n        nameGap: 50,\r\n        type: 'time',\r\n        name: 'Time',\r\n        min: chartSeriesDataOptions.minDate,\r\n        max: chartSeriesDataOptions.maxDate,\r\n      },\r\n      yAxis: this.yAxisOptions,\r\n      series: chartSeriesDataOptions.seriesData,\r\n      ...this.otherChartOptions,\r\n    };\r\n  }\r\n}\r\n","<div\r\n  echarts\r\n  [options]=\"eChartsOption\"\r\n  (chartInit)=\"onChartInit($event)\"\r\n  (chartDataZoom)=\"onChartDataZoom($event)\"\r\n  (chartRestore)=\"onChartRestore($event)\"\r\n></div>\r\n","import {\r\n  Component,\r\n  OnChanges,\r\n  EventEmitter,\r\n  Input,\r\n  Output,\r\n  inject,\r\n  SimpleChanges,\r\n} from '@angular/core';\r\nimport * as styles from '../../styles';\r\nimport { removeNullElements } from '../../utils/array-utils';\r\nimport { GalenChartDataPoint } from '../../interfaces/galen-chart-data-point';\r\nimport { ChartType } from '../../enums/chart-type';\r\nimport { ChartSeriesDataOptions } from '../../interfaces/chart-series-data-options';\r\nimport { ChartImageData } from '../../interfaces/chart-image-data';\r\nimport { ZoomData } from '../../interfaces/zoom-data';\r\nimport { GalenDataService } from '../../services/galen-data/galen-data.service';\r\n\r\n@Component({\r\n  selector: 'lib-symptoms-bubble-chart',\r\n  templateUrl: './symptoms-bubble-chart.component.html',\r\n  styleUrls: ['./symptoms-bubble-chart.component.css'],\r\n})\r\nexport class SymptomsBubbleChartComponent implements OnChanges {\r\n  @Input() generatePdfDataAlarm!: boolean;\r\n  @Input() isDataCollectionRetrieved: boolean | undefined;\r\n  @Input() zoomData: any;\r\n  @Input() restoreChartAlarm?: ChartType;\r\n\r\n  @Output() chartImageData = new EventEmitter<ChartImageData>();\r\n  @Output() restoreChartEvent = new EventEmitter<ChartType>();\r\n  @Output() zoomDataEvent = new EventEmitter<ZoomData>();\r\n\r\n  chartType: ChartType = ChartType.Symptoms;\r\n  seriesData: any[] = [];\r\n  legendOptions = {\r\n    type: 'scroll',\r\n    width: '80%',\r\n  };\r\n  yAxisOptions = {\r\n    type: 'category',\r\n    splitLine: {\r\n      show: true,\r\n    },\r\n  };\r\n\r\n  private galenDataService: GalenDataService = inject(GalenDataService);\r\n\r\n  getDataPoints = (): Promise<ChartSeriesDataOptions> => {\r\n    return new Promise((resolve, reject) => {\r\n      this.galenDataService\r\n        .getSymptomPoints()\r\n        .then((pts) => {\r\n          let symptomPoints: Map<string, GalenChartDataPoint[]> = pts.data;\r\n\r\n          /**\r\n           * The data to be plotted on the bubble chart. Each entry in this array should be a\r\n           * echarts series-scatter object (https://echarts.apache.org/en/option.html#series-scatter)\r\n           * representing the set of bubbles for a given category (in this case, symptom)\r\n           */\r\n          let seriesData: any[] = [];\r\n\r\n          // Removing any data points that have any value as undefined\r\n          let newSymptomPts = new Map<string, GalenChartDataPoint[]>();\r\n          symptomPoints.forEach((value: GalenChartDataPoint[], key: string) => {\r\n            newSymptomPts.set(\r\n              key,\r\n              removeNullElements(value, (i) => {\r\n                let pt = value[i];\r\n                return pt.value;\r\n              })\r\n            );\r\n          });\r\n          symptomPoints = newSymptomPts;\r\n\r\n          // 'key' represents a user's symptom, 'value' is a 2D array representing the set of points for the\r\n          // corresponding symptom\r\n          symptomPoints.forEach((value: GalenChartDataPoint[], key: string) => {\r\n            if (value.length > 0) {\r\n              let color = styles.getSymptomRGB(key);\r\n              seriesData.push({\r\n                name: key,\r\n                data: value,\r\n                type: 'scatter',\r\n                symbolSize: function (data: any[]) {\r\n                  return Math.pow(data[2] * 1.7, 0.8) * 5; // diameter = (1.7*severity)^0.8 * 5\r\n                },\r\n                emphasis: {\r\n                  focus: 'series',\r\n                  label: {\r\n                    show: true,\r\n                    formatter: function (param: any) {\r\n                      // Show the severity value of a bubble when hovering over it\r\n                      return param.data.value[2];\r\n                    },\r\n                    position: 'top',\r\n                  },\r\n                },\r\n                itemStyle: {\r\n                  color: color,\r\n                },\r\n              });\r\n            }\r\n          });\r\n\r\n          resolve({\r\n            seriesData: seriesData,\r\n            minDate: pts.minDate,\r\n            maxDate: pts.maxDate,\r\n          });\r\n        })\r\n        .catch((err) => reject(err));\r\n    });\r\n  };\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['generatePdfDataAlarm'])\r\n      this.generatePdfDataAlarm = changes['generatePdfDataAlarm'].currentValue;\r\n    if (changes['isDataCollectionRetrieved'])\r\n      this.isDataCollectionRetrieved =\r\n        changes['isDataCollectionRetrieved'].currentValue;\r\n    if (changes['zoomData']) this.zoomData = changes['zoomData'].currentValue;\r\n    if (changes['restoreChartAlarm'])\r\n      this.restoreChartAlarm = changes['restoreChartAlarm'].currentValue;\r\n  }\r\n\r\n  onChartImageData(chartImageData: ChartImageData) {\r\n    this.chartImageData.emit(chartImageData);\r\n  }\r\n\r\n  onRestoreChartEvent(ec: any) {\r\n    this.restoreChartEvent.emit(ec);\r\n  }\r\n\r\n  onZoomDataEvent(zoomData: ZoomData) {\r\n    this.zoomDataEvent.emit(zoomData);\r\n  }\r\n}\r\n","<lib-generic-chart\r\n  id=\"symptoms-bubble-chart\"\r\n  [chartType]=\"chartType\"\r\n  [legendOptions]=\"legendOptions\"\r\n  [yAxisOptions]=\"yAxisOptions\"\r\n  [getDataPoints]=\"getDataPoints\"\r\n  [generatePdfDataAlarm]=\"generatePdfDataAlarm\"\r\n  [isDataCollectionRetrieved]=\"isDataCollectionRetrieved\"\r\n  [zoomData]=\"zoomData\"\r\n  [chartRestoreAlarm]=\"restoreChartAlarm\"\r\n  (chartImageData)=\"onChartImageData($event)\"\r\n  (chartRestoreEvent)=\"onRestoreChartEvent($event)\"\r\n  (zoomDataEvent)=\"onZoomDataEvent($event)\"\r\n></lib-generic-chart>\r\n","import {\r\n  Component,\r\n  OnChanges,\r\n  EventEmitter,\r\n  Input,\r\n  Output,\r\n  inject,\r\n  SimpleChanges,\r\n} from '@angular/core';\r\nimport { GalenChartDataPoint } from '../../interfaces/galen-chart-data-point';\r\nimport { removeNullElements } from '../../utils/array-utils';\r\nimport * as styles from '../../styles';\r\nimport { ChartType } from '../../enums/chart-type';\r\nimport { ChartImageData } from '../../interfaces/chart-image-data';\r\nimport { ZoomData } from '../../interfaces/zoom-data';\r\nimport { ChartSeriesDataOptions } from '../../interfaces/chart-series-data-options';\r\nimport { GalenDataService } from '../../services/galen-data/galen-data.service';\r\n\r\n@Component({\r\n  selector: 'lib-blood-pressure-line-chart',\r\n  templateUrl: './blood-pressure-line-chart.component.html',\r\n  styleUrls: ['./blood-pressure-line-chart.component.css'],\r\n})\r\nexport class BloodPressureLineChartComponent implements OnChanges {\r\n  @Input() generatePdfDataAlarm!: boolean;\r\n  @Input() isDataCollectionRetrieved: boolean | undefined;\r\n  @Input() zoomData: any;\r\n  @Input() restoreChartAlarm?: ChartType;\r\n\r\n  @Output() chartImageData = new EventEmitter<ChartImageData>();\r\n  @Output() restoreChartEvent = new EventEmitter<ChartType>();\r\n  @Output() zoomDataEvent = new EventEmitter<ZoomData>();\r\n\r\n  chartType: ChartType = ChartType.BloodPressure;\r\n  seriesData: any[] = [];\r\n  legendOptions = {\r\n    data: [{ name: 'Systolic' }, { name: 'Diastolic' }],\r\n    itemHeight: 0,\r\n  };\r\n  yAxisOptions = {\r\n    nameLocation: 'middle',\r\n    nameRotate: 90,\r\n    nameTextStyle: {\r\n      color: styles.KITEA_GRAY,\r\n      fontFamily: styles.FONT_FAMILY,\r\n      verticalAlign: 'bottom',\r\n      fontSize: 16,\r\n    },\r\n    nameGap: 40,\r\n    type: 'value',\r\n    name: 'mmHg',\r\n    splitLine: {\r\n      show: true,\r\n    },\r\n  };\r\n\r\n  private galenDataService: GalenDataService = inject(GalenDataService);\r\n\r\n  getDataPoints = (): Promise<ChartSeriesDataOptions> => {\r\n    return new Promise((resolve, reject) => {\r\n      let bpData = this.galenDataService.getBloodPressurePoints();\r\n      let sysData = bpData.data.get('systolic') as GalenChartDataPoint[];\r\n      let diaData = bpData.data.get('diastolic') as GalenChartDataPoint[];\r\n\r\n      sysData = removeNullElements(sysData, (i) => {\r\n        return sysData[i].value;\r\n      });\r\n      diaData = removeNullElements(diaData, (i) => {\r\n        return diaData[i].value;\r\n      });\r\n\r\n      resolve({\r\n        seriesData: [\r\n          {\r\n            name: 'Systolic',\r\n            type: 'line',\r\n            data: sysData,\r\n            symbolSize: 6,\r\n            emphasis: {\r\n              label: {\r\n                show: true,\r\n                position: 'top',\r\n              },\r\n            },\r\n            lineStyle: {\r\n              color: 'rgb(255, 123, 0)',\r\n            },\r\n          },\r\n          {\r\n            name: 'Diastolic',\r\n            type: 'line',\r\n            data: diaData,\r\n            symbolSize: 6,\r\n            emphasis: {\r\n              label: {\r\n                show: true,\r\n                position: 'top',\r\n              },\r\n            },\r\n            lineStyle: {\r\n              color: 'rgb(0, 0, 255)',\r\n            },\r\n          },\r\n        ],\r\n        minDate: bpData.minDate,\r\n        maxDate: bpData.maxDate,\r\n      });\r\n    });\r\n  };\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['generatePdfDataAlarm'])\r\n      this.generatePdfDataAlarm = changes['generatePdfDataAlarm'].currentValue;\r\n    if (changes['isDataCollectionRetrieved'])\r\n      this.isDataCollectionRetrieved =\r\n        changes['isDataCollectionRetrieved'].currentValue;\r\n    if (changes['zoomData']) this.zoomData = changes['zoomData'].currentValue;\r\n    if (changes['restoreChartAlarm'])\r\n      this.restoreChartAlarm = changes['restoreChartAlarm'].currentValue;\r\n  }\r\n\r\n  onChartImageData(chartImageData: ChartImageData) {\r\n    this.chartImageData.emit(chartImageData);\r\n  }\r\n\r\n  onRestoreChartEvent(ec: any) {\r\n    this.restoreChartEvent.emit(ec);\r\n  }\r\n\r\n  onZoomDataEvent(zoomData: ZoomData) {\r\n    this.zoomDataEvent.emit(zoomData);\r\n  }\r\n}\r\n","<lib-generic-chart\r\n  id=\"blood-pressure-chart\"\r\n  [chartType]=\"chartType\"\r\n  [legendOptions]=\"legendOptions\"\r\n  [yAxisOptions]=\"yAxisOptions\"\r\n  [getDataPoints]=\"getDataPoints\"\r\n  [generatePdfDataAlarm]=\"generatePdfDataAlarm\"\r\n  [isDataCollectionRetrieved]=\"isDataCollectionRetrieved\"\r\n  [zoomData]=\"zoomData\"\r\n  [chartRestoreAlarm]=\"restoreChartAlarm\"\r\n  (chartImageData)=\"onChartImageData($event)\"\r\n  (chartRestoreEvent)=\"onRestoreChartEvent($event)\"\r\n  (zoomDataEvent)=\"onZoomDataEvent($event)\"\r\n></lib-generic-chart>\r\n\r\n","import {\r\n  Component,\r\n  EventEmitter,\r\n  Input,\r\n  OnChanges,\r\n  OnInit,\r\n  Output,\r\n  SimpleChanges,\r\n  inject,\r\n} from '@angular/core';\r\nimport * as styles from '../../styles';\r\nimport { ChartType } from '../../enums/chart-type';\r\nimport { GalenDataService } from '../../services/galen-data/galen-data.service';\r\nimport { ChartSeriesDataOptions } from '../../interfaces/chart-series-data-options';\r\nimport { ChartImageData } from '../../interfaces/chart-image-data';\r\nimport { ZoomData } from '../../interfaces/zoom-data';\r\n\r\n@Component({\r\n  selector: 'lib-body-temperature-line-chart',\r\n  templateUrl: './body-temperature-line-chart.component.html',\r\n  styleUrls: ['./body-temperature-line-chart.component.css'],\r\n})\r\nexport class BodyTemperatureLineChartComponent implements OnChanges {\r\n  @Input() generatePdfDataAlarm!: boolean;\r\n  @Input() isDataCollectionRetrieved: boolean | undefined;\r\n  @Input() zoomData: any;\r\n  @Input() restoreChartAlarm?: ChartType;\r\n\r\n  @Output() chartImageData = new EventEmitter<ChartImageData>();\r\n  @Output() restoreChartEvent = new EventEmitter<ChartType>();\r\n  @Output() zoomDataEvent = new EventEmitter<ZoomData>();\r\n\r\n  chartType: ChartType = ChartType.BodyTemperature;\r\n  seriesData: any[] = [];\r\n  legendOptions = {\r\n    data: [{ name: 'Temperature' }],\r\n    itemHeight: 0,\r\n  };\r\n  yAxisOptions = {\r\n    nameLocation: 'middle',\r\n    nameRotate: 90,\r\n    nameTextStyle: {\r\n      color: styles.KITEA_GRAY,\r\n      fontFamily: styles.FONT_FAMILY,\r\n      verticalAlign: 'bottom',\r\n      fontSize: 16,\r\n    },\r\n    nameGap: 40,\r\n    type: 'value',\r\n    name: 'Temperature (Celsius)',\r\n    min: function (value: { min: number }) {\r\n      return value.min >= 6 ? value.min - 6 : value.min < 0 ? value.min : 0;\r\n    },\r\n    max: function (value: { max: number }) {\r\n      return value.max + 6;\r\n    },\r\n  };\r\n\r\n  private galenDataService: GalenDataService = inject(GalenDataService);\r\n\r\n  getDataPoints = (): Promise<ChartSeriesDataOptions> => {\r\n    return new Promise((resolve, reject) => {\r\n      let btData = this.galenDataService.getBodyTemperaturePoints();\r\n      resolve({\r\n        seriesData: [\r\n          {\r\n            name: 'Temperature',\r\n            type: 'line',\r\n            data: btData.dataPoints,\r\n            symbolSize: 6,\r\n            lineStyle: {\r\n              color: 'rgb(255, 0, 0)',\r\n            },\r\n            emphasis: {\r\n              label: {\r\n                show: true,\r\n                position: 'top',\r\n              },\r\n            },\r\n          },\r\n        ],\r\n        minDate: btData.minXValue,\r\n        maxDate: btData.maxXValue,\r\n      });\r\n    });\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['generatePdfDataAlarm'])\r\n      this.generatePdfDataAlarm = changes['generatePdfDataAlarm'].currentValue;\r\n    if (changes['isDataCollectionRetrieved'])\r\n      this.isDataCollectionRetrieved =\r\n        changes['isDataCollectionRetrieved'].currentValue;\r\n    if (changes['zoomData'])\r\n      this.zoomData = changes['zoomData'].currentValue;\r\n    if (changes['restoreChartAlarm'])\r\n      this.restoreChartAlarm = changes['restoreChartAlarm'].currentValue;\r\n  }\r\n\r\n  onChartImageData(chartImageData: ChartImageData) {\r\n    this.chartImageData.emit(chartImageData);\r\n  }\r\n\r\n  onRestoreChartEvent(ec: any) {\r\n    this.restoreChartEvent.emit(ec);\r\n  }\r\n\r\n  onZoomDataEvent(zoomData: ZoomData) {\r\n    this.zoomDataEvent.emit(zoomData);\r\n  }\r\n}\r\n","<lib-generic-chart\r\n  id=\"body-temperature-chart\"\r\n  [chartType]=\"chartType\"\r\n  [legendOptions]=\"legendOptions\"\r\n  [yAxisOptions]=\"yAxisOptions\"\r\n  [getDataPoints]=\"getDataPoints\"\r\n  [generatePdfDataAlarm]=\"generatePdfDataAlarm\"\r\n  [isDataCollectionRetrieved]=\"isDataCollectionRetrieved\"\r\n  [zoomData]=\"zoomData\"\r\n  [chartRestoreAlarm]=\"restoreChartAlarm\"\r\n  (chartImageData)=\"onChartImageData($event)\"\r\n  (chartRestoreEvent)=\"onRestoreChartEvent($event)\"\r\n  (zoomDataEvent)=\"onZoomDataEvent($event)\"\r\n></lib-generic-chart>\r\n","import {\r\n  Component,\r\n  OnInit,\r\n  OnChanges,\r\n  EventEmitter,\r\n  Input,\r\n  Output,\r\n  inject,\r\n  SimpleChanges,\r\n} from '@angular/core';\r\nimport * as styles from '../../styles';\r\nimport { GalenChartDataPoint } from '../../interfaces/galen-chart-data-point';\r\nimport { removeNullElements } from '../../utils/array-utils';\r\nimport { ChartType } from '../../enums/chart-type';\r\nimport { ChartImageData } from '../../interfaces/chart-image-data';\r\nimport { ZoomData } from '../../interfaces/zoom-data';\r\nimport { GalenDataService } from '../../services/galen-data/galen-data.service';\r\nimport { ChartSeriesDataOptions } from '../../interfaces/chart-series-data-options';\r\n\r\nconst FEELING_LOOKUP_TABLE = {\r\n  poor: 1,\r\n  fair: 2,\r\n  good: 3,\r\n  excellent: 4,\r\n};\r\n\r\n@Component({\r\n  selector: 'lib-feeling-rating-line-chart',\r\n  templateUrl: './feeling-rating-line-chart.component.html',\r\n  styleUrls: ['./feeling-rating-line-chart.component.css'],\r\n})\r\nexport class FeelingRatingLineChartComponent implements OnChanges {\r\n  @Input() generatePdfDataAlarm!: boolean;\r\n  @Input() isDataCollectionRetrieved: boolean | undefined;\r\n  @Input() zoomData: any;\r\n  @Input() restoreChartAlarm?: ChartType;\r\n\r\n  @Output() chartImageData = new EventEmitter<ChartImageData>();\r\n  @Output() restoreChartEvent = new EventEmitter<ChartType>();\r\n  @Output() zoomDataEvent = new EventEmitter<ZoomData>();\r\n\r\n  chartType: ChartType = ChartType.FeelingRating;\r\n  seriesData: any[] = [];\r\n  legendOptions = {\r\n    itemHeight: 0,\r\n  }\r\n  yAxisOptions = {\r\n    nameLocation: 'middle',\r\n    nameRotate: 90,\r\n    nameTextStyle: {\r\n      color: styles.KITEA_GRAY,\r\n      fontFamily: styles.FONT_FAMILY,\r\n      verticalAlign: 'bottom',\r\n      fontSize: 16,\r\n    },\r\n    nameGap: 30,\r\n    type: 'value',\r\n    name: '1 = Poor\\n4 = Excellent',\r\n  };\r\n\r\n  private galenDataService: GalenDataService = inject(GalenDataService);\r\n\r\n  getDataPoints = (): Promise<ChartSeriesDataOptions> => {\r\n    return new Promise((resolve, reject) => {\r\n      let frPts = this.galenDataService.getFeelingRatingPoints();\r\n      let pts = frPts.dataPoints;\r\n      let feelingRatingPoints: GalenChartDataPoint[] = [];\r\n\r\n      // Removing all points with null values\r\n      pts = removeNullElements(pts, (i) => {\r\n        return pts[i].value;\r\n      });\r\n\r\n      // Assigning numerical values to the categorical data\r\n      pts.forEach((pt) => {\r\n        if (pt.value.length >= 2) {\r\n          let feelingDesc = pt.value[1].toLowerCase().trim();\r\n          if (Object.keys(FEELING_LOOKUP_TABLE).includes(feelingDesc)) {\r\n            feelingRatingPoints.push({\r\n              name: pt.name,\r\n              value: [\r\n                pt.value[0],\r\n                FEELING_LOOKUP_TABLE[\r\n                  feelingDesc as 'poor' | 'fair' | 'good' | 'excellent'\r\n                ],\r\n              ],\r\n            });\r\n          }\r\n        }\r\n      });\r\n\r\n      resolve({\r\n        seriesData: [\r\n          {\r\n            name: 'Feeling Rating',\r\n            type: 'line',\r\n            data: feelingRatingPoints,\r\n            symbolSize: 6,\r\n            emphasis: {\r\n              label: {\r\n                show: true,\r\n                position: 'top',\r\n              },\r\n            },\r\n          },\r\n        ],\r\n        minDate: frPts.minXValue,\r\n        maxDate: frPts.maxXValue,\r\n      });\r\n    });\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['generatePdfDataAlarm'])\r\n      this.generatePdfDataAlarm = changes['generatePdfDataAlarm'].currentValue;\r\n    if (changes['isDataCollectionRetrieved'])\r\n      this.isDataCollectionRetrieved =\r\n        changes['isDataCollectionRetrieved'].currentValue;\r\n    if (changes['zoomData']) this.zoomData = changes['zoomData'].currentValue;\r\n    if (changes['restoreChartAlarm'])\r\n      this.restoreChartAlarm = changes['restoreChartAlarm'].currentValue;\r\n  }\r\n\r\n  onChartImageData(chartImageData: ChartImageData) {\r\n    this.chartImageData.emit(chartImageData);\r\n  }\r\n\r\n  onRestoreChartEvent(ec: any) {\r\n    this.restoreChartEvent.emit(ec);\r\n  }\r\n\r\n  onZoomDataEvent(zoomData: ZoomData) {\r\n    this.zoomDataEvent.emit(zoomData);\r\n  }\r\n}\r\n","<lib-generic-chart\r\n  id=\"feeling-rating-chart\"\r\n  [chartType]=\"chartType\"\r\n  [legendOptions]=\"legendOptions\"\r\n  [yAxisOptions]=\"yAxisOptions\"\r\n  [getDataPoints]=\"getDataPoints\"\r\n  [generatePdfDataAlarm]=\"generatePdfDataAlarm\"\r\n  [isDataCollectionRetrieved]=\"isDataCollectionRetrieved\"\r\n  [zoomData]=\"zoomData\"\r\n  [chartRestoreAlarm]=\"restoreChartAlarm\"\r\n  (chartImageData)=\"onChartImageData($event)\"\r\n  (chartRestoreEvent)=\"onRestoreChartEvent($event)\"\r\n  (zoomDataEvent)=\"onZoomDataEvent($event)\"\r\n></lib-generic-chart>\r\n\r\n","import {\r\n  Component,\r\n  EventEmitter,\r\n  inject,\r\n  Input,\r\n  Output,\r\n  SimpleChanges,\r\n} from '@angular/core';\r\nimport { ChartType } from '../../enums/chart-type';\r\nimport { ChartImageData } from '../../interfaces/chart-image-data';\r\nimport { ChartSeriesDataOptions } from '../../interfaces/chart-series-data-options';\r\nimport { ZoomData } from '../../interfaces/zoom-data';\r\nimport { GalenDataService } from '../../services/galen-data/galen-data.service';\r\nimport * as styles from '../../styles';\r\nimport { GalenChartDataPoint } from '../../interfaces/galen-chart-data-point';\r\nimport { removeNullElements } from '../../utils/array-utils';\r\n\r\n@Component({\r\n  selector: 'lib-patient-position-chart',\r\n  templateUrl: './patient-position-chart.component.html',\r\n  styleUrls: ['./patient-position-chart.component.css'],\r\n})\r\nexport class PatientPositionChartComponent {\r\n  @Input() generatePdfDataAlarm!: boolean;\r\n  @Input() isDataCollectionRetrieved: boolean | undefined;\r\n  @Input() zoomData: any;\r\n  @Input() restoreChartAlarm?: ChartType;\r\n\r\n  @Output() chartImageData = new EventEmitter<ChartImageData>();\r\n  @Output() restoreChartEvent = new EventEmitter<ChartType>();\r\n  @Output() zoomDataEvent = new EventEmitter<ZoomData>();\r\n\r\n  chartType: ChartType = ChartType.PatientPosition;\r\n  seriesData: any[] = [];\r\n  legendOptions = {\r\n    itemHeight: 0,\r\n  };\r\n  yAxisOptions = {\r\n    type: 'category',\r\n    data: ['Lying down', 'Sitting down', 'Standing up'],\r\n    splitLine: {\r\n      show: true,\r\n    },\r\n  };\r\n\r\n  private galenDataService: GalenDataService = inject(GalenDataService);\r\n\r\n  getDataPoints = (): Promise<ChartSeriesDataOptions> => {\r\n    return new Promise((resolve, reject) => {\r\n      let ppPos = this.galenDataService.getPatientPositionPoints();\r\n      let pts = ppPos.dataPoints;\r\n\r\n      // Removing all points with null values\r\n      pts = removeNullElements(pts, (i) => {\r\n        return pts[i].value;\r\n      });\r\n\r\n      resolve({\r\n        seriesData: [\r\n          {\r\n            name: 'Patient Position',\r\n            type: 'line',\r\n            data: pts,\r\n            symbolSize: 6,\r\n            lineStyle: {\r\n              color: 'rgb(128,0,128)',\r\n            },\r\n            emphasis: {\r\n              focus: 'series',\r\n              label: {\r\n                show: true,\r\n                formatter: function (param: any) {\r\n                  // Show the severity value of a bubble when hovering over it\r\n                  return param.data.value[1];\r\n                },\r\n                position: 'top',\r\n              },\r\n            },\r\n          },\r\n        ],\r\n        minDate: ppPos.minXValue,\r\n        maxDate: ppPos.maxXValue,\r\n      });\r\n    });\r\n  };\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['generatePdfDataAlarm'])\r\n      this.generatePdfDataAlarm = changes['generatePdfDataAlarm'].currentValue;\r\n    if (changes['isDataCollectionRetrieved'])\r\n      this.isDataCollectionRetrieved =\r\n        changes['isDataCollectionRetrieved'].currentValue;\r\n    if (changes['zoomData']) this.zoomData = changes['zoomData'].currentValue;\r\n    if (changes['restoreChartAlarm'])\r\n      this.restoreChartAlarm = changes['restoreChartAlarm'].currentValue;\r\n  }\r\n\r\n  onChartImageData(chartImageData: ChartImageData) {\r\n    this.chartImageData.emit(chartImageData);\r\n  }\r\n\r\n  onRestoreChartEvent(ec: any) {\r\n    this.restoreChartEvent.emit(ec);\r\n  }\r\n\r\n  onZoomDataEvent(zoomData: ZoomData) {\r\n    this.zoomDataEvent.emit(zoomData);\r\n  }\r\n}\r\n","<lib-generic-chart\r\n  id=\"patient-position-chart\"\r\n  [chartType]=\"chartType\"\r\n  [legendOptions]=\"legendOptions\"\r\n  [yAxisOptions]=\"yAxisOptions\"\r\n  [getDataPoints]=\"getDataPoints\"\r\n  [generatePdfDataAlarm]=\"generatePdfDataAlarm\"\r\n  [isDataCollectionRetrieved]=\"isDataCollectionRetrieved\"\r\n  [zoomData]=\"zoomData\"\r\n  [chartRestoreAlarm]=\"restoreChartAlarm\"\r\n  (chartImageData)=\"onChartImageData($event)\"\r\n  (chartRestoreEvent)=\"onRestoreChartEvent($event)\"\r\n  (zoomDataEvent)=\"onZoomDataEvent($event)\"\r\n></lib-generic-chart>","import { ChartImageData } from './interfaces/chart-image-data';\r\nimport {\r\n  Component,\r\n  Input,\r\n  OnChanges,\r\n  SimpleChanges,\r\n  inject,\r\n} from '@angular/core';\r\nimport { GenericComponentInputs } from './interfaces/generic-component-inputs';\r\nimport jsPDF from 'jspdf';\r\nimport { ZoomData } from './interfaces/zoom-data';\r\nimport { GalenDataService } from './services/galen-data/galen-data.service';\r\nimport { GalenUser } from './models/galen-user';\r\nimport { PatientInfo } from './models/patient-info';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { ChartType } from '../lib/enums/chart-type';\r\nimport { DataModelType } from './enums/data-model-type';\r\nimport {\r\n  ICP_HK_HEADERS as ICP_HK_HEADERS_MANU,\r\n  ICP_HK_HEADERS_TO_PROP as ICP_HK_HEADERS_TO_PROP_MANU,\r\n} from './constants';\r\nimport { convertToCsv, zipCsvFiles } from './utils/csv-file-helpers';\r\nimport {\r\n  toUsDateString,\r\n  symptomHeaderFormat,\r\n  toISOStringWithTimezone,\r\n} from './utils/string-formatter';\r\nimport { RoleType } from './enums/role-type';\r\nimport { IcpRecord } from './models/icp-record';\r\nimport { getCurrentRole } from './utils/http-response';\r\nimport { ProgressSpinnerMode } from '@angular/material/progress-spinner';\r\nimport { ThemePalette } from '@angular/material/core';\r\nimport { SurgeryDetails } from './models/surgery-details';\r\nimport {\r\n  sortTableColumns,\r\n  splitTableColumnsByMonth,\r\n} from './utils/table-utils';\r\nimport { removeElement } from './utils/array-utils';\r\n\r\n@Component({\r\n  selector: 'lib-kitea-galen-portal',\r\n  templateUrl: './kitea-galen-portal.component.html',\r\n  styleUrls: ['./kitea-galen-portal.component.css'],\r\n})\r\nexport class KiteaGalenPortalComponent implements OnChanges {\r\n  @Input() ownerId!: string;\r\n  @Input() currentUser!: GalenUser;\r\n  @Input() genericComponentInputs!: GenericComponentInputs;\r\n\r\n  http: HttpClient = inject(HttpClient);\r\n\r\n  /** A flag emitted from the icp-trend-chart component\r\n   * for whenever the dataCollection table has been updated inside of the galen data service */\r\n  isDataCollectionRetrieved: boolean | undefined = undefined;\r\n\r\n  /** The relevant zoom data emitted from the icp-trend component */\r\n  zoomData?: ZoomData;\r\n\r\n  /** Stores the relevant chart url data of each chart's image to later display onto the pdf */\r\n  childrenChartPdfData = new Map<ChartType, string>();\r\n\r\n  /** An alarm to send off to all components to emit their corrsponding chartDataUrl so that they\r\n   * can be formatted onto a pdf */\r\n  generatePdfDataAlarm: boolean = false;\r\n\r\n  /** An alarm to notify other components to reset their charts */\r\n  restoreChartAlarm?: ChartType;\r\n\r\n  /** Contains the number of confirmations received from the components that they restored their charts */\r\n  numberOfChartAlarmConfirms = 0;\r\n\r\n  galenDataService: GalenDataService = inject(GalenDataService);\r\n  isOwnerTheCurrentUser: boolean = false;\r\n\r\n  isLoading = false;\r\n  mode: ProgressSpinnerMode = 'indeterminate';\r\n  loadingColor: ThemePalette = 'primary';\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['genericComponentInputs']) {\r\n      this.genericComponentInputs =\r\n        changes['genericComponentInputs'].currentValue;\r\n    }\r\n\r\n    if (changes['ownerId']) {\r\n      this.ownerId = changes['ownerId'].currentValue;\r\n\r\n      // If no ownerId was passed, then we set the ownerId as the userId of whoever is currently logged in\r\n      if (this.ownerId == '') {\r\n        // If the currentUser variable has been initialized, we can set the ownerId accordingly. Else, we need\r\n        // to wait until the currentUser variable gets initialized.\r\n        if (this.currentUser && this.currentUser.userId) {\r\n          this.ownerId = this.currentUser.userId;\r\n        } else {\r\n          this.isOwnerTheCurrentUser = true;\r\n        }\r\n      }\r\n\r\n      this.galenDataService.setOwnerId(this.ownerId);\r\n      this.refreshCharts();\r\n    }\r\n\r\n    if (changes['currentUser']) {\r\n      this.currentUser = changes['currentUser'].currentValue;\r\n\r\n      // If no ownerId was passed, then we set the ownerId as the userId of whoever is currently logged in\r\n      if (this.isOwnerTheCurrentUser && this.currentUser.userId) {\r\n        this.ownerId = this.currentUser.userId;\r\n        this.galenDataService.setOwnerId(this.ownerId);\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Callback for the `@Output dataCollecionRetrievedEvent` from the icp-trend-chart\r\n   * component\r\n   * @param isDataCollectionRetrieved\r\n   */\r\n  onDataCollectionRetrievedEvent(\r\n    isDataCollectionRetrieved: boolean | undefined\r\n  ) {\r\n    this.isDataCollectionRetrieved = isDataCollectionRetrieved;\r\n  }\r\n\r\n  onGeneratePdfClick() {\r\n    this.isLoading = true;\r\n    this.generatePdfDataAlarm = true;\r\n  }\r\n\r\n  onExportToCsv() {\r\n    let getSymptomHeaders = (tableData: Map<string, string[]>) => {\r\n      let uniqueSymptoms: string[] = [\r\n        'headache',\r\n        'nausea',\r\n        'muscle weakness',\r\n        'difficulty focusing eyes',\r\n        'speech cognition problem',\r\n        'fatigue/lethargy',\r\n        'appetite change',\r\n        'urgency to urinate',\r\n        'night sweats',\r\n        'loss of coordination or balance',\r\n        'change in behavior',\r\n        'forgetful',\r\n      ];\r\n\r\n      // Getting all the unique symptoms and sanitizing them\r\n      if (tableData.has('Symptom')) {\r\n        let mySymptoms = Array.from(new Set(tableData.get('Symptom')));\r\n        mySymptoms = mySymptoms.filter((sym) => sym.length != 0);\r\n        mySymptoms.forEach((sym) => {\r\n          sym = sym.toLowerCase();\r\n          if (!uniqueSymptoms.includes(sym)) uniqueSymptoms.push(sym);\r\n        });\r\n      }\r\n\r\n      uniqueSymptoms.forEach((sym, ind) => {\r\n        uniqueSymptoms[ind] = symptomHeaderFormat(sym);\r\n      });\r\n\r\n      return uniqueSymptoms;\r\n    };\r\n\r\n    /**\r\n     * Updates the ISO 8601 date-time strings of the column with `columnName` inside of `table` to be local\r\n     * time based with an offset\r\n     * @param table The table containing the date-time column to update\r\n     * @param columnName The name of the date-time column to update\r\n     * @returns The updated `table`\r\n     */\r\n    let addOffsetToDateTimeCol = (\r\n      table: Map<string, string[]>,\r\n      columnName: string\r\n    ) => {\r\n      if (table.has(columnName)) {\r\n        // Converting the timezone of all the date-times to local time with an offset\r\n        let column = table.get(columnName)!!;\r\n        column.forEach((timestamp, ind) => {\r\n          column[ind] = timestamp\r\n            ? toISOStringWithTimezone(new Date(timestamp))\r\n            : '';\r\n        });\r\n        table.set(columnName, column);\r\n      }\r\n      return table;\r\n    };\r\n\r\n    this.isLoading = true;\r\n    this.galenDataService\r\n      .getMyGalenUserInformation()\r\n      .then(async (value) => {\r\n        let myRoleType = getCurrentRole(value);\r\n        let fileNameToContent: Map<string, string> = new Map();\r\n\r\n        // The total number of CSV files that are generated differ depending on the user's\r\n        // role. For tenantAdmins, we need 4 csvs (and therefore totalRequests should be 4)\r\n        // while all other roles only require 2 CSVs\r\n        let totalRequests = 2;\r\n\r\n        // Keeps track of how many CSVs have been created\r\n        let requestsMade = 0;\r\n\r\n        let postRequestHandling = () => {\r\n          requestsMade += 1;\r\n          if (requestsMade == totalRequests) {\r\n            zipCsvFiles(`kitea-charts-csvs.zip`, fileNameToContent);\r\n            this.isLoading = false;\r\n          }\r\n        };\r\n\r\n        if (\r\n          myRoleType == RoleType.TenantUser ||\r\n          myRoleType == RoleType.TenantAdmin\r\n        ) {\r\n          if (myRoleType == RoleType.TenantAdmin) totalRequests = 4;\r\n\r\n          this.galenDataService\r\n            .joinDataModels(\r\n              this.ownerId,\r\n              ICP_HK_HEADERS_TO_PROP_MANU,\r\n              {\r\n                primaryKeyProp: 'deviceDataId',\r\n                foreignKeyProp: 'HousekeepingRecordId',\r\n              },\r\n              {\r\n                primaryTable: DataModelType.HousekeepingRecord,\r\n                foreignTable: DataModelType.IcpRecord,\r\n              },\r\n              'Time/date',\r\n              undefined,\r\n              {\r\n                primaryTableAttribute: `data.Timestamp.value`,\r\n                foreignTableAttribute: `data.Timestamp.value`,\r\n                sortOrder: 'ASC',\r\n              }\r\n            )\r\n            .then((value) => {\r\n              const timeColName = 'Time/date';\r\n              value.tableData = addOffsetToDateTimeCol(\r\n                value.tableData,\r\n                timeColName\r\n              );\r\n\r\n              // Splitting the table to separate tables by month\r\n              let tables = splitTableColumnsByMonth(\r\n                value.tableData,\r\n                timeColName\r\n              );\r\n              value.tableData.clear();\r\n\r\n              // Creating a csv file for each table\r\n              tables.forEach((table, fileName) => {\r\n                const rowCount = table.get(timeColName)?.length;\r\n                if (rowCount) {\r\n                  let csvData = convertToCsv(\r\n                    rowCount,\r\n                    ICP_HK_HEADERS_MANU,\r\n                    table\r\n                  );\r\n                  fileNameToContent.set(`detailedICP_man/${fileName}`, csvData);\r\n                }\r\n              });\r\n            })\r\n            .catch((err) => {\r\n              // TODO: Display an error message on the portal\r\n              console.error(err);\r\n            })\r\n            .finally(() => {\r\n              postRequestHandling();\r\n            });\r\n\r\n          let trendManHeaders = [\r\n            'Time/date',\r\n            'Body position',\r\n            'Feeling score',\r\n            'Mean ICP Raw',\r\n            'Mean ICP mmHg',\r\n            'Blood pressure',\r\n            'Body temperature',\r\n            'Sensor firmware version',\r\n            'Wand firmware version',\r\n            'Mobile App Version',\r\n            'Notes',\r\n            'Location of headache',\r\n            'Head circumference',\r\n          ];\r\n          let trendManHeadersToProps: Map<\r\n            string,\r\n            { table: 'foreign' | 'primary'; property: string }\r\n          > = new Map([\r\n            [\r\n              trendManHeaders[0],\r\n              {\r\n                table: 'primary',\r\n                property: 'Timestamp',\r\n              },\r\n            ],\r\n            [\r\n              trendManHeaders[1],\r\n              {\r\n                table: 'primary',\r\n                property: 'PatientPosition',\r\n              },\r\n            ],\r\n            [\r\n              trendManHeaders[2],\r\n              {\r\n                table: 'primary',\r\n                property: 'UserFeeling',\r\n              },\r\n            ],\r\n            [\r\n              trendManHeaders[3],\r\n              {\r\n                table: 'primary',\r\n                property: 'MeanIcpRaw',\r\n              },\r\n            ],\r\n            [\r\n              trendManHeaders[4],\r\n              {\r\n                table: 'primary',\r\n                property: 'MeanIcp',\r\n              },\r\n            ],\r\n            [\r\n              trendManHeaders[5],\r\n              {\r\n                table: 'primary',\r\n                property: 'BloodPressure',\r\n              },\r\n            ],\r\n            [\r\n              trendManHeaders[6],\r\n              {\r\n                table: 'primary',\r\n                property: 'BodyTemperature',\r\n              },\r\n            ],\r\n            [\r\n              trendManHeaders[7],\r\n              {\r\n                table: 'primary',\r\n                property: 'ImplantFirmwareVersion',\r\n              },\r\n            ],\r\n            [\r\n              trendManHeaders[8],\r\n              {\r\n                table: 'primary',\r\n                property: 'WandFirmwareVersion',\r\n              },\r\n            ],\r\n            [\r\n              trendManHeaders[9],\r\n              {\r\n                table: 'primary',\r\n                property: 'MobileAppVersion',\r\n              },\r\n            ],\r\n            [\r\n              trendManHeaders[10],\r\n              {\r\n                table: 'primary',\r\n                property: 'Notes',\r\n              },\r\n            ],\r\n            [\r\n              trendManHeaders[11],\r\n              {\r\n                table: 'foreign',\r\n                property: 'LocationOfSymptom',\r\n              },\r\n            ],\r\n            [\r\n              trendManHeaders[12],\r\n              {\r\n                table: 'foreign',\r\n                property: 'HeadCircumferenceCm',\r\n              },\r\n            ],\r\n            [\r\n              'Symptom',\r\n              {\r\n                table: 'foreign',\r\n                property: 'Symptom',\r\n              },\r\n            ],\r\n            [\r\n              'Severity',\r\n              {\r\n                table: 'foreign',\r\n                property: 'Severity',\r\n              },\r\n            ],\r\n            [\r\n              'Data Collection Id',\r\n              {\r\n                table: 'primary',\r\n                property: 'deviceDataId',\r\n              },\r\n            ],\r\n          ]);\r\n\r\n          this.galenDataService\r\n            .joinDataModels(\r\n              this.ownerId,\r\n              trendManHeadersToProps,\r\n              {\r\n                primaryKeyProp: 'deviceDataId',\r\n                foreignKeyProp: 'DataCollectionId',\r\n              },\r\n              {\r\n                primaryTable: DataModelType.DataCollection,\r\n                foreignTable: DataModelType.Symptom,\r\n              },\r\n              'Time/date',\r\n              undefined,\r\n              {\r\n                primaryTableAttribute: `data.Timestamp.value`,\r\n                foreignTableAttribute: `maxValueProvidedOn`,\r\n                sortOrder: 'ASC',\r\n              }\r\n            )\r\n            .then((value) => {\r\n              let headersToCol: Map<string, Array<string>> = new Map();\r\n              let totalRows = 0; // Tracks the total number of rows in headersToCol\r\n\r\n              value.tableData = addOffsetToDateTimeCol(\r\n                value.tableData,\r\n                'Time/date'\r\n              );\r\n\r\n              // Initializing the headers and headerToCol map\r\n              let uniqueSymptoms = getSymptomHeaders(value.tableData);\r\n\r\n              let headers = trendManHeaders.concat(uniqueSymptoms);\r\n              headers.forEach((header) => {\r\n                headersToCol.set(header, []);\r\n              });\r\n\r\n              let locationOfHeadacheColName = 'Location of headache';\r\n              let headCircumferenceColName = 'Head circumference';\r\n\r\n              let bpColName = 'Blood pressure';\r\n              let systolicColName = 'Systolic blood pressure';\r\n              let diastolicColName = 'Diastolic blood pressure';\r\n              headersToCol.set(systolicColName, []);\r\n              headersToCol.set(diastolicColName, []);\r\n\r\n              let currentDataCollectionId: string | undefined = undefined;\r\n              let rowNumber = -1; // Used to track the current row in headerToCol\r\n\r\n              if (value.tableData.has('Data Collection Id')) {\r\n                let dataCollectionIds =\r\n                  value.tableData.get('Data Collection Id')!!;\r\n                dataCollectionIds.forEach((dataColId, ind) => {\r\n                  // A new data collection id was encountered, so we move on to the next\r\n                  // row in headersToCol\r\n                  if (\r\n                    currentDataCollectionId == null ||\r\n                    currentDataCollectionId != dataColId\r\n                  ) {\r\n                    currentDataCollectionId = dataColId;\r\n                    rowNumber += 1;\r\n                  }\r\n\r\n                  if (totalRows == rowNumber) {\r\n                    totalRows += 1;\r\n\r\n                    // Pushing this current row to headersToCol\r\n                    value.tableData.forEach((col, header) => {\r\n                      if (\r\n                        header != locationOfHeadacheColName &&\r\n                        header != headCircumferenceColName &&\r\n                        headersToCol.has(header)\r\n                      ) {\r\n                        let valToPush = col[ind];\r\n                        if (header == bpColName) {\r\n                          let bp = valToPush;\r\n                          let systolic = '';\r\n                          let diastolic = '';\r\n\r\n                          if (bp != '' && bp.includes('/')) {\r\n                            let bpSplit = bp.split('/');\r\n                            if (bpSplit.length > 1) {\r\n                              systolic = bpSplit[0];\r\n                              diastolic = bpSplit[1];\r\n                            }\r\n                          }\r\n\r\n                          let sysCol = headersToCol.get(systolicColName)!!;\r\n                          sysCol.push(systolic);\r\n                          headersToCol.set(systolicColName, sysCol);\r\n\r\n                          let diaCol = headersToCol.get(diastolicColName)!!;\r\n                          diaCol.push(diastolic);\r\n                          headersToCol.set(diastolicColName, diaCol);\r\n                        }\r\n\r\n                        let hCol = headersToCol.get(header)!!;\r\n                        hCol.push(valToPush);\r\n                        headersToCol.set(header, hCol);\r\n                      }\r\n                    });\r\n\r\n                    headersToCol.forEach((col, header) => {\r\n                      if (\r\n                        header == locationOfHeadacheColName ||\r\n                        header == headCircumferenceColName\r\n                      ) {\r\n                        // Setting the head circumference and location of headache to be ''\r\n                        col.push('');\r\n                        headersToCol.set(header, col);\r\n                      } else if (col.length != totalRows) {\r\n                        // Initializing all the symptoms in this row to be '0'\r\n                        col.push('0');\r\n                        headersToCol.set(header, col);\r\n                      }\r\n                    });\r\n                  }\r\n\r\n                  let updateHeadersToCol = (\r\n                    header: string,\r\n                    rowValue: string\r\n                  ) => {\r\n                    if (headersToCol.has(header)) {\r\n                      let hCol = headersToCol.get(header)!!;\r\n                      hCol[rowNumber] = rowValue;\r\n                      headersToCol.set(header, hCol);\r\n                    }\r\n\r\n                    // Setting the LocationOfHeadache and HeadCircumference if the symptom is a\r\n                    // headache\r\n                    if (header.toLowerCase().startsWith('headache')) {\r\n                      let _h = locationOfHeadacheColName;\r\n                      let loc = value.tableData.get(_h)!![ind];\r\n                      if (loc != '') {\r\n                        let locCol = headersToCol.get(_h);\r\n                        if (locCol) {\r\n                          locCol[rowNumber] = loc;\r\n                          headersToCol.set(_h, locCol);\r\n                        }\r\n                      }\r\n\r\n                      _h = headCircumferenceColName;\r\n                      let cir = value.tableData.get(_h)!![ind];\r\n                      if (cir != '') {\r\n                        let circCol = headersToCol.get(_h);\r\n                        if (circCol) {\r\n                          circCol[rowNumber] = cir;\r\n                          headersToCol.set(_h, circCol);\r\n                        }\r\n                      }\r\n                    }\r\n                  };\r\n\r\n                  let severity = value.tableData.get('Severity')!![ind];\r\n                  let symptom = value.tableData.get('Symptom')!![ind];\r\n                  updateHeadersToCol(symptomHeaderFormat(symptom), severity);\r\n                });\r\n              }\r\n\r\n              // Removing the Blood Pressure column data\r\n              headersToCol.delete(bpColName);\r\n\r\n              // Removing the Blood Pressure header\r\n              let indToRemove = -1;\r\n              headers.forEach((header, ind) => {\r\n                if (header === bpColName) {\r\n                  headers.splice(ind, 1);\r\n                  indToRemove = ind;\r\n                }\r\n              });\r\n\r\n              // Adding in the headers for the systolic and diastolics columns\r\n              if (indToRemove > -1) {\r\n                headers = ([] as string[])\r\n                  .concat(headers.slice(0, indToRemove))\r\n                  .concat([systolicColName, diastolicColName])\r\n                  .concat(headers.slice(indToRemove));\r\n              }\r\n\r\n              let csvData = convertToCsv(totalRows, headers, headersToCol);\r\n              fileNameToContent.set(`trend_man`, csvData);\r\n            })\r\n            .catch((err) => {\r\n              // TODO: Display an error message on the portal\r\n              console.error(err);\r\n            })\r\n            .finally(() => {\r\n              postRequestHandling();\r\n            });\r\n        }\r\n\r\n        if (\r\n          myRoleType == RoleType.PracticeUser ||\r\n          myRoleType == RoleType.PracticeAdmin ||\r\n          myRoleType == RoleType.TenantAdmin\r\n        ) {\r\n          let patientName: string | undefined = undefined;\r\n          let patientUser: GalenUser | undefined = undefined;\r\n          let patientInfo: PatientInfo | undefined = undefined;\r\n          let surgeryDetails: SurgeryDetails | undefined = undefined;\r\n\r\n          this.galenDataService\r\n            .getPatientData()\r\n            .then((value) => {\r\n              patientName = value.patientName;\r\n              patientUser = value.patientUser;\r\n              patientInfo = value.patientInfo;\r\n\r\n              this.galenDataService\r\n                .getSurgeryDetails()\r\n                .then((value) => {\r\n                  surgeryDetails = value;\r\n                })\r\n                .catch(() => {});\r\n            })\r\n            .catch(() => {})\r\n            .finally(() => {\r\n              let pageSize = 10000;\r\n\r\n              // Mapping each header to an array that will contain its column's data\r\n              let icpHeaders = ['Time/date', 'ICP', 'Data Valid'];\r\n              let icpHeadersToCols: Map<string, Array<string>> = new Map();\r\n              let icpRowCount = 0;\r\n\r\n              // This is the function that will be used fetch and parse the icp records received\r\n              // from Galen\r\n              let getIcpData = () => {\r\n                let requestsMade = 0;\r\n                return new Promise((resolve, reject) => {\r\n                  // Function that will be used to parse the ICP records received from Galen\r\n                  let parseIcpRecords = (\r\n                    currentPageNumber: number,\r\n                    records: IcpRecord[]\r\n                  ) => {\r\n                    let offset = pageSize * currentPageNumber;\r\n                    let timeDateCol = icpHeadersToCols.get('Time/date')!!;\r\n                    let icpCol = icpHeadersToCols.get('ICP')!!;\r\n                    let dataValidCol = icpHeadersToCols.get('Data Valid')!!;\r\n\r\n                    // Looping through each record and extracting the corresponding values for each\r\n                    // column\r\n                    records.forEach((record, ind) => {\r\n                      timeDateCol[offset + ind] = record.timestamp\r\n                        ? toISOStringWithTimezone(new Date(record.timestamp))\r\n                        : '';\r\n                      icpCol[offset + ind] = record.icpMmhg\r\n                        ? String(record.icpMmhg)\r\n                        : '';\r\n                      dataValidCol[offset + ind] = record.isDataValid\r\n                        ? 'TRUE'\r\n                        : 'FALSE';\r\n\r\n                      icpRowCount += 1;\r\n                    });\r\n\r\n                    icpHeadersToCols.set('Time/date', timeDateCol);\r\n                    icpHeadersToCols.set('ICP', icpCol);\r\n                    icpHeadersToCols.set('Data Valid', dataValidCol);\r\n\r\n                    requestsMade += 1;\r\n                  };\r\n\r\n                  let currentIcpPage = 0;\r\n                  let totalIcpPages = 1;\r\n\r\n                  // Making the request to Galen to fetch the ICP records\r\n                  this.galenDataService\r\n                    .getIcpRecords(\r\n                      this.ownerId,\r\n                      currentIcpPage,\r\n                      pageSize,\r\n                      'ASC'\r\n                    )\r\n                    .then((value) => {\r\n                      // Extracting the total number of pages that are needed from Galen\r\n                      if (totalIcpPages != value.totalPages)\r\n                        totalIcpPages = value.totalPages;\r\n\r\n                      // Initializing headersToCol to be an array of totalElements size\r\n                      icpHeaders.forEach((header) => {\r\n                        icpHeadersToCols.set(\r\n                          header,\r\n                          new Array(value.totalElements)\r\n                        );\r\n                      });\r\n\r\n                      // Parsing this page's ICP records\r\n                      parseIcpRecords(currentIcpPage, value.icpRecords);\r\n\r\n                      let totalRequestsNeeded = totalIcpPages;\r\n                      if (requestsMade == totalRequestsNeeded) resolve(true);\r\n\r\n                      // Keep sending requests until all of the ICP pages have been received by Galen\r\n                      currentIcpPage += 1;\r\n                      while (currentIcpPage < totalIcpPages) {\r\n                        let _currentIcpPage = currentIcpPage;\r\n                        this.galenDataService\r\n                          .getIcpRecords(\r\n                            this.ownerId,\r\n                            currentIcpPage,\r\n                            pageSize,\r\n                            'ASC'\r\n                          )\r\n                          .then((value) => {\r\n                            parseIcpRecords(_currentIcpPage, value.icpRecords);\r\n                            if (requestsMade == totalRequestsNeeded)\r\n                              resolve(true);\r\n                          });\r\n                        currentIcpPage += 1;\r\n                      }\r\n                    })\r\n                    .catch(() => resolve(true));\r\n                });\r\n              };\r\n\r\n              getIcpData()\r\n                .then(() => {\r\n                  const timeColName = 'Time/date';\r\n                  // Sorting the table based on time and date\r\n                  const sortedTable = sortTableColumns(\r\n                    icpHeadersToCols,\r\n                    timeColName\r\n                  );\r\n\r\n                  // Splitting the sorted table by month\r\n                  const tables = splitTableColumnsByMonth(\r\n                    sortedTable,\r\n                    timeColName\r\n                  );\r\n                  sortedTable.clear();\r\n\r\n                  // Creating a csv file for each table\r\n                  tables.forEach((table, fileName) => {\r\n                    const rowCount = table.get(timeColName)?.length;\r\n                    if (rowCount) {\r\n                      let csvData = convertToCsv(\r\n                        rowCount,\r\n                        icpHeaders,\r\n                        table,\r\n                        patientName,\r\n                        patientUser,\r\n                        patientInfo,\r\n                        surgeryDetails\r\n                      );\r\n\r\n                      fileNameToContent.set(`detailedICP/${fileName}`, csvData);\r\n                    }\r\n                  });\r\n                })\r\n                .catch((err) => {\r\n                  // TODO: Display an error message in the ui\r\n                })\r\n                .finally(() => {\r\n                  postRequestHandling();\r\n                });\r\n\r\n              let dataColHeaders = [\r\n                'Time/date',\r\n                'Body position',\r\n                'Feeling score',\r\n                'Mean ICP',\r\n                'Blood pressure',\r\n                'Body temperature',\r\n                'Photo Yes/No',\r\n                'Sensor serial number',\r\n                'Wand serial number',\r\n                'Notes',\r\n                'Location of headache',\r\n                'Head circumference',\r\n              ];\r\n\r\n              let dataColHeadersToProp: Map<\r\n                string,\r\n                { table: 'foreign' | 'primary'; property: string }\r\n              > = new Map([\r\n                [\r\n                  dataColHeaders[0],\r\n                  {\r\n                    table: 'primary',\r\n                    property: 'Timestamp',\r\n                  },\r\n                ],\r\n                [\r\n                  dataColHeaders[1],\r\n                  {\r\n                    table: 'primary',\r\n                    property: 'PatientPosition',\r\n                  },\r\n                ],\r\n                [\r\n                  dataColHeaders[2],\r\n                  {\r\n                    table: 'primary',\r\n                    property: 'UserFeeling',\r\n                  },\r\n                ],\r\n                [\r\n                  dataColHeaders[3],\r\n                  {\r\n                    table: 'primary',\r\n                    property: 'MeanIcp',\r\n                  },\r\n                ],\r\n                [\r\n                  dataColHeaders[4],\r\n                  {\r\n                    table: 'primary',\r\n                    property: 'BloodPressure',\r\n                  },\r\n                ],\r\n                [\r\n                  dataColHeaders[5],\r\n                  {\r\n                    table: 'primary',\r\n                    property: 'BodyTemperature',\r\n                  },\r\n                ],\r\n                [\r\n                  dataColHeaders[6],\r\n                  {\r\n                    table: 'primary',\r\n                    property: 'Image1OfSymptoms',\r\n                  },\r\n                ],\r\n                [\r\n                  dataColHeaders[7],\r\n                  {\r\n                    table: 'primary',\r\n                    property: 'ImplantSerialNumber',\r\n                  },\r\n                ],\r\n                [\r\n                  dataColHeaders[8],\r\n                  {\r\n                    table: 'primary',\r\n                    property: 'WandSerialNumber',\r\n                  },\r\n                ],\r\n                [\r\n                  dataColHeaders[9],\r\n                  {\r\n                    table: 'primary',\r\n                    property: 'Notes',\r\n                  },\r\n                ],\r\n                [\r\n                  dataColHeaders[10],\r\n                  {\r\n                    table: 'foreign',\r\n                    property: 'LocationOfSymptom',\r\n                  },\r\n                ],\r\n                [\r\n                  dataColHeaders[11],\r\n                  {\r\n                    table: 'foreign',\r\n                    property: 'HeadCircumferenceCm',\r\n                  },\r\n                ],\r\n                [\r\n                  'Symptom',\r\n                  {\r\n                    table: 'foreign',\r\n                    property: 'Symptom',\r\n                  },\r\n                ],\r\n                [\r\n                  'Severity',\r\n                  {\r\n                    table: 'foreign',\r\n                    property: 'Severity',\r\n                  },\r\n                ],\r\n                [\r\n                  'Data Collection Id',\r\n                  {\r\n                    table: 'primary',\r\n                    property: 'deviceDataId',\r\n                  },\r\n                ],\r\n              ]);\r\n\r\n              this.galenDataService\r\n                .joinDataModels(\r\n                  this.ownerId,\r\n                  dataColHeadersToProp,\r\n                  {\r\n                    primaryKeyProp: 'deviceDataId',\r\n                    foreignKeyProp: 'DataCollectionId',\r\n                  },\r\n                  {\r\n                    primaryTable: DataModelType.DataCollection,\r\n                    foreignTable: DataModelType.Symptom,\r\n                  },\r\n                  'Time/date',\r\n                  undefined,\r\n                  {\r\n                    primaryTableAttribute: `data.Timestamp.value`,\r\n                    foreignTableAttribute: `maxValueProvidedOn`,\r\n                    sortOrder: 'ASC',\r\n                  }\r\n                )\r\n                .then(async (value) => {\r\n                  let headersToCol: Map<string, Array<string>> = new Map();\r\n                  let totalRows = 0; // Tracks the total number of rows in headersToCol\r\n\r\n                  value.tableData = addOffsetToDateTimeCol(\r\n                    value.tableData,\r\n                    'Time/date'\r\n                  );\r\n\r\n                  // Initializing the headers and headerToCol map\r\n                  let uniqueSymptoms = getSymptomHeaders(value.tableData);\r\n                  let headers = dataColHeaders.concat(uniqueSymptoms);\r\n                  headers.forEach((header) => {\r\n                    headersToCol.set(header, []);\r\n                  });\r\n\r\n                  let locationOfHeadacheColName = 'Location of headache';\r\n                  let headCircumferenceColName = 'Head circumference';\r\n                  let bpColName = 'Blood pressure';\r\n                  let systolicColName = 'Systolic blood pressure';\r\n                  let diastolicColName = 'Diastolic blood pressure';\r\n                  headersToCol.set(systolicColName, []);\r\n                  headersToCol.set(diastolicColName, []);\r\n\r\n                  let currentDataCollectionId: string | undefined = undefined;\r\n                  let rowNumber = -1; // Used to track the current row in headerToCol\r\n\r\n                  if (value.tableData.has('Data Collection Id')) {\r\n                    let dataCollectionIds =\r\n                      value.tableData.get('Data Collection Id')!!;\r\n                    dataCollectionIds.forEach((dataColId, ind) => {\r\n                      if (\r\n                        currentDataCollectionId == null ||\r\n                        currentDataCollectionId != dataColId\r\n                      ) {\r\n                        // A new data collection id was encountered, so we move on to the next\r\n                        // row in headersToCol\r\n                        currentDataCollectionId = dataColId;\r\n                        rowNumber += 1;\r\n                      }\r\n\r\n                      if (totalRows == rowNumber) {\r\n                        totalRows += 1;\r\n\r\n                        // Pushing this current row to headersToCol\r\n                        value.tableData.forEach((col, header) => {\r\n                          if (\r\n                            header != locationOfHeadacheColName &&\r\n                            header != headCircumferenceColName &&\r\n                            headersToCol.has(header)\r\n                          ) {\r\n                            let hCol = headersToCol.get(header)!!;\r\n                            let valToPush = col[ind];\r\n\r\n                            if (header == 'Photo Yes/No')\r\n                              valToPush = valToPush == '' ? 'NO' : 'YES';\r\n\r\n                            if (header == bpColName) {\r\n                              let bp = valToPush;\r\n                              let systolic = '';\r\n                              let diastolic = '';\r\n\r\n                              if (bp != '' && bp.includes('/')) {\r\n                                let bpSplit = bp.split('/');\r\n                                if (bpSplit.length > 1) {\r\n                                  systolic = bpSplit[0];\r\n                                  diastolic = bpSplit[1];\r\n                                }\r\n                              }\r\n\r\n                              let sysCol = headersToCol.get(systolicColName)!!;\r\n                              sysCol.push(systolic);\r\n                              headersToCol.set(systolicColName, sysCol);\r\n\r\n                              let diaCol = headersToCol.get(diastolicColName)!!;\r\n                              diaCol.push(diastolic);\r\n                              headersToCol.set(diastolicColName, diaCol);\r\n                            }\r\n\r\n                            hCol.push(valToPush);\r\n                            headersToCol.set(header, hCol);\r\n                          }\r\n                        });\r\n\r\n                        // Initializing all the symptoms in this row to be '0'\r\n                        headersToCol.forEach((col, header) => {\r\n                          if (\r\n                            header == locationOfHeadacheColName ||\r\n                            header == headCircumferenceColName\r\n                          ) {\r\n                            // Setting the head circumference and location of headache to be ''\r\n                            col.push('');\r\n                            headersToCol.set(header, col);\r\n                          } else if (col.length != totalRows) {\r\n                            // Initializing all the symptoms in this row to be '0'\r\n                            col.push('0');\r\n                            headersToCol.set(header, col);\r\n                          }\r\n                        });\r\n                      }\r\n\r\n                      let updateHeadersToCol = (\r\n                        header: string,\r\n                        rowValue: string\r\n                      ) => {\r\n                        if (headersToCol.has(header)) {\r\n                          let hCol = headersToCol.get(header)!!;\r\n                          hCol[rowNumber] = rowValue;\r\n                          headersToCol.set(header, hCol);\r\n                        }\r\n\r\n                        // Setting the LocationOfHeadache and HeadCircumference if the symptom is a\r\n                        // headache\r\n                        if (header.toLowerCase().startsWith('headache')) {\r\n                          let _h = locationOfHeadacheColName;\r\n                          let loc = value.tableData.get(_h)!![ind];\r\n                          if (loc != '') {\r\n                            let locCol = headersToCol.get(_h);\r\n                            if (locCol) {\r\n                              locCol[rowNumber] = loc;\r\n                              headersToCol.set(_h, locCol);\r\n                            }\r\n                          }\r\n\r\n                          _h = headCircumferenceColName;\r\n                          let cir = value.tableData.get(_h)!![ind];\r\n                          if (cir != '') {\r\n                            let circCol = headersToCol.get(_h);\r\n                            if (circCol) {\r\n                              circCol[rowNumber] = cir;\r\n                              headersToCol.set(_h, circCol);\r\n                            }\r\n                          }\r\n                        }\r\n                      };\r\n\r\n                      let severity = value.tableData.get('Severity')!![ind];\r\n                      let symptom = value.tableData.get('Symptom')!![ind];\r\n                      updateHeadersToCol(\r\n                        symptomHeaderFormat(symptom),\r\n                        severity\r\n                      );\r\n                    });\r\n                  }\r\n\r\n                  // Removing the Blood Pressure column data so that we can replace it with the\r\n                  // systolic and diastolic columns\r\n                  headersToCol.delete(bpColName);\r\n\r\n                  // Removing the Blood Pressure header\r\n                  let indToRemove = removeElement(headers, bpColName);\r\n\r\n                  // Adding in the headers for the systolic and diastolics columns\r\n                  if (indToRemove > -1) {\r\n                    headers = ([] as string[]).concat(\r\n                      headers.slice(0, indToRemove),\r\n                      [systolicColName, diastolicColName],\r\n                      headers.slice(indToRemove)\r\n                    );\r\n                  }\r\n\r\n                  let csvData = convertToCsv(\r\n                    totalRows,\r\n                    headers,\r\n                    headersToCol,\r\n                    patientName,\r\n                    patientUser,\r\n                    patientInfo,\r\n                    surgeryDetails\r\n                  );\r\n                  fileNameToContent.set(`trend`, csvData);\r\n                })\r\n                .catch((err) => {\r\n                  // TODO: Display an error message on the portal\r\n                  console.error(err);\r\n                })\r\n                .finally(() => {\r\n                  postRequestHandling();\r\n                });\r\n            });\r\n        }\r\n      })\r\n      .catch((err) => {\r\n        this.isLoading = false;\r\n      });\r\n  }\r\n\r\n  onRestoreChartEvent(restore: ChartType) {\r\n    this.restoreChartAlarm = restore;\r\n  }\r\n\r\n  /**\r\n   * Callback for the `zoomDataEvent` @Output directive. In other words, whenever\r\n   * any instantiated component emits from their `zoomDataEvent` variable, this function\r\n   * will be called\r\n   * @param zoomData The relevant ZoomData that was emitted\r\n   */\r\n  onZoomDataEvent(zoomData: ZoomData) {\r\n    // This if-statment makes sure to only update this.zoomData only if the given\r\n    // argument offers something unique. This is so that we don't have input variables\r\n    // being triggered unnecessarily\r\n    if (\r\n      !this.zoomData ||\r\n      this.zoomData.start != zoomData.start ||\r\n      this.zoomData.end != zoomData.end\r\n    ) {\r\n      this.zoomData = zoomData;\r\n\r\n      if (this.restoreChartAlarm != undefined)\r\n        this.restoreChartAlarm = undefined;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Callback for the `@Output chartImageData` from ANY component. Stores the given `chartImageData`\r\n   * in an array, and whenever all the required data has been received, this function will produce\r\n   * the proper pdf with the chart data\r\n   * @param chartImageData\r\n   */\r\n  async onChartImageData(chartImageData: ChartImageData) {\r\n    function loadImage(src: string): Promise<HTMLImageElement> {\r\n      return new Promise((resolve, reject) => {\r\n        const img = new Image();\r\n        img.src = src;\r\n        img.onload = () => resolve(img);\r\n        img.onerror = reject;\r\n      });\r\n    }\r\n\r\n    let chartDataUrl = chartImageData.chartDataUrl\r\n      ? chartImageData.chartDataUrl\r\n      : '';\r\n    this.childrenChartPdfData.set(chartImageData.chartType, chartDataUrl);\r\n\r\n    if (this.childrenChartPdfData.size == 6) {\r\n      let currentDate = new Date();\r\n      let currentDateTruncated = currentDate.toLocaleString();\r\n\r\n      let patientInfo: PatientInfo | undefined = undefined;\r\n      let galenUserInfo: GalenUser | undefined = undefined;\r\n\r\n      // Fetching the patient's information from the PatientInformation data model\r\n      // and Galen's custom built patient-data table.\r\n      try {\r\n        galenUserInfo = await this.galenDataService.getGalenUserInformation();\r\n      } catch (e) {\r\n        console.log(e);\r\n      }\r\n      try {\r\n        patientInfo = await this.galenDataService.getPatientInformation();\r\n      } catch (e) {\r\n        console.log(e);\r\n      }\r\n\r\n      if (galenUserInfo) {\r\n        try {\r\n          let orderedChartDataUrls: any[] = [];\r\n          orderedChartDataUrls.push({\r\n            dataUrl: this.childrenChartPdfData.get(ChartType.IcpTrend),\r\n            title: ChartType.IcpTrend,\r\n          });\r\n          orderedChartDataUrls.push({\r\n            dataUrl: this.childrenChartPdfData.get(ChartType.Symptoms),\r\n            title: ChartType.Symptoms,\r\n          });\r\n          orderedChartDataUrls.push({\r\n            dataUrl: this.childrenChartPdfData.get(ChartType.FeelingRating),\r\n            title: ChartType.FeelingRating,\r\n          });\r\n          orderedChartDataUrls.push({\r\n            dataUrl: this.childrenChartPdfData.get(ChartType.PatientPosition),\r\n            title: ChartType.PatientPosition,\r\n          });\r\n          orderedChartDataUrls.push({\r\n            dataUrl: this.childrenChartPdfData.get(ChartType.BloodPressure),\r\n            title: 'Blood Pressure and Body Temperature',\r\n          });\r\n          orderedChartDataUrls.push({\r\n            dataUrl: this.childrenChartPdfData.get(ChartType.BodyTemperature),\r\n            title: '',\r\n          });\r\n\r\n          /**\r\n           * Returns a string with the first letter of the given [text] uppercased\r\n           * @param text the text whose first letter you want uppercased\r\n           * @param dashes A flag to return 3 dashes (---) if the text is null or undefined\r\n           *  * Default: true\r\n           * @returns string\r\n           */\r\n          function upperCaseFirstLetter(text?: string, dashes: boolean = true) {\r\n            let finalText = dashes ? '---' : '';\r\n\r\n            if (text && text.length > 0) {\r\n              let firstLetter = text.charAt(0);\r\n              finalText = firstLetter.toUpperCase() + text.slice(1);\r\n            }\r\n\r\n            return finalText;\r\n          }\r\n\r\n          /**\r\n           * Formats any comma separated value returned from galen\r\n           * @param csv the comma seperated value you want to format\r\n           * @returns string\r\n           */\r\n          function formatCommaSeperatedValue(csv?: string) {\r\n            let finalText = '---';\r\n\r\n            if (csv && csv.length > 0) {\r\n              finalText = csv;\r\n              if (csv.includes(',')) {\r\n                let csvSplit = csv.split(',');\r\n                finalText = csvSplit.join(', ');\r\n              }\r\n            }\r\n\r\n            return finalText;\r\n          }\r\n\r\n          function formatName(\r\n            firstName?: string,\r\n            middleName?: string,\r\n            lastName?: string\r\n          ) {\r\n            firstName = upperCaseFirstLetter(firstName, false);\r\n            middleName = upperCaseFirstLetter(middleName, false);\r\n            lastName = upperCaseFirstLetter(lastName, false);\r\n\r\n            if (firstName == '' && middleName == '' && lastName == '') {\r\n              return '---';\r\n            } else {\r\n              let fullName = '';\r\n              if (firstName != '') fullName += `${firstName} `;\r\n              if (middleName != '') fullName += `${middleName} `;\r\n              if (lastName != '') fullName += `${lastName}`;\r\n              if (fullName.endsWith(' '))\r\n                fullName = fullName.slice(0, fullName.length - 1);\r\n              return fullName;\r\n            }\r\n          }\r\n\r\n          // constants for the pdf document\r\n          let pageWidth = 448;\r\n          let imageHeight = 134;\r\n          let topMargin = 16;\r\n          let leftMargin = 20;\r\n          let tableCellWidth = 136;\r\n          let tableCellHeight = 32;\r\n\r\n          let primaryPhoneNumber: string | undefined = undefined;\r\n          if (\r\n            galenUserInfo.contactInfo &&\r\n            'primaryPhone' in galenUserInfo.contactInfo\r\n          ) {\r\n            primaryPhoneNumber = galenUserInfo.contactInfo['primaryPhone'] as string;\r\n          }\r\n\r\n          // The tabular data regarding the patient and the requester\r\n          let tableCellData = {\r\n            headers: [\r\n              'Patient Name',\r\n              'Birth Date',\r\n              'NHI Number',\r\n              'Phone Number',\r\n              'Email',\r\n              'Sex',\r\n              'Hydrocephalus Type',\r\n              'Shunt Type',\r\n              'Shunt Manufacturer',\r\n              'Report Requester',\r\n              'Date Reported',\r\n            ],\r\n            data: [\r\n              galenUserInfo.fullName,\r\n              galenUserInfo.dateOfBirth\r\n                ? toUsDateString(galenUserInfo.dateOfBirth)\r\n                : undefined,\r\n              patientInfo ? patientInfo.nhiNumber : undefined,\r\n              primaryPhoneNumber,\r\n              galenUserInfo.emailAddress,\r\n              upperCaseFirstLetter(galenUserInfo.gender),\r\n              formatCommaSeperatedValue(\r\n                patientInfo ? patientInfo.hydrocephalusType : undefined\r\n              ),\r\n              patientInfo ? patientInfo.shuntType : undefined,\r\n              patientInfo ? patientInfo.shuntBrand : undefined,\r\n              this.currentUser.fullName,\r\n              toUsDateString(currentDate, false),\r\n            ],\r\n          };\r\n\r\n          function formatCellData(text?: string) {\r\n            let returnText = '---';\r\n            if (text && text.length > 0) {\r\n              returnText = text;\r\n\r\n              if (returnText.length > 26) {\r\n                returnText = returnText.substring(0, 26) + '...';\r\n              }\r\n            }\r\n            return returnText;\r\n          }\r\n\r\n          // Creating a pdf\r\n          let currYPos = topMargin;\r\n          let pdf = new jsPDF({ unit: 'px', compress: true });\r\n          pdf.setFont('helvetica', 'normal');\r\n\r\n          let fontSize = 20;\r\n          pdf.setFontSize(fontSize);\r\n\r\n          function setFontSize(size: number) {\r\n            fontSize = size;\r\n            pdf.setFontSize(size);\r\n          }\r\n\r\n          // Writing the title on the pdf\r\n          currYPos += fontSize;\r\n          pdf.text('Kitea ICP Report', pageWidth / 2, currYPos, {\r\n            align: 'center',\r\n          });\r\n          currYPos += 10;\r\n\r\n          setFontSize(14);\r\n          let cellCount = 0;\r\n          for (let i = 0; i < 4; i++) {\r\n            pdf.line(leftMargin, currYPos, pageWidth - leftMargin, currYPos); // Draws a horizontal line for the table's row\r\n            for (let j = 0; j < 3; j++) {\r\n              // Draws a vertical line for the columns\r\n              let x = leftMargin + j * tableCellWidth;\r\n              pdf.line(x, currYPos, x, currYPos + tableCellHeight);\r\n\r\n              // Adding in the headers of the tabular data\r\n              if (i != 3 || j != 0) {\r\n                let headerFontSize = 14;\r\n                setFontSize(headerFontSize);\r\n                pdf.text(\r\n                  tableCellData.headers[cellCount],\r\n                  x + 6,\r\n                  currYPos + fontSize\r\n                );\r\n\r\n                // Adding in the tabular data\r\n                setFontSize(12);\r\n                pdf.text(\r\n                  formatCellData(tableCellData.data[cellCount]),\r\n                  x + 6,\r\n                  currYPos + fontSize + headerFontSize + 2\r\n                );\r\n\r\n                cellCount += 1;\r\n              }\r\n            }\r\n            pdf.line(\r\n              leftMargin + 3 * tableCellWidth,\r\n              currYPos,\r\n              leftMargin + 3 * tableCellWidth,\r\n              currYPos + tableCellHeight\r\n            );\r\n            currYPos += tableCellHeight;\r\n          }\r\n          pdf.line(leftMargin, currYPos, pageWidth - leftMargin, currYPos);\r\n          currYPos += 5;\r\n\r\n          setFontSize(14);\r\n          for (let i = 0; i < orderedChartDataUrls.length; i++) {\r\n            let chartDataUrl = orderedChartDataUrls[i].dataUrl;\r\n\r\n            try {\r\n              let image = await loadImage(chartDataUrl);\r\n              if (i == 3) {\r\n                pdf.addPage();\r\n                currYPos = topMargin;\r\n              }\r\n\r\n              if (orderedChartDataUrls[i].title != '') {\r\n                currYPos += fontSize;\r\n                pdf.text(orderedChartDataUrls[i].title, leftMargin, currYPos);\r\n                currYPos += 3;\r\n              }\r\n\r\n              pdf.addImage(\r\n                image,\r\n                'PNG',\r\n                0,\r\n                currYPos,\r\n                pageWidth,\r\n                imageHeight,\r\n                undefined,\r\n                'FAST'\r\n              );\r\n              currYPos += imageHeight;\r\n            } catch (err) {}\r\n          }\r\n\r\n          pdf.save(`kitea-icp-report ${currentDateTruncated}.pdf`);\r\n        } catch (e) {\r\n          console.log(e);\r\n        }\r\n      }\r\n\r\n      // Resetting the childrenChartPdfData so that we don't store the state of the previous chart data, and\r\n      // resetting the generatePdfDataAlarm signal\r\n      this.childrenChartPdfData.clear();\r\n      this.generatePdfDataAlarm = false;\r\n      this.refreshCharts();\r\n\r\n      if (this.isLoading) this.isLoading = false;\r\n    }\r\n  }\r\n\r\n  refreshCharts() {\r\n    // This little trick causes the ICP trend chart\r\n    // to fetch a new set of data with the new ownerId\r\n    if (this.genericComponentInputs)\r\n      this.genericComponentInputs = {\r\n        rangeStartDateTime: this.genericComponentInputs.rangeStartDateTime,\r\n        rangeEndDateTime: this.genericComponentInputs.rangeEndDateTime,\r\n      };\r\n    else\r\n      this.genericComponentInputs = {\r\n        rangeStartDateTime: undefined,\r\n        rangeEndDateTime: undefined,\r\n      };\r\n  }\r\n}\r\n","<div class=\"component-container\">\r\n  <div class=\"loading-overlay\" *ngIf=\"isLoading\">\r\n    <mat-spinner\r\n      *ngIf=\"isLoading\"\r\n      [color]=\"loadingColor\"\r\n      [mode]=\"mode\"\r\n    ></mat-spinner>\r\n  </div>\r\n\r\n  <div class=\"content\" [class.loading]=\"isLoading\">\r\n    <lib-icp-trend-chart\r\n      id=\"icp-trend\"\r\n      [genericComponentInputs]=\"genericComponentInputs\"\r\n      [generatePdfDataAlarm]=\"generatePdfDataAlarm\"\r\n      [zoomData]=\"zoomData\"\r\n      [restoreChartAlarm]=\"restoreChartAlarm\"\r\n      (dataCollectionRetrievedEvent)=\"onDataCollectionRetrievedEvent($event)\"\r\n      (restoreChartEvent)=\"onRestoreChartEvent($event)\"\r\n      (zoomDataEvent)=\"onZoomDataEvent($event)\"\r\n      (chartImageData)=\"onChartImageData($event)\"\r\n    ></lib-icp-trend-chart>\r\n    <lib-symptoms-bubble-chart\r\n      id=\"symptoms-bubble\"\r\n      [isDataCollectionRetrieved]=\"isDataCollectionRetrieved\"\r\n      [zoomData]=\"zoomData\"\r\n      [generatePdfDataAlarm]=\"generatePdfDataAlarm\"\r\n      [restoreChartAlarm]=\"restoreChartAlarm\"\r\n      (zoomDataEvent)=\"onZoomDataEvent($event)\"\r\n      (chartImageData)=\"onChartImageData($event)\"\r\n      (restoreChartEvent)=\"onRestoreChartEvent($event)\"\r\n    ></lib-symptoms-bubble-chart>\r\n    <lib-blood-pressure-line-chart\r\n      id=\"blood-pressure\"\r\n      [isDataCollectionRetrieved]=\"isDataCollectionRetrieved\"\r\n      [zoomData]=\"zoomData\"\r\n      [generatePdfDataAlarm]=\"generatePdfDataAlarm\"\r\n      [restoreChartAlarm]=\"restoreChartAlarm\"\r\n      (restoreChartEvent)=\"onRestoreChartEvent($event)\"\r\n      (zoomDataEvent)=\"onZoomDataEvent($event)\"\r\n      (chartImageData)=\"onChartImageData($event)\"\r\n    ></lib-blood-pressure-line-chart>\r\n    <lib-body-temperature-line-chart\r\n      id=\"body-temperature\"\r\n      [isDataCollectionRetrieved]=\"isDataCollectionRetrieved\"\r\n      [zoomData]=\"zoomData\"\r\n      [generatePdfDataAlarm]=\"generatePdfDataAlarm\"\r\n      [restoreChartAlarm]=\"restoreChartAlarm\"\r\n      (restoreChartEvent)=\"onRestoreChartEvent($event)\"\r\n      (zoomDataEvent)=\"onZoomDataEvent($event)\"\r\n      (chartImageData)=\"onChartImageData($event)\"\r\n    ></lib-body-temperature-line-chart>\r\n    <lib-feeling-rating-line-chart\r\n      id=\"feeling-rating\"\r\n      [isDataCollectionRetrieved]=\"isDataCollectionRetrieved\"\r\n      [zoomData]=\"zoomData\"\r\n      [generatePdfDataAlarm]=\"generatePdfDataAlarm\"\r\n      [restoreChartAlarm]=\"restoreChartAlarm\"\r\n      (restoreChartEvent)=\"onRestoreChartEvent($event)\"\r\n      (zoomDataEvent)=\"onZoomDataEvent($event)\"\r\n      (chartImageData)=\"onChartImageData($event)\"\r\n    ></lib-feeling-rating-line-chart>\r\n    <lib-patient-position-chart\r\n      id=\"patient-position\"\r\n      [isDataCollectionRetrieved]=\"isDataCollectionRetrieved\"\r\n      [zoomData]=\"zoomData\"\r\n      [generatePdfDataAlarm]=\"generatePdfDataAlarm\"\r\n      [restoreChartAlarm]=\"restoreChartAlarm\"\r\n      (restoreChartEvent)=\"onRestoreChartEvent($event)\"\r\n      (zoomDataEvent)=\"onZoomDataEvent($event)\"\r\n      (chartImageData)=\"onChartImageData($event)\"\r\n    ></lib-patient-position-chart>\r\n\r\n    <div class=\"div-button\">\r\n      <button\r\n        pButton\r\n        class=\"btn btn-primary btn-raised\"\r\n        type=\"button\"\r\n        (click)=\"onGeneratePdfClick()\"\r\n      >\r\n        Generate PDF Report\r\n      </button>\r\n\r\n      &nbsp; &nbsp;\r\n\r\n      <button\r\n        pButton\r\n        class=\"btn btn-primary btn-raised\"\r\n        type=\"button\"\r\n        (click)=\"onExportToCsv()\"\r\n      >\r\n        Export to CSV\r\n      </button>\r\n    </div>\r\n  </div>\r\n</div>\r\n","import {\r\n  Component,\r\n  inject,\r\n  Input,\r\n  ViewChild,\r\n  OnChanges,\r\n  SimpleChanges,\r\n} from '@angular/core';\r\nimport { MatPaginator, PageEvent } from '@angular/material/paginator';\r\nimport { MatTableDataSource } from '@angular/material/table';\r\nimport { ActivityLog } from '../../models/activity-log';\r\nimport { GalenDataService } from '../../services/galen-data/galen-data.service';\r\nimport { extractGetDeviceDataHttpErrorMsg } from '../../utils/error-handler';\r\nimport { GenericComponentInputs } from '../../interfaces/generic-component-inputs';\r\nimport { instanceOfHttpError } from '../../interfaces/http-error';\r\nimport { toISOStringWithTimezone } from '../../utils/string-formatter';\r\nimport { convertToCsv, zipCsvFiles } from '../../utils/csv-file-helpers';\r\nimport { getCurrentRole } from '../../utils/http-response';\r\nimport { RoleType } from '../../enums/role-type';\r\nimport { PatientInfo } from '../../models/patient-info';\r\nimport { GalenUser } from '../../models/galen-user';\r\nimport { ThemePalette } from '@angular/material/core';\r\nimport { ProgressSpinnerMode } from '@angular/material/progress-spinner';\r\nimport { SurgeryDetails } from '../../models/surgery-details';\r\nimport { sortTableColumns } from '../../utils/table-utils';\r\nimport { DataModelType } from '../../enums/data-model-type';\r\n\r\n@Component({\r\n  selector: 'lib-activity-tracker-table',\r\n  templateUrl: './activity-tracker-table.component.html',\r\n  styleUrls: ['./activity-tracker-table.component.css'],\r\n})\r\nexport class ActivityTrackerTableComponent implements OnChanges {\r\n  @Input() genericComponentInputs!: GenericComponentInputs;\r\n  @Input() ownerId!: string;\r\n  @Input() pageSize!: 5 | 10 | 25 | 50;\r\n\r\n  galenDataService: GalenDataService = inject(GalenDataService);\r\n\r\n  numOfRows: number = 0;\r\n  currentPage = 0;\r\n\r\n  displayedColumns: string[] = ['date-and-time', 'activity', 'duration'];\r\n  dataSource = new MatTableDataSource<ActivityLog>();\r\n\r\n  errorMsg?: string;\r\n\r\n  isLoading = false;\r\n  loadingColor: ThemePalette = 'primary';\r\n  mode: ProgressSpinnerMode = 'indeterminate';\r\n\r\n  private paginator?: MatPaginator;\r\n  @ViewChild(MatPaginator) set matPaginator(mp: MatPaginator) {\r\n    this.paginator = mp;\r\n    if (this.paginator) this.dataSource.paginator = this.paginator;\r\n    this.loadData();\r\n  }\r\n\r\n  constructor() {}\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['genericComponentInputs']) {\r\n      this.genericComponentInputs =\r\n        changes['genericComponentInputs'].currentValue;\r\n    }\r\n    if (changes['ownerId']) {\r\n      this.ownerId = changes['ownerId'].currentValue;\r\n    }\r\n    if (changes['pageSize']) {\r\n      this.pageSize = changes['pageSize'].currentValue;\r\n    }\r\n    this.currentPage = 0;\r\n    this.loadData();\r\n  }\r\n\r\n  pageChanged(event: PageEvent) {\r\n    this.currentPage = event.pageIndex;\r\n    this.loadData();\r\n  }\r\n\r\n  loadData() {\r\n    if (!this.isLoading) {\r\n      this.isLoading = true;\r\n\r\n      this.galenDataService\r\n        .getActivityRows(\r\n          this.ownerId,\r\n          this.genericComponentInputs.rangeStartDateTime,\r\n          this.genericComponentInputs.rangeEndDateTime,\r\n          this.currentPage,\r\n          this.pageSize\r\n        )\r\n        .then((ret) => {\r\n          this.errorMsg = undefined;\r\n          this.numOfRows = ret.totalElements;\r\n          this.dataSource.data = ret.activityLogs;\r\n          setTimeout(() => {\r\n            if (this.paginator) {\r\n              this.paginator.pageIndex = this.currentPage;\r\n              this.paginator.pageSize = this.pageSize;\r\n              this.paginator.length = this.numOfRows;\r\n            }\r\n          });\r\n        })\r\n        .catch((err) => {\r\n          if (instanceOfHttpError(err))\r\n            this.errorMsg = extractGetDeviceDataHttpErrorMsg(err);\r\n        })\r\n        .finally(() => {\r\n          this.isLoading = false;\r\n        });\r\n    }\r\n  }\r\n\r\n  onExportToCsv() {\r\n    let headers = [\r\n      'Start Time/date',\r\n      'Activity',\r\n      'Time Spent',\r\n      'Quality of Activity',\r\n      'Notes',\r\n    ];\r\n    let headersToCols: Map<string, Array<string>> = new Map();\r\n    headers.forEach((header) => {\r\n      headersToCols.set(header, []);\r\n    });\r\n    let rowCount = 0;\r\n\r\n    let parseRecords = (records: ActivityLog[]) => {\r\n      records.forEach((record) => {\r\n        headersToCols.set(\r\n          'Start Time/date',\r\n          headersToCols\r\n            .get('Start Time/date')!!\r\n            .concat([\r\n              record.startTimestamp\r\n                ? toISOStringWithTimezone(new Date(record.startTimestamp))\r\n                : '',\r\n            ])\r\n        );\r\n        headersToCols.set(\r\n          'Activity',\r\n          headersToCols\r\n            .get('Activity')!!\r\n            .concat([record.activity ? record.activity : ''])\r\n        );\r\n        headersToCols.set(\r\n          'Time Spent',\r\n          headersToCols\r\n            .get('Time Spent')!!\r\n            .concat([record.timeSpent ? String(record.timeSpent) : ''])\r\n        );\r\n        headersToCols.set(\r\n          'Quality of Activity',\r\n          headersToCols\r\n            .get('Quality of Activity')!!\r\n            .concat([record.qualityOfActivity ? record.qualityOfActivity : ''])\r\n        );\r\n        headersToCols.set(\r\n          'Notes',\r\n          headersToCols\r\n            .get('Notes')!!\r\n            .concat([record.notes ? record.notes : ''])\r\n        );\r\n        rowCount += 1;\r\n      });\r\n    };\r\n\r\n    let currentPage = 0;\r\n    let totalPages = 1;\r\n    let getData = () => {\r\n      return new Promise((resolve, reject) => {\r\n        this.galenDataService\r\n          .getActivityRows(\r\n            this.ownerId,\r\n            undefined,\r\n            undefined,\r\n            currentPage,\r\n            1000,\r\n            'ASC'\r\n          )\r\n          .then((value) => {\r\n            if (totalPages != value.totalPages) totalPages = value.totalPages;\r\n            currentPage += 1;\r\n            parseRecords(value.activityLogs);\r\n\r\n            let requestsMade = 1;\r\n            let totalRequestsNeeded = totalPages;\r\n            if (requestsMade == totalRequestsNeeded) resolve(true);\r\n\r\n            while (currentPage < totalPages) {\r\n              this.galenDataService\r\n                .getActivityRows(\r\n                  this.ownerId,\r\n                  undefined,\r\n                  undefined,\r\n                  currentPage,\r\n                  1000,\r\n                  'ASC'\r\n                )\r\n                .then((value) => {\r\n                  parseRecords(value.activityLogs);\r\n                  requestsMade += 1;\r\n                  if (requestsMade == totalRequestsNeeded) resolve(true);\r\n                });\r\n              currentPage += 1;\r\n            }\r\n          })\r\n          .catch(() => resolve(true));\r\n      });\r\n    };\r\n\r\n    this.isLoading = true;\r\n    this.galenDataService\r\n      .getMyGalenUserInformation()\r\n      .then(async (value) => {\r\n        let myRoleType = getCurrentRole(value);\r\n        let fileNameToContent: Map<string, string> = new Map();\r\n        let totalRequests = 1;\r\n        let requestsMade = 0;\r\n\r\n        let postRequestHandling = () => {\r\n          requestsMade += 1;\r\n          if (requestsMade == totalRequests) {\r\n            zipCsvFiles(`kitea-activity-csvs.zip`, fileNameToContent);\r\n            this.isLoading = false;\r\n          }\r\n        };\r\n\r\n        if (\r\n          myRoleType == RoleType.PracticeUser ||\r\n          myRoleType == RoleType.PracticeAdmin ||\r\n          myRoleType == RoleType.TenantAdmin\r\n        ) {\r\n          let patientName: string | undefined = undefined;\r\n          let patientUser: GalenUser | undefined = undefined;\r\n          let patientInfo: PatientInfo | undefined = undefined;\r\n          let surgeryDetails: SurgeryDetails | undefined = undefined;\r\n          this.galenDataService\r\n            .getPatientData()\r\n            .then((value) => {\r\n              patientName = value.patientName;\r\n              patientUser = value.patientUser;\r\n              patientInfo = value.patientInfo;\r\n              this.galenDataService\r\n                .getSurgeryDetails()\r\n                .then((value) => {\r\n                  surgeryDetails = value;\r\n                })\r\n                .catch(() => {});\r\n            })\r\n            .catch((err) => {})\r\n            .finally(() => {\r\n              getData()\r\n                .then(() => {\r\n                  let csvData = convertToCsv(\r\n                    rowCount,\r\n                    headers,\r\n                    sortTableColumns(headersToCols, 'Start Time/date'),\r\n                    patientName,\r\n                    patientUser,\r\n                    patientInfo,\r\n                    surgeryDetails\r\n                  );\r\n                  fileNameToContent.set(`activity`, csvData);\r\n\r\n                  if (myRoleType == RoleType.TenantAdmin) {\r\n                    let csvData = convertToCsv(\r\n                      rowCount,\r\n                      headers,\r\n                      sortTableColumns(headersToCols, 'Start Time/date')\r\n                    );\r\n                    fileNameToContent.set(`activity_man`, csvData);\r\n                  }\r\n                })\r\n                .catch((err) => {\r\n                  // TODO: Display an error message in the ui\r\n                })\r\n                .finally(() => {\r\n                  postRequestHandling();\r\n                });\r\n            });\r\n        }\r\n\r\n        if (myRoleType == RoleType.TenantUser) {\r\n          getData()\r\n            .then(() => {\r\n              let csvData = convertToCsv(\r\n                rowCount,\r\n                headers,\r\n                sortTableColumns(headersToCols, 'Start Time/date')\r\n              );\r\n              fileNameToContent.set(`activity_man`, csvData);\r\n            })\r\n            .catch((err) => {\r\n              // TODO: Display an error message in the ui\r\n            })\r\n            .finally(() => {\r\n              postRequestHandling();\r\n            });\r\n        }\r\n      })\r\n      .catch((err) => (this.isLoading = false));\r\n  }\r\n}\r\n\r\nexport interface ActivityLogInterface {\r\n  activity?: string;\r\n  qualityOfActivity?: string;\r\n  timeSpent?: number;\r\n  notes?: string;\r\n  startTimestamp?: Date;\r\n  activityImageUrl?: string;\r\n}\r\n","<div class=\"component-container\">\r\n  <div class=\"loading-overlay\" *ngIf=\"isLoading\">\r\n    <mat-spinner [color]=\"loadingColor\" [mode]=\"mode\"></mat-spinner>\r\n  </div>\r\n\r\n  <div\r\n    class=\"content mat-elevation-z8 table-responsive\"\r\n    [class.loading]=\"isLoading\"\r\n  >\r\n    <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isLoading\"></mat-progress-bar>\r\n\r\n    <table mat-table [dataSource]=\"dataSource\" class=\"custom responsive\">\r\n      <!-- Date and Time -->\r\n      <ng-container matColumnDef=\"date-and-time\">\r\n        <th mat-header-cell *matHeaderCellDef>Date and Time</th>\r\n        <td mat-cell *matCellDef=\"let activity\">\r\n          {{\r\n            activity.startTimestamp\r\n              ? activity.startTimestamp.toDateString()\r\n              : \"--\"\r\n          }}\r\n          <br />\r\n          {{\r\n            activity.startTimestamp\r\n              ? activity.startTimestamp.toLocaleTimeString()\r\n              : \"--\"\r\n          }}\r\n        </td>\r\n      </ng-container>\r\n\r\n      <!-- Activity -->\r\n      <ng-container matColumnDef=\"activity\">\r\n        <th mat-header-cell *matHeaderCellDef>Activity</th>\r\n        <td mat-cell class=\"activity-column\" *matCellDef=\"let activity\">\r\n          {{ activity.activity ? activity.activity : \"--\" }}\r\n        </td>\r\n      </ng-container>\r\n\r\n      <!-- Duration -->\r\n      <ng-container matColumnDef=\"duration\">\r\n        <th mat-header-cell *matHeaderCellDef>Duration (mins)</th>\r\n        <td mat-cell *matCellDef=\"let activity\">\r\n          {{ activity.timeSpent ? activity.timeSpent : \"--\" }}\r\n        </td>\r\n      </ng-container>\r\n\r\n      <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n      <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\r\n      <!-- <tbody>\r\n      <tr *ngIf=\"errorMsg\">\r\n        <td colspan=\"3\">\r\n          <h1>{{ errorMsg }}</h1>\r\n        </td>\r\n      </tr>\r\n    </tbody> -->\r\n    </table>\r\n\r\n    <mat-paginator\r\n      #paginator\r\n      [length]=\"numOfRows\"\r\n      [pageIndex]=\"currentPage\"\r\n      [pageSize]=\"pageSize\"\r\n      [showFirstLastButtons]=\"true\"\r\n      (page)=\"pageChanged($event)\"\r\n      aria-label=\"Select page\"\r\n    >\r\n    </mat-paginator>\r\n\r\n    <div class=\"div-button\">\r\n      <button\r\n        pButton\r\n        class=\"btn btn-primary btn-raised\"\r\n        type=\"button\"\r\n        (click)=\"onExportToCsv()\"\r\n      >\r\n        Export to CSV\r\n      </button>\r\n    </div>\r\n  </div>\r\n</div>\r\n","import { NgModule } from '@angular/core';\r\nimport { KiteaGalenPortalComponent } from './kitea-galen-portal.component';\r\nimport { NgxEchartsModule } from 'ngx-echarts';\r\nimport { BloodPressureLineChartComponent } from './components/blood-pressure-line-chart/blood-pressure-line-chart.component';\r\nimport { BodyTemperatureLineChartComponent } from './components/body-temperature-line-chart/body-temperature-line-chart.component';\r\nimport { FeelingRatingLineChartComponent } from './components/feeling-rating-line-chart/feeling-rating-line-chart.component';\r\nimport { IcpTrendChartComponent } from './components/icp-trend-chart/icp-trend-chart.component';\r\nimport { SymptomsBubbleChartComponent } from './components/symptoms-bubble-chart/symptoms-bubble-chart.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ActivityTrackerTableComponent } from './components/activity-tracker-table/activity-tracker-table.component';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatPaginatorModule } from '@angular/material/paginator';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { GenericChartComponent } from './components/generic-chart/generic-chart.component';\r\nimport { OverlayModule } from '@angular/cdk/overlay';\r\nimport { PatientPositionChartComponent } from './components/patient-position-chart/patient-position-chart.component';\r\n\r\n@NgModule({\r\n  declarations: [\r\n    KiteaGalenPortalComponent,\r\n    IcpTrendChartComponent,\r\n    SymptomsBubbleChartComponent,\r\n    BloodPressureLineChartComponent,\r\n    BodyTemperatureLineChartComponent,\r\n    FeelingRatingLineChartComponent,\r\n    ActivityTrackerTableComponent,\r\n    GenericChartComponent,\r\n    PatientPositionChartComponent,\r\n  ],\r\n  imports: [\r\n    CommonModule,\r\n    NgxEchartsModule.forRoot({\r\n      /**\r\n       * This will import all modules from echarts.\r\n       * If you only need custom modules,\r\n       * please refer to [Custom Build] section.\r\n       */\r\n      echarts: () => import('echarts'), // or import('./path-to-my-custom-echarts')\r\n    }),\r\n    MatTableModule,\r\n    MatPaginatorModule,\r\n    MatProgressBarModule,\r\n    MatProgressSpinnerModule,\r\n    OverlayModule\r\n  ],\r\n  exports: [\r\n    KiteaGalenPortalComponent,\r\n    IcpTrendChartComponent,\r\n    SymptomsBubbleChartComponent,\r\n    BloodPressureLineChartComponent,\r\n    BodyTemperatureLineChartComponent,\r\n    FeelingRatingLineChartComponent,\r\n    ActivityTrackerTableComponent,\r\n  ],\r\n  providers: [],\r\n})\r\nexport class KiteaGalenPortalModule {}\r\n","/*\r\n * Public API Surface of kitea-galen-portal\r\n */\r\n\r\nexport * from './lib/kitea-galen-portal.service';\r\nexport * from './lib/kitea-galen-portal.component';\r\nexport * from './lib/kitea-galen-portal.module';\r\n\r\nexport * from './lib/components/activity-tracker-table/activity-tracker-table.component';\r\nexport * from './lib/components/blood-pressure-line-chart/blood-pressure-line-chart.component';\r\nexport * from './lib/components/body-temperature-line-chart/body-temperature-line-chart.component';\r\nexport * from './lib/components/feeling-rating-line-chart/feeling-rating-line-chart.component';\r\nexport * from './lib/components/icp-trend-chart/icp-trend-chart.component';\r\nexport * from './lib/components/symptoms-bubble-chart/symptoms-bubble-chart.component';\r\n\r\nexport * from './lib/models/galen-user';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["math","styles.FONT_FAMILY","styles.KITEA_GRAY","i2","i1","styles.getSymptomRGB","i1.GenericChartComponent","ICP_HK_HEADERS_TO_PROP_MANU","ICP_HK_HEADERS_MANU","i3.IcpTrendChartComponent","i4.SymptomsBubbleChartComponent","i5.BloodPressureLineChartComponent","i6.BodyTemperatureLineChartComponent","i7.FeelingRatingLineChartComponent","i8.PatientPositionChartComponent","i5"],"mappings":"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"}