{{!
* 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" class="form-control"}}
    <div class="input-group-btn">
      <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>
                <a href="#" {{action selectFilterColumn column target="view"}}>
                  <i {{bindAttr class="column.selected:glyphicon-ok-sign:glyphicon-placeholder :glyphicon :text-success"}}></i>
                  {{column.name}}
                </a>
            </li>
        {{/each}}
      </ul>
    </div>
  </div>
</div>
