diff --git a/openmetadata-ui/src/main/resources/ui/eslint.config.mjs b/openmetadata-ui/src/main/resources/ui/eslint.config.mjs index 67e94969ccf4..bbfc3b52ba28 100644 --- a/openmetadata-ui/src/main/resources/ui/eslint.config.mjs +++ b/openmetadata-ui/src/main/resources/ui/eslint.config.mjs @@ -294,33 +294,39 @@ export default [ 'jsx-a11y/no-distracting-elements': 'error', 'jsx-a11y/scope': 'error', + // --- blocking (error): brought to zero by the ESLint-cleanup stack and + // locked so they cannot regress. jsx-a11y + safe-mechanical sonarjs were + // cleared in the a11y/safe-mechanical PR; promoting to error keeps CI red + // on any new violation instead of letting the backlog silently grow back. + 'jsx-a11y/control-has-associated-label': 'error', + 'jsx-a11y/click-events-have-key-events': 'error', + 'jsx-a11y/no-static-element-interactions': 'error', + 'jsx-a11y/label-has-for': 'error', + 'jsx-a11y/no-autofocus': 'error', + 'jsx-a11y/anchor-has-content': 'error', + 'jsx-a11y/no-noninteractive-element-interactions': 'error', + 'jsx-a11y/interactive-supports-focus': 'error', + 'jsx-a11y/anchor-is-valid': 'error', + 'jsx-a11y/alt-text': 'error', + 'jsx-a11y/no-redundant-roles': 'error', + 'jsx-a11y/mouse-events-have-key-events': 'error', + 'jsx-a11y/media-has-caption': 'error', + 'jsx-a11y/no-noninteractive-element-to-interactive-role': 'error', + 'jsx-a11y/anchor-ambiguous-text': 'error', + 'sonarjs/no-collapsible-if': 'error', + 'sonarjs/no-extra-arguments': 'error', + 'sonarjs/no-redundant-jump': 'error', + 'sonarjs/no-duplicated-branches': 'error', + 'sonarjs/no-identical-functions': 'error', + 'sonarjs/prefer-object-literal': 'error', + 'sonarjs/no-redundant-boolean': 'error', + // --- warn tier: on, visible, not yet blocking. Counts are the measured - // backlog at the time of writing; they only go down. + // backlog at the time of writing; they only go down. Each is promoted to + // error by its own cleanup PR once its violations reach zero. 'react-hooks/exhaustive-deps': 'warn', // 1693 across 596 files - 'jsx-a11y/control-has-associated-label': 'warn', // 146 - 'jsx-a11y/click-events-have-key-events': 'warn', // 89 - 'jsx-a11y/no-static-element-interactions': 'warn', // 87 - 'jsx-a11y/label-has-for': 'warn', // 61 - 'jsx-a11y/no-autofocus': 'warn', // 45 - 'jsx-a11y/anchor-has-content': 'warn', // 12 - 'jsx-a11y/no-noninteractive-element-interactions': 'warn', // 8 - 'jsx-a11y/interactive-supports-focus': 'warn', // 7 - 'jsx-a11y/anchor-is-valid': 'warn', // 5 - 'jsx-a11y/alt-text': 'warn', // 3 - 'jsx-a11y/no-redundant-roles': 'warn', // 2 - 'jsx-a11y/mouse-events-have-key-events': 'warn', // 2 - 'jsx-a11y/media-has-caption': 'warn', // 2 - 'jsx-a11y/no-noninteractive-element-to-interactive-role': 'warn', // 2 - 'jsx-a11y/anchor-ambiguous-text': 'warn', // 1 'sonarjs/no-duplicate-string': 'warn', // 640 'sonarjs/cognitive-complexity': ['warn', 15], // 85 - 'sonarjs/no-collapsible-if': 'warn', // 21 - 'sonarjs/no-extra-arguments': 'warn', // 20 - 'sonarjs/no-redundant-jump': 'warn', // 14 - 'sonarjs/no-duplicated-branches': 'warn', // 9 - 'sonarjs/no-identical-functions': 'warn', // 6 - 'sonarjs/prefer-object-literal': 'warn', // 1 - 'sonarjs/no-redundant-boolean': 'warn', // 1 // Complexity and structure. SonarCloud gates these on new code; these // surface the same findings locally and in the editor. diff --git a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedCardNew/CommentCard.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedCardNew/CommentCard.component.tsx index 6f14d857be46..fe03e196a8df 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedCardNew/CommentCard.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedCardNew/CommentCard.component.tsx @@ -132,6 +132,7 @@ const CommentCard = ({ 'reply-card-border-bottom': !isLastReply, })} data-testid="feed-reply-card" + role="presentation" onMouseEnter={() => setIsHovered(true)} onMouseLeave={() => setIsHovered(false)}>
diff --git a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedCardNew/CommentCard.test.tsx b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedCardNew/CommentCard.test.tsx index 258ea30301ec..8bb40e2cd4f9 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedCardNew/CommentCard.test.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedCardNew/CommentCard.test.tsx @@ -67,6 +67,7 @@ jest.mock('../ActivityFeedEditor/ActivityFeedEditorNew', () => { return jest.fn(({ onSave, onTextChange }) => (
onTextChange(e.target.value)} /> diff --git a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedEditor/ActivityFeedEditor.test.tsx b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedEditor/ActivityFeedEditor.test.tsx index 3b0330b3d257..3fdc93dc5f92 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedEditor/ActivityFeedEditor.test.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedEditor/ActivityFeedEditor.test.tsx @@ -35,6 +35,7 @@ jest.mock('../FeedEditor/FeedEditor', () => ({
FeedEditor diff --git a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedEditor/ActivityFeedEditor.tsx b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedEditor/ActivityFeedEditor.tsx index 1f37773112df..dd28865044f2 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedEditor/ActivityFeedEditor.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedEditor/ActivityFeedEditor.tsx @@ -70,15 +70,11 @@ const ActivityFeedEditor = forwardRef( }; const onSaveHandler = () => { - if (editorRef.current) { - if (editorRef.current?.getEditorContent()) { - setEditorValue(''); - editorRef.current?.clearEditorContent(); - const message = getBackendFormat( - editorRef.current?.getEditorContent() - ); - onSave && onSave(message); - } + if (editorRef.current && editorRef.current?.getEditorContent()) { + setEditorValue(''); + editorRef.current?.clearEditorContent(); + const message = getBackendFormat(editorRef.current?.getEditorContent()); + onSave && onSave(message); } }; @@ -94,6 +90,7 @@ const ActivityFeedEditor = forwardRef( return (
e.stopPropagation()}> ( }; const onSaveHandler = () => { - if (editorRef.current) { - if (editorRef.current?.getEditorContent()) { - setEditorValue(''); - editorRef.current?.clearEditorContent(); - const message = getBackendFormat( - editorRef.current?.getEditorContent() - ); - onSave && onSave(message); - } + if (editorRef.current && editorRef.current?.getEditorContent()) { + setEditorValue(''); + editorRef.current?.clearEditorContent(); + const message = getBackendFormat(editorRef.current?.getEditorContent()); + onSave && onSave(message); } }; @@ -95,6 +91,7 @@ const ActivityFeedEditor = forwardRef(
e.stopPropagation()}> { }); await act(async () => { + // eslint-disable-next-line sonarjs/no-extra-arguments -- deferred test resolver resolveSlowRequest({ data: [{ ...mockActivityEvents[0], summary: 'Stale result' }], paging: {}, diff --git a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/FeedEditor/FeedEditor.test.tsx b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/FeedEditor/FeedEditor.test.tsx index 49e608eb46cb..9991a59949d2 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/FeedEditor/FeedEditor.test.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/FeedEditor/FeedEditor.test.tsx @@ -81,7 +81,11 @@ jest.mock('react-quill-new', () => ({ mockCaptureQuillProps(props); return ( -
+
editor
); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/TaskFeedCard/TaskFeedCard.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/TaskFeedCard/TaskFeedCard.component.tsx index dc8d88a840f9..5211d97f646a 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/TaskFeedCard/TaskFeedCard.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/TaskFeedCard/TaskFeedCard.component.tsx @@ -222,7 +222,17 @@ const TaskFeedCard = ({
+ role="button" + tabIndex={0} + onClick={!hidePopover ? showReplies : noop} + onKeyDown={(e) => { + if ( + (e.key === 'Enter' || e.key === ' ') && + !hidePopover + ) { + showReplies(); + } + }}> {' '} {postLength} diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Alerts/DestinationFormItem/TeamAndUserSelectItem/TeamAndUserSelectItem.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Alerts/DestinationFormItem/TeamAndUserSelectItem/TeamAndUserSelectItem.tsx index 28a52da6b561..5c8131bd6403 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Alerts/DestinationFormItem/TeamAndUserSelectItem/TeamAndUserSelectItem.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Alerts/DestinationFormItem/TeamAndUserSelectItem/TeamAndUserSelectItem.tsx @@ -137,6 +137,7 @@ function TeamAndUserSelectItem({ { defaultValue?: string; }) => ( { data-testid={tid} value={value ?? ''} onChange={(e) => onChange?.(e.target.value)}> -