You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ak...@apache.org on 2016/09/09 03:26:52 UTC
[24/52] ignite git commit: Web Console beta-3.
http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/public/stylesheets/_font-awesome-custom.scss
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/public/stylesheets/_font-awesome-custom.scss b/modules/web-console/frontend/public/stylesheets/_font-awesome-custom.scss
new file mode 100644
index 0000000..1c8f325
--- /dev/null
+++ b/modules/web-console/frontend/public/stylesheets/_font-awesome-custom.scss
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+@import '~font-awesome/scss/variables';
+
+$fa-font-path: '~font-awesome/fonts';
+
+@import '~font-awesome/scss/mixins';
+@import '~font-awesome/scss/path';
+@import '~font-awesome/scss/core';
+@import '~font-awesome/scss/larger';
+@import '~font-awesome/scss/fixed-width';
+@import '~font-awesome/scss/list';
+@import '~font-awesome/scss/bordered-pulled';
+@import '~font-awesome/scss/animated';
+@import '~font-awesome/scss/rotated-flipped';
+@import '~font-awesome/scss/stacked';
+@import '~font-awesome/scss/icons';
http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/public/stylesheets/blocks/error.scss
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/public/stylesheets/blocks/error.scss b/modules/web-console/frontend/public/stylesheets/blocks/error.scss
new file mode 100644
index 0000000..4e16989
--- /dev/null
+++ b/modules/web-console/frontend/public/stylesheets/blocks/error.scss
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.error-page {
+ text-align: center;
+ min-height: 300px;
+
+ &__title {
+ margin-top: 150px;
+ font-weight: 200;
+ }
+
+ &__description {
+ margin-top: 30px;
+ font-weight: 500;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/public/stylesheets/style.scss
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/public/stylesheets/style.scss b/modules/web-console/frontend/public/stylesheets/style.scss
new file mode 100644
index 0000000..4db7127
--- /dev/null
+++ b/modules/web-console/frontend/public/stylesheets/style.scss
@@ -0,0 +1,2171 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+@import "./font-awesome-custom";
+@import "./bootstrap-custom";
+@import "./variables";
+@import "~roboto-font/css/fonts.css";
+@import "./../../app/directives/information/information.scss";
+@import "./blocks/error";
+
+hr {
+ margin: 20px 0;
+}
+
+.theme-line a.active {
+ font-weight: bold;
+ font-size: 1.1em;
+}
+
+.theme-line a:focus {
+ text-decoration: underline;
+ outline: none;
+}
+
+.navbar-default .navbar-brand, .navbar-default .navbar-brand:hover {
+ position: absolute;
+ left: 0;
+ text-align: center;
+}
+
+.navbar-brand {
+ padding: 5px 0;
+ margin: 10px 0;
+}
+
+.modal.center .modal-dialog {
+ position: fixed;
+ top: 50%;
+ left: 50%;
+ -webkit-transform: translateX(-50%) translateY(-50%);
+ transform: translateX(-50%) translateY(-50%);
+}
+
+.border-left {
+ box-shadow: 1px 0 0 0 $gray-lighter inset;
+}
+
+.border-right {
+ box-shadow: 1px 0 0 0 $gray-lighter;
+}
+
+.theme-line header {
+ background-color: $ignite-background-color;
+}
+
+.theme-line .docs-header h1 {
+ color: $ignite-header-color;
+ margin-top: 0;
+ font-size: 22px;
+}
+
+.theme-line .footer {
+ text-align: center;
+}
+
+.table.table-vertical-middle tbody > tr > td {
+ vertical-align: middle;
+}
+
+ul.navbar-nav, .sidebar-nav {
+ li.active > a {
+ color: $link-color;
+ }
+
+ li.active > a:not(.dropdown-toggle) {
+ cursor: default;
+ pointer-events: none;
+ }
+}
+
+.theme-line .sidebar-nav {
+ padding-bottom: 30px;
+
+ ul {
+ padding: 0;
+ list-style: none;
+ margin: 3px 0 0;
+
+ li {
+ line-height: $input-height;
+
+ a {
+ font-size: 18px;
+ color: $ignite-header-color;
+ position: relative;
+ white-space: nowrap;
+ overflow: hidden;
+ -o-text-overflow: ellipsis;
+ text-overflow: ellipsis;
+
+ span.fa-stack {
+ margin-right: 5px;
+ font-size: 12px;
+ height: 26px;
+ }
+ }
+
+ a:hover { color: $link-hover-color; }
+
+ a.active {
+ color: $link-color;
+ }
+ }
+ }
+}
+
+.theme-line .sidebar-nav ul li a:hover {
+ text-decoration: none;
+}
+
+.theme-line .select {
+ li a.active {
+ color: $dropdown-link-active-color;
+ }
+
+ li a:hover {
+ color: $dropdown-link-hover-color;
+ }
+}
+
+.theme-line .select,
+.theme-line .typeahead {
+ .active {
+ font-size: 1em;
+ background-color: $gray-lighter;
+ }
+}
+
+.theme-line button.form-control.placeholder {
+ color: $input-color-placeholder;
+}
+
+.theme-line .summary-pojo-list > ul.dropdown-menu {
+ width: 100%;
+ max-width: none;
+}
+
+.tooltip {
+ word-wrap: break-word;
+}
+
+.theme-line ul.dropdown-menu {
+ min-width: 120px;
+ max-width: 280px;
+ max-height: 20em;
+ overflow: auto;
+ overflow-x: hidden;
+ outline-style: none;
+ margin-top: 0;
+
+ li > a {
+ display: block;
+
+ padding: 3px 10px;
+
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+
+ i {
+ float: right;
+ color: $brand-primary;
+ background-color: transparent;
+ line-height: $line-height-base;
+ margin-left: 5px;
+ margin-right: 0;
+ }
+ }
+
+ li > div {
+ display: block;
+ overflow: hidden;
+
+ i {
+ float: right;
+ color: $text-color;
+ background-color: transparent;
+ line-height: $line-height-base;
+ margin: 0 10px 0 0;
+ padding: 6px 0;
+ }
+
+ div {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+ }
+
+ // Hover/Focus state
+ li > div a {
+ float: left;
+ display: block;
+ width: 100%;
+ padding: 3px 10px;
+ color: $dropdown-link-color;
+
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+
+ &:hover,
+ &:focus {
+ text-decoration: none;
+ color: $dropdown-link-hover-color;
+ background-color: $dropdown-link-hover-bg;
+ }
+ }
+
+ // Active state
+ .active > div a {
+ cursor: default;
+ pointer-events: none;
+
+ &,
+ &:hover,
+ &:focus {
+ color: $dropdown-link-active-color;
+ text-decoration: none;
+ outline: 0;
+ background-color: $dropdown-link-active-bg;
+ }
+ }
+
+ li.divider {
+ margin: 3px 0;
+ }
+}
+
+.theme-line .border-left .sidebar-nav {
+ padding-left: 15px;
+}
+
+.theme-line .suggest {
+ padding: 5px;
+ display: inline-block;
+ font-size: 12px;
+}
+
+.theme-line header {
+ border-bottom: 8px solid $ignite-border-bottom-color;
+
+ p {
+ color: $ignite-header-color;
+ }
+}
+
+.header .nav.navbar-nav.pull-right > li > a {
+ padding-right: 0;
+}
+
+.header .title {
+ margin: 20px 0 5px 0;
+ padding: 0 15px;
+
+ font-size: 1.4em;
+}
+
+.header .nav.navbar-nav .not-link {
+ padding: 15px;
+ display: inline-block;
+}
+
+.nav > li {
+ > a {
+ color: $navbar-default-link-color
+ }
+ > a:hover {
+ color: $link-hover-color
+ }
+ > a.active {
+ color: $link-color
+ }
+}
+
+.theme-line header .navbar-nav a {
+ line-height: 25px;
+ font-size: 18px;
+}
+
+.theme-line .section-right {
+ padding-left: 30px;
+}
+
+.body-overlap .main-content {
+ margin-top: 30px;
+}
+
+.body-box .main-content,
+.body-overlap .main-content {
+ padding: 30px;
+ box-shadow: 0 0 0 1px $ignite-border-color;
+ background-color: $ignite-background-color;
+}
+
+body {
+ font-weight: 400;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ font-weight: 700;
+ margin-bottom: 10px;
+}
+
+.container-footer {
+ margin-top: 20px;
+ margin-bottom: 20px;
+
+ p {
+ font-size: 12px;
+ margin-bottom: 0;
+ }
+}
+
+/* Modal */
+.modal {
+ display: block;
+ overflow: hidden;
+}
+
+.modal .close {
+ position: absolute;
+ top: 10px;
+ right: 10px;
+ float: none;
+}
+
+.modal-header {
+ border-top-left-radius: 6px;
+ border-top-right-radius: 6px;
+}
+
+// Close icon
+.modal-header .close {
+ margin-right: -2px;
+}
+
+.modal .modal-dialog {
+ width: 650px;
+}
+
+.modal .modal-content {
+ background-color: $gray-lighter;
+
+ .input-tip {
+ padding-top: 1px;
+ }
+}
+
+.modal .modal-content .modal-header {
+ background-color: $ignite-background-color;
+ text-align: center;
+ color: $ignite-header-color;
+ padding: 15px 25px 15px 15px;
+}
+
+.modal .modal-content .modal-header h4 {
+ font-size: 22px;
+}
+
+.modal .modal-content .modal-footer {
+ margin-top: 0;
+}
+
+.modal-footer {
+ label {
+ float: left;
+ margin: 0;
+ }
+
+ .btn:last-child {
+ margin-right: 0;
+ }
+
+ .checkbox {
+ margin: 0;
+ }
+}
+
+.login-header {
+ margin-top: 0;
+ margin-bottom: 20px;
+ font-size: 2em;
+}
+
+.login-footer {
+ @extend .modal-footer;
+
+ padding-left: 0;
+ padding-right: 0;
+
+ .btn {
+ margin-right: 0;
+ }
+}
+
+.modal-body {
+ margin-left: 20px;
+ margin-right: 20px;
+}
+
+.modal-body-with-scroll {
+ max-height: 420px;
+ overflow-y: auto;
+ margin: 0;
+}
+
+.greedy {
+ min-height: 100%;
+ height: #{"calc(100vh - 270px)"};
+}
+
+.signin-greedy {
+ height: #{"calc(100vh - 300px)"};
+}
+
+@media (min-width: 768px) {
+ .navbar-nav > li > a {
+ padding: 0 15px;
+ }
+}
+
+.details-row {
+ padding: 0 5px;
+}
+
+.details-row, .settings-row {
+ display: block;
+ margin: 10px 0;
+
+ [class*="col-"] {
+ display: inline-block;
+ vertical-align: middle;
+ float: none;
+ }
+
+ input[type="checkbox"] {
+ line-height: 20px;
+ margin-right: 5px;
+ }
+
+ .checkbox label {
+ line-height: 20px !important;
+ vertical-align: middle;
+ }
+}
+
+.group-section {
+ margin-top: 20px;
+}
+
+.details-row:first-child {
+ margin-top: 0;
+
+ .group-section {
+ margin-top: 10px;
+ }
+}
+
+.details-row:last-child {
+ margin-bottom: 0;
+}
+
+.settings-row:first-child {
+ margin-top: 0;
+
+ .group-section {
+ margin-top: 0;
+ }
+}
+
+.settings-row:last-child {
+ margin-bottom: 0;
+}
+
+button, .btn {
+ margin-right: 5px;
+}
+
+i.btn {
+ margin-right: 0;
+}
+
+.btn {
+ padding: 3px 6px;
+
+ :focus {
+ //outline: none;
+ //border: 1px solid $btn-default-border;
+ }
+}
+
+.btn-group.pull-right {
+ margin-right: 0;
+}
+
+.btn-group {
+ margin-right: 5px;
+
+ > button, a.btn {
+ margin-right: 0;
+ }
+
+ button.btn + .btn {
+ margin-left: 0;
+ }
+
+ > .btn + .dropdown-toggle {
+ margin-right: 0;
+ padding: 3px 6px;
+ border-left-width: 0;
+ }
+}
+
+h1,
+h2,
+h3 {
+ user-select: none;
+ font-weight: normal;
+ /* Makes the vertical size of the text the same for all fonts. */
+ line-height: 1;
+}
+
+h3 {
+ font-size: 1.2em;
+ margin-top: 0;
+ margin-bottom: 1.5em;
+}
+
+.base-control {
+ text-align: left;
+ padding: 3px 3px;
+ height: $input-height;
+}
+
+.sql-name-input {
+ @extend .form-control;
+
+ width: auto;
+}
+
+.form-control {
+ @extend .base-control;
+
+ display: inline-block;
+
+ button {
+ text-align: left;
+ }
+}
+
+button.form-control {
+ display: block;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+}
+
+.theme-line .notebook-header {
+ border-color: $gray-lighter;
+
+ h1 {
+ padding: 0;
+ margin: 0;
+
+ height: 40px;
+
+ label {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ margin-top: 5px;
+ }
+
+ .btn-group {
+ margin-top: -5px;
+ margin-left: 5px;
+ }
+
+ > i.btn {
+ float: right;
+ line-height: 30px;
+ }
+
+ input {
+ font-size: 22px;
+ height: 35px;
+ }
+
+ a.dropdown-toggle {
+ font-size: $font-size-base;
+ margin-right: 5px;
+ }
+ }
+}
+
+.theme-line .paragraphs {
+ .panel-group .panel + .panel {
+ margin-top: 30px;
+ }
+
+ .btn-group {
+ margin-right: 0;
+ }
+
+ .sql-editor {
+ padding: 5px 0;
+
+ .ace_cursor {
+ opacity: 1;
+ }
+
+ .ace_hidden-cursors {
+ opacity: 1;
+ }
+
+ .ace_gutter-cell, .ace_folding-enabled > .ace_gutter-cell {
+ padding-right: 5px;
+ }
+ }
+
+ table thead {
+ background-color: white;
+ }
+
+ .wrong-caches-filter {
+ text-align: center;
+ color: $ignite-placeholder-color;
+ height: 65px;
+ line-height: 65px;
+ }
+
+ .empty-caches {
+ text-align: center;
+ color: $ignite-placeholder-color;
+ height: 55px;
+ line-height: 55px;
+ }
+
+ .sql-controls {
+ border-top: 1px solid $ignite-border-color;
+
+ padding: 10px 10px;
+ }
+
+ .sql-result {
+ border-top: 1px solid $ignite-border-color;
+
+ .error {
+ padding: 10px 10px;
+
+ text-align: center;
+ color: $brand-primary;
+ }
+
+ .empty {
+ padding: 10px 10px;
+
+ text-align: center;
+ color: $ignite-placeholder-color;
+ }
+
+ .total {
+ padding: 10px 10px;
+ }
+
+ .table {
+ margin: 0
+ }
+
+ .chart {
+ margin: 0
+ }
+
+ .footer {
+ border-top: 1px solid $ignite-border-color;
+
+ padding: 5px 10px;
+ }
+ }
+}
+
+.theme-line .panel-heading {
+ padding: 5px 10px;
+ margin: 0;
+ cursor: pointer;
+ font-size: $font-size-large;
+ line-height: 24px;
+
+ label {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ max-width: calc(100% - 85px);
+ cursor: pointer;
+ }
+
+ .btn-group {
+ vertical-align:top;
+ margin-left: 10px;
+
+ i { line-height: 18px; }
+ }
+
+ > i {
+ vertical-align: top;
+ line-height: 26px;
+ height: 26px;
+ }
+
+ .fa {
+ line-height: 26px;
+ }
+
+ .fa-floppy-o {
+ float: right;
+ }
+
+ .fa-chevron-circle-right, .fa-chevron-circle-down {
+ font-size: $font-size-base;
+ color: inherit;
+ float: left;
+ }
+
+ .fa-undo {
+ padding: 1px 6px;
+
+ font-size: 16px;
+ }
+
+ .fa-undo:hover {
+ padding: 0 5px;
+
+ border-radius: 5px;
+ border: thin dotted $ignite-darck-border-color;
+ }
+}
+
+.theme-line .panel-heading:hover {
+ text-decoration: underline;
+}
+
+.theme-line .panel-body {
+ padding: 20px;
+}
+
+.theme-line .main-content a.customize {
+ margin-left: 5px;
+}
+
+.theme-line .panel-collapse {
+ margin: 0;
+}
+
+.theme-line table.links {
+ table-layout: fixed;
+ border-collapse: collapse;
+
+ width: 100%;
+
+ label.placeholder {
+ text-align: center;
+ color: $ignite-placeholder-color;
+ width: 100%;
+ }
+
+ input[type="text"] {
+ font-weight: normal;
+ }
+
+ input[type="radio"] {
+ margin-left: 1px;
+ margin-right: 5px;
+ }
+
+ tbody {
+ border-left: 10px solid transparent;
+ }
+
+ tbody td:first-child {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+
+ tfoot > tr > td {
+ padding: 0;
+
+ .pagination {
+ margin: 10px 0;
+
+ > .active > a {
+ border-color: $table-border-color;
+ background-color: $gray-lighter;
+ }
+ }
+ }
+}
+
+.theme-line table.links-edit {
+ @extend table.links;
+
+ margin-top: 0;
+ margin-bottom: 5px;
+
+ label {
+ line-height: $input-height;
+ }
+
+ td {
+ padding-left: 0;
+ }
+}
+
+.theme-line table.links-edit-sub {
+ @extend table.links-edit;
+
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+.theme-line table.links-edit-details {
+ @extend table.links;
+
+ margin-bottom: 10px;
+
+ label {
+ line-height: $input-height;
+ color: $ignite-header-color;
+ }
+
+ td {
+ padding: 0;
+
+ .input-tip {
+ padding: 0;
+ }
+ }
+}
+
+.theme-line table.admin {
+ tr:hover {
+ cursor: default;
+ }
+
+ thead {
+ .pagination {
+ margin: 0;
+ }
+ }
+
+ thead > tr th.header {
+ padding: 0 0 10px;
+
+ div {
+ padding: 0;
+ }
+
+ input[type="text"] {
+ font-weight: normal;
+ }
+ }
+
+ margin-bottom: 10px;
+
+ label {
+ line-height: $input-height;
+ color: $ignite-header-color;
+ }
+
+ thead > tr th, td {
+ padding: 10px 10px;
+
+ .input-tip {
+ padding: 0;
+ }
+ }
+
+ tfoot > tr > td {
+ padding: 0;
+ }
+
+ .pagination {
+ margin: 10px 0;
+ font-weight: normal;
+
+ > .active > a {
+ border-color: $table-border-color;
+ background-color: $gray-lighter;
+ }
+ }
+}
+
+.admin-summary {
+ padding-bottom: 10px;
+}
+
+.import-domain-model-wizard-page {
+ margin: 15px;
+}
+
+.scrollable-y {
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+.theme-line table.metadata {
+ margin-bottom: 10px;
+
+ tr:hover {
+ cursor: default;
+ }
+
+ thead > tr {
+ label {
+ font-weight: bold;
+ }
+
+ input[type="checkbox"] {
+ cursor: pointer;
+ }
+ }
+
+ thead > tr th.header {
+ padding: 0 0 10px;
+
+ .pull-right {
+ padding: 0;
+ }
+
+ input[type="checkbox"] {
+ cursor: pointer;
+ }
+
+ input[type="text"] {
+ font-weight: normal;
+ }
+ }
+
+ > thead > tr > th {
+ padding: 5px 0 5px 5px !important;
+ }
+
+ tbody > tr > td {
+ padding: 0;
+ }
+}
+
+.td-ellipsis {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.table-modal-striped {
+ width: 100%;
+
+ > tbody > tr {
+ border-bottom: 2px solid $ignite-border-color;
+
+ input[type="checkbox"] {
+ cursor: pointer;
+ }
+ }
+
+ > tbody > tr > td {
+ padding: 5px 0 5px 5px !important;
+ }
+}
+
+.theme-line table.sql-results {
+ margin: 0;
+
+ td {
+ padding: 3px 6px;
+ }
+
+ > thead > tr > td {
+ padding: 3px 0;
+ }
+
+ thead > tr > th {
+ padding: 3px 6px;
+
+ line-height: $input-height;
+ }
+
+ tfoot > tr > td {
+ padding: 0;
+
+ .pagination {
+ margin: 10px 0 0 0;
+
+ > .active > a {
+ border-color: $table-border-color;
+ background-color: $gray-lighter;
+ }
+ }
+ }
+}
+
+.affix {
+ z-index: 910;
+ background-color: white;
+
+ hr {
+ margin: 0;
+ }
+}
+
+.affix.padding-top-dflt {
+ hr {
+ margin-top: 10px;
+ }
+}
+
+.affix + .bs-affix-fix {
+ height: 78px;
+}
+
+.panel-details {
+ margin-top: 5px;
+ padding: 10px 5px;
+
+ border-radius: 5px;
+ border: thin dotted $ignite-border-color;
+}
+
+.panel-details-noborder {
+ margin-top: 5px;
+ padding: 10px 5px;
+}
+
+.group {
+ border-radius: 5px;
+ border: thin dotted $ignite-border-color;
+
+ text-align: left;
+
+ hr {
+ margin: 7px 0;
+ }
+}
+
+.group-legend {
+ margin: -10px 5px 0 10px;
+ overflow: visible;
+ position: relative;
+
+ label {
+ padding: 0 5px;
+ background: white;
+ }
+}
+
+.group-legend-btn {
+ background: white;
+ float: right;
+ line-height: 20px;
+ padding: 0 5px 0 5px;
+}
+
+.group-content {
+ margin: 10px;
+
+ table {
+ width: 100%;
+ }
+}
+
+.group-content-empty {
+ color: $input-color-placeholder;
+
+ padding: 10px 0;
+ position: relative;
+
+ text-align: center;
+}
+
+.content-not-available {
+ min-height: 28px;
+
+ margin-right: 20px;
+
+ border-radius: 5px;
+ border: thin dotted $ignite-border-color;
+
+ padding: 0;
+
+ color: $input-color-placeholder;
+ display: table;
+ width: 100%;
+ height: 26px;
+
+ label {
+ display: table-cell;
+ text-align: center;
+ vertical-align: middle;
+ }
+}
+
+.tooltip > .tooltip-inner {
+ text-align: left;
+ border: solid 1px #ccc;
+}
+
+.popover-footer {
+ margin: 0; // reset heading margin
+ padding: 8px 14px;
+ font-size: $font-size-base;
+ color: $input-color-placeholder;
+ background-color: $popover-title-bg;
+ border-top: 1px solid darken($popover-title-bg, 5%);
+ border-radius: 0 0 ($border-radius-large - 1) ($border-radius-large - 1);
+}
+
+.popover-content {
+ padding: 5px;
+}
+
+.popover:focus {
+ outline: none;
+ border: 1px solid $btn-default-border;
+}
+
+.theme-line .popover.settings {
+ .close {
+ position: absolute;
+ top: 5px;
+ right: 5px;
+ }
+}
+
+.theme-line .popover.cache-metadata {
+ @extend .popover.settings;
+
+ position: absolute;
+ z-index: 1030;
+ min-width: 305px;
+ max-width: 450px;
+
+ .popover-title {
+ color: black;
+
+ line-height: 27px;
+
+ padding: 3px 5px 3px 10px;
+
+ white-space: nowrap;
+ overflow: hidden;
+ -o-text-overflow: ellipsis;
+ text-overflow: ellipsis;
+
+ .close {
+ float: right;
+ top: 0;
+ right: 0;
+ position: relative;
+ margin-left: 10px;
+ line-height: 27px;
+ }
+ }
+
+ > .popover-content {
+ overflow: auto;
+
+ white-space: nowrap;
+
+ min-height: 400px;
+ max-height: 400px;
+
+ .content-empty {
+ display: block;
+ text-align: center;
+ line-height: 380px;
+
+ color: $input-color-placeholder;
+ }
+ }
+
+ .clickable { cursor: pointer; }
+}
+
+.theme-line .popover.summary-project-structure {
+ @extend .popover.settings;
+
+ z-index: 1030;
+ min-width: 305px;
+
+ .popover-title {
+ color: black;
+
+ line-height: 27px;
+
+ padding: 3px 5px 3px 10px;
+
+ white-space: nowrap;
+ overflow: hidden;
+ -o-text-overflow: ellipsis;
+ text-overflow: ellipsis;
+
+ .close {
+ float: right;
+ top: 0;
+ right: 0;
+ position: relative;
+ margin-left: 10px;
+ line-height: 27px;
+ }
+ }
+
+ > .popover-content {
+ overflow: auto;
+
+ white-space: nowrap;
+
+ min-height: 300px;
+ max-height: 300px;
+ }
+}
+
+.theme-line .popover.validation-error {
+ max-width: 400px;
+ color: $brand-primary;
+ background: white;
+ border: 1px solid $brand-primary;
+
+ &.right > .arrow {
+ border-right-color: $brand-primary;
+ }
+
+ .close {
+ vertical-align: middle;
+ }
+}
+
+label {
+ font-weight: normal;
+ margin-bottom: 0;
+}
+
+.form-horizontal .checkbox {
+ padding-top: 0;
+ min-height: 0;
+}
+
+.input-tip {
+ display: block;
+ overflow: hidden;
+ position: relative;
+}
+
+.labelHeader {
+ font-weight: bold;
+ text-transform: capitalize;
+}
+
+.labelField {
+ float: left;
+ margin-right: 5px;
+}
+
+.labelFormField {
+ float: left;
+ line-height: $input-height;
+}
+
+.labelLogin {
+ margin-right: 10px;
+}
+
+.form-horizontal .form-group {
+ margin: 0;
+}
+
+.form-horizontal .has-feedback .form-control-feedback {
+ right: 0;
+}
+
+.tipField {
+ float: right;
+ line-height: $input-height;
+ margin-left: 5px;
+}
+
+.tipLabel {
+ font-size: $font-size-base;
+ margin-left: 5px;
+}
+
+.fieldSep {
+ float: right;
+ line-height: $input-height;
+ margin: 0 5px;
+}
+
+.fieldButton {
+ float: right;
+ margin-left: 5px;
+ margin-right: 0;
+}
+
+.fa {
+ cursor: pointer;
+}
+
+.fa-cursor-default {
+ cursor: default !important;
+}
+
+.fa-remove {
+ color: $brand-primary;
+}
+
+.fa-chevron-circle-down {
+ color: $brand-primary;
+ margin-right: 5px;
+}
+
+.fa-chevron-circle-right {
+ color: $brand-primary;
+ margin-right: 5px;
+}
+
+.fa-question-circle {
+ cursor: default;
+}
+
+label.required:after {
+ color: $brand-primary;
+ content: ' *';
+ display: inline;
+}
+
+.blank {
+ visibility: hidden;
+}
+
+.alert {
+ outline: 0;
+ padding: 10px;
+ position: fixed;
+ z-index: 1050;
+ margin: 20px;
+ max-width: 700px;
+
+ &.top-right {
+ top: 60px;
+ right: 0;
+
+ .close {
+ padding-left: 10px;
+ }
+ }
+
+ .alert-icon {
+ padding-right: 10px;
+ font-size: 16px;
+ }
+
+ .alert-title {
+ color: $text-color;
+ }
+
+ .close {
+ margin-right: 0;
+ line-height: 19px;
+ }
+}
+
+.summary-tabs {
+ margin-top: 0.65em;
+}
+
+.summary-tab {
+ img {
+ margin-right: 5px;
+ height: 16px;
+ width: 16px;
+ float: left;
+ }
+}
+
+input[type="number"]::-webkit-outer-spin-button,
+input[type="number"]::-webkit-inner-spin-button {
+ -webkit-appearance: none;
+ margin: 0;
+}
+
+input[type="number"] {
+ -moz-appearance: textfield;
+}
+
+input.ng-dirty.ng-invalid, button.ng-dirty.ng-invalid {
+ border-color: $ignite-invalid-color;
+
+ :focus {
+ border-color: $ignite-invalid-color;
+ }
+}
+
+.form-control-feedback {
+ display: inline-block;
+ color: $brand-primary;
+ line-height: $input-height;
+ pointer-events: initial;
+}
+
+.theme-line .nav-tabs > li > a {
+ padding: 5px 5px;
+ color: $ignite-header-color;
+}
+
+.viewedUser {
+ text-align: center;
+ background-color: $brand-warning;
+}
+
+a {
+ cursor: pointer;
+}
+
+.st-sort-ascent:after {
+ content: '\25B2';
+}
+
+.st-sort-descent:after {
+ content: '\25BC';
+}
+
+th[st-sort] {
+ cursor: pointer;
+}
+
+.panel {
+ margin-bottom: 0;
+}
+
+.panel-group {
+ margin-bottom: 0;
+}
+
+.panel-group .panel + .panel {
+ margin-top: 20px;
+}
+
+.section {
+ margin-top: 20px;
+}
+
+.section-top {
+ width: 100%;
+ margin-top: 10px;
+ margin-bottom: 20px;
+}
+
+.advanced-options {
+ @extend .section;
+ margin-bottom: 20px;
+
+ i {
+ font-size: 16px;
+ }
+}
+
+.modal-advanced-options {
+ @extend .advanced-options;
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+
+.margin-left-dflt {
+ margin-left: 10px;
+}
+
+.margin-top-dflt {
+ margin-top: 10px;
+}
+
+.margin-top-dflt-2x {
+ margin-top: 20px;
+}
+
+.margin-bottom-dflt {
+ margin-bottom: 10px;
+}
+
+.margin-dflt {
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+
+.padding-top-dflt {
+ padding-top: 10px;
+}
+
+.padding-left-dflt {
+ padding-left: 10px;
+}
+
+.padding-bottom-dflt {
+ padding-bottom: 10px;
+}
+
+.padding-dflt {
+ padding-top: 10px;
+ padding-bottom: 10px;
+}
+
+.agent-download {
+ padding: 10px 10px 10px 20px;
+}
+
+.ace_content {
+ padding-left: 5px;
+}
+
+.ace_hidden-cursors {
+ opacity: 0;
+}
+
+.ace_cursor {
+ opacity: 0;
+}
+
+.ace_editor {
+ margin: 10px 5px 10px 0;
+
+ .ace_gutter {
+ background: transparent !important;
+ border: 1px $ignite-border-color;
+ border-right-style: solid;
+ }
+
+ .ace_gutter-cell, .ace_folding-enabled > .ace_gutter-cell {
+ padding-left: 0.65em;
+ }
+}
+
+.preview-highlight-1 {
+ position: absolute;
+ background-color: #f7faff;
+ z-index: 20;
+}
+
+.preview-highlight-2 {
+ position: absolute;
+ background-color: #f0f6ff;
+ z-index: 21;
+}
+
+.preview-highlight-3 {
+ position: absolute;
+ background-color: #e8f2ff;
+ z-index: 22;
+}
+
+.preview-highlight-4 {
+ position: absolute;
+ background-color: #e1eeff;
+ z-index: 23;
+}
+
+.preview-highlight-5 {
+ position: absolute;
+ background-color: #DAEAFF;
+ z-index: 24;
+}
+
+.preview-highlight-6 {
+ position: absolute;
+ background-color: #D2E5FF;
+ z-index: 25;
+}
+
+.preview-highlight-7 {
+ position: absolute;
+ background-color: #CBE1FF;
+ z-index: 26;
+}
+
+.preview-highlight-8 {
+ position: absolute;
+ background-color: #C3DDFF;
+ z-index: 27;
+}
+
+.preview-highlight-9 {
+ position: absolute;
+ background-color: #BCD9FF;
+ z-index: 28;
+}
+
+.preview-highlight-10 {
+ position: absolute;
+ background-color: #B5D5FF;
+ z-index: 29;
+}
+
+.preview-panel {
+ min-height: 28px;
+
+ margin-left: 20px;
+
+ border-radius: 5px;
+ border: thin dotted $ignite-border-color;
+
+ padding: 0;
+}
+
+.preview-legend {
+ top: -10px;
+ right: 20px;
+ position: absolute;
+ z-index: 900;
+
+ a {
+ background-color: white;
+ margin-left: 5px;
+ font-size: 0.9em;
+ }
+
+ .inactive {
+ color: $input-color-placeholder;
+ }
+}
+
+.preview-content-empty {
+ color: $input-color-placeholder;
+ display: table;
+ width: 100%;
+ height: 26px;
+
+ label {
+ display: table-cell;
+ text-align: center;
+ vertical-align: middle;
+ }
+}
+
+.chart-settings-link {
+ padding-left: 10px;
+ line-height: $input-height;
+
+ label, button {
+ margin-left: 5px;
+ margin-right: 0;
+ }
+
+ button.select-manual-caret {
+ padding-right: 3px;
+
+ .caret { margin-left: 3px; }
+ }
+
+ a, i {
+ font-size: $font-size-base;
+ color: $link-color !important;
+ margin-right: 5px;
+ }
+
+ div {
+ margin-left: 20px;
+ display: inline-block;
+ }
+}
+
+.chart-settings {
+ margin: 10px 5px 5px 5px !important;
+}
+
+.chart-settings-columns-list {
+ border: 1px solid $ignite-border-color;
+ list-style: none;
+ margin-bottom: 10px;
+ min-height: 30px;
+ max-height: 200px;
+ padding: 5px;
+
+ overflow: auto;
+
+ & > li {
+ float: left;
+ }
+
+ li:nth-child(even) {
+ margin-right: 0;
+ }
+
+ .fa-close {
+ margin-left: 10px;
+ }
+}
+
+.btn-chart-column {
+ border-radius: 3px;
+ font-size: 12px;
+ margin: 3px 3px;
+ padding: 1px 5px;
+ line-height: 1.5;
+ cursor: default;
+}
+
+.btn-chart-column-movable {
+ @extend .btn-chart-column;
+ cursor: move;
+}
+
+.btn-chart-column-agg-fx {
+ border: 0;
+ margin: 0 0 0 10px;
+}
+
+.dw-loading {
+ min-height: 100px;
+}
+
+.dw-loading > .dw-loading-body > .dw-loading-text {
+ left: -50%;
+}
+
+.dw-loading.dw-loading-overlay {
+ z-index: 1030;
+}
+
+.modal {
+ .dw-loading.dw-loading-overlay {
+ z-index: 9999;
+ }
+
+ .dw-loading-body {
+ left: 10%;
+ }
+}
+
+.panel-tip-container {
+ display: inline-block;
+}
+
+button.dropdown-toggle {
+ margin-right: 5px;
+}
+
+button.select-toggle {
+ position: relative;
+ padding-right: 15px;
+}
+
+button.select-toggle::after {
+ content: "";
+ border-top: 0.3em solid;
+ border-right: 0.3em solid transparent;
+ border-left: 0.3em solid transparent;
+ position: absolute;
+ right: 5px;
+ top: 50%;
+ vertical-align: middle;
+}
+
+// Prevent scroll bars from being hidden for OS X.
+::-webkit-scrollbar {
+ -webkit-appearance: none;
+}
+
+::-webkit-scrollbar:vertical {
+ width: 10px;
+}
+
+::-webkit-scrollbar:horizontal {
+ height: 10px;
+}
+
+::-webkit-scrollbar-thumb {
+ border-radius: 8px;
+ border: 2px solid white; /* should match background, can't be transparent */
+ background-color: rgba(0, 0, 0, .5);
+}
+
+::-webkit-scrollbar-track {
+ background-color: white;
+ border-radius: 8px;
+}
+
+treecontrol.tree-classic {
+ > ul > li {
+ padding: 0;
+ }
+
+ li {
+ padding-left: 15px;
+ }
+
+ li.tree-expanded i.tree-branch-head.fa, li.tree-collapsed i.tree-branch-head.fa, li.tree-leaf i.tree-branch-head.fa, .tree-label i.fa {
+ background: none no-repeat;
+ padding: 1px 5px 1px 1px;
+ }
+
+ li.tree-leaf i.tree-leaf-head {
+ background: none no-repeat !important;
+ padding: 0 !important;
+ }
+
+ li .tree-selected {
+ background-color: white;
+ font-weight: normal;
+ }
+
+ span {
+ margin-right: 10px;
+ }
+}
+
+.docs-content {
+ .affix {
+ border-bottom: 1px solid $gray-lighter;
+ }
+
+ min-height: 100px;
+}
+
+.carousel-caption {
+ position: relative;
+ left: auto;
+ right: auto;
+
+ margin-top: 10px;
+
+ h3 {
+ margin-bottom: 10px;
+ }
+}
+
+.carousel-control {
+ font-size: 20px;
+ z-index: 16;
+
+ // Toggles
+ .fa-chevron-left,.fa-chevron-right {
+ position: absolute;
+ bottom: 28px;
+ margin-top: -10px;
+ z-index: 16;
+ display: inline-block;
+ margin-left: -10px;
+ }
+
+ .fa-chevron-left {
+ left: 90%;
+ margin-left: -10px;
+ }
+
+ .fa-chevron-right {
+ right: 90%;
+ margin-right: -10px;
+ }
+}
+
+.carousel-control.left {
+ background-image: none;
+}
+
+.carousel-control.right {
+ background-image: none;
+}
+
+.getting-started-puzzle {
+ margin-left: 20px;
+}
+
+.getting-started {
+ margin: 15px 15px 300px;
+}
+
+.getting-started-demo {
+ color: $brand-info;
+}
+
+.home-panel {
+ border-radius: 5px;
+ border: thin dotted $panel-default-border;
+ background-color: $panel-default-heading-bg;
+
+ margin-top: 20px;
+ padding: 10px;
+}
+
+.home {
+ min-height: 880px;
+ padding: 20px;
+
+ @media(min-width: 992px) {
+ min-height: 450px;
+ }
+}
+
+.additional-filter {
+ input[type="checkbox"] {
+ position: absolute;
+ margin-top: 8px;
+ }
+
+ a {
+ font-weight: normal;
+ padding-left: 20px;
+ float: none;
+ }
+}
+
+.grid {
+ .ui-grid-header-cell .ui-grid-cell-contents {
+ text-align: center;
+
+ > span:not(.ui-grid-header-cell-label) {
+ position: absolute;
+ right: -3px;
+ }
+ }
+
+ .ui-grid-cell .ui-grid-cell-contents {
+ text-align: center;
+ white-space: pre;
+
+ > i.fa {
+ cursor: default;
+ }
+ }
+
+ .ui-grid-column-menu-button {
+ right: -3px;
+ }
+
+ .ui-grid-menu-button {
+ margin-top: -1px;
+ }
+
+ .ui-grid-column-menu-button-last-col {
+ margin-right: 0
+ }
+
+ .no-rows {
+ .center-container {
+ background: white;
+
+ .centered > div {
+ display: inline-block;
+ padding: 10px;
+
+ opacity: 1;
+
+ background-color: #f5f5f5;
+ border-radius: 6px;
+ border: 1px solid $ignite-darck-border-color;
+ }
+ }
+ }
+}
+
+.cell-right .ui-grid-cell-contents {
+ text-align: right !important;
+}
+
+.cell-left .ui-grid-cell-contents {
+ text-align: left !important;
+}
+
+.grid.ui-grid {
+ border-left-width: 0;
+ border-right-width: 0;
+ border-bottom-width: 0;
+}
+
+.summary-tabs {
+ .nav-tabs > li:first-child,
+ .nav-tabs > li:first-child.active {
+ & > a,
+ & > a:focus,
+ & > a:hover {
+ border-left: none;
+ border-top-left-radius: 0;
+ }
+ }
+}
+
+.ribbon-wrapper {
+ width: 150px;
+ height: 150px;
+ position: absolute;
+ overflow: hidden;
+ top: 0;
+ z-index: 1001;
+ pointer-events: none;
+}
+
+.ribbon-wrapper.right {
+ right: 0;
+}
+
+.ribbon {
+ position: absolute;
+ top: 42px;
+ width: 200px;
+ padding: 1px 0;
+ color: $btn-primary-color;
+ background: $btn-primary-border;
+
+ -moz-box-shadow: 0 0 10px rgba(0,0,0,0.5);
+ -webkit-box-shadow: 0 0 10px rgba(0,0,0,0.5);
+ box-shadow: 0 0 10px rgba(0,0,0,0.5);
+
+ right: -42px;
+ -moz-transform: rotate(45deg);
+ -webkit-transform: rotate(45deg);
+ -o-transform: rotate(45deg);
+ -ms-transform: rotate(45deg);
+ transform: rotate(45deg);
+
+ > label {
+ display: block;
+ padding: 1px 0;
+ height: 24px;
+ line-height: 18px;
+
+ text-align: center;
+ text-decoration: none;
+ font-family: $font-family-sans-serif;
+ font-size: 20px;
+ font-weight: 500;
+
+ border: 1px solid rgba(255,255,255,0.3);
+
+ -moz-text-shadow: 0 0 10px rgba(0,0,0,0.31);
+ -webkit-text-shadow: 0 0 10px rgba(0,0,0,0.31);
+ text-shadow: 0 0 10px rgba(0,0,0,0.31);
+ }
+}
+
+html,body,.splash-screen {
+ width: 100%;
+ height: 100%;
+}
+
+.splash {
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ top: 0;
+ opacity: 1;
+ background-color: white;
+ z-index: 99999;
+
+ .splash-wrapper {
+ display: inline-block;
+ vertical-align: middle;
+ position: relative;
+ width: 100%;
+ }
+
+ .splash-wellcome {
+ font-size: 18px;
+ margin: 20px 0;
+ text-align: center;
+ }
+}
+
+.splash:before {
+ content: '';
+ display: inline-block;
+ height: 100%;
+ vertical-align: middle;
+}
+
+.spinner {
+ margin: 0 auto;
+ width: 100px;
+ text-align: center;
+
+ > div {
+ width: 18px;
+ height: 18px;
+ margin: 0 5px;
+ border-radius: 100%;
+ display: inline-block;
+ -webkit-animation: sk-bouncedelay 1.4s infinite ease-in-out both;
+ animation: sk-bouncedelay 1.4s infinite ease-in-out both;
+ background-color: $brand-primary;
+ }
+
+ .bounce1 {
+ -webkit-animation-delay: -0.32s;
+ animation-delay: -0.32s;
+ }
+
+ .bounce2 {
+ -webkit-animation-delay: -0.16s;
+ animation-delay: -0.16s;
+ }
+}
+
+@-webkit-keyframes sk-bouncedelay {
+ 0%, 80%, 100% {
+ -webkit-transform: scale(0)
+ }
+ 40% {
+ -webkit-transform: scale(1.0)
+ }
+}
+
+@keyframes sk-bouncedelay {
+ 0%, 80%, 100% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 40% {
+ -webkit-transform: scale(1.0);
+ transform: scale(1.0);
+ }
+}
+
+[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {
+ display: none !important;
+}
+
+.nvd3 .nv-axis .nv-axisMaxMin text {
+ font-weight: normal; /* Here the text can be modified*/
+}
+
+[ng-hide].ng-hide-add.ng-hide-animate {
+ display: none;
+}
+
+[ng-show].ng-hide-add.ng-hide-animate {
+ display: none;
+}
+
+@media only screen and (max-width: 767px) {
+ .container{
+ padding: 0 $padding-small-horizontal;
+ }
+}
+
+.domains-import-dialog {
+ .modal-body {
+ height: 325px;
+ margin: 0;
+ padding: 0;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/public/stylesheets/variables.scss
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/public/stylesheets/variables.scss b/modules/web-console/frontend/public/stylesheets/variables.scss
new file mode 100644
index 0000000..8500eac
--- /dev/null
+++ b/modules/web-console/frontend/public/stylesheets/variables.scss
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+@import "bootstrap-variables";
+
+$logo-path: "/images/logo.png";
+$input-height: 28px;
+$ignite-placeholder-color: #999999;
+$ignite-border-color: #ddd;
+$ignite-darck-border-color: #aaa;
+$ignite-border-bottom-color: $brand-primary;
+$ignite-background-color: #fff;
+$ignite-header-color: #555;
+$ignite-invalid-color: $brand-primary;
http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/test/e2e/exampe.test.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/test/e2e/exampe.test.js b/modules/web-console/frontend/test/e2e/exampe.test.js
new file mode 100644
index 0000000..c778c79
--- /dev/null
+++ b/modules/web-console/frontend/test/e2e/exampe.test.js
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+suite('ExampleTestSuite', () => {
+ setup(() => {
+ // browser.get('http://localhost:9000/');
+ });
+
+ test('initially has a greeting', (done) => {
+ done();
+
+ // element(by.model('ui.email')).sendKeys('jhon@doe.com');
+ });
+
+ test('initially has a greeting', (done) => {
+ done();
+
+ // element(by.model('ui.email')).sendKeys('jhon@doe.com');
+ });
+
+ test('initially has a greeting', (done) => {
+ done();
+
+ // element(by.model('ui.email')).sendKeys('jhon@doe.com');
+ });
+});
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/test/karma.conf.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/test/karma.conf.js b/modules/web-console/frontend/test/karma.conf.js
new file mode 100644
index 0000000..e13ba00
--- /dev/null
+++ b/modules/web-console/frontend/test/karma.conf.js
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+const path = require('path');
+const webpack = require('webpack');
+
+const basePath = path.resolve('./');
+
+module.exports = function(config) {
+ config.set({
+ // Base path that will be used to resolve all patterns (eg. files, exclude).
+ basePath: basePath,
+
+ // Frameworks to use available frameworks: https://npmjs.org/browse/keyword/karma-adapter
+ frameworks: ['mocha'],
+
+ // List of files / patterns to load in the browser.
+ files: [
+ 'test/**/*.test.js'
+ ],
+
+ plugins: [
+ require('karma-phantomjs-launcher'),
+ require('karma-teamcity-reporter'),
+ require('karma-webpack'),
+ require('karma-mocha')
+ ],
+
+ // Preprocess matching files before serving them to the browser
+ // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor.
+ preprocessors: {
+ 'test/**/*.js': ['webpack']
+ },
+
+ webpack: {
+ module: {
+ loaders: [
+ {
+ test: /\.json$/,
+ loader: 'json'
+ },
+ {
+ test: /\.js$/,
+ loader: 'babel',
+ exclude: /node_modules/
+ }
+ ]
+ },
+ resolve: {
+ extensions: ["", ".js"]
+ },
+ plugins: [
+ new webpack.ProvidePlugin({
+ _: 'lodash'
+ })
+ ]
+ },
+
+ webpackMiddleware: {
+ noInfo: true
+ },
+
+ // Test results reporter to use
+ // possible values: 'dots', 'progress'
+ // available reporters: https://npmjs.org/browse/keyword/karma-reporter.
+ reporters: ['teamcity'],
+
+ // web server port
+ port: 9876,
+
+ // enable / disable colors in the output (reporters and logs)
+ colors: true,
+
+ // level of logging
+ // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
+ logLevel: config.LOG_INFO,
+
+ // enable / disable watching file and executing tests whenever any file changes
+ autoWatch: true,
+
+ // start these browsers
+ // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
+ browsers: ['PhantomJS'],
+
+ // Continuous Integration mode
+ // if true, Karma captures browsers, runs the tests and exits
+ singleRun: true,
+
+ // Concurrency level
+ // how many browser should be started simultaneous
+ concurrency: Infinity,
+
+ client: {
+ mocha: {
+ ui: 'tdd'
+ }
+ }
+ });
+};
http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/test/protractor.conf.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/test/protractor.conf.js b/modules/web-console/frontend/test/protractor.conf.js
new file mode 100644
index 0000000..3386e66
--- /dev/null
+++ b/modules/web-console/frontend/test/protractor.conf.js
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// exports.config = {
+// specs: ['test/e2e/*.js'],
+// capabilities: {
+
+// }
+// };
+
+exports.config = {
+ seleniumAddress: 'http://localhost:4444/wd/hub',
+
+ capabilities: {
+ 'browserName': 'chrome'
+ // 'browserName': 'phantomjs',
+
+ // /*
+ // * Can be used to specify the phantomjs binary path.
+ // * This can generally be ommitted if you installed phantomjs globally.
+ // */
+ // 'phantomjs.binary.path': require('phantomjs').path,
+
+ // /*
+ // * Command line args to pass to ghostdriver, phantomjs's browser driver.
+ // * See https://github.com/detro/ghostdriver#faq
+ // */
+ // 'phantomjs.ghostdriver.cli.args': ['--loglevel=DEBUG']
+ },
+
+ specs: ['test/e2e/*.js'],
+
+ jasmineNodeOpts: {
+ showColors: true
+ }
+};
http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/test/unit/JavaTypes.test.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/test/unit/JavaTypes.test.js b/modules/web-console/frontend/test/unit/JavaTypes.test.js
new file mode 100644
index 0000000..25c0f67
--- /dev/null
+++ b/modules/web-console/frontend/test/unit/JavaTypes.test.js
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import JavaTypes from '../../app/services/JavaTypes.service.js';
+
+import { assert } from 'chai';
+
+const { nonBuiltInClass, fullClassName, validIdentifier, validPackage, packageSpecified, isKeywords, isJavaPrimitive} = JavaTypes[1]();
+
+suite('JavaTypesTestsSuite', () => {
+ test('nonBuiltInClass', () => {
+ assert.equal(nonBuiltInClass('BigDecimal'), false);
+ assert.equal(nonBuiltInClass('java.math.BigDecimal'), false);
+
+ assert.equal(nonBuiltInClass('String'), false);
+ assert.equal(nonBuiltInClass('java.lang.String'), false);
+
+ assert.equal(nonBuiltInClass('Timestamp'), false);
+ assert.equal(nonBuiltInClass('java.sql.Timestamp'), false);
+
+ assert.equal(nonBuiltInClass('Date'), false);
+ assert.equal(nonBuiltInClass('java.sql.Date'), false);
+
+ assert.equal(nonBuiltInClass('Date'), false);
+ assert.equal(nonBuiltInClass('java.util.Date'), false);
+
+ assert.equal(nonBuiltInClass('CustomClass'), true);
+ assert.equal(nonBuiltInClass('java.util.CustomClass'), true);
+ assert.equal(nonBuiltInClass('my.package.CustomClass'), true);
+ });
+
+ test('fullClassName', () => {
+ assert.equal(fullClassName('BigDecimal'), 'java.math.BigDecimal');
+ });
+
+ test('validIdentifier', () => {
+ assert.equal(validIdentifier('java.math.BigDecimal'), true);
+ });
+
+ test('validPackage', () => {
+ assert.equal(validPackage('java.math.BigDecimal'), true);
+ });
+
+ test('packageSpecified', () => {
+ assert.equal(packageSpecified('java.math.BigDecimal'), true);
+ });
+
+ test('isKeywords', () => {
+ assert.equal(isKeywords('abstract'), true);
+ });
+
+ test('isJavaPrimitive', () => {
+ assert.equal(isJavaPrimitive('boolean'), true);
+ });
+});
http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/test/unit/UserAuth.test.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/test/unit/UserAuth.test.js b/modules/web-console/frontend/test/unit/UserAuth.test.js
new file mode 100644
index 0000000..dbba1f6
--- /dev/null
+++ b/modules/web-console/frontend/test/unit/UserAuth.test.js
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import AuthService from '../../app/modules/user/Auth.service';
+
+suite('AuthServiceTestsSuite', () => {
+ test('SignIn', (done) => {
+ // TODO IGNITE-3262 Add test.
+ done();
+ });
+
+ test('SignUp', (done) => {
+ // TODO IGNITE-3262 Add test.
+ done();
+ });
+
+ test('Logout', (done) => {
+ // TODO IGNITE-3262 Add test.
+ done();
+ });
+});
http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/views/403.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/403.jade b/modules/web-console/frontend/views/403.jade
new file mode 100644
index 0000000..38d8bb5
--- /dev/null
+++ b/modules/web-console/frontend/views/403.jade
@@ -0,0 +1,22 @@
+//-
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+include includes/header
+
+.error-page
+ .container
+ h1.error-page__title 403
+ h2.error-page__description You are not authorized
http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/views/404.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/404.jade b/modules/web-console/frontend/views/404.jade
new file mode 100644
index 0000000..7d2fc55
--- /dev/null
+++ b/modules/web-console/frontend/views/404.jade
@@ -0,0 +1,22 @@
+//-
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+include includes/header
+
+.error-page
+ .container
+ h1.error-page__title 404
+ h2.error-page__description Page not found
http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/views/base.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/base.jade b/modules/web-console/frontend/views/base.jade
new file mode 100644
index 0000000..a910d1b
--- /dev/null
+++ b/modules/web-console/frontend/views/base.jade
@@ -0,0 +1,22 @@
+//-
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+include includes/header
+
+.container.body-container
+ .main-content(ui-view='')
+
+include includes/footer
http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/views/configuration/caches.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/configuration/caches.jade b/modules/web-console/frontend/views/configuration/caches.jade
new file mode 100644
index 0000000..a1218ec
--- /dev/null
+++ b/modules/web-console/frontend/views/configuration/caches.jade
@@ -0,0 +1,53 @@
+//-
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+include ../../app/helpers/jade/mixins.jade
+
+.docs-header
+ h1 Configure Ignite Caches
+.docs-body(ng-controller='cachesController')
+ ignite-information
+ ul
+ li Configure #[a(href='https://apacheignite.readme.io/docs/data-grid' target='_blank') memory] settings
+ li Configure persistence
+ div(ignite-loading='loadingCachesScreen' ignite-loading-text='Loading caches...' ignite-loading-position='top')
+ div(ng-show='ui.ready')
+ hr
+ +main-table('caches', 'caches', 'cacheName', 'selectItem(row)', '{{$index + 1}}) {{row.label}}', 'label')
+ .padding-top-dflt(bs-affix)
+ .panel-tip-container(data-placement='bottom' bs-tooltip='' data-title='Create new cache')
+ button.btn.btn-primary(id='new-item' ng-click='createItem()') Add cache
+ +save-remove-clone-undo-buttons('cache')
+ hr
+ .bs-affix-fix
+ div(bs-collapse='' data-allow-multiple='true' ng-model='ui.activePanels')
+ form.form-horizontal(name='ui.inputForm' novalidate ng-if='contentVisible()')
+ .panel-group
+ include ../../app/modules/states/configuration/caches/general.jade
+ include ../../app/modules/states/configuration/caches/memory.jade
+ include ../../app/modules/states/configuration/caches/query.jade
+ include ../../app/modules/states/configuration/caches/store.jade
+
+ +advanced-options-toggle-default
+
+ div(ng-show='ui.expanded')
+ include ../../app/modules/states/configuration/caches/concurrency.jade
+ include ../../app/modules/states/configuration/caches/node-filter.jade
+ include ../../app/modules/states/configuration/caches/rebalance.jade
+ include ../../app/modules/states/configuration/caches/server-near-cache.jade
+ include ../../app/modules/states/configuration/caches/statistics.jade
+
+ +advanced-options-toggle-default
http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/views/configuration/clusters.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/configuration/clusters.jade b/modules/web-console/frontend/views/configuration/clusters.jade
new file mode 100644
index 0000000..b10a477
--- /dev/null
+++ b/modules/web-console/frontend/views/configuration/clusters.jade
@@ -0,0 +1,66 @@
+//-
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+include ../../app/helpers/jade/mixins.jade
+
+.docs-header
+ h1 Configure Ignite Clusters
+.docs-body(ng-controller='clustersController')
+ ignite-information
+ ul
+ li Configure #[a(href='https://apacheignite.readme.io/docs/clustering' target='_blank') clusters] properties
+ li Associate clusters with caches and in-memory file systems
+ div(ignite-loading='loadingClustersScreen' ignite-loading-text='Loading clusters...' ignite-loading-position='top')
+ div(ng-show='ui.ready')
+ hr
+ +main-table('clusters', 'clusters', 'clusterName', 'selectItem(row)', '{{$index + 1}}) {{row.label}}', 'label')
+ .padding-top-dflt(bs-affix)
+ .panel-tip-container(data-placement='bottom' bs-tooltip='' data-title='Create new cluster')
+ button.btn.btn-primary(id='new-item' ng-click='createItem()') Add cluster
+ +save-remove-clone-undo-buttons('cluster')
+ hr
+ .bs-affix-fix
+ div(bs-collapse='' data-allow-multiple='true' ng-model='ui.activePanels')
+ form.form-horizontal(name='ui.inputForm' novalidate ng-if='contentVisible()')
+ .panel-group
+ include ../../app/modules/states/configuration/clusters/general.jade
+
+ +advanced-options-toggle-default
+
+ div(ng-show='ui.expanded')
+
+ include ../../app/modules/states/configuration/clusters/atomic.jade
+ include ../../app/modules/states/configuration/clusters/binary.jade
+ include ../../app/modules/states/configuration/clusters/cache-key-cfg.jade
+ include ../../app/modules/states/configuration/clusters/collision.jade
+ include ../../app/modules/states/configuration/clusters/communication.jade
+ include ../../app/modules/states/configuration/clusters/connector.jade
+ include ../../app/modules/states/configuration/clusters/deployment.jade
+ include ../../app/modules/states/configuration/clusters/discovery.jade
+ include ../../app/modules/states/configuration/clusters/events.jade
+ include ../../app/modules/states/configuration/clusters/failover.jade
+ include ../../app/modules/states/configuration/clusters/igfs.jade
+ include ../../app/modules/states/configuration/clusters/logger.jade
+ include ../../app/modules/states/configuration/clusters/marshaller.jade
+ include ../../app/modules/states/configuration/clusters/metrics.jade
+ include ../../app/modules/states/configuration/clusters/ssl.jade
+ include ../../app/modules/states/configuration/clusters/swap.jade
+ include ../../app/modules/states/configuration/clusters/thread.jade
+ include ../../app/modules/states/configuration/clusters/time.jade
+ include ../../app/modules/states/configuration/clusters/transactions.jade
+ include ../../app/modules/states/configuration/clusters/attributes.jade
+
+ +advanced-options-toggle-default
http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/views/configuration/domains-import.jade
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/configuration/domains-import.jade b/modules/web-console/frontend/views/configuration/domains-import.jade
new file mode 100644
index 0000000..d95e98a
--- /dev/null
+++ b/modules/web-console/frontend/views/configuration/domains-import.jade
@@ -0,0 +1,223 @@
+//-
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+include ../../app/helpers/jade/mixins.jade
+
+mixin chk(mdl, change, tip)
+ input(type='checkbox' ng-model=mdl ng-change=change bs-tooltip='' data-title=tip data-trigger='hover' data-placement='top')
+
+mixin td-ellipses-lbl(w, lbl)
+ td.td-ellipsis(width='#{w}' style='min-width: #{w}; max-width: #{w}')
+ label #{lbl}
+
+.modal.modal-domain-import.center(role='dialog')
+ .modal-dialog.domains-import-dialog
+ .modal-content(ignite-loading='importDomainFromDb' ignite-loading-text='{{importDomain.loadingOptions.text}}')
+ #errors-container.modal-header.header
+ button.close(ng-click='$hide()' aria-hidden='true') ×
+ h4.modal-title(ng-if='!importDomain.demo') Import domain models from database
+ h4.modal-title(ng-if='importDomain.demo') Import domain models from demo database
+ .modal-body
+ .import-domain-model-wizard-page(ng-if='importDomain.action == "drivers" && !importDomain.jdbcDriversNotFound')
+ .import-domain-model-wizard-page(ng-if='importDomain.action == "drivers" && importDomain.jdbcDriversNotFound')
+ | Domain model could not be imported
+ ul
+ li Agent failed to find JDBC drivers
+ li Copy required JDBC drivers into agent 'jdbc-drivers' folder and try again
+ li Refer to agent README.txt for more information
+ .import-domain-model-wizard-page(ng-if='importDomain.action == "connect" && importDomain.demo')
+ div(ng-if='demoConnection.db == "H2"')
+ label Demo description:
+ ul
+ li In-memory H2 database server will be started inside agent
+ li Database will be populated with sample tables
+ li You could test domain model generation with this demo database
+ li Click "Next" to continue
+ div(ng-if='demoConnection.db != "H2"')
+ label Demo could not be started
+ ul
+ li Agent failed to resolve H2 database jar
+ li Copy h2-x.x.x.jar into agent 'jdbc-drivers' folder and try again
+ li Refer to agent README.txt for more information
+ .import-domain-model-wizard-page(ng-if='importDomain.action == "connect" && !importDomain.demo')
+ - var form = 'connectForm'
+
+ form.form-horizontal(name=form novalidate)
+ .settings-row
+ label.col-xs-4.col-sm-2.col-md-2.required Driver JAR:
+ .col-xs-8.col-sm-10.col-md-10
+ i.tipField.fa.fa-question-circle(bs-tooltip='' data-title='Select appropriate JAR with JDBC driver<br> To add another driver you need to place it into "/jdbc-drivers" folder of Ignite Web Agent<br> Refer to Ignite Web Agent README.txt for for more information')
+ .input-tip
+ button.select-toggle.form-control(id='jdbcDriverJar' bs-select data-container='.modal-domain-import' ng-model='ui.selectedJdbcDriverJar' ng-class='{placeholder: !(jdbcDriverJars && jdbcDriverJars.length > 0)}' placeholder='Choose JDBC driver' bs-options='item.value as item.label for item in jdbcDriverJars')
+ .settings-row
+ label.col-xs-4.col-sm-2.col-md-2.required JDBC driver:
+ .col-xs-8.col-sm-10.col-md-10
+ - var name = '"jdbcDriverClass"'
+ i.tipField.fa.fa-question-circle(bs-tooltip='' data-title='Fully qualified class name of JDBC driver that will be used to connect to database')
+
+ +form-field-feedback(name, 'javaBuiltInClass', 'JDBC Driver should not be the Java built-in class!')
+ +form-field-feedback(name, 'javaKeywords', 'JDBC Driver could not contains reserved Java keyword!')
+ +form-field-feedback(name, 'javaPackageSpecified', 'JDBC Driver does not have package specified!')
+ +form-field-feedback(name, 'javaIdentifier', 'JDBC Driver is invalid Java identifier!')
+
+ .input-tip
+ +ignite-form-field-input(name, 'selectedPreset.jdbcDriverClass', false, true, 'Enter fully qualified class name')(
+ data-java-identifier='true'
+ data-java-package-specified='true'
+ data-java-keywords='true'
+ data-java-built-in-class='true'
+ )
+ .settings-row
+ label.col-xs-4.col-sm-2.col-md-2.required JDBC URL:
+ .col-xs-8.col-sm-10.col-md-10
+ i.tipField.fa.fa-question-circle(bs-tooltip='' data-title='JDBC URL for connecting to database<br>Refer to your database documentation for details')
+ .input-tip
+ +ignite-form-field-input('jdbcUrl', 'selectedPreset.jdbcUrl', false, true, 'JDBC URL')
+ .settings-row
+ label.col-xs-4.col-sm-2.col-md-2 User:
+ .col-xs-8.col-sm-10.col-md-10
+ i.tipField.fa.fa-question-circle(bs-tooltip='' data-title='User name for connecting to database')
+ .input-tip
+ input.form-control(id='user' type='text' ng-model='selectedPreset.user')
+ .settings-row
+ label.col-xs-4.col-sm-2.col-md-2 Password:
+ .col-xs-8.col-sm-10.col-md-10
+ i.tipField.fa.fa-question-circle(bs-tooltip='' data-title='Password for connecting to database<br>Note, password would not be saved in preferences for security reasons')
+ .input-tip
+ input.form-control(id='password' type='password' ng-model='selectedPreset.password' ignite-on-enter='importDomainNext()')
+ .settings-row
+ .checkbox
+ label
+ input(id='tablesOnly' type='checkbox' ng-model='selectedPreset.tablesOnly')
+ | Tables only
+ i.tipLabel.fa.fa-question-circle(bs-tooltip='' data-title='If selected, then only tables metadata will be parsed<br>Otherwise table and view metadata will be parsed')
+ .import-domain-model-wizard-page(ng-show='importDomain.action == "schemas"')
+ table.table.metadata(st-table='importDomain.displayedSchemas' st-safe-src='importDomain.schemas')
+ thead
+ tr
+ th.header(colspan='2')
+ .col-sm-4.pull-right(style='margin-bottom: 5px')
+ input.form-control(type='text' st-search='name' placeholder='Filter schemas...' ng-model='importDomain.displayedSchemasFilter' ng-change='selectSchema()')
+ tr
+ th(width='30px')
+ +chk('importDomain.allSchemasSelected', 'selectAllSchemas()', 'Select all schemas')
+ th
+ label Schema
+ tbody
+ tr
+ td(colspan='2')
+ .scrollable-y(style='height: 213px')
+ table.table-modal-striped(id='importSchemasData')
+ tbody
+ tr(ng-repeat='schema in importDomain.displayedSchemas')
+ td(width='30px')
+ input(type='checkbox' ng-model='schema.use' ng-change='selectSchema()')
+ td
+ label {{schema.name}}
+ .import-domain-model-wizard-page(ng-show='importDomain.action == "tables"')
+ table.table.metadata(st-table='importDomain.displayedTables' st-safe-src='importDomain.tables')
+ thead
+ tr
+ th.header(colspan='6')
+ .col-sm-4.pull-right(style='margin-bottom: 8px')
+ input.form-control(type='text' st-search='label' placeholder='Filter tables...' ng-model='importDomain.displayedTablesFilter' ng-change='selectTable()')
+ tr
+ th(width='30px')
+ +chk('importDomain.allTablesSelected', 'selectAllTables()', 'Select all tables')
+ th(width='130px')
+ label Schema
+ th(width='160px')
+ label Table name
+ th(colspan=2 width='288px')
+ label Cache
+ th
+ tbody
+ tr
+ td(colspan='6')
+ .scrollable-y(style='height: 143px')
+ table.table-modal-striped(id='importTableData')
+ tbody
+ tr(ng-repeat='table in importDomain.displayedTables track by $index')
+ td(width='30px' style='min-width: 30px; max-width: 30px')
+ input(type='checkbox' ng-model='table.use' ng-change='selectTable()')
+ +td-ellipses-lbl('130px', '{{table.schema}}')
+ +td-ellipses-lbl('160px', '{{table.tbl}}')
+ td(colspan='2' width='288px' style='min-width: 160px; max-width: 160px')
+ div.td-ellipsis
+ a(ng-if='!table.edit' ng-click='startEditDbTableCache(table)') {{tableActionView(table)}}
+ div(style='display: flex' ng-if='table.edit')
+ button.select-toggle.form-control(style='width: 35%; margin-right: 5px' bs-select ng-model='table.action' data-container='.modal-domain-import' bs-options='item.value as item.shortLabel for item in importActions')
+ button.select-toggle.form-control(style='width: 65%; margin-right: 0' bs-select ng-model='table.cacheOrTemplate' data-container='.modal-domain-import' bs-options='item.value as item.label for item in table.cachesOrTemplates')
+ td
+ .settings-row
+ label Defaults to be applied for filtered tables
+ i.tipLabel.fa.fa-question-circle(bs-tooltip='' data-title='Select and apply options for caches generation')
+ .settings-row
+ .col-sm-11
+ .col-sm-6(style='padding-right: 5px')
+ button.select-toggle.form-control(bs-select ng-model='importCommon.action' data-container='.modal-domain-import' bs-options='item.value as item.label for item in importActions')
+ .col-sm-6(style='padding-left: 5px; padding-right: 5px')
+ button.select-toggle.form-control(bs-select ng-model='importCommon.cacheOrTemplate' data-container='.modal-domain-import' bs-options='item.value as item.label for item in importCommon.cachesOrTemplates')
+ .col-sm-1(style='padding-left: 5px')
+ button.btn.btn-primary(ng-click='applyDefaults()') Apply
+ .import-domain-model-wizard-page(ng-show='importDomain.action == "options"')
+ - var form = 'optionsForm'
+ form.form-horizontal(name='optionsForm' novalidate)
+ .settings-row
+ .col-xs-3.col-sm-2.col-md-2.required
+ label.required Package:
+ .col-xs-9.col-sm-10.col-md-10
+ - var name = '"domainPackageName"'
+ i.tipField.fa.fa-question-circle(bs-tooltip='' data-title='Package that will be used for POJOs generation')
+
+ +form-field-feedback(name, 'javaPackageName', 'Package name is invalid')
+ +form-field-feedback(name, 'javaKeywords', 'Package name could not contains reserved java keyword')
+
+ .input-tip
+ +ignite-form-field-input(name, 'ui.packageName', false, true, 'Enter package name')(
+ data-java-keywords='true'
+ data-java-package-name='package-only'
+ ng-model-options='{allowInvalid: true}'
+ )
+ .settings-row
+ .checkbox
+ label
+ input(id='domainBuiltinKeys' type='checkbox' ng-model='ui.builtinKeys')
+ | Use Java built-in types for keys
+ i.tipLabel.fa.fa-question-circle(bs-tooltip='' data-title='Use Java built-in types like "Integer", "Long", "String" instead of POJO generation in case when table primary key contains only one field')
+ .settings-row
+ .checkbox
+ label
+ input(id='domainUsePrimitives' type='checkbox' ng-model='ui.usePrimitives')
+ | Use primitive types for NOT NULL table columns
+ i.tipLabel.fa.fa-question-circle(bs-tooltip='' data-title='Use primitive types like "int", "long", "double" for POJOs fields generation in case of NOT NULL columns')
+ .settings-row
+ .checkbox
+ label
+ input(id='domainGenerateAliases' type='checkbox' ng-model='ui.generateAliases')
+ | Generate aliases for query fields
+ i.tipLabel.fa.fa-question-circle(bs-tooltip='' data-title='Generate aliases for query fields with database field names when database field name differ from Java field name')
+ .settings-row
+ .col-xs-3.col-sm-2.col-md-2.required
+ label Clusters:
+ .col-xs-9.col-sm-10.col-md-10
+ i.tipField.fa.fa-question-circle(bs-tooltip='' data-title='Choose clusters that will be associated with generated caches')
+ .input-tip
+ button.select-toggle.form-control(id='generatedCachesClusters' bs-select ng-model='ui.generatedCachesClusters' ng-class='{placeholder: !(ui.generatedCachesClusters && ui.generatedCachesClusters.length > 0)}' data-container='.modal-domain-import' data-multiple='1' placeholder='Choose clusters for generated caches' bs-options='item.value as item.label for item in clusters')
+ .modal-footer
+ label(ng-hide='importDomain.action == "drivers" || (importDomain.action == "connect" && importDomain.demo)').labelField {{importDomain.info}}
+ a.btn.btn-primary(ng-hide='importDomain.action == "drivers" || importDomain.action == "connect"' ng-click='importDomainPrev()' bs-tooltip='' data-title='{{prevTooltipText()}}' data-placement='bottom') Prev
+ a.btn.btn-primary(ng-click='importDomainNext()' ng-disabled='!importDomainNextAvailable()' bs-tooltip='' data-title='{{nextTooltipText()}}' data-placement='bottom') {{importDomain.button}}