Skip to content

Commit 740a506

Browse files
Fix the following SonarQube issues:
1. Do not use the Array index in keys 2. Visible, non-interactive elements with click handlers must have at least one keyboard listener. 3. Add replacement fields or use a normal string instead of an f-string. 4. Add a parameter to the parent lambda function
1 parent 706eec0 commit 740a506

File tree

11 files changed

+35
-23
lines changed

11 files changed

+35
-23
lines changed

web/pgadmin/static/js/SchemaView/FieldControl.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export const FieldControl = ({schemaId, item}) => {
1818
<Control {...props}>
1919
{
2020
children?.map(
21-
(child, idx) => <FieldControl key={idx} item={child}/>
21+
(child, idx) => <FieldControl key={`${child.controlProps.id}-${idx}`} item={child}/>
2222
)
2323
}
2424
</Control>, [schemaId, Control, props, children]

web/pgadmin/static/js/SchemaView/FieldSetView.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,10 @@ export default function FieldSetView({
5656
<FieldSet title={label} className={controlClassName}>
5757
{fieldGroups.map(
5858
(fieldGroup, gidx) => (
59-
<React.Fragment key={gidx}>
59+
<React.Fragment key={`${fieldGroup.id}-${gidx}`}>
6060
{fieldGroup.controls.map(
6161
(item, idx) => <FieldControl
62-
item={item} key={idx} schemaId={schema._id} />
62+
item={item} key={`${item.controlProps.id}-${idx}`} schemaId={schema._id} />
6363
)}
6464
</React.Fragment>
6565
)

web/pgadmin/static/js/SchemaView/FormView.jsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ export default function FormView({
230230
{
231231
group.controls.map(
232232
(item, idx) => <FieldControl
233-
item={item} key={idx} schemaId={schema._id} />
233+
item={item} key={`${item.controlProps.id}-${idx}`} schemaId={schema._id} />
234234
)
235235
}
236236
</TabPanel>
@@ -282,10 +282,10 @@ export default function FormView({
282282
className={contentClassName.join(' ')}>
283283
{
284284
finalGroups.map((group, idx) =>
285-
<React.Fragment key={idx}>{
285+
<React.Fragment key={`${group.id}-${idx}`}>{
286286
group.controls.map(
287287
(item, idx) => <FieldControl
288-
item={item} key={idx} schemaId={schema._id}
288+
item={item} key={`${item.controlProps.id}-${idx}`} schemaId={schema._id}
289289
/>
290290
)
291291
}</React.Fragment>

web/pgadmin/static/js/SchemaView/SchemaPropertiesView.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ export default function SchemaPropertiesView({
9191
{
9292
group.controls.map(
9393
(item, idx) => <FieldControl
94-
item={item} key={idx} schemaId={schema._id}
94+
item={item} key={`${item.controlProps.id}-${idx}`} schemaId={schema._id}
9595
/>
9696
)
9797
}

web/pgadmin/static/js/components/PgReactTableStyled.jsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { PgIconButton } from './Buttons';
2020
import CustomPropTypes from '../custom_prop_types';
2121
import { InputSwitch } from './FormComponents';
2222
import { Checkbox } from '@mui/material';
23-
23+
import { getEnterKeyHandler } from '../utils';
2424

2525
const StyledDiv = styled('div')(({theme})=>({
2626
'&.pgrt': {
@@ -265,6 +265,7 @@ export function PgReactTableHeader({table}) {
265265
<div title={flexRender(header.column.columnDef.header, header.getContext())}
266266
style={{cursor: header.column.getCanSort() ? 'pointer' : 'initial'}}
267267
onClick={header.column.getCanSort() ? header.column.getToggleSortingHandler() : undefined}
268+
onKeyDown={header.column.getCanSort() ? getEnterKeyHandler(header.column.getToggleSortingHandler): undefined}
268269
>
269270
{flexRender(header.column.columnDef.header, header.getContext())}
270271
{header.column.getCanSort() && header.column.getIsSorted() &&

web/pgadmin/static/js/components/PgTree/FileTreeItem/DoubleClickHandler.jsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,12 @@ import { useSingleAndDoubleClick } from '../../../custom_hooks';
1111
import * as React from 'react';
1212
import PropTypes from 'prop-types';
1313
import CustomPropTypes from '../../../../js/custom_prop_types';
14-
14+
import { getEnterKeyHandler } from '../../../../js/utils';
15+
1516
export default function DoubleClickHandler({onSingleClick, onDoubleClick, children}){
1617
const onClick = useSingleAndDoubleClick(onSingleClick, onDoubleClick) ;
1718
return(
18-
<div onClick={(e)=>onClick(e)}>
19+
<div onClick={(e)=>onClick(e)} onKeyDown = { getEnterKeyHandler(onClick)}>
1920
{children}
2021
</div>
2122
);

web/pgadmin/static/js/utils.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,16 @@ export function isShortcutValue(obj) {
4848
return [obj.alt, obj.control, obj?.key, obj?.key?.char].every((k)=>!_.isUndefined(k));
4949
}
5050

51+
52+
export function getEnterKeyHandler(clickHandler) {
53+
return (e)=>{
54+
if(e.code === 'Enter'){
55+
e.preventDefault();
56+
clickHandler(e);
57+
}
58+
};
59+
}
60+
5161
// Convert shortcut obj to codemirror key format
5262
export function toCodeMirrorKey(obj) {
5363
let shortcut = '';

web/pgadmin/tools/backup/__init__.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -368,17 +368,17 @@ def set_value(key, param, default_value=None, assertion=True):
368368
if 'objects' in data:
369369
selected_objects = data.get('objects', {})
370370
for _key in selected_objects:
371-
param = 'schema' if _key == 'schema' else 'table'
371+
selected_key = 'schema' if _key == 'schema' else 'table'
372372
args.extend(
373373
functools.reduce(operator.iconcat, map(
374-
lambda s: [f'--{param}',
375-
r'{0}.{1}'.format(
376-
driver.qtIdent(conn, s['schema']).replace(
377-
'"', '\"'),
378-
driver.qtIdent(conn, s['name']).replace(
379-
'"', '\"')) if type(
380-
s) is dict else driver.qtIdent(
381-
conn, s).replace('"', '\"')],
374+
lambda s, param=selected_key:[
375+
f'--{param}',
376+
r'{0}.{1}'.format(
377+
driver.qtIdent(conn, s['schema']).
378+
replace('"', '\"'),
379+
driver.qtIdent(conn, s['name']).replace('"', '\"'))
380+
if type(s) is dict
381+
else driver.qtIdent(conn, s).replace('"', '\"')],
382382
selected_objects[_key] or []), [])
383383
)
384384

web/pgadmin/tools/sqleditor/static/js/components/sections/StatusBar.jsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import { QueryToolEventsContext } from '../QueryToolComponent';
1717
import gettext from 'sources/gettext';
1818
import { PgMenu, PgMenuItem, usePgMenuGroup } from '../../../../../../static/js/components/Menu';
1919
import PropTypes from 'prop-types';
20-
20+
import { getEnterKeyHandler } from '../../../../../../static/js/utils';
2121

2222
const StyledBox = styled(Box)(({theme}) => ({
2323
display: 'flex',
@@ -131,6 +131,7 @@ export function StatusBar({eol, handleEndOfLineChange}) {
131131
<Tooltip title="Select EOL Sequence" enterDelay={2500}>
132132
<span
133133
onClick={toggleMenu}
134+
onKeyDown={getEnterKeyHandler(toggleMenu)}
134135
ref={eolMenuRef}
135136
name="menu-eoloptions"
136137
style={{

web/regression/feature_tests/query_tool_tests.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,7 @@ def _pagination_result(self):
151151
{'page_info': '2001 to 2500', 'cell_rownum': '2001'}
152152
]):
153153
page_info = self.page.find_by_css_selector(
154-
QueryToolLocators.pagination_inputs +
155-
f' span:nth-of-type(1)')
154+
QueryToolLocators.pagination_inputs + ' span:nth-of-type(1)')
156155

157156
self.assertEqual(page_info.text,
158157
f"Showing rows: {page['page_info']}")

0 commit comments

Comments
 (0)