Skip to content
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

Merged
merged 5 commits into from
Sep 25, 2024
Merged

Improve search in large diagrams #931

merged 5 commits into from
Sep 25, 2024

Conversation

philippfromme
Copy link
Contributor

@philippfromme philippfromme commented Sep 23, 2024

Proposed Changes

  • do not set zoom to 1
  • reduce padding below search
  • add custom marker to preselected element

Related to bpmn-io/bpmn-js#2233
Related to camunda/camunda-modeler#4538

brave_cwSIL4Oz5C

Checklist

To ensure you provided everything we need to look at your PR:

  • Brief textual description of the changes present
  • Visual demo attached
  • Steps to try out present, i.e. using the @bpmn-io/sr tool
  • Related issue linked via Closes {LINK_TO_ISSUE} or Related to {LINK_TO_ISSUE}

@nikku nikku force-pushed the search-improvements-next branch from fa36b90 to 2612d06 Compare September 25, 2024 16:42
@nikku nikku requested a review from lmbateman September 25, 2024 16:42
@nikku
Copy link
Member

nikku commented Sep 25, 2024

Try out via

npx @bpmn-io/sr bpmn-io/bpmn-js -l bpmn-io/diagram-js#search-improvements-next

Copy link
Member

@nikku nikku left a 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.

@nikku nikku merged commit 430bc0a into develop Sep 25, 2024
8 of 10 checks passed
@bpmn-io-tasks bpmn-io-tasks bot removed the needs review Review pending label Sep 25, 2024
@nikku nikku deleted the search-improvements-next branch September 25, 2024 16:47
@@ -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));
Copy link
Member

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.

Copy link
Contributor Author

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.

Copy link
Member

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

Copy link
Contributor Author

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.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Simple clone:

{ ...viewbox }

Copy link
Member

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).

Copy link
Member

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);
Copy link
Member

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"?

Copy link
Contributor Author

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.

Copy link
Member

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());

?

@bpmn-io-tasks bpmn-io-tasks bot added the needs review Review pending label Sep 26, 2024
@nikku
Copy link
Member

nikku commented Sep 26, 2024

@GeethaParthasarathy FYI :)

ElRaptorus added a commit to 5minds/diagram-js that referenced this pull request Feb 4, 2025
# 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))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
needs review Review pending
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants