bpmn-js 18.6.4 → 18.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -63,6 +63,7 @@
63
63
  --popup-background-color: var(--color-white);
64
64
  --popup-border-color: transparent;
65
65
  --popup-shadow-color: var(--color-black-opacity-30);
66
+ --popup-disabled-color: var(--color-grey-225-10-35);
66
67
  --popup-description-color: var(--color-grey-225-10-55);
67
68
  --popup-no-results-color: var(--color-grey-225-10-55);
68
69
  --popup-entry-title-color: var(--color-grey-225-10-55);
@@ -674,6 +675,11 @@
674
675
  background-color: var(--popup-entry-hover-color);
675
676
  }
676
677
 
678
+ .djs-popup .entry.disabled {
679
+ color: var(--popup-disabled-color);
680
+ cursor: not-allowed;
681
+ }
682
+
677
683
  .djs-popup-body .entry:not(:first-child) {
678
684
  margin-top: 2px;
679
685
  }
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * bpmn-js - bpmn-modeler v18.6.4
2
+ * bpmn-js - bpmn-modeler v18.7.0
3
3
  *
4
4
  * Copyright (c) 2014-present, camunda Services GmbH
5
5
  *
@@ -8,7 +8,7 @@
8
8
  *
9
9
  * Source Code: https://github.com/bpmn-io/bpmn-js
10
10
  *
11
- * Date: 2025-09-16
11
+ * Date: 2025-09-23
12
12
  */
13
13
  (function (global, factory) {
14
14
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
@@ -27542,6 +27542,18 @@
27542
27542
 
27543
27543
  const groups = q(() => groupEntries$1(headerEntries), [ headerEntries ]);
27544
27544
 
27545
+ const isActionable = (entry) => {
27546
+ return entry.action && !entry.disabled;
27547
+ };
27548
+
27549
+ const handleClick = (event, entry) => {
27550
+ if (!isActionable(entry)) {
27551
+ return;
27552
+ }
27553
+
27554
+ return onSelect(event, entry);
27555
+ };
27556
+
27545
27557
  return m$1`
27546
27558
  <div class="djs-popup-header">
27547
27559
  <h3 class="djs-popup-title" title=${ title }>${ title }</h3>
@@ -27550,15 +27562,16 @@
27550
27562
 
27551
27563
  ${ group.entries.map(entry => m$1`
27552
27564
  <li key=${ entry.id }>
27553
- <${ entry.action ? 'button' : 'span' }
27565
+ <${ isActionable(entry) ? 'button' : 'span' }
27554
27566
  class=${ getHeaderClasses(entry, entry === selectedEntry) }
27555
- onClick=${ event => entry.action && onSelect(event, entry) }
27567
+ onClick=${ event => handleClick(event, entry) }
27556
27568
  title=${ entry.title || entry.label }
27557
27569
  data-id=${ entry.id }
27558
- onMouseEnter=${ () => entry.action && setSelectedEntry(entry) }
27559
- onMouseLeave=${ () => entry.action && setSelectedEntry(null) }
27560
- onFocus=${ () => entry.action && setSelectedEntry(entry) }
27561
- onBlur=${ () => entry.action && setSelectedEntry(null) }
27570
+ aria-disabled=${ entry.disabled || undefined }
27571
+ onMouseEnter=${ () => isActionable(entry) && setSelectedEntry(entry) }
27572
+ onMouseLeave=${ () => isActionable(entry) && setSelectedEntry(null) }
27573
+ onFocus=${ () => isActionable(entry) && setSelectedEntry(entry) }
27574
+ onBlur=${ () => isActionable(entry) && setSelectedEntry(null) }
27562
27575
  >
27563
27576
  ${(entry.imageUrl && m$1`<img class="djs-popup-entry-icon" src=${ entry.imageUrl } alt="" />`) ||
27564
27577
  (entry.imageHtml && m$1`<div class="djs-popup-entry-icon" dangerouslySetInnerHTML=${ { __html: entry.imageHtml } } />`)}
@@ -27629,18 +27642,27 @@
27629
27642
  onAction
27630
27643
  } = props;
27631
27644
 
27645
+ const handleClick = (event, action) => {
27646
+ if (entry.disabled) {
27647
+ return;
27648
+ }
27649
+
27650
+ return onAction(event, entry, action);
27651
+ };
27652
+
27632
27653
  return m$1`
27633
27654
  <li
27634
- class=${ clsx('entry', { selected }) }
27655
+ class=${ clsx('entry', { selected, disabled: entry.disabled }) }
27635
27656
  data-id=${ entry.id }
27636
27657
  title=${ entry.title || entry.label }
27658
+ aria-disabled=${ entry.disabled || undefined }
27637
27659
  tabIndex="0"
27638
- onClick=${ onAction }
27660
+ onClick=${ handleClick }
27639
27661
  onFocus=${ onMouseEnter }
27640
27662
  onBlur=${ onMouseLeave }
27641
27663
  onMouseEnter=${ onMouseEnter }
27642
27664
  onMouseLeave=${ onMouseLeave }
27643
- onDragStart=${ (event) => onAction(event, entry, 'dragstart') }
27665
+ onDragStart=${ (event) => handleClick(event, 'dragstart') }
27644
27666
  draggable=${ true }
27645
27667
  >
27646
27668
  <div class="djs-popup-entry-content">
@@ -27686,13 +27708,14 @@
27686
27708
 
27687
27709
  /**
27688
27710
  * @typedef {import('./PopupMenuProvider').PopupMenuEntry} PopupMenuEntry
27711
+ * @typedef {import('./PopupMenuProvider').PopupMenuGroup} PopupMenuGroup
27689
27712
  */
27690
27713
 
27691
27714
  /**
27692
27715
  * Component that renders a popup menu entry list.
27693
27716
  *
27694
27717
  * @param {Object} props
27695
- * @param {PopupMenuEntry[]} props.entries
27718
+ * @param {PopupMenuGroup[]} props.groupedEntries
27696
27719
  * @param {PopupMenuEntry} props.selectedEntry
27697
27720
  * @param {(entry: PopupMenuEntry | null) => void} props.setSelectedEntry
27698
27721
  */
@@ -27700,14 +27723,12 @@
27700
27723
  const {
27701
27724
  selectedEntry,
27702
27725
  setSelectedEntry,
27703
- entries,
27726
+ groupedEntries,
27704
27727
  ...restProps
27705
27728
  } = props;
27706
27729
 
27707
27730
  const resultsRef = F();
27708
27731
 
27709
- const groups = q(() => groupEntries(entries), [ entries ]);
27710
-
27711
27732
  // scroll to selected result
27712
27733
  A(() => {
27713
27734
  const containerEl = resultsRef.current;
@@ -27724,7 +27745,7 @@
27724
27745
 
27725
27746
  return m$1`
27726
27747
  <div class="djs-popup-results" ref=${ resultsRef }>
27727
- ${ groups.map(group => m$1`
27748
+ ${ groupedEntries.map(group => m$1`
27728
27749
  ${ group.name && m$1`
27729
27750
  <div key=${ group.id } class="entry-header" title=${ group.name }>
27730
27751
  ${ group.name }
@@ -27748,33 +27769,6 @@
27748
27769
  }
27749
27770
 
27750
27771
 
27751
- // helpers
27752
- function groupEntries(entries) {
27753
- const groups = [];
27754
-
27755
- const getGroup = group => groups.find(elem => group.id === elem.id);
27756
-
27757
- const containsGroup = group => !!getGroup(group);
27758
-
27759
- // legacy support for provider built for the old popUp menu
27760
- const formatGroup = group =>
27761
- typeof group === 'string' ? { id: group } : group;
27762
-
27763
- entries.forEach(entry => {
27764
-
27765
- // assume a default group when none is provided
27766
- const group = entry.group ? formatGroup(entry.group) : { id: 'default' };
27767
-
27768
- if (!containsGroup(group)) {
27769
- groups.push({ ...group, entries: [ entry ] });
27770
- } else {
27771
- getGroup(group).entries.push(entry);
27772
- }
27773
- });
27774
-
27775
- return groups;
27776
- }
27777
-
27778
27772
  // helpers ////////////////
27779
27773
 
27780
27774
  function scrollIntoView(el) {
@@ -27792,6 +27786,7 @@
27792
27786
  * @typedef {import('./PopupMenuProvider').PopupMenuEntry} PopupMenuEntry
27793
27787
  * @typedef {import('./PopupMenuProvider').PopupMenuHeaderEntry} PopupMenuHeaderEntry
27794
27788
  * @typedef {import('./PopupMenuProvider').PopupMenuEmptyPlaceholderProvider | import('./PopupMenuProvider').PopupMenuEmptyPlaceholder} PopupMenuEmptyPlaceholder
27789
+ * @typedef {import('./PopupMenuProvider').PopupMenuGroup} PopupMenuGroup
27795
27790
  *
27796
27791
  * @typedef {import('../search/search').default} search
27797
27792
  *
@@ -27867,21 +27862,24 @@
27867
27862
  const [ entries, setEntries ] = p(filterEntries(originalEntries, searchValue));
27868
27863
  const [ selectedEntry, setSelectedEntry ] = p(entries[0]);
27869
27864
 
27865
+ const groupedEntries = q(() => groupEntries(entries), [ entries ]);
27866
+
27870
27867
  const updateEntries = x((newEntries) => {
27871
27868
 
27872
27869
  // always select first
27873
27870
  setSelectedEntry(newEntries[0]);
27874
27871
 
27875
27872
  setEntries(newEntries);
27876
- }, [ selectedEntry, setEntries, setSelectedEntry ]);
27873
+ }, [ setEntries, setSelectedEntry ]);
27877
27874
 
27878
27875
  // filter entries on search value change
27879
27876
  _(() => {
27880
27877
  updateEntries(filterEntries(originalEntries, searchValue));
27881
27878
  }, [ searchValue, originalEntries ]);
27882
27879
 
27883
- // handle keyboard seleciton
27880
+ // handle keyboard selection
27884
27881
  const keyboardSelect = x(direction => {
27882
+ const entries = getOrderedEntries(groupedEntries);
27885
27883
  const idx = entries.indexOf(selectedEntry);
27886
27884
 
27887
27885
  let nextIdx = idx + direction;
@@ -27895,10 +27893,14 @@
27895
27893
  }
27896
27894
 
27897
27895
  setSelectedEntry(entries[nextIdx]);
27898
- }, [ entries, selectedEntry, setSelectedEntry ]);
27896
+ }, [ groupedEntries, selectedEntry, setSelectedEntry ]);
27899
27897
 
27900
27898
  const handleKeyDown = x(event => {
27901
27899
  if (event.key === 'Enter' && selectedEntry) {
27900
+ if (selectedEntry.disabled) {
27901
+ return;
27902
+ }
27903
+
27902
27904
  return onSelect(event, selectedEntry);
27903
27905
  }
27904
27906
 
@@ -27965,7 +27967,7 @@
27965
27967
  ` }
27966
27968
 
27967
27969
  <${PopupMenuList}
27968
- entries=${ entries }
27970
+ groupedEntries=${ groupedEntries }
27969
27971
  selectedEntry=${ selectedEntry }
27970
27972
  setSelectedEntry=${ setSelectedEntry }
27971
27973
  onAction=${ onSelect }
@@ -28065,6 +28067,7 @@
28065
28067
  `;
28066
28068
  }
28067
28069
 
28070
+
28068
28071
  // helpers //////////////////////
28069
28072
 
28070
28073
  function getPopupStyle(props) {
@@ -28075,6 +28078,49 @@
28075
28078
  };
28076
28079
  }
28077
28080
 
28081
+ function getOrderedEntries(groupedEntries) {
28082
+ const entries = [];
28083
+
28084
+ groupedEntries.forEach(group => {
28085
+ group.entries.forEach(entry => {
28086
+ entries.push(entry);
28087
+ });
28088
+ });
28089
+
28090
+ return entries;
28091
+ }
28092
+
28093
+ /**
28094
+ * @param {PopupMenuEntry[]} entries
28095
+ *
28096
+ * @return {PopupMenuGroup[]}
28097
+ */
28098
+ function groupEntries(entries) {
28099
+ const groups = [];
28100
+
28101
+ const getGroup = group => groups.find(elem => group.id === elem.id);
28102
+
28103
+ const containsGroup = group => !!getGroup(group);
28104
+
28105
+ // legacy support for provider built for the old popUp menu
28106
+ const formatGroup = group =>
28107
+ typeof group === 'string' ? { id: group } : group;
28108
+
28109
+ entries.forEach(entry => {
28110
+
28111
+ // assume a default group when none is provided
28112
+ const group = entry.group ? formatGroup(entry.group) : { id: 'default' };
28113
+
28114
+ if (!containsGroup(group)) {
28115
+ groups.push({ ...group, entries: [ entry ] });
28116
+ } else {
28117
+ getGroup(group).entries.push(entry);
28118
+ }
28119
+ });
28120
+
28121
+ return groups;
28122
+ }
28123
+
28078
28124
  /**
28079
28125
  * @typedef {import('../../core/Canvas').default} Canvas
28080
28126
  * @typedef {import('../../core/EventBus').default} EventBus