Index: lams_central/web/css/components.css
===================================================================
diff -u
--- lams_central/web/css/components.css (revision 0)
+++ lams_central/web/css/components.css (revision cef0d9bb2b10841da2f2f948dcfd261f6ed7d644)
@@ -0,0 +1,619 @@
+body.component {
+ background-color: #E4E4E4;
+}
+
+body.component .tooltip-inner {
+ background-color: #FFFFFF;
+ color: #212529;
+ border: 1px solid #707070;
+ padding: .5rem;
+ font-size: .9rem;
+ text-align: left;
+ line-height: 1.2;
+}
+
+body.component .tooltip.bs-tooltip-top .arrow:before {
+ border-top-color: #707070 !important;
+}
+
+body.component .tooltip.bs-tooltip-top .arrow:before {
+ border-color: #fff;
+}
+
+body.component .info_icon {
+ font-size: .95rem;
+}
+
+.component-page-wrapper {
+ border-radius: 2rem;
+ min-height: 100vh;
+ overflow: hidden;
+ background-color: #F6F5FA;
+}
+
+.component-page-wrapper input::-webkit-input-placeholder {
+ color: #626262;
+}
+
+.component-page-wrapper input::-moz-placeholder {
+ color: #626262;
+}
+
+.component-page-wrapper label {
+ color: #6c757d;
+}
+
+.component-page-wrapper .btn {
+ border-radius: 1.0rem;
+}
+
+.component-page-wrapper i.fa[role="button"] {
+ cursor : pointer;
+}
+
+.component-page-wrapper .sr-only, .sr-only-focusable, .sr-only:hover {
+ color: black;
+}
+
+.component-page-wrapper .collapsible-link {
+ width: 100%;
+ position: relative;
+ text-align: left;
+}
+
+.component-page-wrapper .collapsible-link::before {
+ content: '\f107';
+ position: absolute;
+ top: 50%;
+ right: 0.8rem;
+ transform: translateY(-50%);
+ display: block;
+ font-family: 'FontAwesome';
+ font-size: 1.8rem;
+}
+
+.component-page-wrapper .collapsible-link[aria-expanded='true']::before {
+ content: '\f139';
+ color: #3C42E0;
+}
+
+.component-page-wrapper .collapsable-icon-left:after {
+ font-family: FontAwesome;
+ content: "\f078";
+ float: left;
+ color: #6c757d;
+ margin-right: .5rem;
+}
+
+.component-page-wrapper .collapsable-icon-left.collapsed:after {
+ content: "\f054";
+}
+
+.component-page-wrapper table.table thead th {
+ border: none;
+ border-bottom: 2px solid #20639B;
+}
+
+.component-page-wrapper table.table tbody td {
+ border: none;
+ border-bottom: 2px solid #C3CEDC;
+}
+
+.component-page-wrapper .card {
+ border-bottom: none;
+}
+
+.component-page-wrapper .card-header {
+ background-color: transparent;
+}
+
+.component-page-wrapper .card-body {
+ border-bottom: 1px rgba(0, 0, 0, 0.125) solid;
+ border-radius: 0.25rem;
+}
+
+.component-page-content {
+ width: 100%;
+ min-height: 100%;
+ padding: 1.5rem 4.8rem;
+}
+
+.banner-box-col {
+ box-shadow: 0px 20px 20px #2E384D1A;
+ background-color: #fff;
+ border-radius: 1.2rem;
+ margin-top: 1.8rem;
+ padding: 1.5rem 2rem;
+ min-height: 100%;
+}
+
+.banner-box-title h2 {
+ font-size: 1.35rem;
+}
+
+.banner-box-col.d-flex {
+ position: relative;
+ padding: 1rem 2rem;
+ min-height: auto;
+}
+
+.banner-box-left {
+ position: absolute;
+ left: 0;
+ top: 0;
+ bottom: 0;
+ padding: 1.25rem 1.5rem;
+ border-top-left-radius: 1.25rem;
+ border-bottom-left-radius: 1.25rem;
+}
+
+.banner-box-left.green {
+ background: #CDF5F7;
+ color: #05CCD6;
+}
+
+.banner-box-left.yellow {
+ background: #FFEECC;
+ color: #FFAA00;
+}
+
+.banner-box-left.purple {
+ background: #F5E5F9;
+ color: #CC7FE2;
+}
+
+.banner-box-left.blue {
+ background: #E2E3FE;
+ color: #7075F9;
+}
+
+.banner-box-left.green2 {
+ background: #E5F8EC;
+ color: #97E0B3;
+}
+
+.banner-box-left i.fa {
+ font-size: 1.5rem;
+}
+
+.banner-box-left span.no-icon {
+ padding-left: 1.12rem;
+}
+
+.banner-box-body {
+ padding-left: 3.25rem;
+ width: 100%;
+}
+
+.banner-box-body .banner-box-title {
+ font-size: 1.25rem;
+ color: #6c757d;
+ position: relative;
+ cursor: pointer;
+}
+
+.banner-box-body .banner-box-title a {
+ font-size: 1.25rem;
+ font-weight: 500;
+ color: #6c757d;
+ display: block;
+ width: 100%;
+}
+
+.banner-box-body .banner-box-title a.no-title {
+ text-decoration: none;
+}
+
+.banner-box-body input.form-control {
+ border: 0.1rem solid #DFDCE9;
+ border-radius: 1rem;
+ color: black;
+}
+
+.banner-box-body div.cke_textarea_inline {
+ border: 0.1rem solid #DFDCE9;
+ border-radius: 1rem;
+ color: black;
+}
+
+.banner-box-body input.form-control::placeholder {
+ color: #989EAC;
+}
+
+.banner-box-body textarea.form-control {
+ border: 0.1rem solid #DFDCE9;
+ border-radius: 1rem;
+ height: 8.25rem;
+ color: black;
+ resize: none;
+ margin-bottom: .5rem;
+}
+
+.banner-box-body textarea.form-control::placeholder {
+ color: #989EAC;
+}
+
+.banner-box-body .form-control-select {
+ border: 0.1rem solid #DFDCE9;
+ border-radius: 1.25rem;
+ color: #696f7d;
+ background-color: #F6F5FA;
+}
+
+.banner-box-right.banner-box-body .banner-box-title.active .icon_open {
+ display: flex;
+}
+
+.banner-box-right.banner-box-body .banner-box-title.active .icon_close {
+ display: none;
+}
+
+.banner-box-right.banner-box-body .banner-box-title .icon_open {
+ display: none;
+}
+
+.banner-box-right.banner-box-body .banner-box-title .icon_close {
+ display: flex;
+}
+
+.component-page-wrapper #questionlist ul.bottom {
+ text-align: right;
+ margin-top: 1rem;
+ margin-bottom: 1rem;
+}
+
+.component-page-wrapper .sidebar {
+ position: absolute;
+ height: 100%;
+ width: 7rem;
+ padding: 3.4rem 1.7rem 2rem 1.7rem;
+ background-color: #fff;
+ text-align: center;
+ display: flex;
+ align-items: flex-start;
+ flex-direction: column;
+ transition: all .3s ease;
+}
+
+.component-page-wrapper .sidebar.active {
+ transform: translateX(-7rem);
+}
+
+.component-page-wrapper .sidebar > ul {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ margin-bottom: auto;
+}
+
+.component-page-wrapper .sidebar .logo-li {
+ margin-bottom: 4rem;
+}
+
+.component-page-wrapper .sidebar .menu-li {
+ margin-bottom: 1.8rem;
+}
+
+.component-page-wrapper .sidebar .menu-li a {
+ background-color: #3C42E01A;
+ display: inline-block;
+ width: 3rem;
+ height: 3rem;
+ border-radius: 1.2rem;
+ color: #fff;
+ line-height: 2.8rem;
+ cursor: pointer;
+}
+
+.component-page-wrapper .sidebar .menu-li a svg {
+ height: 1.6rem;
+ width: 1.4rem;
+ transition: all .3s ease;
+}
+
+.component-page-wrapper .hamburger-box {
+ padding-top: .5rem;
+ display: flex;
+}
+
+.component-page-wrapper .hamburger {
+ width: 1rem;
+ margin-top: .8rem;
+ cursor: pointer;
+}
+
+.component-page-wrapper .hamburger span {
+ display: inline-block;
+ height: 2px;
+ background-color: #3C42E0;
+ width: 100%;
+ float: left;
+ margin-bottom: 3px;
+ transition: all .3s ease;
+}
+
+.component-page-wrapper .hamburger span:last-child {
+ margin: 0;
+ width: 70%;
+}
+
+.component-page-wrapper .hamburger.active span {
+ width: 100%;
+}
+
+.component-page-wrapper .hamburger-box p {
+ font-family: mont-semibold, sans-serif;
+ font-size: 2rem;
+ margin: 0;
+ line-height: 1;
+ color: #2E384D;
+ margin-left: 1.8rem;
+}
+
+.component-page-wrapper .top-menu {
+ display: flex;
+}
+
+.component-page-wrapper .top-menu-btn {
+ display: flex;
+}
+
+.component-page-wrapper .top-menu-btn a {
+ display: inline-block;
+ background-color: #3C42E0;
+ width: 3.1rem;
+ height: 3.1rem;
+ border-radius: 1rem;
+ margin-left: .6rem;
+ text-align: center;
+ line-height: 2.8rem;
+ box-shadow: 0px 3px 6px #3C42E040;
+ transition: all .3s ease;
+}
+
+.component-page-wrapper .top-menu-btn a:hover {
+ background-color: #878bea;
+}
+
+.component-page-wrapper .top-menu-btn a img {
+ width: 1rem;
+}
+
+.component-page-wrapper .top-menu form {
+ position: relative;
+ width: 18.8rem;
+ margin-right: 3rem;
+}
+
+.component-page-wrapper .top-menu input {
+ width: 100%;
+ height: 3.1rem;
+ border-radius: 1rem;
+ border: 0;
+ padding-left: 1.2rem;
+ box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.02);
+ color: #ACB5CC;
+}
+
+.component-page-wrapper .top-menu form img {
+ position: absolute;
+ right: 1.2rem;
+ top: .9rem;
+ cursor: pointer;
+ width: 1.2rem;
+}
+
+.component-page-wrapper .top-menu input::placeholder {
+ color: #ACB5CC;
+}
+
+/* Switch */
+
+.switch input {
+ position: absolute;
+ height: 1px;
+ width: 1px;
+ background: none;
+ border: 0;
+ clip: rect(0, 0, 0, 0);
+ clip-path: inset(50%);
+ overflow: hidden;
+ padding: 0;
+}
+
+.switch input ~ label {
+ position: relative;
+ min-width: calc(calc(2.375rem * .8) * 2);
+ border-radius: calc(2.375rem * .8);
+ height: calc(2.375rem * .8);
+ line-height: calc(2.375rem * .8);
+ display: inline-block;
+ cursor: pointer;
+ outline: none;
+ user-select: none;
+ vertical-align: middle;
+ text-indent: calc(calc(calc(2.375rem * .8) * 2) + .5rem);
+ margin-bottom: 0;
+}
+
+.switch input ~ label::before, .switch input ~ label::after {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: calc(calc(2.375rem * .8) * 2);
+ bottom: 0;
+ display: block;
+}
+
+.switch input ~ label::before {
+ right: 0;
+ background-color: #dee2e6;
+ border-radius: calc(2.375rem * .8);
+ transition: 0.2s all;
+}
+
+.switch input ~ label::after {
+ top: 2px;
+ left: 2px;
+ width: calc(calc(2.375rem * .8) - calc(2px * 2));
+ height: calc(calc(2.375rem * .8) - calc(2px * 2));
+ border-radius: 50%;
+ background-color: white;
+ transition: 0.2s all;
+}
+
+.switch input:checked ~ label::before {
+ background-color: #7fdaa1;
+}
+
+.switch input:checked ~ label::after {
+ margin-left: calc(2.375rem * .8);
+}
+
+.switch input:focus ~ label::before {
+ outline: none;
+ box-shadow: 0 0 0 0.2rem rgba(0, 136, 221, 0.25);
+}
+
+.switch input:disabled ~ label {
+ color: #868e96;
+ cursor: not-allowed;
+}
+
+.switch input:disabled ~ label::before {
+ background-color: #e9ecef;
+}
+
+.switch.switch-sm {
+ font-size: 1rem;
+}
+
+.switch.switch-sm input ~ label {
+ min-width: calc(calc(1.9375rem * .8) * 2);
+ height: calc(1.9375rem * .8);
+ line-height: calc(1.9375rem * .8);
+ text-indent: calc(calc(calc(1.9375rem * .8) * 2) + .5rem);
+}
+
+.switch.switch-sm input ~ label::before {
+ width: calc(calc(1.9375rem * .8) * 2);
+}
+
+.switch.switch-sm input ~ label::after {
+ width: calc(calc(1.9375rem * .8) - calc(2px * 2));
+ height: calc(calc(1.9375rem * .8) - calc(2px * 2));
+}
+
+.switch.switch-sm input:checked ~ label::after {
+ margin-left: calc(1.9375rem * .8);
+}
+
+.switch+.switch {
+ margin-left: 1rem;
+}
+
+#qb-question-authoring-modal .modal-content {
+ height: 100%;
+}
+
+#qb-question-authoring-modal iframe {
+ width: 100%;
+ height: 100%;
+ border: none;
+}
+
+.toast-top {
+ position: fixed;
+ top: 3rem;
+ left: 50%;
+ transform: translate(-50%, 0px);
+ z-index: 10;
+}
+
+.toast-top .alert {
+ margin: 0;
+}
+
+
+
+/* Unused? */
+/*
+
+.content-left {
+ -ms-flex: 0 0 26.5rem;
+ flex: 0 0 26.5rem;
+ max-width: 26.5rem;
+}
+
+.content-right {
+ -ms-flex: 0 0 calc(100% - 26.5rem);
+ flex: 0 0 calc(100% - 26.5rem);
+ max-width: calc(100% - 26.5rem);
+}
+
+.graph-con {
+ min-height: 12rem;
+ width: calc(100% - 8rem);
+ overflow: hidden;
+ min-height: 11.11rem !important;
+}
+
+
+.tablesorter {
+ max-width: 100%;
+ margin-top: .75rem;
+}
+
+.tablesorter-bootstrap:not (.table-dark ) thead:not (.thead-dark )
+ .tablesorter-header, .tablesorter-bootstrap:not (.table-dark ) tfoot th,
+ .tablesorter-bootstrap:not (.table-dark ) tfoot td {
+ background: #fff;
+}
+
+.tablesorter td a {
+ color: #2E384D;
+}
+
+.tablesorter td ul {
+ margin-bottom: 0;
+}
+
+.tablesorter td input.form-control {
+ height: 2.5rem !important;
+ width: 3.5rem !important;
+ border-radius: 1.1rem !important;
+ text-align: center;
+}
+
+
+.switch.switch-lg {
+ font-size: 1.25rem;
+}
+
+.switch.switch-lg input ~ label {
+ min-width: calc(calc(3rem * .8)* 2);
+ height: calc(3rem * .8);
+ line-height: calc(3rem * .8);
+ text-indent: calc(calc(calc(3rem * .8) * 2) + .5rem);
+}
+
+.switch.switch-lg input ~ label::before {
+ width: calc(calc(3rem * .8)* 2);
+}
+
+.switch.switch-lg input ~ label::after {
+ width: calc(calc(3rem * .8) - calc(2px * 2));
+ height: calc(calc(3rem * .8) - calc(2px * 2));
+}
+
+.switch.switch-lg input:checked ~ label::after {
+ margin-left: calc(3rem * .8);
+}
+
+.banner-box-col-gate p.grey_text {
+ color: #677084;
+ font-size: 1rem;
+}
+
+*/
\ No newline at end of file
Index: lams_monitoring/web/WEB-INF/tags/Dropdown.tag
===================================================================
diff -u
--- lams_monitoring/web/WEB-INF/tags/Dropdown.tag (revision 0)
+++ lams_monitoring/web/WEB-INF/tags/Dropdown.tag (revision cef0d9bb2b10841da2f2f948dcfd261f6ed7d644)
@@ -0,0 +1,40 @@
+<%
+ /**
+ * Dropdown.tag
+ * Author: Marcin Cieslak
+ * Description: Displays a row with a label and a styled select widget
+ */
+ %>
+<%@ tag body-content="scriptless" %>
+<%@ taglib uri="tags-core" prefix="c" %>
+<%@ taglib uri="tags-fmt" prefix="fmt" %>
+<%@ taglib uri="tags-lams" prefix="lams" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ attribute name="name" required="true" rtexprvalue="true" %>
+<%@ attribute name="labelKey" required="true" rtexprvalue="true" %>
+
+<%@ attribute name="id" required="false" rtexprvalue="true" %>
+<%@ attribute name="useSpringForm" required="false" rtexprvalue="true" %>
+<%@ attribute name="inputCellClass" required="false" rtexprvalue="true" %>
+<%@ attribute name="tooltipKey" required="false" rtexprvalue="true" %>
+<%@ attribute name="tooltipDescriptionKey" required="false" rtexprvalue="true" %>
+
+