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(""); + this.$el.html( + "" + ); + 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'; }