//-
    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.

.ui-grid-filter-container.ui-grid-filters(role='columnheader')
    div(ng-style='col.extraStyle'
        ng-repeat='colFilter in col.filters'
        ng-class="{'ui-grid-filter-cancel-button-hidden' : colFilter.disableCancelFilterButton === true }"
        ng-switch='colFilter.type')
        div(ng-switch-when='select')
            button.btn-ignite.btn-ignite--link-dashed-success.uigf-btn(
                ng-class=`{
                    'uigf-btn--active': colFilter.term.length !== colFilter.selectOptions.length
                }`
                type='button'
                title='{{ colFilter.$$multiselectFilterTooltip() }}'
                ng-model='colFilter.term'
                ng-disabled='col.colDef.multiselectFilterDisabled'
                bs-select
                bs-options='option.value as option.label for option in colFilter.selectOptions'
                data-multiple='true'
                data-trigger='click'
                data-placement='bottom-left'
                protect-from-bs-select-render
            ) {{ col.displayName }}
        div(ng-switch-when='dialog')
            button.btn-ignite.btn-ignite--link-dashed-success.uigf-btn(
                ng-class=`{
                    'uigf-btn--active': colFilter.term.length !== colFilter.selectOptions.length
                }`
                ng-click='colFilter.selectDialog(grid, colFilter)'
                type='button'
                title='{{ colFilter.$$multiselectFilterTooltip() }}'
            ) {{ col.displayName }}

    .ui-grid-cell-contents(role='button')
        button.btn-ignite.btn-ignite--link-dashed-success(
            ui-grid-one-bind-id-grid="col.uid + '-sortdir-text'"
            ui-grid-visible="col.sort.direction"
            aria-label="Sort Descending")
            i(ng-class="{\
                'ui-grid-icon-up-dir': col.sort.direction == 'asc',\
                'ui-grid-icon-down-dir': col.sort.direction == 'desc',\
                'ui-grid-icon-blank': !col.sort.direction\
            }" title="" aria-hidden="true")
