++ 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'; }