Skip to content

Commit 9699e12

Browse files
authored
Merge pull request #4219 from ChanKamWo/feature/new-milestone-types
Add New Milestone Types
2 parents f599d7d + 52c63fc commit 9699e12

File tree

10 files changed

+718
-1
lines changed

10 files changed

+718
-1
lines changed

src/projects/actions/productsTimelines.js

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import {
2929
BULK_UPDATE_PRODUCT_MILESTONES,
3030
} from '../../config/constants'
3131
import { processUpdateMilestone } from '../../helpers/milestoneHelper'
32+
import moment from 'moment'
3233

3334
/**
3435
* Get the next milestone in the list, which is not hidden
@@ -448,3 +449,79 @@ export function completeFinalFixesMilestone(productId, timelineId, milestoneId,
448449
})
449450
}
450451
}
452+
453+
/**
454+
* Mark the milestone as 'completed' and append a 'deliverable-final-fixes' milestone after it
455+
* @param {Number} productId product id
456+
* @param {Number} timelineId timeline id
457+
* @param {Number} milestoneId milestone id
458+
* @param {String} finalFixRequest final fixes request text
459+
*/
460+
export function submitDeliverableFinalFixesRequest(productId, timelineId, milestoneId, finalFixRequest) {
461+
return (dispatch, getState) => {
462+
const state = getState()
463+
const timeline = state.productsTimelines[productId].timeline
464+
const milestoneIdx = _.findIndex(timeline.milestones, { id: milestoneId })
465+
const milestone = timeline.milestones[milestoneIdx]
466+
467+
let updatedTimelineMilestones = [
468+
...timeline.milestones,
469+
]
470+
471+
updatedTimelineMilestones = processUpdateMilestone(
472+
milestone, {
473+
status: MILESTONE_STATUS.COMPLETED,
474+
}, updatedTimelineMilestones
475+
).updatedTimelineMilestones
476+
477+
const finalFixesMilestone = {
478+
type: 'deliverable-final-fixes',
479+
startDate: milestone.endDate,
480+
endDate: moment(milestone.endDate).add(3, 'day').toISOString(),
481+
status: MILESTONE_STATUS.ACTIVE,
482+
details: {
483+
content: {
484+
finalFixesRequest: finalFixRequest,
485+
}
486+
},
487+
name: 'Final Fixes',
488+
duration: 3,
489+
order: timeline.milestones.length + 1,
490+
hidden: false,
491+
completedText: 'completed text',
492+
activeText: 'active text',
493+
description: 'description',
494+
plannedText: 'planned text',
495+
blockedText: 'blocked text',
496+
}
497+
498+
updatedTimelineMilestones.splice(milestoneIdx + 1, 0, finalFixesMilestone)
499+
500+
dispatch({
501+
type: SUBMIT_FINAL_FIXES_REQUEST_PENDING,
502+
meta: { productId, milestoneId }
503+
})
504+
505+
const milestones = updatedTimelineMilestones.map(milestone => _.omit(milestone, ['timelineId', 'error', 'isUpdating', 'statusHistory']))
506+
507+
return dispatch({
508+
type: BULK_UPDATE_PRODUCT_MILESTONES,
509+
payload: updateMilestones(timelineId, milestones),
510+
meta: {
511+
productId,
512+
}
513+
}).then(() => {
514+
dispatch({
515+
type: SUBMIT_FINAL_FIXES_REQUEST_SUCCESS,
516+
meta: { productId, milestoneId }
517+
})
518+
}).catch((error) => {
519+
dispatch({
520+
type: SUBMIT_FINAL_FIXES_REQUEST_FAILURE,
521+
payload: error,
522+
meta: { productId, milestoneId }
523+
})
524+
throw error
525+
})
526+
}
527+
}

src/projects/detail/components/timeline/Milestone/Milestone.jsx

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import MilestoneTypeFinalDesigns from '../milestones/MilestoneTypeFinalDesigns'
2121
import MilestoneTypeDelivery from '../milestones/MilestoneTypeDelivery'
2222
import MilestoneTypeFinalFixes from '../milestones/MilestoneTypeFinalFixes'
2323
import MilestoneTypeAddLinks from '../milestones/MilestoneTypeAddLinks'
24+
import MilestoneTypeReporting from '../milestones/MilestoneTypeReporting'
25+
import MilestoneTypeDeliverableReview from '../milestones/MilestoneTypeDeliverableReview'
2426
import DotIndicator from '../DotIndicator'
2527
import MobilePage from '../../../../../components/MobilePage/MobilePage'
2628
import MediaQuery from 'react-responsive'
@@ -48,6 +50,7 @@ class Milestone extends React.Component {
4850
this.completeFinalFixesMilestone = this.completeFinalFixesMilestone.bind(this)
4951
this.extendMilestone = this.extendMilestone.bind(this)
5052
this.submitFinalFixesRequest = this.submitFinalFixesRequest.bind(this)
53+
this.submitDeliverableFinalFixesRequest = this.submitDeliverableFinalFixesRequest.bind(this)
5154
this.milestoneEditorChanged = this.milestoneEditorChanged.bind(this)
5255

5356
this.state = {
@@ -157,7 +160,7 @@ class Milestone extends React.Component {
157160
}
158161
}
159162

160-
updateMilestoneContent(contentProps, metaDataProps) {
163+
updateMilestoneContent(contentProps, metaDataProps, status) {
161164
const { updateMilestone, milestone } = this.props
162165

163166
const updatedMilestone = {
@@ -174,6 +177,10 @@ class Milestone extends React.Component {
174177
}
175178
}
176179

180+
if (status) {
181+
updatedMilestone.status = status
182+
}
183+
177184
updateMilestone(milestone.id, updatedMilestone)
178185
}
179186

@@ -216,6 +223,12 @@ class Milestone extends React.Component {
216223
submitFinalFixesRequest(milestone.id, finalFixRequests)
217224
}
218225

226+
submitDeliverableFinalFixesRequest(finalFixesRequest) {
227+
const { submitDeliverableFinalFixesRequest, milestone } = this.props
228+
229+
submitDeliverableFinalFixesRequest(milestone.id, finalFixesRequest)
230+
}
231+
219232
render() {
220233
const {
221234
milestone,
@@ -330,6 +343,7 @@ class Milestone extends React.Component {
330343
disableSubmitButton={this.state.disableSubmit}
331344
/>
332345
)
346+
333347
return (
334348
<div styleName="timeline-post">
335349
{(<div styleName={'background ' + ((this.state.isHoverHeader && !this.state.isEditing && !isCompleted) ? 'hover ' : '')} />)}
@@ -491,6 +505,24 @@ class Milestone extends React.Component {
491505
/>
492506
)
493507
}
508+
509+
{!isEditing && !isUpdating && milestone.type === 'reporting' && (
510+
<MilestoneTypeReporting
511+
milestone={milestone}
512+
updateMilestoneContent={this.updateMilestoneContent}
513+
currentUser={currentUser}
514+
/>
515+
)}
516+
517+
{!isEditing && !isUpdating && (milestone.type === 'deliverable-review' || milestone.type === 'final-deliverable-review' || milestone.type === 'deliverable-final-fixes') && (
518+
<MilestoneTypeDeliverableReview
519+
milestone={milestone}
520+
currentUser={currentUser}
521+
updateMilestoneContent={this.updateMilestoneContent}
522+
submitDeliverableFinalFixesRequest={this.submitDeliverableFinalFixesRequest}
523+
completeMilestone={this.completeMilestone}
524+
/>
525+
)}
494526
</div>
495527
</div>
496528
)
@@ -504,6 +536,7 @@ Milestone.propTypes = {
504536
milestone: PT.object.isRequired,
505537
submitFinalFixesRequest: PT.func.isRequired,
506538
updateMilestone: PT.func.isRequired,
539+
submitDeliverableFinalFixesRequest: PT.func.isRequired,
507540
}
508541

509542
export default Milestone

src/projects/detail/components/timeline/Timeline/Timeline.jsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class Timeline extends React.Component {
2525
this.completeFinalFixesMilestone = this.completeFinalFixesMilestone.bind(this)
2626
this.extendMilestone = this.extendMilestone.bind(this)
2727
this.submitFinalFixesRequest = this.submitFinalFixesRequest.bind(this)
28+
this.submitDeliverableFinalFixesRequest = this.submitDeliverableFinalFixesRequest.bind(this)
2829
}
2930

3031
componentWillReceiveProps() {
@@ -91,6 +92,16 @@ class Timeline extends React.Component {
9192
submitFinalFixesRequest(product.id, timeline.id, milestoneId, finalFixRequests)
9293
}
9394

95+
submitDeliverableFinalFixesRequest(milestoneId, finalFixesRequest) {
96+
const {
97+
product,
98+
submitDeliverableFinalFixesRequest,
99+
timeline,
100+
} = this.props
101+
102+
submitDeliverableFinalFixesRequest(product.id, timeline.id, milestoneId, finalFixesRequest)
103+
}
104+
94105
render() {
95106
const {
96107
currentUser,
@@ -123,6 +134,7 @@ class Timeline extends React.Component {
123134
extendMilestone={this.extendMilestone}
124135
submitFinalFixesRequest={this.submitFinalFixesRequest}
125136
completeFinalFixesMilestone={this.completeFinalFixesMilestone}
137+
submitDeliverableFinalFixesRequest={this.submitDeliverableFinalFixesRequest}
126138
//$TODO convert the below logic more optimized way
127139
previousMilestone={_.find(orderedMilestones, m => m.order === milestone.order-1) &&
128140
_.find(orderedMilestones, m => m.order === milestone.order-1).type}
@@ -146,6 +158,7 @@ Timeline.propType = {
146158
updateProductMilestone: PT.func.isRequired,
147159
completeProductMilestone: PT.func.isRequired,
148160
extendProductMilestone: PT.func.isRequired,
161+
submitDeliverableFinalFixesRequest: PT.func.isRequired,
149162
}
150163

151164
export default Timeline

0 commit comments

Comments
 (0)