Bump bootstrap version (#2128)

* Bump bootstrap version

* Add changelog

* Resolve fixme

* Rmove test code
This commit is contained in:
James Agnew 2020-10-12 20:47:14 -04:00 committed by GitHub
parent 7d150858dc
commit aa3da9b05f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 599 additions and 572 deletions

View File

@ -0,0 +1,6 @@
---
type: change
issue: 2128
title: "The version of Bootstrap used by the Testpage Overlay project has been upgraded from
**3.4.0** to **4.5.2**. Note that this is a major release upgrade, so any overlay implementations
may require some modification to deal with changes to the Bootstrap framework."

View File

@ -144,7 +144,7 @@
<!-- WebJars -->
<dependency>
<groupId>org.webjars</groupId>
<groupId>org.webjars.npm</groupId>
<artifactId>bootstrap</artifactId>
</dependency>
<dependency>
@ -175,6 +175,10 @@
<groupId>org.webjars.bower</groupId>
<artifactId>moment</artifactId>
</dependency>
<dependency>
<groupId>org.webjars.npm</groupId>
<artifactId>popper.js</artifactId>
</dependency>
<dependency>

View File

@ -668,7 +668,6 @@ public class BaseController {
Header[] requestHeaders = lastRequest != null ? applyHeaderFilters(lastRequest.getAllHeaders()) : new Header[0];
Header[] responseHeaders = lastResponse != null ? applyHeaderFilters(lastResponse.getAllHeaders()) : new Header[0];
theModelMap.put("outcomeDescription", outcomeDescription);
theModelMap.put("resultDescription", resultDescription.toString());
theModelMap.put("action", action);
theModelMap.put("ri", riBundle instanceof IAnyResource);

View File

@ -20,7 +20,7 @@ public class FhirTesterMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry theRegistry) {
WebUtil.webJarAddBoostrap3(theRegistry);
WebUtil.webJarAddBoostrap(theRegistry);
WebUtil.webJarAddJQuery(theRegistry);
WebUtil.webJarAddFontAwesome(theRegistry);
WebUtil.webJarAddJSTZ(theRegistry);
@ -28,6 +28,7 @@ public class FhirTesterMvcConfig extends WebMvcConfigurerAdapter {
WebUtil.webJarAddMomentJS(theRegistry);
WebUtil.webJarAddSelect2(theRegistry);
WebUtil.webJarAddAwesomeCheckbox(theRegistry);
WebUtil.webJarAddPopperJs(theRegistry);
theRegistry.addResourceHandler("/css/**").addResourceLocations("/css/");
theRegistry.addResourceHandler("/fa/**").addResourceLocations("/fa/");
@ -43,6 +44,7 @@ public class FhirTesterMvcConfig extends WebMvcConfigurerAdapter {
resolver.setSuffix(".html");
resolver.setTemplateMode(TemplateMode.HTML);
resolver.setCharacterEncoding("UTF-8");
return resolver;
}

View File

@ -20,7 +20,7 @@ import java.util.Properties;
public class WebUtil {
public static final String BOOTSTRAP_ID = "bootstrap";
public static final String BOOTSTRAP3_PKG = "org.webjars";
public static final String BOOTSTRAP_PKG = "org.webjars.npm";
public static final String JQUERY_ID = "jquery";
public static final String JQUERY_PKG = "org.webjars.bower";
@ -48,8 +48,8 @@ public class WebUtil {
WebUtil.addStaticResourceWebJar(theRegistry, "org.webjars.bower", "awesome-bootstrap-checkbox");
}
public static void webJarAddBoostrap3(ResourceHandlerRegistry theRegistry) {
WebUtil.addStaticResourceWebJar(theRegistry, BOOTSTRAP3_PKG, BOOTSTRAP_ID);
public static void webJarAddBoostrap(ResourceHandlerRegistry theRegistry) {
WebUtil.addStaticResourceWebJar(theRegistry, BOOTSTRAP_PKG, BOOTSTRAP_ID);
}
public static void webJarAddEonasdanBootstrapDatetimepicker(ResourceHandlerRegistry theRegistry) {
@ -76,4 +76,8 @@ public class WebUtil {
WebUtil.addStaticResourceWebJar(theRegistry, "org.webjars", "select2");
}
public static void webJarAddPopperJs(ResourceHandlerRegistry theRegistry) {
WebUtil.addStaticResourceWebJar(theRegistry, "org.webjars.npm", "popper.js");
}
}

View File

@ -1,5 +1,5 @@
<!DOCTYPE html>
<html lang="en">
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<title th:include="window-title :: home" />
<th:block th:include="tmpl-head :: head" />
@ -66,10 +66,12 @@
<!-- Conformance -->
<div class="row-fluid">
Retrieve the server's <b>conformance</b> statement.
<div class="row">
<div class="col-12">
Retrieve the server's <b>conformance</b> statement.
</div>
</div>
<div class="row-fluid">
<div class="row">
<div class="col-sm-3 form-group">
<a type="button" id="fetch-conformance-btn"
class="btn btn-primary btn-block">
@ -89,14 +91,15 @@
<!-- Server History -->
<br clear="all"/>
<div class="row-fluid">
Retrieve the update <b>history</b> across all resource types on
the server.
<div class="row">
<div class="col-12">
Retrieve the update <b>history</b> across all resource types on
the server.
</div>
</div>
<div class="row-fluid top-buffer">
<div class="row top-buffer">
<div class="col-sm-3">
<button type="button" id="server-history-btn"
class="btn btn-primary btn-block">
<button type="button" id="server-history-btn" class="btn btn-primary btn-block">
<i class="far fa-calendar-alt"></i>
History
</button>
@ -104,12 +107,16 @@
<div class='col-sm-5'>
<div class="form-group">
<div class='input-group date' id='server-history-datetime' data-date-format="YYYY-MM-DDTHH:mm:ss">
<div class="input-group-addon">
Since
<div class="input-group-prepend">
<span class="input-group-text">
Since
</span>
</div>
<input type='text' class="form-control" id="server-history-since"/>
<div class="input-group-addon">
<span class="glyphicon glyphicon-calendar"></span>
<div class="input-group-append input-group-addon"> <!-- input-group-addon is from Bootstrap3 but the time picker needs it there -->
<span class="input-group-text">
<i class="far fa-calendar-alt"></i>
</span>
</div>
</div>
</div>
@ -117,8 +124,10 @@
<div class='col-sm-3'>
<div class="form-group">
<div class='input-group'>
<div class="input-group-addon">
Limit #
<div class="input-group-prepend">
<span class="input-group-text">
Limit #
</span>
</div>
<input type="text" class="form-control" id="server-history-limit" placeholder="(opt)"/>
</div>
@ -149,11 +158,13 @@
<!-- Transaction -->
<br clear="all"/>
<div class="row-fluid">
Post a bundle containing multiple resources to the server and
store all resources within a single atomic transaction.
<div class="row">
<div class="col-12">
Post a bundle containing multiple resources to the server and
store all resources within a single atomic transaction.
</div>
</div>
<div class="row-fluid">
<div class="row">
<div class="col-sm-3">
<button type="button" id="transaction-btn" class="btn btn-primary btn-block">
<i class="fas fa-file-archive"></i>
@ -163,9 +174,11 @@
<div class='col-sm-9'>
<div class="form-group">
<div class='input-group'>
<div class="input-group-addon">
Bundle
<span class="loadingStar">*</span>
<div class="input-group-prepend">
<span class="input-group-text">
Bundle
<span class="loadingStar">*</span>
</span>
</div>
<textarea class="form-control" id="transaction-body" style="white-space: nowrap; overflow: auto;" placeholder="(place transaction bundle body here)" rows="1"><th:block th:if="${transactionBundle} != null" th:text="${transactionBundle}"/></textarea>
</div>
@ -202,10 +215,10 @@
<!--
<br clear="all"/>
<div class="row-fluid">
<div class="row">
Show all of the tags currently in use on the server
</div>
<div class="row-fluid">
<div class="row">
<div class="col-sm-3 form-group">
<button type="button" id="get-server-tags-btn" class="btn btn-primary btn-block">
<span class="fa fa-tags"></i>

View File

@ -1,5 +1,5 @@
<!DOCTYPE html>
<html lang="en">
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<title th:include="window-title :: resource" />
<th:block th:include="tmpl-head :: head" />
@ -26,49 +26,46 @@
<!-- ** Default Home ** -->
<!-- ********************************************************** -->
<div class="well">
<div class="card">
<div class="card-header">
This is a RESTful server tester, which can be used to send
requests to, and receive responses from the server at the
following URL:
following URL:
<a th:href="${base}" th:text="${base}"></a>
</div>
</div>
<!-- ************************************************ -->
<!-- ** Resource Actions ** -->
<!-- ************************************************ -->
<div class="panel panel-default" th:if="${resourceName.empty} == false">
<div class="panel-heading">
<h3 class="panel-title" th:text="'Resource: ' + ${resourceName}">Resource: <b>Patient</b></h3>
</div>
<div class="panel-body">
<div class="card" style="margin-top: 20px;" th:if="${resourceName.empty} == false">
<h3 class="card-header panel-title" th:text="'Resource: ' + ${resourceName}">Resource: <b>Patient</b></h3>
<div class="card-body">
This page contains various operations for interacting with
the <th:block th:text="${resourceName}"></th:block> resource.
</div>
</div>
<!-- Nav tabs -->
<ul class="nav nav-tabs" role="tablist" id="resource-nav-tabs">
<ul class="nav nav-tabs" role="tablist" id="resource-nav-tabs" style="margin-top: 20px; padding-left: 5px;">
<!-- Search Tab -->
<li th:if="${haveSearchParams}" >
<a href="#tab-search" role="tab" data-toggle="tab">Search</a>
<li th:if="${haveSearchParams}" class="nav-item">
<a href="#tab-search" role="tab" data-toggle="tab" class="nav-link" id="search-tab">Search</a>
</li>
<li th:if="${!haveSearchParams}" class="disabled">
<a href="#tab-search" role="tab">Search</a>
<li th:if="${!haveSearchParams}" class="disabled nav-item">
<a href="#tab-search" role="tab" class="nav-link disabled">Search</a>
</li>
<!-- Queries Tab -->
<li th:if="${!queries.empty}">
<a href="#tab-queries" role="tab" data-toggle="tab">Queries</a>
<li th:if="${!queries.empty}" class="nav-item">
<a href="#tab-queries" role="tab" data-toggle="tab" class="nav-link" id="queries-tab">Queries</a>
</li>
<li th:if="${queries.empty}" class="disabled">
<a href="#tab-queries" role="tab">Queries</a>
<li th:if="${queries.empty}" class="disabled nav-item">
<a href="#tab-queries" role="tab" class="nav-link disabled">Queries</a>
</li>
<!-- CRUD Tab -->
<li th:class="(${!haveSearchParams} and ${queries.empty}) ? 'active'">
<a href="#tab-otheractions" role="tab" data-toggle="tab" name="tabCrudOperationsLink">CRUD Operations</a>
</li>
<!-- Tags Tab -->
<li>
<a href="#tab-tags" role="tab" data-toggle="tab">Tags</a>
<li th:class="(${!haveSearchParams} and ${queries.empty}) ? 'active'" class="nav-item">
<a href="#tab-otheractions" role="tab" data-toggle="tab" name="tabCrudOperationsLink" class="nav-link" id="crud-tab">CRUD Operations</a>
</li>
</ul>
<script type="text/javascript">
@ -83,19 +80,19 @@
</script>
<!-- Tab panes -->
<div class="tab-content">
<div class="card" style="top: -2px;"><div class="card-body tab-content">
<!-- *************************************************** -->
<!-- Search Tab -->
<!-- *************************************************** -->
<div class="tab-pane active" id="tab-search">
<div class="tab-pane active" id="tab-search" aria-labelledby="search-tab">
<!-- Search contents -->
<div class="container-fluid">
<div class="row-fluid">
<div class="row">
<div class="col-sm-2" style="padding-left: 0px;">
<button type="button" id="search-btn" class="btn btn-primary btn-block">
<span class="glyphicon glyphicon-search"></span>
<button type="button" id="search-btn" class="btn btn-success btn-block">
<i class="fab fa-searchengin"></i>
Search
</button>
</div>
@ -121,9 +118,9 @@
$("#outerForm").attr("action", "search").submit();
});
</script>
<br clear="all"/>
<div class="row-fluid">
<div class="row">
<h4>Search Parameters <small>Optionally add parameter(s) to the search</small></h4>
</div>
@ -132,10 +129,11 @@
</div>
<!-- Includes -->
<div class="row-fluid">
<br clear="all"/>
<div class="row">
<h4>Includes <small>Also include resources which are referenced by the search results</small></h4>
</div>
<div class="row-fluid">
</div>
<div class="row">
<span th:each="include : ${includes}" class="includeCheckContainer">
<span class="includeCheckCheck">
<input type="checkbox" th:value="${include}" th:id="'inc_' + ${include}"></input>
@ -145,10 +143,11 @@
</div>
<!-- Results Sorting -->
<div class="row-fluid">
<br clear="all"/>
<div class="row">
<h4>Sort Results</h4>
</div>
<div class="row-fluid">
<div class="row">
<!-- Sort By... -->
<div class='col-sm-6'>
<label>Sort By</label>
@ -185,11 +184,13 @@
</div>
<br clear="all"/>
<div class="row-fluid">
<!-- Other Options -->
<br clear="all"/>
<div class="row">
<h4>Other Options</h4>
</div>
<div class="row-fluid">
<div class="row">
<div class='col-sm-3'>
<div class="form-group">
<div class='input-group date'>
@ -201,13 +202,13 @@
</div>
</div>
</div>
<br clear="all"/>
<!-- Reverse Includes -->
<div class="row-fluid">
<br clear="all"/>
<div class="row">
<h4>Reverse Includes <small>Also include resources which reference to the search results</small></h4>
</div>
<div class="row-fluid">
<div class="row">
<span class="includeCheckCheck">
<input type="checkbox" th:value="'*'" th:id="'revinc_STAR'" />
</span>
@ -227,7 +228,7 @@
<!-- *************************************************** -->
<!-- Queries Tab -->
<!-- *************************************************** -->
<div class="tab-pane" id="tab-queries">
<div class="tab-pane" id="tab-queries" aria-labelledby="queries-tab">
<div th:replace="tmpl-queries :: queries-list" ></div>
</div>
<!-- End of queries tab -->
@ -235,19 +236,19 @@
<!-- *************************************************** -->
<!-- Other Operations Tab -->
<!-- *************************************************** -->
<div class="tab-pane" id="tab-otheractions">
<div class="tab-pane" id="tab-otheractions" aria-labelledby="crud-tab">
<div class="container-fluid">
<!-- Read/VRead -->
<div class="row-fluid">
<div>
<div class="row">
<div class="col-12">
<b>Read</b> an individual resource instance given its
ID (and optionally a version ID to retrieve a specific version
of that instance to <b>vread</b> that instance)
</div>
</div>
<div class="row-fluid">
<div class="row">
<div class="col-sm-2">
<button type="button" id="read-btn"
class="btn btn-primary btn-block">
@ -258,9 +259,11 @@
<div class='col-sm-3'>
<div class="form-group">
<div class='input-group date'>
<div class="input-group-addon">
ID
<span class="loadingStar">*</span>
<div class="input-group-prepend">
<span class="input-group-text">
ID
<span class="loadingStar">*</span>
</span>
</div>
<input type="text" class="form-control" id="read-id"/>
</div>
@ -269,8 +272,10 @@
<div class='col-sm-4'>
<div class="form-group">
<div class='input-group date'>
<div class="input-group-addon">
Version ID
<div class="input-group-prepend">
<span class="input-group-text">
Version ID
</span>
</div>
<input type="text" class="form-control" id="read-vid" placeholder="(add for vread)"/>
</div>
@ -293,12 +298,14 @@
<!-- Resource History -->
<div class="row-fluid">
Retrieve the update <b>history</b> across the <th:block th:text="${resourceName}"/>
resource type, or against a specific instance of this resource type if
an ID is specified.
<div class="row">
<div class="col-12">
Retrieve the update <b>history</b> across the <th:block th:text="${resourceName}"/>
resource type, or against a specific instance of this resource type if
an ID is specified.
</div>
</div>
<div class="row-fluid top-buffer">
<div class="row top-buffer">
<div class="col-sm-2">
<button type="button" id="resource-history-btn" class="btn btn-primary btn-block"
name="action-history-type">
@ -309,8 +316,10 @@
<div class='col-sm-3'>
<div class="form-group">
<div class='input-group date'>
<div class="input-group-addon">
ID
<div class="input-group-prepend">
<span class="input-group-text">
ID
</span>
</div>
<input type="text" class="form-control" id="resource-history-id" placeholder="(instance ID)"/>
</div>
@ -319,11 +328,13 @@
<div class='col-sm-5'>
<div class="form-group">
<div class='input-group date' id='resource-history-datetime' data-date-format="YYYY-MM-DDTHH:mm:ss">
<div class="input-group-addon">
Since
<div class="input-group-prepend">
<span class="input-group-text">
Since
</span>
</div>
<input type='text' class="form-control" id="resource-history-since" placeholder="(opt)"/>
<div class="input-group-addon">
<div class="input-group-addon"> <!-- input-group-addon is from Bootstrap3 but the time picker needs it there -->
<span class="glyphicon glyphicon-calendar"></span>
</div>
</div>
@ -332,8 +343,10 @@
<div class='col-sm-2'>
<div class="form-group">
<div class='input-group date'>
<div class="input-group-addon">
Limit
<div class="input-group-prepend">
<span class="input-group-text">
Limit
</span>
</div>
<input type="text" class="form-control" id="resource-history-limit" placeholder="(#)"/>
</div>
@ -365,10 +378,12 @@
<!-- Delete -->
<div class="row-fluid">
<b>Delete</b> an individual instance of the resource
<div class="row">
<div class="col-12">
<b>Delete</b> an individual instance of the resource
</div>
</div>
<div class="row-fluid top-buffer">
<div class="row top-buffer">
<div class="col-sm-2">
<button type="button" id="resource-delete-btn" class="btn btn-primary btn-block">
<i class="fa fa-trash-alt"></i>
@ -378,11 +393,13 @@
<div class='col-sm-3'>
<div class="form-group">
<div class='input-group date'>
<div class="input-group-addon">
ID
<span class="loadingStar">*</span>
<div class="input-group-prepend">
<span class="input-group-text">
ID
<span class="loadingStar">*</span>
</span>
</div>
<input type="text" class="form-control" id="resource-delete-id"/>
<input type="text" class="form-control rounded-right" id="resource-delete-id"/>
</div>
</div>
</div>
@ -401,11 +418,13 @@
<!-- Create -->
<div class="row-fluid">
<b>Create</b> an instance of the resource. Generally you do not need to specify an ID
but you may force the server to use a specific ID by including one.
<div class="row">
<div class="col-12">
<b>Create</b> an instance of the resource. Generally you do not need to specify an ID
but you may force the server to use a specific ID by including one.
</div>
</div>
<div class="row-fluid top-buffer">
<div class="row top-buffer">
<div class="col-sm-2">
<button type="button" id="resource-create-btn"
class="btn btn-primary btn-block">
@ -416,8 +435,10 @@
<div class='col-sm-3'>
<div class="form-group">
<div class='input-group date'>
<div class="input-group-addon">
ID
<div class="input-group-prepend">
<span class="input-group-text">
ID
</span>
</div>
<input type="text" class="form-control" id="resource-create-id" placeholder="(optional)"/>
</div>
@ -426,9 +447,11 @@
<div class='col-sm-7'>
<div class="form-group">
<div class='input-group date'>
<div class="input-group-addon">
Contents
<span class="loadingStar">*</span>
<div class="input-group-prepend">
<span class="input-group-text">
Contents
<span class="loadingStar">*</span>
</span>
</div>
<textarea class="form-control" id="resource-create-body" style="white-space: nowrap; overflow: auto;" placeholder="(place resource body here)" rows="1"></textarea>
</div>
@ -463,10 +486,12 @@
<!-- Update -->
<div class="row-fluid">
<b>Update</b> an existing instance of the resource by ID.
<div class="row">
<div class="col-12">
<b>Update</b> an existing instance of the resource by ID.
</div>
</div>
<div class="row-fluid top-buffer">
<div class="row top-buffer">
<div class="col-sm-2">
<button type="button" id="resource-update-btn" class="btn btn-primary btn-block">
<i class="fa fa-book-open"></i>
@ -476,20 +501,24 @@
<div class='col-sm-3'>
<div class="form-group">
<div class='input-group date'>
<div class="input-group-addon">
ID
<span class="loadingStar">*</span>
</div>
<input type="text" class="form-control" id="resource-update-id" placeholder="(resource ID)" th:value="${updateResourceId}"/>
<div class="input-group-prepend">
<span class="input-group-text">
ID
<span class="loadingStar">*</span>
</span>
</div>
<input type="text" class="form-control" id="resource-update-id" placeholder="(resource ID)" th:value="${updateResourceId}"/>
</div>
</div>
</div>
<div class='col-sm-7'>
<div class="form-group">
<div class='input-group date'>
<div class="input-group-addon">
Contents
<span class="loadingStar">*</span>
<div class="input-group-prepend">
<span class="input-group-text">
Contents
<span class="loadingStar">*</span>
</span>
</div>
<textarea class="form-control" id="resource-update-body" style="white-space: nowrap; overflow: auto;" placeholder="(place resource body here)" rows="1"><th:block th:if="${updateResource} != null" th:text="${updateResource}"/></textarea>
</div>
@ -526,12 +555,14 @@
<!-- Validate -->
<div class="row-fluid">
<b>Validate</b> an instance of the resource to check whether it
would be acceptable for creating/updating, without actually
storing it on the server.
<div class="row">
<div class="col-12">
<b>Validate</b> an instance of the resource to check whether it
would be acceptable for creating/updating, without actually
storing it on the server.
</div>
</div>
<div class="row-fluid top-buffer">
<div class="row top-buffer">
<div class="col-sm-2">
<button type="button" id="resource-validate-btn" class="btn btn-primary btn-block">
<i class="fa fa-thumbs-up"></i>
@ -541,9 +572,11 @@
<div class='col-sm-10'>
<div class="form-group">
<div class='input-group date'>
<div class="input-group-addon">
Contents
<span class="loadingStar">*</span>
<div class="input-group-prepend">
<span class="input-group-text">
Contents
<span class="loadingStar">*</span>
</span>
</div>
<textarea class="form-control" id="resource-validate-body" style="white-space: nowrap; overflow: auto;" placeholder="(place resource body here)" rows="1"></textarea>
</div>
@ -569,68 +602,9 @@
</div>
</div>
<!-- End of other operations tab -->
<!-- *************************************************** -->
<!-- Queries Tab -->
<!-- *************************************************** -->
<div class="tab-pane" id="tab-tags">
<div class="container-fluid">
<!-- Get Tags -->
<!--
<div class="row-fluid">
Show all of the tags currently in use on the server for this resource type. If an ID is specified,
returns only tags posted to the given version. If an ID and a version are specified,
returns only the tags posted to the given resource version.
</div>
<div class="row-fluid">
<div class="col-sm-2">
<button type="button" id="get-resource-tags-btn" class="btn btn-primary btn-block">
<i class="fa fa-tags"></i>
Get Tags
</button>
</div>
<div class='col-sm-3'>
<div class="form-group">
<div class='input-group date'>
<div class="input-group-addon">
ID
</div>
<input type="text" class="form-control" id="resource-tags-id" placeholder="(instance ID)"/>
</div>
</div>
</div>
<div class='col-sm-3'>
<div class="form-group">
<div class='input-group date'>
<div class="input-group-addon">
VID
</div>
<input type="text" class="form-control" id="resource-tags-vid" placeholder="(version)"/>
</div>
</div>
</div>
<script type="text/javascript">
$('#get-resource-tags-btn').click(
function() {
var btn = $(this);
handleActionButtonClick($(this));
var id = $('#resource-tags-id').val();
if (id != null) btn.append($('<input />', { type: 'hidden', name: 'resource-tags-id', value: id }));
var vid = $('#resource-tags-vid').val();
if (vid != null) btn.append($('<input />', { type: 'hvidden', name: 'resource-tags-vid', value: vid }));
$("#outerForm").attr("action", "get-tags").submit();
});
</script>
</div>
-->
</div>
</div>
<!-- End of queries tab -->
</div>
</div></div>
<!-- End of tab pane -->
</div>

View File

@ -1,5 +1,5 @@
<!DOCTYPE html>
<html lang="en">
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<title th:include="window-title :: result" />
<th:block th:include="tmpl-head :: head" />
@ -24,20 +24,22 @@
<!-- *************************************************** -->
<!-- ** Response ** -->
<!-- *************************************************** -->
<div class="well" id="resultWell">
Executed request against FHIR RESTful server in
<th:block th:text="${latencyMs} + 'ms'"/>
<div class="card" id="resultWell">
<div class="card-header">
Executed request against FHIR RESTful server in
<th:block th:text="${latencyMs} + 'ms'"/>
</div>
</div>
<div th:if="${clientCodeJson} != null" class="panel panel-default">
<div class="panel-heading">
<div th:if="${clientCodeJson} != null" class="card" style="margin-top: 20px;">
<div class="card-header">
Client Code -
<small style="color: #888;">
Use the following code snippet to execute this action in your
own client.
</small>
</div>
<div class="panel-body clientCodeBox" id="clientCodeBody">
<div class="card-body clientCodeBox" id="clientCodeBody">
</div>
<script type="text/javascript" src="js/ClientCodeGeneratorHapi.js"></script>
<script type="text/javascript" th:utext="'var jsonClientCode = ' + ${clientCodeJson} + ';'">
@ -47,7 +49,7 @@
</script>
</div>
<div th:if="${requestUrl} != null">
<div th:if="${requestUrl} != null" style="margin-top: 20px;">
<table class="table table-bordered table-striped requestTable" id="requestTable">
<colgroup>
@ -57,7 +59,7 @@
<tbody>
<tr>
<td style="white-space: nowrap;">
<span class="glyphicon glyphicon glyphicon-chevron-right"></span>
<i class="fas fa-chevron-right"></i>
Request
</td>
<td>
@ -92,7 +94,7 @@
<tbody>
<tr>
<td style="white-space: nowrap;">
<span class="glyphicon glyphicon glyphicon-chevron-left"></span>
<i class="fas fa-chevron-left"></i>
Response
</td>
<td>
@ -127,7 +129,7 @@
<div th:if="${bundle} != null" class="panel-group" id="accordion" style="margin-bottom: 0px;">
<div class="panel panel-default" style="border: none; border-bottom: 1px solid #ddd; border-radius: 0px;">
<div class="panel-heading">
<h4 class="panel-title">
<div class="panel-title">
<th:block th:if="${#lists.isEmpty(bundle.entries)}">Bundle contains no entries</th:block>
<a th:unless="${#lists.isEmpty(bundle.entries)}" data-toggle="collapse" data-parent="#accordion" href="#collapseOne">
<i id="collapseOneIcon" class="far fa-minus-square"></i>
@ -140,7 +142,7 @@
<!-- Prev/Next Page Buttons -->
<button class="btn btn-success btn-xs" type="button" id="page-prev-btn"
style="margin-left: 15px;">
<span class="glyphicon glyphicon-step-backward"></span>
<i class="fas fa-angle-double-left"></i>
Prev Page
</button>
<script type="text/javascript" th:inline="javascript">
@ -157,7 +159,7 @@
</script>
<button class="btn btn-success btn-xs" type="button" id="page-next-btn">
<span class="glyphicon glyphicon-step-forward"></span>
<i class="fas fa-angle-double-right"></i>
Next Page
</button>
<script type="text/javascript" th:inline="javascript">
@ -172,9 +174,9 @@
});
</script>
</th:block>
</h4>
</div>
</div>
<div id="collapseOne" class="panel-collapse collapse in" th:unless="${#lists.isEmpty(bundle.entries)}">
<div id="collapseOne" class="panel-collapse in" th:unless="${#lists.isEmpty(bundle.entries)}">
<div class="panel-body" style="padding-bottom: 0px;">
<table class="table table-condensed" style="padding-bottom: 0px; margin-bottom: 0px;">
<colgroup>
@ -239,7 +241,7 @@
<div th:if="${riBundle} != null" class="panel-group" id="accordion" style="margin-bottom: 0px;">
<div class="panel panel-default" style="border: none; border-bottom: 1px solid #ddd; border-radius: 0px;">
<div class="panel-heading">
<h4 class="panel-title">
<div class="panel-title">
<th:block th:if="${#lists.isEmpty(riBundle.entry)}">Bundle contains no entries</th:block>
<a th:unless="${#lists.isEmpty(riBundle.entry)}" data-toggle="collapse" data-parent="#accordion" href="#collapseOne">
<i id="collapseOneIcon" class="far fa-minus-square"></i>
@ -252,7 +254,7 @@
<!-- Prev/Next Page Buttons -->
<button class="btn btn-success btn-xs" type="button" id="page-prev-btn"
style="margin-left: 15px;">
<span class="glyphicon glyphicon-step-backward"></span>
<i class="fas fa-angle-double-left"></i>
Prev Page
</button>
<script type="text/javascript" th:inline="javascript">
@ -272,7 +274,7 @@
</script>
<button class="btn btn-success btn-xs" type="button" id="page-next-btn">
<span class="glyphicon glyphicon-step-forward"></span>
<i class="fas fa-angle-double-right"></i>
Next Page
</button>
<script type="text/javascript" th:inline="javascript">
@ -287,9 +289,9 @@
});
</script>
</th:block>
</h4>
</div>
</div>
<div id="collapseOne" class="panel-collapse collapse in" th:unless="${#lists.isEmpty(riBundle.entry)}">
<div id="collapseOne" class="panel-collapse in" th:unless="${#lists.isEmpty(riBundle.entry)}">
<div class="panel-body" style="padding-bottom: 0px;">
<table class="table table-condensed" style="padding-bottom: 0px; margin-bottom: 0px;">
<colgroup>

View File

@ -1,12 +1,12 @@
<!DOCTYPE html>
<html lang="en">
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<div th:fragment="banner">
<div class="row">
<div class="row" style="padding-top: 20px;">
<div class="col-md-4" style="padding-top: 47px;">
<img src="img/hapi_fhir_banner_right.png" />
</div>
<div class="col-md-8">
<img src="img/hapi_fhir_banner.png" />
</div>
<div class="col-md-4">
<img src="img/hapi_fhir_banner_right.png" align="right" />
<img src="img/hapi_fhir_banner.png" style="height: 150px;" align="right"/>
</div>
</div>

View File

@ -7,14 +7,16 @@
<meta name="description" content=""/>
<meta name="author" content=""/>
<script th:src="@{/resources/popper.js/dist/umd/popper.min.js}"></script>
<!-- JQuery and Bootstrap -->
<script th:src="@{/resources/jquery/dist/jquery.js}"></script>
<link rel="stylesheet" media="screen" th:href="@{/resources/bootstrap/css/bootstrap.min.css}" />
<link rel="stylesheet" th:href="@{/resources/bootstrap/dist/css/bootstrap.css}" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css"/>
<link rel="stylesheet" media="screen" th:href="@{/resources/font-awesome/css/fontawesome.min.css}" />
<script th:src="@{/resources/font-awesome/js/all.min.js}" data-auto-replace-svg="nest"></script>
<link rel="stylesheet" media="screen" th:href="@{/resources/awesome-bootstrap-checkbox/awesome-bootstrap-checkbox.css}" />
<script th:src="@{/resources/bootstrap/js/bootstrap.js}" defer="defer"></script>
<script th:src="@{/resources/bootstrap/js/tab.js}"></script>
<script th:src="@{/resources/bootstrap/dist/js/bootstrap.min.js}" src="https://maxcdn.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js"></script>
<!--<script th:src="@{/resources/bootstrap/js/tab.js}"></script>-->
<script type="text/javascript" th:utext="'var conformance = ' + ${jsonEncodedConf} + ';'">

View File

@ -5,44 +5,44 @@
<h4>Options</h4>
<label class="navBarButtonLabel">Encoding</label>
<div class="btn-group " data-toggle="buttons" id="encodingBtnGroup">
<label class="btn btn-sm btn-default active">
<div class="btn-group btn-group-toggle" data-toggle="buttons" id="encodingBtnGroup">
<label class="btn btn-info active">
<input type="radio" name="encoding" id="encode-default" value="" />(default)
</label>
<label class="btn btn-sm btn-default">
<label class="btn btn-info">
<input type="radio" name="encoding" id="encode-xml" value="xml" />XML
</label>
<label class="btn btn-sm btn-default">
<label class="btn btn-info">
<input type="radio" name="encoding" id="encode-json" value="json" />JSON
</label>
</div>
<br /> <label class="navBarButtonLabel">Pretty</label>
<div class="btn-group top-buffer" data-toggle="buttons" id="prettyBtnGroup">
<label class="btn btn-sm btn-default active"> <input
<div class="btn-group btn-group-toggle" data-toggle="buttons" id="prettyBtnGroup" style="margin-top: 5px;">
<label class="btn btn-info active"> <input
type="radio" name="pretty" id="pretty-default" value="" />(default)
</label> <label class="btn btn-sm btn-default"> <input
</label> <label class="btn btn-info"> <input
type="radio" name="pretty" id="pretty-true" value="true" />On
</label> <label class="btn btn-sm btn-default"> <input
</label> <label class="btn btn-info"> <input
type="radio" name="pretty" id="pretty-false" value="false" />Off
</label>
</div>
<br /> <label class="navBarButtonLabel">Summary</label>
<div class="btn-group top-buffer" data-toggle="buttons" id="summaryBtnGroup">
<label class="btn btn-sm btn-default active">
<div class="btn-group btn-group-toggle" data-toggle="buttons" id="summaryBtnGroup" style="margin-top: 5px;">
<label class="btn btn-info active">
<input type="radio" name="_summary" id="summary-default" value="" />(none)
</label>
<label class="btn btn-sm btn-default">
<label class="btn btn-info">
<input type="radio" name="_summary" id="summary-true" value="true" />true
</label>
<label class="btn btn-sm btn-default">
<label class="btn btn-info">
<input type="radio" name="_summary" id="summary-text" value="text" />text
</label>
<label class="btn btn-sm btn-default">
<label class="btn btn-info">
<input type="radio" name="_summary" id="summary-data" value="data" />data
</label>
<label class="btn btn-sm btn-default">
<label class="btn btn-info">
<input type="radio" name="_summary" id="summary-count" value="count" />count
</label>
</div>
@ -78,7 +78,9 @@
$('#summary-data').trigger("click");
} else if (summary == 'count') {
$('#summary-count').trigger("click");
}
} else {
$('#summary-default').trigger("click");
}
if ([[${!#strings.isEmpty(resultBody)}]]) {
// When we're displaying a result page, the options buttons should
@ -122,7 +124,7 @@
th:data1="${resource.typeElement.valueAsString}"
onclick="doAction(this, 'resource', this.getAttribute('data1'));">
<th:block th:text="${resource.typeElement.valueAsString}" >Patient</th:block>
<span class="badge" th:if="${resourceCounts[resource.typeElement.valueAsString]} != null" th:text="${resourceCounts[resource.typeElement.valueAsString]}"/>
<span class="badge badge-secondary" th:if="${resourceCounts[resource.typeElement.valueAsString]} != null" th:text="${resourceCounts[resource.typeElement.valueAsString]}"/>
</a>
</li>
</th:block>

View File

@ -1,4 +1,8 @@
<ul th:fragment="farright">
<li><a href="https://github.com/jamesagnew/hapi-fhir"><i class="fab fa-github topbarIcon"></i></span>&nbsp;Source Code</a></li>
<li><a href="about"><span class="fa fa-question-circle topbarIcon"></span>&nbsp;About This Server</a></li>
<ul class="navbar-nav" th:fragment="farright" xmlns:th="http://www.thymeleaf.org">
<li class="nav-item">
<a class="nav-link" href="https://github.com/jamesagnew/hapi-fhir"><i class="fab fa-github topbarIcon"></i></span>&nbsp;Source Code</a>
</li>
<li class="nav-item">
<a class="nav-link" th:href="@{/about}"><span class="fa fa-question-circle topbarIcon"></span>&nbsp;About This Server</a>
</li>
</ul>

View File

@ -1,88 +1,82 @@
<!DOCTYPE html>
<html lang="en">
<div th:fragment="top" class="navbar navbar-inverse navbar-fixed-top" role="navigation">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse"
data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span> <span
class="icon-bar"></span> <span class="icon-bar"></span> <span
class="icon-bar"></span>
</button>
<a class="navbar-brand"
th:href="'home?encoding=' + ${encoding} + '&amp;pretty=' + ${pretty}">
<span class="fa fa-home topbarIcon"></span> Home
</a>
<a class="navbar-left navbarBreadcrumb hidden-xs hidden-sm"
th:if="${resourceName} != null and ${resourceName.empty} == false"
th:href="'resource?encoding=' + ${encoding} + '&amp;pretty=' + ${pretty} + '&amp;resource=' + ${resourceName}">
<span class="glyphicon glyphicon-chevron-right"></span> <span
th:text="${resourceName}"></span>
</a>
<div class="navbar-left navbarBreadcrumb hidden-xs hidden-sm"
th:if="${outcomeDescription} != null">
<span class="glyphicon glyphicon-chevron-right"></span> <span
th:text="${outcomeDescription}"></span>
</div>
<div class="navbar-left navbarBreadcrumb hidden-xs hidden-sm"
th:if="${extraBreadcrumb} != null">
<span class="glyphicon glyphicon-chevron-right"></span>&nbsp;<span
th:text="${extraBreadcrumb}"></span>
</div>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav navbar-right">
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<header th:fragment="top" class="header" id="header">
<nav class="navbar navbar-dark bg-dark fixed-top navbar-expand-lg">
<a class="navbar-brand hidden-xs hidden-sm"
th:if="${resourceName} != null and ${resourceName.empty} == false"
th:href="'resource?encoding=' + ${encoding} + '&amp;pretty=' + ${pretty} + '&amp;resource=' + ${resourceName}">
<i class="fas fa-broom" style="color: #F88;"></i>
<span th:text="${resourceName}"></span>
Resource
</a>
<a class="navbar-brand" th:href="'home?encoding=' + ${encoding} + '&amp;pretty=' + ${pretty}" th:unless="${resourceName} != null and ${resourceName.empty} == false">
<span class="fa fa-home topbarIcon"></span> Home
</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<!--
Server selection dropdown
-->
<ul class="navbar-nav ml-auto">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fas fa-fire topbarIcon"></i>&nbsp;<span id="serverSelectorName" th:text="'Server: ' + ${baseName}"></span>&nbsp;<span class="caret" /></a>
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
<a th:each="serverEntry : ${serverEntries}" th:href="'javascript:selectServer(\'' + ${serverEntry.key} + '\');'" class="dropdown-item">
<i class="far fa-check-square" th:if="${serverEntry.key} == ${serverId}"></i>
<i class="far fa-square" style="color: #CCC;" th:unless="${serverEntry.key} == ${serverId}"></i>
&nbsp;&nbsp;
<th:block th:text="${serverEntry.value}"/>
</a>
</div>
</li>
</ul>
<!--
Security Dropdown
-->
<th:block th:if="${apiKey != null}">
<ul class="navbar-nav">
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown"><span class="fa fa-key topbarIcon"></span>&nbsp;API Key&nbsp;<span class="caret" /></a>
<ul class="dropdown-menu" role="menu">
<div style="padding: 10px;">
<p>If your chosen server requires an API key / Bearer token, enter it here:</p>
<input type="text" name="apiKey" id="apiKey" th:value="${apiKey}"/>
<script type="text/javascript">
$('#apiKey').on('click', function(event){
// The event won't be propagated up to the document NODE and
// therefore delegated events won't be fired
event.stopPropagation();
});
</script>
</div>
</ul>
</li>
</ul>
</th:block>
<!--
SourceCode / About this Server
-->
<th:block th:replace="tmpl-navbar-top-farright :: farright"/>
</div>
</nav>
</header>
<!--
Server Selection Dropdown
-->
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
<span id="serverSelectorFhirIcon" class="glyphicon glyphicon-fire topbarIcon"></span>&nbsp;<span id="serverSelectorName" th:text="'Server: ' + ${baseName}"></span>&nbsp;<span class="caret" /></a>
<ul class="dropdown-menu" role="menu">
<li th:each="serverEntry : ${serverEntries}">
<a th:href="'javascript:selectServer(\'' + ${serverEntry.key} + '\');'">
<i class="far fa-check-square" th:if="${serverEntry.key} == ${serverId}"></i>
<i class="far fa-square" style="color: #CCC;" th:unless="${serverEntry.key} == ${serverId}"></i>
&nbsp;&nbsp;
<th:block th:text="${serverEntry.value}"/>
</a>
</li>
</ul>
</li>
<!--
Security Dropdown
-->
<th:block th:if="${apiKey != null}">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class="fa fa-key topbarIcon"></span>&nbsp;API Key&nbsp;<span class="caret" /></a>
<ul class="dropdown-menu" role="menu">
<div style="padding: 10px;">
<p>If your chosen server requires an API key / Bearer token, enter it here:</p>
<input type="text" name="apiKey" id="apiKey" th:value="${apiKey}"/>
<script type="text/javascript">
$('#apiKey').on('click', function(event){
// The event won't be propagated up to the document NODE and
// therefore delegated events won't be fired
event.stopPropagation();
});
</script>
</div>
</ul>
</li>
</th:block>
<!--
SourceCode / About this Server
-->
<th:block th:include="tmpl-navbar-top-farright :: farright"/>
</ul>
</div>
</div>
</div>
</html>

View File

@ -6,7 +6,7 @@
<div class="panel-heading">
<div class="pull-right">
<button type="button" th:id="'search-btn-' + ${queryIterStat.index}" class="btn btn-primary btn-block">
&nbsp;<span class="glyphicon glyphicon-search"></span>
&nbsp;<i class="fab fa-searchengin"></i>
Execute
&nbsp;
</button>

View File

@ -5,148 +5,163 @@
.btn.disabled,
.btn[disabled],
fieldset[disabled].btn {
opacity: .45;
filter:alpha(opacity=45);
opacity: .45;
filter: alpha(opacity=45);
}
.badge {
padding: 0.4em 0.6em;
border-radius: 0.5rem;
}
.badge-secondary {
color: #fff;
background-color: #98a5b0;
}
/* Move down content because we have a fixed navbar that is 50px tall */
body {
padding-top: 50px;
overflow-x: hidden;
padding-top: 50px;
overflow-x: hidden;
font-family: sans-serif;
}
.clientCodeBox
{
font-family: monospace;
font-size: 0.8em;
line-height: 0.85em;
.clientCodeBox {
font-family: monospace;
font-size: 0.8em;
line-height: 0.85em;
}
.clientCodeComment {
color: #4A4;
font-style: italic;
color: #4A4;
font-style: italic;
}
.clientCodePreamble {
color: #888;
font-style: italic;
color: #888;
font-style: italic;
}
.clientCodeIndent {
margin-left: 15px;
margin-left: 15px;
}
label {
font-size: 1.0em;
color: #808080;
font-weight: 400;
line-height: 0.8em;
font-size: 1.0em;
color: #808080;
font-weight: 400;
line-height: 0.8em;
}
TD.headerBox {
line-height: 0.8em !important;
line-height: 0.8em !important;
}
SPAN.headerName {
color: #505080;
font-family: monospace;
font-size: 0.8em;
color: #505080;
font-family: monospace;
font-size: 0.8em;
}
.hlQuot {
color: #88F;
color: #88F;
}
.hlAttr {
color: #888;
color: #888;
}
.hlTagName {
color: #006699;
color: #006699;
}
.hlControl {
color: #660000;
color: #660000;
}
.hlText {
color: #000000;
color: #000000;
}
.hlUrlBase {
}
SPAN.headerValue {
color: #70A070;
font-family: monospace;
font-size: 0.8em;
color: #70A070;
font-family: monospace;
font-size: 0.8em;
}
SPAN.includeCheckContainer {
margin-top: 2px;
margin-bottom: 2px;
margin-right: 0px;
margin-left: 2px;
white-space: nowrap;
line-height: 35px;
display: inline-block;
margin-top: 0;
margin-bottom: 12px;
margin-right: 10px;
margin-left: 0;
white-space: nowrap;
line-height: 35px;
display: inline-block;
}
SPAN.includeCheckCheck {
border: 1px solid #AAA;
border-right-width: 0px;
border-top-left-radius: 5px;
border-bottom-left-radius: 5px;
padding: 6px;
background: #CCC;
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));
background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%);
background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#cccccc', GradientType = 0);
background-image: linear-gradient(to top, #ccc 0%, #eee 60%);
border: 1px solid #AAA;
border-right-width: 0px;
border-top-left-radius: 5px;
border-bottom-left-radius: 5px;
padding: 6px;
background: #CCC;
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));
background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%);
background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#cccccc', GradientType=0);
background-image: linear-gradient(to top, #ccc 0%, #eee 60%);
}
SPAN.includeCheckName {
border: 1px solid #AAA;
border-top-right-radius: 5px;
border-bottom-right-radius: 5px;
padding: 6px;
background: #FFF;
border: 1px solid #AAA;
border-top-right-radius: 5px;
border-bottom-right-radius: 5px;
padding: 6px;
background: #FFF;
}
SPAN.loadingStar {
color: #C66;
display: inline-block !important;
margin: 0px !important;
padding: 0px !important;
width: 3px !important;
font-weight: bold;
color: #C66;
display: inline-block !important;
margin: 0px !important;
padding: 0px !important;
width: 3px !important;
font-weight: bold;
}
DIV.navbarBreadcrumb, A.navbarBreadcrumb {
color: #999;
padding: 15px;
padding-left: 0px;
font-size: 16px;
line-height: 20px;
height: 50px;
color: #999;
padding: 15px;
padding-left: 0px;
font-size: 16px;
line-height: 20px;
height: 50px;
}
DIV.navbarBreadcrumb:HOVER, A.navbarBreadcrumb:HOVER {
color: #FFF;
text-decoration: none;
color: #FFF;
text-decoration: none;
}
DIV.resultBodyActual {
/*
max-height: 400px;
overflow: scroll;
*/
/*
max-height: 400px;
overflow: scroll;
*/
}
PRE.resultBodyPre {
line-height: 0.9em;
font-size: 0.8em;
border: none;
background-color: transparent;
overflow: visible;
/*white-space: normal;*/
white-space: pre-wrap;
line-height: 0.9em;
font-size: 0.8em;
border: none;
background-color: transparent;
overflow: visible;
/*white-space: normal;*/
white-space: pre-wrap;
}
/*
@ -154,16 +169,16 @@ PRE.resultBodyPre {
*/
.sub-header {
padding-bottom: 10px;
border-bottom: 1px solid #eee;
padding-bottom: 10px;
border-bottom: 1px solid #eee;
}
body .syntaxhighlighter .line {
white-space: pre-wrap !important; /* make code wrap */
white-space: pre-wrap !important; /* make code wrap */
}
.syntaxhighlight {
white-space: pre-wrap;
white-space: pre-wrap;
}
/*
@ -172,43 +187,57 @@ body .syntaxhighlighter .line {
/* Hide for mobile, show later */
.sidebar {
display: none;
display: none;
}
@media (min-width: 768px) {
.sidebar {
position: fixed;
top: 51px;
bottom: 0;
left: 0;
z-index: 1000;
display: block;
padding: 5px;
overflow-x: hidden;
overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */
background-color: #f5f5f5;
border-right: 1px solid #eee;
}
.sidebar {
top: 51px;
bottom: 0;
left: 0;
z-index: 1000;
display: block;
padding: 5px;
overflow-x: hidden;
overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */
background-color: #f5f5f5;
border-right: 1px solid #eee;
}
}
/* Sidebar navigation */
.nav-sidebar {
margin-right: -21px; /* 20px padding + 1px border */
margin-bottom: 20px;
margin-left: -20px;
}
.nav-sidebar > li > a {
padding-right: 20px;
padding-left: 20px;
}
.nav-sidebar > .active > a {
color: #fff;
background-color: #428bca;
margin-right: -21px; /* 20px padding + 1px border */
margin-bottom: 20px;
margin-left: -20px;
}
.nav-tabs li.active A {
background: #f5f5f5;
font-weight: bold;
.nav-sidebar > li {
width: 100%;
}
.nav-sidebar > li > a {
padding-right: 20px;
padding-left: 20px;
padding-top: 5px;
padding-bottom: 5px;
display: block;
}
.nav-sidebar > .active > a {
color: #fff;
background-color: #428bca;
padding-top: 10px;
padding-bottom: 10px;
}
.nav-link.active {
background-color: #007bff !important;
border: none !important;
color: #FFF !important;
font-weight: bold;
border-top-left-radius: 0.5rem;
border-top-right-radius: 0.5rem;
}
/*
@ -216,21 +245,23 @@ body .syntaxhighlighter .line {
*/
.main {
padding: 20px;
padding: 20px;
}
@media (min-width: 768px) {
.main {
padding-top: 10px;
padding-right: 10px;
padding-left: 10px;
}
.main {
padding-top: 10px;
padding-right: 10px;
padding-left: 10px;
}
}
.main .page-header {
margin-top: 0;
margin-top: 0;
}
.navBarButtonLabel {
width: 80px;
width: 80px;
}
/*
@ -238,93 +269,103 @@ body .syntaxhighlighter .line {
*/
.placeholders {
margin-bottom: 30px;
text-align: center;
margin-bottom: 30px;
text-align: center;
}
.placeholders h4 {
margin-bottom: 0;
margin-bottom: 0;
}
.placeholder {
margin-bottom: 20px;
margin-bottom: 20px;
}
.placeholder img {
display: inline-block;
border-radius: 50%;
display: inline-block;
border-radius: 50%;
}
DIV.queryParameter {
padding-top: 3px;
padding-bottom: 3px;
border-radius: 6px;
margin-left: 5px;
margin-right: 5px;
padding-top: 3px;
padding-bottom: 3px;
border-radius: 6px;
margin-left: 5px;
margin-right: 5px;
}
DIV.queryParameterOdd {
background: #EEE;
background: #EEE;
}
TABLE.resultTable TR TD:FIRST-CHILD,
TABLE.requestTable TR TD:FIRST-CHILD {
font-weight: bold;
font-weight: bold;
}
PRE.resultBodyPlaceholder {
width:100%;
padding: 0px;
width: 100%;
padding: 0px;
}
DIV.searchParamDescription {
font-size: 0.8em;
text-align: right;
color: #668;
min-height: 34px;
display: table;
width: 100%;
font-size: 0.8em;
text-align: right;
color: #668;
min-height: 34px;
display: table;
width: 100%;
}
DIV.searchParamDescription DIV {
display: table-cell;
vertical-align: middle;
display: table-cell;
vertical-align: middle;
}
DIV.searchParamSeparator {
height: 1px;
border-top: 1px solid #CCC;
margin: 3px;
height: 1px;
border-top: 1px solid #CCC;
margin: 3px;
}
.select2-container {
width: 100% !important;
width: 100% !important;
}
.select2-container A {
height: 33px !important;
.select2-selection__rendered {
line-height: 42px !important;
}
.select2-container .select2-selection--single {
height: 42px !important;
}
.select2-selection__arrow {
height: 42px !important;
}
.syntaxhighlighter,
.syntaxhighlighter .line.alt1,
.syntaxhighlighter .line.alt2 {
background-color: transparent !important;
background-color: transparent !important;
}
.syntaxhighlighter {
overflow: visible !important;
overflow: visible !important;
}
.syntaxhighlighter div {
font-size: 0.9em !important;
font-size: 0.9em !important;
}
DIV.tab-pane DIV.container-fluid {
padding-top: 15px;
padding-top: 15px;
}
.topbarIcon {
color: #66AAFF;
color: #66AAFF;
}
DIV.top-buffer {
margin-top: 2px;
margin-top: 2px;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -5,13 +5,13 @@ function addSearchParamRow() {
var nextRow = numRows++;
var select = $('<select/>', {/*style:'margin-left:30px;'*/});
var plusBtn = $('<button />', {type:'button', 'class':'btn btn-success btn-block'});
plusBtn.append($('<span />', {'class':'glyphicon glyphicon-plus'}));
plusBtn.append($('<i />', {'class':'fas fa-plus'}));
plusBtn.isAdd = true;
var rowDiv = $('<div />', { 'class': 'row top-buffer', id: 'search-param-row-' + nextRow }).append(
$('<div />', { 'class': 'col-sm-1' }).append(plusBtn),
$('<div />', { 'class': 'col-sm-5' }).append(select),
$('<div />', { id: 'search-param-rowopts-' + nextRow })
$('<div />', { id: 'search-param-rowopts-' + nextRow, 'class': 'col-sm-6' })
);
$("#search-param-rows").append(rowDiv);
@ -30,18 +30,10 @@ function addSearchParamRow() {
var nextName = searchParam.name + '_' + i;
params[nextName] = searchParam;
select.append(
$('<option />', { value: nextName }).text(searchParam.name + ' - ' + searchParam.documentation)
$('<option />', { value: nextName }).text(searchParam.name + ' - ' + searchParam.documentation)
);
}
/*
restResource.searchParam.forEach(function(searchParam){
params[searchParam.name] = searchParam;
select.append(
$('<option />', { value: searchParam.name }).text(searchParam.name + ' - ' + searchParam.documentation)
);
});
*/
}
}
});
@ -65,44 +57,44 @@ function addSearchControls(theConformance, theSearchParamType, theSearchParamNam
var addNameAndType = true;
if (theSearchParamType === 'id') {
$('#search-param-rowopts-' + theContainerRowNum).append(
$('<div />', { 'class': 'col-sm-3' }).append(
$('<input />', { id: 'param.' + theRowNum + '.0', placeholder: 'id', type: 'text', 'class': 'form-control' })
$('<div />', { }).append(
$('<input />', { id: 'param.' + theRowNum + '.0', placeholder: 'ResourceType/nnn', type: 'text', 'class': 'form-control' })
)
);
} else if (theSearchParamType == 'token') {
var tokenQualifiers = [];
tokenQualifiers.push({});
tokenQualifiers[0].name='Matches';
tokenQualifiers[0].name='=';
tokenQualifiers[0].value='';
tokenQualifiers.push({});
tokenQualifiers[1].name='Text';
tokenQualifiers[1].name=':text';
tokenQualifiers[1].value=':text';
tokenQualifiers[1].description='The search parameter is processed as a string that searches text associated with the code/value.';
tokenQualifiers.push({});
tokenQualifiers[2].name='Not';
tokenQualifiers[2].name=':not';
tokenQualifiers[2].value=':not';
tokenQualifiers[2].description='Reverse the code matching described in the paragraph above. Note that this includes resources that have no value for the parameter.';
tokenQualifiers.push({});
tokenQualifiers[3].name='Above';
tokenQualifiers[3].name=':above';
tokenQualifiers[3].value=':above';
tokenQualifiers[3].description='The search parameter is a concept with the form [system]|[code], and the search parameter tests whether the coding in a resource subsumes the specified search code. For example, the search concept has an is-a relationship with the coding in the resource, and this includes the coding itself.';
tokenQualifiers.push({});
tokenQualifiers[4].name='Below';
tokenQualifiers[4].name=':below';
tokenQualifiers[4].value=':below';
tokenQualifiers[4].description='The search parameter is a concept with the form [system]|[code], and the search parameter tests whether the coding in a resource is subsumed by the specified search code. For example, the coding in the resource has an is-a relationship with the search concept, and this includes the coding itself.';
tokenQualifiers.push({});
tokenQualifiers[5].name='In';
tokenQualifiers[5].name=':in';
tokenQualifiers[5].value=':in';
tokenQualifiers[5].description='The search parameter is a URI (relative or absolute) that identifies a value set, and the search parameter tests whether the coding is in the specified value set. The reference may be literal (to an address where the value set can be found) or logical (a reference to ValueSet.url). If the server can treat the reference as a literal URL, it does, else it tries to match known logical ValueSet.url values.';
tokenQualifiers.push({});
tokenQualifiers[6].name='Not-in';
tokenQualifiers[6].name=':not-in';
tokenQualifiers[6].value=':not-in';
tokenQualifiers[6].description='The search parameter is a URI (relative or absolute) that identifies a value set, and the search parameter tests whether the coding is not in the specified value set.';
@ -119,7 +111,7 @@ function addSearchControls(theConformance, theSearchParamType, theSearchParamNam
}
}
var tokenQualifierLabel = $('<span>' + tokenQualifiers[0].name + '</span>');
var tokenQualifierDropdown = $('<ul />', {'class':'dropdown-menu', role:'menu'});
var tokenQualifierDropdown = $('<div />', {'class':'dropdown-menu', role:'menu'});
for (var i = 0; i < tokenQualifiers.length; i++) {
var qualName = tokenQualifiers[i].name;
var nextValue = tokenQualifiers[i].value;
@ -131,25 +123,23 @@ function addSearchControls(theConformance, theSearchParamType, theSearchParamNam
$('#search-param-rowopts-' + theContainerRowNum).append(
$('<div />', { 'class': 'col-sm-6' }).append(
$('<div />', { 'class':'input-group'}).append(
$('<div />', {'class':'input-group-btn'}).append(
$('<button />', {'class':'btn btn-default dropdown-toggle', 'data-toggle':'dropdown'}).append(
tokenQualifierLabel,
$('<span class="caret" style="margin-left: 5px;"></span>')
),
tokenQualifierDropdown
),
$('<div />', { 'class':'input-group-addon', 'style':'padding:6px;'} ).append(
$('<span>System</span>')
),
$('<input />', { type:'text', 'class':'form-control', id: 'param.' + theRowNum + '.0', placeholder: "(opt)" }),
$('<div />', { 'class':'input-group-addon', 'style':'padding:6px;'} ).append(
$('<span>Code</span>')
),
$('<input />', { type:'text', 'class':'form-control', id: 'param.' + theRowNum + '.1', placeholder: "(opt)" })
)
)
$('<div />', { 'class':'input-group'}).append(
$('<div />', {'class':'input-group-prepend'}).append(
$('<button />', {'class':'btn btn-default dropdown-toggle input-group-text', 'data-toggle':'dropdown'}).append(
tokenQualifierLabel,
$('<span class="caret" style="margin-left: 5px;"></span>')
),
tokenQualifierDropdown
),
$('<div />', { 'class':'input-group-prepend'} ).append(
$('<div class="input-group-text">System</div>')
),
$('<input />', { type:'text', 'class':'form-control', id: 'param.' + theRowNum + '.0', placeholder: "(opt)" }),
$('<div />', { 'class':'input-group-prepend'} ).append(
$('<div class="input-group-text">Code</div>')
),
$('<input />', { type:'text', 'class':'form-control', id: 'param.' + theRowNum + '.1', placeholder: "(opt)" })
)
);
} else if (theSearchParamType === 'string') {
@ -168,7 +158,7 @@ function addSearchControls(theConformance, theSearchParamType, theSearchParamNam
);
var matchesLabel = $('<span>' + qualifiers[0].name + '</span>');
var qualifierDropdown = $('<ul />', {'class':'dropdown-menu', role:'menu'});
var qualifierDropdown = $('<div />', {'class':'dropdown-menu', role:'menu'});
function clickFunction(value, name){
return function(){
@ -180,14 +170,14 @@ function addSearchControls(theConformance, theSearchParamType, theSearchParamNam
var nextLink = $('<a>' + qualifiers[i].name+'</a>');
var qualName = qualifiers[i].name;
var nextValue = qualifiers[i].value;
qualifierDropdown.append($('<li />').append(nextLink));
qualifierDropdown.append($('<a />', {'class':'dropdown-item'}).append(nextLink));
nextLink.click(clickFunction(nextValue, qualName));
}
$('#search-param-rowopts-' + theContainerRowNum).append(
$('<div />', { 'class': 'col-sm-5 input-group' }).append(
$('<div />', {'class':'input-group-btn'}).append(
$('<button />', {'class':'btn btn-default dropdown-toggle', 'data-toggle':'dropdown'}).append(
$('<div />', { 'class': 'input-group' }).append(
$('<div />', {'class':'input-group-prepend btn-group'}).append(
$('<button />', {'class':'btn btn-default dropdown-toggle input-group-text', 'data-toggle':'dropdown'}).append(
matchesLabel,
$('<span class="caret" style="margin-left: 5px;"></span>')
),
@ -226,7 +216,7 @@ function addSearchControls(theConformance, theSearchParamType, theSearchParamNam
$('<input />', { id: 'param.' + theRowNum + '.0', placeholder: placeholderText, type: 'hidden' })
);
$('#search-param-rowopts-' + theContainerRowNum).append(
$('<div />', { 'class': 'col-sm-3' }).append(
$('<div />', { }).append(
$('<input />', { id: 'param.' + theRowNum + '.1', placeholder: placeholderText, type: 'text', 'class': 'form-control' })
)
);
@ -242,15 +232,8 @@ function addSearchControls(theConformance, theSearchParamType, theSearchParamNam
var newContainer = $('<div />', { id: 'search-param-rowopts-' + newContainerRowNum });
$('#search-param-rowopts-' + theContainerRowNum).append(
$('<br clear="all" />'),
$('<div />', { 'class': 'col-sm-1' }),
$('<div />', { 'class': 'col-sm-1' }).append(
$('<i class="glyphicon glyphicon-link" style="margin-left: 20px; margin-top: 10px;"></i>')
),
$('<div />', { 'class': 'col-sm-4' }).append(
select
),
newContainer
select,
newContainer
);
var params = [];
@ -318,7 +301,7 @@ function addSearchControls(theConformance, theSearchParamType, theSearchParamNam
var matchesLabel = $('<span>' + qualifiers[0].name + '</span>');
var qualifierDropdown = $('<ul />', {'class': 'dropdown-menu', role: 'menu'});
var qualifierDropdown = $('<div />', {'class': 'dropdown-menu', role: 'menu'});
function clickFunction(value, name) {
return function () {
@ -335,9 +318,9 @@ function addSearchControls(theConformance, theSearchParamType, theSearchParamNam
}
$('#search-param-rowopts-' + theContainerRowNum).append(
$('<div />', {'class': 'col-sm-5 input-group'}).append(
$('<div />', {'class': 'input-group-btn'}).append(
$('<button />', {'class': 'btn btn-default dropdown-toggle', 'data-toggle': 'dropdown'}).append(
$('<div />', {'class': 'input-group'}).append(
$('<div />', {'class': 'input-group-prepend btn-group'}).append(
$('<button />', {'class': 'btn btn-default dropdown-toggle input-group-text', 'data-toggle': 'dropdown'}).append(
matchesLabel,
$('<span class="caret" style="margin-left: 5px;"></span>')
),
@ -376,13 +359,15 @@ function addSearchControlDate(theSearchParamName, theContainerRowNum, theRowNum,
} else {
input = $('<div />', { 'class':'input-group date', 'data-date-format':'YYYY-MM-DDTHH:mm:ss' });
}
var qualifierDiv = $('<div />');
var qualifierDiv = $('<div />', {'class':'input-group-prepend'});
input.append(
qualifierDiv,
$('<input />', { type:'text', 'class':'form-control', id: 'param.' + inputId1 }),
$('<div />', { 'class':'input-group-addon', 'style':'padding:6px;'} ).append(
$('<i />', { 'class':'fa fa-chevron-circle-down'})
$('<div />', { 'class':'input-group-append input-group-addon'} ).append(
$('<span />', {'class':'input-group-text'}).append(
$('<i />', { 'class':'far fa-calendar-alt'})
)
)
);
input.datetimepicker({
@ -393,17 +378,17 @@ function addSearchControlDate(theSearchParamName, theContainerRowNum, theRowNum,
// overrides all addon buttons while it inits..
qualifierDiv.addClass('input-group-btn');
var qualifierTooltip = "Set a qualifier and a date to specify a boundary date. Set two qualifiers and dates to specify a range.";
var qualifierBtn = $('<button />', {type:'button', 'class':'btn btn-default dropdown-toggle', 'data-toggle':'dropdown', 'data-placement':'top', 'title':qualifierTooltip}).text('=');
var qualifierBtn = $('<button />', {type:'button', 'class':'btn btn-default dropdown-toggle input-group-text', 'data-toggle':'dropdown', 'data-placement':'top', 'title':qualifierTooltip}).text('eq');
qualifierBtn.tooltip({
'selector': '',
'placement': 'top',
'container':'body'
});
var qualifierBtnEq = $('<a>=</a>').click(function() { updateSearchDateQualifier(qualifierBtn, qualifier, '='); });
var qualifierBtnGt = $('<a>&gt;</a>').click(function() { updateSearchDateQualifier(qualifierBtn, qualifier, '>'); });
var qualifierBtnGe = $('<a>&gt;=</a>').click(function() { updateSearchDateQualifier(qualifierBtn, qualifier, '>='); });
var qualifierBtnLt = $('<a>&lt;</a>').click(function() { updateSearchDateQualifier(qualifierBtn, qualifier, '<'); });
var qualifierBtnLe = $('<a>&lt;=</a>').click(function() { updateSearchDateQualifier(qualifierBtn, qualifier, '<='); });
var qualifierBtnEq = $('<a>eq</a>').click(function() { updateSearchDateQualifier(qualifierBtn, qualifier, 'eq'); });
var qualifierBtnGt = $('<a>gt</a>').click(function() { updateSearchDateQualifier(qualifierBtn, qualifier, 'gt'); });
var qualifierBtnGe = $('<a>ge</a>').click(function() { updateSearchDateQualifier(qualifierBtn, qualifier, 'ge'); });
var qualifierBtnLt = $('<a>lt</a>').click(function() { updateSearchDateQualifier(qualifierBtn, qualifier, 'lt'); });
var qualifierBtnLe = $('<a>le</a>').click(function() { updateSearchDateQualifier(qualifierBtn, qualifier, 'le'); });
qualifierDiv.append(
qualifierBtn,
$('<ul class="dropdown-menu" role="menu">').append(
@ -417,7 +402,7 @@ function addSearchControlDate(theSearchParamName, theContainerRowNum, theRowNum,
$('#search-param-rowopts-' + theContainerRowNum).append(
qualifier,
$('<div />', { 'class': 'col-sm-3' }).append(
$('<div />', { }).append(
input
)
);
@ -426,34 +411,34 @@ function addSearchControlDate(theSearchParamName, theContainerRowNum, theRowNum,
function addSearchControlQuantity(theSearchParamName, theContainerRowNum, theRowNum) {
var input = $('<div />', { 'class':'input-group'});
var qualifier = $('<input />', {type:'hidden', id:'param.' + theRowNum + '.0'});
var qualifierDiv = $('<div />', {'class':'input-group-btn'});
var qualifierDiv = $('<div />', {'class':'input-group-prepend'});
input.append(
qualifierDiv,
$('<input />', { type:'text', 'class':'form-control', id: 'param.' + theRowNum + '.1', placeholder: "value" }),
$('<div />', { 'class':'input-group-addon', 'style':'padding:6px;'} ).append(
$('<span>System</span>')
$('<div />', { 'class':'input-group-append'} ).append(
$('<span class="input-group-text">System</span>')
),
$('<input />', { type:'text', 'class':'form-control', id: 'param.' + theRowNum + '.2', placeholder: "(opt)" }),
$('<div />', { 'class':'input-group-addon', 'style':'padding:6px;'} ).append(
$('<span>Code</span>')
$('<div />', { 'class':'input-group-append'} ).append(
$('<span class="input-group-text">Code</span>')
),
$('<input />', { type:'text', 'class':'form-control', id: 'param.' + theRowNum + '.3', placeholder: "(opt)" })
);
var qualifierTooltip = "Set a qualifier and a date to specify a boundary date. Set two qualifiers and dates to specify a range.";
var qualifierBtn = $('<button />', {type:'button', 'class':'btn btn-default dropdown-toggle', 'data-toggle':'dropdown', 'data-placement':'top', 'title':qualifierTooltip}).text('=');
var qualifierTooltip = "You can optionally use a qualifier to specify a range.";
var qualifierBtn = $('<button />', {type:'button', 'class':'btn btn-default dropdown-toggle input-group-text', 'data-toggle':'dropdown', 'data-placement':'top', 'title':qualifierTooltip}).text('=');
qualifierBtn.tooltip({
'selector': '',
'placement': 'top',
'placement': 'left',
'container':'body'
});
var qualifierBtnEq = $('<a>=</a>').click(function() { updateSearchDateQualifier(qualifierBtn, qualifier, '='); });
var qualifierBtnAp = $('<a>~ (Approx)</a>').click(function() { updateSearchDateQualifier(qualifierBtn, qualifier, '~'); });
var qualifierBtnGt = $('<a>&gt;</a>').click(function() { updateSearchDateQualifier(qualifierBtn, qualifier, '>'); });
var qualifierBtnGe = $('<a>&gt;=</a>').click(function() { updateSearchDateQualifier(qualifierBtn, qualifier, '>='); });
var qualifierBtnLt = $('<a>&lt;</a>').click(function() { updateSearchDateQualifier(qualifierBtn, qualifier, '<'); });
var qualifierBtnLe = $('<a>&lt;=</a>').click(function() { updateSearchDateQualifier(qualifierBtn, qualifier, '<='); });
var qualifierBtnAp = $('<a>ap (Approx)</a>').click(function() { updateSearchDateQualifier(qualifierBtn, qualifier, 'ap'); });
var qualifierBtnGt = $('<a>gt</a>').click(function() { updateSearchDateQualifier(qualifierBtn, qualifier, 'gt'); });
var qualifierBtnGe = $('<a>ge</a>').click(function() { updateSearchDateQualifier(qualifierBtn, qualifier, 'ge'); });
var qualifierBtnLt = $('<a>lt</a>').click(function() { updateSearchDateQualifier(qualifierBtn, qualifier, 'lt'); });
var qualifierBtnLe = $('<a>le</a>').click(function() { updateSearchDateQualifier(qualifierBtn, qualifier, 'le'); });
qualifierDiv.append(
qualifierBtn,
$('<ul class="dropdown-menu" role="menu">').append(
@ -468,13 +453,9 @@ function addSearchControlQuantity(theSearchParamName, theContainerRowNum, theRow
$('#search-param-rowopts-' + theContainerRowNum).append(
qualifier,
$('<div />', { 'class': 'col-sm-5' }).append(
$('<div />', { }).append(
input
)
// $('<div />', { 'class': 'col-sm-2' }).append(
// $('<div />', { 'class':'input-group'}).append(
// )
// )
);
}

17
pom.xml
View File

@ -1585,20 +1585,14 @@
<version>${thymeleaf-version}</version>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<groupId>org.webjars.npm</groupId>
<artifactId>bootstrap</artifactId>
<version>3.4.0</version>
<exclusions>
<exclusion>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
</exclusion>
</exclusions>
<version>4.5.2</version>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>Eonasdan-bootstrap-datetimepicker</artifactId>
<version>4.17.43</version>
<version>4.17.47</version>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
@ -1636,6 +1630,11 @@
<artifactId>moment</artifactId>
<version>2.27.0</version>
</dependency>
<dependency>
<groupId>org.webjars.npm</groupId>
<artifactId>popper.js</artifactId>
<version>1.16.1</version>
</dependency>
<dependency>
<groupId>org.xmlunit</groupId>
<artifactId>xmlunit-core</artifactId>