Horizon Framework

UI API — Validation

apiClient.ui.validation manages JSON schema validations — reusable schemas that enforce data structure for forms and data entry.

Methods

create

Create a new validation schema.

const validation = await apiClient.ui.validation.create({
  validation: {
    name: 'Job Validation',
    jsonSchema: {
      type: 'object',
      required: ['name', 'start'],
      properties: {
        name: { type: 'string', minLength: 1 },
        start: { type: 'string', format: 'date-time' },
      },
    },
  },
})
console.log(validation.uid)

get

Fetch a single validation by UID.

const validation = await apiClient.ui.validation.get({ uid: 'abc123' })

getMany

Fetch multiple validations, with optional filters.

// All validations
const validations = await apiClient.ui.validation.getMany({})

// By name
const named = await apiClient.ui.validation.getMany({ name: 'Job Validation' })

// Only uncomposed (leaf) validations
const uncomposed = await apiClient.ui.validation.getMany({ uncomposed: true })

// Paginated
const page = await apiClient.ui.validation.getMany({ limit: 20, page: 1 })

put

Update an existing validation. Unlike other services, put writes the full object directly (not merge-and-put).

await apiClient.ui.validation.put({
  validation: {
    uid: 'abc123',
    name: 'Job Validation',
    jsonSchema: {
      type: 'object',
      required: ['name'],
      properties: {
        name: { type: 'string' },
      },
    },
  },
})

del

Delete a validation by UID.

await apiClient.ui.validation.del({ uid: 'abc123' })

getBestValidation

Find the best-matching validation by name (sorted by relevance). Returns null if none found.

const validation =
  await apiClient.ui.validation.getBestValidation('Job Validation')

validateData

Validate a data object against a named validation schema. Returns a result indicating whether the data is valid and any errors.

const result = await apiClient.ui.validation.validateData({
  name: 'Job Validation',
  data: { name: 'My Job', start: '2024-01-01T09:00:00Z' },
})

if (!result.valid) {
  console.error('Validation errors:', result.errors)
}

Validation Type

FieldTypeDescription
uidstringUnique identifier
namestringDisplay name
tenantIdstringTenant the validation belongs to
jsonSchemaobjectJSON Schema definition

React Example

import { useApiClient } from '@skedulo/horizon-core'
import { useCallback } from 'react'

const ValidatedForm = ({ validationName, onSubmit }) => {
  const apiClient = useApiClient()

  const handleSubmit = useCallback(
    async (data) => {
      const result = await apiClient?.ui.validation.validateData({
        name: validationName,
        data,
      })

      if (result?.valid) {
        onSubmit(data)
      } else {
        console.error('Invalid data:', result?.errors)
      }
    },
    [apiClient, validationName, onSubmit],
  )

  // Note: Object.fromEntries(new FormData(...)) only captures checked checkboxes,
  // selected radio values, and the last value for multi-selects. Use FormData.getAll()
  // for fields that may have multiple values.
  return (
    <form
      onSubmit={(e) => {
        e.preventDefault()
        handleSubmit(Object.fromEntries(new FormData(e.target)))
      }}
    >
      <input name="name" placeholder="Name" />
      <button type="submit">Submit</button>
    </form>
  )
}