@@ -25,18 +25,24 @@ import type {
2525 NMPFileFieldData ,
2626 CalculateNutrientsColumn ,
2727} from '@/types' ;
28- import { calcFertBalance } from '../utils' ;
28+ import { calcFertBalance , renderBalanceCell } from '../utils' ;
2929import { NMPFileFertilizer } from '@/types/calculateNutrients' ;
3030
3131type FertilizerModalProps = {
3232 fieldIndex : number ;
3333 initialModalData : NMPFileFertilizer | undefined ;
3434 rowEditIndex : number | undefined ;
35- balanceRow : CalculateNutrientsColumn | undefined ;
35+ balanceRow : CalculateNutrientsColumn ;
3636 setFields : React . Dispatch < React . SetStateAction < NMPFileFieldData [ ] > > ;
3737 onClose : ( ) => void ;
3838} ;
3939
40+ type BalanceCalcRow = {
41+ reqN : number ;
42+ reqP2o5 : number ;
43+ reqK2o : number ;
44+ } ;
45+
4046const NUTRIENT_COLUMNS : GridColDef [ ] = [
4147 {
4248 field : 'N' ,
@@ -65,26 +71,29 @@ const BALANCE_COLUMNS: GridColDef[] = [
6571 {
6672 field : 'reqN' ,
6773 headerName : 'N' ,
68-
74+ renderCell : renderBalanceCell ( 'reqN' , true ) ,
6975 sortable : false ,
7076 resizable : false ,
7177 } ,
7278 {
7379 field : 'reqP2o5' ,
7480 headerName : 'P2O5' ,
75-
81+ renderCell : renderBalanceCell ( 'reqP2o5' , true ) ,
7682 sortable : false ,
7783 resizable : false ,
7884 } ,
7985 {
8086 field : 'reqK2o' ,
8187 headerName : 'K2O' ,
82-
88+ renderCell : renderBalanceCell ( 'reqK2o' , true ) ,
8389 sortable : false ,
8490 resizable : false ,
8591 } ,
8692] ;
8793
94+ const DRY_CUSTOM_ID = 2 ;
95+ const LIQUID_CUSTOM_ID = 4 ;
96+
8897const EMPTY_FERTILIZER_FORM_DATA : NMPFileFertilizer = {
8998 name : '' ,
9099 fertilizerTypeId : 0 ,
@@ -138,15 +147,14 @@ export default function FertilizerModal({
138147 const [ fertilizerUnits , setFertilizerUnits ] = useState < FertilizerUnit [ ] > ( [ ] ) ;
139148 const [ densityUnits , setDensityUnits ] = useState < any [ ] > ( [ ] ) ;
140149 const [ liqDensityFactors , setLiqDensityFactors ] = useState < any [ ] > ( [ ] ) ;
141- const [ balanceCalcRow , setBalanceCacRow ] = useState < CalculateNutrientsColumn | undefined > ( {
142- ...balanceRow ,
143- reqN : Math . min ( balanceRow ?. reqN ?? 0 , 0 ) ,
144- reqP2o5 : Math . min ( balanceRow ?. reqP2o5 ?? 0 , 0 ) ,
145- reqK2o : Math . min ( balanceRow ?. reqK2o ?? 0 , 0 ) ,
146- } as CalculateNutrientsColumn ) ;
150+ const [ balanceCalcRow , setBalanceCacRow ] = useState < BalanceCalcRow > ( {
151+ reqN : Math . min ( balanceRow . reqN , 0 ) ,
152+ reqP2o5 : Math . min ( balanceRow . reqP2o5 , 0 ) ,
153+ reqK2o : Math . min ( balanceRow . reqK2o , 0 ) ,
154+ } ) ;
147155
148156 const [ formState , setFormState ] = useState < NMPFileFertilizer > (
149- initialModalData ?? EMPTY_FERTILIZER_FORM_DATA ,
157+ initialModalData || EMPTY_FERTILIZER_FORM_DATA ,
150158 ) ;
151159 const [ formCustomFertilizer , setFormCustomFertilizer ] =
152160 useState < Fertilizer > ( EMPTY_CUSTOM_FERTILIZER ) ;
@@ -331,13 +339,9 @@ export default function FertilizerModal({
331339 ) ;
332340 setCalculateData ( cropNutrients ) ;
333341 setBalanceCacRow ( {
334- name : 'calcOnly' ,
335- reqN : Math . min ( 0 , ( balanceRow ?. reqN ?? 0 ) + cropNutrients . N ) ,
336- reqP2o5 : Math . min ( 0 , ( balanceRow ?. reqP2o5 ?? 0 ) + cropNutrients . P2O5 ) ,
337- reqK2o : Math . min ( 0 , ( balanceRow ?. reqK2o ?? 0 ) + cropNutrients . K2O ) ,
338- remN : 0 ,
339- remP2o5 : 0 ,
340- remK2o : 0 ,
342+ reqN : Math . min ( 0 , balanceRow . reqN + cropNutrients . N ) ,
343+ reqP2o5 : Math . min ( 0 , balanceRow . reqP2o5 + cropNutrients . P2O5 ) ,
344+ reqK2o : Math . min ( 0 , balanceRow . reqK2o + cropNutrients . K2O ) ,
341345 } ) ;
342346 setFormState ( ( prev ) => ( {
343347 ...prev ,
@@ -368,12 +372,20 @@ export default function FertilizerModal({
368372 ) ,
369373 ) ;
370374
371- if ( value === 2 ) {
372- // For custom dry fertilizers
373- setFormCustomFertilizer ( ( prev ) => ( { ...prev , dryliquid : 'dry' } ) ) ;
374- } else if ( value === 4 ) {
375- // For custom liquid fertilizers
376- setFormCustomFertilizer ( ( prev ) => ( { ...prev , dryliquid : 'liquid' } ) ) ;
375+ if ( value === DRY_CUSTOM_ID || value === LIQUID_CUSTOM_ID ) {
376+ setFormCustomFertilizer ( ( prev ) => {
377+ // Reset if we're switching type
378+ if ( formState . fertilizerTypeId !== value ) {
379+ return {
380+ ...EMPTY_CUSTOM_FERTILIZER ,
381+ dryliquid : value === DRY_CUSTOM_ID ? 'dry' : 'liquid' ,
382+ } ;
383+ }
384+ return {
385+ ...prev ,
386+ dryliquid : value === DRY_CUSTOM_ID ? 'dry' : 'liquid' ,
387+ } ;
388+ } ) ;
377389 } else {
378390 // Reset for other values
379391 setFormCustomFertilizer ( EMPTY_CUSTOM_FERTILIZER ) ;
@@ -475,7 +487,7 @@ export default function FertilizerModal({
475487 < Grid size = { { xs : 4 } } >
476488 < TextField
477489 isRequired
478- label = "K2O"
490+ label = "K2O (%) "
479491 type = "number"
480492 name = "potassium"
481493 value = { formCustomFertilizer ?. potassium . toString ( ) }
@@ -576,7 +588,7 @@ export default function FertilizerModal({
576588 label = ""
577589 type = "date"
578590 name = "applDate"
579- value = { formState . applDate ?? 0 }
591+ value = { formState . applDate || 0 }
580592 onChange = { ( e : any ) => {
581593 // Current NMP stores this, but not for calculations
582594 // Right now not passed to parent componet for storing.
@@ -604,7 +616,7 @@ export default function FertilizerModal({
604616 < DataGrid
605617 sx = { { ...customTableStyle } }
606618 columns = { NUTRIENT_COLUMNS }
607- rows = { calculatedData !== null ? [ calculatedData ] : [ ] }
619+ rows = { calculatedData !== null ? [ calculatedData ] : [ { N : 0 , P2O5 : 0 , K2O : 0 } ] }
608620 getRowId = { ( ) => crypto . randomUUID ( ) }
609621 disableRowSelectionOnClick
610622 disableColumnMenu
@@ -622,7 +634,7 @@ export default function FertilizerModal({
622634 < DataGrid
623635 sx = { { ...customTableStyle } }
624636 columns = { BALANCE_COLUMNS }
625- rows = { balanceCalcRow !== undefined ? [ balanceCalcRow ] : [ balanceRow ] }
637+ rows = { [ balanceCalcRow ] }
626638 getRowId = { ( ) => crypto . randomUUID ( ) }
627639 disableRowSelectionOnClick
628640 disableColumnMenu
0 commit comments