++ Attaching the patch

--
Regards,
Murtuza Zabuawala
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

On Fri, Jul 28, 2017 at 4:02 PM, Murtuza Zabuawala <
murtuza.zabuaw...@enterprisedb.com> wrote:

> Hi Dave,
>
> PFA patch to display additional information from pg_stat_activity table
> using subnode control.
> RM#2597
>
> Please review.
>
> --
> Regards,
> Murtuza Zabuawala
> EnterpriseDB: http://www.enterprisedb.com
> The Enterprise PostgreSQL Company
>
> On Tue, Jul 25, 2017 at 10:56 AM, Shirley Wang <sw...@pivotal.io> wrote:
>
>>
>>> On Mon, Jul 24, 2017 at 8:11 PM, Dave Page <dp...@pgadmin.org> wrote:
>>>
>>>>
>>>>
>>>> On Mon, Jul 24, 2017 at 3:28 PM, Shirley Wang <sw...@pivotal.io> wrote:
>>>>
>>>>> 2-3 days is a lot of valuable engineering time. Is this a 'drop
>>>>> everything now' kind of feature or can this wait for some user validation
>>>>> on a mock up first?
>>>>>
>>>>
>>>> Most of the time will likely be on the infrastructure to change the
>>>> display to a subnode control. If you have some cycles to mockup potential
>>>> layouts for the subnode view and have them validated, please feel free,
>>>> however, that seems like an awful lot of work to me to display some missing
>>>> SQL using a standard control.
>>>>
>>> Regarding SQL display: Developing simple control to show codemirror in
>>> disabled state (for now) wont take that much time.
>>>
>>>
>> Part of a product designer's job is to make sure there is a definitive
>> need for a feature and that the interface for the feature is designed in
>> such a way that the user gets all intended value from it. Time spent
>> validating now will decrease the time spent later on redesigning /
>> reimplementing.
>>
>> If everyone is aware of what that value is and confident that how it'll
>> be displayed is right, there's little risk in starting to develop it. If
>> we're wrong, it'll add to feature bloat and detract from the experience.
>>
>> Would Chethana be able to take on some of the design work? It would be
>> valuable for the dev team to also be part of design process.
>>
>
>
diff --git a/web/pgadmin/dashboard/static/css/dashboard.css 
b/web/pgadmin/dashboard/static/css/dashboard.css
index 735aebf..074549e 100644
--- a/web/pgadmin/dashboard/static/css/dashboard.css
+++ b/web/pgadmin/dashboard/static/css/dashboard.css
@@ -88,3 +88,20 @@
     margin-top: 13px;
     display: block;
 }
+
+.dashboard-tab-container .form-control {
+    font-size: inherit;
+}
+
+#server_activity .CodeMirror,
+#database_activity .CodeMirror,
+#server_activity .CodeMirror-scroll,
+#database_activity .CodeMirror-scroll {
+    height: auto;
+    max-height:100px;
+}
+
+.dashboard-tab-container .sub-node-form > ul.tab-content {
+  padding-left: 0px;
+  left: 0px;
+}
diff --git a/web/pgadmin/dashboard/static/js/dashboard.js 
b/web/pgadmin/dashboard/static/js/dashboard.js
index 1eee1da..e37e321 100644
--- a/web/pgadmin/dashboard/static/js/dashboard.js
+++ b/web/pgadmin/dashboard/static/js/dashboard.js
@@ -90,6 +90,51 @@ function(url_for, gettext, r, $, _, pgAdmin, Backbone, 
Backgrid, Flotr,
         }
   });
 
+  // Subnode Cell, which will display subnode control
+  var SessionDetailsCell = Backgrid.Extension.ObjectCell.extend({
+    render: function(){
+        this.$el.empty();
+        this.$el.html("<i class='fa fa-pencil-square-o'></i>");
+        this.$el.html(
+          "<i class='fa fa-pencil-square-o' data-toggle='tooltip' " +
+          "title='" + gettext('View the active session details') +
+          "'></i>"
+        );
+        this.delegateEvents();
+        if (this.grabFocus)
+          this.$el.focus();
+        return this;
+    }
+  });
+
+  // Subnode Model
+  var ActiveQueryDetailsModel = Backbone.Model.extend({
+    defaults: {
+      version: null /* Postgres version */
+    },
+    schema: [{
+      id: 'backend_type', label: gettext('Backend type'),
+      type: 'text', editable: true, disabled: true,
+      group: gettext('Details'),
+      visible: function(m) {
+        return m.get('version') >= 100000;
+      }
+    },{
+      id: 'query_start', label: gettext('Query started at'),
+      type: 'text', editable: false, disabled: true,
+      group: gettext('Details')
+    },{
+      id: 'state_change', label: gettext('Last state changed at'),
+      type: 'text', editable: true, disabled: true,
+      group: gettext('Details')
+    },{
+      id: 'query', label: gettext('SQL'),
+      type: 'text', editable: true, disabled: true,
+      control: Backform.SqlFieldControl,
+      group: gettext('Details')
+    }]
+  });
+
   pgAdmin.Dashboard = {
         init: function() {
             if (this.initialized)
@@ -582,6 +627,23 @@ function(url_for, gettext, r, $, _, pgAdmin, Backbone, 
Backgrid, Flotr,
                 }]);
             }
 
+            var newActiveQueryDetailsModel = new ActiveQueryDetailsModel(
+              {'version': version}
+            );
+
+            var subNodeFieldsModel = Backform.generateViewSchema(
+              null, newActiveQueryDetailsModel, 'create', null, null, true
+            );
+
+            // Add cancel active query button
+            server_activity_columns.unshift({
+              name: "pg-backform-expand", label: "",
+              cell: SessionDetailsCell,
+              cell_priority: -1,
+              postgres_version: version,
+              schema: subNodeFieldsModel
+            });
+
             // Add cancel active query button
             server_activity_columns.unshift({
               name: "pg-backform-delete", label: "",
@@ -739,6 +801,10 @@ function(url_for, gettext, r, $, _, pgAdmin, Backbone, 
Backgrid, Flotr,
               bio_stats_refresh
             );
 
+            // To align subnode controls properly
+            $(div_server_activity).addClass('pg-el-container');
+            $(div_server_activity).attr('el', 'sm');
+
             // Render the tabs, but only get data for the activity tab for now
             pgAdmin.Dashboard.render_grid(
               div_server_activity, sid, did,
@@ -895,6 +961,23 @@ function(url_for, gettext, r, $, _, pgAdmin, Backbone, 
Backgrid, Flotr,
                 }]);
             }
 
+            var newActiveQueryDetailsModel = new ActiveQueryDetailsModel(
+              {'version': version}
+            );
+
+            var subNodeFieldsModel = Backform.generateViewSchema(
+              null, newActiveQueryDetailsModel, 'create', null, null, true
+            );
+
+            // Add cancel active query button
+            database_activity_columns.unshift({
+              name: "pg-backform-expand", label: "",
+              cell: SessionDetailsCell,
+              cell_priority: -1,
+              postgres_version: version,
+              schema: subNodeFieldsModel
+            });
+
             database_activity_columns.unshift({
               name: "pg-backform-delete", label: "",
               cell: cancelQueryCell,
@@ -1014,6 +1097,10 @@ function(url_for, gettext, r, $, _, pgAdmin, Backbone, 
Backgrid, Flotr,
               bio_stats_refresh
             );
 
+            // To align subnode controls properly
+            $(div_database_activity).addClass('pg-el-container');
+            $(div_database_activity).attr('el', 'sm');
+
             // Render the tabs, but only get data for the activity tab for now
             pgAdmin.Dashboard.render_grid(
               div_database_activity, sid, did, url_for('dashboard.activity'),
diff --git 
a/web/pgadmin/dashboard/templates/dashboard/sql/9.6_plus/activity.sql 
b/web/pgadmin/dashboard/templates/dashboard/sql/9.6_plus/activity.sql
index 912d4b1..9b067a8 100644
--- a/web/pgadmin/dashboard/templates/dashboard/sql/9.6_plus/activity.sql
+++ b/web/pgadmin/dashboard/templates/dashboard/sql/9.6_plus/activity.sql
@@ -7,9 +7,13 @@ SELECT
     to_char(backend_start, 'YYYY-MM-DD HH24:MI:SS TZ') AS backend_start,
     state,
     wait_event_type || ': ' || wait_event AS wait_event,
-    pg_blocking_pids(pid) AS blocking_pids
+    pg_blocking_pids(pid) AS blocking_pids,
+    query,
+    to_char(state_change, 'YYYY-MM-DD HH24:MI:SS TZ') AS state_change,
+    to_char(query_start, 'YYYY-MM-DD HH24:MI:SS TZ') AS query_start,
+    backend_type
 FROM
     pg_stat_activity
 {% if did %}WHERE
     datname = (SELECT datname FROM pg_database WHERE oid = {{ did }}){% endif 
%}
-ORDER BY pid
\ No newline at end of file
+ORDER BY pid
diff --git a/web/pgadmin/dashboard/templates/dashboard/sql/default/activity.sql 
b/web/pgadmin/dashboard/templates/dashboard/sql/default/activity.sql
index f79ae1b..b0f747a 100644
--- a/web/pgadmin/dashboard/templates/dashboard/sql/default/activity.sql
+++ b/web/pgadmin/dashboard/templates/dashboard/sql/default/activity.sql
@@ -6,9 +6,12 @@ SELECT
     client_addr,
     to_char(backend_start, 'YYYY-MM-DD HH24:MI:SS TZ') AS backend_start,
     state,
-    CASE WHEN waiting THEN '{{ _('yes') }}' ELSE '{{ _('no') }}' END AS waiting
+    CASE WHEN waiting THEN '{{ _('yes') }}' ELSE '{{ _('no') }}' END AS 
waiting,
+    query,
+    to_char(state_change, 'YYYY-MM-DD HH24:MI:SS TZ') AS state_change,
+    to_char(query_start, 'YYYY-MM-DD HH24:MI:SS TZ') AS query_start
 FROM
     pg_stat_activity
 {% if did %}WHERE
     datname = (SELECT datname FROM pg_database WHERE oid = {{ did }}){% endif 
%}
-ORDER BY pid
\ No newline at end of file
+ORDER BY pid
diff --git a/web/pgadmin/static/js/backgrid.pgadmin.js 
b/web/pgadmin/static/js/backgrid.pgadmin.js
index 87ef146..c4860e0 100644
--- a/web/pgadmin/static/js/backgrid.pgadmin.js
+++ b/web/pgadmin/static/js/backgrid.pgadmin.js
@@ -217,12 +217,14 @@
     postRender: function(model, column) {
       var editor = this,
           el = this.el,
-          columns_length = this.columns_length;
+          columns_length = this.columns_length,
+          // To render schema directly from Backgrid cell we use columns 
schema attribute
+          schema = this.schema.length ? this.schema : 
this.column.get('schema');
 
       if (column != null && column.get("name") != this.column.get("name"))
         return false;
 
-      if (!_.isArray(this.schema)) throw new TypeError("schema must be an 
array");
+      if (!_.isArray(schema)) throw new TypeError("schema must be an array");
 
       // Create a Backbone model from our object if it does not exist
       var $dialog = this.createDialog(columns_length);
@@ -235,7 +237,7 @@
       var back_el = $dialog.find('form.form-dialog');
 
       this.objectView = new Backform.Dialog({
-        el: back_el, model: this.model, schema: this.schema,
+        el: back_el, model: this.model, schema: schema,
         tabPanelClassName: function() {
           return 'sub-node-form col-sm-12';
         }

Reply via email to