Skip to Content
StudioExtensionsEntwicklungTutorial: BPMN Custom Properties

Tutorial: BPMN Custom Properties

In diesem Tutorial erweitern Sie den BPMN-Editor um eigene Property-Felder für BPMN-Elemente. Damit können Sie z.B. einem Service Task zusätzliche Konfigurationsfelder geben.

Was Sie lernen

  • Custom Properties für BPMN-Elemente registrieren
  • Pane als Property-Editor erstellen
  • BPMN-Element-Selektion abfragen
  • Properties über BPMN-Commands setzen

Überblick

Projektstruktur

    • index.ts
    • package.json
      • CustomPropertyPane.tsx

Schritt 1: Property-Pane erstellen

Die Pane zeigt die Custom Properties an, wenn ein passendes BPMN-Element selektiert ist:

// panes/CustomPropertyPane.tsx import React, { useState, useEffect } from 'react'; import { PaneProvider, FormInput } from '@5minds/processcube_studio_sdk'; function CustomPropertyContent(props: any): JSX.Element { const { studio, bpmnModel } = props; const [selectedElement, setSelectedElement] = useState<any>(null); const [priority, setPriority] = useState(''); useEffect(() => { if (!bpmnModel) return; const handler = () => { const selection = bpmnModel.selection.getSelectedElements(); if (selection.length === 1) { setSelectedElement(selection[0]); // Bestehenden Wert lesen const existing = selection[0].extensionProperties?.priority || ''; setPriority(existing); } else { setSelectedElement(null); } }; bpmnModel.selection.on('changed', handler); return () => bpmnModel.selection.off('changed', handler); }, [bpmnModel]); if (!selectedElement) { return <div style={{ padding: '12px' }}>Kein Element ausgewählt.</div>; } const handlePriorityChange = (newValue: string) => { setPriority(newValue); // Property im BPMN-XML setzen studio.commands.executeCommand( 'bpmn.setExtensionProperty', selectedElement, 'priority', newValue, ); }; return ( <div style={{ padding: '12px' }}> <h4>Custom Properties</h4> <p>Element: {selectedElement.name || selectedElement.id}</p> <FormInput label="Priorität" value={priority} onChange={handlePriorityChange} placeholder="z.B. hoch, mittel, niedrig" /> </div> ); } export const paneProvider: PaneProvider = { getPaneTitle: () => 'Custom Properties', Pane: CustomPropertyContent, PaneContent: CustomPropertyContent, };

Schritt 2: Registrierung

// index.ts import { Studio } from '@5minds/processcube_studio_sdk'; export function onLoad(studio: Studio): void { // Icon registrieren studio.icons.registerIcons({ 'customProps/icon': 'fad fa-sliders-h', }); // Pane im rechten Bereich (Inspector) registrieren studio.panes.registerPaneGroup('right', 'customProps/pane-group', [ studio.panes.getPaneViaPaneProvider( 'customProps/property-pane', 'customProps/provider', require('./panes/CustomPropertyPane'), ), ]); }

BPMN-Commands

Die BPMN-Extension stellt Commands bereit, um Elemente zu manipulieren:

CommandBeschreibung
bpmn.setExtensionPropertyExtension-Property setzen
bpmn.getExtensionPropertyExtension-Property lesen
bpmn.updatePropertiesStandard-Properties aktualisieren
bpmn.addElementElement zum Diagramm hinzufügen
bpmn.removeElementElement entfernen
// Extension-Property setzen studio.commands.executeCommand( 'bpmn.setExtensionProperty', element, // Das BPMN-Element 'key', // Property-Name 'value', // Property-Wert ); // Standard-Property aktualisieren (z.B. Name) studio.commands.executeCommand( 'bpmn.updateProperties', element, { name: 'Neuer Name' }, );

Verwenden Sie immer die BPMN-Commands, um Properties zu setzen — nie direkt das Element-Objekt modifizieren. Nur über Commands wird die Undo/Redo-Historie korrekt gepflegt.

Known Custom Properties

Statt einer komplett eigenen Pane können Sie auch “Known Custom Properties” registrieren. Dabei werden die Properties automatisch im Standard-Property-Panel des BPMN-Editors angezeigt:

export function onLoad(studio: Studio): void { // Custom Property für Script Tasks registrieren studio.commands.executeCommand('bpmn.registerKnownCustomProperty', { elementType: 'bpmn:ScriptTask', // BPMN-Element-Typ propertyName: 'timeout', // Property-Name label: 'Timeout (ms)', // Angezeigtes Label type: 'string', // Eingabetyp defaultValue: '30000', // Standardwert }); }

Nächste Schritte

  • API-Referenz — Vollständige Dokumentation aller SDK-Methoden
  • Architektur — Tiefere Einblicke in die Studio-Architektur