From 3401cc7c150112943f25219067755dd4f5af4cdd Mon Sep 17 00:00:00 2001 From: csawatzky Date: Fri, 27 Feb 2026 12:56:46 -0600 Subject: [PATCH 01/16] added entries to the grain form for imperial fields, filling the imperial will calculate its metric counterpart --- package-lock.json | 4 +- package.json | 2 +- src/grain/CustomGrainForm.tsx | 83 ++++++++++++++++++++++++++++++----- src/services/whiteLabel.ts | 2 +- 4 files changed, 77 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index dc86b31..2a91371 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,7 +43,7 @@ "mui-tel-input": "^7.0.0", "notistack": "^3.0.1", "openweathermap-ts": "^1.2.10", - "protobuf-ts": "git+https://gitlab+deploy-token-50627:hv8mB4WkyvtjBpJKU1rN@gitlab.com/brandx/protobuf-ts.git#staging", + "protobuf-ts": "git+https://gitlab+deploy-token-50627:hv8mB4WkyvtjBpJKU1rN@gitlab.com/brandx/protobuf-ts.git#imperial_bushels", "query-string": "^9.2.1", "react": "^18.3.1", "react-beautiful-dnd": "^13.1.1", @@ -11967,7 +11967,7 @@ }, "node_modules/protobuf-ts": { "version": "1.0.0", - "resolved": "git+https://gitlab+deploy-token-50627:hv8mB4WkyvtjBpJKU1rN@gitlab.com/brandx/protobuf-ts.git#ab9e8d4fd38f9af7802398403d38fddda5eb01da", + "resolved": "git+https://gitlab+deploy-token-50627:hv8mB4WkyvtjBpJKU1rN@gitlab.com/brandx/protobuf-ts.git#7649feaa2222b555fe15fe9e4a19244c23f0e442", "dependencies": { "protobufjs": "^6.8.8" } diff --git a/package.json b/package.json index 90ac71b..b535c88 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "mui-tel-input": "^7.0.0", "notistack": "^3.0.1", "openweathermap-ts": "^1.2.10", - "protobuf-ts": "git+https://gitlab+deploy-token-50627:hv8mB4WkyvtjBpJKU1rN@gitlab.com/brandx/protobuf-ts.git#staging", + "protobuf-ts": "git+https://gitlab+deploy-token-50627:hv8mB4WkyvtjBpJKU1rN@gitlab.com/brandx/protobuf-ts.git#imperial_bushels", "query-string": "^9.2.1", "react": "^18.3.1", "react-beautiful-dnd": "^13.1.1", diff --git a/src/grain/CustomGrainForm.tsx b/src/grain/CustomGrainForm.tsx index 905931c..23e4f71 100644 --- a/src/grain/CustomGrainForm.tsx +++ b/src/grain/CustomGrainForm.tsx @@ -18,7 +18,9 @@ export default function CustomGrainForm(props: Props) { const [constantB, setConstantB] = useState("0") const [constantC, setConstantC] = useState("0") const [kgPerBushel, setKgPerBushel] = useState("0") - const [bushelsPerTonne, setBushelsPerTonne] = useState("0") + const [bushelsPerTonne, setBushelsPerTonne] = useState("0")//this is metric + const [lbPerBushel, setLbPerBushel] = useState("0") + const [bushelsPerTon, setBushelsPerTon] = useState("0")//this is imperial const valid = useRef(false) useEffect(()=>{ @@ -35,14 +37,25 @@ export default function CustomGrainForm(props: Props) { } },[grainSettings]) - const validate = (name: string, group: string, constA: string, constB: string, constC: string, kgPerBushel: string, bushelsPerTonne: string) => { + const validate = ( + name: string, + group: string, + constA: string, + constB: string, + constC: string, + kgPerBushel: string, + bushelsPerTonne: string, + lbPerBushel: string, + bushelsPerTon: string) => { if (name === "") return false if (group === "") return false if (isNaN(parseFloat(constA))) return false if (isNaN(parseFloat(constB))) return false if (isNaN(parseFloat(constC))) return false if (isNaN(parseFloat(kgPerBushel))) return false + if (isNaN(parseFloat(lbPerBushel))) return false if (isNaN(parseFloat(bushelsPerTonne))) return false + if (isNaN(parseFloat(bushelsPerTon))) return false return true } @@ -64,7 +77,7 @@ export default function CustomGrainForm(props: Props) { setName(name) let settings = cloneDeep(newGrainSettings) settings.name = name - valid.current = validate(name, group, constantA, constantB, constantC, kgPerBushel, bushelsPerTonne) + valid.current = validate(name, group, constantA, constantB, constantC, kgPerBushel, bushelsPerTonne, lbPerBushel, bushelsPerTon) settingsChanged(settings) }}/> @@ -121,7 +134,7 @@ export default function CustomGrainForm(props: Props) { onChange={(e) => { let val = e.target.value setConstantA(val) - valid.current = validate(name, group, val, constantB, constantC, kgPerBushel, bushelsPerTonne) + valid.current = validate(name, group, val, constantB, constantC, kgPerBushel, bushelsPerTonne, lbPerBushel, bushelsPerTon) let settings = cloneDeep(newGrainSettings) if(!isNaN(parseFloat(val))){ settings.a = parseFloat(val) @@ -139,7 +152,7 @@ export default function CustomGrainForm(props: Props) { onChange={(e) => { let val = e.target.value setConstantB(val) - valid.current = validate(name, group, constantA, val, constantC, kgPerBushel, bushelsPerTonne) + valid.current = validate(name, group, constantA, val, constantC, kgPerBushel, bushelsPerTonne, lbPerBushel, bushelsPerTon) let settings = cloneDeep(newGrainSettings) if(!isNaN(parseFloat(val))){ settings.b = parseFloat(val) @@ -157,7 +170,7 @@ export default function CustomGrainForm(props: Props) { onChange={(e) => { let val = e.target.value setConstantC(val) - valid.current = validate(name, group, constantA, constantB, val, kgPerBushel, bushelsPerTonne) + valid.current = validate(name, group, constantA, constantB, val, kgPerBushel, bushelsPerTonne, lbPerBushel, bushelsPerTon) let settings = cloneDeep(newGrainSettings) if(!isNaN(parseFloat(val))){ settings.c = parseFloat(val) @@ -175,14 +188,40 @@ export default function CustomGrainForm(props: Props) { onChange={(e) => { let val = e.target.value setKgPerBushel(val) - valid.current = validate(name, group, constantA, constantB, constantC, val, bushelsPerTonne) + valid.current = validate(name, group, constantA, constantB, constantC, val, bushelsPerTonne, lbPerBushel, bushelsPerTon) let settings = cloneDeep(newGrainSettings) if(!isNaN(parseFloat(val))){ settings.kgPerBushel = parseFloat(val) + //then calculate the kilograms to pounds and update it as well + let newLb = Math.round((parseFloat(val)*2.205)*100)/100 + settings.poundsPerBushel = newLb + setLbPerBushel(newLb.toString()) } settingsChanged(settings) }} label="kg per Bushel"/> + { + let val = e.target.value + setLbPerBushel(val) + valid.current = validate(name, group, constantA, constantB, constantC, kgPerBushel, bushelsPerTonne, val, bushelsPerTon) + let settings = cloneDeep(newGrainSettings) + if(!isNaN(parseFloat(val))){ + settings.poundsPerBushel = parseFloat(val) + //then calculate the pounds to kilograms and update it as well + let newKg = Math.round((parseFloat(val)/2.205)*100)/100 + settings.kgPerBushel = newKg + setKgPerBushel(newKg.toString()) + } + settingsChanged(settings) + }} + label="lb per Bushel"/> { let val = e.target.value setBushelsPerTonne(val) - valid.current = validate(name, group, constantA, constantB, constantC, kgPerBushel, val) + valid.current = validate(name, group, constantA, constantB, constantC, kgPerBushel, val, lbPerBushel, bushelsPerTon) let settings = cloneDeep(newGrainSettings) if(!isNaN(parseFloat(val))){ settings.bushelsPerTonne = parseFloat(val) + let newTon = Math.round((parseFloat(val)*1.102)*100)/100 + settings.bushelsPerTon = newTon + setBushelsPerTon(newTon.toString()) } settingsChanged(settings) }} label="Bushels per Tonne"/> + { + let val = e.target.value + setBushelsPerTon(val) + valid.current = validate(name, group, constantA, constantB, constantC, kgPerBushel, bushelsPerTonne, lbPerBushel, val) + let settings = cloneDeep(newGrainSettings) + if(!isNaN(parseFloat(val))){ + settings.bushelsPerTon = parseFloat(val) + let newTonne = Math.round((parseFloat(val)/1.102)*100)/100 + settings.bushelsPerTonne = newTonne + setBushelsPerTonne(newTonne.toString()) + } + settingsChanged(settings) + }} + label="Bushels per Ton"/> ) } diff --git a/src/services/whiteLabel.ts b/src/services/whiteLabel.ts index c9346d4..29c4427 100644 --- a/src/services/whiteLabel.ts +++ b/src/services/whiteLabel.ts @@ -337,7 +337,7 @@ export function getWhitelabel(): WhiteLabel { return BXT_WHITE_LABEL; } if (window.location.origin.includes("localhost")) { - return STAGING_WHITELABEL; + return STREAMLINE_WHITE_LABEL; } if (window.location.origin.includes("staging") || import.meta.env.VITE_LOCAL_STAGING=='true') { return STAGING_WHITELABEL; From 29d9e7377ca6b37e5e55f2a425252567bd9d8ec3 Mon Sep 17 00:00:00 2001 From: csawatzky Date: Wed, 4 Mar 2026 12:51:10 -0600 Subject: [PATCH 02/16] working on US ton stuff --- package-lock.json | 2 +- src/bin/BinCardV2.tsx | 12 +- src/bin/BinSettings.tsx | 210 +++++++++++++++++--- src/bin/BinTransactions.tsx | 25 ++- src/bin/BinVisualizerV2.tsx | 46 +++-- src/bin/BinyardDisplay.tsx | 30 ++- src/bin/graphs/BinLevelOverTime.tsx | 25 ++- src/field/FieldSettings.tsx | 3 + src/grain/CustomGrainForm.tsx | 8 +- src/grain/GrainDescriber.ts | 109 ++++++---- src/grain/GrainTransaction.tsx | 47 ++++- src/grainBag/grainBagSettings.tsx | 1 + src/models/Bin.ts | 31 ++- src/pages/grainBag.tsx | 1 - src/providers/pond/grainBagAPI.tsx | 2 +- src/transactions/transactionDataDisplay.tsx | 1 + src/user/UserSettings.tsx | 10 +- src/utils/units.ts | 28 ++- 18 files changed, 474 insertions(+), 117 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2a91371..3c23e65 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11967,7 +11967,7 @@ }, "node_modules/protobuf-ts": { "version": "1.0.0", - "resolved": "git+https://gitlab+deploy-token-50627:hv8mB4WkyvtjBpJKU1rN@gitlab.com/brandx/protobuf-ts.git#7649feaa2222b555fe15fe9e4a19244c23f0e442", + "resolved": "git+https://gitlab+deploy-token-50627:hv8mB4WkyvtjBpJKU1rN@gitlab.com/brandx/protobuf-ts.git#8281f64aa2c8db09a73f5a2eb8a1b97a63bcc653", "dependencies": { "protobufjs": "^6.8.8" } diff --git a/src/bin/BinCardV2.tsx b/src/bin/BinCardV2.tsx index f39c553..f8fa5fb 100644 --- a/src/bin/BinCardV2.tsx +++ b/src/bin/BinCardV2.tsx @@ -443,14 +443,24 @@ export default function BinCard(props: Props) { " L" ); } - if (getGrainUnit() === pond.GrainUnit.GRAIN_UNIT_WEIGHT && bin.bushelsPerTonne() > 1) { + + if (getGrainUnit() === pond.GrainUnit.GRAIN_UNIT_TONNE && bin.bushelsPerTonne() > 1) { return ( bin.grainTonnes().toLocaleString() + " mT " + bin.fillPercent() + "%" ); + } else if (getGrainUnit() === pond.GrainUnit.GRAIN_UNIT_TON && bin.bushelsPerTon() > 1) { + return ( + bin.grainTons().toLocaleString() + + " t " + + bin.fillPercent() + + "%" + ); } + + return ( current.toLocaleString() + "/" + diff --git a/src/bin/BinSettings.tsx b/src/bin/BinSettings.tsx index 4192974..df9a6fe 100644 --- a/src/bin/BinSettings.tsx +++ b/src/bin/BinSettings.tsx @@ -126,14 +126,13 @@ interface BinFormExtension { hopperHeight: string; diameter: string; grainBushels: string; - grainTonnes: string; + grainWeight: string; grainType: Option | null; grainUse: Option | null; grainSubtype: string; customTypeName: string; highTemp: number; lowTemp: number; - bushelsPerTonne: string; tempTarget: number; } @@ -160,14 +159,13 @@ export default function BinSettings(props: Props) { hopperHeight: "", diameter: "", grainBushels: "", - grainTonnes: "", + grainWeight: "", grainType: null, grainUse: null, grainSubtype: "", customTypeName: "", highTemp: 20, lowTemp: 10, - bushelsPerTonne: "", tempTarget: 15 }); const [initialized, setInitialized] = useState(false); @@ -194,6 +192,7 @@ export default function BinSettings(props: Props) { const [isCustomBin, setIsCustomBin] = useState(false); const [binModelOps, setBinModelOptions] = useState([]); const [selectedBinModel, setSelectedBinModel] = useState