Merge "Add test-scheduler dir to verity"
[bottlenecks.git] / test-scheduler / ui / src / components / env_component / service_api.vue
1 <template>
2     <div class="panel panel-success">
3             <div class="panel-heading">
4                 <button type="button" class="btn btn-xs btn-danger pull-right" v-on:click="deleteApi(name)">Delete</button>
5                 <h5 class="panel-title">
6                     <a data-toggle="collapse" data-parent="panelParent" v-bind:href="'#' + name + '-collapse'" style="display:block;">{{ name }}</a>
7                 </h5>
8             </div>
9             <div  v-bind:id="name + '-collapse'" class="panel-collapse collapse fade">
10                 <div class="panel-body">
11                     <base-input name="name" v-model="name"></base-input>
12                     <base-input name="method" v-model="method"></base-input>
13                     <base-input name="baseuri" v-model="baseuri"></base-input>
14                     <api-param v-bind:params="params"></api-param>
15                     <div class="form-group" v-bind:class="{  'has-error': jsonSyntaxError}">
16                         <label class="col-lg-3 control-label" id="templateLabel">
17                             Template <i class="fa fa-question-circle"></i>
18                         </label>
19                         <div class="col-lg-7">
20                             <!-- help text -->
21                             <span id="tempHelp">Json格式文本,用于定义发送http请求的报文内容。示例如下:<br>( 其中 ((&lt;variable&gt;)) 为占位符,用于替换实际值 )<br>GET方式:<br>{<br> &nbsp;"uri" : "((baseuri))?name=((name))"<br>}<br>POST方式:<br>{<br> &nbsp;"uri" : "((baseuri))",<br> &nbsp;"body" : {<br>&nbsp;&nbsp;&nbsp;"name" : "((name))",<br>&nbsp;&nbsp;&nbsp;"account" : {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"id" : "((user_name))",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"addr" : "SH"<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;}<br>}</span>
22                             <textarea class="form-control" style="min-height: 200px;" v-model="templateStr"></textarea>
23                             <span class="help-block" v-show="jsonSyntaxError">Json语法错误,请检查!</span>
24                         </div>
25                     </div>
26                 </div>
27             </div>
28         </div>
29 </template>
30 <script>
31 import base_input from "./base_input.vue"
32 import api_param from "./api_param.vue"
33 import Vue from "vue"
34 export default {
35     props: ['panelParent', 'name', 'method', 'baseuri', 'params', 'template'],
36     watch: {
37         name: function(val) {
38             this.$emit("name", val);
39         },
40         method: function(val) {
41             this.$emit("method", val);
42         },
43         baseuri: function(val) {
44             this.$emit("baseuri", val);
45         },
46         params: function(val) {
47             this.$emit("params", val);
48         },
49         templateStr: function(val) {
50             try {
51                 console.log(JSON.parse(val));
52                 this.jsonSyntaxError = false;
53                 this.$emit("template", JSON.parse(val));
54             } catch(err) {
55                 console.log("catch the exception templateStr");
56                 this.jsonSyntaxError = true;
57             }
58         }
59     },
60     components: {
61         'base-input': base_input,
62         'api-param': api_param
63     },
64     data: function() {
65         return {
66             jsonSyntaxError: false,
67             templateStr: JSON.stringify(this.template, null, 2)
68         };
69     },
70     methods: {
71         deleteApi: function(apiName) {
72             this.$emit("delete", apiName);
73         }
74     }
75 }
76 </script>
77 <style scoped>
78 #templateLabel:hover+div #tempHelp{
79     display: block;
80 }
81 #tempHelp {
82     display: none;
83     position: absolute;
84     width: 90%;
85     min-height: 150px;
86     background-color: #ab2d2d;
87     color: white;
88     transition: display 1s;
89     text-align: left;
90     padding: 10px 16px;
91     z-index: 2;
92     font-size: 10px;
93     opacity: 0.9;
94 }
95 #tempHelp::after {
96     content: '';
97     position: absolute;
98     bottom: 92%;
99     right: 100%;
100     margin-left: -5px;
101     border-width: 5px;
102     border-style: solid;
103     border-color: transparent #ab2d2d transparent transparent;
104 }
105 @media(max-width:1200px) {
106     #tempHelp::after {
107         bottom: 100%;
108         left: 5%;
109         border-color: transparent transparent #ab2d2d transparent;
110     }
111 }
112 </style>