{{!
* 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="deploy-review">
  <h2>{{t installer.step8.header}}</h2>

  <div class="alert alert-info">
    {{t installer.step8.body}}
    {{#if controller.isManualKerberos}}
      <br/><br/>
      {{t installer.step8.kerberors.warning}}
    {{/if}}
  </div>

  <div id="step8-content" class="well pre-scrollable">
    <div id="step8-info">
      {{#each item in controller.clusterInfo}}
        <p>
          <b>{{item.display_name}}</b> : {{item.config_value}}
        </p>
      {{/each}}

      <p><b>{{controller.clusterInfo.repoInfo.display_name}}</b>:</p>

      {{#if controller.clusterInfo.useRedhatSatellite}}
        <div>
          <ul>
            <li>
              <p>{{t installer.step1.advancedRepo.useRedhatSatellite.message}}</p>
            </li>
          </ul>
        </div>
      {{else}}
        <div>
          <ul>
            {{#each item in controller.clusterInfo.repoInfo}}
              <li>
                <p><span class="text text-info">{{item.os_type}} ({{item.repo_id}}): <br/></span>{{item.base_url}}</p>
              </li>
            {{/each}}
          </ul>
        </div>
      {{/if}}

      <div>
        {{#if controller.services.length}}
          <p><b>{{t menu.item.services}}:</b></p>
          <ul>
            {{#each controller.services}}
              <li>
                <em><b>{{display_name}}</b></em>
                <ul>
                  {{#each component in this.service_components}}
                    <li>
                      <span class="text text-info">{{component.display_name }} : </span>{{component.component_value}}
                    </li>
                  {{/each}}
                </ul>
              </li>
            {{/each}}
          </ul>
        {{/if}}
      </div>
    </div>
  </div>
  <div class="btn-area">
    <button type="button" class="btn pull-left installer-back-btn" {{bindAttr disabled="App.router.btnClickInProgress"}} {{action back}}>
      &larr; {{t common.back}}
      {{#if App.router.backBtnClickInProgress}}
        {{view App.SpinnerView tagName="span" classNames="service-button-spinner"}}
      {{/if}}
    </button>
    <button type="button" class="btn btn-success pull-right"
       id="spinner" {{bindAttr disabled="controller.isSubmitDisabled"}} {{action submit target="controller"}}>
      {{#if App.router.nextBtnClickInProgress}}
        {{view App.SpinnerView tagName="span" classNames="service-button-spinner"}}
      {{/if}}
      {{t common.deploy}} &rarr;
    </button>
    <button type="button" class="btn btn-info pull-right" {{action printReview target="view"}}>{{t common.print}}</button>
    <button type="button" {{bindAttr class=":btn :btn-primary :pull-right :mrm controller.showDownloadCsv::hide"}} {{action downloadCSV target="controller"}}>{{t admin.kerberos.wizard.step5.downloadCSV}}</button>
  </div>
</div>
