All Downloads are FREE. Search and download functionalities are using the official Maven repository.

lucuma.ui.sequence.package.scala Maven / Gradle / Ivy

// Copyright (c) 2016-2023 Association of Universities for Research in Astronomy, Inc. (AURA)
// For license information see LICENSE or https://opensource.org/licenses/BSD-3-Clause

package lucuma.ui.sequence

import cats.syntax.eq.*
import eu.timepit.refined.types.numeric.PosInt
import japgolly.scalajs.react.vdom.html_<^.*
import lucuma.core.enums.DatasetQaState
import lucuma.core.enums.ObserveClass
import lucuma.core.math.SignalToNoise
import lucuma.core.model.sequence.Step
import lucuma.core.model.sequence.gmos.DynamicConfig
import lucuma.core.util.NewType
import lucuma.react.SizePx
import lucuma.react.common.*
import lucuma.react.primereact.Tag
import lucuma.react.primereact.Tooltip
import lucuma.react.primereact.tooltip.*
import lucuma.react.syntax.*
import lucuma.schemas.model.enums.StepExecutionState
import lucuma.ui.LucumaIcons
import lucuma.ui.LucumaStyles
import lucuma.ui.utils.*
import lucuma.ui.utils.Render

object SequenceRowHeight:
  val Regular: SizePx   = 25.toPx
  val WithExtra: SizePx = 60.toPx

object StepIndex extends NewType[PosInt]:
  val One: StepIndex = StepIndex(PosInt.unsafeFrom(1))
type StepIndex = StepIndex.Type

private def renderStepType(icon: VdomNode, tooltip: String): VdomNode =
  <.span(icon).withTooltip(content = tooltip, showDelay = 100, position = Tooltip.Position.Bottom)

extension (stepTypeDisplay: StepTypeDisplay)
  private def icon: VdomNode =
    stepTypeDisplay match
      case StepTypeDisplay.Bias   => SequenceIcons.StepType.Bias
      case StepTypeDisplay.Dark   => SequenceIcons.StepType.Dark
      case StepTypeDisplay.Arc    => SequenceIcons.StepType.Arc
      case StepTypeDisplay.Flat   => SequenceIcons.StepType.Flat
      case StepTypeDisplay.Object => SequenceIcons.StepType.Object

given Render[StepTypeDisplay] = Render.by: stepType =>
  renderStepType(stepType.icon, stepType.name)

given Render[Option[DatasetQaState]] = Render.by: qaState =>
  LucumaIcons.Circle.withClass:
    qaState match
      case Some(DatasetQaState.Pass)   => LucumaStyles.IndicatorOK
      case Some(DatasetQaState.Usable) => LucumaStyles.IndicatorWarning
      case Some(DatasetQaState.Fail)   => LucumaStyles.IndicatorFail
      case None                        => LucumaStyles.IndicatorUnknown

given Render[StepExecutionState] = Render.by:
  case StepExecutionState.NotStarted | StepExecutionState.Ongoing | StepExecutionState.Completed =>
    EmptyVdom
  case other @ (StepExecutionState.Aborted | StepExecutionState.Stopped |
      StepExecutionState.Abandoned) =>
    Tag(
      other match
        case StepExecutionState.Aborted   => "Aborted"
        case StepExecutionState.Stopped   => "Stopped Early"
        case StepExecutionState.Abandoned => "Abandoned",
      severity = other match
        case StepExecutionState.Stopped => Tag.Severity.Info
        case _                          => Tag.Severity.Danger
    )

extension [D, R <: SequenceRow[D]](list: List[R])
  /* Zip list with `StepIndex` and return the indexed list and the next index */
  def zipWithStepIndex(
    initial: StepIndex = StepIndex(PosInt.unsafeFrom(1))
  ): (List[(R, StepIndex)], StepIndex) =
    (list.zipWithMappedIndex(index => initial.modifyValue(i => PosInt.unsafeFrom(i.value + index))),
     initial.modifyValue(i => PosInt.unsafeFrom(i.value + list.size))
    )

extension (sn: Option[SignalToNoise])
  def showForFutureStep[D](r: Step[D]): Option[SignalToNoise] =
    sn.filter: _ =>
      r.instrumentConfig match
        case DynamicConfig.GmosNorth(_, _, _, _, _, _, fpu) =>
          val showScience = r.observeClass === ObserveClass.Science
          val showAcq     = r.observeClass === ObserveClass.Acquisition && fpu.isEmpty
          showScience || showAcq

        case DynamicConfig.GmosSouth(_, _, _, _, _, _, fpu) =>
          val showScience = r.observeClass === ObserveClass.Science
          val showAcq     = r.observeClass === ObserveClass.Acquisition && fpu.isEmpty
          showScience || showAcq

        case _ => false




© 2015 - 2025 Weber Informatics LLC | Privacy Policy