Skip to main content

Crud and CrudPage

Crud and CrudPage are the standard CRUD abstractions in VEF. They combine ProSearch, ProTable, scene forms, and delete mutations into one cohesive component.

VEF-specific component. Moved from @vef-framework-react/starter to @vef-framework-react/components in v2.1.6.

When to Use

  • Any standard list + create/edit/delete page.
  • Use CrudPage when the page needs a full-page layout shell.
  • Use Crud when embedding the CRUD block inside a custom layout.

createCrudKit

Before using Crud or CrudPage, call createCrudKit to fix the generic types for the page:

import { createCrudKit } from '@vef-framework-react/components';

interface UserRow { id: number; name: string; status: string; }
interface UserSearch { name?: string; status?: string; }
interface UserSceneFormValues {
create: { name: string; email: string; };
update: { id: number; name: string; email: string; };
}

export const {
useCrudStore,
useSearchValues,
useSelectedRows,
ActionButtonGroup,
OperationButtonGroup,
} = createCrudKit<UserRow, UserSearch, UserSceneFormValues>();

CrudPage Usage

import { CrudPage } from '@vef-framework-react/components';

export default function UserPage() {
return (
<CrudPage<UserRow, UserSearch, UserSceneFormValues>
tableColumns={columns}
rowKey="id"
queryFn={findUserPage}
formMutationFns={{
create: createUser,
update: updateUser,
}}
mutationMeta={key => ({ invalidates: [[findUserPage.key]] })}
deleteMutationFn={deleteUser}
basicSearch={<UserSearchFields />}
renderForm={scene => <UserFormFields scene={scene} />}
toolbarActions={<ActionButtonGroup ... />}
operationColumn={{
width: 120,
render: row => <OperationButtonGroup row={row} ... />
}}
/>
);
}

Form Scenes

TSceneFormValues is a map of scene key to form values type. The built-in scenes are "create" and "update", but you can add custom scenes:

interface UserSceneFormValues {
create: CreateUserForm;
update: UpdateUserForm;
resetPassword: ResetPasswordForm; // custom scene
}

Key Props

PropTypeDescription
tableColumnsTableColumn<TRow>[]Column definitions
rowKeyDeepKeys<TRow> | (row) => KeyRow key extractor
queryFnQueryFunction<PaginationResult<TRow>, ...>Data fetch function
isPaginatedbooleanEnable/disable pagination (default: true)
formMutationFnsCrudFormMutationFns<TSceneFormValues>Mutation per scene
deleteMutationFnMutationFunctionSingle-row delete
deleteManyMutationFnMutationFunctionMulti-row delete
mutationMeta(key) => MutationMetaMutation meta provider
renderForm(scene) => ReactNodeForm content per scene
basicSearchReactNodeInline search fields
advancedSearchReactNodeAdvanced search fields
toolbarActionsReactNodeToolbar action buttons
operationColumnOperationColumnConfig<TRow>Per-row action column
rowSelectionRowSelectionConfig<TRow> | trueRow selection
columnSettingsColumnSettingsConfig | falseColumn visibility
beforeFormSubmit(scene, values) => Awaitable<values>Transform before submit
afterFormSubmit(scene, values, result) => Awaitable<void>After submit hook

CrudPage-only Props

PropTypeDescription
leftAsideReactNodeLeft aside panel
leftAsideWidthAsideWidthLeft aside width
rightAsideReactNodeRight aside panel
rightAsideWidthAsideWidthRight aside width
headerReactNodePage header
headerPosition'inside' | 'outside'Header position
footerReactNodePage footer
footerPosition'inside' | 'outside'Footer position

Form Display Mode

Control whether the form opens in a modal or drawer:

// Default: modal
<CrudPage formMode="modal" ... />

// Drawer
<CrudPage formMode="drawer" formDrawerConfig={{ placement: 'right' }} ... />

CrudKit Helpers

The createCrudKit return value provides:

  • useCrudStore — access the full CRUD state
  • useSearchValues — current search form values
  • useSelectedRows — currently selected rows
  • ActionButtonGroup — toolbar action buttons with CRUD context
  • OperationButtonGroup — per-row operation buttons with CRUD context