From 73d780423cf6ecfe1f655bd1e806a9b474be0b24 Mon Sep 17 00:00:00 2001 From: pravesh-sharma Date: Tue, 27 Aug 2024 13:30:34 +0530 Subject: [PATCH] Added feature to reset the preferences to default values. #1900 --- web/pgadmin/preferences/__init__.py | 14 +++++++ .../js/components/PreferencesComponent.jsx | 37 +++++++++++++++++++ .../static/js/helpers/ModalProvider.jsx | 14 +++++-- web/pgadmin/static/js/helpers/Notifier.jsx | 4 +- web/pgadmin/utils/preferences.py | 17 +++++++++ 5 files changed, 80 insertions(+), 6 deletions(-) diff --git a/web/pgadmin/preferences/__init__.py b/web/pgadmin/preferences/__init__.py index 8ec7c259cdd..bfd1125b713 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 400fc933792..5a9ac399081 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,39 @@ export default function PreferencesComponent({ ...props }) { window.open(url_for('help.static', { 'filename': 'preferences.html' }), 'pgadmin_help'); }; + const reset = () => { + pgAdmin.Browser.notifier.confirm( + gettext('Reset preferences'), + gettext('All the preferences will be reset to default. Object explorer tree will be automatically refreshed to reflect the changes.') + + gettext('Please note, an app reload is required to change the language of the application. You may decide to reload later.') + '
' + '
' + + gettext('Do you want to proceed?'), + function () {}, + function () {}, + '', + 'Cancel', + [ + resetPrefsToDefault(true)} startIcon={}>{gettext('Save & Reload')}, + resetPrefsToDefault(false)} startIcon={} autoFocus={true} >{gettext('Save & Reload Later')} + ] + ); + }; + + const resetPrefsToDefault = (refresh = false) => { + api({ + url: url_for('preferences.index'), + method: 'DELETE' + }).then(()=>{ + if (refresh){ + location.reload(); + return true; + } + preferencesStore.cache(); + props.closeModal(); + }).catch((err) => { + pgAdmin.Browser.notifier.alert(err.response.data); + }); + }; + return ( @@ -618,6 +652,9 @@ export default function PreferencesComponent({ ...props }) { { props.closeModal();}} startIcon={ { props.closeModal();}} />}> {gettext('Cancel')} + }> + {gettext('Reset to default')} + } disabled={disableSave} onClick={() => { savePreferences(prefChangedData, initValues); }}> {gettext('Save')} diff --git a/web/pgadmin/static/js/helpers/ModalProvider.jsx b/web/pgadmin/static/js/helpers/ModalProvider.jsx index 1f114b18cba..2625d29756a 100644 --- a/web/pgadmin/static/js/helpers/ModalProvider.jsx +++ b/web/pgadmin/static/js/helpers/ModalProvider.jsx @@ -41,7 +41,7 @@ export function useModal() { return React.useContext(ModalContext); } -function AlertContent({ text, confirm, okLabel = gettext('OK'), cancelLabel = gettext('Cancel'), onOkClick, onCancelClick }) { +function AlertContent({ text, confirm, okLabel = gettext('OK'), cancelLabel = gettext('Cancel'), onOkClick, onCancelClick, extraButtons }) { return ( {typeof (text) == 'string' ? HTMLReactParser(text) : text} @@ -49,7 +49,11 @@ function AlertContent({ text, confirm, okLabel = gettext('OK'), cancelLabel = ge {confirm && } onClick={onCancelClick} >{cancelLabel} } - } onClick={onOkClick} autoFocus={true} >{okLabel} + { + extraButtons.length ? + extraButtons : + } onClick={onOkClick} autoFocus={true} >{okLabel} + } ); @@ -61,6 +65,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 +81,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'), extraButtons = []) { // bind the modal provider before calling this.showModal(title, (closeModal) => { const onCancelClickClose = () => { @@ -87,8 +92,9 @@ function confirm(title, text, onOkClick, onCancelClick, okLabel = gettext('Yes') onOkClick?.(); closeModal(); }; + extraButtons = extraButtons?.map(button=>React.cloneElement(button, { onClick:()=>{closeModal(); button.props.onClick();}})); return ( - + ); }); } diff --git a/web/pgadmin/static/js/helpers/Notifier.jsx b/web/pgadmin/static/js/helpers/Notifier.jsx index c502839bfee..14581678a54 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'), extraButtons=[]) { /* 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, extraButtons); } showModal(title, content, modalOptions) { diff --git a/web/pgadmin/utils/preferences.py b/web/pgadmin/utils/preferences.py index 3416c1a78fd..a8432f1ac13 100644 --- a/web/pgadmin/utils/preferences.py +++ b/web/pgadmin/utils/preferences.py @@ -694,3 +694,20 @@ def migrate_user_preferences(self, pid, converter_func): 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