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

lucuma.react.primereact.ConfirmDialog.scala Maven / Gradle / Ivy

There is a newer version: 0.73.0
Show newest version
// 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.react.primereact

import japgolly.scalajs.react.*
import japgolly.scalajs.react.vdom.html_<^.*
import lucuma.react.common.*
import lucuma.react.fa.FontAwesomeIcon
import lucuma.typed.primereact.components.ConfirmDialog as CConfirmDialog
import lucuma.typed.primereact.confirmdialogConfirmdialogMod.ConfirmDialogProps
import lucuma.typed.primereact.confirmdialogConfirmdialogMod.confirmDialog as rawConfirmDialog
import org.scalablytyped.runtime.StObject

import scalajs.js

// This component is setup to be used via the `confirmDialog` method. But to use that,
// you need an empty `ConfirmDialog()` on the page.
case class ConfirmDialog(
) extends ReactFnProps[ConfirmDialog](ConfirmDialog.component)

object ConfirmDialog {

  // To use this method, you need an empty `ConfirmDialog()` somewhere on the page.
  // Big Note: According to the documentation and the typescript types, the
  // `confirmDialog` function is supposed to work like the `confirmPopup` function
  // and return an object with `show` and `hide` methods and you call `show`
  // to open it. However.... If you do that, clicking on ANY button on the page,
  // as well as many other controls will open the dialog, rendering it useless.
  // However, just calling the `confirmDialog` function (wrapped in a callback)
  // seems to work just fine.
  def confirmDialog(
    message:     js.UndefOr[VdomNode] = js.undefined,
    icon:        js.UndefOr[FontAwesomeIcon] = js.undefined,
    header:      js.UndefOr[VdomNode] = js.undefined,
    footer:      js.UndefOr[VdomNode] = js.undefined,
    acceptLabel: js.UndefOr[String] = js.undefined, // default: Yes
    rejectLabel: js.UndefOr[String] = js.undefined, // default: No
    acceptIcon:  js.UndefOr[FontAwesomeIcon | String] = js.undefined,
    rejectIcon:  js.UndefOr[FontAwesomeIcon | String] = js.undefined,
    acceptClass: js.UndefOr[Css] = js.undefined,
    rejectClass: js.UndefOr[Css] = js.undefined,
    clazz:       js.UndefOr[Css] = js.undefined,
    position:    js.UndefOr[DialogPosition] = js.undefined,
    onHide:      js.UndefOr[ConfirmDialogHideParm => Callback] = js.undefined,
    accept:      js.UndefOr[Callback] = js.undefined,
    reject:      js.UndefOr[Callback] = js.undefined
  ): Callback =
    Callback {
      val props = ConfirmDialogProps()
      message.foreach(v => props.setMessage(v.rawNode))
      icon.foreach(v => props.setIcon(v.toPrime))
      // header not in the ST facade
      header.foreach(v => StObject.set(props, "header", v.rawNode))
      footer.foreach(v => props.setFooter(v.rawNode))
      acceptLabel.foreach(v => props.setAcceptLabel(v))
      rejectLabel.foreach(v => props.setRejectLabel(v))
      acceptIcon.foreach(v => props.setAcceptIcon(v.toPrime))
      rejectIcon.foreach(v => props.setRejectIcon(v.toPrime))
      acceptClass.foreach(v => props.setAcceptClassName(v.htmlClass))
      rejectClass.foreach(v => props.setRejectClassName(v.htmlClass))
      clazz.foreach(v => props.setClassName(v.htmlClass))

      // position not in the ST facade, either
      position.foreach(v => StObject.set(props, "position", v.value))
      onHide.foreach(v => props.setOnHide(s => v(ConfirmDialogHideParm.fromString(s))))
      accept.foreach(v => props.setAccept(v))
      reject.foreach(v => props.setReject(v))

      rawConfirmDialog(props)
    }
    // In case this ever starts working as advertised, remove the Callback wrapper above
    // and uncomment the line below.
    // ConfirmDialogReturn(Callback(rawReturn.show()), Callback(rawReturn.hide()))

  private val component = ScalaFnComponent[ConfirmDialog] { props =>
    CConfirmDialog()
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy