Skip to content

Frontend ​

Directory Structure ​

vue/src/js/
├── components/       # inputs, layouts, table, modals, form
├── hooks/            # useForm, useTable, useInput, etc.
├── utils/            # schema, helpers, getFormData
└── store/            # Vuex (config, user, language, etc.)

Component Organization ​

LocationPurpose
components/inputs/Form input components
components/layouts/Main, Sidebar, Home
components/table/Table, TableActions
components/modals/Modal, DynamicModal, ModalMedia
components/customs/App-specific overrides (UeCustom*)
components/labs/Experimental — not guaranteed stable

Form Flow ​

  1. Form.vue — receives schema and modelValue, uses useForm
  2. FormBase — iterates over flatCombinedArraySorted (flattened schema + model)
  3. FormBaseField — renders each field by obj.schema.type:
    • Special cases: preview, dynamic-component, title, radio, array, wrap/group
    • Default: <component :is="mapTypeToComponent(obj.schema.type)" v-bind="bindSchema(obj)" />
  4. Input components — receive obj.schema via bindSchema(obj)

Table Flow ​

  1. Table.vue — uses useTable, passes props to v-data-table-server
  2. useTable — orchestrates:
    • useTableItem — edited item, create/edit/delete
    • useTableHeaders — column definitions
    • useTableFilters — search, main filters, advanced filters
    • useTableForms — form modal open/close
    • useTableItemActions — row actions
    • useTableModals — dialogs
  3. store/api/datatable.js — axios calls for index, delete, restore, bulk actions

Input Registry ​

components/inputs/registry.js:

  • builtInTypeMap — Vuetify primitives (text → v-text-field, etc.)
  • hydrateTypeMap — Hydrate output types → custom components
  • customTypeMap — App-registered via registerInputType(type, component)
js
import { registerInputType, mapTypeToComponent } from '@/components/inputs/registry'
registerInputType('my-input', 'VMyInput')
const component = mapTypeToComponent('my-input') // => 'VMyInput'

Hooks ​

For the full hook reference including all 38 composables, see Vue Hooks.

HookPurpose
useFormForm state, validation, submit, schema/model sync
useFormBaseLogicForm base logic for FormBase
useInputInput state, modelValue, boundProps from schema
useTableMain table composable
useTableItem, useTableHeaders, useTableFiltersTable sub-hooks
useValidationValidation rules, invokeRuleGenerator
useCurrency, useCurrencyNumberCurrency formatting
useMediaLibrary, useMediaItemsMedia selection
useConfig, useUser, useLocaleApp state
useAlertGlobal alert notifications
useAuthorizationPermission and role checks
useCacheClient-side key-value cache
useCastAttributesDynamic $notation attribute interpolation
useDraggableSortable drag-and-drop props
useDynamicModalInject-based global modal service
useFile / useImageFile / image media-library inputs
useFilepondFilePond upload props and rules
useFormatterTable column value formatters
useInertiaRequestsIn-flight Inertia request state
useInputFetchPaginated remote fetch for select inputs
useInputHandlersSlot-driven input click handlers
useItemActionsForm action buttons
useModalModal open/close, width, fullscreen
useModelValuev-model two-way binding helper
useModuleModule i18n name and permission key
useNavigationLayoutTopbar / bottom-nav config
useRandKeyUnique component instance key
useRepeaterRepeater block state management
useSidebarSidebar open/close, rail, resize
useSvgSVG symbol utilities
useActiveTableItemActive row / detail-panel state

Utils ​

FilePurpose
schema.jsisViewOnlyInput, processInputs, flattenGroupSchema
getFormData.jsgetSchema, getModel, getSubmitFormData
helpers.jsisset, isObject, dataGet (prefer over window.__*)
formEvents.jshandleInputEvents, setSchemaInputField

Store (Vuex) ​

Modules: config, user, language, alert, media-library, browser, cache, ambient

API modules: store/api/datatable.js, store/api/form.js, store/api/media-library.js

Schema Contract ​

See Hydrates for common schema keys. Frontend receives schema via Inertia; FormBase flattens and combines with model before rendering.