-
Notifications
You must be signed in to change notification settings - Fork 420
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 :) |
# Changes Siehe Changelog: https://github.com/bpmn-io/diagram-js/blob/develop/CHANGELOG.md ## 15.2.4 * `FIX`: canvas `autoFocus` must explicitly be enabled ([bpmn-io#956](bpmn-io#956)) * `FIX`: properly integrate `zoomscroll` with canvas focus ([bpmn-io#956](bpmn-io#956)) * `FIX`: properly integrate `movecanvas` with canvas focus ([bpmn-io#956](bpmn-io#956)) ## 15.2.3 * `FIX`: adjust search to prioritize start of word and exact matches ([bpmn-io#953](bpmn-io#953)) * `FIX`: ignore whitespace when searching ([bpmn-io#954](bpmn-io#954)) ## 15.2.2 * `FIX`: correct `Keyboard#bind` and config types ([bpmn-io#948](bpmn-io#948)) ## 15.2.1 * `FIX`: limit overly permissive regex ([bpmn-io#949](bpmn-io#949)) ## 15.2.0 * `FIX`: clear selection when opening search pad ([bpmn-io#947](bpmn-io#947)) * `FIX`: correct dangling selection after search pad interaction ([bpmn-io#947](bpmn-io#947)) * `CHORE`: simplify search pad pre-selection behavior ([bpmn-io#947](bpmn-io#947)) ## 15.1.0 * `FEAT`: integrate `popup-menu` with `search` ([bpmn-io#932](bpmn-io#932)) * `FEAT`: recognize modern `search` tokens in `search-pad` ([bpmn-io#932](bpmn-io#932)) * `FEAT`: improve `search` types ([bpmn-io#932](bpmn-io#932)) * `FIX`: correctly handle duplicate entries and whitespace in `search` ([bpmn-io#932](bpmn-io#932)) * `FIX`: find `search` terms across all keys ([bpmn-io#932](bpmn-io#932)) * `FIX`: `search` always returns tokens for matched items ([bpmn-io#932](bpmn-io#932)) ## 15.0.0 * `FEAT`: make canvas browser selectable ([bpmn-io#659](bpmn-io#659)) * `FEAT`: make keyboard binding implicit ([bpmn-io#661](bpmn-io#661)) * `FEAT`: make multi-selection outline an outline concern ([bpmn-io#944](bpmn-io#944)) ### Breaking Changes * `Keyboard` binding target can no longer be chosen. Configure keyboard binding via the `keyboard.bind` configuration and rely on keybindings to work if the canvas has browser focus. ([bpmn-io#661](bpmn-io#661)) * The `Canvas` is now a focusable component, that is recognized accordingly by the browser, with all benefits for UX and interaction. Components that pull focus from the `Canvas` during modeling must ensure to restore the focus (if intended), via `Canvas#restoreFocus`. ([bpmn-io#661](bpmn-io#661)) * The `selection` feature does not provide visual outline by default anymore. Use the `outline` feature to re-enable it. ([bpmn-io#944](bpmn-io#944)) ## 14.11.3 * `CHORE`: simplify viewbox cloning ([bpmn-io#935](bpmn-io#935)) ## 14.11.2 * `FIX`: restore search result highlight ([bpmn-io#931](bpmn-io#931)) * `FIX`: correct search result highlight not being removed ([bpmn-io#931](bpmn-io#931)) * `FIX`: do not change zoom when search openes ([bpmn-io#931](bpmn-io#931)) ## 14.11.1 _Partially reverts v14.11.0._ * `FIX`: revert `search` integration into popup menu ## 14.11.0 * `FEAT`: add `search` utility * `FEAT`: sort popup entry search results semantically ([bpmn-io#916](bpmn-io#916)) ## 14.10.0 * `FEAT`: align search styling with other popups ([bpmn-io#913](bpmn-io#913)) * `CHORE`: use existing outline in search ([bpmn-io#913](bpmn-io#913)) * `FIX`: only commit search viewport changes on `ENTER` ([bpmn-io#913](bpmn-io#913)) ## 14.9.0 * `CHORE`: export types compatible with `verbatimModuleSyntax` ([bpmn-io#927](bpmn-io#927), [bpmn-io#864](bpmn-io#864)) * `CHORE`: re-compute context pad position next frame ([bpmn-io#920](bpmn-io#920))
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}