Skip to content

Commit 9f6ee90

Browse files
committed
feat(sanity): add compareValue to input component props
1 parent e2b2714 commit 9f6ee90

File tree

12 files changed

+55
-15
lines changed

12 files changed

+55
-15
lines changed

packages/sanity/src/core/form/members/array/items/ArrayOfObjectsItem.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,7 @@ export function ArrayOfObjectsItem(props: MemberItemProps) {
364364
schemaType: member.item.schemaType,
365365
validation: member.item.validation,
366366
value: member.item.value,
367+
compareValue: member.item.compareValue,
367368
elementProps: elementProps,
368369
displayInlineChanges: member.item.displayInlineChanges ?? false,
369370
}
@@ -393,6 +394,7 @@ export function ArrayOfObjectsItem(props: MemberItemProps) {
393394
member.item.schemaType,
394395
member.item.validation,
395396
member.item.value,
397+
member.item.compareValue,
396398
member.item.displayInlineChanges,
397399
renderAnnotation,
398400
renderBlock,
@@ -411,6 +413,7 @@ export function ArrayOfObjectsItem(props: MemberItemProps) {
411413
index: member.index,
412414
level: member.item.level,
413415
value: member.item.value,
416+
compareValue: member.item.compareValue,
414417
__unstable_computeDiff: member.item.__unstable_computeDiff,
415418
hasUpstreamVersion: member.item.hasUpstreamVersion,
416419
title: member.item.schemaType.title,
@@ -444,6 +447,7 @@ export function ArrayOfObjectsItem(props: MemberItemProps) {
444447
member.index,
445448
member.item.level,
446449
member.item.value,
450+
member.item.compareValue,
447451
member.item.__unstable_computeDiff,
448452
member.item.hasUpstreamVersion,
449453
member.item.schemaType,

packages/sanity/src/core/form/members/array/items/ArrayOfPrimitivesItem.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ export function ArrayOfPrimitivesItem(props: PrimitiveMemberItemProps) {
137137
changed: member.item.changed,
138138
level: member.item.level,
139139
value: member.item.value as FIXME,
140+
compareValue: member.item.compareValue,
140141
__unstable_computeDiff: member.item.__unstable_computeDiff,
141142
hasUpstreamVersion: member.item.hasUpstreamVersion,
142143
readOnly: member.item.readOnly,
@@ -155,6 +156,7 @@ export function ArrayOfPrimitivesItem(props: PrimitiveMemberItemProps) {
155156
member.item.__unstable_computeDiff,
156157
member.item.level,
157158
member.item.value,
159+
member.item.compareValue,
158160
member.item.hasUpstreamVersion,
159161
member.item.readOnly,
160162
member.item.schemaType,

packages/sanity/src/core/form/members/object/MemberField.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,12 @@ import {
1212
} from '../../types'
1313
import {ArrayOfObjectsField} from './fields/ArrayOfObjectsField'
1414
import {ArrayOfPrimitivesField} from './fields/ArrayOfPrimitivesField'
15-
import {isMemberArrayOfObjects, isMemberArrayOfPrimitives, isMemberObject} from './fields/asserters'
15+
import {
16+
isMemberArrayOfObjects,
17+
isMemberArrayOfPrimitives,
18+
isMemberObject,
19+
isMemberPrimitive,
20+
} from './fields/asserters'
1621
import {ObjectField} from './fields/ObjectField'
1722
import {PrimitiveField} from './fields/PrimitiveField'
1823

@@ -88,5 +93,9 @@ export const MemberField = memo(function MemberField(props: MemberFieldProps) {
8893
)
8994
}
9095

91-
return <PrimitiveField member={member} renderField={renderField} renderInput={renderInput} />
96+
if (isMemberPrimitive(member)) {
97+
return <PrimitiveField member={member} renderField={renderField} renderInput={renderInput} />
98+
}
99+
100+
return null
92101
})

packages/sanity/src/core/form/members/object/fields/ArrayOfObjectsField.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,7 @@ export function ArrayOfObjectsField(props: {
373373
schemaType: member.field.schemaType,
374374
changed: member.field.changed,
375375
__unstable_computeDiff: member.field.__unstable_computeDiff,
376+
compareValue: member.field.compareValue,
376377
hasUpstreamVersion: member.field.hasUpstreamVersion,
377378
id: member.field.id,
378379
onItemExpand: handleExpandItem,
@@ -415,6 +416,7 @@ export function ArrayOfObjectsField(props: {
415416
member.field.schemaType,
416417
member.field.changed,
417418
member.field.__unstable_computeDiff,
419+
member.field.compareValue,
418420
member.field.id,
419421
member.field.focusPath,
420422
member.field.focused,

packages/sanity/src/core/form/members/object/fields/ArrayOfPrimitivesField.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,7 @@ export function ArrayOfPrimitivesField(props: {
336336
level: member.field.level,
337337
members: member.field.members,
338338
value: member.field.value as any,
339+
compareValue: member.field.compareValue,
339340
readOnly: member.field.readOnly,
340341
onSetCollapsed: handleSetCollapsed,
341342
schemaType: member.field.schemaType,
@@ -370,6 +371,7 @@ export function ArrayOfPrimitivesField(props: {
370371
member.field.level,
371372
member.field.members,
372373
member.field.value,
374+
member.field.compareValue,
373375
member.field.readOnly,
374376
member.field.schemaType,
375377
member.field.changed,

packages/sanity/src/core/form/members/object/fields/ObjectField.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,7 @@ export const ObjectField = function ObjectField(props: {
192192
level: member.field.level,
193193
members: member.field.members,
194194
value: member.field.value,
195+
compareValue: member.field.compareValue,
195196
readOnly: member.field.readOnly,
196197
validation: member.field.validation,
197198
presence: member.field.presence,
@@ -227,6 +228,7 @@ export const ObjectField = function ObjectField(props: {
227228
member.field.level,
228229
member.field.members,
229230
member.field.value,
231+
member.field.compareValue,
230232
member.field.readOnly,
231233
member.field.validation,
232234
member.field.presence,

packages/sanity/src/core/form/members/object/fields/PrimitiveField.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import {isBooleanSchemaType, isNumberSchemaType} from '@sanity/types'
22
import {type ChangeEvent, useCallback, useEffect, useMemo, useRef, useState} from 'react'
33

44
import {type FormPatch, PatchEvent, set, unset} from '../../../patch'
5-
import {type FieldMember} from '../../../store'
5+
import {type FieldMember, type PrimitiveFormNode} from '../../../store'
66
import {useDocumentFieldActions} from '../../../studio/contexts/DocumentFieldActions'
77
import {useFormCallbacks} from '../../../studio/contexts/FormCallbacks'
88
import {
@@ -21,7 +21,7 @@ import {resolveNativeNumberInputValue} from '../../common/resolveNativeNumberInp
2121
* @internal
2222
*/
2323
export function PrimitiveField(props: {
24-
member: FieldMember
24+
member: FieldMember<PrimitiveFormNode>
2525
renderInput: RenderInputCallback<PrimitiveInputProps>
2626
renderField: RenderFieldCallback<PrimitiveFieldProps>
2727
}) {
@@ -126,6 +126,7 @@ export function PrimitiveField(props: {
126126
const inputProps = useMemo((): Omit<PrimitiveInputProps, 'renderDefault'> => {
127127
return {
128128
value: member.field.value as any,
129+
compareValue: member.field.compareValue,
129130
__unstable_computeDiff: member.field.__unstable_computeDiff,
130131
readOnly: member.field.readOnly,
131132
schemaType: member.field.schemaType as any,
@@ -145,6 +146,7 @@ export function PrimitiveField(props: {
145146
}, [
146147
member.field.displayInlineChanges,
147148
member.field.value,
149+
member.field.compareValue,
148150
member.field.__unstable_computeDiff,
149151
member.field.readOnly,
150152
member.field.schemaType,

packages/sanity/src/core/form/members/object/fields/asserters.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
type ArrayOfPrimitivesFormNode,
66
type FieldMember,
77
type ObjectFormNode,
8+
type PrimitiveFormNode,
89
} from '../../../store'
910

1011
export function isMemberObject(member: FieldMember): member is FieldMember<ObjectFormNode> {
@@ -28,3 +29,7 @@ export function isMemberArrayOfObjects(
2829
member.field.schemaType.of.every((ofType) => isObjectSchemaType(ofType))
2930
)
3031
}
32+
33+
export function isMemberPrimitive(member: FieldMember): member is FieldMember<PrimitiveFormNode> {
34+
return isPrimitiveSchemaType(member.field.schemaType)
35+
}

packages/sanity/src/core/form/store/formState.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
isArraySchemaType,
1212
isKeyedObject,
1313
isObjectSchemaType,
14+
type KeyedObject,
1415
type NumberSchemaType,
1516
type ObjectField,
1617
type ObjectSchemaType,
@@ -1046,6 +1047,7 @@ export function createPrepareFormState({
10461047

10471048
const node = {
10481049
value: props.value as Record<string, unknown> | undefined,
1050+
compareValue: props.comparisonValue ?? undefined,
10491051
schemaType: props.schemaType,
10501052
readOnly,
10511053
path: props.path,
@@ -1144,7 +1146,7 @@ export function createPrepareFormState({
11441146
}),
11451147
)
11461148

1147-
const diffProps = prepareDiffProps(props)
1149+
const diffProps = prepareDiffProps<KeyedObject[]>(props)
11481150

11491151
return {
11501152
value: props.value,
@@ -1162,6 +1164,7 @@ export function createPrepareFormState({
11621164
__unstable_computeDiff: diffProps.__unstable_computeDiff,
11631165
// checks for changes not only on the array itself, but also on any of its items
11641166
changed: props.changed || members.some((m) => m.kind === 'item' && m.item.changed),
1167+
compareValue: diffProps.compareValue,
11651168
hasUpstreamVersion: diffProps.hasUpstreamVersion,
11661169
displayInlineChanges: props.displayInlineChanges,
11671170
}
@@ -1417,16 +1420,16 @@ const emptyValuesByType = {
14171420
*
14181421
* @internal
14191422
*/
1420-
export function prepareDiffProps({
1423+
export function prepareDiffProps<Value = unknown>({
14211424
comparisonValue,
14221425
value: definitiveValue,
14231426
schemaType,
14241427
perspective,
14251428
hasUpstreamVersion,
14261429
}: Pick<
1427-
FormStateOptions<unknown, unknown>,
1430+
FormStateOptions<unknown, Value>,
14281431
'comparisonValue' | 'value' | 'schemaType' | 'perspective' | 'hasUpstreamVersion'
1429-
>): Omit<NodeDiffProps<ProvenanceDiffAnnotation>, 'changed'> & {compareValue: unknown} {
1432+
>): Omit<NodeDiffProps<ProvenanceDiffAnnotation, Value>, 'changed'> {
14301433
const jsonType =
14311434
typeof schemaType === 'object' &&
14321435
schemaType !== null &&
@@ -1459,7 +1462,7 @@ export function prepareDiffProps({
14591462
return {
14601463
__unstable_computeDiff: computeDiff,
14611464
// TODO: Establish consistent naming.
1462-
compareValue: comparisonValue,
1465+
compareValue: comparisonValue ?? undefined,
14631466
hasUpstreamVersion,
14641467
}
14651468
}

packages/sanity/src/core/form/store/types/nodes.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
type ArraySchemaType,
44
type BooleanSchemaType,
55
type FormNodeValidation,
6+
type KeyedObject,
67
type NumberSchemaType,
78
type ObjectSchemaType,
89
type Path,
@@ -38,7 +39,7 @@ export interface NodeChronologyProps {
3839
*
3940
* @public
4041
*/
41-
export interface NodeDiffProps<Annotation> extends NodeChronologyProps {
42+
export interface NodeDiffProps<Annotation, Value = unknown> extends NodeChronologyProps {
4243
/**
4344
* A function that takes any value and produces a diff between that value and the value the node
4445
* is being compared to.
@@ -53,14 +54,22 @@ export interface NodeDiffProps<Annotation> extends NodeChronologyProps {
5354
* Whether the current value is different to the value the node is being compared to.
5455
*/
5556
changed: boolean
57+
/**
58+
* The value the node is currently being compared to. This is taken from the upstream version, if
59+
* the document has an upstream version. Otherwise, it's taken from the document's current value.
60+
*
61+
* You can use the `hasUpstreamVersion` prop to determine whether the document has an upstream
62+
* version.
63+
*/
64+
compareValue?: Value
5665
}
5766

5867
/**
5968
* @hidden
6069
* @public
6170
*/
6271
export interface BaseFormNode<T = unknown, S extends SchemaType = SchemaType>
63-
extends NodeDiffProps<ProvenanceDiffAnnotation> {
72+
extends NodeDiffProps<ProvenanceDiffAnnotation, T> {
6473
// constants
6574
/** The unique identifier of the node. */
6675
id: string
@@ -141,7 +150,7 @@ export type DocumentFormNode<
141150

142151
/** @public */
143152
export interface ArrayOfObjectsFormNode<
144-
T extends any[] = unknown[],
153+
T extends any[] = KeyedObject[],
145154
S extends ArraySchemaType = ArraySchemaType,
146155
> extends BaseFormNode<T, S> {
147156
/** The focus path of the form node. */

0 commit comments

Comments
 (0)