From 216569b661b9e725e45a59f51896ae8297f85b98 Mon Sep 17 00:00:00 2001 From: csawatzky Date: Fri, 6 Jun 2025 09:13:02 -0600 Subject: [PATCH] write permission to the bin or team is required to make the transaction rows selectable --- src/bin/BinTransactions.tsx | 93 ++++++++++++++++++++++++------- src/contract/contractSettings.tsx | 10 +++- src/models/Bin.ts | 2 +- src/models/Contract.ts | 12 ++++ src/models/Field.ts | 13 +++++ src/models/GrainBag.ts | 13 +++++ src/pages/Bin.tsx | 4 +- src/pages/Contracts.tsx | 1 - 8 files changed, 121 insertions(+), 27 deletions(-) diff --git a/src/bin/BinTransactions.tsx b/src/bin/BinTransactions.tsx index f690248..f8e7c90 100644 --- a/src/bin/BinTransactions.tsx +++ b/src/bin/BinTransactions.tsx @@ -18,10 +18,12 @@ import { getGrainUnit } from "utils"; interface Props { bin: Bin + permissions: pond.Permission[] + refresh: () => void } export default function BinTransactions(props: Props){ - const { bin } = props + const { bin, permissions, refresh } = props const [state, setState] = useState(pond.TransactionState.TRANSACTION_STATE_APPROVAL_REQUIRED) const transactionAPI = useTransactionAPI() const binAPI = useBinAPI() @@ -67,8 +69,10 @@ export default function BinTransactions(props: Props){ let binMap: Map = new Map() resp.data.bins.map(b => { let bin = Bin.create(b) - options.push({label: bin.name(), value: bin.key()}) - binMap.set(bin.key(), bin) + if(bin.key() !== props.bin.key()){ + options.push({label: bin.name(), value: bin.key(), group: bin.grainName()}) + binMap.set(bin.key(), bin) + } }) setBinOptions(options) setBins(binMap) @@ -80,19 +84,29 @@ export default function BinTransactions(props: Props){ grainBagAPI.listGrainBags(0, 0, "asc", "name").then(resp => { setGrainBagOptions(resp.data.grainBags.map(g => { let grainBag = GrainBag.create(g) - return {label: grainBag.name(), value: grainBag.key()} + return {label: grainBag.name(), value: grainBag.key(), group: grainBag.grainName()} })) }) } //load fields const loadFields = useCallback(()=>{ - + fieldAPI.listFields(0,0, "asc", "field_name").then(resp => { + setFieldOptions(resp.data.fields.map(f => { + let field = Field.create(f) + return {label: field.name(), value: field.key(), group: field.grainName()} + })) + }) },[]) //load contracts const loadContracts = useCallback(()=>{ - + contractAPI.listContracts(0,0, "asc", "name").then(resp => { + setContractOptions(resp.data.contracts.map(c => { + let contract = Contract.create(c) + return {label: contract.name(), value: contract.key(), group: contract.grainName()} + })) + }) },[]) @@ -122,7 +136,6 @@ export default function BinTransactions(props: Props){ } const submit = () => { - console.log("submitting transaction") let transaction = cloneDeep(selectedTransaction) if(transaction){ //use the dropdowns to update the from/to for the transaction, meaning if the user added another object it will adjust its inventory as well @@ -150,11 +163,20 @@ export default function BinTransactions(props: Props){ }).catch(err => { openSnack("There was a problem submitting transaction approval") }) + refresh() } } const reject = () => { //reject the transaction + if(selectedTransaction){ + transactionAPI.submitApproval(selectedTransaction.transaction.key, false, selectedTransaction.transaction).then(resp => { + openSnack("Transaction rejected") + }).catch(err => { + openSnack("There was a problem rejecting the transaction") + }) + } + refresh() } const getOptions = (type: pond.ObjectType) => { @@ -162,7 +184,11 @@ export default function BinTransactions(props: Props){ case pond.ObjectType.OBJECT_TYPE_BIN: return binOptions case pond.ObjectType.OBJECT_TYPE_GRAIN_BAG: - return grainBagOptions + return grainBagOptions + case pond.ObjectType.OBJECT_TYPE_FIELD: + return fieldOptions + case pond.ObjectType.OBJECT_TYPE_CONTRACT: + return contractOptions default: return [] } @@ -198,6 +224,7 @@ export default function BinTransactions(props: Props){ options={[ pond.ObjectType.OBJECT_TYPE_BIN, pond.ObjectType.OBJECT_TYPE_GRAIN_BAG, + pond.ObjectType.OBJECT_TYPE_FIELD ]} getOptionLabel={(option: pond.ObjectType) => ObjectDescriber(option).name} @@ -212,7 +239,13 @@ export default function BinTransactions(props: Props){ loadBins() } }else if (val === pond.ObjectType.OBJECT_TYPE_GRAIN_BAG){ - + if(grainBagOptions.length === 0){ + loadGrainbags() + } + }else if (val === pond.ObjectType.OBJECT_TYPE_FIELD){ + if (fieldOptions.length === 0){ + loadFields() + } } }} renderInput={params => } @@ -260,7 +293,7 @@ export default function BinTransactions(props: Props){ options={[ pond.ObjectType.OBJECT_TYPE_BIN, pond.ObjectType.OBJECT_TYPE_GRAIN_BAG, - + pond.ObjectType.OBJECT_TYPE_CONTRACT ]} getOptionLabel={(option: pond.ObjectType) => ObjectDescriber(option).name} fullWidth @@ -274,7 +307,13 @@ export default function BinTransactions(props: Props){ loadBins() } }else if (val === pond.ObjectType.OBJECT_TYPE_GRAIN_BAG){ - + if(grainBagOptions.length === 0){ + loadGrainbags() + } + }else if (val === pond.ObjectType.OBJECT_TYPE_CONTRACT){ + if(contractOptions.length === 0){ + loadContracts() + } } }} renderInput={params => } @@ -282,6 +321,12 @@ export default function BinTransactions(props: Props){ { + if (option.group) { + return option.group; + } + return "No Grain Type"; + }} id="autoFromObjects" value={toOption} options={getOptions(toType)} @@ -366,7 +411,15 @@ export default function BinTransactions(props: Props){ - +