@@ -15,7 +15,7 @@ import { useDispatch, useSelector } from "react-redux";
1515import { Container , Dimmer , Dropdown , Icon , Loader } from "semantic-ui-react" ;
1616import isEqual from "lodash/isEqual" ;
1717
18- import { fetchWorkflows } from "~/actions" ;
18+ import { fetchUsersSharedWithYou , fetchWorkflows } from "~/actions" ;
1919import {
2020 getConfig ,
2121 getReanaToken ,
@@ -25,6 +25,7 @@ import {
2525 loadingWorkflows ,
2626 userHasWorkflows ,
2727 getWorkflowRefresh ,
28+ getUsersSharedWithYou ,
2829} from "~/selectors" ;
2930import { NON_DELETED_STATUSES } from "~/config" ;
3031import { Title , Pagination , Search } from "~/components" ;
@@ -58,6 +59,7 @@ function Workflows() {
5859 const workflows = useSelector ( getWorkflows ) ;
5960 const workflowsCount = useSelector ( getWorkflowsCount ) ;
6061 const hasUserWorkflows = useSelector ( userHasWorkflows ) ;
62+ const usersSharedWithYou = useSelector ( getUsersSharedWithYou ) ;
6163 const workflowRefresh = useSelector ( getWorkflowRefresh ) ;
6264 const loading = useSelector ( loadingWorkflows ) ;
6365 const reanaToken = useSelector ( getReanaToken ) ;
@@ -82,17 +84,27 @@ function Workflows() {
8284 const [ committedSearch , setCommittedSearch ] = useState ( initialSearch ) ;
8385
8486 // Owned by derived from URL
85- const ownedByFilter = useMemo (
86- ( ) => ( searchParams . get ( "shared" ) === "true" ? "anybody" : "you" ) ,
87- [ searchParams ] ,
88- ) ;
87+ const ownedByFilter = useMemo ( ( ) => {
88+ const sharedBy = searchParams . get ( "shared-by" ) ;
89+ if ( sharedBy ) {
90+ // Explicit owner selected, e.g. [email protected] 91+ return sharedBy ;
92+ }
93+ // Fallback to "you" vs "anybody" based on `shared`
94+ return searchParams . get ( "shared" ) === "true" ? "anybody" : "you" ;
95+ } , [ searchParams ] ) ;
8996
9097 // Shared with flag from URL
9198 const sharedWithMode = useMemo (
9299 ( ) => searchParams . get ( "shared-with" ) === "true" ,
93100 [ searchParams ] ,
94101 ) ;
95102
103+ // Load information about users who have shared workflows with you
104+ useEffect ( ( ) => {
105+ dispatch ( fetchUsersSharedWithYou ( ) ) ;
106+ } , [ dispatch ] ) ;
107+
96108 const [ sharedWithFilter , setSharedWithFilter ] = useState ( ( ) =>
97109 searchParams . get ( "shared-with" ) === "true" ? "anybody" : undefined ,
98110 ) ;
@@ -114,6 +126,26 @@ function Workflows() {
114126 ( ) => searchParams . get ( "sort" ) || "desc" ,
115127 [ searchParams ] ,
116128 ) ;
129+ const interactiveOnlyFilter = useMemo (
130+ ( ) => searchParams . get ( "open-sessions" ) === "true" ,
131+ [ searchParams ] ,
132+ ) ;
133+
134+ const setInteractiveOnlyFilterInUrl = ( on ) => {
135+ setSearchParams (
136+ ( prev ) => {
137+ const qp = new URLSearchParams ( prev ) ;
138+ if ( on ) {
139+ qp . set ( "open-sessions" , "true" ) ;
140+ } else {
141+ qp . delete ( "open-sessions" ) ;
142+ }
143+ qp . delete ( "page" ) ; // reset pagination when filter changes
144+ return qp ;
145+ } ,
146+ { replace : false } ,
147+ ) ;
148+ } ;
117149
118150 // URL writers
119151 const setStatusFilterInUrl = ( nextStatus ) => {
@@ -157,8 +189,19 @@ function Workflows() {
157189 ( prev ) => {
158190 const qp = new URLSearchParams ( prev ) ;
159191 qp . delete ( "shared-with" ) ; // ensure shared-with mode is off
160- if ( next === "anybody" ) qp . set ( "shared" , "true" ) ;
161- else qp . delete ( "shared" ) ; // default is "you"
192+ if ( next === "anybody" ) {
193+ // Show anybody's workflows
194+ qp . set ( "shared" , "true" ) ;
195+ qp . delete ( "shared-by" ) ;
196+ } else if ( ! next || next === "you" ) {
197+ // Back to "you": default view
198+ qp . delete ( "shared" ) ;
199+ qp . delete ( "shared-by" ) ;
200+ } else {
201+ // Specific owner selected, e.g. [email protected] 202+ qp . delete ( "shared" ) ;
203+ qp . set ( "shared-by" , next ) ;
204+ }
162205 qp . delete ( "page" ) ;
163206 return qp ;
164207 } ,
@@ -172,6 +215,7 @@ function Workflows() {
172215 if ( on ) {
173216 qp . set ( "shared-with" , "true" ) ;
174217 qp . delete ( "shared" ) ;
218+ qp . delete ( "shared-by" ) ;
175219 } else {
176220 qp . delete ( "shared-with" ) ;
177221 }
@@ -246,12 +290,19 @@ function Workflows() {
246290 // owned-by vs shared-with
247291 const inSharedWith = sharedWithMode ;
248292
293+ // owned-by -> shared / shared_by mapping:
294+ // - owned_by=you -> shared=false, shared_by undefined
295+ // - owned_by=anybody -> shared=true, shared_by=null
296+ // - owned_by=<user@email> -> shared=false, shared_by=<user@email>
249297 let shared , sharedBy ;
250298 if ( ! inSharedWith ) {
251299 if ( ownedByFilter === "anybody" ) {
252300 shared = true ;
253301 sharedBy = null ;
254- } else if ( ownedByFilter && ownedByFilter !== "you" ) {
302+ } else if ( ! ownedByFilter || ownedByFilter === "you" ) {
303+ shared = false ;
304+ } else {
305+ shared = false ;
255306 sharedBy = ownedByFilter ;
256307 }
257308 }
@@ -282,6 +333,7 @@ function Workflows() {
282333 sharedBy,
283334 sharedWith : sharedWithParam ,
284335 sort : sortDir ,
336+ ...( interactiveOnlyFilter ? { type : "interactive" } : { } ) ,
285337 } ;
286338 } , [
287339 pagination ,
@@ -293,6 +345,7 @@ function Workflows() {
293345 sharedWithFilter ,
294346 sharedWithMode ,
295347 sortDir ,
348+ interactiveOnlyFilter ,
296349 ] ) ;
297350
298351 const lastParamsRef = useRef ( ) ;
@@ -365,7 +418,9 @@ function Workflows() {
365418 ) ;
366419 }
367420
368- if ( ! hasUserWorkflows ) return < Welcome /> ;
421+ if ( ! hasUserWorkflows && usersSharedWithYou . length === 0 ) {
422+ return < Welcome /> ;
423+ }
369424
370425 // Flatten workflows object to array for rendering
371426 const workflowArray = Object . values ( workflows || { } ) ;
@@ -395,6 +450,8 @@ function Workflows() {
395450 showDeleted = { showDeletedMode }
396451 setShowDeleted = { setShowDeletedInUrl }
397452 statusExplicit = { statusExplicit }
453+ interactiveOnlyFilter = { interactiveOnlyFilter }
454+ setInteractiveOnlyFilter = { setInteractiveOnlyFilterInUrl }
398455 ownedByFilter = { ownedByFilter }
399456 setOwnedByFilter = { setOwnedByFilter }
400457 sharedWithFilter = { sharedWithFilter }
0 commit comments