|
1 | 1 | <!DOCTYPE html> |
2 | | -<html> |
| 2 | +<html lang="en"> |
3 | 3 | <head> |
4 | | - <meta charset="utf-8"> |
5 | | - <title>Swagger UI</title> |
6 | | - <!-- Load the latest Swagger UI code and style from npm using unpkg.com --> |
7 | | - <script src="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/5.17.14/swagger-ui-bundle.min.js" integrity="sha512-7ihPQv5ibiTr0DW6onbl2MIKegdT6vjpPySyIb4Ftp68kER6Z7Yiub0tFoMmCHzZfQE9+M+KSjQndv6NhYxDgg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> |
8 | | - <script src="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/5.17.14/swagger-ui-standalone-preset.min.js" integrity="sha512-UrYi+60Ci3WWWcoDXbMmzpoi1xpERbwjPGij6wTh8fXl81qNdioNNHExr9ttnBebKF0ZbVnPlTPlw+zECUK1Xw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> |
9 | | - <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/5.17.14/swagger-ui.min.css" integrity="sha512-+9UD8YSD9GF7FzOH38L9S6y56aYNx3R4dYbOCgvTJ2ZHpJScsahNdaMQJU/8osUiz9FPu0YZ8wdKf4evUbsGSg==" crossorigin="anonymous" referrerpolicy="no-referrer" /> |
| 4 | + <meta charset="UTF-8"> |
| 5 | + <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| 6 | + <title>OAS Binder</title> |
| 7 | + <!-- Load the latest Swagger UI code and style --> |
| 8 | + <script src="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/5.18.2/swagger-ui-bundle.min.js" integrity="sha512-9tBcCofqWq+PelL6USpUB7OJrCaObfefi9ht9nVZuKt1XP7eHDs7NwVljLSLVtSsErax1Tz3pG3O82eeq546Rg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> |
| 9 | + <script src="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/5.18.2/swagger-ui-standalone-preset.min.js" integrity="sha512-RYT3vTu8lWSgdoB5zNck/WogIqUb/ap/ivTr6t2LeS+MwqxRQsnSHkHpJRKjnC4T2fH7OMTxxQoC3jh7KGd3HA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> |
| 10 | + <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/2.11.8/umd/popper.min.js" integrity="sha512-TPh2Oxlg1zp+kz3nFA0C5vVC6leG/6mm1z9+mA81MI5eaUVqasPLO8Cuk4gMF4gUfP5etR73rgU/8PNMsSesoQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> |
| 11 | + <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.3/js/bootstrap.min.js" integrity="sha512-ykZ1QQr0Jy/4ZkvKuqWn4iF3lqPZyij9iRv6sGqLRdTPkY69YX6+7wvVGmsdBbiIfN/8OdsI7HABjvEok6ZopQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> |
| 12 | + <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/5.18.2/swagger-ui.min.css" integrity="sha512-xRGj65XGEcpPTE7Cn6ujJWokpXVLxqLxdtNZ/n1w52+76XaCRO7UWKZl9yJHvzpk99A0EP6EW+opPcRwPDxwkA==" crossorigin="anonymous" referrerpolicy="no-referrer" /> |
10 | 13 | <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.3/css/bootstrap.min.css" integrity="sha512-jnSuA4Ss2PkkikSOLtYs8BlYIeeIK1h99ty4YfvRPAlzr377vr3CXDb7sb7eEEBYjDtcYj+AjBH3FLv5uSJuXg==" crossorigin="anonymous" referrerpolicy="no-referrer" /> |
11 | 14 |
|
12 | 15 | <style> |
13 | | - .toolbar { |
14 | | - margin: 20px 0; |
| 16 | + body { |
| 17 | + display: flex; |
| 18 | + height: 100vh; |
| 19 | + margin-top: 56px; |
| 20 | + } |
| 21 | + .sidebar { |
| 22 | + height: 100vh; |
| 23 | + max-width: 30%; |
| 24 | + flex: 0 0 400px; |
| 25 | + } |
| 26 | + .content { |
| 27 | + flex-grow: 1; |
| 28 | + padding: 15px; |
| 29 | + } |
| 30 | + .sidebar img { |
| 31 | + max-width: 100%; |
| 32 | + margin-bottom: 15px; |
| 33 | + } |
| 34 | + .navbar { |
| 35 | + position: fixed; |
| 36 | + top: 0; |
| 37 | + width: 100%; |
| 38 | + z-index: 1000; |
| 39 | + height: 56px; |
| 40 | + } |
| 41 | + .navbar-brand { |
| 42 | + position: absolute; |
| 43 | + left: 50%; |
| 44 | + transform: translateX(-50%); |
| 45 | + font-size: 1.5rem; |
| 46 | + font-weight: bold; |
| 47 | + } |
| 48 | + .navbar-nav { |
| 49 | + flex-grow: 0; |
| 50 | + } |
| 51 | + .sidebar-title { |
| 52 | + text-align: center; |
| 53 | + font-weight: bold; |
| 54 | + margin-bottom: 15px; |
| 55 | + font-size: 1.25rem; |
15 | 56 | } |
16 | 57 | </style> |
17 | 58 | </head> |
18 | 59 | <body> |
19 | | - <div class="container"> |
20 | | - <div class="toolbar"> |
21 | | - <div class="form-group"> |
22 | | - <label for="microservice-select" class="font-weight-bold">Select Microservice:</label> |
23 | | - <select id="microservice-select" class="form-control"> |
24 | | - <option value=""></option> |
25 | | - {{range .MicroserviceList}} |
26 | | - <option value="{{.Endpoint}}" {{if .Selected}}selected{{end}}>{{.Name}}</option> |
27 | | - {{end}} |
28 | | - </select> |
| 60 | + <nav class="navbar navbar-expand-lg navbar-light bg-light"> |
| 61 | + <a class="navbar-brand" href="#">OAS Binder</a> |
| 62 | + <div class="collapse navbar-collapse" id="navbarNav"> |
| 63 | + <ul class="navbar-nav ms-auto"> |
| 64 | + <li class="nav-item"> |
| 65 | + <button class="btn btn-warning" data-bs-toggle="modal" data-bs-target="#modal1">⚙</button> |
| 66 | + </li> |
| 67 | + <li class="nav-item"> |
| 68 | + <button class="btn btn-warning ms-2" data-bs-toggle="modal" data-bs-target="#modal2">❓</button> |
| 69 | + </li> |
| 70 | + </ul> |
| 71 | + </div> |
| 72 | + </nav> |
| 73 | + <div class="sidebar bg-light p-3"> |
| 74 | + <img src="https://cdnlogo.com/logos/o/44/openapi-wordmark.svg" alt=""> |
| 75 | + <div class="sidebar-title">Select Service</div> |
| 76 | + <ul class="nav flex-column"> |
| 77 | + {{range .MicroserviceList}} |
| 78 | + <li class="nav-item"> |
| 79 | + <button data-target="{{.Endpoint}}" class="btn {{if .Selected}}btn-primary {{else}} btn-outline-primary{{end}} mb-2">{{.Name}}</button> |
| 80 | + </li> |
| 81 | + {{end}} |
| 82 | + </ul> |
| 83 | + </div> |
| 84 | + <div class="content"> |
| 85 | + <div id="mainContent"> |
| 86 | + <div class="sidebar-title">{{ .Message }}</div> |
| 87 | + <div id="swagger-ui"></div> |
| 88 | + </div> |
| 89 | + </div> |
| 90 | + |
| 91 | + <!-- Modal structures --> |
| 92 | + <div class="modal fade" id="modal1" tabindex="-1" aria-labelledby="modal1Label" aria-hidden="true"> |
| 93 | + <div class="modal-dialog" role="document"> |
| 94 | + <div class="modal-content"> |
| 95 | + <div class="modal-header"> |
| 96 | + <h5 class="modal-title" id="modal1Label">OAS Binder configuration</h5> |
| 97 | + <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> |
| 98 | + </div> |
| 99 | + <div class="modal-body"> |
| 100 | + <pre> |
| 101 | + {{ .OASBinderConfiguration }} |
| 102 | + </pre> |
| 103 | + </div> |
| 104 | + <div class="modal-footer"> |
| 105 | + <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button> |
| 106 | + </div> |
29 | 107 | </div> |
30 | | - <div id="swagger-ui"></div> |
| 108 | + </div> |
31 | 109 | </div> |
| 110 | + |
| 111 | + <div class="modal fade" id="modal2" tabindex="-1" aria-labelledby="modal2Label" aria-hidden="true"> |
| 112 | + <div class="modal-dialog" role="document"> |
| 113 | + <div class="modal-content"> |
| 114 | + <div class="modal-header"> |
| 115 | + <h5 class="modal-title" id="modal2Label">About OAS Binder</h5> |
| 116 | + <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> |
| 117 | + </div> |
| 118 | + <div class="modal-body"> |
| 119 | + A tool to interact with OAS docs for multiple microservices |
| 120 | + <br /> |
| 121 | + URL: <a href="https://github.com/insightsengineering/oasbinder">https://github.com/insightsengineering/oasbinder</a> |
| 122 | + <br /> |
| 123 | + <pre> |
| 124 | + {{ .AboutOASBinder }} |
| 125 | + </pre> |
| 126 | + </div> |
| 127 | + <div class="modal-footer"> |
| 128 | + <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button> |
| 129 | + </div> |
| 130 | + </div> |
| 131 | + </div> |
| 132 | + </div> |
| 133 | + |
32 | 134 | <script> |
33 | | - document.getElementById('microservice-select').addEventListener('change', function() { |
34 | | - var newEndpoint = this.value; |
35 | | - if (newEndpoint !== "{{.SelectedService}}") { |
36 | | - window.location.href = newEndpoint; |
37 | | - } |
| 135 | + document.querySelectorAll('button[data-target]').forEach(button => { |
| 136 | + button.addEventListener('click', function () { |
| 137 | + const target = button.getAttribute('data-target'); |
| 138 | + window.location.href = `${window.location.origin}/${target}`; |
| 139 | + }); |
38 | 140 | }); |
| 141 | + |
| 142 | + window.onload = function() { |
| 143 | + if ({{ .DisplaySwaggerUI }}) { |
| 144 | + const ui = SwaggerUIBundle({ |
| 145 | + spec: JSON.parse({{.Spec}}), |
| 146 | + dom_id: "#swagger-ui", |
| 147 | + requestInterceptor: (req) => { |
| 148 | + req.url = req.url.replace({{.ProxyAddress}}, {{.Host}}); |
| 149 | + {{range $key, $value := .Headers}} |
| 150 | + req.headers["{{$key}}"] = "{{$value}}"; |
| 151 | + {{end}} |
| 152 | + return req; |
| 153 | + } |
| 154 | + }); |
| 155 | + } |
| 156 | + } |
| 157 | + </script> |
| 158 | +</body> |
| 159 | +</html> |
0 commit comments