//-
    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.pc-ui-grid-filters(
    role='columnheader'
    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(
            ng-class=`{
                'btn-ignite--link-dashed-success': colFilter.term.length === colFilter.selectOptions.length,
                'btn-ignite--link-dashed-primary': colFilter.term.length !== colFilter.selectOptions.length
            }`
            type='button'
            title='{{ colFilter.$$multiselectFilterTooltip() }}'
            ng-model='colFilter.term'
            bs-select
            bs-options='option.value as option.label for option in colFilter.selectOptions'
            data-multiple='true'
            data-trigger='click'
            data-placement='bottom-right'
            protect-from-bs-select-render
        ) {{ col.displayName }}
