//-
    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.
.popover.cache-metadata(tabindex='-1' ignite-loading='loadingCacheMetadata' ignite-loading-text='Loading metadata...' ng-init='importMetadata()')
    h3.popover-title
        label.labelField Metadata for caches:
        button.close(id='cache-metadata-close' ng-click='$hide()') &times;
        .input-tip
            input.form-control(type='text' ng-model='metaFilter' placeholder='Filter metadata...')
    .popover-content(ng-if='metadata && metadata.length > 0')
        treecontrol.tree-classic(tree-model='metadata' options='metaOptions' filter-expression='metaFilter')
            span(ng-switch='node.type')
                span(ng-switch-when='type' ng-dblclick='dblclickMetadata(paragraph, node)')
                    i.fa.fa-table
                    label.clickable
                        div.node-display(ng-bind='node.displayName' ng-attr-title='{{node.displayName}}')
                span(ng-switch-when='plain')
                    label {{node.name}}
                span(ng-switch-when='field' ng-dblclick='dblclickMetadata(paragraph, node)')
                    i.fa(ng-class='node.system ? "fa-file-text-o" : "fa-file-o"')
                    label.clickable {{node.name}} [{{node.clazz}}]
                label(ng-switch-when='indexes') {{node.name}}
                label(ng-switch-when='index') {{node.name}}
                span(ng-switch-when='index-field' ng-dblclick='dblclickMetadata(paragraph, node)')
                    i.fa(ng-class='node.order ? "fa-sort-amount-desc" : "fa-sort-amount-asc"')
                    label.clickable {{node.name}}
    .popover-content(ng-if='!metadata || metadata.length == 0')
        label.content-empty No types found
    h3.popover-footer Double click to paste into editor
