logologo
Começar
Manual
Desenvolvimento
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
Começar
Manual
Desenvolvimento
Plugins
API
logologo

Introdução

O que é o FlowEngine?
Relação entre FlowEngine e Plugins
Início Rápido
Roteiro de Aprendizagem

Guia

Registrar FlowModel
Criar FlowModel
Renderizar FlowModel
Fluxo de Eventos e Configuração do FlowModel
Persistência do FlowModel
Ciclo de Vida do FlowModel
Sistema de Contexto do FlowModel
Mecanismo Reativo: Observable
FlowModel vs React.Component

Definições

ModelDefinition
FlowDefinition
EventDefinition
ActionDefinition
StepDefinition
Previous PageFlowDefinition
Next PageActionDefinition
Aviso de tradução por IA

Esta documentação foi traduzida automaticamente por IA.

#EventDefinition

EventDefinition define a lógica de tratamento de eventos em um fluxo de trabalho, usada para responder a gatilhos de eventos específicos. Eventos são um mecanismo importante no FlowEngine para iniciar a execução de fluxos de trabalho.

#Definição de Tipo

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

EventDefinition é, na verdade, um alias para ActionDefinition, então possui as mesmas propriedades e métodos.

#Método de Registro

// Registro global (via FlowEngine)
const engine = new FlowEngine();
engine.registerEvent({
  name: 'clickEvent',
  title: 'Click Event',
  handler: async (ctx, params) => {
    // Lógica de tratamento do evento
  }
});

// Registro em nível de modelo (via FlowModel)
class MyModel extends FlowModel {}
MyModel.registerEvent({
  name: 'submitEvent',
  title: 'Submit Event',
  handler: async (ctx, params) => {
    // Lógica de tratamento do evento
  }
});

// Uso em um fluxo de trabalho
MyModel.registerFlow({
  key: 'formFlow',
  on: 'submitEvent',  // Referencia um evento registrado
  steps: {
    step1: {
      use: 'processFormAction'
    }
  }
});

#Descrição das Propriedades

#name

Tipo: string
Obrigatório: Sim
Descrição: O identificador único para o evento.

Usado para referenciar o evento em um fluxo de trabalho através da propriedade on.

Exemplo:

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

#title

Tipo: string
Obrigatório: Não
Descrição: O título de exibição para o evento.

Usado para exibição na interface do usuário (UI) e depuração.

Exemplo:

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

#handler

Tipo: (ctx: TCtx, params: any) => Promise<any> | any
Obrigatório: Sim
Descrição: A função de tratamento (handler) para o evento.

A lógica central do evento, que recebe o contexto e os parâmetros, e retorna o resultado do processamento.

Exemplo:

handler: async (ctx, params) => {
  const { model, flowEngine } = ctx;
  
  try {
    // Executa a lógica de tratamento do evento
    const result = await handleEvent(params);
    
    // Retorna o resultado
    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>>)
Obrigatório: Não
Descrição: Os parâmetros padrão para o evento.

Preenche os parâmetros com valores padrão quando o evento é acionado.

Exemplo:

// Parâmetros padrão estáticos
defaultParams: {
  preventDefault: true,
  stopPropagation: false
}

// Parâmetros padrão dinâmicos
defaultParams: (ctx) => {
  return {
    timestamp: Date.now(),
    userId: ctx.model.uid,
    eventSource: 'user'
  }
}

// Parâmetros padrão assíncronos
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>>)
Obrigatório: Não
Descrição: O esquema de configuração da interface do usuário (UI) para o evento.

Define o método de exibição e a configuração do formulário para o evento na UI.

Exemplo:

uiSchema: {
  'x-component': 'Form',
  'x-component-props': {
    layout: 'vertical'
  },
  properties: {
    preventDefault: {
      type: 'boolean',
      title: 'Prevenir Padrão',
      'x-component': 'Switch',
      'x-decorator': 'FormItem'
    },
    stopPropagation: {
      type: 'boolean',
      title: 'Parar Propagação',
      'x-component': 'Switch',
      'x-decorator': 'FormItem'
    },
    customData: {
      type: 'object',
      title: 'Dados Personalizados',
      'x-component': 'Form',
      'x-decorator': 'FormItem',
      properties: {
        key: {
          type: 'string',
          title: 'Chave',
          'x-component': 'Input'
        },
        value: {
          type: 'string',
          title: 'Valor',
          'x-component': 'Input'
        }
      }
    }
  }
}

#beforeParamsSave

Tipo: (ctx: FlowSettingsContext<TModel>, params: any, previousParams: any) => void | Promise<void>
Obrigatório: Não
Descrição: Função de hook executada antes de salvar os parâmetros.

Executada antes que os parâmetros do evento sejam salvos, pode ser usada para validação ou transformação de parâmetros.

Exemplo:

beforeParamsSave: (ctx, params, previousParams) => {
  // Validação de parâmetros
  if (!params.eventType) {
    throw new Error('O tipo de evento é obrigatório');
  }
  
  // Transformação de parâmetros
  params.eventType = params.eventType.toLowerCase();
  
  // Registra as alterações
  console.log('Parâmetros do evento alterados:', {
    from: previousParams,
    to: params
  });
}

#afterParamsSave

Tipo: (ctx: FlowSettingsContext<TModel>, params: any, previousParams: any) => void | Promise<void>
Obrigatório: Não
Descrição: Função de hook executada após salvar os parâmetros.

Executada após os parâmetros do evento serem salvos, pode ser usada para acionar outras ações.

Exemplo:

afterParamsSave: (ctx, params, previousParams) => {
  // Registra o log
  console.log('Parâmetros do evento salvos:', params);
  
  // Aciona o evento
  ctx.model.emitter.emit('eventConfigChanged', {
    eventName: 'clickEvent',
    params,
    previousParams
  });
  
  // Atualiza o cache
  ctx.model.updateCache('eventConfig', params);
}

#uiMode

Tipo: StepUIMode | ((ctx: FlowRuntimeContext<TModel>) => StepUIMode | Promise<StepUIMode>)
Obrigatório: Não
Descrição: O modo de exibição da interface do usuário (UI) para o evento.

Controla como o evento é exibido na UI.

Modos suportados:

  • 'dialog' - Modo de diálogo
  • 'drawer' - Modo de gaveta
  • 'embed' - Modo incorporado
  • Ou um objeto de configuração personalizado

Exemplo:

// Modo simples
uiMode: 'dialog'

// Configuração personalizada
uiMode: {
  type: 'dialog',
  props: {
    width: 600,
    title: 'Configuração do Evento'
  }
}

// Modo dinâmico
uiMode: (ctx) => {
  return ctx.model.isMobile ? 'drawer' : 'dialog';
}

#Tipos de Eventos Integrados

O FlowEngine possui os seguintes tipos de eventos comuns integrados:

  • 'click' - Evento de clique
  • 'submit' - Evento de envio
  • 'reset' - Evento de redefinição
  • 'remove' - Evento de remoção
  • 'openView' - Evento de abertura de visualização
  • 'dropdownOpen' - Evento de abertura de dropdown
  • 'popupScroll' - Evento de rolagem de popup
  • 'search' - Evento de busca
  • 'customRequest' - Evento de requisição personalizada
  • 'collapseToggle' - Evento de alternância de recolhimento

#Exemplo Completo

class FormModel extends FlowModel {}

// Registra o evento de envio de formulário
FormModel.registerEvent({
  name: 'formSubmitEvent',
  title: 'Evento de Envio de Formulário',
  handler: async (ctx, params) => {
    const { formData, validation } = params;
    
    try {
      // Valida os dados do formulário
      if (validation && !validateFormData(formData)) {
        throw new Error('A validação do formulário falhou');
      }
      
      // Processa o envio do formulário
      const result = await submitForm(formData);
      
      return {
        success: true,
        data: result,
        message: 'Formulário enviado com sucesso'
      };
    } catch (error) {
      return {
        success: false,
        error: error.message
      };
    }
  },
  defaultParams: {
    validation: true,
    preventDefault: true,
    stopPropagation: false
  },
  uiSchema: {
    'x-component': 'Form',
    properties: {
      validation: {
        type: 'boolean',
        title: 'Habilitar Validação',
        'x-component': 'Switch',
        'x-decorator': 'FormItem',
        default: true
      },
      preventDefault: {
        type: 'boolean',
        title: 'Prevenir Padrão',
        'x-component': 'Switch',
        'x-decorator': 'FormItem',
        default: true
      },
      stopPropagation: {
        type: 'boolean',
        title: 'Parar Propagação',
        'x-component': 'Switch',
        'x-decorator': 'FormItem',
        default: false
      },
      customHandlers: {
        type: 'array',
        title: 'Manipuladores Personalizados',
        'x-component': 'ArrayItems',
        'x-decorator': 'FormItem',
        items: {
          type: 'object',
          properties: {
            name: {
              type: 'string',
              title: 'Nome do Manipulador',
              'x-component': 'Input'
            },
            enabled: {
              type: 'boolean',
              title: 'Habilitado',
              'x-component': 'Switch'
            }
          }
        }
      }
    }
  },
  beforeParamsSave: (ctx, params) => {
    if (params.validation && !params.formData) {
      throw new Error('Os dados do formulário são obrigatórios quando a validação está habilitada');
    }
  },
  afterParamsSave: (ctx, params) => {
    ctx.model.emitter.emit('formEventConfigChanged', params);
  },
  uiMode: 'dialog'
});

// Registra o evento de mudança de dados
FormModel.registerEvent({
  name: 'dataChangeEvent',
  title: 'Evento de Mudança de Dados',
  handler: async (ctx, params) => {
    const { field, oldValue, newValue } = params;
    
    try {
      // Registra a mudança de dados
      await logDataChange({
        field,
        oldValue,
        newValue,
        timestamp: Date.now(),
        userId: ctx.model.uid
      });
      
      // Aciona ações relacionadas
      ctx.model.emitter.emit('dataChanged', {
        field,
        oldValue,
        newValue
      });
      
      return {
        success: true,
        message: 'Mudança de dados registrada com sucesso'
      };
    } catch (error) {
      return {
        success: false,
        error: error.message
      };
    }
  },
  defaultParams: (ctx) => ({
    logLevel: 'info',
    notify: true,
    timestamp: Date.now()
  }),
  uiMode: 'embed'
});

// Usando eventos em um fluxo de trabalho
FormModel.registerFlow({
  key: 'formProcessing',
  title: 'Processamento de Formulário',
  on: 'formSubmitEvent',
  steps: {
    validate: {
      use: 'validateFormAction',
      title: 'Validar Formulário',
      sort: 0
    },
    process: {
      use: 'processFormAction',
      title: 'Processar Formulário',
      sort: 1
    },
    save: {
      use: 'saveFormAction',
      title: 'Salvar Formulário',
      sort: 2
    }
  }
});