You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by jl...@apache.org on 2016/06/27 23:36:48 UTC
[22/34] ambari git commit: AMBARI-17355 & AMBARI-17354: POC: FE & BE
changes for first class support for Yarn hosted services
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/styles/app_store.less
----------------------------------------------------------------------
diff --git a/ambari-web/app/styles/app_store.less b/ambari-web/app/styles/app_store.less
new file mode 100644
index 0000000..28ee619
--- /dev/null
+++ b/ambari-web/app/styles/app_store.less
@@ -0,0 +1,811 @@
+/**
+ * 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 'common.less';
+
+@lighten-for-apps: #eee;
+@darken-for-apps: #888;
+@darken-for-title: #666;
+@green-for-apps: #3fae2a;
+@size-for-apps: 220px;
+@border-radius-for-apps: 4px;
+
+#main.bg-grey {
+ background-image: url("/img/assemblies-background.png");
+ padding-bottom: 400px;
+ background-repeat-x: repeat;
+ background-repeat-y: no-repeat !important;
+ background-position: 0 100px;
+}
+
+#apps-store {
+
+ .detailed-info {
+
+ background-color: #fff;
+ color: #666;
+ .info-title {
+ text-transform: uppercase;
+ color: #aaa;
+ }
+
+ .containers-title {
+ a {
+ color: #aaa;
+ &:hover {
+ text-decoration: none;
+ }
+ }
+ }
+
+ .containers {
+ .container-title {
+ background: #4a4a4a;
+ padding: 5px 10px;
+ text-transform: uppercase;
+
+ a {
+ color: #fff;
+ &:hover {
+ text-decoration: none;
+ }
+ }
+ }
+ }
+ }
+
+ .sliderBar {
+ height: 1em;
+ border-radius: 0;
+ margin-top: 5px;
+ margin-bottom: 5px;
+ background: #eee;
+ a {
+ border-radius: 0;
+ width: 1.3em;
+ height: 1.3em;
+ }
+ .ui-slider-handle {
+ background: repeating-linear-gradient( 135deg, @lighten-for-apps, @lighten-for-apps 2px, #fff 2px, #fff 4px );
+ }
+ }
+ .ranges {
+ color: @darken-for-apps;
+ }
+
+ .valueInput input {
+ width: 90px;
+ border-radius: 0;
+ &.error {
+ border-color: #b94a48;
+ }
+ }
+
+ h4, h5 {
+ font-weight: 400;
+ margin-bottom: 0;
+ }
+ .top-search-bar {
+ margin-top: -15px;
+ .title {
+ padding-left: 20px;
+ width: 14%;
+ }
+ .title > h2 {
+ font-weight: 300;
+ font-size: 26px;
+ }
+ .subtitle {
+ margin-top: 11px;
+ margin-left: 0;
+ }
+ .subtitle > h5 {
+ font-size: 17px;
+ }
+ .search-box {
+ padding-top: 15px;
+ .icon-search {
+ position: relative;
+ left: 20px;
+ bottom: 2px;
+ }
+ input, input:focus {
+ background: transparent;
+ border-top-color: transparent;
+ border-right-color: transparent;
+ border-left-color: transparent;
+ border-bottom-color: #ccc;
+ border-radius: 0;
+ box-shadow: none;
+ margin-right: 20px;
+ padding-left: 30px;
+ }
+ }
+ }
+ .left-menu {
+
+ .service-groups-block .collapse.in {
+ overflow: visible;
+ }
+
+ .custom-accordion {
+ padding-bottom: 15px;
+ .collapse {
+ transition: height 0.00001s;
+ }
+ }
+
+ .service-group {
+ background-color: #f5f5f5;
+ border: 1px solid #d4d4d4;
+ margin-bottom: 10px;
+ margin-top: 5px;
+
+ .service-group-title {
+ padding: 5px 0 3px 15px;
+ span.pointer {
+ top: -3px;
+ position: relative;
+ }
+ a {
+ padding-left: 5px;
+ position: relative;
+ top: 2px;
+ text-decoration: none;
+ color: #555;
+ width: 105px;
+ overflow: hidden;
+ display: inline-block;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+ img {
+ height: 10px;
+ position: relative;
+ bottom: 4px;
+ }
+ }
+
+ .service-group-title.active {
+ background: #4a4a4a;
+ max-height: 40px;
+ color: #ffffff;
+ a {
+ color: #ffffff;
+ }
+ }
+
+ .service-name-block {
+ width: auto;
+ }
+
+ ul.nav-list > li > a.services-menu-blocks {
+ cursor: default;
+ &:hover {
+ background: transparent;
+ }
+ }
+
+ .service-button {
+ margin-bottom: 10px;
+ }
+ .service-button .btn{
+ text-transform: uppercase;
+ border: 2px solid @darken-for-title;
+ background-color: transparent;
+ box-shadow: none;
+ text-shadow: none;
+ background-image: none;
+ border-radius: 2px;
+ }
+
+ .custom-accordion {
+ padding-bottom: 0;
+ }
+
+ }
+
+ .alerts-count {
+ float: right;
+ }
+ .restart-required-service {
+ display: none;
+ }
+
+
+ h5 a {
+ color: #555;
+ cursor: pointer;
+ text-transform: uppercase;
+ font-weight: normal;
+ font-size: 15px;
+ margin-left: 5px;
+ &:hover {
+ text-decoration: none;
+ }
+ }
+ h5.static-title {
+ color: #3fae2a;
+ margin-bottom: 15px;
+ text-transform: uppercase;
+ font-size: 15px;
+ font-weight: normal;
+ }
+ h5 span.pointer {
+ color: #3fae2a;
+ }
+ border: none;
+ background: none;
+ .nav-list > li > a {
+ color: #555;
+ }
+ .nav-list > li > a:hover {
+ color: #444;
+ }
+ .nav-list > li.active > a {
+ color: #fff;
+ }
+ }
+}
+
+.apps-section {
+ #top-banner {
+ padding: 15px 25px 0px 30px;
+ }
+ h5.section-title {
+ text-transform: uppercase;
+ margin-left: 35px;
+ margin-top: 15px;
+ font-size: 15px;
+ color: @darken-for-title;
+ .icon-question-sign {
+ margin: 8px;
+ color: #ccc;
+ cursor: pointer;
+ }
+ }
+ .no-apps-text {
+ color: #888;
+ font-size: 15px;
+ margin: 20px;
+ }
+}
+
+.store-apps-row {
+ margin-bottom: 35px;
+ margin-top: 10px;
+ display: block;
+ .store-app-span.span2 {
+ width: 17.4%;
+ margin-left: 1.5%;
+ }
+ .store-app-span.span1 {
+ width: 2%;
+ }
+ .slide-left, .slide-right {
+ padding-top: 100px;
+ color: #999;
+ cursor: pointer;
+ &.disabled {
+ opacity: 0.3;
+ cursor: default;
+ }
+ &.is-component {
+ padding-top: 75px;
+ }
+ }
+ .arrow {
+ position: relative;
+ top: 13px;
+ z-index: 110;
+ left: 50%;
+ margin-left: -11px;
+ display: block;
+ width: 0;
+ height: 0;
+ border-left: 10px solid transparent;
+ border-right: 10px solid transparent;
+ border-bottom: 15px solid #fff;
+ &.is-component {
+ top: 63px;
+ }
+ }
+
+ .action-buttons {
+ height: 30px;
+ margin-bottom: 10px;
+ text-align: center;
+ button.btn {
+ text-transform: uppercase;
+ border: 2px solid @green-for-apps;
+ background-color: transparent;
+ box-shadow: none;
+ text-shadow: none;
+ background-image: none;
+ border-radius: 0;
+ }
+ button.btn-success {
+ background-color: @green-for-apps;
+ }
+ button.show-details-button {
+ color: #fff;
+ }
+ button.collections-button {
+ color: @green-for-apps;
+ }
+ }
+}
+
+.bg-block {
+ background: #fff;
+ border: 1px solid @lighten-for-apps;
+ height: @size-for-apps;
+ border-radius: @border-radius-for-apps;
+ position: relative;
+ left: 7px;
+ top: 7px;
+ &.fit-margin {
+ left:0;
+ top: 2px;
+ right: 0;
+ height: 165px;
+ }
+}
+
+.store-app-block-view:hover .bg-block,
+.store-app-block-view.active .bg-block {
+ box-shadow: 0 0 10px #888;
+}
+
+.store-app-block {
+ background: #fff;
+ border: 1px solid @lighten-for-apps;
+ border-radius: @border-radius-for-apps;
+ height: @size-for-apps;
+ margin-top: -@size-for-apps;
+ position: relative;
+ z-index: 100;
+
+ &.fit-margin {
+ height: 165px;
+ top: 55px;
+ .logo {
+ margin-top: -10px;
+ }
+ }
+ .inner-block {
+ padding: 0 10px;
+ cursor: pointer;
+ }
+
+ h4.app-name {
+ width: 130px;
+ overflow: hidden;
+ margin-top: 8px;
+ display: inline-block;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+ p.categories {
+ color: @darken-for-apps;
+ line-height: 16px;
+ margin-bottom: 18px;
+ margin-top: -3px;
+ }
+
+ p.services {
+ color: #999;
+ border-top: 1px solid @lighten-for-apps;
+ text-align: center;
+ padding-top: 5px;
+ font-size: 11px;
+ .icon-ellipsis-horizontal {
+ color: #ccc;
+ padding: 5px;
+ }
+ }
+ .logo {
+ text-align: center;
+ height: 75px;
+ img {
+ height: 90px;
+ width: 90px;
+ }
+ }
+}
+
+.store-app-block-view.active {
+ .store-app-block {
+ background: #4CB8E7;
+ box-shadow: 0 0 4px #ccc;
+ .inner-block {
+ color: #fff !important;
+ .categories {
+ color: #fff;
+ }
+ }
+ p.logo img {
+ -webkit-filter: brightness(0) invert(1);
+ filter: brightness(0) invert(1);
+ }
+ .services {
+ color: #fff;
+ .icon-ellipsis-horizontal {
+ color: #fff;
+ }
+ }
+ }
+}
+
+.selected-store-app-details {
+ position: relative;
+ top: -25px;
+ box-shadow: 0 0 8px #ddd;
+ background-color: #fff;
+ border: 1px solid @lighten-for-apps;
+ border-radius: @border-radius-for-apps;
+ margin-left: 35px;
+ margin-right: 45px;
+ padding: 10px 30px;
+ &.is-component {
+ top: 25px;
+ }
+ .app-contents {
+ padding-right: 20px;
+ .title {
+ font-weight: normal;
+ margin: 5px 0;
+ }
+ .descriptions {
+ color: #686868;
+ font-size: 13px;
+ }
+ .action-buttons {
+ margin-top: 10px;
+ text-align: left;
+ button.btn {
+ text-transform: uppercase;
+ border: 2px solid @green-for-apps;
+ background-color: transparent;
+ box-shadow: none;
+ text-shadow: none;
+ background-image: none;
+ border-radius: 0;
+ }
+ button.btn-success {
+ background-color: @green-for-apps;
+ }
+ button.show-details-button {
+ color: #fff;
+ }
+ button.collections-button {
+ color: @green-for-apps;
+ }
+ }
+ }
+ .span2.app-image {
+ background: #f6f6f6;
+ margin: 15px 5px 15px 0;
+ height: 200px;
+ img {
+ padding-top: 30px;
+ }
+ }
+ .span3.services-images {
+ margin: 15px 0 0 4px;
+ width: 25.5%;
+ .span6.service-image {
+ margin: 0 7px 7px 0;
+ width: 46%;
+ padding: 8px;
+ background: #f6f6f6;
+ }
+ }
+ a.close {
+ position: absolute;
+ top: 7px;
+ right: 7px;
+ color: black;
+ text-decoration: none;
+ padding: 2px 5px 8px 5px;
+ height: 10px;
+ width: 10px;
+ text-align: center;
+ line-height: 15px;
+ border: 2px #000 solid;
+ border-radius: 100px;
+ font-weight: normal;
+ font-size: 1.2em;
+ }
+ a.close:hover {
+ opacity: 0.4;
+ }
+}
+
+.deploy-app-configs-modal {
+ .modal {
+ overflow: visible;
+ top: 20% !important;
+ }
+ .modal-footer {
+ .deploy-app-progress-bar div {
+ border-radius: 0;
+ }
+ .deploy-app-progress-bar{
+ .progress-info.progress-striped .bar, .progress-striped .bar-info {
+ background-color: #6490BF;
+ }
+ }
+ .manage-button {
+ margin-top: 13px;
+ }
+ .deploy-text {
+ color: #686868;
+ }
+ .percent {
+ color: #6490BF;
+ }
+ }
+ .modal-header {
+ a.close {
+ margin-top: 8px;
+ padding: 3px 6px 9px 6px;
+ height: 10px;
+ width: 10px;
+ text-align: center;
+ line-height: 15px;
+ border: 2px #000 solid;
+ border-radius: 100px;
+ font-weight: normal;
+ font-size: 1.2em;
+ }
+ a.close:hover {
+ opacity: 0.4;
+ }
+ .store-app-modal-header {
+ height: 40px;
+ margin-right: 30px;
+ h4 {
+ font-weight: normal;
+ margin: 0 100px;
+ }
+ p.categories {
+ margin-left: 100px;
+ line-height: 20px;
+ small {
+ color: @green-for-apps;
+ }
+ }
+ p.logo {
+ position: relative;
+ top: -90px;
+ left: -20px;
+ text-align: left;
+ height: 75px;
+ img {
+ height: 120px;
+ }
+ }
+ }
+ }
+ .modal-body {
+ background: #f6f6f6;
+ .deploy-app-body-content {
+ padding: 5px 80px;
+ .descriptions, .config-name {
+ color: #686868;
+ }
+ .sliderBar {
+ height: 1em;
+ border-radius: 0;
+ margin-top: 5px;
+ margin-bottom: 5px;
+ background: #eee;
+ a {
+ border-radius: 0;
+ width: 1.3em;
+ height: 1.3em;
+ }
+ .ui-slider-handle {
+ background: repeating-linear-gradient( 135deg, @lighten-for-apps, @lighten-for-apps 2px, #fff 2px, #fff 4px );
+ }
+ }
+ .ranges {
+ color: @darken-for-apps;
+ }
+
+ .valueInput input {
+ width: 90px;
+ border-radius: 0;
+ &.error {
+ border-color: #b94a48;
+ }
+ }
+ }
+ }
+ .modal-footer {
+ background: #fff;
+ button.btn {
+ background-color: transparent;
+ box-shadow: none;
+ text-shadow: none;
+ background-image: none;
+ border-radius: 0;
+ }
+ button.btn-success {
+ text-transform: uppercase;
+ border: 2px solid @green-for-apps;
+ background-color: @green-for-apps;
+ }
+ }
+}
+
+.configs-content {
+ padding: 15px 400px 15px 15px;
+}
+
+.descriptions, .config-name {
+ color: #686868;
+}
+#configs-save-button {
+ padding-top:40px;
+ button.btn {
+ background-color: transparent;
+ box-shadow: none;
+ text-shadow: none;
+ background-image: none;
+ border-radius: 0;
+ }
+ button.btn-success {
+ text-transform: uppercase;
+ border: 2px solid @green-for-apps;
+ background-color: @green-for-apps;
+ }
+}
+
+
+.assembly-header {
+ .desired-state {
+ padding: 15px 5px 0 0;
+ .desired-state-label {
+ padding: 4px 7px;
+ cursor: pointer;
+ border-radius: 0;
+ margin-bottom: 0;
+ text-transform: uppercase;
+ color: #fff;
+ text-shadow: none;
+ &.alert-success {
+ background: #3fae2a;
+ border-color: #3fae2a;
+ }
+ &.alert-danger {
+ background: #b94a48;
+ border-color: #b94a48;
+ }
+ i {
+ color: #fff;
+ padding-left: 5px;
+ }
+ }
+ }
+}
+
+#servicegroup-title {
+ padding-bottom:20px;
+ margin-top: 15px;
+ font-size: 20px;
+ color: @darken-for-title;
+}
+
+#main-servicegroup-section-panel {
+ min-height: 500px;
+ padding: 10px 20px;
+ background-color: rgba(255, 255, 255, 0.6);
+ #assembly-information {
+ width: 28%;
+ margin-left: 5.50%;
+ #assembly-business-impact-label, #assembly-quick-links-label {
+ font-size: 13.5px;
+ color: @darken-for-title;
+ }
+ #assembly-business-impact {
+ margin-bottom: 22px;
+ .business-impact {
+ background-color: #fff;
+ opacity: 0.85;
+ margin-top: 5px;
+ padding: 15px 0 0 10px;
+
+ #fraud-cost {
+ margin-left: 0px;
+ }
+ .description {
+ color: @darken-for-apps;
+ font-size: 13px;
+ }
+ .bi-value {
+ font-size: 35px;
+ font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
+ font-weight: 100;
+ }
+ }
+ }
+ #assembly-quick-links {
+ li {
+ list-style: none;
+ }
+ a.assembly-quick-link {
+ cursor: pointer;
+ color:rgba(0, 136, 204, 0.74);
+ font-size: 13.5px;
+ }
+ }
+ }
+ .service-group-menu-tabs.nav-tabs > li> a {
+ text-transform: uppercase;
+ color: #666;
+ border: 2px solid transparent;
+ }
+ .service-group-menu-tabs.nav-tabs > li> a:hover {
+ background-color: #e3e3e3;
+ }
+ .service-group-menu-tabs.nav-tabs > li.active > a,
+ .service-group-menu-tabs.nav-tabs > li.active > a:hover {
+ cursor: default;
+ background-color: transparent;
+ border-bottom-color: #3fae2a;
+ }
+}
+
+.manage-assembly-content {
+ padding: 5px 10px;
+ .descriptions {
+ color: #686868;
+ font-size: 13px;
+ }
+ #services-label {
+ text-transform: uppercase;
+ margin-top: 15px;
+ font-size: 13.5px;
+ color: @darken-for-title;
+ }
+
+ #services-images {
+ margin: 0;
+ .service-image {
+ cursor: pointer;
+ background: #fcfcfc;
+ border-radius: 2px;
+ padding: 8px;
+ opacity:0.75;
+ margin-left: 0;
+ margin-right:1.75%;
+ margin-bottom:1.75%;
+ }
+ .service-image.active {
+ cursor: auto;
+ box-shadow: 0 0 10px #ccc;
+ opacity:1;
+ }
+ }
+
+ #service-summary {
+ margin-top: 15px;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/styles/application.less
----------------------------------------------------------------------
diff --git a/ambari-web/app/styles/application.less b/ambari-web/app/styles/application.less
index 5c9e69e..91903d0 100644
--- a/ambari-web/app/styles/application.less
+++ b/ambari-web/app/styles/application.less
@@ -2394,8 +2394,29 @@ a:focus {
/*****end styles for dashboard page*****/
+.service-group-name {
+ background-image: -moz-linear-gradient(top, @top-nav-bg-color-from, @top-nav-bg-color-to);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@top-nav-bg-color-from), to(@top-nav-bg-color-to));
+ background-image: -webkit-linear-gradient(top, @top-nav-bg-color-from, @top-nav-bg-color-to);
+ background-image: -o-linear-gradient(top, @top-nav-bg-color-from, @top-nav-bg-color-to);
+ background-image: linear-gradient(to bottom, @top-nav-bg-color-from, @top-nav-bg-color-to);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr= @top-nav-bg-color-from, endColorstr=@top-nav-bg-color-to); //for IE9-
+ -webkit-box-shadow: inset 0 0 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
+ -moz-box-shadow: inset 0 0 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
+ box-shadow: inset 0 0 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
+ max-height: 40px;
+ color: #ffffff;
+ text-shadow: 0 1px 0 #555555;
+ padding-left: 10px;
+ padding-right: 4px;
+ padding-top: 3px;
+ padding-bottom: 3px;
+ border-radius: 2px;
+}
+
/*Services*/
.services-menu {
+ border-radius: 2px;
.nav-list {
.tab-marker-position {
list-style: none;
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/application.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/application.hbs b/ambari-web/app/templates/application.hbs
index 49cb18a..a00571a 100644
--- a/ambari-web/app/templates/application.hbs
+++ b/ambari-web/app/templates/application.hbs
@@ -16,7 +16,7 @@
* limitations under the License.
}}
-<div id="main">
+<div id="main" {{bindAttr class="isAppStorePageSelected:bg-grey"}}>
<div id="top-nav">
<div class="navbar navbar-static-top">
<div class="navbar-inner">
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/common/collapsible.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/common/collapsible.hbs b/ambari-web/app/templates/common/collapsible.hbs
new file mode 100644
index 0000000..9d5cac4
--- /dev/null
+++ b/ambari-web/app/templates/common/collapsible.hbs
@@ -0,0 +1,21 @@
+{{!
+* 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.
+}}
+
+<div class="custom-accordion">
+ {{yield}}
+</div>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies.hbs b/ambari-web/app/templates/main/assemblies.hbs
new file mode 100644
index 0000000..4c668b2
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies.hbs
@@ -0,0 +1,107 @@
+{{!
+* 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.
+}}
+<div id="apps-store">
+ <div class="row-fluid top-search-bar">
+ <div class="span12">
+ <div class="span2 title">
+ <h2>{{t menu.item.appStore}}</h2>
+ </div>
+ <div class="span2 subtitle">
+ <h5>{{subtitle}}</h5>
+ </div>
+ {{#if showFilterString}}
+ <div class="pull-right search-box">
+ <i class="icon-search"></i>{{view Em.TextField valueBinding="filterString" placeholderBinding="searchString"}}
+ </div>
+ {{/if}}
+ </div>
+ </div>
+
+ <div class="row-fluid main-apps-content">
+ <div class="well span2 left-menu" style="padding: 8px 0px 8px 25px">
+ <h5 class="static-title">{{t appStore.menu.header.discover}}</h5>
+ {{#view App.CollapsibleView openOnInit=true}}
+ <h5>
+ <span {{action "toggleCollapse" target="view"}} {{bindAttr class="view.expanded:icon-caret-down:icon-caret-right :pointer"}}></span>
+ <a id="discover-assemblies-label" {{action "toggleCollapse" target="view"}}>{{t common.categories}}</a>
+ </h5>
+ <div id="discover-assemblies-content" class="collapse">
+ <ul class="nav nav-list">
+ {{#each storeCategory in storeCategories}}
+ <li {{bindAttr class="storeCategory.isActive:active"}}>
+ <a href="#" {{action "selectCategory" storeCategory target="controller"}}>{{storeCategory.name}}</a>
+ </li>
+ {{/each}}
+ </ul>
+ </div>
+ {{/view}}
+
+ <h5 class="static-title">{{t appStore.menu.header.manage}}</h5>
+ {{#view App.CollapsibleView class="service-groups-block" openOnInit=false}}
+ <h5>
+ <span {{action "toggleCollapse" target="view"}} {{bindAttr class="view.expanded:icon-caret-down:icon-caret-right :pointer"}}></span>
+ <a id="manage-deployed-assemblies-label" {{action "toggleCollapse" target="view"}}>{{t appStore.collections.assemblies}}</a>
+ </h5>
+ <div class="collapse" id="manage-deployed-assemblies-content">
+ {{#each serviceGroup in visibleServiceGroups}}
+ <div class="service-group">
+ {{#view App.CollapsibleView contentBinding="serviceGroup"}}
+ <div {{bindAttr class="serviceGroup.isActive:active :service-group-title"}}>
+ <div {{action "toggleCollapse" target="view"}}>
+ <span {{bindAttr class="view.expanded:icon-caret-down:icon-caret-right :pointer"}}></span>
+ <a href="#" {{action "makeServiceGroupActive" serviceGroup target="controller"}}>
+ {{serviceGroup.serviceGroupDisplayName}}
+ </a>
+ {{#unless serviceGroup.allServicesAreStarted}}
+ <img src="/img/health-status-dead.png" alt="">
+ {{/unless}}
+ </div>
+ </div>
+ <div class="collapse manage-deployed-assembly">
+ {{view App.MainServiceMenuView serviceGroupBinding="serviceGroup"}}
+ {{view App.AllServicesActionView serviceGroupBinding="serviceGroup"}}
+ </div>
+ {{/view}}
+ </div>
+ {{/each}}
+ </div>
+ {{/view}}
+
+ {{#view App.CollapsibleView}}
+ <h5>
+ <span {{action "toggleCollapse" target="view"}} {{bindAttr class="view.expanded:icon-caret-down:icon-caret-right :pointer"}}></span>
+ <a id="manage-assemblies-collection-label" {{action "toggleCollapse" target="view"}}>{{t appStore.collections.header}}</a>
+ </h5>
+ <div class="collapse" id="manage-assemblies-collection-content">
+ <ul class="nav nav-list">
+ {{#each storeCollection in storeCollections}}
+ <li {{bindAttr class="storeCollection.isActive:active"}}>
+ <a
+ href="#" {{action "selectCollection" storeCollection target="controller"}}>{{storeCollection.name}}</a>
+ </li>
+ {{/each}}
+ </ul>
+ </div>
+ {{/view}}
+
+ </div>
+ <div class="span10 apps-section">
+ {{outlet}}
+ </div>
+ </div>
+</div>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies/active_store_app.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies/active_store_app.hbs b/ambari-web/app/templates/main/assemblies/active_store_app.hbs
new file mode 100644
index 0000000..44d2595
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies/active_store_app.hbs
@@ -0,0 +1,42 @@
+{{!
+* 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.
+}}
+
+<div {{bindAttr class=":selected-store-app-details view.storeApp.isComponent:is-component"}}>
+ <div class="row-fluid">
+ <div class="span7 app-contents">
+ <h3 class="title">{{view.title}}</h3>
+ <p class="descriptions">{{nl2br view.storeApp.description}}</p>
+ <p class="action-buttons">
+ <button type="button" class="btn btn-success" {{action "startDeploy" target="controller"}}>{{t common.deploy}}</button>
+ <button type="button" class="btn collections-button" {{action "addToCollection" target="controller"}}><span class="icon-plus"></span> {{t appStore.collections.addToCollection}}</button>
+ </p>
+ </div>
+ <div class="span2 app-image">
+ <img {{bindAttr src="view.storeApp.logoUrl" alt="view.storeApp.name"}} />
+ </div>
+ <div class="span3 services-images">
+ {{! Services logos }}
+ {{#each service in view.shownServices}}
+ <div class="span6 service-image">
+ <img {{bindAttr src="service.url" alt="service.name" title="service.name"}}/>
+ </div>
+ {{/each}}
+ </div>
+ <a class="close" {{action "closeDetails" target="controller"}}>x</a>
+ </div>
+</div>
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies/apps_row.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies/apps_row.hbs b/ambari-web/app/templates/main/assemblies/apps_row.hbs
new file mode 100644
index 0000000..182973d
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies/apps_row.hbs
@@ -0,0 +1,45 @@
+{{!
+* 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.
+}}
+
+<h5 class="section-title">{{view.rowTitle}}
+ <i {{bindAttr class="view.rowTitle :icon-question-sign"}}></i>
+</h5>
+<div class="row-fluid store-apps-row">
+ <div {{bindAttr class=":slide-left :store-app-span :span1 :icon-chevron-left :icon-2x
+ view.disabledLeft:disabled view.isComponents:is-component" }}
+ {{action moveLeft target="view"}}>
+ </div>
+ {{#each storeApp in view.visibleApps}}
+ <div class="store-app-span span2">
+ {{view App.StoreAppBlockView storeAppBinding="storeApp"}}
+ {{#if storeApp.isActive}}
+ <div {{bindAttr class=":arrow storeApp.isComponent:is-component"}}></div>{{/if}}
+ </div>
+ {{/each}}
+ <div {{bindAttr class=":slide-right :store-app-span :span1 :icon-chevron-right :icon-2x
+ view.disabledRight:disabled view.isComponents:is-component" }}
+ {{action moveRight target="view"}}>
+ </div>
+</div>
+{{#if view.hasActiveApp}}
+ <div class="row-fluid">
+ <div class="span12">
+ {{view App.ActiveStoreAppView storeAppBinding="view.activeApp"}}
+ </div>
+ </div>
+{{/if}}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies/categories/category.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies/categories/category.hbs b/ambari-web/app/templates/main/assemblies/categories/category.hbs
new file mode 100644
index 0000000..49f909f
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies/categories/category.hbs
@@ -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.
+}}
+<div id="top-banner">
+ <img src="/img/assemblies-banner.jpg" alt="Assemblies Banner"/>
+</div>
+{{#if storeAppsEmpty}}
+ <div class="no-apps-text">
+ {{t appStore.apps.noApps}}
+ </div>
+{{else}}
+ {{#if assemblies.length}}
+ {{view App.AppsRowView appsBinding="assemblies" rowTitleBinding="assembliesTitle"}}
+ {{/if}}
+ {{#if components.length}}
+ {{view App.AppsRowView appsBinding="components" rowTitleBinding="componentsTitle" isComponents=true}}
+ {{/if}}
+{{/if}}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies/collections/collection.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies/collections/collection.hbs b/ambari-web/app/templates/main/assemblies/collections/collection.hbs
new file mode 100644
index 0000000..14f5174
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies/collections/collection.hbs
@@ -0,0 +1,30 @@
+{{!
+* 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.
+}}
+
+{{#if storeAppsEmpty}}
+ <div class="no-apps-text">
+ {{t appStore.apps.noApps}}
+ </div>
+{{else}}
+ {{#if assemblies.length}}
+ {{view App.AppsRowView appsBinding="assemblies" rowTitleBinding="assembliesTitle"}}
+ {{/if}}
+ {{#if components.length}}
+ {{view App.AppsRowView appsBinding="components" rowTitleBinding="componentsTitle"}}
+ {{/if}}
+{{/if}}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies/deploy_store_app.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies/deploy_store_app.hbs b/ambari-web/app/templates/main/assemblies/deploy_store_app.hbs
new file mode 100644
index 0000000..65f2254
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies/deploy_store_app.hbs
@@ -0,0 +1,25 @@
+{{!
+* 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.
+}}
+
+<div class="deploy-app-body-content">
+ <p class="descriptions">{{t assemblies.app.deploy.popup.description}}</p>
+
+ {{#each config in view.parentView.storeApp.configurations}}
+ {{view App.DeployStoreAppView configBinding="config" isDeployingBinding="isDeploying"}}
+ {{/each}}
+</div>
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies/deploy_store_app/config.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies/deploy_store_app/config.hbs b/ambari-web/app/templates/main/assemblies/deploy_store_app/config.hbs
new file mode 100644
index 0000000..81a6c1a
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies/deploy_store_app/config.hbs
@@ -0,0 +1,30 @@
+{{!
+* 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.
+}}
+
+<div class="config_form">
+ <p class="config-name">{{view.config.name}}</p>
+ <div class="row-fluid">
+ <div class="span8">
+ <div class="sliderBar"></div>
+ <div class="ranges"><span class="pull-left">{{view.config.minValue}}</span><span class="pull-right">{{view.config.maxValue}}</span></div>
+ </div>
+ <div {{bindAttr class=":span4 :valueInput :control-group view.config.errorMessage:error" }}>
+ {{view view.sliderInputView valueBinding="view.config.value"}}
+ </div>
+ </div>
+</div>
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies/deploy_store_app/deploy_store_app_footer.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies/deploy_store_app/deploy_store_app_footer.hbs b/ambari-web/app/templates/main/assemblies/deploy_store_app/deploy_store_app_footer.hbs
new file mode 100644
index 0000000..ed86570
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies/deploy_store_app/deploy_store_app_footer.hbs
@@ -0,0 +1,44 @@
+{{!
+* 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.
+}}
+
+<div class="modal-footer">
+ {{#if view.parentView.isDeploying}}
+ <div class="row-fluid">
+ <div class="span8">
+ <div>
+ <span class="pull-left deploy-text">{{t common.deploying}}</span>
+ <span class="percent">{{view.parentView.progress}}%</span>
+ </div>
+ <div {{bindAttr class=":deploy-app-progress-bar :progress-bar"}}>
+ <div class="progress-striped active progress-info progress">
+ <div class="bar" {{bindAttr style="view.parentView.progressStyle"}}></div>
+ </div>
+ </div>
+ </div>
+ <div class="span4">
+ <button {{bindAttr class=":manage-button :btn view.parentView.primaryClass"}}
+ {{action onSecondary target="view.parentView"}}>{{t common.manage}}</button>
+ </div>
+ </div>
+ {{else}}
+ <button {{bindAttr disabled="view.parentView.disableSecondary" class=":btn view.parentView.secondaryClass"}}
+ {{action onSecondary target="view.parentView"}}>{{view.parentView.secondary}}</button>
+ <button {{bindAttr disabled="view.parentView.storeApp.someConfigurationInvalid" class=":btn view.parentView.primaryClass"}}
+ {{action onPrimary target="view.parentView"}}>{{view.parentView.primary}}</button>
+ {{/if}}
+</div>
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies/deploy_store_app/deploy_store_app_header.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies/deploy_store_app/deploy_store_app_header.hbs b/ambari-web/app/templates/main/assemblies/deploy_store_app/deploy_store_app_header.hbs
new file mode 100644
index 0000000..5326453
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies/deploy_store_app/deploy_store_app_header.hbs
@@ -0,0 +1,26 @@
+{{!
+* 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.
+}}
+
+<div class="store-app-modal-header">
+ <h4>{{ view.parentView.storeApp.name }}</h4>
+ <p class="categories">
+ <small>{{ view.categories }}</small></p>
+ <p class="logo">
+ <img {{bindAttr src="view.parentView.storeApp.logoUrl"}} />
+ </p>
+</div>
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies/service_groups/configs.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies/service_groups/configs.hbs b/ambari-web/app/templates/main/assemblies/service_groups/configs.hbs
new file mode 100644
index 0000000..a12074e
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies/service_groups/configs.hbs
@@ -0,0 +1,27 @@
+{{!
+* 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.
+}}
+
+
+<div class="configs-content">
+ {{#each config in content.configurations}}
+ {{view App.DeployStoreAppView configBinding="config" isDeploying=false}}
+ {{/each}}
+ <div id="configs-save-button">
+ <button class="btn btn-success pull-left" {{action "saveConfiguration" target="controller"}} {{bindAttr disabled="content.someConfigurationInvalid"}}>{{t common.save}}</button>
+ </div>
+</div>
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies/service_groups/detailed_info.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies/service_groups/detailed_info.hbs b/ambari-web/app/templates/main/assemblies/service_groups/detailed_info.hbs
new file mode 100644
index 0000000..697863a
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies/service_groups/detailed_info.hbs
@@ -0,0 +1,114 @@
+{{!
+* 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.
+}}
+
+<div class="detailed-info">
+
+ <table class="table table-bordered">
+ <tr>
+ <td colspan="3">
+ <span class="info-title">{{t assembly.detailedInfo.infoTitle.assemblyName}}</span><br/>
+ {{content.serviceGroupNameLower}}
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span class="info-title">{{t assembly.detailedInfo.infoTitle.uri}}</span><br/>
+ {{content.uri}}
+ </td>
+ <td>
+ <span class="info-title">{{t assembly.detailedInfo.infoTitle.lifetime}}</span><br/>
+ {{content.lifetime}}
+ </td>
+ <td>
+ <span class="info-title">{{t assembly.detailedInfo.infoTitle.expectedContainers}}</span><br/>
+ {{content.containers.length}}
+ </td>
+ </tr>
+ <tr>
+ <td colspan="3">
+ {{#view App.CollapsibleView}}
+ <p class="containers-title">
+ <a href="#" {{action "toggleCollapse" target="view"}}>
+ <span {{bindAttr class="view.expanded:icon-caret-down:icon-caret-right :pointer"}}></span>
+ <span class="info-title">{{t assembly.detailedInfo.infoTitle.containers}} ({{content.containers.length}})</span>
+ </a>
+ </p>
+ <div class="collapse">
+ <div class="containers">
+ {{#each container in containers}}
+
+ {{#view App.CollapsibleView}}
+ <p class="container-title">
+ <a href="#" {{action "toggleCollapse" target="view"}}>
+ <span {{bindAttr class="view.expanded:icon-caret-down:icon-caret-right :pointer"}}></span>
+ {{container.id}}
+ </a>
+ </p>
+ <div class="collapse">
+ <table class="table table-striped table-bordered table-condensed">
+ <tbody>
+ <tr>
+ <td class="span2">{{t common.name}}</td>
+ <td class="span10">{{container.component_name}}</td>
+ </tr>
+ <tr>
+ <td>{{t common.uri}}</td>
+ <td>{{container.uri}}</td>
+ </tr>
+ <tr>
+ <td>{{t common.ip}}</td>
+ <td>{{container.ip}}</td>
+ </tr>
+ <tr>
+ <td>{{t common.hostName}}</td>
+ <td>{{container.hostname}}</td>
+ </tr>
+ <tr>
+ <td>{{t common.state}}</td>
+ <td>{{container.state}}</td>
+ </tr>
+ <tr>
+ <td>{{t assembly.detailedInfo.containers.launchTime}}</td>
+ <td>{{container.launch_time}}</td>
+ </tr>
+ <tr>
+ <td>{{t assembly.detailedInfo.containers.bareHost}}</td>
+ <td>{{container.bare_host}}</td>
+ </tr>
+ <tr>
+ <td>{{t common.cpu}}</td>
+ <td>{{container.resource.cpus}}</td>
+ </tr>
+ <tr>
+ <td>{{t common.memory}}</td>
+ <td>{{container.resource.memory}}</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ {{/view}}
+
+ {{/each}}
+ </div>
+ </div>
+ {{/view}}
+ </td>
+ </tr>
+ </table>
+
+</div>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies/service_groups/menu.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies/service_groups/menu.hbs b/ambari-web/app/templates/main/assemblies/service_groups/menu.hbs
new file mode 100644
index 0000000..d237c42
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies/service_groups/menu.hbs
@@ -0,0 +1,25 @@
+{{!
+* 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.
+}}
+
+<ul class="nav nav-tabs service-group-menu-tabs">
+ {{#each item in view.menu}}
+ <li {{bindAttr class="item.isActive:active"}}>
+ <a href="#" {{action "moveTo" item.route target="view" }}>{{item.title}}</a>
+ </li>
+ {{/each}}
+</ul>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies/service_groups/service_group.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies/service_groups/service_group.hbs b/ambari-web/app/templates/main/assemblies/service_groups/service_group.hbs
new file mode 100644
index 0000000..6b0fd57
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies/service_groups/service_group.hbs
@@ -0,0 +1,38 @@
+{{!
+* 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.
+}}
+<div class="assembly-header">
+ <h5 id="servicegroup-title" class="pull-left">
+ {{content.serviceGroupDisplayName}}
+ {{#if content.alertsCount}}
+ <span class="label alerts-crit-count">{{content.shownAlertsCount}}</span>
+ {{/if}}
+ </h5>
+ <p class="desired-state pull-right">
+ {{#if content.isStarted}}
+ <span class="pull-right alert alert-success desired-state-label" {{action "stopServiceGroup" target="controller"}}>{{t common.running}} <a href="#"><i class="icon-pause"></i></a></span>
+ {{/if}}
+ {{#if content.isStopped}}
+ <span class="pull-right alert alert-danger desired-state-label" {{action "startServiceGroup" target="controller"}}>{{t common.stopped}} <a href="#"><i class="icon-play"></i></a></span>
+ {{/if}}
+ </p>
+ <div class="clearfix"></div>
+</div>
+<div id="main-servicegroup-section-panel">
+ {{view App.MainAssembliesServiceGroupMenuView}}
+ {{outlet}}
+</div>
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies/service_groups/summary.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies/service_groups/summary.hbs b/ambari-web/app/templates/main/assemblies/service_groups/summary.hbs
new file mode 100644
index 0000000..b5fb02f
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies/service_groups/summary.hbs
@@ -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.
+}}
+
+<div class="manage-assembly-content span8">
+ <p class="descriptions">{{content.description}}</p>
+ <p id="services-label">{{t assembly.manage.summary.label.service}}</p>
+ <div id="services-images">
+ {{! Services logos }}
+ {{#each service in view.shownServices}}
+ <div {{bindAttr class="service.isActive:active :span2 :service-image"}}>
+ <img {{action "makeServiceActive" service target="view"}} {{bindAttr src="service.url" alt="service.displayName" title="service.displayName"}}/>
+ </div>
+ {{/each}}
+ </div>
+ <div class="clearfix"></div>
+ <div class="box" id="service-summary">
+ <div class="box-header summary-box-header">
+ <h4>{{view.activeService.displayName}} {{t services.service.info.menu.summary}}</h4>
+ </div>
+ {{#if view.showSpinner}}
+ {{view App.SpinnerView}}
+ {{else}}
+ {{view view.serviceSummaryView}}
+ {{/if}}
+ </div>
+</div>
+<div id="assembly-information" class="span4">
+ {{#if content.isCfMonitorServiceGroup}}
+ <div id="assembly-business-impact">
+ <span id="assembly-business-impact-label">{{t assembly.manage.summary.business.impact}}</span>
+ <div class="business-impact">
+ <div class="span6" id="fraud-transactions">
+ <p class="bi-value text-error">{{content.businessImpact.fraudTransactions}}</p>
+ <p class="description">{{t assembly.manage.fraudTransactions}}</p>
+ </div>
+ <div class="span6" id="fraud-cost">
+ <p class="bi-value">{{content.businessImpact.fraudCost}}</p>
+ <p class="description">{{t assembly.manage.fraudCost}}</p>
+ </div>
+ <div class="clearfix"></div>
+ </div>
+ </div>
+ {{/if}}
+ <div id="assembly-quick-links">
+ <span id="assembly-quick-links-label">{{t assembly.manage.summary.quick.links}}</span>
+ <li> <a tabindex="-1" class="assembly-quick-link" href="#" {{action "showAssemblyFile" target="view"}}>{{t assembly.manage.assemblySpecFile}}</a></li>
+ {{#each assemblyLink in content.assemblyLinks}}
+ <li> <a tabindex="-1" class="assembly-quick-link" {{bindAttr href="assemblyLink.url"}} target="_blank">{{assemblyLink.label}}</a></li>
+ {{/each}}
+ </div>
+</div>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies/store_app_block.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies/store_app_block.hbs b/ambari-web/app/templates/main/assemblies/store_app_block.hbs
new file mode 100644
index 0000000..d2f3893
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies/store_app_block.hbs
@@ -0,0 +1,41 @@
+{{!
+* 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.
+}}
+
+<div class="outer-block" {{action "showDetails" view.storeApp target="controller"}}>
+ <div {{bindAttr class=":bg-block view.showBgBlock::fit-margin"}}></div>
+ <div {{bindAttr class=":store-app-block view.showBgBlock::fit-margin"}}>
+ <div class="inner-block">
+ <h4 class="app-name">{{view.storeApp.name}}</h4>
+ <p class="categories">
+ <small>{{view.categoryNames}}</small>
+ </p>
+ <p class="logo">
+ <img {{bindAttr src="view.storeApp.logoUrl" alt="view.storeApp.name"}} />
+ </p>
+ <div class="action-buttons"></div>
+ </div>
+ {{#unless view.storeApp.isComponent}}
+ <p class="services">
+ {{view.shownServices}}
+ {{#if view.moreServices}}
+ <i class="icon-ellipsis-horizontal"></i>
+ {{/if}}
+ </p>
+ {{/unless}}
+ </div>
+</div>
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/dashboard.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/dashboard.hbs b/ambari-web/app/templates/main/dashboard.hbs
index f020162..c3df5c1 100644
--- a/ambari-web/app/templates/main/dashboard.hbs
+++ b/ambari-web/app/templates/main/dashboard.hbs
@@ -17,20 +17,28 @@
}}
<div class="row-fluid">
- <div class="services-menu well span2 service-menu-width" style="padding: 8px 0">
- {{view App.MainServiceMenuView}}
- {{view App.AllServicesActionView}}
+ <div class="span2 service-menu-width" style="padding: 8px 0">
+ <div class="service-group-name">
+ {{App.currentStackName}}
+ {{#if coreServiceGroup.alertsCount}}
+ <span class="label alerts-count alerts-crit-count pull-right">{{coreServiceGroup.shownAlertsCount}}</span>
+ {{/if}}
+ </div>
+ <div class="services-menu well" style="padding: 8px 0">
+ {{view App.MainServiceMenuView serviceGroupBinding="coreServiceGroup"}}
+ {{view App.AllServicesActionView serviceGroupBinding="coreServiceGroup"}}
+ </div>
</div>
- <div class="summary-width span10" id="dashboard-widgets-container">
- <ul class="nav nav-tabs background-text">
- {{#each category in view.categories}}
- {{#view view.NavItemView itemBinding="category.name" }}
- <a href="#" {{action "goToDashboardView" category.url}} >{{category.label}}</a>
- {{/view}}
- {{/each}}
- </ul>
+ <div class="summary-width span10" id="dashboard-widgets-container">
+ <ul class="nav nav-tabs background-text">
+ {{#each category in view.categories}}
+ {{#view view.NavItemView itemBinding="category.name" }}
+ <a href="#" {{action "goToDashboardView" category.url}} >{{category.label}}</a>
+ {{/view}}
+ {{/each}}
+ </ul>
<!--show widgets, heatmaps or configs in the content-->
- {{outlet}}
- </div>
+ {{outlet}}
+ </div>
</div>
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/service.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/service.hbs b/ambari-web/app/templates/main/service.hbs
index 3a4f786..f56d48a 100644
--- a/ambari-web/app/templates/main/service.hbs
+++ b/ambari-web/app/templates/main/service.hbs
@@ -17,9 +17,21 @@
}}
<div class="row-fluid">
- <div class="services-menu well span2 service-menu-width" style="padding: 8px 0">
- {{view App.MainServiceMenuView}}
- {{view App.AllServicesActionView}}
+ <div class="span2 service-menu-width" style="padding: 8px 0">
+ <div class="service-group-name">
+ {{#if serviceGroup.isCoreServiceGroup}}
+ {{App.currentStackName}}
+ {{else}}
+ {{serviceGroup.serviceGroupDisplayName}}
+ {{/if}}
+ {{#if serviceGroup.alertsCount}}
+ <span class="label alerts-count alerts-crit-count pull-right">{{serviceGroup.shownAlertsCount}}</span>
+ {{/if}}
+ </div>
+ <div class="services-menu well" style="padding: 8px 0">
+ {{view App.MainServiceMenuView serviceGroupBinding="serviceGroup"}}
+ {{view App.AllServicesActionView serviceGroupBinding="serviceGroup"}}
+ </div>
</div>
<div class="span10 summary-width">
{{outlet}}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/service/all_services_actions.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/service/all_services_actions.hbs b/ambari-web/app/templates/main/service/all_services_actions.hbs
index edcd29c..987adc4 100644
--- a/ambari-web/app/templates/main/service/all_services_actions.hbs
+++ b/ambari-web/app/templates/main/service/all_services_actions.hbs
@@ -24,39 +24,45 @@
</a>
<ul class="pull-left dropdown-menu">
{{#isAuthorized "SERVICE.ADD_DELETE_SERVICES"}}
- <li {{bindAttr class="view.serviceController.isAllServicesInstalled:disabled"}}>
+ {{#if view.serviceGroup.isCoreServiceGroup}}
+ <li {{bindAttr class="view.serviceGroup.isAllServicesInstalled:disabled"}}>
<a href="#"
- {{bindAttr class="view.serviceController.isAllServicesInstalled:disabled"}}
+ {{bindAttr class="view.serviceGroup.isAllServicesInstalled:disabled"}}
{{action gotoAddService target="view.serviceController"}}>
<i class="icon-plus icon-white"></i> {{t services.service.add}}</a>
</li>
+ {{/if}}
{{/isAuthorized}}
{{#isAuthorized "SERVICE.START_STOP"}}
+ {{#if view.serviceGroup.isCoreServiceGroup}}
<li class="divider"></li>
- <li {{bindAttr class="view.serviceController.isStartAllDisabled:disabled" }}>
+ {{/if}}
+ <li {{bindAttr class="view.isStartAllDisabled:disabled" }}>
<a href="#" data-toggle="modal"
- {{bindAttr class="view.serviceController.isStartAllDisabled:disabled" }}
- {{action "startAllService" target="view.serviceController"}}>
- <i {{bindAttr class=":icon-play view.serviceController.isStartAllDisabled:disabled:enabled " }}></i>
+ {{bindAttr class="view.isStartAllDisabled:disabled" }}
+ {{action "startAllService" view.serviceGroup target="view.serviceController"}}>
+ <i {{bindAttr class=":icon-play view.isStartAllDisabled:disabled:enabled " }}></i>
{{t services.service.startAll}}
</a>
</li>
- <li {{bindAttr class="view.serviceController.isStopAllDisabled:disabled" }}>
+ <li {{bindAttr class="view.isStopAllDisabled:disabled" }}>
<a href="#" data-toggle="modal"
- {{bindAttr class="view.serviceController.isStopAllDisabled:disabled" }}
- {{action "stopAllService" target="view.serviceController"}}>
- <i {{bindAttr class=":icon-stop view.serviceController.isStopAllDisabled:disabled:enabled" }}></i>
+ {{bindAttr class="view.isStopAllDisabled:disabled" }}
+ {{action "stopAllService" view.serviceGroup target="view.serviceController"}}>
+ <i {{bindAttr class=":icon-stop view.isStopAllDisabled:disabled:enabled" }}></i>
{{t services.service.stopAll}}
</a>
</li>
- <li {{bindAttr class="view.serviceController.isRestartAllRequiredDisabled:disabled" }}>
+ {{#if view.serviceGroup.isCoreServiceGroup}}
+ <li {{bindAttr class="view.isRestartAllRequiredDisabled:disabled" }}>
<a href="#" data-toggle="modal"
- {{bindAttr class="view.serviceController.isRestartAllRequiredDisabled:disabled" }}
- {{action "restartAllRequired" target="view.serviceController"}}>
- <i {{bindAttr class=":icon-repeat view.serviceController.isRestartAllRequiredDisabled:disabled:enabled" }}></i>
+ {{bindAttr class="view.isRestartAllRequiredDisabled:disabled" }}
+ {{action "restartAllRequired" view.serviceGroup target="view.serviceController"}}>
+ <i {{bindAttr class=":icon-repeat view.isRestartAllRequiredDisabled:disabled:enabled" }}></i>
{{t services.service.restartAllRequired}}
</a>
- </li>
+ </li>
+ {{/if}}
{{/isAuthorized}}
</ul>
</div>
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/service/item.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/service/item.hbs b/ambari-web/app/templates/main/service/item.hbs
index c22424b..d7d70fe 100644
--- a/ambari-web/app/templates/main/service/item.hbs
+++ b/ambari-web/app/templates/main/service/item.hbs
@@ -58,7 +58,7 @@
{{#isAuthorized "SERVICE.RUN_CUSTOM_COMMAND, SERVICE.RUN_SERVICE_CHECK, SERVICE.START_STOP, SERVICE.TOGGLE_MAINTENANCE, SERVICE.ENABLE_HA"}}
<div class="service-button">
- {{#if view.isMaintenanceActive}}
+ {{#if view.isServiceActionsVisible}}
<div class="btn-group display-inline-block">
<a class="btn dropdown-toggle" id="service-actions-dropdown-btn" data-toggle="dropdown" href="#">
{{t services.service.actions.serviceActions}}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/utils/ajax/ajax.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/ajax/ajax.js b/ambari-web/app/utils/ajax/ajax.js
index 195dab4..b873239 100644
--- a/ambari-web/app/utils/ajax/ajax.js
+++ b/ambari-web/app/utils/ajax/ajax.js
@@ -2935,6 +2935,26 @@ var urls = {
'service.components.load': {
real: '/clusters/{clusterName}/services?fields=components&minimal_response=true',
mock: '/data/services/components.json'
+ },
+ 'service_group.get.info': {
+ real: '/clusters/{clusterName}/servicegroups?fields=*',
+ mock: '',
+ type: 'GET'
+ },
+ 'service_group.change_state': {
+ real: '/clusters/{clusterName}/servicegroups/{id}',
+ mock: '',
+ format: function (data) {
+ return {
+ type: 'PUT',
+ data: JSON.stringify({
+ RequestInfo: {context: "Starting " + data.id},
+ ServiceGroupInfo: {
+ desired_state: data.state
+ }
+ })
+ }
+ }
}
};
/**
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/utils/handlebars_helpers.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/handlebars_helpers.js b/ambari-web/app/utils/handlebars_helpers.js
index eca816c..997396e 100644
--- a/ambari-web/app/utils/handlebars_helpers.js
+++ b/ambari-web/app/utils/handlebars_helpers.js
@@ -39,6 +39,7 @@ App.registerBoundHelper = function(name, view) {
* {{pluralize hostsCount singular="@view.hostName"}}
*/
App.registerBoundHelper('pluralize', App.PluralizeView);
+
/**
* Return defined string instead of empty if value is null/undefined
* by default is `n/a`.
@@ -100,4 +101,10 @@ App.registerBoundHelper('statusIcon', App.StatusIconView);
* Return `span` with formatted service name
* @param {string} content - serviceName
*/
-App.registerBoundHelper('formatRole', App.FormatRoleView);
\ No newline at end of file
+App.registerBoundHelper('formatRole', App.FormatRoleView);
+
+/**
+ * Return `span` with message where all "\n" are replaced with br-tag
+ * @param {string} content - message to show
+ */
+App.registerBoundHelper('nl2br', App.Nl2BrView);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/utils/misc.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/misc.js b/ambari-web/app/utils/misc.js
index ae0e49b..1dab04b 100644
--- a/ambari-web/app/utils/misc.js
+++ b/ambari-web/app/utils/misc.js
@@ -54,11 +54,13 @@ module.exports = {
return ((((((+d[0])*256)+(+d[1]))*256)+(+d[2]))*256)+(+d[3]);
},
- sortByOrder: function (sortOrder, array) {
+ sortByOrder: function (sortOrder, array, sortByParam) {
+ sortByParam = sortByParam || 'stackServiceName';
var sorted = [];
for (var i = 0; i < sortOrder.length; i++)
for (var j = 0; j < array.length; j++) {
- if (sortOrder[i] == Em.get(array[j], 'id')) {
+ var value = Em.get(array[j], sortByParam) || Em.get(array[j], 'stack_service_name') || Em.get(array[j], 'id');
+ if (sortOrder[i] == value) {
sorted.push(array[j]);
}
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/views.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views.js b/ambari-web/app/views.js
index 7127420..16a9f97 100644
--- a/ambari-web/app/views.js
+++ b/ambari-web/app/views.js
@@ -100,9 +100,11 @@ require('views/common/assign_master_components_view');
require('views/common/helpers/format_word_break_view');
require('views/common/helpers/format_null_view');
require('views/common/helpers/format_role_view');
+require('views/common/helpers/nl2br_view');
require('views/common/helpers/pluralize_view');
require('views/common/helpers/status_icon_view');
require('views/common/chosen_plugin');
+require('views/common/collapsible_view');
require('views/common/export_metrics_menu_view');
require('views/login');
require('views/main');
@@ -307,6 +309,23 @@ require('views/main/service/info/metrics/flume/cpu_user');
require('views/main/service/info/metrics/flume/flume_metric_graph');
require('views/main/service/info/metrics/flume/flume_metric_graphs');
+require('views/main/assemblies/apps_row_view');
+require('views/main/assemblies_view');
+require('views/main/assemblies/categories_view');
+require('views/main/assemblies/collections_view');
+require('views/main/assemblies/service_groups_view');
+require('views/main/assemblies/categories/category_view');
+require('views/main/assemblies/collections/collection_view');
+require('views/main/assemblies/service_groups/service_group_view');
+require('views/main/assemblies/service_groups/configs_view');
+require('views/main/assemblies/service_groups/summary_view');
+require('views/main/assemblies/service_groups/menu_view');
+require('views/main/assemblies/service_groups/detailed_info_view');
+require('views/main/assemblies/store_app_block_view');
+require('views/main/assemblies/active_store_app_view');
+require('views/main/assemblies/deploy_store_app/deploy_store_app_view');
+
+
require('views/main/service/add_view');
require('views/main/service/reassign_view');
require('views/main/service/reassign/step1_view');
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/views/common/collapsible_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/collapsible_view.js b/ambari-web/app/views/common/collapsible_view.js
new file mode 100644
index 0000000..22230d7
--- /dev/null
+++ b/ambari-web/app/views/common/collapsible_view.js
@@ -0,0 +1,84 @@
+/**
+ * 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.
+ */
+
+var App = require('app');
+
+/**
+ * Usage:
+ * <pre>
+ * {{#view App.CollapsibleView}}
+ * <a {{action "toggleCollapse" target="view"}}>My Title</a>
+ * <div class="collapse">
+ * {{! some content }}
+ * </div>
+ * {{/view}}
+ * </pre>
+ * <b>IMPORTANT!</b>
+ * 1. Collapsible content has to be wrapped with <code>.collapse</code>
+ * 2. Link/button with action "toggleCollapse" targeted to the view has to be in the block-template
+ *
+ * @type {Em.View}
+ */
+App.CollapsibleView = Em.View.extend({
+
+ layoutName: require('templates/common/collapsible'),
+
+ /**
+ * Determines if content-panel should be opened initially
+ *
+ * @type {boolean}
+ * @default false
+ */
+ openOnInit: false,
+
+ /**
+ * Flag shows if content-panel is expanded or not
+ *
+ * @type {boolean}
+ * @default false
+ */
+ expanded: false,
+
+ content: null,
+
+ didInsertElement: function () {
+ if (this.get('openOnInit') || this.get('content.expanded')) {
+ this.$('.collapse:first').collapse('show');
+ this.set('expanded', true);
+ var content = this.get('content');
+ if (content) {
+ Em.set(content, 'expanded', true);
+ }
+ }
+ },
+
+ willDestroyElement: function () {
+ this.$('.collapse:first').off();
+ },
+
+ toggleCollapse: function () {
+ this.set('expanded', !this.$('.collapse:first').hasClass('in'));
+ var content = this.get('content');
+ if (content) {
+ Em.set(content, 'expanded', this.get('expanded'));
+ }
+ this.$('.collapse:first').collapse('toggle');
+ return false;
+ }
+
+});
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/views/common/helpers/nl2br_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/helpers/nl2br_view.js b/ambari-web/app/views/common/helpers/nl2br_view.js
new file mode 100644
index 0000000..613eb78
--- /dev/null
+++ b/ambari-web/app/views/common/helpers/nl2br_view.js
@@ -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.
+ */
+
+var App = require('app');
+
+App.Nl2BrView = Em.View.extend({
+
+ tagName: 'span',
+ template: Em.Handlebars.compile('{{#each str in view.result}}{{str}}<br />{{/each}}'),
+
+ result: function () {
+ var content = this.get('content') || '';
+ return content.split('\n');
+ }.property('content')
+
+});
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/views/main/assemblies/active_store_app_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/assemblies/active_store_app_view.js b/ambari-web/app/views/main/assemblies/active_store_app_view.js
new file mode 100644
index 0000000..9f9d8de
--- /dev/null
+++ b/ambari-web/app/views/main/assemblies/active_store_app_view.js
@@ -0,0 +1,56 @@
+/**
+ * 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.
+ */
+
+var App = require('app');
+
+App.ActiveStoreAppView = Em.View.extend({
+
+ templateName: require('templates/main/assemblies/active_store_app'),
+
+ /**
+ * @type {string}
+ */
+ title: Em.computed.firstNotBlank('storeApp.title', 'storeApp.name'),
+
+ /**
+ * Bound from template
+ *
+ * @type {App.StoreApp}
+ */
+ storeApp: null,
+
+ /**
+ * Show services icons on the details popup
+ *
+ * @type {string}
+ */
+ shownServices: function () {
+ var serviceNames = this.get('storeApp.services') ? this.get('storeApp.services').split('|').slice(0, 4) : [];
+ var services = [];
+ serviceNames.forEach(function(name) {
+ var name = name.toString().trim();
+ if (name != "LOG SEARCH") {
+ services.push({
+ name: name,
+ url: "/img/" + name.toLowerCase() + "-color.png"
+ });
+ }
+ });
+ return services;
+ }.property('storeApp.services')
+});
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/views/main/assemblies/apps_row_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/assemblies/apps_row_view.js b/ambari-web/app/views/main/assemblies/apps_row_view.js
new file mode 100644
index 0000000..9cc48ab
--- /dev/null
+++ b/ambari-web/app/views/main/assemblies/apps_row_view.js
@@ -0,0 +1,89 @@
+/**
+ * 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.
+ */
+
+var App = require('app');
+
+App.AppsRowView = Em.View.extend({
+
+ templateName: require('/templates/main/assemblies/apps_row'),
+
+ didInsertElement: function () {
+ App.tooltip($(".assemblies.icon-question-sign"), {
+ placement: "top",
+ title: Em.I18n.t('appStore.apps.title.assemblies.tooltip')
+ });
+ App.tooltip($(".components.icon-question-sign"), {
+ placement: "top",
+ title: Em.I18n.t('appStore.apps.title.components.tooltip')
+ });
+ },
+
+ /**
+ * Should be bound from the template
+ *
+ * @type {string}
+ */
+ rowTitle: '',
+
+ /**
+ * @type {number}
+ */
+ startIndex: 0,
+
+ /**
+ * @type {number}
+ */
+ endIndex: function() {
+ return this.get('startIndex') + 5;
+ }.property('startIndex'),
+
+ /**
+ * @type {App.StoreApp[]}
+ */
+ visibleApps: function () {
+ return this.get('apps').slice(this.get('startIndex'), this.get('endIndex'));
+ }.property('apps.[]', 'startIndex', 'endIndex'),
+
+ /**
+ * @type {boolean}
+ */
+ hasActiveApp: Em.computed.bool('activeApp'),
+
+ /**
+ * @type {App.StoreApp}
+ */
+ activeApp: Em.computed.findBy('visibleApps', 'isActive', true),
+
+ /**
+ * @type {boolean}
+ */
+ disabledLeft: Em.computed.equal('startIndex', 0),
+
+ /**
+ * @type {boolean}
+ */
+ disabledRight: Em.computed.gteProperties('endIndex', 'apps.length'),
+
+ moveLeft: function() {
+ if (!this.get('disabledLeft')) this.decrementProperty('startIndex');
+ },
+
+ moveRight: function() {
+ if (!this.get('disabledRight')) this.incrementProperty('startIndex');
+ }
+});
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/views/main/assemblies/categories/category_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/assemblies/categories/category_view.js b/ambari-web/app/views/main/assemblies/categories/category_view.js
new file mode 100644
index 0000000..b0f7658
--- /dev/null
+++ b/ambari-web/app/views/main/assemblies/categories/category_view.js
@@ -0,0 +1,25 @@
+/**
+ * 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.
+ */
+
+var App = require('app');
+
+App.MainAssembliesCategoryView = Em.View.extend({
+
+ templateName: require('templates/main/assemblies/categories/category')
+
+});
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/views/main/assemblies/categories_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/assemblies/categories_view.js b/ambari-web/app/views/main/assemblies/categories_view.js
new file mode 100644
index 0000000..8fc980a
--- /dev/null
+++ b/ambari-web/app/views/main/assemblies/categories_view.js
@@ -0,0 +1,23 @@
+/**
+ * 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.
+ */
+
+var App = require('app');
+
+App.MainAssembliesCategoriesView = Em.View.extend({
+
+});
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/views/main/assemblies/collections/collection_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/assemblies/collections/collection_view.js b/ambari-web/app/views/main/assemblies/collections/collection_view.js
new file mode 100644
index 0000000..e6e9170
--- /dev/null
+++ b/ambari-web/app/views/main/assemblies/collections/collection_view.js
@@ -0,0 +1,25 @@
+/**
+ * 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.
+ */
+
+var App = require('app');
+
+App.MainAssembliesCollectionView = Em.View.extend({
+
+ templateName: require('templates/main/assemblies/collections/collection')
+
+});
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/views/main/assemblies/collections_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/assemblies/collections_view.js b/ambari-web/app/views/main/assemblies/collections_view.js
new file mode 100644
index 0000000..fe8524e
--- /dev/null
+++ b/ambari-web/app/views/main/assemblies/collections_view.js
@@ -0,0 +1,23 @@
+/**
+ * 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.
+ */
+
+var App = require('app');
+
+App.MainAssembliesCollectionsView = Em.View.extend({
+
+});
\ No newline at end of file