-
Notifications
You must be signed in to change notification settings - Fork 418
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Improve search in large diagrams #931
Conversation
56a2ca0
to
16f13c2
Compare
16f13c2
to
fa36b90
Compare
Returning reference to viewbox can lead to undesired effects.
fa36b90
to
2612d06
Compare
Try out via
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Works well. Thanks for following up.
@@ -1153,7 +1153,7 @@ Canvas.prototype._viewboxChanged = function() { | |||
Canvas.prototype.viewbox = function(box) { | |||
|
|||
if (box === undefined && this._cachedViewbox) { | |||
return this._cachedViewbox; | |||
return JSON.parse(JSON.stringify(this._cachedViewbox)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What is the issue here, could you elaborate? To me this looks like a hack. The cached viewbox, after all, should not be fiddled with.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The problem is when you return a reference to the viewbox to the caller of viewbox()
they will assume that it's not going to be mutated. This is an issue I ran into. I called viewbox()
to then used the viewbox at a later point just to realize it had been changed.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
BTW there is a dedicated API for deep cloning: https://developer.mozilla.org/en-US/docs/Web/API/Window/structuredClone
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could be a follow-up improvement.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Simple clone:
{ ...viewbox }
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If this needs to return a copy, a shallow clone won't work due to nested objects (inner
and friends).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'll need to figure why this needs a copy in the first place. We always construct a fresh viewbox., and the cached viewbox is not to be fiddled with.
@philippfromme Still looking for a concrete scenario where users would mutate the viewbox, and would love to see that as a test.
To prevent mutation (which does not make sense anyway), we can freeze the object, too.
canvas.scrollToElement(shape); | ||
|
||
// then | ||
expect(JSON.stringify(viewbox)).to.eql(viewboxStringified); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't understand the test either 🙈. If we want the to verify "no identity", why don't we test for "not equal"?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm testing whether the viewbox I got from calling viewbox()
has been changed. If you remove the JSON.parse(JSON.stringify())
part you'll see the test failing.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A much simpler test would be:
// mind the "strict object equality"
expect(canvas.viewbox()).not.to.equal(canvas.viewbox())
But
// mind the loose object comparison
expect(canvas.viewbox()).to.eql(canvas.viewbox());
?
@GeethaParthasarathy FYI :) |
Proposed Changes
Related to bpmn-io/bpmn-js#2233
Related to camunda/camunda-modeler#4538
Checklist
To ensure you provided everything we need to look at your PR:
@bpmn-io/sr
toolCloses {LINK_TO_ISSUE}
orRelated to {LINK_TO_ISSUE}