logologo
Démarrer
Manuel
Développement
Plugins
API
English
简体中文
日本語
한국어
Deutsch
Français
Español
Português
Русский
Italiano
Türkçe
Українська
Tiếng Việt
Bahasa Indonesia
ไทย
Polski
Nederlands
Čeština
العربية
עברית
हिन्दी
Svenska
Démarrer
Manuel
Développement
Plugins
API
logologo

Introduction

Qu'est-ce que FlowEngine ?
Relation entre FlowEngine et les plugins
Démarrage rapide
Feuille de route d'apprentissage

Guide

Enregistrer un FlowModel
Créer un FlowModel
Rendre un FlowModel
Flux d'événements et configuration du FlowModel
Persistance du FlowModel
Cycle de vie du FlowModel
Système de contexte du FlowModel
Mécanisme réactif : Observable
FlowModel vs React.Component

Définitions

ModelDefinition
FlowDefinition
EventDefinition
ActionDefinition
StepDefinition
Previous PageActionDefinition
Avis de traduction IA

Cette documentation a été traduite automatiquement par IA.

#StepDefinition

StepDefinition définit une étape individuelle dans un flux de travail. Chaque étape peut représenter une action, la gestion d'un événement ou toute autre opération. Une étape est l'unité d'exécution fondamentale d'un flux de travail.

#Définition du type

interface StepDefinition<TModel extends FlowModel = FlowModel>
  extends Partial<Omit<ActionDefinition<TModel, FlowRuntimeContext<TModel>>, 'name'>> {
  key?: string;
  isAwait?: boolean;
  use?: string;
  sort?: number;
  preset?: boolean;
  paramsRequired?: boolean;
  hideInSettings?: boolean;
  uiMode?: StepUIMode | ((ctx: FlowRuntimeContext<TModel>) => StepUIMode | Promise<StepUIMode>);
}

#Utilisation

class MyModel extends FlowModel {}

MyModel.registerFlow({
  key: 'pageSettings',
  steps: {
    step1: {
      use: 'actionName',
      title: 'First Step',
      sort: 0,
      preset: true
    },
    step2: {
      handler: async (ctx, params) => {
        // Logique de traitement personnalisée
        return { result: 'success' };
      },
      title: 'Second Step',
      sort: 1
    }
  }
});

#Description des propriétés

#key

Type: string
Obligatoire: Non
Description: L'identifiant unique de l'étape au sein du flux de travail.

Si vous ne le fournissez pas, le nom de la clé de l'étape dans l'objet steps sera utilisé.

Exemple:

steps: {
  loadData: {  // la clé est 'loadData'
    use: 'loadDataAction'
  }
}

#use

Type: string
Obligatoire: Non
Description: Le nom d'une ActionDefinition enregistrée à utiliser.

La propriété use vous permet de référencer une action déjà enregistrée, évitant ainsi les définitions en double.

Exemple:

// Enregistrez d'abord l'action
MyModel.registerAction({
  name: 'loadDataAction',
  handler: async (ctx, params) => {
    // Logique de chargement des données
  }
});

// Utilisez-la dans une étape
steps: {
  step1: {
    use: 'loadDataAction',  // Référence l'action enregistrée
    title: 'Load Data'
  }
}

#title

Type: string
Obligatoire: Non
Description: Le titre d'affichage de l'étape.

Il est utilisé pour l'affichage dans l'interface utilisateur et pour le débogage.

Exemple:

title: 'Load Data'
title: 'Process Information'
title: 'Save Results'

#sort

Type: number
Obligatoire: Non
Description: L'ordre d'exécution de l'étape. Une valeur plus petite indique une exécution prioritaire.

Cette propriété est utilisée pour contrôler l'ordre d'exécution de plusieurs étapes au sein du même flux de travail.

Exemple:

steps: {
  step1: { sort: 0 },  // S'exécute en premier
  step2: { sort: 1 },  // S'exécute ensuite
  step3: { sort: 2 }   // S'exécute en dernier
}

#handler

Type: (ctx: FlowRuntimeContext<TModel>, params: any) => Promise<any> | any
Obligatoire: Non
Description: La fonction de traitement de l'étape.

Lorsque la propriété use n'est pas utilisée, vous pouvez définir la fonction de traitement directement ici.

Exemple:

handler: async (ctx, params) => {
  // Récupérez les informations de contexte
  const { model, flowEngine } = ctx;
  
  // Logique de traitement
  const result = await processData(params);
  
  // Retournez le résultat
  return { success: true, data: result };
}

#defaultParams

Type: Record<string, any> | ((ctx: FlowRuntimeContext<TModel>) => Record<string, any> | Promise<Record<string, any>>)
Obligatoire: Non
Description: Les paramètres par défaut de l'étape.

Ils sont utilisés pour pré-remplir les paramètres avec des valeurs par défaut avant l'exécution de l'étape.

Exemple:

// Paramètres par défaut statiques
defaultParams: {
  timeout: 5000,
  retries: 3,
  format: 'json'
}

// Paramètres par défaut dynamiques
defaultParams: (ctx) => {
  return {
    userId: ctx.model.uid,
    timestamp: Date.now()
  }
}

// Paramètres par défaut asynchrones
defaultParams: async (ctx) => {
  const config = await loadConfig();
  return {
    apiUrl: config.apiUrl,
    apiKey: config.apiKey
  }
}

#uiSchema

Type: Record<string, ISchema> | ((ctx: FlowRuntimeContext<TModel>) => Record<string, ISchema> | Promise<Record<string, ISchema>>)
Obligatoire: Non
Description: Le schéma de configuration de l'interface utilisateur (UI) pour l'étape.

Il définit la manière dont l'étape est affichée dans l'interface et sa configuration de formulaire.

Exemple:

uiSchema: {
  'x-component': 'Form',
  'x-component-props': {
    layout: 'vertical'
  },
  properties: {
    name: {
      type: 'string',
      title: 'Name',
      'x-component': 'Input'
    },
    age: {
      type: 'number',
      title: 'Age',
      'x-component': 'InputNumber'
    }
  }
}

#beforeParamsSave

Type: (ctx: FlowSettingsContext<TModel>, params: any, previousParams: any) => void | Promise<void>
Obligatoire: Non
Description: Une fonction de rappel (hook) qui s'exécute avant la sauvegarde des paramètres de l'étape.

Elle peut être utilisée pour la validation ou la transformation des paramètres.

Exemple:

beforeParamsSave: (ctx, params, previousParams) => {
  // Validation des paramètres
  if (!params.name) {
    throw new Error('Name is required');
  }
  
  // Transformation des paramètres
  params.name = params.name.trim().toLowerCase();
}

#afterParamsSave

Type: (ctx: FlowSettingsContext<TModel>, params: any, previousParams: any) => void | Promise<void>
Obligatoire: Non
Description: Une fonction de rappel (hook) qui s'exécute après la sauvegarde des paramètres de l'étape.

Elle peut être utilisée pour déclencher d'autres opérations.

Exemple:

afterParamsSave: (ctx, params, previousParams) => {
  // Enregistrez les logs
  console.log('Step params saved:', params);
  
  // Déclenchez d'autres opérations
  ctx.model.emitter.emit('paramsChanged', params);
}

#uiMode

Type: StepUIMode | ((ctx: FlowRuntimeContext<TModel>) => StepUIMode | Promise<StepUIMode>)
Obligatoire: Non
Description: Le mode d'affichage de l'interface utilisateur (UI) pour l'étape.

Il contrôle la manière dont l'étape est présentée dans l'interface.

Modes pris en charge:

  • 'dialog' - Mode dialogue
  • 'drawer' - Mode tiroir
  • 'embed' - Mode intégré
  • Ou un objet de configuration personnalisé

Exemple:

// Mode simple
uiMode: 'dialog'

// Configuration personnalisée
uiMode: {
  type: 'dialog',
  props: {
    width: 800,
    title: 'Step Configuration'
  }
}

// Mode dynamique
uiMode: (ctx) => {
  return ctx.model.isMobile ? 'drawer' : 'dialog';
}

#preset

Type: boolean
Obligatoire: Non
Description: Indique si l'étape est une étape prédéfinie.

Les paramètres des étapes avec preset: true doivent être renseignés lors de la création. Pour les étapes sans ce drapeau, les paramètres peuvent être complétés après la création du modèle.

Exemple:

steps: {
  step1: {
    preset: true,  // Les paramètres doivent être renseignés lors de la création
    use: 'requiredAction'
  },
  step2: {
    preset: false, // Les paramètres peuvent être renseignés ultérieurement
    use: 'optionalAction'
  }
}

#paramsRequired

Type: boolean
Obligatoire: Non
Description: Indique si les paramètres de l'étape sont obligatoires.

Si true, une boîte de dialogue de configuration s'ouvrira avant l'ajout du modèle.

Exemple:

paramsRequired: true  // Les paramètres doivent être configurés avant d'ajouter le modèle
paramsRequired: false // Les paramètres peuvent être configurés ultérieurement

#hideInSettings

Type: boolean
Obligatoire: Non
Description: Indique si l'étape doit être masquée dans le menu des paramètres.

Exemple:

hideInSettings: true  // Masquer dans les paramètres
hideInSettings: false // Afficher dans les paramètres (par défaut)

#isAwait

Type: boolean
Obligatoire: Non
Valeur par défaut: true
Description: Indique s'il faut attendre la fin de l'exécution de la fonction de traitement.

Exemple:

isAwait: true  // Attendre la fin de la fonction de traitement (par défaut)
isAwait: false // Ne pas attendre, exécuter de manière asynchrone

#Exemple complet

class DataProcessingModel extends FlowModel {}

DataProcessingModel.registerFlow({
  key: 'dataProcessing',
  title: 'Data Processing',
  steps: {
    loadData: {
      use: 'loadDataAction',
      title: 'Load Data',
      sort: 0,
      preset: true,
      paramsRequired: true,
      defaultParams: {
        source: 'api',
        timeout: 5000
      },
      uiMode: 'dialog'
    },
    processData: {
      handler: async (ctx, params) => {
        const data = await ctx.model.getData();
        return processData(data, params);
      },
      title: 'Process Data',
      sort: 1,
      defaultParams: (ctx) => ({
        userId: ctx.model.uid,
        timestamp: Date.now()
      }),
      beforeParamsSave: (ctx, params) => {
        if (!params.processor) {
          throw new Error('Processor is required');
        }
      },
      afterParamsSave: (ctx, params) => {
        ctx.model.emitter.emit('dataProcessed', params);
      }
    },
    saveData: {
      use: 'saveDataAction',
      title: 'Save Data',
      sort: 2,
      hideInSettings: false,
      uiMode: {
        type: 'drawer',
        props: {
          width: 600,
          title: 'Save Configuration'
        }
      }
    }
  }
});