diff --git a/CHANGELOG.md b/CHANGELOG.md index cdcb01fcff37..79affefdd5e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Saving relative paths in dummy chunks instead of absolute () - Objects with a specific label cannot be displayed if at least one tag with the label exist () - Wrong attribute can be removed in labels editor () +- UI fails with the error "Cannot read property 'label' of undefined" () +- Exception: "Value must be a user instance" () +- Reset zoom option doesn't work in tag annotation mode () - Canvas is busy error () ### Security diff --git a/cvat-ui/package-lock.json b/cvat-ui/package-lock.json index 679a5b0f55e3..b5125c00e15d 100644 --- a/cvat-ui/package-lock.json +++ b/cvat-ui/package-lock.json @@ -1,6 +1,6 @@ { "name": "cvat-ui", - "version": "1.10.3", + "version": "1.10.6", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/cvat-ui/package.json b/cvat-ui/package.json index d065da58f43b..3251f662bb51 100644 --- a/cvat-ui/package.json +++ b/cvat-ui/package.json @@ -1,6 +1,6 @@ { "name": "cvat-ui", - "version": "1.10.3", + "version": "1.10.6", "description": "CVAT single-page application", "main": "src/index.tsx", "scripts": { diff --git a/cvat-ui/src/components/annotation-page/standard-workspace/canvas-wrapper.tsx b/cvat-ui/src/components/annotation-page/standard-workspace/canvas-wrapper.tsx index d760411ab66a..acc697ae0990 100644 --- a/cvat-ui/src/components/annotation-page/standard-workspace/canvas-wrapper.tsx +++ b/cvat-ui/src/components/annotation-page/standard-workspace/canvas-wrapper.tsx @@ -10,7 +10,9 @@ import Icon from 'antd/lib/icon'; import Layout from 'antd/lib/layout/layout'; import Slider, { SliderValue } from 'antd/lib/slider'; -import { ColorBy, GridColor, ObjectType, ContextMenuType, Workspace, ShapeType } from 'reducers/interfaces'; +import { + ColorBy, GridColor, ObjectType, ContextMenuType, Workspace, ShapeType, +} from 'reducers/interfaces'; import { LogType } from 'cvat-logger'; import { Canvas } from 'cvat-canvas-wrapper'; import getCore from 'cvat-core-wrapper'; @@ -217,10 +219,7 @@ export default class CanvasWrapperComponent extends React.PureComponent { this.updateCanvas(); } - if ( - prevProps.frame !== frameData.number && - ((resetZoom && workspace !== Workspace.ATTRIBUTE_ANNOTATION) || workspace === Workspace.TAG_ANNOTATION) - ) { + if (prevProps.frame !== frameData.number && resetZoom && workspace !== Workspace.ATTRIBUTE_ANNOTATION) { canvasInstance.html().addEventListener( 'canvas.setup', () => { @@ -304,7 +303,9 @@ export default class CanvasWrapperComponent extends React.PureComponent { } private onCanvasShapeDrawn = (event: any): void => { - const { jobInstance, activeLabelID, activeObjectType, frame, onShapeDrawn, onCreateAnnotations } = this.props; + const { + jobInstance, activeLabelID, activeObjectType, frame, onShapeDrawn, onCreateAnnotations, + } = this.props; if (!event.detail.continue) { onShapeDrawn(); @@ -327,7 +328,9 @@ export default class CanvasWrapperComponent extends React.PureComponent { }; private onCanvasObjectsMerged = (event: any): void => { - const { jobInstance, frame, onMergeAnnotations, onMergeObjects } = this.props; + const { + jobInstance, frame, onMergeAnnotations, onMergeObjects, + } = this.props; onMergeObjects(false); @@ -340,7 +343,9 @@ export default class CanvasWrapperComponent extends React.PureComponent { }; private onCanvasObjectsGroupped = (event: any): void => { - const { jobInstance, frame, onGroupAnnotations, onGroupObjects } = this.props; + const { + jobInstance, frame, onGroupAnnotations, onGroupObjects, + } = this.props; onGroupObjects(false); @@ -349,7 +354,9 @@ export default class CanvasWrapperComponent extends React.PureComponent { }; private onCanvasTrackSplitted = (event: any): void => { - const { jobInstance, frame, onSplitAnnotations, onSplitTrack } = this.props; + const { + jobInstance, frame, onSplitAnnotations, onSplitTrack, + } = this.props; onSplitTrack(false); @@ -429,7 +436,9 @@ export default class CanvasWrapperComponent extends React.PureComponent { }; private onCanvasCursorMoved = async (event: any): Promise => { - const { jobInstance, activatedStateID, workspace, onActivateObject } = this.props; + const { + jobInstance, activatedStateID, workspace, onActivateObject, + } = this.props; if (workspace !== Workspace.STANDARD) { return; @@ -560,7 +569,9 @@ export default class CanvasWrapperComponent extends React.PureComponent { } private updateShapesView(): void { - const { annotations, opacity, colorBy, outlined, outlineColor } = this.props; + const { + annotations, opacity, colorBy, outlined, outlineColor, + } = this.props; for (const state of annotations) { let shapeColor = ''; @@ -588,7 +599,9 @@ export default class CanvasWrapperComponent extends React.PureComponent { } private updateCanvas(): void { - const { curZLayer, annotations, frameData, canvasInstance } = this.props; + const { + curZLayer, annotations, frameData, canvasInstance, + } = this.props; if (frameData !== null) { canvasInstance.setup( diff --git a/cvat-ui/src/components/task-page/user-selector.tsx b/cvat-ui/src/components/task-page/user-selector.tsx index 0cc42db9b2a8..f5fdcf0b8efa 100644 --- a/cvat-ui/src/components/task-page/user-selector.tsx +++ b/cvat-ui/src/components/task-page/user-selector.tsx @@ -83,13 +83,7 @@ export default function UserSelector(props: Props): JSX.Element { if (value && !users.filter((user) => user.id === value.id).length) { core.users.get({ id: value.id }).then((result: User[]) => { const [user] = result; - setUsers([ - ...users, - { - id: user.id, - username: user.username, - }, - ]); + setUsers([...users, user]); setSearchPhrase(user.username); }); } diff --git a/cvat-ui/src/containers/annotation-page/standard-workspace/canvas-context-menu.tsx b/cvat-ui/src/containers/annotation-page/standard-workspace/canvas-context-menu.tsx index 43b2ad4a40c7..c172abb58809 100644 --- a/cvat-ui/src/containers/annotation-page/standard-workspace/canvas-context-menu.tsx +++ b/cvat-ui/src/containers/annotation-page/standard-workspace/canvas-context-menu.tsx @@ -24,7 +24,10 @@ function mapStateToProps(state: CombinedState): StateToProps { annotation: { annotations: { activatedStateID, collapsed, states: objectStates }, canvas: { - contextMenu: { visible, top, left, type }, + contextMenu: { + visible, top, left, type, + }, + ready, }, }, } = state; @@ -33,7 +36,11 @@ function mapStateToProps(state: CombinedState): StateToProps { activatedStateID, collapsed: activatedStateID !== null ? collapsed[activatedStateID] : undefined, objectStates, - visible, + visible: + activatedStateID !== null && + visible && + ready && + objectStates.map((_state: any): number => _state.clientID).includes(activatedStateID), left, top, type, @@ -166,7 +173,9 @@ class CanvasContextMenuContainer extends React.PureComponent { public render(): JSX.Element { const { left, top } = this.state; - const { visible, activatedStateID, objectStates, type } = this.props; + const { + visible, activatedStateID, objectStates, type, + } = this.props; return ( <> diff --git a/cvat-ui/src/containers/annotation-page/standard-workspace/objects-side-bar/object-item.tsx b/cvat-ui/src/containers/annotation-page/standard-workspace/objects-side-bar/object-item.tsx index 2d2e6f516ca2..987598f77f74 100644 --- a/cvat-ui/src/containers/annotation-page/standard-workspace/objects-side-bar/object-item.tsx +++ b/cvat-ui/src/containers/annotation-page/standard-workspace/objects-side-bar/object-item.tsx @@ -7,7 +7,9 @@ import copy from 'copy-to-clipboard'; import { connect } from 'react-redux'; import { LogType } from 'cvat-logger'; -import { ActiveControl, CombinedState, ColorBy, ShapeType } from 'reducers/interfaces'; +import { + ActiveControl, CombinedState, ColorBy, ShapeType, +} from 'reducers/interfaces'; import { collapseObjectItems, updateAnnotationsAsync, @@ -83,40 +85,25 @@ function mapStateToProps(state: CombinedState, own: OwnProps): StateToProps { const stateIDs = states.map((_state: any): number => _state.clientID); const index = stateIDs.indexOf(clientID); - try { - const collapsedState = - typeof statesCollapsed[clientID] === 'undefined' ? initialCollapsed : statesCollapsed[clientID]; - - return { - objectState: states[index], - collapsed: collapsedState, - attributes: jobAttributes[states[index].label.id], - labels, - ready, - activeControl, - colorBy, - jobInstance, - frameNumber, - activated: activatedStateID === clientID, - minZLayer, - maxZLayer, - normalizedKeyMap, - aiToolsRef, - }; - } catch (exception) { - // we have an exception here sometimes - // but I cannot understand when it happens and what is the root reason - // maybe this temporary hack helps us - const dataObject = { - index, - frameNumber, - clientID: own.clientID, - stateIDs, - }; - throw new Error( - `${exception.toString()} in mapStateToProps of ObjectItemContainer. Data are ${JSON.stringify(dataObject)}`, - ); - } + const collapsedState = + typeof statesCollapsed[clientID] === 'undefined' ? initialCollapsed : statesCollapsed[clientID]; + + return { + objectState: states[index], + collapsed: collapsedState, + attributes: jobAttributes[states[index].label.id], + labels, + ready, + activeControl, + colorBy, + jobInstance, + frameNumber, + activated: activatedStateID === clientID, + minZLayer, + maxZLayer, + normalizedKeyMap, + aiToolsRef, + }; } function mapDispatchToProps(dispatch: any): DispatchToProps { @@ -219,7 +206,9 @@ class ObjectItemContainer extends React.PureComponent { }; private activate = (): void => { - const { activateObject, objectState, ready, activeControl } = this.props; + const { + activateObject, objectState, ready, activeControl, + } = this.props; if (ready && activeControl === ActiveControl.CURSOR) { activateObject(objectState.clientID); @@ -324,7 +313,9 @@ class ObjectItemContainer extends React.PureComponent { } public render(): JSX.Element { - const { objectState, collapsed, labels, attributes, activated, colorBy, normalizedKeyMap } = this.props; + const { + objectState, collapsed, labels, attributes, activated, colorBy, normalizedKeyMap, + } = this.props; let stateColor = ''; if (colorBy === ColorBy.INSTANCE) {