{{!
* 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 rel="button-info" class="btn" {{bindAttr data-original-title="view.addButtonTooltip"}}
            {{action addConfigGroup target="controller"}}><i class="icon-plus"></i></button>
          <button rel="button-info" class="btn" {{bindAttr data-original-title="view.removeButtonTooltip" disabled="view.isRemoveButtonDisabled"}}
            {{action confirmDelete target="controller"}}><i class="icon-minus"></i></button>
          <div class="btn-group">
            <button class="btn"><i class="icon-cog"></i></button>
            <button class="btn dropdown-toggle" data-toggle="dropdown">
              <span class="caret"></span>
            </button>
            <ul class="dropdown-menu">
              <li {{bindAttr class="view.isRenameButtonDisabled:disabled"}}>
                <a  rel="button-info" {{bindAttr data-original-title="view.renameButtonTooltip"}} {{action renameConfigGroup target="controller"}}>{{t services.service.config_groups_popup.rename}}</a>
              </li>
              <li>
                <a  rel="button-info" {{bindAttr data-original-title="view.duplicateButtonTooltip"}} {{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 rel="button-info" class="btn" {{bindAttr data-original-title="view.addHostTooltip" disabled="selectedConfigGroup.isAddHostsDisabled"}} {{action addHosts target="controller"}} ><i class="icon-plus"></i></button>
            <button rel="button-info" class="btn" {{bindAttr data-original-title="view.removeHostTooltip" disabled="view.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"}}
              {{bindAttr data-original-title="selectedConfigGroup.propertiesList" }}>{{selectedConfigGroup.properties.length}} {{t common.properties}}</a>
          </div>
        </div>
      </div>
      <div class="span12">{{selectedConfigGroup.description}}</div>
      <div class="span12 text-error" id="manage-config-group-error-div">
        {{#if errorMessage}}
          {{errorMessage}}
        {{else}}
          &nbsp;
        {{/if}}
      </div>
    </div>
  </div>
</div>
