@@ -11,14 +11,15 @@ import ChallengeViewComponent from '../ChallengeView'
11
11
import { PrimaryButton } from '../../Buttons'
12
12
import LegacyLinks from '../../LegacyLinks'
13
13
import ForumLink from '../../ForumLink'
14
- import Registrants from '../Registrants '
14
+ import ResourcesTab from '../Resources '
15
15
import Submissions from '../Submissions'
16
- import { checkAdmin , checkReadOnlyRoles , getResourceRoleByName } from '../../../util/tc'
16
+ import { checkAdmin , checkEditResourceRoles , checkReadOnlyRoles } from '../../../util/tc'
17
17
import { CHALLENGE_STATUS , MESSAGE } from '../../../config/constants'
18
18
import Tooltip from '../../Tooltip'
19
19
import CancelDropDown from '../Cancel-Dropdown'
20
20
import 'react-tabs/style/react-tabs.css'
21
21
import styles from './ChallengeViewTabs.module.scss'
22
+ import ResourcesAdd from '../ResourcesAdd'
22
23
23
24
function getSelectorStyle ( selectedView , currentView ) {
24
25
return cn ( styles [ 'challenge-selector-common' ] , {
@@ -47,20 +48,23 @@ const ChallengeViewTabs = ({
47
48
assignYourselfCopilot,
48
49
showRejectChallengeModal,
49
50
loggedInUser,
50
- onApproveChallenge
51
+ onApproveChallenge,
52
+ createResource,
53
+ deleteResource
51
54
} ) => {
52
55
const [ selectedTab , setSelectedTab ] = useState ( 0 )
56
+ const [ showAddResourceModal , setShowAddResourceModal ] = useState ( false )
57
+ const { resourceRoles } = metadata
53
58
const loggedInUserResource = useMemo (
54
59
( ) => {
55
60
if ( ! loggedInUser ) {
56
61
return null
57
62
}
58
- const loggedInUserResourceTmps = _ . filter ( challengeResources , { memberId : `${ loggedInUser . userId } ` } )
63
+ const loggedInUserResourceTmps = _ . cloneDeep ( _ . filter ( challengeResources , { memberId : `${ loggedInUser . userId } ` } ) )
59
64
let loggedInUserResourceTmp = null
60
65
if ( loggedInUserResourceTmps . length > 0 ) {
61
66
loggedInUserResourceTmp = loggedInUserResourceTmps [ 0 ]
62
67
loggedInUserResourceTmp . resources = loggedInUserResourceTmps
63
- const { resourceRoles } = metadata
64
68
if ( resourceRoles ) {
65
69
let roles = [ ]
66
70
_ . forEach ( loggedInUserResourceTmps , resource => {
@@ -74,37 +78,38 @@ const ChallengeViewTabs = ({
74
78
} ,
75
79
[ loggedInUser , challengeResources , metadata ]
76
80
)
77
-
78
- const registrants = useMemo ( ( ) => {
79
- const { resourceRoles } = metadata
80
- const role = getResourceRoleByName ( resourceRoles , 'Submitter' )
81
- if ( role && challengeResources ) {
82
- const registrantList = challengeResources . filter (
83
- resource => resource . roleId === role . id
81
+ const canEditResource = useMemo (
82
+ ( ) => {
83
+ return selectedTab === 1 &&
84
+ (
85
+ (
86
+ loggedInUserResource &&
87
+ checkEditResourceRoles ( loggedInUserResource . roles )
88
+ ) ||
89
+ checkAdmin ( token )
84
90
)
85
- // Add submission date to registrants
86
- registrantList . forEach ( ( r , i ) => {
87
- const submission = ( challengeSubmissions || [ ] ) . find ( s => {
88
- return '' + s . memberId === '' + r . memberId
89
- } )
90
- if ( submission ) {
91
- registrantList [ i ] . submissionDate = submission . created
92
- }
93
- } )
94
- return registrantList
95
- } else {
96
- return [ ]
97
- }
98
- } , [ metadata , challengeResources , challengeSubmissions ] )
91
+ } ,
92
+ [ loggedInUserResource , token , selectedTab ]
93
+ )
94
+
95
+ const allResources = useMemo ( ( ) => {
96
+ return challengeResources . map ( rs => {
97
+ if ( ! rs . role ) {
98
+ const roleInfo = _ . find ( resourceRoles , { id : rs . roleId } )
99
+ rs . role = roleInfo ? roleInfo . name : ''
100
+ }
101
+ return rs
102
+ } )
103
+ } , [ metadata , challengeResources ] )
99
104
100
105
const submissions = useMemo ( ( ) => {
101
106
return _ . map ( challengeSubmissions , s => {
102
- s . registrant = _ . find ( registrants , r => {
107
+ s . registrant = _ . find ( allResources , r => {
103
108
return + r . memberId === s . memberId
104
109
} )
105
110
return s
106
111
} )
107
- } , [ challengeSubmissions , registrants ] )
112
+ } , [ challengeSubmissions , allResources ] )
108
113
109
114
const isTask = _ . get ( challenge , 'task.isTask' , false )
110
115
@@ -193,9 +198,14 @@ const ChallengeViewTabs = ({
193
198
) }
194
199
</ div >
195
200
) }
196
- { enableEdit && (
201
+ { enableEdit && ! canEditResource && (
197
202
< PrimaryButton text = { 'Edit' } type = { 'info' } submit link = { `./edit` } />
198
203
) }
204
+ { canEditResource && (
205
+ < PrimaryButton text = { 'Add' } type = { 'info' } onClick = { ( ) => {
206
+ setShowAddResourceModal ( true )
207
+ } } />
208
+ ) }
199
209
{ isSelfService && isDraft && ( isAdmin || isSelfServiceCopilot || enableEdit ) && (
200
210
< div className = { styles . button } >
201
211
< PrimaryButton
@@ -205,7 +215,7 @@ const ChallengeViewTabs = ({
205
215
/>
206
216
</ div >
207
217
) }
208
- < PrimaryButton text = { 'Back' } type = { 'info' } submit link = { `..` } />
218
+ { ! canEditResource ? ( < PrimaryButton text = { 'Back' } type = { 'info' } submit link = { `..` } /> ) : null }
209
219
</ div >
210
220
</ div >
211
221
< div className = { styles [ 'challenge-view-selector' ] } >
@@ -223,22 +233,20 @@ const ChallengeViewTabs = ({
223
233
>
224
234
DETAILS
225
235
</ a >
226
- { registrants . length ? (
227
- < a
228
- tabIndex = '1'
229
- role = 'tab'
230
- aria-selected = { selectedTab === 1 }
231
- onClick = { e => {
232
- setSelectedTab ( 1 )
233
- } }
234
- onKeyPress = { e => {
235
- setSelectedTab ( 1 )
236
- } }
237
- className = { getSelectorStyle ( selectedTab , 1 ) }
238
- >
239
- REGISTRANTS ({ registrants . length } )
240
- </ a >
241
- ) : null }
236
+ < a
237
+ tabIndex = '1'
238
+ role = 'tab'
239
+ aria-selected = { selectedTab === 1 }
240
+ onClick = { e => {
241
+ setSelectedTab ( 1 )
242
+ } }
243
+ onKeyPress = { e => {
244
+ setSelectedTab ( 1 )
245
+ } }
246
+ className = { getSelectorStyle ( selectedTab , 1 ) }
247
+ >
248
+ RESOURCES
249
+ </ a >
242
250
{ challengeSubmissions . length ? (
243
251
< a
244
252
tabIndex = '2'
@@ -279,7 +287,14 @@ const ChallengeViewTabs = ({
279
287
/>
280
288
) }
281
289
{ selectedTab === 1 && (
282
- < Registrants challenge = { challenge } registrants = { registrants } />
290
+ < ResourcesTab
291
+ challenge = { challenge }
292
+ resources = { allResources }
293
+ canEditResource = { canEditResource }
294
+ deleteResource = { deleteResource }
295
+ submissions = { submissions }
296
+ loggedInUserResource = { loggedInUserResource }
297
+ />
283
298
) }
284
299
{ selectedTab === 2 && (
285
300
< Submissions
@@ -289,6 +304,13 @@ const ChallengeViewTabs = ({
289
304
loggedInUserResource = { loggedInUserResource }
290
305
/>
291
306
) }
307
+ { showAddResourceModal ? ( < ResourcesAdd
308
+ onClose = { ( ) => setShowAddResourceModal ( false ) }
309
+ challenge = { challenge }
310
+ loggedInUser = { loggedInUser }
311
+ resourceRoles = { resourceRoles }
312
+ createResource = { createResource }
313
+ /> ) : null }
292
314
</ div >
293
315
)
294
316
}
@@ -319,6 +341,8 @@ ChallengeViewTabs.propTypes = {
319
341
onCloseTask : PropTypes . func ,
320
342
projectPhases : PropTypes . arrayOf ( PropTypes . object ) ,
321
343
assignYourselfCopilot : PropTypes . func . isRequired ,
344
+ createResource : PropTypes . func . isRequired ,
345
+ deleteResource : PropTypes . func . isRequired ,
322
346
showRejectChallengeModal : PropTypes . func . isRequired ,
323
347
loggedInUser : PropTypes . object . isRequired ,
324
348
onApproveChallenge : PropTypes . func
0 commit comments