summaryrefslogtreecommitdiffstats
path: root/test-scheduler/ui/src
diff options
context:
space:
mode:
Diffstat (limited to 'test-scheduler/ui/src')
-rw-r--r--test-scheduler/ui/src/App.vue19
-rw-r--r--test-scheduler/ui/src/Global.vue10
-rw-r--r--test-scheduler/ui/src/assets/css/editor.css47
-rw-r--r--test-scheduler/ui/src/assets/css/mystyle.css238
-rw-r--r--test-scheduler/ui/src/assets/css/style.css8435
-rw-r--r--test-scheduler/ui/src/assets/css/toastr.min.css222
-rw-r--r--test-scheduler/ui/src/assets/css/wf-graph.css13
-rw-r--r--test-scheduler/ui/src/assets/js/inspinia.js298
-rw-r--r--test-scheduler/ui/src/assets/js/jquery-vendor.js4
-rw-r--r--test-scheduler/ui/src/assets/js/pace.min.js2
-rw-r--r--test-scheduler/ui/src/assets/js/toastr.min.js2
-rw-r--r--test-scheduler/ui/src/components/editor/editor.vue141
-rw-r--r--test-scheduler/ui/src/components/editor/flow.vue340
-rw-r--r--test-scheduler/ui/src/components/editor/step.vue222
-rw-r--r--test-scheduler/ui/src/components/env_component/api_param.vue63
-rw-r--r--test-scheduler/ui/src/components/env_component/base_input.vue20
-rw-r--r--test-scheduler/ui/src/components/env_component/service_api.vue112
-rw-r--r--test-scheduler/ui/src/components/env_component/service_modal.vue193
-rw-r--r--test-scheduler/ui/src/components/environment.vue239
-rw-r--r--test-scheduler/ui/src/components/message/showMessage.js30
-rw-r--r--test-scheduler/ui/src/components/testcase.vue349
-rw-r--r--test-scheduler/ui/src/components/testcase_content.vue215
-rw-r--r--test-scheduler/ui/src/components/testsuite.vue369
-rw-r--r--test-scheduler/ui/src/components/workflow_graph/wfresult.vue236
-rw-r--r--test-scheduler/ui/src/main.js31
-rw-r--r--test-scheduler/ui/src/router/index.js44
26 files changed, 11894 insertions, 0 deletions
diff --git a/test-scheduler/ui/src/App.vue b/test-scheduler/ui/src/App.vue
new file mode 100644
index 00000000..c432a12d
--- /dev/null
+++ b/test-scheduler/ui/src/App.vue
@@ -0,0 +1,19 @@
+<template>
+ <div id="app">
+ <div class="row border-bottom blue-bg my-page-header">
+ <p id="title">OPNFV Bottlenecks Portal</p>
+ <ul id="intr_table" class="nav navbar-nav">
+ <li><router-link to="/">Test Suites</router-link></li>
+ <li><router-link to="/result">Test Results</router-link></li>
+ <li><router-link to="/report">Reports</router-link></li>
+ <li><router-link to="/environment">Environments</router-link></li>
+ </ul>
+ </div>
+ <router-view/>
+ </div>
+</template>
+<script>
+export default {
+ name: 'App'
+}
+</script>
diff --git a/test-scheduler/ui/src/Global.vue b/test-scheduler/ui/src/Global.vue
new file mode 100644
index 00000000..71defaac
--- /dev/null
+++ b/test-scheduler/ui/src/Global.vue
@@ -0,0 +1,10 @@
+<script>
+const SERVER_ADDR = '/parser/'
+const WF_GRAPH_ADDR = '/wf-graph/'
+const WF_SERVER_ADDR = '/wf-server/'
+export default {
+ SERVER_ADDR,
+ WF_GRAPH_ADDR,
+ WF_SERVER_ADDR
+}
+</script>
diff --git a/test-scheduler/ui/src/assets/css/editor.css b/test-scheduler/ui/src/assets/css/editor.css
new file mode 100644
index 00000000..3d0264f4
--- /dev/null
+++ b/test-scheduler/ui/src/assets/css/editor.css
@@ -0,0 +1,47 @@
+.row {
+ padding-bottom: 5px;
+ margin-left: 0 !important;
+}
+
+.ibox-content {
+ overflow: hidden;
+}
+
+.col-lg-6 {
+ float: none !important;
+}
+
+.col-md-5 {
+ margin-bottom: 10px !important;
+}
+
+.step {
+ border-color: #fff !important;
+}
+
+.headmsg {
+ position: relative;
+ float: left;
+ font-size: 14px;
+ margin-top: 3px;
+ margin-left: 20px;
+ margin-right: 40px;
+ width: 5%;
+}
+
+.form-group {
+ clear: both;
+}
+
+.border-ibox {
+ border-color: lightgray;
+ border-style: solid;
+ border-width: thin;
+}
+
+.ibox-title {
+ padding-bottom: 20px;
+}
+.ibox-title h5 {
+ font-size: 22px;
+}
diff --git a/test-scheduler/ui/src/assets/css/mystyle.css b/test-scheduler/ui/src/assets/css/mystyle.css
new file mode 100644
index 00000000..72692469
--- /dev/null
+++ b/test-scheduler/ui/src/assets/css/mystyle.css
@@ -0,0 +1,238 @@
+header{
+ background-color: #1288c3;
+ height: 100px;
+
+}
+#title{
+ font-size: 36px;
+ padding: 10px 20px;
+ margin: auto;
+ width: fit-content;
+ float: left;
+}
+#intr_table{
+ margin-top: 16px;
+ margin-left: 150px;
+}
+#intr_table li{
+ font-size: 20px;
+ margin-right: 20px;
+}
+#intr_table li a{
+ color: white!important;
+ font-weight: normal;
+}
+#intr_table li a:visited{
+ background-color: #1c84c6;
+}
+#intr_table li a:hover{
+ background-color: #1c84c6;
+ text-decoration: underline;
+}
+#intr_table li a:active{
+ background-color: #1c84c6;
+}
+.title-section {
+ margin-bottom: 10px;
+}
+.workflow-title-section {
+ margin-bottom: 50px;
+}
+
+.content-title {
+ font-size: 30px;
+ font-weight: 600;
+}
+.subTitle{
+ font-size: 25px;
+ margin-bottom: 0px;
+ display: inline-block;
+}
+.my-button{
+ margin: 30px 20px 30px 0;
+ padding: 5px 20px 10px 20px;
+ font-size: 20px;
+ border: 0px;
+ color: white;
+}
+.my-button-group {
+ position: relative;
+ display: inline-block;
+ float: right;
+ margin-top: 5px;
+}
+.my-button-sm {
+ margin: 0 5px 0 0;
+}
+
+.thead-style {
+ margin-top: 8px;
+ margin-bottom: 8px;
+ font-weight: bold;
+}
+.thead-style label {
+ font-weight: bold;
+}
+.my-checkbox{
+ margin-top: 0;
+ margin-bottom: 0;
+ word-break: break-all;
+}
+
+.name{
+ /*width: 400px;*/
+ word-break: break-all;
+}
+.categories{
+ /*width: 450px;*/
+ word-break: break-all;
+}
+.smallbox{
+ width: 200px;
+ word-break: break-all;
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+
+}
+.description{
+ /*width: 480px;*/
+ word-break: break-all;
+}
+#p2_content1{
+ /*display: inline-block;
+ margin-right: 100px;*/
+}
+#p2_content2{
+ display: inline-block;
+}
+
+.inline-div {
+ display: inline-block;
+}
+.float-left {
+ float: left;
+}
+
+
+.margin-right-100 {
+ margin-right: 100px;
+}
+
+.white-pink {
+margin-left:auto;
+margin-right:auto;
+max-width: 500px;
+background: #FFF;
+padding: 30px 30px 20px 30px;
+box-shadow: rgba(187, 187, 187, 1) 0 0px 20px -1px;
+-webkit-box-shadow: rgba(187, 187, 187, 1) 0 0px 20px -1px;
+font: 12px Arial, Helvetica, sans-serif;
+color: #666;
+border-radius: 10px;
+-webkit-border-radius: 10px;
+}
+.white-pink h1 {
+font: 24px "Trebuchet MS", Arial, Helvetica, sans-serif;
+padding: 0px 0px 10px 40px;
+display: block;
+border-bottom: 1px solid #F5F5F5;
+margin: -10px -30px 10px -30px;
+color: #969696;
+}
+.white-pink h1>span {
+display: block;
+font-size: 11px;
+color: #C4C2C2;
+}
+.white-pink label {
+display: block;
+margin: 0px 0px 5px;
+}
+.white-pink label>span {
+float: left;
+width: 20%;
+text-align: right;
+padding-right: 10px;
+margin-top: 10px;
+color: #969696;
+}
+.white-pink input[type="text"], .white-pink input[type="email"], .white-pink textarea,.white-pink select{
+color: #555;
+width: 70%;
+padding: 3px 0px 3px 5px;
+margin-top: 2px;
+margin-right: 6px;
+margin-bottom: 16px;
+border: 1px solid #e5e5e5;
+background: #fbfbfb;
+height: 25px;
+line-height:15px;
+outline: 0;
+-webkit-box-shadow: inset 1px 1px 2px rgba(200,200,200,0.2);
+box-shadow: inset 1px 1px 2px rgba(200,200,200,0.2);
+}
+.white-pink textarea{
+padding: 5px 0px 0px 5px;
+}
+.white-pink .button {
+-moz-box-shadow:inset 0px 1px 0px 0px #fbafe3;
+-webkit-box-shadow:inset 0px 1px 0px 0px #fbafe3;
+box-shadow:inset 0px 1px 0px 0px #fbafe3;
+background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #ff5bb0), color-stop(1, #ef027d) );
+background:-moz-linear-gradient( center top, #ff5bb0 5%, #ef027d 100% );
+filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bb0', endColorstr='#ef027d');
+background-color:#ff5bb0;
+border-radius:9px;
+-webkit-border-radius:9px;
+-moz-border-border-radius:9px;
+border:1px solid #ee1eb5;
+display:inline-block;
+color:#ffffff;
+font-family:Arial;
+font-size:15px;
+font-weight:bold;
+font-style:normal;
+height: 40px;
+line-height: 30px;
+width:100px;
+text-decoration:none;
+text-align:center;
+text-shadow:1px 1px 0px #c70067;
+}
+.white-pink .button:hover {
+background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #ef027d), color-stop(1, #ff5bb0) );
+background:-moz-linear-gradient( center top, #ef027d 5%, #ff5bb0 100% );
+filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ef027d', endColorstr='#ff5bb0');
+background-color:#ef027d;
+}
+.white-pink .button:active {
+position:relative;
+top:1px;
+}
+
+
+#flow-tabs {
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+ background-color: #f1f1f1;
+}
+
+#flow-tabs li a {
+ display: block;
+ color: #000;
+ padding: 8px 16px;
+ text-decoration: none;
+}
+
+#flow-tabs li.active {
+ background-color: #4CAF50;
+ color: white;
+}
+
+#flow-tabs li a:hover:not(.active) {
+ background-color: #555;
+ color: white;
+}
diff --git a/test-scheduler/ui/src/assets/css/style.css b/test-scheduler/ui/src/assets/css/style.css
new file mode 100644
index 00000000..bd3f81c9
--- /dev/null
+++ b/test-scheduler/ui/src/assets/css/style.css
@@ -0,0 +1,8435 @@
+@import url("https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700");
+@import url("https://fonts.googleapis.com/css?family=Roboto:400,300,500,700");
+/*
+ *
+ * INSPINIA - Responsive Admin Theme
+ * version 2.7.1
+ *
+*/
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-weight: 100;
+}
+h1 {
+ font-size: 30px;
+}
+h2 {
+ font-size: 24px;
+}
+h3 {
+ font-size: 16px;
+}
+h4 {
+ font-size: 14px;
+}
+h5 {
+ font-size: 12px;
+}
+h6 {
+ font-size: 10px;
+}
+h3,
+h4,
+h5 {
+ margin-top: 5px;
+ font-weight: 600;
+}
+.nav > li > a {
+ color: #a7b1c2;
+ font-weight: 600;
+ padding: 14px 20px 14px 25px;
+}
+.nav.navbar-right > li > a {
+ color: #999c9e;
+}
+.nav > li.active > a {
+ color: #ffffff;
+}
+.navbar-default .nav > li > a:hover,
+.navbar-default .nav > li > a:focus {
+ background-color: #293846;
+ color: white;
+}
+.nav .open > a,
+.nav .open > a:hover,
+.nav .open > a:focus {
+ background: #fff;
+}
+.nav.navbar-top-links > li > a:hover,
+.nav.navbar-top-links > li > a:focus {
+ background-color: transparent;
+}
+.nav > li > a i {
+ margin-right: 6px;
+}
+.navbar {
+ border: 0;
+}
+.navbar-default {
+ background-color: transparent;
+ border-color: #2f4050;
+}
+.navbar-top-links li {
+ display: inline-block;
+}
+.navbar-top-links li:last-child {
+ margin-right: 40px;
+}
+.body-small .navbar-top-links li:last-child {
+ margin-right: 0;
+}
+.navbar-top-links li a {
+ padding: 20px 10px;
+ min-height: 50px;
+}
+.dropdown-menu {
+ border: medium none;
+ border-radius: 3px;
+ box-shadow: 0 0 3px rgba(86, 96, 117, 0.7);
+ display: none;
+ float: left;
+ font-size: 12px;
+ left: 0;
+ list-style: none outside none;
+ padding: 0;
+ position: absolute;
+ text-shadow: none;
+ top: 100%;
+ z-index: 1000;
+}
+.dropdown-menu > li > a {
+ border-radius: 3px;
+ color: inherit;
+ line-height: 25px;
+ margin: 4px;
+ text-align: left;
+ font-weight: normal;
+}
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:focus,
+.dropdown-menu > .active > a:hover {
+ color: #fff;
+ text-decoration: none;
+ background-color: #1ab394;
+ outline: 0;
+}
+.dropdown-menu > li > a.font-bold {
+ font-weight: 600;
+}
+.navbar-top-links .dropdown-menu li {
+ display: block;
+}
+.navbar-top-links .dropdown-menu li:last-child {
+ margin-right: 0;
+}
+.navbar-top-links .dropdown-menu li a {
+ padding: 3px 20px;
+ min-height: 0;
+}
+.navbar-top-links .dropdown-menu li a div {
+ white-space: normal;
+}
+.navbar-top-links .dropdown-messages,
+.navbar-top-links .dropdown-tasks,
+.navbar-top-links .dropdown-alerts {
+ width: 310px;
+ min-width: 0;
+}
+.navbar-top-links .dropdown-messages {
+ margin-left: 5px;
+}
+.navbar-top-links .dropdown-tasks {
+ margin-left: -59px;
+}
+.navbar-top-links .dropdown-alerts {
+ margin-left: -123px;
+}
+.navbar-top-links .dropdown-user {
+ right: 0;
+ left: auto;
+}
+.dropdown-messages,
+.dropdown-alerts {
+ padding: 10px 10px 10px 10px;
+}
+.dropdown-messages li a,
+.dropdown-alerts li a {
+ font-size: 12px;
+}
+.dropdown-messages li em,
+.dropdown-alerts li em {
+ font-size: 10px;
+}
+.nav.navbar-top-links .dropdown-alerts a {
+ font-size: 12px;
+}
+.nav-header {
+ padding: 33px 25px;
+ background-color: #2f4050;
+}
+.pace-done .nav-header {
+ transition: all 0.4s;
+}
+ul.nav-second-level {
+ background: #293846;
+}
+.nav > li.active {
+ border-left: 4px solid #19aa8d;
+ background: #293846;
+}
+.nav.nav-second-level > li.active {
+ border: none;
+}
+.nav.nav-second-level.collapse[style] {
+ height: auto !important;
+}
+.nav-header a {
+ color: #DFE4ED;
+}
+.nav-header .text-muted {
+ color: #8095a8;
+}
+.minimalize-styl-2 {
+ padding: 4px 12px;
+ margin: 14px 5px 5px 20px;
+ font-size: 14px;
+ float: left;
+}
+.navbar-form-custom {
+ float: left;
+ height: 50px;
+ padding: 0;
+ width: 200px;
+ display: block;
+}
+.navbar-form-custom .form-group {
+ margin-bottom: 0;
+}
+.nav.navbar-top-links a {
+ font-size: 14px;
+}
+.navbar-form-custom .form-control {
+ background: none repeat scroll 0 0 rgba(0, 0, 0, 0);
+ border: medium none;
+ font-size: 14px;
+ height: 60px;
+ margin: 0;
+ z-index: 2000;
+}
+.count-info .label {
+ line-height: 12px;
+ padding: 2px 5px;
+ position: absolute;
+ right: 6px;
+ top: 12px;
+}
+.arrow {
+ float: right;
+}
+.fa.arrow:before {
+ content: "\f104";
+}
+.active > a > .fa.arrow:before {
+ content: "\f107";
+}
+.nav-second-level li,
+.nav-third-level li {
+ border-bottom: none !important;
+}
+.nav-second-level li a {
+ padding: 7px 10px 7px 10px;
+ padding-left: 52px;
+}
+.nav-third-level li a {
+ padding-left: 62px;
+}
+.nav-second-level li:last-child {
+ margin-bottom: 10px;
+}
+body:not(.fixed-sidebar):not(.canvas-menu).mini-navbar .nav li:hover > .nav-second-level,
+.mini-navbar .nav li:focus > .nav-second-level {
+ display: block;
+ border-radius: 0 2px 2px 0;
+ min-width: 140px;
+ height: auto;
+}
+body.mini-navbar .navbar-default .nav > li > .nav-second-level li a {
+ font-size: 12px;
+ border-radius: 3px;
+}
+.fixed-nav .slimScrollDiv #side-menu {
+ padding-bottom: 60px;
+}
+.mini-navbar .nav-second-level li a {
+ padding: 10px 10px 10px 15px;
+}
+.mini-navbar .nav .nav-second-level {
+ position: absolute;
+ left: 70px;
+ top: 0;
+ background-color: #2f4050;
+ padding: 10px 10px 10px 10px;
+ font-size: 12px;
+}
+.canvas-menu.mini-navbar .nav-second-level {
+ background: #293846;
+}
+.mini-navbar li.active .nav-second-level {
+ left: 65px;
+}
+.navbar-default .special_link a {
+ background: #1ab394;
+ color: white;
+}
+.navbar-default .special_link a:hover {
+ background: #17987e !important;
+ color: white;
+}
+.navbar-default .special_link a span.label {
+ background: #fff;
+ color: #1ab394;
+}
+.navbar-default .landing_link a {
+ background: #1cc09f;
+ color: white;
+}
+.navbar-default .landing_link a:hover {
+ background: #1ab394 !important;
+ color: white;
+}
+.navbar-default .landing_link a span.label {
+ background: #fff;
+ color: #1cc09f;
+}
+.logo-element {
+ text-align: center;
+ font-size: 18px;
+ font-weight: 600;
+ color: white;
+ display: none;
+ padding: 18px 0;
+}
+.pace-done .navbar-static-side,
+.pace-done .nav-header,
+.pace-done li.active,
+.pace-done #page-wrapper,
+.pace-done .footer {
+ -webkit-transition: all 0.4s;
+ -moz-transition: all 0.4s;
+ -o-transition: all 0.4s;
+ transition: all 0.4s;
+}
+.navbar-fixed-top {
+ background: #fff;
+ transition-duration: 0.4s;
+ border-bottom: 1px solid #e7eaec !important;
+ z-index: 2030;
+}
+.navbar-fixed-top,
+.navbar-static-top {
+ background: #f3f3f4;
+}
+.fixed-nav #wrapper {
+ margin-top: 0;
+}
+.nav-tabs > li.active > a,
+.nav-tabs > li.active > a:hover,
+.nav-tabs > li.active > a:focus {
+ -moz-border-bottom-colors: none;
+ -moz-border-left-colors: none;
+ -moz-border-right-colors: none;
+ -moz-border-top-colors: none;
+ background: none;
+ border-color: #dddddd #dddddd rgba(0, 0, 0, 0);
+ border-bottom: #f3f3f4;
+ border-image: none;
+ border-style: solid;
+ border-width: 1px;
+ color: #555555;
+ cursor: default;
+}
+.nav.nav-tabs li {
+ background: none;
+ border: none;
+}
+body.fixed-nav #wrapper .navbar-static-side,
+body.fixed-nav #wrapper #page-wrapper {
+ margin-top: 60px;
+}
+body.top-navigation.fixed-nav #wrapper #page-wrapper {
+ margin-top: 0;
+}
+body.fixed-nav.fixed-nav-basic .navbar-fixed-top {
+ left: 220px;
+}
+body.fixed-nav.fixed-nav-basic.mini-navbar .navbar-fixed-top {
+ left: 70px;
+}
+body.fixed-nav.fixed-nav-basic.fixed-sidebar.mini-navbar .navbar-fixed-top {
+ left: 0;
+}
+body.fixed-nav.fixed-nav-basic #wrapper .navbar-static-side {
+ margin-top: 0;
+}
+body.fixed-nav.fixed-nav-basic.body-small .navbar-fixed-top {
+ left: 0;
+}
+body.fixed-nav.fixed-nav-basic.fixed-sidebar.mini-navbar.body-small .navbar-fixed-top {
+ left: 220px;
+}
+.fixed-nav .minimalize-styl-2 {
+ margin: 14px 5px 5px 15px;
+}
+.body-small .navbar-fixed-top {
+ margin-left: 0;
+}
+body.mini-navbar .navbar-static-side {
+ width: 70px;
+}
+body.mini-navbar .profile-element,
+body.mini-navbar .nav-label,
+body.mini-navbar .navbar-default .nav li a span {
+ display: none;
+}
+body.canvas-menu .profile-element {
+ display: block;
+}
+body:not(.fixed-sidebar):not(.canvas-menu).mini-navbar .nav-second-level {
+ display: none;
+}
+body.mini-navbar .navbar-default .nav > li > a {
+ font-size: 16px;
+}
+body.mini-navbar .logo-element {
+ display: block;
+}
+body.canvas-menu .logo-element {
+ display: none;
+}
+body.mini-navbar .nav-header {
+ padding: 0;
+ background-color: #1ab394;
+}
+body.canvas-menu .nav-header {
+ padding: 33px 25px;
+}
+body.mini-navbar #page-wrapper {
+ margin: 0 0 0 70px;
+}
+body.fixed-sidebar.mini-navbar .footer,
+body.canvas-menu.mini-navbar .footer {
+ margin: 0 0 0 0 !important;
+}
+body.canvas-menu.mini-navbar #page-wrapper,
+body.canvas-menu.mini-navbar .footer {
+ margin: 0 0 0 0;
+}
+body.fixed-sidebar .navbar-static-side,
+body.canvas-menu .navbar-static-side {
+ position: fixed;
+ width: 220px;
+ z-index: 2001;
+ height: 100%;
+}
+body.fixed-sidebar.mini-navbar .navbar-static-side {
+ width: 0;
+}
+body.fixed-sidebar.mini-navbar #page-wrapper {
+ margin: 0 0 0 0;
+}
+body.body-small.fixed-sidebar.mini-navbar #page-wrapper {
+ margin: 0 0 0 220px;
+}
+body.body-small.fixed-sidebar.mini-navbar .navbar-static-side {
+ width: 220px;
+}
+.fixed-sidebar.mini-navbar .nav li:focus > .nav-second-level,
+.canvas-menu.mini-navbar .nav li:focus > .nav-second-level {
+ display: block;
+ height: auto;
+}
+body.fixed-sidebar.mini-navbar .navbar-default .nav > li > .nav-second-level li a {
+ font-size: 12px;
+ border-radius: 3px;
+}
+body.canvas-menu.mini-navbar .navbar-default .nav > li > .nav-second-level li a {
+ font-size: 13px;
+ border-radius: 3px;
+}
+.fixed-sidebar.mini-navbar .nav-second-level li a,
+.canvas-menu.mini-navbar .nav-second-level li a {
+ padding: 10px 10px 10px 15px;
+}
+.fixed-sidebar.mini-navbar .nav-second-level,
+.canvas-menu.mini-navbar .nav-second-level {
+ position: relative;
+ padding: 0;
+ font-size: 13px;
+}
+.fixed-sidebar.mini-navbar li.active .nav-second-level,
+.canvas-menu.mini-navbar li.active .nav-second-level {
+ left: 0;
+}
+body.fixed-sidebar.mini-navbar .navbar-default .nav > li > a,
+body.canvas-menu.mini-navbar .navbar-default .nav > li > a {
+ font-size: 13px;
+}
+body.fixed-sidebar.mini-navbar .nav-label,
+body.fixed-sidebar.mini-navbar .navbar-default .nav li a span,
+body.canvas-menu.mini-navbar .nav-label,
+body.canvas-menu.mini-navbar .navbar-default .nav li a span {
+ display: inline;
+}
+body.canvas-menu.mini-navbar .navbar-default .nav li .profile-element a span {
+ display: block;
+}
+.canvas-menu.mini-navbar .nav-second-level li a,
+.fixed-sidebar.mini-navbar .nav-second-level li a {
+ padding: 7px 10px 7px 52px;
+}
+.fixed-sidebar.mini-navbar .nav-second-level,
+.canvas-menu.mini-navbar .nav-second-level {
+ left: 0;
+}
+body.canvas-menu nav.navbar-static-side {
+ z-index: 2001;
+ background: #2f4050;
+ height: 100%;
+ position: fixed;
+ display: none;
+}
+body.canvas-menu.mini-navbar nav.navbar-static-side {
+ display: block;
+ width: 220px;
+}
+.top-navigation #page-wrapper {
+ margin-left: 0;
+}
+.top-navigation .navbar-nav .dropdown-menu > .active > a {
+ background: white;
+ color: #1ab394;
+ font-weight: bold;
+}
+.white-bg .navbar-fixed-top,
+.white-bg .navbar-static-top {
+ background: #fff;
+}
+.top-navigation .navbar {
+ margin-bottom: 0;
+}
+.top-navigation .nav > li > a {
+ padding: 15px 20px;
+ color: #676a6c;
+}
+.top-navigation .nav > li a:hover,
+.top-navigation .nav > li a:focus {
+ background: #fff;
+ color: #1ab394;
+}
+.top-navigation .navbar .nav > li.active {
+ background: #fff;
+ border: none;
+}
+.top-navigation .nav > li.active > a {
+ color: #1ab394;
+}
+.top-navigation .navbar-right {
+ margin-right: 10px;
+}
+.top-navigation .navbar-nav .dropdown-menu {
+ box-shadow: none;
+ border: 1px solid #e7eaec;
+}
+.top-navigation .dropdown-menu > li > a {
+ margin: 0;
+ padding: 7px 20px;
+}
+.navbar .dropdown-menu {
+ margin-top: 0;
+}
+.top-navigation .navbar-brand {
+ background: #1ab394;
+ color: #fff;
+ padding: 15px 25px;
+}
+.top-navigation .navbar-top-links li:last-child {
+ margin-right: 0;
+}
+.top-navigation.mini-navbar #page-wrapper,
+.top-navigation.body-small.fixed-sidebar.mini-navbar #page-wrapper,
+.mini-navbar .top-navigation #page-wrapper,
+.body-small.fixed-sidebar.mini-navbar .top-navigation #page-wrapper,
+.canvas-menu #page-wrapper {
+ margin: 0;
+}
+.top-navigation.fixed-nav #wrapper,
+.fixed-nav #wrapper.top-navigation {
+ margin-top: 50px;
+}
+.top-navigation .footer.fixed {
+ margin-left: 0 !important;
+}
+.top-navigation .wrapper.wrapper-content {
+ padding: 40px;
+}
+.top-navigation.body-small .wrapper.wrapper-content,
+.body-small .top-navigation .wrapper.wrapper-content {
+ padding: 40px 0 40px 0;
+}
+.navbar-toggle {
+ background-color: #1ab394;
+ color: #fff;
+ padding: 6px 12px;
+ font-size: 14px;
+}
+.top-navigation .navbar-nav .open .dropdown-menu > li > a,
+.top-navigation .navbar-nav .open .dropdown-menu .dropdown-header {
+ padding: 10px 15px 10px 20px;
+}
+@media (max-width: 768px) {
+ .top-navigation .navbar-header {
+ display: block;
+ float: none;
+ }
+}
+.menu-visible-lg,
+.menu-visible-md {
+ display: none !important;
+}
+@media (min-width: 1200px) {
+ .menu-visible-lg {
+ display: block !important;
+ }
+}
+@media (min-width: 992px) {
+ .menu-visible-md {
+ display: block !important;
+ }
+}
+@media (max-width: 767px) {
+ .menu-visible-md {
+ display: block !important;
+ }
+ .menu-visible-lg {
+ display: block !important;
+ }
+}
+.btn {
+ border-radius: 3px;
+}
+.float-e-margins .btn {
+ margin-bottom: 5px;
+}
+.btn-w-m {
+ min-width: 120px;
+}
+.btn-primary.btn-outline {
+ color: #1ab394;
+}
+.btn-success.btn-outline {
+ color: #1c84c6;
+}
+.btn-info.btn-outline {
+ color: #23c6c8;
+}
+.btn-warning.btn-outline {
+ color: #f8ac59;
+}
+.btn-danger.btn-outline {
+ color: #ed5565;
+}
+.btn-primary.btn-outline:hover,
+.btn-success.btn-outline:hover,
+.btn-info.btn-outline:hover,
+.btn-warning.btn-outline:hover,
+.btn-danger.btn-outline:hover {
+ color: #fff;
+}
+.btn-primary {
+ background-color: #1ab394;
+ border-color: #1ab394;
+ color: #FFFFFF;
+}
+.btn-primary:hover,
+.btn-primary:focus,
+.btn-primary:active,
+.btn-primary.active,
+.open .dropdown-toggle.btn-primary,
+.btn-primary:active:focus,
+.btn-primary:active:hover,
+.btn-primary.active:hover,
+.btn-primary.active:focus {
+ background-color: #18a689;
+ border-color: #18a689;
+ color: #FFFFFF;
+}
+.btn-primary:active,
+.btn-primary.active,
+.open .dropdown-toggle.btn-primary {
+ background-image: none;
+}
+.btn-primary.disabled,
+.btn-primary.disabled:hover,
+.btn-primary.disabled:focus,
+.btn-primary.disabled:active,
+.btn-primary.disabled.active,
+.btn-primary[disabled],
+.btn-primary[disabled]:hover,
+.btn-primary[disabled]:focus,
+.btn-primary[disabled]:active,
+.btn-primary.active[disabled],
+fieldset[disabled] .btn-primary,
+fieldset[disabled] .btn-primary:hover,
+fieldset[disabled] .btn-primary:focus,
+fieldset[disabled] .btn-primary:active,
+fieldset[disabled] .btn-primary.active {
+ background-color: #1dc5a3;
+ border-color: #1dc5a3;
+}
+.btn-success {
+ background-color: #1c84c6;
+ border-color: #1c84c6;
+ color: #FFFFFF;
+}
+.btn-success:hover,
+.btn-success:focus,
+.btn-success:active,
+.btn-success.active,
+.open .dropdown-toggle.btn-success,
+.btn-success:active:focus,
+.btn-success:active:hover,
+.btn-success.active:hover,
+.btn-success.active:focus {
+ background-color: #1a7bb9;
+ border-color: #1a7bb9;
+ color: #FFFFFF;
+}
+.btn-success:active,
+.btn-success.active,
+.open .dropdown-toggle.btn-success {
+ background-image: none;
+}
+.btn-success.disabled,
+.btn-success.disabled:hover,
+.btn-success.disabled:focus,
+.btn-success.disabled:active,
+.btn-success.disabled.active,
+.btn-success[disabled],
+.btn-success[disabled]:hover,
+.btn-success[disabled]:focus,
+.btn-success[disabled]:active,
+.btn-success.active[disabled],
+fieldset[disabled] .btn-success,
+fieldset[disabled] .btn-success:hover,
+fieldset[disabled] .btn-success:focus,
+fieldset[disabled] .btn-success:active,
+fieldset[disabled] .btn-success.active {
+ background-color: #1f90d8;
+ border-color: #1f90d8;
+}
+.btn-info {
+ background-color: #23c6c8;
+ border-color: #23c6c8;
+ color: #FFFFFF;
+}
+.btn-info:hover,
+.btn-info:focus,
+.btn-info:active,
+.btn-info.active,
+.open .dropdown-toggle.btn-info,
+.btn-info:active:focus,
+.btn-info:active:hover,
+.btn-info.active:hover,
+.btn-info.active:focus {
+ background-color: #21b9bb;
+ border-color: #21b9bb;
+ color: #FFFFFF;
+}
+.btn-info:active,
+.btn-info.active,
+.open .dropdown-toggle.btn-info {
+ background-image: none;
+}
+.btn-info.disabled,
+.btn-info.disabled:hover,
+.btn-info.disabled:focus,
+.btn-info.disabled:active,
+.btn-info.disabled.active,
+.btn-info[disabled],
+.btn-info[disabled]:hover,
+.btn-info[disabled]:focus,
+.btn-info[disabled]:active,
+.btn-info.active[disabled],
+fieldset[disabled] .btn-info,
+fieldset[disabled] .btn-info:hover,
+fieldset[disabled] .btn-info:focus,
+fieldset[disabled] .btn-info:active,
+fieldset[disabled] .btn-info.active {
+ background-color: #26d7d9;
+ border-color: #26d7d9;
+}
+.btn-default {
+ color: inherit;
+ background: white;
+ border: 1px solid #e7eaec;
+}
+.btn-default:hover,
+.btn-default:focus,
+.btn-default:active,
+.btn-default.active,
+.open .dropdown-toggle.btn-default,
+.btn-default:active:focus,
+.btn-default:active:hover,
+.btn-default.active:hover,
+.btn-default.active:focus {
+ color: inherit;
+ border: 1px solid #d2d2d2;
+}
+.btn-default:active,
+.btn-default.active,
+.open .dropdown-toggle.btn-default {
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15) inset;
+}
+.btn-default.disabled,
+.btn-default.disabled:hover,
+.btn-default.disabled:focus,
+.btn-default.disabled:active,
+.btn-default.disabled.active,
+.btn-default[disabled],
+.btn-default[disabled]:hover,
+.btn-default[disabled]:focus,
+.btn-default[disabled]:active,
+.btn-default.active[disabled],
+fieldset[disabled] .btn-default,
+fieldset[disabled] .btn-default:hover,
+fieldset[disabled] .btn-default:focus,
+fieldset[disabled] .btn-default:active,
+fieldset[disabled] .btn-default.active {
+ color: #cacaca;
+}
+.btn-warning {
+ background-color: #f8ac59;
+ border-color: #f8ac59;
+ color: #FFFFFF;
+}
+.btn-warning:hover,
+.btn-warning:focus,
+.btn-warning:active,
+.btn-warning.active,
+.open .dropdown-toggle.btn-warning,
+.btn-warning:active:focus,
+.btn-warning:active:hover,
+.btn-warning.active:hover,
+.btn-warning.active:focus {
+ background-color: #f7a54a;
+ border-color: #f7a54a;
+ color: #FFFFFF;
+}
+.btn-warning:active,
+.btn-warning.active,
+.open .dropdown-toggle.btn-warning {
+ background-image: none;
+}
+.btn-warning.disabled,
+.btn-warning.disabled:hover,
+.btn-warning.disabled:focus,
+.btn-warning.disabled:active,
+.btn-warning.disabled.active,
+.btn-warning[disabled],
+.btn-warning[disabled]:hover,
+.btn-warning[disabled]:focus,
+.btn-warning[disabled]:active,
+.btn-warning.active[disabled],
+fieldset[disabled] .btn-warning,
+fieldset[disabled] .btn-warning:hover,
+fieldset[disabled] .btn-warning:focus,
+fieldset[disabled] .btn-warning:active,
+fieldset[disabled] .btn-warning.active {
+ background-color: #f9b66d;
+ border-color: #f9b66d;
+}
+.btn-danger {
+ background-color: #ed5565;
+ border-color: #ed5565;
+ color: #FFFFFF;
+}
+.btn-danger:hover,
+.btn-danger:focus,
+.btn-danger:active,
+.btn-danger.active,
+.open .dropdown-toggle.btn-danger,
+.btn-danger:active:focus,
+.btn-danger:active:hover,
+.btn-danger.active:hover,
+.btn-danger.active:focus {
+ background-color: #ec4758;
+ border-color: #ec4758;
+ color: #FFFFFF;
+}
+.btn-danger:active,
+.btn-danger.active,
+.open .dropdown-toggle.btn-danger {
+ background-image: none;
+}
+.btn-danger.disabled,
+.btn-danger.disabled:hover,
+.btn-danger.disabled:focus,
+.btn-danger.disabled:active,
+.btn-danger.disabled.active,
+.btn-danger[disabled],
+.btn-danger[disabled]:hover,
+.btn-danger[disabled]:focus,
+.btn-danger[disabled]:active,
+.btn-danger.active[disabled],
+fieldset[disabled] .btn-danger,
+fieldset[disabled] .btn-danger:hover,
+fieldset[disabled] .btn-danger:focus,
+fieldset[disabled] .btn-danger:active,
+fieldset[disabled] .btn-danger.active {
+ background-color: #ef6776;
+ border-color: #ef6776;
+}
+.btn-link {
+ color: inherit;
+}
+.btn-link:hover,
+.btn-link:focus,
+.btn-link:active,
+.btn-link.active,
+.open .dropdown-toggle.btn-link {
+ color: #1ab394;
+ text-decoration: none;
+}
+.btn-link:active,
+.btn-link.active,
+.open .dropdown-toggle.btn-link {
+ background-image: none;
+}
+.btn-link.disabled,
+.btn-link.disabled:hover,
+.btn-link.disabled:focus,
+.btn-link.disabled:active,
+.btn-link.disabled.active,
+.btn-link[disabled],
+.btn-link[disabled]:hover,
+.btn-link[disabled]:focus,
+.btn-link[disabled]:active,
+.btn-link.active[disabled],
+fieldset[disabled] .btn-link,
+fieldset[disabled] .btn-link:hover,
+fieldset[disabled] .btn-link:focus,
+fieldset[disabled] .btn-link:active,
+fieldset[disabled] .btn-link.active {
+ color: #cacaca;
+}
+.btn-white {
+ color: inherit;
+ background: white;
+ border: 1px solid #e7eaec;
+}
+.btn-white:hover,
+.btn-white:focus,
+.btn-white:active,
+.btn-white.active,
+.open .dropdown-toggle.btn-white,
+.btn-white:active:focus,
+.btn-white:active:hover,
+.btn-white.active:hover,
+.btn-white.active:focus {
+ color: inherit;
+ border: 1px solid #d2d2d2;
+}
+.btn-white:active,
+.btn-white.active {
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15) inset;
+}
+.btn-white:active,
+.btn-white.active,
+.open .dropdown-toggle.btn-white {
+ background-image: none;
+}
+.btn-white.disabled,
+.btn-white.disabled:hover,
+.btn-white.disabled:focus,
+.btn-white.disabled:active,
+.btn-white.disabled.active,
+.btn-white[disabled],
+.btn-white[disabled]:hover,
+.btn-white[disabled]:focus,
+.btn-white[disabled]:active,
+.btn-white.active[disabled],
+fieldset[disabled] .btn-white,
+fieldset[disabled] .btn-white:hover,
+fieldset[disabled] .btn-white:focus,
+fieldset[disabled] .btn-white:active,
+fieldset[disabled] .btn-white.active {
+ color: #cacaca;
+}
+.form-control,
+.form-control:focus,
+.has-error .form-control:focus,
+.has-success .form-control:focus,
+.has-warning .form-control:focus,
+.navbar-collapse,
+.navbar-form,
+.navbar-form-custom .form-control:focus,
+.navbar-form-custom .form-control:hover,
+.open .btn.dropdown-toggle,
+.panel,
+.popover,
+.progress,
+.progress-bar {
+ box-shadow: none;
+}
+.btn-outline {
+ color: inherit;
+ background-color: transparent;
+ transition: all .5s;
+}
+.btn-rounded {
+ border-radius: 50px;
+}
+.btn-large-dim {
+ width: 90px;
+ height: 90px;
+ font-size: 42px;
+}
+button.dim {
+ display: inline-block;
+ text-decoration: none;
+ text-transform: uppercase;
+ text-align: center;
+ padding-top: 6px;
+ margin-right: 10px;
+ position: relative;
+ cursor: pointer;
+ border-radius: 5px;
+ font-weight: 600;
+ margin-bottom: 20px !important;
+}
+button.dim:active {
+ top: 3px;
+}
+button.btn-primary.dim {
+ box-shadow: inset 0 0 0 #16987e, 0 5px 0 0 #16987e, 0 10px 5px #999999;
+}
+button.btn-primary.dim:active {
+ box-shadow: inset 0 0 0 #16987e, 0 2px 0 0 #16987e, 0 5px 3px #999999;
+}
+button.btn-default.dim {
+ box-shadow: inset 0 0 0 #b3b3b3, 0 5px 0 0 #b3b3b3, 0 10px 5px #999999;
+}
+button.btn-default.dim:active {
+ box-shadow: inset 0 0 0 #b3b3b3, 0 2px 0 0 #b3b3b3, 0 5px 3px #999999;
+}
+button.btn-warning.dim {
+ box-shadow: inset 0 0 0 #f79d3c, 0 5px 0 0 #f79d3c, 0 10px 5px #999999;
+}
+button.btn-warning.dim:active {
+ box-shadow: inset 0 0 0 #f79d3c, 0 2px 0 0 #f79d3c, 0 5px 3px #999999;
+}
+button.btn-info.dim {
+ box-shadow: inset 0 0 0 #1eacae, 0 5px 0 0 #1eacae, 0 10px 5px #999999;
+}
+button.btn-info.dim:active {
+ box-shadow: inset 0 0 0 #1eacae, 0 2px 0 0 #1eacae, 0 5px 3px #999999;
+}
+button.btn-success.dim {
+ box-shadow: inset 0 0 0 #1872ab, 0 5px 0 0 #1872ab, 0 10px 5px #999999;
+}
+button.btn-success.dim:active {
+ box-shadow: inset 0 0 0 #1872ab, 0 2px 0 0 #1872ab, 0 5px 3px #999999;
+}
+button.btn-danger.dim {
+ box-shadow: inset 0 0 0 #ea394c, 0 5px 0 0 #ea394c, 0 10px 5px #999999;
+}
+button.btn-danger.dim:active {
+ box-shadow: inset 0 0 0 #ea394c, 0 2px 0 0 #ea394c, 0 5px 3px #999999;
+}
+button.dim:before {
+ font-size: 50px;
+ line-height: 1em;
+ font-weight: normal;
+ color: #fff;
+ display: block;
+ padding-top: 10px;
+}
+button.dim:active:before {
+ top: 7px;
+ font-size: 50px;
+}
+.btn:focus {
+ outline: none !important;
+}
+.label {
+ background-color: #d1dade;
+ color: #5e5e5e;
+ font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;
+ font-weight: 600;
+ padding: 3px 8px;
+ text-shadow: none;
+}
+.nav .label,
+.ibox .label {
+ font-size: 10px;
+}
+.badge {
+ background-color: #d1dade;
+ color: #5e5e5e;
+ font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;
+ font-size: 11px;
+ font-weight: 600;
+ padding-bottom: 4px;
+ padding-left: 6px;
+ padding-right: 6px;
+ text-shadow: none;
+}
+.label-primary,
+.badge-primary {
+ background-color: #1ab394;
+ color: #FFFFFF;
+}
+.label-success,
+.badge-success {
+ background-color: #1c84c6;
+ color: #FFFFFF;
+}
+.label-warning,
+.badge-warning {
+ background-color: #f8ac59;
+ color: #FFFFFF;
+}
+.label-warning-light,
+.badge-warning-light {
+ background-color: #f8ac59;
+ color: #ffffff;
+}
+.label-danger,
+.badge-danger {
+ background-color: #ed5565;
+ color: #FFFFFF;
+}
+.label-info,
+.badge-info {
+ background-color: #23c6c8;
+ color: #FFFFFF;
+}
+.label-inverse,
+.badge-inverse {
+ background-color: #262626;
+ color: #FFFFFF;
+}
+.label-white,
+.badge-white {
+ background-color: #FFFFFF;
+ color: #5E5E5E;
+}
+.label-white,
+.badge-disable {
+ background-color: #2A2E36;
+ color: #8B91A0;
+}
+/* TOOGLE SWICH */
+.onoffswitch {
+ position: relative;
+ width: 64px;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+}
+.onoffswitch-checkbox {
+ display: none;
+}
+.onoffswitch-label {
+ display: block;
+ overflow: hidden;
+ cursor: pointer;
+ border: 2px solid #1ab394;
+ border-radius: 2px;
+}
+.onoffswitch-inner {
+ width: 200%;
+ margin-left: -100%;
+ -moz-transition: margin 0.3s ease-in 0s;
+ -webkit-transition: margin 0.3s ease-in 0s;
+ -o-transition: margin 0.3s ease-in 0s;
+ transition: margin 0.3s ease-in 0s;
+}
+.onoffswitch-inner:before,
+.onoffswitch-inner:after {
+ float: left;
+ width: 50%;
+ height: 20px;
+ padding: 0;
+ line-height: 20px;
+ font-size: 12px;
+ color: white;
+ font-family: Trebuchet, Arial, sans-serif;
+ font-weight: bold;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.onoffswitch-inner:before {
+ content: "ON";
+ padding-left: 10px;
+ background-color: #1ab394;
+ color: #FFFFFF;
+}
+.onoffswitch-inner:after {
+ content: "OFF";
+ padding-right: 10px;
+ background-color: #FFFFFF;
+ color: #999999;
+ text-align: right;
+}
+.onoffswitch-switch {
+ width: 20px;
+ margin: 0;
+ background: #FFFFFF;
+ border: 2px solid #1ab394;
+ border-radius: 2px;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ right: 44px;
+ -moz-transition: all 0.3s ease-in 0s;
+ -webkit-transition: all 0.3s ease-in 0s;
+ -o-transition: all 0.3s ease-in 0s;
+ transition: all 0.3s ease-in 0s;
+}
+.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-inner {
+ margin-left: 0;
+}
+.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-switch {
+ right: 0;
+}
+.onoffswitch-checkbox:disabled + .onoffswitch-label .onoffswitch-inner:before {
+ background-color: #919191;
+}
+.onoffswitch-checkbox:disabled + .onoffswitch-label,
+.onoffswitch-checkbox:disabled + .onoffswitch-label .onoffswitch-switch {
+ border-color: #919191;
+}
+/* CHOSEN PLUGIN */
+.chosen-container-single .chosen-single {
+ background: #ffffff;
+ box-shadow: none;
+ -moz-box-sizing: border-box;
+ border-radius: 2px;
+ cursor: text;
+ height: auto !important;
+ margin: 0;
+ min-height: 30px;
+ overflow: hidden;
+ padding: 4px 12px;
+ position: relative;
+ width: 100%;
+}
+.chosen-container-multi .chosen-choices li.search-choice {
+ background: #f1f1f1;
+ border: 1px solid #e5e6e7;
+ border-radius: 2px;
+ box-shadow: none;
+ color: #333333;
+ cursor: default;
+ line-height: 13px;
+ margin: 3px 0 3px 5px;
+ padding: 3px 20px 3px 5px;
+ position: relative;
+}
+/* Tags Input Plugin */
+.bootstrap-tagsinput {
+ border: 1px solid #e5e6e7;
+ box-shadow: none;
+}
+/* PAGINATIN */
+.pagination > .active > a,
+.pagination > .active > span,
+.pagination > .active > a:hover,
+.pagination > .active > span:hover,
+.pagination > .active > a:focus,
+.pagination > .active > span:focus {
+ background-color: #f4f4f4;
+ border-color: #DDDDDD;
+ color: inherit;
+ cursor: default;
+ z-index: 2;
+}
+.pagination > li > a,
+.pagination > li > span {
+ background-color: #FFFFFF;
+ border: 1px solid #DDDDDD;
+ color: inherit;
+ float: left;
+ line-height: 1.42857;
+ margin-left: -1px;
+ padding: 4px 10px;
+ position: relative;
+ text-decoration: none;
+}
+/* TOOLTIPS */
+.tooltip-inner {
+ background-color: #2F4050;
+}
+.tooltip.top .tooltip-arrow {
+ border-top-color: #2F4050;
+}
+.tooltip.right .tooltip-arrow {
+ border-right-color: #2F4050;
+}
+.tooltip.bottom .tooltip-arrow {
+ border-bottom-color: #2F4050;
+}
+.tooltip.left .tooltip-arrow {
+ border-left-color: #2F4050;
+}
+/* EASY PIE CHART*/
+.easypiechart {
+ position: relative;
+ text-align: center;
+}
+.easypiechart .h2 {
+ margin-left: 10px;
+ margin-top: 10px;
+ display: inline-block;
+}
+.easypiechart canvas {
+ top: 0;
+ left: 0;
+}
+.easypiechart .easypie-text {
+ line-height: 1;
+ position: absolute;
+ top: 33px;
+ width: 100%;
+ z-index: 1;
+}
+.easypiechart img {
+ margin-top: -4px;
+}
+.jqstooltip {
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+}
+/* FULLCALENDAR */
+.fc-state-default {
+ background-color: #ffffff;
+ background-image: none;
+ background-repeat: repeat-x;
+ box-shadow: none;
+ color: #333333;
+ text-shadow: none;
+}
+.fc-state-default {
+ border: 1px solid;
+}
+.fc-button {
+ color: inherit;
+ border: 1px solid #e7eaec;
+ cursor: pointer;
+ display: inline-block;
+ height: 1.9em;
+ line-height: 1.9em;
+ overflow: hidden;
+ padding: 0 0.6em;
+ position: relative;
+ white-space: nowrap;
+}
+.fc-state-active {
+ background-color: #1ab394;
+ border-color: #1ab394;
+ color: #ffffff;
+}
+.fc-header-title h2 {
+ font-size: 16px;
+ font-weight: 600;
+ color: inherit;
+}
+.fc-content .fc-widget-header,
+.fc-content .fc-widget-content {
+ border-color: #e7eaec;
+ font-weight: normal;
+}
+.fc-border-separate tbody {
+ background-color: #F8F8F8;
+}
+.fc-state-highlight {
+ background: none repeat scroll 0 0 #FCF8E3;
+}
+.external-event {
+ padding: 5px 10px;
+ border-radius: 2px;
+ cursor: pointer;
+ margin-bottom: 5px;
+}
+.fc-ltr .fc-event-hori.fc-event-end,
+.fc-rtl .fc-event-hori.fc-event-start {
+ border-radius: 2px;
+}
+.fc-event,
+.fc-agenda .fc-event-time,
+.fc-event a {
+ padding: 4px 6px;
+ background-color: #1ab394;
+ /* background color */
+ border-color: #1ab394;
+ /* border color */
+}
+.fc-event-time,
+.fc-event-title {
+ color: #717171;
+ padding: 0 1px;
+}
+.ui-calendar .fc-event-time,
+.ui-calendar .fc-event-title {
+ color: #fff;
+}
+/* Chat */
+.chat-activity-list .chat-element {
+ border-bottom: 1px solid #e7eaec;
+}
+.chat-element:first-child {
+ margin-top: 0;
+}
+.chat-element {
+ padding-bottom: 15px;
+}
+.chat-element,
+.chat-element .media {
+ margin-top: 15px;
+}
+.chat-element,
+.media-body {
+ overflow: hidden;
+}
+.chat-element .media-body {
+ display: block;
+ width: auto;
+}
+.chat-element > .pull-left {
+ margin-right: 10px;
+}
+.chat-element img.img-circle,
+.dropdown-messages-box img.img-circle {
+ width: 38px;
+ height: 38px;
+}
+.chat-element .well {
+ border: 1px solid #e7eaec;
+ box-shadow: none;
+ margin-top: 10px;
+ margin-bottom: 5px;
+ padding: 10px 20px;
+ font-size: 11px;
+ line-height: 16px;
+}
+.chat-element .actions {
+ margin-top: 10px;
+}
+.chat-element .photos {
+ margin: 10px 0;
+}
+.right.chat-element > .pull-right {
+ margin-left: 10px;
+}
+.chat-photo {
+ max-height: 180px;
+ border-radius: 4px;
+ overflow: hidden;
+ margin-right: 10px;
+ margin-bottom: 10px;
+}
+.chat {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+.chat li {
+ margin-bottom: 10px;
+ padding-bottom: 5px;
+ border-bottom: 1px dotted #B3A9A9;
+}
+.chat li.left .chat-body {
+ margin-left: 60px;
+}
+.chat li.right .chat-body {
+ margin-right: 60px;
+}
+.chat li .chat-body p {
+ margin: 0;
+ color: #777777;
+}
+.panel .slidedown .glyphicon,
+.chat .glyphicon {
+ margin-right: 5px;
+}
+.chat-panel .panel-body {
+ height: 350px;
+ overflow-y: scroll;
+}
+/* LIST GROUP */
+a.list-group-item.active,
+a.list-group-item.active:hover,
+a.list-group-item.active:focus {
+ background-color: #1ab394;
+ border-color: #1ab394;
+ color: #FFFFFF;
+ z-index: 2;
+}
+.list-group-item-heading {
+ margin-top: 10px;
+}
+.list-group-item-text {
+ margin: 0 0 10px;
+ color: inherit;
+ font-size: 12px;
+ line-height: inherit;
+}
+.no-padding .list-group-item {
+ border-left: none;
+ border-right: none;
+ border-bottom: none;
+}
+.no-padding .list-group-item:first-child {
+ border-left: none;
+ border-right: none;
+ border-bottom: none;
+ border-top: none;
+}
+.no-padding .list-group {
+ margin-bottom: 0;
+}
+.list-group-item {
+ background-color: inherit;
+ border: 1px solid #e7eaec;
+ display: block;
+ margin-bottom: -1px;
+ padding: 10px 15px;
+ position: relative;
+}
+.elements-list .list-group-item {
+ border-left: none;
+ border-right: none;
+ padding: 15px 25px;
+}
+.elements-list .list-group-item:first-child {
+ border-left: none;
+ border-right: none;
+ border-top: none !important;
+}
+.elements-list .list-group {
+ margin-bottom: 0;
+}
+.elements-list a {
+ color: inherit;
+}
+.elements-list .list-group-item.active,
+.elements-list .list-group-item:hover {
+ background: #f3f3f4;
+ color: inherit;
+ border-color: #e7eaec;
+ border-radius: 0;
+}
+.elements-list li.active {
+ transition: none;
+}
+.element-detail-box {
+ padding: 25px;
+}
+/* FLOT CHART */
+.flot-chart {
+ display: block;
+ height: 200px;
+}
+.widget .flot-chart.dashboard-chart {
+ display: block;
+ height: 120px;
+ margin-top: 40px;
+}
+.flot-chart.dashboard-chart {
+ display: block;
+ height: 180px;
+ margin-top: 40px;
+}
+.flot-chart-content {
+ width: 100%;
+ height: 100%;
+}
+.flot-chart-pie-content {
+ width: 200px;
+ height: 200px;
+ margin: auto;
+}
+.jqstooltip {
+ position: absolute;
+ display: block;
+ left: 0;
+ top: 0;
+ visibility: hidden;
+ background: #2b303a;
+ background-color: rgba(43, 48, 58, 0.8);
+ color: white;
+ text-align: left;
+ white-space: nowrap;
+ z-index: 10000;
+ padding: 5px 5px 5px 5px;
+ min-height: 22px;
+ border-radius: 3px;
+}
+.jqsfield {
+ color: white;
+ text-align: left;
+}
+.fh-150 {
+ height: 150px;
+}
+.fh-200 {
+ height: 200px;
+}
+.h-150 {
+ min-height: 150px;
+}
+.h-200 {
+ min-height: 200px;
+}
+.h-300 {
+ min-height: 300px;
+}
+.w-150 {
+ min-width: 150px;
+}
+.w-200 {
+ min-width: 200px;
+}
+.w-300 {
+ min-width: 300px;
+}
+.legendLabel {
+ padding-left: 5px;
+}
+.stat-list li:first-child {
+ margin-top: 0;
+}
+.stat-list {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+.stat-percent {
+ float: right;
+}
+.stat-list li {
+ margin-top: 15px;
+ position: relative;
+}
+/* DATATABLES */
+table.dataTable thead .sorting,
+table.dataTable thead .sorting_asc:after,
+table.dataTable thead .sorting_desc,
+table.dataTable thead .sorting_asc_disabled,
+table.dataTable thead .sorting_desc_disabled {
+ background: transparent;
+}
+.dataTables_wrapper {
+ padding-bottom: 30px;
+}
+.dataTables_length {
+ float: left;
+}
+.dataTables_filter label {
+ margin-right: 5px;
+}
+.html5buttons {
+ float: right;
+}
+.html5buttons a {
+ border: 1px solid #e7eaec;
+ background: #fff;
+ color: #676a6c;
+ box-shadow: none;
+ padding: 6px 8px;
+ font-size: 12px;
+}
+.html5buttons a:hover,
+.html5buttons a:focus:active {
+ background-color: #eee;
+ color: inherit;
+ border-color: #d2d2d2;
+}
+div.dt-button-info {
+ z-index: 100;
+}
+@media (max-width: 768px) {
+ .html5buttons {
+ float: none;
+ margin-top: 10px;
+ }
+ .dataTables_length {
+ float: none;
+ }
+}
+/* CIRCLE */
+.img-circle {
+ border-radius: 50%;
+}
+.btn-circle {
+ width: 30px;
+ height: 30px;
+ padding: 6px 0;
+ border-radius: 15px;
+ text-align: center;
+ font-size: 12px;
+ line-height: 1.428571429;
+}
+.btn-circle.btn-lg {
+ width: 50px;
+ height: 50px;
+ padding: 10px 16px;
+ border-radius: 25px;
+ font-size: 18px;
+ line-height: 1.33;
+}
+.btn-circle.btn-xl {
+ width: 70px;
+ height: 70px;
+ padding: 10px 16px;
+ border-radius: 35px;
+ font-size: 24px;
+ line-height: 1.33;
+}
+.show-grid [class^="col-"] {
+ padding-top: 10px;
+ padding-bottom: 10px;
+ border: 1px solid #ddd;
+ background-color: #eee !important;
+}
+.show-grid {
+ margin: 15px 0;
+}
+/* ANIMATION */
+.css-animation-box h1 {
+ font-size: 44px;
+}
+.animation-efect-links a {
+ padding: 4px 6px;
+ font-size: 12px;
+}
+#animation_box {
+ background-color: #f9f8f8;
+ border-radius: 16px;
+ width: 80%;
+ margin: 0 auto;
+ padding-top: 80px;
+}
+.animation-text-box {
+ position: absolute;
+ margin-top: 40px;
+ left: 50%;
+ margin-left: -100px;
+ width: 200px;
+}
+.animation-text-info {
+ position: absolute;
+ margin-top: -60px;
+ left: 50%;
+ margin-left: -100px;
+ width: 200px;
+ font-size: 10px;
+}
+.animation-text-box h2 {
+ font-size: 54px;
+ font-weight: 600;
+ margin-bottom: 5px;
+}
+.animation-text-box p {
+ font-size: 12px;
+ text-transform: uppercase;
+}
+/* PEACE */
+.pace {
+ -webkit-pointer-events: none;
+ pointer-events: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+.pace-inactive {
+ display: none;
+}
+.pace .pace-progress {
+ background: #1ab394;
+ position: fixed;
+ z-index: 2040;
+ top: 0;
+ right: 100%;
+ width: 100%;
+ height: 2px;
+}
+.pace-inactive {
+ display: none;
+}
+/* WIDGETS */
+.widget {
+ border-radius: 5px;
+ padding: 15px 20px;
+ margin-bottom: 10px;
+ margin-top: 10px;
+}
+.widget.style1 h2 {
+ font-size: 30px;
+}
+.widget h2,
+.widget h3 {
+ margin-top: 5px;
+ margin-bottom: 0;
+}
+.widget-text-box {
+ padding: 20px;
+ border: 1px solid #e7eaec;
+ background: #ffffff;
+}
+.widget-head-color-box {
+ border-radius: 5px 5px 0 0;
+ margin-top: 10px;
+}
+.widget .flot-chart {
+ height: 100px;
+}
+.vertical-align div {
+ display: inline-block;
+ vertical-align: middle;
+}
+.vertical-align h2,
+.vertical-align h3 {
+ margin: 0;
+}
+.todo-list {
+ list-style: none outside none;
+ margin: 0;
+ padding: 0;
+ font-size: 14px;
+}
+.todo-list.small-list {
+ font-size: 12px;
+}
+.todo-list.small-list > li {
+ background: #f3f3f4;
+ border-left: none;
+ border-right: none;
+ border-radius: 4px;
+ color: inherit;
+ margin-bottom: 2px;
+ padding: 6px 6px 6px 12px;
+}
+.todo-list.small-list .btn-xs,
+.todo-list.small-list .btn-group-xs > .btn {
+ border-radius: 5px;
+ font-size: 10px;
+ line-height: 1.5;
+ padding: 1px 2px 1px 5px;
+}
+.todo-list > li {
+ background: #f3f3f4;
+ border-left: 6px solid #e7eaec;
+ border-right: 6px solid #e7eaec;
+ border-radius: 4px;
+ color: inherit;
+ margin-bottom: 2px;
+ padding: 10px;
+}
+.todo-list .handle {
+ cursor: move;
+ display: inline-block;
+ font-size: 16px;
+ margin: 0 5px;
+}
+.todo-list > li .label {
+ font-size: 9px;
+ margin-left: 10px;
+}
+.check-link {
+ font-size: 16px;
+}
+.todo-completed {
+ text-decoration: line-through;
+}
+.geo-statistic h1 {
+ font-size: 36px;
+ margin-bottom: 0;
+}
+.glyphicon.fa {
+ font-family: "FontAwesome";
+}
+/* INPUTS */
+.inline {
+ display: inline-block !important;
+}
+.input-s-sm {
+ width: 120px;
+}
+.input-s {
+ width: 200px;
+}
+.input-s-lg {
+ width: 250px;
+}
+.i-checks {
+ padding-left: 0;
+}
+.form-control,
+.single-line {
+ background-color: #FFFFFF;
+ background-image: none;
+ border: 1px solid #e5e6e7;
+ border-radius: 1px;
+ color: inherit;
+ display: block;
+ padding: 6px 12px;
+ transition: border-color 0.15s ease-in-out 0s, box-shadow 0.15s ease-in-out 0s;
+ width: 100%;
+}
+.form-control:focus,
+.single-line:focus {
+ border-color: #1ab394;
+}
+.has-success .form-control,
+.has-success .form-control:focus {
+ border-color: #1ab394;
+}
+.has-warning .form-control,
+.has-warning .form-control:focus {
+ border-color: #f8ac59;
+}
+.has-error .form-control,
+.has-error .form-control:focus {
+ border-color: #ed5565;
+}
+.has-success .control-label {
+ color: #1ab394;
+}
+.has-warning .control-label {
+ color: #f8ac59;
+}
+.has-error .control-label {
+ color: #ed5565;
+}
+.input-group-addon {
+ background-color: #fff;
+ border: 1px solid #E5E6E7;
+ border-radius: 1px;
+ color: inherit;
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 1;
+ padding: 6px 12px;
+ text-align: center;
+}
+.spinner-buttons.input-group-btn .btn-xs {
+ line-height: 1.13;
+}
+.spinner-buttons.input-group-btn {
+ width: 20%;
+}
+.noUi-connect {
+ background: none repeat scroll 0 0 #1ab394;
+ box-shadow: none;
+}
+.slider_red .noUi-connect {
+ background: none repeat scroll 0 0 #ed5565;
+ box-shadow: none;
+}
+/* UI Sortable */
+.ui-sortable .ibox-title {
+ cursor: move;
+}
+.ui-sortable-placeholder {
+ border: 1px dashed #cecece !important;
+ visibility: visible !important;
+ background: #e7eaec;
+}
+.ibox.ui-sortable-placeholder {
+ margin: 0 0 23px !important;
+}
+/* SWITCHES */
+.onoffswitch {
+ position: relative;
+ width: 54px;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+}
+.onoffswitch-checkbox {
+ display: none;
+}
+.onoffswitch-label {
+ display: block;
+ overflow: hidden;
+ cursor: pointer;
+ border: 2px solid #1AB394;
+ border-radius: 3px;
+}
+.onoffswitch-inner {
+ display: block;
+ width: 200%;
+ margin-left: -100%;
+ -moz-transition: margin 0.3s ease-in 0s;
+ -webkit-transition: margin 0.3s ease-in 0s;
+ -o-transition: margin 0.3s ease-in 0s;
+ transition: margin 0.3s ease-in 0s;
+}
+.onoffswitch-inner:before,
+.onoffswitch-inner:after {
+ display: block;
+ float: left;
+ width: 50%;
+ height: 16px;
+ padding: 0;
+ line-height: 16px;
+ font-size: 10px;
+ color: white;
+ font-family: Trebuchet, Arial, sans-serif;
+ font-weight: bold;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.onoffswitch-inner:before {
+ content: "ON";
+ padding-left: 7px;
+ background-color: #1AB394;
+ color: #FFFFFF;
+}
+.onoffswitch-inner:after {
+ content: "OFF";
+ padding-right: 7px;
+ background-color: #FFFFFF;
+ color: #919191;
+ text-align: right;
+}
+.onoffswitch-switch {
+ display: block;
+ width: 18px;
+ margin: 0;
+ background: #FFFFFF;
+ border: 2px solid #1AB394;
+ border-radius: 3px;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ right: 36px;
+ -moz-transition: all 0.3s ease-in 0s;
+ -webkit-transition: all 0.3s ease-in 0s;
+ -o-transition: all 0.3s ease-in 0s;
+ transition: all 0.3s ease-in 0s;
+}
+.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-inner {
+ margin-left: 0;
+}
+.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-switch {
+ right: 0;
+}
+/* jqGrid */
+.ui-jqgrid {
+ -moz-box-sizing: content-box;
+}
+.ui-jqgrid-btable {
+ border-collapse: separate;
+}
+.ui-jqgrid-htable {
+ border-collapse: separate;
+}
+.ui-jqgrid-titlebar {
+ height: 40px;
+ line-height: 15px;
+ color: #676a6c;
+ background-color: #F9F9F9;
+ text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+}
+.ui-jqgrid .ui-jqgrid-title {
+ float: left;
+ margin: 1.1em 1em 0.2em;
+}
+.ui-jqgrid .ui-jqgrid-titlebar {
+ position: relative;
+ border-left: 0 solid;
+ border-right: 0 solid;
+ border-top: 0 solid;
+}
+.ui-widget-header {
+ background: none;
+ background-image: none;
+ background-color: #f5f5f6;
+ text-transform: uppercase;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+.ui-jqgrid tr.ui-row-ltr td {
+ border-right-color: inherit;
+ border-right-style: solid;
+ border-right-width: 1px;
+ text-align: left;
+ border-color: #DDDDDD;
+ background-color: inherit;
+}
+.ui-search-toolbar input[type="text"] {
+ font-size: 12px;
+ height: 15px;
+ border: 1px solid #CCCCCC;
+ border-radius: 0;
+}
+.ui-state-default,
+.ui-widget-content .ui-state-default,
+.ui-widget-header .ui-state-default {
+ background: #F9F9F9;
+ border: 1px solid #DDDDDD;
+ line-height: 15px;
+ font-weight: bold;
+ color: #676a6c;
+ text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+}
+.ui-widget-content {
+ box-sizing: content-box;
+}
+.ui-icon-triangle-1-n {
+ background-position: 1px -16px;
+}
+.ui-jqgrid tr.ui-search-toolbar th {
+ border-top-width: 0 !important;
+ border-top-color: inherit !important;
+ border-top-style: ridge !important;
+}
+.ui-state-hover,
+.ui-widget-content .ui-state-hover,
+.ui-state-focus,
+.ui-widget-content .ui-state-focus,
+.ui-widget-header .ui-state-focus {
+ background: #f5f5f5;
+ border-collapse: separate;
+}
+.ui-state-highlight,
+.ui-widget-content .ui-state-highlight,
+.ui-widget-header .ui-state-highlight {
+ background: #f2fbff;
+}
+.ui-state-active,
+.ui-widget-content .ui-state-active,
+.ui-widget-header .ui-state-active {
+ border: 1px solid #dddddd;
+ background: #ffffff;
+ font-weight: normal;
+ color: #212121;
+}
+.ui-jqgrid .ui-pg-input {
+ font-size: inherit;
+ width: 50px;
+ border: 1px solid #CCCCCC;
+ height: 15px;
+}
+.ui-jqgrid .ui-pg-selbox {
+ display: block;
+ font-size: 1em;
+ height: 25px;
+ line-height: 18px;
+ margin: 0;
+ width: auto;
+}
+.ui-jqgrid .ui-pager-control {
+ position: relative;
+}
+.ui-jqgrid .ui-jqgrid-pager {
+ height: 32px;
+ position: relative;
+}
+.ui-pg-table .navtable .ui-corner-all {
+ border-radius: 0;
+}
+.ui-jqgrid .ui-pg-button:hover {
+ padding: 1px;
+ border: 0;
+}
+.ui-jqgrid .loading {
+ position: absolute;
+ top: 45%;
+ left: 45%;
+ width: auto;
+ height: auto;
+ z-index: 101;
+ padding: 6px;
+ margin: 5px;
+ text-align: center;
+ font-weight: bold;
+ display: none;
+ border-width: 2px !important;
+ font-size: 11px;
+}
+.ui-jqgrid .form-control {
+ height: 10px;
+ width: auto;
+ display: inline;
+ padding: 10px 12px;
+}
+.ui-jqgrid-pager {
+ height: 32px;
+}
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-left,
+.ui-corner-tl {
+ border-top-left-radius: 0;
+}
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-right,
+.ui-corner-tr {
+ border-top-right-radius: 0;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-left,
+.ui-corner-bl {
+ border-bottom-left-radius: 0;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-right,
+.ui-corner-br {
+ border-bottom-right-radius: 0;
+}
+.ui-widget-content {
+ border: 1px solid #ddd;
+}
+.ui-jqgrid .ui-jqgrid-titlebar {
+ padding: 0;
+}
+.ui-jqgrid .ui-jqgrid-titlebar {
+ border-bottom: 1px solid #ddd;
+}
+.ui-jqgrid tr.jqgrow td {
+ padding: 6px;
+}
+.ui-jqdialog .ui-jqdialog-titlebar {
+ padding: 10px 10px;
+}
+.ui-jqdialog .ui-jqdialog-title {
+ float: none !important;
+}
+.ui-jqdialog > .ui-resizable-se {
+ position: absolute;
+}
+/* Nestable list */
+.dd {
+ position: relative;
+ display: block;
+ margin: 0;
+ padding: 0;
+ list-style: none;
+ font-size: 13px;
+ line-height: 20px;
+}
+.dd-list {
+ display: block;
+ position: relative;
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+.dd-list .dd-list {
+ padding-left: 30px;
+}
+.dd-collapsed .dd-list {
+ display: none;
+}
+.dd-item,
+.dd-empty,
+.dd-placeholder {
+ display: block;
+ position: relative;
+ margin: 0;
+ padding: 0;
+ min-height: 20px;
+ font-size: 13px;
+ line-height: 20px;
+}
+.dd-handle {
+ display: block;
+ margin: 5px 0;
+ padding: 5px 10px;
+ color: #333;
+ text-decoration: none;
+ border: 1px solid #e7eaec;
+ background: #f5f5f5;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+}
+.dd-handle span {
+ font-weight: bold;
+}
+.dd-handle:hover {
+ background: #f0f0f0;
+ cursor: pointer;
+ font-weight: bold;
+}
+.dd-item > button {
+ display: block;
+ position: relative;
+ cursor: pointer;
+ float: left;
+ width: 25px;
+ height: 20px;
+ margin: 5px 0;
+ padding: 0;
+ text-indent: 100%;
+ white-space: nowrap;
+ overflow: hidden;
+ border: 0;
+ background: transparent;
+ font-size: 12px;
+ line-height: 1;
+ text-align: center;
+ font-weight: bold;
+}
+.dd-item > button:before {
+ content: '+';
+ display: block;
+ position: absolute;
+ width: 100%;
+ text-align: center;
+ text-indent: 0;
+}
+.dd-item > button[data-action="collapse"]:before {
+ content: '-';
+}
+#nestable2 .dd-item > button {
+ font-family: FontAwesome;
+ height: 34px;
+ width: 33px;
+ color: #c1c1c1;
+}
+#nestable2 .dd-item > button:before {
+ content: "\f067";
+}
+#nestable2 .dd-item > button[data-action="collapse"]:before {
+ content: "\f068";
+}
+.dd-placeholder,
+.dd-empty {
+ margin: 5px 0;
+ padding: 0;
+ min-height: 30px;
+ background: #f2fbff;
+ border: 1px dashed #b6bcbf;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+}
+.dd-empty {
+ border: 1px dashed #bbb;
+ min-height: 100px;
+ background-color: #e5e5e5;
+ background-image: -webkit-linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff), -webkit-linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff);
+ background-image: -moz-linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff), -moz-linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff);
+ background-image: linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff), linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff);
+ background-size: 60px 60px;
+ background-position: 0 0, 30px 30px;
+}
+.dd-dragel {
+ position: absolute;
+ z-index: 9999;
+ pointer-events: none;
+}
+.dd-dragel > .dd-item .dd-handle {
+ margin-top: 0;
+}
+.dd-dragel .dd-handle {
+ -webkit-box-shadow: 2px 4px 6px 0 rgba(0, 0, 0, 0.1);
+ box-shadow: 2px 4px 6px 0 rgba(0, 0, 0, 0.1);
+}
+/**
+* Nestable Extras
+*/
+.nestable-lists {
+ display: block;
+ clear: both;
+ padding: 30px 0;
+ width: 100%;
+ border: 0;
+ border-top: 2px solid #ddd;
+ border-bottom: 2px solid #ddd;
+}
+#nestable-menu {
+ padding: 0;
+ margin: 10px 0 20px 0;
+}
+#nestable-output,
+#nestable2-output {
+ width: 100%;
+ font-size: 0.75em;
+ line-height: 1.333333em;
+ font-family: open sans, lucida grande, lucida sans unicode, helvetica, arial, sans-serif;
+ padding: 5px;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+}
+#nestable2 .dd-handle {
+ color: inherit;
+ border: 1px dashed #e7eaec;
+ background: #f3f3f4;
+ padding: 10px;
+}
+#nestable2 span.label {
+ margin-right: 10px;
+}
+#nestable-output,
+#nestable2-output {
+ font-size: 12px;
+ padding: 25px;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+}
+/* CodeMirror */
+.CodeMirror {
+ border: 1px solid #eee;
+ height: auto;
+}
+.CodeMirror-scroll {
+ overflow-y: hidden;
+ overflow-x: auto;
+}
+/* Google Maps */
+.google-map {
+ height: 300px;
+}
+/* Validation */
+label.error {
+ color: #cc5965;
+ display: inline-block;
+ margin-left: 5px;
+}
+.form-control.error {
+ border: 1px dotted #cc5965;
+}
+/* ngGrid */
+.gridStyle {
+ border: 1px solid #d4d4d4;
+ width: 100%;
+ height: 400px;
+}
+.gridStyle2 {
+ border: 1px solid #d4d4d4;
+ width: 500px;
+ height: 300px;
+}
+.ngH eaderCell {
+ border-right: none;
+ border-bottom: 1px solid #e7eaec;
+}
+.ngCell {
+ border-right: none;
+}
+.ngTopPanel {
+ background: #F5F5F6;
+}
+.ngRow.even {
+ background: #f9f9f9;
+}
+.ngRow.selected {
+ background: #EBF2F1;
+}
+.ngRow {
+ border-bottom: 1px solid #e7eaec;
+}
+.ngCell {
+ background-color: transparent;
+}
+.ngHeaderCell {
+ border-right: none;
+}
+/* Toastr custom style */
+#toast-container > .toast {
+ background-image: none !important;
+}
+#toast-container > .toast:before {
+ position: fixed;
+ font-family: FontAwesome;
+ font-size: 24px;
+ line-height: 24px;
+ float: left;
+ color: #FFF;
+ padding-right: 0.5em;
+ margin: auto 0.5em auto -1.5em;
+}
+#toast-container > .toast-warning:before {
+ content: "\f0e7";
+}
+#toast-container > .toast-error:before {
+ content: "\f071";
+}
+#toast-container > .toast-info:before {
+ content: "\f005";
+}
+#toast-container > .toast-success:before {
+ content: "\f00C";
+}
+#toast-container > div {
+ -moz-box-shadow: 0 0 3px #999;
+ -webkit-box-shadow: 0 0 3px #999;
+ box-shadow: 0 0 3px #999;
+ opacity: .9;
+ -ms-filter: alpha(opacity=90);
+ filter: alpha(opacity=90);
+}
+#toast-container > :hover {
+ -moz-box-shadow: 0 0 4px #999;
+ -webkit-box-shadow: 0 0 4px #999;
+ box-shadow: 0 0 4px #999;
+ opacity: 1;
+ -ms-filter: alpha(opacity=100);
+ filter: alpha(opacity=100);
+ cursor: pointer;
+}
+.toast {
+ background-color: #1ab394;
+}
+.toast-success {
+ background-color: #1ab394;
+}
+.toast-error {
+ background-color: #ed5565;
+}
+.toast-info {
+ background-color: #23c6c8;
+}
+.toast-warning {
+ background-color: #f8ac59;
+}
+.toast-top-full-width {
+ margin-top: 20px;
+}
+.toast-bottom-full-width {
+ margin-bottom: 20px;
+}
+/* Notifie */
+.cg-notify-message.inspinia-notify {
+ background: #fff;
+ padding: 0;
+ box-shadow: 0 0 1px rgba(0, 0, 0, 0.1), 0 2px 4px rgba(0, 0, 0, 0.2);
+ -webkit-box-shadow: 0 0 1px rgba(0, 0, 0, 0.1), 0 2px 4px rgba(0, 0, 0, 0.2);
+ -moz-box-shadow: 0 0 1px rgba(0, 0, 0, 0.1), 0 2px 4px rgba(0, 0, 0, 0.2);
+ border: none;
+ margin-top: 30px;
+ color: inherit;
+}
+.inspinia-notify.alert-warning {
+ border-left: 6px solid #f8ac59;
+}
+.inspinia-notify.alert-success {
+ border-left: 6px solid #1c84c6;
+}
+.inspinia-notify.alert-danger {
+ border-left: 6px solid #ed5565;
+}
+.inspinia-notify.alert-info {
+ border-left: 6px solid #1ab394;
+}
+/* Image cropper style */
+.img-container,
+.img-preview {
+ overflow: hidden;
+ text-align: center;
+ width: 100%;
+}
+.img-preview-sm {
+ height: 130px;
+ width: 200px;
+}
+/* Forum styles */
+.forum-post-container .media {
+ margin: 10px 10px 10px 10px;
+ padding: 20px 10px 20px 10px;
+ border-bottom: 1px solid #f1f1f1;
+}
+.forum-avatar {
+ float: left;
+ margin-right: 20px;
+ text-align: center;
+ width: 110px;
+}
+.forum-avatar .img-circle {
+ height: 48px;
+ width: 48px;
+}
+.author-info {
+ color: #676a6c;
+ font-size: 11px;
+ margin-top: 5px;
+ text-align: center;
+}
+.forum-post-info {
+ padding: 9px 12px 6px 12px;
+ background: #f9f9f9;
+ border: 1px solid #f1f1f1;
+}
+.media-body > .media {
+ background: #f9f9f9;
+ border-radius: 3px;
+ border: 1px solid #f1f1f1;
+}
+.forum-post-container .media-body .photos {
+ margin: 10px 0;
+}
+.forum-photo {
+ max-width: 140px;
+ border-radius: 3px;
+}
+.media-body > .media .forum-avatar {
+ width: 70px;
+ margin-right: 10px;
+}
+.media-body > .media .forum-avatar .img-circle {
+ height: 38px;
+ width: 38px;
+}
+.mid-icon {
+ font-size: 66px;
+}
+.forum-item {
+ margin: 10px 0;
+ padding: 10px 0 20px;
+ border-bottom: 1px solid #f1f1f1;
+}
+.views-number {
+ font-size: 24px;
+ line-height: 18px;
+ font-weight: 400;
+}
+.forum-container,
+.forum-post-container {
+ padding: 30px !important;
+}
+.forum-item small {
+ color: #999;
+}
+.forum-item .forum-sub-title {
+ color: #999;
+ margin-left: 50px;
+}
+.forum-title {
+ margin: 15px 0 15px 0;
+}
+.forum-info {
+ text-align: center;
+}
+.forum-desc {
+ color: #999;
+}
+.forum-icon {
+ float: left;
+ width: 30px;
+ margin-right: 20px;
+ text-align: center;
+}
+a.forum-item-title {
+ color: inherit;
+ display: block;
+ font-size: 18px;
+ font-weight: 600;
+}
+a.forum-item-title:hover {
+ color: inherit;
+}
+.forum-icon .fa {
+ font-size: 30px;
+ margin-top: 8px;
+ color: #9b9b9b;
+}
+.forum-item.active .fa {
+ color: #1ab394;
+}
+.forum-item.active a.forum-item-title {
+ color: #1ab394;
+}
+@media (max-width: 992px) {
+ .forum-info {
+ margin: 15px 0 10px 0;
+ /* Comment this is you want to show forum info in small devices */
+ display: none;
+ }
+ .forum-desc {
+ float: none !important;
+ }
+}
+/* New Timeline style */
+.vertical-container {
+ /* this class is used to give a max-width to the element it is applied to, and center it horizontally when it reaches that max-width */
+ width: 90%;
+ max-width: 1170px;
+ margin: 0 auto;
+}
+.vertical-container::after {
+ /* clearfix */
+ content: '';
+ display: table;
+ clear: both;
+}
+#vertical-timeline {
+ position: relative;
+ padding: 0;
+ margin-top: 2em;
+ margin-bottom: 2em;
+}
+#vertical-timeline::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 18px;
+ height: 100%;
+ width: 4px;
+ background: #f1f1f1;
+}
+.vertical-timeline-content .btn {
+ float: right;
+}
+#vertical-timeline.light-timeline:before {
+ background: #e7eaec;
+}
+.dark-timeline .vertical-timeline-content:before {
+ border-color: transparent #f5f5f5 transparent transparent;
+}
+.dark-timeline.center-orientation .vertical-timeline-content:before {
+ border-color: transparent transparent transparent #f5f5f5;
+}
+.dark-timeline .vertical-timeline-block:nth-child(2n) .vertical-timeline-content:before,
+.dark-timeline.center-orientation .vertical-timeline-block:nth-child(2n) .vertical-timeline-content:before {
+ border-color: transparent #f5f5f5 transparent transparent;
+}
+.dark-timeline .vertical-timeline-content,
+.dark-timeline.center-orientation .vertical-timeline-content {
+ background: #f5f5f5;
+}
+@media only screen and (min-width: 1170px) {
+ #vertical-timeline.center-orientation {
+ margin-top: 3em;
+ margin-bottom: 3em;
+ }
+ #vertical-timeline.center-orientation:before {
+ left: 50%;
+ margin-left: -2px;
+ }
+}
+@media only screen and (max-width: 1170px) {
+ .center-orientation.dark-timeline .vertical-timeline-content:before {
+ border-color: transparent #f5f5f5 transparent transparent;
+ }
+}
+.vertical-timeline-block {
+ position: relative;
+ margin: 2em 0;
+}
+.vertical-timeline-block:after {
+ content: "";
+ display: table;
+ clear: both;
+}
+.vertical-timeline-block:first-child {
+ margin-top: 0;
+}
+.vertical-timeline-block:last-child {
+ margin-bottom: 0;
+}
+@media only screen and (min-width: 1170px) {
+ .center-orientation .vertical-timeline-block {
+ margin: 4em 0;
+ }
+ .center-orientation .vertical-timeline-block:first-child {
+ margin-top: 0;
+ }
+ .center-orientation .vertical-timeline-block:last-child {
+ margin-bottom: 0;
+ }
+}
+.vertical-timeline-icon {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 40px;
+ height: 40px;
+ border-radius: 50%;
+ font-size: 16px;
+ border: 3px solid #f1f1f1;
+ text-align: center;
+}
+.vertical-timeline-icon i {
+ display: block;
+ width: 24px;
+ height: 24px;
+ position: relative;
+ left: 50%;
+ top: 50%;
+ margin-left: -12px;
+ margin-top: -9px;
+}
+@media only screen and (min-width: 1170px) {
+ .center-orientation .vertical-timeline-icon {
+ width: 50px;
+ height: 50px;
+ left: 50%;
+ margin-left: -25px;
+ -webkit-transform: translateZ(0);
+ -webkit-backface-visibility: hidden;
+ font-size: 19px;
+ }
+ .center-orientation .vertical-timeline-icon i {
+ margin-left: -12px;
+ margin-top: -10px;
+ }
+ .center-orientation .cssanimations .vertical-timeline-icon.is-hidden {
+ visibility: hidden;
+ }
+}
+.vertical-timeline-content {
+ position: relative;
+ margin-left: 60px;
+ background: white;
+ border-radius: 0.25em;
+ padding: 1em;
+}
+.vertical-timeline-content:after {
+ content: "";
+ display: table;
+ clear: both;
+}
+.vertical-timeline-content h2 {
+ font-weight: 400;
+ margin-top: 4px;
+}
+.vertical-timeline-content p {
+ margin: 1em 0;
+ line-height: 1.6;
+}
+.vertical-timeline-content .vertical-date {
+ float: left;
+ font-weight: 500;
+}
+.vertical-date small {
+ color: #1ab394;
+ font-weight: 400;
+}
+.vertical-timeline-content::before {
+ content: '';
+ position: absolute;
+ top: 16px;
+ right: 100%;
+ height: 0;
+ width: 0;
+ border: 7px solid transparent;
+ border-right: 7px solid white;
+}
+@media only screen and (min-width: 768px) {
+ .vertical-timeline-content h2 {
+ font-size: 18px;
+ }
+ .vertical-timeline-content p {
+ font-size: 13px;
+ }
+}
+@media only screen and (min-width: 1170px) {
+ .center-orientation .vertical-timeline-content {
+ margin-left: 0;
+ padding: 1.6em;
+ width: 45%;
+ }
+ .center-orientation .vertical-timeline-content::before {
+ top: 24px;
+ left: 100%;
+ border-color: transparent;
+ border-left-color: white;
+ }
+ .center-orientation .vertical-timeline-content .btn {
+ float: left;
+ }
+ .center-orientation .vertical-timeline-content .vertical-date {
+ position: absolute;
+ width: 100%;
+ left: 122%;
+ top: 2px;
+ font-size: 14px;
+ }
+ .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content {
+ float: right;
+ }
+ .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content::before {
+ top: 24px;
+ left: auto;
+ right: 100%;
+ border-color: transparent;
+ border-right-color: white;
+ }
+ .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content .btn {
+ float: right;
+ }
+ .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content .vertical-date {
+ left: auto;
+ right: 122%;
+ text-align: right;
+ }
+ .center-orientation .cssanimations .vertical-timeline-content.is-hidden {
+ visibility: hidden;
+ }
+}
+/* Tabs */
+.tabs-container .panel-body {
+ background: #fff;
+ border: 1px solid #e7eaec;
+ border-radius: 2px;
+ padding: 20px;
+ position: relative;
+}
+.tabs-container .nav-tabs > li.active > a,
+.tabs-container .nav-tabs > li.active > a:hover,
+.tabs-container .nav-tabs > li.active > a:focus {
+ border: 1px solid #e7eaec;
+ border-bottom-color: transparent;
+ background-color: #fff;
+}
+.tabs-container .nav-tabs > li {
+ float: left;
+ margin-bottom: -1px;
+}
+.tabs-container .tab-pane .panel-body {
+ border-top: none;
+}
+.tabs-container .nav-tabs > li.active > a,
+.tabs-container .nav-tabs > li.active > a:hover,
+.tabs-container .nav-tabs > li.active > a:focus {
+ border: 1px solid #e7eaec;
+ border-bottom-color: transparent;
+}
+.tabs-container .nav-tabs {
+ border-bottom: 1px solid #e7eaec;
+}
+.tabs-container .tab-pane .panel-body {
+ border-top: none;
+}
+.tabs-container .tabs-left .tab-pane .panel-body,
+.tabs-container .tabs-right .tab-pane .panel-body {
+ border-top: 1px solid #e7eaec;
+}
+.tabs-container .nav-tabs > li a:hover {
+ background: transparent;
+ border-color: transparent;
+}
+.tabs-container .tabs-below > .nav-tabs,
+.tabs-container .tabs-right > .nav-tabs,
+.tabs-container .tabs-left > .nav-tabs {
+ border-bottom: 0;
+}
+.tabs-container .tabs-left .panel-body {
+ position: static;
+}
+.tabs-container .tabs-left > .nav-tabs,
+.tabs-container .tabs-right > .nav-tabs {
+ width: 20%;
+}
+.tabs-container .tabs-left .panel-body {
+ width: 80%;
+ margin-left: 20%;
+}
+.tabs-container .tabs-right .panel-body {
+ width: 80%;
+ margin-right: 20%;
+}
+.tabs-container .tab-content > .tab-pane,
+.tabs-container .pill-content > .pill-pane {
+ display: none;
+}
+.tabs-container .tab-content > .active,
+.tabs-container .pill-content > .active {
+ display: block;
+}
+.tabs-container .tabs-below > .nav-tabs {
+ border-top: 1px solid #e7eaec;
+}
+.tabs-container .tabs-below > .nav-tabs > li {
+ margin-top: -1px;
+ margin-bottom: 0;
+}
+.tabs-container .tabs-below > .nav-tabs > li > a {
+ -webkit-border-radius: 0 0 4px 4px;
+ -moz-border-radius: 0 0 4px 4px;
+ border-radius: 0 0 4px 4px;
+}
+.tabs-container .tabs-below > .nav-tabs > li > a:hover,
+.tabs-container .tabs-below > .nav-tabs > li > a:focus {
+ border-top-color: #e7eaec;
+ border-bottom-color: transparent;
+}
+.tabs-container .tabs-left > .nav-tabs > li,
+.tabs-container .tabs-right > .nav-tabs > li {
+ float: none;
+}
+.tabs-container .tabs-left > .nav-tabs > li > a,
+.tabs-container .tabs-right > .nav-tabs > li > a {
+ min-width: 74px;
+ margin-right: 0;
+ margin-bottom: 3px;
+}
+.tabs-container .tabs-left > .nav-tabs {
+ float: left;
+ margin-right: 19px;
+}
+.tabs-container .tabs-left > .nav-tabs > li > a {
+ margin-right: -1px;
+ -webkit-border-radius: 4px 0 0 4px;
+ -moz-border-radius: 4px 0 0 4px;
+ border-radius: 4px 0 0 4px;
+}
+.tabs-container .tabs-left > .nav-tabs .active > a,
+.tabs-container .tabs-left > .nav-tabs .active > a:hover,
+.tabs-container .tabs-left > .nav-tabs .active > a:focus {
+ border-color: #e7eaec transparent #e7eaec #e7eaec;
+}
+.tabs-container .tabs-right > .nav-tabs {
+ float: right;
+ margin-left: 19px;
+}
+.tabs-container .tabs-right > .nav-tabs > li > a {
+ margin-left: -1px;
+ -webkit-border-radius: 0 4px 4px 0;
+ -moz-border-radius: 0 4px 4px 0;
+ border-radius: 0 4px 4px 0;
+}
+.tabs-container .tabs-right > .nav-tabs .active > a,
+.tabs-container .tabs-right > .nav-tabs .active > a:hover,
+.tabs-container .tabs-right > .nav-tabs .active > a:focus {
+ border-color: #e7eaec #e7eaec #e7eaec transparent;
+ z-index: 1;
+}
+@media (max-width: 767px) {
+ .tabs-container .nav-tabs > li {
+ float: none !important;
+ }
+ .tabs-container .nav-tabs > li.active > a {
+ border-bottom: 1px solid #e7eaec !important;
+ margin: 0;
+ }
+}
+/* jsvectormap */
+.jvectormap-container {
+ width: 100%;
+ height: 100%;
+ position: relative;
+ overflow: hidden;
+}
+.jvectormap-tip {
+ position: absolute;
+ display: none;
+ border: solid 1px #CDCDCD;
+ border-radius: 3px;
+ background: #292929;
+ color: white;
+ font-family: sans-serif, Verdana;
+ font-size: smaller;
+ padding: 5px;
+}
+.jvectormap-zoomin,
+.jvectormap-zoomout,
+.jvectormap-goback {
+ position: absolute;
+ left: 10px;
+ border-radius: 3px;
+ background: #1ab394;
+ padding: 3px;
+ color: white;
+ cursor: pointer;
+ line-height: 10px;
+ text-align: center;
+ box-sizing: content-box;
+}
+.jvectormap-zoomin,
+.jvectormap-zoomout {
+ width: 10px;
+ height: 10px;
+}
+.jvectormap-zoomin {
+ top: 10px;
+}
+.jvectormap-zoomout {
+ top: 30px;
+}
+.jvectormap-goback {
+ bottom: 10px;
+ z-index: 1000;
+ padding: 6px;
+}
+.jvectormap-spinner {
+ position: absolute;
+ left: 0;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ background: center no-repeat url(data:image/gif;base64,R0lGODlhIAAgAPMAAP///wAAAMbGxoSEhLa2tpqamjY2NlZWVtjY2OTk5Ly8vB4eHgQEBAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ/V/nmOM82XiHRLYKhKP1oZmADdEAAAh+QQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY/CZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB+A4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6+Ho7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq+B6QDtuetcaBPnW6+O7wDHpIiK9SaVK5GgV543tzjgGcghAgAh+QQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK++G+w48edZPK+M6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE+G+cD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm+FNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk+aV+oJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0/VNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc+XiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq+E71SRQeyqUToLA7VxF0JDyIQh/MVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30/iI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE/jiuL04RGEBgwWhShRgQExHBAAh+QQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR+ipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq+E71SRQeyqUToLA7VxF0JDyIQh/MVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq+E71SRQeyqUToLA7VxF0JDyIQh/MVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY+Yip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd+MFCN6HAAIKgNggY0KtEBAAh+QQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1+vsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d+jYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg+ygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0+bm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h+Kr0SJ8MFihpNbx+4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX+BP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA==);
+}
+.jvectormap-legend-title {
+ font-weight: bold;
+ font-size: 14px;
+ text-align: center;
+}
+.jvectormap-legend-cnt {
+ position: absolute;
+}
+.jvectormap-legend-cnt-h {
+ bottom: 0;
+ right: 0;
+}
+.jvectormap-legend-cnt-v {
+ top: 0;
+ right: 0;
+}
+.jvectormap-legend {
+ background: black;
+ color: white;
+ border-radius: 3px;
+}
+.jvectormap-legend-cnt-h .jvectormap-legend {
+ float: left;
+ margin: 0 10px 10px 0;
+ padding: 3px 3px 1px 3px;
+}
+.jvectormap-legend-cnt-h .jvectormap-legend .jvectormap-legend-tick {
+ float: left;
+}
+.jvectormap-legend-cnt-v .jvectormap-legend {
+ margin: 10px 10px 0 0;
+ padding: 3px;
+}
+.jvectormap-legend-cnt-h .jvectormap-legend-tick {
+ width: 40px;
+}
+.jvectormap-legend-cnt-h .jvectormap-legend-tick-sample {
+ height: 15px;
+}
+.jvectormap-legend-cnt-v .jvectormap-legend-tick-sample {
+ height: 20px;
+ width: 20px;
+ display: inline-block;
+ vertical-align: middle;
+}
+.jvectormap-legend-tick-text {
+ font-size: 12px;
+}
+.jvectormap-legend-cnt-h .jvectormap-legend-tick-text {
+ text-align: center;
+}
+.jvectormap-legend-cnt-v .jvectormap-legend-tick-text {
+ display: inline-block;
+ vertical-align: middle;
+ line-height: 20px;
+ padding-left: 3px;
+}
+/*Slick Carousel */
+.slick-prev:before,
+.slick-next:before {
+ color: #1ab394 !important;
+}
+/* Payments */
+.payment-card {
+ background: #ffffff;
+ padding: 20px;
+ margin-bottom: 25px;
+ border: 1px solid #e7eaec;
+}
+.payment-icon-big {
+ font-size: 60px;
+ color: #d1dade;
+}
+.payments-method.panel-group .panel + .panel {
+ margin-top: -1px;
+}
+.payments-method .panel-heading {
+ padding: 15px;
+}
+.payments-method .panel {
+ border-radius: 0;
+}
+.payments-method .panel-heading h5 {
+ margin-bottom: 5px;
+}
+.payments-method .panel-heading i {
+ font-size: 26px;
+}
+/* Select2 custom styles */
+.select2-container--default .select2-selection--single,
+.select2-container--default .select2-selection--multiple {
+ border-color: #e7eaec;
+}
+.select2-container--default.select2-container--focus .select2-selection--single,
+.select2-container--default.select2-container--focus .select2-selection--multiple {
+ border-color: #1ab394;
+}
+.select2-container--default .select2-results__option--highlighted[aria-selected] {
+ background-color: #1ab394;
+}
+.select2-container--default .select2-search--dropdown .select2-search__field {
+ border-color: #e7eaec;
+}
+.select2-dropdown {
+ border-color: #e7eaec;
+}
+.select2-dropdown input:focus {
+ outline: none;
+}
+.select2-selection {
+ outline: none;
+}
+.ui-select-container.ui-select-bootstrap .ui-select-choices-row.active > a {
+ background-color: #1ab394;
+}
+/* Tour */
+.tour-tour .btn.btn-default {
+ background-color: #ffffff;
+ border: 1px solid #d2d2d2;
+ color: inherit;
+}
+.tour-step-backdrop {
+ z-index: 2101;
+}
+.tour-backdrop {
+ z-index: 2100;
+ opacity: .7;
+}
+.popover[class*=tour-] {
+ z-index: 2100;
+}
+body.tour-open .animated {
+ animation-fill-mode: initial;
+}
+/* Resizable */
+.resizable-panels .ibox {
+ clear: none;
+ margin: 10px;
+ float: left;
+ overflow: hidden;
+ min-height: 150px;
+ min-width: 150px;
+}
+.resizable-panels .ibox .ibox-content {
+ height: calc(100% - 49px);
+}
+.ui-resizable-helper {
+ background: rgba(211, 211, 211, 0.4);
+}
+/* Wizard step fix */
+.wizard > .content > .body {
+ position: relative;
+}
+/* PDF js style */
+.pdf-toolbar {
+ max-width: 600px;
+ margin: 0 auto;
+}
+/* Dropzone */
+.dropzone {
+ min-height: 140px;
+ border: 1px dashed #1ab394;
+ background: white;
+ padding: 20px 20px;
+}
+.dropzone .dz-message {
+ font-size: 16px;
+}
+/* Activity stream */
+.stream {
+ position: relative;
+ padding: 10px 0;
+}
+.stream:first-child .stream-badge:before {
+ top: 10px;
+}
+.stream:last-child .stream-badge:before {
+ height: 30px;
+}
+.stream .stream-badge {
+ width: 50px;
+}
+.stream .stream-badge i {
+ border: 1px solid #e7eaec;
+ border-radius: 50%;
+ padding: 6px;
+ color: #808486;
+ position: absolute;
+ background-color: #ffffff;
+ left: 8px;
+}
+.stream .stream-badge i.fa-circle {
+ color: #ced0d1;
+}
+.stream .stream-badge i.bg-success {
+ color: #ffffff;
+ background-color: #1c84c6;
+ border-color: #1c84c6;
+}
+.stream .stream-badge i.bg-primary {
+ color: #ffffff;
+ background-color: #1ab394;
+ border-color: #1ab394;
+}
+.stream .stream-badge i.bg-warning {
+ color: #ffffff;
+ background-color: #f8ac59;
+ border-color: #f8ac59;
+}
+.stream .stream-badge i.bg-info {
+ color: #ffffff;
+ background-color: #23c6c8;
+ border-color: #23c6c8;
+}
+.stream .stream-badge i.bg-danger {
+ color: #ffffff;
+ background-color: #ed5565;
+ border-color: #ed5565;
+}
+.stream .stream-badge:before {
+ content: '';
+ width: 1px;
+ background-color: #e7eaec;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 20px;
+}
+.stream .stream-info {
+ font-size: 12px;
+ margin-bottom: 5px;
+}
+.stream .stream-info img {
+ border-radius: 50%;
+ width: 18px;
+ height: 18px;
+ margin-right: 2px;
+ margin-top: -4px;
+}
+.stream .stream-info .date {
+ color: #9a9d9f;
+ font-size: 80%;
+}
+.stream .stream-panel {
+ margin-left: 55px;
+}
+.stream-small {
+ margin: 10px 0;
+}
+.stream-small .label {
+ padding: 2px 6px;
+ margin-right: 2px;
+}
+.sidebar-panel {
+ width: 220px;
+ background: #ebebed;
+ padding: 10px 20px;
+ position: absolute;
+ right: 0;
+}
+.sidebar-panel .feed-element img.img-circle {
+ width: 32px;
+ height: 32px;
+}
+.sidebar-panel .feed-element,
+.media-body,
+.sidebar-panel p {
+ font-size: 12px;
+}
+.sidebar-panel .feed-element {
+ margin-top: 20px;
+ padding-bottom: 0;
+}
+.sidebar-panel .list-group {
+ margin-bottom: 10px;
+}
+.sidebar-panel .list-group .list-group-item {
+ padding: 5px 0;
+ font-size: 12px;
+ border: 0;
+}
+.sidebar-content .wrapper,
+.wrapper.sidebar-content {
+ padding-right: 230px !important;
+}
+.body-small .sidebar-content .wrapper,
+.body-small .wrapper.sidebar-content {
+ padding-right: 20px !important;
+}
+#right-sidebar {
+ background-color: #fff;
+ border-left: 1px solid #e7eaec;
+ border-top: 1px solid #e7eaec;
+ overflow: hidden;
+ position: fixed;
+ top: 60px;
+ width: 260px !important;
+ z-index: 1009;
+ bottom: 0;
+ right: -260px;
+}
+#right-sidebar.sidebar-open {
+ right: 0;
+}
+#right-sidebar.sidebar-open.sidebar-top {
+ top: 0;
+ border-top: none;
+}
+.sidebar-container ul.nav-tabs {
+ border: none;
+}
+.sidebar-container ul.nav-tabs.navs-4 li {
+ width: 25%;
+}
+.sidebar-container ul.nav-tabs.navs-3 li {
+ width: 33.3333%;
+}
+.sidebar-container ul.nav-tabs.navs-2 li {
+ width: 50%;
+}
+.sidebar-container ul.nav-tabs li {
+ border: none;
+}
+.sidebar-container ul.nav-tabs li a {
+ border: none;
+ padding: 12px 10px;
+ margin: 0;
+ border-radius: 0;
+ background: #2f4050;
+ color: #fff;
+ text-align: center;
+ border-right: 1px solid #334556;
+}
+.sidebar-container ul.nav-tabs li.active a {
+ border: none;
+ background: #f9f9f9;
+ color: #676a6c;
+ font-weight: bold;
+}
+.sidebar-container .nav-tabs > li.active > a:hover,
+.sidebar-container .nav-tabs > li.active > a:focus {
+ border: none;
+}
+.sidebar-container ul.sidebar-list {
+ margin: 0;
+ padding: 0;
+}
+.sidebar-container ul.sidebar-list li {
+ border-bottom: 1px solid #e7eaec;
+ padding: 15px 20px;
+ list-style: none;
+ font-size: 12px;
+}
+.sidebar-container .sidebar-message:nth-child(2n+2) {
+ background: #f9f9f9;
+}
+.sidebar-container ul.sidebar-list li a {
+ text-decoration: none;
+ color: inherit;
+}
+.sidebar-container .sidebar-content {
+ padding: 15px 20px;
+ font-size: 12px;
+}
+.sidebar-container .sidebar-title {
+ background: #f9f9f9;
+ padding: 20px;
+ border-bottom: 1px solid #e7eaec;
+}
+.sidebar-container .sidebar-title h3 {
+ margin-bottom: 3px;
+ padding-left: 2px;
+}
+.sidebar-container .tab-content h4 {
+ margin-bottom: 5px;
+}
+.sidebar-container .sidebar-message > a > .pull-left {
+ margin-right: 10px;
+}
+.sidebar-container .sidebar-message > a {
+ text-decoration: none;
+ color: inherit;
+}
+.sidebar-container .sidebar-message {
+ padding: 15px 20px;
+}
+.sidebar-container .sidebar-message .media-body {
+ display: block;
+ width: auto;
+}
+.sidebar-container .sidebar-message .message-avatar {
+ height: 38px;
+ width: 38px;
+ border-radius: 50%;
+}
+.sidebar-container .setings-item {
+ padding: 15px 20px;
+ border-bottom: 1px solid #e7eaec;
+}
+body {
+ font-family: "open sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
+ background-color: #2f4050;
+ font-size: 13px;
+ color: #676a6c;
+ overflow-x: hidden;
+}
+html,
+body {
+ height: 100%;
+}
+body.full-height-layout #wrapper,
+body.full-height-layout #page-wrapper {
+ height: 100%;
+}
+#page-wrapper {
+ min-height: auto;
+}
+body.boxed-layout #wrapper {
+ background-color: #2f4050;
+ max-width: 1200px;
+ margin: 0 auto;
+ -webkit-box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.75);
+ -moz-box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.75);
+ box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.75);
+}
+.top-navigation.boxed-layout #wrapper,
+.boxed-layout #wrapper.top-navigation {
+ max-width: 1300px !important;
+}
+.block {
+ display: block;
+}
+.clear {
+ display: block;
+ overflow: hidden;
+}
+a {
+ cursor: pointer;
+}
+a:hover,
+a:focus {
+ text-decoration: none;
+}
+.border-bottom {
+ border-bottom: 1px solid #e7eaec !important;
+}
+.font-bold {
+ font-weight: 600;
+}
+.font-normal {
+ font-weight: 400;
+}
+.text-uppercase {
+ text-transform: uppercase;
+}
+.font-italic {
+ font-style: italic;
+}
+.b-r {
+ border-right: 1px solid #e7eaec;
+}
+.hr-line-dashed {
+ border-top: 1px dashed #e7eaec;
+ color: #ffffff;
+ background-color: #ffffff;
+ height: 1px;
+ margin: 20px 0;
+}
+.hr-line-solid {
+ border-bottom: 1px solid #e7eaec;
+ background-color: rgba(0, 0, 0, 0);
+ border-style: solid !important;
+ margin-top: 15px;
+ margin-bottom: 15px;
+}
+video {
+ width: 100% !important;
+ height: auto !important;
+}
+/* GALLERY */
+.gallery > .row > div {
+ margin-bottom: 15px;
+}
+.fancybox img {
+ margin-bottom: 5px;
+ /* Only for demo */
+ width: 24%;
+}
+/* Summernote text editor */
+.note-editor {
+ height: auto !important;
+}
+.note-editor.fullscreen {
+ z-index: 2050;
+}
+.note-editor.note-frame.fullscreen {
+ z-index: 2020;
+}
+.note-editor.note-frame .note-editing-area .note-editable {
+ color: #676a6c;
+ padding: 15px;
+}
+.note-editor.note-frame {
+ border: none;
+}
+.note-editor.panel {
+ margin-bottom: 0;
+}
+/* MODAL */
+.modal-content {
+ background-clip: padding-box;
+ background-color: #FFFFFF;
+ border: 1px solid rgba(0, 0, 0, 0);
+ border-radius: 4px;
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
+ outline: 0 none;
+ position: relative;
+}
+.modal-dialog {
+ z-index: 2200;
+}
+.modal-body {
+ padding: 20px 30px 30px 30px;
+}
+.inmodal .modal-body {
+ background: #f8fafb;
+}
+.inmodal .modal-header {
+ padding: 30px 15px;
+ text-align: center;
+}
+.animated.modal.fade .modal-dialog {
+ -webkit-transform: none;
+ -ms-transform: none;
+ -o-transform: none;
+ transform: none;
+}
+.inmodal .modal-title {
+ font-size: 26px;
+}
+.inmodal .modal-icon {
+ font-size: 84px;
+ color: #e2e3e3;
+}
+.modal-footer {
+ margin-top: 0;
+}
+/* WRAPPERS */
+#wrapper {
+ width: 100%;
+ overflow-x: hidden;
+}
+.wrapper {
+ padding: 0 20px;
+}
+.wrapper-content {
+ padding: 20px 10px 40px;
+}
+#page-wrapper {
+ padding: 0 15px;
+ min-height: 568px;
+ position: relative !important;
+}
+@media (min-width: 768px) {
+ #page-wrapper {
+ position: inherit;
+ margin: 0 0 0 240px;
+ min-height: 2002px;
+ }
+}
+.title-action {
+ text-align: right;
+ padding-top: 30px;
+}
+.ibox-content h1,
+.ibox-content h2,
+.ibox-content h3,
+.ibox-content h4,
+.ibox-content h5,
+.ibox-title h1,
+.ibox-title h2,
+.ibox-title h3,
+.ibox-title h4,
+.ibox-title h5 {
+ margin-top: 5px;
+}
+ul.unstyled,
+ol.unstyled {
+ list-style: none outside none;
+ margin-left: 0;
+}
+.big-icon {
+ font-size: 160px !important;
+ color: #e5e6e7;
+}
+/* FOOTER */
+.footer {
+ background: none repeat scroll 0 0 white;
+ border-top: 1px solid #e7eaec;
+ bottom: 0;
+ left: 0;
+ padding: 10px 20px;
+ position: absolute;
+ right: 0;
+}
+.footer.fixed_full {
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ z-index: 1000;
+ padding: 10px 20px;
+ background: white;
+ border-top: 1px solid #e7eaec;
+}
+.footer.fixed {
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ z-index: 1000;
+ padding: 10px 20px;
+ background: white;
+ border-top: 1px solid #e7eaec;
+ margin-left: 220px;
+}
+body.mini-navbar .footer.fixed,
+body.body-small.mini-navbar .footer.fixed {
+ margin: 0 0 0 70px;
+}
+body.mini-navbar.canvas-menu .footer.fixed,
+body.canvas-menu .footer.fixed {
+ margin: 0 !important;
+}
+body.fixed-sidebar.body-small.mini-navbar .footer.fixed {
+ margin: 0 0 0 220px;
+}
+body.body-small .footer.fixed {
+ margin-left: 0;
+}
+/* PANELS */
+.page-heading {
+ border-top: 0;
+ padding: 0 10px 20px 10px;
+}
+.panel-heading h1,
+.panel-heading h2 {
+ margin-bottom: 5px;
+}
+/* TABLES */
+.table-bordered {
+ border: 1px solid #EBEBEB;
+}
+.table-bordered > thead > tr > th,
+.table-bordered > thead > tr > td {
+ background-color: #F5F5F6;
+ border-bottom-width: 1px;
+}
+.table-bordered > thead > tr > th,
+.table-bordered > tbody > tr > th,
+.table-bordered > tfoot > tr > th,
+.table-bordered > thead > tr > td,
+.table-bordered > tbody > tr > td,
+.table-bordered > tfoot > tr > td {
+ border: 1px solid #e7e7e7;
+}
+.table > thead > tr > th {
+ border-bottom: 1px solid #DDDDDD;
+ vertical-align: bottom;
+}
+.table > thead > tr > th,
+.table > tbody > tr > th,
+.table > tfoot > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > td,
+.table > tfoot > tr > td {
+ border-top: 1px solid #e7eaec;
+ line-height: 1.42857;
+ padding: 8px;
+ vertical-align: top;
+}
+/* PANELS */
+.panel.blank-panel {
+ background: none;
+ margin: 0;
+}
+.blank-panel .panel-heading {
+ padding-bottom: 0;
+}
+.nav-tabs > li > a {
+ color: #A7B1C2;
+ font-weight: 600;
+ padding: 10px 20px 10px 25px;
+}
+.nav-tabs > li > a:hover,
+.nav-tabs > li > a:focus {
+ background-color: #e6e6e6;
+ color: #676a6c;
+}
+.ui-tab .tab-content {
+ padding: 20px 0;
+}
+/* GLOBAL */
+.no-padding {
+ padding: 0 !important;
+}
+.no-borders {
+ border: none !important;
+}
+.no-margins {
+ margin: 0 !important;
+}
+.no-top-border {
+ border-top: 0 !important;
+}
+.ibox-content.text-box {
+ padding-bottom: 0;
+ padding-top: 15px;
+}
+.border-left-right {
+ border-left: 1px solid #e7eaec;
+ border-right: 1px solid #e7eaec;
+}
+.border-top-bottom {
+ border-top: 1px solid #e7eaec;
+ border-bottom: 1px solid #e7eaec;
+}
+.border-left {
+ border-left: 1px solid #e7eaec;
+}
+.border-right {
+ border-right: 1px solid #e7eaec;
+}
+.border-top {
+ border-top: 1px solid #e7eaec;
+}
+.border-bottom {
+ border-bottom: 1px solid #e7eaec;
+}
+.border-size-sm {
+ border-width: 3px;
+}
+.border-size-md {
+ border-width: 6px;
+}
+.border-size-lg {
+ border-width: 9px;
+}
+.border-size-xl {
+ border-width: 12px;
+}
+.full-width {
+ width: 100% !important;
+}
+.link-block {
+ font-size: 12px;
+ padding: 10px;
+}
+.nav.navbar-top-links .link-block a {
+ font-size: 12px;
+}
+.link-block a {
+ font-size: 10px;
+ color: inherit;
+}
+body.mini-navbar .branding {
+ display: none;
+}
+img.circle-border {
+ border: 6px solid #FFFFFF;
+ border-radius: 50%;
+}
+.branding {
+ float: left;
+ color: #FFFFFF;
+ font-size: 18px;
+ font-weight: 600;
+ padding: 17px 20px;
+ text-align: center;
+ background-color: #1ab394;
+}
+.login-panel {
+ margin-top: 25%;
+}
+.icons-box h3 {
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+.icons-box .infont a i {
+ font-size: 25px;
+ display: block;
+ color: #676a6c;
+}
+.icons-box .infont a {
+ color: #a6a8a9;
+}
+.icons-box .infont a {
+ padding: 10px;
+ margin: 1px;
+ display: block;
+}
+.ui-draggable .ibox-title {
+ cursor: move;
+}
+.breadcrumb {
+ background-color: #ffffff;
+ padding: 0;
+ margin-bottom: 0;
+}
+.breadcrumb > li a {
+ color: inherit;
+}
+.breadcrumb > .active {
+ color: inherit;
+}
+code {
+ background-color: #F9F2F4;
+ border-radius: 4px;
+ color: #ca4440;
+ font-size: 90%;
+ padding: 2px 4px;
+ white-space: nowrap;
+}
+.ibox {
+ clear: both;
+ margin-bottom: 25px;
+ margin-top: 0;
+ padding: 0;
+}
+.ibox.collapsed .ibox-content {
+ display: none;
+}
+.ibox.collapsed .fa.fa-chevron-up:before {
+ content: "\f078";
+}
+.ibox.collapsed .fa.fa-chevron-down:before {
+ content: "\f077";
+}
+.ibox:after,
+.ibox:before {
+ display: table;
+}
+.ibox-title {
+ -moz-border-bottom-colors: none;
+ -moz-border-left-colors: none;
+ -moz-border-right-colors: none;
+ -moz-border-top-colors: none;
+ background-color: #ffffff;
+ border-color: #e7eaec;
+ border-image: none;
+ border-style: solid solid none;
+ border-width: 2px 0 0;
+ color: inherit;
+ margin-bottom: 0;
+ padding: 15px 15px 7px;
+ min-height: 48px;
+}
+.ibox-content {
+ background-color: #ffffff;
+ color: inherit;
+ padding: 15px 20px 20px 20px;
+ border-color: #e7eaec;
+ border-image: none;
+ border-style: solid solid none;
+ border-width: 1px 0;
+}
+.ibox-footer {
+ color: inherit;
+ border-top: 1px solid #e7eaec;
+ font-size: 90%;
+ background: #ffffff;
+ padding: 10px 15px;
+}
+table.table-mail tr td {
+ padding: 12px;
+}
+.table-mail .check-mail {
+ padding-left: 20px;
+}
+.table-mail .mail-date {
+ padding-right: 20px;
+}
+.star-mail,
+.check-mail {
+ width: 40px;
+}
+.unread td a,
+.unread td {
+ font-weight: 600;
+ color: inherit;
+}
+.read td a,
+.read td {
+ font-weight: normal;
+ color: inherit;
+}
+.unread td {
+ background-color: #f9f8f8;
+}
+.ibox-content {
+ clear: both;
+}
+.ibox-heading {
+ background-color: #f3f6fb;
+ border-bottom: none;
+}
+.ibox-heading h3 {
+ font-weight: 200;
+ font-size: 24px;
+}
+.ibox-title h5 {
+ display: inline-block;
+ font-size: 14px;
+ margin: 0 0 7px;
+ padding: 0;
+ text-overflow: ellipsis;
+ float: left;
+}
+.ibox-title .label {
+ float: left;
+ margin-left: 4px;
+}
+.ibox-tools {
+ display: block;
+ float: none;
+ margin-top: 0;
+ position: relative;
+ padding: 0;
+ text-align: right;
+}
+.ibox-tools a {
+ cursor: pointer;
+ margin-left: 5px;
+ color: #c4c4c4;
+}
+.ibox-tools a.btn-primary {
+ color: #fff;
+}
+.ibox-tools .dropdown-menu > li > a {
+ padding: 4px 10px;
+ font-size: 12px;
+}
+.ibox .ibox-tools.open > .dropdown-menu {
+ left: auto;
+ right: 0;
+}
+/* BACKGROUNDS */
+.gray-bg,
+.bg-muted {
+ background-color: #f3f3f4;
+}
+.white-bg {
+ background-color: #ffffff;
+}
+.blue-bg,
+.bg-success {
+ background-color: #1c84c6;
+ color: #ffffff;
+}
+.navy-bg,
+.bg-primary {
+ background-color: #1ab394;
+ color: #ffffff;
+}
+.lazur-bg,
+.bg-info {
+ background-color: #23c6c8;
+ color: #ffffff;
+}
+.yellow-bg,
+.bg-warning {
+ background-color: #f8ac59;
+ color: #ffffff;
+}
+.red-bg,
+.bg-danger {
+ background-color: #ed5565;
+ color: #ffffff;
+}
+.black-bg {
+ background-color: #262626;
+}
+.panel-primary {
+ border-color: #1ab394;
+}
+.panel-primary > .panel-heading {
+ background-color: #1ab394;
+ border-color: #1ab394;
+}
+.panel-success {
+ border-color: #1c84c6;
+}
+.panel-success > .panel-heading {
+ background-color: #1c84c6;
+ border-color: #1c84c6;
+ color: #ffffff;
+}
+.panel-info {
+ border-color: #23c6c8;
+}
+.panel-info > .panel-heading {
+ background-color: #23c6c8;
+ border-color: #23c6c8;
+ color: #ffffff;
+}
+.panel-warning {
+ border-color: #f8ac59;
+}
+.panel-warning > .panel-heading {
+ background-color: #f8ac59;
+ border-color: #f8ac59;
+ color: #ffffff;
+}
+.panel-danger {
+ border-color: #ed5565;
+}
+.panel-danger > .panel-heading {
+ background-color: #ed5565;
+ border-color: #ed5565;
+ color: #ffffff;
+}
+.progress-bar {
+ background-color: #1ab394;
+}
+.progress-small,
+.progress-small .progress-bar {
+ height: 10px;
+}
+.progress-small,
+.progress-mini {
+ margin-top: 5px;
+}
+.progress-mini,
+.progress-mini .progress-bar {
+ height: 5px;
+ margin-bottom: 0;
+}
+.progress-bar-navy-light {
+ background-color: #3dc7ab;
+}
+.progress-bar-success {
+ background-color: #1c84c6;
+}
+.progress-bar-info {
+ background-color: #23c6c8;
+}
+.progress-bar-warning {
+ background-color: #f8ac59;
+}
+.progress-bar-danger {
+ background-color: #ed5565;
+}
+.panel-title {
+ font-size: inherit;
+}
+.jumbotron {
+ border-radius: 6px;
+ padding: 40px;
+}
+.jumbotron h1 {
+ margin-top: 0;
+}
+/* COLORS */
+.text-navy {
+ color: #1ab394;
+}
+.text-primary {
+ color: inherit;
+}
+.text-success {
+ color: #1c84c6;
+}
+.text-info {
+ color: #23c6c8;
+}
+.text-warning {
+ color: #f8ac59;
+}
+.text-danger {
+ color: #ed5565;
+}
+.text-muted {
+ color: #888888;
+}
+.text-white {
+ color: #ffffff;
+}
+.simple_tag {
+ background-color: #f3f3f4;
+ border: 1px solid #e7eaec;
+ border-radius: 2px;
+ color: inherit;
+ font-size: 10px;
+ margin-right: 5px;
+ margin-top: 5px;
+ padding: 5px 12px;
+ display: inline-block;
+}
+.img-shadow {
+ -webkit-box-shadow: 0 0 3px 0 #919191;
+ -moz-box-shadow: 0 0 3px 0 #919191;
+ box-shadow: 0 0 3px 0 #919191;
+}
+/* For handle diferent bg color in AngularJS version */
+.dashboards\.dashboard_2 nav.navbar,
+.dashboards\.dashboard_3 nav.navbar,
+.mailbox\.inbox nav.navbar,
+.mailbox\.email_view nav.navbar,
+.mailbox\.email_compose nav.navbar,
+.dashboards\.dashboard_4_1 nav.navbar,
+.metrics nav.navbar,
+.metrics\.index nav.navbar,
+.dashboards\.dashboard_5 nav.navbar {
+ background: #fff;
+}
+/* For handle diferent bg color in MVC version */
+.Dashboard_2 .navbar.navbar-static-top,
+.Dashboard_3 .navbar.navbar-static-top,
+.Dashboard_4_1 .navbar.navbar-static-top,
+.ComposeEmail .navbar.navbar-static-top,
+.EmailView .navbar.navbar-static-top,
+.Inbox .navbar.navbar-static-top,
+.Metrics .navbar.navbar-static-top,
+.Dashboard_5 .navbar.navbar-static-top {
+ background: #fff;
+}
+a.close-canvas-menu {
+ position: absolute;
+ top: 10px;
+ right: 15px;
+ z-index: 1011;
+ color: #a7b1c2;
+}
+a.close-canvas-menu:hover {
+ color: #fff;
+}
+.close-canvas-menu {
+ display: none;
+}
+.canvas-menu .close-canvas-menu {
+ display: block;
+}
+.light-navbar .navbar.navbar-static-top {
+ background-color: #ffffff;
+}
+/* FULL HEIGHT */
+.full-height {
+ height: 100%;
+}
+.fh-breadcrumb {
+ height: calc(100% - 196px);
+ margin: 0 -15px;
+ position: relative;
+}
+.fh-no-breadcrumb {
+ height: calc(100% - 99px);
+ margin: 0 -15px;
+ position: relative;
+}
+.fh-column {
+ background: #fff;
+ height: 100%;
+ width: 240px;
+ float: left;
+}
+.modal-backdrop {
+ z-index: 2040 !important;
+}
+.modal {
+ z-index: 2050 !important;
+}
+.spiner-example {
+ height: 200px;
+ padding-top: 70px;
+}
+/* MARGINS & PADDINGS */
+.p-xxs {
+ padding: 5px;
+}
+.p-xs {
+ padding: 10px;
+}
+.p-sm {
+ padding: 15px;
+}
+.p-m {
+ padding: 20px;
+}
+.p-md {
+ padding: 25px;
+}
+.p-lg {
+ padding: 30px;
+}
+.p-xl {
+ padding: 40px;
+}
+.p-w-xs {
+ padding: 0 10px;
+}
+.p-w-sm {
+ padding: 0 15px;
+}
+.p-w-m {
+ padding: 0 20px;
+}
+.p-w-md {
+ padding: 0 25px;
+}
+.p-w-lg {
+ padding: 0 30px;
+}
+.p-w-xl {
+ padding: 0 40px;
+}
+.p-h-xs {
+ padding: 10px 0;
+}
+.p-h-sm {
+ padding: 15px 0;
+}
+.p-h-m {
+ padding: 20px 0;
+}
+.p-h-md {
+ padding: 25px 0;
+}
+.p-h-lg {
+ padding: 30px 0;
+}
+.p-h-xl {
+ padding: 40px 0;
+}
+.m-xxs {
+ margin: 2px 4px;
+}
+.m {
+ margin: 15px;
+}
+.m-xs {
+ margin: 5px;
+}
+.m-sm {
+ margin: 10px;
+}
+.m-md {
+ margin: 20px;
+}
+.m-lg {
+ margin: 30px;
+}
+.m-xl {
+ margin: 50px;
+}
+.m-n {
+ margin: 0 !important;
+}
+.m-l-none {
+ margin-left: 0;
+}
+.m-l-xs {
+ margin-left: 5px;
+}
+.m-l-sm {
+ margin-left: 10px;
+}
+.m-l {
+ margin-left: 15px;
+}
+.m-l-md {
+ margin-left: 20px;
+}
+.m-l-lg {
+ margin-left: 30px;
+}
+.m-l-xl {
+ margin-left: 40px;
+}
+.m-l-n-xxs {
+ margin-left: -1px;
+}
+.m-l-n-xs {
+ margin-left: -5px;
+}
+.m-l-n-sm {
+ margin-left: -10px;
+}
+.m-l-n {
+ margin-left: -15px;
+}
+.m-l-n-md {
+ margin-left: -20px;
+}
+.m-l-n-lg {
+ margin-left: -30px;
+}
+.m-l-n-xl {
+ margin-left: -40px;
+}
+.m-t-none {
+ margin-top: 0;
+}
+.m-t-xxs {
+ margin-top: 1px;
+}
+.m-t-xs {
+ margin-top: 5px;
+}
+.m-t-sm {
+ margin-top: 10px;
+}
+.m-t {
+ margin-top: 15px;
+}
+.m-t-md {
+ margin-top: 20px;
+}
+.m-t-lg {
+ margin-top: 30px;
+}
+.m-t-xl {
+ margin-top: 40px;
+}
+.m-t-n-xxs {
+ margin-top: -1px;
+}
+.m-t-n-xs {
+ margin-top: -5px;
+}
+.m-t-n-sm {
+ margin-top: -10px;
+}
+.m-t-n {
+ margin-top: -15px;
+}
+.m-t-n-md {
+ margin-top: -20px;
+}
+.m-t-n-lg {
+ margin-top: -30px;
+}
+.m-t-n-xl {
+ margin-top: -40px;
+}
+.m-r-none {
+ margin-right: 0;
+}
+.m-r-xxs {
+ margin-right: 1px;
+}
+.m-r-xs {
+ margin-right: 5px;
+}
+.m-r-sm {
+ margin-right: 10px;
+}
+.m-r {
+ margin-right: 15px;
+}
+.m-r-md {
+ margin-right: 20px;
+}
+.m-r-lg {
+ margin-right: 30px;
+}
+.m-r-xl {
+ margin-right: 40px;
+}
+.m-r-n-xxs {
+ margin-right: -1px;
+}
+.m-r-n-xs {
+ margin-right: -5px;
+}
+.m-r-n-sm {
+ margin-right: -10px;
+}
+.m-r-n {
+ margin-right: -15px;
+}
+.m-r-n-md {
+ margin-right: -20px;
+}
+.m-r-n-lg {
+ margin-right: -30px;
+}
+.m-r-n-xl {
+ margin-right: -40px;
+}
+.m-b-none {
+ margin-bottom: 0;
+}
+.m-b-xxs {
+ margin-bottom: 1px;
+}
+.m-b-xs {
+ margin-bottom: 5px;
+}
+.m-b-sm {
+ margin-bottom: 10px;
+}
+.m-b {
+ margin-bottom: 15px;
+}
+.m-b-md {
+ margin-bottom: 20px;
+}
+.m-b-lg {
+ margin-bottom: 30px;
+}
+.m-b-xl {
+ margin-bottom: 40px;
+}
+.m-b-n-xxs {
+ margin-bottom: -1px;
+}
+.m-b-n-xs {
+ margin-bottom: -5px;
+}
+.m-b-n-sm {
+ margin-bottom: -10px;
+}
+.m-b-n {
+ margin-bottom: -15px;
+}
+.m-b-n-md {
+ margin-bottom: -20px;
+}
+.m-b-n-lg {
+ margin-bottom: -30px;
+}
+.m-b-n-xl {
+ margin-bottom: -40px;
+}
+.space-15 {
+ margin: 15px 0;
+}
+.space-20 {
+ margin: 20px 0;
+}
+.space-25 {
+ margin: 25px 0;
+}
+.space-30 {
+ margin: 30px 0;
+}
+.img-sm {
+ width: 32px;
+ height: 32px;
+}
+.img-md {
+ width: 64px;
+ height: 64px;
+}
+.img-lg {
+ width: 96px;
+ height: 96px;
+}
+.b-r-xs {
+ -webkit-border-radius: 1px;
+ -moz-border-radius: 1px;
+ border-radius: 1px;
+}
+.b-r-sm {
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+}
+.b-r-md {
+ -webkit-border-radius: 6px;
+ -moz-border-radius: 6px;
+ border-radius: 6px;
+}
+.b-r-lg {
+ -webkit-border-radius: 12px;
+ -moz-border-radius: 12px;
+ border-radius: 12px;
+}
+.b-r-xl {
+ -webkit-border-radius: 24px;
+ -moz-border-radius: 24px;
+ border-radius: 24px;
+}
+.fullscreen-ibox-mode .animated {
+ animation: none;
+}
+body.fullscreen-ibox-mode {
+ overflow-y: hidden;
+}
+.ibox.fullscreen {
+ z-index: 2030;
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ overflow: auto;
+ margin-bottom: 0;
+}
+.ibox.fullscreen .collapse-link {
+ display: none;
+}
+.ibox.fullscreen .ibox-content {
+ min-height: calc(100% - 48px);
+}
+body.modal-open {
+ padding-right: inherit !important;
+}
+body.modal-open .wrapper-content.animated {
+ -webkit-animation: none;
+ -ms-animation-nam: none;
+ animation: none;
+}
+body.modal-open .animated {
+ animation-fill-mode: initial;
+ z-index: inherit;
+}
+/* Show profile dropdown on fixed sidebar */
+body.mini-navbar.fixed-sidebar .profile-element,
+.block {
+ display: block !important;
+}
+body.mini-navbar.fixed-sidebar .nav-header {
+ padding: 33px 25px;
+}
+body.mini-navbar.fixed-sidebar .logo-element {
+ display: none;
+}
+.fullscreen-video .animated {
+ animation: none;
+}
+/* SEARCH PAGE */
+.search-form {
+ margin-top: 10px;
+}
+.search-result h3 {
+ margin-bottom: 0;
+ color: #1E0FBE;
+}
+.search-result .search-link {
+ color: #006621;
+}
+.search-result p {
+ font-size: 12px;
+ margin-top: 5px;
+}
+/* CONTACTS */
+.contact-box {
+ background-color: #ffffff;
+ border: 1px solid #e7eaec;
+ padding: 20px;
+ margin-bottom: 20px;
+}
+.contact-box > a {
+ color: inherit;
+}
+.contact-box.center-version {
+ border: 1px solid #e7eaec;
+ padding: 0;
+}
+.contact-box.center-version > a {
+ display: block;
+ background-color: #ffffff;
+ padding: 20px;
+ text-align: center;
+}
+.contact-box.center-version > a img {
+ width: 80px;
+ height: 80px;
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+.contact-box.center-version address {
+ margin-bottom: 0;
+}
+.contact-box .contact-box-footer {
+ text-align: center;
+ background-color: #ffffff;
+ border-top: 1px solid #e7eaec;
+ padding: 15px 20px;
+}
+/* INVOICE */
+.invoice-table tbody > tr > td:last-child,
+.invoice-table tbody > tr > td:nth-child(4),
+.invoice-table tbody > tr > td:nth-child(3),
+.invoice-table tbody > tr > td:nth-child(2) {
+ text-align: right;
+}
+.invoice-table thead > tr > th:last-child,
+.invoice-table thead > tr > th:nth-child(4),
+.invoice-table thead > tr > th:nth-child(3),
+.invoice-table thead > tr > th:nth-child(2) {
+ text-align: right;
+}
+.invoice-total > tbody > tr > td:first-child {
+ text-align: right;
+}
+.invoice-total > tbody > tr > td {
+ border: 0 none;
+}
+.invoice-total > tbody > tr > td:last-child {
+ border-bottom: 1px solid #DDDDDD;
+ text-align: right;
+ width: 15%;
+}
+/* ERROR & LOGIN & LOCKSCREEN*/
+.middle-box {
+ max-width: 400px;
+ z-index: 100;
+ margin: 0 auto;
+ padding-top: 40px;
+}
+.lockscreen.middle-box {
+ width: 200px;
+ padding-top: 110px;
+}
+.loginscreen.middle-box {
+ width: 300px;
+}
+.loginColumns {
+ max-width: 800px;
+ margin: 0 auto;
+ padding: 100px 20px 20px 20px;
+}
+.passwordBox {
+ max-width: 460px;
+ margin: 0 auto;
+ padding: 100px 20px 20px 20px;
+}
+.logo-name {
+ color: #e6e6e6;
+ font-size: 180px;
+ font-weight: 800;
+ letter-spacing: -10px;
+ margin-bottom: 0;
+}
+.middle-box h1 {
+ font-size: 170px;
+}
+.wrapper .middle-box {
+ margin-top: 140px;
+}
+.lock-word {
+ z-index: 10;
+ position: absolute;
+ top: 110px;
+ left: 50%;
+ margin-left: -470px;
+}
+.lock-word span {
+ font-size: 100px;
+ font-weight: 600;
+ color: #e9e9e9;
+ display: inline-block;
+}
+.lock-word .first-word {
+ margin-right: 160px;
+}
+/* DASBOARD */
+.dashboard-header {
+ border-top: 0;
+ padding: 20px 20px 20px 20px;
+}
+.dashboard-header h2 {
+ margin-top: 10px;
+ font-size: 26px;
+}
+.fist-item {
+ border-top: none !important;
+}
+.statistic-box {
+ margin-top: 40px;
+}
+.dashboard-header .list-group-item span.label {
+ margin-right: 10px;
+}
+.list-group.clear-list .list-group-item {
+ border-top: 1px solid #e7eaec;
+ border-bottom: 0;
+ border-right: 0;
+ border-left: 0;
+ padding: 10px 0;
+}
+ul.clear-list:first-child {
+ border-top: none !important;
+}
+/* Intimeline */
+.timeline-item .date i {
+ position: absolute;
+ top: 0;
+ right: 0;
+ padding: 5px;
+ width: 30px;
+ text-align: center;
+ border-top: 1px solid #e7eaec;
+ border-bottom: 1px solid #e7eaec;
+ border-left: 1px solid #e7eaec;
+ background: #f8f8f8;
+}
+.timeline-item .date {
+ text-align: right;
+ width: 110px;
+ position: relative;
+ padding-top: 30px;
+}
+.timeline-item .content {
+ border-left: 1px solid #e7eaec;
+ border-top: 1px solid #e7eaec;
+ padding-top: 10px;
+ min-height: 100px;
+}
+.timeline-item .content:hover {
+ background: #f6f6f6;
+}
+/* PIN BOARD */
+ul.notes li,
+ul.tag-list li {
+ list-style: none;
+}
+ul.notes li h4 {
+ margin-top: 20px;
+ font-size: 16px;
+}
+ul.notes li div {
+ text-decoration: none;
+ color: #000;
+ background: #ffc;
+ display: block;
+ height: 140px;
+ width: 140px;
+ padding: 1em;
+ position: relative;
+}
+ul.notes li div small {
+ position: absolute;
+ top: 5px;
+ right: 5px;
+ font-size: 10px;
+}
+ul.notes li div a {
+ position: absolute;
+ right: 10px;
+ bottom: 10px;
+ color: inherit;
+}
+ul.notes li {
+ margin: 10px 40px 50px 0;
+ float: left;
+}
+ul.notes li div p {
+ font-size: 12px;
+}
+ul.notes li div {
+ text-decoration: none;
+ color: #000;
+ background: #ffc;
+ display: block;
+ height: 140px;
+ width: 140px;
+ padding: 1em;
+ /* Firefox */
+ -moz-box-shadow: 5px 5px 2px #212121;
+ /* Safari+Chrome */
+ -webkit-box-shadow: 5px 5px 2px rgba(33, 33, 33, 0.7);
+ /* Opera */
+ box-shadow: 5px 5px 2px rgba(33, 33, 33, 0.7);
+}
+ul.notes li div {
+ -webkit-transform: rotate(-6deg);
+ -o-transform: rotate(-6deg);
+ -moz-transform: rotate(-6deg);
+ -ms-transform: rotate(-6deg);
+}
+ul.notes li:nth-child(even) div {
+ -o-transform: rotate(4deg);
+ -webkit-transform: rotate(4deg);
+ -moz-transform: rotate(4deg);
+ -ms-transform: rotate(4deg);
+ position: relative;
+ top: 5px;
+}
+ul.notes li:nth-child(3n) div {
+ -o-transform: rotate(-3deg);
+ -webkit-transform: rotate(-3deg);
+ -moz-transform: rotate(-3deg);
+ -ms-transform: rotate(-3deg);
+ position: relative;
+ top: -5px;
+}
+ul.notes li:nth-child(5n) div {
+ -o-transform: rotate(5deg);
+ -webkit-transform: rotate(5deg);
+ -moz-transform: rotate(5deg);
+ -ms-transform: rotate(5deg);
+ position: relative;
+ top: -10px;
+}
+ul.notes li div:hover,
+ul.notes li div:focus {
+ -webkit-transform: scale(1.1);
+ -moz-transform: scale(1.1);
+ -o-transform: scale(1.1);
+ -ms-transform: scale(1.1);
+ position: relative;
+ z-index: 5;
+}
+ul.notes li div {
+ text-decoration: none;
+ color: #000;
+ background: #ffc;
+ display: block;
+ height: 210px;
+ width: 210px;
+ padding: 1em;
+ -moz-box-shadow: 5px 5px 7px #212121;
+ -webkit-box-shadow: 5px 5px 7px rgba(33, 33, 33, 0.7);
+ box-shadow: 5px 5px 7px rgba(33, 33, 33, 0.7);
+ -moz-transition: -moz-transform 0.15s linear;
+ -o-transition: -o-transform 0.15s linear;
+ -webkit-transition: -webkit-transform 0.15s linear;
+}
+/* FILE MANAGER */
+.file-box {
+ float: left;
+ width: 220px;
+}
+.file-manager h5 {
+ text-transform: uppercase;
+}
+.file-manager {
+ list-style: none outside none;
+ margin: 0;
+ padding: 0;
+}
+.folder-list li a {
+ color: #666666;
+ display: block;
+ padding: 5px 0;
+}
+.folder-list li {
+ border-bottom: 1px solid #e7eaec;
+ display: block;
+}
+.folder-list li i {
+ margin-right: 8px;
+ color: #3d4d5d;
+}
+.category-list li a {
+ color: #666666;
+ display: block;
+ padding: 5px 0;
+}
+.category-list li {
+ display: block;
+}
+.category-list li i {
+ margin-right: 8px;
+ color: #3d4d5d;
+}
+.category-list li a .text-navy {
+ color: #1ab394;
+}
+.category-list li a .text-primary {
+ color: #1c84c6;
+}
+.category-list li a .text-info {
+ color: #23c6c8;
+}
+.category-list li a .text-danger {
+ color: #EF5352;
+}
+.category-list li a .text-warning {
+ color: #F8AC59;
+}
+.file-manager h5.tag-title {
+ margin-top: 20px;
+}
+.tag-list li {
+ float: left;
+}
+.tag-list li a {
+ font-size: 10px;
+ background-color: #f3f3f4;
+ padding: 5px 12px;
+ color: inherit;
+ border-radius: 2px;
+ border: 1px solid #e7eaec;
+ margin-right: 5px;
+ margin-top: 5px;
+ display: block;
+}
+.file {
+ border: 1px solid #e7eaec;
+ padding: 0;
+ background-color: #ffffff;
+ position: relative;
+ margin-bottom: 20px;
+ margin-right: 20px;
+}
+.file-manager .hr-line-dashed {
+ margin: 15px 0;
+}
+.file .icon,
+.file .image {
+ height: 100px;
+ overflow: hidden;
+}
+.file .icon {
+ padding: 15px 10px;
+ text-align: center;
+}
+.file-control {
+ color: inherit;
+ font-size: 11px;
+ margin-right: 10px;
+}
+.file-control.active {
+ text-decoration: underline;
+}
+.file .icon i {
+ font-size: 70px;
+ color: #dadada;
+}
+.file .file-name {
+ padding: 10px;
+ background-color: #f8f8f8;
+ border-top: 1px solid #e7eaec;
+}
+.file-name small {
+ color: #676a6c;
+}
+.corner {
+ position: absolute;
+ display: inline-block;
+ width: 0;
+ height: 0;
+ line-height: 0;
+ border: 0.6em solid transparent;
+ border-right: 0.6em solid #f1f1f1;
+ border-bottom: 0.6em solid #f1f1f1;
+ right: 0em;
+ bottom: 0em;
+}
+a.compose-mail {
+ padding: 8px 10px;
+}
+.mail-search {
+ max-width: 300px;
+}
+/* PROFILE */
+.profile-content {
+ border-top: none !important;
+}
+.profile-stats {
+ margin-right: 10px;
+}
+.profile-image {
+ width: 120px;
+ float: left;
+}
+.profile-image img {
+ width: 96px;
+ height: 96px;
+}
+.profile-info {
+ margin-left: 120px;
+}
+.feed-activity-list .feed-element {
+ border-bottom: 1px solid #e7eaec;
+}
+.feed-element:first-child {
+ margin-top: 0;
+}
+.feed-element {
+ padding-bottom: 15px;
+}
+.feed-element,
+.feed-element .media {
+ margin-top: 15px;
+}
+.feed-element,
+.media-body {
+ overflow: hidden;
+}
+.feed-element > .pull-left {
+ margin-right: 10px;
+}
+.feed-element img.img-circle,
+.dropdown-messages-box img.img-circle {
+ width: 38px;
+ height: 38px;
+}
+.feed-element .well {
+ border: 1px solid #e7eaec;
+ box-shadow: none;
+ margin-top: 10px;
+ margin-bottom: 5px;
+ padding: 10px 20px;
+ font-size: 11px;
+ line-height: 16px;
+}
+.feed-element .actions {
+ margin-top: 10px;
+}
+.feed-element .photos {
+ margin: 10px 0;
+}
+.feed-photo {
+ max-height: 180px;
+ border-radius: 4px;
+ overflow: hidden;
+ margin-right: 10px;
+ margin-bottom: 10px;
+}
+.file-list li {
+ padding: 5px 10px;
+ font-size: 11px;
+ border-radius: 2px;
+ border: 1px solid #e7eaec;
+ margin-bottom: 5px;
+}
+.file-list li a {
+ color: inherit;
+}
+.file-list li a:hover {
+ color: #1ab394;
+}
+.user-friends img {
+ width: 42px;
+ height: 42px;
+ margin-bottom: 5px;
+ margin-right: 5px;
+}
+/* MAILBOX */
+.mail-box {
+ background-color: #ffffff;
+ border: 1px solid #e7eaec;
+ border-top: 0;
+ padding: 0;
+ margin-bottom: 20px;
+}
+.mail-box-header {
+ background-color: #ffffff;
+ border: 1px solid #e7eaec;
+ border-bottom: 0;
+ padding: 30px 20px 20px 20px;
+}
+.mail-box-header h2 {
+ margin-top: 0;
+}
+.mailbox-content .tag-list li a {
+ background: #ffffff;
+}
+.mail-body {
+ border-top: 1px solid #e7eaec;
+ padding: 20px;
+}
+.mail-text {
+ border-top: 1px solid #e7eaec;
+}
+.mail-text .note-toolbar {
+ padding: 10px 15px;
+}
+.mail-body .form-group {
+ margin-bottom: 5px;
+}
+.mail-text .note-editor .note-toolbar {
+ background-color: #F9F8F8;
+}
+.mail-attachment {
+ border-top: 1px solid #e7eaec;
+ padding: 20px;
+ font-size: 12px;
+}
+.mailbox-content {
+ background: none;
+ border: none;
+ padding: 10px;
+}
+.mail-ontact {
+ width: 23%;
+}
+/* PROJECTS */
+.project-people,
+.project-actions {
+ text-align: right;
+ vertical-align: middle;
+}
+dd.project-people {
+ text-align: left;
+ margin-top: 5px;
+}
+.project-people img {
+ width: 32px;
+ height: 32px;
+}
+.project-title a {
+ font-size: 14px;
+ color: #676a6c;
+ font-weight: 600;
+}
+.project-list table tr td {
+ border-top: none;
+ border-bottom: 1px solid #e7eaec;
+ padding: 15px 10px;
+ vertical-align: middle;
+}
+.project-manager .tag-list li a {
+ font-size: 10px;
+ background-color: white;
+ padding: 5px 12px;
+ color: inherit;
+ border-radius: 2px;
+ border: 1px solid #e7eaec;
+ margin-right: 5px;
+ margin-top: 5px;
+ display: block;
+}
+.project-files li a {
+ font-size: 11px;
+ color: #676a6c;
+ margin-left: 10px;
+ line-height: 22px;
+}
+/* FAQ */
+.faq-item {
+ padding: 20px;
+ margin-bottom: 2px;
+ background: #fff;
+}
+.faq-question {
+ font-size: 18px;
+ font-weight: 600;
+ color: #1ab394;
+ display: block;
+}
+.faq-question:hover {
+ color: #179d82;
+}
+.faq-answer {
+ margin-top: 10px;
+ background: #f3f3f4;
+ border: 1px solid #e7eaec;
+ border-radius: 3px;
+ padding: 15px;
+}
+.faq-item .tag-item {
+ background: #f3f3f4;
+ padding: 2px 6px;
+ font-size: 10px;
+ text-transform: uppercase;
+}
+/* Chat view */
+.message-input {
+ height: 90px !important;
+}
+.chat-avatar {
+ width: 36px;
+ height: 36px;
+ float: left;
+ margin-right: 10px;
+}
+.chat-user-name {
+ padding: 10px;
+}
+.chat-user {
+ padding: 8px 10px;
+ border-bottom: 1px solid #e7eaec;
+}
+.chat-user a {
+ color: inherit;
+}
+.chat-view {
+ z-index: 20012;
+}
+.chat-users,
+.chat-statistic {
+ margin-left: -30px;
+}
+@media (max-width: 992px) {
+ .chat-users,
+ .chat-statistic {
+ margin-left: 0;
+ }
+}
+.chat-view .ibox-content {
+ padding: 0;
+}
+.chat-message {
+ padding: 10px 20px;
+}
+.message-avatar {
+ height: 48px;
+ width: 48px;
+ border: 1px solid #e7eaec;
+ border-radius: 4px;
+ margin-top: 1px;
+}
+.chat-discussion .chat-message.left .message-avatar {
+ float: left;
+ margin-right: 10px;
+}
+.chat-discussion .chat-message.right .message-avatar {
+ float: right;
+ margin-left: 10px;
+}
+.message {
+ background-color: #fff;
+ border: 1px solid #e7eaec;
+ text-align: left;
+ display: block;
+ padding: 10px 20px;
+ position: relative;
+ border-radius: 4px;
+}
+.chat-discussion .chat-message.left .message-date {
+ float: right;
+}
+.chat-discussion .chat-message.right .message-date {
+ float: left;
+}
+.chat-discussion .chat-message.left .message {
+ text-align: left;
+ margin-left: 55px;
+}
+.chat-discussion .chat-message.right .message {
+ text-align: right;
+ margin-right: 55px;
+}
+.message-date {
+ font-size: 10px;
+ color: #888888;
+}
+.message-content {
+ display: block;
+}
+.chat-discussion {
+ background: #eee;
+ padding: 15px;
+ height: 400px;
+ overflow-y: auto;
+}
+.chat-users {
+ overflow-y: auto;
+ height: 400px;
+}
+.chat-message-form .form-group {
+ margin-bottom: 0;
+}
+/* jsTree */
+.jstree-open > .jstree-anchor > .fa-folder:before {
+ content: "\f07c";
+}
+.jstree-default .jstree-icon.none {
+ width: 0;
+}
+/* CLIENTS */
+.clients-list {
+ margin-top: 20px;
+}
+.clients-list .tab-pane {
+ position: relative;
+ height: 600px;
+}
+.client-detail {
+ position: relative;
+ height: 620px;
+}
+.clients-list table tr td {
+ height: 46px;
+ vertical-align: middle;
+ border: none;
+}
+.client-link {
+ font-weight: 600;
+ color: inherit;
+}
+.client-link:hover {
+ color: inherit;
+}
+.client-avatar {
+ width: 42px;
+}
+.client-avatar img {
+ width: 28px;
+ height: 28px;
+ border-radius: 50%;
+}
+.contact-type {
+ width: 20px;
+ color: #c1c3c4;
+}
+.client-status {
+ text-align: left;
+}
+.client-detail .vertical-timeline-content p {
+ margin: 0;
+}
+.client-detail .vertical-timeline-icon.gray-bg {
+ color: #a7aaab;
+}
+.clients-list .nav-tabs > li.active > a,
+.clients-list .nav-tabs > li.active > a:hover,
+.clients-list .nav-tabs > li.active > a:focus {
+ border-bottom: 1px solid #fff;
+}
+/* BLOG ARTICLE */
+.blog h2 {
+ font-weight: 700;
+}
+.blog h5 {
+ margin: 0 0 5px 0;
+}
+.blog .btn {
+ margin: 0 0 5px 0;
+}
+.article h1 {
+ font-size: 48px;
+ font-weight: 700;
+ color: #2F4050;
+}
+.article p {
+ font-size: 15px;
+ line-height: 26px;
+}
+.article-title {
+ text-align: center;
+ margin: 40px 0 100px 0;
+}
+.article .ibox-content {
+ padding: 40px;
+}
+/* ISSUE TRACKER */
+.issue-tracker .btn-link {
+ color: #1ab394;
+}
+table.issue-tracker tbody tr td {
+ vertical-align: middle;
+ height: 50px;
+}
+.issue-info {
+ width: 50%;
+}
+.issue-info a {
+ font-weight: 600;
+ color: #676a6c;
+}
+.issue-info small {
+ display: block;
+}
+/* TEAMS */
+.team-members {
+ margin: 10px 0;
+}
+.team-members img.img-circle {
+ width: 42px;
+ height: 42px;
+ margin-bottom: 5px;
+}
+/* AGILE BOARD */
+.sortable-list {
+ padding: 10px 0;
+}
+.agile-list {
+ list-style: none;
+ margin: 0;
+}
+.agile-list li {
+ background: #FAFAFB;
+ border: 1px solid #e7eaec;
+ margin: 0 0 10px 0;
+ padding: 10px;
+ border-radius: 2px;
+}
+.agile-list li:hover {
+ cursor: pointer;
+ background: #fff;
+}
+.agile-list li.warning-element {
+ border-left: 3px solid #f8ac59;
+}
+.agile-list li.danger-element {
+ border-left: 3px solid #ed5565;
+}
+.agile-list li.info-element {
+ border-left: 3px solid #1c84c6;
+}
+.agile-list li.success-element {
+ border-left: 3px solid #1ab394;
+}
+.agile-detail {
+ margin-top: 5px;
+ font-size: 12px;
+}
+/* DIFF */
+ins {
+ background-color: #c6ffc6;
+ text-decoration: none;
+}
+del {
+ background-color: #ffc6c6;
+}
+/* E-commerce */
+.product-box {
+ padding: 0;
+ border: 1px solid #e7eaec;
+}
+.product-box:hover,
+.product-box.active {
+ border: 1px solid transparent;
+ -webkit-box-shadow: 0 3px 7px 0 #a8a8a8;
+ -moz-box-shadow: 0 3px 7px 0 #a8a8a8;
+ box-shadow: 0 3px 7px 0 #a8a8a8;
+}
+.product-imitation {
+ text-align: center;
+ padding: 90px 0;
+ background-color: #f8f8f9;
+ color: #bebec3;
+ font-weight: 600;
+}
+.cart-product-imitation {
+ text-align: center;
+ padding-top: 30px;
+ height: 80px;
+ width: 80px;
+ background-color: #f8f8f9;
+}
+.product-imitation.xl {
+ padding: 120px 0;
+}
+.product-desc {
+ padding: 20px;
+ position: relative;
+}
+.ecommerce .tag-list {
+ padding: 0;
+}
+.ecommerce .fa-star {
+ color: #d1dade;
+}
+.ecommerce .fa-star.active {
+ color: #f8ac59;
+}
+.ecommerce .note-editor {
+ border: 1px solid #e7eaec;
+}
+table.shoping-cart-table {
+ margin-bottom: 0;
+}
+table.shoping-cart-table tr td {
+ border: none;
+ text-align: right;
+}
+table.shoping-cart-table tr td.desc,
+table.shoping-cart-table tr td:first-child {
+ text-align: left;
+}
+table.shoping-cart-table tr td:last-child {
+ width: 80px;
+}
+.product-name {
+ font-size: 16px;
+ font-weight: 600;
+ color: #676a6c;
+ display: block;
+ margin: 2px 0 5px 0;
+}
+.product-name:hover,
+.product-name:focus {
+ color: #1ab394;
+}
+.product-price {
+ font-size: 14px;
+ font-weight: 600;
+ color: #ffffff;
+ background-color: #1ab394;
+ padding: 6px 12px;
+ position: absolute;
+ top: -32px;
+ right: 0;
+}
+.product-detail .ibox-content {
+ padding: 30px 30px 50px 30px;
+}
+.image-imitation {
+ background-color: #f8f8f9;
+ text-align: center;
+ padding: 200px 0;
+}
+.product-main-price small {
+ font-size: 10px;
+}
+.product-images {
+ margin: 0 20px;
+}
+/* Social feed */
+.social-feed-separated .social-feed-box {
+ margin-left: 62px;
+}
+.social-feed-separated .social-avatar {
+ float: left;
+ padding: 0;
+}
+.social-feed-separated .social-avatar img {
+ width: 52px;
+ height: 52px;
+ border: 1px solid #e7eaec;
+}
+.social-feed-separated .social-feed-box .social-avatar {
+ padding: 15px 15px 0 15px;
+ float: none;
+}
+.social-feed-box {
+ /*padding: 15px;*/
+ border: 1px solid #e7eaec;
+ background: #fff;
+ margin-bottom: 15px;
+}
+.article .social-feed-box {
+ margin-bottom: 0;
+ border-bottom: none;
+}
+.article .social-feed-box:last-child {
+ margin-bottom: 0;
+ border-bottom: 1px solid #e7eaec;
+}
+.article .social-feed-box p {
+ font-size: 13px;
+ line-height: 18px;
+}
+.social-action {
+ margin: 15px;
+}
+.social-avatar {
+ padding: 15px 15px 0 15px;
+}
+.social-comment .social-comment {
+ margin-left: 45px;
+}
+.social-avatar img {
+ height: 40px;
+ width: 40px;
+ margin-right: 10px;
+}
+.social-avatar .media-body a {
+ font-size: 14px;
+ display: block;
+}
+.social-body {
+ padding: 15px;
+}
+.social-body img {
+ margin-bottom: 10px;
+}
+.social-footer {
+ border-top: 1px solid #e7eaec;
+ padding: 10px 15px;
+ background: #f9f9f9;
+}
+.social-footer .social-comment img {
+ width: 32px;
+ margin-right: 10px;
+}
+.social-comment:first-child {
+ margin-top: 0;
+}
+.social-comment {
+ margin-top: 15px;
+}
+.social-comment textarea {
+ font-size: 12px;
+}
+/* Vote list */
+.vote-item {
+ padding: 20px 25px;
+ background: #ffffff;
+ border-top: 1px solid #e7eaec;
+}
+.vote-item:last-child {
+ border-bottom: 1px solid #e7eaec;
+}
+.vote-item:hover {
+ background: #fbfbfb;
+}
+.vote-actions {
+ float: left;
+ width: 30px;
+ margin-right: 15px;
+ text-align: center;
+}
+.vote-actions a {
+ color: #1ab394;
+ font-weight: 600;
+}
+.vote-actions {
+ font-weight: 600;
+}
+.vote-title {
+ display: block;
+ color: inherit;
+ font-size: 18px;
+ font-weight: 600;
+ margin-top: 5px;
+ margin-bottom: 2px;
+}
+.vote-title:hover,
+.vote-title:focus {
+ color: inherit;
+}
+.vote-info,
+.vote-title {
+ margin-left: 45px;
+}
+.vote-info,
+.vote-info a {
+ color: #b4b6b8;
+ font-size: 12px;
+}
+.vote-info a {
+ margin-right: 10px;
+}
+.vote-info a:hover {
+ color: #1ab394;
+}
+.vote-icon {
+ text-align: right;
+ font-size: 38px;
+ display: block;
+ color: #e8e9ea;
+}
+.vote-icon.active {
+ color: #1ab394;
+}
+body.body-small .vote-icon {
+ display: none;
+}
+.lightBoxGallery {
+ text-align: center;
+}
+.lightBoxGallery img {
+ margin: 5px;
+}
+#small-chat {
+ position: fixed;
+ bottom: 20px;
+ right: 20px;
+ z-index: 100;
+}
+#small-chat .badge {
+ position: absolute;
+ top: -3px;
+ right: -4px;
+}
+.open-small-chat {
+ height: 38px;
+ width: 38px;
+ display: block;
+ background: #1ab394;
+ padding: 9px 8px;
+ text-align: center;
+ color: #fff;
+ border-radius: 50%;
+}
+.open-small-chat:hover {
+ color: white;
+ background: #1ab394;
+}
+.small-chat-box {
+ display: none;
+ position: fixed;
+ bottom: 20px;
+ right: 75px;
+ background: #fff;
+ border: 1px solid #e7eaec;
+ width: 230px;
+ height: 320px;
+ border-radius: 4px;
+}
+.small-chat-box.ng-small-chat {
+ display: block;
+}
+.body-small .small-chat-box {
+ bottom: 70px;
+ right: 20px;
+}
+.small-chat-box.active {
+ display: block;
+}
+.small-chat-box .heading {
+ background: #2f4050;
+ padding: 8px 15px;
+ font-weight: bold;
+ color: #fff;
+}
+.small-chat-box .chat-date {
+ opacity: 0.6;
+ font-size: 10px;
+ font-weight: normal;
+}
+.small-chat-box .content {
+ padding: 15px 15px;
+}
+.small-chat-box .content .author-name {
+ font-weight: bold;
+ margin-bottom: 3px;
+ font-size: 11px;
+}
+.small-chat-box .content > div {
+ padding-bottom: 20px;
+}
+.small-chat-box .content .chat-message {
+ padding: 5px 10px;
+ border-radius: 6px;
+ font-size: 11px;
+ line-height: 14px;
+ max-width: 80%;
+ background: #f3f3f4;
+ margin-bottom: 10px;
+}
+.small-chat-box .content .chat-message.active {
+ background: #1ab394;
+ color: #fff;
+}
+.small-chat-box .content .left {
+ text-align: left;
+ clear: both;
+}
+.small-chat-box .content .left .chat-message {
+ float: left;
+}
+.small-chat-box .content .right {
+ text-align: right;
+ clear: both;
+}
+.small-chat-box .content .right .chat-message {
+ float: right;
+}
+.small-chat-box .form-chat {
+ padding: 10px 10px;
+}
+
+/*
+ * Usage:
+ *
+ * <div class="sk-spinner sk-spinner-rotating-plane"></div>
+ *
+ */
+.sk-spinner-rotating-plane.sk-spinner {
+ width: 30px;
+ height: 30px;
+ background-color: #1ab394;
+ margin: 0 auto;
+ -webkit-animation: sk-rotatePlane 1.2s infinite ease-in-out;
+ animation: sk-rotatePlane 1.2s infinite ease-in-out;
+}
+@-webkit-keyframes sk-rotatePlane {
+ 0% {
+ -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg);
+ transform: perspective(120px) rotateX(0deg) rotateY(0deg);
+ }
+ 50% {
+ -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg);
+ transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg);
+ }
+ 100% {
+ -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);
+ transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);
+ }
+}
+@keyframes sk-rotatePlane {
+ 0% {
+ -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg);
+ transform: perspective(120px) rotateX(0deg) rotateY(0deg);
+ }
+ 50% {
+ -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg);
+ transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg);
+ }
+ 100% {
+ -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);
+ transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);
+ }
+}
+/*
+ * Usage:
+ *
+ * <div class="sk-spinner sk-spinner-double-bounce">
+ * <div class="sk-double-bounce1"></div>
+ * <div class="sk-double-bounce2"></div>
+ * </div>
+ *
+ */
+.sk-spinner-double-bounce.sk-spinner {
+ width: 40px;
+ height: 40px;
+ position: relative;
+ margin: 0 auto;
+}
+.sk-spinner-double-bounce .sk-double-bounce1,
+.sk-spinner-double-bounce .sk-double-bounce2 {
+ width: 100%;
+ height: 100%;
+ border-radius: 50%;
+ background-color: #1ab394;
+ opacity: 0.6;
+ position: absolute;
+ top: 0;
+ left: 0;
+ -webkit-animation: sk-doubleBounce 2s infinite ease-in-out;
+ animation: sk-doubleBounce 2s infinite ease-in-out;
+}
+.sk-spinner-double-bounce .sk-double-bounce2 {
+ -webkit-animation-delay: -1s;
+ animation-delay: -1s;
+}
+@-webkit-keyframes sk-doubleBounce {
+ 0%,
+ 100% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 50% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+}
+@keyframes sk-doubleBounce {
+ 0%,
+ 100% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 50% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+}
+/*
+ * Usage:
+ *
+ * <div class="sk-spinner sk-spinner-wave">
+ * <div class="sk-rect1"></div>
+ * <div class="sk-rect2"></div>
+ * <div class="sk-rect3"></div>
+ * <div class="sk-rect4"></div>
+ * <div class="sk-rect5"></div>
+ * </div>
+ *
+ */
+.sk-spinner-wave.sk-spinner {
+ margin: 0 auto;
+ width: 50px;
+ height: 30px;
+ text-align: center;
+ font-size: 10px;
+}
+.sk-spinner-wave div {
+ background-color: #1ab394;
+ height: 100%;
+ width: 6px;
+ display: inline-block;
+ -webkit-animation: sk-waveStretchDelay 1.2s infinite ease-in-out;
+ animation: sk-waveStretchDelay 1.2s infinite ease-in-out;
+}
+.sk-spinner-wave .sk-rect2 {
+ -webkit-animation-delay: -1.1s;
+ animation-delay: -1.1s;
+}
+.sk-spinner-wave .sk-rect3 {
+ -webkit-animation-delay: -1s;
+ animation-delay: -1s;
+}
+.sk-spinner-wave .sk-rect4 {
+ -webkit-animation-delay: -0.9s;
+ animation-delay: -0.9s;
+}
+.sk-spinner-wave .sk-rect5 {
+ -webkit-animation-delay: -0.8s;
+ animation-delay: -0.8s;
+}
+@-webkit-keyframes sk-waveStretchDelay {
+ 0%,
+ 40%,
+ 100% {
+ -webkit-transform: scaleY(0.4);
+ transform: scaleY(0.4);
+ }
+ 20% {
+ -webkit-transform: scaleY(1);
+ transform: scaleY(1);
+ }
+}
+@keyframes sk-waveStretchDelay {
+ 0%,
+ 40%,
+ 100% {
+ -webkit-transform: scaleY(0.4);
+ transform: scaleY(0.4);
+ }
+ 20% {
+ -webkit-transform: scaleY(1);
+ transform: scaleY(1);
+ }
+}
+/*
+ * Usage:
+ *
+ * <div class="sk-spinner sk-spinner-wandering-cubes">
+ * <div class="sk-cube1"></div>
+ * <div class="sk-cube2"></div>
+ * </div>
+ *
+ */
+.sk-spinner-wandering-cubes.sk-spinner {
+ margin: 0 auto;
+ width: 32px;
+ height: 32px;
+ position: relative;
+}
+.sk-spinner-wandering-cubes .sk-cube1,
+.sk-spinner-wandering-cubes .sk-cube2 {
+ background-color: #1ab394;
+ width: 10px;
+ height: 10px;
+ position: absolute;
+ top: 0;
+ left: 0;
+ -webkit-animation: sk-wanderingCubeMove 1.8s infinite ease-in-out;
+ animation: sk-wanderingCubeMove 1.8s infinite ease-in-out;
+}
+.sk-spinner-wandering-cubes .sk-cube2 {
+ -webkit-animation-delay: -0.9s;
+ animation-delay: -0.9s;
+}
+@-webkit-keyframes sk-wanderingCubeMove {
+ 25% {
+ -webkit-transform: translateX(42px) rotate(-90deg) scale(0.5);
+ transform: translateX(42px) rotate(-90deg) scale(0.5);
+ }
+ 50% {
+ /* Hack to make FF rotate in the right direction */
+ -webkit-transform: translateX(42px) translateY(42px) rotate(-179deg);
+ transform: translateX(42px) translateY(42px) rotate(-179deg);
+ }
+ 50.1% {
+ -webkit-transform: translateX(42px) translateY(42px) rotate(-180deg);
+ transform: translateX(42px) translateY(42px) rotate(-180deg);
+ }
+ 75% {
+ -webkit-transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5);
+ transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5);
+ }
+ 100% {
+ -webkit-transform: rotate(-360deg);
+ transform: rotate(-360deg);
+ }
+}
+@keyframes sk-wanderingCubeMove {
+ 25% {
+ -webkit-transform: translateX(42px) rotate(-90deg) scale(0.5);
+ transform: translateX(42px) rotate(-90deg) scale(0.5);
+ }
+ 50% {
+ /* Hack to make FF rotate in the right direction */
+ -webkit-transform: translateX(42px) translateY(42px) rotate(-179deg);
+ transform: translateX(42px) translateY(42px) rotate(-179deg);
+ }
+ 50.1% {
+ -webkit-transform: translateX(42px) translateY(42px) rotate(-180deg);
+ transform: translateX(42px) translateY(42px) rotate(-180deg);
+ }
+ 75% {
+ -webkit-transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5);
+ transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5);
+ }
+ 100% {
+ -webkit-transform: rotate(-360deg);
+ transform: rotate(-360deg);
+ }
+}
+/*
+ * Usage:
+ *
+ * <div class="sk-spinner sk-spinner-pulse"></div>
+ *
+ */
+.sk-spinner-pulse.sk-spinner {
+ width: 40px;
+ height: 40px;
+ margin: 0 auto;
+ background-color: #1ab394;
+ border-radius: 100%;
+ -webkit-animation: sk-pulseScaleOut 1s infinite ease-in-out;
+ animation: sk-pulseScaleOut 1s infinite ease-in-out;
+}
+@-webkit-keyframes sk-pulseScaleOut {
+ 0% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 100% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ opacity: 0;
+ }
+}
+@keyframes sk-pulseScaleOut {
+ 0% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 100% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ opacity: 0;
+ }
+}
+/*
+ * Usage:
+ *
+ * <div class="sk-spinner sk-spinner-chasing-dots">
+ * <div class="sk-dot1"></div>
+ * <div class="sk-dot2"></div>
+ * </div>
+ *
+ */
+.sk-spinner-chasing-dots.sk-spinner {
+ margin: 0 auto;
+ width: 40px;
+ height: 40px;
+ position: relative;
+ text-align: center;
+ -webkit-animation: sk-chasingDotsRotate 2s infinite linear;
+ animation: sk-chasingDotsRotate 2s infinite linear;
+}
+.sk-spinner-chasing-dots .sk-dot1,
+.sk-spinner-chasing-dots .sk-dot2 {
+ width: 60%;
+ height: 60%;
+ display: inline-block;
+ position: absolute;
+ top: 0;
+ background-color: #1ab394;
+ border-radius: 100%;
+ -webkit-animation: sk-chasingDotsBounce 2s infinite ease-in-out;
+ animation: sk-chasingDotsBounce 2s infinite ease-in-out;
+}
+.sk-spinner-chasing-dots .sk-dot2 {
+ top: auto;
+ bottom: 0;
+ -webkit-animation-delay: -1s;
+ animation-delay: -1s;
+}
+@-webkit-keyframes sk-chasingDotsRotate {
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
+}
+@keyframes sk-chasingDotsRotate {
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
+}
+@-webkit-keyframes sk-chasingDotsBounce {
+ 0%,
+ 100% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 50% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+}
+@keyframes sk-chasingDotsBounce {
+ 0%,
+ 100% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 50% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+}
+/*
+ * Usage:
+ *
+ * <div class="sk-spinner sk-spinner-three-bounce">
+ * <div class="sk-bounce1"></div>
+ * <div class="sk-bounce2"></div>
+ * <div class="sk-bounce3"></div>
+ * </div>
+ *
+ */
+.sk-spinner-three-bounce.sk-spinner {
+ margin: 0 auto;
+ width: 70px;
+ text-align: center;
+}
+.sk-spinner-three-bounce div {
+ width: 18px;
+ height: 18px;
+ background-color: #1ab394;
+ border-radius: 100%;
+ display: inline-block;
+ -webkit-animation: sk-threeBounceDelay 1.4s infinite ease-in-out;
+ animation: sk-threeBounceDelay 1.4s infinite ease-in-out;
+ /* Prevent first frame from flickering when animation starts */
+ -webkit-animation-fill-mode: both;
+ animation-fill-mode: both;
+}
+.sk-spinner-three-bounce .sk-bounce1 {
+ -webkit-animation-delay: -0.32s;
+ animation-delay: -0.32s;
+}
+.sk-spinner-three-bounce .sk-bounce2 {
+ -webkit-animation-delay: -0.16s;
+ animation-delay: -0.16s;
+}
+@-webkit-keyframes sk-threeBounceDelay {
+ 0%,
+ 80%,
+ 100% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 40% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+}
+@keyframes sk-threeBounceDelay {
+ 0%,
+ 80%,
+ 100% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 40% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+}
+/*
+ * Usage:
+ *
+ * <div class="sk-spinner sk-spinner-circle">
+ * <div class="sk-circle1 sk-circle"></div>
+ * <div class="sk-circle2 sk-circle"></div>
+ * <div class="sk-circle3 sk-circle"></div>
+ * <div class="sk-circle4 sk-circle"></div>
+ * <div class="sk-circle5 sk-circle"></div>
+ * <div class="sk-circle6 sk-circle"></div>
+ * <div class="sk-circle7 sk-circle"></div>
+ * <div class="sk-circle8 sk-circle"></div>
+ * <div class="sk-circle9 sk-circle"></div>
+ * <div class="sk-circle10 sk-circle"></div>
+ * <div class="sk-circle11 sk-circle"></div>
+ * <div class="sk-circle12 sk-circle"></div>
+ * </div>
+ *
+ */
+.sk-spinner-circle.sk-spinner {
+ margin: 0 auto;
+ width: 22px;
+ height: 22px;
+ position: relative;
+}
+.sk-spinner-circle .sk-circle {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ left: 0;
+ top: 0;
+}
+.sk-spinner-circle .sk-circle:before {
+ content: '';
+ display: block;
+ margin: 0 auto;
+ width: 20%;
+ height: 20%;
+ background-color: #1ab394;
+ border-radius: 100%;
+ -webkit-animation: sk-circleBounceDelay 1.2s infinite ease-in-out;
+ animation: sk-circleBounceDelay 1.2s infinite ease-in-out;
+ /* Prevent first frame from flickering when animation starts */
+ -webkit-animation-fill-mode: both;
+ animation-fill-mode: both;
+}
+.sk-spinner-circle .sk-circle2 {
+ -webkit-transform: rotate(30deg);
+ -ms-transform: rotate(30deg);
+ transform: rotate(30deg);
+}
+.sk-spinner-circle .sk-circle3 {
+ -webkit-transform: rotate(60deg);
+ -ms-transform: rotate(60deg);
+ transform: rotate(60deg);
+}
+.sk-spinner-circle .sk-circle4 {
+ -webkit-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ transform: rotate(90deg);
+}
+.sk-spinner-circle .sk-circle5 {
+ -webkit-transform: rotate(120deg);
+ -ms-transform: rotate(120deg);
+ transform: rotate(120deg);
+}
+.sk-spinner-circle .sk-circle6 {
+ -webkit-transform: rotate(150deg);
+ -ms-transform: rotate(150deg);
+ transform: rotate(150deg);
+}
+.sk-spinner-circle .sk-circle7 {
+ -webkit-transform: rotate(180deg);
+ -ms-transform: rotate(180deg);
+ transform: rotate(180deg);
+}
+.sk-spinner-circle .sk-circle8 {
+ -webkit-transform: rotate(210deg);
+ -ms-transform: rotate(210deg);
+ transform: rotate(210deg);
+}
+.sk-spinner-circle .sk-circle9 {
+ -webkit-transform: rotate(240deg);
+ -ms-transform: rotate(240deg);
+ transform: rotate(240deg);
+}
+.sk-spinner-circle .sk-circle10 {
+ -webkit-transform: rotate(270deg);
+ -ms-transform: rotate(270deg);
+ transform: rotate(270deg);
+}
+.sk-spinner-circle .sk-circle11 {
+ -webkit-transform: rotate(300deg);
+ -ms-transform: rotate(300deg);
+ transform: rotate(300deg);
+}
+.sk-spinner-circle .sk-circle12 {
+ -webkit-transform: rotate(330deg);
+ -ms-transform: rotate(330deg);
+ transform: rotate(330deg);
+}
+.sk-spinner-circle .sk-circle2:before {
+ -webkit-animation-delay: -1.1s;
+ animation-delay: -1.1s;
+}
+.sk-spinner-circle .sk-circle3:before {
+ -webkit-animation-delay: -1s;
+ animation-delay: -1s;
+}
+.sk-spinner-circle .sk-circle4:before {
+ -webkit-animation-delay: -0.9s;
+ animation-delay: -0.9s;
+}
+.sk-spinner-circle .sk-circle5:before {
+ -webkit-animation-delay: -0.8s;
+ animation-delay: -0.8s;
+}
+.sk-spinner-circle .sk-circle6:before {
+ -webkit-animation-delay: -0.7s;
+ animation-delay: -0.7s;
+}
+.sk-spinner-circle .sk-circle7:before {
+ -webkit-animation-delay: -0.6s;
+ animation-delay: -0.6s;
+}
+.sk-spinner-circle .sk-circle8:before {
+ -webkit-animation-delay: -0.5s;
+ animation-delay: -0.5s;
+}
+.sk-spinner-circle .sk-circle9:before {
+ -webkit-animation-delay: -0.4s;
+ animation-delay: -0.4s;
+}
+.sk-spinner-circle .sk-circle10:before {
+ -webkit-animation-delay: -0.3s;
+ animation-delay: -0.3s;
+}
+.sk-spinner-circle .sk-circle11:before {
+ -webkit-animation-delay: -0.2s;
+ animation-delay: -0.2s;
+}
+.sk-spinner-circle .sk-circle12:before {
+ -webkit-animation-delay: -0.1s;
+ animation-delay: -0.1s;
+}
+@-webkit-keyframes sk-circleBounceDelay {
+ 0%,
+ 80%,
+ 100% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 40% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+}
+@keyframes sk-circleBounceDelay {
+ 0%,
+ 80%,
+ 100% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 40% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+}
+/*
+ * Usage:
+ *
+ * <div class="sk-spinner sk-spinner-cube-grid">
+ * <div class="sk-cube"></div>
+ * <div class="sk-cube"></div>
+ * <div class="sk-cube"></div>
+ * <div class="sk-cube"></div>
+ * <div class="sk-cube"></div>
+ * <div class="sk-cube"></div>
+ * <div class="sk-cube"></div>
+ * <div class="sk-cube"></div>
+ * <div class="sk-cube"></div>
+ * </div>
+ *
+ */
+.sk-spinner-cube-grid {
+ /*
+ * Spinner positions
+ * 1 2 3
+ * 4 5 6
+ * 7 8 9
+ */
+}
+.sk-spinner-cube-grid.sk-spinner {
+ width: 30px;
+ height: 30px;
+ margin: 0 auto;
+}
+.sk-spinner-cube-grid .sk-cube {
+ width: 33%;
+ height: 33%;
+ background-color: #1ab394;
+ float: left;
+ -webkit-animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out;
+ animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out;
+}
+.sk-spinner-cube-grid .sk-cube:nth-child(1) {
+ -webkit-animation-delay: 0.2s;
+ animation-delay: 0.2s;
+}
+.sk-spinner-cube-grid .sk-cube:nth-child(2) {
+ -webkit-animation-delay: 0.3s;
+ animation-delay: 0.3s;
+}
+.sk-spinner-cube-grid .sk-cube:nth-child(3) {
+ -webkit-animation-delay: 0.4s;
+ animation-delay: 0.4s;
+}
+.sk-spinner-cube-grid .sk-cube:nth-child(4) {
+ -webkit-animation-delay: 0.1s;
+ animation-delay: 0.1s;
+}
+.sk-spinner-cube-grid .sk-cube:nth-child(5) {
+ -webkit-animation-delay: 0.2s;
+ animation-delay: 0.2s;
+}
+.sk-spinner-cube-grid .sk-cube:nth-child(6) {
+ -webkit-animation-delay: 0.3s;
+ animation-delay: 0.3s;
+}
+.sk-spinner-cube-grid .sk-cube:nth-child(7) {
+ -webkit-animation-delay: 0s;
+ animation-delay: 0s;
+}
+.sk-spinner-cube-grid .sk-cube:nth-child(8) {
+ -webkit-animation-delay: 0.1s;
+ animation-delay: 0.1s;
+}
+.sk-spinner-cube-grid .sk-cube:nth-child(9) {
+ -webkit-animation-delay: 0.2s;
+ animation-delay: 0.2s;
+}
+@-webkit-keyframes sk-cubeGridScaleDelay {
+ 0%,
+ 70%,
+ 100% {
+ -webkit-transform: scale3D(1, 1, 1);
+ transform: scale3D(1, 1, 1);
+ }
+ 35% {
+ -webkit-transform: scale3D(0, 0, 1);
+ transform: scale3D(0, 0, 1);
+ }
+}
+@keyframes sk-cubeGridScaleDelay {
+ 0%,
+ 70%,
+ 100% {
+ -webkit-transform: scale3D(1, 1, 1);
+ transform: scale3D(1, 1, 1);
+ }
+ 35% {
+ -webkit-transform: scale3D(0, 0, 1);
+ transform: scale3D(0, 0, 1);
+ }
+}
+/*
+ * Usage:
+ *
+ * <div class="sk-spinner sk-spinner-wordpress">
+ * <span class="sk-inner-circle"></span>
+ * </div>
+ *
+ */
+.sk-spinner-wordpress.sk-spinner {
+ background-color: #1ab394;
+ width: 30px;
+ height: 30px;
+ border-radius: 30px;
+ position: relative;
+ margin: 0 auto;
+ -webkit-animation: sk-innerCircle 1s linear infinite;
+ animation: sk-innerCircle 1s linear infinite;
+}
+.sk-spinner-wordpress .sk-inner-circle {
+ display: block;
+ background-color: #fff;
+ width: 8px;
+ height: 8px;
+ position: absolute;
+ border-radius: 8px;
+ top: 5px;
+ left: 5px;
+}
+@-webkit-keyframes sk-innerCircle {
+ 0% {
+ -webkit-transform: rotate(0);
+ transform: rotate(0);
+ }
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
+}
+@keyframes sk-innerCircle {
+ 0% {
+ -webkit-transform: rotate(0);
+ transform: rotate(0);
+ }
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
+}
+/*
+ * Usage:
+ *
+ * <div class="sk-spinner sk-spinner-fading-circle">
+ * <div class="sk-circle1 sk-circle"></div>
+ * <div class="sk-circle2 sk-circle"></div>
+ * <div class="sk-circle3 sk-circle"></div>
+ * <div class="sk-circle4 sk-circle"></div>
+ * <div class="sk-circle5 sk-circle"></div>
+ * <div class="sk-circle6 sk-circle"></div>
+ * <div class="sk-circle7 sk-circle"></div>
+ * <div class="sk-circle8 sk-circle"></div>
+ * <div class="sk-circle9 sk-circle"></div>
+ * <div class="sk-circle10 sk-circle"></div>
+ * <div class="sk-circle11 sk-circle"></div>
+ * <div class="sk-circle12 sk-circle"></div>
+ * </div>
+ *
+ */
+.sk-spinner-fading-circle.sk-spinner {
+ margin: 0 auto;
+ width: 22px;
+ height: 22px;
+ position: relative;
+}
+.sk-spinner-fading-circle .sk-circle {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ left: 0;
+ top: 0;
+}
+.sk-spinner-fading-circle .sk-circle:before {
+ content: '';
+ display: block;
+ margin: 0 auto;
+ width: 18%;
+ height: 18%;
+ background-color: #1ab394;
+ border-radius: 100%;
+ -webkit-animation: sk-circleFadeDelay 1.2s infinite ease-in-out;
+ animation: sk-circleFadeDelay 1.2s infinite ease-in-out;
+ /* Prevent first frame from flickering when animation starts */
+ -webkit-animation-fill-mode: both;
+ animation-fill-mode: both;
+}
+.sk-spinner-fading-circle .sk-circle2 {
+ -webkit-transform: rotate(30deg);
+ -ms-transform: rotate(30deg);
+ transform: rotate(30deg);
+}
+.sk-spinner-fading-circle .sk-circle3 {
+ -webkit-transform: rotate(60deg);
+ -ms-transform: rotate(60deg);
+ transform: rotate(60deg);
+}
+.sk-spinner-fading-circle .sk-circle4 {
+ -webkit-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ transform: rotate(90deg);
+}
+.sk-spinner-fading-circle .sk-circle5 {
+ -webkit-transform: rotate(120deg);
+ -ms-transform: rotate(120deg);
+ transform: rotate(120deg);
+}
+.sk-spinner-fading-circle .sk-circle6 {
+ -webkit-transform: rotate(150deg);
+ -ms-transform: rotate(150deg);
+ transform: rotate(150deg);
+}
+.sk-spinner-fading-circle .sk-circle7 {
+ -webkit-transform: rotate(180deg);
+ -ms-transform: rotate(180deg);
+ transform: rotate(180deg);
+}
+.sk-spinner-fading-circle .sk-circle8 {
+ -webkit-transform: rotate(210deg);
+ -ms-transform: rotate(210deg);
+ transform: rotate(210deg);
+}
+.sk-spinner-fading-circle .sk-circle9 {
+ -webkit-transform: rotate(240deg);
+ -ms-transform: rotate(240deg);
+ transform: rotate(240deg);
+}
+.sk-spinner-fading-circle .sk-circle10 {
+ -webkit-transform: rotate(270deg);
+ -ms-transform: rotate(270deg);
+ transform: rotate(270deg);
+}
+.sk-spinner-fading-circle .sk-circle11 {
+ -webkit-transform: rotate(300deg);
+ -ms-transform: rotate(300deg);
+ transform: rotate(300deg);
+}
+.sk-spinner-fading-circle .sk-circle12 {
+ -webkit-transform: rotate(330deg);
+ -ms-transform: rotate(330deg);
+ transform: rotate(330deg);
+}
+.sk-spinner-fading-circle .sk-circle2:before {
+ -webkit-animation-delay: -1.1s;
+ animation-delay: -1.1s;
+}
+.sk-spinner-fading-circle .sk-circle3:before {
+ -webkit-animation-delay: -1s;
+ animation-delay: -1s;
+}
+.sk-spinner-fading-circle .sk-circle4:before {
+ -webkit-animation-delay: -0.9s;
+ animation-delay: -0.9s;
+}
+.sk-spinner-fading-circle .sk-circle5:before {
+ -webkit-animation-delay: -0.8s;
+ animation-delay: -0.8s;
+}
+.sk-spinner-fading-circle .sk-circle6:before {
+ -webkit-animation-delay: -0.7s;
+ animation-delay: -0.7s;
+}
+.sk-spinner-fading-circle .sk-circle7:before {
+ -webkit-animation-delay: -0.6s;
+ animation-delay: -0.6s;
+}
+.sk-spinner-fading-circle .sk-circle8:before {
+ -webkit-animation-delay: -0.5s;
+ animation-delay: -0.5s;
+}
+.sk-spinner-fading-circle .sk-circle9:before {
+ -webkit-animation-delay: -0.4s;
+ animation-delay: -0.4s;
+}
+.sk-spinner-fading-circle .sk-circle10:before {
+ -webkit-animation-delay: -0.3s;
+ animation-delay: -0.3s;
+}
+.sk-spinner-fading-circle .sk-circle11:before {
+ -webkit-animation-delay: -0.2s;
+ animation-delay: -0.2s;
+}
+.sk-spinner-fading-circle .sk-circle12:before {
+ -webkit-animation-delay: -0.1s;
+ animation-delay: -0.1s;
+}
+@-webkit-keyframes sk-circleFadeDelay {
+ 0%,
+ 39%,
+ 100% {
+ opacity: 0;
+ }
+ 40% {
+ opacity: 1;
+ }
+}
+@keyframes sk-circleFadeDelay {
+ 0%,
+ 39%,
+ 100% {
+ opacity: 0;
+ }
+ 40% {
+ opacity: 1;
+ }
+}
+.ibox-content > .sk-spinner {
+ display: none;
+}
+.ibox-content.sk-loading {
+ position: relative;
+}
+.ibox-content.sk-loading:after {
+ content: '';
+ background-color: rgba(255, 255, 255, 0.7);
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+}
+.ibox-content.sk-loading > .sk-spinner {
+ display: block;
+ position: absolute;
+ top: 40%;
+ left: 0;
+ right: 0;
+ z-index: 2000;
+}
+/*
+ *
+ * INSPINIA Landing Page - Responsive Admin Theme
+ * Copyright 2014 Webapplayers.com
+ *
+*/
+/* GLOBAL STYLES
+-------------------------------------------------- */
+/* PACE PLUGIN
+-------------------------------------------------- */
+.landing-page.pace .pace-progress {
+ background: #fff;
+ position: fixed;
+ z-index: 2000;
+ top: 0;
+ left: 0;
+ height: 2px;
+ -webkit-transition: width 1s;
+ -moz-transition: width 1s;
+ -o-transition: width 1s;
+ transition: width 1s;
+}
+.pace-inactive {
+ display: none;
+}
+body.landing-page {
+ color: #676a6c;
+ font-family: 'Open Sans', helvetica, arial, sans-serif;
+ background-color: #fff;
+}
+.landing-page {
+ /* CUSTOMIZE THE NAVBAR
+ -------------------------------------------------- */
+ /* Flip around the padding for proper display in narrow viewports */
+ /* BACKGROUNDS SLIDER
+ -------------------------------------------------- */
+ /* CUSTOMIZE THE CAROUSEL
+ -------------------------------------------------- */
+ /* Carousel base class */
+ /* Since positioning the image, we need to help out the caption */
+ /* Declare heights because of positioning of img element */
+ /* Sections
+ ------------------------- */
+ /* Buttons - only primary custom button
+ ------------------------- */
+ /* RESPONSIVE CSS
+ -------------------------------------------------- */
+}
+.landing-page .container {
+ overflow: hidden;
+}
+.landing-page span.navy {
+ color: #1ab394;
+}
+.landing-page p.text-color {
+ color: #676a6c;
+}
+.landing-page a.navy-link {
+ color: #1ab394;
+ text-decoration: none;
+}
+.landing-page a.navy-link:hover {
+ color: #179d82;
+}
+.landing-page section p {
+ color: #aeaeae;
+ font-size: 13px;
+}
+.landing-page address {
+ font-size: 13px;
+}
+.landing-page h1 {
+ margin-top: 10px;
+ font-size: 30px;
+ font-weight: 200;
+}
+.landing-page .navy-line {
+ width: 60px;
+ height: 1px;
+ margin: 60px auto 0;
+ border-bottom: 2px solid #1ab394;
+}
+.landing-page .navbar-wrapper {
+ position: fixed;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 200;
+}
+.landing-page .navbar-wrapper > .container {
+ padding-right: 0;
+ padding-left: 0;
+}
+.landing-page .navbar-wrapper .navbar {
+ padding-right: 15px;
+ padding-left: 15px;
+}
+.landing-page .navbar-default.navbar-scroll {
+ background-color: #fff;
+ border-color: #fff;
+ padding: 15px 0;
+}
+.landing-page .navbar-default {
+ background-color: transparent;
+ border-color: transparent;
+ transition: all 0.3s ease-in-out 0s;
+}
+.landing-page .navbar-default .nav li a {
+ color: #fff;
+ font-family: 'Open Sans', helvetica, arial, sans-serif;
+ font-weight: 700;
+ letter-spacing: 1px;
+ text-transform: uppercase;
+ font-size: 14px;
+}
+.landing-page .navbar-nav > li > a {
+ padding-top: 25px;
+ border-top: 6px solid transparent;
+}
+.landing-page .navbar-default .navbar-nav > .active > a,
+.landing-page .navbar-default .navbar-nav > .active > a:hover {
+ background: transparent;
+ color: #fff;
+ border-top: 6px solid #1ab394;
+}
+.landing-page .navbar-default .navbar-nav > li > a:hover,
+.landing-page .navbar-default .navbar-nav > li > a:focus {
+ color: #1ab394;
+ background: inherit;
+}
+.landing-page .navbar-default .navbar-nav > .active > a:focus {
+ background: transparent;
+ color: #fff;
+}
+.landing-page .navbar-default .navbar-nav > .active > a:focus {
+ background: transparent;
+ color: #ffffff;
+}
+.landing-page .navbar-default.navbar-scroll .navbar-nav > .active > a:focus {
+ background: transparent;
+ color: inherit;
+}
+.landing-page .navbar-default .navbar-brand:hover,
+.landing-page .navbar-default .navbar-brand:focus {
+ background: #179d82;
+ color: #fff;
+}
+.landing-page .navbar-default .navbar-brand {
+ color: #fff;
+ height: auto;
+ display: block;
+ font-size: 14px;
+ background: #1ab394;
+ padding: 15px 20px 15px 20px;
+ border-radius: 0 0 5px 5px;
+ font-weight: 700;
+ transition: all 0.3s ease-in-out 0s;
+}
+.landing-page .navbar-scroll.navbar-default .nav li a {
+ color: #676a6c;
+}
+.landing-page .navbar-scroll.navbar-default .nav li a:hover {
+ color: #1ab394;
+}
+.landing-page .navbar-wrapper .navbar.navbar-scroll {
+ padding-top: 0;
+ padding-bottom: 5px;
+ border-bottom: 1px solid #e7eaec;
+ border-radius: 0;
+}
+.landing-page .nav > li.active {
+ border: none;
+ background: inherit;
+}
+.landing-page .nav > li > a {
+ padding: 25px 10px 15px 10px;
+}
+.landing-page .navbar-scroll .navbar-nav > li > a {
+ padding: 20px 10px;
+}
+.landing-page .navbar-default .navbar-nav > .active > a,
+.landing-page .navbar-default .navbar-nav > .active > a:hover {
+ border-top: 6px solid #1ab394;
+}
+.landing-page .navbar-fixed-top {
+ border: none !important;
+}
+.landing-page .navbar-fixed-top.navbar-scroll {
+ border-bottom: 1px solid #e7eaec !important;
+}
+.landing-page .navbar.navbar-scroll .navbar-brand {
+ margin-top: 15px;
+ border-radius: 5px;
+ font-size: 12px;
+ padding: 10px;
+ height: auto;
+}
+.landing-page .header-back {
+ height: 470px;
+ width: 100%;
+}
+.landing-page .carousel {
+ height: 470px;
+}
+.landing-page .carousel-caption {
+ z-index: 10;
+}
+.landing-page .carousel .item {
+ height: 470px;
+ background-color: #777;
+}
+.landing-page .carousel-inner > .item > img {
+ position: absolute;
+ top: 0;
+ left: 0;
+ min-width: 100%;
+ height: 470px;
+}
+.landing-page .carousel-fade .carousel-inner .item {
+ opacity: 0;
+ -webkit-transition-property: opacity;
+ transition-property: opacity;
+}
+.landing-page .carousel-fade .carousel-inner .active {
+ opacity: 1;
+}
+.landing-page .carousel-fade .carousel-inner .active.left,
+.landing-page .carousel-fade .carousel-inner .active.right {
+ left: 0;
+ opacity: 0;
+ z-index: 1;
+}
+.landing-page .carousel-fade .carousel-inner .next.left,
+.landing-page .carousel-fade .carousel-inner .prev.right {
+ opacity: 1;
+}
+.landing-page .carousel-fade .carousel-control {
+ z-index: 2;
+}
+.landing-page .carousel-control.left,
+.landing-page .carousel-control.right {
+ background: none;
+}
+.landing-page .carousel-control {
+ width: 6%;
+}
+.landing-page .carousel-inner .container {
+ position: relative;
+ overflow: visible;
+}
+.landing-page .carousel-inner {
+ overflow: visible;
+}
+.landing-page .carousel-caption {
+ position: absolute;
+ top: 100px;
+ left: 0;
+ bottom: auto;
+ right: auto;
+ text-align: left;
+}
+.landing-page .carousel-caption {
+ position: absolute;
+ top: 100px;
+ left: 0;
+ bottom: auto;
+ right: auto;
+ text-align: left;
+}
+.landing-page .carousel-caption.blank {
+ top: 140px;
+}
+.landing-page .carousel-image {
+ position: absolute;
+ right: 10px;
+ top: 150px;
+}
+.landing-page .carousel-indicators {
+ padding-right: 60px;
+}
+.landing-page .carousel-caption h1 {
+ font-weight: 700;
+ font-size: 38px;
+ text-transform: uppercase;
+ text-shadow: none;
+ letter-spacing: -1.5px;
+}
+.landing-page .carousel-caption p {
+ font-weight: 700;
+ text-transform: uppercase;
+ text-shadow: none;
+}
+.landing-page .caption-link {
+ color: #fff;
+ margin-left: 10px;
+ text-transform: capitalize;
+ font-weight: 400;
+}
+.landing-page .caption-link:hover {
+ text-decoration: none;
+ color: inherit;
+}
+.landing-page .services {
+ padding-top: 60px;
+}
+.landing-page .services h2 {
+ font-size: 20px;
+ letter-spacing: -1px;
+ font-weight: 600;
+ text-transform: uppercase;
+}
+.landing-page .features-block {
+ margin-top: 40px;
+}
+.landing-page .features-text {
+ margin-top: 40px;
+}
+.landing-page .features small {
+ color: #1ab394;
+}
+.landing-page .features h2 {
+ font-size: 18px;
+ margin-top: 5px;
+}
+.landing-page .features-text-alone {
+ margin: 40px 0;
+}
+.landing-page .features-text-alone h1 {
+ font-weight: 200;
+}
+.landing-page .features-icon {
+ color: #1ab394;
+ font-size: 40px;
+}
+.landing-page .navy-section {
+ margin-top: 60px;
+ background: #1ab394;
+ color: #fff;
+ padding: 20px 0;
+}
+.landing-page .gray-section {
+ background: #f4f4f4;
+ margin-top: 60px;
+}
+.landing-page .team-member {
+ text-align: center;
+}
+.landing-page .team-member img {
+ margin: auto;
+}
+.landing-page .social-icon a {
+ background: #1ab394;
+ color: #fff;
+ padding: 4px 8px;
+ height: 28px;
+ width: 28px;
+ display: block;
+ border-radius: 50px;
+}
+.landing-page .social-icon a:hover {
+ background: #179d82;
+}
+.landing-page .img-small {
+ height: 88px;
+ width: 88px;
+}
+.landing-page .pricing-plan {
+ margin: 20px 30px 0 30px;
+ border-radius: 4px;
+}
+.landing-page .pricing-plan.selected {
+ transform: scale(1.1);
+ background: #f4f4f4;
+}
+.landing-page .pricing-plan li {
+ padding: 10px 16px;
+ border-top: 1px solid #e7eaec;
+ text-align: center;
+ color: #aeaeae;
+}
+.landing-page .pricing-plan .pricing-price span {
+ font-weight: 700;
+ color: #1ab394;
+}
+.landing-page li.pricing-desc {
+ font-size: 13px;
+ border-top: none;
+ padding: 20px 16px;
+}
+.landing-page li.pricing-title {
+ background: #1ab394;
+ color: #fff;
+ padding: 10px;
+ border-radius: 4px 4px 0 0;
+ font-size: 22px;
+ font-weight: 600;
+}
+.landing-page .big-icon {
+ font-size: 56px !important;
+}
+.landing-page .features .big-icon {
+ color: #1ab394 !important;
+}
+.landing-page section.timeline {
+ padding-bottom: 30px;
+}
+.landing-page section.comments {
+ padding-bottom: 80px;
+}
+.landing-page .comments-avatar {
+ margin-top: 25px;
+ margin-left: 22px;
+ margin-bottom: 25px;
+}
+.landing-page .comments-avatar .commens-name {
+ font-weight: 600;
+ font-size: 14px;
+}
+.landing-page .comments-avatar img {
+ width: 42px;
+ height: 42px;
+ border-radius: 50%;
+ margin-right: 10px;
+}
+.landing-page .bubble {
+ position: relative;
+ height: 120px;
+ padding: 20px;
+ background: #FFFFFF;
+ -webkit-border-radius: 10px;
+ -moz-border-radius: 10px;
+ border-radius: 10px;
+ font-style: italic;
+ font-size: 14px;
+}
+.landing-page .bubble:after {
+ content: '';
+ position: absolute;
+ border-style: solid;
+ border-width: 15px 14px 0;
+ border-color: #FFFFFF transparent;
+ display: block;
+ width: 0;
+ z-index: 1;
+ bottom: -15px;
+ left: 30px;
+}
+.landing-page .btn-primary.btn-outline:hover,
+.landing-page .btn-success.btn-outline:hover,
+.landing-page .btn-info.btn-outline:hover,
+.landing-page .btn-warning.btn-outline:hover,
+.landing-page .btn-danger.btn-outline:hover {
+ color: #fff;
+}
+.landing-page .btn-primary {
+ background-color: #1ab394;
+ border-color: #1ab394;
+ color: #FFFFFF;
+ font-size: 14px;
+ padding: 10px 20px;
+ font-weight: 600;
+}
+.landing-page .btn-primary:hover,
+.landing-page .btn-primary:focus,
+.landing-page .btn-primary:active,
+.landing-page .btn-primary.active,
+.landing-page .open .dropdown-toggle.btn-primary {
+ background-color: #179d82;
+ border-color: #179d82;
+ color: #FFFFFF;
+}
+.landing-page .btn-primary:active,
+.landing-page .btn-primary.active,
+.landing-page .open .dropdown-toggle.btn-primary {
+ background-image: none;
+}
+.landing-page .btn-primary.disabled,
+.landing-page .btn-primary.disabled:hover,
+.landing-page .btn-primary.disabled:focus,
+.landing-page .btn-primary.disabled:active,
+.landing-page .btn-primary.disabled.active,
+.landing-page .btn-primary[disabled],
+.landing-page .btn-primary[disabled]:hover,
+.landing-page .btn-primary[disabled]:focus,
+.landing-page .btn-primary[disabled]:active,
+.landing-page .btn-primary.active[disabled],
+.landing-page fieldset[disabled] .btn-primary,
+.landing-page fieldset[disabled] .btn-primary:hover,
+.landing-page fieldset[disabled] .btn-primary:focus,
+.landing-page fieldset[disabled] .btn-primary:active,
+.landing-page fieldset[disabled] .btn-primary.active {
+ background-color: #1dc5a3;
+ border-color: #1dc5a3;
+}
+@media (min-width: 768px) {
+ .landing-page {
+ /* Navbar positioning foo */
+ /* The navbar becomes detached from the top, so we round the corners */
+ /* Bump up size of carousel content */
+ }
+ .landing-page .navbar-wrapper {
+ margin-top: 20px;
+ }
+ .landing-page .navbar-wrapper .container {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+ .landing-page .navbar-wrapper .navbar {
+ padding-right: 0;
+ padding-left: 0;
+ }
+ .landing-page .navbar-wrapper .navbar {
+ border-radius: 4px;
+ }
+ .landing-page .carousel-caption p {
+ margin-bottom: 20px;
+ font-size: 14px;
+ line-height: 1.4;
+ }
+ .landing-page .featurette-heading {
+ font-size: 50px;
+ }
+}
+@media (max-width: 992px) {
+ .landing-page .carousel-image {
+ display: none;
+ }
+}
+@media (max-width: 768px) {
+ .landing-page .carousel-caption,
+ .landing-page .carousel-caption.blank {
+ left: 5%;
+ top: 80px;
+ }
+ .landing-page .carousel-caption h1 {
+ font-size: 28px;
+ }
+ .landing-page .navbar.navbar-scroll .navbar-brand {
+ margin-top: 6px;
+ }
+ .landing-page .navbar-default {
+ background-color: #fff;
+ border-color: #fff;
+ padding: 15px 0;
+ }
+ .landing-page .navbar-default .navbar-nav > .active > a:focus {
+ background: transparent;
+ color: inherit;
+ }
+ .landing-page .navbar-default .nav li a {
+ color: #676a6c;
+ }
+ .landing-page .navbar-default .nav li a:hover {
+ color: #1ab394;
+ }
+ .landing-page .navbar-wrapper .navbar {
+ padding-top: 0;
+ padding-bottom: 5px;
+ border-bottom: 1px solid #e7eaec;
+ border-radius: 0;
+ }
+ .landing-page .nav > li > a {
+ padding: 25px 10px 15px 10px;
+ }
+ .landing-page .navbar-nav > li > a {
+ padding: 20px 10px;
+ }
+ .landing-page .navbar .navbar-brand {
+ margin-top: 6px;
+ border-radius: 5px;
+ font-size: 12px;
+ padding: 10px;
+ height: auto;
+ }
+ .landing-page .navbar-wrapper .navbar {
+ padding-left: 15px;
+ padding-right: 5px;
+ }
+ .landing-page .navbar-default .navbar-nav > .active > a,
+ .landing-page .navbar-default .navbar-nav > .active > a:hover {
+ color: inherit;
+ }
+ .landing-page .carousel-control {
+ display: none;
+ }
+}
+@media (min-width: 992px) {
+ .landing-page .featurette-heading {
+ margin-top: 120px;
+ }
+}
+@media (max-width: 768px) {
+ .landing-page .navbar .navbar-header {
+ display: block;
+ float: none;
+ }
+ .landing-page .navbar .navbar-header .navbar-toggle {
+ background-color: #ffffff;
+ padding: 9px 10px;
+ border: none;
+ }
+}
+body.rtls {
+ /* Theme config */
+}
+body.rtls #page-wrapper {
+ margin: 0 220px 0 0;
+}
+body.rtls .nav-second-level li a {
+ padding: 7px 35px 7px 10px;
+}
+body.rtls .ibox-title h5 {
+ float: right;
+}
+body.rtls .pull-right {
+ float: left !important;
+}
+body.rtls .pull-left {
+ float: right !important;
+}
+body.rtls .ibox-tools {
+ float: left;
+}
+body.rtls .stat-percent {
+ float: left;
+}
+body.rtls .navbar-right {
+ float: left !important;
+}
+body.rtls .navbar-top-links li:last-child {
+ margin-left: 40px;
+ margin-right: 0;
+}
+body.rtls .minimalize-styl-2 {
+ float: right;
+ margin: 14px 20px 5px 5px;
+}
+body.rtls .feed-element > .pull-left {
+ margin-left: 10px;
+ margin-right: 0;
+}
+body.rtls .timeline-item .date {
+ text-align: left;
+}
+body.rtls .timeline-item .date i {
+ left: 0;
+ right: auto;
+}
+body.rtls .timeline-item .content {
+ border-right: 1px solid #e7eaec;
+ border-left: none;
+}
+body.rtls .theme-config {
+ left: 0;
+ right: auto;
+}
+body.rtls .spin-icon {
+ border-radius: 0 20px 20px 0;
+}
+body.rtls .toast-close-button {
+ float: left;
+}
+body.rtls #toast-container > .toast:before {
+ margin: auto -1.5em auto 0.5em;
+}
+body.rtls #toast-container > div {
+ padding: 15px 50px 15px 15px;
+}
+body.rtls .center-orientation .vertical-timeline-icon i {
+ margin-left: 0;
+ margin-right: -12px;
+}
+body.rtls .vertical-timeline-icon i {
+ right: 50%;
+ left: auto;
+ margin-left: auto;
+ margin-right: -12px;
+}
+body.rtls .file-box {
+ float: right;
+}
+body.rtls ul.notes li {
+ float: right;
+}
+body.rtls .chat-users,
+body.rtls .chat-statistic {
+ margin-right: -30px;
+ margin-left: auto;
+}
+body.rtls .dropdown-menu > li > a {
+ text-align: right;
+}
+body.rtls .b-r {
+ border-left: 1px solid #e7eaec;
+ border-right: none;
+}
+body.rtls .dd-list .dd-list {
+ padding-right: 30px;
+ padding-left: 0;
+}
+body.rtls .dd-item > button {
+ float: right;
+}
+body.rtls .theme-config-box {
+ margin-left: -220px;
+ margin-right: 0;
+}
+body.rtls .theme-config-box.show {
+ margin-left: 0;
+ margin-right: 0;
+}
+body.rtls .spin-icon {
+ right: 0;
+ left: auto;
+}
+body.rtls .skin-settings {
+ margin-right: 40px;
+ margin-left: 0;
+}
+body.rtls .skin-settings {
+ direction: ltr;
+}
+body.rtls .footer.fixed {
+ margin-right: 220px;
+ margin-left: 0;
+}
+@media (max-width: 992px) {
+ body.rtls .chat-users,
+ body.rtls .chat-statistic {
+ margin-right: 0;
+ }
+}
+body.rtls.mini-navbar .footer.fixed,
+body.body-small.mini-navbar .footer.fixed {
+ margin: 0 70px 0 0;
+}
+body.rtls.mini-navbar.fixed-sidebar .footer.fixed,
+body.body-small.mini-navbar .footer.fixed {
+ margin: 0 0 0 0;
+}
+body.rtls.top-navigation .navbar-toggle {
+ float: right;
+ margin-left: 15px;
+ margin-right: 15px;
+}
+.body-small.rtls.top-navigation .navbar-header {
+ float: none;
+}
+body.rtls.top-navigation #page-wrapper {
+ margin: 0;
+}
+body.rtls.mini-navbar #page-wrapper {
+ margin: 0 70px 0 0;
+}
+body.rtls.mini-navbar.fixed-sidebar #page-wrapper {
+ margin: 0 0 0 0;
+}
+body.rtls.body-small.fixed-sidebar.mini-navbar #page-wrapper {
+ margin: 0 220px 0 0;
+}
+body.rtls.body-small.fixed-sidebar.mini-navbar .navbar-static-side {
+ width: 220px;
+}
+.body-small.rtls .navbar-fixed-top {
+ margin-right: 0;
+}
+.body-small.rtls .navbar-header {
+ float: right;
+}
+body.rtls .navbar-top-links li:last-child {
+ margin-left: 20px;
+}
+body.rtls .top-navigation #page-wrapper,
+body.rtls.mini-navbar .top-navigation #page-wrapper,
+body.rtls.mini-navbar.top-navigation #page-wrapper {
+ margin: 0;
+}
+body.rtls .top-navigation .footer.fixed,
+body.rtls.top-navigation .footer.fixed {
+ margin: 0;
+}
+@media (max-width: 768px) {
+ body.rtls .navbar-top-links li:last-child {
+ margin-left: 20px;
+ }
+ .body-small.rtls #page-wrapper {
+ position: inherit;
+ margin: 0 0 0 0;
+ min-height: 1000px;
+ }
+ .body-small.rtls .navbar-static-side {
+ display: none;
+ z-index: 2001;
+ position: absolute;
+ width: 70px;
+ }
+ .body-small.rtls.mini-navbar .navbar-static-side {
+ display: block;
+ }
+ .rtls.fixed-sidebar.body-small .navbar-static-side {
+ display: none;
+ z-index: 2001;
+ position: fixed;
+ width: 220px;
+ }
+ .rtls.fixed-sidebar.body-small.mini-navbar .navbar-static-side {
+ display: block;
+ }
+}
+.rtls .ltr-support {
+ direction: ltr;
+}
+.rtls.mini-navbar .nav-second-level,
+.rtls.mini-navbar li.active .nav-second-level {
+ left: auto;
+ right: 70px;
+}
+.rtls #right-sidebar {
+ left: -260px;
+ right: auto;
+}
+.rtls #right-sidebar.sidebar-open {
+ left: 0;
+}
+/*
+ *
+ * This is style for skin config
+ * Use only in demo theme
+ *
+*/
+.theme-config {
+ position: absolute;
+ top: 90px;
+ right: 0;
+ overflow: hidden;
+}
+.theme-config-box {
+ margin-right: -220px;
+ position: relative;
+ z-index: 2000;
+ transition-duration: 0.8s;
+}
+.theme-config-box.show {
+ margin-right: 0;
+}
+.spin-icon {
+ background: #1ab394;
+ position: absolute;
+ padding: 7px 10px 7px 13px;
+ border-radius: 20px 0 0 20px;
+ font-size: 16px;
+ top: 0;
+ left: 0;
+ width: 40px;
+ color: #fff;
+ cursor: pointer;
+}
+.skin-settings {
+ width: 220px;
+ margin-left: 40px;
+ background: #f3f3f4;
+}
+.skin-settings .title {
+ background: #efefef;
+ text-align: center;
+ text-transform: uppercase;
+ font-weight: 600;
+ display: block;
+ padding: 10px 15px;
+ font-size: 12px;
+}
+.setings-item {
+ padding: 10px 30px;
+}
+.setings-item.skin {
+ text-align: center;
+}
+.setings-item .switch {
+ float: right;
+}
+.skin-name a {
+ text-transform: uppercase;
+}
+.setings-item a {
+ color: #fff;
+}
+.default-skin,
+.blue-skin,
+.ultra-skin,
+.yellow-skin {
+ text-align: center;
+}
+.default-skin {
+ font-weight: 600;
+ background: #283A49;
+}
+.default-skin:hover {
+ background: #1e2e3d;
+}
+.blue-skin:hover {
+ background: #0d8ddb;
+}
+.yellow-skin:hover {
+ background: #ce8735;
+}
+/*
+ *
+ * SKIN 1 - INSPINIA - Responsive Admin Theme
+ * NAME - Blue light
+ *
+*/
+.skin-1 .minimalize-styl-2 {
+ margin: 14px 5px 5px 30px;
+}
+.skin-1 .navbar-top-links li:last-child {
+ margin-right: 30px;
+}
+.skin-1.fixed-nav .minimalize-styl-2 {
+ margin: 14px 5px 5px 15px;
+}
+.skin-1 .spin-icon {
+ background: #0e9aef !important;
+}
+.skin-1.mini-navbar .nav-second-level {
+ background: #3e495f;
+}
+.skin-1 .breadcrumb {
+ background: transparent;
+}
+.skin-1 .page-heading {
+ border: none;
+}
+.skin-1 .nav > li.active {
+ background: #3a4459;
+}
+.skin-1 .nav > li > a {
+ color: #9ea6b9;
+}
+.skin-1 ul.nav-second-level {
+ background-color: inherit;
+}
+.skin-1 .nav > li.active > a {
+ color: #fff;
+}
+.skin-1 .navbar-minimalize {
+ background: #0e9aef;
+ border-color: #0e9aef;
+}
+body.skin-1 {
+ background: #3e495f;
+}
+.skin-1 .navbar-static-top {
+ background: #ffffff;
+}
+.skin-1 .dashboard-header {
+ background: transparent;
+ border-bottom: none !important;
+ border-top: none;
+ padding: 20px 30px 10px 30px;
+}
+.fixed-nav.skin-1 .navbar-fixed-top {
+ background: #fff;
+}
+.skin-1 .wrapper-content {
+ padding: 30px 15px;
+}
+.skin-1 #page-wrapper {
+ background: #f4f6fa;
+}
+.skin-1 .ibox-title,
+.skin-1 .ibox-content {
+ border-width: 1px;
+}
+.skin-1 .ibox-content:last-child {
+ border-style: solid solid solid solid;
+}
+.skin-1 .nav > li.active {
+ border: none;
+}
+.skin-1 .nav-header {
+ padding: 35px 25px 25px 25px;
+}
+.skin-1 .nav-header a.dropdown-toggle {
+ color: #fff;
+ margin-top: 10px;
+}
+.skin-1 .nav-header a.dropdown-toggle .text-muted {
+ color: #fff;
+ opacity: 0.8;
+}
+.skin-1 .profile-element {
+ text-align: center;
+}
+.skin-1 .img-circle {
+ border-radius: 5px;
+}
+.skin-1 .navbar-default .nav > li > a:hover,
+.skin-1 .navbar-default .nav > li > a:focus {
+ background: #3a4459;
+ color: #fff;
+}
+.skin-1 .nav.nav-tabs > li.active > a {
+ color: #555;
+}
+.skin-1 .nav.nav-tabs > li.active {
+ background: transparent;
+}
+/*
+ *
+ * SKIN 2 - INSPINIA - Responsive Admin Theme
+ * NAME - Inspinia Ultra
+ *
+*/
+body.skin-2 {
+ color: #565758 !important;
+}
+.skin-2 .minimalize-styl-2 {
+ margin: 14px 5px 5px 25px;
+}
+.skin-2 .navbar-top-links li:last-child {
+ margin-right: 25px;
+}
+.skin-2 .spin-icon {
+ background: #23c6c8 !important;
+}
+.skin-2.mini-navbar .nav-second-level {
+ background: #ededed;
+}
+.skin-2 .breadcrumb {
+ background: transparent;
+}
+.skin-2.fixed-nav .minimalize-styl-2 {
+ margin: 14px 5px 5px 15px;
+}
+.skin-2 .page-heading {
+ border: none;
+ background: rgba(255, 255, 255, 0.7);
+}
+.skin-2 ul.nav-second-level {
+ background-color: inherit;
+}
+.skin-2 .nav > li.active {
+ background: #e0e0e0;
+}
+.skin-2 .logo-element {
+ padding: 17px 0;
+}
+.skin-2 .nav > li > a,
+.skin-2 .welcome-message {
+ color: #edf6ff;
+}
+.skin-2 #top-search::-moz-placeholder {
+ color: #edf6ff;
+ opacity: 0.5;
+}
+.skin-2 #side-menu > li > a,
+.skin-2 .nav.nav-second-level > li > a {
+ color: #586b7d;
+}
+.skin-2 .nav > li.active > a {
+ color: #213a53;
+}
+.skin-2.mini-navbar .nav-header {
+ background: #213a53;
+}
+.skin-2 .navbar-minimalize {
+ background: #23c6c8;
+ border-color: #23c6c8;
+}
+.skin-2 .border-bottom {
+ border-bottom: none !important;
+}
+.skin-2 #top-search {
+ color: #fff;
+}
+body.skin-2 #wrapper {
+ background-color: #ededed;
+}
+.skin-2 .navbar-static-top {
+ background: #213a53;
+}
+.fixed-nav.skin-2 .navbar-fixed-top {
+ background: #213a53;
+ border-bottom: none !important;
+}
+.skin-2 .nav-header {
+ padding: 30px 25px 30px 25px;
+}
+.skin-2 .dashboard-header {
+ background: rgba(255, 255, 255, 0.4);
+ border-bottom: none !important;
+ border-top: none;
+ padding: 20px 30px 20px 30px;
+}
+.skin-2 .wrapper-content {
+ padding: 30px 15px;
+}
+.skin-2 .dashoard-1 .wrapper-content {
+ padding: 0 30px 25px 30px;
+}
+.skin-2 .ibox-title {
+ background: rgba(255, 255, 255, 0.7);
+ border: none;
+ margin-bottom: 1px;
+}
+.skin-2 .ibox-content {
+ background: rgba(255, 255, 255, 0.4);
+ border: none !important;
+}
+.skin-2 #page-wrapper {
+ background: #f6f6f6;
+ background: -webkit-radial-gradient(center, ellipse cover, #f6f6f6 20%, #d5d5d5 100%);
+ background: -o-radial-gradient(center, ellipse cover, #f6f6f6 20%, #d5d5d5 100%);
+ background: -ms-radial-gradient(center, ellipse cover, #f6f6f6 20%, #d5d5d5 100%);
+ background: radial-gradient(ellipse at center, #f6f6f6 20%, #d5d5d5 100%);
+ -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#f6f6f6, endColorstr=#d5d5d5)";
+}
+.skin-2 .ibox-title,
+.skin-2 .ibox-content {
+ border-width: 1px;
+}
+.skin-2 .ibox-content:last-child {
+ border-style: solid solid solid solid;
+}
+.skin-2 .nav > li.active {
+ border: none;
+}
+.skin-2 .nav-header a.dropdown-toggle {
+ color: #edf6ff;
+ margin-top: 10px;
+}
+.skin-2 .nav-header a.dropdown-toggle .text-muted {
+ color: #edf6ff;
+ opacity: 0.8;
+}
+.skin-2 .img-circle {
+ border-radius: 10px;
+}
+.skin-2 .nav.navbar-top-links > li > a:hover,
+.skin-2 .nav.navbar-top-links > li > a:focus {
+ background: #1a2d41;
+}
+.skin-2 .navbar-default .nav > li > a:hover,
+.skin-2 .navbar-default .nav > li > a:focus {
+ background: #e0e0e0;
+ color: #213a53;
+}
+.skin-2 .nav.nav-tabs > li.active > a {
+ color: #555;
+}
+.skin-2 .nav.nav-tabs > li.active {
+ background: transparent;
+}
+/*
+ *
+ * SKIN 3 - INSPINIA - Responsive Admin Theme
+ * NAME - Yellow/purple
+ *
+*/
+.skin-3 .minimalize-styl-2 {
+ margin: 14px 5px 5px 30px;
+}
+.skin-3 .navbar-top-links li:last-child {
+ margin-right: 30px;
+}
+.skin-3.fixed-nav .minimalize-styl-2 {
+ margin: 14px 5px 5px 15px;
+}
+.skin-3 .spin-icon {
+ background: #ecba52 !important;
+}
+body.boxed-layout.skin-3 #wrapper {
+ background: #3e2c42;
+}
+.skin-3.mini-navbar .nav-second-level {
+ background: #3e2c42;
+}
+.skin-3 .breadcrumb {
+ background: transparent;
+}
+.skin-3 .page-heading {
+ border: none;
+}
+.skin-3 ul.nav-second-level {
+ background-color: inherit;
+}
+.skin-3 .nav > li.active {
+ background: #38283c;
+}
+.fixed-nav.skin-3 .navbar-fixed-top {
+ background: #fff;
+}
+.skin-3 .nav > li > a {
+ color: #948b96;
+}
+.skin-3 .nav > li.active > a {
+ color: #fff;
+}
+.skin-3 .navbar-minimalize {
+ background: #ecba52;
+ border-color: #ecba52;
+}
+body.skin-3 {
+ background: #3e2c42;
+}
+.skin-3 .navbar-static-top {
+ background: #ffffff;
+}
+.skin-3 .dashboard-header {
+ background: transparent;
+ border-bottom: none !important;
+ border-top: none;
+ padding: 20px 30px 10px 30px;
+}
+.skin-3 .wrapper-content {
+ padding: 30px 15px;
+}
+.skin-3 #page-wrapper {
+ background: #f4f6fa;
+}
+.skin-3 .ibox-title,
+.skin-3 .ibox-content {
+ border-width: 1px;
+}
+.skin-3 .ibox-content:last-child {
+ border-style: solid solid solid solid;
+}
+.skin-3 .nav > li.active {
+ border: none;
+}
+.skin-3 .nav-header {
+ padding: 35px 25px 25px 25px;
+}
+.skin-3 .nav-header a.dropdown-toggle {
+ color: #fff;
+ margin-top: 10px;
+}
+.skin-3 .nav-header a.dropdown-toggle .text-muted {
+ color: #fff;
+ opacity: 0.8;
+}
+.skin-3 .profile-element {
+ text-align: center;
+}
+.skin-3 .img-circle {
+ border-radius: 5px;
+}
+.skin-3 .navbar-default .nav > li > a:hover,
+.skin-3 .navbar-default .nav > li > a:focus {
+ background: #38283c;
+ color: #fff;
+}
+.skin-3 .nav.nav-tabs > li.active > a {
+ color: #555;
+}
+.skin-3 .nav.nav-tabs > li.active {
+ background: transparent;
+}
+body.md-skin {
+ font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif;
+ background-color: #ffffff;
+}
+.md-skin .label,
+.md-skin .badge {
+ font-family: 'Roboto';
+}
+.md-skin ul.nav-second-level {
+ background-color: inherit;
+}
+.md-skin .font-bold {
+ font-weight: 500;
+}
+.md-skin .wrapper-content {
+ padding: 30px 20px 40px;
+}
+@media (max-width: 768px) {
+ .md-skin .wrapper-content {
+ padding: 30px 0 40px;
+ }
+}
+.md-skin .page-heading {
+ border-bottom: none !important;
+ border-top: 0;
+ padding: 0 10px 20px 10px;
+ box-shadow: 0 1px 1px -1px rgba(0, 0, 0, 0.34), 0 0 6px 0 rgba(0, 0, 0, 0.14);
+}
+.md-skin .full-height-layout .page-heading {
+ border-bottom: 1px solid #e7eaec !important;
+}
+.md-skin .ibox {
+ clear: both;
+ margin-bottom: 25px;
+ margin-top: 0;
+ padding: 0;
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
+}
+.md-skin .ibox.border-bottom {
+ border-bottom: none !important;
+}
+.md-skin .ibox-title,
+.md-skin .ibox-content {
+ border-style: none;
+}
+.md-skin .ibox-title h5 {
+ font-size: 16px;
+ font-weight: 400;
+}
+.md-skin a.close-canvas-menu {
+ color: #ffffff;
+}
+.md-skin .welcome-message {
+ color: #ffffff;
+ font-weight: 300;
+}
+.md-skin #top-search::-moz-placeholder {
+ color: #ffffff;
+}
+.md-skin #top-search::-webkit-input-placeholder {
+ color: #ffffff;
+}
+.md-skin #nestable-output,
+.md-skin #nestable2-output {
+ font-family: 'Roboto', lucida grande, lucida sans unicode, helvetica, arial, sans-serif;
+}
+.md-skin .landing-page {
+ font-family: 'Roboto', helvetica, arial, sans-serif;
+}
+.md-skin .landing-page.navbar-default.navbar-scroll {
+ background-color: #fff !important;
+}
+.md-skin .landing-page.navbar-default {
+ background-color: transparent !important;
+ box-shadow: none;
+}
+.md-skin .landing-page.navbar-default .nav li a {
+ font-family: 'Roboto', helvetica, arial, sans-serif;
+}
+.md-skin .nav > li > a {
+ color: #676a6c;
+ padding: 14px 20px 14px 25px;
+}
+.md-skin .nav.navbar-right > li > a {
+ color: #ffffff;
+}
+.md-skin .nav > li.active > a {
+ color: #5b5d5f;
+ font-weight: 700;
+}
+.md-skin .navbar-default .nav > li > a:hover,
+.md-skin .navbar-default .nav > li > a:focus {
+ font-weight: 700;
+ color: #5b5d5f;
+}
+.md-skin .nav .open > a,
+.md-skin .nav .open > a:hover,
+.md-skin .nav .open > a:focus {
+ background: #1ab394;
+}
+.md-skin .navbar-top-links li {
+ display: inline-table;
+}
+.md-skin .navbar-top-links .dropdown-menu li {
+ display: block;
+}
+.md-skin .pace-done .nav-header {
+ transition: all 0.4s;
+}
+.md-skin .nav > li.active {
+ background: #f8f8f9;
+}
+.md-skin .nav-second-level li a {
+ padding: 7px 10px 7px 52px;
+}
+.md-skin .nav-third-level li a {
+ padding-left: 62px;
+}
+.md-skin .navbar-top-links li a {
+ padding: 20px 10px;
+ min-height: 50px;
+}
+.md-skin .nav > li > a {
+ font-weight: 400;
+}
+.md-skin .navbar-static-side .nav > li > a:focus,
+.md-skin .navbar-static-side .nav > li > a:hover {
+ background-color: inherit;
+}
+.md-skin .navbar-top-links .dropdown-menu li a {
+ padding: 3px 20px;
+ min-height: inherit;
+}
+.md-skin .nav-header .navbar-fixed-top a {
+ color: #ffffff;
+}
+.md-skin .nav-header .text-muted {
+ color: #ffffff;
+}
+.md-skin .navbar-form-custom .form-control {
+ font-weight: 300;
+}
+.md-skin .mini-navbar .nav-second-level {
+ background-color: inherit;
+}
+.md-skin .mini-navbar li.active .nav-second-level {
+ left: 65px;
+}
+.md-skin .canvas-menu.mini-navbar .nav-second-level {
+ background: inherit;
+}
+.md-skin .pace-done .navbar-static-side,
+.md-skin .pace-done .nav-header,
+.md-skin .pace-done li.active,
+.md-skin .pace-done #page-wrapper,
+.md-skin .pace-done .footer {
+ -webkit-transition: all 0.4s;
+ -moz-transition: all 0.4s;
+ -o-transition: all 0.4s;
+ transition: all 0.4s;
+}
+.md-skin .navbar-fixed-top {
+ background: #fff;
+ transition-duration: 0.4s;
+ z-index: 2030;
+ border-bottom: none !important;
+}
+.md-skin .navbar-fixed-top,
+.md-skin .navbar-static-top {
+ background-color: #1ab394 !important;
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
+}
+.md-skin .navbar-static-side {
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
+}
+.md-skin #right-sidebar {
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
+ border: none;
+ z-index: 900;
+}
+.md-skin .white-bg .navbar-fixed-top,
+.md-skin .white-bg .navbar-static-top {
+ background: #fff !important;
+}
+.md-skin .contact-box {
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
+ border: none;
+}
+.md-skin .dashboard-header {
+ border-bottom: none !important;
+ border-top: 0;
+ padding: 20px 20px 20px 20px;
+ margin: 30px 20px 0 20px;
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
+}
+@media (max-width: 768px) {
+ .md-skin .dashboard-header {
+ margin: 20px 0 0 0;
+ }
+}
+.md-skin ul.notes li div {
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
+}
+.md-skin .file {
+ border: none;
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
+}
+.md-skin .mail-box {
+ background-color: #ffffff;
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
+ padding: 0;
+ margin-bottom: 20px;
+ border: none;
+}
+.md-skin .mail-box-header {
+ border: none;
+ background-color: #ffffff;
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
+ padding: 30px 20px 20px 20px;
+}
+.md-skin .mailbox-content {
+ border: none;
+ padding: 20px;
+ background: #ffffff;
+}
+.md-skin .social-feed-box {
+ border: none;
+ background: #fff;
+ margin-bottom: 15px;
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
+}
+.md-skin.landing-page .navbar-default {
+ background-color: transparent !important;
+ border-color: transparent;
+ transition: all 0.3s ease-in-out 0s;
+ box-shadow: none;
+}
+.md-skin.landing-page .navbar-default.navbar-scroll,
+.md-skin.landing-page.body-small .navbar-default {
+ background-color: #ffffff !important;
+}
+.md-skin.landing-page .nav > li.active {
+ background: inherit;
+}
+.md-skin.landing-page .navbar-scroll .navbar-nav > li > a {
+ padding: 20px 10px;
+}
+.md-skin.landing-page .navbar-default .nav li a {
+ font-family: 'Roboto', helvetica, arial, sans-serif;
+}
+.md-skin.landing-page .nav > li > a {
+ padding: 25px 10px 15px 10px;
+}
+.md-skin.landing-page .navbar-default .navbar-nav > li > a:hover,
+.md-skin.landing-page .navbar-default .navbar-nav > li > a:focus {
+ background: inherit;
+ color: #1ab394;
+}
+.md-skin.landing-page.body-small .nav.navbar-right > li > a {
+ color: #676a6c;
+}
+.md-skin .landing_link a,
+.md-skin .special_link a {
+ color: #ffffff !important;
+}
+.md-skin.canvas-menu.mini-navbar .nav-second-level {
+ background: #f8f8f9;
+}
+.md-skin.mini-navbar .nav-second-level {
+ background-color: #ffffff;
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
+}
+.md-skin.mini-navbar .nav-second-level li a {
+ padding-left: 0;
+}
+.md-skin.mini-navbar.fixed-sidebar .nav-second-level li a {
+ padding-left: 52px;
+}
+.md-skin.top-navigation .nav.navbar-right > li > a {
+ padding: 15px 20px;
+ color: #676a6c;
+}
+.md-skin.top-navigation .nav > li a:hover,
+.md-skin .top-navigation .nav > li a:focus,
+.md-skin.top-navigation .nav .open > a,
+.md-skin.top-navigation .nav .open > a:hover,
+.md-skin.top-navigation .nav .open > a:focus {
+ color: #1ab394;
+ background: #ffffff;
+}
+.md-skin.top-navigation .nav > li.active a {
+ color: #1ab394;
+ background: #ffffff;
+}
+.md-skin.fixed-nav #side-menu {
+ background-color: #fff;
+}
+.md-skin.fixed-nav #wrapper.top-navigation #page-wrapper {
+ margin-top: 0;
+}
+.md-skin.fixed-sidebar.mini-navbar .navbar-static-side {
+ width: 0;
+}
+.md-skin.fixed-sidebar.mini-navbar #page-wrapper {
+ margin: 0 0 0 0;
+}
+.md-skin.body-small.fixed-sidebar.mini-navbar #page-wrapper {
+ margin: 0 0 0 0;
+}
+.md-skin.body-small.fixed-sidebar.mini-navbar .navbar-static-side {
+ width: 220px;
+ background-color: #ffffff;
+}
+.md-skin.boxed-layout #wrapper {
+ background-color: #ffffff;
+}
+.md-skin.canvas-menu nav.navbar-static-side {
+ z-index: 2001;
+ background: #ffffff;
+ height: 100%;
+ position: fixed;
+ display: none;
+}
+@media (min-width: 768px) {
+ #page-wrapper {
+ position: inherit;
+ margin: 0 0 0 220px;
+ min-height: 100vh;
+ }
+ .navbar-static-side {
+ z-index: 2001;
+ position: absolute;
+ width: 220px;
+ }
+ .navbar-top-links .dropdown-messages,
+ .navbar-top-links .dropdown-tasks,
+ .navbar-top-links .dropdown-alerts {
+ margin-left: auto;
+ }
+}
+@media (max-width: 768px) {
+ #page-wrapper {
+ position: inherit;
+ margin: 0 0 0 0;
+ min-height: 100vh;
+ }
+ .body-small .navbar-static-side {
+ display: none;
+ z-index: 2001;
+ position: absolute;
+ width: 70px;
+ }
+ .body-small.mini-navbar .navbar-static-side {
+ display: block;
+ }
+ .lock-word {
+ display: none;
+ }
+ .navbar-form-custom {
+ display: none;
+ }
+ .navbar-header {
+ display: inline;
+ float: left;
+ }
+ .sidebar-panel {
+ z-index: 2;
+ position: relative;
+ width: auto;
+ min-height: 100% !important;
+ }
+ .sidebar-content .wrapper {
+ padding-right: 0;
+ z-index: 1;
+ }
+ .fixed-sidebar.body-small .navbar-static-side {
+ display: none;
+ z-index: 2001;
+ position: fixed;
+ width: 220px;
+ }
+ .fixed-sidebar.body-small.mini-navbar .navbar-static-side {
+ display: block;
+ }
+ .ibox-tools {
+ float: none;
+ text-align: right;
+ display: block;
+ }
+ .navbar-static-side {
+ display: none;
+ }
+ body:not(.mini-navbar) {
+ -webkit-transition: background-color 500ms linear;
+ -moz-transition: background-color 500ms linear;
+ -o-transition: background-color 500ms linear;
+ -ms-transition: background-color 500ms linear;
+ transition: background-color 500ms linear;
+ background-color: #f3f3f4;
+ }
+}
+@media (max-width: 350px) {
+ .timeline-item .date {
+ text-align: left;
+ width: 110px;
+ position: relative;
+ padding-top: 30px;
+ }
+ .timeline-item .date i {
+ position: absolute;
+ top: 0;
+ left: 15px;
+ padding: 5px;
+ width: 30px;
+ text-align: center;
+ border: 1px solid #e7eaec;
+ background: #f8f8f8;
+ }
+ .timeline-item .content {
+ border-left: none;
+ border-top: 1px solid #e7eaec;
+ padding-top: 10px;
+ min-height: 100px;
+ }
+ .nav.navbar-top-links li.dropdown {
+ display: none;
+ }
+ .ibox-tools {
+ float: none;
+ text-align: left;
+ display: inline-block;
+ }
+}
+/* Only demo */
+@media (max-width: 1000px) {
+ .welcome-message {
+ display: none;
+ }
+}
+@media print {
+ nav.navbar-static-side {
+ display: none;
+ }
+ body {
+ overflow: visible !important;
+ }
+ #page-wrapper {
+ margin: 0;
+ }
+}
diff --git a/test-scheduler/ui/src/assets/css/toastr.min.css b/test-scheduler/ui/src/assets/css/toastr.min.css
new file mode 100644
index 00000000..738e63d4
--- /dev/null
+++ b/test-scheduler/ui/src/assets/css/toastr.min.css
@@ -0,0 +1,222 @@
+.toast-title {
+ font-weight: 700
+}
+
+.toast-message {
+ -ms-word-wrap: break-word;
+ word-wrap: break-word
+}
+
+.toast-message a, .toast-message label {
+ color: #fff
+}
+
+.toast-message a:hover {
+ color: #ccc;
+ text-decoration: none
+}
+
+.toast-close-button {
+ position: relative;
+ right: -.3em;
+ top: -.3em;
+ float: right;
+ font-size: 20px;
+ font-weight: 700;
+ color: #fff;
+ -webkit-text-shadow: 0 1px 0 #fff;
+ text-shadow: 0 1px 0 #fff;
+ opacity: .8;
+ -ms-filter: alpha(Opacity=80);
+ filter: alpha(opacity=80)
+}
+
+.toast-close-button:focus, .toast-close-button:hover {
+ color: #000;
+ text-decoration: none;
+ cursor: pointer;
+ opacity: .4;
+ -ms-filter: alpha(Opacity=40);
+ filter: alpha(opacity=40)
+}
+
+button.toast-close-button {
+ padding: 0;
+ cursor: pointer;
+ background: 0 0;
+ border: 0;
+ -webkit-appearance: none
+}
+
+.toast-top-center {
+ top: 0;
+ right: 0;
+ width: 100%
+}
+
+.toast-bottom-center {
+ bottom: 0;
+ right: 0;
+ width: 100%
+}
+
+.toast-top-full-width {
+ top: 0;
+ right: 0;
+ width: 100%
+}
+
+.toast-bottom-full-width {
+ bottom: 0;
+ right: 0;
+ width: 100%
+}
+
+.toast-top-left {
+ top: 12px;
+ left: 12px
+}
+
+.toast-top-right {
+ top: 12px;
+ right: 12px
+}
+
+.toast-bottom-right {
+ right: 12px;
+ bottom: 12px
+}
+
+.toast-bottom-left {
+ bottom: 12px;
+ left: 12px
+}
+
+#toast-container {
+ position: fixed;
+ z-index: 999999
+}
+
+#toast-container * {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box
+}
+
+#toast-container > div {
+ position: relative;
+ overflow: hidden;
+ margin: 0 0 6px;
+ padding: 15px 15px 15px 50px;
+ width: 300px;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+ background-position: 15px center;
+ background-repeat: no-repeat;
+ -moz-box-shadow: 0 0 12px #999;
+ -webkit-box-shadow: 0 0 12px #999;
+ box-shadow: 0 0 12px #999;
+ color: #fff;
+ opacity: .8;
+ -ms-filter: alpha(Opacity=80);
+ filter: alpha(opacity=80)
+}
+
+#toast-container > :hover {
+ -moz-box-shadow: 0 0 12px #000;
+ -webkit-box-shadow: 0 0 12px #000;
+ box-shadow: 0 0 12px #000;
+ opacity: 1;
+ -ms-filter: alpha(Opacity=100);
+ filter: alpha(opacity=100);
+ cursor: pointer
+}
+
+#toast-container > .toast-info {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=) !important
+}
+
+#toast-container > .toast-error {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=) !important
+}
+
+#toast-container > .toast-success {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==) !important
+}
+
+#toast-container > .toast-warning {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=) !important
+}
+
+#toast-container.toast-bottom-center > div, #toast-container.toast-top-center > div {
+ width: 300px;
+ margin: auto
+}
+
+#toast-container.toast-bottom-full-width > div, #toast-container.toast-top-full-width > div {
+ width: 96%;
+ margin: auto
+}
+
+.toast {
+ background-color: #030303
+}
+
+.toast-success {
+ background-color: #51a351
+}
+
+.toast-error {
+ background-color: #bd362f
+}
+
+.toast-info {
+ background-color: #2f96b4
+}
+
+.toast-warning {
+ background-color: #f89406
+}
+
+.toast-progress {
+ position: absolute;
+ left: 0;
+ bottom: 0;
+ height: 4px;
+ background-color: #000;
+ opacity: .4;
+ -ms-filter: alpha(Opacity=40);
+ filter: alpha(opacity=40)
+}
+
+@media all and (max-width: 240px) {
+ #toast-container > div {
+ padding: 8px 8px 8px 50px;
+ width: 11em
+ }
+
+ #toast-container .toast-close-button {
+ right: -.2em;
+ top: -.2em
+ }
+}
+
+@media all and (min-width: 241px) and (max-width: 480px) {
+ #toast-container > div {
+ padding: 8px 8px 8px 50px;
+ width: 18em
+ }
+
+ #toast-container .toast-close-button {
+ right: -.2em;
+ top: -.2em
+ }
+}
+
+@media all and (min-width: 481px) and (max-width: 768px) {
+ #toast-container > div {
+ padding: 15px 15px 15px 50px;
+ width: 25em
+ }
+}
diff --git a/test-scheduler/ui/src/assets/css/wf-graph.css b/test-scheduler/ui/src/assets/css/wf-graph.css
new file mode 100644
index 00000000..62aaeea9
--- /dev/null
+++ b/test-scheduler/ui/src/assets/css/wf-graph.css
@@ -0,0 +1,13 @@
+g.node circle{
+ fill: #ffffff;
+ stroke: #333;
+}
+g.node rect{
+ fill: #ffffff;
+ stroke: #333;
+}
+g.edgePath .path {
+ stroke: #000000!important;
+ fill: transparent!important;
+ stroke-dasharray: 0, 0!important;
+}
diff --git a/test-scheduler/ui/src/assets/js/inspinia.js b/test-scheduler/ui/src/assets/js/inspinia.js
new file mode 100644
index 00000000..6a25c9ae
--- /dev/null
+++ b/test-scheduler/ui/src/assets/js/inspinia.js
@@ -0,0 +1,298 @@
+/*
+ *
+ * INSPINIA - Responsive Admin Theme
+ * version 2.7.1
+ *
+ */
+
+$(document).ready(function () {
+
+
+ // Add body-small class if window less than 768px
+ if ($(this).width() < 769) {
+ $('body').addClass('body-small')
+ } else {
+ $('body').removeClass('body-small')
+ }
+
+ // MetisMenu
+ $('#side-menu').metisMenu();
+
+ // Collapse ibox function
+ $('.collapse-link').on('click', function () {
+ var ibox = $(this).closest('div.ibox');
+ var button = $(this).find('i');
+ var content = ibox.children('.ibox-content');
+ content.slideToggle(200);
+ button.toggleClass('fa-chevron-up').toggleClass('fa-chevron-down');
+ ibox.toggleClass('').toggleClass('border-bottom');
+ setTimeout(function () {
+ ibox.resize();
+ ibox.find('[id^=map-]').resize();
+ }, 50);
+ });
+
+ // Close ibox function
+ $('.close-link').on('click', function () {
+ var content = $(this).closest('div.ibox');
+ content.remove();
+ });
+
+ // Fullscreen ibox function
+ $('.fullscreen-link').on('click', function () {
+ var ibox = $(this).closest('div.ibox');
+ var button = $(this).find('i');
+ $('body').toggleClass('fullscreen-ibox-mode');
+ button.toggleClass('fa-expand').toggleClass('fa-compress');
+ ibox.toggleClass('fullscreen');
+ setTimeout(function () {
+ $(window).trigger('resize');
+ }, 100);
+ });
+
+ // Close menu in canvas mode
+ $('.close-canvas-menu').on('click', function () {
+ $("body").toggleClass("mini-navbar");
+ SmoothlyMenu();
+ });
+
+ // Run menu of canvas
+ $('body.canvas-menu .sidebar-collapse').slimScroll({
+ height: '100%',
+ railOpacity: 0.9
+ });
+
+ // Open close right sidebar
+ $('.right-sidebar-toggle').on('click', function () {
+ $('#right-sidebar').toggleClass('sidebar-open');
+ });
+
+ // Initialize slimscroll for right sidebar
+ $('.sidebar-container').slimScroll({
+ height: '100%',
+ railOpacity: 0.4,
+ wheelStep: 10
+ });
+
+ // Open close small chat
+ $('.open-small-chat').on('click', function () {
+ $(this).children().toggleClass('fa-comments').toggleClass('fa-remove');
+ $('.small-chat-box').toggleClass('active');
+ });
+
+ // Initialize slimscroll for small chat
+ $('.small-chat-box .content').slimScroll({
+ height: '234px',
+ railOpacity: 0.4
+ });
+
+ // Small todo handler
+ $('.check-link').on('click', function () {
+ var button = $(this).find('i');
+ var label = $(this).next('span');
+ button.toggleClass('fa-check-square').toggleClass('fa-square-o');
+ label.toggleClass('todo-completed');
+ return false;
+ });
+
+ // Append config box / Only for demo purpose
+ // Uncomment on server mode to enable XHR calls
+ //$.get("skin-config.html", function (data) {
+ // if (!$('body').hasClass('no-skin-config'))
+ // $('body').append(data);
+ //});
+
+ // Minimalize menu
+ $('.navbar-minimalize').on('click', function (event) {
+ event.preventDefault();
+ $("body").toggleClass("mini-navbar");
+ SmoothlyMenu();
+
+ });
+
+ // Tooltips demo
+ $('.tooltip-demo').tooltip({
+ selector: "[data-toggle=tooltip]",
+ container: "body"
+ });
+
+
+ // Full height of sidebar
+ function fix_height() {
+ var heightWithoutNavbar = $("body > #wrapper").height() - 61;
+ $(".sidebar-panel").css("min-height", heightWithoutNavbar + "px");
+
+ var navbarheight = $('nav.navbar-default').height();
+ var wrapperHeight = $('#page-wrapper').height();
+
+ if (navbarheight > wrapperHeight) {
+ $('#page-wrapper').css("min-height", navbarheight + "px");
+ }
+
+ if (navbarheight < wrapperHeight) {
+ $('#page-wrapper').css("min-height", $(window).height() + "px");
+ }
+
+ if ($('body').hasClass('fixed-nav')) {
+ if (navbarheight > wrapperHeight) {
+ $('#page-wrapper').css("min-height", navbarheight + "px");
+ } else {
+ $('#page-wrapper').css("min-height", $(window).height() - 60 + "px");
+ }
+ }
+
+ }
+
+ fix_height();
+
+ // Fixed Sidebar
+ $(window).bind("load", function () {
+ if ($("body").hasClass('fixed-sidebar')) {
+ $('.sidebar-collapse').slimScroll({
+ height: '100%',
+ railOpacity: 0.9
+ });
+ }
+ });
+
+ // Move right sidebar top after scroll
+ $(window).scroll(function () {
+ if ($(window).scrollTop() > 0 && !$('body').hasClass('fixed-nav')) {
+ $('#right-sidebar').addClass('sidebar-top');
+ } else {
+ $('#right-sidebar').removeClass('sidebar-top');
+ }
+ });
+
+ $(window).bind("load resize scroll", function () {
+ if (!$("body").hasClass('body-small')) {
+ fix_height();
+ }
+ });
+
+ $("[data-toggle=popover]")
+ .popover();
+
+ // Add slimscroll to element
+ $('.full-height-scroll').slimscroll({
+ height: '100%'
+ })
+});
+
+
+// Minimalize menu when screen is less than 768px
+$(window).bind("resize", function () {
+ if ($(this).width() < 769) {
+ $('body').addClass('body-small')
+ } else {
+ $('body').removeClass('body-small')
+ }
+});
+
+// Local Storage functions
+// Set proper body class and plugins based on user configuration
+$(document).ready(function () {
+ if (localStorageSupport()) {
+
+ var collapse = localStorage.getItem("collapse_menu");
+ var fixedsidebar = localStorage.getItem("fixedsidebar");
+ var fixednavbar = localStorage.getItem("fixednavbar");
+ var boxedlayout = localStorage.getItem("boxedlayout");
+ var fixedfooter = localStorage.getItem("fixedfooter");
+
+ var body = $('body');
+
+ if (fixedsidebar == 'on') {
+ body.addClass('fixed-sidebar');
+ $('.sidebar-collapse').slimScroll({
+ height: '100%',
+ railOpacity: 0.9
+ });
+ }
+
+ if (collapse == 'on') {
+ if (body.hasClass('fixed-sidebar')) {
+ if (!body.hasClass('body-small')) {
+ body.addClass('mini-navbar');
+ }
+ } else {
+ if (!body.hasClass('body-small')) {
+ body.addClass('mini-navbar');
+ }
+
+ }
+ }
+
+ if (fixednavbar == 'on') {
+ $(".navbar-static-top").removeClass('navbar-static-top').addClass('navbar-fixed-top');
+ body.addClass('fixed-nav');
+ }
+
+ if (boxedlayout == 'on') {
+ body.addClass('boxed-layout');
+ }
+
+ if (fixedfooter == 'on') {
+ $(".footer").addClass('fixed');
+ }
+ }
+});
+
+// check if browser support HTML5 local storage
+function localStorageSupport() {
+ return (('localStorage' in window) && window['localStorage'] !== null)
+}
+
+// For demo purpose - animation css script
+function animationHover(element, animation) {
+ element = $(element);
+ element.hover(
+ function () {
+ element.addClass('animated ' + animation);
+ },
+ function () {
+ //wait for animation to finish before removing classes
+ window.setTimeout(function () {
+ element.removeClass('animated ' + animation);
+ }, 2000);
+ });
+}
+
+function SmoothlyMenu() {
+ if (!$('body').hasClass('mini-navbar') || $('body').hasClass('body-small')) {
+ // Hide menu in order to smoothly turn on when maximize menu
+ $('#side-menu').hide();
+ // For smoothly turn on menu
+ setTimeout(
+ function () {
+ $('#side-menu').fadeIn(400);
+ }, 200);
+ } else if ($('body').hasClass('fixed-sidebar')) {
+ $('#side-menu').hide();
+ setTimeout(
+ function () {
+ $('#side-menu').fadeIn(400);
+ }, 100);
+ } else {
+ // Remove all inline style from jquery fadeIn function to reset menu state
+ $('#side-menu').removeAttr('style');
+ }
+}
+
+// Dragable panels
+function WinMove() {
+ var element = "[class*=col]";
+ var handle = ".ibox-title";
+ var connect = "[class*=col]";
+ $(element).sortable(
+ {
+ handle: handle,
+ connectWith: connect,
+ tolerance: 'pointer',
+ forcePlaceholderSize: true,
+ opacity: 0.8
+ })
+ .disableSelection();
+}
+
+
diff --git a/test-scheduler/ui/src/assets/js/jquery-vendor.js b/test-scheduler/ui/src/assets/js/jquery-vendor.js
new file mode 100644
index 00000000..97b3464a
--- /dev/null
+++ b/test-scheduler/ui/src/assets/js/jquery-vendor.js
@@ -0,0 +1,4 @@
+import $ from 'jquery'
+window.$ = $
+window.jQuery = $
+export default $
diff --git a/test-scheduler/ui/src/assets/js/pace.min.js b/test-scheduler/ui/src/assets/js/pace.min.js
new file mode 100644
index 00000000..159b4f9d
--- /dev/null
+++ b/test-scheduler/ui/src/assets/js/pace.min.js
@@ -0,0 +1,2 @@
+/*! pace 1.0.2 */
+(function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X=[].slice,Y={}.hasOwnProperty,Z=function(a,b){function c(){this.constructor=a}for(var d in b)Y.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},$=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};for(u={catchupTime:100,initialRate:.03,minTime:250,ghostTime:100,maxProgressPerFrame:20,easeFactor:1.25,startOnPageLoad:!0,restartOnPushState:!0,restartOnRequestAfter:500,target:"body",elements:{checkInterval:100,selectors:["body"]},eventLag:{minSamples:10,sampleCount:3,lagThreshold:3},ajax:{trackMethods:["GET"],trackWebSockets:!0,ignoreURLs:[]}},C=function(){var a;return null!=(a="undefined"!=typeof performance&&null!==performance&&"function"==typeof performance.now?performance.now():void 0)?a:+new Date},E=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame,t=window.cancelAnimationFrame||window.mozCancelAnimationFrame,null==E&&(E=function(a){return setTimeout(a,50)},t=function(a){return clearTimeout(a)}),G=function(a){var b,c;return b=C(),(c=function(){var d;return d=C()-b,d>=33?(b=C(),a(d,function(){return E(c)})):setTimeout(c,33-d)})()},F=function(){var a,b,c;return c=arguments[0],b=arguments[1],a=3<=arguments.length?X.call(arguments,2):[],"function"==typeof c[b]?c[b].apply(c,a):c[b]},v=function(){var a,b,c,d,e,f,g;for(b=arguments[0],d=2<=arguments.length?X.call(arguments,1):[],f=0,g=d.length;g>f;f++)if(c=d[f])for(a in c)Y.call(c,a)&&(e=c[a],null!=b[a]&&"object"==typeof b[a]&&null!=e&&"object"==typeof e?v(b[a],e):b[a]=e);return b},q=function(a){var b,c,d,e,f;for(c=b=0,e=0,f=a.length;f>e;e++)d=a[e],c+=Math.abs(d),b++;return c/b},x=function(a,b){var c,d,e;if(null==a&&(a="options"),null==b&&(b=!0),e=document.querySelector("[data-pace-"+a+"]")){if(c=e.getAttribute("data-pace-"+a),!b)return c;try{return JSON.parse(c)}catch(f){return d=f,"undefined"!=typeof console&&null!==console?console.error("Error parsing inline pace options",d):void 0}}},g=function(){function a(){}return a.prototype.on=function(a,b,c,d){var e;return null==d&&(d=!1),null==this.bindings&&(this.bindings={}),null==(e=this.bindings)[a]&&(e[a]=[]),this.bindings[a].push({handler:b,ctx:c,once:d})},a.prototype.once=function(a,b,c){return this.on(a,b,c,!0)},a.prototype.off=function(a,b){var c,d,e;if(null!=(null!=(d=this.bindings)?d[a]:void 0)){if(null==b)return delete this.bindings[a];for(c=0,e=[];c<this.bindings[a].length;)e.push(this.bindings[a][c].handler===b?this.bindings[a].splice(c,1):c++);return e}},a.prototype.trigger=function(){var a,b,c,d,e,f,g,h,i;if(c=arguments[0],a=2<=arguments.length?X.call(arguments,1):[],null!=(g=this.bindings)?g[c]:void 0){for(e=0,i=[];e<this.bindings[c].length;)h=this.bindings[c][e],d=h.handler,b=h.ctx,f=h.once,d.apply(null!=b?b:this,a),i.push(f?this.bindings[c].splice(e,1):e++);return i}},a}(),j=window.Pace||{},window.Pace=j,v(j,g.prototype),D=j.options=v({},u,window.paceOptions,x()),U=["ajax","document","eventLag","elements"],Q=0,S=U.length;S>Q;Q++)K=U[Q],D[K]===!0&&(D[K]=u[K]);i=function(a){function b(){return V=b.__super__.constructor.apply(this,arguments)}return Z(b,a),b}(Error),b=function(){function a(){this.progress=0}return a.prototype.getElement=function(){var a;if(null==this.el){if(a=document.querySelector(D.target),!a)throw new i;this.el=document.createElement("div"),this.el.className="pace pace-active",document.body.className=document.body.className.replace(/pace-done/g,""),document.body.className+=" pace-running",this.el.innerHTML='<div class="pace-progress">\n <div class="pace-progress-inner"></div>\n</div>\n<div class="pace-activity"></div>',null!=a.firstChild?a.insertBefore(this.el,a.firstChild):a.appendChild(this.el)}return this.el},a.prototype.finish=function(){var a;return a=this.getElement(),a.className=a.className.replace("pace-active",""),a.className+=" pace-inactive",document.body.className=document.body.className.replace("pace-running",""),document.body.className+=" pace-done"},a.prototype.update=function(a){return this.progress=a,this.render()},a.prototype.destroy=function(){try{this.getElement().parentNode.removeChild(this.getElement())}catch(a){i=a}return this.el=void 0},a.prototype.render=function(){var a,b,c,d,e,f,g;if(null==document.querySelector(D.target))return!1;for(a=this.getElement(),d="translate3d("+this.progress+"%, 0, 0)",g=["webkitTransform","msTransform","transform"],e=0,f=g.length;f>e;e++)b=g[e],a.children[0].style[b]=d;return(!this.lastRenderedProgress||this.lastRenderedProgress|0!==this.progress|0)&&(a.children[0].setAttribute("data-progress-text",""+(0|this.progress)+"%"),this.progress>=100?c="99":(c=this.progress<10?"0":"",c+=0|this.progress),a.children[0].setAttribute("data-progress",""+c)),this.lastRenderedProgress=this.progress},a.prototype.done=function(){return this.progress>=100},a}(),h=function(){function a(){this.bindings={}}return a.prototype.trigger=function(a,b){var c,d,e,f,g;if(null!=this.bindings[a]){for(f=this.bindings[a],g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(c.call(this,b));return g}},a.prototype.on=function(a,b){var c;return null==(c=this.bindings)[a]&&(c[a]=[]),this.bindings[a].push(b)},a}(),P=window.XMLHttpRequest,O=window.XDomainRequest,N=window.WebSocket,w=function(a,b){var c,d,e;e=[];for(d in b.prototype)try{e.push(null==a[d]&&"function"!=typeof b[d]?"function"==typeof Object.defineProperty?Object.defineProperty(a,d,{get:function(){return b.prototype[d]},configurable:!0,enumerable:!0}):a[d]=b.prototype[d]:void 0)}catch(f){c=f}return e},A=[],j.ignore=function(){var a,b,c;return b=arguments[0],a=2<=arguments.length?X.call(arguments,1):[],A.unshift("ignore"),c=b.apply(null,a),A.shift(),c},j.track=function(){var a,b,c;return b=arguments[0],a=2<=arguments.length?X.call(arguments,1):[],A.unshift("track"),c=b.apply(null,a),A.shift(),c},J=function(a){var b;if(null==a&&(a="GET"),"track"===A[0])return"force";if(!A.length&&D.ajax){if("socket"===a&&D.ajax.trackWebSockets)return!0;if(b=a.toUpperCase(),$.call(D.ajax.trackMethods,b)>=0)return!0}return!1},k=function(a){function b(){var a,c=this;b.__super__.constructor.apply(this,arguments),a=function(a){var b;return b=a.open,a.open=function(d,e){return J(d)&&c.trigger("request",{type:d,url:e,request:a}),b.apply(a,arguments)}},window.XMLHttpRequest=function(b){var c;return c=new P(b),a(c),c};try{w(window.XMLHttpRequest,P)}catch(d){}if(null!=O){window.XDomainRequest=function(){var b;return b=new O,a(b),b};try{w(window.XDomainRequest,O)}catch(d){}}if(null!=N&&D.ajax.trackWebSockets){window.WebSocket=function(a,b){var d;return d=null!=b?new N(a,b):new N(a),J("socket")&&c.trigger("request",{type:"socket",url:a,protocols:b,request:d}),d};try{w(window.WebSocket,N)}catch(d){}}}return Z(b,a),b}(h),R=null,y=function(){return null==R&&(R=new k),R},I=function(a){var b,c,d,e;for(e=D.ajax.ignoreURLs,c=0,d=e.length;d>c;c++)if(b=e[c],"string"==typeof b){if(-1!==a.indexOf(b))return!0}else if(b.test(a))return!0;return!1},y().on("request",function(b){var c,d,e,f,g;return f=b.type,e=b.request,g=b.url,I(g)?void 0:j.running||D.restartOnRequestAfter===!1&&"force"!==J(f)?void 0:(d=arguments,c=D.restartOnRequestAfter||0,"boolean"==typeof c&&(c=0),setTimeout(function(){var b,c,g,h,i,k;if(b="socket"===f?e.readyState<2:0<(h=e.readyState)&&4>h){for(j.restart(),i=j.sources,k=[],c=0,g=i.length;g>c;c++){if(K=i[c],K instanceof a){K.watch.apply(K,d);break}k.push(void 0)}return k}},c))}),a=function(){function a(){var a=this;this.elements=[],y().on("request",function(){return a.watch.apply(a,arguments)})}return a.prototype.watch=function(a){var b,c,d,e;return d=a.type,b=a.request,e=a.url,I(e)?void 0:(c="socket"===d?new n(b):new o(b),this.elements.push(c))},a}(),o=function(){function a(a){var b,c,d,e,f,g,h=this;if(this.progress=0,null!=window.ProgressEvent)for(c=null,a.addEventListener("progress",function(a){return h.progress=a.lengthComputable?100*a.loaded/a.total:h.progress+(100-h.progress)/2},!1),g=["load","abort","timeout","error"],d=0,e=g.length;e>d;d++)b=g[d],a.addEventListener(b,function(){return h.progress=100},!1);else f=a.onreadystatechange,a.onreadystatechange=function(){var b;return 0===(b=a.readyState)||4===b?h.progress=100:3===a.readyState&&(h.progress=50),"function"==typeof f?f.apply(null,arguments):void 0}}return a}(),n=function(){function a(a){var b,c,d,e,f=this;for(this.progress=0,e=["error","open"],c=0,d=e.length;d>c;c++)b=e[c],a.addEventListener(b,function(){return f.progress=100},!1)}return a}(),d=function(){function a(a){var b,c,d,f;for(null==a&&(a={}),this.elements=[],null==a.selectors&&(a.selectors=[]),f=a.selectors,c=0,d=f.length;d>c;c++)b=f[c],this.elements.push(new e(b))}return a}(),e=function(){function a(a){this.selector=a,this.progress=0,this.check()}return a.prototype.check=function(){var a=this;return document.querySelector(this.selector)?this.done():setTimeout(function(){return a.check()},D.elements.checkInterval)},a.prototype.done=function(){return this.progress=100},a}(),c=function(){function a(){var a,b,c=this;this.progress=null!=(b=this.states[document.readyState])?b:100,a=document.onreadystatechange,document.onreadystatechange=function(){return null!=c.states[document.readyState]&&(c.progress=c.states[document.readyState]),"function"==typeof a?a.apply(null,arguments):void 0}}return a.prototype.states={loading:0,interactive:50,complete:100},a}(),f=function(){function a(){var a,b,c,d,e,f=this;this.progress=0,a=0,e=[],d=0,c=C(),b=setInterval(function(){var g;return g=C()-c-50,c=C(),e.push(g),e.length>D.eventLag.sampleCount&&e.shift(),a=q(e),++d>=D.eventLag.minSamples&&a<D.eventLag.lagThreshold?(f.progress=100,clearInterval(b)):f.progress=100*(3/(a+3))},50)}return a}(),m=function(){function a(a){this.source=a,this.last=this.sinceLastUpdate=0,this.rate=D.initialRate,this.catchup=0,this.progress=this.lastProgress=0,null!=this.source&&(this.progress=F(this.source,"progress"))}return a.prototype.tick=function(a,b){var c;return null==b&&(b=F(this.source,"progress")),b>=100&&(this.done=!0),b===this.last?this.sinceLastUpdate+=a:(this.sinceLastUpdate&&(this.rate=(b-this.last)/this.sinceLastUpdate),this.catchup=(b-this.progress)/D.catchupTime,this.sinceLastUpdate=0,this.last=b),b>this.progress&&(this.progress+=this.catchup*a),c=1-Math.pow(this.progress/100,D.easeFactor),this.progress+=c*this.rate*a,this.progress=Math.min(this.lastProgress+D.maxProgressPerFrame,this.progress),this.progress=Math.max(0,this.progress),this.progress=Math.min(100,this.progress),this.lastProgress=this.progress,this.progress},a}(),L=null,H=null,r=null,M=null,p=null,s=null,j.running=!1,z=function(){return D.restartOnPushState?j.restart():void 0},null!=window.history.pushState&&(T=window.history.pushState,window.history.pushState=function(){return z(),T.apply(window.history,arguments)}),null!=window.history.replaceState&&(W=window.history.replaceState,window.history.replaceState=function(){return z(),W.apply(window.history,arguments)}),l={ajax:a,elements:d,document:c,eventLag:f},(B=function(){var a,c,d,e,f,g,h,i;for(j.sources=L=[],g=["ajax","elements","document","eventLag"],c=0,e=g.length;e>c;c++)a=g[c],D[a]!==!1&&L.push(new l[a](D[a]));for(i=null!=(h=D.extraSources)?h:[],d=0,f=i.length;f>d;d++)K=i[d],L.push(new K(D));return j.bar=r=new b,H=[],M=new m})(),j.stop=function(){return j.trigger("stop"),j.running=!1,r.destroy(),s=!0,null!=p&&("function"==typeof t&&t(p),p=null),B()},j.restart=function(){return j.trigger("restart"),j.stop(),j.start()},j.go=function(){var a;return j.running=!0,r.render(),a=C(),s=!1,p=G(function(b,c){var d,e,f,g,h,i,k,l,n,o,p,q,t,u,v,w;for(l=100-r.progress,e=p=0,f=!0,i=q=0,u=L.length;u>q;i=++q)for(K=L[i],o=null!=H[i]?H[i]:H[i]=[],h=null!=(w=K.elements)?w:[K],k=t=0,v=h.length;v>t;k=++t)g=h[k],n=null!=o[k]?o[k]:o[k]=new m(g),f&=n.done,n.done||(e++,p+=n.tick(b));return d=p/e,r.update(M.tick(b,d)),r.done()||f||s?(r.update(100),j.trigger("done"),setTimeout(function(){return r.finish(),j.running=!1,j.trigger("hide")},Math.max(D.ghostTime,Math.max(D.minTime-(C()-a),0)))):c()})},j.start=function(a){v(D,a),j.running=!0;try{r.render()}catch(b){i=b}return document.querySelector(".pace")?(j.trigger("start"),j.go()):setTimeout(j.start,50)},"function"==typeof define&&define.amd?define(["pace"],function(){return j}):"object"==typeof exports?module.exports=j:D.startOnPageLoad&&j.start()}).call(this);
diff --git a/test-scheduler/ui/src/assets/js/toastr.min.js b/test-scheduler/ui/src/assets/js/toastr.min.js
new file mode 100644
index 00000000..8810dbd7
--- /dev/null
+++ b/test-scheduler/ui/src/assets/js/toastr.min.js
@@ -0,0 +1,2 @@
+!function(e){e(["jquery"],function(e){return function(){function t(e,t,n){return f({type:O.error,iconClass:g().iconClasses.error,message:e,optionsOverride:n,title:t})}function n(t,n){return t||(t=g()),v=e("#"+t.containerId),v.length?v:(n&&(v=c(t)),v)}function i(e,t,n){return f({type:O.info,iconClass:g().iconClasses.info,message:e,optionsOverride:n,title:t})}function o(e){w=e}function s(e,t,n){return f({type:O.success,iconClass:g().iconClasses.success,message:e,optionsOverride:n,title:t})}function a(e,t,n){return f({type:O.warning,iconClass:g().iconClasses.warning,message:e,optionsOverride:n,title:t})}function r(e){var t=g();v||n(t),l(e,t)||u(t)}function d(t){var i=g();return v||n(i),t&&0===e(":focus",t).length?void h(t):void(v.children().length&&v.remove())}function u(t){for(var n=v.children(),i=n.length-1;i>=0;i--)l(e(n[i]),t)}function l(t,n){return t&&0===e(":focus",t).length?(t[n.hideMethod]({duration:n.hideDuration,easing:n.hideEasing,complete:function(){h(t)}}),!0):!1}function c(t){return v=e("<div/>").attr("id",t.containerId).addClass(t.positionClass).attr("aria-live","polite").attr("role","alert"),v.appendTo(e(t.target)),v}function p(){return{tapToDismiss:!0,toastClass:"toast",containerId:"toast-container",debug:!1,showMethod:"fadeIn",showDuration:300,showEasing:"swing",onShown:void 0,hideMethod:"fadeOut",hideDuration:1e3,hideEasing:"swing",onHidden:void 0,extendedTimeOut:1e3,iconClasses:{error:"toast-error",info:"toast-info",success:"toast-success",warning:"toast-warning"},iconClass:"toast-info",positionClass:"toast-top-right",timeOut:5e3,titleClass:"toast-title",messageClass:"toast-message",target:"body",closeHtml:'<button type="button">&times;</button>',newestOnTop:!0,preventDuplicates:!1,progressBar:!1}}function m(e){w&&w(e)}function f(t){function i(t){return!e(":focus",l).length||t?(clearTimeout(O.intervalId),l[r.hideMethod]({duration:r.hideDuration,easing:r.hideEasing,complete:function(){h(l),r.onHidden&&"hidden"!==b.state&&r.onHidden(),b.state="hidden",b.endTime=new Date,m(b)}})):void 0}function o(){(r.timeOut>0||r.extendedTimeOut>0)&&(u=setTimeout(i,r.extendedTimeOut),O.maxHideTime=parseFloat(r.extendedTimeOut),O.hideEta=(new Date).getTime()+O.maxHideTime)}function s(){clearTimeout(u),O.hideEta=0,l.stop(!0,!0)[r.showMethod]({duration:r.showDuration,easing:r.showEasing})}function a(){var e=(O.hideEta-(new Date).getTime())/O.maxHideTime*100;f.width(e+"%")}var r=g(),d=t.iconClass||r.iconClass;if("undefined"!=typeof t.optionsOverride&&(r=e.extend(r,t.optionsOverride),d=t.optionsOverride.iconClass||d),r.preventDuplicates){if(t.message===C)return;C=t.message}T++,v=n(r,!0);var u=null,l=e("<div/>"),c=e("<div/>"),p=e("<div/>"),f=e("<div/>"),w=e(r.closeHtml),O={intervalId:null,hideEta:null,maxHideTime:null},b={toastId:T,state:"visible",startTime:new Date,options:r,map:t};return t.iconClass&&l.addClass(r.toastClass).addClass(d),t.title&&(c.append(t.title).addClass(r.titleClass),l.append(c)),t.message&&(p.append(t.message).addClass(r.messageClass),l.append(p)),r.closeButton&&(w.addClass("toast-close-button").attr("role","button"),l.prepend(w)),r.progressBar&&(f.addClass("toast-progress"),l.prepend(f)),l.hide(),r.newestOnTop?v.prepend(l):v.append(l),l[r.showMethod]({duration:r.showDuration,easing:r.showEasing,complete:r.onShown}),r.timeOut>0&&(u=setTimeout(i,r.timeOut),O.maxHideTime=parseFloat(r.timeOut),O.hideEta=(new Date).getTime()+O.maxHideTime,r.progressBar&&(O.intervalId=setInterval(a,10))),l.hover(s,o),!r.onclick&&r.tapToDismiss&&l.click(i),r.closeButton&&w&&w.click(function(e){e.stopPropagation?e.stopPropagation():void 0!==e.cancelBubble&&e.cancelBubble!==!0&&(e.cancelBubble=!0),i(!0)}),r.onclick&&l.click(function(){r.onclick(),i()}),m(b),r.debug&&console&&console.log(b),l}function g(){return e.extend({},p(),b.options)}function h(e){v||(v=n()),e.is(":visible")||(e.remove(),e=null,0===v.children().length&&(v.remove(),C=void 0))}var v,w,C,T=0,O={error:"error",info:"info",success:"success",warning:"warning"},b={clear:r,remove:d,error:t,getContainer:n,info:i,options:{},subscribe:o,success:s,version:"2.1.0",warning:a};return b}()})}("function"==typeof define&&define.amd?define:function(e,t){"undefined"!=typeof module&&module.exports?module.exports=t(require("jquery")):window.toastr=t(window.jQuery)});
+//# sourceMappingURL=/toastr.js.map
diff --git a/test-scheduler/ui/src/components/editor/editor.vue b/test-scheduler/ui/src/components/editor/editor.vue
new file mode 100644
index 00000000..e23b6d82
--- /dev/null
+++ b/test-scheduler/ui/src/components/editor/editor.vue
@@ -0,0 +1,141 @@
+<template>
+<div class="col-md-offset-1 col-md-10" style="margin-top: 20px;">
+ <ul class="nav nav-tabs">
+ <li class="active"><a data-toggle="tab" data-target="#step-pane">Step</a></li>
+ <li><a data-toggle="tab" data-target="#flow-pane">Flow</a></li>
+ </ul>
+ <div class="tab-content">
+ <div id="step-pane" class="tab-pane active fade in">
+ <br>
+ <div class="row">
+ <div class='col-md-12'>
+ <step v-bind:stepList="stepList" v-on:stepList="getStepList"></step>
+ </div>
+ </div>
+ </div>
+ <div id="flow-pane" class="tab-pane fade">
+ <br>
+ <div class="row">
+ <div class='col-md-12'>
+ <div class="row">
+ <button style='margin-left:20px; margin-bottom: 30px;' class="btn btn-success" type="button" id="new-flow" v-on:click='addSubflow'>&nbsp;&nbsp;<span class="bold">ADD FLOW</span></button>
+ </div>
+ <div class='row'>
+ <div class='col-md-2'>
+ <ul id="flow-tabs">
+ <li class="active"><a data-toggle="tab" data-target="#flow-main">main</a></li>
+ <li v-for="subflow in subflowList"><a data-toggle="tab" v-bind:data-target="'#' + subflow.tabId">{{ subflow.name }}</a></li>
+ </ul>
+ </div>
+ <div class="col-md-10">
+ <div class="tab-content">
+ <div id="flow-main" class="tab-pane active fade in">
+ <flow v-model='mainflowName' v-bind:orderList='mainOrdersList' v-bind:stepsRefs='stepNameList' v-bind:flowsRefs='flowNameList' v-on:orderList='updateOrderList($event, mainflowName)'>
+ </flow>
+ </div>
+ <div v-for="subflow in subflowList" v-bind:id="subflow.tabId" class="tab-pane fade">
+ <flow v-model='subflow.name' v-bind:orderList='subflow.orderList' v-bind:stepsRefs='stepNameList' v-bind:flowsRefs='flowNameList' v-on:orderList='updateOrderList($event, subflow.name)'></flow>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+</template>
+<script>
+import '../../assets/css/editor.css'
+import step from './step.vue'
+import flow from './flow.vue'
+import showMessage from '../message/showMessage.js'
+export default {
+ name: 'editor',
+ props: ['saveSignal', 'stepList', 'mainOrdersList', 'subflowList'],
+ model: {
+ prop: 'saveSignal',
+ event: 'saveResponse'
+ },
+ data: function(){
+ return {
+ mainflowName: 'main'
+ }
+ },
+ components: {
+ step,
+ flow
+ },
+ methods: {
+ getStepList: function(stepList) {
+ this.stepList = stepList;
+ },
+ addSubflow: function() {
+ var tabid = "flow-" + Math.floor(Math.random()*(1000000));
+ this.subflowList.push({'tabId': tabid, 'name': 'fake', 'orderList': []});
+ },
+ updateOrderList: function(orderList, flowName) {
+ if(flowName == 'main') {
+ this.mainOrdersList = orderList;
+ } else {
+ for(var i = 0; i < this.subflowList.length; ++i) {
+ if(this.subflowList[i].name == flowName) {
+ this.subflowList[i].orderList = orderList;
+ }
+ }
+ }
+ }
+ },
+ computed: {
+ flowNameList: function() {
+ var stepNameArr = [];
+ for(var i = 0; i < this.subflowList.length; i++) {
+ stepNameArr.push(this.subflowList[i].name);
+ }
+ console.log(stepNameArr);
+ return stepNameArr;
+ },
+ stepNameList: function() {
+ var stepNameArr = [];
+ for(var i = 0; i < this.stepList.length; i++) {
+ stepNameArr.push(this.stepList[i].name);
+ }
+ return stepNameArr;
+ }
+ },
+ watch: {
+ saveSignal: function(newVal) {
+ if(newVal == true) {
+ console.log("editor newVal true");
+ var self = this;
+ var msgTitle = "SAVE -- TESTCASE";
+ $.ajax({
+ url: this.global.SERVER_ADDR + "testcase/save",
+ method: "POST",
+ data: {
+ suiteName: this.$route.query.suiteName,
+ caseName: this.$route.query.caseName,
+ stepList: JSON.stringify(this.stepList),
+ subflowList: JSON.stringify(this.subflowList),
+ mainOrdersList: JSON.stringify(this.mainOrdersList)
+ },
+ success: function(data) {
+ console.log("ajax save content!");
+ if(data['code'] == 200) {
+ showMessage("success", msgTitle, "Save content successfully!");
+ self.$emit('saveResponse', true);
+ } else {
+ showMessage(data['code'], msgTitle, "Failed to save content!", data['error']);
+ self.$emit('saveResponse', false);
+ }
+ },
+ error: function(obj, status, msg) {
+ showMessage(status, msgTitle, "Failed to save content!", msg);
+ self.$emit('saveResponse', false);
+ }
+ });
+ }
+ }
+ }
+}
+</script>
diff --git a/test-scheduler/ui/src/components/editor/flow.vue b/test-scheduler/ui/src/components/editor/flow.vue
new file mode 100644
index 00000000..b89cde4d
--- /dev/null
+++ b/test-scheduler/ui/src/components/editor/flow.vue
@@ -0,0 +1,340 @@
+<template>
+<div class="row" style="border: 1px solid #cec8c8">
+ <div class="col-md-12" style="padding: 10px 0 5px;">
+ <div class="form-group">
+ <label class="col-md-2 control-label" style="font-size: 22px;">flowName</label>
+ <div class="col-md-6">
+ <input v-if="flowName != 'main'" type="text" class="form-control" v-model="flowName" v-on:input='$emit("editFlowName", $event.target.value)' placeholder="please input flow name." />
+ <p style="font-size: 22px;" v-else>{{flowName}}</p>
+ </div>
+ </div>
+ </div>
+ <div class="col-md-12">
+ <div class="ibox">
+ <div class="ibox-title">
+ <h5 class="text-success">Order</h5>
+ <div class="ibox-tools">
+ <a class="collapse-link">
+ <i class="fa fa-chevron-up" v-on:click.stop='collapseBox'></i>
+ </a>
+ </div>
+ </div>
+ <div class="ibox-content">
+ <div class="row">
+ <button class="btn btn-success" type="button" id="new-order" v-on:click='addOrder'>&nbsp;&nbsp;<span class="bold">ADD ORDER</span></button>
+ <div class="col-md-3">
+ <span class="select-box" >
+ <select id="orderSelect" class="select form-control" v-model='orderSelected' >
+ <option value="1">Normal</option>
+ <option value="2">Switch</option>
+ <option value="3">Parallel</option>
+ </select>
+ </span>
+ </div>
+ <br>
+ <!-- Normal -->
+ <div id="normal-panel" v-show='orderSelected == 1'>
+ <div class="col-lg-11" id="normalform">
+ <br>
+ <div>
+ <div class="ibox border-ibox">
+ <div class="ibox-title">
+ <h5>Normal</h5>
+ <div class="ibox-tools">
+ <a class="collapse-link" >
+ <i class="fa fa-chevron-up" v-on:click.stop='collapseBox'></i>
+ </a>
+ </div>
+ </div>
+ <div class="ibox-content">
+ <!-- <div class="form-group">
+ <div class="col-lg-6 row"><label>name</label><input id="NName" type="name" placeholder="name" class="form-control"></div>
+ </div> -->
+ <div class="form-group">
+ <label class='headmsg control-label'>Step</label>
+ <div class='col-md-4'>
+ <select class="chooseStep form-control" id="NStep" v-model='normalStep'>
+ <option></option>
+ <option v-for='stepRef in stepsRefs' v-bind:value='stepRef'>{{ stepRef }}</option>
+ </select>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <!-- Switch -->
+ <div id="switch-panel" v-show='orderSelected == 2'>
+ <br>
+ <div class="row">
+ <div class="col-lg-11">
+ <div class="ibox border-ibox float-e-margins">
+ <div class="ibox-title">
+ <h5>Switch</h5>
+ <div class="ibox-tools">
+ <button class="btn btn-success " type="button" id="new-case" v-on:click='addNewCase'>&nbsp;&nbsp;<span class="bold">New Case</span></button>
+ <a class="collapse-link" >
+ <i class="fa fa-chevron-up" v-on:click.stop='collapseBox'></i>
+ </a>
+ </div>
+ </div>
+ <div class="ibox-content">
+ <div class="row">
+ <div class="row">
+ <div class="form-group">
+ <label class="headmsg control-label">Value:</label>
+ <div class="col-md-5"><input type="text" class="case form-control" v-model='switchValue'></div>
+ </div>
+ </div>
+ <div class="row">
+ <label class="headmsg control-label">Cases:</label>
+ <div class='col-md-12 row'>
+ <div class='col-md-offset-1' v-for='switchCase in switchCases' style='border-left-style: solid; border-left-color: gray; margin-bottom: 30px;'>
+ <div class="row">
+ <div class="form-group">
+ <label class="headmsg control-label">CaseValue:</label>
+ <div class="col-md-5"><input type="text" class="case form-control" v-model='switchCase.value'></div>
+ </div>
+ </div>
+ <div class="row">
+ <label class="headmsg control-label">Case:</label>
+ <div class="col-md-3">
+ <select class="myselect chooseStep form-control" v-model='switchCase.orderType'>
+ <option></option>
+ <option v-for='orderType in ["step", "flow"]' v-bind:value='orderType'>{{ orderType }}</option>
+ </select>
+ </div>
+ <div class="col-md-4">
+ <select class="myselect chooseStep form-control" v-model='switchCase.orderValue'>
+ <option></option>
+ <option v-if='switchCase.orderType == "step"' v-for='stepRef in stepsRefs' v-bind:value='stepRef'>{{ stepRef }}</option>
+ <option v-if='switchCase.orderType == "flow"' v-for='flowRef in filtedFlowsRefs' v-bind:value='flowRef'>{{ flowRef }}</option>
+ </select>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <!-- Parallel -->
+ <div id="parallel-panel" v-show='orderSelected == 3'>
+ <br>
+ <div class="row">
+ <div class="col-lg-11">
+ <div class="ibox border-ibox float-e-margins">
+ <div class="ibox-title">
+ <h5>Parallel</h5>
+ <div class="ibox-tools">
+ <button class="btn btn-success " type="button" id="para-step" v-on:click='addNewBranch'>&nbsp;&nbsp;<span class="bold"><i class='fa fa-plus-square-o'></i> Branch</span></button>
+ <a class="collapse-link" >
+ <i class="fa fa-chevron-up" v-on:click.stop='collapseBox'></i>
+ </a>
+ </div>
+ </div>
+ <div id="parallel">
+ <div class="ibox-content">
+ <div class='row'>
+ <div class='row'><label class="headmsg control-label">Branches:</label></div>
+ <div class='row'>
+ <div class='col-md-offset-1'>
+ <div v-for='branch in parallelBranches' class="row" style='border-left-style: solid; border-left-color: gray; margin-bottom: 20px; padding-top: 7px; padding-bottom: 7px;'>
+ <label class="headmsg control-label">Branch:</label>
+ <div class="col-md-3">
+ <select class="myselect chooseStep form-control" v-model='branch.orderType'>
+ <option></option>
+ <option v-for='orderType in ["step", "flow"]' v-bind:value='orderType'>{{ orderType }}</option>
+ </select>
+ </div>
+ <div class="col-md-4">
+ <select class="myselect chooseStep form-control" v-model='branch.orderValue'>
+ <option></option>
+ <option v-if='branch.orderType == "step"' v-for='stepRef in stepsRefs' v-bind:value='stepRef'>{{ stepRef }}</option>
+ <option v-if='branch.orderType == "flow"' v-for='flowRef in filtedFlowsRefs' v-bind:value='flowRef'>{{ flowRef }}</option>
+ </select>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="ibox">
+ <div class="ibox-title">
+ <h5 class="text-success">OrderList</h5>
+ <div class="ibox-tools">
+ <a class="collapse-link" >
+ <i class="fa fa-chevron-up" v-on:click.stop='collapseBox'></i>
+ </a>
+ </div>
+ </div>
+ <div class="ibox-content" id="order-list">
+ <div v-for='(order, index) in orderList' class='ibox float-e-margins' style='margin-bottom: 0;'>
+ <div class="ibox-title step">
+ <h5>Order #{{index+1}} <strong style='margin-left: 20px;'>{{['normal', 'switch', 'parallel'][order.type - 1]}}</strong> </h5>
+ <div class="ibox-tools">
+ <a class="collapse-link" >
+ <i class="fa fa-chevron-up" v-on:click.stop='collapseBox'></i>
+ </a>
+ <a class="close-link" v-on:click='removeOrder'>
+ <i class="fa fa-times"></i>
+ </a>
+ </div>
+ </div>
+ <div class="ibox-content">
+ <div v-if='order.type == 1' class="row">
+ <label class="control-label" style='padding-right: 20px;'> step: </label>
+ <label class="control-label"> {{ order.step }}</label>
+ </div>
+ <div v-if='order.type == 2' class="row">
+ <div>
+ <label class="control-label" style='padding-right: 20px;'> value: </label>
+ <label class="control-label"> {{order.value}} </label>
+ </div>
+ <div><label class="control-label"> cases: </label></div>
+ <div v-for='sCase in order.cases' class="row">
+ <label class="control-label col-md-offset-1"> -- <b>{{ sCase.value }}</b> : </label>
+ <label class='coltrol-label' style='margin-left: 20px;'>{{ sCase.orderValue }} [{{ sCase.orderType }}]</label>
+ </div>
+ </div>
+ <div v-if='order.type == 3' class="row">
+ <div><label class="control-label"> </label></div>
+ <div v-for='branch in order.branches' class="row">
+ <label class="control-label col-md-offset-1" style='padding-right: 20px;'> -- branch: </label>
+ <label class="control-label"> {{ branch.orderValue }} [{{ branch.orderType }}]</label>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+</template>
+<script>
+export default {
+ name: 'flow',
+ props: ['stepsRefs', 'flowsRefs', 'flowName', 'orderList'],
+ model: {
+ prop: 'flowName',
+ event: 'editFlowName'
+ },
+ data: function() {
+ return {
+ normalStep: '',
+ switchValue: '',
+ switchCases: [{'value': '', 'orderType': '', 'orderValue': ''}],
+ parallelBranches: [{'orderType': '', 'orderValue': ''}],
+ orderSelected: 1
+ }
+ },
+ mounted: function(){
+ // this.selectPluginUpdate();
+ },
+ updated: function(){
+ // this.selectPluginUpdate();
+ },
+ methods: {
+ addOrder: function(){
+ var select = this.orderSelected;
+ if(select == 1){
+ if(this.normalStep == ""){
+ alert("Not completed!!!");
+ return;
+ }
+ var temp = {type:1,step:this.normalStep};
+ this.orderList.push(temp);
+ this.normalStep = '';
+ }
+ if(select == 2){
+ var caseList = [];
+ for(var i=0; i<this.switchCases.length; ++i){
+ var caseValue = this.switchCases[i].value;
+ if(caseValue == ""){
+ alert("Not completed!!!");
+ return;
+ }
+ var caseOrderType = this.switchCases[i].orderType;
+ if(caseOrderType == ""){
+ alert("Not completed!!!");
+ return;
+ }
+ var caseOrderValue = this.switchCases[i].orderValue;
+ if(caseOrderValue == ""){
+ alert("Not completed!!!");
+ return;
+ }
+ caseList.push({value: caseValue, orderType: caseOrderType, orderValue: caseOrderValue});
+ }
+ temp = {type:2, value: this.switchValue, cases:caseList};
+ this.orderList.push(temp);
+ this.switchValue = '';
+ this.switchCases = [{value: '', orderType: '', orderValue: ''}];
+ }
+ if(select == 3){
+ var branchList = [];
+ var allStep = $('#parallel .chooseStep');
+ for(var i=0; i<this.parallelBranches.length; ++i){
+ var branchOrderType = this.parallelBranches[i].orderType;
+ if(branchOrderType == ""){
+ alert("Not completed!!!");
+ return;
+ }
+ var branchOrderValue = this.parallelBranches[i].orderValue;
+ if(branchOrderValue == ""){
+ alert("Not completed!!!");
+ return;
+ }
+ branchList.push({orderType: branchOrderType, orderValue: branchOrderValue});
+ }
+ temp = {type:3,branches:branchList};
+ this.orderList.push(temp);
+ this.parallelBranches = [{orderType: '', orderValue: ''}];
+ }
+ this.$emit("orderList", this.orderList);
+ },
+ removeOrder: function(index){
+ this.orderList.splice(index, 1);
+ },
+ addNewCase: function() {
+ this.switchCases.push({value: '', orderType: '', orderValue: ''});
+ },
+ addNewBranch: function() {
+ this.parallelBranches.push({step: ''});
+ },
+ collapseBox: function(event) {
+ console.log("collapse");
+ var ele = event.target;
+ console.log(event);
+ console.log(ele);
+ var ibox = $(ele).closest('div.ibox');
+ var content = ibox.children('.ibox-content');
+ content.slideToggle(200);
+ $(ele).toggleClass('fa-chevron-up').toggleClass('fa-chevron-down');
+ }
+ },
+ computed: {
+ filtedFlowsRefs: function() {
+ var subflowNameArr = [];
+ for(var i = 0; i < this.flowsRefs.length; i++) {
+ if(this.flowsRefs[i] != this.flowName) {
+ subflowNameArr.push(this.flowsRefs[i]);
+ }
+ }
+ return subflowNameArr;
+ }
+ }
+}
+</script>
diff --git a/test-scheduler/ui/src/components/editor/step.vue b/test-scheduler/ui/src/components/editor/step.vue
new file mode 100644
index 00000000..95af8429
--- /dev/null
+++ b/test-scheduler/ui/src/components/editor/step.vue
@@ -0,0 +1,222 @@
+<template>
+<!-- step -->
+<div class="row">
+ <div class="col-md-6 col-sm-12">
+ <div class="ibox float-e-margins">
+ <div class="ibox-title">
+ <h5 class="text-success">Step</h5>
+ <div class="ibox-tools" style="height: 25px;">
+ <button class="btn btn-success " type="button" id="new-step">&nbsp;&nbsp;<span class="bold">New Step</span></button>
+ <a class="collapse-link" >
+ <i class="fa fa-chevron-up" v-on:click.stop='collapseBox'></i>
+ </a>
+ </div>
+ </div>
+ <div class="ibox-content" style="border: 1px solid #cec8c8">
+ <form class="form-horizontal">
+ <div class="row">
+ <div class="form-group">
+ <label class="col-md-2 control-label">Name:</label>
+ <div class="col-md-5"><input type="text" class="form-control" id="name"></div>
+ </div>
+ <div class="form-group">
+ <label class="col-md-2 control-label">Service:</label>
+ <div class="col-md-4">
+ <select class="form-control" id="service">
+ <option></option>
+ <option v-for='service in dataService' v-bind:value='service'>{{service}}</option>
+ </select>
+ </div>
+ </div>
+ <div class="form-group">
+ <label class="col-md-2 control-label">Action:</label>
+ <div class="col-md-4">
+ <select class="form-control" id="action">
+ <option></option>
+ <option v-for='action in dataAction' v-bind:value='action.name'>{{action.name}}</option>
+ </select>
+ </div>
+ </div>
+ </div>
+ <div class="row" id="parameter">
+ <div class="form-group" v-for='(param, index) in dataParam'>
+ <label class="col-md-2 control-label" v-bind:title="param.description">{{ param.name }}
+ </label>
+ <div class="col-md-5">
+ <input type="text" class="form-control" v-bind:placeholder="param.description" v-bind:id="'par'+index">
+ </div>
+ </div>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ <div class="col-md-6 col-sm-12">
+ <div class="ibox float-e-margins">
+ <div class="ibox-title">
+ <h5 class="text-success">StepList</h5>
+ <div class="ibox-tools">
+ <a class="collapse-link">
+ <i class="fa fa-chevron-up" v-on:click.stop='collapseBox'></i>
+ </a>
+ </div>
+ </div>
+ <div class="ibox-content" id="step-list" style="border: 1px solid #cec8c8">
+ <div v-for='(step, index) in stepList' class='ibox'>
+ <div class="ibox-title step">
+ <h5>Step{{index + 1}} &nbsp;&nbsp; {{step.name}} </h5>
+ <div class="ibox-tools">
+ <a class="collapse-link">
+ <i class="fa fa-chevron-up" v-on:click.stop='collapseBox'></i>
+ </a>
+ <a class="close-link" v-on:click='removeStep(index)'>
+ <i class="fa fa-times"></i>
+ </a>
+ </div>
+ </div>
+ <div class="ibox-content">
+ <div class="row">
+ <label class="control-label"><span style='padding-right: 20px;'>Service:</span> {{ step.service }}</label>
+ </div>
+ <div class="row">
+ <label class="control-label"><span style='padding-right: 20px;'>Action:</span> {{ step.action }}</label>
+ </div>
+ <div class="param row">
+ <label class="control-label">
+ <span style='padding-right: 20px;'>Parameter:</span>
+ <span v-for='param in step.params'>{{param.key}} = {{param.value}} ;&nbsp;&nbsp;&nbsp;</span>
+ </label>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+</template>
+<script>
+export default {
+ name: 'step',
+ props: ['stepList'],
+ data: function() {
+ return {
+ dataService: [],
+ dataAction: [],
+ dataParam: []
+ }
+ },
+ mounted: function() {
+ this.getServiceList();
+ var self = this;
+ $("#service").change(function(){
+ self.selectService();
+ });
+ $("#action").change(function(){
+ self.selectAction();
+ });
+ $('#new-step').click(function(){
+ self.newStep();
+ });
+ },
+ methods: {
+ getServiceList: function(){
+ console.log("get serviceList!");
+ var self = this;
+ $.ajax({
+ url: this.global.SERVER_ADDR + "service/list",
+ method: "GET",
+ async:false,
+ success: function(data){
+ console.log("ajax success!");
+ if(data['code'] == 200){
+ self.dataService = [];
+ self.dataService = data['result'];
+ }
+ }
+ });
+ },
+ getServiceContent: function(name){
+ var self = this;
+ $.ajax({
+ url: this.global.SERVER_ADDR + "service/content",
+ method: "GET",
+ async:false,
+ data: {
+ "serviceName": name
+ },
+ success: function(data){
+ if(data['code'] == 200){
+ self.dataAction = [];
+ self.dataAction = data['result']['actions'];
+ }
+ }
+ });
+ },
+ getParams: function(name){
+ for(var i in this.dataAction){
+ if(this.dataAction[i].name == name){
+ this.dataParam = [];
+ this.dataParam = this.dataAction[i].params;
+ break;
+ }
+ }
+ },
+ selectService: function(event){
+ var selectedName = $("#service").val();
+ this.getServiceContent(selectedName);
+ },
+ selectAction: function(event){
+ var selectedName = $("#action").val();
+ if(selectedName=="") {
+ this.dataParam = [];
+ return;
+ }
+ this.getParams(selectedName);
+ if(this.dataParam==undefined) this.dataParam = [];
+ },
+ newStep: function(){
+ var ser = $("#service").val();
+ var act = $("#action").val();
+ var na = $("#name").val();
+ if(ser==""||act==""||na==""){
+ alert('Not completed!');
+ return;
+ }
+ var parCount = this.dataParam.length;
+ var par = [];
+ for(var i=0; i<parCount; ++i){
+ var temp = $('#par'+i).val();
+ if(temp==""){
+ alert('Not completed!');
+ return;
+ }
+ var name = this.dataParam[i].name;
+ par.push({key: name, value: temp});
+ }
+ this.stepList.push({name: na, service: ser, action: act, params: par});
+ $("#name").val("");
+ $("#service").val("");
+ this.dataAction = [];
+ this.dataParam = [];
+ },
+ removeStep: function(index) {
+ this.stepList.splice(index, 1);
+ },
+ collapseBox: function(event) {
+ console.log("collapse");
+ var ele = event.target;
+ console.log(event);
+ console.log(ele);
+ var ibox = $(ele).closest('div.ibox');
+ var content = ibox.children('.ibox-content');
+ content.slideToggle(200);
+ $(ele).toggleClass('fa-chevron-up').toggleClass('fa-chevron-down');
+ }
+ },
+ watch: {
+ stepList: function() {
+ this.$emit('stepList', this.stepList);
+ }
+ }
+}
+</script>
diff --git a/test-scheduler/ui/src/components/env_component/api_param.vue b/test-scheduler/ui/src/components/env_component/api_param.vue
new file mode 100644
index 00000000..55eb913e
--- /dev/null
+++ b/test-scheduler/ui/src/components/env_component/api_param.vue
@@ -0,0 +1,63 @@
+<template>
+ <div class="row">
+ <div class="form-group">
+ <label class="col-lg-3 control-label">Params</label>
+ <div class="col-lg-2">
+ <button type="button" class="btn btn-primary btn-sm" v-on:click="addNewParam()">New</button>
+ </div>
+ </div>
+ <div class="form-group">
+ <div class="col-lg-offset-2 col-lg-8">
+ <div class="table-responsive">
+ <table class="table table-bordered text-center">
+ <thead>
+ <tr>
+ <th>name</th>
+ <th class="text-center">description</th>
+ <th class="text-center">operation</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr v-for="param in params">
+ <td><input type="text" class="form-control text-center" style="border: 0px" v-model="param['name']"></td>
+ <td><input type="text" class="form-control text-center" style="border: 0px" v-bind:title="param['description']" v-model="param['description']"></td>
+ <td>
+ <button type="button" class="btn btn-white" v-on:click="deleteParam(param['name'])">
+ <i class="fa fa-trash"></i>
+ </button>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+ </div>
+</template>
+<script>
+export default {
+ props: ["params"],
+ data: function() {
+ return {
+ paramArr: this.params
+ }
+ },
+ watch: {
+ paramArr: function(){
+ this.$emit("params", this.paramArr);
+ }
+ },
+ methods: {
+ addNewParam: function() {
+ this.params.push({'name': '', 'description': ''});
+ },
+ deleteParam: function(paramName) {
+ for(var i = 0;i < this.params.length; i++) {
+ if(paramName == this.params[i]['name']) {
+ this.params.splice(i, 1);
+ }
+ }
+ }
+ }
+}
+</script>
diff --git a/test-scheduler/ui/src/components/env_component/base_input.vue b/test-scheduler/ui/src/components/env_component/base_input.vue
new file mode 100644
index 00000000..f4bbde5c
--- /dev/null
+++ b/test-scheduler/ui/src/components/env_component/base_input.vue
@@ -0,0 +1,20 @@
+<template>
+ <div class="form-group">
+ <label class="col-lg-3 control-label">{{ name }}</label>
+ <div class="col-lg-7">
+ <input type="text" class="form-control" v-bind:value="value" v-on:input="$emit('input', $event.target.value)">
+ </div>
+ </div>
+</template>
+<script>
+export default {
+ props: ['name', 'value'],
+ data: function() {
+ return {
+ inputName: this.name,
+ inputValue: this.value,
+ fake: "abc"
+ }
+ }
+}
+</script>
diff --git a/test-scheduler/ui/src/components/env_component/service_api.vue b/test-scheduler/ui/src/components/env_component/service_api.vue
new file mode 100644
index 00000000..f6f58d2c
--- /dev/null
+++ b/test-scheduler/ui/src/components/env_component/service_api.vue
@@ -0,0 +1,112 @@
+<template>
+ <div class="panel panel-success">
+ <div class="panel-heading">
+ <button type="button" class="btn btn-xs btn-danger pull-right" v-on:click="deleteApi(name)">Delete</button>
+ <h5 class="panel-title">
+ <a data-toggle="collapse" data-parent="panelParent" v-bind:href="'#' + name + '-collapse'" style="display:block;">{{ name }}</a>
+ </h5>
+ </div>
+ <div v-bind:id="name + '-collapse'" class="panel-collapse collapse fade">
+ <div class="panel-body">
+ <base-input name="name" v-model="name"></base-input>
+ <base-input name="method" v-model="method"></base-input>
+ <base-input name="baseuri" v-model="baseuri"></base-input>
+ <api-param v-bind:params="params"></api-param>
+ <div class="form-group" v-bind:class="{ 'has-error': jsonSyntaxError}">
+ <label class="col-lg-3 control-label" id="templateLabel">
+ Template <i class="fa fa-question-circle"></i>
+ </label>
+ <div class="col-lg-7">
+ <!-- help text -->
+ <span id="tempHelp">Json格式文本,用于定义发送http请求的报文内容。示例如下:<br>( 其中 ((&lt;variable&gt;)) 为占位符,用于替换实际值 )<br>GET方式:<br>{<br> &nbsp;"uri" : "((baseuri))?name=((name))"<br>}<br>POST方式:<br>{<br> &nbsp;"uri" : "((baseuri))",<br> &nbsp;"body" : {<br>&nbsp;&nbsp;&nbsp;"name" : "((name))",<br>&nbsp;&nbsp;&nbsp;"account" : {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"id" : "((user_name))",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"addr" : "SH"<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;}<br>}</span>
+ <textarea class="form-control" style="min-height: 200px;" v-model="templateStr"></textarea>
+ <span class="help-block" v-show="jsonSyntaxError">Json语法错误,请检查!</span>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+</template>
+<script>
+import base_input from "./base_input.vue"
+import api_param from "./api_param.vue"
+import Vue from "vue"
+export default {
+ props: ['panelParent', 'name', 'method', 'baseuri', 'params', 'template'],
+ watch: {
+ name: function(val) {
+ this.$emit("name", val);
+ },
+ method: function(val) {
+ this.$emit("method", val);
+ },
+ baseuri: function(val) {
+ this.$emit("baseuri", val);
+ },
+ params: function(val) {
+ this.$emit("params", val);
+ },
+ templateStr: function(val) {
+ try {
+ console.log(JSON.parse(val));
+ this.jsonSyntaxError = false;
+ this.$emit("template", JSON.parse(val));
+ } catch(err) {
+ console.log("catch the exception templateStr");
+ this.jsonSyntaxError = true;
+ }
+ }
+ },
+ components: {
+ 'base-input': base_input,
+ 'api-param': api_param
+ },
+ data: function() {
+ return {
+ jsonSyntaxError: false,
+ templateStr: JSON.stringify(this.template, null, 2)
+ };
+ },
+ methods: {
+ deleteApi: function(apiName) {
+ this.$emit("delete", apiName);
+ }
+ }
+}
+</script>
+<style scoped>
+#templateLabel:hover+div #tempHelp{
+ display: block;
+}
+#tempHelp {
+ display: none;
+ position: absolute;
+ width: 90%;
+ min-height: 150px;
+ background-color: #ab2d2d;
+ color: white;
+ transition: display 1s;
+ text-align: left;
+ padding: 10px 16px;
+ z-index: 2;
+ font-size: 10px;
+ opacity: 0.9;
+}
+#tempHelp::after {
+ content: '';
+ position: absolute;
+ bottom: 92%;
+ right: 100%;
+ margin-left: -5px;
+ border-width: 5px;
+ border-style: solid;
+ border-color: transparent #ab2d2d transparent transparent;
+}
+@media(max-width:1200px) {
+ #tempHelp::after {
+ bottom: 100%;
+ left: 5%;
+ border-color: transparent transparent #ab2d2d transparent;
+ }
+}
+</style>
diff --git a/test-scheduler/ui/src/components/env_component/service_modal.vue b/test-scheduler/ui/src/components/env_component/service_modal.vue
new file mode 100644
index 00000000..ea2f0cbb
--- /dev/null
+++ b/test-scheduler/ui/src/components/env_component/service_modal.vue
@@ -0,0 +1,193 @@
+<template>
+ <div class="modal inmodal fade" id="myModal">
+ <div class="modal-dialog modal-lg">
+ <div class="modal-content animated">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal">
+ <span aria-hidden="true">&times;</span><span class="sr-only">Close</span>
+ </button>
+ <h3 class="modal-title">{{type.service}}</h3>
+ </div>
+ <div class="modal-body">
+ <div class="row">
+ <form method="get" class="form-horizontal">
+ <div id="service-address">
+ <button class="btn btn-default">Basic</button>
+ <div class="form-group">
+ <label class="col-sm-3 control-label">name</label>
+ <div class="col-sm-7">
+ <input type="text" class="form-control service-title" v-model="type.service" placeholder="please input service name.">
+ </div>
+ </div>
+ <div class="form-group">
+ <label class="col-sm-3 control-label">ip</label>
+ <div class="col-sm-7"><input type="text" class="form-control" v-model="ip"></div>
+ </div>
+ <div class="form-group">
+ <label class="col-sm-3 control-label">port</label>
+ <div class="col-sm-7"><input type="text" class="form-control" v-model="port"></div>
+ </div>
+ </div>
+ <div class="hr-line-dashed"></div>
+ <div id="service-apis">
+ <div id="apis-nav">
+ <button class="btn btn-default">Apis</button>
+ </div>
+ <br />
+ <div id="api-panels" class="api col-sm-offset-1 col-sm-10">
+ <div class="panel-group" id="accordion">
+ <service-api v-for="api in apis" panel-parent="#accordion" v-bind="api" v-on:name="api.name = $event" v-on:method="api.method = $event" v-on:baseuri="api.baseuri = $event" v-on:params="api.params = $event" v-on:template="api.template = $event" v-on:delete="removeApi"></service-api>
+ </div>
+ <button type="button" class="btn btn-primary pull-right" v-on:click="addNewApi()">New</button>
+ </div>
+ </div>
+ </form>
+ </div>
+ </div>
+ <div class="modal-footer">
+ <button type="button" class="btn btn-white" data-dismiss="modal">Close</button>
+ <button type="button" class="btn btn-primary" v-on:click="save()">Save changes</button>
+ </div>
+ </div>
+ </div>
+ </div>
+</template>
+<script>
+import service_api from "./service_api.vue";
+import showMessage from '../message/showMessage.js'
+export default {
+ props: ['type'],
+ data: function() {
+ return {
+ typeTag: this.type.tag,
+ ip: "",
+ port: "",
+ apis: []
+ }
+ },
+ created: function() {
+ },
+ watch: {
+ type: {
+ handler: function(newVal, oldVal) {
+ console.log("###########type is changed!");
+ if(newVal.content) {
+ var content = newVal.content;
+ this.ip = content.ip;
+ this.port = content.port;
+ this.apis = content.apis;
+ console.log(this.apis);
+ } else {
+ this.resetModalData();
+ }
+ console.log("end!");
+ },
+ deep: true
+ }
+ },
+ methods: {
+ addNewApi: function() {
+ var newApi = {'name': 'new', 'method': 'GET', 'baseuri': '', 'params': [], 'template': {"uri": "((baseuri))"}};
+ this.apis.push(newApi);
+ },
+ removeApi: function(name) {
+ for(var i = 0; i < this.apis.length; i++) {
+ if(name == this.apis[i]['name']) {
+ this.apis.splice(i, 1);
+ }
+ }
+ },
+ save: function() {
+ if(this.ip == "") {
+ showMessage("warning", "SERVICE", "ip is not filled!");
+ return;
+ } else if (this.port == "") {
+ showMessage("warning", "SERVICE", "port is not filled!");
+ return;
+ } else if (this.type.service == "") {
+ showMessage("warning", "SERVICE", "service name is not filled!");
+ return;
+ }
+ if(this.type.edit == true) {
+ this.saveEdition();
+ } else {
+ this.saveCreation();
+ }
+ this.resetModalData();
+ $("#myModal").modal("hide");
+ },
+ saveEdition: function() {
+ var self = this;
+ var msgTitle = "SAVE -- SERVICE";
+ $.ajax({
+ url: this.global.SERVER_ADDR + "env/editService",
+ method: "post",
+ data: {
+ "oldName": self.type.originName,
+ "newName": self.type.service,
+ "ip": self.ip,
+ "port": self.port,
+ "apis": JSON.stringify(self.apis),
+ },
+ success: function(data) {
+ if(data['code'] == 200) {
+ showMessage("success", msgTitle, "Save service <strong>" + self.type.service + "</strong> successfully!");
+ } else {
+ showMessage(data['code'], msgTitle, "Failed to save service <strong>" + self.type.service + "</strong>!", data['error']);
+ }
+ },
+ error: function() {
+ showMessage("error", msgTitle, "Failed to save service <strong>" + self.type.service + "</strong>!", msg);
+ }
+ });
+ var edition = {
+ 'oldName': this.type.originName,
+ 'newName': this.type.service
+ };
+ this.$emit("service-edition", edition);
+ },
+ saveCreation: function() {
+ console.log("save creation!!!");
+ var self = this;
+ var msgTitle = "CREATE -- SERVICE";
+ $.ajax({
+ url: this.global.SERVER_ADDR + "env/createService",
+ method: "post",
+ data: {
+ "name": self.type.service,
+ "ip": self.ip,
+ "port": self.port,
+ "apis": JSON.stringify(self.apis)
+ },
+ success: function(data) {
+ if(data['code'] == 200) {
+ showMessage("success", msgTitle, "Create <strong>"+ self.type.service + "</strong> successfully!");
+ } else {
+ showMessage(data['code'], msgTitle, "Failed to create service <strong>" + self.type.service + "</strong>!", data['error']);
+ self.$emit("creation-fail", self.type.service);
+ }
+ },
+ error: function() {
+ showMessage("error", msgTitle, "Failed to create service <strong>" + self.type.service + "</strong>!", msg);
+ self.$emit("creation-fail", self.type.service);
+ }
+ });
+ this.$emit("service-creation", this.type.service);
+ },
+ resetModalData: function() {
+ this.ip = "";
+ this.port = "";
+ this.apis = [];
+ },
+ getData: function() {
+ console.log("apis:");
+ for(i in this.apis) {
+ console.log(this.apis[i]);
+ }
+ }
+ },
+ components: {
+ 'service-api': service_api
+ }
+}
+</script>
diff --git a/test-scheduler/ui/src/components/environment.vue b/test-scheduler/ui/src/components/environment.vue
new file mode 100644
index 00000000..2e8ee014
--- /dev/null
+++ b/test-scheduler/ui/src/components/environment.vue
@@ -0,0 +1,239 @@
+<template>
+<div class="wrapper wrapper-content">
+ <div class="row">
+ <div class="col-lg-offset-2 col-lg-8">
+ <div class="ibox">
+ <div class="ibox-content">
+ <h1>CONTEXT <i class="fa fa-question-circle"></i></h1>
+ <div class="row">
+ <div class="col-md-offset-1 col-md-10">
+ <textarea v-model="context" id="context-content" style="white-space:nowrap; overflow:scroll; font-size: 16px; padding: 4px; width: 100%; min-height: 300px; max-height: 300px;">
+ </textarea>
+ <button type="button" class="btn btn-primary pull-right" v-on:click="saveContext()">Save</button>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-lg-offset-2 col-lg-8">
+ <div class="ibox">
+ <div class="ibox-content">
+ <h1>Service</h1>
+ <div class="service-table">
+ <table id="serviceList" class="table table-bordered table-hover text-center">
+ <thead>
+ <tr>
+ <th class="text-center">No</th>
+ <th class="text-center">Service</th>
+ <th class="text-center">Time</th>
+ <th class="text-center">Operation</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr v-for="service in serviceList" v-on:click="editService(service.name)" style="cursor: pointer;">
+ <td style="vertical-align: middle;">{{ service.id }}</td>
+ <td style="vertical-align: middle;">{{ service.name }}</td>
+ <td style="vertical-align: middle;">{{ service.time }}</td>
+ <td style="vertical-align: middle;"><button type="button" class="btn btn-white" v-on:click.stop="deleteService(service.name)"><i class="fa fa-trash"></i></button>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <div>
+ <button class="btn btn-lg btn-success" style="float:right;" v-on:click="addNewService()"> Add </button>
+ </div>
+ </div>
+ <!-- modal of one service -->
+ <div class="row">
+ <service-modal v-bind:type="type" v-on:service-creation="plusAService" v-on:service-edition="editAServiceName" v-on:creation-fail="creationFailHandler"></service-modal>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+</template>
+<script>
+import Vue from 'vue'
+import service_modal from "./env_component/service_modal.vue"
+import showMessage from './message/showMessage.js'
+export default {
+ name: 'environment',
+ data: function() {
+ return {
+ serviceList: [],
+ type: {
+ edit: true,
+ service: "ansible",
+ tag: "default"
+ },
+ context: ''
+ }
+ },
+ components: {
+ 'service-modal': service_modal
+ },
+ created: function() {
+ var self = this;
+ var msgTitle = "GET -- SERVICE LIST";
+ var errorInfo = 'Unable to get the service list';
+ $.ajax({
+ url: this.global.SERVER_ADDR + "env/getAllServices",
+ method: "GET",
+ success: function(data) {
+ if(data['code'] == 200) {
+ self.serviceList = data['result'];
+ } else {
+ showMessage(data['code'], msgTitle, errorInfo, data['error']);
+ }
+ },
+ error: function(obj, status, msg) {
+ showMessage("error", msgTitle, errorInfo, msg);
+ }
+ });
+ $.ajax({
+ url: this.global.SERVER_ADDR + "env/getContext",
+ method: "GET",
+ success: function(data) {
+ if(data['code'] == 200) {
+ self.context = data['result']['context'];
+ } else {
+ showMessage(data['code'], msgTitle, errorInfo, data['error']);
+ }
+ },
+ error: function(obj, status, msg) {
+ showMessage("error", msgTitle, errorInfo, msg);
+ }
+ });
+ },
+ methods: {
+ addNewService: function(){
+ this.type.edit = false;
+ this.type.tag = "abc";
+ this.type.service = null;
+ this.type.originName = null;
+ if(this.type.content){
+ this.type.content = null;
+ }
+ $("#myModal").modal("show");
+ },
+ plusAService: function(serviceName){
+ var item = {'id': '', 'name': '', 'time': ''};
+ item['id'] = this.serviceList[this.serviceList.length - 1]['id'] + 1;
+ item['name'] = serviceName;
+ item['time'] = this.getFormatDate(new Date());
+ this.serviceList.push(item);
+ },
+ editAServiceName: function(edition) {
+ for(var i = 0;i < this.serviceList.length; i++) {
+ if(edition['oldName'] == this.serviceList[i]['name']) {
+ this.serviceList[i]['name'] = edition['newName'];
+ }
+ }
+ },
+ editService: function(serviceName){
+ this.type.edit = true;
+ this.type.tag = "abc";
+ this.type.service = serviceName;
+ this.type.originName = serviceName;
+ if(this.type.content){
+ this.type.content = null;
+ }
+ console.log(this.type);
+ var self = this;
+ var msgTitle = "GET -- SERVICE";
+ var errorInfo = "Unable to get the service: <strong>" + self.type.service + "</strong>";
+ $.ajax({
+ url: this.global.SERVER_ADDR + "env/getService",
+ method: "GET",
+ data: {
+ "serviceName": serviceName
+ },
+ success: function(data) {
+ if(data['code'] == 200) {
+ self.type.tag = "hhh";
+ self.type.content = data['result'];
+ self.type.originName = self.type.service;
+ } else {
+ showMessage(data['code'], msgTitle, errorInfo, data['error']);
+ }
+ },
+ error: function(obj, status, msg) {
+ showMessage("error", msgTitle, errorInfo, msg);
+ }
+ });
+ $("#myModal").modal("show");
+ },
+ deleteService: function(serviceName){
+ var msgTitle = "DELETE -- SERVICE";
+ $.ajax({
+ url: this.global.SERVER_ADDR + "env/deleteService",
+ method: "POST",
+ data: {
+ "serviceName": serviceName
+ },
+ success: function(data) {
+ if(data['code'] == 200) {
+ showMessage(data['code'], msgTitle, "Delete <strong>" + serviceName + "</strong> successfully.");
+ } else {
+ showMessage(data['code'], msgTitle, "Failed to delete <strong>" + serviceName + "</strong>", data['error']);
+ }
+ },
+ error: function(obj, status, msg) {
+ showMessage("error", msgTitle, "Failed to delete <strong>" + serviceName + "</strong>", msg);
+ }
+ });
+ for(var i = 0;i < this.serviceList.length; i++) {
+ if(serviceName == this.serviceList[i]['name']) {
+ this.serviceList.splice(i, 1);
+ }
+ }
+ },
+ creationFailHandler: function(serviceName) {
+ for(var i = 0; i < this.serviceList.length; i++) {
+ if(serviceName == this.serviceList[i].name) {
+ this.serviceList.splice(i, 1);
+ }
+ }
+ },
+ getFormatDate: function(date) {
+ var year = date.getFullYear();
+ var month = date.getMonth() + 1;
+ var strDate = date.getDate();
+ var seperator = "-";
+ if(month >= 1 && month <= 9) {
+ month = "0" + month;
+ }
+ if(strDate >= 1 && strDate <= 9) {
+ strDate = "0" + strDate;
+ }
+ var formatDate = year + seperator + month + seperator + strDate;
+ return formatDate;
+ },
+ saveContext: function() {
+ var self = this;
+ var msgTitle = "SAVE -- CONTEXT";
+ var errorInfo = "Failed to save context!";
+ $.ajax({
+ url: this.global.SERVER_ADDR + "env/editContext",
+ method: "POST",
+ data: {
+ context: self.context
+ },
+ success: function(data) {
+ if(data['code'] == 200) {
+ showMessage(data['code'], msgTitle, "Save context successfully!");
+ } else {
+ showMessage(data['code'], msgTitle, errorInfo, data['error']);
+ }
+ },
+ error: function(obj, status, msg) {
+ showMessage("error", msgTitle, errorInfo, msg);
+ }
+ });
+ }
+ }
+}
+</script>
diff --git a/test-scheduler/ui/src/components/message/showMessage.js b/test-scheduler/ui/src/components/message/showMessage.js
new file mode 100644
index 00000000..2ac203e7
--- /dev/null
+++ b/test-scheduler/ui/src/components/message/showMessage.js
@@ -0,0 +1,30 @@
+import toastr from '../../assets/js/toastr.min.js'
+export default function(type, title, info, detail="") {
+ if(typeof type == "number") {
+ if(200 <= type && type < 300) {
+ type = "success";
+ } else if (300 <= type && type < 500) {
+ type = "warning";
+ } else if (500 <= type) {
+ type = "error";
+ } else {
+ type = "info";
+ }
+ }
+ if(detail != "") {
+ detail = "* <strong>detail:</strong> " + detail;
+ }
+ var content = "<br>* " + info + "<br><br>" + detail;
+ if(type == "success"){
+ toastr.success(content, title);
+ }
+ else if(type == "info") {
+ toastr.info(content, title);
+ }
+ else if(type == "error"){
+ toastr.error(content, title);
+ }
+ else {
+ toastr.warning(content, title);
+ }
+}
diff --git a/test-scheduler/ui/src/components/testcase.vue b/test-scheduler/ui/src/components/testcase.vue
new file mode 100644
index 00000000..9c8ef85e
--- /dev/null
+++ b/test-scheduler/ui/src/components/testcase.vue
@@ -0,0 +1,349 @@
+<template>
+ <div class="wrapper wrapper-content animated fadeIn">
+ <div class="row" style="margin-bottom: 20px;">
+ <div class="col-md-8">
+ <ol class="breadcrumb" style="padding-left: 20px; font-size: 17px;">
+ <li>
+ <router-link to="/" >root</router-link>
+ </li>
+ <li>
+ <router-link :to="{ path: '/testcase', query: { name: sname }}"><b>{{this.$route.query.name}}</b></router-link>
+ </li>
+ </ol>
+ </div>
+ </div>
+ <div id="page-content" style="" class="row">
+ <div class="col-lg-8">
+ <div class="ibox">
+ <div class="ibox-title">
+ <h5 style="font-size:26px;margin-top: -3px;">Test Case</h5>
+ <div class="ibox-tools">
+ <button class="btn btn-info btn-sm my-button-sm" type="button" v-on:click="runMultiTestcase()">Run</button>
+ <button class="btn btn-success btn-sm my-button-sm" type="button" v-on:click="create()">Create</button>
+ <button class="btn btn-danger btn-sm my-button-sm" v-on:click="deleteCases()" type="button">Delete</button>
+ <a class="collapse-link">
+ <i class="fa fa-chevron-up"></i>
+ </a>
+ <a class="fullscreen-link">
+ <i class="fa fa-expand"></i>
+ </a>
+ </div>
+ </div>
+ <div class="ibox-content" style="text-align:center;">
+ <table class="my-table table table-bordered" cellspacing="0" cellpadding="0" style="text-align: center;">
+ <thead>
+ <tr>
+ <td class="checkbox1" style="width:20px"><input type="checkbox" v-model="selectAll"> All</td>
+ <td class="smallbox" style="with:250px;">TestCase Name</td>
+ </tr>
+ </thead>
+ <tbody>
+ <tr v-for="testcase in testcases">
+ <td><input class="checkbox1" style="width:20px" type="checkbox" v-model="selected" :value="testcase.testcase"> </td>
+ <td class="smallbox" style="with:250px;"><router-link :to="{ path: '/content', query: { suiteName: sname, caseName: testcase.testcase } }">{{testcase.testcase}}</router-link></td>
+ </tr>
+ </tbody>
+ <tfoot id="create-box" style="display: none">
+ <tr>
+ <td class="checkbox1" style="width:20px"><input type="checkbox"> </td>
+ <td class="smallbox" style="with:250px;"><input type="text" v-model="newCase" @keydown.enter="additem" ></td>
+ </tr>
+ </tfoot>
+ </table>
+ </div>
+ </div>
+ </div>
+ </div>
+ <hr />
+ <div class="row">
+ <div class="col-lg-12">
+ <div class="ibox">
+ <div class="ibox-title">
+ <h5 style="font-size:26px;margin-top: -3px;">Workflow</h5>
+ <div class="ibox-tools">
+ <a class="collapse-link">
+ <i class="fa fa-chevron-up"></i>
+ </a>
+ <a class="fullscreen-link">
+ <i class="fa fa-expand"></i>
+ </a>
+ </div>
+ </div>
+ <div class="ibox-content" style="padding-top: 30px;">
+ <div id="executing" class="row" style="padding: 0 30px 60px;">
+ <div class="col-md-offset-2 col-md-8">
+ <div class="table-responsive">
+ <table class="table text-center" style="margin-top: 30px;">
+ <thead>
+ <tr>
+ <th class="text-center">#</th>
+ <th class="text-center">testcase</th>
+ <th class="text-center">status</th>
+ <th class="text-center">operation</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr v-for="testcase in runTestcases">
+ <td>{{ testcase.id }}</td>
+ <td>{{ testcase.testcase }}</td>
+ <td><span class="badge" v-bind:class="'badge-' + statusClass(testcase.status)">{{ testcase.status }}</span></td>
+ <td>
+ <div style="display: inline-block;min-width: 130px;">
+ <button class="btn btn-primary btn-outline btn-xs fadeIn" v-on:click="runTestcase()" v-show="testcase.status == 'failed'">rerun</button>
+ <button class="btn btn-primary btn-outline btn-xs fadeIn" v-on:click="runNextCase($event.target)" v-show="testcase.status == 'failed'">run next one</button>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+ <hr class="hr-line-solid">
+ <div class="row" style="margin-top: 60px;">
+ <wfresult v-bind:workflowId="workflowId" v-bind:wfloading='wfloading' v-bind:wfJson='wfJson' v-on:wfComplete="wfComplete = $event"></wfresult>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+</template>
+<script>
+import wfresult from './workflow_graph/wfresult.vue'
+import showMessage from './message/showMessage.js'
+export default {
+ name: 'testcase',
+ data () {
+ return {
+ testcases: [],
+ sname: this.$route.query.name,
+ newCase:'',
+ addstory:'',
+ workflowId: '',
+ wfloading: false,
+ wfJson: '',
+ selected: [],
+ curRunningId: 0,
+ runTestcases: [],
+ wfComplete: false
+ }
+ },
+ created: function() {
+ var self = this;
+ var msgTitle = "GET -- TESTCASES";
+ var errorInfo = "Failed to get testcase list.";
+ $.ajax({
+ url: this.global.SERVER_ADDR + "testsuite/content",
+ method:"GET",
+ data:{
+ suiteName: this.$route.query.name
+ },
+ success:function (data) {
+ if(data['code'] == 200) {
+ self.testcases = data['result'];
+ } else {
+ showMessage(data['code'], msgTitle, errorInfo, data['error']);
+ }
+ },
+ error: function(obj, status, msg) {
+ showMessage(status, msgTitle, errorInfo, msg);
+ }
+ });
+ },
+ computed: {
+ selectAll: {
+ get: function () {
+ return this.testcases ? this.selected.length == this.testcases.length : false;
+ },
+ set: function (value) {
+ var selected = [];
+ if (value) {
+ this.testcases.forEach(function (testcase) {
+ selected.push(testcase.testcase);
+ });
+ }
+ this.selected = selected;
+ }
+ }
+ },
+ methods:{
+ create: function () {
+ var cbox = document.getElementById("create-box");
+ cbox.style.display = "table-footer-group";
+ },
+ additem: function () {
+ var self = this;
+ var msgTitle = "CREATE -- TESTCASE";
+ const caseName = self.newCase.trim();
+ if(caseName)
+ {
+ $.ajax({
+ url: this.global.SERVER_ADDR + "testcase/new",
+ method:"POST",
+ data:{
+ suiteName: self.sname,
+ caseName: caseName
+ },
+ success:function (data) {
+ if(data['code'] == 200){
+ self.testcases.push({
+ id: self.testcases.length + 1 ,
+ testcase: caseName,
+ });
+ showMessage(data['code'], msgTitle, "Create <strong>" + caseName + "</strong> succesfully!");
+ } else {
+ showMessage(data['code'], msgTitle, "Failed to create <strong>" + caseName + "</strong>!", data['error']);
+ }
+ },
+ error: function(obj, status, msg) {
+ showMessage(status, msgTitle, "Failed to create <strong>" + caseName + "</strong>!", msg);
+ }
+ });
+ }
+ var cbox = document.getElementById("create-box");
+ cbox.style.display = "none";
+ this.newCase = '';
+ },
+ deleteCases:function () {
+ var self = this;
+ var msgTitle = "DELETE -- TESTCASE";
+ var deleteArr = self.selected.slice(0);
+ self.testcases = self.testcases.filter(item => {
+ for(var i in deleteArr) {
+ if(item.testcase == deleteArr[i]) {
+ return false;
+ }
+ }
+ return true;
+ });
+ self.selected = [];
+ for(var i in deleteArr)
+ {
+ $.ajax({
+ url: this.global.SERVER_ADDR + "testcase/delete",
+ method: "POST",
+ data: {
+ suiteName: self.sname,
+ caseName: deleteArr[i]
+ },
+ success: function(data) {
+ if(data['code'] == 200){
+ showMessage(data['code'], msgTitle, "Delete <strong>" + deleteArr[i] + "</strong> succesfully!");
+ } else {
+ showMessage(data['code'], msgTitle, "Failed to delete <strong>" + deleteArr[i] + "</strong>!", data['error']);
+ }
+ },
+ error: function(obj, status, msg) {
+ showMessage(status, msgTitle, "Failed to delete <strong>" + deleteArr[i] + "</strong>!", msg);
+ }
+ });
+ }
+ },
+ runMultiTestcase: function() {
+ var self = this;
+ var msgTitle = "RUN -- TESTCASES";
+ self.runTestcases = [];
+ if(self.selected.length == 0) {
+ showMessage("warning", msgTitle, "please select one!");
+ return;
+ }
+ for(var i=0; i < self.selected.length; i++) {
+ var testcaseItem = {'id': i, 'testcase': '', 'status': "waiting"};
+ testcaseItem['testcase'] = self.selected[i];
+ self.runTestcases.push(testcaseItem);
+ }
+ self.curRunningId = 0;
+ showMessage("info", msgTitle, "start to run <strong>testcases</strong>");
+ self.runOneTestcase();
+ },
+ runOneTestcase: function() {
+ var self = this;
+ var msgTitle = "RUN -- TESTCASE";
+ if (self.curRunningId == self.runTestcases.length) {
+ self.curRunningId = 0;
+ return;
+ }
+ self.wfComplete = false;
+ var i = self.curRunningId;
+ self.runTestcases[i]['status'] = "running";
+ $.ajax({
+ url: self.global.SERVER_ADDR + "execute/testcase",
+ method: "POST",
+ data: {
+ "suiteName": self.sname,
+ "caseName": self.runTestcases[self.curRunningId]['testcase']
+ },
+ beforeSend: function(XHR) {
+ self.wfloading = true;
+ },
+ success: function(data) {
+ if(data['code'] == 200) {
+ self.workflowId = data['result']['workflowId'];
+ $.ajax({
+ url: self.global.SERVER_ADDR + "story-content",
+ method: "GET",
+ data: {
+ "service": self.sname,
+ "story": self.runTestcases[self.curRunningId]['testcase']
+ },
+ success: function(data) {
+ if(data['code'] == 200) {
+ self.wfJson = data['result']['content'];
+ } else {
+ showMessage(data['code'], msgTitle, "workflow.json get failed!");
+ }
+ },
+ error: function(obj, status, msg) {
+ showMessage(status, msgTitle, msg);
+ }
+ });
+ } else {
+ var i = self.curRunningId;
+ self.runTestcases[i]['status'] = "failed";
+ self.wfloading = false;
+ showMessage(data['code'], msgTitle, "Failed to run <strong>" + self.runTestcases[i]['testcase'] + "</strong>", data['error']);
+ }
+ },
+ error: function(obj, status, msg) {
+ var i = self.curRunningId;
+ self.runTestcases[i]['status'] = "failed";
+ self.wfloading = false;
+ showMessage(status, msgTitle, "Failed to run <strong>" + self.runTestcases[i]['testcase'] + "</strong>", msg);
+ }
+ });
+ },
+ statusClass: function(status) {
+ if(status == "waiting") {
+ return "success";
+ }
+ if(status == "running") {
+ return "warning";
+ }
+ if(status == "pass") {
+ return "primary";
+ }
+ if(status == "failed") {
+ return "danger";
+ }
+ },
+ runNextCase: function(obj) {
+ $(obj).parent().css({"display": "none"});
+ var i = this.curRunningId++;
+ this.runOneTestcase();
+ }
+ },
+ watch: {
+ wfComplete: function(val) {
+ if(val == false) return;
+ this.wfloading = false;
+ var i = this.curRunningId++;
+ this.runTestcases[i]['status'] = "pass";
+ this.runOneTestcase();
+ }
+ },
+ components: {
+ wfresult
+ }
+}
+</script>
diff --git a/test-scheduler/ui/src/components/testcase_content.vue b/test-scheduler/ui/src/components/testcase_content.vue
new file mode 100644
index 00000000..49169cee
--- /dev/null
+++ b/test-scheduler/ui/src/components/testcase_content.vue
@@ -0,0 +1,215 @@
+<template>
+ <div class="wrapper wrapper-content animated fadeIn">
+ <div class="row" style="margin-bottom: 20px;">
+ <div class="col-md-8">
+ <ol class="breadcrumb" style="padding-left: 20px; font-size: 17px;">
+ <li>
+ <router-link to="/" >root</router-link>
+ </li>
+ <li>
+ <router-link :to="{ path: '/testcase', query: { name: suitename }}" >{{this.$route.query.suiteName}}</router-link>
+ </li>
+ <li>
+ <router-link :to="{ path: '/content', query: { suiteName: suitename, caseName: casename } }"><b>{{this.$route.query.caseName}}</b></router-link>
+ </li>
+ </ol>
+ </div>
+ </div>
+ <div id="page-content" class="row">
+ <div class="col-lg-12">
+ <div class="ibox">
+ <div class="ibox-title">
+ <h5 style="font-size:26px;margin-top: -3px;">Test Case Content</h5>
+ <div v-show="contentLoading || contentSaving" class="sk-spinner sk-spinner-circle" style="float: left;margin-left: 10px;">
+ <div class="sk-circle1 sk-circle"></div>
+ <div class="sk-circle2 sk-circle"></div>
+ <div class="sk-circle3 sk-circle"></div>
+ <div class="sk-circle4 sk-circle"></div>
+ <div class="sk-circle5 sk-circle"></div>
+ <div class="sk-circle6 sk-circle"></div>
+ <div class="sk-circle7 sk-circle"></div>
+ <div class="sk-circle8 sk-circle"></div>
+ <div class="sk-circle9 sk-circle"></div>
+ <div class="sk-circle10 sk-circle"></div>
+ <div class="sk-circle11 sk-circle"></div>
+ <div class="sk-circle12 sk-circle"></div>
+ </div>
+ <div class="ibox-tools">
+ <button class="btn btn-info btn-sm my-button-sm" type="button" v-on:click="runTestcase()">Run</button>
+ <button class="btn btn-success btn-sm my-button-sm" type="button" v-on:click="setEditable()">Edit</button>
+ <button v-show="isEditable" class="btn btn-warning btn-sm my-button-sm" v-on:click="saveTestcase()" type="button">Save</button>
+ <button v-show="isEditable" class="btn btn-danger btn-sm my-button-sm" v-on:click="cancelEdit()" type="button">Cancel</button>
+ <a class="collapse-link">
+ <i class="fa fa-chevron-up"></i>
+ </a>
+ <a class="fullscreen-link">
+ <i class="fa fa-expand"></i>
+ </a>
+ </div>
+ </div>
+ <div class="ibox-content" style="max-height: 600px; overflow-y: auto; padding: 0; border: 1px solid #e7e7e7;">
+ <div style='text-align:center;'>
+ <textarea v-show='!isEditable' v-model="content" id="tc_content" style="white-space:nowrap; overflow:scroll;max-width:2400px; width: 100%;height: 100%;min-height: 500px;font-size:16px;border:none; vertical-align: middle; padding: 30px 0 20px 40px;">
+ </textarea>
+ </div><editor v-show='isEditable' v-bind:saveSignal='saveSignal' v-bind = 'editorContent' v-on:saveResponse='processSaveResponse'></editor>
+ </div>
+ </div>
+ </div>
+ </div>
+ <hr />
+ <div class="row">
+ <div class="col-lg-12">
+ <div class="ibox">
+ <div class="ibox-title">
+ <h5 style="font-size:26px;margin-top: -3px;">Workflow</h5>
+ <div class="ibox-tools">
+ <a class="collapse-link">
+ <i class="fa fa-chevron-up"></i>
+ </a>
+ <a class="fullscreen-link">
+ <i class="fa fa-expand"></i>
+ </a>
+ </div>
+ </div>
+ <div class="ibox-content" style="padding-top: 60px;">
+ <wfresult v-bind:workflowId="workflowId" v-bind:wfloading='wfloading' v-bind:wfJson='wfJson'></wfresult>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+</template>
+<script>
+import editor from './editor/editor.vue'
+import wfresult from './workflow_graph/wfresult.vue'
+import showMessage from './message/showMessage.js'
+export default {
+ name: 'testcase_content',
+ data () {
+ return {
+ content: '',
+ editorContent: {'stepList': [], 'mainOrdersList': [], 'subflowList': []},
+ bakContent: '',
+ isEditable: false,
+ contentLoading: false,
+ contentSaving: false,
+ suitename:this.$route.query.suiteName,
+ casename:this.$route.query.caseName,
+ workflowId: '',
+ wfloading: false,
+ wfJson: '',
+ saveSignal: false
+ }
+ },
+ created: function() {
+ this.getTestcase();
+ },
+ methods: {
+ setEditable: function(){
+ this.isEditable = true;
+ this.bakContent = this.content;
+ },
+ cancelEdit: function(){
+ this.content = this.bakContent;
+ this.isEditable = false;
+ },
+ saveTestcase: function(){
+ console.log("save");
+ this.saveSignal = true;
+ this.contentSaving = true;
+ },
+ runTestcase: function(){
+ var self = this;
+ var msgTitle = "RUN -- TESTCASE";
+ $.ajax({
+ url: this.global.SERVER_ADDR + "execute/testcase",
+ method: "POST",
+ data: {
+ "suiteName": this.$route.query.suiteName,
+ "caseName": this.$route.query.caseName
+ },
+ beforeSend: function(XHR) {
+ self.wfloading = true;
+ showMessage("info", msgTitle, "start to run <strong>" + self.$route.query.caseName + "</strong>");
+ },
+ success: function(data) {
+ if(data['code'] == 200) {
+ self.workflowId = data['result']['workflowId'];
+ showMessage(data['code'], msgTitle, "<strong>" + self.$route.query.caseName + "</strong> finished!");
+ $.ajax({
+ url: self.global.SERVER_ADDR + "story-content",
+ method: "GET",
+ data: {
+ "service": self.$route.query.suiteName,
+ "story": self.$route.query.caseName
+ },
+ success: function(data) {
+ if(data['code'] == 200) {
+ self.wfJson = data['result']['content'];
+ } else {
+ showMessage(data['code'], msgTitle, "workflow.json get failed!");
+ }
+ },
+ error: function(obj, status, msg) {
+ showMessage(status, msgTitle, msg);
+ }
+ });
+ } else {
+ self.wfloading = false;
+ showMessage(data['code'], msgTitle, "Failed to run <strong>" + self.$route.query.caseName + "</strong>", data['error']);
+ }
+ },
+ error: function(obj, status, msg) {
+ self.wfloading = false;
+ showMessage(status, msgTitle, "Failed to run <strong>" + self.$route.query.caseName + "</strong>", msg);
+ }
+ });
+ },
+ getTestcase: function(){
+ var self = this;
+ var msgTitle = "GET -- TESTCASE";
+ $.ajax({
+ url: this.global.SERVER_ADDR + "testcase/content",
+ method:"GET",
+ data:{
+ suiteName: this.$route.query.suiteName,
+ caseName: this.$route.query.caseName
+ },
+ beforeSend: function(XHR) {
+ self.contentLoading = true;
+ },
+ success:function (data) {
+ if(data['code'] == 200) {
+ self.content = data['result']['content'];
+ self.contentLoading = false;
+ self.editorContent = data['result']['editorContent'];
+ }
+ else {
+ showMessage("error", msgTitle, "fail to load testcase content!", data['error']);
+ self.contentLoading = false;
+ }
+ },
+ error: function (obj, status, msg) {
+ showMessage(status, msgTitle, "fail to load testcase content!", msg);
+ self.contentLoading = false;
+ }
+ });
+ },
+ async processSaveResponse(result) {
+ if(result == true) {
+ this.saveSignal = false;
+ this.isEditable = false;
+ this.contentSaving = false;
+ this.getTestcase();
+ } else {
+ this.saveSignal = false;
+ this.contentSaving = false;
+ }
+ }
+ },
+ components: {
+ editor,
+ wfresult
+ }
+}
+</script>
diff --git a/test-scheduler/ui/src/components/testsuite.vue b/test-scheduler/ui/src/components/testsuite.vue
new file mode 100644
index 00000000..5bdcbcc1
--- /dev/null
+++ b/test-scheduler/ui/src/components/testsuite.vue
@@ -0,0 +1,369 @@
+<template>
+ <div class="wrapper wrapper-content animated fadeIn">
+ <div class="row" style="margin-bottom: 20px;">
+ <div class="col-md-8">
+ <ol class="breadcrumb" style="padding-left: 20px; font-size: 17px;">
+ <li>
+ <router-link to="/" >root</router-link>
+ </li>
+ </ol>
+ </div>
+ </div>
+ <div id="page-content" class="row">
+ <div class="col-lg-8">
+ <div class="ibox">
+ <div class="ibox-title">
+ <h5 style="font-size:26px;margin-top: -3px;">Test Suite</h5>
+ <div class="ibox-tools">
+ <button class="btn btn-info btn-sm my-button-sm" type="button" v-on:click="runTestsuites()">Run</button>
+ <button class="btn btn-success btn-sm my-button-sm" type="button" v-on:click="createSuite()">Create</button>
+ <button class="btn btn-danger btn-sm my-button-sm" v-on:click="deleteSuites()" type="button">Delete</button>
+ <a class="collapse-link">
+ <i class="fa fa-chevron-up"></i>
+ </a>
+ <a class="fullscreen-link">
+ <i class="fa fa-expand"></i>
+ </a>
+ </div>
+ </div>
+ <div class="ibox-content" style="text-align:center;">
+ <table class="my-table table table-bordered" cellspacing="0" cellpadding="0" style="text-align: center;">
+ <thead>
+ <tr>
+ <td style="width:20px"><input type="checkbox" v-model="selectAll"> All</td>
+ <td class="smallbox" style="with:250px;">TestSuite Name</td>
+ </tr>
+ </thead>
+ <tbody>
+ <tr v-for="testsuite in testsuites">
+ <td><input style="width:20px" type="checkbox" v-model="selected" :value="testsuite.testsuite"> </td>
+ <td class="smallbox" style="with:250px;"><router-link :to="{ path: '/testcase', query: { name: testsuite.testsuite }}" >{{testsuite.testsuite}}</router-link></td>
+ </tr>
+ </tbody>
+ <tfoot id="create-box" style="display: none">
+ <tr>
+ <td style="width:20px"><input type="checkbox"> </td>
+ <td class="smallbox" style="with:250px;"><input type="text" v-model="newSuite" @keydown.enter="addItem" ></td>
+ </tr>
+ </tfoot>
+ </table>
+ </div>
+ </div>
+ </div>
+ </div>
+ <hr />
+ <div class="row">
+ <div class="col-lg-12">
+ <div class="ibox">
+ <div class="ibox-title">
+ <h5 style="font-size:26px;margin-top: -3px;">Workflow</h5>
+ <div class="ibox-tools">
+ <a class="collapse-link">
+ <i class="fa fa-chevron-up"></i>
+ </a>
+ <a class="fullscreen-link">
+ <i class="fa fa-expand"></i>
+ </a>
+ </div>
+ </div>
+ <div class="ibox-content" style="padding-top: 30px;">
+ <div id="executing" class="row" style="padding: 0 30px 60px;">
+ <div class="col-md-offset-2 col-md-8">
+ <div class="table-responsive">
+ <table class="table text-center" style="margin-top: 30px;">
+ <thead>
+ <tr>
+ <th class="text-center">#</th>
+ <th class="text-center">testcase</th>
+ <th class="text-center">status</th>
+ <th class="text-center">operation</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr v-for="testcase in casesInSuite">
+ <td>{{ testcase.id }}</td>
+ <td>{{ testcase.testcase }}</td>
+ <td><span class="badge" v-bind:class="'badge-' + statusClass(testcase.status)">{{ testcase.status }}</span></td>
+ <td>
+ <div style="display: inline-block;min-width: 130px;">
+ <button class="btn btn-primary btn-outline btn-xs fadeIn" v-on:click="runTestcase()" v-show="testcase.status == 'failed'">rerun</button>
+ <button class="btn btn-primary btn-outline btn-xs fadeIn" v-on:click="runNextCase($event.target)" v-show="testcase.status == 'failed'">run next one</button>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+ <hr class="hr-line-solid">
+ <div class="row" style="margin-top: 60px;">
+ <wfresult v-bind:workflowId="workflowId" v-bind:wfloading='wfloading' v-bind:wfJson='wfJson' v-on:wfComplete="wfComplete = $event"></wfresult>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+</template>
+<script>
+import wfresult from './workflow_graph/wfresult.vue'
+import showMessage from './message/showMessage.js'
+export default {
+ name: 'testsuite',
+ data () {
+ return {
+ newSuite : '',
+ testsuites : '',
+ service_selected : '',
+ workflowId: '',
+ wfloading: false,
+ wfJson: '',
+ selected: [],
+ casesInSuite: [],
+ running: {
+ suiteName: "",
+ caseName: ""
+ },
+ curRunningId: 0,
+ wfComplete: false
+ }
+ },
+ created: function() {
+ var self = this;
+ var msgTitle = "GET -- TESTSUITES";
+ var errorInfo = "Failed to get testsuite list.";
+ $.ajax({
+ url: this.global.SERVER_ADDR + "testsuite/list",
+ method:"GET",
+ data:{},
+ success:function (data) {
+ if(data['code'] == 200) {
+ self.testsuites = data['result'];
+ } else {
+ showMessage(data['code'], msgTitle, errorInfo, data['error']);
+ }
+ },
+ error: function(obj, status, msg) {
+ showMessage(status, msgTitle, errorInfo, msg);
+ }
+ });
+ },
+ computed: {
+ selectAll: {
+ get: function () {
+ return this.testsuites ? this.selected.length == this.testsuites.length : false;
+ },
+ set: function (value) {
+ var selected = [];
+ if (value) {
+ this.testsuites.forEach(function (story) {
+ selected.push(story.testsuite);
+ });
+ }
+ this.selected = selected;
+ }
+ }
+},
+ methods:{
+ createSuite: function () {
+ var cbox = document.getElementById("create-box");
+ cbox.style.display = "table-footer-group";
+ },
+ addItem: function () {
+ var self = this;
+ const suiteName = self.newSuite.trim();
+ if(suiteName)
+ {
+ var msgTitle = "CREATE -- TESTSUITE";
+ $.ajax({
+ url: this.global.SERVER_ADDR + "testsuite/new",
+ method:"POST",
+ data:{
+ suiteName:suiteName
+ },
+ success:function(data){
+ if(data['code'] == 200){
+ self.testsuites.push({
+ id: self.testsuites.length + 1 ,
+ testsuite: suiteName,
+ });
+ showMessage(data['code'], msgTitle, "Create <strong>" + suiteName + "</strong> succesfully!");
+ } else {
+ showMessage(data['code'], msgTitle, "Failed to create <strong>" + suiteName + "</strong>!", data['error']);
+ }
+ },
+ error: function(obj, status, msg) {
+ showMessage(status, msgTitle, "Failed to create <strong>" + suiteName + "</strong>!", msg);
+ }
+ })
+ }
+ var cbox = document.getElementById("create-box");
+ cbox.style.display = "none";
+ this.newSuite = '';
+ },
+ deleteSuites:function () {
+ var self = this;
+ var msgTitle = "DELETE -- TESTSUITE";
+ var deleteArr = self.selected.slice(0);
+ self.testsuites = self.testsuites.filter(item => {
+ for(var i in deleteArr) {
+ if(item.testsuite == deleteArr[i]) {
+ return false;
+ }
+ }
+ return true;
+ });
+ self.selected = [];
+ for(var i in deleteArr)
+ {
+ $.ajax({
+ url: this.global.SERVER_ADDR + "testsuite/delete",
+ method:"POST",
+ data:{
+ suiteName: deleteArr[i]
+ },
+ success:function (data) {
+ if(data['code'] == 200){
+ showMessage(data['code'], msgTitle, "Delete <strong>" + deleteArr[i] + "</strong> succesfully!");
+ } else {
+ showMessage(data['code'], msgTitle, "Failed to delete <strong>" + deleteArr[i] + "</strong>!", data['error']);
+ }
+ },
+ error: function(obj, status, msg) {
+ showMessage(status, msgTitle, "Failed to delete <strong>" + deleteArr[i] + "</strong>!", msg);
+ }
+ });
+ }
+ },
+ runTestsuites: function() {
+ var self = this;
+ var msgTitle = "RUN -- TESTSUITE";
+ if(self.selected.length == 0) {
+ showMessage("warning", msgTitle, "please select one!");
+ return;
+ } else if(self.selected.length != 1) {
+ showMessage("warning", msgTitle, "sorry, one suite at a time!");
+ return;
+ }
+ self.running.suiteName = self.selected[0];
+ $.ajax({
+ url: this.global.SERVER_ADDR + "testsuite/content",
+ method: "GET",
+ data: {
+ "suiteName": self.running.suiteName
+ },
+ success: function(data) {
+ if (data['code'] == 200) {
+ var caseList = data['result'];
+ if(caseList.length == 0) {
+ showMessage("info", msgTitle, "<strong>" + self.running.suiteName + "</strong> is empty!");
+ return;
+ }
+ for(var i=0; i < caseList.length; i++) {
+ caseList[i]['status'] = "waiting";
+ }
+ self.casesInSuite = caseList;
+ showMessage(data['code'], msgTitle, "Start to run <strong>" + self.running.suiteName + "</strong>");
+ self.runTestcase();
+ } else {
+ showMessage(data['code'], msgTitle, "Failed to run <strong>" + self.running.suiteName + "</strong>", data['error']);
+ }
+ },
+ error: function(obj, status, msg) {
+ showMessage(status, msgTitle, "Failed to run <strong>" + self.running.suiteName + "</strong>", msg);
+ }
+ });
+ },
+ runTestcase: function() {
+ var self = this;
+ var msgTitle = "RUN -- TESTCASE";
+ if (self.curRunningId == self.casesInSuite.length) {
+ self.curRunningId = 0;
+ return;
+ }
+ self.wfComplete = false;
+ var i = self.curRunningId;
+ self.casesInSuite[i]['status'] = "running";
+ self.running.caseName = self.casesInSuite[i]['testcase'];
+ $.ajax({
+ url: self.global.SERVER_ADDR + "execute/testcase",
+ method: "POST",
+ data: {
+ "suiteName": self.running.suiteName,
+ "caseName": self.running.caseName
+ },
+ beforeSend: function(XHR) {
+ self.wfloading = true;
+ },
+ success: function(data) {
+ if(data['code'] == 200) {
+ self.workflowId = data['result']['workflowId'];
+ $.ajax({
+ url: self.global.SERVER_ADDR + "story-content",
+ method: "GET",
+ data: {
+ "service": self.running.suiteName,
+ "story": self.running.caseName
+ },
+ success: function(data) {
+ if(data['code'] == 200) {
+ self.wfJson = data['result']['content'];
+ } else {
+ showMessage(data['code'], msgTitle, "workflow.json get failed!");
+ }
+ },
+ error: function(obj, status, msg) {
+ showMessage(status, msgTitle, msg);
+ }
+ });
+ } else {
+ var i = self.curRunningId;
+ self.casesInSuite[i]['status'] = "failed";
+ self.wfloading = false;
+ showMessage(data['code'], msgTitle, "Failed to run <strong>" + self.running.caseName + "</strong>", data['error']);
+ }
+ },
+ error: function(obj, status, msg) {
+ var i = self.curRunningId;
+ self.casesInSuite[i]['status'] = "failed";
+ self.wfloading = false;
+ showMessage(status, msgTitle, "Failed to run <strong>" + self.running.caseName + "</strong>", msg);
+ }
+ });
+ },
+ statusClass: function(status) {
+ if(status == "waiting") {
+ return "success";
+ }
+ if(status == "running") {
+ return "warning";
+ }
+ if(status == "pass") {
+ return "primary";
+ }
+ if(status == "failed") {
+ return "danger";
+ }
+ },
+ runNextCase: function(obj) {
+ $(obj).parent().css({"display": "none"});
+ var i = this.curRunningId++;
+ this.runTestcase();
+ }
+ },
+ watch: {
+ wfComplete: function(val) {
+ if(val == false) return;
+ this.wfloading = false;
+ var i = this.curRunningId++;
+ this.casesInSuite[i]['status'] = "pass";
+ // run the next testcase.
+ this.runTestcase();
+ }
+ },
+ components: {
+ wfresult
+ }
+}
+</script>
diff --git a/test-scheduler/ui/src/components/workflow_graph/wfresult.vue b/test-scheduler/ui/src/components/workflow_graph/wfresult.vue
new file mode 100644
index 00000000..a252870c
--- /dev/null
+++ b/test-scheduler/ui/src/components/workflow_graph/wfresult.vue
@@ -0,0 +1,236 @@
+<template>
+<div style="min-height: 600px; overflow-x: auto; overflow-y: auto;">
+ <div id="file-section1" class="col-md-4">
+ <div id="workflow-content-div">
+ <div class="dark-gray-bg" style="font-size: 17px; max-width: 500px; margin: 0 auto 10px;"> WORKFLOW.JSON CONTENT</div>
+ <pre class="white-pink" id="workflow-content" style="height: 600px; background-color:#f5f5f5;"></pre>
+ </div>
+ </div>
+ <div class="col-md-8" id="graph-show-section" style="">
+ <div v-show="!wfloading" style="margin-top: 10px;">
+ <div style="min-height: 30px; text-align: right;">
+ <button v-show="workflowId != '' && !wfCompletedFlag" class="btn" v-on:click="completeWF(1)" title="mark the status 'complete' by hand.">mark it <strong>complete</strong></button>
+ </div>
+ <div id="workflow-graph">
+ </div>
+ </div>
+ <div v-show="wfloading" class="spiner-example" id="loading">
+ <div class="sk-spinner sk-spinner-three-bounce">
+ <div class="sk-bounce1"></div>
+ <div class="sk-bounce2"></div>
+ <div class="sk-bounce3"></div>
+ </div>
+ </div>
+ <div class="row">
+ <div id="iframeContainer"></div>
+ <div id="workflowId" style="display:none">
+ <input name="workflowId" type="hidden" v-bind:value="workflowId" />
+ <input name="function" type="hidden" value="graphLoad" />
+ <button id="graphloadbtn" type="button" onclick="graphLoad()"></button>
+ </div>
+ </div>
+ </div>
+</div>
+</template>
+<script>
+export default {
+ props: ['workflowId', 'wfloading', 'wfJson'],
+ name: 'wfresult',
+ data: function() {
+ return {
+ frameLoadedFlag : false,
+ initalPaintFlag : false,
+ RESPONSE_TIME_LIMIT : 6000,
+ responseTimeCounter : 0,
+ wfCompletedFlag : false,
+ intervalTime : 1000,
+ timer: null
+ }
+ },
+ computed: {
+ wfget: function(){
+ return !this.wfloading;
+ }
+ },
+ watch: {
+ workflowId: function(val){
+ console.log("############## workflowId changed! " + val);
+ this.graphLoad();
+ },
+ wfJson: function(val){
+ this.fillWfContent(val);
+ }
+ },
+ mounted: function(){
+ window.clearInterval(this.timer);
+ },
+ destroyed: function(){
+ window.clearInterval(this.timer);
+ },
+ methods: {
+ graphLoad: function(){
+ console.log("load function activate");
+ this.reset();
+ this.initialPaintWFGraph();
+ var self = this;
+ self.timer = window.setInterval(function() {
+ if(!self.initalPaintFlag) {
+ if(self.responseTimeCounter > self.RESPONSE_TIME_LIMIT) {
+ self.initialPaintWFGraph();
+ self.responseTimeCounter = 0;
+ }
+ } else {
+ if(self.frameLoadedFlag || self.responseTimeCounter > self.RESPONSE_TIME_LIMIT) {
+ self.repaintWFGraph();
+ self.responseTimeCounter = 0;
+ }
+ }
+ self.responseTimeCounter += self.intervalTime;
+ }, self.intervalTime);
+ },
+ reset: function(){
+ this.frameLoadedFlag = false;
+ this.initalPaintFlag = false;
+ this.RESPONSE_TIME_LIMIT = 6000;
+ this.responseTimeCounter = 0;
+ this.wfCompletedFlag = false;
+ var graphDiv = document.getElementById("workflow-graph");
+ graphDiv.innerHTML = '';
+ },
+ initialPaintWFGraph: function() {
+ console.log("start to initial paint");
+ this.setIframeSrc();
+ var iframe = document.getElementById("testFrame");
+ var self = this;
+ if (iframe.attachEvent) {
+ iframe.attachEvent("onload", function(){
+ window.setTimeout(function(){
+ self.frameLoadedFlag = true;
+ self.initialPaint();
+ console.log("finish to initial paint");
+ }, 1000);
+ });
+ } else {
+ iframe.onload = function(){
+ window.setTimeout(function(){
+ self.frameLoadedFlag = true;
+ self.initialPaint();
+ console.log("finish to initial paint");
+ }, 1000);
+ }
+ }
+ },
+ setIframeSrc: function(){
+ var iframeContainer = document.getElementById("iframeContainer");
+ var iframeDiv = document.getElementById("testFrame");
+ if(iframeDiv != undefined ) {
+ iframeContainer.removeChild(iframeDiv);
+ }
+ var apiPrefix = this.global.WF_GRAPH_ADDR + "#/workflow/id/";
+ var apiUrl = apiPrefix + this.workflowId;
+ console.log("workflowId prop:" + this.workflowId);
+ var iframeDiv = "<iframe id=\"testFrame\" width=\"0\" height=\"0\" style=\"border: none;\" src=\"" + apiUrl + "\"></iframe>";
+ iframeContainer.innerHTML = iframeDiv;
+ this.frameLoadedFlag = false;
+ },
+ initialPaint: function() {
+ var iframe = document.getElementById("testFrame");
+ var frameContent = iframe.contentWindow.document.getElementById("graph-ui-content");
+ if(frameContent == null) return;
+ this.frameLoadedFlag = true;
+ var content = frameContent.cloneNode(true);
+ content.id = "graph-ui-content-1";
+ var graphDiv = document.getElementById("workflow-graph");
+ graphDiv.appendChild(content);
+ this.initalPaintFlag = true;
+ this.wfloading = false;
+ console.log("####################wfloading false######################");
+ },
+ repaint: function() {
+ var iframe = document.getElementById("testFrame");
+ var frameContent = iframe.contentWindow.document.getElementById("graph-ui-content");
+ if(frameContent == null) return;
+ this.frameLoadedFlag = true;
+ var newContent = frameContent.cloneNode(true);
+ var newNodes = newContent.getElementsByClassName("node");
+ var oldContent = document.getElementById("graph-ui-content-1");
+ var oldNodes = oldContent.getElementsByClassName("node");
+ var completeText = iframe.contentWindow.document.getElementsByClassName("ui-content")[0].getElementsByTagName("h4")[0].getElementsByTagName("span")[3].innerHTML;
+ if(newNodes.length > oldNodes.length) {
+ console.log("execute in new > old");
+ newContent.id = "graph-ui-content-1";
+ var graphDiv = document.getElementById("workflow-graph");
+ graphDiv.innerHTML = '';
+ graphDiv.appendChild(newContent);
+ }
+ else if(newNodes.length == oldNodes.length) {
+ console.log("execute in new = old");
+ for(var i = 0; i < newNodes.length; i++)
+ {
+ var newGraph = newNodes[i].children[0];
+ var newGraphStyle = newGraph.getAttribute("style");
+ var oldGraph = oldNodes[i].children[0];
+ var oldGraphStyle = oldGraph.getAttribute("style");
+ if(newGraphStyle != oldGraphStyle) {
+ oldGraph.setAttribute("style", newGraphStyle);
+ }
+ var newText = newNodes[i].getElementsByTagName("text")[0];
+ var newTextStyle = newText.getAttribute("style");
+ var oldText = oldNodes[i].getElementsByTagName("text")[0];
+ var oldTextStyle = oldText.getAttribute("style");
+ if(oldTextStyle != newTextStyle) {
+ oldText.setAttribute("style", newTextStyle);
+ }
+ }
+ if(completeText == "COMPLETED") {
+ this.completeWF(5);
+ }
+ }
+ else {
+ console.log("execute in new < old");
+ }
+ },
+ repaintWFGraph: function() {
+ this.setIframeSrc();
+ var iframe = document.getElementById("testFrame");
+ var self = this;
+ if (iframe.attachEvent) {
+ iframe.attachEvent("onload", function(){
+ window.setTimeout(function(){
+ self.frameLoadedFlag = true;
+ self.repaint();
+ }, 1000);
+ });
+ } else {
+ iframe.onload = function(){
+ window.setTimeout(function(){
+ self.frameLoadedFlag = true;
+ self.repaint();
+ }, 1000);
+ }
+ }
+ },
+ completeWF: function(delay) {
+ this.wfCompletedFlag = true;
+ console.log("#####################################completed: clean the interval " + this.timer);
+ window.clearInterval(this.timer);
+ var self = this;
+ window.setTimeout(function() {
+ self.$emit("wfComplete", true);
+ }, delay*1000);
+ },
+ fillWfContent: function(wfContent) {
+ var contentDiv = document.getElementById("workflow-content");
+ contentDiv.innerHTML = wfContent;
+ }
+ }
+}
+</script>
+<style scoped>
+#workflow-graph {
+ text-align: center;
+}
+#workflow-graph > div{
+ display: inline-block;
+}
+</style>
diff --git a/test-scheduler/ui/src/main.js b/test-scheduler/ui/src/main.js
new file mode 100644
index 00000000..4a90c233
--- /dev/null
+++ b/test-scheduler/ui/src/main.js
@@ -0,0 +1,31 @@
+// The Vue build version to load with the `import` command
+// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
+import '../node_modules//bootstrap/dist/css/bootstrap.min.css'
+import '../node_modules/font-awesome/css/font-awesome.min.css'
+import './assets/css/style.css'
+import 'animate.css'
+import './assets/css/mystyle.css'
+import './assets/css/wf-graph.css'
+import './assets/css/toastr.min.css'
+
+import $ from './assets/js/jquery-vendor.js'
+import 'bootstrap'
+import 'metismenu'
+import slimScroll from 'jquery-slimscroll'
+
+import './assets/js/inspinia.js'
+import './assets/js/pace.min.js'
+import './assets/js/toastr.min.js'
+import Vue from 'vue'
+import global from './Global'
+import App from './App'
+import router from './router'
+Vue.config.productionTip = false
+Vue.prototype.global = global
+/* eslint-disable no-new */
+new Vue({
+ el: '#app',
+ router,
+ components: { App },
+ template: '<App/>'
+})
diff --git a/test-scheduler/ui/src/router/index.js b/test-scheduler/ui/src/router/index.js
new file mode 100644
index 00000000..8cc3da13
--- /dev/null
+++ b/test-scheduler/ui/src/router/index.js
@@ -0,0 +1,44 @@
+import Vue from 'vue'
+import Router from 'vue-router'
+import testsuite from '@/components/testsuite'
+import testcase from '@/components/testcase'
+import testcase_content from '@/components/testcase_content'
+import environment from '@/components/environment'
+Vue.use(Router)
+const Result = {
+ template: "<div>please visit <a target='blank' href='http://lab205.jios.org:30002/dashboard/db/cluster?orgId=1'>grafana page.</a></div>"
+}
+const Report = {
+ template: "<div></div>"
+}
+export default new Router({
+ routes: [
+ {
+ path: '/',
+ name: 'testsuite',
+ component: testsuite
+ },
+ {
+ path: '/testcase',
+ name: 'testcase',
+ component: testcase
+ },
+ {
+ path: '/content',
+ name: 'testcase_content',
+ component: testcase_content
+ },
+ {
+ path: '/result',
+ component: Result
+ },
+ {
+ path: '/report',
+ component: Report
+ },
+ {
+ path: '/environment',
+ component: environment
+ }
+ ]
+})