Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 18 additions & 2 deletions src/actions/loadUser.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,11 @@ import {
ROLE_CONNECT_COPILOT,
ROLE_TOPCODER_USER,
ROLE_CONNECT_MANAGER,
ROLE_CONNECT_ADMIN
ROLE_CONNECT_ADMIN,
ROLE_ACCOUNT_EXECUTIVE,
ROLE_BUSINESS_DEVELOPMENT_REPRESENTATIVE,
ROLE_PROGRAM_MANAGER,
ROLE_PRESALES, ROLE_PROJECT_MANAGER, ROLE_SOLUTION_ARCHITECT
} from '../config/constants'
import { getFreshToken, configureConnector, decodeToken } from 'tc-accounts'
import { getUserProfile } from '../api/users'
Expand Down Expand Up @@ -55,7 +59,19 @@ export function loadUserSuccess(dispatch, token) {
currentUser = _.assign(currentUser, profile)
// determine user role
let userRole
if (_.indexOf(currentUser.roles, ROLE_ADMINISTRATOR) > -1) {
if (_.indexOf(currentUser.roles, ROLE_BUSINESS_DEVELOPMENT_REPRESENTATIVE) > -1) {
userRole = ROLE_BUSINESS_DEVELOPMENT_REPRESENTATIVE
} else if (_.indexOf(currentUser.roles, ROLE_PRESALES) > -1) {
userRole = ROLE_PRESALES
} else if (_.indexOf(currentUser.roles, ROLE_ACCOUNT_EXECUTIVE) > -1) {
userRole = ROLE_ACCOUNT_EXECUTIVE
} else if (_.indexOf(currentUser.roles, ROLE_PROGRAM_MANAGER) > -1) {
userRole = ROLE_PROGRAM_MANAGER
} else if (_.indexOf(currentUser.roles, ROLE_PROJECT_MANAGER) > -1) {
userRole = ROLE_PROJECT_MANAGER
} else if (_.indexOf(currentUser.roles, ROLE_SOLUTION_ARCHITECT) > -1) {
userRole = ROLE_SOLUTION_ARCHITECT
} else if (_.indexOf(currentUser.roles, ROLE_ADMINISTRATOR) > -1) {
userRole = ROLE_ADMINISTRATOR
} else if (_.indexOf(currentUser.roles, ROLE_CONNECT_ADMIN) > -1) {
userRole = ROLE_CONNECT_ADMIN
Expand Down
12 changes: 12 additions & 0 deletions src/components/TeamManagement/Dialog.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,18 @@ class Dialog extends React.Component {
}, {
title: 'Account Manager',
value: 'account_manager',
}, {
title: 'Account Executive',
value: 'account_executive',
}, {
title: 'Program Manager',
value: 'program_manager',
}, {
title: 'Solution Architect',
value: 'solution_architect',
}, {
title: 'Project Manager',
value: 'project_manager',
}]

this.handleRoles = this.handleRoles.bind(this)
Expand Down
14 changes: 12 additions & 2 deletions src/components/TeamManagement/TeamManagement.scss
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@
}

.project-member-layout {
flex-wrap: wrap;
min-height: 60px;
padding: $base-unit*2 $base-unit*4;
display: flex;
Expand Down Expand Up @@ -247,20 +248,29 @@
}

.member-role-container {
margin-left: $base-unit*3;
margin-left: $base-unit*12;
width: 100%;
display: flex;
padding: 1px;
border-radius: 5px;
border: 1px solid $tc-gray-40;
background: white;
min-width: 300px;

.Tooltip {
align-items: center;
display: flex;
}

.member-role {
align-items: center;
display: flex;
padding: $base-unit $base-unit*2;
@include roboto;
color: $tc-gray-70;
font-size: $tc-label-xs;
cursor: pointer;
text-align: center;
}

.member-role.active {
Expand Down Expand Up @@ -473,4 +483,4 @@

.title-text {
letter-spacing: 0.8px
}
}
14 changes: 13 additions & 1 deletion src/components/TeamManagement/TopcoderManagementDialog.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,18 @@ class TopcoderManagementDialog extends React.Component {
}, {
title: 'Account Manager',
value: 'account_manager',
}, {
title: 'Account Executive',
value: 'account_executive',
}, {
title: 'Program Manager',
value: 'program_manager',
}, {
title: 'Solution Architect',
value: 'solution_architect',
}, {
title: 'Project Manager',
value: 'project_manager',
}]
}

Expand Down Expand Up @@ -208,7 +220,7 @@ class TopcoderManagementDialog extends React.Component {
</div>
)
}
const types = ['Observer', 'Copilot', 'Manager', 'Account Manager']
const types = ['Observer', 'Copilot', 'Manager', 'Account Manager', 'Account Executive', 'Program Manager', 'Solution Architect', 'Project Manager']
const currentType = role
const onClick = (type) => {
this.onUserRoleChange(member.userId, member.id, type)
Expand Down
22 changes: 20 additions & 2 deletions src/components/TopBar/TopBarContainer.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,12 @@ import {
ROLE_ADMINISTRATOR,
ROLE_CONNECT_ADMIN,
ROLE_CONNECT_ACCOUNT_MANAGER,
DOMAIN
DOMAIN,
ROLE_BUSINESS_DEVELOPMENT_REPRESENTATIVE,
ROLE_PRESALES,
ROLE_ACCOUNT_EXECUTIVE,
ROLE_PROJECT_MANAGER,
ROLE_PROGRAM_MANAGER, ROLE_SOLUTION_ARCHITECT
} from '../../config/constants'
import ConnectLogoMono from '../../assets/icons/connect-logo-mono.svg'
import { getAvatarResized, getFullNameWithFallback } from '../../helpers/tcHelpers.js'
Expand Down Expand Up @@ -165,7 +170,20 @@ class TopBarContainer extends React.Component {

const mapStateToProps = ({ loadUser }) => {
let isPowerUser = false
const roles = [ROLE_CONNECT_COPILOT, ROLE_CONNECT_MANAGER, ROLE_CONNECT_ACCOUNT_MANAGER, ROLE_ADMINISTRATOR, ROLE_CONNECT_ADMIN]
const roles = [
ROLE_CONNECT_COPILOT,
ROLE_CONNECT_MANAGER,
ROLE_CONNECT_ACCOUNT_MANAGER,
ROLE_ADMINISTRATOR,
ROLE_CONNECT_ADMIN,

ROLE_BUSINESS_DEVELOPMENT_REPRESENTATIVE,
ROLE_PRESALES,
ROLE_ACCOUNT_EXECUTIVE,
ROLE_PROJECT_MANAGER,
ROLE_PROGRAM_MANAGER,
ROLE_SOLUTION_ARCHITECT,
]
if (loadUser.user) {
isPowerUser = loadUser.user.roles.some((role) => roles.indexOf(role) !== -1)
}
Expand Down
11 changes: 10 additions & 1 deletion src/config/constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -626,7 +626,10 @@ export const PROJECT_ROLE_ACCOUNT_MANAGER = 'account_manager'
export const PROJECT_ROLE_CUSTOMER = 'customer'
export const PROJECT_ROLE_OWNER = 'owner'
export const PROJECT_ROLE_MEMBER = 'member' // this is need for notifications

export const PROJECT_ROLE_ACCOUNT_EXECUTIVE = 'account_executive'
export const PROJECT_ROLE_PROGRAM_MANAGER = 'program_manager'
export const PROJECT_ROLE_SOLUTION_ARCHITECT = 'solution_architect'
export const PROJECT_ROLE_PROJECT_MANAGER = 'project_manager'
/*
* Events
*/
Expand All @@ -642,6 +645,12 @@ export const ROLE_CONNECT_ACCOUNT_MANAGER = 'Connect Account Manager'
export const ROLE_CONNECT_ADMIN = 'Connect Admin'
export const ROLE_ADMINISTRATOR = 'administrator'
export const ROLE_CONNECT_COPILOT_MANAGER = 'Connect Copilot Manager'
export const ROLE_BUSINESS_DEVELOPMENT_REPRESENTATIVE = 'Business Development Representative'
export const ROLE_PRESALES = 'Presales'
export const ROLE_ACCOUNT_EXECUTIVE = 'Account Executive'
export const ROLE_PROGRAM_MANAGER = 'Program Manager'
export const ROLE_SOLUTION_ARCHITECT = 'Solution Architect'
export const ROLE_PROJECT_MANAGER = 'Project Manager'

// FIXME .. remove defaults
export const FILE_PICKER_API_KEY = process.env.FILE_PICKER_API_KEY || ''
Expand Down
83 changes: 75 additions & 8 deletions src/config/permissions.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,31 +6,98 @@ import {
ROLE_ADMINISTRATOR,
ROLE_CONNECT_ADMIN,
ROLE_CONNECT_MANAGER,
ROLE_CONNECT_ACCOUNT_MANAGER
ROLE_CONNECT_ACCOUNT_MANAGER,
ROLE_BUSINESS_DEVELOPMENT_REPRESENTATIVE,
ROLE_PRESALES,
ROLE_ACCOUNT_EXECUTIVE,
ROLE_PROGRAM_MANAGER,
ROLE_SOLUTION_ARCHITECT,
ROLE_PROJECT_MANAGER,
PROJECT_ROLE_ACCOUNT_EXECUTIVE,
PROJECT_ROLE_PROJECT_MANAGER,
PROJECT_ROLE_PROGRAM_MANAGER,
PROJECT_ROLE_SOLUTION_ARCHITECT
} from './constants'

export default {
EDIT_PROJECT_PLAN: {
projectRoles: [PROJECT_ROLE_MANAGER, PROJECT_ROLE_COPILOT, ROLE_CONNECT_ADMIN],
projectRoles: [
PROJECT_ROLE_MANAGER,
PROJECT_ROLE_PROJECT_MANAGER,
PROJECT_ROLE_PROGRAM_MANAGER,
PROJECT_ROLE_SOLUTION_ARCHITECT,
PROJECT_ROLE_COPILOT,
ROLE_CONNECT_ADMIN
],
topcoderRoles: [ROLE_ADMINISTRATOR, ROLE_CONNECT_ADMIN],
},
INVITE_TOPCODER_MEMBER: {
projectRoles: [PROJECT_ROLE_MANAGER, PROJECT_ROLE_ACCOUNT_MANAGER, ROLE_CONNECT_ADMIN],
topcoderRoles: [ROLE_ADMINISTRATOR, ROLE_CONNECT_ADMIN, ROLE_CONNECT_MANAGER, ROLE_CONNECT_ACCOUNT_MANAGER],
projectRoles: [
PROJECT_ROLE_MANAGER,
PROJECT_ROLE_ACCOUNT_MANAGER,
PROJECT_ROLE_ACCOUNT_EXECUTIVE,
PROJECT_ROLE_PROJECT_MANAGER,
PROJECT_ROLE_PROGRAM_MANAGER,
PROJECT_ROLE_SOLUTION_ARCHITECT,
ROLE_CONNECT_ADMIN
],
topcoderRoles: [
ROLE_ADMINISTRATOR,
ROLE_CONNECT_ADMIN,
ROLE_CONNECT_MANAGER,
ROLE_CONNECT_ACCOUNT_MANAGER,
ROLE_BUSINESS_DEVELOPMENT_REPRESENTATIVE,
ROLE_PRESALES,
ROLE_ACCOUNT_EXECUTIVE,
ROLE_PROGRAM_MANAGER,
ROLE_SOLUTION_ARCHITECT,
ROLE_PROJECT_MANAGER,
],
},
ACCESS_PRIVATE_POST: {
topcoderRoles: [PROJECT_ROLE_COPILOT, ROLE_CONNECT_MANAGER, ROLE_CONNECT_ADMIN, ROLE_ADMINISTRATOR]
topcoderRoles: [
PROJECT_ROLE_COPILOT,
ROLE_CONNECT_MANAGER,
ROLE_CONNECT_ADMIN,
ROLE_ADMINISTRATOR,
ROLE_PROGRAM_MANAGER,
ROLE_SOLUTION_ARCHITECT,
ROLE_PROJECT_MANAGER,
]
},
ACCESS_BUDGET_REPORT: {
projectRoles: [PROJECT_ROLE_CUSTOMER, PROJECT_ROLE_MANAGER, PROJECT_ROLE_ACCOUNT_MANAGER],
projectRoles: [
PROJECT_ROLE_CUSTOMER,
PROJECT_ROLE_MANAGER,
PROJECT_ROLE_ACCOUNT_MANAGER,
PROJECT_ROLE_ACCOUNT_EXECUTIVE,
PROJECT_ROLE_PROJECT_MANAGER,
PROJECT_ROLE_PROGRAM_MANAGER,
PROJECT_ROLE_SOLUTION_ARCHITECT
],
topcoderRoles: [ROLE_ADMINISTRATOR, ROLE_CONNECT_ADMIN],
},
ACCESS_BUDGET_SPENT_REPORT: {
projectRoles: [PROJECT_ROLE_MANAGER, PROJECT_ROLE_ACCOUNT_MANAGER],
projectRoles: [
PROJECT_ROLE_MANAGER,
PROJECT_ROLE_ACCOUNT_MANAGER,
PROJECT_ROLE_ACCOUNT_EXECUTIVE,
PROJECT_ROLE_PROJECT_MANAGER,
PROJECT_ROLE_PROGRAM_MANAGER,
PROJECT_ROLE_SOLUTION_ARCHITECT
],
topcoderRoles: [ROLE_ADMINISTRATOR, ROLE_CONNECT_ADMIN],
},
ACCESS_INVOICE_REPORT: {
projectRoles: [PROJECT_ROLE_CUSTOMER, PROJECT_ROLE_MANAGER, PROJECT_ROLE_ACCOUNT_MANAGER],
projectRoles: [
PROJECT_ROLE_CUSTOMER,
PROJECT_ROLE_MANAGER,
PROJECT_ROLE_ACCOUNT_MANAGER,
PROJECT_ROLE_ACCOUNT_EXECUTIVE,
PROJECT_ROLE_PROJECT_MANAGER,
PROJECT_ROLE_PROGRAM_MANAGER,
PROJECT_ROLE_SOLUTION_ARCHITECT
],
topcoderRoles: [ROLE_ADMINISTRATOR, ROLE_CONNECT_ADMIN],
}
}
16 changes: 14 additions & 2 deletions src/projects/components/projectsCard/ProjectCardBody.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,13 @@ import { Link } from 'react-router-dom'
import ProjectProgress from '../../../components/ProjectProgress/ProjectProgress'
import ProjectStatus from '../../../components/ProjectStatus/ProjectStatus'
import editableProjectStatus from '../../../components/ProjectStatus/editableProjectStatus'
import { PROJECT_STATUS_ACTIVE, PROJECT_STATUS_COMPLETED, PROJECT_ROLE_COPILOT, PROJECT_ROLE_MANAGER } from '../../../config/constants'
import {
PROJECT_STATUS_ACTIVE,
PROJECT_STATUS_COMPLETED,
PROJECT_ROLE_COPILOT,
PROJECT_ROLE_MANAGER,
PROJECT_ROLE_PROGRAM_MANAGER, PROJECT_ROLE_SOLUTION_ARCHITECT, PROJECT_ROLE_PROJECT_MANAGER
} from '../../../config/constants'
import './ProjectCardBody.scss'
import _ from 'lodash'

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

const canEdit = canEditStatus && (
project.status !== PROJECT_STATUS_COMPLETED && (isSuperUser || (currentMemberRole
&& (_.indexOf([PROJECT_ROLE_COPILOT, PROJECT_ROLE_MANAGER], currentMemberRole) > -1)))
&& (_.indexOf([
PROJECT_ROLE_COPILOT,
PROJECT_ROLE_MANAGER,
PROJECT_ROLE_PROGRAM_MANAGER,
PROJECT_ROLE_PROJECT_MANAGER,
PROJECT_ROLE_SOLUTION_ARCHITECT,
], currentMemberRole) > -1)))
)

const progress = _.get(process, 'percent', 0)
Expand Down
34 changes: 29 additions & 5 deletions src/projects/detail/containers/ProjectInfoContainer.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,21 @@ import { loadDashboardFeeds, loadProjectMessages } from '../../actions/projectTo
import { loadTopic } from '../../../actions/topics'
import { loadProjectPlan } from '../../actions/projectPlan'
import { setDuration, getProjectNavLinks } from '../../../helpers/projectHelper'
import { PROJECT_ROLE_OWNER, PROJECT_ROLE_COPILOT, PROJECT_ROLE_MANAGER,
DIRECT_PROJECT_URL, SALESFORCE_PROJECT_LEAD_LINK, PROJECT_STATUS_CANCELLED, PROJECT_STATUS_ACTIVE,
PROJECT_STATUS_COMPLETED, PHASE_STATUS_REVIEWED, PHASE_STATUS_ACTIVE } from '../../../config/constants'
import {
PROJECT_ROLE_OWNER,
PROJECT_ROLE_COPILOT,
PROJECT_ROLE_MANAGER,
DIRECT_PROJECT_URL,
SALESFORCE_PROJECT_LEAD_LINK,
PROJECT_STATUS_CANCELLED,
PROJECT_STATUS_ACTIVE,
PROJECT_STATUS_COMPLETED,
PHASE_STATUS_REVIEWED,
PHASE_STATUS_ACTIVE,
PROJECT_ROLE_PROJECT_MANAGER,
PROJECT_ROLE_PROGRAM_MANAGER,
PROJECT_ROLE_SOLUTION_ARCHITECT,
} from '../../../config/constants'
import PERMISSIONS from '../../../config/permissions'
import { checkPermission } from '../../../helpers/permissions'
import Panel from '../../../components/Panel/Panel'
Expand Down Expand Up @@ -423,7 +435,13 @@ class ProjectInfoContainer extends React.Component {
productsTimelines, isProjectProcessing, notifications } = this.props
let directLinks = null
// check if direct links need to be added
const isMemberOrCopilot = _.indexOf([PROJECT_ROLE_COPILOT, PROJECT_ROLE_MANAGER], currentMemberRole) > -1
const isMemberOrCopilot = _.indexOf([
PROJECT_ROLE_COPILOT,
PROJECT_ROLE_MANAGER,
PROJECT_ROLE_PROJECT_MANAGER,
PROJECT_ROLE_PROGRAM_MANAGER,
PROJECT_ROLE_SOLUTION_ARCHITECT
], currentMemberRole) > -1
if (isMemberOrCopilot || isSuperUser) {
directLinks = []
if (project.directProjectId) {
Expand Down Expand Up @@ -453,7 +471,13 @@ class ProjectInfoContainer extends React.Component {

const canEdit = (
project.status !== PROJECT_STATUS_COMPLETED && (isSuperUser || (currentMemberRole
&& (_.indexOf([PROJECT_ROLE_COPILOT, PROJECT_ROLE_MANAGER], currentMemberRole) > -1)))
&& (_.indexOf([
PROJECT_ROLE_COPILOT,
PROJECT_ROLE_MANAGER,
PROJECT_ROLE_PROJECT_MANAGER,
PROJECT_ROLE_PROGRAM_MANAGER,
PROJECT_ROLE_SOLUTION_ARCHITECT
], currentMemberRole) > -1)))
)

const progress = _.get(process, 'percent', 0)
Expand Down
Loading