<!--
  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="paletteItemsFooter">
    <div ng-if="searchedItems.length === 0" class="icon no-match">
        <span>&oslash;</span>
    </div>
    <small class="help-block text-sm palette-footer-message" ng-class="{ 'no-match': searchedItems.length === 0 }">
        <span ng-if="search">
          <span ng-if="searchedItems.length === 0">
            <div class="palette-footer-explanation" ng-if="!skippingFilters && itemsBeforeActiveFilters.length > itemsAfterActiveFilters.length"><span>
                    <strong>{{ itemsBeforeActiveFilters.length - itemsAfterActiveFilters.length }} 
                        <ng-pluralize count="itemsBeforeActiveFilters.length" when="{ '1': 'item', 'other': 'items' }"></<ng-pluralize></strong> 
                    matching search but excluded by filters. 
                    <button class="btn btn-outline btn-info" ng-click="disableFilters()">Clear filters</button>
            </span></div>
            <div class="palette-footer-explanation" ng-if="skippingFilters || itemsBeforeActiveFilters.length === 0"><span>
                    No matches for <code>{{ search }}</code>.
            </span></div>
          </span>
          <span ng-if="searchedItems.length > 0">
            <div ng-if="skippingFilters"><span>
                    <strong>No matches with selected filters.</strong><br/>
                    Showing matches ignoring filters.
            </span></div>
            <div class="palette-footer-explanation" ng-if="!skippingFilters && itemsBeforeActiveFilters.length > itemsAfterActiveFilters.length"><span>
                    <strong>{{ itemsBeforeActiveFilters.length - itemsAfterActiveFilters.length }} more 
                        <ng-pluralize count="itemsBeforeActiveFilters.length" when="{ '1': 'item', 'other': 'items' }"></<ng-pluralize></strong> 
                    matching search but excluded by filters.
                    <button class="btn btn-outline btn-info" ng-click="disableFilters()">Clear filters</button>
            </span></div>
          </span>
        </span>
        <span ng-if="!search">
            <div class="palette-footer-explanation" ng-if="itemsBeforeActiveFilters.length == 0"><span>
                <strong>Nothing available.</strong>
            </span></div>
            <div class="palette-footer-explanation" ng-if="skippingFilters && searchedItems.length > 0"><span>
                    <strong>Nothing available in selected filters.</strong><br/>
                    Ignoring filters.
            </span></div>
            <div class="palette-footer-explanation" ng-if="!skippingFilters && itemsBeforeActiveFilters.length > itemsAfterActiveFilters.length"><span>
                    <strong>{{ itemsBeforeActiveFilters.length - itemsAfterActiveFilters.length }} more 
                        <ng-pluralize count="itemsBeforeActiveFilters.length" when="{ '1': 'item', 'other': 'items' }"></<ng-pluralize></strong> 
                    excluded by filters. 
                    <button class="btn btn-outline btn-info" ng-click="disableFilters()">Clear filters</button>
            </span></div>
        </span>
        
    </small>
</div>
