VVibeFlui

Submit Actions

Submit actions send form values through VibeFlui operation execution.

Use submit actions for create and update workflows. The schema describes the UI command; the backend still owns final validation and persistence.

Create submit action

TS
export const createUserSchema = {
  resource: "users",
  form: {
    mode: "modal",
    fields: [
      { name: "name", label: "Name", type: "text", required: true },
      { name: "email", label: "Email", type: "email", required: true }
    ],
    submitLabel: "Create user",
    cancelLabel: "Cancel"
  },
  actions: {
    create: {
      enabled: true,
      label: "Create user",
      icon: "lucide:plus",
      handler: "users.create"
    }
  },
  registry: {
    actionHandlers: ["users.create"]
  }
} as const;

Update submit action

TS
export const updateUserSchema = {
  resource: "users",
  identity: {
    key: "id",
    param: "id"
  },
  endpoint: {
    update: { url: "/api/users/:id", method: "PATCH" }
  },
  form: {
    mode: "modal",
    fields: [
      { name: "name", label: "Name", type: "text", valueFrom: "name" },
      { name: "email", label: "Email", type: "email", valueFrom: "email" }
    ],
    submitLabel: "Save changes"
  },
  actions: {
    edit: {
      enabled: true,
      label: "Save",
      icon: "lucide:save",
      handler: "users.update"
    }
  },
  registry: {
    actionHandlers: ["users.update"]
  }
} as const;

Value pipeline

Before submit, VibeFlui may:

  1. Apply computed values.
  2. Run built-in validation.
  3. Run registry validators.
  4. Apply field transformers.
  5. Apply request transformer.
  6. Run transform.beforeSubmit steps.
  7. Execute a handler, provider, or endpoint.

Runtime registry

TS
import { createRegistry } from "@vibeflui/core";

export const registry = createRegistry({
  actionHandlers: {
    "users.create": async ({ values }) => ({
      status: true,
      code: 200,
      message: "User created",
      data: values
    }),
    "users.update": async ({ values, identityValue }) => ({
      status: true,
      code: 200,
      message: `User ${String(identityValue)} updated`,
      data: values
    })
  }
});

Validation response

JSON
{
  "status": false,
  "code": 422,
  "message": "Email is already used"
}