diff --git a/.gitignore b/.gitignore
index 191769767..182603cab 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,3 +10,5 @@ target/*
.sts4-cache/
.vscode
_site/
+node/
+node_modules/
diff --git a/npm b/npm
new file mode 100755
index 000000000..e5e7ed560
--- /dev/null
+++ b/npm
@@ -0,0 +1,4 @@
+#!/bin/sh
+cd $(dirname $0)
+PATH="$PWD/node/":$PATH
+node "node/node_modules/npm/bin/npm-cli.js" "$@"
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 000000000..e5642e723
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,151 @@
+{
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@popperjs/core": {
+ "version": "2.10.2",
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.10.2.tgz",
+ "integrity": "sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ=="
+ },
+ "anymatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "dev": true,
+ "requires": {
+ "normalize-path": "3.0.0",
+ "picomatch": "2.3.0"
+ }
+ },
+ "binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true
+ },
+ "bootstrap": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz",
+ "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q=="
+ },
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "requires": {
+ "fill-range": "7.0.1"
+ }
+ },
+ "chokidar": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
+ "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
+ "dev": true,
+ "requires": {
+ "anymatch": "3.1.2",
+ "braces": "3.0.2",
+ "fsevents": "2.3.2",
+ "glob-parent": "5.1.2",
+ "is-binary-path": "2.1.0",
+ "is-glob": "4.0.3",
+ "normalize-path": "3.0.0",
+ "readdirp": "3.6.0"
+ }
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "5.0.1"
+ }
+ },
+ "fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "optional": true
+ },
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "requires": {
+ "is-glob": "4.0.3"
+ }
+ },
+ "is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "2.2.0"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ },
+ "picomatch": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
+ "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+ "dev": true
+ },
+ "readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "requires": {
+ "picomatch": "2.3.0"
+ }
+ },
+ "sass": {
+ "version": "1.43.4",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.43.4.tgz",
+ "integrity": "sha512-/ptG7KE9lxpGSYiXn7Ar+lKOv37xfWsZRtFYal2QHNigyVQDx685VFT/h7ejVr+R8w7H4tmUgtulsKl5YpveOg==",
+ "dev": true,
+ "requires": {
+ "chokidar": "3.5.2"
+ }
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "7.0.0"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 000000000..ac649454e
--- /dev/null
+++ b/package.json
@@ -0,0 +1,12 @@
+{
+ "dependencies": {
+ "bootstrap": "^5.1.3",
+ "@popperjs/core": "^2.10.1"
+ },
+ "devDependencies": {
+ "sass": "^1.43.4"
+ },
+ "scripts": {
+ "build": "sass --style expanded --source-map --embed-sources --no-error-css src/main/scss/:target/classes/static/resources/css/"
+ }
+}
diff --git a/pom.xml b/pom.xml
index 05d97371a..077586634 100644
--- a/pom.xml
+++ b/pom.xml
@@ -22,14 +22,17 @@
UTF-8
- 3.3.6
- 1.11.4
- 2.2.4
+ 5.1.3
+ 4.7.0
+ 3.4.1
+ 1.13.0
1.8.0
0.8.5
+ v8.11.1
0.0.4.RELEASE
0.0.25
+ 1.12.0
@@ -100,18 +103,23 @@
org.webjars
jquery
- ${webjars-jquery.version}
+ ${jquery.version}
org.webjars
jquery-ui
- ${webjars-jquery-ui.version}
+ ${jquery-ui.version}
- org.webjars
+ org.webjars.npm
bootstrap
${webjars-bootstrap.version}
+
+ org.webjars.npm
+ font-awesome
+ ${font-awesome.version}
+
@@ -235,38 +243,42 @@
- ro.isdc.wro4j
- wro4j-maven-plugin
- ${wro4j.version}
+ com.github.eirslett
+ frontend-maven-plugin
+ ${frontend-maven-plugin.version}
- generate-resources
-
+ install node and npm
- run
+ install-node-and-npm
+
+ ${node.version}
+ ${npm.version}
+
+
+
+ npm install
+
+ npm
+
+
+ install
+
+
+
+ build
+
+ npm
+
+
+ run-script build
+
+ generate-resources
-
- ro.isdc.wro.maven.plugin.manager.factory.ConfigurableWroManagerFactory
- ${project.build.directory}/classes/static/resources/css
- ${basedir}/src/main/wro/wro.xml
- ${basedir}/src/main/wro/wro.properties
- ${basedir}/src/main/less
-
-
-
- org.webjars
- bootstrap
- ${webjars-bootstrap.version}
-
-
- org.mockito
- mockito-core
- ${mockito.version}
-
-
+
diff --git a/src/checkstyle/nohttp-checkstyle-suppressions.xml b/src/checkstyle/nohttp-checkstyle-suppressions.xml
index 1b40e8b3f..73edefd2e 100644
--- a/src/checkstyle/nohttp-checkstyle-suppressions.xml
+++ b/src/checkstyle/nohttp-checkstyle-suppressions.xml
@@ -3,6 +3,8 @@
"-//Checkstyle//DTD SuppressionFilter Configuration 1.2//EN"
"https://checkstyle.org/dtds/suppressions_1_2.dtd">
+
+
diff --git a/src/main/less/petclinic.less b/src/main/less/petclinic.less
deleted file mode 100644
index 7c88ec091..000000000
--- a/src/main/less/petclinic.less
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- * Copyright 2016 the original author or authors.
- *
- * You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-@icon-font-path: "../../webjars/bootstrap/fonts/";
-
-@spring-green: #6db33f;
-@spring-dark-green: #5fa134;
-@spring-brown: #34302D;
-@spring-grey: #838789;
-@spring-light-grey: #f1f1f1;
-
-@body-bg: @spring-light-grey;
-@text-color: @spring-brown;
-@link-color: @spring-dark-green;
-@link-hover-color: @spring-dark-green;
-
-@navbar-default-link-color: @spring-light-grey;
-@navbar-default-link-active-color: @spring-light-grey;
-@navbar-default-link-hover-color: @spring-light-grey;
-@navbar-default-link-hover-bg: @spring-green;
-@navbar-default-toggle-icon-bar-bg: @spring-light-grey;
-@navbar-default-toggle-hover-bg: transparent;
-@navbar-default-link-active-bg: @spring-green;
-
-@border-radius-base: 0;
-@border-radius-large: 0;
-@border-radius-small: 0;
-
-@btn-default-color: @spring-light-grey;
-@btn-default-bg: @spring-brown;
-@btn-default-border: @spring-green;
-
-@nav-tabs-active-link-hover-color: @spring-light-grey;
-@nav-tabs-active-link-hover-bg: @spring-brown;
-@nav-tabs-active-link-hover-border-color: @spring-brown;
-@nav-tabs-border-color: @spring-brown;
-
-@pagination-active-bg: @spring-brown;
-@pagination-active-border: @spring-green;
-@table-border-color: @spring-brown;
-
-.table > thead > tr > th {
- background-color: lighten(@spring-brown, 3%);
- color: @spring-light-grey;
-}
-
-.table-filter {
- background-color: @spring-brown;
- padding: 9px 12px;
-}
-
-.nav > li > a {
- color: @spring-grey;
-}
-
-.btn-default {
- border-width: 2px;
- transition: border 0.15s;
- -webkit-transition: border 0.15s;
- -moz-transition: border 0.15s;
- -o-transition: border 0.15s;
- -ms-transition: border 0.15s;
-
- &:hover,
- &:focus,
- &:active,
- &.active,
- .open .dropdown-toggle& {
- background-color: @spring-brown;
- border-color: @spring-brown;
- }
-}
-
-
-.container .text-muted {
- margin: 20px 0;
-}
-
-code {
- font-size: 80%;
-}
-
-.xd-container {
- margin-top: 40px;
- margin-bottom: 100px;
- padding-left: 5px;
- padding-right: 5px;
-}
-
-h1 {
- margin-bottom: 15px
-}
-
-.index-page--subtitle {
- font-size: 16px;
- line-height: 24px;
- margin: 0 0 30px;
-}
-
-.form-horizontal button.btn-inverse {
- margin-left: 32px;
-}
-
-#job-params-modal .modal-dialog {
- width: 90%;
- margin-left:auto;
- margin-right:auto;
-}
-
-[ng-cloak].splash {
- display: block !important;
-}
-[ng-cloak] {
- display: none;
-}
-
-.splash {
- background: @spring-green;
- color: @spring-brown;
- display: none;
-}
-
-.error-page {
- margin-top: 100px;
- text-align: center;
-}
-
-.error-page .error-title {
- font-size: 24px;
- line-height: 24px;
- margin: 30px 0 0;
-}
-
-table td {
- vertical-align: middle;
-}
-
-table td .progress {
- margin-bottom: 0;
-}
-
-table td.action-column {
- width: 1px;
-}
-
-.help-block {
- color: lighten(@text-color, 50%); // lighten the text some for contrast
-}
-
-.xd-containers {
- font-size: 15px;
-}
-
-.cluster-view > table td {
- vertical-align: top;
-}
-
-.cluster-view .label, .cluster-view .column-block {
- display: block;
-}
-
-.cluster-view .input-group-addon {
- width: 0%;
-}
-
-.cluster-view {
- margin-bottom: 0;
-}
-
-.deployment-status-deployed {
- .label-success;
-}
-
-.deployment-status-incomplete {
- .label-warning;
-}
-
-.deployment-status-failed {
- .label-danger;
-}
-
-.deployment-status-deploying {
- .label-info
-}
-.deployment-status-na {
-}
-
-.container-details-table th {
- background-color: lighten(@spring-brown, 3%);
- color: @spring-light-grey;
-}
-
-.status-help-content-table td {
- color: @spring-brown;
-}
-
-.alert-success {
- .alert-variant(fade(@alert-success-bg, 70%); @alert-success-border; @alert-success-text);
-}
-.alert-info {
- .alert-variant(fade(@alert-info-bg, 70%); @alert-info-border; @alert-info-text);
-}
-.alert-warning {
- .alert-variant(fade(@alert-warning-bg, 70%); @alert-warning-border; @alert-warning-text);
-}
-.alert-danger {
- .alert-variant(fade(@alert-danger-bg, 70%); @alert-danger-border; @alert-danger-text);
-}
-
-.myspinner {
- animation-name: spinner;
- animation-duration: 2s;
- animation-iteration-count: infinite;
- animation-timing-function: linear;
-
- -webkit-transform-origin: 49% 50%;
- -webkit-animation-name: spinner;
- -webkit-animation-duration: 2s;
- -webkit-animation-iteration-count: infinite;
- -webkit-animation-timing-function: linear;
-}
-
-hr {
- border-top: 1px dotted @spring-brown;
-}
-
-@import "typography.less";
-@import "header.less";
-@import "responsive.less";
diff --git a/src/main/resources/templates/fragments/inputField.html b/src/main/resources/templates/fragments/inputField.html
index c3373bea0..e2062a16c 100644
--- a/src/main/resources/templates/fragments/inputField.html
+++ b/src/main/resources/templates/fragments/inputField.html
@@ -14,11 +14,11 @@
pattern="(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))"/>
Error
diff --git a/src/main/resources/templates/fragments/layout.html b/src/main/resources/templates/fragments/layout.html
index f3b207483..f3d352275 100755
--- a/src/main/resources/templates/fragments/layout.html
+++ b/src/main/resources/templates/fragments/layout.html
@@ -17,60 +17,52 @@
+
-