skipped 7 lines 8 8 <form id="custom_request_form" class="row g-3"> 9 9 <div class="col-2"> 10 10 <label for="method" class="form-label">Method *</label> 11 - <input list = " methods " id="method" placeholder="GET" class="form-control " required> 12 - <datalist id="methods"> 11 + <select id="method" placeholder="GET" class="form-select " required> 13 12 <option value="GET">GET</option> 14 13 <option value="POST">POST</option> 15 14 <option value="PUT">PUT</option> skipped 1 lines 17 16 <option value="HEAD">HEAD</option> 18 17 <option value="DELETE">DELETE</option> 19 18 <option value="OPTIONS">OPTIONS</option> 20 - </datalist> 19 + </select> 21 20 </div> 22 21 <div class="col-2"> 23 22 <label for="request_type" class="form-label">Body type</label> 24 - <select id="request_type" class="form-select" aria - label = " Request body " > 23 + <select id="request_type" class="form-select"> 25 24 <option value="text">Text</option> 26 25 <option value="urlencoded">URL Encoded</option> 27 26 <option value="json">JSON</option> skipped 2 lines 30 29 </div> 31 30 <div class="col-2"> 32 31 <label for="access_token_id" class="form-label">Access token id *</label> 33 - <input type="text" id="access_token_id" name="access_token_id" class="form-control" required> 32 + <div class="input-group"> 33 + <input type="text" id="access_token_id" name="access_token_id" class="form-control" required> 34 + <button class="btn btn-outline-primary" type="button" data-bs-toggle="modal" data-bs-target="#access_token_modal" onclick="$('#access_token_modal_table').DataTable().ajax.reload(null, false)">Select...</button> 35 + </div> 34 36 </div> 35 37 <div class="col-3"></div> 36 38 <div class="col-3"> skipped 58 lines 95 97 </div> 96 98 </div> 97 99 </div> 98 - <!-- Modal --> 99 - <div class="modal fade" id="request_template_modal" tabindex="-1" aria-labelledby="request_template_modal_label" aria-hidden="true"> 100 - <div class="modal-dialog modal-xl"> 101 - <div class="modal-content"> 102 - <div class="modal-header"> 103 - <h1 class="modal-title fs-5" id="request_template_modal_label">Request Templates</h1> 104 - <div style="float: right"> 105 - <i class="fi fi-br-expand px-3" id="expand-icon" style="cursor: pointer; float: left; opacity: 0.5"></i> 106 - <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> 107 - </div> 108 - </div> 109 - <div class="modal-body"> 110 - <div id="dTable" class="box-body table-responsive" style="padding:20px;"> 111 - <table id="request_templates" class="display" style="width:100%"> 112 - <thead> 113 - <tr> 114 - <th></th> 115 - <th></th> 116 - <th></th> 117 - <th>ID</th> 118 - <th>Name</th> 119 - <th>Body type</th> 120 - <th>Method</th> 121 - <th>URI</th> 122 - </tr> 123 - </thead> 124 - </table> 125 - </div> 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 - <script type="text/javascript" class="init"> 134 - // Populate the request_templates table 135 - let myTable = new DataTable('#request_templates', { 136 - ajax: { 137 - url: '/api/list_request_templates', dataSrc: "" 138 - }, 139 - columns: [ 140 - { 141 - className: 'dt-control', 142 - orderable: false, 143 - data: null, 144 - defaultContent: '', 145 - 'width': '20px' 146 - }, 147 - { 148 - className: 'active-control', 149 - orderable: false, 150 - data: null, 151 - defaultContent: '<i class="fi fi-br-check" style="cursor: pointer"></i>', 152 - 'width': '20px' 153 - }, 154 - { 155 - className: 'delete-control', 156 - orderable: false, 157 - data: null, 158 - defaultContent: '<i class="fi fi-rr-trash" style="cursor: pointer"></i>', 159 - 'width': '20px' 160 - }, 161 - { data: 'id', 'width': '30px' }, 162 - { data: 'template_name', 'width': '150px' }, 163 - { data: 'request_type', 'width': '150px' }, 164 - { data: 'method', 'width': '100px' }, 165 - { data: 'uri'} 166 - ], 167 - order: [[3, 'desc']] 168 - }) 169 - 170 - myTable.on('click', 'td.dt-control', function (e) { 171 - let tr = e.target.closest('tr'); 172 - let row = myTable.row(tr); 173 - 174 - if (row.child.isShown()) { 175 - // This row is already open - close it 176 - row.child.hide(); 177 - } 178 - else { 179 - // Open this row 180 - row.child(format(row.data())).show(); 181 - } 182 - }); 183 - 184 - myTable.on('click', 'td.active-control', function (e) { 185 - let tr = e.target.closest('tr'); 186 - let row = myTable.row(tr); 187 - request_template_info = row.data(); 188 - $("#request_uri").val(request_template_info.uri); 189 - $("#method").val(request_template_info.method); 190 - $("#request_type").val(request_template_info.request_type); 191 - $("#body").val(request_template_info.body); 192 - $("#request_template_name").val(request_template_info.template_name); 193 - $('#header_fields').empty(); 194 - $('#variable_fields').empty(); 195 - for (var header_name in request_template_info.headers) { 196 - if (request_template_info.headers.hasOwnProperty(header_name)) { 197 - addHeaderRow(header_name, request_template_info.headers[header_name]); 198 - } 199 - } 200 - for (var variable_name in request_template_info.variables) { 201 - if (request_template_info.variables.hasOwnProperty(variable_name)) { 202 - addVariableRow(variable_name, request_template_info.variables[variable_name]); 203 - } 204 - } 205 - $('#request_template_modal').modal('hide'); 206 - }); 207 - 208 - myTable.on('click', 'td.delete-control', function (e) { 209 - let tr = e.target.closest('tr'); 210 - let row = myTable.row(tr); 211 - if (!confirm("Are you sure you want to delete request template '" + row.data().template_name + "'?")) { return } 212 - deleteRequestTemplate(row.data().id); 213 - }); 214 - 215 - function format(d) { 216 - var descList = $( 217 - '<dl>' + 218 - '<dt>Request Template:</dt>' + 219 - '</dl>'); 220 - var descDetails = $('<dd></dd>'); 221 - var preText = $('<pre></pre>'); 222 - preText.text(JSON.stringify(d, undefined, 4)); 223 - descDetails.append(preText); 224 - descList.append(descDetails); 225 - return descList 226 - } 227 - 228 - function deleteRequestTemplate(id) { 229 - let response = $.ajax({ 230 - type: "POST", 231 - async: false, 232 - url: "/api/delete_request_template", 233 - data: {"template_id": id} 234 - }); 235 - $('#request_templates').DataTable().ajax.reload(null, false); 236 - bootstrapToast("Delete Request Template", response.responseText) 237 - } 238 - </script> 239 100 <script> 240 101 function getHeaders() { 241 102 let headers = {}; skipped 47 lines 289 150 } else { 290 151 $("#response_body").text(responseJSON.response_text); 291 152 } 292 - }catch (e) { 153 + } catch (e) { 293 154 $("#response_body").text(responseJSON.response_text); 294 155 } 295 156 $("#response_status_code").text(responseJSON.response_status_code); skipped 78 lines 374 235 $("#response-card").on('click', 'i#copy-icon', function (e) { 375 236 copyToClipboard($("#response_body").text()); 376 237 }) 238 + </script> 377 239 378 - $("#request_template_modal").on('click', 'i#expand-icon', function (e) { 379 - $("#request_template_modal").find('.modal-dialog').toggleClass('modal-xl').toggleClass('modal-fullscreen') 380 - $("i#expand-icon").toggleClass('fi-br-expand').toggleClass('fi-br-compress') 240 + <!-- Request Template Modal --> 241 + <div class="modal fade" id="request_template_modal" tabindex="-1" aria-labelledby="request_template_modal_label" aria-hidden="true"> 242 + <div class="modal-dialog modal-xl"> 243 + <div class="modal-content"> 244 + <div class="modal-header"> 245 + <h1 class="modal-title fs-5" id="request_template_modal_label">Request Templates</h1> 246 + <div style="float: right"> 247 + <i class="fi fi-br-expand px-3" id="expand-icon" style="cursor: pointer; float: left; opacity: 0.5"></i> 248 + <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> 249 + </div> 250 + </div> 251 + <div class="modal-body"> 252 + <div id="dTable" class="box-body table-responsive" style="padding:20px;"> 253 + <table id="request_templates" class="display" style="width:100%"> 254 + <thead> 255 + <tr> 256 + <th></th> 257 + <th></th> 258 + <th></th> 259 + <th>ID</th> 260 + <th>Name</th> 261 + <th>Body type</th> 262 + <th>Method</th> 263 + <th>URI</th> 264 + </tr> 265 + </thead> 266 + </table> 267 + </div> 268 + </div> 269 + <div class="modal-footer"> 270 + <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button> 271 + </div> 272 + </div> 273 + </div> 274 + </div> 275 + <script type="text/javascript" class="init"> 276 + // Populate the request_templates table 277 + let myTable = new DataTable('#request_templates', { 278 + ajax: { 279 + url: '/api/list_request_templates', dataSrc: "" 280 + }, 281 + columns: [ 282 + { 283 + className: 'dt-control', 284 + orderable: false, 285 + data: null, 286 + defaultContent: '', 287 + 'width': '20px' 288 + }, 289 + { 290 + className: 'active-control', 291 + orderable: false, 292 + data: null, 293 + defaultContent: '<i class="fi fi-br-check" style="cursor: pointer"></i>', 294 + 'width': '20px' 295 + }, 296 + { 297 + className: 'delete-control', 298 + orderable: false, 299 + data: null, 300 + defaultContent: '<i class="fi fi-rr-trash" style="cursor: pointer"></i>', 301 + 'width': '20px' 302 + }, 303 + { data: 'id', 'width': '30px' }, 304 + { data: 'template_name', 'width': '150px' }, 305 + { data: 'request_type', 'width': '130px' }, 306 + { data: 'method', 'width': '80px' }, 307 + { data: 'uri' } 308 + ], 309 + order: [[3, 'desc']], 310 + autoWidth: false 381 311 }) 382 312 313 + myTable.on('click', 'td.dt-control', function (e) { 314 + let tr = e.target.closest('tr'); 315 + let row = myTable.row(tr); 316 + 317 + if (row.child.isShown()) { 318 + // This row is already open - close it 319 + row.child.hide(); 320 + } 321 + else { 322 + // Open this row 323 + row.child(formatRequestTemplate(row.data())).show(); 324 + } 325 + }); 326 + 327 + myTable.on('click', 'td.active-control', function (e) { 328 + let tr = e.target.closest('tr'); 329 + let row = myTable.row(tr); 330 + request_template_info = row.data(); 331 + $("#request_uri").val(request_template_info.uri); 332 + $("#method").val(request_template_info.method); 333 + $("#request_type").val(request_template_info.request_type); 334 + $("#body").val(request_template_info.body); 335 + $("#request_template_name").val(request_template_info.template_name); 336 + $('#header_fields').empty(); 337 + $('#variable_fields').empty(); 338 + for (var header_name in request_template_info.headers) { 339 + if (request_template_info.headers.hasOwnProperty(header_name)) { 340 + addHeaderRow(header_name, request_template_info.headers[header_name]); 341 + } 342 + } 343 + for (var variable_name in request_template_info.variables) { 344 + if (request_template_info.variables.hasOwnProperty(variable_name)) { 345 + addVariableRow(variable_name, request_template_info.variables[variable_name]); 346 + } 347 + } 348 + $('#request_template_modal').modal('hide'); 349 + }); 350 + 351 + myTable.on('click', 'td.delete-control', function (e) { 352 + let tr = e.target.closest('tr'); 353 + let row = myTable.row(tr); 354 + if (!confirm("Are you sure you want to delete request template '" + row.data().template_name + "'?")) { return } 355 + deleteRequestTemplate(row.data().id); 356 + }); 357 + 358 + function formatRequestTemplate(d) { 359 + var descList = $( 360 + '<dl>' + 361 + '<dt>Request Template:</dt>' + 362 + '</dl>'); 363 + var descDetails = $('<dd></dd>'); 364 + var preText = $('<pre></pre>'); 365 + preText.text(JSON.stringify(d, undefined, 4)); 366 + descDetails.append(preText); 367 + descList.append(descDetails); 368 + return descList 369 + } 370 + 371 + function deleteRequestTemplate(id) { 372 + let response = $.ajax({ 373 + type: "POST", 374 + async: false, 375 + url: "/api/delete_request_template", 376 + data: { "template_id": id } 377 + }); 378 + $('#request_templates').DataTable().ajax.reload(null, false); 379 + bootstrapToast("Delete Request Template", response.responseText) 380 + } 381 + 382 + $("#request_template_modal").on('click', 'i#expand-icon', function (e) { 383 + $("#request_template_modal .modal-dialog").toggleClass('modal-xl').toggleClass('modal-fullscreen') 384 + $("#request_template_modal i#expand-icon").toggleClass('fi-br-expand').toggleClass('fi-br-compress') 385 + }) 383 386 </script> 387 + 384 388 {%endblock content%} 385 389