Skip to content

Commit fdf5d12

Browse files
committed
1) Fixed schema diff workspace button is disabled for the first tab.
2) Adhoc servers should connect with service file and open the Query/PSQL tool.
1 parent 8af25ba commit fdf5d12

File tree

5 files changed

+89
-16
lines changed

5 files changed

+89
-16
lines changed

docs/en_US/release_notes_9_0.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ Bundled PostgreSQL Utilities
2020
New features
2121
************
2222

23+
| `Issue #6513 <https://github.com/pgadmin-org/pgadmin4/issues/6513>`_ - Change button labels and color in delete confirmation dialog for all objects to improve UX.
2324
| `Issue #7708 <https://github.com/pgadmin-org/pgadmin4/issues/7708>`_ - Enhanced pgAdmin 4 with support for Workspace layouts.
2425
2526
Housekeeping

web/pgadmin/misc/workspaces/__init__.py

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,27 @@ def index():
6161
)
6262
@pga_login_required
6363
def adhoc_connect_server():
64-
required_args = ['host', 'port', 'user']
64+
required_args = ['server_name', 'did']
6565

6666
data = request.form if request.form else json.loads(
6767
request.data
6868
)
6969

70+
# Loop through data and if found any value is blank string then
71+
# convert it to None as after porting into React, from frontend
72+
# '' blank string is coming as a value instead of null.
73+
for item in data:
74+
if data[item] == '':
75+
data[item] = None
76+
77+
# Some fields can be provided with service file so they are optional
78+
if 'service' in data and not data['service']:
79+
required_args.extend([
80+
'host',
81+
'port',
82+
'user'
83+
])
84+
7085
for arg in required_args:
7186
if arg not in data:
7287
return make_json_response(
@@ -95,24 +110,28 @@ def adhoc_connect_server():
95110
data['connection_params'] = connection_params
96111

97112
# Fetch all the new data in case of non-existing servers
113+
new_host = data.get('host', None)
114+
new_port = data.get('port', None)
98115
new_db = data.get('database_name', None)
99116
if new_db is None:
100117
new_db = data.get('did')
101118
new_username = data.get('user')
102119
new_role = data.get('role', None)
103120
new_server_name = data.get('server_name', None)
121+
new_service = data.get('service', None)
104122

105123
try:
106124
server = None
107125
if config.CONFIG_DATABASE_URI is not None and \
108126
len(config.CONFIG_DATABASE_URI) > 0:
109127
# Filter out all the servers with the below combination.
110-
servers = Server.query.filter_by(host=data['host'],
111-
port=data['port'],
128+
servers = Server.query.filter_by(host=new_host,
129+
port=new_port,
112130
maintenance_db=new_db,
113131
username=new_username,
114132
name=new_server_name,
115-
role=new_role
133+
role=new_role,
134+
service=new_service
116135
).all()
117136

118137
# If found matching servers then compare the connection_params as
@@ -123,12 +142,13 @@ def adhoc_connect_server():
123142
server = existing_server
124143
break
125144
else:
126-
server = Server.query.filter_by(host=data['host'],
127-
port=data['port'],
145+
server = Server.query.filter_by(host=new_host,
146+
port=new_port,
128147
maintenance_db=new_db,
129148
username=new_username,
130149
name=new_server_name,
131150
role=new_role,
151+
service=new_service,
132152
connection_params=connection_params
133153
).first()
134154

@@ -156,12 +176,12 @@ def adhoc_connect_server():
156176
user_id=current_user.id,
157177
servergroup_id=data.get('gid', 1),
158178
name=new_server_name,
159-
host=data.get('host', None),
160-
port=data.get('port'),
179+
host=new_host,
180+
port=new_port,
161181
maintenance_db=new_db,
162182
username=new_username,
163183
role=new_role,
164-
service=data.get('service', None),
184+
service=new_service,
165185
connection_params=connection_params,
166186
is_adhoc=1
167187
)

web/pgadmin/misc/workspaces/static/js/AdHocConnection.jsx

Lines changed: 55 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import * as showQueryTool from '../../../../tools/sqleditor/static/js/show_query
2828
import { getTitle, generateTitle } from '../../../../tools/sqleditor/static/js/sqleditor_title';
2929
import usePreferences from '../../../../preferences/static/js/store';
3030
import { BROWSER_PANELS } from '../../../../browser/static/js/constants';
31+
import { isEmptyString } from '../../../../static/js/validators';
3132

3233
class AdHocConnectionSchema extends BaseUISchema {
3334
constructor(connectExistingServer, initValues={}) {
@@ -183,11 +184,11 @@ class AdHocConnectionSchema extends BaseUISchema {
183184
deps: ['sid', 'connected'],
184185
disabled: (state) => state.sid,
185186
}, {
186-
id: 'host', label: gettext('Host name/address'), type: 'text', noEmpty: true,
187+
id: 'host', label: gettext('Host name/address'), type: 'text',
187188
deps: ['sid', 'connected'],
188189
disabled: (state) => state.sid,
189190
}, {
190-
id: 'port', label: gettext('Port'), type: 'int', min: 1, max: 65535, noEmpty: true,
191+
id: 'port', label: gettext('Port'), type: 'int', min: 1, max: 65535,
191192
deps: ['sid', 'connected'],
192193
disabled: (state) => state.sid,
193194
},{
@@ -215,7 +216,7 @@ class AdHocConnectionSchema extends BaseUISchema {
215216
}
216217
}, {
217218
id: 'user', label: gettext('User'), deps: ['sid', 'connected'],
218-
noEmpty: true, controlProps: {creatable: true},
219+
controlProps: {creatable: true},
219220
type: (state) => {
220221
if (state?.sid) {
221222
return {
@@ -261,8 +262,54 @@ class AdHocConnectionSchema extends BaseUISchema {
261262
}
262263
];
263264
}
264-
}
265265

266+
validate(state, setError) {
267+
let errmsg = null;
268+
269+
if (isEmptyString(state.service)) {
270+
errmsg = gettext('Either Host name or Service must be specified.');
271+
if(isEmptyString(state.host)) {
272+
setError('host', errmsg);
273+
return true;
274+
} else {
275+
setError('host', null);
276+
}
277+
278+
/* Hostname, IP address validate */
279+
if (state.host) {
280+
// Check for leading and trailing spaces.
281+
if (/(^\s)|(\s$)/.test(state.host)){
282+
errmsg = gettext('Host name must be valid hostname or IPv4 or IPv6 address.');
283+
setError('host', errmsg);
284+
return true;
285+
} else {
286+
setError('host', null);
287+
}
288+
}
289+
290+
if(isEmptyString(state.username)) {
291+
errmsg = gettext('Username must be specified.');
292+
setError('username', errmsg);
293+
return true;
294+
} else {
295+
setError('username', null);
296+
}
297+
298+
if(isEmptyString(state.port)) {
299+
errmsg = gettext('Port must be specified.');
300+
setError('port', errmsg);
301+
return true;
302+
} else {
303+
setError('port', null);
304+
}
305+
} else {
306+
_.each(['host', 'db', 'username', 'port'], (item) => {
307+
setError(item, null);
308+
});
309+
}
310+
return false;
311+
}
312+
}
266313

267314
export default function AdHocConnection({mode}) {
268315
const [connecting, setConnecting] = useState(false);
@@ -313,6 +360,7 @@ export default function AdHocConnection({mode}) {
313360
const openQueryTool = (respData, formData)=>{
314361
const transId = commonUtils.getRandomInt(1, 9999999);
315362
let db_name = _.isNil(formData.database_name) ? formData.did : formData.database_name;
363+
let user_name = formData.role || formData.user || respData.data.user.name;
316364

317365
let parentData = {
318366
server_group: {_id: 1},
@@ -328,7 +376,7 @@ export default function AdHocConnection({mode}) {
328376
};
329377

330378
const gridUrl = showQueryTool.generateUrl(transId, parentData, null);
331-
const title = getTitle(pgAdmin, preferencesStore.getPreferencesForModule('browser'), null, false, formData.server_name, db_name, formData.role || formData.user);
379+
const title = getTitle(pgAdmin, preferencesStore.getPreferencesForModule('browser'), null, false, formData.server_name, db_name, user_name);
332380
showQueryTool.launchQueryTool(pgWindow.pgAdmin.Tools.SQLEditor, transId, gridUrl, title, {
333381
user: formData.user,
334382
role: formData.role,
@@ -338,12 +386,13 @@ export default function AdHocConnection({mode}) {
338386
const openPSQLTool = (respData, formData)=> {
339387
const transId = commonUtils.getRandomInt(1, 9999999);
340388
let db_name = _.isNil(formData.database_name) ? formData.did : formData.database_name;
389+
let user_name = formData.role || formData.user || respData.data.user.name;
341390

342391
let panelTitle = '';
343392
// Set psql tab title as per prefrences setting.
344393
let title_data = {
345394
'database': db_name ? _.unescape(db_name) : 'postgres' ,
346-
'username': formData.user,
395+
'username': user_name,
347396
'server': formData.server_name,
348397
'type': 'psql_tool',
349398
};

web/pgadmin/misc/workspaces/static/js/WorkspaceProvider.jsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ export function WorkspaceProvider({children}) {
7676
const hasOpenTabs = (forWs)=>{
7777
const wsConfig = config.find((i)=>i.workspace == forWs);
7878
if(wsConfig) {
79-
return Boolean(pgAdmin.Browser.docker[wsConfig.docker]?.layoutObj?.getRootElement().querySelector('.dock-tab'));
79+
//return Boolean(pgAdmin.Browser.docker[wsConfig.docker]?.layoutObj?.getRootElement().querySelector('.dock-tab'));
80+
return Boolean(pgAdmin.Browser.docker[wsConfig.docker]?.layoutObj?.getLayout()?.dockbox?.children?.[0]?.tabs?.length);
8081
}
8182
return true;
8283
};

web/pgadmin/misc/workspaces/static/js/WorkspaceToolbar.jsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,11 @@ function WorkspaceButton({menuItem, value, ...props}) {
5555
setDisabled(!hasOpenTabs(value));
5656
});
5757
const deregChange = layout.eventBus.registerListener(LAYOUT_EVENTS.CHANGE, ()=>{
58+
console.log(layout);
5859
setDisabled(!hasOpenTabs(value));
5960
});
6061
const deregRemove = layout.eventBus.registerListener(LAYOUT_EVENTS.REMOVE, ()=>{
62+
console.log(layout);
6163
setDisabled(!hasOpenTabs(value));
6264
});
6365

0 commit comments

Comments
 (0)