From 320c8823fa93e05d0ef1904ecc25d26b23cbcfe4 Mon Sep 17 00:00:00 2001 From: C Dharmateja Date: Mon, 25 Jan 2021 17:44:39 +0530 Subject: [PATCH 1/9] Showw billing account id in advanced settings --- .../ChallengeEditor/ChallengeView/index.js | 31 ++++++++++++++----- src/components/ChallengeEditor/index.js | 15 ++++++++- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/src/components/ChallengeEditor/ChallengeView/index.js b/src/components/ChallengeEditor/ChallengeView/index.js index b2316299..8ff68e6f 100644 --- a/src/components/ChallengeEditor/ChallengeView/index.js +++ b/src/components/ChallengeEditor/ChallengeView/index.js @@ -36,7 +36,9 @@ const ChallengeView = ({ assignedMemberDetails, enableEdit, onLaunchChallenge, - onCloseTask }) => { + onCloseTask, + location }) => { + const params = new URLSearchParams(location.search) const selectedType = _.find(metadata.challengeTypes, { id: challenge.typeId }) const challengeTrack = _.find(metadata.challengeTracks, { id: challenge.trackId }) @@ -178,11 +180,25 @@ const ChallengeView = ({ - {openAdvanceSettings && (
-
- Groups: {groups} -
-
)} + {openAdvanceSettings && ( + +
+
+ Groups: {groups} +
+
+ {params.get('beta') && ( +
+
+ + Billing Account Id: + {projectDetail.billingAccountId} + +
+
+ )} +
+ )} {
)} + {params.get('beta') && ( +
+
+ + Billing Account Id: + {projectDetail.billingAccountId} + +
+
+ )} )} {!isTask && ( @@ -1546,7 +1558,8 @@ ChallengeEditor.propTypes = { replaceResourceInRole: PropTypes.func, partiallyUpdateChallengeDetails: PropTypes.func.isRequired, deleteChallenge: PropTypes.func.isRequired, - loggedInUser: PropTypes.shape().isRequired + loggedInUser: PropTypes.shape().isRequired, + location: PropTypes.object } export default withRouter(ChallengeEditor) From 8cc67c0736cc6aecd0cd80688453faee97c9b71c Mon Sep 17 00:00:00 2001 From: C Dharmateja Date: Tue, 26 Jan 2021 12:11:26 +0530 Subject: [PATCH 2/9] add default terms and refractor nda input --- .../ChallengeEditor/ChallengeView/index.js | 33 +++- .../NDAField/NDAField.module.scss | 159 ++++++++++++++++++ .../ChallengeEditor/NDAField/index.js | 43 +++-- .../ChallengeEditor/Terms-Field/index.js | 16 +- src/components/ChallengeEditor/index.js | 20 ++- 5 files changed, 237 insertions(+), 34 deletions(-) diff --git a/src/components/ChallengeEditor/ChallengeView/index.js b/src/components/ChallengeEditor/ChallengeView/index.js index b8d1d266..8d2348e3 100644 --- a/src/components/ChallengeEditor/ChallengeView/index.js +++ b/src/components/ChallengeEditor/ChallengeView/index.js @@ -37,7 +37,9 @@ const ChallengeView = ({ assignedMemberDetails, enableEdit, onLaunchChallenge, - onCloseTask }) => { + onCloseTask, + location }) => { + const params = new URLSearchParams(location.search) const selectedType = _.find(metadata.challengeTypes, { id: challenge.typeId }) const challengeTrack = _.find(metadata.challengeTracks, { id: challenge.trackId }) @@ -148,7 +150,6 @@ const ChallengeView = ({ Challenge Name: {challenge.name}
- {isTask && } - {openAdvanceSettings && (
-
- Groups: {groups} -
-
)} + {openAdvanceSettings && ( + <> + + {params.get('beta') === 'true' && ( +
+
+ + Terms: + {challenge.terms.map(term => term.id).join(', ')} + +
+
+ )} +
+
+ Groups: {groups} +
+
+ + )} {
{ const isRequiredNda = challenge.terms && _.some(challenge.terms, { id: DEFAULT_NDA_UUID }) + return (
-
- - +
NDA Required :
+
+
+ + +
+
+ + +
) diff --git a/src/components/ChallengeEditor/Terms-Field/index.js b/src/components/ChallengeEditor/Terms-Field/index.js index 4d05e086..44f6ca1d 100644 --- a/src/components/ChallengeEditor/Terms-Field/index.js +++ b/src/components/ChallengeEditor/Terms-Field/index.js @@ -4,17 +4,16 @@ import Select from '../../Select' import cn from 'classnames' import styles from './Terms-Field.module.scss' -const TermsField = ({ terms, challenge, onUpdateMultiSelect }) => { - const mapOps = item => ({ label: item.title, value: item.id }) +const TermsField = ({ terms, projectTerms, challenge, onUpdateMultiSelect }) => { + const mapOps = item => ({ label: item, value: item }) const [currTerms, setCurrTerms] = React.useState([]) React.useEffect(() => { - const challengeTerms = new Set(challenge.terms) - const defaultValue = terms - .filter(term => challengeTerms.has(term.id)) + const challengeTermsIds = challenge.terms.map(({ id }) => id) + const allTerms = [...new Set([...projectTerms, ...challengeTermsIds])] .map(mapOps) - setCurrTerms(defaultValue) + setCurrTerms(allTerms) }, []) return ( @@ -32,7 +31,7 @@ const TermsField = ({ terms, challenge, onUpdateMultiSelect }) => { value={currTerms} onChange={(value) => { onUpdateMultiSelect(value, 'terms') - setCurrTerms(setCurrTerms(terms)) + setCurrTerms(value) }} />
@@ -47,7 +46,8 @@ TermsField.defaultProps = { TermsField.propTypes = { challenge: PropTypes.shape().isRequired, terms: PropTypes.arrayOf(PropTypes.shape()).isRequired, - onUpdateMultiSelect: PropTypes.func.isRequired + onUpdateMultiSelect: PropTypes.func.isRequired, + projectTerms: PropTypes.array } export default TermsField diff --git a/src/components/ChallengeEditor/index.js b/src/components/ChallengeEditor/index.js index 9dca0d00..0f8462e6 100644 --- a/src/components/ChallengeEditor/index.js +++ b/src/components/ChallengeEditor/index.js @@ -195,7 +195,8 @@ class ChallengeEditor extends Component { challengeData.copilot = copilot || copilotFromResources challengeData.reviewer = reviewer || reviewerFromResources const challengeDetail = { ...challengeData } - const isOpenAdvanceSettings = challengeDetail.groups.length > 0 + const isRequiredNda = challengeDetail.terms && _.some(challengeDetail.terms, { id: DEFAULT_NDA_UUID }) + const isOpenAdvanceSettings = challengeDetail.groups.length > 0 || isRequiredNda setState({ challenge: challengeDetail, assignedMemberDetails, @@ -1116,6 +1117,8 @@ class ChallengeEditor extends Component { } render () { + const params = new URLSearchParams(this.props.location.search) + const { isLaunch, isConfirm, @@ -1359,7 +1362,6 @@ class ChallengeEditor extends Component {
- {isTask && ( { isOpenAdvanceSettings && ( - {/* remove terms field and use default term */} - {false && ()} + + {params.get('beta') && ( + + )} )} @@ -1526,7 +1535,8 @@ ChallengeEditor.propTypes = { replaceResourceInRole: PropTypes.func, partiallyUpdateChallengeDetails: PropTypes.func.isRequired, deleteChallenge: PropTypes.func.isRequired, - loggedInUser: PropTypes.shape().isRequired + loggedInUser: PropTypes.shape().isRequired, + location: PropTypes.object } export default withRouter(ChallengeEditor) From d7846c759abfaff17ad331ed16e6768fa3ab56c6 Mon Sep 17 00:00:00 2001 From: C Dharmateja Date: Tue, 26 Jan 2021 20:09:22 +0530 Subject: [PATCH 3/9] pr review fixes --- .../ChallengeEditor/ChallengeView/index.js | 17 ++----------- .../NDAField/NDAField.module.scss | 2 +- .../ChallengeEditor/NDAField/index.js | 19 ++++++++++++-- .../ChallengeEditor/Terms-Field/index.js | 16 ++++++------ src/components/ChallengeEditor/index.js | 25 +++++++++---------- 5 files changed, 40 insertions(+), 39 deletions(-) diff --git a/src/components/ChallengeEditor/ChallengeView/index.js b/src/components/ChallengeEditor/ChallengeView/index.js index 8d2348e3..64448bc3 100644 --- a/src/components/ChallengeEditor/ChallengeView/index.js +++ b/src/components/ChallengeEditor/ChallengeView/index.js @@ -37,9 +37,7 @@ const ChallengeView = ({ assignedMemberDetails, enableEdit, onLaunchChallenge, - onCloseTask, - location }) => { - const params = new URLSearchParams(location.search) + onCloseTask }) => { const selectedType = _.find(metadata.challengeTypes, { id: challenge.typeId }) const challengeTrack = _.find(metadata.challengeTracks, { id: challenge.trackId }) @@ -183,16 +181,6 @@ const ChallengeView = ({ {openAdvanceSettings && ( <> - {params.get('beta') === 'true' && ( -
-
- - Terms: - {challenge.terms.map(term => term.id).join(', ')} - -
-
- )}
Groups: {groups} @@ -283,8 +271,7 @@ ChallengeView.propTypes = { assignedMemberDetails: PropTypes.shape(), enableEdit: PropTypes.bool, onLaunchChallenge: PropTypes.func, - onCloseTask: PropTypes.func, - location: PropTypes.object + onCloseTask: PropTypes.func } export default withRouter(ChallengeView) diff --git a/src/components/ChallengeEditor/NDAField/NDAField.module.scss b/src/components/ChallengeEditor/NDAField/NDAField.module.scss index 30ee09ae..9db222fb 100644 --- a/src/components/ChallengeEditor/NDAField/NDAField.module.scss +++ b/src/components/ChallengeEditor/NDAField/NDAField.module.scss @@ -173,7 +173,7 @@ } height: 18px; - width: 210px; + width: 80px; margin: 0; padding: 0; vertical-align: bottom; diff --git a/src/components/ChallengeEditor/NDAField/index.js b/src/components/ChallengeEditor/NDAField/index.js index dfbed5a2..29cd9a98 100644 --- a/src/components/ChallengeEditor/NDAField/index.js +++ b/src/components/ChallengeEditor/NDAField/index.js @@ -8,6 +8,21 @@ import { DEFAULT_NDA_UUID } from '../../../config/constants' const NDAField = ({ challenge, toggleNdaRequire, readOnly }) => { const isRequiredNda = challenge.terms && _.some(challenge.terms, { id: DEFAULT_NDA_UUID }) + if (readOnly) { + return ( +
+
NDA Required :
+
+ { + isRequiredNda + ?
Yes
+ :
No
+ } +
+
+ ) + } + return (
NDA Required :
@@ -18,7 +33,7 @@ const NDAField = ({ challenge, toggleNdaRequire, readOnly }) => { type='radio' id='nda-yes' checked={isRequiredNda} - onChange={!readOnly && toggleNdaRequire} + onChange={toggleNdaRequire} />
@@ -46,8 +47,7 @@ TermsField.defaultProps = { TermsField.propTypes = { challenge: PropTypes.shape().isRequired, terms: PropTypes.arrayOf(PropTypes.shape()).isRequired, - onUpdateMultiSelect: PropTypes.func.isRequired, - projectTerms: PropTypes.array + onUpdateMultiSelect: PropTypes.func.isRequired } export default TermsField diff --git a/src/components/ChallengeEditor/index.js b/src/components/ChallengeEditor/index.js index 0f8462e6..9348bb8d 100644 --- a/src/components/ChallengeEditor/index.js +++ b/src/components/ChallengeEditor/index.js @@ -810,7 +810,7 @@ class ChallengeEditor extends Component { async createNewChallenge () { if (!this.props.isNew) return - const { metadata, createChallenge } = this.props + const { metadata, createChallenge, projectDetail } = this.props const { name, trackId, typeId } = this.state.challenge const { timelineTemplates } = metadata const isDesignChallenge = trackId === DES_TRACK_ID @@ -839,6 +839,14 @@ class ChallengeEditor extends Component { terms: [{ id: DEFAULT_TERM_UUID, roleId: SUBMITTER_ROLE_UUID }] // prizeSets: this.getDefaultPrizeSets() } + if (projectDetail.terms) { + const currTerms = new Set(newChallenge.terms.map(term => term.id)) + newChallenge.terms.push( + ...projectDetail.terms + .filter(term => !currTerms.has(term)) + .map(term => ({ id: term, roleId: SUBMITTER_ROLE_UUID })) + ) + } const discussions = this.getDiscussionsConfig(newChallenge) if (discussions) { newChallenge.discussions = discussions @@ -1117,8 +1125,6 @@ class ChallengeEditor extends Component { } render () { - const params = new URLSearchParams(this.props.location.search) - const { isLaunch, isConfirm, @@ -1395,14 +1401,8 @@ class ChallengeEditor extends Component { { isOpenAdvanceSettings && ( - {params.get('beta') && ( - - )} + {/* remove terms field and use default term */} + {false && ()} )} @@ -1535,8 +1535,7 @@ ChallengeEditor.propTypes = { replaceResourceInRole: PropTypes.func, partiallyUpdateChallengeDetails: PropTypes.func.isRequired, deleteChallenge: PropTypes.func.isRequired, - loggedInUser: PropTypes.shape().isRequired, - location: PropTypes.object + loggedInUser: PropTypes.shape().isRequired } export default withRouter(ChallengeEditor) From 6247a54d77ef648600a08c201ca745cd8c72263b Mon Sep 17 00:00:00 2001 From: C Dharmateja Date: Wed, 27 Jan 2021 09:31:07 +0000 Subject: [PATCH 4/9] review fixes --- .../NDAField/NDAField.module.scss | 79 ++----------------- .../ChallengeEditor/NDAField/index.js | 10 +-- 2 files changed, 9 insertions(+), 80 deletions(-) diff --git a/src/components/ChallengeEditor/NDAField/NDAField.module.scss b/src/components/ChallengeEditor/NDAField/NDAField.module.scss index 9db222fb..70719729 100644 --- a/src/components/ChallengeEditor/NDAField/NDAField.module.scss +++ b/src/components/ChallengeEditor/NDAField/NDAField.module.scss @@ -8,78 +8,13 @@ align-content: space-between; justify-content: flex-start; - .tcCheckbox { - @include tc-checkbox; - - height: 18px; - width: 210px; - margin: 0; - padding: 0; - vertical-align: bottom; - position: relative; - display: inline-block; - - input[type='checkbox'] { - display: none; - } - - label { - @include roboto-light(); - - line-height: 17px; - font-weight: 300; - cursor: pointer; - position: absolute; - display: inline-block; - width: 14px; - height: 14px; - top: 0; - left: 0; - border: none; - box-shadow: none; - background: $tc-gray-30; - transition: all 0.15s ease-in-out; - - - &.readOnly { - cursor: auto; - } - - &::after { - opacity: 0; - content: ''; - position: absolute; - width: 9px; - height: 5px; - background: transparent; - top: 2px; - left: 2px; - border-top: none; - border-right: none; - transform: rotate(-45deg); - transition: all 0.15s ease-in-out; - } - - &:hover::after { - opacity: 0.3; - } - &:hover:read-only::after { - opacity: 0; - } - - div { - margin-left: 24px; - width: 300px; - } - } - - input[type='checkbox']:checked ~ label { - background: $tc-blue-20; - } - - input[type='checkbox']:checked + label::after { - border-color: $white; - } + .fieldTitle { + @include roboto-bold(); + font-size: 16px; + line-height: 19px; + font-weight: 500; + color: $tc-gray-80; + margin-right: 10px; } .field { diff --git a/src/components/ChallengeEditor/NDAField/index.js b/src/components/ChallengeEditor/NDAField/index.js index 29cd9a98..018abf67 100644 --- a/src/components/ChallengeEditor/NDAField/index.js +++ b/src/components/ChallengeEditor/NDAField/index.js @@ -13,11 +13,7 @@ const NDAField = ({ challenge, toggleNdaRequire, readOnly }) => {
NDA Required :
- { - isRequiredNda - ?
Yes
- :
No
- } + { isRequiredNda ? 'Yes' : 'No' }
) @@ -36,8 +32,7 @@ const NDAField = ({ challenge, toggleNdaRequire, readOnly }) => { onChange={toggleNdaRequire} />
@@ -50,7 +45,6 @@ const NDAField = ({ challenge, toggleNdaRequire, readOnly }) => { />
From 6a8e16593d378ae556634905bf1628056dcdb350 Mon Sep 17 00:00:00 2001 From: C Dharmateja Date: Wed, 27 Jan 2021 12:00:22 +0000 Subject: [PATCH 5/9] fix project terms load and default terms in beta --- src/components/ChallengeEditor/index.js | 5 +++-- src/containers/ChallengeEditor/index.js | 20 +++++++++++++++++--- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/components/ChallengeEditor/index.js b/src/components/ChallengeEditor/index.js index 12c50035..a0b3d965 100644 --- a/src/components/ChallengeEditor/index.js +++ b/src/components/ChallengeEditor/index.js @@ -810,7 +810,8 @@ class ChallengeEditor extends Component { async createNewChallenge () { if (!this.props.isNew) return - const { metadata, createChallenge, projectDetail } = this.props + const { metadata, createChallenge, projectDetail, location } = this.props + const params = new URLSearchParams(location.search) const { name, trackId, typeId } = this.state.challenge const { timelineTemplates } = metadata const isDesignChallenge = trackId === DES_TRACK_ID @@ -839,7 +840,7 @@ class ChallengeEditor extends Component { terms: [{ id: DEFAULT_TERM_UUID, roleId: SUBMITTER_ROLE_UUID }] // prizeSets: this.getDefaultPrizeSets() } - if (projectDetail.terms) { + if (params.get('beta') === 'true' && projectDetail.terms) { const currTerms = new Set(newChallenge.terms.map(term => term.id)) newChallenge.terms.push( ...projectDetail.terms diff --git a/src/containers/ChallengeEditor/index.js b/src/containers/ChallengeEditor/index.js index 51ffaa26..ef20dc23 100644 --- a/src/containers/ChallengeEditor/index.js +++ b/src/containers/ChallengeEditor/index.js @@ -30,6 +30,8 @@ import { replaceResourceInRole } from '../../actions/challenges' +import { loadProject } from '../../actions/projects' + import { connect } from 'react-redux' import { SUBMITTER_ROLE_UUID, MESSAGE } from '../../config/constants' import { patchChallenge } from '../../services/challenges' @@ -74,7 +76,8 @@ class ChallengeEditor extends Component { loadGroups, loadResourceRoles, loadChallengeDetails, - loadResources + loadResources, + loadProject } = this.props loadTimelineTemplates() loadChallengePhases() @@ -85,6 +88,7 @@ class ChallengeEditor extends Component { // loadChallengeTerms() loadGroups() loadResourceRoles() + this.fetchProjectDetails(match, loadProject) this.fetchChallengeDetails(match, loadChallengeDetails, loadResources) // this.unlisten = this.props.history.listen(() => { @@ -112,6 +116,14 @@ class ChallengeEditor extends Component { } } + async fetchProjectDetails (newMatch, loadProject) { + let projectId = _.get(newMatch.params, 'projectId', null) + projectId = projectId ? parseInt(projectId) : null + if (projectId) { + await loadProject(projectId) + } + } + async fetchChallengeDetails (newMatch, loadChallengeDetails, loadResources) { let projectId = _.get(newMatch.params, 'projectId', null) projectId = projectId ? parseInt(projectId) : null @@ -413,7 +425,8 @@ ChallengeEditor.propTypes = { partiallyUpdateChallengeDetails: PropTypes.func.isRequired, createChallenge: PropTypes.func.isRequired, deleteChallenge: PropTypes.func.isRequired, - replaceResourceInRole: PropTypes.func + replaceResourceInRole: PropTypes.func, + loadProject: PropTypes.func // members: PropTypes.arrayOf(PropTypes.shape()) } @@ -450,7 +463,8 @@ const mapDispatchToProps = { partiallyUpdateChallengeDetails, deleteChallenge, createChallenge, - replaceResourceInRole + replaceResourceInRole, + loadProject } export default withRouter(connect(mapStateToProps, mapDispatchToProps)(ChallengeEditor)) From 46f6345aba8483c5969904cbd05b89e2c3063605 Mon Sep 17 00:00:00 2001 From: C Dharmateja Date: Wed, 27 Jan 2021 13:17:51 +0000 Subject: [PATCH 6/9] fix: load project details once --- src/containers/ChallengeEditor/index.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/containers/ChallengeEditor/index.js b/src/containers/ChallengeEditor/index.js index ef20dc23..5198c8da 100644 --- a/src/containers/ChallengeEditor/index.js +++ b/src/containers/ChallengeEditor/index.js @@ -77,7 +77,8 @@ class ChallengeEditor extends Component { loadResourceRoles, loadChallengeDetails, loadResources, - loadProject + loadProject, + projectDetail } = this.props loadTimelineTemplates() loadChallengePhases() @@ -88,7 +89,9 @@ class ChallengeEditor extends Component { // loadChallengeTerms() loadGroups() loadResourceRoles() - this.fetchProjectDetails(match, loadProject) + if (!projectDetail.terms) { + this.fetchProjectDetails(match, loadProject) + } this.fetchChallengeDetails(match, loadChallengeDetails, loadResources) // this.unlisten = this.props.history.listen(() => { From 58ef9bee986c0d279a5f7300ac6cf77abfa7b4cd Mon Sep 17 00:00:00 2001 From: C Dharmateja Date: Thu, 28 Jan 2021 07:04:11 +0000 Subject: [PATCH 7/9] fix 2nd load of project details --- src/containers/ChallengeEditor/index.js | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/containers/ChallengeEditor/index.js b/src/containers/ChallengeEditor/index.js index 5198c8da..910c2f01 100644 --- a/src/containers/ChallengeEditor/index.js +++ b/src/containers/ChallengeEditor/index.js @@ -61,6 +61,7 @@ class ChallengeEditor extends Component { this.closeSuccessModal = this.closeSuccessModal.bind(this) this.onCloseTask = this.onCloseTask.bind(this) this.closeTask = this.closeTask.bind(this) + this.fetchProjectDetails = this.fetchProjectDetails.bind(this) } componentDidMount () { @@ -76,9 +77,7 @@ class ChallengeEditor extends Component { loadGroups, loadResourceRoles, loadChallengeDetails, - loadResources, - loadProject, - projectDetail + loadResources } = this.props loadTimelineTemplates() loadChallengePhases() @@ -89,11 +88,7 @@ class ChallengeEditor extends Component { // loadChallengeTerms() loadGroups() loadResourceRoles() - if (!projectDetail.terms) { - this.fetchProjectDetails(match, loadProject) - } this.fetchChallengeDetails(match, loadChallengeDetails, loadResources) - // this.unlisten = this.props.history.listen(() => { // const { isLoading } = this.props // if (!isLoading) { @@ -119,11 +114,11 @@ class ChallengeEditor extends Component { } } - async fetchProjectDetails (newMatch, loadProject) { + async fetchProjectDetails (newMatch) { let projectId = _.get(newMatch.params, 'projectId', null) projectId = projectId ? parseInt(projectId) : null if (projectId) { - await loadProject(projectId) + await this.props.loadProject(projectId) } } @@ -133,6 +128,9 @@ class ChallengeEditor extends Component { const challengeId = _.get(newMatch.params, 'challengeId', null) await loadResources(challengeId) loadChallengeDetails(projectId, challengeId) + if (!challengeId) { + this.fetchProjectDetails(newMatch) + } } isEditable () { From 41d77a565ce7f7d3c6273a1a52c8cb4fdea8c413 Mon Sep 17 00:00:00 2001 From: mark-nakachon Date: Fri, 29 Jan 2021 17:14:07 +0530 Subject: [PATCH 8/9] fix issue-#1058 --- .../ChallengeEditor/ChallengeView/index.js | 11 +++--- src/components/ChallengeEditor/index.js | 13 +++---- src/components/Sidebar/Sidebar.module.scss | 9 +++++ src/components/Sidebar/index.js | 7 +++- src/config/constants.js | 2 ++ src/routes.js | 18 +++++++++- src/util/cookie.js | 34 +++++++++++++++++++ 7 files changed, 78 insertions(+), 16 deletions(-) create mode 100644 src/util/cookie.js diff --git a/src/components/ChallengeEditor/ChallengeView/index.js b/src/components/ChallengeEditor/ChallengeView/index.js index b6c7fbc5..b34550c9 100644 --- a/src/components/ChallengeEditor/ChallengeView/index.js +++ b/src/components/ChallengeEditor/ChallengeView/index.js @@ -21,6 +21,7 @@ import PhaseInput from '../../PhaseInput' import LegacyLinks from '../../LegacyLinks' import AssignedMemberField from '../AssignedMember-Field' import { getResourceRoleByName } from '../../../util/tc' +import { isBetaMode } from '../../../util/cookie' import { loadGroupDetails } from '../../../actions/challenges' import Tooltip from '../../Tooltip' import { MESSAGE, REVIEW_TYPES } from '../../../config/constants' @@ -37,9 +38,8 @@ const ChallengeView = ({ assignedMemberDetails, enableEdit, onLaunchChallenge, - onCloseTask, - location }) => { - const params = new URLSearchParams(location.search) + onCloseTask +}) => { const selectedType = _.find(metadata.challengeTypes, { id: challenge.typeId }) const challengeTrack = _.find(metadata.challengeTracks, { id: challenge.trackId }) @@ -188,7 +188,7 @@ const ChallengeView = ({ Groups: {groups} - {params.get('beta') && ( + {isBetaMode() && (
@@ -283,8 +283,7 @@ ChallengeView.propTypes = { assignedMemberDetails: PropTypes.shape(), enableEdit: PropTypes.bool, onLaunchChallenge: PropTypes.func, - onCloseTask: PropTypes.func, - location: PropTypes.object + onCloseTask: PropTypes.func } export default withRouter(ChallengeView) diff --git a/src/components/ChallengeEditor/index.js b/src/components/ChallengeEditor/index.js index a0b3d965..b08a5bfa 100644 --- a/src/components/ChallengeEditor/index.js +++ b/src/components/ChallengeEditor/index.js @@ -50,6 +50,7 @@ import LegacyLinks from '../LegacyLinks' import AssignedMemberField from './AssignedMember-Field' import Tooltip from '../Tooltip' import { getResourceRoleByName } from '../../util/tc' +import { isBetaMode } from '../../util/cookie' const theme = { container: styles.modalContainer @@ -810,8 +811,7 @@ class ChallengeEditor extends Component { async createNewChallenge () { if (!this.props.isNew) return - const { metadata, createChallenge, projectDetail, location } = this.props - const params = new URLSearchParams(location.search) + const { metadata, createChallenge, projectDetail } = this.props const { name, trackId, typeId } = this.state.challenge const { timelineTemplates } = metadata const isDesignChallenge = trackId === DES_TRACK_ID @@ -840,7 +840,7 @@ class ChallengeEditor extends Component { terms: [{ id: DEFAULT_TERM_UUID, roleId: SUBMITTER_ROLE_UUID }] // prizeSets: this.getDefaultPrizeSets() } - if (params.get('beta') === 'true' && projectDetail.terms) { + if (isBetaMode() && projectDetail.terms) { const currTerms = new Set(newChallenge.terms.map(term => term.id)) newChallenge.terms.push( ...projectDetail.terms @@ -1126,8 +1126,6 @@ class ChallengeEditor extends Component { } render () { - const params = new URLSearchParams(this.props.location.search) - const { isLaunch, isConfirm, @@ -1407,7 +1405,7 @@ class ChallengeEditor extends Component { {/* remove terms field and use default term */} {false && ()} - {params.get('beta') && ( + {isBetaMode() && (
@@ -1548,8 +1546,7 @@ ChallengeEditor.propTypes = { replaceResourceInRole: PropTypes.func, partiallyUpdateChallengeDetails: PropTypes.func.isRequired, deleteChallenge: PropTypes.func.isRequired, - loggedInUser: PropTypes.shape().isRequired, - location: PropTypes.object + loggedInUser: PropTypes.shape().isRequired } export default withRouter(ChallengeEditor) diff --git a/src/components/Sidebar/Sidebar.module.scss b/src/components/Sidebar/Sidebar.module.scss index 4a53d4d2..72c29e64 100644 --- a/src/components/Sidebar/Sidebar.module.scss +++ b/src/components/Sidebar/Sidebar.module.scss @@ -25,6 +25,15 @@ color: $white; margin-bottom: 37px; padding-left: 30px; + + .beta { + font-size: 16px; + color: $red; + font-weight: bold; + position: relative; + top: -12px; + left: 12px; + } } .homeLink { diff --git a/src/components/Sidebar/index.js b/src/components/Sidebar/index.js index cd38bb9a..023f7fef 100644 --- a/src/components/Sidebar/index.js +++ b/src/components/Sidebar/index.js @@ -8,13 +8,18 @@ import cn from 'classnames' import TopcoderLogo from '../../assets/images/topcoder-logo.png' import styles from './Sidebar.module.scss' +import { isBetaMode } from '../../util/cookie' + const Sidebar = ({ projectId, resetSidebarActiveParams }) => { return (
-
Work Manager
+
+ Work Manager + {isBetaMode() && beta} +
All Work diff --git a/src/config/constants.js b/src/config/constants.js index e8eab683..9cafe92f 100644 --- a/src/config/constants.js +++ b/src/config/constants.js @@ -113,6 +113,8 @@ export const SET_FILTER_CHALLENGE_VALUE = 'SET_FILTER_CHALLENGE_VALUE' export const RESET_SIDEBAR_ACTIVE_PARAMS = 'RESET_SIDEBAR_ACTIVE_PARAMS' +export const BETA_MODE_COOKIE_TAG = 'beta-mode' + // Name of challenge tracks export const CHALLENGE_TRACKS = { DESIGN: DES_TRACK_ID, diff --git a/src/routes.js b/src/routes.js index 2dad9624..70708384 100644 --- a/src/routes.js +++ b/src/routes.js @@ -5,6 +5,7 @@ import React from 'react' import PropTypes from 'prop-types' import { Redirect, Route, Switch, withRouter } from 'react-router-dom' import _ from 'lodash' +import { BETA_MODE_COOKIE_TAG } from './config/constants' import renderApp from './components/App' import TopBarContainer from './containers/TopbarContainer' import Sidebar from './containers/Sidebar' @@ -15,6 +16,7 @@ import { saveToken } from './actions/auth' import { loadChallengeDetails } from './actions/challenges' import { connect } from 'react-redux' import { checkAllowedRoles } from './util/tc' +import { setCookie, removeCookie, isBetaMode } from './util/cookie' const { ACCOUNTS_APP_LOGIN_URL } = process.env @@ -72,6 +74,19 @@ class Routes extends React.Component { }) } + componentDidUpdate () { + const { search } = this.props.location + const params = new URLSearchParams(search) + if (!_.isEmpty(params.get('beta'))) { + if (params.get('beta') === 'true' && !isBetaMode()) { + setCookie(BETA_MODE_COOKIE_TAG, 'true') + } else if (params.get('beta') === 'false' && isBetaMode()) { + removeCookie(BETA_MODE_COOKIE_TAG) + } + this.props.history.push(this.props.location.pathname) + } + } + render () { if (!this.props.isLoggedIn) { return null @@ -143,7 +158,8 @@ Routes.propTypes = { saveToken: PropTypes.func, location: PropTypes.object, isLoggedIn: PropTypes.bool, - token: PropTypes.string + token: PropTypes.string, + history: PropTypes.object } export default withRouter(connect(mapStateToProps, mapDispatchToProps)(Routes)) diff --git a/src/util/cookie.js b/src/util/cookie.js new file mode 100644 index 00000000..c12c43bb --- /dev/null +++ b/src/util/cookie.js @@ -0,0 +1,34 @@ +/** + * Provides Cookie related utility methods + */ + +import { BETA_MODE_COOKIE_TAG } from '../config/constants' + +/** + * A function that get's a cookie + */ +export function getCookie (name) { + const v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)') + return v ? v[2] : undefined +} + +/** + * A function that set's a cookie + */ +export function setCookie (name, value) { + document.cookie = `${name}=${value}` +} + +/** + * A function that removes Cookie by setting expiry date to past + */ +export function removeCookie (name) { + document.cookie = `${name}=; expires=Thu, 18 Dec 2013 12:00:00 UTC;` +} + +/** + * A function that checks whether beta mode is enabled or not + */ +export function isBetaMode () { + return getCookie(BETA_MODE_COOKIE_TAG) +} From 9f1878661d7f3d65d0b53b47f448588a1c13211c Mon Sep 17 00:00:00 2001 From: mark-nakachon Date: Fri, 29 Jan 2021 22:16:08 +0530 Subject: [PATCH 9/9] fix path issue --- src/util/cookie.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/util/cookie.js b/src/util/cookie.js index c12c43bb..b1242acb 100644 --- a/src/util/cookie.js +++ b/src/util/cookie.js @@ -16,14 +16,14 @@ export function getCookie (name) { * A function that set's a cookie */ export function setCookie (name, value) { - document.cookie = `${name}=${value}` + document.cookie = `${name}=${value}; path=/` } /** * A function that removes Cookie by setting expiry date to past */ export function removeCookie (name) { - document.cookie = `${name}=; expires=Thu, 18 Dec 2013 12:00:00 UTC;` + document.cookie = `${name}=; path=/; expires=Thu, 18 Dec 2013 12:00:00 UTC;` } /**