public inbox for [email protected]
help / color / mirror / Atom feedFrom: Akshay Joshi <[email protected]>
To: pgadmin-hackers <[email protected]>
Subject: [pgadmin4][Patch]: Feature #2686 Property to switch lower/upper case auto completion
Date: Thu, 14 Jun 2018 13:11:42 +0530
Message-ID: <CANxoLDecb+ArijBx+cvz4fNEiWYyOcBA4mbFXk3X=wMeJGoOzQ@mail.gmail.com> (raw)
Hi Hackers,
Attached is the patch for the Feature #2686 Property to switch lower/upper
case auto completion. I have added new preferences settings "Keywords in
uppercase" if it is set to True then all the keywords are shown in upper
case in auto completion.
I have also implemented the second request in the RM to change the selected
text to upper/lower case. For that I have added new keyboard shortcut
"Toggle case of selected text" in preferences dialog. Default key is "Ctrl
+ Shift + u".
Please review it.
--
*Akshay Joshi*
*Sr. Software Architect *
*Phone: +91 20-3058-9517Mobile: +91 976-788-8246*
Attachments:
[application/octet-stream] RM_2686.patch (11.4K, 3-RM_2686.patch)
download | inline diff:
diff --git a/web/pgadmin/misc/templates/sqlautocomplete/sql/default/keywords.sql b/web/pgadmin/misc/templates/sqlautocomplete/sql/default/keywords.sql
index cd571e1..9f762b8 100644
--- a/web/pgadmin/misc/templates/sqlautocomplete/sql/default/keywords.sql
+++ b/web/pgadmin/misc/templates/sqlautocomplete/sql/default/keywords.sql
@@ -1,2 +1,7 @@
{# SQL query for getting keywords #}
+{% if upper_case %}
SELECT upper(word) as word FROM pg_get_keywords()
+{% else %}
+SELECT word FROM pg_get_keywords()
+{% endif %}
+
diff --git a/web/pgadmin/static/js/keyboard_shortcuts.js b/web/pgadmin/static/js/keyboard_shortcuts.js
index 996a591..1fe07e9 100644
--- a/web/pgadmin/static/js/keyboard_shortcuts.js
+++ b/web/pgadmin/static/js/keyboard_shortcuts.js
@@ -136,6 +136,7 @@ function keyboardShortcutsQueryTool(
let downloadCsvKeys = keyboardShortcutConfig['download_csv'];
let nextPanelKeys = keyboardShortcutConfig['move_next'];
let previousPanelKeys = keyboardShortcutConfig['move_previous'];
+ let toggleCaseKeys = keyboardShortcutConfig['toggle_case'];
if (this.validateShortcutKeys(executeKeys, event)) {
this._stopEventPropagation(event);
@@ -149,6 +150,9 @@ function keyboardShortcutsQueryTool(
} else if (this.validateShortcutKeys(downloadCsvKeys, event)) {
this._stopEventPropagation(event);
queryToolActions.download(sqlEditorController);
+ } else if (this.validateShortcutKeys(toggleCaseKeys, event)) {
+ this._stopEventPropagation(event);
+ queryToolActions.toggleCaseOfSelectedText(sqlEditorController);
} else if ((
(this.isMac() && event.metaKey) ||
(!this.isMac() && event.ctrlKey)
diff --git a/web/pgadmin/static/js/sqleditor/query_tool_actions.js b/web/pgadmin/static/js/sqleditor/query_tool_actions.js
index 9e8e450..411c6ed 100644
--- a/web/pgadmin/static/js/sqleditor/query_tool_actions.js
+++ b/web/pgadmin/static/js/sqleditor/query_tool_actions.js
@@ -132,6 +132,8 @@ let queryToolActions = {
'sqleditor', 'move_next');
let previousPanelPerf = window.top.pgAdmin.Browser.get_preference(
'sqleditor', 'move_previous');
+ let toggleCasePerf = window.top.pgAdmin.Browser.get_preference(
+ 'sqleditor', 'toggle_case');
if(!executeQueryPref && sqlEditorController.handler.is_new_browser_tab) {
executeQueryPref = window.opener.pgAdmin.Browser.get_preference(
@@ -151,6 +153,9 @@ let queryToolActions = {
),
previousPanelPerf = window.opener.pgAdmin.Browser.get_preference(
'sqleditor', 'move_previous'
+ ),
+ toggleCasePerf = window.opener.pgAdmin.Browser.get_preference(
+ 'sqleditor', 'toggle_case'
);
}
@@ -161,9 +166,23 @@ let queryToolActions = {
'download_csv': downloadCsvPref.value,
'move_next': nextPanelPerf.value,
'move_previous': previousPanelPerf.value,
+ 'toggle_case': toggleCasePerf.value,
};
},
+
+ toggleCaseOfSelectedText: function (sqlEditorController) {
+ let codeMirrorObj = sqlEditorController.gridView.query_tool_obj;
+ let selectedText = codeMirrorObj.getSelection();
+
+ if (!selectedText) return;
+
+ if (selectedText === selectedText.toUpperCase()) {
+ codeMirrorObj.replaceSelection(selectedText.toLowerCase());
+ } else {
+ codeMirrorObj.replaceSelection(selectedText.toUpperCase());
+ }
+ },
};
module.exports = queryToolActions;
diff --git a/web/pgadmin/tools/sqleditor/utils/query_tool_preferences.py b/web/pgadmin/tools/sqleditor/utils/query_tool_preferences.py
index 7c43d9b..a5a7bcb 100644
--- a/web/pgadmin/tools/sqleditor/utils/query_tool_preferences.py
+++ b/web/pgadmin/tools/sqleditor/utils/query_tool_preferences.py
@@ -535,6 +535,32 @@ def RegisterQueryToolPreferences(self):
fields=accesskey_fields
)
+ self.preference.register(
+ 'keyboard_shortcuts',
+ 'toggle_case',
+ gettext('Toggle case of selected text'),
+ 'keyboardshortcut',
+ {
+ 'alt': False,
+ 'shift': True,
+ 'control': True,
+ 'key': {
+ 'key_code': 91,
+ 'char': 'u'
+ }
+ },
+ category_label=gettext('Keyboard shortcuts'),
+ fields=shortcut_fields
+ )
+
+ self.preference.register(
+ 'auto_completion', 'keywords_in_uppercase',
+ gettext("Keywords in uppercase"), 'boolean', True,
+ category_label=gettext('Auto completion'),
+ help_str=gettext('If set to True, Keywords will be displayed '
+ 'in upper case for auto completion.')
+ )
+
def get_query_tool_keyboard_shortcuts():
@@ -564,6 +590,7 @@ def get_query_tool_keyboard_shortcuts():
explain_query = qt_perf.preference('explain_query').get()
explain_analyze_query = qt_perf.preference('explain_analyze_query').get()
find_options = qt_perf.preference('btn_find_options').get()
+ toggle_case = qt_perf.preference('toggle_case').get()
return {
'keys': {
@@ -587,7 +614,8 @@ def get_query_tool_keyboard_shortcuts():
'explain_analyze_query': explain_analyze_query.get('key').get(
'char'
),
- 'find_options': find_options.get('key').get('char')
+ 'find_options': find_options.get('key').get('char'),
+ 'toggle_case': toggle_case.get('key').get('char')
},
'shortcuts': {
'conn_status': conn_status,
@@ -608,7 +636,8 @@ def get_query_tool_keyboard_shortcuts():
'execute_query': execute_query,
'explain_query': explain_query,
'explain_analyze_query': explain_analyze_query,
- 'find_options': find_options
+ 'find_options': find_options,
+ 'toggle_case': toggle_case
},
}
diff --git a/web/pgadmin/utils/sqlautocomplete/autocomplete.py b/web/pgadmin/utils/sqlautocomplete/autocomplete.py
index af5514b..8a25c13 100644
--- a/web/pgadmin/utils/sqlautocomplete/autocomplete.py
+++ b/web/pgadmin/utils/sqlautocomplete/autocomplete.py
@@ -26,6 +26,7 @@ from .function_metadata import FunctionMetadata
from .parseutils import (
last_word, extract_tables, find_prev_keyword, parse_partial_identifier)
from .prioritization import PrevalenceCounter
+from pgadmin.utils.preferences import Preferences
PY2 = sys.version_info[0] == 2
PY3 = sys.version_info[0] == 3
@@ -101,8 +102,17 @@ class SQLAutoComplete(object):
for record in res['rows']:
self.search_path.append(record['schema'])
+ pref = Preferences.module('sqleditor')
+ keywords_in_uppercase = \
+ pref.preference('keywords_in_uppercase').get()
+
# Fetch the keywords
query = render_template("/".join([self.sql_path, 'keywords.sql']))
+ # If setting 'Keywords in uppercase' is set to True in
+ # Preferences then fetch the keywords in upper case.
+ if keywords_in_uppercase:
+ query = render_template(
+ "/".join([self.sql_path, 'keywords.sql']), upper_case=True)
status, res = self.conn.execute_dict(query)
if status:
for record in res['rows']:
diff --git a/web/regression/javascript/sqleditor/query_tool_actions_spec.js b/web/regression/javascript/sqleditor/query_tool_actions_spec.js
index f3ac781..61c1839 100644
--- a/web/regression/javascript/sqleditor/query_tool_actions_spec.js
+++ b/web/regression/javascript/sqleditor/query_tool_actions_spec.js
@@ -11,7 +11,8 @@ import queryToolActions from 'sources/sqleditor/query_tool_actions';
describe('queryToolActions', () => {
let sqlEditorController,
getSelectionSpy, getValueSpy,
- selectedQueryString, entireQueryString;
+ selectedQueryString, entireQueryString,
+ replaceSelectionSpy;
describe('executeQuery', () => {
describe('when the command is being run from the query tool', () => {
@@ -437,9 +438,93 @@ describe('queryToolActions', () => {
});
});
+ describe('toggleCaseOfSelectedText', () => {
+ describe('when there is no query text', () => {
+ beforeEach(() => {
+ setUpSpies('', '');
+ });
+ it('does nothing', () => {
+ expect(
+ queryToolActions.toggleCaseOfSelectedText(sqlEditorController)
+ ).not.toBeDefined();
+ });
+ });
+
+ describe('when there is empty selection', () => {
+ beforeEach(() => {
+ setUpSpies('', 'a string\nddd\nsss');
+
+ sqlEditorController.gridView.query_tool_obj.getCursor = (isFrom) => {
+ return isFrom ? 3 : 3;
+ };
+ });
+
+ it('does nothing', () => {
+ expect(
+ queryToolActions.toggleCaseOfSelectedText(sqlEditorController)
+ ).not.toBeDefined();
+ });
+ });
+
+ describe('when selected query is in lower case', () => {
+ beforeEach(() => {
+ setUpSpies('string', 'a string\nddd\nsss');
+ });
+
+ it('toggle the selection and string should be in upper case', () => {
+ queryToolActions.toggleCaseOfSelectedText(sqlEditorController);
+ expect(replaceSelectionSpy
+ ).toHaveBeenCalledWith('STRING');
+ });
+
+ it('(negative scenario toggle the selection and string should be in upper case', () => {
+ queryToolActions.toggleCaseOfSelectedText(sqlEditorController);
+ expect(replaceSelectionSpy
+ ).not.toHaveBeenCalledWith('string');
+ });
+ });
+
+ describe('when selected query is in upper case', () => {
+ beforeEach(() => {
+ setUpSpies('STRING', 'a string\nddd\nsss');
+ });
+
+ it('toggle the selection and string should be in lower case', () => {
+ queryToolActions.toggleCaseOfSelectedText(sqlEditorController);
+ expect(replaceSelectionSpy
+ ).toHaveBeenCalledWith('string');
+ });
+
+ it('(negative scenario toggle the selection and string should be in lower case', () => {
+ queryToolActions.toggleCaseOfSelectedText(sqlEditorController);
+ expect(replaceSelectionSpy
+ ).not.toHaveBeenCalledWith('STRING');
+ });
+ });
+
+ describe('when selected query is in mixed case', () => {
+ beforeEach(() => {
+ setUpSpies('sTRIng', 'a string\nddd\nsss');
+ });
+
+ it('toggle the selection and string should be in upper case', () => {
+ queryToolActions.toggleCaseOfSelectedText(sqlEditorController);
+ expect(replaceSelectionSpy
+ ).toHaveBeenCalledWith('STRING');
+ });
+
+ it('(negative scenario toggle the selection and string should be in upper case', () => {
+ queryToolActions.toggleCaseOfSelectedText(sqlEditorController);
+ expect(replaceSelectionSpy
+ ).not.toHaveBeenCalledWith('sTRIng');
+ });
+ });
+ });
+
function setUpSpies(selectedQueryString, entireQueryString) {
getValueSpy = jasmine.createSpy('getValueSpy').and.returnValue(entireQueryString);
getSelectionSpy = jasmine.createSpy('getSelectionSpy').and.returnValue(selectedQueryString);
+ replaceSelectionSpy = jasmine.createSpy('replaceSelectionSpy');
sqlEditorController = {
gridView: {
@@ -449,6 +534,7 @@ describe('queryToolActions', () => {
toggleComment: jasmine.createSpy('toggleCommentSpy'),
lineComment: jasmine.createSpy('lineCommentSpy'),
uncomment: jasmine.createSpy('uncommentSpy'),
+ replaceSelection: replaceSelectionSpy,
getCursor: (isFrom) => {
return entireQueryString.indexOf(selectedQueryString) + (isFrom ? 0 : selectedQueryString.length);
},
view thread (6+ messages) latest in thread
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected]
Subject: Re: [pgadmin4][Patch]: Feature #2686 Property to switch lower/upper case auto completion
In-Reply-To: <CANxoLDecb+ArijBx+cvz4fNEiWYyOcBA4mbFXk3X=wMeJGoOzQ@mail.gmail.com>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox