IGNITE-5635 Web Console: Added spinning wheel for execute, scan and export 
actions on Queries screen.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/f992386e
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/f992386e
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/f992386e

Branch: refs/heads/ignite-zk
Commit: f992386e25e643f329b219ec2d0f877e50920b40
Parents: 8c278ca
Author: alexdel <verba...@yandex.ru>
Authored: Wed Nov 15 19:35:30 2017 +0700
Committer: Alexey Kuznetsov <akuznet...@apache.org>
Committed: Wed Nov 15 19:35:30 2017 +0700

----------------------------------------------------------------------
 .../frontend/app/modules/sql/sql.controller.js  | 28 ++++++-
 .../frontend/public/stylesheets/style.scss      | 10 +++
 .../web-console/frontend/views/sql/sql.tpl.pug  | 84 ++++++++++++++++++--
 3 files changed, 112 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/f992386e/modules/web-console/frontend/app/modules/sql/sql.controller.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/sql/sql.controller.js 
b/modules/web-console/frontend/app/modules/sql/sql.controller.js
index 8d27d30..b4c8a6f 100644
--- a/modules/web-console/frontend/app/modules/sql/sql.controller.js
+++ b/modules/web-console/frontend/app/modules/sql/sql.controller.js
@@ -59,6 +59,9 @@ class Paragraph {
         self.maxPages = 0;
         self.filter = '';
         self.useAsDefaultSchema = false;
+        self.localQueryMode = false;
+        self.csvIsPreparing = false;
+        self.scanningInProgress = false;
 
         _.assign(this, paragraph);
 
@@ -200,6 +203,14 @@ class Paragraph {
     chartTimeLineEnabled() {
         return _.nonEmpty(this.chartKeyCols) && _.eq(this.chartKeyCols[0], 
TIME_LINE);
     }
+
+    executionInProgress(showLocal = false) {
+        return this.loading && (this.localQueryMode === showLocal);
+    }
+
+    checkScanInProgress(showLocal = false) {
+        return this.scanningInProgress && (this.localQueryMode === showLocal);
+    }
 }
 
 // Controller for SQL notebook screen.
@@ -1409,6 +1420,8 @@ export default ['$rootScope', '$scope', '$http', '$q', 
'$timeout', '$interval',
             const enforceJoinOrder = !!paragraph.enforceJoinOrder;
             const lazy = !!paragraph.lazy;
 
+            paragraph.localQueryMode = local;
+
             $scope.queryAvailable(paragraph) && 
_chooseNode(paragraph.cacheName, local)
                 .then((nid) => {
                     Notebook.save($scope.notebook)
@@ -1506,8 +1519,12 @@ export default ['$rootScope', '$scope', '$http', '$q', 
'$timeout', '$interval',
             const filter = paragraph.filter;
             const pageSize = paragraph.pageSize;
 
+            paragraph.localQueryMode = local;
+
             $scope.scanAvailable(paragraph) && _chooseNode(cacheName, local)
                 .then((nid) => {
+                    paragraph.scanningInProgress = true;
+
                     Notebook.save($scope.notebook)
                         .catch(Messages.showError);
 
@@ -1537,7 +1554,8 @@ export default ['$rootScope', '$scope', '$http', '$q', 
'$timeout', '$interval',
                             paragraph.setError(err);
 
                             _showLoading(paragraph, false);
-                        });
+                        })
+                        .then(() => paragraph.scanningInProgress = false);
                 });
         };
 
@@ -1664,6 +1682,8 @@ export default ['$rootScope', '$scope', '$http', '$q', 
'$timeout', '$interval',
         };
 
         $scope.exportCsvAll = (paragraph) => {
+            paragraph.csvIsPreparing = true;
+
             const args = paragraph.queryArgs;
 
             return Promise.resolve(args.localNid || 
_chooseNode(args.cacheName, false))
@@ -1672,7 +1692,11 @@ export default ['$rootScope', '$scope', '$http', '$q', 
'$timeout', '$interval',
                     : agentMgr.querySqlGetAll(nid, args.cacheName, args.query, 
!!args.nonCollocatedJoins, !!args.enforceJoinOrder, false, !!args.localNid, 
!!args.lazy))
                 .then((res) => _export(exportFileName(paragraph, true), 
paragraph.gridOptions.columnDefs, res.columns, res.rows))
                 .catch(Messages.showError)
-                .then(() => paragraph.ace && paragraph.ace.focus());
+                .then(() => {
+                    paragraph.csvIsPreparing = false;
+
+                    return paragraph.ace && paragraph.ace.focus();
+                });
         };
 
         // $scope.exportPdfAll = function(paragraph) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/f992386e/modules/web-console/frontend/public/stylesheets/style.scss
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/public/stylesheets/style.scss 
b/modules/web-console/frontend/public/stylesheets/style.scss
index b259f1d..8433747 100644
--- a/modules/web-console/frontend/public/stylesheets/style.scss
+++ b/modules/web-console/frontend/public/stylesheets/style.scss
@@ -2201,3 +2201,13 @@ html,body,.splash-screen {
 .demo-mode {
     padding-top: 30px;
 }
+
+// Fix for injecting svg icon into BS btn
+.btn--with-icon {
+    display: flex;
+    align-items: center;
+
+    span {
+        margin-left: 5px;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/f992386e/modules/web-console/frontend/views/sql/sql.tpl.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/sql/sql.tpl.pug 
b/modules/web-console/frontend/views/sql/sql.tpl.pug
index 7ee966d..b324622 100644
--- a/modules/web-console/frontend/views/sql/sql.tpl.pug
+++ b/modules/web-console/frontend/views/sql/sql.tpl.pug
@@ -123,8 +123,17 @@ mixin query-settings
                     span Lazy result set
 
 mixin query-actions
-    button.btn.btn-primary(ng-disabled='!queryAvailable(paragraph)' 
ng-click='execute(paragraph)') Execute
-    button.btn.btn-primary(ng-disabled='!queryAvailable(paragraph)' 
ng-click='execute(paragraph, true)') Execute on selected node
+    button.btn.btn-primary(ng-disabled='!queryAvailable(paragraph)' 
ng-click='execute(paragraph)')
+        div
+            i.fa.fa-fw.fa-play(ng-hide='paragraph.executionInProgress(false)')
+            
i.fa.fa-fw.fa-refresh.fa-spin(ng-show='paragraph.executionInProgress(false)')
+            span.tipLabelExecute Execute
+    button.btn.btn-primary(ng-disabled='!queryAvailable(paragraph)' 
ng-click='execute(paragraph, true)')
+        div
+            i.fa.fa-fw.fa-play(ng-hide='paragraph.executionInProgress(true)')
+            
i.fa.fa-fw.fa-refresh.fa-spin(ng-show='paragraph.executionInProgress(true)')
+            span.tipLabelExecute Execute on selected node
+
 
     a.btn.btn-default(ng-disabled='!queryAvailable(paragraph)' 
ng-click='explain(paragraph)' data-placement='bottom' bs-tooltip='' 
data-title='{{queryTooltip(paragraph, "explain query")}}') Explain
 
@@ -141,8 +150,35 @@ mixin table-result-heading-query
                 +result-toolbar
         .col-xs-4
             .pull-right
-                -var options = [{ text: "Export", click: 
'exportCsv(paragraph)' }, { text: 'Export all', click: 
'exportCsvAll(paragraph)' }]
-                +btn-group('paragraph.loading', options, '{{ 
queryTooltip(paragraph, "export query results") }}')
+                .btn-group.panel-tip-container
+                    button.btn.btn-primary.btn--with-icon(
+                        ng-click='exportCsv(paragraph)'
+
+                        ng-disabled='paragraph.loading'
+
+                        bs-tooltip=''
+                        ng-attr-title='{{ queryTooltip(paragraph, "export 
query results") }}'
+
+                        data-trigger='hover'
+                        data-placement='bottom'
+                    )
+                        svg(ignite-icon='csv' 
ng-if='!paragraph.csvIsPreparing')
+                        
i.fa.fa-fw.fa-refresh.fa-spin(ng-if='paragraph.csvIsPreparing')
+                        span Export
+
+                    -var options = [{ text: "Export", click: 
'exportCsv(paragraph)' }, { text: 'Export all', click: 
'exportCsvAll(paragraph)' }]
+                    button.btn.dropdown-toggle.btn-primary(
+                        ng-disabled='paragraph.loading'
+
+                        bs-dropdown=`${JSON.stringify(options)}`
+
+                        data-toggle='dropdown'
+                        data-container='body'
+                        data-placement='bottom-right'
+                    )
+                        span.caret
+
+
 
 mixin table-result-heading-scan
     .total.row
@@ -157,8 +193,34 @@ mixin table-result-heading-scan
                 +result-toolbar
         .col-xs-4
             .pull-right
-                -var options = [{ text: "Export", click: 
'exportCsv(paragraph)' }, { text: 'Export all', click: 
'exportCsvAll(paragraph)' }]
-                +btn-group('paragraph.loading', options, '{{ 
scanTooltip(paragraph) }}')
+                .btn-group.panel-tip-container
+                    // TODO: replace this logic for exporting under one 
component
+                    button.btn.btn-primary.btn--with-icon(
+                        ng-click='exportCsv(paragraph)'
+
+                        ng-disabled='paragraph.loading'
+
+                        bs-tooltip=''
+                        ng-attr-title='{{ scanTooltip(paragraph) }}'
+
+                        data-trigger='hover'
+                        data-placement='bottom'
+                    )
+                        svg(ignite-icon='csv' 
ng-if='!paragraph.csvIsPreparing')
+                        
i.fa.fa-fw.fa-refresh.fa-spin(ng-if='paragraph.csvIsPreparing')
+                        span Export
+
+                    -var options = [{ text: "Export", click: 
'exportCsv(paragraph)' }, { text: 'Export all', click: 
'exportCsvAll(paragraph)' }]
+                    button.btn.dropdown-toggle.btn-primary(
+                        ng-disabled='paragraph.loading'
+
+                        bs-dropdown=`${JSON.stringify(options)}`
+
+                        data-toggle='dropdown'
+                        data-container='body'
+                        data-placement='bottom-right'
+                    )
+                        span.caret
 
 mixin table-result-body
     .grid(ui-grid='paragraph.gridOptions' ui-grid-resize-columns 
ui-grid-exporter)
@@ -197,9 +259,15 @@ mixin paragraph-scan
 
         .col-sm-12.sql-controls
             button.btn.btn-primary(ng-disabled='!scanAvailable(paragraph)' 
ng-click='scan(paragraph)')
-                | Scan
+                div
+                    
i.fa.fa-fw.fa-play(ng-hide='paragraph.checkScanInProgress(false)')
+                    
i.fa.fa-fw.fa-refresh.fa-spin(ng-show='paragraph.checkScanInProgress(false)')
+                    span.tipLabelExecute Scan
+
             button.btn.btn-primary(ng-disabled='!scanAvailable(paragraph)' 
ng-click='scan(paragraph, true)')
-                | Scan on selected node
+                    
i.fa.fa-fw.fa-play(ng-hide='paragraph.checkScanInProgress(true)')
+                    
i.fa.fa-fw.fa-refresh.fa-spin(ng-show='paragraph.checkScanInProgress(true)')
+                    span.tipLabelExecute Scan on selected node
 
         .col-sm-12.sql-result(ng-if='paragraph.queryExecuted()' 
ng-switch='paragraph.resultType()')
             .error(ng-switch-when='error') Error: {{paragraph.error.message}}

Reply via email to