1- import { unflatten } from 'flat'
21import {
32 LOAD_PROJECT_PENDING , LOAD_PROJECT_SUCCESS , LOAD_PROJECT_FAILURE , LOAD_DIRECT_PROJECT_SUCCESS ,
43 CREATE_PROJECT_PENDING , CREATE_PROJECT_SUCCESS , CREATE_PROJECT_FAILURE , CLEAR_LOADED_PROJECT ,
@@ -21,9 +20,12 @@ const initialState = {
2120 processingMembers : false ,
2221 processingAttachments : false ,
2322 error : false ,
24- project : { }
23+ project : { } ,
24+ projectNonDirty : { }
2525}
2626
27+ // NOTE: We should always update projectNonDirty state whenever we update the project state
28+
2729const parseErrorObj = ( action ) => {
2830 const data = action . payload . response . data . result
2931 return {
@@ -40,7 +42,8 @@ export const projectState = function (state=initialState, action) {
4042 case LOAD_PROJECT_PENDING :
4143 return Object . assign ( { } , state , {
4244 isLoading : true ,
43- project : null
45+ project : null ,
46+ projectNonDirty : null
4447 } )
4548
4649 case LOAD_PROJECT_SUCCESS :
@@ -54,7 +57,8 @@ export const projectState = function (state=initialState, action) {
5457 case CLEAR_LOADED_PROJECT :
5558 case GET_PROJECTS_SUCCESS :
5659 return Object . assign ( { } , state , {
57- project : { }
60+ project : { } ,
61+ projectNonDirty : { }
5862 } )
5963
6064 case LOAD_DIRECT_PROJECT_SUCCESS :
@@ -70,6 +74,18 @@ export const projectState = function (state=initialState, action) {
7074 plannedDuration : action . payload . plannedDuration ,
7175 projectedDuration : action . payload . projectedDuration
7276 } }
77+ } ,
78+ projectNonDirty : {
79+ budget : { $set : {
80+ actualCost : action . payload . actualCost ,
81+ projectedCost : action . payload . projectedCost ,
82+ totalBudget : action . payload . totalBudget
83+ } } ,
84+ duration : { $set : {
85+ actualDuration : action . payload . actualDuration ,
86+ plannedDuration : action . payload . plannedDuration ,
87+ projectedDuration : action . payload . projectedDuration
88+ } }
7389 }
7490 } )
7591
@@ -96,7 +112,8 @@ export const projectState = function (state=initialState, action) {
96112 return Object . assign ( { } , state , {
97113 processing : false ,
98114 error : false ,
99- project : { }
115+ project : { } ,
116+ projectNonDirty : { }
100117 } )
101118
102119 // Project attachments
@@ -110,15 +127,17 @@ export const projectState = function (state=initialState, action) {
110127 case ADD_PROJECT_ATTACHMENT_SUCCESS :
111128 return update ( state , {
112129 processingAttachments : { $set : false } ,
113- project : { attachments : { $push : [ action . payload ] } }
130+ project : { attachments : { $push : [ action . payload ] } } ,
131+ projectNonDirty : { attachments : { $push : [ action . payload ] } }
114132 } )
115133
116134 case UPDATE_PROJECT_ATTACHMENT_SUCCESS : {
117135 // get index
118136 const idx = _ . findIndex ( state . project . attachments , a => a . id === action . payload . id )
119137 return update ( state , {
120138 processingAttachments : { $set : false } ,
121- project : { attachments : { $splice : [ [ idx , 1 , action . payload ] ] } }
139+ project : { attachments : { $splice : [ [ idx , 1 , action . payload ] ] } } ,
140+ projectNonDirty : { attachments : { $splice : [ [ idx , 1 , action . payload ] ] } }
122141 } )
123142 }
124143
@@ -128,7 +147,8 @@ export const projectState = function (state=initialState, action) {
128147 const idx = _ . findIndex ( state . project . attachments , a => a . id === action . payload )
129148 return update ( state , {
130149 processing : { $set : false } ,
131- project : { attachments : { $splice : [ [ idx , 1 ] ] } }
150+ project : { attachments : { $splice : [ [ idx , 1 ] ] } } ,
151+ projectNonDirty : { attachments : { $splice : [ [ idx , 1 ] ] } }
132152 } )
133153 }
134154
@@ -142,7 +162,8 @@ export const projectState = function (state=initialState, action) {
142162 case ADD_PROJECT_MEMBER_SUCCESS :
143163 return update ( state , {
144164 processingMembers : { $set : false } ,
145- project : { members : { $push : [ action . payload ] } }
165+ project : { members : { $push : [ action . payload ] } } ,
166+ projectNonDirty : { members : { $push : [ action . payload ] } }
146167 } )
147168
148169 case UPDATE_PROJECT_MEMBER_SUCCESS : {
@@ -156,7 +177,8 @@ export const projectState = function (state=initialState, action) {
156177 updatedMembers . splice ( idx , 1 , action . payload )
157178 return update ( state , {
158179 processingMembers : { $set : false } ,
159- project : { members : { $set : updatedMembers } }
180+ project : { members : { $set : updatedMembers } } ,
181+ projectNonDirty : { members : { $set : updatedMembers } }
160182 } )
161183 }
162184
@@ -165,13 +187,21 @@ export const projectState = function (state=initialState, action) {
165187 const idx = _ . findIndex ( state . project . members , a => a . id === action . payload )
166188 return update ( state , {
167189 processingMembers : { $set : false } ,
168- project : { members : { $splice : [ [ idx , 1 ] ] } }
190+ project : { members : { $splice : [ [ idx , 1 ] ] } } ,
191+ projectNonDirty : { members : { $splice : [ [ idx , 1 ] ] } }
169192 } )
170193 }
171194
172- case PROJECT_DIRTY : {
195+ case PROJECT_DIRTY : { // payload contains only changed values from the project form
173196 return Object . assign ( { } , state , {
174- project : _ . merge ( { } , state . project , unflatten ( action . payload ) , { isDirty : true } )
197+ project : _ . mergeWith ( { } , state . project , action . payload , { isDirty : true } ,
198+ // customizer to override screens array with changed values
199+ ( objValue , srcValue , key ) => {
200+ if ( key === 'screens' || key === 'features' ) {
201+ return srcValue // srcValue contains the changed values from action payload
202+ }
203+ }
204+ )
175205 } )
176206 }
177207
0 commit comments