diff --git a/docs/en_US/images/preferences_browser_breadcrumbs.png b/docs/en_US/images/preferences_browser_breadcrumbs.png index 8257207b5..196b75a29 100644 Binary files a/docs/en_US/images/preferences_browser_breadcrumbs.png and b/docs/en_US/images/preferences_browser_breadcrumbs.png differ diff --git a/docs/en_US/images/preferences_browser_display.png b/docs/en_US/images/preferences_browser_display.png index 52e4cc55d..69a1d9421 100644 Binary files a/docs/en_US/images/preferences_browser_display.png and b/docs/en_US/images/preferences_browser_display.png differ diff --git a/docs/en_US/images/preferences_browser_keyboard_shortcuts.png b/docs/en_US/images/preferences_browser_keyboard_shortcuts.png index f73406b78..ac2885cd5 100644 Binary files a/docs/en_US/images/preferences_browser_keyboard_shortcuts.png and b/docs/en_US/images/preferences_browser_keyboard_shortcuts.png differ diff --git a/docs/en_US/images/preferences_browser_nodes.png b/docs/en_US/images/preferences_browser_nodes.png index 00d06cd04..984b31c0a 100644 Binary files a/docs/en_US/images/preferences_browser_nodes.png and b/docs/en_US/images/preferences_browser_nodes.png differ diff --git a/docs/en_US/images/preferences_browser_processes.png b/docs/en_US/images/preferences_browser_processes.png index 6b6ca1712..4fb388440 100644 Binary files a/docs/en_US/images/preferences_browser_processes.png and b/docs/en_US/images/preferences_browser_processes.png differ diff --git a/docs/en_US/images/preferences_browser_properties.png b/docs/en_US/images/preferences_browser_properties.png index a2094b523..0c16cb577 100644 Binary files a/docs/en_US/images/preferences_browser_properties.png and b/docs/en_US/images/preferences_browser_properties.png differ diff --git a/docs/en_US/images/preferences_browser_tab_settings.png b/docs/en_US/images/preferences_browser_tab_settings.png index 16f2bd110..b15d73e78 100644 Binary files a/docs/en_US/images/preferences_browser_tab_settings.png and b/docs/en_US/images/preferences_browser_tab_settings.png differ diff --git a/docs/en_US/images/preferences_dashboard_display.png b/docs/en_US/images/preferences_dashboard_display.png index 2d0a6b99f..39f31c794 100644 Binary files a/docs/en_US/images/preferences_dashboard_display.png and b/docs/en_US/images/preferences_dashboard_display.png differ diff --git a/docs/en_US/images/preferences_dashboard_graphs.png b/docs/en_US/images/preferences_dashboard_graphs.png index bcff2963b..4fbf34fb7 100644 Binary files a/docs/en_US/images/preferences_dashboard_graphs.png and b/docs/en_US/images/preferences_dashboard_graphs.png differ diff --git a/docs/en_US/images/preferences_dashboard_refresh.png b/docs/en_US/images/preferences_dashboard_refresh.png index 2694ffbbf..5a2e0b7d9 100644 Binary files a/docs/en_US/images/preferences_dashboard_refresh.png and b/docs/en_US/images/preferences_dashboard_refresh.png differ diff --git a/docs/en_US/images/preferences_debugger_keyboard_shortcuts.png b/docs/en_US/images/preferences_debugger_keyboard_shortcuts.png index ec76b8ee2..10ec903df 100644 Binary files a/docs/en_US/images/preferences_debugger_keyboard_shortcuts.png and b/docs/en_US/images/preferences_debugger_keyboard_shortcuts.png differ diff --git a/docs/en_US/images/preferences_erd_keyboard_shortcuts.png b/docs/en_US/images/preferences_erd_keyboard_shortcuts.png index f76f6b7ee..3fda01a16 100644 Binary files a/docs/en_US/images/preferences_erd_keyboard_shortcuts.png and b/docs/en_US/images/preferences_erd_keyboard_shortcuts.png differ diff --git a/docs/en_US/images/preferences_erd_options.png b/docs/en_US/images/preferences_erd_options.png index 8bb55273b..6f8b6878b 100644 Binary files a/docs/en_US/images/preferences_erd_options.png and b/docs/en_US/images/preferences_erd_options.png differ diff --git a/docs/en_US/images/preferences_graph_visualiser.png b/docs/en_US/images/preferences_graph_visualiser.png index 60a5bbfec..92436ef58 100644 Binary files a/docs/en_US/images/preferences_graph_visualiser.png and b/docs/en_US/images/preferences_graph_visualiser.png differ diff --git a/docs/en_US/images/preferences_misc_themes.png b/docs/en_US/images/preferences_misc_themes.png index 770fbf6ce..3b2429617 100644 Binary files a/docs/en_US/images/preferences_misc_themes.png and b/docs/en_US/images/preferences_misc_themes.png differ diff --git a/docs/en_US/images/preferences_misc_user_language.png b/docs/en_US/images/preferences_misc_user_language.png index 932454f87..9020a280b 100644 Binary files a/docs/en_US/images/preferences_misc_user_language.png and b/docs/en_US/images/preferences_misc_user_language.png differ diff --git a/docs/en_US/images/preferences_paths_binary.png b/docs/en_US/images/preferences_paths_binary.png index ccab4f465..a76160284 100644 Binary files a/docs/en_US/images/preferences_paths_binary.png and b/docs/en_US/images/preferences_paths_binary.png differ diff --git a/docs/en_US/images/preferences_paths_help.png b/docs/en_US/images/preferences_paths_help.png index 18814c478..bec54f9ac 100644 Binary files a/docs/en_US/images/preferences_paths_help.png and b/docs/en_US/images/preferences_paths_help.png differ diff --git a/docs/en_US/images/preferences_schema_diff.png b/docs/en_US/images/preferences_schema_diff.png index 74567e464..336858494 100644 Binary files a/docs/en_US/images/preferences_schema_diff.png and b/docs/en_US/images/preferences_schema_diff.png differ diff --git a/docs/en_US/images/preferences_sql_auto_completion.png b/docs/en_US/images/preferences_sql_auto_completion.png index 09b1a763d..e5bb3869e 100644 Binary files a/docs/en_US/images/preferences_sql_auto_completion.png and b/docs/en_US/images/preferences_sql_auto_completion.png differ diff --git a/docs/en_US/images/preferences_sql_csv_output.png b/docs/en_US/images/preferences_sql_csv_output.png index e2a6e0496..1cd645daf 100644 Binary files a/docs/en_US/images/preferences_sql_csv_output.png and b/docs/en_US/images/preferences_sql_csv_output.png differ diff --git a/docs/en_US/images/preferences_sql_display.png b/docs/en_US/images/preferences_sql_display.png index f81b6451d..574e82184 100644 Binary files a/docs/en_US/images/preferences_sql_display.png and b/docs/en_US/images/preferences_sql_display.png differ diff --git a/docs/en_US/images/preferences_sql_editor.png b/docs/en_US/images/preferences_sql_editor.png index d47dcfc7d..19416bd29 100644 Binary files a/docs/en_US/images/preferences_sql_editor.png and b/docs/en_US/images/preferences_sql_editor.png differ diff --git a/docs/en_US/images/preferences_sql_explain.png b/docs/en_US/images/preferences_sql_explain.png index d23026d62..3709ca659 100644 Binary files a/docs/en_US/images/preferences_sql_explain.png and b/docs/en_US/images/preferences_sql_explain.png differ diff --git a/docs/en_US/images/preferences_sql_formatting.png b/docs/en_US/images/preferences_sql_formatting.png index 9cd3a4f5a..d121993b6 100644 Binary files a/docs/en_US/images/preferences_sql_formatting.png and b/docs/en_US/images/preferences_sql_formatting.png differ diff --git a/docs/en_US/images/preferences_sql_keyboard_shortcuts.png b/docs/en_US/images/preferences_sql_keyboard_shortcuts.png index 8f3a9894b..de61d4fa9 100644 Binary files a/docs/en_US/images/preferences_sql_keyboard_shortcuts.png and b/docs/en_US/images/preferences_sql_keyboard_shortcuts.png differ diff --git a/docs/en_US/images/preferences_sql_options.png b/docs/en_US/images/preferences_sql_options.png index a61563f6c..547dd7e7c 100644 Binary files a/docs/en_US/images/preferences_sql_options.png and b/docs/en_US/images/preferences_sql_options.png differ diff --git a/docs/en_US/images/preferences_sql_results_grid.png b/docs/en_US/images/preferences_sql_results_grid.png index a3c8d23e7..6c4a64a7c 100644 Binary files a/docs/en_US/images/preferences_sql_results_grid.png and b/docs/en_US/images/preferences_sql_results_grid.png differ diff --git a/docs/en_US/images/preferences_storage_options.png b/docs/en_US/images/preferences_storage_options.png index 3cbd0e15b..75aa5ddf8 100644 Binary files a/docs/en_US/images/preferences_storage_options.png and b/docs/en_US/images/preferences_storage_options.png differ diff --git a/docs/en_US/preferences.rst b/docs/en_US/preferences.rst index c2d6105ff..6ffa959e8 100644 --- a/docs/en_US/preferences.rst +++ b/docs/en_US/preferences.rst @@ -11,9 +11,7 @@ The left pane of the *Preferences* dialog displays a tree control; each node of the tree control provides access to options that are related to the node under which they are displayed. -* Use the plus sign (+) to the left of a node name to expand a segment of the - tree control. -* Use the minus sign (-) to the left of a node name to close that node. +* Click the *Reset all preferences* button to restore all preferences to their default values. The Browser Node **************** diff --git a/web/pgadmin/preferences/__init__.py b/web/pgadmin/preferences/__init__.py index 8ec7c259c..bfd1125b7 100644 --- a/web/pgadmin/preferences/__init__.py +++ b/web/pgadmin/preferences/__init__.py @@ -320,3 +320,17 @@ def update(): data={'data': 'Success'}, status=200 ) + + +@blueprint.route("/", methods=['DELETE'], endpoint="reset_prefs") +@pga_login_required +def reset(): + """ + Reset preferences to default + """ + res, msg = Preferences.reset() + + if not res: + return internal_server_error(errormsg=msg) + + return success_return() diff --git a/web/pgadmin/preferences/static/js/components/PreferencesComponent.jsx b/web/pgadmin/preferences/static/js/components/PreferencesComponent.jsx index 400fc9337..ab6d4aac2 100644 --- a/web/pgadmin/preferences/static/js/components/PreferencesComponent.jsx +++ b/web/pgadmin/preferences/static/js/components/PreferencesComponent.jsx @@ -20,6 +20,7 @@ import getApiInstance from '../../../../static/js/api_instance'; import CloseSharpIcon from '@mui/icons-material/CloseSharp'; import HelpIcon from '@mui/icons-material/HelpRounded'; import SaveSharpIcon from '@mui/icons-material/SaveSharp'; +import SettingsBackupRestoreIcon from'@mui/icons-material/SettingsBackupRestore'; import pgAdmin from 'sources/pgadmin'; import { DefaultButton, PgIconButton, PrimaryButton } from '../../../../static/js/components/Buttons'; import BaseUISchema from 'sources/SchemaView/base_schema.ui'; @@ -589,6 +590,64 @@ export default function PreferencesComponent({ ...props }) { window.open(url_for('help.static', { 'filename': 'preferences.html' }), 'pgadmin_help'); }; + const reset = () => { + pgAdmin.Browser.notifier.confirm( + gettext('Reset all preferences'), + `${gettext('All preferences will be reset to their default values.')}

${gettext('Do you want to proceed?')}

+ ${gettext('Note:')}
`, + function () {}, + function () {}, + '', + 'Cancel', + function (closeModal) { + return [ + { + type: 'default', + icon: , + label: gettext('Save & Reload'), + onclick: () => { + resetPrefsToDefault(true); + closeModal(); + } + }, { + type: 'primary', + icon: , + label: gettext('Save & Reload Later'), + onclick: () => { + resetPrefsToDefault(false); + closeModal(); + } + } + ]; + } + ); + }; + + const resetPrefsToDefault = (refresh = false) => { + api({ + url: url_for('preferences.index'), + method: 'DELETE' + }).then(()=>{ + if (refresh){ + location.reload(); + return true; + } + preferencesStore.cache(); + pgAdmin.Browser.tree.destroy().then( + () => { + pgAdmin.Browser.Events.trigger( + 'pgadmin-browser:tree:destroyed', undefined, undefined + ); + return true; + } + ); + props.closeModal(); + }).catch((err) => { + pgAdmin.Browser.notifier.alert(err.response.data); + }); + }; + return ( @@ -615,6 +674,9 @@ export default function PreferencesComponent({ ...props }) { } title={gettext('Help for this dialog.')} /> + }> + {gettext('Reset all preferences')} + { props.closeModal();}} startIcon={ { props.closeModal();}} />}> {gettext('Cancel')} diff --git a/web/pgadmin/static/js/helpers/ModalProvider.jsx b/web/pgadmin/static/js/helpers/ModalProvider.jsx index 1f114b18c..eff6eb733 100644 --- a/web/pgadmin/static/js/helpers/ModalProvider.jsx +++ b/web/pgadmin/static/js/helpers/ModalProvider.jsx @@ -41,7 +41,18 @@ export function useModal() { return React.useContext(ModalContext); } -function AlertContent({ text, confirm, okLabel = gettext('OK'), cancelLabel = gettext('Cancel'), onOkClick, onCancelClick }) { +function renderExtraButtons(button) { + switch(button.type) { + case 'primary': + return {button.label}; + case 'default': + return {button.label}; + default: + return {button.label}; + }; +} + +function AlertContent({ text, confirm, okLabel = gettext('OK'), cancelLabel = gettext('Cancel'), onOkClick, onCancelClick, extraButtons }) { return ( {typeof (text) == 'string' ? HTMLReactParser(text) : text} @@ -49,7 +60,12 @@ function AlertContent({ text, confirm, okLabel = gettext('OK'), cancelLabel = ge {confirm && } onClick={onCancelClick} >{cancelLabel} } - } onClick={onOkClick} autoFocus={true} >{okLabel} + { + extraButtons?.length ? + extraButtons.map(button=>renderExtraButtons(button)) + : + } onClick={onOkClick} autoFocus={true} >{okLabel} + } ); @@ -61,6 +77,7 @@ AlertContent.propTypes = { onCancelClick: PropTypes.func, okLabel: PropTypes.string, cancelLabel: PropTypes.string, + extraButtons: PropTypes.array }; function alert(title, text, onOkClick, okLabel = gettext('OK')) { @@ -76,7 +93,7 @@ function alert(title, text, onOkClick, okLabel = gettext('OK')) { }); } -function confirm(title, text, onOkClick, onCancelClick, okLabel = gettext('Yes'), cancelLabel = gettext('No')) { +function confirm(title, text, onOkClick, onCancelClick, okLabel = gettext('Yes'), cancelLabel = gettext('No'), extras = null) { // bind the modal provider before calling this.showModal(title, (closeModal) => { const onCancelClickClose = () => { @@ -87,8 +104,9 @@ function confirm(title, text, onOkClick, onCancelClick, okLabel = gettext('Yes') onOkClick?.(); closeModal(); }; + const extraButtons = extras?.(closeModal); return ( - + ); }); } diff --git a/web/pgadmin/static/js/helpers/Notifier.jsx b/web/pgadmin/static/js/helpers/Notifier.jsx index c502839bf..0839708be 100644 --- a/web/pgadmin/static/js/helpers/Notifier.jsx +++ b/web/pgadmin/static/js/helpers/Notifier.jsx @@ -175,10 +175,10 @@ class Notifier { this.modal.alert(title, text, onOkClick, okLabel); } - confirm(title, text, onOkClick, onCancelClick, okLabel=gettext('Yes'), cancelLabel=gettext('No')) { + confirm(title, text, onOkClick, onCancelClick, okLabel=gettext('Yes'), cancelLabel=gettext('No'), extras=null) { /* Use this if you want to use pgAdmin global notifier. Or else, if you want to use modal inside iframe only then use ModalProvider eg- query tool */ - this.modal.confirm(title, text, onOkClick, onCancelClick, okLabel, cancelLabel); + this.modal.confirm(title, text, onOkClick, onCancelClick, okLabel, cancelLabel, extras); } showModal(title, content, modalOptions) { diff --git a/web/pgadmin/utils/preferences.py b/web/pgadmin/utils/preferences.py index 3416c1a78..a8432f1ac 100644 --- a/web/pgadmin/utils/preferences.py +++ b/web/pgadmin/utils/preferences.py @@ -694,3 +694,20 @@ class Preferences(): pref.value = converter_func(pref.value) db.session.commit() + + @classmethod + def reset(cls): + """ + reset + Reset the preferences for the current user in the configuration table. + """ + try: + db.session.query(UserPrefTable).filter( + UserPrefTable.uid == current_user.id).delete() + db.session.commit() + except Exception as e: + db.session.rollback() + current_app.logger.exception(e) + return False, str(e) + + return True, None