Skip to content

Commit e49e361

Browse files
author
vikasrohit
authored
Merge pull request #3344 from appirio-tech/feature/new-roles
New user roles
2 parents f1a5df1 + 17c723c commit e49e361

File tree

12 files changed

+280
-80
lines changed

12 files changed

+280
-80
lines changed

src/actions/loadUser.js

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@ import {
99
ROLE_CONNECT_COPILOT,
1010
ROLE_TOPCODER_USER,
1111
ROLE_CONNECT_MANAGER,
12-
ROLE_CONNECT_ADMIN
12+
ROLE_CONNECT_ADMIN,
13+
ROLE_ACCOUNT_EXECUTIVE,
14+
ROLE_BUSINESS_DEVELOPMENT_REPRESENTATIVE,
15+
ROLE_PROGRAM_MANAGER,
16+
ROLE_PRESALES, ROLE_PROJECT_MANAGER, ROLE_SOLUTION_ARCHITECT
1317
} from '../config/constants'
1418
import { getFreshToken, configureConnector, decodeToken } from 'tc-accounts'
1519
import { getUserProfile } from '../api/users'
@@ -55,7 +59,19 @@ export function loadUserSuccess(dispatch, token) {
5559
currentUser = _.assign(currentUser, profile)
5660
// determine user role
5761
let userRole
58-
if (_.indexOf(currentUser.roles, ROLE_ADMINISTRATOR) > -1) {
62+
if (_.indexOf(currentUser.roles, ROLE_BUSINESS_DEVELOPMENT_REPRESENTATIVE) > -1) {
63+
userRole = ROLE_BUSINESS_DEVELOPMENT_REPRESENTATIVE
64+
} else if (_.indexOf(currentUser.roles, ROLE_PRESALES) > -1) {
65+
userRole = ROLE_PRESALES
66+
} else if (_.indexOf(currentUser.roles, ROLE_ACCOUNT_EXECUTIVE) > -1) {
67+
userRole = ROLE_ACCOUNT_EXECUTIVE
68+
} else if (_.indexOf(currentUser.roles, ROLE_PROGRAM_MANAGER) > -1) {
69+
userRole = ROLE_PROGRAM_MANAGER
70+
} else if (_.indexOf(currentUser.roles, ROLE_PROJECT_MANAGER) > -1) {
71+
userRole = ROLE_PROJECT_MANAGER
72+
} else if (_.indexOf(currentUser.roles, ROLE_SOLUTION_ARCHITECT) > -1) {
73+
userRole = ROLE_SOLUTION_ARCHITECT
74+
} else if (_.indexOf(currentUser.roles, ROLE_ADMINISTRATOR) > -1) {
5975
userRole = ROLE_ADMINISTRATOR
6076
} else if (_.indexOf(currentUser.roles, ROLE_CONNECT_ADMIN) > -1) {
6177
userRole = ROLE_CONNECT_ADMIN

src/components/TeamManagement/Dialog.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,18 @@ class Dialog extends React.Component {
2121
}, {
2222
title: 'Account Manager',
2323
value: 'account_manager',
24+
}, {
25+
title: 'Account Executive',
26+
value: 'account_executive',
27+
}, {
28+
title: 'Program Manager',
29+
value: 'program_manager',
30+
}, {
31+
title: 'Solution Architect',
32+
value: 'solution_architect',
33+
}, {
34+
title: 'Project Manager',
35+
value: 'project_manager',
2436
}]
2537

2638
this.handleRoles = this.handleRoles.bind(this)

src/components/TeamManagement/TeamManagement.scss

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@
144144
}
145145

146146
.project-member-layout {
147+
flex-wrap: wrap;
147148
min-height: 60px;
148149
padding: $base-unit*2 $base-unit*4;
149150
display: flex;
@@ -247,20 +248,29 @@
247248
}
248249

249250
.member-role-container {
250-
margin-left: $base-unit*3;
251+
margin-left: $base-unit*12;
252+
width: 100%;
251253
display: flex;
252254
padding: 1px;
253255
border-radius: 5px;
254256
border: 1px solid $tc-gray-40;
255257
background: white;
256258
min-width: 300px;
257259

260+
.Tooltip {
261+
align-items: center;
262+
display: flex;
263+
}
264+
258265
.member-role {
266+
align-items: center;
267+
display: flex;
259268
padding: $base-unit $base-unit*2;
260269
@include roboto;
261270
color: $tc-gray-70;
262271
font-size: $tc-label-xs;
263272
cursor: pointer;
273+
text-align: center;
264274
}
265275

266276
.member-role.active {
@@ -473,4 +483,4 @@
473483

474484
.title-text {
475485
letter-spacing: 0.8px
476-
}
486+
}

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'
@@ -161,7 +166,20 @@ class TopBarContainer extends React.Component {
161166

162167
const mapStateToProps = ({ loadUser }) => {
163168
let isPowerUser = false
164-
const roles = [ROLE_CONNECT_COPILOT, ROLE_CONNECT_MANAGER, ROLE_CONNECT_ACCOUNT_MANAGER, ROLE_ADMINISTRATOR, ROLE_CONNECT_ADMIN]
169+
const roles = [
170+
ROLE_CONNECT_COPILOT,
171+
ROLE_CONNECT_MANAGER,
172+
ROLE_CONNECT_ACCOUNT_MANAGER,
173+
ROLE_ADMINISTRATOR,
174+
ROLE_CONNECT_ADMIN,
175+
176+
ROLE_BUSINESS_DEVELOPMENT_REPRESENTATIVE,
177+
ROLE_PRESALES,
178+
ROLE_ACCOUNT_EXECUTIVE,
179+
ROLE_PROJECT_MANAGER,
180+
ROLE_PROGRAM_MANAGER,
181+
ROLE_SOLUTION_ARCHITECT,
182+
]
165183
if (loadUser.user) {
166184
isPowerUser = loadUser.user.roles.some((role) => roles.indexOf(role) !== -1)
167185
}

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
// to be able to start the Connect App we should pass at least the dummy value for `FILE_PICKER_API_KEY`
647656
// but if we want to test file uploading we should provide the real value in `FILE_PICKER_API_KEY` env variable

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'
@@ -424,7 +436,13 @@ class ProjectInfoContainer extends React.Component {
424436
productsTimelines, isProjectProcessing, notifications } = this.props
425437
let directLinks = null
426438
// check if direct links need to be added
427-
const isMemberOrCopilot = _.indexOf([PROJECT_ROLE_COPILOT, PROJECT_ROLE_MANAGER], currentMemberRole) > -1
439+
const isMemberOrCopilot = _.indexOf([
440+
PROJECT_ROLE_COPILOT,
441+
PROJECT_ROLE_MANAGER,
442+
PROJECT_ROLE_PROJECT_MANAGER,
443+
PROJECT_ROLE_PROGRAM_MANAGER,
444+
PROJECT_ROLE_SOLUTION_ARCHITECT
445+
], currentMemberRole) > -1
428446
if (isMemberOrCopilot || isSuperUser) {
429447
directLinks = []
430448
if (project.directProjectId) {
@@ -461,7 +479,13 @@ class ProjectInfoContainer extends React.Component {
461479

462480
const canEdit = (
463481
project.status !== PROJECT_STATUS_COMPLETED && (isSuperUser || (currentMemberRole
464-
&& (_.indexOf([PROJECT_ROLE_COPILOT, PROJECT_ROLE_MANAGER], currentMemberRole) > -1)))
482+
&& (_.indexOf([
483+
PROJECT_ROLE_COPILOT,
484+
PROJECT_ROLE_MANAGER,
485+
PROJECT_ROLE_PROJECT_MANAGER,
486+
PROJECT_ROLE_PROGRAM_MANAGER,
487+
PROJECT_ROLE_SOLUTION_ARCHITECT
488+
], currentMemberRole) > -1)))
465489
)
466490

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

0 commit comments

Comments
 (0)