{{!
* 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="rolling-restart-view">
  <div class="alert alert-info">
    <p>
      {{view.restartMessage}}
    </p>
    {{#if view.maintainanceMessage}}
      <p>
        {{view.maintainanceMessage}}
      </p>
    {{/if}}
    {{#if view.suggestTurnOnMaintenanceMsg}}
      <p>
        {{view.suggestTurnOnMaintenanceMsg}}
      </p>
    {{/if}}
  </div>
  {{#if view.isLoaded}}
    <table>
      <tr>
        <td>{{t common.restart}}</td>
        <td>{{view Ember.TextField valueBinding="view.batchSize" class="form-control input-sm"}}</td>
        <td><span>{{view.batchSizeMessage}}</span></td>
      </tr>
      <tr>
        <td>{{t rollingrestart.dialog.msg.timegap.prefix}}</td>
        <td>{{view Ember.TextField valueBinding="view.interBatchWaitTimeSeconds" class="form-control input-sm"}}</td>
        <td>{{t rollingrestart.dialog.msg.timegap.suffix}}</td>
      </tr>
      <tr>
        <td>{{t rollingrestart.dialog.msg.toleration.prefix}}</td>
        <td>{{view Ember.TextField valueBinding="view.tolerateSize" class="form-control input-sm"}}</td>
        <td>{{t rollingrestart.dialog.msg.toleration.suffix}}</td>
      </tr>
      <tr>
        <td>&nbsp;</td>
        <td colspan="2">
          {{view App.CheckboxView
             labelBinding="view.staleConfigsOnlyMessage"
             checkedBinding="view.staleConfigsOnly"}}
        </td>
      </tr>
      <tr>
        <td>&nbsp;</td>
        <td colspan="2">
          {{#unless view.isServiceInMM}}
            {{view App.CheckboxView
              labelBinding="view.turnOnMmMsg"
              checkedBinding="view.turnOnMm"}}
          {{/unless}}
        </td>
      </tr>

    </table>
  {{else}}
    {{view App.SpinnerView}}
  {{/if}}
  {{#if view.errors}}
    <div class="alert alert-danger">
      <ul>
      {{#each error in view.errors}}
        <li>{{error}}</li>
      {{/each}}
      </ul>
    </div>
  {{/if}}
  {{#if view.warnings}}
    <div class="alert alert-warning">
      <ul>
      {{#each warning in view.warnings}}
        <li>{{warning}}</li>
      {{/each}}
      </ul>
    </div>
  {{/if}}
</div>
