FlowModel Flow and Configuration
FlowModel provides a "Flow"-based approach to implement component configuration logic, making component behavior and configuration more extensible and visual.
Custom Model
You can create a custom component model by extending FlowModel. The model needs to implement the render() method to define the component's rendering logic.
class MyModel extends FlowModel {
  render() {
    return <Button {...this.props} />;
  }
}
 
Registering a Flow
Each model can register one or more Flows to describe the component's configuration logic and interaction steps.
MyModel.registerFlow({
  key: 'buttonSettings',
  title: 'Button Settings',
  steps: {
    general: {
      title: 'General Configuration',
      uiSchema: {
        title: {
          type: 'string',
          title: 'Button Title',
          'x-decorator': 'FormItem',
          'x-component': 'Input',
        },
      },
      defaultParams: {
        type: 'primary',
      },
      handler(ctx, params) {
        ctx.model.setProps('children', params.title);
        ctx.model.setProps('type', params.type);
      },
    },
  },
});
 
Description
key: The unique identifier for the Flow. 
title: The name of the Flow, used for UI display. 
steps: Defines the configuration steps (Step). Each step includes:
title: The step title. 
uiSchema: The configuration form structure (compatible with Formily Schema). 
defaultParams: Default parameters. 
handler(ctx, params): Triggered on save to update the model's state. 
 
Rendering the Model
When rendering a component model, you can use the showFlowSettings parameter to control whether to enable the configuration feature. If showFlowSettings is enabled, a configuration entry (such as a settings icon or button) will automatically appear in the upper-right corner of the component.
<FlowModelRenderer model={model} showFlowSettings />
 
In addition to opening the configuration form through the built-in interaction entry, you can also manually call
openFlowSettings().
flowSettings.open(options: FlowSettingsOpenOptions): Promise<boolean>;
model.openFlowSettings(options?: Omit<FlowSettingsOpenOptions, 'model'>): Promise<boolean>;
 
Parameter Definitions
interface FlowSettingsOpenOptions {
  model: FlowModel;               // Required, the model instance it belongs to
  preset?: boolean;               // Renders only steps marked as preset=true (default false)
  flowKey?: string;               // Specify a single Flow
  flowKeys?: string[];            // Specify multiple Flows (ignored if flowKey is also provided)
  stepKey?: string;               // Specify a single step (usually used with flowKey)
  uiMode?: 'dialog' | 'drawer';   // The container for displaying the form, default 'dialog'
  onCancel?: () => void;          // Callback when cancel is clicked
  onSaved?: () => void;           // Callback after the configuration is saved successfully
}
 
await model.openFlowSettings({
  flowKey: 'buttonSettings',
  uiMode: 'drawer',
  onSaved: () => {
    console.log('Button settings saved');
  },
});