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

include /app/helpers/jade/mixins

page-queries-slot(slot-name="'queriesTitle'")
    h1 Queries

page-queries-slot(slot-name="'queriesButtons'" ng-if="!$root.IgniteDemoMode")
    button#createNotebookBtn.btn-ignite.btn-ignite--primary(ng-click='$ctrl.createNotebook()')
        svg.icon-left(ignite-icon='plus')
        | Create Notebook


.queries-notebooks-list
    .panel--ignite
        header.header-with-selector
            div
                span Notebooks

            div(ng-if="!$root.IgniteDemoMode")
                +ignite-form-field-bsdropdown({
                    label: 'Actions',
                    model: '$ctrl.action',
                    name: 'action',
                    disabled: '$ctrl.gridApi.selection.legacyGetSelectedRows().length === 0',
                    options: '$ctrl.actionOptions'
                })

        .panel-collapse(ignite-loading='notebooksLoading' ignite-loading-text='Loading notebooks...')
            ignite-grid-table(
                items='$ctrl.notebooks'
                column-defs='$ctrl.columnDefs'
                grid-api='$ctrl.gridApi'
                grid-thin='true'
                on-selection-change='$ctrl.onSelectionChanged()'
            )

            grid-no-data(grid-api='$ctrl.gridApi')
                | You have no notebooks.
                a.link-success(ng-click='$ctrl.createNotebook()') Create one?
                grid-no-data-filtered
                    | Nothing to display. Check your filters.
