Skip to content

Commit

Permalink
More changes to Data Sharing table
Browse files Browse the repository at this point in the history
  • Loading branch information
toddburnside committed Feb 19, 2025
1 parent a7aae88 commit 79a1ca9
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 19 deletions.
8 changes: 4 additions & 4 deletions explore/src/main/scala/explore/tabs/ProgramTabContents.scala
Original file line number Diff line number Diff line change
Expand Up @@ -95,15 +95,15 @@ object ProgramTabContents
val countOfDataAccess =
props.users.get.count(pu => sharingRoles.contains(pu.role) && pu.hasDataAccess)

val dataUsersTile =
val dataSharingTile =
Tile(
ProgramTabTileIds.DataUsers.id,
s"Data Users ($countOfDataAccess)"
s"Data Sharing ($countOfDataAccess)"
)(
_ =>
ProgramUsersTable(
props.users,
ProgramUsersTable.Mode.DataUsers(userVault)
ProgramUsersTable.Mode.DataSharing(userVault)
),
(_, _) =>
<.div(
Expand Down Expand Up @@ -167,7 +167,7 @@ object ProgramTabContents
layouts,
List(
detailsTile,
dataUsersTile,
dataSharingTile,
notesTile,
configurationRequestsTile,
unrequestedConfigsTile
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,15 @@ object AddProgramUserButton
.flatMap(pu => props.users.mod(_ :+ pu).to[IO])
.switching(isActive.async, IsActive(_))

val toolTip = props.role match
case ProgramUserRole.External => "Share data with a new user"
case _ => s"Add ${props.role.longName}"

Button(
severity = Button.Severity.Secondary,
loading = isActive.get.value,
icon = Icons.UserPlus,
tooltip = s"Add ${props.role.longName}",
tooltip = toolTip,
onClick = addProgramUser.runAsync
).tiny.compact
)
37 changes: 23 additions & 14 deletions explore/src/main/scala/explore/users/ProgramUsersTable.scala
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

package explore.users

import cats.Order.given
import cats.data.NonEmptySet
import cats.effect.IO
import cats.syntax.all.*
Expand Down Expand Up @@ -60,6 +61,8 @@ import monocle.function.Each.*
import queries.common.InvitationQueriesGQL.RevokeInvitationMutation
import queries.common.ProposalQueriesGQL.DeleteProgramUser

import scala.collection.immutable.SortedSet

case class ProgramUsersTable(
users: View[List[ProgramUser]],
mode: ProgramUsersTable.Mode
Expand All @@ -72,8 +75,10 @@ case class ProgramUsersTable(
NonEmptySet.of(ProgramUserRole.Pi, ProgramUserRole.Coi, ProgramUserRole.CoiRO)
case Mode.SupportPrimary => NonEmptySet.of(ProgramUserRole.SupportPrimary)
case Mode.SupportSecondary => NonEmptySet.of(ProgramUserRole.SupportSecondary)
case Mode.DataUsers(_) =>
NonEmptySet.of(ProgramUserRole.Coi, ProgramUserRole.CoiRO, ProgramUserRole.External)
case Mode.DataSharing(_) =>
NonEmptySet.fromSetUnsafe(
SortedSet.from(Enumerated[ProgramUserRole].all) - ProgramUserRole.Pi
)

private val hiddenColumns: Set[ProgramUsersTable.Column] = mode match
case Mode.CoIs(_, proposalIsRo, userIsRoCoi) =>
Expand All @@ -91,7 +96,7 @@ case class ProgramUsersTable(
Column.DataAccess,
Column.Actions
)
case Mode.DataUsers(_) =>
case Mode.DataSharing(_) =>
Set(
Column.Partner,
Column.EducationalStatus,
Expand All @@ -104,7 +109,7 @@ object ProgramUsersTable:
case CoIs(vault: UserVault, proposalIsReadonly: Boolean, userIsReadonlyCoi: Boolean)
case SupportPrimary
case SupportSecondary
case DataUsers(vault: UserVault)
case DataSharing(vault: UserVault)

private case class TableMeta(
users: View[List[ProgramUser]],
Expand All @@ -117,7 +122,7 @@ object ProgramUsersTable:
val userId: Option[User.Id] = mode match
case Mode.CoIs(vault, _, _) => vault.user.id.some
case Mode.SupportPrimary | Mode.SupportSecondary => none
case Mode.DataUsers(vault) => vault.user.id.some
case Mode.DataSharing(vault) => vault.user.id.some

val userIsPi: Boolean = userId.fold(false)(id =>
users.get.exists(pu => pu.user.exists(_.id === id) && pu.role === ProgramUserRole.Pi)
Expand All @@ -128,7 +133,7 @@ object ProgramUsersTable:
case Mode.CoIs(_, proposalIsRo, userIsRoCoi) =>
!proposalIsRo && !userIsRoCoi && pu.role =!= ProgramUserRole.Pi
case Mode.SupportPrimary | Mode.SupportSecondary => false
case Mode.DataUsers(_) => userIsPi && pu.role === ProgramUserRole.External
case Mode.DataSharing(_) => userIsPi && pu.role === ProgramUserRole.External

def isCurrentUser(pu: ProgramUser): Boolean =
(userId, pu.user).mapN((uid, p) => uid === p.id).getOrElse(false)
Expand All @@ -138,18 +143,18 @@ object ProgramUsersTable:
case Mode.CoIs(_, proposalIsRo, userIsRoCoi) =>
!proposalIsRo && (!userIsRoCoi || isCurrentUser(pu))
case Mode.SupportPrimary | Mode.SupportSecondary => false
case Mode.DataUsers(_) => userIsPi && pu.role === ProgramUserRole.External
case Mode.DataSharing(_) => userIsPi && pu.role === ProgramUserRole.External

val userCanChangeCoiAccess: Boolean = mode match
case Mode.CoIs(vault, proposalIsRo, userIsRoCoi) =>
!proposalIsRo && (vault.isStaff || userIsPi)
case Mode.SupportPrimary | Mode.SupportSecondary => false
case Mode.DataUsers(_) => false
case Mode.DataSharing(_) => false

val canChangeDataAccess: Boolean = mode match
case Mode.CoIs(_, _, _) => false
case Mode.SupportPrimary | Mode.SupportSecondary => false
case Mode.DataUsers(_) => userIsPi
case Mode.DataSharing(_) => userIsPi

private val ColDef = ColumnDef.WithTableMeta[View[ProgramUser], TableMeta]

Expand Down Expand Up @@ -476,7 +481,7 @@ object ProgramUsersTable:
clazz = ExploreStyles.PartnerSelector
): VdomNode
else currentRole.shortName: VdomNode
).sortableBy(_.get.shortName),
).sortableBy(_.get),
ColDef(
Column.DataAccess.id,
_.zoom(ProgramUser.hasDataAccess),
Expand All @@ -495,7 +500,7 @@ object ProgramUsersTable:
disabled = !meta.canChangeDataAccess || meta.isActive.get.value,
onChange = r => view.set(r)
)
),
).sortableBy(_.get),
ColDef(
Column.Status.id,
_.get.status,
Expand Down Expand Up @@ -549,9 +554,13 @@ object ProgramUsersTable:
isActive <- useStateView(IsActive(false))
cols <- useMemo(()): _ =>
columns(using ctx)
rows <- useMemo(props.users.reuseByValue)(
_.toListOfViews.filter(row => props.filterRoles.contains_(row.get.role))
)
rows <- useMemo(props.users.reuseByValue): users =>
val rows =
users.toListOfViews.filter(row => props.filterRoles.contains_(row.get.role))
// for the data sharing table, sort by role so the support roles are last
props.mode match
case Mode.DataSharing(_) => rows.sortBy(_.get.role)
case _ => rows
overlayPanelRef <- useOverlayPanelRef
currentProgUser <- useStateView(none[View[ProgramUser]])
_ <- useEffectWithDeps(rows): rows =>
Expand Down

0 comments on commit 79a1ca9

Please sign in to comment.