Skip to content

Commit 1edaeda

Browse files
author
vikasrohit
authored
Merge pull request #4288 from appirio-tech/dev
[PROD] Beta Release 2.17.0
2 parents a4987d2 + 5ab6d57 commit 1edaeda

File tree

15 files changed

+344
-10
lines changed

15 files changed

+344
-10
lines changed

config/constants/dev.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,5 +56,6 @@ module.exports = {
5656
CONTENTFUL_DELIVERY_KEY : process.env.CONTENTFUL_DELIVERY_KEY,
5757
CONTENTFUL_SPACE_ID : process.env.CONTENTFUL_SPACE_ID,
5858

59-
TAAS_APP_URL: 'https://platform.topcoder-dev.com/taas'
59+
TAAS_APP_URL: 'https://platform.topcoder-dev.com/taas',
60+
DEFAULT_NDA_UUID: 'e5811a7b-43d1-407a-a064-69e5015b4900'
6061
}

config/constants/master.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,5 +56,6 @@ module.exports = {
5656
CONTENTFUL_DELIVERY_KEY : process.env.CONTENTFUL_DELIVERY_KEY,
5757
CONTENTFUL_SPACE_ID : process.env.CONTENTFUL_SPACE_ID,
5858

59-
TAAS_APP_URL: 'https://platform.topcoder.com/taas'
59+
TAAS_APP_URL: 'https://platform.topcoder.com/taas',
60+
DEFAULT_NDA_UUID: 'c41e90e5-4d0e-4811-bd09-38ff72674490'
6061
}

config/constants/qa.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,6 @@ module.exports = {
5151

5252
TC_CDN_URL: process.env.TC_CDN_URL,
5353

54-
TAAS_APP_URL: 'https://platform.topcoder-dev.com/taas'
54+
TAAS_APP_URL: 'https://platform.topcoder-dev.com/taas',
55+
DEFAULT_NDA_UUID: 'e5811a7b-43d1-407a-a064-69e5015b4900'
5556
}

docs/permissions.html

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1097,6 +1097,33 @@ <h2 class="anchor-container">
10971097
</div>
10981098
</div>
10991099
</div>
1100+
<div class="row border-top">
1101+
<div class="col py-2">
1102+
<div class="permission-title anchor-container">
1103+
<a href="#VIEW_PROJECT_DEFAULTS" name="VIEW_PROJECT_DEFAULTS" class="anchor"></a>View Project Defaults Tab
1104+
</div>
1105+
<div class="permission-variable"><small><code>VIEW_PROJECT_DEFAULTS</code></small></div>
1106+
<div class="text-black-50 small-text"></div>
1107+
</div>
1108+
<div class="col-9 py-2">
1109+
<div>
1110+
<span class="badge badge-primary" title="Allowed Project Role">customer</span>
1111+
<span class="badge badge-primary" title="Allowed Project Role">copilot</span>
1112+
<span class="badge badge-primary" title="Allowed Project Role">manager</span>
1113+
<span class="badge badge-primary" title="Allowed Project Role">account_manager</span>
1114+
<span class="badge badge-primary" title="Allowed Project Role">account_executive</span>
1115+
<span class="badge badge-primary" title="Allowed Project Role">project_manager</span>
1116+
<span class="badge badge-primary" title="Allowed Project Role">program_manager</span>
1117+
<span class="badge badge-primary" title="Allowed Project Role">solution_architect</span>
1118+
</div>
1119+
1120+
<div>
1121+
<span class="badge badge-success" title="Allowed Topcoder Role">administrator</span>
1122+
<span class="badge badge-success" title="Allowed Topcoder Role">Connect Admin</span>
1123+
<span class="badge badge-success" title="Allowed Topcoder Role">Connect Manager</span>
1124+
</div>
1125+
</div>
1126+
</div>
11001127
<div class="row">
11011128
<div class="col pt-5 pb-2">
11021129
<h2 class="anchor-container">

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/components/TeamManagement/TeamManagement.jsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ class TeamManagement extends React.Component {
9797
onDeleteInvite, isShowTopcoderDialog, onShowTopcoderDialog, processingInvites, processingMembers,
9898
onTopcoderInviteSend, onTopcoderInviteDeleteConfirm, topcoderTeamInvites, onAcceptOrRefuse, error,
9999
onSelectedMembersUpdate, selectedMembers, allMembers, updatingMemberIds, onShowCopilotDialog, copilotTeamInvites,
100-
isShowCopilotDialog, onCopilotInviteSend,
100+
isShowCopilotDialog, onCopilotInviteSend, projectId,
101101
} = this.props
102102

103103
const {
@@ -114,6 +114,7 @@ class TeamManagement extends React.Component {
114114
const copilotRemoveAction = hasPermission(PERMISSIONS.REMOVE_COPILOTS)
115115
const copilotViewAction = hasPermission(PERMISSIONS.VIEW_COPILOTS)
116116
const canRequestCopilot = hasPermission(PERMISSIONS.REQUEST_COPILOTS)
117+
const copilotRequestLink = `https://topcoder.typeform.com/to/YJ7AL4p8#handle=${currentUser.handle}&projectid=${projectId}`
117118
const canJoinTopcoderTeam = !currentMember && hasPermission(PERMISSIONS.JOIN_TOPCODER_TEAM)
118119

119120
const sortedMembers = members
@@ -241,7 +242,7 @@ class TeamManagement extends React.Component {
241242
<div styleName="button-container">
242243
<a
243244
className="join-btn"
244-
href="https://docs.google.com/forms/d/e/1FAIpQLSeZ7UXDd4XGOISHLs-zLaZwKliTySlbfso5px71tRTePfRj3Q/viewform" target="_blank"
245+
href={copilotRequestLink} target="_blank"
245246
>
246247
Request Copilot
247248
</a>
@@ -475,6 +476,8 @@ TeamManagement.propTypes = {
475476
userId: PropTypes.number.isRequired,
476477
}).isRequired,
477478

479+
projectId: PropTypes.number.isRequired,
480+
478481
/**
479482
* The list of all project members
480483
*/

src/config/permissions.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -678,6 +678,20 @@ export const PERMISSIONS = {
678678
],
679679
},
680680

681+
VIEW_PROJECT_DEFAULTS: {
682+
meta: {
683+
group: 'Project Details',
684+
title: 'View Project Defaults Tab',
685+
},
686+
projectRoles: [
687+
..._.difference(PROJECT_ALL, PROJECT_ROLE_CUSTOMER)
688+
],
689+
topcoderRoles: [
690+
...TOPCODER_ADMINS,
691+
ROLE_CONNECT_MANAGER
692+
]
693+
},
694+
681695
/*
682696
Scope Change Requests
683697
*/
@@ -769,7 +783,7 @@ export const PERMISSIONS = {
769783
topcoderRoles: [
770784
...TOPCODER_ADMINS,
771785
]
772-
},
786+
}
773787
}
774788

775789
/**

src/helpers/projectHelper.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import _ from 'lodash'
22
import moment from 'moment'
33
import { findProduct } from '../config/projectWizard'
4+
import { PERMISSIONS } from 'config/permissions'
5+
import { hasPermission } from 'helpers/permissions'
46

57
import {
68
PHASE_STATUS_ACTIVE,
@@ -17,6 +19,7 @@ import MessagesIcon from '../assets/icons/v.2.5/icon-messages.svg'
1719
import ReportsIcon from '../assets/icons/v.2.5/icon-reports.svg'
1820
import AssetsLibraryIcon from '../assets/icons/v.2.5/icon-assets-library.svg'
1921
import FAQIcon from '../assets/icons/faq.svg'
22+
import AccountSecurityIcon from 'assets/icons/v.2.5/icon-account-security.svg'
2023
import InvisibleIcon from '../assets/icons/invisible.svg'
2124

2225
import { formatNumberWithCommas } from './format'
@@ -278,5 +281,12 @@ export function getProjectNavLinks(project, projectId, renderFAQs) {
278281
const faqTab = { label: 'FAQ', to: `/projects/${projectId}/faqs`, Icon: FAQIcon, iconClassName: 'fill' }
279282
navLinks.push(faqTab)
280283
}
284+
285+
const searchParams = new URLSearchParams(window.location.search)
286+
287+
if (searchParams.get('beta') === 'true' && hasPermission(PERMISSIONS.VIEW_PROJECT_DEFAULTS)) {
288+
navLinks.push({ label: 'Project Defaults', to: `/projects/${projectId}/settings`, Icon: AccountSecurityIcon, iconClassName: 'stroke' })
289+
}
290+
281291
return navLinks
282292
}
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
import React from 'react'
2+
import {connect} from 'react-redux'
3+
import FormsyForm from 'appirio-tech-react-components/components/Formsy'
4+
const Formsy = FormsyForm.Formsy
5+
import RadioGroup from 'appirio-tech-react-components/components/Formsy/RadioGroup'
6+
import SpecQuestionList from '../SpecQuestionList/SpecQuestionList'
7+
import Accordion from '../Accordion/Accordion'
8+
import { updateProject } from '../../../actions/project'
9+
import { DEFAULT_NDA_UUID } from '../../../../../config/constants'
10+
11+
import './EditProjectDefaultsForm.scss'
12+
13+
class EditProjectDefaultsForm extends React.Component {
14+
constructor(props) {
15+
super(props)
16+
17+
this.state = {
18+
hasNda: false,
19+
enableButton: false,
20+
isLoading: true
21+
}
22+
23+
this.handleChange = this.handleChange.bind(this)
24+
this.handleSubmit = this.handleSubmit.bind(this)
25+
}
26+
27+
componentDidMount() {
28+
const {terms} = this.props.project
29+
if (terms.indexOf(DEFAULT_NDA_UUID) >= 0) {
30+
this.setState({hasNda: true})
31+
}
32+
this.setState({isLoading: false})
33+
}
34+
35+
handleChange({nda}) {
36+
if ((nda === 'yes') !== this.state.hasNda) {
37+
if (this.state.enableButton !== true) {
38+
this.setState({enableButton: true})
39+
}
40+
} else {
41+
if (this.state.enableButton !== false) {
42+
this.setState({enableButton: false})
43+
}
44+
}
45+
}
46+
47+
handleSubmit() {
48+
const {updateProject} = this.props
49+
const {id, terms} = this.props.project
50+
const newHasNda = !this.state.hasNda
51+
if (newHasNda) {
52+
updateProject(id, {
53+
terms: [...new Set([...terms, DEFAULT_NDA_UUID])]
54+
}, true).then(() => {
55+
this.setState({
56+
hasNda: this.props.project.terms.indexOf(DEFAULT_NDA_UUID) >= 0
57+
})
58+
})
59+
} else {
60+
const newTerms = [...terms]
61+
if (newTerms.indexOf(DEFAULT_NDA_UUID) >= 0) {
62+
newTerms.splice(newTerms.indexOf(DEFAULT_NDA_UUID), 1)
63+
updateProject(id, {
64+
terms: newTerms
65+
}, true).then(() => {
66+
this.setState({
67+
hasNda: this.props.project.terms.indexOf(DEFAULT_NDA_UUID) >= 0
68+
})
69+
})
70+
}
71+
}
72+
}
73+
74+
render() {
75+
const opts = [
76+
{
77+
value: 'yes',
78+
label: 'Yes'
79+
},
80+
{
81+
value: 'no',
82+
label: 'No'
83+
}
84+
]
85+
86+
if (this.state.isLoading) return null
87+
88+
return (
89+
<div className="edit-project-defaults-form">
90+
<Formsy.Form
91+
onValidSubmit={this.handleSubmit}
92+
onChange={this.handleChange}
93+
>
94+
<div className="container">
95+
<SpecQuestionList>
96+
<Accordion
97+
title="Enforce Topcoder NDA"
98+
type="radio-group"
99+
options={opts}
100+
>
101+
<SpecQuestionList.Item>
102+
<RadioGroup
103+
name="nda"
104+
options={opts}
105+
value={this.state.hasNda ? 'yes' : 'no'}
106+
/>
107+
</SpecQuestionList.Item>
108+
</Accordion>
109+
</SpecQuestionList>
110+
</div>
111+
<div className="section-footer section-footer-spec">
112+
<button
113+
className="tc-btn tc-btn-primary tc-btn-md"
114+
type="submit"
115+
disabled={!this.state.enableButton}
116+
>
117+
Save
118+
</button>
119+
</div>
120+
</Formsy.Form>
121+
</div>
122+
)
123+
}
124+
}
125+
126+
const mapDispatchToProps = {
127+
updateProject
128+
}
129+
130+
export default connect(null, mapDispatchToProps)(EditProjectDefaultsForm)
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
@import '~tc-ui/src/styles/tc-includes';
2+
3+
:global {
4+
.edit-project-defaults-form {
5+
background-color: white;
6+
.container {
7+
padding: 50px 0 70px 0;
8+
margin: 0 50px 20px 50px;
9+
}
10+
.radio-group-options {
11+
flex-direction: column;
12+
}
13+
14+
.radio label {
15+
font-size: 15px;
16+
font-weight: 400;
17+
}
18+
19+
.radio-group-options .radio {
20+
margin: 0 0 10px 0;
21+
background-color: $tc-gray-neutral-light;
22+
padding: 10px;
23+
border-radius: 4px;
24+
display: block;
25+
26+
&:first-child {
27+
margin-top: 10px;
28+
}
29+
}
30+
31+
.radio-group-options .radio.selected {
32+
background-color: $tc-dark-blue-10;
33+
}
34+
35+
.radio-group-options .radio-option-price {
36+
float: right;
37+
font-size: 15px;
38+
color: $tc-gray-100;
39+
}
40+
41+
.radio-option-description {
42+
color: $tc-gray-70;
43+
font-size: 13px;
44+
margin-top: 10px;
45+
line-height: 20px;
46+
}
47+
}
48+
}

0 commit comments

Comments
 (0)