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

Introduzione

Cos'è FlowEngine?
Relazione tra FlowEngine e Plugin
Avvio Rapido
Percorso di Apprendimento

Guida

Registra FlowModel
Crea FlowModel
Renderizza FlowModel
Flusso Eventi e Configurazione di FlowModel
Persistenza di FlowModel
Ciclo di Vita di FlowModel
Sistema di Contesto di FlowModel
Meccanismo Reattivo: Observable
FlowModel vs React.Component

Definizioni

Definizione Modello
Definizione Flusso
Definizione Evento
Definizione Azione
Definizione Passo
Previous PageDefinizione Flusso
Next PageDefinizione Azione
Avviso di traduzione IA

Questa documentazione è stata tradotta automaticamente dall'IA.

#EventDefinition

EventDefinition definisce la logica di gestione degli eventi all'interno di un flusso di lavoro, utilizzata per rispondere a specifici trigger di evento. Gli eventi sono un meccanismo fondamentale nel FlowEngine per avviare l'esecuzione dei flussi di lavoro.

#Definizione del Tipo

type EventDefinition<TModel extends FlowModel = FlowModel, TCtx extends FlowContext = FlowContext> = ActionDefinition<TModel, TCtx>;

EventDefinition è in realtà un alias di ActionDefinition, pertanto possiede le stesse proprietà e metodi.

#Metodo di Registrazione

// Registrazione globale (tramite FlowEngine)
const engine = new FlowEngine();
engine.registerEvent({
  name: 'clickEvent',
  title: 'Click Event',
  handler: async (ctx, params) => {
    // Logica di gestione dell'evento
  }
});

// Registrazione a livello di modello (tramite FlowModel)
class MyModel extends FlowModel {}
MyModel.registerEvent({
  name: 'submitEvent',
  title: 'Submit Event',
  handler: async (ctx, params) => {
    // Logica di gestione dell'evento
  }
});

// Utilizzo in un flusso di lavoro
MyModel.registerFlow({
  key: 'formFlow',
  on: 'submitEvent',  // Riferimento a un evento registrato
  steps: {
    step1: {
      use: 'processFormAction'
    }
  }
});

#Descrizione delle Proprietà

#name

Tipo: string
Obbligatorio: Sì
Descrizione: L'identificatore univoco per l'evento.

Utilizzato per fare riferimento all'evento in un flusso di lavoro tramite la proprietà on.

Esempio:

name: 'clickEvent'
name: 'submitEvent'
name: 'customEvent'

#title

Tipo: string
Obbligatorio: No
Descrizione: Il titolo visualizzato per l'evento.

Utilizzato per la visualizzazione nell'interfaccia utente e per il debugging.

Esempio:

title: 'Click Event'
title: 'Form Submit'
title: 'Data Change'

#handler

Tipo: (ctx: TCtx, params: any) => Promise<any> | any
Obbligatorio: Sì
Descrizione: La funzione handler per l'evento.

La logica principale dell'evento, che riceve il contesto e i parametri e restituisce il risultato dell'elaborazione.

Esempio:

handler: async (ctx, params) => {
  const { model, flowEngine } = ctx;
  
  try {
    // Esegue la logica di gestione dell'evento
    const result = await handleEvent(params);
    
    // Restituisce il risultato
    return {
      success: true,
      data: result,
      message: 'Event handled successfully'
    };
  } catch (error) {
    return {
      success: false,
      error: error.message
    };
  }
}

#defaultParams

Tipo: Record<string, any> | ((ctx: TCtx) => Record<string, any> | Promise<Record<string, any>>)
Obbligatorio: No
Descrizione: I parametri predefiniti per l'evento.

Popola i parametri con valori predefiniti quando l'evento viene attivato.

Esempio:

// Parametri predefiniti statici
defaultParams: {
  preventDefault: true,
  stopPropagation: false
}

// Parametri predefiniti dinamici
defaultParams: (ctx) => {
  return {
    timestamp: Date.now(),
    userId: ctx.model.uid,
    eventSource: 'user'
  }
}

// Parametri predefiniti asincroni
defaultParams: async (ctx) => {
  const userInfo = await getUserInfo();
  return {
    user: userInfo,
    session: await getSessionInfo()
  }
}

#uiSchema

Tipo: Record<string, ISchema> | ((ctx: TCtx) => Record<string, ISchema> | Promise<Record<string, ISchema>>)
Obbligatorio: No
Descrizione: Lo schema di configurazione dell'interfaccia utente per l'evento.

Definisce il metodo di visualizzazione e la configurazione del modulo per l'evento nell'interfaccia utente.

Esempio:

uiSchema: {
  'x-component': 'Form',
  'x-component-props': {
    layout: 'vertical'
  },
  properties: {
    preventDefault: {
      type: 'boolean',
      title: 'Prevent Default',
      'x-component': 'Switch',
      'x-decorator': 'FormItem'
    },
    stopPropagation: {
      type: 'boolean',
      title: 'Stop Propagation',
      'x-component': 'Switch',
      'x-decorator': 'FormItem'
    },
    customData: {
      type: 'object',
      title: 'Custom Data',
      'x-component': 'Form',
      'x-decorator': 'FormItem',
      properties: {
        key: {
          type: 'string',
          title: 'Key',
          'x-component': 'Input'
        },
        value: {
          type: 'string',
          title: 'Value',
          'x-component': 'Input'
        }
      }
    }
  }
}

#beforeParamsSave

Tipo: (ctx: FlowSettingsContext<TModel>, params: any, previousParams: any) => void | Promise<void>
Obbligatorio: No
Descrizione: Funzione hook eseguita prima del salvataggio dei parametri.

Eseguita prima che i parametri dell'evento vengano salvati, può essere utilizzata per la validazione o la trasformazione dei parametri.

Esempio:

beforeParamsSave: (ctx, params, previousParams) => {
  // Validazione dei parametri
  if (!params.eventType) {
    throw new Error('Event type is required');
  }
  
  // Trasformazione dei parametri
  params.eventType = params.eventType.toLowerCase();
  
  // Registra le modifiche
  console.log('Event params changed:', {
    from: previousParams,
    to: params
  });
}

#afterParamsSave

Tipo: (ctx: FlowSettingsContext<TModel>, params: any, previousParams: any) => void | Promise<void>
Obbligatorio: No
Descrizione: Funzione hook eseguita dopo il salvataggio dei parametri.

Eseguita dopo che i parametri dell'evento sono stati salvati, può essere utilizzata per attivare altre azioni.

Esempio:

afterParamsSave: (ctx, params, previousParams) => {
  // Registra il log
  console.log('Event params saved:', params);
  
  // Attiva l'evento
  ctx.model.emitter.emit('eventConfigChanged', {
    eventName: 'clickEvent',
    params,
    previousParams
  });
  
  // Aggiorna la cache
  ctx.model.updateCache('eventConfig', params);
}

#uiMode

Tipo: StepUIMode | ((ctx: FlowRuntimeContext<TModel>) => StepUIMode | Promise<StepUIMode>)
Obbligatorio: No
Descrizione: La modalità di visualizzazione dell'interfaccia utente per l'evento.

Controlla come l'evento viene visualizzato nell'interfaccia utente.

Modalità supportate:

  • 'dialog' - Modalità dialogo
  • 'drawer' - Modalità cassetto
  • 'embed' - Modalità incorporata
  • Oppure un oggetto di configurazione personalizzato

Esempio:

// Modalità semplice
uiMode: 'dialog'

// Configurazione personalizzata
uiMode: {
  type: 'dialog',
  props: {
    width: 600,
    title: 'Event Configuration'
  }
}

// Modalità dinamica
uiMode: (ctx) => {
  return ctx.model.isMobile ? 'drawer' : 'dialog';
}

#Tipi di Evento Integrati

Il FlowEngine include i seguenti tipi di evento comuni:

  • 'click' - Evento di click
  • 'submit' - Evento di invio
  • 'reset' - Evento di reset
  • 'remove' - Evento di rimozione
  • 'openView' - Evento di apertura vista
  • 'dropdownOpen' - Evento di apertura dropdown
  • 'popupScroll' - Evento di scroll popup
  • 'search' - Evento di ricerca
  • 'customRequest' - Evento di richiesta personalizzata
  • 'collapseToggle' - Evento di toggle collasso

#Esempio Completo

class FormModel extends FlowModel {}

// Registra l'evento di invio del modulo
FormModel.registerEvent({
  name: 'formSubmitEvent',
  title: 'Form Submit Event',
  handler: async (ctx, params) => {
    const { formData, validation } = params;
    
    try {
      // Valida i dati del modulo
      if (validation && !validateFormData(formData)) {
        throw new Error('Form validation failed');
      }
      
      // Elabora l'invio del modulo
      const result = await submitForm(formData);
      
      return {
        success: true,
        data: result,
        message: 'Form submitted successfully'
      };
    } catch (error) {
      return {
        success: false,
        error: error.message
      };
    }
  },
  defaultParams: {
    validation: true,
    preventDefault: true,
    stopPropagation: false
  },
  uiSchema: {
    'x-component': 'Form',
    properties: {
      validation: {
        type: 'boolean',
        title: 'Enable Validation',
        'x-component': 'Switch',
        'x-decorator': 'FormItem',
        default: true
      },
      preventDefault: {
        type: 'boolean',
        title: 'Prevent Default',
        'x-component': 'Switch',
        'x-decorator': 'FormItem',
        default: true
      },
      stopPropagation: {
        type: 'boolean',
        title: 'Stop Propagation',
        'x-component': 'Switch',
        'x-decorator': 'FormItem',
        default: false
      },
      customHandlers: {
        type: 'array',
        title: 'Custom Handlers',
        'x-component': 'ArrayItems',
        'x-decorator': 'FormItem',
        items: {
          type: 'object',
          properties: {
            name: {
              type: 'string',
              title: 'Handler Name',
              'x-component': 'Input'
            },
            enabled: {
              type: 'boolean',
              title: 'Enabled',
              'x-component': 'Switch'
            }
          }
        }
      }
    }
  },
  beforeParamsSave: (ctx, params) => {
    if (params.validation && !params.formData) {
      throw new Error('Form data is required when validation is enabled');
    }
  },
  afterParamsSave: (ctx, params) => {
    ctx.model.emitter.emit('formEventConfigChanged', params);
  },
  uiMode: 'dialog'
});

// Registra l'evento di modifica dei dati
FormModel.registerEvent({
  name: 'dataChangeEvent',
  title: 'Data Change Event',
  handler: async (ctx, params) => {
    const { field, oldValue, newValue } = params;
    
    try {
      // Registra la modifica dei dati
      await logDataChange({
        field,
        oldValue,
        newValue,
        timestamp: Date.now(),
        userId: ctx.model.uid
      });
      
      // Attiva le azioni correlate
      ctx.model.emitter.emit('dataChanged', {
        field,
        oldValue,
        newValue
      });
      
      return {
        success: true,
        message: 'Data change logged successfully'
      };
    } catch (error) {
      return {
        success: false,
        error: error.message
      };
    }
  },
  defaultParams: (ctx) => ({
    logLevel: 'info',
    notify: true,
    timestamp: Date.now()
  }),
  uiMode: 'embed'
});

// Utilizzo degli eventi in un flusso di lavoro
FormModel.registerFlow({
  key: 'formProcessing',
  title: 'Form Processing',
  on: 'formSubmitEvent',
  steps: {
    validate: {
      use: 'validateFormAction',
      title: 'Validate Form',
      sort: 0
    },
    process: {
      use: 'processFormAction',
      title: 'Process Form',
      sort: 1
    },
    save: {
      use: 'saveFormAction',
      title: 'Save Form',
      sort: 2
    }
  }
});