--- /dev/null
+<template>\r
+ <div class="wrapper wrapper-content animated fadeIn">\r
+ <div class="row" style="margin-bottom: 20px;">\r
+ <div class="col-md-8">\r
+ <ol class="breadcrumb" style="padding-left: 20px; font-size: 17px;">\r
+ <li>\r
+ <router-link to="/" >root</router-link>\r
+ </li>\r
+ <li>\r
+ <router-link :to="{ path: '/testcase', query: { name: suitename }}" >{{this.$route.query.suiteName}}</router-link>\r
+ </li>\r
+ <li>\r
+ <router-link :to="{ path: '/content', query: { suiteName: suitename, caseName: casename } }"><b>{{this.$route.query.caseName}}</b></router-link>\r
+ </li>\r
+ </ol>\r
+ </div>\r
+ </div>\r
+ <div id="page-content" class="row">\r
+ <div class="col-lg-12">\r
+ <div class="ibox">\r
+ <div class="ibox-title">\r
+ <h5 style="font-size:26px;margin-top: -3px;">Test Case Content</h5>\r
+ <div v-show="contentLoading || contentSaving" class="sk-spinner sk-spinner-circle" style="float: left;margin-left: 10px;">\r
+ <div class="sk-circle1 sk-circle"></div>\r
+ <div class="sk-circle2 sk-circle"></div>\r
+ <div class="sk-circle3 sk-circle"></div>\r
+ <div class="sk-circle4 sk-circle"></div>\r
+ <div class="sk-circle5 sk-circle"></div>\r
+ <div class="sk-circle6 sk-circle"></div>\r
+ <div class="sk-circle7 sk-circle"></div>\r
+ <div class="sk-circle8 sk-circle"></div>\r
+ <div class="sk-circle9 sk-circle"></div>\r
+ <div class="sk-circle10 sk-circle"></div>\r
+ <div class="sk-circle11 sk-circle"></div>\r
+ <div class="sk-circle12 sk-circle"></div>\r
+ </div>\r
+ <div class="ibox-tools">\r
+ <button class="btn btn-info btn-sm my-button-sm" type="button" v-on:click="runTestcase()">Run</button>\r
+ <button class="btn btn-success btn-sm my-button-sm" type="button" v-on:click="setEditable()">Edit</button>\r
+ <button v-show="isEditable" class="btn btn-warning btn-sm my-button-sm" v-on:click="saveTestcase()" type="button">Save</button>\r
+ <button v-show="isEditable" class="btn btn-danger btn-sm my-button-sm" v-on:click="cancelEdit()" type="button">Cancel</button>\r
+ <a class="collapse-link">\r
+ <i class="fa fa-chevron-up"></i>\r
+ </a>\r
+ <a class="fullscreen-link">\r
+ <i class="fa fa-expand"></i>\r
+ </a>\r
+ </div>\r
+ </div>\r
+ <div class="ibox-content" style="max-height: 600px; overflow-y: auto; padding: 0; border: 1px solid #e7e7e7;">\r
+ <div style='text-align:center;'>\r
+ <textarea v-show='!isEditable' v-model="content" id="tc_content" style="white-space:nowrap; overflow:scroll;max-width:2400px; width: 100%;height: 100%;min-height: 500px;font-size:16px;border:none; vertical-align: middle; padding: 30px 0 20px 40px;">\r
+ </textarea>\r
+ </div><editor v-show='isEditable' v-bind:saveSignal='saveSignal' v-bind = 'editorContent' v-on:saveResponse='processSaveResponse'></editor>\r
+ </div>\r
+ </div>\r
+ </div>\r
+ </div>\r
+ <hr />\r
+ <div class="row">\r
+ <div class="col-lg-12">\r
+ <div class="ibox">\r
+ <div class="ibox-title">\r
+ <h5 style="font-size:26px;margin-top: -3px;">Workflow</h5>\r
+ <div class="ibox-tools">\r
+ <a class="collapse-link">\r
+ <i class="fa fa-chevron-up"></i>\r
+ </a>\r
+ <a class="fullscreen-link">\r
+ <i class="fa fa-expand"></i>\r
+ </a>\r
+ </div>\r
+ </div>\r
+ <div class="ibox-content" style="padding-top: 60px;">\r
+ <wfresult v-bind:workflowId="workflowId" v-bind:wfloading='wfloading' v-bind:wfJson='wfJson'></wfresult>\r
+ </div>\r
+ </div>\r
+ </div>\r
+ </div>\r
+ </div>\r
+</template>\r
+<script>\r
+import editor from './editor/editor.vue'\r
+import wfresult from './workflow_graph/wfresult.vue'\r
+import showMessage from './message/showMessage.js'\r
+export default {\r
+ name: 'testcase_content',\r
+ data () {\r
+ return {\r
+ content: '',\r
+ editorContent: {'stepList': [], 'mainOrdersList': [], 'subflowList': []},\r
+ bakContent: '',\r
+ isEditable: false,\r
+ contentLoading: false,\r
+ contentSaving: false,\r
+ suitename:this.$route.query.suiteName,\r
+ casename:this.$route.query.caseName,\r
+ workflowId: '',\r
+ wfloading: false,\r
+ wfJson: '',\r
+ saveSignal: false\r
+ }\r
+ },\r
+ created: function() {\r
+ this.getTestcase();\r
+ },\r
+ methods: {\r
+ setEditable: function(){\r
+ this.isEditable = true;\r
+ this.bakContent = this.content;\r
+ },\r
+ cancelEdit: function(){\r
+ this.content = this.bakContent;\r
+ this.isEditable = false;\r
+ },\r
+ saveTestcase: function(){\r
+ console.log("save");\r
+ this.saveSignal = true;\r
+ this.contentSaving = true;\r
+ },\r
+ runTestcase: function(){\r
+ var self = this;\r
+ var msgTitle = "RUN -- TESTCASE";\r
+ $.ajax({\r
+ url: this.global.SERVER_ADDR + "execute/testcase",\r
+ method: "POST",\r
+ data: {\r
+ "suiteName": this.$route.query.suiteName,\r
+ "caseName": this.$route.query.caseName\r
+ },\r
+ beforeSend: function(XHR) {\r
+ self.wfloading = true;\r
+ showMessage("info", msgTitle, "start to run <strong>" + self.$route.query.caseName + "</strong>");\r
+ },\r
+ success: function(data) {\r
+ if(data['code'] == 200) {\r
+ self.workflowId = data['result']['workflowId'];\r
+ showMessage(data['code'], msgTitle, "<strong>" + self.$route.query.caseName + "</strong> finished!");\r
+ $.ajax({\r
+ url: self.global.SERVER_ADDR + "story-content",\r
+ method: "GET",\r
+ data: {\r
+ "service": self.$route.query.suiteName,\r
+ "story": self.$route.query.caseName\r
+ },\r
+ success: function(data) {\r
+ if(data['code'] == 200) {\r
+ self.wfJson = data['result']['content'];\r
+ } else {\r
+ showMessage(data['code'], msgTitle, "workflow.json get failed!");\r
+ }\r
+ },\r
+ error: function(obj, status, msg) {\r
+ showMessage(status, msgTitle, msg);\r
+ }\r
+ });\r
+ } else {\r
+ self.wfloading = false;\r
+ showMessage(data['code'], msgTitle, "Failed to run <strong>" + self.$route.query.caseName + "</strong>", data['error']);\r
+ }\r
+ },\r
+ error: function(obj, status, msg) {\r
+ self.wfloading = false;\r
+ showMessage(status, msgTitle, "Failed to run <strong>" + self.$route.query.caseName + "</strong>", msg);\r
+ }\r
+ });\r
+ },\r
+ getTestcase: function(){\r
+ var self = this;\r
+ var msgTitle = "GET -- TESTCASE";\r
+ $.ajax({\r
+ url: this.global.SERVER_ADDR + "testcase/content",\r
+ method:"GET",\r
+ data:{\r
+ suiteName: this.$route.query.suiteName,\r
+ caseName: this.$route.query.caseName\r
+ },\r
+ beforeSend: function(XHR) {\r
+ self.contentLoading = true;\r
+ },\r
+ success:function (data) {\r
+ if(data['code'] == 200) {\r
+ self.content = data['result']['content'];\r
+ self.contentLoading = false;\r
+ self.editorContent = data['result']['editorContent'];\r
+ }\r
+ else {\r
+ showMessage("error", msgTitle, "fail to load testcase content!", data['error']);\r
+ self.contentLoading = false;\r
+ }\r
+ },\r
+ error: function (obj, status, msg) {\r
+ showMessage(status, msgTitle, "fail to load testcase content!", msg);\r
+ self.contentLoading = false;\r
+ }\r
+ });\r
+ },\r
+ async processSaveResponse(result) {\r
+ if(result == true) {\r
+ this.saveSignal = false;\r
+ this.isEditable = false;\r
+ this.contentSaving = false;\r
+ this.getTestcase();\r
+ } else {\r
+ this.saveSignal = false;\r
+ this.contentSaving = false;\r
+ }\r
+ }\r
+ },\r
+ components: {\r
+ editor,\r
+ wfresult\r
+ }\r
+}\r
+</script>
\ No newline at end of file