Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/provider/bpmn/BpmnPropertiesProvider.js
Original file line number Diff line number Diff line change
Expand Up @@ -237,8 +237,9 @@ function getGroups(element, injector) {
export default class BpmnPropertiesProvider {

constructor(propertiesPanel, injector) {
propertiesPanel.registerProvider(this);
this._injector = injector;

propertiesPanel.registerProvider(this);
}

getGroups(element) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,9 +106,9 @@ const CAMUNDA_PLATFORM_GROUPS = [
export default class CamundaPlatformPropertiesProvider {

constructor(propertiesPanel, injector) {
propertiesPanel.registerProvider(LOW_PRIORITY, this);

this._injector = injector;

propertiesPanel.registerProvider(LOW_PRIORITY, this);
}

getGroups(element) {
Expand Down
4 changes: 2 additions & 2 deletions src/provider/zeebe/ZeebePropertiesProvider.js
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,9 @@ const ZEEBE_GROUPS = [
export default class ZeebePropertiesProvider {

constructor(propertiesPanel, injector) {
propertiesPanel.registerProvider(LOW_PRIORITY, this);

this._injector = injector;

propertiesPanel.registerProvider(LOW_PRIORITY, this);
}

getGroups(element) {
Expand Down
197 changes: 6 additions & 191 deletions src/render/BpmnPropertiesPanel.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,3 @@
import {
useState,
useMemo,
useEffect,
useCallback
} from '@bpmn-io/properties-panel/preact/hooks';
Comment on lines -1 to -6
Copy link
Member

Choose a reason for hiding this comment

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

I am super happy to see this removed.


import {
find,
isArray,
reduce
} from 'min-dash';

import { FeelLanguageContext, PropertiesPanel } from '@bpmn-io/properties-panel';

import {
Expand All @@ -28,7 +15,6 @@ const DEFAULT_FEEL_LANGUAGE_CONTEXT = {
* @param {Object} props
* @param {djs.model.Base|Array<djs.model.Base>} [props.element]
* @param {Injector} props.injector
* @param { (djs.model.Base) => Array<PropertiesProvider> } props.getProviders
* @param {Object} props.layoutConfig
* @param {Object} props.descriptionConfig
* @param {Object} props.tooltipConfig
Expand All @@ -38,194 +24,38 @@ const DEFAULT_FEEL_LANGUAGE_CONTEXT = {
export default function BpmnPropertiesPanel(props) {
const {
element,
groups,
injector,
getProviders,
layoutConfig: initialLayoutConfig,
layoutConfig,
descriptionConfig,
tooltipConfig,
feelPopupContainer,
getFeelPopupLinks
} = props;

const canvas = injector.get('canvas');
const elementRegistry = injector.get('elementRegistry');
const eventBus = injector.get('eventBus');
const translate = injector.get('translate');

const [ state, setState ] = useState({
selectedElement: element
});

const selectedElement = state.selectedElement;

/**
* @param {djs.model.Base | Array<djs.model.Base>} element
*/
const _update = (element) => {

if (!element) {
return;
}

let newSelectedElement = element;

// handle labels
if (newSelectedElement && newSelectedElement.type === 'label') {
newSelectedElement = newSelectedElement.labelTarget;
}
Comment on lines -72 to -75
Copy link
Member

Choose a reason for hiding this comment

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

Likely cause of the problem.


setState({
...state,
selectedElement: newSelectedElement
});

// notify interested parties on property panel updates
eventBus.fire('propertiesPanel.updated', {
element: newSelectedElement
});
};

// (2) react on element changes

// (2a) selection changed
useEffect(() => {
const onSelectionChanged = (e) => {
const { newSelection = [] } = e;

if (newSelection.length > 1) {
return _update(newSelection);
}

const newElement = newSelection[0];

const rootElement = canvas.getRootElement();

if (isImplicitRoot(rootElement)) {
return;
}

_update(newElement || rootElement);
};

eventBus.on('selection.changed', onSelectionChanged);

return () => {
eventBus.off('selection.changed', onSelectionChanged);
};
}, []);

// (2b) selected element changed
useEffect(() => {
const onElementsChanged = (e) => {
const elements = e.elements;

const updatedElement = findElement(elements, selectedElement);

if (updatedElement && elementExists(updatedElement, elementRegistry)) {
_update(updatedElement);
}
};

eventBus.on('elements.changed', onElementsChanged);

return () => {
eventBus.off('elements.changed', onElementsChanged);
};
}, [ selectedElement ]);
const selectedElement = element;

// (2c) root element changed
useEffect(() => {
const onRootAdded = (e) => {
const element = e.element;

_update(element);
};

eventBus.on('root.added', onRootAdded);

return () => {
eventBus.off('root.added', onRootAdded);
};
}, [ selectedElement ]);

// (2d) provided entries changed
useEffect(() => {
const onProvidersChanged = () => {
_update(selectedElement);
};

eventBus.on('propertiesPanel.providersChanged', onProvidersChanged);

return () => {
eventBus.off('propertiesPanel.providersChanged', onProvidersChanged);
};
}, [ selectedElement ]);

// (2e) element templates changed
useEffect(() => {
const onTemplatesChanged = () => {
_update(selectedElement);
};

eventBus.on('elementTemplates.changed', onTemplatesChanged);

return () => {
eventBus.off('elementTemplates.changed', onTemplatesChanged);
};
}, [ selectedElement ]);

// (3) create properties panel context
const bpmnPropertiesPanelContext = {
selectedElement,
injector,
getService(type, strict) { return injector.get(type, strict); }
};

// (4) retrieve groups for selected element
const providers = getProviders(selectedElement);

const groups = useMemo(() => {
return reduce(providers, function(groups, provider) {

// do not collect groups for multi element state
if (isArray(selectedElement)) {
return [];
}

const updater = provider.getGroups(selectedElement);

return updater(groups);
}, []);
}, [ providers, selectedElement ]);

// (5) notify layout changes
const [ layoutConfig, setLayoutConfig ] = useState(initialLayoutConfig || {});

const onLayoutChanged = useCallback((newLayout) => {
const onLayoutChanged = (layoutConfig) => {
eventBus.fire('propertiesPanel.layoutChanged', {
layout: newLayout
layout: layoutConfig
});
}, [ eventBus ]);

// React to external layout changes
useEffect(() => {
const cb = (e) => {
const { layout } = e;
setLayoutConfig(layout);
};

eventBus.on('propertiesPanel.setLayout', cb);
return () => eventBus.off('propertiesPanel.setLayout', cb);
}, [ eventBus, setLayoutConfig ]);
};

// (6) notify description changes
const onDescriptionLoaded = (description) => {
eventBus.fire('propertiesPanel.descriptionLoaded', {
description
});
};

// (7) notify tooltip changes
const onTooltipLoaded = (tooltip) => {
eventBus.fire('propertiesPanel.tooltipLoaded', {
tooltip
Expand Down Expand Up @@ -253,18 +83,3 @@ export default function BpmnPropertiesPanel(props) {
</BpmnPropertiesPanelContext.Provider>
);
}


// helpers //////////////////////////

function isImplicitRoot(element) {
return element && element.isImplicit;
}

function findElement(elements, element) {
return find(elements, (e) => e === element);
}

function elementExists(element, elementRegistry) {
return element && elementRegistry.get(element.id);
}
Loading