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

pc-items-table(
    table-title='::"My IGFS"'
    column-defs='$ctrl.columnDefs'
    items='$ctrl.shortItems$|async:this'
    actions-menu='$ctrl.tableActions$|async:this'
    selected-row-id='$ctrl.selectionManager.selectedItemIDs$|async:this'
    one-way-selection='::true'
    on-selection-change='$ctrl.selectedRows$.next($event)'
    on-filter-changed='$ctrl.filterChanges$.next($event)'
    on-visible-rows-change='$ctrl.visibleRows$.next($event)'
)
    footer-slot
        div(style='font-style: italic' ng-hide='($ctrl.shortItems$|async:this).length')
            | You have no IGFS. #[a.link-success(ui-sref='base.configuration.edit.advanced.igfs.igfs({igfsID: "new"})') Create one?]
        a.link-success(
            ui-sref='base.configuration.edit.advanced.igfs.igfs({igfsID: "new"})'
            ng-show='($ctrl.shortItems$|async:this).length'
        ) + Add new IGFS

h2.pc-page-header.ng-animate-disabled(ng-if='!($ctrl.itemID$|async:this)')
    | {{ ($ctrl.selectionManager.selectedItemIDs$|async:this).length ? 'Multiple' : 'No' }} IGFSs selected
    span.pc-page-header-sub Select only one IGFS to see settings and edit it

h2.pc-page-header.ng-animate-disabled(ng-if='$ctrl.itemID$|async:this')
    | {{ $ctrl.itemEditTitle$|async:this }}

igfs-edit-form(
    igfs='$ctrl.originalItem$|async:this'
    igfss='$ctrl.shortItems$|async:this'
    m_odels='$ctrl.shortModels$|async:this'
    on-save='$ctrl.save($event)'
    ng-class='{"pca-form-blocked": !($ctrl.itemID$|async:this)}'
    fake-ui-can-exit='base.configuration.edit.advanced.igfs.igfs'
    form-ui-can-exit-guard
)