Merge "Add test-scheduler dir to verity"
[bottlenecks.git] / testing-scheduler / ui / src / components / testcase_content.vue
1 <template>\r
2   <div class="wrapper wrapper-content animated fadeIn">\r
3     <div class="row" style="margin-bottom: 20px;">\r
4       <div class="col-md-8">\r
5         <ol class="breadcrumb" style="padding-left: 20px; font-size: 17px;">\r
6           <li>\r
7             <router-link to="/" >root</router-link>\r
8           </li>\r
9           <li>\r
10             <router-link :to="{ path: '/testcase', query: { name: suitename }}" >{{this.$route.query.suiteName}}</router-link>\r
11           </li>\r
12           <li>\r
13             <router-link :to="{ path: '/content', query: { suiteName: suitename, caseName: casename } }"><b>{{this.$route.query.caseName}}</b></router-link>\r
14           </li>\r
15         </ol>\r
16       </div>\r
17     </div>\r
18     <div id="page-content" class="row">\r
19       <div class="col-lg-12">\r
20         <div class="ibox">\r
21             <div class="ibox-title">\r
22                 <h5 style="font-size:26px;margin-top: -3px;">Test Case Content</h5>\r
23                 <div v-show="contentLoading || contentSaving" class="sk-spinner sk-spinner-circle" style="float: left;margin-left: 10px;">\r
24                     <div class="sk-circle1 sk-circle"></div>\r
25                     <div class="sk-circle2 sk-circle"></div>\r
26                     <div class="sk-circle3 sk-circle"></div>\r
27                     <div class="sk-circle4 sk-circle"></div>\r
28                     <div class="sk-circle5 sk-circle"></div>\r
29                     <div class="sk-circle6 sk-circle"></div>\r
30                     <div class="sk-circle7 sk-circle"></div>\r
31                     <div class="sk-circle8 sk-circle"></div>\r
32                     <div class="sk-circle9 sk-circle"></div>\r
33                     <div class="sk-circle10 sk-circle"></div>\r
34                     <div class="sk-circle11 sk-circle"></div>\r
35                     <div class="sk-circle12 sk-circle"></div>\r
36                 </div>\r
37                 <div class="ibox-tools">\r
38                     <button class="btn btn-info btn-sm my-button-sm" type="button" v-on:click="runTestcase()">Run</button>\r
39                     <button class="btn btn-success btn-sm my-button-sm" type="button" v-on:click="setEditable()">Edit</button>\r
40                     <button v-show="isEditable" class="btn btn-warning btn-sm my-button-sm" v-on:click="saveTestcase()" type="button">Save</button>\r
41                     <button v-show="isEditable" class="btn btn-danger btn-sm my-button-sm" v-on:click="cancelEdit()" type="button">Cancel</button>\r
42                     <a class="collapse-link">\r
43                         <i class="fa fa-chevron-up"></i>\r
44                     </a>\r
45                     <a class="fullscreen-link">\r
46                         <i class="fa fa-expand"></i>\r
47                     </a>\r
48                 </div>\r
49             </div>\r
50             <div class="ibox-content" style="max-height: 600px; overflow-y: auto; padding: 0; border: 1px solid #e7e7e7;">\r
51                 <div style='text-align:center;'>\r
52                   <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
53                   </textarea>\r
54                 </div><editor v-show='isEditable' v-bind:saveSignal='saveSignal' v-bind = 'editorContent' v-on:saveResponse='processSaveResponse'></editor>\r
55             </div>\r
56         </div>\r
57       </div>\r
58     </div>\r
59     <hr />\r
60     <div class="row">\r
61       <div class="col-lg-12">\r
62           <div class="ibox">\r
63               <div class="ibox-title">\r
64                   <h5 style="font-size:26px;margin-top: -3px;">Workflow</h5>\r
65                   <div class="ibox-tools">\r
66                       <a class="collapse-link">\r
67                           <i class="fa fa-chevron-up"></i>\r
68                       </a>\r
69                       <a class="fullscreen-link">\r
70                           <i class="fa fa-expand"></i>\r
71                       </a>\r
72                   </div>\r
73               </div>\r
74               <div class="ibox-content" style="padding-top: 60px;">\r
75                   <wfresult v-bind:workflowId="workflowId" v-bind:wfloading='wfloading' v-bind:wfJson='wfJson'></wfresult>\r
76               </div>\r
77           </div>\r
78       </div>\r
79     </div>\r
80   </div>\r
81 </template>\r
82 <script>\r
83 import editor from './editor/editor.vue'\r
84 import wfresult from './workflow_graph/wfresult.vue'\r
85 import showMessage from './message/showMessage.js'\r
86 export default {\r
87     name: 'testcase_content',\r
88     data () {\r
89       return {\r
90           content: '',\r
91           editorContent: {'stepList': [], 'mainOrdersList': [], 'subflowList': []},\r
92           bakContent: '',\r
93           isEditable: false,\r
94           contentLoading: false,\r
95           contentSaving: false,\r
96           suitename:this.$route.query.suiteName,\r
97           casename:this.$route.query.caseName,\r
98           workflowId: '',\r
99           wfloading: false,\r
100           wfJson: '',\r
101           saveSignal: false\r
102       }\r
103     },\r
104     created: function() {\r
105         this.getTestcase();\r
106     },\r
107     methods: {\r
108       setEditable: function(){\r
109           this.isEditable = true;\r
110           this.bakContent = this.content;\r
111       },\r
112       cancelEdit: function(){\r
113           this.content = this.bakContent;\r
114           this.isEditable = false;\r
115       },\r
116       saveTestcase: function(){\r
117           console.log("save");\r
118           this.saveSignal = true;\r
119           this.contentSaving = true;\r
120       },\r
121       runTestcase: function(){\r
122         var self = this;\r
123         var msgTitle = "RUN -- TESTCASE";\r
124         $.ajax({\r
125             url: this.global.SERVER_ADDR + "execute/testcase",\r
126             method: "POST",\r
127             data: {\r
128                 "suiteName": this.$route.query.suiteName,\r
129                 "caseName": this.$route.query.caseName\r
130             },\r
131             beforeSend: function(XHR) {\r
132                 self.wfloading = true;\r
133                 showMessage("info", msgTitle, "start to run <strong>" + self.$route.query.caseName + "</strong>");\r
134             },\r
135             success: function(data) {\r
136                 if(data['code'] == 200) {\r
137                     self.workflowId = data['result']['workflowId'];\r
138                     showMessage(data['code'], msgTitle, "<strong>" + self.$route.query.caseName + "</strong> finished!");\r
139                     $.ajax({\r
140                         url: self.global.SERVER_ADDR + "story-content",\r
141                         method: "GET",\r
142                         data: {\r
143                             "service":  self.$route.query.suiteName,\r
144                             "story": self.$route.query.caseName\r
145                         },\r
146                         success: function(data) {\r
147                             if(data['code'] == 200) {\r
148                                 self.wfJson = data['result']['content'];\r
149                             } else {\r
150                               showMessage(data['code'], msgTitle, "workflow.json get failed!");\r
151                             }\r
152                         },\r
153                         error: function(obj, status, msg) {\r
154                           showMessage(status, msgTitle, msg);\r
155                         }\r
156                     });\r
157                 } else {\r
158                   self.wfloading = false;\r
159                   showMessage(data['code'], msgTitle, "Failed to run <strong>" + self.$route.query.caseName + "</strong>", data['error']);\r
160                 }\r
161             },\r
162             error: function(obj, status, msg) {\r
163                 self.wfloading = false;\r
164                 showMessage(status, msgTitle, "Failed to run <strong>" + self.$route.query.caseName + "</strong>", msg);\r
165             }\r
166         });\r
167       },\r
168       getTestcase: function(){\r
169           var self = this;\r
170           var msgTitle = "GET -- TESTCASE";\r
171           $.ajax({\r
172             url: this.global.SERVER_ADDR + "testcase/content",\r
173             method:"GET",\r
174             data:{\r
175               suiteName:  this.$route.query.suiteName,\r
176               caseName: this.$route.query.caseName\r
177             },\r
178             beforeSend: function(XHR) {\r
179                 self.contentLoading = true;\r
180             },\r
181             success:function (data) {\r
182               if(data['code'] == 200) {\r
183                 self.content = data['result']['content'];\r
184                 self.contentLoading = false;\r
185                 self.editorContent = data['result']['editorContent'];\r
186               }\r
187               else {\r
188                 showMessage("error", msgTitle, "fail to load testcase content!", data['error']);\r
189                 self.contentLoading = false;\r
190               }\r
191             },\r
192             error: function (obj, status, msg) {\r
193               showMessage(status, msgTitle, "fail to load testcase content!", msg);\r
194               self.contentLoading = false;\r
195             }\r
196           });\r
197       },\r
198       async processSaveResponse(result) {\r
199           if(result == true) {\r
200             this.saveSignal = false;\r
201             this.isEditable = false;\r
202             this.contentSaving = false;\r
203             this.getTestcase();\r
204           } else {\r
205             this.saveSignal = false;\r
206             this.contentSaving = false;\r
207           }\r
208       }\r
209     },\r
210     components: {\r
211       editor,\r
212       wfresult\r
213     }\r
214 }\r
215 </script>