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

lucuma.ui.table.ColumnSelector.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.table

import japgolly.scalajs.react.*
import japgolly.scalajs.react.vdom.html_<^.*
import lucuma.react.common.*
import lucuma.react.primereact.Button
import lucuma.react.primereact.Checkbox
import lucuma.react.primereact.MenuItem
import lucuma.react.primereact.PopupMenu
import lucuma.react.primereact.hooks.all.*
import lucuma.react.table.ColumnId
import lucuma.react.table.ColumnVisibility
import lucuma.react.table.Visibility
import lucuma.ui.primereact.LucumaPrimeStyles

case class ColumnSelector(
  allColumns:             List[(ColumnId, String)],
  columnVisibility:       ColumnVisibility,
  toggleColumnVisibility: ColumnId => Callback,
  clazz:                  Css = Css.Empty
) extends ReactFnProps(ColumnSelector.component)

object ColumnSelector:
  private type Props = ColumnSelector

  private val component =
    ScalaFnComponent
      .withHooks[Props]
      .usePopupMenuRef
      .render: (props, menuRef) =>
        val menuItems =
          props.allColumns
            .map: (colId, colName) =>
              MenuItem.Custom(
                <.div(LucumaPrimeStyles.CheckboxWithLabel)(
                  Checkbox(
                    id = colId.value,
                    checked = !props.columnVisibility.value.get(colId).contains(Visibility.Hidden),
                    onChange = _ => props.toggleColumnVisibility(colId)
                  ),
                  <.label(^.htmlFor := colId.value, colName)
                )
              )

        React.Fragment(
          Button(
            label = "Columns",
            icon = "pi pi-chevron-down",
            iconPos = Button.IconPosition.Right,
            text = true,
            clazz = props.clazz,
            severity = Button.Severity.Secondary,
            onClickE = menuRef.toggle
          ),
          PopupMenu(model = menuItems, clazz = props.clazz).withRef(menuRef.ref)
        )




© 2015 - 2025 Weber Informatics LLC | Privacy Policy