{"version":3,"sources":["../marine-search-area-coverage.tsx"],"sourcesContent":["import { marine_sweep_widths as marineSweepWidths, marine_sweep_width_weather_corrections as weatherCorrections } from '@canterbury-air-patrol/marine-sweep-width-data'\n\nimport React from 'react'\n\nimport Table from 'react-bootstrap/Table'\nimport 'bootstrap/dist/css/bootstrap.min.css'\n\nclass MarineSAC {\n  column: string\n  asset_type: string\n  asset_speed: number\n  wu: number\n  speed_correction: number\n  fw: number\n  sweep_width: number\n  fatigue: boolean\n  corrected_sweep_width: number\n  practical_track_spacing: number\n  search_area: number\n  search_hours: number\n  available_search_hours: number\n  modified_area: number\n  whole_area_practical_track_spacing: number\n\n  constructor(column: string, assetType: string) {\n    this.column = column\n    this.asset_type = assetType\n    this.asset_speed = 0\n    this.wu = 0\n    this.speed_correction = 1\n    this.fw = 0\n    this.sweep_width = 0\n    this.fatigue = false\n    this.corrected_sweep_width = 0\n    this.practical_track_spacing = 0\n    this.search_area = 144\n    this.search_hours = 0\n    this.available_search_hours = 0\n    this.modified_area = 0\n    this.whole_area_practical_track_spacing = 0\n  }\n\n  recaclculate() {\n    this.sweep_width = this.wu * this.speed_correction * this.fw\n    if (this.fatigue) {\n      this.corrected_sweep_width = this.sweep_width * 0.9\n    } else {\n      this.corrected_sweep_width = this.sweep_width\n    }\n    this.search_hours = this.search_area / (this.asset_speed * this.practical_track_spacing)\n    this.modified_area = this.practical_track_spacing * this.asset_speed * this.available_search_hours\n    this.whole_area_practical_track_spacing = this.search_area / (this.available_search_hours * this.asset_speed)\n  }\n}\n\ninterface TableRowsInterface {\n  display_name: string\n  column_name: string\n  input?: boolean\n  input_type?: string\n}\n\nconst tableRows: TableRowsInterface[] = [\n  {\n    display_name: 'Uncorrected Sweep Width (Wu) `NM`',\n    column_name: 'wu'\n  },\n  {\n    display_name: 'Speed Correction Factor (Sc)',\n    column_name: 'speed_correction'\n  },\n  {\n    display_name: 'Weather Corrected Factor (Fw)',\n    column_name: 'fw'\n  },\n  {\n    display_name: 'Sweep Width (W) (Wu x Sc x Fw)',\n    column_name: 'sweep_width'\n  },\n  {\n    display_name: 'Fatigue Factor (Ff)',\n    column_name: 'fatigue'\n  },\n  {\n    display_name: 'Corrected Sweep Width (W X Ff)',\n    column_name: 'corrected_sweep_width'\n  },\n  {\n    display_name: 'Practical Track Spacing `NM`',\n    column_name: 'practicalTrackSpacing',\n    input: true,\n    input_type: 'number'\n  },\n  {\n    display_name: 'Search Area',\n    column_name: 'search_area',\n    input: true,\n    input_type: 'number'\n  },\n  {\n    display_name: 'Search Hours (T) Total',\n    column_name: 'search_hours'\n  },\n  {\n    display_name: 'Available Search Hours',\n    column_name: 'availableSearchHours',\n    input: true,\n    input_type: 'number'\n  },\n  {\n    display_name: 'Modified Area at Practical Spacing in Available Hours',\n    column_name: 'modified_area'\n  },\n  {\n    display_name: 'Track Spacing for Whole Area in Available Time',\n    column_name: 'whole_area_practical_track_spacing'\n  }\n]\n\ninterface WeatherDataTableProps {\n  weatherImpactChange: (impact: string) => void\n  weatherVisibilityChange: (vis: number) => void\n  metVisibility: number\n}\n\nclass WeatherDataTable extends React.Component<WeatherDataTableProps, never> {\n  windSpeed: number\n  seaHeight: number\n\n  constructor(props: WeatherDataTableProps) {\n    super(props)\n    this.windSpeed = 0\n    this.seaHeight = 0\n\n    this.updateWeatherImpact()\n    this.handleChange = this.handleChange.bind(this)\n  }\n\n  updateWeatherImpact() {\n    // Update the sea/wind impact category\n    let weatherImpact = 'low'\n    if (this.windSpeed >= 25 || this.seaHeight >= 1.5) {\n      weatherImpact = 'high'\n    } else if (this.windSpeed >= 15 || this.seaHeight >= 1.0) {\n      weatherImpact = 'medium'\n    }\n    this.props.weatherImpactChange(weatherImpact)\n  }\n\n  handleChange(event: React.ChangeEvent<HTMLInputElement>) {\n    const target = event.target\n    const value = target.value\n    const name = target.name\n    if (name === 'met_visibility') {\n      this.props.weatherVisibilityChange(parseFloat(value))\n    } else {\n      if (name === 'wind_speed') {\n        this.windSpeed = parseFloat(value)\n      } else if (name === 'sea_height') {\n        this.seaHeight = parseFloat(value)\n      }\n      this.updateWeatherImpact()\n    }\n  }\n\n  render() {\n    return (\n      <tbody>\n        <tr>\n          <td>\n            <label htmlFor=\"met_visibility\">Meteorological Visibility (NM)</label>\n          </td>\n          <td>\n            <input type=\"number\" id=\"met_visibility\" name=\"met_visibility\" onChange={this.handleChange} defaultValue={this.props.metVisibility}></input>\n          </td>\n        </tr>\n        <tr>\n          <td>\n            <label htmlFor=\"wind_speed\">Wind Speed (knots)</label>\n          </td>\n          <td>\n            <input type=\"number\" id=\"wind_speed\" name=\"wind_speed\" onChange={this.handleChange} defaultValue={this.windSpeed}></input>\n          </td>\n        </tr>\n        <tr>\n          <td>\n            <label htmlFor=\"sea_height\">Sea Height (meters)</label>\n          </td>\n          <td>\n            <input type=\"number\" id=\"sea_height\" name=\"sea_height\" onChange={this.handleChange} defaultValue={this.seaHeight}></input>\n          </td>\n        </tr>\n      </tbody>\n    )\n  }\n}\n\ninterface TargetTypeSelectorProps {\n  possible_targets: string[]\n  targetTypeChange: (type: string) => void\n  selected: string\n}\n\nclass TargetTypeSelector extends React.Component<TargetTypeSelectorProps, never> {\n  constructor(props: TargetTypeSelectorProps) {\n    super(props)\n    this.handleChange = this.handleChange.bind(this)\n  }\n\n  handleChange(event: React.ChangeEvent<HTMLSelectElement>) {\n    const target = event.target\n    const value = target.value\n\n    this.props.targetTypeChange(value)\n  }\n\n  render() {\n    const selectObjects = []\n    for (const idx in this.props.possible_targets) {\n      const target = this.props.possible_targets[idx]\n      selectObjects.push(\n        <option key={target} value={target}>\n          {target}\n        </option>\n      )\n    }\n    return (\n      <tbody>\n        <tr>\n          <td></td>\n          <td>\n            <select defaultValue={this.props.selected} onChange={this.handleChange}>\n              {selectObjects}\n            </select>\n          </td>\n        </tr>\n      </tbody>\n    )\n  }\n}\n\ninterface AssetSpeedProps {\n  assetType: string\n  assetSpeedChange: (assetType: string, speed: number) => void\n}\n\nclass AssetSpeed extends React.Component<AssetSpeedProps, never> {\n  constructor(props: AssetSpeedProps) {\n    super(props)\n    this.handleChange = this.handleChange.bind(this)\n  }\n\n  handleChange(event: React.ChangeEvent<HTMLInputElement>) {\n    const target = event.target\n    const value = target.value\n    this.props.assetSpeedChange(this.props.assetType, parseFloat(value))\n  }\n\n  render() {\n    return (\n      <tbody>\n        <tr>\n          <td>\n            <label htmlFor={this.props.assetType + '_speed'}>{this.props.assetType} search speed (knots)</label>\n          </td>\n          <td>\n            <input type=\"number\" name=\"asset_speed\" onChange={this.handleChange} />\n          </td>\n        </tr>\n      </tbody>\n    )\n  }\n}\n\ninterface FatigueProps {\n  fatigueChanged: (fatigue: boolean) => void\n  fatigue: boolean\n}\n\nclass Fatigue extends React.Component<FatigueProps, never> {\n  constructor(props: FatigueProps) {\n    super(props)\n    this.handleChange = this.handleChange.bind(this)\n  }\n\n  handleChange(event: React.ChangeEvent<HTMLInputElement>) {\n    const target = event.target\n    const value = target.checked\n    this.props.fatigueChanged(value)\n  }\n\n  render() {\n    return (\n      <tbody>\n        <tr>\n          <td>\n            <label htmlFor=\"fatigue\">Fatigue</label>\n          </td>\n          <td>\n            <input type=\"checkbox\" name=\"fatigue\" id=\"fatigue\" defaultChecked={this.props.fatigue} onChange={this.handleChange} />\n          </td>\n        </tr>\n      </tbody>\n    )\n  }\n}\n\ninterface DataTableProps {\n  columns: MarineSAC[]\n  updateData: (assetID: string, column: string, value: number) => void\n}\n\nclass DataTable extends React.Component<DataTableProps, never> {\n  constructor(props: DataTableProps) {\n    super(props)\n\n    this.handleChange = this.handleChange.bind(this)\n  }\n\n  handleChange(event: React.ChangeEvent<HTMLInputElement>) {\n    const target = event.target\n    const value = target.value\n    const name = target.id\n\n    const idParts = name.split('_')\n    const assetID = idParts.slice(0, 2).join('_')\n    const columnName = idParts.slice(2).join('_')\n\n    this.props.updateData(assetID, columnName, parseFloat(value))\n  }\n\n  render() {\n    const rows = []\n    const assetTypes = [<th key=\"head\">Asset Type:</th>]\n    const assetHeights = [<th key=\"head\">Height of Eye:</th>]\n\n    for (const idx in tableRows) {\n      const htmlColumns = []\n      htmlColumns.push(<th key=\"head\">{tableRows[idx].display_name}</th>)\n      for (const colIdx in this.props.columns) {\n        const column = this.props.columns[colIdx]\n        if (tableRows[idx].input) {\n          htmlColumns.push(\n            <td key={idx + '_' + colIdx}>\n              <input\n                type={tableRows[idx].input_type}\n                id={column.asset_type + '_' + column.column + '_' + tableRows[idx].column_name}\n                // @ts-expect-error need to accept the column name from tableRows\n                defaultValue={column[tableRows[idx].column_name]}\n                onChange={this.handleChange}\n              />\n            </td>\n          )\n        } else if (tableRows[idx].column_name === 'fatigue') {\n          htmlColumns.push(<td key={idx + '_' + colIdx}>{column[tableRows[idx].column_name] ? 0.9 : 1.0}</td>)\n        } else {\n          // @ts-expect-error need to accept the column name from tableRows\n          htmlColumns.push(<td key={idx + '_' + colIdx}>{column[tableRows[idx].column_name]}</td>)\n        }\n      }\n\n      rows.push(<tr key={idx}>{htmlColumns}</tr>)\n    }\n\n    for (const colIdx in this.props.columns) {\n      const column = this.props.columns[colIdx]\n      assetTypes.push(<th key={colIdx}>{column.asset_type}</th>)\n      assetHeights.push(<th key={colIdx}>{column.column}</th>)\n    }\n\n    return (\n      <form>\n        <Table>\n          <thead>\n            <tr>{assetTypes}</tr>\n            <tr>{assetHeights}</tr>\n          </thead>\n          <tbody>{rows}</tbody>\n        </Table>\n      </form>\n    )\n  }\n}\n\ninterface MarineSACTableState {\n  columns: MarineSAC[]\n  targetType: string\n  fatigue: boolean\n  weatherImpact: string\n  assetSpeeds: {\n    [assetType: string]: number\n  }\n  metVisibility: number\n  practicalTrackSpacing: Map<string, number>\n  availableSearchHours: Map<string, number>\n}\n\nexport class MarineSACTable extends React.Component<never, MarineSACTableState> {\n  possibleTargetsList: string[]\n\n  constructor(props: never) {\n    super(props)\n\n    this.possibleTargetsList = Object.keys(marineSweepWidths)\n\n    this.state = {\n      columns: [],\n      targetType: this.possibleTargetsList[0],\n      fatigue: false,\n      weatherImpact: 'low',\n      assetSpeeds: {\n        Boat: 0,\n        Aircraft: 0\n      },\n      metVisibility: 10,\n      practicalTrackSpacing: new Map<string, number>(),\n      availableSearchHours: new Map<string, number>()\n    }\n\n    this.weatherImpactChange = this.weatherImpactChange.bind(this)\n    this.weatherVisibilityChange = this.weatherVisibilityChange.bind(this)\n    this.targetTypeChange = this.targetTypeChange.bind(this)\n    this.assetSpeedChange = this.assetSpeedChange.bind(this)\n    this.fatigueChange = this.fatigueChange.bind(this)\n    this.updateData = this.updateData.bind(this)\n\n    const defaultAssets = [\n      { asset_type: 'Boat', search_height: '8ft' },\n      { asset_type: 'Boat', search_height: '14ft' },\n      { asset_type: 'Aircraft', search_height: '500ft' },\n      { asset_type: 'Aircraft', search_height: '1000ft' }\n    ]\n    for (const assetIdx in defaultAssets) {\n      const asset = defaultAssets[assetIdx]\n      this.state.columns.push(new MarineSAC(asset.search_height, asset.asset_type))\n      this.state.practicalTrackSpacing.set(`${asset.asset_type}_${asset.search_height}`, 0)\n      this.state.availableSearchHours.set(`${asset.asset_type}_${asset.search_height}`, 0)\n    }\n  }\n\n  weatherImpactChange(newWeatherImpact: string) {\n    this.setState({ weatherImpact: newWeatherImpact })\n  }\n\n  weatherVisibilityChange(metVisibility: number) {\n    this.setState({ metVisibility: metVisibility })\n  }\n\n  targetTypeChange(newTargetType: string) {\n    this.setState({ targetType: newTargetType })\n  }\n\n  assetSpeedChange(assetType: string, speed: number) {\n    this.setState(function (oldState) {\n      const currentAssetSpeeds = oldState.assetSpeeds\n      currentAssetSpeeds[assetType] = speed\n      return { assetSpeeds: currentAssetSpeeds }\n    })\n  }\n\n  fatigueChange(value: boolean) {\n    this.setState({ fatigue: value })\n  }\n\n  updateData(assetID: string, fieldName: string, value: number) {\n    if (fieldName === 'practicalTrackSpacing') {\n      this.setState(function (oldState) {\n        const currentData = oldState.practicalTrackSpacing\n        currentData.set(assetID, value)\n        return { practicalTrackSpacing: currentData }\n      })\n    }\n    if (fieldName === 'availableSearchHours') {\n      this.setState(function (oldState) {\n        const currentData = oldState.availableSearchHours\n        currentData.set(assetID, value)\n        return { availableSearchHours: currentData }\n      })\n    }\n  }\n\n  recalculate() {\n    // Update the uncorrected sweep width and weather correct factors\n    const targetData = marineSweepWidths[this.state.targetType]\n\n    for (const colIdx in this.state.columns) {\n      const column = this.state.columns[colIdx]\n      const searchHeight = column.column\n      const assetType = column.asset_type\n      const columnName = `${assetType}_${searchHeight}`\n      const visibleDistanceData =\n        assetType == 'Boat'\n          ? targetData.Boat[searchHeight]\n          : assetType === 'Heliocopter'\n            ? targetData.Helicopter[searchHeight]\n            : assetType === 'Aircraft'\n              ? targetData.Aircraft[searchHeight]\n              : null\n      const speedCorrections = assetType === 'Aircraft' ? targetData.speed_corrections.Aircraft : assetType === 'Helicopter' ? targetData.speed_corrections.Helicopter : null\n\n      column.asset_speed = Number(this.state.assetSpeeds[column.asset_type])\n\n      let lowerSpeedSeen = null\n      let higherSpeedSeen = null\n      if (speedCorrections === null) {\n        column.speed_correction = 1.0\n      } else {\n        for (const idx in speedCorrections) {\n          const data = speedCorrections[idx]\n          if ((lowerSpeedSeen === null || data.speed > lowerSpeedSeen.speed) && data.speed <= column.asset_speed) {\n            lowerSpeedSeen = data\n          }\n          if ((higherSpeedSeen === null || data.speed < higherSpeedSeen.speed) && data.speed >= column.asset_speed) {\n            higherSpeedSeen = data\n          }\n        }\n        if (lowerSpeedSeen === null && higherSpeedSeen !== null) {\n          column.speed_correction = higherSpeedSeen.correction\n        } else if (lowerSpeedSeen !== null && higherSpeedSeen === null) {\n          column.speed_correction = lowerSpeedSeen.correction\n        } else if (lowerSpeedSeen !== null && higherSpeedSeen !== null) {\n          if (lowerSpeedSeen.correction === higherSpeedSeen.correction) {\n            column.speed_correction = lowerSpeedSeen.correction\n          } else {\n            const speedRange = higherSpeedSeen.speed - lowerSpeedSeen.speed\n            const correctionRange = higherSpeedSeen.correction - lowerSpeedSeen.correction\n            const assetSpeedOffset = column.asset_speed - lowerSpeedSeen.speed\n            const ratio = assetSpeedOffset / speedRange\n            column.speed_correction = lowerSpeedSeen.correction + ratio * correctionRange\n          }\n        } else {\n          column.speed_correction = 1.0\n        }\n      }\n\n      let highestSeenSweepWidth = 0\n      let highestSeenVis = 0\n      if (visibleDistanceData) {\n        for (const idx in visibleDistanceData) {\n          const data = visibleDistanceData[idx]\n          if (data.vis <= this.state.metVisibility && data.vis > highestSeenVis) {\n            highestSeenSweepWidth = data.sw\n            highestSeenVis = data.vis\n          }\n        }\n      }\n      column.wu = highestSeenSweepWidth\n      const weatherCorrectionsTable = targetData.weather_corrections === 'large' ? weatherCorrections.large : weatherCorrections.small\n      if (this.state.weatherImpact === 'low' || this.state.weatherImpact === 'medium' || this.state.weatherImpact === 'high') {\n        column.fw = weatherCorrectionsTable.IAMSAR[this.state.weatherImpact]\n      }\n      column.fatigue = this.state.fatigue\n\n      column.practical_track_spacing = this.state.practicalTrackSpacing.get(columnName)!\n      column.available_search_hours = this.state.availableSearchHours.get(columnName)!\n      column.recaclculate()\n    }\n  }\n\n  render() {\n    this.recalculate()\n    return (\n      <div>\n        <Table>\n          <WeatherDataTable weatherImpactChange={this.weatherImpactChange} weatherVisibilityChange={this.weatherVisibilityChange} metVisibility={this.state.metVisibility} />\n          <AssetSpeed assetType=\"Boat\" assetSpeedChange={this.assetSpeedChange} />\n          <AssetSpeed assetType=\"Aircraft\" assetSpeedChange={this.assetSpeedChange} />\n          <TargetTypeSelector possible_targets={this.possibleTargetsList} targetTypeChange={this.targetTypeChange} selected={this.state.targetType} />\n          <Fatigue fatigueChanged={this.fatigueChange} fatigue={this.state.fatigue} />\n        </Table>\n        <DataTable columns={this.state.columns} updateData={this.updateData} />\n      </div>\n    )\n  }\n}\n"],"mappings":"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","names":[]}