From 93d5eff304a5b2739b67a1b526b8c62e9fa0f3ef Mon Sep 17 00:00:00 2001 From: rishabhtc Date: Tue, 16 Sep 2025 12:14:40 +0530 Subject: [PATCH 1/2] Fixed minor bugs --- .../ChallengeReviewer-Field/index.js | 59 ++++++++++++++++--- 1 file changed, 51 insertions(+), 8 deletions(-) diff --git a/src/components/ChallengeEditor/ChallengeReviewer-Field/index.js b/src/components/ChallengeEditor/ChallengeReviewer-Field/index.js index bd91706e..b5f4eee8 100644 --- a/src/components/ChallengeEditor/ChallengeReviewer-Field/index.js +++ b/src/components/ChallengeEditor/ChallengeReviewer-Field/index.js @@ -28,6 +28,23 @@ class ChallengeReviewerField extends Component { this.loadDefaultReviewers() } + componentDidUpdate (prevProps) { + const { challenge } = this.props + const prevChallenge = prevProps.challenge + + // Reload scorecards if challenge type or track changed + if (challenge && prevChallenge && + (challenge.type !== prevChallenge.type || challenge.track !== prevChallenge.track)) { + this.loadScorecards() + } + + // Reload default reviewers if challenge type or track changed + if (challenge && prevChallenge && + (challenge.typeId !== prevChallenge.typeId || challenge.trackId !== prevChallenge.trackId)) { + this.loadDefaultReviewers() + } + } + loadScorecards () { const { challenge, loadScorecards } = this.props // Build query parameters for the scorecard API @@ -38,6 +55,11 @@ class ChallengeReviewerField extends Component { filters.challengeTrack = challenge.track.toUpperCase() } + // Add challenge type if available + if (challenge.type) { + filters.challengeType = challenge.type + } + loadScorecards(filters) } @@ -69,15 +91,21 @@ class ChallengeReviewerField extends Component { ) const firstReviewPhase = reviewPhases && reviewPhases.length > 0 ? reviewPhases[0] : null + const isAIReviewer = (defaultReviewer && defaultReviewer.isAIReviewer) || false + const newReviewer = { scorecardId: (defaultReviewer && defaultReviewer.scorecardId) || '', - isMemberReview: true, - memberReviewerCount: (defaultReviewer && defaultReviewer.memberReviewerCount) || 1, + isMemberReview: !isAIReviewer, phaseId: (defaultReviewer && defaultReviewer.phaseId) || (firstReviewPhase ? (firstReviewPhase.id || firstReviewPhase.phaseId) : ''), basePayment: (defaultReviewer && defaultReviewer.basePayment) || '0', incrementalPayment: (defaultReviewer && defaultReviewer.incrementalPayment) || 0, type: (defaultReviewer && defaultReviewer.opportunityType) || REVIEW_OPPORTUNITY_TYPES.REGULAR_REVIEW, - isAIReviewer: (defaultReviewer && defaultReviewer.isAIReviewer) || false + isAIReviewer: isAIReviewer + } + + // Only include memberReviewerCount for member reviewers + if (!isAIReviewer) { + newReviewer.memberReviewerCount = (defaultReviewer && defaultReviewer.memberReviewerCount) || 1 } const updatedReviewers = currentReviewers.concat([newReviewer]) @@ -157,7 +185,7 @@ class ChallengeReviewerField extends Component { return (
- {index > 0 &&

Reviewer {index + 1}

} +

Reviewer Type {index + 1}

{!readOnly && ( @@ -255,9 +289,18 @@ class ChallengeReviewerField extends Component { {challenge.phases && challenge.phases .filter(phase => { - const isReviewPhase = phase.name && phase.name.toLowerCase().includes('review') + const phaseName = phase.name ? phase.name.toLowerCase() : '' + const isReviewPhase = phaseName.includes('review') + const isSubmissionPhase = phaseName.includes('submission') const isCurrentlySelected = reviewer.phaseId && ((phase.id === reviewer.phaseId) || (phase.phaseId === reviewer.phaseId)) - return isReviewPhase || isCurrentlySelected + + // For AI reviewers, allow both review and submission phases + // For member reviewers, only allow review phases + if (reviewer.isAIReviewer) { + return (isReviewPhase || isSubmissionPhase) || isCurrentlySelected + } else { + return isReviewPhase || isCurrentlySelected + } }) .map(phase => (
- {!reviewer.isAIReviewer && ( + {!this.isAIReviewer(reviewer) && (
@@ -366,36 +453,38 @@ class ChallengeReviewerField extends Component {
)} -
-
- - {readOnly ? ( - - {(() => { - const typeMap = { - [REVIEW_OPPORTUNITY_TYPES.REGULAR_REVIEW]: 'Regular Review', - [REVIEW_OPPORTUNITY_TYPES.COMPONENT_DEV_REVIEW]: 'Component Dev Review', - [REVIEW_OPPORTUNITY_TYPES.SPEC_REVIEW]: 'Spec Review', - [REVIEW_OPPORTUNITY_TYPES.ITERATIVE_REVIEW]: 'Iterative Review', - [REVIEW_OPPORTUNITY_TYPES.SCENARIOS_REVIEW]: 'Scenarios Review' - } - return typeMap[reviewer.type] || 'Regular Review' - })()} - - ) : ( - - )} + {!this.isAIReviewer(reviewer) && ( +
+
+ + {readOnly ? ( + + {(() => { + const typeMap = { + [REVIEW_OPPORTUNITY_TYPES.REGULAR_REVIEW]: 'Regular Review', + [REVIEW_OPPORTUNITY_TYPES.COMPONENT_DEV_REVIEW]: 'Component Dev Review', + [REVIEW_OPPORTUNITY_TYPES.SPEC_REVIEW]: 'Spec Review', + [REVIEW_OPPORTUNITY_TYPES.ITERATIVE_REVIEW]: 'Iterative Review', + [REVIEW_OPPORTUNITY_TYPES.SCENARIOS_REVIEW]: 'Scenarios Review' + } + return typeMap[reviewer.type] || 'Regular Review' + })()} + + ) : ( + + )} +
-
+ )}
) } @@ -403,7 +492,7 @@ class ChallengeReviewerField extends Component { render () { const { challenge, metadata = {}, isLoading, readOnly = false } = this.props const { error } = this.state - const { scorecards = [], defaultReviewers = [] } = metadata + const { scorecards = [], defaultReviewers = [], workflows = [] } = metadata const reviewers = challenge.reviewers || [] if (isLoading) { @@ -419,8 +508,7 @@ class ChallengeReviewerField extends Component { ) } - // Only show error if there's a real error, not just missing data - if (error && !scorecards.length && !defaultReviewers.length) { + if (error && !scorecards.length && !defaultReviewers.length && !workflows.length) { return (
@@ -477,15 +565,15 @@ class ChallengeReviewerField extends Component {

Review Summary

Total Member Reviewers: - {reviewers.filter(r => !r.isAIReviewer).reduce((sum, r) => sum + (parseInt(r.memberReviewerCount) || 0), 0)} + {reviewers.filter(r => !this.isAIReviewer(r)).reduce((sum, r) => sum + (parseInt(r.memberReviewerCount) || 0), 0)}
Total AI Reviewers: - {reviewers.filter(r => r.isAIReviewer).length} + {reviewers.filter(r => this.isAIReviewer(r)).length}
Total Review Cost: - ${reviewers.filter(r => !r.isAIReviewer).reduce((sum, r) => { + ${reviewers.filter(r => !this.isAIReviewer(r)).reduce((sum, r) => { const base = convertDollarToInteger(r.basePayment || '0', '') const count = parseInt(r.memberReviewerCount) || 1 return sum + (base * count) @@ -515,12 +603,14 @@ ChallengeReviewerField.propTypes = { onUpdateReviewers: PropTypes.func.isRequired, metadata: PropTypes.shape({ scorecards: PropTypes.array, - defaultReviewers: PropTypes.array + defaultReviewers: PropTypes.array, + workflows: PropTypes.array }), isLoading: PropTypes.bool, readOnly: PropTypes.bool, loadScorecards: PropTypes.func.isRequired, - loadDefaultReviewers: PropTypes.func.isRequired + loadDefaultReviewers: PropTypes.func.isRequired, + loadWorkflows: PropTypes.func.isRequired } const mapStateToProps = (state) => ({ @@ -530,7 +620,8 @@ const mapStateToProps = (state) => ({ const mapDispatchToProps = { loadScorecards, - loadDefaultReviewers + loadDefaultReviewers, + loadWorkflows } export default connect(mapStateToProps, mapDispatchToProps)(ChallengeReviewerField) diff --git a/src/components/ChallengeEditor/ChallengeTotal-Field/index.js b/src/components/ChallengeEditor/ChallengeTotal-Field/index.js index 020ebd4f..63e440d4 100644 --- a/src/components/ChallengeEditor/ChallengeTotal-Field/index.js +++ b/src/components/ChallengeEditor/ChallengeTotal-Field/index.js @@ -17,7 +17,13 @@ const ChallengeTotalField = ({ challenge }) => { let reviewerTotal = 0 if (challenge.reviewers && Array.isArray(challenge.reviewers)) { reviewerTotal = challenge.reviewers - .filter(r => !r.isAIReviewer) + .filter(r => { + const isAI = r && ( + (r.aiWorkflowId && r.aiWorkflowId.trim() !== '') || + (r.isMemberReview === false) + ) + return !isAI + }) .reduce((sum, r) => { const base = convertDollarToInteger(r.basePayment || '0', '') const count = parseInt(r.memberReviewerCount) || 1 diff --git a/src/config/constants.js b/src/config/constants.js index 8955269c..54c041b4 100644 --- a/src/config/constants.js +++ b/src/config/constants.js @@ -240,6 +240,7 @@ export const REVIEW_TYPES = { export const REVIEW_OPPORTUNITY_TYPES = { REGULAR_REVIEW: 'REGULAR_REVIEW', + COMPONENT_DEV_REVIEW: 'COMPONENT_DEV_REVIEW', SPEC_REVIEW: 'SPEC_REVIEW', ITERATIVE_REVIEW: 'ITERATIVE_REVIEW', SCENARIOS_REVIEW: 'SCENARIOS_REVIEW' diff --git a/src/services/challenges.js b/src/services/challenges.js index 1627fc98..84508d37 100644 --- a/src/services/challenges.js +++ b/src/services/challenges.js @@ -14,6 +14,7 @@ const { SUBMISSIONS_API_URL, REVIEW_TYPE_API_URL, SCORECARDS_API_URL, + WORKFLOWS_API_URL, GROUPS_API_URL, TERMS_API_URL, RESOURCES_API_URL, @@ -333,3 +334,12 @@ export async function fetchDefaultReviewers (filters = {}) { const response = await axiosInstance.get(`${CHALLENGE_API_URL}/default-reviewers?${qs.stringify(filters, { encode: false })}`) return _.get(response, 'data', []) } + +/** + * Api request for fetching workflows + * @returns {Promise<*>} + */ +export async function fetchWorkflows () { + const response = await axiosInstance.get(`${WORKFLOWS_API_URL}`) + return _.get(response, 'data', {}) +}