Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id AE0BC200B8D for ; Fri, 9 Sep 2016 05:26:40 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id AC9C8160ADA; Fri, 9 Sep 2016 03:26:40 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 49C98160AD6 for ; Fri, 9 Sep 2016 05:26:38 +0200 (CEST) Received: (qmail 82964 invoked by uid 500); 9 Sep 2016 03:26:37 -0000 Mailing-List: contact commits-help@ignite.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@ignite.apache.org Delivered-To: mailing list commits@ignite.apache.org Received: (qmail 81664 invoked by uid 99); 9 Sep 2016 03:26:30 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 09 Sep 2016 03:26:30 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 7CF2FE09AC; Fri, 9 Sep 2016 03:26:30 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: akuznetsov@apache.org To: commits@ignite.apache.org Date: Fri, 09 Sep 2016 03:26:51 -0000 Message-Id: In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [23/52] ignite git commit: Web Console beta-3. archived-at: Fri, 09 Sep 2016 03:26:40 -0000 http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/views/configuration/domains.jade ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/views/configuration/domains.jade b/modules/web-console/frontend/views/configuration/domains.jade new file mode 100644 index 0000000..5912343 --- /dev/null +++ b/modules/web-console/frontend/views/configuration/domains.jade @@ -0,0 +1,66 @@ +//- + 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.jade + +.docs-header + h1 Configure Domain Model And SQL Queries +.docs-body(ng-controller='domainsController') + ignite-information + ul: li Import database schemas + li Configure indexed types + div(ignite-loading='loadingDomainModelsScreen' ignite-loading-text='Loading domain models...' ignite-loading-position='top') + div(ng-show='ui.ready') + hr + .padding-bottom-dflt(ng-show='domains && domains.length > 0') + table.links(st-table='displayedRows' st-safe-src='domains') + thead + tr + th + .col-sm-9 + .col-sm-6 + lable.labelHeader.labelFormField {{domainModelTitle()}} + .col-sm-6 + .pull-right.labelLogin.additional-filter(ng-if='(domains | domainsValidation:false:true).length > 0') + a.labelFormField(ng-if='ui.showValid' ng-click='toggleValid()' bs-tooltip='' data-title='{{::ui.invalidKeyFieldsTooltip}}') Key fields should be configured: {{(displayedRows | domainsValidation:false:true).length}}  + a.labelFormField(ng-if='!ui.showValid' ng-click='toggleValid()') Show all domain models: {{displayedRows.length}}  + .col-sm-3 + input.form-control.pull-right(type='text' st-search='valueType' placeholder='Filter domain models...') + tbody + tr + td + .scrollable-y(ng-show='(displayedRows | domainsValidation:ui.showValid:true).length > 0' style='max-height: 200px') + table + tbody + tr(ng-repeat='row in (displayedRows | domainsValidation:ui.showValid:true) track by row._id' ignite-bs-affix-update) + td + a(ng-class='{active: row._id == selectedItem._id}' ng-click='selectItem(row)') {{$index + 1}}) {{row.valueType}} + label.placeholder(ng-show='(displayedRows | domainsValidation:ui.showValid:true).length == 0') No domain models found + .padding-top-dflt(bs-affix) + .panel-tip-container(data-placement='bottom' bs-tooltip='' data-title='Create new domain model') + button.btn.btn-primary(id='new-item' ng-click='createItem()') Add domain model + .panel-tip-container(bs-tooltip='' data-title='Import domain models from database' data-placement='bottom') + button.btn.btn-primary(ng-click='showImportDomainModal()') Import from database + +save-remove-clone-undo-buttons('domain model') + .btn-group.panel-tip-container.pull-right(bs-tooltip='' data-title='Import domain models from demo database' data-placement='bottom') + hr + .bs-affix-fix + div(bs-collapse='' data-allow-multiple='true' ng-model='ui.activePanels') + form.form-horizontal(name='ui.inputForm' novalidate ng-if='contentVisible()') + .panel-group + include ../../app/modules/states/configuration/domains/general.jade + include ../../app/modules/states/configuration/domains/query.jade + include ../../app/modules/states/configuration/domains/store.jade http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/views/configuration/igfs.jade ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/views/configuration/igfs.jade b/modules/web-console/frontend/views/configuration/igfs.jade new file mode 100644 index 0000000..16e9f28 --- /dev/null +++ b/modules/web-console/frontend/views/configuration/igfs.jade @@ -0,0 +1,51 @@ +//- + 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.jade + +.docs-header + h1 Configure Ignite In-memory File Systems +.docs-body(ng-controller='igfsController') + ignite-information(data-title='Configure IGFS only if you are going to use In-memory File System') + ul + li Ignite File System (#[a(href='https://apacheignite-fs.readme.io/docs/in-memory-file-system' target='_blank') IGFS]) is an in-memory file system allowing work with files and directories over existing cache infrastructure + li IGFS can either work as purely in-memory file system, or delegate to another file system (e.g. various Hadoop file system implementations) acting as a caching layer (see #[a(href='https://apacheignite-fs.readme.io/docs/secondary-file-system' target='_blank') secondary file system] for more detail) + li In addition IGFS provides API to execute map-reduce tasks over file system data + div(ignite-loading='loadingIgfsScreen' ignite-loading-text='Loading IGFS screen...' ignite-loading-position='top') + div(ng-show='ui.ready') + hr + +main-table('IGFS', 'igfss', 'igfsName', 'selectItem(row)', '{{$index + 1}}) {{row.name}}', 'name') + .padding-top-dflt(bs-affix) + .panel-tip-container(data-placement='bottom' bs-tooltip='' data-title='Create new IGFS') + button.btn.btn-primary(id='new-item' ng-click='createItem()') Add IGFS + +save-remove-clone-undo-buttons('IGFS') + hr + .bs-affix-fix + div(bs-collapse='' data-allow-multiple='true' ng-model='ui.activePanels') + form.form-horizontal(name='ui.inputForm' novalidate ng-if='contentVisible()') + .panel-group + include ../../app/modules/states/configuration/igfs/general.jade + + +advanced-options-toggle-default + + div(ng-show='ui.expanded') + include ../../app/modules/states/configuration/igfs/secondary.jade + include ../../app/modules/states/configuration/igfs/ipc.jade + include ../../app/modules/states/configuration/igfs/fragmentizer.jade + include ../../app/modules/states/configuration/igfs/dual.jade + include ../../app/modules/states/configuration/igfs/misc.jade + + +advanced-options-toggle-default http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/views/configuration/sidebar.jade ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/views/configuration/sidebar.jade b/modules/web-console/frontend/views/configuration/sidebar.jade new file mode 100644 index 0000000..bba6b25 --- /dev/null +++ b/modules/web-console/frontend/views/configuration/sidebar.jade @@ -0,0 +1,29 @@ +//- + 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. + +.row + .col-xs-3.col-sm-3.col-md-2.border-right.section-left.greedy + .sidebar-nav(bs-affix) + ul.menu(ignite-sidebar) + li(ng-repeat='item in sidebar.items') + a(ui-sref-active='active' ui-sref='{{::item.sref}}') + span.fa-stack + i.fa.fa-circle-thin.fa-stack-2x + i.fa.fa-stack-1x {{::$index + 1}} + | {{::item.text}} + + .col-xs-9.col-sm-9.col-md-10.border-left.section-right + .docs-content(ui-view='') http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/views/configuration/summary-project-structure.jade ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/views/configuration/summary-project-structure.jade b/modules/web-console/frontend/views/configuration/summary-project-structure.jade new file mode 100644 index 0000000..aa09437 --- /dev/null +++ b/modules/web-console/frontend/views/configuration/summary-project-structure.jade @@ -0,0 +1,27 @@ +//- + 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.summary-project-structure + h3.popover-title + label.labelField Project structure + button.close(id='summary-project-structure-close' ng-click='$hide()') × + .popover-content + treecontrol.tree-classic(tree-model='projectStructure' options='projectStructureOptions' expanded-nodes='projectStructureExpanded') + span(ng-switch='' on='node.type') + span(ng-switch-when='folder') + label {{node.name}} + span(ng-switch-when='file') + i.fa.fa-file-text-o + label {{node.name}} http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/views/configuration/summary-tabs.jade ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/views/configuration/summary-tabs.jade b/modules/web-console/frontend/views/configuration/summary-tabs.jade new file mode 100644 index 0000000..847b42f --- /dev/null +++ b/modules/web-console/frontend/views/configuration/summary-tabs.jade @@ -0,0 +1,25 @@ +//- + 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. + +ul.nav(ng-class='$navClass', role='tablist') + li(role='presentation' ng-repeat='$pane in $panes track by $index' ng-class='[ $isActive($pane, $index) ? $activeClass : "", $pane.disabled ? "disabled" : "" ]') + a.summary-tab(ng-show='$pane.title != "POJO" || (cluster | hasPojo)' ng-switch='$pane.title' role='tab' data-toggle='tab' ng-click='!$pane.disabled && $setActive($pane.name || $index)' data-index='{{ $index }}' aria-controls='$pane.title') {{$pane.title}} + img(ng-switch-when='XML' src='/images/xml.png') + img(ng-switch-when='Java' src='/images/java.png') + img(ng-switch-when='POM' src='/images/xml.png') + img(ng-switch-when='POJO' src='/images/java.png') + img(ng-switch-when='Dockerfile' src='/images/docker.png') +.tab-content(ng-transclude style='fontSize: 12px; min-height: 25em') http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/views/configuration/summary.jade ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/views/configuration/summary.jade b/modules/web-console/frontend/views/configuration/summary.jade new file mode 100644 index 0000000..0d30df8 --- /dev/null +++ b/modules/web-console/frontend/views/configuration/summary.jade @@ -0,0 +1,122 @@ +//- + 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.jade + +mixin hard-link(ref, txt) + a(style='color:#ec1c24' href=ref target='_blank') #{txt} + +.docs-header + h1 Configurations Summary +.docs-body + ignite-information + ul + li Preview XML configurations for #[a(href='https://apacheignite.readme.io/docs/clients-vs-servers' target='_blank') server and client] nodes + li Preview code configuration + li Preview #[a(href='https://apacheignite.readme.io/docs/docker-deployment' target='_blank') Docker file] + li Preview POM dependencies + li Download ready-to-use Maven project + + hr + .padding-dflt(ng-if='ui.ready && (!clusters || clusters.length == 0)') + | You have no clusters configured. Please configure them #[a(ui-sref='base.configuration.clusters') here]. + + div(ng-show='clusters && clusters.length > 0' ignite-loading='summaryPage' ignite-loading-text='Loading summary screen...' ignite-loading-position='top') + +main-table('clusters', 'clustersView', 'clusterName', 'selectItem(row)', '{{$index + 1}}) {{row.name}}', 'name') + div(ng-show='selectedItem && contentVisible(displayedRows, selectedItem)') + .padding-top-dflt(bs-affix) + button.btn.btn-primary(id='download' ng-click='downloadConfiguration()' bs-tooltip='' data-title='Download project' data-placement='bottom') Download project + .btn.btn-primary(bs-tooltip='' data-title='Preview generated project structure' data-placement='bottom') + div(bs-popover data-template-url='/configuration/summary-project-structure.html', data-placement='bottom', data-trigger='click' data-auto-close='true') + i.fa.fa-sitemap + label.tipLabel Project structure + button.btn.btn-primary(id='proprietary-jdbc-drivers' ng-if='downloadJdbcDriversVisible()' ng-click='downloadJdbcDrivers()' bs-tooltip='' data-title='Open proprietary JDBC drivers download pages' data-placement='bottom') Download JDBC drivers + hr + .bs-affix-fix + .panel-group(bs-collapse ng-init='ui.activePanels=[0,1]' ng-model='ui.activePanels' data-allow-multiple='true') + .panel.panel-default + .panel-heading(role='tab' bs-collapse-toggle) + ignite-form-panel-chevron + label Server + + .panel-collapse(id='server' role='tabpanel' bs-collapse-target) + ignite-ui-ace-tabs.summary-tabs + div(bs-tabs data-bs-active-pane="tabsServer.activeTab" template='configuration/summary-tabs.html') + div(bs-pane title='XML') + ignite-ui-ace-xml(ng-if='tabsServer.activeTab == 0 || tabsServer.init[0]' ng-init='tabsServer.init[0] = true' data-master='cluster' data-no-deep-watch) + div(bs-pane title='Java') + ignite-ui-ace-java(ng-if='tabsServer.activeTab == 1 || tabsServer.init[1]' ng-init='tabsServer.init[1] = true' data-master='cluster' data-no-deep-watch) + div(bs-pane title='POM') + ignite-ui-ace-pom(ng-if='tabsServer.activeTab == 2 || tabsServer.init[2]' ng-init='tabsServer.init[2] = true' data-cluster='cluster' data-no-deep-watch) + div(bs-pane title='Dockerfile') + ignite-ui-ace-docker(ng-if='tabsServer.activeTab == 3 || tabsServer.init[3]' ng-init='tabsServer.init[3] = true' data-cluster='cluster' data-no-deep-watch ng-model='ctrl.data.docker') + + .panel.panel-default + .panel-heading(role='tab' bs-collapse-toggle) + ignite-form-panel-chevron + label Client + + .panel-collapse(id='client' role='tabpanel' bs-collapse-target) + -var form = 'clientForm' + form(name=form novalidate) + -var nearCfg = 'ctrl.cluster.clientNearCfg' + -var nearCfgEvictionPolicy = nearCfg + '.nearEvictionPolicy[' + nearCfg + '.nearEvictionPolicy.kind]' + + .group-content + .settings-row(ng-if='true') + .col-xs-8.col-sm-8.col-md-7 + +ignite-form-field-number('Near cache start size:', nearCfg + '.nearStartSize', '"nearStartSize"', false, false, '375000', false, false, false, 'Initial cache size for near cache which will be used to pre-create internal hash table after start') + + .settings-row(ng-if='true') + .col-xs-8.col-sm-8.col-md-7 + +ignite-form-field-dropdown('Near cache eviction policy', nearCfg + '.nearEvictionPolicy.kind', '"evictionPolicies"', false, false, false, 'Not set', false, '[\ + {value: "LRU", label: "LRU"},\ + {value: "FIFO", label: "FIFO"},\ + {value: "SORTED", label: "Sorted"},\ + {value: undefined, label: "Not set"}\ + ]', 'Near cache eviction policy') + + span(ng-if='#{nearCfg}.nearEvictionPolicy.kind') + a.customize( + ng-show='ctrl.__form.expanded' + ng-click='ctrl.__form.expanded = false' + ) Hide settings + a.customize( + ng-hide='ctrl.__form.expanded' + ng-click='ctrl.__form.expanded = true' + ) Show settings + + .settings-row + .panel-details.col-xs-12.col-sm-12.col-md-7(ng-if='ctrl.__form.expanded && #{nearCfg}.nearEvictionPolicy.kind') + .details-row + +ignite-form-field-number('Batch size:', nearCfgEvictionPolicy + '.batchSize', '"batchSize"', false, false, '1', false, false, false, 'Number of entries to remove on shrink') + + .details-row + +ignite-form-field-number('Max memory size:', nearCfgEvictionPolicy + '.maxMemorySize', '"maxMemorySize"', false, false, '0', false, false, false, 'Maximum allowed cache size in bytes') + + .details-row + +ignite-form-field-number('Max size:', nearCfgEvictionPolicy + '.maxSize', '"maxSize"', false, false, '100000', false, false, false, 'Maximum allowed size of cache before entry will start getting evicted') + + .summary-tabs(ignite-ui-ace-tabs) + div(bs-tabs data-bs-active-pane="tabsClient.activeTab" template='configuration/summary-tabs.html') + div(bs-pane title='XML') + ignite-ui-ace-xml(ng-if='tabsClient.activeTab == 0 || tabsClient.init[0]' ng-init='tabsClient.init[0] = true' data-master='cluster' data-no-deep-watch data-cluster-cfg='#{nearCfg}') + div(bs-pane title='Java') + ignite-ui-ace-java(ng-if='tabsClient.activeTab == 1 || tabsClient.init[1]' ng-init='tabsClient.init[1] = true' data-master='cluster' data-no-deep-watch data-cluster-cfg='#{nearCfg}') + div(bs-pane title='POM') + ignite-ui-ace-pom(ng-if='tabsClient.activeTab == 2 || tabsClient.init[2]' ng-init='tabsClient.init[2] = true' data-cluster='cluster' data-no-deep-watch) + div(bs-pane title='POJO' ng-if='cluster | hasPojo') + ignite-ui-ace-pojos(ng-if='tabsClient.activeTab == 3 || tabsClient.init[3]' ng-init='tabsClient.init[3] = true' data-cluster='cluster' data-no-deep-watch ng-model='ctrl.data.pojos') http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/views/includes/footer.jade ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/views/includes/footer.jade b/modules/web-console/frontend/views/includes/footer.jade new file mode 100644 index 0000000..4ef3bf6 --- /dev/null +++ b/modules/web-console/frontend/views/includes/footer.jade @@ -0,0 +1,23 @@ +//- + 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. + +.container.container-footer + footer + .col-md-offset-1.col-md-10 + ignite-footer + .col-md-1 + .pull-right + ignite-powered-by-apache http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/views/includes/header.jade ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/views/includes/header.jade b/modules/web-console/frontend/views/includes/header.jade new file mode 100644 index 0000000..9ef09aa --- /dev/null +++ b/modules/web-console/frontend/views/includes/header.jade @@ -0,0 +1,51 @@ +//- + 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.header + .viewedUser(ng-show='$root.user.becomeUsed') + | Currently assuming #[strong {{$root.user.firstName}} {{$root.user.lastName}}], #[a(ng-click='$root.revertIdentity()') revert to your identity]. + table.container + tr + td.col-xs-3.col-sm-3.col-md-2 + ignite-header-logo + td(ng-if='$root.user' style='padding-top: 20px') + ul.nav.navbar-nav(ignite-sidebar ignite-navbar) + li(ng-class='{active: $state.includes("base.configuration")}' bs-dropdown='sidebar.items' data-placement='bottom-right' data-trigger='hover focus' data-container='self' data-animation='' ng-click='$event.stopPropagation()') + a.dropdown-toggle Configuration + span.caret + + ul.nav.navbar-nav(ng-controller='notebookController') + li.sql-notebooks(ng-if='IgniteDemoMode' ng-class='{active: $state.includes("base.sql")}') + a(ui-sref='base.sql.demo') SQL + + li.sql-notebooks(ng-if='!IgniteDemoMode && !notebooks.length' ng-class='{active: $state.includes("base.sql")}') + a(ng-click='createNotebook()') SQL + + li.sql-notebooks(ng-if='!IgniteDemoMode && notebooks.length' ng-class='{active: $state.includes("base.sql")}' bs-dropdown='notebooks' data-placement='bottom-left' data-trigger='hover focus' data-container='self' data-animation='' ng-click='$event.stopPropagation()' aria-haspopup="true" aria-expanded="false") + a.dropdown-toggle SQL + span.caret + + li(ui-sref-active='active' ng-repeat='item in navbar.items') + a(ui-sref='{{::item.sref}}') {{::item.text}} + + a(ng-controller='demoController') + button.btn.btn-info(ng-if='IgniteDemoMode' ng-click='closeDemo()') Close demo + button.btn.btn-info(ng-if='!IgniteDemoMode' ng-click='startDemo()') Start demo + + ul.nav.navbar-nav.pull-right(ignite-userbar) + li(bs-dropdown='userbar.items' data-placement='bottom-right' data-trigger='hover focus' data-container='self' data-animation='' ng-class='{active: $state.includes("settings")}' ng-click='$event.stopPropagation()') + a.dropdown-toggle {{user.firstName}} {{user.lastName}} + span.caret http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/views/index.jade ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/views/index.jade b/modules/web-console/frontend/views/index.jade new file mode 100644 index 0000000..c561c3e --- /dev/null +++ b/modules/web-console/frontend/views/index.jade @@ -0,0 +1,47 @@ +//- + 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. + +doctype html +html(ng-app='ignite-console' id='app' ng-strict-di) + head + base(href='/') + + meta(http-equiv='content-type' content='text/html; charset=UTF8') + meta(http-equiv='content-language' content='en') + + title(ng-bind='$meta.title') + + meta(name='fragment' content='!') + meta(name='description' content='{{$meta.description}}') + meta(name='keywords' content='{{$meta.keywords}}') + meta(ng-repeat='(key, value) in $meta.properties' name='{{::key}}' content='{{::value}}') + + body.theme-line.body-overlap.greedy + + .splash.splash-max-foreground(hide-on-state-change) + .splash-wrapper + .spinner + .bounce1 + .bounce2 + .bounce3 + + .splash-wellcome Loading... + + .ribbon-wrapper.right(ng-cloak) + .ribbon(ng-style='IgniteDemoMode && {"background": "#1b6d88"}') + label {{IgniteDemoMode ? "Demo" : "Beta" }} + + .wrapper(ui-view='') http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/views/reset.jade ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/views/reset.jade b/modules/web-console/frontend/views/reset.jade new file mode 100644 index 0000000..9098105 --- /dev/null +++ b/modules/web-console/frontend/views/reset.jade @@ -0,0 +1,48 @@ +//- + 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.header + table.container + tr + td.col-xs-3.col-sm-3.col-md-2 + ignite-header-logo + td + ignite-header-title + +.container.body-container + .main-content(ng-controller='resetPassword') + .row + .text-center(ng-if='!token') + p Further instructions for password reset have been sent to your e-mail address. + .text-center(ng-if='error') + p {{::error}} + div(ng-if='token && !error') + form.form-horizontal(name='resetForm' ng-init='reset_info.token = token') + .settings-row + label.col-sm-1 E-mail: + label {{::email}} + .settings-row + label.col-sm-1.required Password: + .col-sm-3 + input#user_password.form-control(ignite-on-enter-focus-move='user_confirm' type='password' ng-model='reset_info.password' placeholder='New password' required) + .settings-row + label.col-sm-1.required Confirm: + .col-sm-3 + input#user_confirm.form-control(type='password' ng-model='reset_info.confirm' ignite-match='reset_info.password' placeholder='Confirm new password' required ignite-on-enter='resetForm.$valid && resetPassword(user_info)') + .settings-row + button.btn.btn-primary(ng-disabled='resetForm.$invalid' ng-click='resetPassword(reset_info)') Reset Password + +include includes/footer http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/views/settings/admin.jade ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/views/settings/admin.jade b/modules/web-console/frontend/views/settings/admin.jade new file mode 100644 index 0000000..862d959 --- /dev/null +++ b/modules/web-console/frontend/views/settings/admin.jade @@ -0,0 +1,76 @@ +//- + 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. + +.row(ng-controller='adminController') + .docs-content.greedy + .docs-header + h1 List of registered users + hr + .docs-body + .col-xs-12 + table.table.table-striped.table-vertical-middle.admin(st-table='displayedUsers' st-safe-src='users') + thead + tr + th.header(colspan='10') + .col-xs-3 + input.form-control(type='text' st-search='label' placeholder='Filter users...') + .col-xs-9.admin-summary.text-right(colspan='10') + strong Total users: {{ users.length }} + .col-xs-offset-6.col-xs-6.text-right + div(st-pagination st-items-by-page='15' st-displayed-pages='5' st-template='../templates/pagination.html') + tr + th(st-sort='userName') User + th(st-sort='email') Email + th(st-sort='company') Company + th(st-sort='country') Country + th.col-xs-2(st-sort='lastLogin' st-sort-default='reverse') Last login + th.text-nowrap(st-sort='counters.clusters' st-descending-first bs-tooltip='"Clusters count"' data-placement='top') + i.fa.fa-sitemap() + th.text-nowrap(st-sort='counters.models' st-descending-first bs-tooltip='"Models count"' data-placement='top') + i.fa.fa-object-group() + th.text-nowrap(st-sort='counters.caches' st-descending-first bs-tooltip='"Caches count"' data-placement='top') + i.fa.fa-database() + th.text-nowrap(st-sort='counters.igfs' st-descending-first bs-tooltip='"IGFS count"' data-placement='top') + i.fa.fa-folder-o() + th(width='1%') Actions + tbody + tr(ng-repeat='row in displayedUsers track by row._id') + td {{::row.userName}} + td + a(ng-href='mailto:{{::row.email}}') {{::row.email}} + td {{::row.company}} + td {{::row.countryCode}} + td {{::row.lastLogin | date:'medium'}} + td {{::row.counters.clusters}} + td {{::row.counters.models}} + td {{::row.counters.caches}} + td {{::row.counters.igfs}} + td.text-center + a.btn.btn-default.dropdown-toggle(bs-dropdown='' ng-show='row._id != user._id' data-placement='bottom-right') + i.fa.fa-gear   + span.caret + ul.dropdown-menu(role='menu') + li + a(ng-click='becomeUser(row)') Become this user + li + a(ng-click='toggleAdmin(row)' ng-if='row.admin && row._id !== user._id') Revoke admin + a(ng-click='toggleAdmin(row)' ng-if='!row.admin && row._id !== user._id') Grant admin + li + a(ng-click='removeUser(row)') Remove user + tfoot + tr + td.text-right(colspan='10') + div(st-pagination st-items-by-page='15' st-displayed-pages='5' st-template='../templates/pagination.html') http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/views/settings/profile.jade ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/views/settings/profile.jade b/modules/web-console/frontend/views/settings/profile.jade new file mode 100644 index 0000000..bc4965a --- /dev/null +++ b/modules/web-console/frontend/views/settings/profile.jade @@ -0,0 +1,76 @@ +//- + 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. + +mixin lbl(txt) + label.col-sm-2.required.labelFormField #{txt} + +.row(ng-controller='profileController') + .docs-content.greedy + .docs-header + h1 User profile + hr + .docs-body + form.form-horizontal(name='profileForm' novalidate) + .col-sm-10(style='padding: 0') + .details-row + +lbl('First name:') + .col-xs-5.col-sm-4 + input#profile-firstname.form-control(ignite-on-enter-focus-move='profile-lastname' type='text' ng-model='user.firstName' placeholder='Input first name' required ignite-auto-focus) + .details-row + +lbl('Last name:') + .col-xs-5.col-sm-4 + input#profile-lastname.form-control(ignite-on-enter-focus-move='profile-email' type='text' ng-model='user.lastName' placeholder='Input last name' required) + .details-row + +lbl('Email:') + .col-xs-5.col-sm-4 + input#profile-email.form-control(ignite-on-enter-focus-move='profile-company' type='email' ng-model='user.email' placeholder='Input email' required) + .details-row + +lbl('Company:') + .col-xs-5.col-sm-4 + input#profile-company.form-control(ignite-on-enter-focus-move='profile-country' type='text' ng-model='user.company' placeholder='Input company name' required) + .details-row + +lbl('Country:') + .col-xs-5.col-sm-4 + button#profile-country.select-toggle.form-control(bs-select bs-options='item.name as item.name for item in countries' type='text' ng-model='user.country' placeholder='Choose your country' ng-required='true') + .details-row + .advanced-options + i.fa( + ng-click='toggleToken()' + ng-class='expandedToken ? "fa-chevron-circle-down" : "fa-chevron-circle-right"') + a(ng-click='toggleToken()') {{expandedToken ? 'Cancel security token changing...' : 'Show security token...'}} + div(ng-if='expandedToken') + +lbl('Security token:') + label {{user.token || 'No security token. Regenerate please.'}} + i.tipLabel.fa.fa-refresh(ng-click='generateToken()' bs-tooltip='' data-title='Generate random security token') + i.tipLabel.fa.fa-clipboard(ignite-copy-to-clipboard='{{user.token}}' bs-tooltip='' data-title='Copy security token to clipboard') + i.tipLabel.fa.fa-question-circle(ng-if=lines bs-tooltip='' data-title='The security token is used for authorization of web agent') + .details-row + .advanced-options + i.fa( + ng-click='togglePassword()' + ng-class='expandedPassword ? "fa-chevron-circle-down" : "fa-chevron-circle-right"') + a(ng-click='togglePassword()') {{expandedPassword ? 'Cancel password changing...' : 'Change password...'}} + div(ng-if='expandedPassword') + .details-row + +lbl('New password:') + .col-xs-5.col-sm-4 + input#profile_password.form-control(ignite-on-enter-focus-move='profile_confirm' type='password' ng-model='user.password' placeholder='New password') + .details-row + +lbl('Confirm:') + .col-xs-5.col-sm-4 + input#profile_confirm.form-control(type='password' ng-model='user.confirm' ignite-match='user.password' placeholder='Confirm new password') + .col-xs-12.col-sm-12.details-row + a.btn.btn-primary(ng-disabled='!profileCouldBeSaved()' ng-click='profileCouldBeSaved() && saveUser()' bs-tooltip='' data-title='{{saveBtnTipText()}}' data-placement='bottom' data-trigger='hover') Save http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/views/signin.jade ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/views/signin.jade b/modules/web-console/frontend/views/signin.jade new file mode 100644 index 0000000..a6c64a8 --- /dev/null +++ b/modules/web-console/frontend/views/signin.jade @@ -0,0 +1,163 @@ +//- + 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. + +mixin lblRequired(txt) + label.col-xs-3.col-md-3.required #{txt} + +header#header.header + table.container + tr + td.col-xs-3.col-sm-3.col-md-2 + ignite-header-logo + td + ignite-header-title + +.container.body-container + .main-content(ng-controller='auth') + .row.home + .signin-greedy + .col-xs-12.col-md-6 + form(name='form' novalidate) + .modal-body.row(style='padding: 0 0 10px 0; margin: 0') + .settings-row(ng-if='action == "signup"') + h3.login-header Sign Up + .settings-row(ng-if='action == "signin"') + h3.login-header Sign In + .settings-row(ng-if='action == "password/forgot"') + h3.login-header Forgot password? + .settings-row + p.col-xs-12.col-md-11(ng-show='action == "password/forgot"') + | That's ok! Simply enter your email below and a reset password link will be sent to you via email. You can then follow that link and select a new password. + .settings-row(ng-show='action == "signin"') + +lblRequired('Email:') + .col-xs-9.col-md-8 + input#signin_email.form-control(ignite-on-enter-focus-move='user_password' type='email' ng-model='ui.email' placeholder='Input email' required) + .settings-row(ng-show='action == "signup"') + +lblRequired('Email:') + .col-xs-9.col-md-8 + input#signup_email.form-control(ignite-on-enter-focus-move='user_password' type='email' ng-model='ui.email' placeholder='Input email' required) + .settings-row(ng-show='action != "password/forgot"') + +lblRequired('Password:') + .col-xs-9.col-md-8 + input#user_password.form-control(ignite-on-enter-focus-move='user_confirm' type='password' ng-model='ui.password' placeholder='Password' ng-required='action != "password/forgot"' ignite-on-enter='action == "signin" && form.$valid && auth(action, ui)') + .settings-row(ng-if='action == "signup"') + +lblRequired('Confirm:') + .col-xs-9.col-md-8 + input#user_confirm.form-control(ignite-on-enter-focus-move='first_name' type='password' ng-model='ui_exclude.confirm' ignite-match='ui.password' placeholder='Confirm password' ng-required='action == "signup"') + .settings-row(ng-show='action == "signup"') + +lblRequired('First Name:') + .col-xs-9.col-md-8 + input#first_name.form-control(ignite-on-enter-focus-move='last_name' type='text' ng-model='ui.firstName' placeholder='Input first name' ng-required='action=="signup"') + .settings-row(ng-show='action == "signup"') + +lblRequired('Last Name:') + .col-xs-9.col-md-8 + input#last_name.form-control(ignite-on-enter-focus-move='company' type='text' ng-model='ui.lastName' placeholder='Input last name' ng-required='action=="signup"') + .settings-row(ng-show='action == "password/forgot"') + +lblRequired('Email:') + .col-xs-9.col-md-8 + input#forgot_email.form-control(ignite-on-enter='form.$valid && forgotPassword(ui)' type='email' ng-model='ui.email' placeholder='Input email' required) + .settings-row(ng-show='action == "signup"') + +lblRequired('Company:') + .col-xs-9.col-md-8 + input#company.form-control(ignite-on-enter-focus-move='country' type='text' ng-model='ui.company' placeholder='Input company name' ng-required='action=="signup"') + .settings-row(ng-show='action == "signup"') + +lblRequired('Country:') + .col-xs-9.col-md-8 + button#country.select-toggle.form-control(ignite-on-enter-focus-move='signup' bs-select bs-options='item.name as item.name for item in countries' type='text' ng-model='ui.country' placeholder='Choose your country' ng-required='action=="signup"') + .settings-row(ignite-terms) + .col-md-offset-3(ng-if='action == "signup" && terms.termsState') + label + input(type='checkbox' ng-model='ui_exclude.agree', ng-required='true') + | I agree to the #[a(ui-sref='{{::terms.termsState}}' target='_blank') terms and conditions] + .col-xs-12.col-md-11 + .login-footer(ng-show='action == "signup"') + a.labelField(ng-click='action = "password/forgot"' ignite-on-click-focus='signin_email') Forgot password? + a.labelLogin(ng-click='action = "signin"' ignite-on-click-focus='signin_email') Sign In + button#signup.btn.btn-primary(ng-click='auth(action, ui)' ng-disabled='form.$invalid') Sign Up + .col-xs-12.col-md-11 + .login-footer(ng-show='action == "password/forgot"') + a.labelField(ng-click='action = "signin"' ignite-on-click-focus='signin_email') Sign In + button#forgot.btn.btn-primary(ng-click='forgotPassword(ui)' ng-disabled='form.$invalid') Send it to me + .col-xs-12.col-md-11 + .login-footer(ng-show='action == "signin"') + a.labelField(ng-click='action = "password/forgot"' ignite-on-click-focus='signin_email') Forgot password? + a.labelLogin(ng-click='action = "signup"' ignite-on-click-focus='first_name') Sign Up + button#login.btn.btn-primary(ng-click='auth(action, ui)' ng-disabled='form.$invalid') Sign In + + .col-xs-12.col-md-11.home-panel + ignite-features + .col-xs-12.col-md-6 + #carousel.carousel.slide + // Indicators + ol.carousel-indicators + li.active(data-target='#carousel', data-slide-to='0') + li(data-target='#carousel', data-slide-to='1') + li(data-target='#carousel', data-slide-to='2') + li(data-target='#carousel', data-slide-to='3') + li(data-target='#carousel', data-slide-to='4') + li(data-target='#carousel', data-slide-to='5') + li(data-target='#carousel', data-slide-to='6') + // Wrapper for slides + .carousel-inner(role='listbox') + .item.active + img(src='/images/cluster.png', alt='Clusters screen') + .carousel-caption + h3 Clusters screen + p Configure clusters, link clusters to caches + .item + img(src='/images/cache.png', alt='Caches screen') + .carousel-caption + h3 Caches screen + p Configure caches, link domain models to caches, link caches to clusters + .item + img(src='/images/domains.png', alt='Domain model screen') + .carousel-caption + h3 Domain model screen + p Manually enter domain model or import from database + .item + img(src='/images/summary.png', alt='Summary screen') + .carousel-caption + h3 Summary screen + p Preview XML config, JAVA code,Docker file and download project + .item + img(src='/images/query-table.png', alt='Query') + .carousel-caption + h3 Query + p Explain SQL, execute, scan queries + .item + img(src='/images/query-metadata.png', alt='Cache metadata') + .carousel-caption + h3 Cache metadata + p View cache type metadata + .item + img(src='/images/query-chart.png', alt='Query chart') + .carousel-caption + h3 Query chart + p View data in tabular form and as charts + // Controls + a.left.carousel-control(href='#carousel', ng-click='$event.preventDefault()', role='button', data-slide='prev') + span.fa.fa-chevron-left(aria-hidden='true') + span.sr-only Previous + a.right.carousel-control(href='#carousel', ng-click='$event.preventDefault()', role='button', data-slide='next') + span.fa.fa-chevron-right(aria-hidden='true') + span.sr-only Next + +include includes/footer + +script. + $('.carousel').carousel() + + http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/views/sql/cache-metadata.jade ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/views/sql/cache-metadata.jade b/modules/web-console/frontend/views/sql/cache-metadata.jade new file mode 100644 index 0000000..450c178 --- /dev/null +++ b/modules/web-console/frontend/views/sql/cache-metadata.jade @@ -0,0 +1,40 @@ +//- + 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()') × + .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='' on='node.type') + span(ng-switch-when='type' ng-dblclick='dblclickMetadata(paragraph, node)') + i.fa.fa-table + label.clickable(ng-bind='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 http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/views/sql/chart-settings.jade ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/views/sql/chart-settings.jade b/modules/web-console/frontend/views/sql/chart-settings.jade new file mode 100644 index 0000000..5a1ceed --- /dev/null +++ b/modules/web-console/frontend/views/sql/chart-settings.jade @@ -0,0 +1,40 @@ +//- + 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.settings(tabindex='-1' style='width: 300px') + .arrow + h3.popover-title(style='color: black') Chart settings + button.close(id='chart-settings-close' ng-click='$hide()') × + .popover-content + form.form-horizontal.chart-settings(name='chartSettingsForm' novalidate) + .form-group.chart-settings + -var btnClass = 'col.value < 0 ? "btn-success" : "btn-default"' + + label All columns (drag columns to axis) + ul.chart-settings-columns-list(dnd-list='paragraph.chartColumns' dnd-allowed-types='[]') + li(ng-repeat='col in paragraph.chartColumns track by $index') + .btn.btn-default.btn-chart-column-movable(ng-class=btnClass dnd-draggable='col' dnd-effect-allowed='copy') {{col.label}} + label X axis (accept only one column) + ul.chart-settings-columns-list(dnd-list='paragraph.chartKeyCols' dnd-drop='chartAcceptKeyColumn(paragraph, item)') + li(ng-repeat='col in paragraph.chartKeyCols track by $index') + .btn.btn-default.btn-chart-column(ng-class=btnClass) {{col.label}} + i.fa.fa-close(ng-click='chartRemoveKeyColumn(paragraph, $index)') + label Y axis (accept only numeric columns) + ul.chart-settings-columns-list(dnd-list='paragraph.chartValCols' dnd-drop='chartAcceptValColumn(paragraph, item)') + li(ng-repeat='col in paragraph.chartValCols track by $index') + .btn.btn-default.btn-chart-column(ng-style='chartColor($index)') {{col.label}} + button.btn-chart-column-agg-fx.select-toggle(ng-change='applyChartSettings(paragraph)' ng-show='paragraphTimeSpanVisible(paragraph)' ng-style='chartColor($index)' ng-model='col.aggFx' placeholder='...' bs-select bs-options='item for item in aggregateFxs' data-container='false' tabindex='-1') + i.fa.fa-close(ng-click='chartRemoveValColumn(paragraph, $index)') http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/views/sql/notebook-new.jade ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/views/sql/notebook-new.jade b/modules/web-console/frontend/views/sql/notebook-new.jade new file mode 100644 index 0000000..09b2dae --- /dev/null +++ b/modules/web-console/frontend/views/sql/notebook-new.jade @@ -0,0 +1,31 @@ +//- + 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. + +.modal(tabindex='-1' role='dialog') + .modal-dialog + .modal-content + .modal-header + button.close(ng-click='$hide()') × + h4.modal-title New SQL notebook + form.form-horizontal.modal-body.row(name='ui.inputForm' novalidate) + div + .col-sm-2 + label.required.labelFormField Name:  + .col-sm-10 + input.form-control(id='create-notebook' type='text' ng-model='name' required ignite-on-enter='ui.inputForm.$valid && create(name)' ignite-auto-focus) + .modal-footer + button.btn.btn-default(id='copy-btn-cancel' ng-click='$hide()') Cancel + button.btn.btn-primary(id='copy-btn-confirm' ng-disabled='ui.inputForm.$invalid' ng-click='create(name)') Create http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/views/sql/paragraph-rate.jade ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/views/sql/paragraph-rate.jade b/modules/web-console/frontend/views/sql/paragraph-rate.jade new file mode 100644 index 0000000..03c6497 --- /dev/null +++ b/modules/web-console/frontend/views/sql/paragraph-rate.jade @@ -0,0 +1,31 @@ +//- + 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.settings(tabindex='-1' style='width: 200px') + .arrow + h3.popover-title(style='color: black') Refresh rate + button.close(id='paragraph-rate-close' ng-click='$hide()') × + .popover-content + form(name='popoverForm' novalidate) + .form-group(style='padding: 5px') + .col-sm-4 + input.form-control(id='paragraph-rate' ng-init='value = paragraph.rate.value' ng-model='value' type='number' min='1' required ignite-auto-focus) + .col-sm-8(style='padding-left: 5px') + button.form-control.select-toggle(id='paragraph-unit' ng-init='unit = paragraph.rate.unit' ng-model='unit' required placeholder='Time unit' bs-select bs-options='item.value as item.label for item in timeUnit' data-container='false' tabindex='0') + .form-actions(style='margin-top: 30px; padding: 5px') + button.btn.btn-primary(id='paragraph-rate-start' ng-disabled='popoverForm.$invalid' ng-click='startRefresh(paragraph, value, unit); $hide()') Start + button.btn.btn-primary.btn-default(id='paragraph-rate-stop' ng-click='stopRefresh(paragraph); $hide()' ng-disabled='!paragraph.rate.installed') Stop + http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/views/sql/sql.jade ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/views/sql/sql.jade b/modules/web-console/frontend/views/sql/sql.jade new file mode 100644 index 0000000..81acdfd --- /dev/null +++ b/modules/web-console/frontend/views/sql/sql.jade @@ -0,0 +1,193 @@ +//- + 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. + +mixin btn-toolbar(btn, click, tip, focusId) + i.btn.btn-default.fa(class=btn ng-click=click bs-tooltip='' data-title=tip ignite-on-click-focus=focusId data-trigger='hover' data-placement='bottom') + +mixin btn-toolbar-data(btn, kind, tip) + i.btn.btn-default.fa(class=btn ng-click='setResult(paragraph, "#{kind}")' ng-class='{active: resultEq(paragraph, "#{kind}")}' bs-tooltip='' data-title=tip data-trigger='hover' data-placement='bottom') + +mixin result-toolbar + .btn-group(ng-model='paragraph.result' ng-click='$event.stopPropagation()' style='left: 50%; margin: 0 0 0 -70px;display: block;') + +btn-toolbar-data('fa-table', 'table', 'Show data in tabular form') + +btn-toolbar-data('fa-bar-chart', 'bar', 'Show bar chart
By default first column - X values, second column - Y values
In case of one column it will be treated as Y values') + +btn-toolbar-data('fa-pie-chart', 'pie', 'Show pie chart
By default first column - pie labels, second column - pie values
In case of one column it will be treated as pie values') + +btn-toolbar-data('fa-line-chart', 'line', 'Show line chart
By default first column - X values, second column - Y values
In case of one column it will be treated as Y values') + +btn-toolbar-data('fa-area-chart', 'area', 'Show area chart
By default first column - X values, second column - Y values
In case of one column it will be treated as Y values') + +mixin chart-settings + .total.row + .col-xs-4 + .chart-settings-link(ng-show='paragraph.chart && paragraph.chartColumns.length > 0') + a(title='Click to show chart settings dialog' ng-click='$event.stopPropagation()' bs-popover data-template-url='/sql/chart-settings.html' data-placement='bottom' data-auto-close='1' data-trigger='click') + i.fa.fa-bars + | Chart settings + div(ng-show='paragraphTimeSpanVisible(paragraph)') + label Show + button.select-manual-caret.btn.btn-default(ng-model='paragraph.timeLineSpan' ng-change='applyChartSettings(paragraph)' bs-options='item for item in timeLineSpans' bs-select data-caret-html='') + label min + .col-xs-4 + +result-toolbar + +mixin notebook-rename + .docs-header.notebook-header + h1.col-sm-6(ng-hide='notebook.edit') + label(style='max-width: calc(100% - 60px)') {{notebook.name}} + .btn-group(ng-if='!demo') + +btn-toolbar('fa-pencil', 'notebook.edit = true;notebook.editName = notebook.name', 'Rename notebook') + +btn-toolbar('fa-trash', 'removeNotebook(notebook)', 'Remove notebook') + h1.col-sm-6(ng-show='notebook.edit') + i.btn.fa.fa-floppy-o(ng-show='notebook.editName' ng-click='renameNotebook(notebook.editName)' bs-tooltip data-title='Save notebook name' data-trigger='hover') + .input-tip + input.form-control(ng-model='notebook.editName' required ignite-on-enter='renameNotebook(notebook.editName)' ignite-on-escape='notebook.edit = false;') + h1.pull-right + a.dropdown-toggle(data-toggle='dropdown' bs-dropdown='scrollParagraphs' data-placement='bottom-right') Scroll to query + span.caret + .btn-group(style='margin-top: 2px') + +btn-toolbar('fa-plus', 'addParagraph()', 'Add new query') + +mixin notebook-error + h2 Failed to load notebook + label.col-sm-12 Notebook not accessible any more. Go back to configuration or open to another notebook. + button.h3.btn.btn-primary(ui-sref='base.configuration.clusters') Back to configuration + +mixin paragraph-rename + .col-sm-6(ng-hide='paragraph.edit') + i.tipLabel.fa(ng-class='paragraphExpanded(paragraph) ? "fa-chevron-circle-down" : "fa-chevron-circle-right"') + label {{paragraph.name}} + + .btn-group(ng-hide='notebook.paragraphs.length > 1') + +btn-toolbar('fa-pencil', 'paragraph.edit = true; paragraph.editName = paragraph.name; $event.stopPropagation();', 'Rename query', 'paragraph-name-{{paragraph.id}}') + + .btn-group(ng-show='notebook.paragraphs.length > 1' ng-click='$event.stopPropagation();') + +btn-toolbar('fa-pencil', 'paragraph.edit = true; paragraph.editName = paragraph.name;', 'Rename query', 'paragraph-name-{{paragraph.id}}') + +btn-toolbar('fa-remove', 'removeParagraph(paragraph)', 'Remove query') + + .col-sm-6(ng-show='paragraph.edit') + i.tipLabel.fa(style='float: left;' ng-class='paragraphExpanded(paragraph) ? "fa-chevron-circle-down" : "fa-chevron-circle-right"') + i.tipLabel.fa.fa-floppy-o(style='float: right;' ng-show='paragraph.editName' ng-click='renameParagraph(paragraph, paragraph.editName); $event.stopPropagation();' bs-tooltip data-title='Save query name' data-trigger='hover') + .input-tip + input.form-control(id='paragraph-name-{{paragraph.id}}' ng-model='paragraph.editName' required ng-click='$event.stopPropagation();' ignite-on-enter='renameParagraph(paragraph, paragraph.editName)' ignite-on-escape='paragraph.edit = false') + +mixin query-controls + .sql-controls + a.btn.btn-primary(ng-disabled='!actionAvailable(paragraph, true)' ng-click='execute(paragraph)' data-placement='bottom' bs-tooltip='' data-title='{{actionTooltip(paragraph, "execute", true)}}') Execute + a.btn.btn-primary(ng-disabled='!actionAvailable(paragraph, true)' ng-click='explain(paragraph)' data-placement='bottom' bs-tooltip='' data-title='{{actionTooltip(paragraph, "explain", true)}}') Explain + .btn-group(bs-tooltip='' data-title='{{actionTooltip(paragraph, "execute scan", false)}}' data-placement='bottom') + a.btn.btn-primary.fieldButton(ng-disabled='!actionAvailable(paragraph, false)' ng-click='scan(paragraph)') Scan + a.btn.btn-primary(ng-disabled='!actionAvailable(paragraph, false)' data-toggle='dropdown' data-container='body' bs-dropdown='[{ text: "Scan with filter", click: "actionAvailable(paragraph, false) && scanWithFilter(paragraph)" }]') + span.caret + + .pull-right + label.tipLabel System columns: + a.btn.btn-default.fa.fa-bars.tipLabel(ng-class='{"btn-info": paragraph.systemColumns}' ng-click='toggleSystemColumns(paragraph)' ng-disabled='paragraph.disabledSystemColumns' bs-tooltip data-title='Show "_KEY", "_VAL" columns') + label.tipLabel Refresh rate: + button.btn.btn-default.fa.fa-clock-o.tipLabel(title='Click to show refresh rate dialog' ng-class='{"btn-info": paragraph.rate && paragraph.rate.installed}' bs-popover data-template-url='/sql/paragraph-rate.html' data-placement='left' data-auto-close='1' data-trigger='click') {{rateAsString(paragraph)}} + label.tipLabel Page size: + button.select-toggle.fieldButton.btn.btn-default(ng-model='paragraph.pageSize' bs-options='item for item in pageSizes' bs-select bs-tooltip data-placement='bottom-right' data-title='Max number of rows to show in query result as one page') + +mixin table-result + .total.row + .col-xs-4 + label Page: #[b {{paragraph.page}}] + label.margin-left-dflt Results so far: #[b {{paragraph.rows.length + paragraph.total}}] + label.margin-left-dflt Duration: #[b {{paragraph.duration | duration}}] + .col-xs-4 + +result-toolbar + .col-xs-4 + .btn-group.pull-right(ng-disabled='paragraph.loading') + button.btn.btn-primary.fieldButton(ng-click='exportCsv(paragraph)' bs-tooltip data-title='{{actionTooltip(paragraph, "export", false)}}') Export + button.btn.btn-primary(id='export-item-dropdown' data-toggle='dropdown' data-container='body' bs-dropdown='exportDropdown' data-placement='bottom-right') + span.caret + .grid(ui-grid='paragraph.gridOptions' ui-grid-resize-columns ui-grid-exporter) + +mixin chart-result + div(ng-hide='paragraph.scanExplain()') + +chart-settings + .empty(ng-show='paragraph.chartColumns.length > 0 && !paragraph.chartColumnsConfigured()') Cannot display chart. Please configure axis using #[b Chart settings] + .empty(ng-show='paragraph.chartColumns.length == 0') Cannot display chart. Result set must contain Java build-in type columns. Please change query and execute it again. + div(ng-show='paragraph.chartColumnsConfigured()') + div(ng-show='paragraph.timeLineSupported() || !paragraph.chartTimeLineEnabled()') + div(ng-repeat='chart in paragraph.charts') + nvd3(options='chart.options' data='chart.data' api='chart.api') + .empty(ng-show='!paragraph.timeLineSupported() && paragraph.chartTimeLineEnabled()') Pie chart does not support 'TIME_LINE' column for X-axis. Please use another column for X-axis or switch to another chart. + .empty(ng-show='paragraph.scanExplain()') + .row + .col-xs-4.col-xs-offset-4 + +result-toolbar + label.margin-top-dflt Charts do not support #[b Explain] and #[b Scan] query + +.row(ng-controller='sqlController') + .docs-content + .row(ng-if='notebook' bs-affix style='margin-bottom: 20px;') + +notebook-rename + + ignite-information(data-title='With SQL notebook you can' style='margin-top: 0; margin-bottom: 30px') + ul + li Create any number of queries + li Execute and explain SQL queries + li Execute scan queries + li View data in tabular form and as charts + + div(ng-if='notebookLoadFailed' style='text-align: center') + +notebook-error + + div(ng-if='notebook' ignite-loading='sqlLoading' ignite-loading-text='{{ loadingText }}' ignite-loading-position='top') + .docs-body.paragraphs + .panel-group(bs-collapse ng-model='notebook.expandedParagraphs' data-allow-multiple='true' data-start-collapsed='false') + .panel.panel-default(ng-repeat='paragraph in notebook.paragraphs' id='{{paragraph.id}}') + .panel-heading(bs-collapse-toggle) + .row + +paragraph-rename + .panel-collapse(role='tabpanel' bs-collapse-target) + .col-sm-12 + .col-xs-8.col-sm-9(style='border-right: 1px solid #eee') + .sql-editor(ignite-ace='{onLoad: aceInit(paragraph), theme: "chrome", mode: "sql", require: ["ace/ext/language_tools"],' + + 'advanced: {enableSnippets: false, enableBasicAutocompletion: true, enableLiveAutocompletion: true}}' + ng-model='paragraph.query') + .col-xs-4.col-sm-3 + div(ng-show='caches.length > 0' style='padding: 5px 10px' st-table='displayedCaches' st-safe-src='caches') + lable.labelField.labelFormField Caches: + i.fa.fa-database.tipField(title='Click to show cache types metadata dialog' bs-popover data-template-url='/sql/cache-metadata.html' data-placement='bottom' data-trigger='click' data-container='#{{ paragraph.id}}') + .input-tip + input.form-control(type='text' st-search='label' placeholder='Filter caches...') + table.links + tbody.scrollable-y(style='max-height: 15em; display: block;') + tr(ng-repeat='cache in displayedCaches track by cache.name') + td(style='width: 100%') + input.labelField(id='cache{{$index}}' type='radio' value='{{cache.name}}' ng-model='paragraph.cacheName') + label(for='cache{{$index}}' ng-bind='cache.label') + .empty-caches(ng-show='displayedCaches.length == 0 && caches.length != 0') + label Wrong caches filter + .empty-caches(ng-show='caches.length == 0') + label No caches + .col-sm-12 + +query-controls + .col-sm-12.sql-result(ng-if='paragraph.queryExecuted()' ng-switch='paragraph.resultType()') + .error(ng-switch-when='error') Error: {{paragraph.errMsg}} + .empty(ng-switch-when='empty') Result set is empty + .table(ng-switch-when='table') + +table-result + .chart(ng-switch-when='chart') + +chart-result + .footer.clearfix(ng-show='paragraph.nonRefresh()') + a.pull-left(ng-click='showResultQuery(paragraph)') Show query + + -var nextVisibleCondition = 'paragraph.queryId && (paragraph.table() || paragraph.chart() && (paragraph.timeLineSupported() || !paragraph.chartTimeLineEnabled()))' + + .pull-right(ng-show=nextVisibleCondition ng-class='{disabled: paragraph.loading}' ng-click='!paragraph.loading && nextPage(paragraph)') + i.fa.fa-chevron-circle-right + a Next http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/views/templates/agent-download.jade ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/views/templates/agent-download.jade b/modules/web-console/frontend/views/templates/agent-download.jade new file mode 100644 index 0000000..864694b --- /dev/null +++ b/modules/web-console/frontend/views/templates/agent-download.jade @@ -0,0 +1,48 @@ +//- + 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. + +.modal.center(tabindex='-1' role='dialog') + .modal-dialog + .modal-content + #errors-container.modal-header.header + h4.modal-title(ng-if='!hasAgents') Connection to Ignite Web Agent is not established + h4.modal-title(ng-if='hasAgents') Connection to Ignite Node is not established + .agent-download(ng-if='!hasAgents') + p Please download and run #[a(href='javascript:void(0)' ng-click='downloadAgent()') ignite-web-agent] in order to {{::agentGoal}} + p For run: + ul + li Download and unzip #[a(href='javascript:void(0)' ng-click='downloadAgent()') ignite-web-agent] archive + li Run shell file #[b ignite-web-agent.{sh|bat}] + p Refer to #[b README.txt] in agent folder for more information + .modal-advanced-options + i.fa.fa-chevron-circle-down(ng-show='agentLoad.showToken' ng-click='agentLoad.showToken = ! agentLoad.showToken') + i.fa.fa-chevron-circle-right(ng-show='!agentLoad.showToken' ng-click='agentLoad.showToken = ! agentLoad.showToken') + a(ng-click='agentLoad.showToken = ! agentLoad.showToken') {{agentLoad.showToken ? 'Hide security token...' : 'Show security token...'}} + .details-row(ng-show='agentLoad.showToken') + label.labelField Security token: {{user.token}} + i.tipLabel.fa.fa-clipboard(ignite-copy-to-clipboard='{{user.token}}' bs-tooltip='' data-title='Copy security token to clipboard') + i.tipLabel.fa.fa-question-circle(ng-if=lines bs-tooltip='' data-title='The security token is used for authorization of web agent') + .agent-download(ng-if='hasAgents') + p Connection to Ignite Web Agent is established, but agent failed to connect to Ignite Node + p Please check the following: + ul + li Ignite Grid is up and running + li In agent settings check URI for connect to Ignite REST server + li Check agent logs for errors + li Refer to #[b README.txt] in agent folder for more information + .modal-footer + button.btn.btn-default(ng-click='back()') {{::backText}} + button.btn.btn-primary(ng-if='!hasAgents' ng-click='downloadAgent()') Download agent http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/frontend/views/templates/alert.jade ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/views/templates/alert.jade b/modules/web-console/frontend/views/templates/alert.jade new file mode 100644 index 0000000..182ba99 --- /dev/null +++ b/modules/web-console/frontend/views/templates/alert.jade @@ -0,0 +1,21 @@ +//- + 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. + +.alert(ng-show='type' ng-class='[type ? "alert-" + type : null]') + button.close(type='button', ng-if='dismissable', ng-click='$hide()') × + i.alert-icon.fa(ng-if='icon' ng-class='[icon]') + span.alert-title(ng-bind-html='title') + span.alert-content(ng-bind-html='content')