1- import {
2- useState ,
3- useMemo ,
4- useEffect ,
5- useCallback
6- } from '@bpmn-io/properties-panel/preact/hooks' ;
7-
8- import {
9- find ,
10- isArray ,
11- reduce
12- } from 'min-dash' ;
13-
141import { FeelLanguageContext , PropertiesPanel } from '@bpmn-io/properties-panel' ;
152
163import {
@@ -28,7 +15,6 @@ const DEFAULT_FEEL_LANGUAGE_CONTEXT = {
2815 * @param {Object } props
2916 * @param {djs.model.Base|Array<djs.model.Base> } [props.element]
3017 * @param {Injector } props.injector
31- * @param { (djs.model.Base) => Array<PropertiesProvider> } props.getProviders
3218 * @param {Object } props.layoutConfig
3319 * @param {Object } props.descriptionConfig
3420 * @param {Object } props.tooltipConfig
@@ -38,194 +24,38 @@ const DEFAULT_FEEL_LANGUAGE_CONTEXT = {
3824export default function BpmnPropertiesPanel ( props ) {
3925 const {
4026 element,
27+ groups,
4128 injector,
42- getProviders,
43- layoutConfig : initialLayoutConfig ,
29+ layoutConfig,
4430 descriptionConfig,
4531 tooltipConfig,
4632 feelPopupContainer,
4733 getFeelPopupLinks
4834 } = props ;
4935
50- const canvas = injector . get ( 'canvas' ) ;
51- const elementRegistry = injector . get ( 'elementRegistry' ) ;
5236 const eventBus = injector . get ( 'eventBus' ) ;
5337 const translate = injector . get ( 'translate' ) ;
5438
55- const [ state , setState ] = useState ( {
56- selectedElement : element
57- } ) ;
58-
59- const selectedElement = state . selectedElement ;
60-
61- /**
62- * @param {djs.model.Base | Array<djs.model.Base> } element
63- */
64- const _update = ( element ) => {
65-
66- if ( ! element ) {
67- return ;
68- }
69-
70- let newSelectedElement = element ;
71-
72- // handle labels
73- if ( newSelectedElement && newSelectedElement . type === 'label' ) {
74- newSelectedElement = newSelectedElement . labelTarget ;
75- }
76-
77- setState ( {
78- ...state ,
79- selectedElement : newSelectedElement
80- } ) ;
81-
82- // notify interested parties on property panel updates
83- eventBus . fire ( 'propertiesPanel.updated' , {
84- element : newSelectedElement
85- } ) ;
86- } ;
87-
88- // (2) react on element changes
89-
90- // (2a) selection changed
91- useEffect ( ( ) => {
92- const onSelectionChanged = ( e ) => {
93- const { newSelection = [ ] } = e ;
94-
95- if ( newSelection . length > 1 ) {
96- return _update ( newSelection ) ;
97- }
98-
99- const newElement = newSelection [ 0 ] ;
100-
101- const rootElement = canvas . getRootElement ( ) ;
102-
103- if ( isImplicitRoot ( rootElement ) ) {
104- return ;
105- }
106-
107- _update ( newElement || rootElement ) ;
108- } ;
109-
110- eventBus . on ( 'selection.changed' , onSelectionChanged ) ;
111-
112- return ( ) => {
113- eventBus . off ( 'selection.changed' , onSelectionChanged ) ;
114- } ;
115- } , [ ] ) ;
116-
117- // (2b) selected element changed
118- useEffect ( ( ) => {
119- const onElementsChanged = ( e ) => {
120- const elements = e . elements ;
121-
122- const updatedElement = findElement ( elements , selectedElement ) ;
123-
124- if ( updatedElement && elementExists ( updatedElement , elementRegistry ) ) {
125- _update ( updatedElement ) ;
126- }
127- } ;
128-
129- eventBus . on ( 'elements.changed' , onElementsChanged ) ;
130-
131- return ( ) => {
132- eventBus . off ( 'elements.changed' , onElementsChanged ) ;
133- } ;
134- } , [ selectedElement ] ) ;
39+ const selectedElement = element ;
13540
136- // (2c) root element changed
137- useEffect ( ( ) => {
138- const onRootAdded = ( e ) => {
139- const element = e . element ;
140-
141- _update ( element ) ;
142- } ;
143-
144- eventBus . on ( 'root.added' , onRootAdded ) ;
145-
146- return ( ) => {
147- eventBus . off ( 'root.added' , onRootAdded ) ;
148- } ;
149- } , [ selectedElement ] ) ;
150-
151- // (2d) provided entries changed
152- useEffect ( ( ) => {
153- const onProvidersChanged = ( ) => {
154- _update ( selectedElement ) ;
155- } ;
156-
157- eventBus . on ( 'propertiesPanel.providersChanged' , onProvidersChanged ) ;
158-
159- return ( ) => {
160- eventBus . off ( 'propertiesPanel.providersChanged' , onProvidersChanged ) ;
161- } ;
162- } , [ selectedElement ] ) ;
163-
164- // (2e) element templates changed
165- useEffect ( ( ) => {
166- const onTemplatesChanged = ( ) => {
167- _update ( selectedElement ) ;
168- } ;
169-
170- eventBus . on ( 'elementTemplates.changed' , onTemplatesChanged ) ;
171-
172- return ( ) => {
173- eventBus . off ( 'elementTemplates.changed' , onTemplatesChanged ) ;
174- } ;
175- } , [ selectedElement ] ) ;
176-
177- // (3) create properties panel context
17841 const bpmnPropertiesPanelContext = {
17942 selectedElement,
18043 injector,
18144 getService ( type , strict ) { return injector . get ( type , strict ) ; }
18245 } ;
18346
184- // (4) retrieve groups for selected element
185- const providers = getProviders ( selectedElement ) ;
186-
187- const groups = useMemo ( ( ) => {
188- return reduce ( providers , function ( groups , provider ) {
189-
190- // do not collect groups for multi element state
191- if ( isArray ( selectedElement ) ) {
192- return [ ] ;
193- }
194-
195- const updater = provider . getGroups ( selectedElement ) ;
196-
197- return updater ( groups ) ;
198- } , [ ] ) ;
199- } , [ providers , selectedElement ] ) ;
200-
201- // (5) notify layout changes
202- const [ layoutConfig , setLayoutConfig ] = useState ( initialLayoutConfig || { } ) ;
203-
204- const onLayoutChanged = useCallback ( ( newLayout ) => {
47+ const onLayoutChanged = ( layoutConfig ) => {
20548 eventBus . fire ( 'propertiesPanel.layoutChanged' , {
206- layout : newLayout
49+ layout : layoutConfig
20750 } ) ;
208- } , [ eventBus ] ) ;
209-
210- // React to external layout changes
211- useEffect ( ( ) => {
212- const cb = ( e ) => {
213- const { layout } = e ;
214- setLayoutConfig ( layout ) ;
215- } ;
216-
217- eventBus . on ( 'propertiesPanel.setLayout' , cb ) ;
218- return ( ) => eventBus . off ( 'propertiesPanel.setLayout' , cb ) ;
219- } , [ eventBus , setLayoutConfig ] ) ;
51+ } ;
22052
221- // (6) notify description changes
22253 const onDescriptionLoaded = ( description ) => {
22354 eventBus . fire ( 'propertiesPanel.descriptionLoaded' , {
22455 description
22556 } ) ;
22657 } ;
22758
228- // (7) notify tooltip changes
22959 const onTooltipLoaded = ( tooltip ) => {
23060 eventBus . fire ( 'propertiesPanel.tooltipLoaded' , {
23161 tooltip
@@ -253,18 +83,3 @@ export default function BpmnPropertiesPanel(props) {
25383 </ BpmnPropertiesPanelContext . Provider >
25484 ) ;
25585}
256-
257-
258- // helpers //////////////////////////
259-
260- function isImplicitRoot ( element ) {
261- return element && element . isImplicit ;
262- }
263-
264- function findElement ( elements , element ) {
265- return find ( elements , ( e ) => e === element ) ;
266- }
267-
268- function elementExists ( element , elementRegistry ) {
269- return element && elementRegistry . get ( element . id ) ;
270- }
0 commit comments