From dc57867bb8757565078b48f69682f41569e770b5 Mon Sep 17 00:00:00 2001
From: Robin Leber <rleber98@gmail.com>
Date: Thu, 20 Jun 2024 10:40:42 +0200
Subject: [PATCH] FEAT: pipe binding, pipe buttons

---
 src/functions/codeEditor.js  | 32 ++++++------------
 src/functions/duplication.js |  6 ++--
 src/functions/feedback.js    | 13 ++++++++
 src/functions/pipeBinding.js | 65 ++++++++++++++++++++++++++++++++++++
 src/functions/state.js       |  5 ++-
 src/main.js                  | 10 ++++--
 6 files changed, 104 insertions(+), 27 deletions(-)
 create mode 100644 src/functions/pipeBinding.js

diff --git a/src/functions/codeEditor.js b/src/functions/codeEditor.js
index 3c5329d..d7383fc 100644
--- a/src/functions/codeEditor.js
+++ b/src/functions/codeEditor.js
@@ -2,6 +2,11 @@ import { basicSetup, EditorView } from "codemirror";
 import { javascript } from "@codemirror/lang-javascript";
 import { createCustomCode } from "./api";
 import { showCheck } from "./visualValidation";
+import {
+  createPipesElements,
+  getPipesForFilter,
+  createPipeButtons,
+} from "./pipeBinding";
 
 export const codeEditor = (instance) => {
   if (document.getElementById(`codeEditor${window.selectedFilter}`)) {
@@ -9,6 +14,7 @@ export const codeEditor = (instance) => {
       `codeEditor${window.selectedFilter}`
     );
     codeEditor.style.visibility = "visible";
+    createPipeButtons(getPipesForFilter());
   } else {
     var diagram = document.getElementById("Diagram");
 
@@ -18,30 +24,13 @@ export const codeEditor = (instance) => {
 
     const containerHeading = document.createElement("h4");
     containerHeading.appendChild(document.createTextNode("CODE EDITOR"));
+    containerHeading.style.marginTop = "6px";
+    containerHeading.style.marginBottom = "0px";
     editorContainer.appendChild(containerHeading);
 
-    const pipesDiv = document.createElement("div");
-    pipesDiv.classList.add("pipes");
-
-    const incomingPipesDiv = document.createElement("div");
-    const incomingPipesHeading = document.createElement("h5");
-    incomingPipesHeading.appendChild(document.createTextNode("Incoming Pipes"));
-    incomingPipesDiv.appendChild(incomingPipesHeading);
-
-    // TODO: for each pipe in incomingPipes usw...
-    // const pipeButton = document.createElement("button");
-    // pipeButton.appendChild(document.createTextNode("[Pipe Name 123]"));
-    // incomingPipesDiv.appendChild(pipeButton);
-
-    const outgoingPipesDiv = document.createElement("div");
-    const outgoingPipesHeading = document.createElement("h5");
-    outgoingPipesHeading.appendChild(document.createTextNode("Outgoing Pipes"));
-    outgoingPipesDiv.appendChild(outgoingPipesHeading);
-
-    pipesDiv.appendChild(incomingPipesDiv);
-    pipesDiv.appendChild(outgoingPipesDiv);
+    diagram.appendChild(editorContainer);
 
-    editorContainer.appendChild(pipesDiv);
+    createPipesElements();
 
     const filterToCode = {
       type: document
@@ -103,7 +92,6 @@ export const codeEditor = (instance) => {
     buttonContainer.appendChild(submitButton);
     editorContainer.appendChild(buttonContainer);
 
-    diagram.appendChild(editorContainer);
     instance.draggable(editorContainer.id);
   }
 };
diff --git a/src/functions/duplication.js b/src/functions/duplication.js
index 4087ed5..8e94b44 100644
--- a/src/functions/duplication.js
+++ b/src/functions/duplication.js
@@ -6,7 +6,7 @@ export const duplicatePipe = (instance) => {
   var selectedPipe = document.getElementById(window.selectedPipe);
 
   var newPipe = document.createElement("div");
-  var pipeText = document.createTextNode(selectedPipe.innerHTML);
+  var pipeText = document.createTextNode(selectedPipe.innerHTML.split("\n")[1]);
   newPipe.appendChild(pipeText);
   newPipe.id = uuidv4();
   newPipe.classList.add("Pipe");
@@ -32,7 +32,9 @@ export const duplicateFilter = (instance) => {
   var selectedFilter = document.getElementById(window.selectedFilter);
 
   var newFilter = document.createElement("div");
-  var filterText = document.createTextNode(selectedFilter.innerHTML);
+  var filterText = document.createTextNode(
+    selectedFilter.innerHTML.split("\n")[1]
+  );
   newFilter.appendChild(filterText);
   newFilter.id = uuidv4();
   newFilter.classList.add("Filter");
diff --git a/src/functions/feedback.js b/src/functions/feedback.js
index 102c025..9a91ab7 100644
--- a/src/functions/feedback.js
+++ b/src/functions/feedback.js
@@ -16,6 +16,19 @@ export const errorFeedback = (errorMsg) => {
     errorMsgElement.remove();
   }, 5000);
 };
+
+export const errorFeedbackSimple = (errorMsg) => {
+  const errorMsgElement = document.createElement("p");
+  errorMsgElement.appendChild(document.createTextNode(errorMsg));
+  document.getElementById("Error").appendChild(errorMsgElement);
+
+  document.getElementById("Error").style.visibility = "visible";
+  setTimeout(function () {
+    document.getElementById("Error").style.visibility = "hidden";
+    errorMsgElement.remove();
+  }, 5000);
+};
+
 export const successFeedback = () => {
   document.getElementById("Success").style.visibility = "visible";
   setTimeout(function () {
diff --git a/src/functions/pipeBinding.js b/src/functions/pipeBinding.js
new file mode 100644
index 0000000..003184b
--- /dev/null
+++ b/src/functions/pipeBinding.js
@@ -0,0 +1,65 @@
+import { appState } from "./state";
+import { errorFeedbackSimple } from "./feedback";
+
+export const createPipesElements = () => {
+  const codeEditor = document.getElementById(
+    `codeEditor${window.selectedFilter}`
+  );
+  const pipesDiv = document.createElement("div");
+  pipesDiv.classList.add("pipes");
+
+  const incomingPipesDiv = document.createElement("div");
+  incomingPipesDiv.id = "IncomingPipes";
+  const incomingPipesHeading = document.createElement("h5");
+  incomingPipesHeading.style.margin = "6px";
+  incomingPipesHeading.appendChild(document.createTextNode("Incoming Pipes"));
+  incomingPipesDiv.appendChild(incomingPipesHeading);
+
+  const outgoingPipesDiv = document.createElement("div");
+  outgoingPipesDiv.id = "OutgoingPipes";
+  const outgoingPipesHeading = document.createElement("h5");
+  outgoingPipesHeading.style.margin = "6px";
+  outgoingPipesHeading.appendChild(document.createTextNode("Outgoing Pipes"));
+  outgoingPipesDiv.appendChild(outgoingPipesHeading);
+
+  pipesDiv.appendChild(incomingPipesDiv);
+  pipesDiv.appendChild(outgoingPipesDiv);
+
+  codeEditor.appendChild(pipesDiv);
+  createPipeButtons(getPipesForFilter());
+};
+
+export const getPipesForFilter = () => {
+  const filter = window.selectedFilter;
+  const connections = appState.getConnection(filter);
+  const pipeMapping = [];
+  connections &&
+    connections.forEach((connection) => {
+      const pipeName = appState.getPipe(connection.pipeId);
+      if (!pipeName) {
+        errorFeedbackSimple("Name Your Pipes!");
+      } else {
+        const pipe = { pipeName, ...connection };
+        pipeMapping.push(pipe);
+      }
+    });
+  return pipeMapping;
+};
+
+export const createPipeButtons = (pipeMapping) => {
+  const incomingPipesDiv = document.getElementById("IncomingPipes");
+  const outgoingPipesDiv = document.getElementById("OutgoingPipes");
+
+  pipeMapping.forEach((pipe) => {
+    if (document.getElementById(`Button${pipe.pipeId}`)) {
+      return;
+    } else {
+      const pipeButton = document.createElement("button");
+      pipeButton.id = `Button${pipe.pipeId}`;
+      pipeButton.appendChild(document.createTextNode(pipe.pipeName));
+      pipe.direction === "in"
+        ? incomingPipesDiv.appendChild(pipeButton)
+        : outgoingPipesDiv.appendChild(pipeButton);
+    }
+  });
+};
diff --git a/src/functions/state.js b/src/functions/state.js
index 404cf48..c43bc14 100644
--- a/src/functions/state.js
+++ b/src/functions/state.js
@@ -9,7 +9,10 @@ export const appState = (() => {
     getState: () => state,
     setBeenPaused: (beenPaused) => (state.beenPaused = beenPaused),
     addConnection: (con1, con2) => {
-      state.connections.set(con1, con2);
+      if (!state.connections.has(con1)) {
+        state.connections.set(con1, []);
+      }
+      state.connections.get(con1).push(con2);
     },
     removeConnection: (con1) => {
       state.connections.delete(con1);
diff --git a/src/main.js b/src/main.js
index d521c4a..9bdf4ee 100644
--- a/src/main.js
+++ b/src/main.js
@@ -35,9 +35,15 @@ function App() {
         return false;
       }
       if (source.getAttribute("class").includes("Filter")) {
-        appState.addConnection(source.id, target.id);
+        appState.addConnection(source.id, {
+          pipeId: target.id,
+          direction: "out",
+        });
       } else {
-        appState.addConnection(target.id, source.id);
+        appState.addConnection(target.id, {
+          pipeId: source.id,
+          direction: "in",
+        });
       }
       return true;
     });
-- 
GitLab