Skip to content

Commit

Permalink
Fixed comparison of shapes (#1000)
Browse files Browse the repository at this point in the history
  • Loading branch information
bsekachev authored and nmanovic committed Dec 24, 2019
1 parent 63d5326 commit c407874
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 6 deletions.
10 changes: 8 additions & 2 deletions cvat-core/src/annotations-saver.js
Original file line number Diff line number Diff line change
Expand Up @@ -102,12 +102,18 @@
},
};

const keys = ['id', 'label_id', 'group', 'frame',
'occluded', 'z_order', 'points', 'type', 'shapes',
'attributes', 'value', 'spec_id', 'outside'];

// Find created and updated objects
for (const type of Object.keys(exported)) {
for (const object of exported[type]) {
if (object.id in this.initialObjects[type]) {
const exportedHash = JSON.stringify(object);
const initialHash = JSON.stringify(this.initialObjects[type][object.id]);
const exportedHash = JSON.stringify(object, keys);
const initialHash = JSON.stringify(
this.initialObjects[type][object.id], keys,
);
if (exportedHash !== initialHash) {
splitted.updated[type].push(object);
}
Expand Down
30 changes: 26 additions & 4 deletions cvat/apps/engine/static/engine/js/annotationSaver.js
Original file line number Diff line number Diff line change
Expand Up @@ -151,14 +151,18 @@ class AnnotationSaverModel extends Listener {
tags: [],
};

const keys = ['id', 'label_id', 'group', 'frame',
'occluded', 'z_order', 'points', 'type', 'shapes',
'attributes', 'value', 'spec_id', 'outside'];

// Compare initial state objects and export state objects
// in order to get updated and created objects
for (const type of Object.keys(this._initialObjects)) {
for (const obj of exported[type]) {
if (obj.id in this._initialObjects[type]) {
const exportedHash = JSON.stringify(obj);
const initialSash = JSON.stringify(this._initialObjects[type][obj.id]);
if (exportedHash !== initialSash) {
const exportedHash = JSON.stringify(obj, keys);
const initialHash = JSON.stringify(this._initialObjects[type][obj.id], keys);
if (exportedHash !== initialHash) {
updated[type].push(obj);
}
} else if (typeof obj.id === 'undefined') {
Expand Down Expand Up @@ -241,20 +245,33 @@ class AnnotationSaverModel extends Listener {
this._shapeCollection.flush = false;
this._version = savedObjects.version;
this._resetState();

for (const type of Object.keys(this._initialObjects)) {
for (const object of savedObjects[type]) {
if (object.shapes) {
for (const shape of object.shapes) {
delete shape.id;
}
}
this._initialObjects[type][object.id] = object;
}
}

this._version = savedObjects.version;
} else {
const [created, updated, deleted] = this._split(exported);
this.notify('saveCreated');
const savedCreated = await this._create(created);
this._updateCreatedObjects(created, savedCreated, mapping);
this._version = savedCreated.version;

for (const type of Object.keys(this._initialObjects)) {
for (const object of savedCreated[type]) {
if (object.shapes) {
for (const shape of object.shapes) {
delete shape.id;
}
}
this._initialObjects[type][object.id] = object;
}
}
Expand All @@ -264,6 +281,11 @@ class AnnotationSaverModel extends Listener {
this._version = savedUpdated.version;
for (const type of Object.keys(this._initialObjects)) {
for (const object of savedUpdated[type]) {
if (object.shapes) {
for (const shape of object.shapes) {
delete shape.id;
}
}
this._initialObjects[type][object.id] = object;
}
}
Expand Down Expand Up @@ -375,7 +397,7 @@ class AnnotationSaverView {
});

window.onbeforeunload = (e) => {
if (this._controller.hasUnsavedChanges()) { // eslint-disable-line react/no-this-in-sfc
if (this._controller.hasUnsavedChanges()) {
const message = 'You have unsaved changes. Leave this page?';
e.returnValue = message;
return message;
Expand Down

0 comments on commit c407874

Please sign in to comment.