{{!
* 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="alert alert-info">{{t services.service.config_groups_popup.notice}}</div>
<div class="row-fluid  manage-configuration-group-content">
  <div class="span12">
    {{t services.service.config_groups_popup.config_groups}}
    <div class="row-fluid">
      <div class="span5">
        {{view Em.Select
          contentBinding="configGroups"
          optionLabelPath="content.displayName"
          selectionBinding="view.selectedConfigGroup"
          multiple="multiple"
          class="group-select"
        }}
        <div class="btn-toolbar pull-right">
          <button class="btn" {{bindAttr disabled="isHostsModified"}} {{action addConfigGroup target="controller"}}><i class="icon-plus"></i></button>
          <button class="btn" {{bindAttr disabled="view.isRemoveButtonDisabled"}} {{action deleteConfigGroup target="controller"}}><i class="icon-minus"></i></button>
          <div class="btn-group">
            <button class="btn" {{bindAttr disabled="isHostsModified"}}><i class="icon-cog"></i></button>
            <button class="btn dropdown-toggle" data-toggle="dropdown" {{bindAttr disabled="isHostsModified"}}>
              <span class="caret"></span>
            </button>
            <ul class="dropdown-menu">
              <li {{bindAttr class="view.isRenameButtonDisabled:disabled"}}>
                <a {{action renameConfigGroup target="controller"}}>{{t services.service.config_groups_popup.rename}}</a>
              </li>
              <li>
                <a {{action duplicateConfigGroup target="controller"}}>{{t services.service.config_groups_popup.duplicate}}</a>
              </li>
            </ul>
          </div>
        </div>
      </div>
      <div class="span7">
        <div class="row-fluid">
          <div class="span2">{{t common.hosts}}</div>
          <div class="span10">
            {{view Em.Select
              contentBinding="selectedConfigGroup.hosts"
              multiple="multiple"
              class="group-select"
              selectionBinding="selectedHosts"
            }}
          </div>
          <div class="button-group pull-right">
            <button class="btn" {{bindAttr disabled="selectedConfigGroup.isAddHostsDisabled"}} {{action addHosts target="controller"}} ><i class="icon-plus"></i></button>
            <button class="btn" {{bindAttr disabled="selectedConfigGroup.isDeleteHostsDisabled"}} {{action deleteHosts target="controller"}} ><i class="icon-minus"></i></button>
          </div>
        </div>
        <div class="row-fluid">
          <div class="span2">{{t common.overrides}}</div>
          <div class="span10">
            <a href="" class="properties-link" {{action showProperties target="controller"}}
               rel="HealthTooltip" {{bindAttr data-original-title="selectedConfigGroup.propertiesList" }}>{{selectedConfigGroup.properties.length}} {{t common.properties}}</a>
          </div>
        </div>
      </div>
      <div class="span12 text-error" id="manage-config-group-error-div">
        {{#if errorMessage}}
          {{errorMessage}}
        {{else}}
          &nbsp;
        {{/if}}
      </div>
    </div>
  </div>
</div>
