{{!
* 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="btn-group">
  <div class="input-group">

  {{view Ember.TextField valueBinding="view.filter" placeholderBinding="view.placeHolder" classNames="form-control"}}
  <div class="input-group-btn">
    <div id="cleanerContainer" class="pull-left">
      <a href="#" id="filterCleaner" {{action "clearFilter" target="view"}}
        {{bindAttr class="view.filterNotEmpty::hidden :ui-icon :ui-icon-circle-close"}}></a>
    </div>
    <button class="btn btn-default dropdown-toggle btn-icon" data-toggle="dropdown">
        <span class="caret"></span>
    </button>
    <ul class="dropdown-menu">
      {{#each column in view.columns}}
          <li {{bindAttr class="column.isDisabled:disabled"}}>
              <a href="#" {{action selectFilterColumn column target="view"}}
                {{bindAttr class="column.isDisabled:disabled"}}>
                <i {{bindAttr class="column.isDisabled:disabled column.selected:glyphicon-ok-sign:glyphicon-placeholder :glyphicon :text-success"}}></i>
                {{column.name}}
              </a>
          </li>
      {{/each}}
      {{#if view.showClearFilter}}
        <li class="divider"></li>
        <li>
          <a href="#" {{action clearFilterColumn target="view"}}>
          {{t tableView.filters.clearFilters}}
          </a>
        </li>
      {{/if}}
    </ul>
  </div>
  </div>
</div>
