Continue fixing multiple UI issues found when testing wcDocker changes. #6479

This commit is contained in:
Aditya Toshniwal 2023-11-01 20:52:38 +05:30
parent d3dd5c0b56
commit 17acce3e7b
15 changed files with 91 additions and 74 deletions

View File

@ -8,7 +8,7 @@ updates:
- "Dependencies" - "Dependencies"
commit-message: commit-message:
prefix: "Docker dependency" prefix: "Docker dependency"
- package-ecosystem: "pip" - package-ecosystem: "pip"
directory: "/" directory: "/"
schedule: schedule:
@ -17,7 +17,7 @@ updates:
- "Dependencies" - "Dependencies"
commit-message: commit-message:
prefix: "Python dependency" prefix: "Python dependency"
- package-ecosystem: "pip" - package-ecosystem: "pip"
directory: "/tools" directory: "/tools"
schedule: schedule:
@ -25,8 +25,8 @@ updates:
labels: labels:
- "Dependencies" - "Dependencies"
commit-message: commit-message:
prefix: "Python dependency" prefix: "Python dependency"
- package-ecosystem: "pip" - package-ecosystem: "pip"
directory: "/web/regression" directory: "/web/regression"
schedule: schedule:
@ -34,8 +34,8 @@ updates:
labels: labels:
- "Dependencies" - "Dependencies"
commit-message: commit-message:
prefix: "Python dependency" prefix: "Python dependency"
- package-ecosystem: "npm" - package-ecosystem: "npm"
directory: "/runtime" directory: "/runtime"
schedule: schedule:
@ -43,8 +43,8 @@ updates:
labels: labels:
- "Dependencies" - "Dependencies"
commit-message: commit-message:
prefix: "Python dependency" prefix: "Javascript dependency"
- package-ecosystem: "npm" - package-ecosystem: "npm"
directory: "/web" directory: "/web"
schedule: schedule:
@ -52,4 +52,4 @@ updates:
labels: labels:
- "Dependencies" - "Dependencies"
commit-message: commit-message:
prefix: "Python dependency" prefix: "Javascript dependency"

View File

@ -380,6 +380,7 @@ define('pgadmin.browser.node', [
return; return;
} }
treeNodeInfo = pgBrowser.tree.getTreeNodeHierarchy(nodeItem);
const panelId = _.uniqueId(BROWSER_PANELS.EDIT_PROPERTIES); const panelId = _.uniqueId(BROWSER_PANELS.EDIT_PROPERTIES);
const onClose = (force=false)=>pgBrowser.docker.close(panelId, force); const onClose = (force=false)=>pgBrowser.docker.close(panelId, force);
const onSave = (newNodeData)=>{ const onSave = (newNodeData)=>{
@ -694,7 +695,7 @@ define('pgadmin.browser.node', [
pgBrowser.Node.callbacks.change_server_background(item, data); pgBrowser.Node.callbacks.change_server_background(item, data);
}, },
// Callback called - when a node is selected in browser tree. // Callback called - when a node is selected in browser tree.
selected: function(item, data, browser) { selected: function(item, data) {
// Show the information about the selected node in the below panels, // Show the information about the selected node in the below panels,
// which are visible at this time: // which are visible at this time:
// + Properties // + Properties
@ -702,10 +703,10 @@ define('pgadmin.browser.node', [
// + Dependents // + Dependents
// + Dependencies // + Dependencies
// + Statistics // + Statistics
let b = browser || pgBrowser;
// Update the menu items // Update the menu items
pgAdmin.Browser.enable_disable_menus.apply(b, [item]); pgAdmin.Browser.enable_disable_menus.apply(pgBrowser, [item]);
pgBrowser.Events.trigger('pgadmin-browser:node:selected', item, data);
pgBrowser.Events.trigger('pgadmin:browser:tree:update-tree-state', pgBrowser.Events.trigger('pgadmin:browser:tree:update-tree-state',
item); item);

View File

@ -20,7 +20,7 @@ import usePreferences from '../../preferences/static/js/store';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
export default function ObjectNodeProperties({panelId, node, treeNodeInfo, nodeData, actionType, formType, onEdit, onSave, onClose, export default function ObjectNodeProperties({panelId, node, treeNodeInfo, nodeData, actionType, formType, onEdit, onSave, onClose,
isActive, isStale, setIsStale}) { isActive, setIsStale}) {
const layoutDocker = React.useContext(LayoutDockerContext); const layoutDocker = React.useContext(LayoutDockerContext);
const nodeType = nodeData?._type; const nodeType = nodeData?._type;
const pgAdmin = usePgAdmin(); const pgAdmin = usePgAdmin();
@ -61,7 +61,7 @@ export default function ObjectNodeProperties({panelId, node, treeNodeInfo, nodeD
resolve(res.data); resolve(res.data);
}) })
.catch((err)=>{ .catch((err)=>{
pgAdmin.Browser.notifier.pgNotifier('error', err, '', function(msg) { pgAdmin.Browser.notifier.pgNotifier('error', err, gettext('Failed to fetch data'), function(msg) {
if (msg == 'CRYPTKEY_SET') { if (msg == 'CRYPTKEY_SET') {
return Promise.resolve(initData()); return Promise.resolve(initData());
} else if (msg == 'CRYPTKEY_NOT_SET') { } else if (msg == 'CRYPTKEY_NOT_SET') {
@ -198,13 +198,13 @@ export default function ObjectNodeProperties({panelId, node, treeNodeInfo, nodeD
} }
const key = useMemo(()=>{ const key = useMemo(()=>{
if(!isActive && isStale || actionType != 'properties') { if( actionType != 'properties' || isActive) {
return nodeData?._id; return nodeData?._id;
} else if(isActive && isStale) { } else {
return nodeData?._id + '0'; initData = ()=>Promise.resolve({});
return nodeData?._id + '-0';
} }
return nodeData?._id + '1'; }, [isActive, nodeData?._id]);
}, [isActive, isStale, nodeData?._id]);
/* Fire at will, mount the DOM */ /* Fire at will, mount the DOM */
return ( return (
@ -242,6 +242,5 @@ ObjectNodeProperties.propTypes = {
onSave: PropTypes.func, onSave: PropTypes.func,
onClose: PropTypes.func, onClose: PropTypes.func,
isActive: PropTypes.bool, isActive: PropTypes.bool,
isStale: PropTypes.bool,
setIsStale: PropTypes.func, setIsStale: PropTypes.func,
}; };

View File

@ -78,4 +78,13 @@ export function listenPreferenceBroadcast() {
// initial sync // initial sync
preferenceChangeBroadcast.postMessage('sync'); preferenceChangeBroadcast.postMessage('sync');
return new Promise((resolve)=>{
const i = setInterval(()=>{
if(usePreferences.getState()?.version > 0) {
clearInterval(i);
resolve();
}
}, 100);
});
} }

View File

@ -112,7 +112,7 @@ export default function BrowserComponent({pgAdmin}) {
<ModalProvider> <ModalProvider>
<NotifierProvider pgAdmin={pgAdmin} onReady={()=>setUiReady(true)}/> <NotifierProvider pgAdmin={pgAdmin} onReady={()=>setUiReady(true)}/>
{browser != 'Nwjs' && <AppMenuBar />} {browser != 'Nwjs' && <AppMenuBar />}
<div style={{height: 'calc(100% - 30px)'}}> <div style={{height: (browser != 'Nwjs' ? 'calc(100% - 30px)' : '100%')}}>
<Layout <Layout
getLayoutInstance={(obj)=>{ getLayoutInstance={(obj)=>{
pgAdmin.Browser.docker = obj; pgAdmin.Browser.docker = obj;

View File

@ -16,7 +16,7 @@ const useStyles = makeStyles((theme) => ({
node: { node: {
display: 'inline-block', display: 'inline-block',
paddingLeft: '1.5rem', paddingLeft: '1.5rem',
height: '1.5rem' height: '100%',
}, },
checkboxStyle: { checkboxStyle: {
fill: theme.palette.primary.main fill: theme.palette.primary.main
@ -171,7 +171,7 @@ function Node({ node, style, tree, hasCheckbox, onNodeSelectionChange}) {
{ {
hasCheckbox ? <Checkbox style={{ padding: 0 }} color="primary" className={clsx(!node.isInternal ? classes.leafNode: null)} hasCheckbox ? <Checkbox style={{ padding: 0 }} color="primary" className={clsx(!node.isInternal ? classes.leafNode: null)}
checked={isSelected ? true: false} checked={isSelected ? true: false}
checkedIcon={isIndeterminate ? <IndeterminateCheckBoxIcon />: <CheckBoxIcon />} checkedIcon={isIndeterminate ? <IndeterminateCheckBoxIcon style={{height: '1.4rem'}} />: <CheckBoxIcon style={{height: '1.4rem'}} />}
onChange={onCheckboxSelection}/> : onChange={onCheckboxSelection}/> :
<span className={clsx(node.data.icon)}></span> <span className={clsx(node.data.icon)}></span>
} }

View File

@ -324,6 +324,12 @@ function getFinalTheme(baseTheme) {
margin: 0, margin: 0,
padding: 0, padding: 0,
}, },
svg: {
verticalAlign: 'middle',
},
img: {
verticalAlign: 'middle',
},
...pickrOverride(baseTheme), ...pickrOverride(baseTheme),
...uplotOverride(baseTheme), ...uplotOverride(baseTheme),
...rcdockOverride(baseTheme), ...rcdockOverride(baseTheme),
@ -414,7 +420,7 @@ function getFinalTheme(baseTheme) {
root: { root: {
...mixins.panelBorder, ...mixins.panelBorder,
'&.Mui-expanded': { '&.Mui-expanded': {
marginBottom: '8px', margin: '8px 0px',
}, },
} }
}, },

View File

@ -35,6 +35,13 @@ export default function rcdockOverride(theme) {
'& .dock': { '& .dock': {
borderRadius: 'inherit', borderRadius: 'inherit',
}, },
'&.dock-style-playground':{
'&:not([data-dockid="id-main"])': {
'& .dock-extra-content': {
display: 'none',
}
}
},
'&.dock-style-object-explorer': { '&.dock-style-object-explorer': {
'& .dock-ink-bar': { '& .dock-ink-bar': {
height: '0px', height: '0px',

View File

@ -465,16 +465,6 @@ export default function CodeMirror({currEditor, name, value, options, events, re
editor.current.on(eventName, events[eventName]); editor.current.on(eventName, events[eventName]);
}); });
// Register keyup event if autocomplete is true
let pref = preferencesStore.getPreferencesForModule('sqleditor');
if (autocomplete && pref.autocomplete_on_key_press) {
editor.current.on('keyup', (cm, event)=>{
if (!cm.state.completionActive && (event.key == 'Backspace' || /^[ -~]{1}$/.test(event.key))) {
OrigCodeMirror.commands.autocomplete(cm, null, {completeSingle: false});
}
});
}
editor.current.on('drop', handleDrop); editor.current.on('drop', handleDrop);
editor.current.on('paste', handlePaste); editor.current.on('paste', handlePaste);
return ()=>{ return ()=>{
@ -482,30 +472,39 @@ export default function CodeMirror({currEditor, name, value, options, events, re
}; };
}, []); }, []);
useEffect(() => usePreferences.subscribe( const autocompKeyup = (cm, event)=>{
state => { if (!cm.state.completionActive && (event.key == 'Backspace' || /^[ -~]{1}$/.test(event.key))) {
let pref = state.getPreferencesForModule('sqleditor'); OrigCodeMirror.commands.autocomplete(cm, null, {completeSingle: false});
let wrapEle = editor.current?.getWrapperElement();
wrapEle && (wrapEle.style.fontSize = calcFontSize(pref.sql_font_size));
if(pref.plain_editor_mode) {
editor.current?.setOption('mode', 'text/plain');
/* Although not required, setting explicitly as codemirror will remove code folding only on next edit */
editor.current?.setOption('foldGutter', false);
} else {
editor.current?.setOption('mode', 'text/x-pgsql');
editor.current?.setOption('foldGutter', pref.code_folding);
}
editor.current?.setOption('indentWithTabs', !pref.use_spaces);
editor.current?.setOption('indentUnit', pref.tab_size);
editor.current?.setOption('tabSize', pref.tab_size);
editor.current?.setOption('lineWrapping', pref.wrap_code);
editor.current?.setOption('autoCloseBrackets', pref.insert_pair_brackets);
editor.current?.setOption('matchBrackets', pref.brace_matching);
editor.current?.refresh();
} }
), []); };
useEffect(()=>{
let pref = preferencesStore.getPreferencesForModule('sqleditor');
let wrapEle = editor.current?.getWrapperElement();
wrapEle && (wrapEle.style.fontSize = calcFontSize(pref.sql_font_size));
// Register keyup event if autocomplete is true
if (autocomplete && pref.autocomplete_on_key_press) {
editor.current.on('keyup', autocompKeyup);
}
if(pref.plain_editor_mode) {
editor.current?.setOption('mode', 'text/plain');
/* Although not required, setting explicitly as codemirror will remove code folding only on next edit */
editor.current?.setOption('foldGutter', false);
} else {
editor.current?.setOption('mode', 'text/x-pgsql');
editor.current?.setOption('foldGutter', pref.code_folding);
}
editor.current?.setOption('indentWithTabs', !pref.use_spaces);
editor.current?.setOption('indentUnit', pref.tab_size);
editor.current?.setOption('tabSize', pref.tab_size);
editor.current?.setOption('lineWrapping', pref.wrap_code);
editor.current?.setOption('autoCloseBrackets', pref.insert_pair_brackets);
editor.current?.setOption('matchBrackets', pref.brace_matching);
editor.current?.refresh();
}, [preferencesStore]);
useEffect(()=>{ useEffect(()=>{
if(editor.current) { if(editor.current) {

View File

@ -122,6 +122,8 @@ export class LayoutDocker {
setTitle(panelId, title, icon, tooltip) { setTitle(panelId, title, icon, tooltip) {
const panelData = this.find(panelId); const panelData = this.find(panelId);
if(!panelData) return;
const internal = { const internal = {
...panelData.internal, ...panelData.internal,
}; };

View File

@ -164,6 +164,7 @@ class Notifier {
return onJSONResult(); return onJSONResult();
} }
this.alert(promptmsg, msg.replace(new RegExp(/\r?\n/, 'g'), '<br />')); this.alert(promptmsg, msg.replace(new RegExp(/\r?\n/, 'g'), '<br />'));
onJSONResult();
} }
alert(title, text, onOkClick, okLabel=gettext('OK')) { alert(title, text, onOkClick, okLabel=gettext('OK')) {

View File

@ -15,12 +15,11 @@ import { usePgAdmin } from '../../../static/js/BrowserComponent';
export default function withStandardTabInfo(Component, tabId) { export default function withStandardTabInfo(Component, tabId) {
// eslint-disable-next-line react/display-name // eslint-disable-next-line react/display-name
const HOCComponent = (props)=>{ const HOCComponent = (props)=>{
const [[nodeItem, nodeData], setNodeInfo] = useState([]); const [[isStale, nodeItem, nodeData], setNodeInfo] = useState([]);
const pgAdmin = usePgAdmin(); const pgAdmin = usePgAdmin();
const node = nodeData && pgAdmin.Browser.Nodes[nodeData?._type]; const node = nodeData && pgAdmin.Browser.Nodes[nodeData?._type];
const treeNodeInfo = pgAdmin.Browser.tree?.getTreeNodeHierarchy(nodeItem); const treeNodeInfo = pgAdmin.Browser.tree?.getTreeNodeHierarchy(nodeItem);
const [isActive, setIsActive] = React.useState(false); const [isActive, setIsActive] = React.useState(false);
const [isStale, setIsStale] = React.useState(true);
const layoutDocker = useContext(LayoutDockerContext); const layoutDocker = useContext(LayoutDockerContext);
useEffect(()=>{ useEffect(()=>{
@ -38,13 +37,11 @@ export default function withStandardTabInfo(Component, tabId) {
} }
}, 100); }, 100);
let deregisterTree = pgAdmin.Browser.Events.on('pgadmin-browser:tree:selected', (item, data)=>{ let deregisterTree = pgAdmin.Browser.Events.on('pgadmin-browser:node:selected', (item, data)=>{
setNodeInfo([item, data]); setNodeInfo([true, item, data]);
setIsStale(true);
}); });
let deregisterTreeUpdate = pgAdmin.Browser.Events.on('pgadmin-browser:tree:updated', (item, data)=>{ let deregisterTreeUpdate = pgAdmin.Browser.Events.on('pgadmin-browser:tree:updated', (item, data)=>{
setNodeInfo([item, data]); setNodeInfo([item, data]);
setIsStale(true);
}); });
let deregisterActive = layoutDocker.eventBus.registerListener(LAYOUT_EVENTS.ACTIVE, onTabActive); let deregisterActive = layoutDocker.eventBus.registerListener(LAYOUT_EVENTS.ACTIVE, onTabActive);
// if there is any dock changes to the tab and it appears to be active/inactive // if there is any dock changes to the tab and it appears to be active/inactive
@ -66,10 +63,6 @@ export default function withStandardTabInfo(Component, tabId) {
}; };
}, []); }, []);
useEffect(()=>{
setIsStale(true);
}, [nodeData]);
return ( return (
<Component <Component
{...props} {...props}
@ -79,7 +72,7 @@ export default function withStandardTabInfo(Component, tabId) {
treeNodeInfo={treeNodeInfo} treeNodeInfo={treeNodeInfo}
isActive={isActive} isActive={isActive}
isStale={isStale} isStale={isStale}
setIsStale={setIsStale} setIsStale={(v)=>setNodeInfo((prev)=>[v, prev[1], prev[2]])}
/> />
); );
}; };

View File

@ -138,8 +138,8 @@ export default class ERDModule {
return openUrl; return openUrl;
} }
loadComponent(container, params) { async loadComponent(container, params) {
listenPreferenceBroadcast(); await listenPreferenceBroadcast();
ReactDOM.render( ReactDOM.render(
<Theme> <Theme>
<ModalProvider> <ModalProvider>

View File

@ -222,11 +222,11 @@ export default class SQLEditor {
return true; return true;
} }
loadComponent(container, params) { async loadComponent(container, params) {
let selectedNodeInfo = pgWindow.pgAdmin.Browser.tree.getTreeNodeHierarchy( let selectedNodeInfo = pgWindow.pgAdmin.Browser.tree.getTreeNodeHierarchy(
pgWindow.pgAdmin.Browser.tree.selected() pgWindow.pgAdmin.Browser.tree.selected()
); );
listenPreferenceBroadcast(); await listenPreferenceBroadcast();
ReactDOM.render( ReactDOM.render(
<Theme> <Theme>
<PgAdminContext.Provider value={pgAdmin}> <PgAdminContext.Provider value={pgAdmin}>

View File

@ -338,7 +338,7 @@ export default function QueryToolComponent({params, pgWindow, pgAdmin, selectedN
if(docker.current.isTabVisible(PANELS.QUERY)) { if(docker.current.isTabVisible(PANELS.QUERY)) {
docker.current.focus(PANELS.QUERY); docker.current.focus(PANELS.QUERY);
} else if(docker.current.isTabVisible(PANELS.HISTORY)) { } else if(docker.current.isTabVisible(PANELS.HISTORY)) {
docker.current.isTabVisible(PANELS.HISTORY); docker.current.focus(PANELS.HISTORY);
} }
eventBus.current.fireEvent(QUERY_TOOL_EVENTS.GOTO_LAST_SCROLL); eventBus.current.fireEvent(QUERY_TOOL_EVENTS.GOTO_LAST_SCROLL);