diff --git a/web/pgadmin/browser/register_browser_preferences.py b/web/pgadmin/browser/register_browser_preferences.py index 640a05468..672b3e646 100644 --- a/web/pgadmin/browser/register_browser_preferences.py +++ b/web/pgadmin/browser/register_browser_preferences.py @@ -443,6 +443,19 @@ def register_browser_preferences(self): fields=fields ) + self.preference.register( + 'keyboard_shortcuts', 'open_quick_search', + gettext('Quick Search'), 'keyboardshortcut', + { + 'alt': False, + 'shift': True, + 'control': True, + 'key': {'key_code': 70, 'char': 'f'} + }, + category_label=PREF_LABEL_KEYBOARD_SHORTCUTS, + fields=fields + ) + self.dynamic_tab_title = self.preference.register( 'tab settings', 'dynamic_tabs', gettext("Dynamic tab size"), 'boolean', False, diff --git a/web/pgadmin/browser/static/js/keyboard.js b/web/pgadmin/browser/static/js/keyboard.js index 3381162d0..a69c7009f 100644 --- a/web/pgadmin/browser/static/js/keyboard.js +++ b/web/pgadmin/browser/static/js/keyboard.js @@ -44,6 +44,7 @@ _.extend(pgBrowser.keyboardNavigation, { 'drop_multiple_objects': commonUtils.parseShortcutValue(pgBrowser.get_preference('browser', 'grid_menu_drop_multiple').value), 'drop_cascade_multiple_objects': commonUtils.parseShortcutValue(pgBrowser.get_preference('browser', 'grid_menu_drop_cascade_multiple').value), 'add_grid_row': commonUtils.parseShortcutValue(pgBrowser.get_preference('browser', 'add_grid_row').value), + 'open_quick_search': commonUtils.parseShortcutValue(pgBrowser.get_preference('browser', 'open_quick_search').value), }; this.shortcutMethods = { @@ -66,6 +67,7 @@ _.extend(pgBrowser.keyboardNavigation, { 'bindDropMultipleObjects': {'shortcuts': this.keyboardShortcut.drop_multiple_objects}, // Grid Menu Drop Multiple 'bindDropCascadeMultipleObjects': {'shortcuts': this.keyboardShortcut.drop_cascade_multiple_objects}, // Grid Menu Drop Cascade Multiple 'bindAddGridRow': {'shortcuts': this.keyboardShortcut.add_grid_row}, // Subnode Grid Add Row + 'bindOpenQuickSearch': {'shortcuts': this.keyboardShortcut.open_quick_search}, // Subnode Grid Refresh Row }; this.bindShortcuts(); } @@ -383,6 +385,9 @@ _.extend(pgBrowser.keyboardNavigation, { return new dialogTabNavigator.dialogTabNavigator(dialogContainer, backward_shortcut, forward_shortcut); }, + bindOpenQuickSearch: function() { + $('#search_icon').trigger('click'); + }, }); module.exports = pgAdmin.Browser.keyboardNavigation; diff --git a/web/pgadmin/browser/static/js/quick_search.js b/web/pgadmin/browser/static/js/quick_search.js new file mode 100644 index 000000000..82d95dfd4 --- /dev/null +++ b/web/pgadmin/browser/static/js/quick_search.js @@ -0,0 +1,28 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2020, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +import React from 'react'; +import ReactDOM from 'react-dom'; +import {Search} from './quick_search/trigger_search'; + +// TODO: GUI, Add the logic to show loading screen while fetching result +const onResultFetch = (url, data) => { + // URL can be used for displaying all the result in new page + // data will be array of search -> + console.warn('URL = ' + url); + console.warn(data); +}; + +// Entry point - Quick search functionality +if (document.getElementById('quick-search-component')) { + ReactDOM.render( + , + document.getElementById('quick-search-component') + ); +} diff --git a/web/pgadmin/browser/static/js/quick_search/iframe_component.js b/web/pgadmin/browser/static/js/quick_search/iframe_component.js new file mode 100644 index 000000000..bf9f8c059 --- /dev/null +++ b/web/pgadmin/browser/static/js/quick_search/iframe_component.js @@ -0,0 +1,44 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2020, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +import React, {Component} from 'react'; +import PropTypes from 'prop-types'; + +// Allow us to render IFrame using React +// Here we will add the event listener on Iframe load event +export class Iframe extends Component { + static get propTypes() { + return { + id: PropTypes.string.isRequired, + srcURL: PropTypes.string.isRequired, + onLoad: PropTypes.func.isRequired, + }; + } + + render () { + const iframeStyle = { + border: '0', + display: 'block', + position:'absolute', + opacity:'0', + }; + const {id, srcURL, onLoad} = this.props; + + return ( +