From 275d13d40f79353e44d9243424976a36d8869953 Mon Sep 17 00:00:00 2001 From: Nikhil Mohite Date: Wed, 21 Oct 2020 17:14:59 +0530 Subject: [PATCH] =?UTF-8?q?Following=20issues=20have=20been=C2=A0resolved?= =?UTF-8?q?=20for=20the=20new=20connection=20feature:=20=20=201.=20Show=20?= =?UTF-8?q?servers=20with=20server=20groups=20in=20the=20dropdown.=20=20?= =?UTF-8?q?=202.=20Highlighted=20current=20selected=20connection=20in=20th?= =?UTF-8?q?e=20new=20connection=20dropdown.=20=20=203.=20Notify=20the=20us?= =?UTF-8?q?er=20before=20changing=20the=20connection.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refs #3794 --- .../browser/server_groups/servers/__init__.py | 3 +- .../js/sqleditor/new_connection_dialog.js | 4 +- .../sqleditor/new_connection_dialog_model.js | 130 +++++++++++------ web/pgadmin/tools/debugger/__init__.py | 12 ++ web/pgadmin/tools/sqleditor/__init__.py | 14 +- .../tools/sqleditor/static/js/sqleditor.js | 138 ++++++++++-------- .../sqleditor/static/scss/_sqleditor.scss | 3 + .../sqleditor/utils/query_tool_preferences.py | 23 +++ 8 files changed, 209 insertions(+), 118 deletions(-) diff --git a/web/pgadmin/browser/server_groups/servers/__init__.py b/web/pgadmin/browser/server_groups/servers/__init__.py index 2630d1e2e..ab4bea4ae 100644 --- a/web/pgadmin/browser/server_groups/servers/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/__init__.py @@ -1310,7 +1310,8 @@ class ServerNode(PGChildNodeView): # Connect the Server manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(sid) - manager.update(server) + if not manager.connection().connected(): + manager.update(server) conn = manager.connection() # Get enc key diff --git a/web/pgadmin/static/js/sqleditor/new_connection_dialog.js b/web/pgadmin/static/js/sqleditor/new_connection_dialog.js index 10850e1b8..b19a50afc 100644 --- a/web/pgadmin/static/js/sqleditor/new_connection_dialog.js +++ b/web/pgadmin/static/js/sqleditor/new_connection_dialog.js @@ -243,7 +243,6 @@ let NewConnectionDialog = { 'title': _.escape(tab_title), 'user': newConnCollectionModel['user'], 'role': newConnCollectionModel['role'], - 'password': response.password, 'server_name': _.escape(response.server_name), 'database_name': _.escape(selected_database_name), 'is_selected': false, @@ -260,13 +259,12 @@ let NewConnectionDialog = { setTimeout(function(){ Alertify.newConnectionDialog('Connect to server.').resizeTo(pgAdmin.Browser.stdW.md,pgAdmin.Browser.stdH.md); }, 500); - }).fail(function(error) { + }).fail(function() { Alertify.alert().setting({ 'title': gettext('Connection lost'), 'label':gettext('Ok'), 'message': gettext('Connection to the server has been lost.'), 'onok': function(){ - alert(error); //Close the window after connection is lost window.close(); }, diff --git a/web/pgadmin/static/js/sqleditor/new_connection_dialog_model.js b/web/pgadmin/static/js/sqleditor/new_connection_dialog_model.js index 09b29796f..0bbda6051 100644 --- a/web/pgadmin/static/js/sqleditor/new_connection_dialog_model.js +++ b/web/pgadmin/static/js/sqleditor/new_connection_dialog_model.js @@ -78,7 +78,6 @@ export default function newConnectionDialogModel(response, sgid, sid) { server: parseInt(sid), database: null, user: null, - password: null, server_name: server_name, database_name: database_name, }, @@ -92,7 +91,63 @@ export default function newConnectionDialogModel(response, sgid, sid) { select2: { allowClear: false, }, + transform: function(data) { + let group_template_options = []; + for (let key in data) { + if (data.hasOwnProperty(key)) { + group_template_options.push({'group': key, 'optval': data[key]}); + } + } + return group_template_options; + }, control: Backform.Select2Control.extend({ + template: _.template([ + '<% if(label == false) {} else {%>', + ' ', + '<% }%>', + '
', + ' ', + ' <% if (helpMessage && helpMessage.length) { %>', + ' <%=helpMessage%>', + ' <% } %>', + '
', + ].join('\n')), connect: function(self) { let local_self = self; @@ -147,11 +202,14 @@ export default function newConnectionDialogModel(response, sgid, sid) { local_self.model.attributes.user = null; local_self.model.attributes.role = null; Backform.Select2Control.prototype.onChange.apply(local_self, arguments); - response.server_list.forEach(function(obj){ - if(obj.id==self.model.changed.server) { - response.server_name = obj.name; - } + Object.keys(response.server_list).forEach(key => { + response.server_list[key].forEach(option => { + if (option.value == local_self.getValueFromDOM()) { + response.server_name = option.label; + } + }); }); + loadingDiv.addClass('d-none'); alertify.connectServer().destroy(); }) @@ -160,8 +218,6 @@ export default function newConnectionDialogModel(response, sgid, sid) { alertify.connectServer().destroy(); alertify.connectServer('Connect to server', xhr.responseJSON.result, local_self.getValueFromDOM()); }); - } else { - response.password = $('#password').val(); } } else { local_self.model.attributes.database = null; @@ -178,6 +234,19 @@ export default function newConnectionDialogModel(response, sgid, sid) { render: function() { let self = this; self.connect(self); + Object.keys(response.server_list).forEach(key => { + response.server_list[key].forEach(option => { + if (option.value == parseInt(sid)) { + response.server_name = option.label; + } + }); + }); + var transform = self.field.get('transform') || self.defaults.transform; + if (transform && _.isFunction(transform)) { + self.field.set('options', transform.bind(self, response.server_list)); + } else { + self.field.set('options', response.server_list); + } return Backform.Select2Control.prototype.render.apply(self, arguments); }, onChange: function() { @@ -200,10 +269,12 @@ export default function newConnectionDialogModel(response, sgid, sid) { }, }).done(function () { Backform.Select2Control.prototype.onChange.apply(self, arguments); - response.server_list.forEach(function(obj){ - if(obj.id==self.model.changed.server) { - response.server_name = obj.name; - } + Object.keys(response.server_list).forEach(key => { + response.server_list[key].forEach(option => { + if (option.value == self.getValueFromDOM()) { + response.server_name = option.label; + } + }); }); loadingDiv.addClass('d-none'); }).fail(function(xhr){ @@ -213,17 +284,6 @@ export default function newConnectionDialogModel(response, sgid, sid) { }, }), - options: function() { - return _.map(response.server_list, (obj) => { - if (obj.id == parseInt(sid)) - response.server_name = obj.name; - - return { - value: obj.id, - label: obj.name, - }; - }); - }, }, { id: 'database', @@ -302,27 +362,6 @@ export default function newConnectionDialogModel(response, sgid, sid) { url: 'sqleditor.get_new_connection_role', disabled: false, }, - /*{ - id: 'password', - name: 'password', - label: gettext('Password'tools/sqleditor/__init__.py), - type: 'password', - editable: true, - disabled: true, - deps: ['user'], - control: Backform.InputControl.extend({ - render: function() { - let self = this; - self.model.attributes.password = null; - Backform.InputControl.prototype.render.apply(self, arguments); - return self; - }, - onChange: function() { - let self = this; - Backform.InputControl.prototype.onChange.apply(self, arguments); - }, - }), - },*/ ], validate: function() { let msg = null; @@ -336,11 +375,6 @@ export default function newConnectionDialogModel(response, sgid, sid) { this.errorModel.set('user', msg); return msg; } - /*else if((this.attributes.password == '' || _.isUndefined(this.get('password')) || _.isNull(this.get('password')))) { - msg = gettext('Please enter password'); - this.errorModel.set('password', msg); - return msg; - }*/ return null; }, }); diff --git a/web/pgadmin/tools/debugger/__init__.py b/web/pgadmin/tools/debugger/__init__.py index 1949709f4..422a8aefb 100644 --- a/web/pgadmin/tools/debugger/__init__.py +++ b/web/pgadmin/tools/debugger/__init__.py @@ -98,6 +98,18 @@ class DebuggerModule(PgAdminModule): ) ) + self.tab_title = self.preference.register( + 'display', 'debugger_tab_title_placeholder', + gettext("Debugger tab title placeholder"), + 'text', '%FUNCTION%/%SCHEMA%/%DATABASE%', + category_label=PREF_LABEL_DISPLAY, + help_str=gettext( + 'Supported placeholders: FUNCTION, SCHEMA and DATABASE. ' + 'You can also provide any string with or ' + 'without placeholders' + ) + ) + self.preference.register( 'keyboard_shortcuts', 'btn_start', gettext('Accesskey (Continue/Start)'), 'keyboardshortcut', diff --git a/web/pgadmin/tools/sqleditor/__init__.py b/web/pgadmin/tools/sqleditor/__init__.py index 9da88421b..f9fb26f96 100644 --- a/web/pgadmin/tools/sqleditor/__init__.py +++ b/web/pgadmin/tools/sqleditor/__init__.py @@ -46,7 +46,7 @@ from pgadmin.tools.sqleditor.utils.macros import get_macros,\ get_user_macros, set_macros from pgadmin.utils.constants import MIMETYPE_APP_JS, \ SERVER_CONNECTION_CLOSED, ERROR_MSG_TRANS_ID_NOT_FOUND, ERROR_FETCHING_DATA -from pgadmin.model import Server +from pgadmin.model import Server, ServerGroup from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry MODULE_NAME = 'sqleditor' @@ -1489,10 +1489,14 @@ def get_new_connection_data(sgid, sid=None): :extract_sql_from_network_parameters, """ try: - # if sid and not did: + server_groups = ServerGroup.query.all() + server_group_data = {server_group.name: [] for server_group in + server_groups} servers = Server.query.all() - server_list = [ - {'name': server.serialize['name'], "id": server.serialize['id']} + + [server_group_data[server.servers.name].append( + {'label': server.serialize['name'], + "value": server.serialize['id']}) for server in servers] msg = "Success" @@ -1501,7 +1505,7 @@ def get_new_connection_data(sgid, sid=None): 'status': True, 'msg': msg, 'result': { - 'server_list': server_list + 'server_list': server_group_data } } ) diff --git a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js index d3a2d25e0..26c88bc42 100644 --- a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js +++ b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js @@ -173,8 +173,13 @@ define('tools.querytool', [ var dropdownElement = document.getElementById('connections-list'); dropdownElement.innerHTML = ''; data_list.forEach((option, index) => { - $('#connections-list').append('
  • '+ option.title +'
  • '); - + var opt = ''; + if ('is_selected' in option && option['is_selected']) { + opt = '
  • '+ option.title +'
  • '; + } else { + opt = '
  • '+ option.title +'
  • '; + } + $('#connections-list').append(opt); }); var self = this; $('.connection-list-item').click(function() { @@ -2131,7 +2136,6 @@ define('tools.querytool', [ on_change_connection: function(connection_details, ref) { if(!connection_details['is_selected']) { var self = this; - self.set_selected_option(connection_details); var loadingDiv = null; var msgDiv = null; if(ref){ @@ -2145,66 +2149,78 @@ define('tools.querytool', [ msgDiv = loadingDiv.find('.sql-editor-busy-text'); } - $.ajax({ - url: url_for('datagrid.update_query_tool_connection', { - 'trans_id': self.transId, - 'sgid': connection_details['server_group'], - 'sid': connection_details['server'], - 'did': connection_details['database'], - }), - method: 'POST', - contentType: 'application/json', - data: JSON.stringify(connection_details), - }) - .done(function(res) { - if(res.success) { - self.transId = res.data.tran_id; - self.handler.transId = res.data.tran_id; - self.handler.url_params = { - 'did': connection_details['database'], - 'is_query_tool': self.handler.url_params.is_query_tool, - 'server_type': self.handler.url_params.server_type, + alertify.confirm(gettext('Change connection'), + gettext('By changing the connection you will lose all your unsaved data for the current connection.
    Do you want to continue?'), + function() { + self.set_selected_option(connection_details); + $.ajax({ + url: url_for('datagrid.update_query_tool_connection', { + 'trans_id': self.transId, 'sgid': connection_details['server_group'], 'sid': connection_details['server'], - 'title': connection_details['title'], - }; - self.set_editor_title(_.unescape(self.handler.url_params.title)); - self.handler.setTitle(_.unescape(self.handler.url_params.title)); - let success_msg = connection_details['server_name'] + '/' + connection_details['database_name'] + '- Database connected'; - alertify.success(success_msg); - if(ref){ - let connection_data = { - 'server_group': self.handler.url_params.sgid, - 'server': connection_details['server'], - 'database': connection_details['database'], - 'user': connection_details['user'], - 'title': connection_details['title'], - 'role': connection_details['role'], - 'password': connection_details['password'], - 'is_allow_new_connection': true, - 'database_name': connection_details['database_name'], - 'server_name': connection_details['server_name'], - 'is_selected': true, - }; - self.connection_list.unshift(connection_data); - self.render_connection(self.connection_list); - loadingDiv.addClass('d-none'); - alertify.newConnectionDialog().destroy(); - ref.close(); - } else { - loadingDiv.addClass('d-none'); - } - } - return true; - }) - .fail(function(xhr) { + 'did': connection_details['database'], + }), + method: 'POST', + contentType: 'application/json', + data: JSON.stringify(connection_details), + }) + .done(function(res) { + if(res.success) { + self.transId = res.data.tran_id; + self.handler.transId = res.data.tran_id; + self.handler.url_params = { + 'did': connection_details['database'], + 'is_query_tool': self.handler.url_params.is_query_tool, + 'server_type': self.handler.url_params.server_type, + 'sgid': connection_details['server_group'], + 'sid': connection_details['server'], + 'title': connection_details['title'], + }; + self.set_editor_title(_.unescape(self.handler.url_params.title)); + self.handler.setTitle(_.unescape(self.handler.url_params.title)); + let success_msg = connection_details['server_name'] + '/' + connection_details['database_name'] + '- Database connected'; + alertify.success(success_msg); + if(ref){ + let connection_data = { + 'server_group': self.handler.url_params.sgid, + 'server': connection_details['server'], + 'database': connection_details['database'], + 'user': connection_details['user'], + 'title': connection_details['title'], + 'role': connection_details['role'], + 'is_allow_new_connection': true, + 'database_name': connection_details['database_name'], + 'server_name': connection_details['server_name'], + 'is_selected': true, + }; + self.connection_list.unshift(connection_data); + self.render_connection(self.connection_list); + loadingDiv.addClass('d-none'); + alertify.newConnectionDialog().destroy(); + ref.close(); + } else { + loadingDiv.addClass('d-none'); + } + } + return true; + }) + .fail(function(xhr) { + if(xhr.status == 428) { + alertify.connectServer('Connect to server', xhr.responseJSON.result, connection_details['server'], false); + } else { + alertify.error(xhr.responseJSON['errormsg']); + } + }); + }, + function() { loadingDiv.addClass('d-none'); - if(xhr.status == 428) { - alertify.connectServer('Connect to server', xhr.responseJSON.result, connection_details['server'], false); - } else { - alertify.error(xhr.responseJSON['errormsg']); - } - }); + alertify.newConnectionDialog().destroy(); + return true; + } + ).set('labels', { + ok: gettext('Yes'), + cancel: gettext('No'), + }); } }, }); @@ -2542,7 +2558,7 @@ define('tools.querytool', [ 'server_group': self.gridView.handler.url_params.sgid, 'server': self.gridView.handler.url_params.sid, 'database': self.gridView.handler.url_params.did, - 'user': null, + 'user': server_data.data.user.name, 'role': null, 'title': _.unescape(url_params.title), 'is_allow_new_connection': false, diff --git a/web/pgadmin/tools/sqleditor/static/scss/_sqleditor.scss b/web/pgadmin/tools/sqleditor/static/scss/_sqleditor.scss index 7fc576a8a..9d5ba4deb 100644 --- a/web/pgadmin/tools/sqleditor/static/scss/_sqleditor.scss +++ b/web/pgadmin/tools/sqleditor/static/scss/_sqleditor.scss @@ -371,6 +371,9 @@ div.strikeout:after { height: 100%; } +.selected-connection { + background-color: $color-primary-light; +} /* Setting it to hardcoded white as the SVG generated is having white bg * Need to check what can be done. diff --git a/web/pgadmin/tools/sqleditor/utils/query_tool_preferences.py b/web/pgadmin/tools/sqleditor/utils/query_tool_preferences.py index 76523b1bc..642a1ebe1 100644 --- a/web/pgadmin/tools/sqleditor/utils/query_tool_preferences.py +++ b/web/pgadmin/tools/sqleditor/utils/query_tool_preferences.py @@ -326,6 +326,29 @@ def register_query_tool_preferences(self): ) ) + self.qt_tab_title = self.preference.register( + 'display', 'qt_tab_title_placeholder', + gettext("Query tool tab title placeholder"), + 'text', '%DATABASE%/%USERNAME%@%SERVER%', + category_label=PREF_LABEL_DISPLAY, + help_str=gettext( + 'Supported placeholders: DATABASE, USERNAME and SERVER. ' + 'You can also provide any string with or without placeholders.' + ) + ) + + self.ve_edt_tab_title = self.preference.register( + 'display', 'vw_edt_tab_title_placeholder', + gettext("View/Edit tab title placeholder"), + 'text', '%SCHEMA%.%TABLE%/%DATABASE%/%USERNAME%@%SERVER%', + category_label=PREF_LABEL_DISPLAY, + help_str=gettext( + 'Supported placeholders: SCHEMA, TABLE, DATABASE, USERNAME and ' + 'SERVER. You can also provide any string with or ' + 'without placeholders.' + ) + ) + self.connection_status = self.preference.register( 'display', 'connection_status_fetch_time', gettext("Connection status refresh rate"), 'integer', 2,