Skip to content

Commit 9cae21e

Browse files
author
vikasrohit
authored
Merge pull request #3325 from fikzzzy/feature/new-roles
implement new project roles
2 parents 1f9e422 + 3bb1fb3 commit 9cae21e

File tree

9 files changed

+238
-76
lines changed

9 files changed

+238
-76
lines changed

src/components/TeamManagement/TopcoderManagementDialog.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,18 @@ class TopcoderManagementDialog extends React.Component {
4444
}, {
4545
title: 'Account Manager',
4646
value: 'account_manager',
47+
}, {
48+
title: 'Account Executive',
49+
value: 'account_executive',
50+
}, {
51+
title: 'Program Manager',
52+
value: 'program_manager',
53+
}, {
54+
title: 'Solution Architect',
55+
value: 'solution_architect',
56+
}, {
57+
title: 'Project Manager',
58+
value: 'project_manager',
4759
}]
4860
}
4961

@@ -208,7 +220,7 @@ class TopcoderManagementDialog extends React.Component {
208220
</div>
209221
)
210222
}
211-
const types = ['Observer', 'Copilot', 'Manager', 'Account Manager']
223+
const types = ['Observer', 'Copilot', 'Manager', 'Account Manager', 'Account Executive', 'Program Manager', 'Solution Architect', 'Project Manager']
212224
const currentType = role
213225
const onClick = (type) => {
214226
this.onUserRoleChange(member.userId, member.id, type)

src/components/TopBar/TopBarContainer.js

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@ import {
1111
ROLE_ADMINISTRATOR,
1212
ROLE_CONNECT_ADMIN,
1313
ROLE_CONNECT_ACCOUNT_MANAGER,
14-
DOMAIN
14+
DOMAIN,
15+
ROLE_BUSINESS_DEVELOPMENT_REPRESENTATIVE,
16+
ROLE_PRESALES,
17+
ROLE_ACCOUNT_EXECUTIVE,
18+
ROLE_PROJECT_MANAGER,
19+
ROLE_PROGRAM_MANAGER, ROLE_SOLUTION_ARCHITECT
1520
} from '../../config/constants'
1621
import ConnectLogoMono from '../../assets/icons/connect-logo-mono.svg'
1722
import { getAvatarResized, getFullNameWithFallback } from '../../helpers/tcHelpers.js'
@@ -165,7 +170,20 @@ class TopBarContainer extends React.Component {
165170

166171
const mapStateToProps = ({ loadUser }) => {
167172
let isPowerUser = false
168-
const roles = [ROLE_CONNECT_COPILOT, ROLE_CONNECT_MANAGER, ROLE_CONNECT_ACCOUNT_MANAGER, ROLE_ADMINISTRATOR, ROLE_CONNECT_ADMIN]
173+
const roles = [
174+
ROLE_CONNECT_COPILOT,
175+
ROLE_CONNECT_MANAGER,
176+
ROLE_CONNECT_ACCOUNT_MANAGER,
177+
ROLE_ADMINISTRATOR,
178+
ROLE_CONNECT_ADMIN,
179+
180+
ROLE_BUSINESS_DEVELOPMENT_REPRESENTATIVE,
181+
ROLE_PRESALES,
182+
ROLE_ACCOUNT_EXECUTIVE,
183+
ROLE_PROJECT_MANAGER,
184+
ROLE_PROGRAM_MANAGER,
185+
ROLE_SOLUTION_ARCHITECT,
186+
]
169187
if (loadUser.user) {
170188
isPowerUser = loadUser.user.roles.some((role) => roles.indexOf(role) !== -1)
171189
}

src/config/constants.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -626,7 +626,10 @@ export const PROJECT_ROLE_ACCOUNT_MANAGER = 'account_manager'
626626
export const PROJECT_ROLE_CUSTOMER = 'customer'
627627
export const PROJECT_ROLE_OWNER = 'owner'
628628
export const PROJECT_ROLE_MEMBER = 'member' // this is need for notifications
629-
629+
export const PROJECT_ROLE_ACCOUNT_EXECUTIVE = 'account_executive'
630+
export const PROJECT_ROLE_PROGRAM_MANAGER = 'program_manager'
631+
export const PROJECT_ROLE_SOLUTION_ARCHITECT = 'solution_architect'
632+
export const PROJECT_ROLE_PROJECT_MANAGER = 'project_manager'
630633
/*
631634
* Events
632635
*/
@@ -642,6 +645,12 @@ export const ROLE_CONNECT_ACCOUNT_MANAGER = 'Connect Account Manager'
642645
export const ROLE_CONNECT_ADMIN = 'Connect Admin'
643646
export const ROLE_ADMINISTRATOR = 'administrator'
644647
export const ROLE_CONNECT_COPILOT_MANAGER = 'Connect Copilot Manager'
648+
export const ROLE_BUSINESS_DEVELOPMENT_REPRESENTATIVE = 'Business Development Representative'
649+
export const ROLE_PRESALES = 'Presales'
650+
export const ROLE_ACCOUNT_EXECUTIVE = 'Account Executive'
651+
export const ROLE_PROGRAM_MANAGER = 'Program Manager'
652+
export const ROLE_SOLUTION_ARCHITECT = 'Solution Architect'
653+
export const ROLE_PROJECT_MANAGER = 'Project Manager'
645654

646655
// FIXME .. remove defaults
647656
export const FILE_PICKER_API_KEY = process.env.FILE_PICKER_API_KEY || ''

src/config/permissions.js

Lines changed: 75 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,31 +6,98 @@ import {
66
ROLE_ADMINISTRATOR,
77
ROLE_CONNECT_ADMIN,
88
ROLE_CONNECT_MANAGER,
9-
ROLE_CONNECT_ACCOUNT_MANAGER
9+
ROLE_CONNECT_ACCOUNT_MANAGER,
10+
ROLE_BUSINESS_DEVELOPMENT_REPRESENTATIVE,
11+
ROLE_PRESALES,
12+
ROLE_ACCOUNT_EXECUTIVE,
13+
ROLE_PROGRAM_MANAGER,
14+
ROLE_SOLUTION_ARCHITECT,
15+
ROLE_PROJECT_MANAGER,
16+
PROJECT_ROLE_ACCOUNT_EXECUTIVE,
17+
PROJECT_ROLE_PROJECT_MANAGER,
18+
PROJECT_ROLE_PROGRAM_MANAGER,
19+
PROJECT_ROLE_SOLUTION_ARCHITECT
1020
} from './constants'
1121

1222
export default {
1323
EDIT_PROJECT_PLAN: {
14-
projectRoles: [PROJECT_ROLE_MANAGER, PROJECT_ROLE_COPILOT, ROLE_CONNECT_ADMIN],
24+
projectRoles: [
25+
PROJECT_ROLE_MANAGER,
26+
PROJECT_ROLE_PROJECT_MANAGER,
27+
PROJECT_ROLE_PROGRAM_MANAGER,
28+
PROJECT_ROLE_SOLUTION_ARCHITECT,
29+
PROJECT_ROLE_COPILOT,
30+
ROLE_CONNECT_ADMIN
31+
],
1532
topcoderRoles: [ROLE_ADMINISTRATOR, ROLE_CONNECT_ADMIN],
1633
},
1734
INVITE_TOPCODER_MEMBER: {
18-
projectRoles: [PROJECT_ROLE_MANAGER, PROJECT_ROLE_ACCOUNT_MANAGER, ROLE_CONNECT_ADMIN],
19-
topcoderRoles: [ROLE_ADMINISTRATOR, ROLE_CONNECT_ADMIN, ROLE_CONNECT_MANAGER, ROLE_CONNECT_ACCOUNT_MANAGER],
35+
projectRoles: [
36+
PROJECT_ROLE_MANAGER,
37+
PROJECT_ROLE_ACCOUNT_MANAGER,
38+
PROJECT_ROLE_ACCOUNT_EXECUTIVE,
39+
PROJECT_ROLE_PROJECT_MANAGER,
40+
PROJECT_ROLE_PROGRAM_MANAGER,
41+
PROJECT_ROLE_SOLUTION_ARCHITECT,
42+
ROLE_CONNECT_ADMIN
43+
],
44+
topcoderRoles: [
45+
ROLE_ADMINISTRATOR,
46+
ROLE_CONNECT_ADMIN,
47+
ROLE_CONNECT_MANAGER,
48+
ROLE_CONNECT_ACCOUNT_MANAGER,
49+
ROLE_BUSINESS_DEVELOPMENT_REPRESENTATIVE,
50+
ROLE_PRESALES,
51+
ROLE_ACCOUNT_EXECUTIVE,
52+
ROLE_PROGRAM_MANAGER,
53+
ROLE_SOLUTION_ARCHITECT,
54+
ROLE_PROJECT_MANAGER,
55+
],
2056
},
2157
ACCESS_PRIVATE_POST: {
22-
topcoderRoles: [PROJECT_ROLE_COPILOT, ROLE_CONNECT_MANAGER, ROLE_CONNECT_ADMIN, ROLE_ADMINISTRATOR]
58+
topcoderRoles: [
59+
PROJECT_ROLE_COPILOT,
60+
ROLE_CONNECT_MANAGER,
61+
ROLE_CONNECT_ADMIN,
62+
ROLE_ADMINISTRATOR,
63+
ROLE_PROGRAM_MANAGER,
64+
ROLE_SOLUTION_ARCHITECT,
65+
ROLE_PROJECT_MANAGER,
66+
]
2367
},
2468
ACCESS_BUDGET_REPORT: {
25-
projectRoles: [PROJECT_ROLE_CUSTOMER, PROJECT_ROLE_MANAGER, PROJECT_ROLE_ACCOUNT_MANAGER],
69+
projectRoles: [
70+
PROJECT_ROLE_CUSTOMER,
71+
PROJECT_ROLE_MANAGER,
72+
PROJECT_ROLE_ACCOUNT_MANAGER,
73+
PROJECT_ROLE_ACCOUNT_EXECUTIVE,
74+
PROJECT_ROLE_PROJECT_MANAGER,
75+
PROJECT_ROLE_PROGRAM_MANAGER,
76+
PROJECT_ROLE_SOLUTION_ARCHITECT
77+
],
2678
topcoderRoles: [ROLE_ADMINISTRATOR, ROLE_CONNECT_ADMIN],
2779
},
2880
ACCESS_BUDGET_SPENT_REPORT: {
29-
projectRoles: [PROJECT_ROLE_MANAGER, PROJECT_ROLE_ACCOUNT_MANAGER],
81+
projectRoles: [
82+
PROJECT_ROLE_MANAGER,
83+
PROJECT_ROLE_ACCOUNT_MANAGER,
84+
PROJECT_ROLE_ACCOUNT_EXECUTIVE,
85+
PROJECT_ROLE_PROJECT_MANAGER,
86+
PROJECT_ROLE_PROGRAM_MANAGER,
87+
PROJECT_ROLE_SOLUTION_ARCHITECT
88+
],
3089
topcoderRoles: [ROLE_ADMINISTRATOR, ROLE_CONNECT_ADMIN],
3190
},
3291
ACCESS_INVOICE_REPORT: {
33-
projectRoles: [PROJECT_ROLE_CUSTOMER, PROJECT_ROLE_MANAGER, PROJECT_ROLE_ACCOUNT_MANAGER],
92+
projectRoles: [
93+
PROJECT_ROLE_CUSTOMER,
94+
PROJECT_ROLE_MANAGER,
95+
PROJECT_ROLE_ACCOUNT_MANAGER,
96+
PROJECT_ROLE_ACCOUNT_EXECUTIVE,
97+
PROJECT_ROLE_PROJECT_MANAGER,
98+
PROJECT_ROLE_PROGRAM_MANAGER,
99+
PROJECT_ROLE_SOLUTION_ARCHITECT
100+
],
34101
topcoderRoles: [ROLE_ADMINISTRATOR, ROLE_CONNECT_ADMIN],
35102
}
36103
}

src/projects/components/projectsCard/ProjectCardBody.jsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,13 @@ import { Link } from 'react-router-dom'
55
import ProjectProgress from '../../../components/ProjectProgress/ProjectProgress'
66
import ProjectStatus from '../../../components/ProjectStatus/ProjectStatus'
77
import editableProjectStatus from '../../../components/ProjectStatus/editableProjectStatus'
8-
import { PROJECT_STATUS_ACTIVE, PROJECT_STATUS_COMPLETED, PROJECT_ROLE_COPILOT, PROJECT_ROLE_MANAGER } from '../../../config/constants'
8+
import {
9+
PROJECT_STATUS_ACTIVE,
10+
PROJECT_STATUS_COMPLETED,
11+
PROJECT_ROLE_COPILOT,
12+
PROJECT_ROLE_MANAGER,
13+
PROJECT_ROLE_PROGRAM_MANAGER, PROJECT_ROLE_SOLUTION_ARCHITECT, PROJECT_ROLE_PROJECT_MANAGER
14+
} from '../../../config/constants'
915
import './ProjectCardBody.scss'
1016
import _ from 'lodash'
1117

@@ -17,7 +23,13 @@ function ProjectCardBody({ project, projectCanBeActive, duration, currentMemberR
1723

1824
const canEdit = canEditStatus && (
1925
project.status !== PROJECT_STATUS_COMPLETED && (isSuperUser || (currentMemberRole
20-
&& (_.indexOf([PROJECT_ROLE_COPILOT, PROJECT_ROLE_MANAGER], currentMemberRole) > -1)))
26+
&& (_.indexOf([
27+
PROJECT_ROLE_COPILOT,
28+
PROJECT_ROLE_MANAGER,
29+
PROJECT_ROLE_PROGRAM_MANAGER,
30+
PROJECT_ROLE_PROJECT_MANAGER,
31+
PROJECT_ROLE_SOLUTION_ARCHITECT,
32+
], currentMemberRole) > -1)))
2133
)
2234

2335
const progress = _.get(process, 'percent', 0)

src/projects/detail/containers/ProjectInfoContainer.js

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,21 @@ import { loadDashboardFeeds, loadProjectMessages } from '../../actions/projectTo
1010
import { loadTopic } from '../../../actions/topics'
1111
import { loadProjectPlan } from '../../actions/projectPlan'
1212
import { setDuration, getProjectNavLinks } from '../../../helpers/projectHelper'
13-
import { PROJECT_ROLE_OWNER, PROJECT_ROLE_COPILOT, PROJECT_ROLE_MANAGER,
14-
DIRECT_PROJECT_URL, SALESFORCE_PROJECT_LEAD_LINK, PROJECT_STATUS_CANCELLED, PROJECT_STATUS_ACTIVE,
15-
PROJECT_STATUS_COMPLETED, PHASE_STATUS_REVIEWED, PHASE_STATUS_ACTIVE } from '../../../config/constants'
13+
import {
14+
PROJECT_ROLE_OWNER,
15+
PROJECT_ROLE_COPILOT,
16+
PROJECT_ROLE_MANAGER,
17+
DIRECT_PROJECT_URL,
18+
SALESFORCE_PROJECT_LEAD_LINK,
19+
PROJECT_STATUS_CANCELLED,
20+
PROJECT_STATUS_ACTIVE,
21+
PROJECT_STATUS_COMPLETED,
22+
PHASE_STATUS_REVIEWED,
23+
PHASE_STATUS_ACTIVE,
24+
PROJECT_ROLE_PROJECT_MANAGER,
25+
PROJECT_ROLE_PROGRAM_MANAGER,
26+
PROJECT_ROLE_SOLUTION_ARCHITECT,
27+
} from '../../../config/constants'
1628
import PERMISSIONS from '../../../config/permissions'
1729
import { checkPermission } from '../../../helpers/permissions'
1830
import Panel from '../../../components/Panel/Panel'
@@ -423,7 +435,13 @@ class ProjectInfoContainer extends React.Component {
423435
productsTimelines, isProjectProcessing, notifications } = this.props
424436
let directLinks = null
425437
// check if direct links need to be added
426-
const isMemberOrCopilot = _.indexOf([PROJECT_ROLE_COPILOT, PROJECT_ROLE_MANAGER], currentMemberRole) > -1
438+
const isMemberOrCopilot = _.indexOf([
439+
PROJECT_ROLE_COPILOT,
440+
PROJECT_ROLE_MANAGER,
441+
PROJECT_ROLE_PROJECT_MANAGER,
442+
PROJECT_ROLE_PROGRAM_MANAGER,
443+
PROJECT_ROLE_SOLUTION_ARCHITECT
444+
], currentMemberRole) > -1
427445
if (isMemberOrCopilot || isSuperUser) {
428446
directLinks = []
429447
if (project.directProjectId) {
@@ -453,7 +471,13 @@ class ProjectInfoContainer extends React.Component {
453471

454472
const canEdit = (
455473
project.status !== PROJECT_STATUS_COMPLETED && (isSuperUser || (currentMemberRole
456-
&& (_.indexOf([PROJECT_ROLE_COPILOT, PROJECT_ROLE_MANAGER], currentMemberRole) > -1)))
474+
&& (_.indexOf([
475+
PROJECT_ROLE_COPILOT,
476+
PROJECT_ROLE_MANAGER,
477+
PROJECT_ROLE_PROJECT_MANAGER,
478+
PROJECT_ROLE_PROGRAM_MANAGER,
479+
PROJECT_ROLE_SOLUTION_ARCHITECT
480+
], currentMemberRole) > -1)))
457481
)
458482

459483
const progress = _.get(process, 'percent', 0)

src/projects/detail/containers/ScopeAndSpecificationContainer.jsx

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,11 @@ import {
2424
PROJECT_ROLE_MANAGER,
2525
PROJECT_ROLE_ACCOUNT_MANAGER,
2626
PROJECT_FEED_TYPE_PRIMARY,
27-
PROJECT_FEED_TYPE_MESSAGES
27+
PROJECT_FEED_TYPE_MESSAGES,
28+
PROJECT_ROLE_ACCOUNT_EXECUTIVE,
29+
PROJECT_ROLE_PROJECT_MANAGER,
30+
PROJECT_ROLE_PROGRAM_MANAGER,
31+
PROJECT_ROLE_SOLUTION_ARCHITECT
2832
} from '../../../config/constants'
2933
import {
3034
updateProject,
@@ -134,7 +138,14 @@ class SpecificationContainer extends Component {
134138
} = this.props
135139
const editPriv = isSuperUser ? isSuperUser : !!currentMemberRole
136140
const isCustomer = _.indexOf([PROJECT_ROLE_OWNER, PROJECT_ROLE_CUSTOMER], currentMemberRole) > -1
137-
const isManager = currentMemberRole && [PROJECT_ROLE_MANAGER, PROJECT_ROLE_ACCOUNT_MANAGER].indexOf(currentMemberRole) > -1
141+
const isManager = currentMemberRole && [
142+
PROJECT_ROLE_MANAGER,
143+
PROJECT_ROLE_ACCOUNT_MANAGER,
144+
PROJECT_ROLE_ACCOUNT_EXECUTIVE,
145+
PROJECT_ROLE_PROJECT_MANAGER,
146+
PROJECT_ROLE_PROGRAM_MANAGER,
147+
PROJECT_ROLE_SOLUTION_ARCHITECT
148+
].indexOf(currentMemberRole) > -1
138149

139150
const attachmentsStorePath = `${PROJECT_ATTACHMENTS_FOLDER}/${project.id}/`
140151

src/projects/detail/containers/TeamManagementContainer.jsx

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,15 @@ import {
1313
ROLE_CONNECT_COPILOT_MANAGER,
1414
ROLE_CONNECT_MANAGER,
1515
ROLE_CONNECT_ACCOUNT_MANAGER,
16-
PROJECT_ROLE_ACCOUNT_MANAGER
16+
PROJECT_ROLE_ACCOUNT_MANAGER,
17+
ROLE_BUSINESS_DEVELOPMENT_REPRESENTATIVE,
18+
ROLE_PRESALES,
19+
ROLE_ACCOUNT_EXECUTIVE,
20+
ROLE_PROGRAM_MANAGER,
21+
ROLE_PROJECT_MANAGER,
22+
ROLE_SOLUTION_ARCHITECT,
23+
PROJECT_ROLE_PROJECT_MANAGER,
24+
PROJECT_ROLE_PROGRAM_MANAGER, PROJECT_ROLE_SOLUTION_ARCHITECT, PROJECT_ROLE_ACCOUNT_EXECUTIVE
1725
} from '../../../config/constants'
1826
import TeamManagement from '../../../components/TeamManagement/TeamManagement'
1927
import {
@@ -124,20 +132,20 @@ class TeamManagementContainer extends Component {
124132
return _.map(members, m => {
125133
if (!m.userId && !m.role) return m
126134
// map role
127-
switch (m.role) {
128-
case PROJECT_ROLE_COPILOT:
135+
if (m.role === PROJECT_ROLE_COPILOT) {
129136
m.isCopilot = true
130-
break
131-
case PROJECT_ROLE_CUSTOMER:
137+
} else if (m.role === PROJECT_ROLE_CUSTOMER) {
132138
m.isCustomer = true
133139
m.isPrimary = m.isPrimary || false
134-
break
135-
case PROJECT_ROLE_MANAGER:
140+
} else if ([
141+
PROJECT_ROLE_MANAGER,
142+
PROJECT_ROLE_ACCOUNT_MANAGER,
143+
PROJECT_ROLE_ACCOUNT_EXECUTIVE,
144+
PROJECT_ROLE_PROJECT_MANAGER,
145+
PROJECT_ROLE_PROGRAM_MANAGER,
146+
PROJECT_ROLE_SOLUTION_ARCHITECT
147+
].includes(m.role)) {
136148
m.isManager = true
137-
break
138-
case PROJECT_ROLE_ACCOUNT_MANAGER:
139-
m.isManager = true
140-
break
141149
}
142150
return _.assign({}, m, {
143151
photoURL: ''
@@ -223,7 +231,8 @@ class TeamManagementContainer extends Component {
223231
const mapStateToProps = ({loadUser, members, projectState}) => {
224232
const adminRoles = [ROLE_ADMINISTRATOR, ROLE_CONNECT_ADMIN]
225233
const powerUserRoles = [ROLE_CONNECT_COPILOT, ROLE_CONNECT_MANAGER, ROLE_ADMINISTRATOR, ROLE_CONNECT_ADMIN]
226-
const managerRoles = [ROLE_ADMINISTRATOR, ROLE_CONNECT_ADMIN, ROLE_CONNECT_MANAGER]
234+
const managerRoles = [ROLE_ADMINISTRATOR, ROLE_CONNECT_ADMIN, ROLE_CONNECT_MANAGER, ROLE_PROGRAM_MANAGER, ROLE_PROJECT_MANAGER, ROLE_SOLUTION_ARCHITECT]
235+
const accountManagerRoles = [ROLE_CONNECT_ACCOUNT_MANAGER, ROLE_BUSINESS_DEVELOPMENT_REPRESENTATIVE, ROLE_PRESALES, ROLE_ACCOUNT_EXECUTIVE]
227236
return {
228237
currentUser: {
229238
userId: parseInt(loadUser.user.id),
@@ -232,7 +241,7 @@ const mapStateToProps = ({loadUser, members, projectState}) => {
232241
isManager: loadUser.user.roles.some((role) => managerRoles.indexOf(role) !== -1),
233242
isCustomer: !loadUser.user.roles.some((role) => powerUserRoles.indexOf(role) !== -1),
234243
isCopilotManager: _.indexOf(loadUser.user.roles, ROLE_CONNECT_COPILOT_MANAGER) > -1,
235-
isAccountManager: _.indexOf(loadUser.user.roles, ROLE_CONNECT_ACCOUNT_MANAGER) > -1,
244+
isAccountManager: loadUser.user.roles.some((role) => accountManagerRoles.indexOf(role) !== -1),
236245
},
237246
allMembers: _.values(members.members),
238247
processingInvites: projectState.processingInvites,

0 commit comments

Comments
 (0)