UI: Group: Display resources, invites and action buttons

This commit is contained in:
Pere Lev 2024-05-18 14:11:39 +03:00
parent e542c7d531
commit 3e110ca53c
No known key found for this signature in database
GPG key ID: 5252C5C863E5E57D
3 changed files with 149 additions and 1 deletions

View file

@ -980,7 +980,16 @@ getGroupEffortsR groupHash = do
, AP.collectionItems = map (Doc h . makeItem) efforts , AP.collectionItems = map (Doc h . makeItem) efforts
, AP.collectionContext = Just $ encodeRouteLocal meR , AP.collectionContext = Just $ encodeRouteLocal meR
} }
provideHtmlAndAP effortsAP $ redirectToPrettyJSON (GroupEffortsR groupHash) provideHtmlAndAP effortsAP $ getHtml groupID group actor efforts
where
getHtml groupID group actor efforts = do
mp <- maybeAuthId
haveAdmin <- fmap isJust $ handlerToWidget $ runDB $ runMaybeT $ do
personID <- MaybeT $ pure mp
MaybeT $ getCapability personID (Left $ groupResource group) AP.RoleAdmin
((_, widgetAE), enctypeAE) <- handlerToWidget $ runFormPost addEffortForm
drafts <- handlerToWidget $ runDB $ getTeamResourceDrafts groupID
$(widgetFile "group/efforts")
addEffortForm = renderDivs $ (,) addEffortForm = renderDivs $ (,)
<$> areq fedUriField "Resource actor URI*" Nothing <$> areq fedUriField "Resource actor URI*" Nothing

View file

@ -68,6 +68,7 @@ module Vervis.Persist.Collab
, getSquadTeam , getSquadTeam
, getTeamResources , getTeamResources
, getTeamResourceDrafts
, getEffortAdd , getEffortAdd
, getEffortTopic , getEffortTopic
@ -1764,6 +1765,74 @@ getTeamResources groupID =
, effort E.^. EffortId , effort E.^. EffortId
) )
getTeamResourceDrafts
:: MonadIO m
=> GroupId
-> ReaderT SqlBackend m
[ ( Either (LocalActorBy Key, Actor) (Instance, RemoteObject, RemoteActor)
, Bool
, Either (LocalActorBy Key, Actor) (Instance, RemoteObject, RemoteActor)
, Bool
, UTCTime
, AP.Role
, EffortId
)
]
getTeamResourceDrafts groupID = do
efforts <- E.select $ E.from $ \ (effort `E.LeftOuterJoin` deleg) -> do
E.on $ E.just (effort E.^. EffortId) E.==. deleg E.?. EffortUsSendDelegatorEffort
E.where_ $
effort E.^. EffortHolder E.==. E.val groupID E.&&.
E.isNothing (deleg E.?. EffortUsSendDelegatorId)
E.orderBy [E.asc $ effort E.^. EffortId]
return effort
for efforts $ \ (Entity effortID (Effort role _)) -> do
(resource, accept) <- do
topic <- getEffortTopic effortID
accept <-
case bimap fst fst topic of
Left localID -> isJust <$> getBy (UniqueEffortThemAcceptLocal localID)
Right remoteID -> isJust <$> getBy (UniqueEffortThemAcceptRemote remoteID)
(,accept) <$> bitraverse
(\ (_, resourceID) -> do
lr <- getLocalResource resourceID
Resource actorID <- getJust resourceID
actor <- getJust actorID
return (resourceToActor lr, actor)
)
(\ (_, actorID) -> getRemoteActorData actorID)
topic
((inviter, time), us) <- do
usOrThem <-
requireEitherAlt
(getKeyBy $ UniqueEffortOriginUs effortID)
(getKeyBy $ UniqueEffortOriginThem effortID)
"Neither us nor them"
"Both us and them"
(addOrActor, us) <-
case usOrThem of
Left usID -> (,True) <$>
requireEitherAlt
(fmap effortUsGestureLocalAdd <$> getValBy (UniqueEffortUsGestureLocal usID))
(fmap (effortUsGestureRemoteActor &&& effortUsGestureRemoteAdd) <$> getValBy (UniqueEffortUsGestureRemote usID))
"Neither local not remote"
"Both local and remote"
Right themID -> (,False) <$>
requireEitherAlt
(fmap effortThemGestureLocalAdd <$> getValBy (UniqueEffortThemGestureLocal themID))
(fmap (effortThemGestureRemoteActor &&& effortThemGestureRemoteAdd) <$> getValBy (UniqueEffortThemGestureRemote themID))
"Neither local not remote"
"Both local and remote"
(,us) <$> case addOrActor of
Left addID -> do
OutboxItem outboxID _ time <- getJust addID
Entity actorID actor <- getByJust $ UniqueActorOutbox outboxID
(,time) . Left . (,actor) <$> getLocalActor actorID
Right (actorID, addID) -> do
RemoteActivity _ _ time <- getJust addID
(,time) . Right <$> getRemoteActorData actorID
return (inviter, us, resource, accept, time, role, effortID)
getEffortAdd getEffortAdd
:: MonadIO m :: MonadIO m
=> EffortId => EffortId

View file

@ -0,0 +1,70 @@
$# This file is part of Vervis.
$#
$# Written in 2016, 2019, 2022, 2023, 2024
$# by fr33domlover <fr33domlover@riseup.net>.
$#
$# ♡ Copying is an act of love. Please copy, reuse and share.
$#
$# The author(s) have dedicated all copyright and related and neighboring
$# rights to this software to the public domain worldwide. This software is
$# distributed without any warranty.
$#
$# You should have received a copy of the CC0 Public Domain Dedication along
$# with this software. If not, see
$# <http://creativecommons.org/publicdomain/zero/1.0/>.
^{groupNavW (Entity groupID group) actor}
<h2>Accessible Resources
<table>
<tr>
<th>Role
<th>Since
<th>Resource
$if haveAdmin
<th>Remove
$forall (role, since, resource, effortID) <- efforts
<tr>
<td>#{show role}
<td>#{showDate since}
<td>^{actorLinkFedW resource}
$if haveAdmin
<td>^{buttonW POST "Remove" (GroupRemoveEffortR groupHash effortID)}
$if haveAdmin
<p>Request access to a resource:
<form method=POST action=@{GroupAddEffortR groupHash} enctype=#{enctypeAE}>
^{widgetAE}
<input type=submit>
<h2>Requests In Progress
<table>
<tr>
<th>Inviter
<th>Via
<th>Requested resource
<th>Resource accepted?
<th>Role
<th>Time
$if haveAdmin
<th>Approve
$forall (inviter, us, resource, accept, time, role, effortID) <- drafts
<tr>
<td>^{actorLinkFedW inviter}
<td>
$if us
Us
$else
Them
<td>^{actorLinkFedW resource}
<td>
$if accept
[x]
$else
[_]
<td>#{show role}
<td>#{showDate time}
$if haveAdmin && (accept && not us)
<td>^{buttonW POST "Approve" (GroupApproveEffortR groupHash effortID)}