ultisuite-client/lib/mail-automation/defaults.ts
R3D347HR4Y ad1370ea7e
Some checks are pending
E2E / Playwright e2e (push) Waiting to run
feat: enhance configuration and add new demo layouts
- Introduced turbopack alias for canvas in next.config.mjs.
- Updated package.json scripts for development and branding tasks.
- Added new dependencies for Tiptap extensions.
- Implemented new demo layouts for agenda, contacts, drive, and mail applications.
- Enhanced globals.css for improved theming and splash screen animations.
- Added OAuth callback handling for drive mounts.
- Updated layout components to integrate new demo shells and improve structure.
2026-06-12 19:10:24 +02:00

140 lines
3.5 KiB
TypeScript

import {
defaultActionForDomain,
defaultConditionFieldForDomain,
defaultTriggerForDomain,
} from './domains'
import type { AutomationDomain } from './domains'
import type {
ActionItem,
AutomationWorkflow,
RuleEditorState,
WorkflowEdgeDef,
WorkflowNodeDef,
} from './types'
let nodeCounter = 0
export function nextNodeId(prefix: string) {
nodeCounter += 1
return `${prefix}-${Date.now()}-${nodeCounter}`
}
export function createDefaultWorkflow(
kind: 'rule' | 'function' = 'rule',
domain: AutomationDomain = 'mail'
): AutomationWorkflow {
const startId = nextNodeId('start')
const condId = nextNodeId('cond')
const actionsId = nextNodeId('actions')
const endId = nextNodeId('end')
const conditionField = defaultConditionFieldForDomain(domain)
const defaultAction = defaultActionForDomain(domain)
const nodes: WorkflowNodeDef[] = [
{ id: startId, type: 'start', position: { x: 80, y: 200 }, data: {} },
{
id: condId,
type: 'condition',
position: { x: 280, y: 180 },
data: { field: conditionField, operator: 'contains', value: '' },
},
{
id: actionsId,
type: 'actions',
position: { x: 520, y: 160 },
data: { actions: [{ type: defaultAction, value: '' }] },
},
{ id: endId, type: 'end', position: { x: 760, y: 200 }, data: {} },
]
const edges: WorkflowEdgeDef[] = [
{ id: nextNodeId('e'), source: startId, target: condId },
{ id: nextNodeId('e'), source: condId, target: actionsId, sourceHandle: 'true' },
{ id: nextNodeId('e'), source: actionsId, target: endId },
{ id: nextNodeId('e'), source: condId, target: endId, sourceHandle: 'false' },
]
return {
version: 1,
kind,
triggers: {
operator: 'or',
groups: [
{
operator: 'and',
items: [defaultTriggerForDomain(domain)],
},
],
},
variables: [],
nodes,
edges,
}
}
export function createDefaultRuleEditorState(
kind: 'rule' | 'function' = 'rule'
): RuleEditorState {
return {
name: kind === 'function' ? 'Nouvelle fonction' : 'Nouvelle règle',
priority: 0,
is_active: true,
rule_kind: kind,
workflow: createDefaultWorkflow(kind),
}
}
export function createEmptyAction(domain: AutomationDomain = 'mail'): ActionItem {
return { type: defaultActionForDomain(domain), value: '' }
}
export const DEFAULT_SIMULATION_DRIVE_FILE = {
file_name: 'document.pdf',
file_path: '/Documents/document.pdf',
mime_type: 'application/pdf',
file_size: 102400,
is_folder: false,
}
export const DEFAULT_SIMULATION_CONTACT = {
name: 'Alice Example',
email: 'alice@example.com',
phone: '+33 6 00 00 00 00',
org: 'Example Corp',
labels: [] as string[],
}
export const DEFAULT_SIMULATION_CALENDAR_EVENT = {
title: 'Réunion équipe',
location: 'Salle A',
organizer: 'alice@example.com',
attendee: 'bob@example.com',
start: '2026-06-15T10:00:00Z',
end: '2026-06-15T11:00:00Z',
all_day: false,
has_video: true,
calendar_id: 'work',
}
export const DEFAULT_SIMULATION_MESSAGE = {
from: 'expediteur@example.com',
to: ['moi@example.com'],
subject: 'Exemple de sujet',
body_text: 'Contenu du message de test.',
has_attachments: false,
labels: [] as string[],
}
export function workflowToApiPayload(state: RuleEditorState) {
return {
name: state.name.trim(),
priority: state.priority,
is_active: state.is_active,
rule_kind: state.rule_kind,
account_id: state.account_id,
conditions: [],
actions: [],
workflow: state.workflow,
}
}