//-
    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 domain models"'
    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 models. #[a.link-success(ui-sref='base.configuration.edit.advanced.models.model({modelID: "new"})') Create one?]
        a.link-success(
            ui-sref='base.configuration.edit.advanced.models.model({modelID: "new"})'
            ng-show='($ctrl.shortItems$|async:this).length'
        ) + Add new model

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

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

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