diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 365c15d..b99d30d 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -258,6 +258,7 @@ const App = () => {
{ const { name, parentPath, docString, value: runningTask, addNotification } = props; const renderCount = useRef(0); const formRef = useRef(null); + const id = getIdFromFullAccessPath(parentPath.concat('.' + name)); useEffect(() => { renderCount.current++; @@ -87,9 +89,7 @@ export const AsyncMethodComponent = React.memo((props: AsyncMethodProps) => { }); return ( -
+
{process.env.NODE_ENV === 'development' && (

Render count: {renderCount.current}

)} @@ -99,11 +99,7 @@ export const AsyncMethodComponent = React.memo((props: AsyncMethodProps) => {
{args} -
diff --git a/frontend/src/components/ButtonComponent.tsx b/frontend/src/components/ButtonComponent.tsx index 468c7de..e6aae9e 100644 --- a/frontend/src/components/ButtonComponent.tsx +++ b/frontend/src/components/ButtonComponent.tsx @@ -2,6 +2,7 @@ import React, { useEffect, useRef } from 'react'; import { ToggleButton } from 'react-bootstrap'; import { emit_update } from '../socket'; import { DocStringComponent } from './DocStringComponent'; +import { getIdFromFullAccessPath } from '../utils/stringUtils'; interface ButtonComponentProps { name: string; @@ -17,6 +18,7 @@ export const ButtonComponent = React.memo((props: ButtonComponentProps) => { const { name, parentPath, value, readOnly, docString, mapping, addNotification } = props; const buttonName = mapping ? (value ? mapping[0] : mapping[1]) : name; + const id = getIdFromFullAccessPath(parentPath.concat('.' + name)); const renderCount = useRef(0); @@ -33,14 +35,14 @@ export const ButtonComponent = React.memo((props: ButtonComponentProps) => { }; return ( -
+
{process.env.NODE_ENV === 'development' && (

Render count: {renderCount.current}

)} { renderCount.current++; @@ -33,13 +35,12 @@ export const ColouredEnumComponent = React.memo((props: ColouredEnumComponentPro addNotification(`${parentPath}.${name} changed to ${value}.`); }, [props.value]); - const handleValueChange = (newValue) => { - console.log(newValue); + const handleValueChange = (newValue: string) => { emit_update(name, parentPath, newValue); }; return ( -
+
{process.env.NODE_ENV === 'development' && (

Render count: {renderCount.current}

)} diff --git a/frontend/src/components/DataServiceComponent.tsx b/frontend/src/components/DataServiceComponent.tsx index 7640cb1..ae4d38e 100644 --- a/frontend/src/components/DataServiceComponent.tsx +++ b/frontend/src/components/DataServiceComponent.tsx @@ -3,8 +3,10 @@ import React from 'react'; import { Card, Collapse } from 'react-bootstrap'; import { ChevronDown, ChevronRight } from 'react-bootstrap-icons'; import { Attribute, GenericComponent } from './GenericComponent'; +import { getIdFromFullAccessPath } from '../utils/stringUtils'; type DataServiceProps = { + name: string; props: DataServiceJSON; parentPath?: string; isInstantUpdate: boolean; @@ -15,21 +17,29 @@ export type DataServiceJSON = Record; export const DataServiceComponent = React.memo( ({ + name, props, parentPath = 'DataService', isInstantUpdate, addNotification }: DataServiceProps) => { const [open, setOpen] = useState(true); + let fullAccessPath = parentPath; + if (name) { + fullAccessPath = parentPath.concat('.' + name); + } + console.log(fullAccessPath); + const id = getIdFromFullAccessPath(fullAccessPath); + console.log(id); return ( -
+
setOpen(!open)} style={{ cursor: 'pointer' }} // Change cursor style on hover > - {parentPath} {open ? : } + {fullAccessPath} {open ? : } @@ -39,7 +49,7 @@ export const DataServiceComponent = React.memo( key={key} attribute={value} name={key} - parentPath={parentPath} + parentPath={fullAccessPath} isInstantUpdate={isInstantUpdate} addNotification={addNotification} /> diff --git a/frontend/src/components/GenericComponent.tsx b/frontend/src/components/GenericComponent.tsx index d7e4f9a..b138ba1 100644 --- a/frontend/src/components/GenericComponent.tsx +++ b/frontend/src/components/GenericComponent.tsx @@ -153,8 +153,9 @@ export const GenericComponent = React.memo( } else if (attribute.type === 'DataService') { return ( diff --git a/frontend/src/components/ImageComponent.tsx b/frontend/src/components/ImageComponent.tsx index 86b2256..30f17d0 100644 --- a/frontend/src/components/ImageComponent.tsx +++ b/frontend/src/components/ImageComponent.tsx @@ -2,6 +2,7 @@ import React, { useEffect, useRef, useState } from 'react'; import { Card, Collapse, Image } from 'react-bootstrap'; import { DocStringComponent } from './DocStringComponent'; import { ChevronDown, ChevronRight } from 'react-bootstrap-icons'; +import { getIdFromFullAccessPath } from '../utils/stringUtils'; interface ImageComponentProps { name: string; @@ -18,6 +19,7 @@ export const ImageComponent = React.memo((props: ImageComponentProps) => { const renderCount = useRef(0); const [open, setOpen] = useState(true); + const id = getIdFromFullAccessPath(parentPath.concat('.' + name)); useEffect(() => { renderCount.current++; @@ -28,7 +30,7 @@ export const ImageComponent = React.memo((props: ImageComponentProps) => { }, [props.value]); return ( -
+
setOpen(!open)} diff --git a/frontend/src/components/ListComponent.tsx b/frontend/src/components/ListComponent.tsx index 1ff670c..9b96c82 100644 --- a/frontend/src/components/ListComponent.tsx +++ b/frontend/src/components/ListComponent.tsx @@ -1,6 +1,7 @@ import React, { useEffect, useRef } from 'react'; import { DocStringComponent } from './DocStringComponent'; import { Attribute, GenericComponent } from './GenericComponent'; +import { getIdFromFullAccessPath } from '../utils/stringUtils'; interface ListComponentProps { name: string; @@ -16,13 +17,14 @@ export const ListComponent = React.memo((props: ListComponentProps) => { props; const renderCount = useRef(0); + const id = getIdFromFullAccessPath(parentPath.concat('.' + name)); useEffect(() => { renderCount.current++; }, [props]); return ( -
+
{process.env.NODE_ENV === 'development' && (

Render count: {renderCount.current}

)} diff --git a/frontend/src/components/MethodComponent.tsx b/frontend/src/components/MethodComponent.tsx index be0f67f..29678ed 100644 --- a/frontend/src/components/MethodComponent.tsx +++ b/frontend/src/components/MethodComponent.tsx @@ -2,6 +2,7 @@ import React, { useState, useEffect, useRef } from 'react'; import { emit_update } from '../socket'; import { Button, InputGroup, Form, Collapse } from 'react-bootstrap'; import { DocStringComponent } from './DocStringComponent'; +import { getIdFromFullAccessPath } from '../utils/stringUtils'; interface MethodProps { name: string; @@ -19,6 +20,7 @@ export const MethodComponent = React.memo((props: MethodProps) => { const [hideOutput, setHideOutput] = useState(false); // Add a new state variable to hold the list of function calls const [functionCalls, setFunctionCalls] = useState([]); + const id = getIdFromFullAccessPath(parentPath.concat('.' + name)); useEffect(() => { renderCount.current++; @@ -69,9 +71,7 @@ export const MethodComponent = React.memo((props: MethodProps) => { }); return ( -
+
{process.env.NODE_ENV === 'development' && (

Render count: {renderCount.current}

)} diff --git a/frontend/src/components/NumberComponent.tsx b/frontend/src/components/NumberComponent.tsx index 4a3a10b..af126f5 100644 --- a/frontend/src/components/NumberComponent.tsx +++ b/frontend/src/components/NumberComponent.tsx @@ -3,6 +3,7 @@ import { Form, InputGroup } from 'react-bootstrap'; import { emit_update } from '../socket'; import { DocStringComponent } from './DocStringComponent'; import '../App.css'; +import { getIdFromFullAccessPath } from '../utils/stringUtils'; // TODO: add button functionality @@ -131,14 +132,14 @@ export const NumberComponent = React.memo((props: NumberComponentProps) => { const [cursorPosition, setCursorPosition] = useState(null); // Create a state for the input string const [inputString, setInputString] = useState(props.value.toString()); + const fullAccessPath = parentPath.concat('.' + name); + const id = getIdFromFullAccessPath(fullAccessPath); useEffect(() => { renderCount.current++; // Set the cursor position after the component re-renders - const inputElement = document.getElementsByName( - parentPath.concat('.' + name) - )[0] as HTMLInputElement; + const inputElement = document.getElementsByName(id)[0] as HTMLInputElement; if (inputElement && cursorPosition !== null) { inputElement.setSelectionRange(cursorPosition, cursorPosition); } @@ -275,7 +276,7 @@ export const NumberComponent = React.memo((props: NumberComponentProps) => { }; return ( -
+
{process.env.NODE_ENV === 'development' && showName && (

Render count: {renderCount.current}

)} @@ -287,7 +288,7 @@ export const NumberComponent = React.memo((props: NumberComponentProps) => { type="text" value={inputString} disabled={readOnly} - name={parentPath.concat('.' + name)} + name={fullAccessPath} onKeyDown={handleKeyDown} onBlur={handleBlur} className={isInstantUpdate && !readOnly ? 'instantUpdate' : ''} diff --git a/frontend/src/components/SliderComponent.tsx b/frontend/src/components/SliderComponent.tsx index 2f3d8f5..7d47bcf 100644 --- a/frontend/src/components/SliderComponent.tsx +++ b/frontend/src/components/SliderComponent.tsx @@ -4,6 +4,7 @@ import { emit_update } from '../socket'; import { DocStringComponent } from './DocStringComponent'; import { Slider } from '@mui/material'; import { NumberComponent } from './NumberComponent'; +import { getIdFromFullAccessPath } from '../utils/stringUtils'; interface SliderComponentProps { name: string; @@ -21,11 +22,6 @@ interface SliderComponentProps { export const SliderComponent = React.memo((props: SliderComponentProps) => { const renderCount = useRef(0); const [open, setOpen] = useState(false); - - useEffect(() => { - renderCount.current++; - }); - const { name, parentPath, @@ -38,6 +34,12 @@ export const SliderComponent = React.memo((props: SliderComponentProps) => { isInstantUpdate, addNotification } = props; + const fullAccessPath = parentPath.concat('.' + name); + const id = getIdFromFullAccessPath(fullAccessPath); + + useEffect(() => { + renderCount.current++; + }); useEffect(() => { addNotification(`${parentPath}.${name} changed to ${value}.`); @@ -102,7 +104,7 @@ export const SliderComponent = React.memo((props: SliderComponentProps) => { }; return ( -
+
{process.env.NODE_ENV === 'development' && (

Render count: {renderCount.current}

)} diff --git a/frontend/src/components/StringComponent.tsx b/frontend/src/components/StringComponent.tsx index 46f5f11..11db630 100644 --- a/frontend/src/components/StringComponent.tsx +++ b/frontend/src/components/StringComponent.tsx @@ -3,6 +3,7 @@ import { Form, InputGroup } from 'react-bootstrap'; import { emit_update } from '../socket'; import { DocStringComponent } from './DocStringComponent'; import '../App.css'; +import { getIdFromFullAccessPath } from '../utils/stringUtils'; // TODO: add button functionality @@ -22,6 +23,8 @@ export const StringComponent = React.memo((props: StringComponentProps) => { const renderCount = useRef(0); const [inputString, setInputString] = useState(props.value); + const fullAccessPath = parentPath.concat('.' + name); + const id = getIdFromFullAccessPath(fullAccessPath); useEffect(() => { renderCount.current++; @@ -55,7 +58,7 @@ export const StringComponent = React.memo((props: StringComponentProps) => { }; return ( -
+
{process.env.NODE_ENV === 'development' && (

Render count: {renderCount.current}

)}