From 53887c32bf1f76c6b144018b6559402e57e0eb9b Mon Sep 17 00:00:00 2001 From: Akshay Joshi Date: Fri, 5 Aug 2022 14:05:53 +0530 Subject: [PATCH] Port change ownership dialog to React. Fixes #7590 --- docs/en_US/images/password.png | Bin 38311 -> 43346 bytes docs/en_US/release_notes_6_13.rst | 1 + .../browser/server_groups/servers/__init__.py | 2 +- .../servers/databases/static/js/database.js | 2 +- .../server_groups/servers/static/js/server.js | 2 +- web/pgadmin/browser/static/js/browser.js | 2 +- .../js/Dialogs/ChangeOwnershipContent.jsx | 88 +++++ .../js/Dialogs}/ChangePassowrdContent.jsx | 5 +- .../js/Dialogs}/ConnectServerContent.jsx | 6 +- .../js/Dialogs}/MasterPassowrdContent.jsx | 6 +- .../js/Dialogs}/NamedRestoreContent.jsx | 6 +- .../js/Dialogs/index.jsx} | 211 +++++++----- .../static/js/helpers/ModalProvider.jsx | 4 +- .../schema_diff/static/js/schema_diff_ui.js | 2 +- .../js/components/QueryToolComponent.jsx | 6 +- .../dialogs/NewConnectionDialog.jsx | 2 +- web/pgadmin/tools/user_management/__init__.py | 3 - .../static/js/user_management.js | 306 ++---------------- 18 files changed, 264 insertions(+), 390 deletions(-) create mode 100644 web/pgadmin/static/js/Dialogs/ChangeOwnershipContent.jsx rename web/pgadmin/{browser/static/js => static/js/Dialogs}/ChangePassowrdContent.jsx (95%) rename web/pgadmin/{browser/static/js => static/js/Dialogs}/ConnectServerContent.jsx (96%) rename web/pgadmin/{browser/static/js => static/js/Dialogs}/MasterPassowrdContent.jsx (94%) rename web/pgadmin/{browser/static/js => static/js/Dialogs}/NamedRestoreContent.jsx (92%) rename web/pgadmin/{browser/static/js/password_dialogs.jsx => static/js/Dialogs/index.jsx} (64%) diff --git a/docs/en_US/images/password.png b/docs/en_US/images/password.png index ffaa63c01de1dafd0f8d80114646063021700590..84ce936c5c9171c73be42c93f609c2e4adc0b4d0 100644 GIT binary patch literal 43346 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 KXjW<1M*I&#YPuBw literal 38311 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�%0P1L2aQnGMqb7`-o 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 diff --git a/docs/en_US/release_notes_6_13.rst b/docs/en_US/release_notes_6_13.rst index 76b1d2b08..5647d9fe7 100644 --- a/docs/en_US/release_notes_6_13.rst +++ b/docs/en_US/release_notes_6_13.rst @@ -15,6 +15,7 @@ Housekeeping ************ | `Issue #7567 `_ - Port About dialog to React. + | `Issue #7590 `_ - Port change ownership dialog to React. | `Issue #7595 `_ - Update the container base image to Alpine 3.16 (with Python 3.10.5). Bug fixes diff --git a/web/pgadmin/browser/server_groups/servers/__init__.py b/web/pgadmin/browser/server_groups/servers/__init__.py index 55008728d..62afc31c5 100644 --- a/web/pgadmin/browser/server_groups/servers/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/__init__.py @@ -967,7 +967,7 @@ class ServerNode(PGChildNodeView): 'shared': server.shared if config.SERVER_MODE else None, 'username': server.username, 'gid': str(server.servergroup_id), - 'group-name': sg.name, + 'group-name': sg.name if (sg and sg.name) else gettext('Servers'), 'comment': server.comment, 'role': server.role, 'connected': connected, diff --git a/web/pgadmin/browser/server_groups/servers/databases/static/js/database.js b/web/pgadmin/browser/server_groups/servers/databases/static/js/database.js index babc611a5..f405c170d 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/static/js/database.js +++ b/web/pgadmin/browser/server_groups/servers/databases/static/js/database.js @@ -12,7 +12,7 @@ import { getNodePrivilegeRoleSchema } from '../../../static/js/privilege.ui'; import { getNodeVariableSchema } from '../../../static/js/variable.ui'; import DatabaseSchema from './database.ui'; import Notify from '../../../../../../static/js/helpers/Notifier'; -import { showServerPassword } from '../../../../../static/js/password_dialogs'; +import { showServerPassword } from '../../../../../../static/js/Dialogs/index'; define('pgadmin.node.database', [ 'sources/gettext', 'sources/url_for', 'jquery', 'underscore', diff --git a/web/pgadmin/browser/server_groups/servers/static/js/server.js b/web/pgadmin/browser/server_groups/servers/static/js/server.js index 3b982acbd..21ad46732 100644 --- a/web/pgadmin/browser/server_groups/servers/static/js/server.js +++ b/web/pgadmin/browser/server_groups/servers/static/js/server.js @@ -10,7 +10,7 @@ import { getNodeListById } from '../../../../static/js/node_ajax'; import ServerSchema from './server.ui'; import Notify from '../../../../../static/js/helpers/Notifier'; -import { showServerPassword, showChangeServerPassword, showNamedRestorePoint } from '../../../../static/js/password_dialogs'; +import { showServerPassword, showChangeServerPassword, showNamedRestorePoint } from '../../../../../static/js/Dialogs/index'; define('pgadmin.node.server', [ 'sources/gettext', 'sources/url_for', 'jquery', 'underscore', diff --git a/web/pgadmin/browser/static/js/browser.js b/web/pgadmin/browser/static/js/browser.js index 53d58c253..60e081463 100644 --- a/web/pgadmin/browser/static/js/browser.js +++ b/web/pgadmin/browser/static/js/browser.js @@ -9,7 +9,7 @@ import { generateNodeUrl } from './node_ajax'; import Notify, {initializeModalProvider, initializeNotifier} from '../../../static/js/helpers/Notifier'; -import { checkMasterPassword } from './password_dialogs'; +import { checkMasterPassword } from '../../../static/js/Dialogs/index'; define('pgadmin.browser', [ 'sources/gettext', 'sources/url_for', 'require', 'jquery', 'underscore', diff --git a/web/pgadmin/static/js/Dialogs/ChangeOwnershipContent.jsx b/web/pgadmin/static/js/Dialogs/ChangeOwnershipContent.jsx new file mode 100644 index 000000000..7590854cd --- /dev/null +++ b/web/pgadmin/static/js/Dialogs/ChangeOwnershipContent.jsx @@ -0,0 +1,88 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2022, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +import { makeStyles } from '@material-ui/core'; +import React from 'react'; +import PropTypes from 'prop-types'; +import gettext from 'sources/gettext'; +import BaseUISchema from '../SchemaView/base_schema.ui'; +import SchemaView from '../SchemaView'; +import { isEmptyString } from 'sources/validators'; + +class ChangeOwnershipSchema extends BaseUISchema { + constructor(deletedUser, adminUserList, noOfSharedServers) { + super({ + newUser: '', + }); + this.deletedUser = deletedUser; + this.adminUserList = adminUserList; + this.noOfSharedServers = noOfSharedServers; + } + + get baseFields() { + let self = this; + return [ + { + id: 'note', type: 'note', + text: gettext('Select the user that will take ownership of the shared servers created by ' + self.deletedUser + '. ' + self.noOfSharedServers + ' shared servers are currently owned by this user.'), + }, { + id: 'newUser', label: gettext('User'), + type: 'select', controlProps: {allowClear: true}, + options: self.adminUserList, + helpMessage: gettext('Note: If no user is selected, the shared servers will be deleted.') + } + ]; + } + validate(state) { + let obj = this; + + /* mview definition validation*/ + if (isEmptyString(state.newUser)) { + obj.warningText = gettext('The shared servers owned by '+ obj.deletedUser +' will be deleted. Do you wish to continue?'); + } else { + obj.warningText = null; + } + } +} + +const useStyles = makeStyles((theme)=>({ + root: { + ...theme.mixins.tabPanel, + }, +})); + +export default function ChangeOwnershipContent({onSave, onClose, deletedUser, userList, noOfSharedServers}) { + const classes = useStyles(); + const objChangeOwnership = new ChangeOwnershipSchema(deletedUser, userList, noOfSharedServers); + + return { /*This is intentional (SonarQube)*/ }} + schema={objChangeOwnership} + viewHelperProps={{ + mode: 'create', + }} + customSaveBtnName={'Change'} + onSave={onSave} + onClose={onClose} + hasSQL={false} + disableSqlHelp={true} + disableDialogHelp={true} + isTabView={false} + formClassName={classes.root} + />; +} +ChangeOwnershipContent.propTypes = { + onSave: PropTypes.func, + onClose: PropTypes.func, + currentUser: PropTypes.string, + userList: PropTypes.array, + noOfSharedServers: PropTypes.number, + deletedUser: PropTypes.string +}; diff --git a/web/pgadmin/browser/static/js/ChangePassowrdContent.jsx b/web/pgadmin/static/js/Dialogs/ChangePassowrdContent.jsx similarity index 95% rename from web/pgadmin/browser/static/js/ChangePassowrdContent.jsx rename to web/pgadmin/static/js/Dialogs/ChangePassowrdContent.jsx index 82ea576b3..3efb6dbe7 100644 --- a/web/pgadmin/browser/static/js/ChangePassowrdContent.jsx +++ b/web/pgadmin/static/js/Dialogs/ChangePassowrdContent.jsx @@ -11,8 +11,8 @@ import { makeStyles } from '@material-ui/core'; import React from 'react'; import PropTypes from 'prop-types'; import gettext from 'sources/gettext'; -import BaseUISchema from '../../../static/js/SchemaView/base_schema.ui'; -import SchemaView from '../../../static/js/SchemaView'; +import BaseUISchema from '../SchemaView/base_schema.ui'; +import SchemaView from '../SchemaView'; class ChangePasswordSchema extends BaseUISchema { constructor(user, isPgpassFileUsed) { @@ -82,6 +82,7 @@ export default function ChangePasswordContent({onSave, onClose, userName, isPgpa viewHelperProps={{ mode: 'create', }} + customSaveBtnName={'Change'} onSave={onSave} onClose={onClose} hasSQL={false} diff --git a/web/pgadmin/browser/static/js/ConnectServerContent.jsx b/web/pgadmin/static/js/Dialogs/ConnectServerContent.jsx similarity index 96% rename from web/pgadmin/browser/static/js/ConnectServerContent.jsx rename to web/pgadmin/static/js/Dialogs/ConnectServerContent.jsx index eba8f3a3c..fa541531f 100644 --- a/web/pgadmin/browser/static/js/ConnectServerContent.jsx +++ b/web/pgadmin/static/js/Dialogs/ConnectServerContent.jsx @@ -10,12 +10,12 @@ import React, { useState, useRef, useEffect } from 'react'; import gettext from 'sources/gettext'; import { Box } from '@material-ui/core'; -import { DefaultButton, PrimaryButton } from '../../../static/js/components/Buttons'; +import { DefaultButton, PrimaryButton } from '../components/Buttons'; import CloseIcon from '@material-ui/icons/CloseRounded'; import CheckRoundedIcon from '@material-ui/icons/CheckRounded'; import PropTypes from 'prop-types'; -import { useModalStyles } from '../../../static/js/helpers/ModalProvider'; -import { FormFooterMessage, InputCheckbox, InputText, MESSAGE_TYPE } from '../../../static/js/components/FormComponents'; +import { useModalStyles } from '../helpers/ModalProvider'; +import { FormFooterMessage, InputCheckbox, InputText, MESSAGE_TYPE } from '../components/FormComponents'; export default function ConnectServerContent({closeModal, data, onOK, setHeight}) { const classes = useModalStyles(); diff --git a/web/pgadmin/browser/static/js/MasterPassowrdContent.jsx b/web/pgadmin/static/js/Dialogs/MasterPassowrdContent.jsx similarity index 94% rename from web/pgadmin/browser/static/js/MasterPassowrdContent.jsx rename to web/pgadmin/static/js/Dialogs/MasterPassowrdContent.jsx index 8e588ed28..3166616b3 100644 --- a/web/pgadmin/browser/static/js/MasterPassowrdContent.jsx +++ b/web/pgadmin/static/js/Dialogs/MasterPassowrdContent.jsx @@ -18,9 +18,9 @@ import DeleteForeverIcon from '@material-ui/icons/DeleteForever'; import CheckRoundedIcon from '@material-ui/icons/CheckRounded'; import HelpIcon from '@material-ui/icons/Help'; -import { DefaultButton, PrimaryButton, PgIconButton } from '../../../static/js/components/Buttons'; -import { useModalStyles } from '../../../static/js/helpers/ModalProvider'; -import { FormFooterMessage, InputText, MESSAGE_TYPE } from '../../../static/js/components/FormComponents'; +import { DefaultButton, PrimaryButton, PgIconButton } from '../components/Buttons'; +import { useModalStyles } from '../helpers/ModalProvider'; +import { FormFooterMessage, InputText, MESSAGE_TYPE } from '../components/FormComponents'; export default function MasterPasswordContent({ closeModal, onResetPassowrd, onOK, onCancel, setHeight, isPWDPresent, data}) { const classes = useModalStyles(); diff --git a/web/pgadmin/browser/static/js/NamedRestoreContent.jsx b/web/pgadmin/static/js/Dialogs/NamedRestoreContent.jsx similarity index 92% rename from web/pgadmin/browser/static/js/NamedRestoreContent.jsx rename to web/pgadmin/static/js/Dialogs/NamedRestoreContent.jsx index 687783713..1d89df1b5 100644 --- a/web/pgadmin/browser/static/js/NamedRestoreContent.jsx +++ b/web/pgadmin/static/js/Dialogs/NamedRestoreContent.jsx @@ -10,12 +10,12 @@ import React, { useState, useRef, useEffect } from 'react'; import gettext from 'sources/gettext'; import { Box } from '@material-ui/core'; -import { DefaultButton, PrimaryButton } from '../../../static/js/components/Buttons'; +import { DefaultButton, PrimaryButton } from '../components/Buttons'; import CloseIcon from '@material-ui/icons/CloseRounded'; import CheckRoundedIcon from '@material-ui/icons/CheckRounded'; import PropTypes from 'prop-types'; -import { useModalStyles } from '../../../static/js/helpers/ModalProvider'; -import { InputText } from '../../../static/js/components/FormComponents'; +import { useModalStyles } from '../helpers/ModalProvider'; +import { InputText } from '../components/FormComponents'; import { isEmptyString } from '../../../static/js/validators'; export default function NamedRestoreContent({closeModal, onOK, setHeight}) { diff --git a/web/pgadmin/browser/static/js/password_dialogs.jsx b/web/pgadmin/static/js/Dialogs/index.jsx similarity index 64% rename from web/pgadmin/browser/static/js/password_dialogs.jsx rename to web/pgadmin/static/js/Dialogs/index.jsx index 4fd1eabfe..d66a7d02f 100644 --- a/web/pgadmin/browser/static/js/password_dialogs.jsx +++ b/web/pgadmin/static/js/Dialogs/index.jsx @@ -15,29 +15,51 @@ import Theme from 'sources/Theme'; import url_for from 'sources/url_for'; import gettext from 'sources/gettext'; -import getApiInstance from '../../../static/js/api_instance'; +import getApiInstance from '../api_instance'; +import Notify from '../helpers/Notifier'; import MasterPasswordContent from './MasterPassowrdContent'; import ChangePasswordContent from './ChangePassowrdContent'; import NamedRestoreContent from './NamedRestoreContent'; -import Notify from '../../../static/js/helpers/Notifier'; +import ChangeOwnershipContent from './ChangeOwnershipContent'; -function setNewSize(panel, width, height) { - // Add height of the header - let newHeight = height + 31; - // Set min and max size of the panel - panel.minSize(width, newHeight); - panel.maxSize(width, newHeight); - panel.maximisable(false); - /* No other way to update size, below is the only way */ - panel._parent._size.x = width; - panel._parent._size.y = newHeight; - panel._parent.__update(); +function mountDialog(title, getDialogContent, docker=undefined) { + // Register dialog panel + var panel; + if (docker) { + pgAdmin.Browser.Node.registerUtilityPanel(docker); + panel = pgAdmin.Browser.Node.addUtilityPanel(pgAdmin.Browser.stdW.md, undefined, docker); + } else { + pgAdmin.Browser.Node.registerUtilityPanel(); + panel = pgAdmin.Browser.Node.addUtilityPanel(pgAdmin.Browser.stdW.md); + } + + var j = panel.$container.find('.obj_properties').first(); + panel.title(title); + + const onClose = ()=> { + ReactDOM.unmountComponentAtNode(j[0]); + panel.close(); + }; + + const setNewSize = (width, height)=> { + // Add height of the header + let newHeight = height + 31; + // Set min and max size of the panel + panel.minSize(width, newHeight); + panel.maxSize(width, newHeight); + panel.maximisable(false); + /* No other way to update size, below is the only way */ + panel._parent._size.x = width; + panel._parent._size.y = newHeight; + panel._parent.__update(); + }; + + ReactDOM.render(getDialogContent(onClose, setNewSize), j[0]); } // This functions is used to show the connect server password dialog. export function showServerPassword() { - var pgBrowser = pgAdmin.Browser, - title = arguments[0], + var title = arguments[0], formJson = arguments[1], nodeObj = arguments[2], nodeData = arguments[3], @@ -47,20 +69,14 @@ export function showServerPassword() { onSuccess = arguments[7], onFailure = arguments[8]; - // Register dialog panel - pgBrowser.Node.registerUtilityPanel(); - var panel = pgBrowser.Node.addUtilityPanel(pgBrowser.stdW.md), - j = panel.$container.find('.obj_properties').first(); - panel.title(title); - - ReactDOM.render( - + mountDialog(title, (onClose, setNewSize)=> { + return { - setNewSize(panel, pgBrowser.stdW.md, containerHeight); + setNewSize(pgAdmin.Browser.stdW.md, containerHeight); }} closeModal={()=>{ - panel.close(); + onClose(); }} data={formJson} onOK={(formData)=>{ @@ -74,7 +90,7 @@ export function showServerPassword() { api.post(_url, formData) .then(res=>{ - panel.close(); + onClose(); return onSuccess( res.data, nodeObj, nodeData, treeNodeInfo, itemNodeData, status ); @@ -87,14 +103,14 @@ export function showServerPassword() { }); }} /> - , j[0]); + ; + }); } // This functions is used to show the connect server password dialog when // launch from Schema Diff tool. export function showSchemaDiffServerPassword() { - var pgBrowser = pgAdmin.Browser, - docker = arguments[0], + var docker = arguments[0], title = arguments[1], formJson = arguments[2], serverID = arguments[3], @@ -102,20 +118,14 @@ export function showSchemaDiffServerPassword() { onSuccess = arguments[5], onFailure = arguments[6]; - // Register dialog panel - pgBrowser.Node.registerUtilityPanel(docker); - var panel = pgBrowser.Node.addUtilityPanel(pgBrowser.stdW.md, undefined, docker), - j = panel.$container.find('.obj_properties').first(); - panel.title(title); - - ReactDOM.render( - + mountDialog(title, (onClose, setNewSize)=> { + return { - setNewSize(panel, pgBrowser.stdW.md, containerHeight); + setNewSize(pgAdmin.Browser.stdW.md, containerHeight); }} closeModal={()=>{ - panel.close(); + onClose(); }} data={formJson} onOK={(formData)=>{ @@ -124,7 +134,7 @@ export function showSchemaDiffServerPassword() { api.post(_url, formData) .then(res=>{ - panel.close(); + onClose(); return onSuccess(res.data, successCallback); }) .catch((err)=>{ @@ -134,7 +144,8 @@ export function showSchemaDiffServerPassword() { }); }} /> - , j[0]); + ; + }, docker); } function masterPassCallbacks(masterpass_callback_queue) { @@ -160,26 +171,18 @@ export function checkMasterPassword(data, masterpass_callback_queue, cancel_call // This functions is used to show the master password dialog. export function showMasterPassword(isPWDPresent, errmsg=null, masterpass_callback_queue, cancel_callback) { const api = getApiInstance(); - var pgBrowser = pgAdmin.Browser; - - // Register dialog panel - pgBrowser.Node.registerUtilityPanel(); - var panel = pgBrowser.Node.addUtilityPanel(pgBrowser.stdW.md), - j = panel.$container.find('.obj_properties').first(); - let title = isPWDPresent ? gettext('Unlock Saved Passwords') : gettext('Set Master Password'); - panel.title(title); - ReactDOM.render( - + mountDialog(title, (onClose, setNewSize)=> { + return { - setNewSize(panel, pgBrowser.stdW.md, containerHeight); + setNewSize(pgAdmin.Browser.stdW.md, containerHeight); }} closeModal={() => { - panel.close(); + onClose(); }} onResetPassowrd={()=>{ Notify.confirm(gettext('Reset Master Password'), @@ -190,7 +193,7 @@ export function showMasterPassword(isPWDPresent, errmsg=null, masterpass_callbac api.delete(_url) .then(() => { - panel.close(); + onClose(); showMasterPassword(false, null, masterpass_callback_queue, cancel_callback); }) .catch((err) => { @@ -205,32 +208,26 @@ export function showMasterPassword(isPWDPresent, errmsg=null, masterpass_callbac cancel_callback?.(); }} onOK={(formData) => { - panel.close(); + onClose(); checkMasterPassword(formData, masterpass_callback_queue, cancel_callback); }} /> - , j[0]); + ; + }); } export function showChangeServerPassword() { - var pgBrowser = pgAdmin.Browser, - title = arguments[0], + var title = arguments[0], nodeData = arguments[1], nodeObj = arguments[2], itemNodeData = arguments[3], isPgPassFileUsed = arguments[4]; - // Register dialog panel - pgBrowser.Node.registerUtilityPanel(); - var panel = pgBrowser.Node.addUtilityPanel(pgBrowser.stdW.md), - j = panel.$container.find('.obj_properties').first(); - panel.title(title); - - ReactDOM.render( - + mountDialog(title, (onClose)=> { + return { - panel.close(); + onClose(); }} onSave={(isNew, data)=>{ return new Promise((resolve, reject)=>{ @@ -251,7 +248,7 @@ export function showChangeServerPassword() { } resolve(respData.data); - panel.close(); + onClose(); }) .catch((error)=>{ reject(error); @@ -261,30 +258,24 @@ export function showChangeServerPassword() { userName={nodeData.user.name} isPgpassFileUsed={isPgPassFileUsed} /> - , j[0]); + ; + }); } export function showNamedRestorePoint() { - var pgBrowser = pgAdmin.Browser, - title = arguments[0], + var title = arguments[0], nodeData = arguments[1], nodeObj = arguments[2], itemNodeData = arguments[3]; - // Register dialog panel - pgBrowser.Node.registerUtilityPanel(); - var panel = pgBrowser.Node.addUtilityPanel(pgBrowser.stdW.md), - j = panel.$container.find('.obj_properties').first(); - panel.title(title); - - ReactDOM.render( - + mountDialog(title, (onClose, setNewSize)=> { + return { - setNewSize(panel, pgBrowser.stdW.md, containerHeight); + setNewSize(pgAdmin.Browser.stdW.md, containerHeight); }} closeModal={()=>{ - panel.close(); + onClose(); }} onOK={(formData)=>{ const api = getApiInstance(); @@ -292,7 +283,7 @@ export function showNamedRestorePoint() { api.post(_url, formData) .then(res=>{ - panel.close(); + onClose(); Notify.success(res.data.data.result); }) .catch(function(xhr, status, error) { @@ -300,5 +291,59 @@ export function showNamedRestorePoint() { }); }} /> - , j[0]); + ; + }); +} + +export function showChangeOwnership() { + var title = arguments[0], + userList = arguments[1], + noOfSharedServers = arguments[2], + deletedUser = arguments[3], + destroyUserManagement = arguments[4]; + + // Render Preferences component + Notify.showModal(title, (onClose) => { + return { + onClose(); + }} + onSave={(isNew, data)=>{ + const api = getApiInstance(); + + return new Promise((resolve, reject)=>{ + if (data.newUser == '') { + api.delete(url_for('user_management.user', {uid: deletedUser['uid']})) + .then(() => { + Notify.success(gettext('User deleted.')); + onClose(); + destroyUserManagement(); + resolve(); + }) + .catch((err)=>{ + Notify.error(err); + reject(err); + }); + } else { + let newData = {'new_owner': `${data.newUser}`, 'old_owner': `${deletedUser['uid']}`}; + api.post(url_for('user_management.change_owner'), newData) + .then(({data: respData})=>{ + Notify.success(gettext(respData.info)); + onClose(); + destroyUserManagement(); + resolve(respData.data); + }) + .catch((err)=>{ + reject(err); + }); + } + }); + }} + userList = {userList} + noOfSharedServers = {noOfSharedServers} + deletedUser = {deletedUser['name']} + />; + }, + { isFullScreen: false, isResizeable: true, showFullScreen: true, isFullWidth: true, + dialogWidth: pgAdmin.Browser.stdW.md, dialogHeight: pgAdmin.Browser.stdH.md}); } \ No newline at end of file diff --git a/web/pgadmin/static/js/helpers/ModalProvider.jsx b/web/pgadmin/static/js/helpers/ModalProvider.jsx index 50347cbf5..7490f685b 100644 --- a/web/pgadmin/static/js/helpers/ModalProvider.jsx +++ b/web/pgadmin/static/js/helpers/ModalProvider.jsx @@ -8,7 +8,7 @@ ////////////////////////////////////////////////////////////// import { Box, Dialog, DialogContent, DialogTitle, makeStyles, Paper } from '@material-ui/core'; -import React, { useState } from 'react'; +import React, { useState, useMemo } from 'react'; import clsx from 'clsx'; import { getEpoch } from 'sources/utils'; import { DefaultButton, PgIconButton, PrimaryButton } from '../components/Buttons'; @@ -296,7 +296,7 @@ function ModalContainer({ id, title, content, dialogHeight, dialogWidth, onClose - {content(closeModal)} + {useMemo(()=>{ return content(closeModal); }, [])} ); diff --git a/web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js b/web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js index dcb15e2ff..b5d75accc 100644 --- a/web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js +++ b/web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js @@ -19,7 +19,7 @@ import 'pgadmin.tools.sqleditor'; import pgWindow from 'sources/window'; import _ from 'underscore'; import Notify from '../../../../static/js/helpers/Notifier'; -import { showSchemaDiffServerPassword } from '../../../../browser/static/js/password_dialogs'; +import { showSchemaDiffServerPassword } from '../../../../static/js/Dialogs/index'; import { SchemaDiffSelect2Control, SchemaDiffHeaderView, diff --git a/web/pgadmin/tools/sqleditor/static/js/components/QueryToolComponent.jsx b/web/pgadmin/tools/sqleditor/static/js/components/QueryToolComponent.jsx index 86966c73b..7b49e8938 100644 --- a/web/pgadmin/tools/sqleditor/static/js/components/QueryToolComponent.jsx +++ b/web/pgadmin/tools/sqleditor/static/js/components/QueryToolComponent.jsx @@ -37,7 +37,7 @@ import PropTypes from 'prop-types'; import { retrieveNodeName } from '../show_view_data'; import 'wcdocker'; import { useModal } from '../../../../../static/js/helpers/ModalProvider'; -import ConnectServerContent from '../../../../../browser/static/js/ConnectServerContent'; +import ConnectServerContent from '../../../../../static/js/Dialogs/ConnectServerContent'; export const QueryToolContext = React.createContext(); export const QueryToolConnectionContext = React.createContext(); @@ -362,10 +362,6 @@ export default function QueryToolComponent({params, pgWindow, pgAdmin, selectedN const handleApiError = (error, handleParams)=>{ - if(error.response && pgAdmin.Browser?.UserManagement?.isPgaLoginRequired(error.response)) { - return pgAdmin.Browser.UserManagement.pgaLogin(); - } - if(error.response?.status == 503 && error.response.data?.info == 'CONNECTION_LOST') { // We will display re-connect dialog, no need to display error message again modal.confirm( diff --git a/web/pgadmin/tools/sqleditor/static/js/components/dialogs/NewConnectionDialog.jsx b/web/pgadmin/tools/sqleditor/static/js/components/dialogs/NewConnectionDialog.jsx index e9a6589ce..6660d2d0f 100644 --- a/web/pgadmin/tools/sqleditor/static/js/components/dialogs/NewConnectionDialog.jsx +++ b/web/pgadmin/tools/sqleditor/static/js/components/dialogs/NewConnectionDialog.jsx @@ -16,7 +16,7 @@ import url_for from 'sources/url_for'; import _ from 'lodash'; import { flattenSelectOptions } from '../../../../../../static/js/components/FormComponents'; import PropTypes from 'prop-types'; -import ConnectServerContent from '../../../../../../browser/static/js/ConnectServerContent'; +import ConnectServerContent from '../../../../../../static/js/Dialogs/ConnectServerContent'; class NewConnectionSchema extends BaseUISchema { constructor(api, params, connectServer) { diff --git a/web/pgadmin/tools/user_management/__init__.py b/web/pgadmin/tools/user_management/__init__.py index 2c7bfaa53..d39d84643 100644 --- a/web/pgadmin/tools/user_management/__init__.py +++ b/web/pgadmin/tools/user_management/__init__.py @@ -496,9 +496,6 @@ def get_shared_servers(uid): return internal_server_error(errormsg=str(e)) -# @blueprint.route( -# '/admin_users', methods=['GET'], endpoint='admin_users' -# ) @blueprint.route( '/admin_users/', methods=['GET'], endpoint='admin_users' ) diff --git a/web/pgadmin/tools/user_management/static/js/user_management.js b/web/pgadmin/tools/user_management/static/js/user_management.js index 0e23c8f2d..859c1f2de 100644 --- a/web/pgadmin/tools/user_management/static/js/user_management.js +++ b/web/pgadmin/tools/user_management/static/js/user_management.js @@ -8,6 +8,7 @@ ////////////////////////////////////////////////////////////// import Notify from '../../../../static/js/helpers/Notifier'; +import { showChangeOwnership } from '../../../../static/js/Dialogs/index'; define([ 'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'pgadmin.alertifyjs', @@ -94,104 +95,6 @@ define([ ); }, - isPgaLoginRequired(xhr) { - /* If responseJSON is undefined then it could be object of - * axios(Promise HTTP) response, so we should check accordingly. - */ - if (xhr.responseJSON === undefined && xhr.data !== undefined) { - return xhr.status === 401 && xhr.data && - xhr.data.info && - xhr.data.info === 'PGADMIN_LOGIN_REQUIRED'; - } - - return xhr.status === 401 && xhr.responseJSON && - xhr.responseJSON.info && - xhr.responseJSON.info === 'PGADMIN_LOGIN_REQUIRED'; - }, - - // Callback to draw pgAdmin4 login dialog. - pgaLogin: function(url) { - var title = gettext('pgAdmin 4 login'); - url = url || url_for('security.login'); - if(!alertify.PgaLogin) { - alertify.dialog('PgaLogin' ,function factory() { - return { - main: function(alertTitle, alertUrl) { - this.set({ - 'title': alertTitle, - 'url': alertUrl, - }); - }, - build: function() { - alertify.pgDialogBuild.apply(this); - }, - settings:{ - url: undefined, - }, - setup:function() { - return { - buttons: [{ - text: gettext('Close'), key: 27, - className: 'btn btn-secondary fa fa-lg fa-times pg-alertify-button', - attrs:{name:'close', type:'button'}, - }], - // Set options for dialog - options: { - //disable both padding and overflow control. - padding : !1, - overflow: !1, - modal: true, - resizable: true, - maximizable: true, - pinnable: false, - closableByDimmer: false, - closable: false, - }, - }; - }, - hooks: { - // Triggered when the dialog is closed - onclose: function() { - // Clear the view - return setTimeout((function() { - return alertify.PgaLogin().destroy(); - })); - }, - }, - prepare: function() { - // create the iframe element - var self = this, - iframe = document.createElement('iframe'), - frameUrl = this.setting('url'); - - iframe.onload = function() { - var doc = this.contentDocument || this.contentWindow.document; - if (doc.location.href.indexOf(frameUrl) == -1) { - // login successful. - - this.contentWindow.stop(); - this.onload = null; - - // close the dialog. - self.close(); - pgBrowser.Events.trigger('pgadmin:user:logged-in'); - } - }; - - iframe.frameBorder = 'no'; - iframe.width = '100%'; - iframe.height = '100%'; - iframe.src = frameUrl; - // add it to the dialog - self.elements.content.appendChild(iframe); - }, - }; - }); - } - - alertify.PgaLogin(title, url).resizeTo(pgBrowser.stdW.md, pgBrowser.stdH.md); - }, - is_editable: function(m) { if (m instanceof Backbone.Collection) { return true; @@ -551,191 +454,34 @@ define([ }, changeOwnership: function(res, uid) { - let self = this; + let self = this, + url = url_for('user_management.admin_users', {'uid': uid}); - let ownershipSelect2Control = Backform.Select2Control.extend({ - fetchData: function(){ - let that = this; - let url = that.field.get('url'); + const destroyUserManagement = ()=>{ + alertify.UserManagement().destroy(); + }; - url = url_for(url, {'uid': uid}); - - $.ajax({ - url: url, - headers: { - 'Cache-Control' : 'no-cache', - }, - }).done(function (res_data) { - var transform = that.field.get('transform'); - if(res_data.data.status){ - let data = res_data.data.result.data; - - if (transform && _.isFunction(transform)) { - that.field.set('options', transform.bind(that, data)); - } else { - that.field.set('options', data); - } - } else { - if (transform && _.isFunction(transform)) { - that.field.set('options', transform.bind(that, [])); - } else { - that.field.set('options', []); - } - } - Backform.Select2Control.prototype.render.apply(that, arguments); - }).fail(function(e){ - let msg = ''; - if(e.status == 404) { - msg = 'Unable to find url.'; - } else { - msg = e.responseJSON.errormsg; - } - Notify.error(msg); - }); - }, - render: function() { - this.fetchData(); - return Backform.Select2Control.prototype.render.apply(this, arguments); - }, - onChange: function() { - Backform.Select2Control.prototype.onChange.apply(this, arguments); - }, - }); - - let ownershipModel = pgBrowser.DataModel.extend({ - schema: [ - { - id: 'note_text_ch_owner', - control: Backform.NoteControl, - text: 'Select the user that will take ownership of the shared servers created by ' + self.model.get('username') + '. ' + res['data'].shared_servers + ' shared servers are currently owned by this user.', - group: gettext('General'), - }, - { - id: 'user', - name: 'user', - label: gettext('User'), - type: 'text', - editable: true, - select2: { - allowClear: true, - width: '100%', - first_empty: true, - }, - control: ownershipSelect2Control, - url: 'user_management.admin_users', - helpMessage: gettext('Note: If no user is selected, the shared servers will be deleted.'), - }], - }); - // Change shared server ownership before deleting the admin user - if (!alertify.changeOwnershipDialog) { - alertify.dialog('changeOwnershipDialog', function factory() { - let $container = $('
'); - return { - main: function(message) { - this.msg = message; - }, - build: function() { - this.elements.content.appendChild($container.get(0)); - alertify.pgDialogBuild.apply(this); - }, - setup: function(){ - return { - buttons: [ - { - text: gettext('Cancel'), - key: 27, - className: 'btn btn-secondary fa fa-times pg-alertify-button', - 'data-btn-name': 'cancel', - }, { - text: gettext('OK'), - key: 13, - className: 'btn btn-primary fa fa-check pg-alertify-button', - 'data-btn-name': 'ok', - }, - ], - // Set options for dialog - options: { - title: 'Change ownership', - //disable both padding and overflow control. - padding: !1, - overflow: !1, - model: 0, - resizable: true, - maximizable: false, - pinnable: false, - closableByDimmer: false, - modal: false, - autoReset: false, - closable: true, - }, - }; - }, - prepare: function() { - let that = this; - $container.html(''); - - that.ownershipModel = new ownershipModel(); - let fields = pgBackform.generateViewSchema(null, that.ownershipModel, 'create', null, null, true, null); - - let view = this.view = new pgBackform.Dialog({ - el: '
', - model: that.ownershipModel, - schema: fields, - }); - //Render change ownership dialog. - $container.append(view.render().$el[0]); - }, - callback: function(e) { - if(e.button['data-btn-name'] === 'ok') { - e.cancel = true; // Do not close dialog - let newOwnershipModel = this.ownershipModel.toJSON(); - if (newOwnershipModel.user == '' || newOwnershipModel.user == undefined) { - Notify.confirm( - gettext('Delete user?'), - gettext('The shared servers owned by '+ self.model.get('username') +' will be deleted. Do you wish to continue?'), - function() { - - self.model.destroy({ - wait: true, - success: function() { - Notify.success(gettext('User deleted.')); - alertify.changeOwnershipDialog().destroy(); - alertify.UserManagement().destroy(); - }, - error: self.raiseError, - }); - alertify.changeOwnershipDialog().destroy(); - }, - function() { - return true; - } - ); - } else { - self.changeOwner(newOwnershipModel.user, uid); - } - } else { - alertify.changeOwnershipDialog().destroy(); - } - }, - }; - }); - } - alertify.changeOwnershipDialog('Change ownership').resizeTo(pgBrowser.stdW.md, pgBrowser.stdH.md); - }, - changeOwner: function(user_id, old_user) { $.ajax({ - url: url_for('user_management.change_owner'), - method: 'POST', - data:{'new_owner': user_id, 'old_owner': old_user}, - }) - .done(function(res) { - alertify.changeOwnershipDialog().destroy(); - alertify.UserManagement().destroy(); - Notify.success(gettext(res.info)); - }) - .fail(function() { - Notify.error(gettext('Unable to change owner.')); - }); + url: url, + headers: { + 'Cache-Control' : 'no-cache', + }, + }).done(function (result) { + showChangeOwnership(gettext('Change ownership'), + result.data.result.data, + res['data'].shared_servers, + {uid: uid, name: self.model.get('username')}, + destroyUserManagement + ); + }).fail(function(e) { + let msg = ''; + if(e.status == 404) { + msg = 'Unable to find url.'; + } else { + msg = e.responseJSON.errormsg; + } + Notify.error(msg); + }); }, deleteUser: function() { let self = this;