mirror of
https://github.com/pgadmin-org/pgadmin4.git
synced 2025-02-25 18:55:31 -06:00
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
This commit is contained in:
@@ -18,7 +18,7 @@ export const FieldControl = ({schemaId, item}) => {
|
||||
<Control {...props}>
|
||||
{
|
||||
children?.map(
|
||||
(child, idx) => <FieldControl key={idx} item={child}/>
|
||||
(child, idx) => <FieldControl key={`${child.controlProps.id}-${idx}`} item={child}/>
|
||||
)
|
||||
}
|
||||
</Control>, [schemaId, Control, props, children]
|
||||
|
@@ -56,10 +56,10 @@ export default function FieldSetView({
|
||||
<FieldSet title={label} className={controlClassName}>
|
||||
{fieldGroups.map(
|
||||
(fieldGroup, gidx) => (
|
||||
<React.Fragment key={gidx}>
|
||||
<React.Fragment key={`${fieldGroup.id}-${gidx}`}>
|
||||
{fieldGroup.controls.map(
|
||||
(item, idx) => <FieldControl
|
||||
item={item} key={idx} schemaId={schema._id} />
|
||||
item={item} key={`${item.controlProps.id}-${idx}`} schemaId={schema._id} />
|
||||
)}
|
||||
</React.Fragment>
|
||||
)
|
||||
|
@@ -230,7 +230,7 @@ export default function FormView({
|
||||
{
|
||||
group.controls.map(
|
||||
(item, idx) => <FieldControl
|
||||
item={item} key={idx} schemaId={schema._id} />
|
||||
item={item} key={`${item.controlProps.id}-${idx}`} schemaId={schema._id} />
|
||||
)
|
||||
}
|
||||
</TabPanel>
|
||||
@@ -282,10 +282,10 @@ export default function FormView({
|
||||
className={contentClassName.join(' ')}>
|
||||
{
|
||||
finalGroups.map((group, idx) =>
|
||||
<React.Fragment key={idx}>{
|
||||
<React.Fragment key={`${group.id}-${idx}`}>{
|
||||
group.controls.map(
|
||||
(item, idx) => <FieldControl
|
||||
item={item} key={idx} schemaId={schema._id}
|
||||
item={item} key={`${item.controlProps.id}-${idx}`} schemaId={schema._id}
|
||||
/>
|
||||
)
|
||||
}</React.Fragment>
|
||||
|
@@ -91,7 +91,7 @@ export default function SchemaPropertiesView({
|
||||
{
|
||||
group.controls.map(
|
||||
(item, idx) => <FieldControl
|
||||
item={item} key={idx} schemaId={schema._id}
|
||||
item={item} key={`${item.controlProps.id}-${idx}`} schemaId={schema._id}
|
||||
/>
|
||||
)
|
||||
}
|
||||
|
@@ -20,7 +20,7 @@ import { PgIconButton } from './Buttons';
|
||||
import CustomPropTypes from '../custom_prop_types';
|
||||
import { InputSwitch } from './FormComponents';
|
||||
import { Checkbox } from '@mui/material';
|
||||
|
||||
import { getEnterKeyHandler } from '../utils';
|
||||
|
||||
const StyledDiv = styled('div')(({theme})=>({
|
||||
'&.pgrt': {
|
||||
@@ -265,6 +265,7 @@ export function PgReactTableHeader({table}) {
|
||||
<div title={flexRender(header.column.columnDef.header, header.getContext())}
|
||||
style={{cursor: header.column.getCanSort() ? 'pointer' : 'initial'}}
|
||||
onClick={header.column.getCanSort() ? header.column.getToggleSortingHandler() : undefined}
|
||||
onKeyDown={header.column.getCanSort() ? getEnterKeyHandler(header.column.getToggleSortingHandler): undefined}
|
||||
>
|
||||
{flexRender(header.column.columnDef.header, header.getContext())}
|
||||
{header.column.getCanSort() && header.column.getIsSorted() &&
|
||||
|
@@ -11,11 +11,12 @@ import { useSingleAndDoubleClick } from '../../../custom_hooks';
|
||||
import * as React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import CustomPropTypes from '../../../../js/custom_prop_types';
|
||||
import { getEnterKeyHandler } from '../../../../js/utils';
|
||||
|
||||
export default function DoubleClickHandler({onSingleClick, onDoubleClick, children}){
|
||||
const onClick = useSingleAndDoubleClick(onSingleClick, onDoubleClick) ;
|
||||
return(
|
||||
<div onClick={(e)=>onClick(e)}>
|
||||
<div onClick={(e)=>onClick(e)} onKeyDown = { getEnterKeyHandler(onClick)}>
|
||||
{children}
|
||||
</div>
|
||||
);
|
||||
|
@@ -48,6 +48,16 @@ export function isShortcutValue(obj) {
|
||||
return [obj.alt, obj.control, obj?.key, obj?.key?.char].every((k)=>!_.isUndefined(k));
|
||||
}
|
||||
|
||||
|
||||
export function getEnterKeyHandler(clickHandler) {
|
||||
return (e)=>{
|
||||
if(e.code === 'Enter'){
|
||||
e.preventDefault();
|
||||
clickHandler(e);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// Convert shortcut obj to codemirror key format
|
||||
export function toCodeMirrorKey(obj) {
|
||||
let shortcut = '';
|
||||
|
@@ -368,17 +368,17 @@ def _get_args_params_values(data, conn, backup_obj_type, backup_file, server,
|
||||
if 'objects' in data:
|
||||
selected_objects = data.get('objects', {})
|
||||
for _key in selected_objects:
|
||||
param = 'schema' if _key == 'schema' else 'table'
|
||||
selected_key = 'schema' if _key == 'schema' else 'table'
|
||||
args.extend(
|
||||
functools.reduce(operator.iconcat, map(
|
||||
lambda s: [f'--{param}',
|
||||
r'{0}.{1}'.format(
|
||||
driver.qtIdent(conn, s['schema']).replace(
|
||||
'"', '\"'),
|
||||
driver.qtIdent(conn, s['name']).replace(
|
||||
'"', '\"')) if type(
|
||||
s) is dict else driver.qtIdent(
|
||||
conn, s).replace('"', '\"')],
|
||||
lambda s, param=selected_key:[
|
||||
f'--{param}',
|
||||
r'{0}.{1}'.format(
|
||||
driver.qtIdent(conn, s['schema']).
|
||||
replace('"', '\"'),
|
||||
driver.qtIdent(conn, s['name']).replace('"', '\"'))
|
||||
if type(s) is dict
|
||||
else driver.qtIdent(conn, s).replace('"', '\"')],
|
||||
selected_objects[_key] or []), [])
|
||||
)
|
||||
|
||||
|
@@ -17,7 +17,7 @@ import { QueryToolEventsContext } from '../QueryToolComponent';
|
||||
import gettext from 'sources/gettext';
|
||||
import { PgMenu, PgMenuItem, usePgMenuGroup } from '../../../../../../static/js/components/Menu';
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
import { getEnterKeyHandler } from '../../../../../../static/js/utils';
|
||||
|
||||
const StyledBox = styled(Box)(({theme}) => ({
|
||||
display: 'flex',
|
||||
@@ -131,6 +131,7 @@ export function StatusBar({eol, handleEndOfLineChange}) {
|
||||
<Tooltip title="Select EOL Sequence" enterDelay={2500}>
|
||||
<span
|
||||
onClick={toggleMenu}
|
||||
onKeyDown={getEnterKeyHandler(toggleMenu)}
|
||||
ref={eolMenuRef}
|
||||
name="menu-eoloptions"
|
||||
style={{
|
||||
|
@@ -151,8 +151,7 @@ SELECT generate_series(1, {}) as id1, 'dummy' as id2""".format(
|
||||
{'page_info': '2001 to 2500', 'cell_rownum': '2001'}
|
||||
]):
|
||||
page_info = self.page.find_by_css_selector(
|
||||
QueryToolLocators.pagination_inputs +
|
||||
f' span:nth-of-type(1)')
|
||||
QueryToolLocators.pagination_inputs + ' span:nth-of-type(1)')
|
||||
|
||||
self.assertEqual(page_info.text,
|
||||
f"Showing rows: {page['page_info']}")
|
||||
|
@@ -1877,7 +1877,7 @@ def module_patch(*args):
|
||||
|
||||
# module was imported, let's use it in the patch
|
||||
patch = mock.patch(*args)
|
||||
patch.getter = lambda: imported
|
||||
patch.getter = lambda imported_module=imported:imported_module
|
||||
patch.attribute = '.'.join(components[i:])
|
||||
return patch
|
||||
except Exception:
|
||||
|
Reference in New Issue
Block a user