Skip to content

Commit 4e8e62b

Browse files
hlomzikborisheartexcursoragent
authored
fix: BROS-841: fix lock for unfinished polygons (#9572)
Co-authored-by: borisheartex <boris@humansignal.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: borisheartex <borisheartex@users.noreply.github.com>
1 parent fa31710 commit 4e8e62b

6 files changed

Lines changed: 60 additions & 45 deletions

File tree

web/libs/editor/src/components/SidePanels/DetailsPanel/RegionItem.tsx

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -143,19 +143,21 @@ const RegionAction: FC<any> = observer(({ region, annotation, editMode, onEditMo
143143
{!region.isReadOnly() && entityButtons}
144144
</div>
145145
<div className={cn("region-actions").elem("group").mod({ align: "right" }).toClassName()}>
146-
<LockButton
147-
item={region}
148-
annotation={region?.annotation}
149-
hovered={true}
150-
locked={region?.locked}
151-
onClick={() => region.setLocked(!region.locked)}
152-
displayedHotkey="region:lock"
153-
variant="neutral"
154-
look="string"
155-
aria-label="Unlock Region"
156-
tooltip="Unlock Region"
157-
/>
158-
{region.hideable && (
146+
{!region.incomplete && (
147+
<LockButton
148+
item={region}
149+
annotation={region?.annotation}
150+
hovered={true}
151+
locked={region?.locked}
152+
onClick={() => region.setLocked(!region.locked)}
153+
displayedHotkey="region:lock"
154+
variant="neutral"
155+
look="string"
156+
aria-label="Unlock Region"
157+
tooltip="Unlock Region"
158+
/>
159+
)}
160+
{!region.incomplete && region.hideable && (
159161
<RegionActionButton
160162
aria-label={`${region.hidden ? "Show" : "Hide"} selected region`}
161163
variant="neutral"

web/libs/editor/src/components/SidePanels/OutlinerPanel/OutlinerTree.tsx

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,6 @@ const RootTitle: FC<any> = observer(
388388
isArea,
389389
...props
390390
}) => {
391-
const hovered = item?.highlighted;
392391
const [collapsed, setCollapsed] = useState(false);
393392

394393
const controls = useMemo(() => {
@@ -529,32 +528,36 @@ const RegionControls: FC<RegionControlsProps> = injector(
529528
<RegionContextMenu item={item} />
530529
</div>
531530
)}
532-
<div className={cn("outliner-item").elem("control").mod({ type: "lock" }).toClassName()}>
533-
<LockButton
534-
item={item}
535-
annotation={item?.annotation}
536-
hovered={hovered}
537-
locked={item?.locked}
538-
onClick={onToggleLocked}
539-
variant="neutral"
540-
look="string"
541-
tooltip={item?.locked ? "Unlock Region" : "Lock Region"}
542-
/>
543-
</div>
544-
<div className={cn("outliner-item").elem("control").mod({ type: "visibility" }).toClassName()}>
545-
<RegionControlButton
546-
variant="neutral"
547-
look="string"
548-
onClick={onToggleHidden}
549-
style={hidden ? undefined : { display: "none" }}
550-
>
551-
{hidden ? (
552-
<IconEyeClosed style={{ width: 20, height: 20 }} />
553-
) : (
554-
<IconEyeOpened style={{ width: 20, height: 20 }} />
555-
)}
556-
</RegionControlButton>
557-
</div>
531+
{!item?.incomplete && (
532+
<div className={cn("outliner-item").elem("control").mod({ type: "lock" }).toClassName()}>
533+
<LockButton
534+
item={item}
535+
annotation={item?.annotation}
536+
hovered={hovered}
537+
locked={item?.locked}
538+
onClick={onToggleLocked}
539+
variant="neutral"
540+
look="string"
541+
tooltip={item?.locked ? "Unlock Region" : "Lock Region"}
542+
/>
543+
</div>
544+
)}
545+
{!item?.incomplete && (
546+
<div className={cn("outliner-item").elem("control").mod({ type: "visibility" }).toClassName()}>
547+
<RegionControlButton
548+
variant="neutral"
549+
look="string"
550+
onClick={onToggleHidden}
551+
style={hidden ? undefined : { display: "none" }}
552+
>
553+
{hidden ? (
554+
<IconEyeClosed style={{ width: 20, height: 20 }} />
555+
) : (
556+
<IconEyeOpened style={{ width: 20, height: 20 }} />
557+
)}
558+
</RegionControlButton>
559+
</div>
560+
)}
558561
{hasControls && (
559562
<div className={cn("outliner-item").elem("control").mod({ type: "visibility" }).toClassName()}>
560563
<RegionControlButton variant="neutral" look="string" onClick={onToggleCollapsed}>

web/libs/editor/src/mixins/Regions.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ const RegionsMixin = types
152152
},
153153

154154
setLocked(locked) {
155+
if (self.incomplete === true) return;
155156
if (locked instanceof Function) {
156157
self.locked = locked(self.locked);
157158
} else {
@@ -232,6 +233,10 @@ const RegionsMixin = types
232233
},
233234

234235
toggleHidden(e, isFiltered = false) {
236+
if (self.incomplete === true) {
237+
e && e.stopPropagation();
238+
return;
239+
}
235240
if (!isFiltered) self.filtered = false;
236241
self.hidden = !self.hidden;
237242
e && e.stopPropagation();

web/libs/editor/src/regions/PolygonRegion.jsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ const Model = types
6767
get flattenedPoints() {
6868
return getFlattenedPoints(this.points);
6969
},
70+
get incomplete() {
71+
return !self.closed;
72+
},
7073
}))
7174
.actions((self) => {
7275
return {

web/libs/editor/src/regions/__tests__/PolygonRegion.test.jsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ jest.mock("../../tags/object/Image", () => {
2323
return 100;
2424
},
2525
}))
26-
.actions((self) => ({
27-
createSerializedResult(region, value) {
26+
.actions(() => ({
27+
createSerializedResult(_region, value) {
2828
return {
2929
value: { ...value },
3030
original_width: 100,
@@ -62,7 +62,7 @@ const TestRoot = types
6262
results: [],
6363
}),
6464
})
65-
.views((self) => ({
65+
.views(() => ({
6666
get canvasToInternalX() {
6767
return (x) => x;
6868
},
@@ -73,8 +73,8 @@ const TestRoot = types
7373
return () => false;
7474
},
7575
}))
76-
.actions((self) => ({
77-
createSerializedResult(region, value) {
76+
.actions(() => ({
77+
createSerializedResult(_region, value) {
7878
return {
7979
value: { ...value },
8080
original_width: 100,

web/libs/editor/src/stores/Annotation/Annotation.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,12 +510,14 @@ const _Annotation = types
510510

511511
lockSelectedRegions() {
512512
for (const region of self.selectedRegions) {
513+
if (region.incomplete === true) continue;
513514
region.setLocked(!region.locked);
514515
}
515516
},
516517

517518
hideSelectedRegions() {
518519
for (const region of self.selectedRegions) {
520+
if (region.incomplete === true) continue;
519521
region.toggleHidden();
520522
}
521523
},

0 commit comments

Comments
 (0)