++ 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 <
[email protected]> 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 <[email protected]> wrote:
>
>>
>>> On Mon, Jul 24, 2017 at 8:11 PM, Dave Page <[email protected]> wrote:
>>>
>>>>
>>>>
>>>> On Mon, Jul 24, 2017 at 3:28 PM, Shirley Wang <[email protected]> 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';
}