1. Add min width to panels.

2. Fix issues related to New connection in query tool. Also fixed some existing bugs related to this.

refs #6131
pull/85/head
Aditya Toshniwal 2022-04-22 18:17:01 +05:30 committed by Akshay Joshi
parent faff8d1fb3
commit c5ca394cec
4 changed files with 130 additions and 66 deletions

View File

@ -155,6 +155,7 @@ export class LayoutHelper {
return { return {
cached: true, cached: true,
group: 'default', group: 'default',
minWidth: 200,
...attrs, ...attrs,
}; };
} }

View File

@ -242,10 +242,15 @@ export const useModalStyles = makeStyles((theme) => ({
} }
})); }));
function ModalContainer({ id, title, content, dialogHeight, dialogWidth, fullScreen = false, isFullWidth = false, showFullScreen = false, isResizeable = false }) { function ModalContainer({ id, title, content, dialogHeight, dialogWidth, onClose, fullScreen = false, isFullWidth = false, showFullScreen = false, isResizeable = false }) {
let useModalRef = useModal(); let useModalRef = useModal();
const classes = useModalStyles(); const classes = useModalStyles();
let closeModal = () => useModalRef.closeModal(id); let closeModal = (_e, reason) => {
useModalRef.closeModal(id);
if(reason == 'escapeKeyDown') {
onClose?.();
}
};
const [isfullScreen, setIsFullScreen] = useState(fullScreen); const [isfullScreen, setIsFullScreen] = useState(fullScreen);
return ( return (
@ -292,4 +297,5 @@ ModalContainer.propTypes = {
isResizeable: PropTypes.bool, isResizeable: PropTypes.bool,
dialogHeight: PropTypes.number, dialogHeight: PropTypes.number,
dialogWidth: PropTypes.number, dialogWidth: PropTypes.number,
onClose: PropTypes.func,
}; };

View File

@ -432,16 +432,15 @@ def _init_sqleditor(trans_id, connect, sgid, sid, did, **kwargs):
return True, make_json_response( return True, make_json_response(
success=0, success=0,
status=428, status=428,
result=render_template( result={
'servers/password.html', "server_label": server.name,
server_label=server.name, "username": user or server.username,
username=user, "errmsg": msg,
errmsg=msg, "prompt_password": True,
_=gettext, "allow_save_password": True
allow_save_password=True if if ALLOW_SAVE_PASSWORD and
ALLOW_SAVE_PASSWORD and
session['allow_save_password'] else False, session['allow_save_password'] else False,
) }
), '', '' ), '', ''
else: else:
return True, internal_server_error( return True, internal_server_error(

View File

@ -38,6 +38,7 @@ import PropTypes from 'prop-types';
import { retrieveNodeName } from '../show_view_data'; import { retrieveNodeName } from '../show_view_data';
import 'wcdocker'; import 'wcdocker';
import { useModal } from '../../../../../static/js/helpers/ModalProvider'; import { useModal } from '../../../../../static/js/helpers/ModalProvider';
import ConnectServerContent from '../../../../../browser/static/js/ConnectServerContent';
export const QueryToolContext = React.createContext(); export const QueryToolContext = React.createContext();
export const QueryToolConnectionContext = React.createContext(); export const QueryToolConnectionContext = React.createContext();
@ -429,17 +430,42 @@ export default function QueryToolComponent({params, pgWindow, pgAdmin, selectedN
eventBus.current.fireEvent(QUERY_TOOL_EVENTS.TRIGGER_QUERY_CHANGE); eventBus.current.fireEvent(QUERY_TOOL_EVENTS.TRIGGER_QUERY_CHANGE);
}, [qtState.params.title]); }, [qtState.params.title]);
const updateQueryToolConnection = useCallback((connectionData, isNew=false)=>{ const connectServerModal = async (modalData, connectCallback, cancelCallback) => {
setQtState((prev)=>{ modal.showModal(gettext('Connect to server'), (closeModal)=>{
let newConnList = [...prev.connection_list]; return (
<ConnectServerContent
closeModal={()=>{
cancelCallback?.();
closeModal();
}}
data={modalData}
onOK={(formData)=>{
connectCallback(Object.fromEntries(formData));
closeModal();
}}
/>
);
}, {
onClose: cancelCallback,
});
};
const updateQueryToolConnection = (connectionData, isNew=false)=>{
let currSelectedConn = _.find(qtState.connection_list, (c)=>c.is_selected);
let currConnected = qtState.connected;
const selectConn = (newConnData, connected=false, obtainingConn=true)=>{
setQtState((prevQtState)=>{
let newConnList = [...prevQtState.connection_list];
/* If new, add to the list */
if(isNew) { if(isNew) {
newConnList.push(connectionData); newConnList.push(newConnData);
} }
for (const connItem of newConnList) { for (const connItem of newConnList) {
if(connectionData.sid == connItem.sid if(newConnData.sid == connItem.sid
&& connectionData.did == connItem.did && newConnData.did == connItem.did
&& connectionData.user == connItem.user && newConnData.user == connItem.user
&& connectionData.role == connItem.role) { && newConnData.role == connItem.role) {
connItem.is_selected = true; connItem.is_selected = true;
} else { } else {
connItem.is_selected = false; connItem.is_selected = false;
@ -447,32 +473,35 @@ export default function QueryToolComponent({params, pgWindow, pgAdmin, selectedN
} }
return { return {
connection_list: newConnList, connection_list: newConnList,
obtaining_conn: obtainingConn,
connected: connected,
}; };
}); });
setQtState((prev)=>{
return {
params: {
...prev.params,
sid: connectionData.sid,
did: connectionData.did,
title: connectionData.title,
},
obtaining_conn: true,
connected: false,
}; };
}); /* If not new, select it initially to show loading */
return api.post(url_for('sqleditor.update_sqleditor_connection', { if(!isNew) {
selectConn(connectionData);
}
return new Promise((resolve, reject)=>{
api.post(url_for('sqleditor.update_sqleditor_connection', {
trans_id: qtState.params.trans_id, trans_id: qtState.params.trans_id,
sgid: connectionData.sgid, sgid: connectionData.sgid,
sid: connectionData.sid, sid: connectionData.sid,
did: connectionData.did did: connectionData.did
}), connectionData) }), connectionData)
.then(({data: respData})=>{ .then(({data: respData})=>{
if(isNew) {
selectConn(connectionData);
}
setQtState((prev)=>{ setQtState((prev)=>{
return { return {
params: { params: {
...prev.params, ...prev.params,
trans_id: respData.data.trans_id, trans_id: respData.data.trans_id,
sid: connectionData.sid,
did: connectionData.did,
title: connectionData.title,
}, },
connected: respData.data.trans_id ? true : false, connected: respData.data.trans_id ? true : false,
obtaining_conn: false, obtaining_conn: false,
@ -480,8 +509,27 @@ export default function QueryToolComponent({params, pgWindow, pgAdmin, selectedN
}); });
let msg = `${connectionData['server_name']}/${connectionData['database_name']} - Database connected`; let msg = `${connectionData['server_name']}/${connectionData['database_name']} - Database connected`;
Notifier.success(msg); Notifier.success(msg);
resolve();
})
.catch((error)=>{
if(error?.response?.status == 428) {
connectServerModal(error.response?.data?.result, (passwordData)=>{
resolve(
updateQueryToolConnection({
...connectionData,
...passwordData,
}, isNew)
);
}, ()=>{
// selectConn(currSelectedConn, currConnected, false);
}); });
}, [qtState.params.trans_id]); } else {
selectConn(currSelectedConn, currConnected, false);
reject(error);
}
});
});
};
const onNewConnClick = useCallback(()=>{ const onNewConnClick = useCallback(()=>{
const onClose = ()=>LayoutHelper.close(docker.current, 'new-conn'); const onClose = ()=>LayoutHelper.close(docker.current, 'new-conn');
@ -494,20 +542,30 @@ export default function QueryToolComponent({params, pgWindow, pgAdmin, selectedN
sid: data.sid, sid: data.sid,
did: data.did, did: data.did,
user: data.user, user: data.user,
role: data.role && null, role: data.role ?? null,
password: data.password,
title: getTitle(pgAdmin, qtState.preferences.browser, null, false, data.server_name, data.database_name, data.user, true), title: getTitle(pgAdmin, qtState.preferences.browser, null, false, data.server_name, data.database_name, data.user, true),
conn_title: getTitle(pgAdmin, null, null, true, data.server_name, data.database_name, data.user, true), conn_title: getTitle(pgAdmin, null, null, true, data.server_name, data.database_name, data.user, true),
server_name: data.server_name, server_name: data.server_name,
database_name: data.database_name, database_name: data.database_name,
is_selected: true, is_selected: true,
}; };
updateQueryToolConnection(connectionData, true);
let existIdx = _.findIndex(qtState.connection_list, (conn)=>(
conn.sid == connectionData.sid && conn.did == connectionData.did
&& conn.user == connectionData.user && conn.role == connectionData.role
));
if(existIdx > -1) {
return Promise.reject(gettext('Connection with this configuration already present.'));
}
updateQueryToolConnection(connectionData, true).then(()=>{
onClose(); onClose();
});
return Promise.resolve(); return Promise.resolve();
}} }}
onClose={onClose}/> onClose={onClose}/>
}); });
}, [qtState.preferences.browser]); }, [qtState.preferences.browser, qtState.connection_list, qtState.params]);
const onNewQueryToolClick = ()=>{ const onNewQueryToolClick = ()=>{