{{!
* 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.
}}

    <button class="btn single-btn-group filter-btn" {{action "clickFilterButton" target="view"}}><i class="icon-filter"></i> {{t apps.filters.filter}}</button>
    <ul class="dropdown-menu filter-components">
        <li>
            <ul>
                <li>
                    <label class="checkbox">
                        {{view Ember.Checkbox checkedBinding="view.masterComponentsChecked"}} {{t host.host.componentFilter.master}}:
                    </label>
                    <ul>
                        {{#each component in masterComponents}}
                            <li>
                                <label class="checkbox">
                                    {{view Ember.Checkbox checkedBinding="component.checkedForHostFilter" }} {{unbound component.displayName}}
                                </label>
                            </li>
                        {{/each}}
                    </ul>
                </li>
                <li>
                    <label class="checkbox">
                        {{view Ember.Checkbox checkedBinding="view.slaveComponentsChecked"}} {{t host.host.componentFilter.slave}}:
                    </label>
                    <ul>
                        {{#each component in slaveComponents}}
                            <li>
                                <label class="checkbox">
                                    {{view Ember.Checkbox checkedBinding="component.checkedForHostFilter" }} {{unbound component.displayName}}
                                </label>
                            </li>
                        {{/each}}
                    </ul>
                </li>
                <li>
                    <label class="checkbox">
                        {{view Ember.Checkbox checkedBinding="view.clientComponentsChecked"}} {{t host.host.componentFilter.client}}:
                    </label>
                    <ul>
                        {{#each component in clientComponents}}
                            <li>
                                <label class="checkbox">
                                    {{view Ember.Checkbox checkedBinding="component.checkedForHostFilter" }} {{unbound component.displayName}}
                                </label>
                            </li>
                        {{/each}}
                    </ul>
                </li>
            </ul>
        </li>
        <li>
            <button class="btn" {{action "closeFilter" target="view"}}>{{t common.cancel}}</button>
            <button class="btn btn-primary" {{action "applyFilter" target="view"}}>{{t common.apply}}</button>
        </li>
    </ul>