source: trunk/zoo-project/zoo-services/utils/open-api/templates/index.html @ 965

Last change on this file since 965 was 965, checked in by djay, 20 months ago

Display inputs when not valid properly. Add element for list of values. Add required operationId and summary for every request, useful to validate the APIusing openapi-cli.

File size: 28.8 KB
Line 
1<!doctype html>
2#import zoo
3#import html,os
4#set removeCacheFile=False
5#set strUrl=$inputs["tmpl"]["xlink:href"]
6#set currentUrl=$strUrl.replace($openapi["openapi"]["rootUrl"],"")
7#if $currentUrl=="/"
8#set currentKey="root"
9#set $currentUrl="/index"
10#else
11#set currentKey=$currentUrl
12#end if
13#set urlCompnents=$currentUrl.split('/')
14#*
15* Load the JSON content from the API
16*#
17#try
18#import json
19#if "cache_file" in $inputs["tmpl"]
20#set values=json.load(open($inputs["tmpl"]["cache_file"]))
21#else
22#set values=$inputs["tmpl"]["value"]
23#end if
24#except Exception as e
25$e
26#end try
27<html lang="en">
28  <head>
29    <!-- Required meta tags -->
30    <meta charset="utf-8">
31    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
32
33    <!-- Bootstrap CSS -->
34    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
35
36    <!-- Custom styles for this template -->
37    <link href="$openapi["openapi"]["rootUrl"]/../static/openapi.css" rel="stylesheet">
38
39    <title>#if "id" in $values#$values["id"]#else##if $currentKey in $openapi and "title" in $openapi[$currentKey]#$openapi[$currentKey]["title"]#else#Landing Page#end if##end if#</title>
40  </head>
41  <body itemscope itemtype="https://schema.org/DataCatalog">
42    <header>
43     <!-- Fixed navbar -->
44      <nav
45        class="navbar navbar-expand-md navbar-dark fixed-top bg-dark"
46        itemprop="creator"
47        itemscope itemtype="https://schema.org/Organization" >
48        <a class="navbar-brand" href="#">
49          <img itemprop="logo" src="http://zoo-project.org/img/zoo-sun-logo.png" width="55" height="30" class="d-inline-block align-top" alt="">
50           <span itemprop="name">$conf["provider"]["providerName"]</span>
51        </a>
52        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">
53          <span class="navbar-toggler-icon"></span>
54        </button>
55        <div class="collapse navbar-collapse" id="navbarCollapse">
56          <ul class="navbar-nav mr-auto"
57            itemscope itemtype="https://schema.org/BreadcrumbList">
58            <li class="nav-item #if $currentKey=="root"# active#end if#"
59              itemprop="itemListElement" itemscope
60              itemtype="https://schema.org/ListItem">
61              <a itemprop="item" class="nav-link"
62                href="$openapi["openapi"]["rootUrl"]/index.html">
63                <span itemprop="name">Home #if $currentKey=="root"# <span class="sr-only">(current)</span>#end if#</span>
64                <meta itemprop="position" content="1" />
65              </a>
66            </li>
67            #if $currentKey!="root"
68            #for i in range(1,len($urlCompnents))
69            <li
70              itemprop="itemListElement" itemscope
71              itemtype="https://schema.org/ListItem"
72              class="nav-item #if $i+1==len($urlCompnents)#active#end if#">
73            #set prefix=""
74            #for j in range(1,$i)
75            #set $prefix+="/"+$urlCompnents[$j]
76            #end for
77              <a itemprop="item" class="nav-link" href="$openapi["openapi"]["rootUrl"]$(prefix)/$(urlCompnents[$i]).html">
78                <span itemprop="name">
79            #if $i==2
80            $(urlCompnents[$i])
81            #else
82            $(urlCompnents[$i].title())
83            #end if
84            #if $i+1==len($urlCompnents)
85            <span class="sr-only">(current)</span>
86            #end if
87                <meta itemprop="position" content="$(i+1)" />
88                </span>
89              </a>
90            </li>
91            #end for
92            #end if
93          </ul>
94        </div>
95       </nav>
96    </header>
97        <script>
98        var System={};
99        </script>
100
101#def printRel($o,$v)
102#if $v in $o
103$o[$v]
104#else
105View default (no title found for $v).
106#end if
107#end def
108#*
109       
110*#
111#def printControl(obj)
112#if "type" not in $obj
113#set oType="format"
114#else
115#set oType=$obj["type"]
116#end if
117        <div class="input-group">
118          <div class="input-group-prepend">
119            <div class="input-group-text">$obj["title"]</div>
120          </div>
121          #if "ph" in $obj 
122          <input type="text"
123            #if "value" in $obj#value="$obj["value"]""#end if#
124            #if "id" in $obj#data-id="$obj["id"]"#end if#
125            class="form-control" data-name="$obj["title"]" name="$(oType)_$obj["name"]" placeholder="$obj["ph"]" #if "required" in $obj#required#end if#/>
126          #else
127          <select name="$(oType)_$obj["name"]" class="form-control" #if "required" in $obj#required#end if#>
128          #for i in range(len($obj["options"]))
129            <option>$obj["options"][$i]</option>
130          #end for
131          </select>
132          #end if
133          #if "required" in $obj
134          <div class="invalid-feedback">
135            Please set a value for $obj["id"].
136          </div>
137          #end if
138        </div>
139#end def
140#def printCard(obj)
141      <div class="card" #if "attrs" in $obj#$obj["attrs"]#end if#>
142        <div class="card-header" id="heading$(obj["id"])">
143          <h4 class="mb-0">
144            <button class="btn btn-link btn-block text-left" type="button" data-toggle="collapse" data-target="#collapse$(obj["id"])" aria-expanded="true" aria-controls="collapse$(obj["id"])">
145              $obj["title"]
146            </button>
147          </h4>
148        </div>
149        <div id="collapse$(obj["id"])" class="collapse #if "class" in $obj#$obj["class"]#end if#" aria-labelledby="heading$(obj["id"])">
150          <div class="card-body">
151            $obj["content"]
152          </div>
153        </div>
154      </div>
155#end def
156#def printInputContent($obj)
157#set cName=$obj["id"].replace(".","_")
158#if "formats" in $obj["input"]
159 #set cFormats=[]
160  #for j in range(len($obj["input"]["formats"]))
161  #set $cFormats+=[$obj["input"]["formats"][$j]["mimeType"]]
162  #end for
163  $printControl({"title": "format","type": "input_format","name": $cName,"options":$cFormats})
164  #set largs={"id": $obj["id"],"title": "href","type": "input_value","name": $cName,"ph":"URL"}
165  #if $obj["minOccurs"]>0
166  #set $largs["required"]=True
167  #end if
168  $printControl($largs)
169#else
170 #if "literalDataDomains" in $obj["input"]
171  #set cDataDomain=$obj["input"]["literalDataDomains"][0]
172  #set largs={"id": $obj["id"],"title": $cDataDomain["dataType"]["name"],"type": "input_value", "name": $cName,}
173  #if $obj["minOccurs"]>0
174  #set $largs["required"]=True
175  #end if
176  #if "anyValue" in $cDataDomain["valueDefinition"]
177   #set $largs["ph"]="Value"
178      $printControl($largs)
179  #else
180   #if "allowedValues" in $cDataDomain["valueDefinition"]
181    #set $largs["options"]=$cDataDomain["valueDefinition"]["allowedValues"]
182    $printControl($largs)
183   #else
184    ELSE
185    $obj
186   #end if
187  #end if
188  #if "defaultValue" in $cDataDomain
189      <script>
190        System["function_$cName"]=function(){
191          try{
192            jQuery("input[name='input_value_$cName'],select[name='input_value_$cName]']").val($cDataDomain["defaultValue"]);
193          }catch(e){
194            jQuery("input[name='input_value_$cName'],select[name='input_value_$cName']").val("$cDataDomain["defaultValue"]");
195          }
196        }
197      </script>
198  #end if
199 #else
200  $obj
201  ELSE
202 #end if
203#end if
204#if $obj["maxOccurs"]>1
205        <div class="btn-group" role="group" aria-label="Basic example">
206          <button type="button" class="btn btn-secondary" onclick="addElementToList(\$(this));">Add</button>
207          <button type="button" class="btn btn-secondary" onclick="delElementToList(\$(this));">Delete</button>
208        </div>
209#end if
210#end def
211#def printProvider(conf)
212#set provider=$conf["provider"]
213      <b itemprop="name">$provider["providerName"]</b>
214      <p><a itemprop="url" href="$provider["providerSite"]">$provider["providerSite"]</a></p>
215#end def
216#def printContact(conf)
217#set provider=$conf["provider"]
218#set alt=$openapi["provider_alt"]
219#set elements=list($alt.keys())
220      <b>Address</b>
221      #for i in ["addressDeliveryPoint","addressCity","addressAdministrativeArea","addressPostalCode","addressCountry","addressElectronicMailAddress","phoneVoice","phoneFacsimile"]
222      #if i!="addressElectronicMailAddress" and $provider[$i]!="False"
223      <p itemprop="$(alt[$i.lower()])">
224      #if i=="phoneVoice"
225      Phone
226      <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-telephone" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
227        <path fill-rule="evenodd" d="M3.654 1.328a.678.678 0 0 0-1.015-.063L1.605 2.3c-.483.484-.661 1.169-.45 1.77a17.568 17.568 0 0 0 4.168 6.608 17.569 17.569 0 0 0 6.608 4.168c.601.211 1.286.033 1.77-.45l1.034-1.034a.678.678 0 0 0-.063-1.015l-2.307-1.794a.678.678 0 0 0-.58-.122l-2.19.547a1.745 1.745 0 0 1-1.657-.459L5.482 8.062a1.745 1.745 0 0 1-.46-1.657l.548-2.19a.678.678 0 0 0-.122-.58L3.654 1.328zM1.884.511a1.745 1.745 0 0 1 2.612.163L6.29 2.98c.329.423.445.974.315 1.494l-.547 2.19a.678.678 0 0 0 .178.643l2.457 2.457a.678.678 0 0 0 .644.178l2.189-.547a1.745 1.745 0 0 1 1.494.315l2.306 1.794c.829.645.905 1.87.163 2.611l-1.034 1.034c-.74.74-1.846 1.065-2.877.702a18.634 18.634 0 0 1-7.01-4.42 18.634 18.634 0 0 1-4.42-7.009c-.362-1.03-.037-2.137.703-2.877L1.885.511z"/>
228      </svg>
229      #end if
230      $provider[$i]
231      </p>
232      #else
233      #if i=="addressElectronicMailAddress"
234      <b>Email</b>
235      <p itemprop="$(alt[$i.lower()])">
236      $provider[$i]
237      </p>
238      #end if
239      #end if
240      #end for
241#end def     
242#def printIndentification(conf)
243#set provider=$conf["provider"]
244$printCard({"id": "provider","title": "Provider","content": $printProvider($conf),"class": "show"})
245$printCard({"id": "contact","title": "Contact","content": $printContact($conf),"class": "show","attrs":'itemprop="address" itemscope itemtype="https://schema.org/PostalAddress"'})
246#end def
247     
248#if $currentKey=="root"
249  <div class="container-fluid">
250  <div class="row">
251      <div class="col-sm-8">
252#end if
253        <!-- $currentUrl -->
254      <!-- Begin page content -->     
255      <main #if $currentKey!="root"#class="container-fluid"#end if#>
256        <h1 itemprop="name">#if "id" in $values#$values["id"]: #end if##if "title" in $values#$html.escape($values["title"])#else##if len($urlCompnents)==2#$currentUrl[1:].title()#else#$currentUrl[1:]#end if##end if#</h1>
257        #if "description" in $values#<p itemprop="description">$html.escape($values["description"])</p>#end if#
258        #if $currentKey=="root"
259        <div class="keywords">
260          #for i in $conf["identification"]["keywords"].split(',')
261          <button type="button"
262            class="btn btn-outline-info">$i</button>
263          #end for
264        </div>
265        License:
266        <a itemprop="license" href="$openapi["openapi"]["license_url"]">$openapi["openapi"]["license_name"]</a>
267        #end if
268    #if "inputs" in $values
269#set $cid="JOBSOCKET-"+$conf["lenv"]["usid"]
270        <form class="needs-validation" data-id="$cid" novalidate>
271    <h3>Inputs</h3>
272    <div class="accordion" id="accordionInputExample">
273      #for i in range(len(values["inputs"]))
274      #set cInput=$values["inputs"][$i]
275      #set cName=$cInput["id"].replace(".","_")
276      $printCard({"id": $cName, "title": $cInput["id"],"content":'<p>'+$cInput["description"]+'</p>'+$printInputContent($cInput)})
277      #end for   
278    </div>
279     
280    <h3>Outputs</h3>
281    <div class="accordion" id="accordionOutputExample">
282      #for i in range(len(values["outputs"]))
283      #set cOutput=$values["outputs"][$i]
284      #set cName=$cOutput["id"].replace(".","_")
285      #set cFormats=[]
286      #if "formats" in $cOutput["output"]
287      #for j in range(len($cOutput["output"]["formats"]))
288      #set cFormats+=[$cOutput["output"]["formats"][$j]["mimeType"]]
289      #end for
290      #end if
291      #set cTransmissions=[]
292      #for j in range(len($values["outputTransmission"]))
293      #set cTransmissions+=[$values["outputTransmission"][$j]]
294      #end for
295      #set cContent="<p>"+$cOutput["description"]+"</p>"
296      #if len(cFormats)>0
297      #set $cContent+=$printControl({"id": $cOutput["id"], "title": "format","type": "format","name": $cName,"options":$cFormats})
298      #end if
299      #if len(cTransmissions)>0
300      #set $cContent+=$printControl({"id": $cOutput["id"], "title": "transmission","type": "transmission","name": $cName,"options":$cTransmissions})
301      #end if
302      $printCard({"id": $cName+"_"+str($i),"title": $cOutput["id"],"content": $cContent})
303      #end for
304    </div>
305   
306    <h3>Execution options</h3>
307    <div class="accordion" id="accordionExampleExecutionMode">
308      #set cContent=""
309      #set cUrl=$openapi["openapi"]["publisherurl"]+cid+"&type="
310      #for a in ["successUri","inProgressUri","failedUri"]
311      #set $cContent+=$printControl({"title": $a,"type": "main_value","name": $a,"ph":"URL","value":$cUrl+$a.replace("Uri","")})
312      #end for
313      $printCard({"id":"ModeOne","title":"Subscribers","content": $cContent})
314      $printCard({"id":"ModeTwo","title":"Response","content": $printControl({"title":"format","type": "main_value","name": "format","options":["document","raw"]})})
315      $printCard({"id":"ModeThree","title":"Mode","content": $printControl({"title":"mode","type": "main_value","name": "mode","options":["async","sync"]})})
316    </div>
317    <button type="submit" class="btn btn-primary" >Submit</button>
318    </form>
319    <div class="modal" tabindex="-1" id="exampleModal">
320      <div class="modal-dialog modal-xl">
321        <div class="modal-content">
322          <div class="modal-header">
323            <h5 class="modal-title">Your request</h5>
324            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
325              <span aria-hidden="true">&times;</span>
326            </button>
327          </div>
328          <div class="modal-body">
329            <textarea name="modalText" class="form-control" style="min-height:300px"></textarea>
330            <pre id="result"></pre>
331            <div id="progress_details" style="display:none">
332              <p id="prgress_description"></p>
333              <div class="progress">
334                <div class="progress-bar progress-bar-striped progress-bar-animated" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%"></div>
335              </div>
336            </div>
337          </div>
338          <div class="modal-footer">
339            <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
340            <button type="button" class="btn btn-primary">Submit Job</button>
341          </div>
342        </div>
343      </div>
344    </div>
345    <script>
346      var socket;
347      function addElementToList(){
348        var lClosure=arguments[0];
349        var isOver=false;
350        var cnt=0;
351        lClosure.parent().parent().find("div").each(function(){
352          if(isOver) return;
353          if(\$(this).hasClass("btn-group")) isOver=true;
354          if(\$(this).hasClass("input-group")){
355            lClosure.parent().parent().append(\$(this)[0].outerHTML);
356            cnt++;
357          }
358        });
359        if(lClosure.parent().parent().find(".input-group").length>cnt)
360          lClosure.next().attr("disabled",false);
361        else
362          lClosure.next().attr("disabled",true);
363      }
364      function delElementToList(){
365        var lClosure=arguments[0];
366        var isOver=false;
367        var cnt=0;
368        lClosure.parent().parent().find("div").each(function(){
369          if(isOver) return;
370          if(\$(this).hasClass("btn-group")) isOver=true;
371          if(\$(this).hasClass("input-group")) cnt++;
372        });
373        if(lClosure.parent().parent().find(".input-group").length>cnt)
374        for(var i=0;i<cnt;i++)
375          lClosure.parent().parent().find(".input-group").last().remove();
376        if(lClosure.parent().parent().find(".input-group").length==cnt)
377          lClosure.attr("disabled",true);
378        else
379          lClosure.attr("disabled",false);
380      }
381     
382      function loadRequest(){
383        var requestObject={
384          "inputs":[],
385          "outputs":[],
386          "subscriber":{},
387          "mode": \$("select[name='main_value_mode']").val(),
388          "response": \$("select[name='main_value_format']").val()
389        }
390        for(var i=0;i < System["JSON_STR"]["inputs"].length;i++){
391          var cName=System["JSON_STR"]["inputs"][i]["id"].replace(".","_");
392          var selector="input[name='input_value_"+cName+"'],"+
393                       "select[name='input_value_"+cName+"']";
394          if(\$(selector).val()!=""){
395            \$(selector).each(function(){
396            var cInput={"id": System["JSON_STR"]["inputs"][i]["id"], "input": {}};
397            if(System["JSON_STR"]["inputs"][i]["input"]["formats"]){
398              var selector1="input[name='input_format_"+cName+"'],"+
399                "select[name='input_format_"+cName+"']";
400              console.log(\$(this).parent().prev().find("select").val());
401              cInput["input"]["format"]={
402                "mimeType": \$(this).parent().prev().find("select").val()
403              };
404              cInput["input"]["value"]={
405                "href": \$(this).val()
406              };
407            }
408            else{
409              if(System["JSON_STR"]["inputs"][i]["input"]["literalDataDomains"]){
410                console.log(System["JSON_STR"]["inputs"][i]["input"]["literalDataDomains"]);
411                cInput["input"]["dataType"]={
412                  "name": System["JSON_STR"]["inputs"][i]["input"]["literalDataDomains"][0]["dataType"]["name"]
413                };
414                cInput["input"]["value"]=\$(this).val();
415              }
416            }console.log(cInput);
417            requestObject["inputs"].push(cInput);
418            });
419          }
420        }
421        console.log(System["JSON_STR"]["outputs"]);
422        for(var i=0;i < System["JSON_STR"]["outputs"].length;i++){
423          var cOutput={"id": System["JSON_STR"]["outputs"][i]["id"]};
424          var cName=System["JSON_STR"]["outputs"][i]["id"].replace(/\./g,"_");
425          if(System["JSON_STR"]["outputs"][i]["output"]["formats"]){
426            var selector="select[name='format_"+cName+"']";
427            cOutput["format"]={
428              "mimeType": \$(selector).val()
429            };
430          }
431          else{
432            if(System["JSON_STR"]["outputs"][i]["output"]["literalDataDomains"]){
433              cOutput["dataType"]={
434                "name": System["JSON_STR"]["outputs"][i]["output"]["literalDataDomains"][0]["dataType"]["name"]
435              };
436            }
437          }
438          var selector1="select[name='transmission_"+cName+"']";
439          cOutput["transmissionMode"]=\$(selector1).val();
440          requestObject["outputs"].push(cOutput);
441        }
442        if(\$("input[name='main_value_successUri']").val()!="")
443          requestObject["subscriber"]["successUri"]=\$("input[name='main_value_successUri']").val();
444        if(\$("input[name='main_value_inProgressUri']").val()!="")
445          requestObject["subscriber"]["inProgressUri"]=\$("input[name='main_value_inProgressUri']").val();
446        if(\$("input[name='main_value_failedUri']").val()!="")
447          requestObject["subscriber"]["failedUri"]=\$("input[name='main_value_failedUri']").val();
448        \$(".modal").find("textarea").first().val(js_beautify(JSON.stringify(requestObject)));
449        \$("#exampleModal").modal('toggle');
450        \$('#result').html("");
451        \$("#exampleModal").find(".btn-primary").off('click');
452        \$("#exampleModal").find(".btn-primary").click(function(){
453          \$('#result').html("");
454          if(!socket && requestObject["mode"]!="sync")
455            socket = new WebSocket("$openapi["openapi"]["wsurl"]");
456          else
457              \$.ajax({
458                contentType: "application/json",
459                data: \$("textarea").val(),
460                type: "POST",
461                url: "$openapi["openapi"]["rootUrl"]$(currentUrl)/jobs",
462                success: function (msg) {
463                  console.log(msg);
464                  var cObj=msg;
465                  \$('#result').html(js_beautify(JSON.stringify(msg["outputs"])));
466                },
467                error: function(){
468                  console.log(arguments);
469                },
470              });
471          if(requestObject["mode"]=="sync"){
472           return;
473          }
474          socket.onopen = function () {
475            console.log('Connected!');
476            socket.send("SUB $cid");
477          };
478          socket.onmessage = function(event) {
479            console.log('MESSAGE: ' + event.data);
480            if(event.data=="1")
481              \$.ajax({
482                contentType: "application/json",
483                data: \$("textarea").val(),
484                type: "POST",
485                url: "$openapi["openapi"]["rootUrl"]$(currentUrl)/jobs",
486                success: function (msg) {
487                  console.log(msg);
488                },
489                error: function(){
490                  console.log(arguments);
491                },
492              });
493            else{
494              //progressBar
495              \$("#progress_details").show();
496              var cObj=JSON.parse(event.data);
497              if(cObj["jobID"]){
498                \$("#prgress_description").html(cObj["jobID"]+": "+cObj["message"]);
499                \$(".progress-bar").attr("aria-valuenow",cObj["progress"]);
500                \$(".progress-bar").css("width",cObj["progress"]+"%");
501              }else{
502                \$("#progress_details").hide();
503                if(cObj["outputs"])
504                  \$('#result').html(js_beautify(JSON.stringify(cObj["outputs"])));
505                else
506                  \$('#result').html(cObj["message"]);
507              }
508            }
509          };
510        });
511      }
512    </script>
513    #end if
514   
515    #try
516    #if "links" in $values
517    #for i in range(len($values["links"]))
518    #if $i%2==0   
519    <h2>$values["links"][$i]["title"]</h2>
520    <p>
521      <a href="$values["links"][$i]["href"]">$printRel($openapi["links_title"],$values["links"][$i]["rel"])</a>
522    </p>
523    #if $i+1<=len($values["links"]) and len($values["links"])>1 and not($values["links"][$i+1]["rel"]=="alternate" and $openapi["openapi"]["full_html_support"]=="true")
524    <p><a href="$values["links"][$i+1]["href"]">$printRel($openapi["links_title"],$values["links"][$i+1]["rel"])</a></p>
525    #end if
526    #end if
527    #end for
528    #end if
529    #except Exception as e
530    $e
531    #end try
532    #if "conformsTo" in $values
533    <ul>
534      #for i in range(len($values["conformsTo"]))
535      <li>
536      <a href="$values["conformsTo"][$i]">$values["conformsTo"][$i]</a>
537      </li>
538      #end for
539    </ul>
540    #end if
541    #if "jobs" in $urlCompnents
542    #set $removeCacheFile=True
543    #end if
544    #if hasattr($values, "__len__") and isinstance($values,list) and len($values)>0
545    <table class="table table-striped">
546      <thead>
547        <tr>
548          #if "jobs" not in $urlCompnents
549          #*
550          * Processes list
551          *#
552          <th scope="col">#</th>
553          <th scope="col">Title</th>
554          <th scope="col">Version</th>
555          #else
556          #*
557          * Jobs list
558          *#
559          <th scope="col">#</th>
560          <th scope="col">Message</th>
561          <th scope="col">Links</th>
562          #end if
563        </tr>
564      </thead>
565      <tbody>   
566        #for i in range(len($values))
567        <tr>
568          #if "jobs" not in $urlCompnents
569          #*
570          * Processes list
571          *#
572          <th scope="row">
573            <a href="$(values[$i]["links"][0]["href"][:-1]).html">
574              <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-link-45deg" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
575                <path d="M4.715 6.542L3.343 7.914a3 3 0 1 0 4.243 4.243l1.828-1.829A3 3 0 0 0 8.586 5.5L8 6.086a1.001 1.001 0 0 0-.154.199 2 2 0 0 1 .861 3.337L6.88 11.45a2 2 0 1 1-2.83-2.83l.793-.792a4.018 4.018 0 0 1-.128-1.287z"/>
576                <path d="M6.586 4.672A3 3 0 0 0 7.414 9.5l.775-.776a2 2 0 0 1-.896-3.346L9.12 3.55a2 2 0 0 1 2.83 2.83l-.793.792c.112.42.155.855.128 1.287l1.372-1.372a3 3 0 0 0-4.243-4.243L6.586 4.672z"/>
577              </svg>
578            $values[$i]["id"]
579            </a>
580          </th>
581          <td>$values[$i]["title"]</td>
582          <td>#if "version" in $values[$i]#$values[$i]["version"]#else#1.0.0#end if#</td>
583          #else
584          #*
585          * Jobs list
586          *#
587          #set cValue=$values[$i]["infos"]
588          <th scope="row">
589            #if "status" in $cValue and $cValue["status"]=="successful"
590            <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-check-circle-fill text-success" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
591              <path fill-rule="evenodd" d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zm-3.97-3.03a.75.75 0 0 0-1.08.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-.01-1.05z"/>
592            </svg>
593            #else
594            #if "status" in $cValue and $cValue["status"]=="failed"
595            <svg width="1.0625em" height="1em" viewBox="0 0 17 16" class="bi bi-exclamation-triangle-fill text-error" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
596              <path fill-rule="evenodd" d="M8.982 1.566a1.13 1.13 0 0 0-1.96 0L.165 13.233c-.457.778.091 1.767.98 1.767h13.713c.889 0 1.438-.99.98-1.767L8.982 1.566zM8 5a.905.905 0 0 0-.9.995l.35 3.507a.552.552 0 0 0 1.1 0l.35-3.507A.905.905 0 0 0 8 5zm.002 6a1 1 0 1 0 0 2 1 1 0 0 0 0-2z"/>
597            </svg>
598            #end if
599            #end if
600            $cValue["jobID"]
601          </th>
602          <td>$cValue["message"]</td>
603          <td>
604          <div class="dropdown">
605            <button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
606            Action
607            </button>
608            <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
609              #for j in range(len($cValue["links"]))
610              #set $cValueLink=$cValue["links"][$j]
611              #if $cValueLink["href"].count("result")==0
612              <a class="dropdown-item delete"
613                href="#"
614                data-value="$(cValueLink["href"])">Delete</a>
615              #end if
616              <a class="dropdown-item" href="$(cValueLink["href"]).html">$cValueLink["title"]</a>
617              #end for       
618            </div>
619          </div>
620          </td>
621          #end if
622        </tr>   
623        #end for
624      </tbody>
625    </table>
626    <script>
627    System["jobListDelete"]=function(){
628      \$(".delete").each(function(){
629        \$(this).off("click");
630        \$(this).click(function(){
631          console.log("OK");
632          \$.ajax({
633            url: \$(this).data("value"),
634            type: "DELETE",
635            success: function(){
636              console.log(arguments);
637            }
638          });
639        });
640      });
641    }
642    </script>
643    #end if
644
645      <div class="microlight">$json.dumps(values)</div>
646      <textarea class="form-control" style="height: 300px;"></textarea>
647      <script>
648      window.onload = function(){
649        var jsContent=\$(".microlight").html();
650        var tmpStr=js_beautify(jsContent);
651        \$("textarea").last().val(tmpStr);
652        \$(".microlight").remove();
653        for(var i in System){
654          System[i]();
655        }
656        System["JSON_STR"]=JSON.parse(tmpStr);
657        var forms = document.getElementsByClassName('needs-validation');
658        // Loop over them and prevent submission
659        var validation = Array.prototype.filter.call(forms, function(form) {
660          form.addEventListener('submit', function(event) {
661            event.preventDefault();
662            event.stopPropagation();
663            if (form.checkValidity() === false) {
664              event.preventDefault();
665              event.stopPropagation();
666              for(var i=0;i<System["JSON_STR"]["inputs"].length;i++){
667                var cName=System["JSON_STR"]["inputs"][i]["id"].replace(/\./g,"_");
668                var selector=
669                  'input[name="input_value_'+cName+'"]:invalid,'+
670                  'select[name="input_value_'+cName+'"]:invalid';
671                if(\$(selector).length>0){
672                  \$(selector).each(function(){
673                    if(!\$(this).parent().parent().parent().hasClass("show"))
674                      \$(this).parent().parent().parent().parent().find(".btn").first().click();
675                  });
676                }
677              }             
678            }else{
679              loadRequest();
680            }
681            form.classList.add('was-validated');
682          }, false);
683        });
684     
685      }
686      </script>
687      <hr>
688      <address>$openapi["openapi"]["rootUrl"]$(currentUrl).html</address>
689      <!-- hhmts start -->Last modified: Fri Oct 23 18:25:03 CEST 2020 <!-- hhmts end -->
690    </main>
691#if $currentKey=="root"
692    </div> 
693    <div class="col-sm-4"
694      itemprop="provider"
695      itemscope itemtype="https://schema.org/Organization">
696      $printIndentification($conf)
697    </div>
698   </div>
699  </div>
700#end if
701     
702
703    <footer class="footer" itemscope itemtype="https://schema.org/SoftwareApplication">
704      <div class="container-fluid">
705        <span class="text-muted">
706          Powered by
707          <a target="_blank" itemprop="url"
708            href="http://www.zoo-project.org/"><span itemprop="name">ZOO-Project</span></a>
709          <span itemprop="version">$zoo.VERSION</span>.
710          <meta itemprop="applicationCategory" content="WebService" />
711        #try
712        #set sysname=$os.uname()
713        #except Exception as e
714        #set sysname=["Unknown"]
715        #end try
716          <meta itemprop="operatingSystem" content="$sysname[0]" />
717        </span>
718      </div>
719    </footer>
720
721    <!-- JS, Popper.js, and jQuery -->
722    <script src="https://code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
723    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous"></script>
724    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js" integrity="sha384-B4gt1jrGC7Jh4AgTPSdUtOBvfO8shuf57BaghqFfPlYxofvL8/KUEfYiJOMMV+rV" crossorigin="anonymous"></script>
725    <script src="https://cdnjs.cloudflare.com/ajax/libs/js-beautify/1.13.0/beautify.min.js" integrity="sha512-84xqGKD+OW9ElGeIq5RkXhsKveQx+kAjahn9r7f/Vm9J0bDrwEabW3MQNgYdTzLBnwfrTGs0nuPx3pZxh6itNg==" crossorigin="anonymous"></script>
726  </body>
727</html>
728#if "cache_file" in $inputs["tmpl"] and $removeCacheFile
729<!-- REMOVED ! -->     
730#import os
731$(os.remove($inputs["tmpl"]["cache_file"]))
732#end if
Note: See TracBrowser for help on using the repository browser.

Search

ZOO Sponsors

http://www.zoo-project.org/trac/chrome/site/img/geolabs-logo.pnghttp://www.zoo-project.org/trac/chrome/site/img/neogeo-logo.png http://www.zoo-project.org/trac/chrome/site/img/apptech-logo.png http://www.zoo-project.org/trac/chrome/site/img/3liz-logo.png http://www.zoo-project.org/trac/chrome/site/img/gateway-logo.png

Become a sponsor !

Knowledge partners

http://www.zoo-project.org/trac/chrome/site/img/ocu-logo.png http://www.zoo-project.org/trac/chrome/site/img/gucas-logo.png http://www.zoo-project.org/trac/chrome/site/img/polimi-logo.png http://www.zoo-project.org/trac/chrome/site/img/fem-logo.png http://www.zoo-project.org/trac/chrome/site/img/supsi-logo.png http://www.zoo-project.org/trac/chrome/site/img/cumtb-logo.png

Become a knowledge partner

Related links

http://zoo-project.org/img/ogclogo.png http://zoo-project.org/img/osgeologo.png