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
}
}
});