Skip to content

Commit

Permalink
separated override table rows into separate components to make it eas…
Browse files Browse the repository at this point in the history
…ier to manage the state of the technology, override values; added functionality to incorporate value names for other infrastructure buildout types
  • Loading branch information
MichaelPesce committed Jul 12, 2023
1 parent ee925a3 commit 29dc556
Show file tree
Hide file tree
Showing 2 changed files with 332 additions and 214 deletions.
229 changes: 15 additions & 214 deletions electron/ui/src/components/OverrideTable/OverrideTable.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import React from 'react';
import {useEffect, useState} from 'react';
import { Table, TableBody, TableCell, TableHead, TableRow, TableContainer, TextField, Tooltip, Checkbox, Select, MenuItem, FormControl, InputLabel } from '@mui/material';
import ParetoDictionary from '../../assets/ParetoDictionary.json'
import CategoryNames from '../../assets/CategoryNames.json'
import { Table, TableBody, TableCell, TableHead, TableRow, TableContainer } from '@mui/material';
import OverrideTableRows from './OverrideTableRows';

const OVERRIDE_PRESET_VALUES = {
"Pipeline Construction": {
Expand Down Expand Up @@ -50,25 +49,6 @@ export default function OverrideTable(props) {
updateScenario
} = props

const styles ={
firstCol: {
backgroundColor: "#f4f4f4",
border:"1px solid #ddd",
position: 'sticky',
left: 0,

},
other: {
minWidth: 100,
border:"1px solid #ddd"
},
inputDifference: {
backgroundColor: "rgb(255,215,0, 0.5)",
minWidth: 100,
border:"1px solid #ddd"
},
}


const handleCheckOverride = (index, value) => {
// console.log(value)
Expand Down Expand Up @@ -113,135 +93,14 @@ export default function OverrideTable(props) {
updateScenario(tempScenario)
}
else if(!isNaN(val)) {
tempOverrideValues[category][idx].value = parseInt(val)
if (val === "") tempOverrideValues[category][idx].value = val
else tempOverrideValues[category][idx].value = parseInt(val)
const tempScenario = {...scenario}
tempScenario.override_values = tempOverrideValues
updateScenario(tempScenario)
}
}

const getCheckboxValue = (index) => {
if(Object.keys(scenario.override_values[category]).includes(""+index)) {
return true
} else return false
}

const generateInfrastructureBuildoutValueOptions = (value, index) => {
if (Object.keys(OVERRIDE_PRESET_VALUES).includes(value[0])) {
try {




/*
Logic for creating dictionary with correct values for each treatment capacity technology
*/
let preset_value_table = scenario.data_input.df_parameters[OVERRIDE_PRESET_VALUES[value[0]].input_table]
let preset_values = {}
if(value[0] === "Treatment Facility") {
let technology = value[5]
let technologyNamesKey = "TreatmentCapacities"
let technologies = scenario.data_input.df_parameters[OVERRIDE_PRESET_VALUES[value[0]].input_table][technologyNamesKey]
let len = technologies.length
for (let i = 0; i < len; i++) {
let each = technologies[i]
preset_values[each] = {}
for (let row of Object.keys(preset_value_table)) {
if (row !== technologyNamesKey) {
preset_values[each][row]=preset_value_table[row][i]
}
}
}
// console.log(preset_values)
}


let presetValues = []
if(value[0] === "Treatment Facility") {
let technology = value[5]
let technologyNamesKey = "TreatmentCapacities"
let indexOfTechnology = scenario.data_input.df_parameters[OVERRIDE_PRESET_VALUES[value[0]].input_table][technologyNamesKey].indexOf(technology)
// let presetValues = []
for (let each of Object.keys(scenario.data_input.df_parameters[OVERRIDE_PRESET_VALUES[value[0]].input_table])) {
let val = scenario.data_input.df_parameters[OVERRIDE_PRESET_VALUES[value[0]].input_table][each][indexOfTechnology]
if(val !== technology) {
presetValues.push(val)
}
}
}

return (
<Tooltip
title={Object.keys(scenario.override_values[category]).includes(""+index) ? `To add more options, edit the ${CategoryNames[OVERRIDE_PRESET_VALUES[value[0]].input_table]} table in the data input section.` : ''}
placement="top"
enterDelay={500}
>
<FormControl sx={{ width: "100%" }} size="small">
<InputLabel id="">Value</InputLabel>
<Select
disabled={!Object.keys(scenario.override_values[category]).includes(""+index)}
labelId=""
id=""
name={`${index}::select`}
value={scenario.override_values[category][index] !== undefined ? scenario.override_values[category][index].value : ""}
label="Value"
onChange={handleInputOverrideValue}
>
{
value[0] === "Treatment Facility" ?
// presetValues.map((presetValue, i) => (
// <MenuItem key={`${presetValue}_${i}`} value={presetValue}>
// {presetValue}
// </MenuItem>
// ))
Object.entries(preset_values[value[5]]).map(([key,value]) => (
<MenuItem key={`${key}_${value}`} value={key}>
{value}
</MenuItem>
))
:
scenario.data_input.df_parameters[OVERRIDE_PRESET_VALUES[value[0]].input_table].VALUE.map((presetValue, i) => (
<MenuItem key={`${presetValue}_${i}`} value={presetValue}>
{presetValue}
</MenuItem>
))
}
</Select>
</FormControl>
</Tooltip>
)


} catch (e) {
console.error(e)
console.log("unable to generate infrastructure buildout options from input table, using generic input")
return (
<TextField
name={`${index}::textfield`}
size="small"
label="Value"
value={scenario.override_values[category][index].value !== undefined ? scenario.override_values[category][index].value : ""}
disabled={!Object.keys(scenario.override_values[category]).includes(""+index)}
onChange={handleInputOverrideValue}
onFocus={(event) => event.target.select()}
/>
)
}
} else {
return (
<TextField
name={`${index}::textfield`}
size="small"
label="Value"
value={scenario.override_values[category][index] !== undefined ? scenario.override_values[category][index].value : ""}
disabled={!Object.keys(scenario.override_values[category]).includes(""+index)}
onChange={handleInputOverrideValue}
onFocus={(event) => event.target.select()}
/>
)
}

}

const renderOutputTable = () => {

Expand Down Expand Up @@ -281,75 +140,17 @@ const renderOutputTable = () => {

</TableRow>
</TableHead>
{category === "vb_y_overview_dict" ?
<TableBody>
{data[category].slice(1).map((value, index) => {
return (<TableRow key={`row_${value}_${index}`}>
{[0,1,2,5,3,4].map((cellIdx, i) => (
<TableCell
align={"left"}
key={"" + index + i}
style={i === 0 ? styles.firstCol : styles.other}>
{value[cellIdx].toLocaleString('en-US', {maximumFractionDigits:0})}
</TableCell>
)
)}
<TableCell
align="left"
style={styles.other}>
<Checkbox
checked={getCheckboxValue(index)}
onChange={() => handleCheckOverride(index, value)}
/>
</TableCell>
<TableCell
disabled
align="right"
style={styles.other}>
{generateInfrastructureBuildoutValueOptions(value, index)}
</TableCell>
</TableRow>)
})}
</TableBody>
:
<TableBody>
{data[category].slice(1).map((value, index) => {
if (Object.keys(rowNodes).length === 0 || rowNodes[rowNodesMapping[index]]) {
return (<TableRow key={`row_${value}_${index}`}>
{value.map((cellValue, i)=> {
if (Object.keys(columnNodes).length === 0 || columnNodes[columnNodesMapping[i]]) {
return <TableCell
align={(i === (value.length - 1)) ? "right" : "left"}
key={"" + index + i}
style={i === 0 ? styles.firstCol : styles.other}>
{cellValue.toLocaleString('en-US', {maximumFractionDigits:0})}
</TableCell>
}
})}
<TableCell
align="left"
style={styles.other}>
<Checkbox
checked={getCheckboxValue(index)}
onChange={() => handleCheckOverride(index, value)}
/>
</TableCell>
<TableCell disabled align="right" style={styles.other}>
<TextField
name={`${index}::textfield`}
size="small"
label="Value"
value={scenario.override_values[category][index] !== undefined ? scenario.override_values[category][index].value : ""}
disabled={!Object.keys(scenario.override_values[category]).includes(""+index)}
onChange={handleInputOverrideValue}
onFocus={(event) => event.target.select()}
/>
</TableCell>
</TableRow>)
}
})}
</TableBody>
}
<OverrideTableRows
category={category}
data={data}
rowNodes={rowNodes}
rowNodesMapping={rowNodesMapping}
columnNodes={columnNodes}
columnNodesMapping={columnNodesMapping}
scenario={scenario}
handleCheckOverride={handleCheckOverride}
handleInputOverrideValue={handleInputOverrideValue}
/>

</Table>
</TableContainer>
Expand Down
Loading

0 comments on commit 29dc556

Please sign in to comment.