diff --git a/webapp/.env b/webapp/.env new file mode 100644 index 0000000..1551f96 --- /dev/null +++ b/webapp/.env @@ -0,0 +1 @@ +WDS_SOCKET_PORT=0 \ No newline at end of file diff --git a/webapp/package-lock.json b/webapp/package-lock.json index 7dbc14f..620a6be 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -15,6 +15,7 @@ "react": "^18.2.0", "react-container-dimensions": "^1.4.1", "react-dom": "^18.2.0", + "react-hook-form": "^7.46.2", "react-leaflet": "^4.2.1", "react-scripts": "^5.0.1", "react-use-websocket": "^4.3.1", @@ -14321,6 +14322,21 @@ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" }, + "node_modules/react-hook-form": { + "version": "7.46.2", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.46.2.tgz", + "integrity": "sha512-x1DWmHQchV7x2Rq9l99M/cQHC8JGchAnw9Z0uTz5KrPa0bTl/Inm1NR7ceOARfIrkNuQNAhuSuZPYa6k7QYn3Q==", + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18" + } + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", diff --git a/webapp/package.json b/webapp/package.json index 10c49b1..9baa824 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -10,6 +10,7 @@ "react": "^18.2.0", "react-container-dimensions": "^1.4.1", "react-dom": "^18.2.0", + "react-hook-form": "^7.46.2", "react-leaflet": "^4.2.1", "react-scripts": "^5.0.1", "react-use-websocket": "^4.3.1", diff --git a/webapp/src/App.jsx b/webapp/src/App.jsx index c0114cb..1974f8b 100644 --- a/webapp/src/App.jsx +++ b/webapp/src/App.jsx @@ -12,13 +12,18 @@ import {w3cwebsocket as W3CWebSocket} from "websocket" const config = { // apiUrl: process.env.REACT_APP_WEBAPP_WS_URL, - apiUrl: "10.110.242.105", - apiProt: 9999 + apiUrl: "192.168.3.13", + apiProt: 30747 } -const client = new WebSocket("ws://10.110.242.105:9999/"); +// const config = { +// // apiUrl: process.env.REACT_APP_WEBAPP_WS_URL, +// apiUrl: "localhost", +// apiProt: 9999 +// } -// const client = new W3CWebSocket("ws://"+config.apiUrl+":"+config.apiProt+"/"); + +const client = new W3CWebSocket("ws://"+config.apiUrl+":"+config.apiProt+"/"); class App extends Component { @@ -38,8 +43,9 @@ class App extends Component { const dataFromServer = JSON.parse(message.data); console.log('reply: ', dataFromServer); - if(dataFromServer.Type === "COP") + if(dataFromServer.Data === "COP") { + this.setState((state) => ({ Entities: dataFromServer.Entities }) @@ -49,26 +55,26 @@ class App extends Component { } - // connect((msg) => { - // console.log("New Message") + // connect((msg) => { + // console.log("New Message") - // var jsonMSG; - // try { - // jsonMSG = JSON.parse(msg.data); - // } catch (error) { - // console.log(error); - // } + // var jsonMSG; + // try { + // jsonMSG = JSON.parse(msg.data); + // } catch (error) { + // console.log(error); + // } - // if(jsonMSG["Type"] == "COP"){ - // console.log(msg.data) - // var Entities = Array.from(jsonMSG["Entities"]) - // if(Array.isArray(Entities)) - // { - // this.setState({ - // Entities:Entities - // }); - // } - // } + // if(jsonMSG["Type"] == "COP"){ + // console.log(msg.data) + // var Entities = Array.from(jsonMSG["Entities"]) + // if(Array.isArray(Entities)) + // { + // this.setState({ + // Entities:Entities + // }); + // } + // } @@ -107,15 +113,10 @@ class App extends Component {
- {/* */} - {/*
- {name} - -
*/} +
- {/* */} ); diff --git a/webapp/src/components/OpenSeaMap/OpenSeaMap.jsx b/webapp/src/components/OpenSeaMap/OpenSeaMap.jsx index 344bb1a..95dbca3 100644 --- a/webapp/src/components/OpenSeaMap/OpenSeaMap.jsx +++ b/webapp/src/components/OpenSeaMap/OpenSeaMap.jsx @@ -7,15 +7,7 @@ import "./OpenSeaMap.scss"; import {w3cwebsocket as W3CWebSocket} from "websocket"; import ContainerDimensions from 'react-container-dimensions'; -// const config = { -// // apiUrl: process.env.REACT_APP_WEBAPP_WS_URL, -// apiUrl: "10.110.242.105", -// apiProt: 9999 -// } -// const client = new W3CWebSocket("ws://"+config.apiUrl+":"+config.apiProt+"/"); - -// import icon from 'leaflet/dist/images/marker-icon.png'; class OpenSeaMap extends Component { @@ -50,11 +42,11 @@ class OpenSeaMap extends Component { var icon; icon = createIcon(entity.Type,entity.Side) return ( - { - console.log(e.target.options.data); // will print 'FooBar' in console + // console.log(e.target.options.data); // will print 'FooBar' in console this.props.setEntityOnFocus(e.target.options.data); }, }} > @@ -77,7 +69,7 @@ class OpenSeaMap extends Component { return (
- + { // Update the document title using the browser API document.title = `You clicked ${count} times`; + + + setEntity(props.Entity); + if(CourseInControl === false) + { + console.log("los") + // setSpeed(props.Entity.Speed); + setFormData({course:props.Entity.Course,speed:props.Entity.Speed}) + // setFormData({speed:props.Entity.Speed}) + + } + + + + },[props.Entity]); + + + + // Entity.Entity.Course +const handleClick = (e) => { + if(e.detail === 2) + { + setCourseInControl(true); + e.target.readOnly = false; + // e.target.style = "border: 1px solid" + } + }; + + const handleCourseInput= (e) => { + console.log(e.target) + console.log(isNaN(e.nativeEvent?.data)) + if(!isNaN(e.nativeEvent?.data)) + { + + setFormData({...formData,course:e.currentTarget.value}); + } + }; + + const handleSpeedInput= (e) => { + console.log(e.target) + if(!isNaN(e.nativeEvent?.data)) + { + setFormData({...formData,speed:e.currentTarget.value}); + + } + }; + + const emptyForm= (e) => + { + + } + + // const handleChange = (event) => { + // const { name, value } = event.target; + // setFormData((prevFormData) => ({ ...prevFormData, [name]: value })); + // }; + + const handleSubmit = (e) => { + e.preventDefault(); + console.log(e.target.data); + + alert(`Course: ${formData.course}` + ); + } + // console.log(Entity) // console.log(EntityOnFocus) return ( -
-
-
Name
-
{Entity.Entity.Name}
-
-
-
Course
-
{Entity.Entity.Course}
-
+
+
+
+
+
{Entity.id}
+
+
Name
+
{Entity.Name}
+
+
+
Course
+
+ +
+
+
Speed
+
+ +
+
+
+
); } diff --git a/webapp/src/components/control/Tracklist/tracklist.jsx b/webapp/src/components/control/Tracklist/tracklist.jsx index 4201a57..66fc446 100644 --- a/webapp/src/components/control/Tracklist/tracklist.jsx +++ b/webapp/src/components/control/Tracklist/tracklist.jsx @@ -13,21 +13,28 @@ class Tracklist extends React.Component
- - - - - + + + + + + + + + { this.props.entities.map((val,index) => { return ( - - - - + + + + + + + ) diff --git a/webapp/src/components/control/Tracklist/tracklist.scss b/webapp/src/components/control/Tracklist/tracklist.scss index 10bae13..73395cf 100644 --- a/webapp/src/components/control/Tracklist/tracklist.scss +++ b/webapp/src/components/control/Tracklist/tracklist.scss @@ -1,8 +1,40 @@ .tracklist { display: flex; + max-height: 500px; + height: 500px; + display: block; } td { -text-align: left;} \ No newline at end of file +text-align: left; +} + +.TracklistHeader { + border-bottom: 2px solid; +} + +table { + border-collapse: collapse; +} + +th{ + // border: 1px solid; + // border-collapse: collapse; +} + +.TracklistCell{ + border-left: 1px solid; + text-align: center; +} + +.TracklistHeaderCell{ + width: 16%; +} + + +// table, th, td { +// border: 1px solid; +// border-collapse: collapse; +// } \ No newline at end of file diff --git a/webapp/src/components/control/controls.css b/webapp/src/components/control/controls.css index a8a2a50..a7e0e8d 100644 --- a/webapp/src/components/control/controls.css +++ b/webapp/src/components/control/controls.css @@ -6,6 +6,12 @@ .ControlsComponent{ display: grid; +/* grid-template-columns: auto auto auto; */ +} +.EntityinputField{ + border: none; + width: 50%; + display: block; } .ControlHeader{ diff --git a/webapp/src/components/control/controls.jsx b/webapp/src/components/control/controls.jsx index cefc2b0..d10b3a6 100644 --- a/webapp/src/components/control/controls.jsx +++ b/webapp/src/components/control/controls.jsx @@ -3,37 +3,42 @@ import './controls.css' // import { sendMsg } from '../api'; import Tracklist from './Tracklist' import EntityControl from './EntityControl'; + import {w3cwebsocket as W3CWebSocket} from "websocket" // const config = { // // apiUrl: process.env.REACT_APP_WEBAPP_WS_URL, -// apiUrl: "10.110.242.105", -// apiProt: 9999 +// apiUrl: "192.168.3.13", +// apiProt: 30747 // } -// const client = new W3CWebSocket("ws://10.110.242.105:9999/"); -const client = new WebSocket("ws://10.110.242.105:9999/"); + +// const client = new W3CWebSocket("ws://"+config.apiUrl+":"+config.apiProt+"/"); + + class Controls extends React.Component { state = { - EntityOnFocus: this.props.EntityOnFocus + EntityOnFocus: undefined, } componentDidMount() { - client.onopen = () => { - console.log("Websocket Client Connected"); - }; + // client.onopen = () => { + // console.log(" Control Websocket Client Connected"); + // }; - client.onmessage = (message) => { - const dataFromServer = JSON.parse(message.data); - console.log('reply', dataFromServer); - } + // client.onmessage = (message) => { + // const dataFromServer = JSON.parse(message.data); + // console.log('reply', dataFromServer); + // } + } + render() { function getEntityFromID(Entities, SelectedKey) @@ -49,14 +54,16 @@ state = { return tmp; } - console.log(getEntityFromID(this.props.Entities,this.props.EntityOnFocus)); + + // console.log(getEntityFromID(this.props.Entities,this.props.EntityOnFocus)); return (

- - + + +
);
NameCourseLatLon
NameCourseSpeedLatLonKindSide
{val.Name}{val.Course}{val.position[0]}{val.position[1]}{val.Name}{val.Course}{val.Speed}{val.Position[0]}{val.Position[1]}{val.Type}{val.Side}