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

header.header-with-selector
    div
        h1 Configuration
        version-picker
    div
        a.btn-ignite.btn-ignite--primary(
            type='button'
            ui-sref='^.edit({clusterID: "new"})'
        )
            svg.icon-left(ignite-icon='plus')
            | Create Cluster Configuration
        button-import-models(cluster-id='::"new"')

.pco-relative-root
    pc-items-table(
        table-title='::"My Cluster Configurations"'
        column-defs='$ctrl.clustersColumnDefs'
        items='$ctrl.shortClusters$|async:this'
        on-action='$ctrl.onClustersAction($event)'
        max-rows-to-show='10'
        one-way-selection='::false'
        selected-row-id='$ctrl.selectedRowsIDs$|async:this'
        on-selection-change='$ctrl.selectedRows$.next($event)'
        actions-menu='$ctrl.actions$|async:this'
    )
        footer-slot(ng-hide='($ctrl.shortClusters$|async:this).length' style='font-style: italic')
            | You have no cluster configurations.
            a.link-success(ui-sref='base.configuration.edit.basic({clusterID: "new"})') Create one?
