Skip to content

Hydrates

Hydrates transform module config into frontend schema. The backend (PHP) and frontend (Vue) communicate via a schema contract: hydrates produce schema; input components consume it.

Flow

Module config (type: 'checklist') → InputHydrator → ChecklistHydrate → schema { type: 'input-checklist', ... }

FormBase/FormBaseField → mapTypeToComponent('input-checklist') → VInputChecklist (Checklist.vue)
  1. Module config defines inputs with type (e.g. checklist, select, price)
  2. InputHydrator resolves: studlyName($input['type']) . 'Hydrate' → e.g. ChecklistHydrate
  3. Hydrate sets $input['type'] = 'input-{kebab}' and enriches schema (items, endpoint, rules, etc.)
  4. render() pipeline: setDefaults()hydrate()hydrateRecords()hydrateRules() → strips backend-only keys
  5. Frontend receives schema via Inertia; FormBaseField uses mapTypeToComponent(type) → Vue component

Resolution

Config typeHydrate classOutput type (schema)Vue component
assignmentAssignmentHydrateinput-assignmentVInputAssignment
authorizeAuthorizeHydrateselectv-select (Vuetify)
autocompleteAutocompleteHydrateselect / input-select-scrollv-autocomplete (Vuetify)
browserBrowserHydrateinput-browserVInputBrowser
chatChatHydrateinput-chatVInputChat
checkboxCheckboxHydratecheckboxv-checkbox (Vuetify)
checklistChecklistHydrateinput-checklistVInputChecklist
checklist-groupChecklistGroupHydrateinput-checklist-groupVInputChecklistGroup
comboboxComboboxHydratecombobox / input-select-scrollv-combobox (Vuetify)
comparison-tableComparisonTableHydrateinput-comparison-tableVInputComparisonTable
creatorCreatorHydrateinput-browserVInputBrowser
dateDateHydrateinput-dateVInputDate
fileFileHydrateinput-fileVInputFile
filepondFilepondHydrateinput-filepondVInputFilepond
filepond-avatarFilepondAvatarHydrateinput-filepond-avatarVInputFilepondAvatar
form-tabs (tab-group)FormTabsHydrateinput-form-tabsVInputFormTabs
imageImageHydrateinput-imageVInputImage
jsonJsonHydrategroup(group layout)
json-repeaterJsonRepeaterHydrateinput-repeaterVInputRepeater
payment-servicePaymentServiceHydrateinput-payment-serviceVInputPaymentService
pricePriceHydrateinput-priceVInputPrice
processProcessHydrateinput-processVInputProcess
radio-groupRadioGroupHydrateinput-radio-groupVInputRadioGroup
repeaterRepeaterHydrateinput-repeaterVInputRepeater
relationshipsRelationshipsHydrateinput-relationshipsVInputRelationships ⚠️
selectSelectHydrateselectv-select (Vuetify)
select-scrollSelectScrollHydrateinput-select-scrollVInputSelectScroll
spreadSpreadHydrateinput-spreadVInputSpread
stateableStateableHydrateselectv-select (Vuetify)
switchSwitchHydrateinput-switchVInputSwitch
tagTagHydrateinput-tagVInputTag
taggerTaggerHydrateinput-taggerVInputTagger
......input-VInput

Rule: studlyName($input['type']) . 'Hydrate' → class in src/Hydrates/Inputs/

Hydrate Output Types (registry.js)

Output typeVue component
input-assignmentVInputAssignment
input-browserVInputBrowser
input-chatVInputChat
input-checklistVInputChecklist
input-checklist-groupVInputChecklistGroup
input-comparison-tableVInputComparisonTable
input-dateVInputDate
input-fileVInputFile
input-filepondVInputFilepond
input-filepond-avatarVInputFilepondAvatar
input-form-tabsVInputFormTabs
input-imageVInputImage
input-payment-serviceVInputPaymentService
input-priceVInputPrice
input-processVInputProcess
input-radio-groupVInputRadioGroup
input-repeaterVInputRepeater
input-select-scrollVInputSelectScroll
input-spreadVInputSpread
input-tagVInputTag
input-taggerVInputTagger

Schema Contract

Common keys (frontend expects): name, label, default, rules, items, itemValue, itemTitle, col, disabled, creatable, editable

Selectable: cascadeKey, cascades, repository, endpoint

Files: accept, maxFileSize, translated, max

Hydrate-only (stripped before frontend): route, model, repository, cascades, connector

Adding a New Input

  1. PHP: Create src/Hydrates/Inputs/{Studly}Hydrate.php extending InputHydrate
    • Set $input['type'] = 'input-{kebab}' in hydrate() (or select for select-based hydrates like AuthorizeHydrate, StateableHydrate)
    • Define $requirements for default schema keys
  2. Vue: Create vue/src/js/components/inputs/{Studly}.vue
    • Use useInput, makeInputProps, makeInputEmits from @/hooks
    • Component registers as VInput{Studly} via includeFormInputs glob
  3. Registry (optional): Add to hydrateTypeMap in registry.js for explicit mapping

See the create-input-hydrate and create-vue-input commands.