Significant changes to use ReactJS extensively.

1. Replace the current layout library wcDocker with ReactJS based rc-dock. #6479
2. Have close buttons on individual panel tabs instead of common. #2821
3. Changes in the context menu on panel tabs - Add close, close all and close others menu items. #5394
4. Allow closing all the tabs, including SQL and Properties. #4733
5. Changes in docking behaviour of different tabs based on user requests and remove lock layout menu.
6. Fix an issue where the scroll position of panels was not remembered on Firefox. #2986
7. Reset layout now will not require page refresh and is done spontaneously.
8. Use the zustand store for storing preferences instead of plain JS objects. This will help reflecting preferences immediately.
9. The above fix incorrect format (no indent) of SQL stored functions/procedures. #6720
10. New version check is moved to an async request now instead of app start to improve startup performance.
11. Remove jQuery and Bootstrap completely.
12. Replace jasmine and karma test runner with jest. Migrate all the JS test cases to jest. This will save time in writing and debugging JS tests.
13. Other important code improvements and cleanup.
This commit is contained in:
Aditya Toshniwal
2023-10-23 17:43:17 +05:30
committed by GitHub
parent 6d555645e9
commit 862f101772
373 changed files with 11149 additions and 14836 deletions

View File

@@ -12,21 +12,22 @@ import React from 'react';
import ReactDOM from 'react-dom';
import gettext from 'sources/gettext';
import { sprintf, registerDetachEvent } from 'sources/utils';
import { sprintf } from 'sources/utils';
import url_for from 'sources/url_for';
import pgWindow from 'sources/window';
import Kerberos from 'pgadmin.authenticate.kerberos';
import { refresh_db_node } from 'tools/sqleditor/static/js/sqleditor_title';
import { _set_dynamic_tab } from '../../../sqleditor/static/js/show_query_tool';
import getApiInstance from '../../../../static/js/api_instance';
import Notify from '../../../../static/js/helpers/Notifier';
import { getFunctionId, getProcedureId, getAppropriateLabel, setDebuggerTitle } from './debugger_utils';
import { getFunctionId, getProcedureId, getAppropriateLabel, getDebuggerTitle } from './debugger_utils';
import FunctionArguments from './debugger_ui';
import ModalProvider from '../../../../static/js/helpers/ModalProvider';
import DebuggerComponent from './components/DebuggerComponent';
import Theme from '../../../../static/js/Theme';
import { showRenamePanel } from '../../../../static/js/Dialogs';
import { BROWSER_PANELS } from '../../../../browser/static/js/constants';
import { NotifierProvider } from '../../../../static/js/helpers/Notifier';
import usePreferences from '../../../../preferences/static/js/store';
import pgAdmin from 'sources/pgadmin';
export default class DebuggerModule {
static instance;
@@ -42,7 +43,6 @@ export default class DebuggerModule {
this.pgAdmin = pgAdmin;
this.pgBrowser = pgBrowser;
this.funcArgs = new FunctionArguments();
this.wcDocker = window.wcDocker;
this.api = getApiInstance();
}
@@ -190,20 +190,6 @@ export default class DebuggerModule {
enable: 'can_debug',
}
]);
/* Create and load the new frame required for debugger panel */
this.frame = new this.pgBrowser.Frame({
name: 'frm_debugger',
title: gettext('Debugger'),
showTitle: true,
isCloseable: true,
isRenamable: true,
isPrivate: true,
icon: 'fa fa-bug',
url: 'about:blank',
});
this.frame.load(this.pgBrowser.docker);
}
// It will check weather the function is actually debuggable or not with pre-required condition.
@@ -393,47 +379,22 @@ export default class DebuggerModule {
'trans_id': trans_id,
});
let browser_preferences = self.pgBrowser.get_preferences_for_module('browser');
let browser_preferences = usePreferences.getState().getPreferencesForModule('browser');
let open_new_tab = browser_preferences.new_browser_tab_open;
if (open_new_tab && open_new_tab.includes('debugger')) {
window.open(url, '_blank');
// Send the signal to runtime, so that proper zoom level will be set.
setTimeout(function () {
self.pgBrowser.Events.trigger('pgadmin:nw-set-new-window-open-size');
}, 500);
} else {
self.pgBrowser.Events.once(
'pgadmin-browser:frame:urlloaded:frm_debugger',
function (frame) {
frame.openURL(url);
});
// Create the debugger panel as per the data received from user input dialog.
let dashboardPanel = self.pgBrowser.docker.findPanels(
'properties'
),
panel = self.pgBrowser.docker.addPanel(
'frm_debugger', self.wcDocker.DOCK.STACKED, dashboardPanel[0]
),
db_label = newTreeInfo.database.label;
panel.trans_id = trans_id;
_set_dynamic_tab(self.pgBrowser, browser_preferences['dynamic_tabs']);
registerDetachEvent(panel);
db_label = self.checkDbNameChange(data, dbNode, newTreeInfo, db_label);
let label = getAppropriateLabel(newTreeInfo);
setDebuggerTitle(panel, browser_preferences, label, newTreeInfo.schema.label, db_label, null, self.pgBrowser);
panel.focus();
panel.on(self.wcDocker.EVENT.RENAME, function (panel_data) {
self.panel_rename_event(panel_data, panel, treeInfo);
});
}
const db_label = self.checkDbNameChange(data, dbNode, newTreeInfo, db_label);
let label = getAppropriateLabel(newTreeInfo);
pgAdmin.Browser.Events.trigger(
'pgadmin:tool:show',
`${BROWSER_PANELS.DEBUGGER_TOOL}_${trans_id}`,
url,
null,
{title: getDebuggerTitle(browser_preferences, label, newTreeInfo.schema.label, db_label, null, self.pgBrowser),
icon: 'fa fa-bug', manualClose: false, renamable: true},
Boolean(open_new_tab?.includes('debugger'))
);
})
.catch(function (e) {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Target Initialization Error'),
e.responseJSON.errormsg
);
@@ -441,7 +402,7 @@ export default class DebuggerModule {
}
})
.catch((err) => {
Notify.alert(gettext('Debugger Error'), err.response.data.errormsg);
pgAdmin.Browser.notifier.alert(gettext('Debugger Error'), err.response.data.errormsg);
});
}
@@ -564,43 +525,22 @@ export default class DebuggerModule {
let url = url_for('debugger.direct', {
'trans_id': res.data.data.debuggerTransId,
});
let browser_preferences = self.pgBrowser.get_preferences_for_module('browser');
let browser_preferences = usePreferences.getState().getPreferencesForModule('browser');
let open_new_tab = browser_preferences.new_browser_tab_open;
if (open_new_tab && open_new_tab.includes('debugger')) {
window.open(url, '_blank');
// Send the signal to runtime, so that proper zoom level will be set.
setTimeout(function () {
self.pgBrowser.Browser.Events.trigger('pgadmin:nw-set-new-window-open-size');
}, 500);
} else {
self.pgBrowser.Events.once(
'pgadmin-browser:frame:urlloaded:frm_debugger',
function (frame) {
frame.openURL(url);
});
const db_label = treeInfo.database.label;
self.updatedDbLabel(res, db_label, treeInfo, dbNode);
// Create the debugger panel as per the data received from user input dialog.
let dashboardPanel = self.pgBrowser.docker.findPanels(
'properties'
),
panel = self.pgBrowser.docker.addPanel(
'frm_debugger', self.wcDocker.DOCK.STACKED, dashboardPanel[0]
),
db_label = treeInfo.database.label;
panel.trans_id = trans_id;
let label = getAppropriateLabel(treeInfo);
self.updatedDbLabel(res, db_label, treeInfo, dbNode);
let label = getAppropriateLabel(treeInfo);
setDebuggerTitle(panel, browser_preferences, label, db_label, db_label, null, self.pgBrowser);
panel.focus();
// Panel Rename event
panel.on(self.wcDocker.EVENT.RENAME, function (panel_data) {
self.panel_rename_event(panel_data, panel, treeInfo);
});
}
pgAdmin.Browser.Events.trigger(
'pgadmin:tool:show',
`${BROWSER_PANELS.DEBUGGER_TOOL}_${res.data.data.debuggerTransId}`,
url,
null,
{title: getDebuggerTitle(browser_preferences, label, db_label, db_label, null, self.pgBrowser),
icon: 'fa fa-bug', manualClose: false, renamable: true},
Boolean(open_new_tab?.includes('debugger'))
);
})
.catch(self.raiseError);
}
@@ -615,12 +555,12 @@ export default class DebuggerModule {
self.startGlobalDebugger();
},
function (error) {
Notify.alert(gettext('Debugger Error'), error);
pgAdmin.Browser.notifier.alert(gettext('Debugger Error'), error);
}
);
} else {
if (err.success == 0) {
Notify.alert(gettext('Debugger Error'), err.errormsg);
pgAdmin.Browser.notifier.alert(gettext('Debugger Error'), err.errormsg);
}
}
} catch (e) {
@@ -640,28 +580,25 @@ export default class DebuggerModule {
this.is_polling_required = true; // Flag to stop unwanted ajax calls
this.function_name_with_arguments = function_name_with_arguments;
this.layout = layout;
this.preferences = this.pgBrowser.get_preferences_for_module('debugger');
this.preferences = usePreferences.getState().getPreferencesForModule('debugger');
let panel = null;
let selectedNodeInfo = pgWindow.pgAdmin.Browser.tree.getTreeNodeHierarchy(
pgWindow.pgAdmin.Browser.tree.selected()
);
// Find debugger panel.
pgWindow.pgAdmin.Browser.docker.findPanels('frm_debugger').forEach(p => {
if (parseInt(p.trans_id) == trans_id) {
panel = p;
}
});
ReactDOM.render(
<Theme>
<ModalProvider>
<DebuggerComponent pgAdmin={pgWindow.pgAdmin} selectedNodeInfo={selectedNodeInfo} panel={panel} layout={layout} params={{
transId: trans_id,
directDebugger: this,
funcArgsInstance: this.funcArgs
}} />
<NotifierProvider pgAdmin={pgAdmin} pgWindow={pgWindow} />
<DebuggerComponent pgAdmin={pgWindow.pgAdmin} selectedNodeInfo={selectedNodeInfo}
panelId={`${BROWSER_PANELS.DEBUGGER_TOOL}_${this.trans_id}`}
panelDocker={pgWindow.pgAdmin.Browser.docker}
layout={layout} params={{
transId: trans_id,
directDebugger: this,
funcArgsInstance: this.funcArgs
}}
/>
</ModalProvider>
</Theme>,
container
@@ -672,21 +609,10 @@ export default class DebuggerModule {
try {
let err = xhr.response.data;
if (err.success == 0) {
Notify.alert(gettext('Debugger Error'), err.errormsg);
pgAdmin.Browser.notifier.alert(gettext('Debugger Error'), err.errormsg);
}
} catch (e) {
console.warn(e.stack || e);
}
}
panel_rename_event(panel_data, panel, treeInfo) {
let name = getAppropriateLabel(treeInfo);
let preferences = this.pgBrowser.get_preferences_for_module('browser');
let data = {
function_name: name,
schema_name: treeInfo.schema.label,
database_name: treeInfo.database.label
};
showRenamePanel(panel_data.$titleText[0].textContent, preferences, panel, 'debugger', data);
}
}

View File

@@ -19,18 +19,17 @@ import CloseSharpIcon from '@material-ui/icons/CloseSharp';
import url_for from 'sources/url_for';
import gettext from 'sources/gettext';
import * as commonUtils from 'sources/utils';
import pgAdmin from 'sources/pgadmin';
import Loader from 'sources/components/Loader';
import SchemaView from '../../../../../static/js/SchemaView';
import getApiInstance from '../../../../../static/js/api_instance';
import { DefaultButton, PrimaryButton } from '../../../../../static/js/components/Buttons';
import { getAppropriateLabel, setDebuggerTitle } from '../debugger_utils';
import Notify from '../../../../../static/js/helpers/Notifier';
import { getAppropriateLabel, getDebuggerTitle } from '../debugger_utils';
import { DebuggerArgumentSchema } from './DebuggerArgs.ui';
import { DEBUGGER_ARGS } from '../DebuggerConstants';
import { showRenamePanel } from '../../../../../static/js/Dialogs';
import { BROWSER_PANELS } from '../../../../../browser/static/js/constants';
import usePreferences from '../../../../../preferences/static/js/store';
const useStyles = makeStyles((theme) =>
@@ -78,7 +77,6 @@ export default function DebuggerArgumentComponent({ debuggerInfo, restartDebug,
const [loaderText, setLoaderText] = React.useState('');
const debuggerFinalArgs = useRef([]);
const InputArgIds = useRef([]);
const wcDocker = window.wcDocker;
function getURL() {
let _Url = null;
@@ -428,7 +426,7 @@ export default function DebuggerArgumentComponent({ debuggerInfo, restartDebug,
setLoadArgs(crypto.getRandomValues(new Uint16Array(1)));
})
.catch(() => {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Error'),
gettext('Unable to fetch the arguments from server')
);
@@ -489,7 +487,7 @@ export default function DebuggerArgumentComponent({ debuggerInfo, restartDebug,
}, 100);
}).catch(function (er) {
setLoaderText('');
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Clear failed'),
er.responseJSON.errormsg
);
@@ -675,7 +673,7 @@ export default function DebuggerArgumentComponent({ debuggerInfo, restartDebug,
}
function startDebugging() {
setLoaderText('Starting debugger.');
setLoaderText('Starting debugger...');
try {
/* Initialize the target once the debug button is clicked and create asynchronous connection
and unique transaction ID If the debugging is started again then treeInfo is already stored. */
@@ -716,40 +714,19 @@ export default function DebuggerArgumentComponent({ debuggerInfo, restartDebug,
}
);
let browserPreferences = pgAdmin.Browser.get_preferences_for_module('browser');
let browserPreferences = usePreferences().getPreferencesForModule('browser');
let open_new_tab = browserPreferences.new_browser_tab_open;
if (open_new_tab && open_new_tab.includes('debugger')) {
window.open(url, '_blank');
// Send the signal to runtime, so that proper zoom level will be set.
setTimeout(function () {
pgAdmin.Browser.Events.trigger('pgadmin:nw-set-new-window-open-size');
}, 500);
} else {
pgAdmin.Browser.Events.once(
'pgadmin-browser:frame:urlloaded:frm_debugger',
function (frame) {
frame.openURL(url);
});
let label = getAppropriateLabel(treeInfo);
// Create the debugger panel as per the data received from user input dialog.
let propertiesPanel = pgAdmin.Browser.docker.findPanels('properties');
let panel = pgAdmin.Browser.docker.addPanel(
'frm_debugger', wcDocker.DOCK.STACKED, propertiesPanel[0]
);
panel.trans_id = res_post.data.data.debuggerTransId;
let browser_pref = pgAdmin.Browser.get_preferences_for_module('browser');
let label = getAppropriateLabel(treeInfo);
setDebuggerTitle(panel, browser_pref, label, treeInfo.schema.label, treeInfo.database.label, null, pgAdmin.Browser);
panel.focus();
/* TO-DO check how to add this is new lib for wc-docker */
commonUtils.registerDetachEvent(panel);
// Panel Rename event
panel.on(wcDocker.EVENT.RENAME, function (panel_data) {
panelRenameEvent(panel_data, panel, treeInfo);
});
}
pgAdmin.Browser.Events.trigger(
'pgadmin:tool:show',
`${BROWSER_PANELS.DEBUGGER_TOOL}_${res_post.data.data.debuggerTransId}`,
url,
null,
{title: getDebuggerTitle(browserPreferences, label, treeInfo.schema.label, treeInfo.database.label, null, pgAdmin.Browser),
icon: 'fa fa-bug', manualClose: false, renamable: true},
Boolean(open_new_tab?.includes('debugger'))
);
let _url = getSetArgsUrl(pgData, treeInfo);
@@ -761,7 +738,7 @@ export default function DebuggerArgumentComponent({ debuggerInfo, restartDebug,
.then(function () {/*This is intentional (SonarQube)*/ })
.catch((error) => {
setLoaderText('');
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Error occured: '),
gettext(error.response.data)
);
@@ -769,10 +746,11 @@ export default function DebuggerArgumentComponent({ debuggerInfo, restartDebug,
/* Close the debugger modal dialog */
props.closeModal();
setLoaderText('');
return;
})
.catch(function (error) {
setLoaderText('');
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Target Initialization Error'),
gettext(error.response.data)
);
@@ -793,7 +771,7 @@ export default function DebuggerArgumentComponent({ debuggerInfo, restartDebug,
})
.catch(function (error) {
props.closeModal();
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Listener Startup Error'),
gettext(error.response.data)
);
@@ -817,7 +795,7 @@ export default function DebuggerArgumentComponent({ debuggerInfo, restartDebug,
})
.catch(function (error) {
setLoaderText('');
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Listener Startup Set Arguments Error'),
gettext(error.response.data)
);
@@ -825,7 +803,7 @@ export default function DebuggerArgumentComponent({ debuggerInfo, restartDebug,
}
} catch (err) {
setLoaderText('');
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Error'),
gettext(err.message)
);
@@ -833,17 +811,6 @@ export default function DebuggerArgumentComponent({ debuggerInfo, restartDebug,
}
function panelRenameEvent(panel_data, panel, treeInfo) {
let name = getAppropriateLabel(treeInfo);
let preferences = pgAdmin.Browser.get_preferences_for_module('browser');
let data = {
function_name: name,
schema_name: treeInfo.schema.label,
database_name: treeInfo.database.label
};
showRenamePanel(panel_data.$titleText[0].textContent, preferences, panel, 'debugger', data);
}
return (
<Box className={classes.root}>
<Box className={classes.body}>

View File

@@ -8,19 +8,17 @@
//////////////////////////////////////////////////////////////
import { Box } from '@material-ui/core';
import React, { useCallback, useEffect, useRef, useState } from 'react';
import React, { useEffect, useRef } from 'react';
import PropTypes from 'prop-types';
import gettext from 'sources/gettext';
import url_for from 'sources/url_for';
import Loader from 'sources/components/Loader';
import Layout, { LayoutHelper } from '../../../../../static/js/helpers/Layout';
import Layout, { LayoutDocker } from '../../../../../static/js/helpers/Layout';
import EventBus from '../../../../../static/js/helpers/EventBus';
import getApiInstance, { callFetch } from '../../../../../static/js/api_instance';
import Notify from '../../../../../static/js/helpers/Notifier';
import { evalFunc } from '../../../../../static/js/utils';
import { PANELS, DEBUGGER_EVENTS, MENUS } from '../DebuggerConstants';
import { retrieveNodeName } from '../../../../sqleditor/static/js/show_view_data';
import { useModal } from '../../../../../static/js/helpers/ModalProvider';
@@ -31,11 +29,12 @@ import { Stack } from './Stack';
import { Results } from './Results';
import { LocalVariablesAndParams } from './LocalVariablesAndParams';
import DebuggerArgumentComponent from './DebuggerArgumentComponent';
import usePreferences from '../../../../../preferences/static/js/store';
export const DebuggerContext = React.createContext();
export const DebuggerEventsContext = React.createContext();
export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panel, eventBusObj, layout, params }) {
export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panelId, panelDocker, eventBusObj, layout, params }) {
const savedLayout = layout;
const containerRef = React.useRef(null);
const docker = useRef(null);
@@ -44,19 +43,14 @@ export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panel, ev
const eventBus = useRef(eventBusObj || (new EventBus()));
const [loaderText, setLoaderText] = React.useState('');
const editor = useRef(null);
const preferencesStore = usePreferences();
let timeOut = null;
const [qtState, _setQtState] = useState({
preferences: {
browser: {}, debugger: {},
},
const qtState = {
is_new_tab: window.location == window.parent?.location,
params: {
...params,
node_name: retrieveNodeName(selectedNodeInfo),
}
});
const setQtState = (state) => {
_setQtState((prev) => ({ ...prev, ...evalFunc(null, state, prev) }));
};
const disableToolbarButtons = () => {
@@ -74,15 +68,6 @@ export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panel, ev
eventBus.current.fireEvent(DEBUGGER_EVENTS.GET_TOOL_BAR_BUTTON_STATUS, { disabled: false });
};
const reflectPreferences = useCallback(() => {
setQtState({
preferences: {
browser: pgAdmin.Browser.get_preferences_for_module('browser'),
debugger: pgAdmin.Browser.get_preferences_for_module('debugger'),
}
});
}, []);
// Function to get the breakpoint information from the server
const getBreakpointInformation = (transId, callBackFunc) => {
let result = '';
@@ -158,15 +143,15 @@ export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panel, ev
+ 'On clicking the ok button, debugger panel will be closed.');
}
Notify.alert(header_msg, err_msg, () => {
if (panel) {
panel.close();
pgAdmin.Browser.notifier.alert(header_msg, err_msg, () => {
if (panelId) {
panelDocker.close(panelId, true);
}
});
}
} catch (e) {
alert(xhr);
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Error'),
gettext('Error while starting debugging listener.')
);
@@ -174,21 +159,21 @@ export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panel, ev
};
const raisePollingError = () => {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Error'),
gettext('Error while polling result.')
);
};
const raiseClearBrekpointError = () => {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Error'),
gettext('Error while clearing all breakpoint.')
);
};
const raiseFetchingBreakpointError = () => {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Error'),
gettext('Error while fetching breakpoint information.')
);
@@ -213,14 +198,14 @@ export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panel, ev
// If status is Busy then poll the result by recursive call to the poll function
messages(transId);
} else if (res.data.data.status === 'NotConnected') {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Not connected to server or connection with the server has been closed.'),
res.data.result
);
}
})
.catch(function () {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Error'),
gettext('Error while fetching messages information.')
);
@@ -244,14 +229,14 @@ export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panel, ev
// If status is Success then find the port number to attach the executer.
executeQuery(transId);
} else if (res.data.data.status === 'NotConnected') {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Error'),
gettext('Error while starting debugging session.')
);
}
})
.catch(function () {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Error'),
gettext('Error while starting debugging session.')
);
@@ -286,14 +271,14 @@ export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panel, ev
pollEndExecutionResult(transId);
}
} else if (res.data.data.status === 'NotConnected') {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Error'),
gettext('Error while executing requested debugging information.')
);
}
})
.catch(function () {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Error'),
gettext('Error while executing requested debugging information.')
);
@@ -343,7 +328,7 @@ export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panel, ev
}
})
.catch(function () {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Error'),
gettext('Error while selecting frame.')
);
@@ -508,14 +493,14 @@ export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panel, ev
enableToolbarButtons();
} else if (res.data.status === 'NotConnected') {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Error'),
gettext('Error while toggling breakpoint.')
);
}
})
.catch(function () {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Error'),
gettext('Error while toggling breakpoint.')
);
@@ -553,16 +538,16 @@ export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panel, ev
// Set the message to inform the user that execution
// is completed.
Notify.success(res.data.info, 3000);
pgAdmin.Browser.notifier.success(res.data.info, 3000);
} else if (res.data.data.status === 'NotConnected') {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Error'),
gettext('Error while executing stop in debugging session.')
);
}
})
.catch(function () {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Error'),
gettext('Error while executing stop in debugging session.')
);
@@ -648,7 +633,7 @@ export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panel, ev
//Set the notification message to inform the user that execution is
// completed with error.
if (!params.directDebugger.is_user_aborted_debugging) {
Notify.error(res.data.info, 3000);
pgAdmin.Browser.notifier.error(res.data.info, 3000);
}
// Update the message tab of the debugger
@@ -678,7 +663,7 @@ export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panel, ev
params.directDebugger.polling_timeout_idle = true;
//Set the message to inform the user that execution is completed.
Notify.success(res.data.info, 3000);
pgAdmin.Browser.notifier.success(res.data.info, 3000);
// Update the message tab of the debugger
updateMessages(res.data.data.status_message);
@@ -745,7 +730,7 @@ export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panel, ev
params.directDebugger.polling_timeout_idle = true;
//Set the message to inform the user that execution is completed.
Notify.success(res.data.info, 3000);
pgAdmin.Browser.notifier.success(res.data.info, 3000);
// Update the message tab of the debugger
updateMessages(res.data.data.status_message);
@@ -768,7 +753,7 @@ export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panel, ev
// Update the message tab of the debugger
updateMessages(res.data.data.status_message);
} else if (res.data.status === 'NotConnected') {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger poll end execution error'),
res.data.result
);
@@ -810,14 +795,14 @@ export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panel, ev
if (res.data.data.status) {
pollResult(params.transId);
} else {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Error'),
gettext('Error while executing continue in debugging session.')
);
}
})
.catch(function () {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Error'),
gettext('Error while executing continue in debugging session.')
);
@@ -841,14 +826,14 @@ export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panel, ev
if (res.data.data.status) {
pollResult(params.transId);
} else {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Error'),
gettext('Error while executing step over in debugging session.')
);
}
})
.catch(function () {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Error'),
gettext('Error while executing step over in debugging session.')
);
@@ -929,14 +914,14 @@ export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panel, ev
params.directDebugger.debug_restarted = false;
}
} else if (res.data.data.status === 'NotConnected') {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Error'),
gettext('Error while fetching variable information.')
);
}
})
.catch(function () {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Error'),
gettext('Error while fetching variable information.')
);
@@ -961,14 +946,14 @@ export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panel, ev
// Call function to create and update stack information
getLocalVariables(params.transId);
} else if (res.data.data.status === 'NotConnected') {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Error'),
gettext('Error while fetching stack information.')
);
}
})
.catch(function () {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Error'),
gettext('Error while fetching stack information.')
);
@@ -982,7 +967,7 @@ export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panel, ev
try {
updateBreakpoint(transId);
} catch (err) {
Notify.alert(gettext('Error in update'), err);
pgAdmin.Browser.notifier.alert(gettext('Error in update'), err);
}
}
@@ -1076,7 +1061,7 @@ export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panel, ev
params.directDebugger.polling_timeout_idle = true;
checkDebuggerStatus(transId);
} else if (res.data.data.status === 'NotConnected') {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Error: poll_result'),
gettext('Error while polling result.')
);
@@ -1102,14 +1087,14 @@ export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panel, ev
if (res.data.data.status) {
pollResult(params.transId);
} else {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Error'),
gettext('Error while executing step into in debugging session.')
);
}
})
.catch(function () {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Error'),
gettext('Error while executing step into in debugging session.')
);
@@ -1133,14 +1118,14 @@ export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panel, ev
getLocalVariables(params.transId);
// Show the message to the user that deposit value is success or failure
if (res.data.data.result) {
Notify.success(res.data.data.info, 3000);
pgAdmin.Browser.notifier.success(res.data.data.info, 3000);
} else {
Notify.error(res.data.data.info, 3000);
pgAdmin.Browser.notifier.error(res.data.data.info, 3000);
}
}
})
.catch(function () {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Error'),
gettext('Error while depositing variable value.')
);
@@ -1178,27 +1163,13 @@ export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panel, ev
});
eventBus.current.registerListener(DEBUGGER_EVENTS.FOCUS_PANEL, (panelId) => {
LayoutHelper.focus(docker.current, panelId);
docker.current.focus(panelId);
});
eventBus.current.registerListener(
DEBUGGER_EVENTS.TRIGGER_RESET_LAYOUT, () => {
docker.current?.resetLayout();
});
}, []);
useEffect(() => {
reflectPreferences();
pgAdmin.Browser.onPreferencesChange('debugger', function () {
reflectPreferences();
});
// /* Clear the timeout if unmounted */
return () => {
clearTimeout(timeOut);
};
}, []);
const DebuggerContextValue = React.useMemo(() => ({
@@ -1206,8 +1177,11 @@ export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panel, ev
api: api,
modal: modal,
params: qtState.params,
preferences: qtState.preferences,
}), [qtState.params, qtState.preferences]);
preferences: {
browser: preferencesStore.getPreferencesForModule('browser'),
debugger: preferencesStore.getPreferencesForModule('debugger'),
},
}), [qtState.params, preferencesStore]);
// Define the debugger layout components such as DebuggerEditor to show queries and
let defaultLayout = {
@@ -1219,7 +1193,7 @@ export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panel, ev
children: [
{
tabs: [
LayoutHelper.getPanel({
LayoutDocker.getPanel({
id: PANELS.DEBUGGER, title: gettext('Debugger'), content: <DebuggerEditor getEditor={(edRef) => {
editor.current = edRef;
}} params={{ transId: params.transId, debuggerDirect: params.directDebugger }} />
@@ -1233,19 +1207,19 @@ export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panel, ev
children: [
{
tabs: [
LayoutHelper.getPanel({
LayoutDocker.getPanel({
id: PANELS.PARAMETERS, title: gettext('Parameters'), content: <LocalVariablesAndParams type={1} />,
}),
LayoutHelper.getPanel({
LayoutDocker.getPanel({
id: PANELS.LOCAL_VARIABLES, title: gettext('Local Variables'), content: <LocalVariablesAndParams type={2} />,
}),
LayoutHelper.getPanel({
LayoutDocker.getPanel({
id: PANELS.MESSAGES, title: gettext('Messages'), content: <DebuggerMessages />,
}),
LayoutHelper.getPanel({
LayoutDocker.getPanel({
id: PANELS.RESULTS, title: gettext('Result'), content: <Results />,
}),
LayoutHelper.getPanel({
LayoutDocker.getPanel({
id: PANELS.STACK, title: gettext('Stack'), content: <Stack />,
}),
],
@@ -1279,7 +1253,8 @@ export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panel, ev
DebuggerComponent.propTypes = {
pgAdmin: PropTypes.object,
selectedNodeInfo: PropTypes.object,
panel: PropTypes.object,
panelId: PropTypes.string,
panelDocker: PropTypes.object,
eventBusObj: PropTypes.object,
layout: PropTypes.string,
params: PropTypes.object

View File

@@ -17,9 +17,9 @@ import url_for from 'sources/url_for';
import getApiInstance from '../../../../../static/js/api_instance';
import CodeMirror from '../../../../../static/js/components/CodeMirror';
import Notify from '../../../../../static/js/helpers/Notifier';
import { DEBUGGER_EVENTS } from '../DebuggerConstants';
import { DebuggerEventsContext } from './DebuggerComponent';
import { usePgAdmin } from '../../../../../static/js/BrowserComponent';
const useStyles = makeStyles(() => ({
@@ -32,6 +32,7 @@ export default function DebuggerEditor({ getEditor, params }) {
const classes = useStyles();
const editor = React.useRef();
const eventBus = useContext(DebuggerEventsContext);
const pgAdmin = usePgAdmin();
const api = getApiInstance();
@@ -59,7 +60,7 @@ export default function DebuggerEditor({ getEditor, params }) {
}
})
.catch(function() {
Notify.alert(
pgAdmin.Browser.notifier.alert(
gettext('Debugger Error'),
gettext('Error while setting debugging breakpoint.')
);

View File

@@ -133,7 +133,9 @@ export function ToolBar() {
<PgIconButton data-test='toggle-breakpoint' title={gettext('Toggle breakpoint')} disabled={buttonsDisabled[MENUS.TOGGLE_BREAKPOINT]} icon={<FiberManualRecordIcon style={{height: '2rem'}} />}
accesskey={shortcut_key(preferences?.btn_toggle_breakpoint)} onClick={() => { toggleBreakpoint(); }} />
<PgIconButton data-test='clear-breakpoint' title={gettext('Clear all breakpoints')} disabled={buttonsDisabled[MENUS.CLEAR_ALL_BREAKPOINT]} icon={<NotInterestedIcon />}
accesskey={shortcut_key(preferences?.btn_clear_breakpoints)} onClick={() => { clearAllBreakpoint(); }} />
accesskey={shortcut_key(preferences?.btn_clear_breakpoints)} onClick={() => {
clearAllBreakpoint();
}} />
</PgButtonGroup>
<PgButtonGroup size="small">
<PgIconButton data-test='stop-debugger' title={gettext('Stop')} icon={<StopIcon style={{height: '2rem'}} />} disabled={buttonsDisabled[MENUS.STOP]} onClick={() => { stop(); }}

View File

@@ -12,7 +12,6 @@ import React from 'react';
import gettext from 'sources/gettext';
import pgAdmin from 'sources/pgadmin';
import Notify from '../../../../static/js/helpers/Notifier';
import DebuggerArgumentComponent from './components/DebuggerArgumentComponent';
export default class FunctionArguments {
@@ -27,7 +26,7 @@ export default class FunctionArguments {
let treeInfo = t.getTreeNodeHierarchy(i);
// Render Debugger argument component
Notify.showModal(gettext('Debugger'), (closeModal) => {
pgAdmin.Browser.notifier.showModal(gettext('Debugger'), (closeModal) => {
return <DebuggerArgumentComponent closeModal={closeModal} debuggerInfo={debugInfo} restartDebug={restartDebug} isEdbProc={isEdbProc} transId={transId} pgTreeInfo={treeInfo} pgData={d}></DebuggerArgumentComponent>;
}, { isFullScreen: false, isResizeable: true, showFullScreen: true, isFullWidth: true, dialogWidth: pgAdmin.Browser.stdW.md, dialogHeight: pgAdmin.Browser.stdH.md });
}

View File

@@ -8,7 +8,6 @@
//////////////////////////////////////////////////////////////////////////
import {generateTitle} from '../../../sqleditor/static/js/sqleditor_title';
import {_set_dynamic_tab} from '../../../sqleditor/static/js/show_query_tool';
function getFunctionId(treeInfoObject) {
let objectId;
@@ -34,7 +33,7 @@ function getProcedureId(treeInfoObject) {
return objectId;
}
function setDebuggerTitle(panel, preferences, function_name, schema_name, database_name, custom_title=null, pgBrowser=null) {
function getDebuggerTitle(preferences, function_name, schema_name, database_name, custom_title=null) {
let debugger_title_placeholder = '';
if(custom_title) {
debugger_title_placeholder = custom_title;
@@ -59,8 +58,7 @@ function setDebuggerTitle(panel, preferences, function_name, schema_name, databa
'type': 'debugger',
};
let title = generateTitle(debugger_title_placeholder, title_data);
_set_dynamic_tab(pgBrowser, preferences['dynamic_tabs']);
panel.title('<span>'+ title +'</span>');
return title;
}
function get_function_name(function_name) {
@@ -96,6 +94,7 @@ function getAppropriateLabel(treeInfo) {
module.exports = {
getFunctionId: getFunctionId,
getProcedureId: getProcedureId,
setDebuggerTitle: setDebuggerTitle,
setDebuggerTitle: getDebuggerTitle,
getDebuggerTitle: getDebuggerTitle,
getAppropriateLabel: getAppropriateLabel,
};