Skip to content

Commit a90f864

Browse files
Provide option to open file in new tab in the the query tool.#1235
1 parent b983b09 commit a90f864

File tree

11 files changed

+72
-16
lines changed

11 files changed

+72
-16
lines changed
-2.42 KB
Loading
8.11 KB
Loading

docs/en_US/preferences.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,9 @@ Use the fields on the *Options* panel to manage editor preferences.
474474
editor will prompt the user to saved unsaved data when exiting the data
475475
editor.
476476

477+
* When the *Open the file in a new tab?* switch is set to *True*, the
478+
editor will open the new file in new tab of the Query Tool.
479+
477480
* When the *Prompt to save unsaved query changes?* switch is set to *True*, the
478481
editor will prompt the user to saved unsaved query modifications when exiting
479482
the Query Tool.

docs/en_US/query_tool_toolbar.rst

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ File Options
2929
+----------------------+---------------------------------------------------------------------------------------------------+----------------+
3030
| Icon | Behavior | Shortcut |
3131
+======================+===================================================================================================+================+
32-
| *Open File* | Click the *Open File* icon to display a previously saved query in the SQL Editor. | Cmd/Ctrl + O |
32+
| *Open File* | Click the *Open File* icon to display a previously saved query in the same tab of the SQL Editor. | |
33+
| | To open the file in a new tab, select *Open in a new tab?* option form the dropdown. | Cmd/Ctrl + O |
3334
+----------------------+---------------------------------------------------------------------------------------------------+----------------+
3435
| *Save File* | Click the *Save* icon to perform a quick-save of a previously saved query, or to access the | Cmd/Ctrl + S |
3536
| | *Save* menu: | |

web/pgadmin/misc/file_manager/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,12 @@ def create_new_transaction(params):
380380
True,
381381
gettext("Select Folder")
382382
),
383+
'open_file': (
384+
['open_file'],
385+
True,
386+
False,
387+
gettext("Select File")
388+
),
383389
'create_file': (
384390
['select_file', 'rename', 'create'],
385391
True,

web/pgadmin/misc/file_manager/static/js/FileManagerModule.jsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,9 @@ export default class FileManagerModule {
6161
if(!title) {
6262
if(params.dialog_type == 'create_file') {
6363
title = gettext('Save File');
64-
} else if(params.dialog_type == 'select_file') {
64+
} else if(params.dialog_type == 'open_file'){
65+
title = gettext('Open File');
66+
}else if(params.dialog_type == 'select_file') {
6567
title = gettext('Select File');
6668
} else {
6769
title = gettext('Storage Manager');

web/pgadmin/misc/file_manager/static/js/components/FileManager.jsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -645,7 +645,8 @@ export default function FileManager({params, closeModal, onOK, onCancel, sharedS
645645
} else if(selectedRowIdx.current >= 0 && row) {
646646
let selectedfileType = row?.file_type;
647647
if(((selectedfileType == 'dir' || selectedfileType == 'drive') && fmUtilsObj.hasCapability('select_folder'))
648-
|| (selectedfileType != 'dir' && selectedfileType != 'drive' && fmUtilsObj.hasCapability('select_file'))) {
648+
|| (selectedfileType != 'dir' && selectedfileType != 'drive' && fmUtilsObj.hasCapability('select_file'))
649+
|| (selectedfileType != 'dir' && selectedfileType != 'drive' && fmUtilsObj.hasCapability('open_file'))) {
649650
disabled = false;
650651
}
651652
}
@@ -695,9 +696,12 @@ export default function FileManager({params, closeModal, onOK, onCancel, sharedS
695696
okBtnText = gettext('Select');
696697
if(params.dialog_type == 'create_file' || params.dialog_type == 'create_folder') {
697698
okBtnText = gettext('Create');
699+
}else if(params.dialog_type == 'open_file'){
700+
okBtnText = gettext('Open');
698701
}
699702
}
700703

704+
701705
return (
702706
<ErrorBoundary>
703707
<StyledBox display="flex" flexDirection="column" height="100%">
@@ -862,4 +866,4 @@ FileManager.propTypes = {
862866
onCancel: PropTypes.func,
863867
sharedStorages: PropTypes.array,
864868
restrictedSharedStorage: PropTypes.array,
865-
};
869+
};

web/pgadmin/static/js/components/ExternalIcon.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,4 +117,4 @@ export const MSAzureIcon = ({style})=><ExternalIcon Icon={MsAzure} style={{heigh
117117
MSAzureIcon.propTypes = {style: PropTypes.object};
118118

119119
export const SchemaDiffIcon = ({style})=><ExternalIcon Icon={SchemaDiffSvg} style={{height: '2rem', ...style}} data-label="SchemaDiffIcon" />;
120-
SchemaDiffIcon.propTypes = {style: PropTypes.object};
120+
SchemaDiffIcon.propTypes = {style: PropTypes.object};

web/pgadmin/tools/sqleditor/static/js/components/QueryToolComponent.jsx

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,7 @@ export default function QueryToolComponent({params, pgWindow, pgAdmin, selectedN
261261
}
262262
}, pollTime);
263263

264+
264265
let defaultLayout = {
265266
dockbox: {
266267
mode: 'vertical',
@@ -378,6 +379,10 @@ export default function QueryToolComponent({params, pgWindow, pgAdmin, selectedN
378379
let msg = `${selectedConn['server_name']}/${selectedConn['database_name']} - Database connected`;
379380
pgAdmin.Browser.notifier.success(_.escape(msg));
380381
}
382+
// Open the file if filename passed on the parameters.
383+
if(qtState.params.fileName){
384+
eventBus.current.fireEvent(QUERY_TOOL_EVENTS.LOAD_FILE, params.fileName, params.storage);
385+
}
381386
}).catch((error)=>{
382387
if(error.response?.request?.responseText?.search('Ticket expired') !== -1) {
383388
Kerberos.fetch_ticket()
@@ -577,14 +582,20 @@ export default function QueryToolComponent({params, pgWindow, pgAdmin, selectedN
577582
eventBus.current.fireEvent(QUERY_TOOL_EVENTS.EDITOR_LAST_FOCUS);
578583
};
579584
const events = [
580-
[QUERY_TOOL_EVENTS.TRIGGER_LOAD_FILE, ()=>{
585+
[QUERY_TOOL_EVENTS.TRIGGER_LOAD_FILE, (openInNewTab=false)=>{
581586
let fileParams = {
582587
'supported_types': ['sql', '*'], // file types allowed
583-
'dialog_type': 'select_file', // open select file dialog
588+
'dialog_type': 'open_file', // open select file dialog
584589
};
585-
pgAdmin.Tools.FileManager.show(fileParams, (fileName, storage)=>{
586-
eventBus.current.fireEvent(QUERY_TOOL_EVENTS.LOAD_FILE, fileName, storage);
587-
}, null, modal);
590+
if(openInNewTab){
591+
pgAdmin.Tools.FileManager.show(fileParams, (fileName, storage)=>{
592+
onNewQueryToolClick(null, fileName, storage);
593+
}, null, modal, openInNewTab);
594+
}else{
595+
pgAdmin.Tools.FileManager.show(fileParams,(fileName, storage)=>{
596+
eventBus.current.fireEvent(QUERY_TOOL_EVENTS.LOAD_FILE, fileName, storage);
597+
}, null, modal);
598+
}
588599
}],
589600
[QUERY_TOOL_EVENTS.TRIGGER_SAVE_FILE, (isSaveAs=false)=>{
590601
if(!isSaveAs && qtState.current_file) {
@@ -783,8 +794,7 @@ export default function QueryToolComponent({params, pgWindow, pgAdmin, selectedN
783794
});
784795
}, [qtState.preferences.browser, qtState.connection_list, qtState.params]);
785796

786-
787-
const onNewQueryToolClick = ()=>{
797+
const onNewQueryToolClick = (event, fileName, storage)=>{
788798
const transId = commonUtils.getRandomInt(1, 9999999);
789799
let selectedConn = _.find(qtState.connection_list, (c)=>c.is_selected);
790800
let parentData = {
@@ -807,6 +817,8 @@ export default function QueryToolComponent({params, pgWindow, pgAdmin, selectedN
807817
showQueryTool.launchQueryTool(pgWindow.pgAdmin.Tools.SQLEditor, transId, gridUrl, title, {
808818
user: selectedConn.user,
809819
role: selectedConn.role,
820+
fileName: fileName,
821+
storage: storage
810822
});
811823
};
812824

@@ -982,6 +994,8 @@ QueryToolComponent.propTypes = {
982994
server_name: PropTypes.string,
983995
database_name: PropTypes.string,
984996
layout: PropTypes.string,
997+
fileName: PropTypes.string,
998+
storage: PropTypes.string,
985999
}),
9861000
pgWindow: PropTypes.object.isRequired,
9871001
pgAdmin: PropTypes.object.isRequired,

web/pgadmin/tools/sqleditor/static/js/components/sections/MainToolBar.jsx

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ export function MainToolBar({containerRef, onFilterClick, onManageMacros, onAddT
7474
const [checkedMenuItems, setCheckedMenuItems] = React.useState({});
7575
/* Menu button refs */
7676
const saveAsMenuRef = React.useRef(null);
77+
const openInNewTabMenuRef = React.useRef(null);
7778
const editMenuRef = React.useRef(null);
7879
const autoCommitMenuRef = React.useRef(null);
7980
const explainMenuRef = React.useRef(null);
@@ -138,9 +139,9 @@ export function MainToolBar({containerRef, onFilterClick, onManageMacros, onAddT
138139

139140
const openFile = useCallback(()=>{
140141
confirmDiscard(()=>{
141-
eventBus.fireEvent(QUERY_TOOL_EVENTS.TRIGGER_LOAD_FILE);
142+
eventBus.fireEvent(QUERY_TOOL_EVENTS.TRIGGER_LOAD_FILE, Boolean(checkedMenuItems['open_in_new_tab']));
142143
}, true);
143-
}, [buttonsDisabled['save']]);
144+
}, [buttonsDisabled['save'], checkedMenuItems]);
144145

145146
const saveFile = useCallback((saveAs=false)=>{
146147
eventBus.fireEvent(QUERY_TOOL_EVENTS.TRIGGER_SAVE_FILE, saveAs);
@@ -337,6 +338,7 @@ export function MainToolBar({containerRef, onFilterClick, onManageMacros, onAddT
337338
explain_summary: queryToolPref.explain_summary,
338339
explain_settings: queryToolPref.explain_settings,
339340
explain_wal: queryToolPref.explain_wal,
341+
open_in_new_tab: queryToolPref.open_in_new_tab,
340342
});
341343
}
342344
}
@@ -501,6 +503,11 @@ export function MainToolBar({containerRef, onFilterClick, onManageMacros, onAddT
501503
<PgButtonGroup size="small">
502504
<PgIconButton title={gettext('Open File')} icon={<FolderRoundedIcon />} disabled={!queryToolCtx.params.is_query_tool}
503505
shortcut={queryToolPref.btn_open_file} onClick={openFile} />
506+
<PgIconButton title={gettext('Open in a new tab')} icon={<KeyboardArrowDownIcon />} splitButton disabled={!queryToolCtx.params.is_query_tool}
507+
name="menu-openfileintab" ref={openInNewTabMenuRef} onClick={toggleMenu}
508+
/>
509+
</PgButtonGroup>
510+
<PgButtonGroup size="small">
504511
<PgIconButton title={gettext('Save File')} icon={<SaveRoundedIcon />}
505512
shortcut={queryToolPref.btn_save_file} disabled={buttonsDisabled['save'] || !queryToolCtx.params.is_query_tool}
506513
onClick={()=>{saveFile(false);}} />
@@ -562,13 +569,22 @@ export function MainToolBar({containerRef, onFilterClick, onManageMacros, onAddT
562569
<PgIconButton title={gettext('Help')} icon={<HelpIcon />} onClick={onHelpClick} />
563570
</PgButtonGroup>
564571
</StyledBox>
572+
<PgMenu
573+
anchorRef={openInNewTabMenuRef}
574+
open={openMenuName=='menu-openfileintab'}
575+
onClose={onMenuClose}
576+
label={gettext('Open file Menu')}
577+
>
578+
<PgMenuItem hasCheck value="open_in_new_tab" checked={checkedMenuItems['open_in_new_tab']}
579+
onClick={checkMenuClick}>{gettext('Open in a new tab?')}</PgMenuItem>
580+
</PgMenu>
565581
<PgMenu
566582
anchorRef={saveAsMenuRef}
567583
open={openMenuName=='menu-saveas'}
568584
onClose={onMenuClose}
569-
label={gettext('File Menu')}
585+
label={gettext('Save As')}
570586
>
571-
<PgMenuItem onClick={()=>{saveFile(true);}}>{gettext('Save as')}</PgMenuItem>
587+
<PgMenuItem onClick={()=>{saveFile(true);}}>{gettext('Save As')}</PgMenuItem>
572588
</PgMenu>
573589
<PgMenu
574590
anchorRef={editMenuRef}

0 commit comments

Comments
 (0)