Components

Dummy Data Generator

Multi-step modal wizard that generates Docyrus-compatible sample records — per-field strategies (text/number/date/enum/relation), value-renderer preview, and an opt-in batch save to the data source.

Client Only

Installation

pnpm dlx @docyrus/cli add @docyrus/ui-dummy-data-generator
Required Packages(2 packages)
pnpm add @docyrus/api-client @tanstack/react-query

When to Use

Reach for <DummyDataGenerator> (and the matching useDocyrusDummyDataGeneratorWizard hook) whenever you want to seed a Docyrus data source with realistic records — internal staging environments, onboarding tutorials, performance testing, or design reviews where empty grids look bad.

The component is presentational — every prop is a state slice plus a callback — so the smart hook does the heavy lifting (field-aware strategies, deterministic generation, batch insert). The wizard renders inline by default; wrap it in your own dialog / drawer / sheet if you want modal behavior. Pass previewOnly if you only want to download / inspect the generated rows without persisting them.

Usage

'use client';

import { useDocyrusAuth } from '@docyrus/signin';

import { useDocyrusDummyDataGeneratorWizard } from '@docyrus/ui/hooks/use-docyrus-dummy-data-generator-wizard';

export function ContactsSeeder({ onGenerated }: { onGenerated: () => void }) {
  const { client } = useDocyrusAuth();

  if (!client) return null;

  const { wizard } = useDocyrusDummyDataGeneratorWizard({
    client,
    appSlug: 'crm',
    dataSourceSlug: 'contact',
    defaultCount: 25,
    onGenerated: () => onGenerated()
  });

  return wizard;
}

Wrapping in a dialog

The wizard always renders inline. Drop the returned wizard into any container — including your own modal:

import { Dialog, DialogContent } from '@docyrus/ui/primitives/ui/dialog';

const [open, setOpen] = useState(false);
const { wizard } = useDocyrusDummyDataGeneratorWizard({
  client,
  appSlug: 'crm',
  dataSourceSlug: 'contact'
});

return (
  <>
    <Button onClick={() => setOpen(true)}>Seed sample contacts…</Button>
    <Dialog open={open} onOpenChange={setOpen}>
      <DialogContent>{wizard}</DialogContent>
    </Dialog>
  </>
);

Wizard Steps

StepPurpose
ConfigurePick how many records to generate, then tune each field individually. Strategies are pre-filled per field type (text shape, number range, date window, enum subset, etc.). Read-only or unsupported fields are auto-skipped.
PreviewRenders the first N rows using useDocyrusFieldComponent(field.type, 'value-renderer') so every cell looks the same as it does in <DataGrid>. "Regenerate sample" reseeds the PRNG.
ProgressOne spinner while the hook walks each row through collection.create (or client.post('…/items', row)).
ResultTiles for created / failed / total rows. Per-row error list when inserts fail.

Field-Type Strategies

Field typeDefault strategyConfigurable
field-text, field-textarea, field-codeSlug-aware sentence/full-name/company/job-title detection.Text shape (word, sentence, paragraph, full name, company, job title, static).
field-email, field-url, field-color, field-icon, field-currencyRandom pick from a bundled pool.—
field-phoneRandom number with default country code.Country code (e.g. +90).
field-number, field-money, field-percent, field-duration, field-ratingRandom integer in a sensible range.Mode (random / sequence / fixed), min / max, integer toggle.
field-moneyAdds the companion __<slug>_currency value automatically.Plus currency code (e.g. USD).
field-checkbox, field-switch50/50 boolean.Truth ratio slider.
field-date, field-dateTimeRandom date within last 30 days.Mode (recent / past / future / random / now), days window.
field-dateRangePair of dates with a random span.Same plus max span in days.
field-timeRandom HH:mm.—
field-select, field-radioGroup, field-status, field-enum, field-systemEnumRandom pick from field.enums / field.options.Subset of allowed option ids.
field-multiSelect, field-tagSelect1–3 random picks.Subset of option ids, items-per-row range.
field-userSelect, field-userMultiSelectRandom pick from the users array passed to the hook.Subset of user ids.
field-relationRandom pick from the relationOptionsByFieldSlug[slug] pool. Skipped if the pool isn't supplied.Subset of relation ids.
field-jsonGenerates { sample, generated, index }.—
field-formula, field-relatedField, field-identity, field-autonumber, files, images, html / doc editors, location select, query builder, schema repeater, …Skipped automatically.—

The deterministic seed (Mulberry32) means the preview matches the rows that get inserted — pressing Regenerate sample reseeds and re-renders.

API Reference

<DummyDataGenerator>

The component renders as an inline panel (header + stepper + step body + footer). Wrap it in your own dialog / drawer / sheet if you want modal behavior.

PropTypeDescription
step / onStepChangeDummyDataGeneratorStep / (step) => voidCurrent step + setter. Steps: configure, preview, progress, result.
targetFieldsReadonlyArray<DocyrusFieldLike>Fields the user can populate. Supplied by the hook from useDocyrusDataViewSelect.
requiredFieldSlugsReadonlyArray<string>Slugs locked to enabled: true.
count / onCountChangenumber / (next) => voidNumber of records to generate.
maxCountnumberUI hard cap. Default 1000.
strategies / onStrategiesChangeDummyStrategyMap / (next) => voidPer-field generation knobs keyed by slug.
generatedRows / onRegenerateArray<Record<string, unknown>> / () => voidGenerated rows (preview + insert) and a "reseed" callback.
isGenerating / isCreatingbooleanInternal pending flags surfaced in the spinner / footer.
generationError / resultError | null / DummyGenerationResult | nullFinal-step state.
previewOnlybooleanWhen true the preview-step CTA is "Finish" — the hook never POSTs.
usersReadonlyArray<DummyUserOption>Tenant users used by user-select strategies (and shown in the configure step).
onConfirmConfigure / onStartGeneration / onResetcallbacksHook into each step's primary action.
previewRowCountnumberDefault 10.
exportFileNamestringFile name (without extension) for CSV / XLSX downloads. Default 'dummy-data'.
title / description / iconReactNode / ReactNode / stringHeader customization (defaults are translated).
classNamestringExtra class for the panel root.

Components

ComponentDescription
DummyDataGeneratorTop-level shell — composes AwesomeDialog + Stepper + step bodies + footer.
ConfigureStepStep 1 — count slider + per-field strategy controls.
PreviewStepStep 2 — value-renderer-driven preview table + reseed button.
ProgressStepSteps 3/4 — progress spinner + result tiles + per-row error list.

Helpers

HelperDescription
buildInitialStrategyMap(fields, existing?)Per-slug strategy map seeded from inferStrategyForField. Reuses any existing user overrides.
inferStrategyForField(field)Default strategy for a single field.
isSupportedFieldType(type)false for read-only, file, html-editor, location, formula, etc.
generateDummyRows(ctx)Pure deterministic generator. Returns count rows of slug → value pairs.
createRng(seed)Mulberry32 PRNG used internally — exported for tests.

Type Exports

TypeDescription
DummyDataGeneratorPropsProps for the top-level component.
DummyDataGeneratorStep'configure' | 'preview' | 'progress' | 'result'.
DummyStrategyMapRecord<fieldSlug, DummyFieldStrategy>.
DummyFieldStrategyPer-field generation knobs (enabled, textMode, min, max, dateMode, selectedOptionIds, …).
DummyGenerationContextPure-generator input (fields, strategies, count, seed, users?, relationOptionsByFieldSlug?).
DummyGenerationResult{ totalGenerated, totalCreated, totalFailed, errors }.
DummyUserOptionUser pool entry shape (id, name?, display_name?, email?, avatar_url?).
DummyRelationOptionRelation pool entry shape (id, name).

See Also

On this page