Skip to content

Commit

Permalink
feat(form): add helper function to get correct field level in `inputR…
Browse files Browse the repository at this point in the history
…esolver`
  • Loading branch information
hermanwikner committed Aug 11, 2022
1 parent c66d937 commit 86f8b48
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 2 deletions.
32 changes: 32 additions & 0 deletions packages/sanity/src/form/studio/inputResolver/helpers.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,38 @@
import {SchemaType} from '@sanity/types'
import {get} from 'lodash'
import {ArrayFieldProps, ObjectFieldProps} from '../../types'

export function getOption(type: SchemaType, optionName: string) {
return get(type.options, optionName)
}

const PSEUDO_OBJECTS = ['array', 'file', 'image', 'reference']
const HIDDEN_FIELDS = ['asset', 'crop', 'hotspot', '_ref', '_weak']

export function getObjectFieldLevel(field: ObjectFieldProps): number {
const {type, fields, options} = field.schemaType
const fieldType = type?.name || ''

const isPseudoObject = PSEUDO_OBJECTS.includes(fieldType)

const hasVisibleFields = fields?.filter((f) => !HIDDEN_FIELDS.includes(f.name)).length > 0
const hasListOptions = options?.list?.length > 0

if (hasVisibleFields || hasListOptions || !isPseudoObject) {
return field.level
}

return 0
}

export function getArrayFieldLevel(field: ArrayFieldProps): number {
const {options} = field.schemaType

const hasListOptions = (options?.list || [])?.length > 0

if (hasListOptions) {
return field.level
}

return 0
}
11 changes: 9 additions & 2 deletions packages/sanity/src/form/studio/inputResolver/inputResolver.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ import {resolveArrayInput} from './resolveArrayInput'
import {resolveStringInput} from './resolveStringInput'
import {resolveNumberInput} from './resolveNumberInput'
import {defaultInputs} from './defaultInputs'
import {getArrayFieldLevel, getObjectFieldLevel} from './helpers'
import {isObjectField} from '../../utils/asserters'

function resolveComponentFromTypeVariants(
type: SchemaType
Expand Down Expand Up @@ -106,10 +108,12 @@ function PrimitiveField(field: FieldProps) {
}

function ObjectOrArrayField(field: ObjectFieldProps | ArrayFieldProps) {
const level = isObjectField(field) ? getObjectFieldLevel(field) : getArrayFieldLevel(field)

return (
<FormFieldSet
data-testid={`field-${field.inputId}`}
level={field.level}
level={level}
title={field.title}
description={field.description}
collapsed={field.collapsed}
Expand All @@ -132,9 +136,12 @@ function ImageOrFileField(field: ObjectFieldProps) {
const presence = hotspotField?.open
? field.presence
: field.presence.concat(hotspotField?.field.presence || [])

const level = getObjectFieldLevel(field)

return (
<FormFieldSet
level={field.level}
level={level}
title={field.title}
description={field.description}
collapsed={field.collapsed}
Expand Down

0 comments on commit 86f8b48

Please sign in to comment.