add testsuite and testcase list pages in frontend of testing-scheduler
[bottlenecks.git] / testing-scheduler / ui / src / components / workflow_graph / wfresult.vue
diff --git a/testing-scheduler/ui/src/components/workflow_graph/wfresult.vue b/testing-scheduler/ui/src/components/workflow_graph/wfresult.vue
new file mode 100644 (file)
index 0000000..ace6076
--- /dev/null
@@ -0,0 +1,236 @@
+<template>\r
+<div style="min-height: 600px; overflow-x: auto; overflow-y: auto;">\r
+    <div id="file-section1" class="col-md-4">\r
+      <div id="workflow-content-div">\r
+        <div class="dark-gray-bg" style="font-size: 17px; max-width: 500px; margin: 0 auto 10px;"> WORKFLOW.JSON CONTENT</div>\r
+        <pre class="white-pink" id="workflow-content" style="height: 600px; background-color:#f5f5f5;"></pre>\r
+      </div>\r
+    </div>\r
+    <div class="col-md-8" id="graph-show-section" style="">\r
+      <div v-show="!wfloading" style="margin-top: 10px;">\r
+          <div style="min-height: 30px; text-align: right;">\r
+              <button v-show="workflowId != '' && !wfCompletedFlag" class="btn" v-on:click="completeWF(1)" title="mark the status 'complete' by hand.">mark it <strong>complete</strong></button>\r
+          </div>\r
+          <div id="workflow-graph">\r
+          </div>\r
+      </div>\r
+      <div v-show="wfloading" class="spiner-example" id="loading">\r
+        <div class="sk-spinner sk-spinner-three-bounce">\r
+          <div class="sk-bounce1"></div>\r
+          <div class="sk-bounce2"></div>\r
+          <div class="sk-bounce3"></div>\r
+        </div>\r
+      </div>\r
+          <div class="row">\r
+          <div id="iframeContainer"></div>\r
+          <div id="workflowId" style="display:none">\r
+              <input name="workflowId" type="hidden" v-bind:value="workflowId" />\r
+              <input name="function" type="hidden" value="graphLoad" />\r
+              <button id="graphloadbtn" type="button" onclick="graphLoad()"></button>\r
+          </div>\r
+        </div>\r
+    </div>\r
+</div>\r
+</template>\r
+<script>\r
+export default {\r
+    props: ['workflowId', 'wfloading', 'wfJson'],\r
+    name: 'wfresult',\r
+    data: function() {\r
+        return {\r
+            frameLoadedFlag : false,\r
+            initalPaintFlag : false,\r
+            RESPONSE_TIME_LIMIT : 6000,\r
+            responseTimeCounter : 0,\r
+            wfCompletedFlag : false,\r
+            intervalTime : 1000,\r
+            timer: null\r
+        }\r
+    },\r
+    computed: {\r
+        wfget: function(){\r
+            return !this.wfloading;\r
+        }\r
+    },\r
+    watch: {\r
+        workflowId: function(val){\r
+            console.log("############## workflowId changed! " + val);\r
+            this.graphLoad();\r
+        },\r
+        wfJson: function(val){\r
+            this.fillWfContent(val);\r
+        }\r
+    },\r
+    mounted: function(){\r
+        window.clearInterval(this.timer);\r
+    },\r
+    destroyed: function(){\r
+        window.clearInterval(this.timer);\r
+    },\r
+    methods: {\r
+        graphLoad: function(){\r
+            console.log("load function activate");\r
+            this.reset();\r
+            this.initialPaintWFGraph();\r
+            var self = this;\r
+              self.timer = window.setInterval(function() {\r
+                if(!self.initalPaintFlag) {\r
+                  if(self.responseTimeCounter > self.RESPONSE_TIME_LIMIT) {\r
+                    self.initialPaintWFGraph();\r
+                    self.responseTimeCounter = 0;\r
+                  }\r
+                } else {\r
+                  if(self.frameLoadedFlag || self.responseTimeCounter > self.RESPONSE_TIME_LIMIT) {\r
+                    self.repaintWFGraph();\r
+                    self.responseTimeCounter = 0;\r
+                  }\r
+                }\r
+                self.responseTimeCounter += self.intervalTime;\r
+            }, self.intervalTime);\r
+        },\r
+        reset: function(){\r
+            this.frameLoadedFlag = false;\r
+              this.initalPaintFlag = false;\r
+              this.RESPONSE_TIME_LIMIT = 6000;\r
+              this.responseTimeCounter = 0;\r
+              this.wfCompletedFlag = false;\r
+              var graphDiv = document.getElementById("workflow-graph");\r
+              graphDiv.innerHTML = '';\r
+        },\r
+        initialPaintWFGraph: function() {\r
+            console.log("start to initial paint");\r
+            this.setIframeSrc();\r
+            var iframe = document.getElementById("testFrame");\r
+            var self = this;\r
+             if (iframe.attachEvent) {\r
+               iframe.attachEvent("onload", function(){\r
+                 window.setTimeout(function(){\r
+                    self.frameLoadedFlag = true;\r
+                    self.initialPaint();\r
+                    console.log("finish to initial paint");\r
+                 }, 1000);\r
+               });\r
+             } else {\r
+               iframe.onload = function(){\r
+                window.setTimeout(function(){\r
+                    self.frameLoadedFlag = true;\r
+                    self.initialPaint();\r
+                    console.log("finish to initial paint");\r
+                 }, 1000);\r
+               }\r
+             }\r
+        },\r
+        setIframeSrc: function(){\r
+         var iframeContainer = document.getElementById("iframeContainer");\r
+         var iframeDiv = document.getElementById("testFrame");\r
+         if(iframeDiv != undefined ) {\r
+             iframeContainer.removeChild(iframeDiv);\r
+         }\r
+         var apiPrefix = this.global.WF_GRAPH_ADDR + "#/workflow/id/";\r
+         var apiUrl = apiPrefix + this.workflowId;\r
+         console.log("workflowId prop:" + this.workflowId);\r
+         var iframeDiv = "<iframe id=\"testFrame\" width=\"0\" height=\"0\" style=\"border: none;\" src=\"" + apiUrl + "\"></iframe>";\r
+         iframeContainer.innerHTML = iframeDiv;\r
+         this.frameLoadedFlag = false;\r
+        },\r
+        initialPaint: function() {\r
+          var iframe = document.getElementById("testFrame");\r
+          var frameContent = iframe.contentWindow.document.getElementById("graph-ui-content");\r
+          if(frameContent == null) return;\r
+          this.frameLoadedFlag = true;\r
+          var content = frameContent.cloneNode(true);\r
+          content.id = "graph-ui-content-1";\r
+          var graphDiv = document.getElementById("workflow-graph");\r
+          graphDiv.appendChild(content);\r
+          this.initalPaintFlag = true;\r
+          this.wfloading = false;\r
+          console.log("####################wfloading   false######################");\r
+        },\r
+        repaint: function() {\r
+             var iframe = document.getElementById("testFrame");\r
+             var frameContent = iframe.contentWindow.document.getElementById("graph-ui-content");\r
+             if(frameContent == null) return;\r
+             this.frameLoadedFlag = true;\r
+             var newContent = frameContent.cloneNode(true);\r
+             var newNodes = newContent.getElementsByClassName("node");\r
+             var oldContent = document.getElementById("graph-ui-content-1");\r
+             var oldNodes = oldContent.getElementsByClassName("node");\r
+             var completeText = iframe.contentWindow.document.getElementsByClassName("ui-content")[0].getElementsByTagName("h4")[0].getElementsByTagName("span")[3].innerHTML;\r
+             if(newNodes.length > oldNodes.length) {\r
+              console.log("execute in new > old");\r
+                newContent.id = "graph-ui-content-1";\r
+                var graphDiv = document.getElementById("workflow-graph");\r
+                graphDiv.innerHTML = '';\r
+                graphDiv.appendChild(newContent);\r
+             }\r
+             else if(newNodes.length == oldNodes.length) {\r
+                console.log("execute in new = old");\r
+                for(var i = 0; i < newNodes.length; i++)\r
+                {\r
+                  var newGraph = newNodes[i].children[0];\r
+                  var newGraphStyle = newGraph.getAttribute("style");\r
+                  var oldGraph = oldNodes[i].children[0];\r
+                  var oldGraphStyle = oldGraph.getAttribute("style");\r
+                  if(newGraphStyle != oldGraphStyle) {\r
+                    oldGraph.setAttribute("style", newGraphStyle);\r
+                  }\r
+                  var newText = newNodes[i].getElementsByTagName("text")[0];\r
+                  var newTextStyle = newText.getAttribute("style");\r
+                  var oldText = oldNodes[i].getElementsByTagName("text")[0];\r
+                  var oldTextStyle = oldText.getAttribute("style");\r
+                  if(oldTextStyle != newTextStyle) {\r
+                    oldText.setAttribute("style", newTextStyle);\r
+                  }\r
+                }\r
+                if(completeText == "COMPLETED") {\r
+                    this.completeWF(5);\r
+                }\r
+             }\r
+             else {\r
+                  console.log("execute in new < old");\r
+             }\r
+        },\r
+        repaintWFGraph: function() {\r
+         this.setIframeSrc();\r
+         var iframe = document.getElementById("testFrame");\r
+         var self = this;\r
+         if (iframe.attachEvent) {\r
+           iframe.attachEvent("onload", function(){\r
+             window.setTimeout(function(){\r
+                self.frameLoadedFlag = true;\r
+                self.repaint();\r
+             }, 1000);\r
+           });\r
+         } else {\r
+          iframe.onload = function(){\r
+            window.setTimeout(function(){\r
+                self.frameLoadedFlag = true;\r
+                self.repaint();\r
+             }, 1000);\r
+          }\r
+         }\r
+        },\r
+        completeWF: function(delay) {\r
+            this.wfCompletedFlag = true;\r
+            console.log("#####################################completed: clean the interval  " + this.timer);\r
+            window.clearInterval(this.timer);\r
+            var self = this;\r
+            window.setTimeout(function() {\r
+              self.$emit("wfComplete", true);\r
+            }, delay*1000);\r
+        },\r
+        fillWfContent: function(wfContent) {\r
+            var contentDiv = document.getElementById("workflow-content");\r
+            contentDiv.innerHTML = wfContent;\r
+        }\r
+    }\r
+}\r
+</script>\r
+<style scoped>\r
+#workflow-graph {\r
+    text-align: center;\r
+}\r
+#workflow-graph > div{\r
+    display: inline-block;\r
+}\r
+</style>
\ No newline at end of file