@object-ui/fields 17.3.0 → 17.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1655 -0
- package/README.md +1 -12
- package/dist/FieldEditWidget.d.ts +23 -3
- package/dist/currency.d.ts +46 -0
- package/dist/field-type-alias.d.ts +35 -1
- package/dist/index.cjs +4 -4
- package/dist/index.css +651 -0
- package/dist/index.d.ts +474 -85
- package/dist/index.js +5418 -5023
- package/dist/widgets/AddressField.d.ts +4 -12
- package/dist/widgets/AutoNumberField.d.ts +1 -1
- package/dist/widgets/AvatarField.d.ts +1 -1
- package/dist/widgets/BooleanField.d.ts +1 -1
- package/dist/widgets/CapabilityMultiSelectField.d.ts +1 -1
- package/dist/widgets/CheckboxesField.d.ts +1 -1
- package/dist/widgets/CodeField.d.ts +1 -1
- package/dist/widgets/ColorField.d.ts +1 -1
- package/dist/widgets/CurrencyField.d.ts +1 -1
- package/dist/widgets/DateField.d.ts +1 -1
- package/dist/widgets/DateTimeField.d.ts +1 -1
- package/dist/widgets/EmailField.d.ts +1 -1
- package/dist/widgets/FileField.d.ts +18 -2
- package/dist/widgets/FilterConditionField.d.ts +28 -1
- package/dist/widgets/FormulaField.d.ts +1 -1
- package/dist/widgets/FullscreenFieldEditor.d.ts +49 -152
- package/dist/widgets/GeolocationField.d.ts +1 -1
- package/dist/widgets/GridField.d.ts +68 -6
- package/dist/widgets/ImageField.d.ts +1 -1
- package/dist/widgets/LocationField.d.ts +1 -1
- package/dist/widgets/LookupField.d.ts +1 -1
- package/dist/widgets/MasterDetailField.d.ts +1 -1
- package/dist/widgets/MultiSelectField.d.ts +1 -1
- package/dist/widgets/NumberField.d.ts +1 -1
- package/dist/widgets/ObjectField.d.ts +1 -1
- package/dist/widgets/ObjectRefField.d.ts +1 -1
- package/dist/widgets/OptionsEmptyState.d.ts +21 -1
- package/dist/widgets/PasswordField.d.ts +1 -1
- package/dist/widgets/PercentField.d.ts +1 -1
- package/dist/widgets/PhoneField.d.ts +1 -1
- package/dist/widgets/QRCodeField.d.ts +1 -1
- package/dist/widgets/RadioField.d.ts +1 -1
- package/dist/widgets/RatingField.d.ts +1 -1
- package/dist/widgets/RecipientPickerField.d.ts +1 -1
- package/dist/widgets/RecordPickerDialog.d.ts +34 -10
- package/dist/widgets/RichTextField.d.ts +37 -1
- package/dist/widgets/SelectField.d.ts +26 -6
- package/dist/widgets/SignatureField.d.ts +32 -2
- package/dist/widgets/SliderField.d.ts +37 -2
- package/dist/widgets/SummaryField.d.ts +1 -1
- package/dist/widgets/TagsField.d.ts +1 -1
- package/dist/widgets/TextAreaField.d.ts +6 -2
- package/dist/widgets/TextField.d.ts +1 -1
- package/dist/widgets/TimeField.d.ts +1 -1
- package/dist/widgets/UrlField.d.ts +1 -1
- package/dist/widgets/UserField.d.ts +1 -1
- package/dist/widgets/VectorField.d.ts +1 -1
- package/dist/widgets/_cell-renderer-bridge.d.ts +1 -1
- package/dist/widgets/address-format.d.ts +88 -0
- package/dist/widgets/file-size-guard.d.ts +41 -0
- package/dist/widgets/lookupColumnDisplay.d.ts +93 -0
- package/dist/widgets/nativeDateValue.d.ts +37 -0
- package/dist/widgets/richTextDisplay.d.ts +80 -0
- package/dist/widgets/toDomProps.d.ts +30 -10
- package/dist/widgets/toHostGroupProps.d.ts +189 -0
- package/dist/widgets/types.d.ts +8 -3
- package/dist/widgets/useRecordQuery.d.ts +7 -1
- package/package.json +17 -14
- package/dist/FieldEditWidget.test.d.ts +0 -8
- package/dist/__tests__/DateCellRenderer.test.d.ts +0 -0
- package/dist/__tests__/NumberCellRenderer.test.d.ts +0 -0
- package/dist/__tests__/cell-truncation.test.d.ts +0 -0
- package/dist/__tests__/field-carrier-sdui.test.d.ts +0 -0
- package/dist/__tests__/lookupCellDisplayField.test.d.ts +0 -0
- package/dist/__tests__/lookupCellDisplayName.test.d.ts +0 -0
- package/dist/__tests__/lookupCellReferenceKey.test.d.ts +0 -0
- package/dist/__tests__/registry-collision.test.d.ts +0 -0
- package/dist/__tests__/resolveFieldCurrency.test.d.ts +0 -1
- package/dist/__tests__/spec-symbol-batch7.test.d.ts +0 -8
- package/dist/__tests__/validation-feedback.test.d.ts +0 -0
- package/dist/__tests__/widget-aria-invalid-e2e.test.d.ts +0 -0
- package/dist/__tests__/widget-aria-invalid-registry-e2e.test.d.ts +0 -0
- package/dist/__tests__/widget-dom-leak-e2e.test.d.ts +0 -0
- package/dist/__tests__/widget-props-contract.test.d.ts +0 -8
- package/dist/coerce-safe-value.test.d.ts +0 -1
- package/dist/complex-widgets.test.d.ts +0 -1
- package/dist/datetime-widgets.test.d.ts +0 -1
- package/dist/field-type-coverage.test.d.ts +0 -1
- package/dist/standard-widgets.test.d.ts +0 -0
- package/dist/widgets/AddressField.uniqueIds.test.d.ts +0 -0
- package/dist/widgets/CapabilityMultiSelectField.test.d.ts +0 -0
- package/dist/widgets/CharacterCount.d.ts +0 -56
- package/dist/widgets/CheckboxesField.cascade.test.d.ts +0 -0
- package/dist/widgets/GeolocationField.uniqueIds.test.d.ts +0 -0
- package/dist/widgets/GridField.test.d.ts +0 -1
- package/dist/widgets/ImageLightbox.test.d.ts +0 -1
- package/dist/widgets/LookupField.dependsOn.test.d.ts +0 -8
- package/dist/widgets/LookupField.gateHintLabel.test.d.ts +0 -8
- package/dist/widgets/LookupField.hydration.test.d.ts +0 -1
- package/dist/widgets/LookupField.idField.test.d.ts +0 -1
- package/dist/widgets/MultiSelectField.cascade.test.d.ts +0 -0
- package/dist/widgets/OptionsEmptyState.no-provider.test.d.ts +0 -0
- package/dist/widgets/OptionsEmptyState.test.d.ts +0 -0
- package/dist/widgets/PeoplePicker.test.d.ts +0 -8
- package/dist/widgets/PeoplePickerComponents.test.d.ts +0 -8
- package/dist/widgets/RadioField.cascade.test.d.ts +0 -0
- package/dist/widgets/RecipientPickerField.test.d.ts +0 -0
- package/dist/widgets/RecordPickerDialog.filterOptions.test.d.ts +0 -8
- package/dist/widgets/RecordPickerDialog.selectLabel.test.d.ts +0 -8
- package/dist/widgets/SelectField.cascade.test.d.ts +0 -0
- package/dist/widgets/TagsField.placeholder.no-provider.test.d.ts +0 -0
- package/dist/widgets/TagsField.placeholder.test.d.ts +0 -0
- package/dist/widgets/UserFieldPicker.test.d.ts +0 -8
- package/dist/widgets/__tests__/FilterConditionField.matchAll.test.d.ts +0 -8
- package/dist/widgets/__tests__/FilterConditionField.operators.test.d.ts +0 -8
- package/dist/widgets/__tests__/FullscreenFieldEditor.i18n.test.d.ts +0 -0
- package/dist/widgets/__tests__/FullscreenFieldEditor.no-provider.test.d.ts +0 -0
- package/dist/widgets/__tests__/RichTextField.fullscreenDisabled.test.d.ts +0 -0
- package/dist/widgets/__tests__/RichTextField.mobileFullscreen.test.d.ts +0 -0
- package/dist/widgets/__tests__/TextAreaField.characterCount.announcements.test.d.ts +0 -0
- package/dist/widgets/__tests__/TextAreaField.characterCount.i18n.test.d.ts +0 -0
- package/dist/widgets/__tests__/TextAreaField.characterCount.no-provider.test.d.ts +0 -0
- package/dist/widgets/__tests__/TextAreaField.fullscreenCharacterCount.i18n.test.d.ts +0 -0
- package/dist/widgets/__tests__/TextAreaField.fullscreenCharacterCount.test.d.ts +0 -0
- package/dist/widgets/__tests__/TextAreaField.fullscreenDisabled.test.d.ts +0 -0
- package/dist/widgets/__tests__/TextAreaField.mobileFullscreen.test.d.ts +0 -0
- package/dist/widgets/deriveLookupColumns.test.d.ts +0 -1
- package/dist/widgets/file-value.test.d.ts +0 -1
- package/dist/widgets/personDisplay.test.d.ts +0 -8
- package/dist/widgets/recentLookups.test.d.ts +0 -1
- package/dist/widgets/useRecordQuery.test.d.ts +0 -8
- package/dist/widgets/useUploadingSignal.test.d.ts +0 -1
- package/src/FieldEditWidget.test.ts +0 -133
- package/src/FieldEditWidget.tsx +0 -191
- package/src/__tests__/DateCellRenderer.test.tsx +0 -73
- package/src/__tests__/NumberCellRenderer.test.tsx +0 -60
- package/src/__tests__/cell-truncation.test.tsx +0 -96
- package/src/__tests__/field-carrier-sdui.test.tsx +0 -169
- package/src/__tests__/lookupCellDisplayField.test.tsx +0 -107
- package/src/__tests__/lookupCellDisplayName.test.tsx +0 -119
- package/src/__tests__/lookupCellReferenceKey.test.tsx +0 -57
- package/src/__tests__/registry-collision.test.ts +0 -91
- package/src/__tests__/resolveFieldCurrency.test.ts +0 -20
- package/src/__tests__/spec-symbol-batch7.test.ts +0 -126
- package/src/__tests__/validation-feedback.test.tsx +0 -361
- package/src/__tests__/widget-aria-invalid-e2e.test.tsx +0 -265
- package/src/__tests__/widget-aria-invalid-registry-e2e.test.tsx +0 -338
- package/src/__tests__/widget-dom-leak-e2e.test.tsx +0 -598
- package/src/__tests__/widget-props-contract.test.tsx +0 -142
- package/src/coerce-safe-value.test.ts +0 -34
- package/src/complex-widgets.test.tsx +0 -908
- package/src/currency.ts +0 -14
- package/src/datetime-widgets.test.tsx +0 -93
- package/src/field-type-alias.ts +0 -100
- package/src/field-type-coverage.test.ts +0 -67
- package/src/index.tsx +0 -2503
- package/src/standard-widgets.test.tsx +0 -357
- package/src/widgets/AddressField.tsx +0 -132
- package/src/widgets/AddressField.uniqueIds.test.tsx +0 -92
- package/src/widgets/AutoNumberField.tsx +0 -18
- package/src/widgets/AvatarField.tsx +0 -117
- package/src/widgets/BooleanField.tsx +0 -52
- package/src/widgets/CapabilityMultiSelectField.test.tsx +0 -168
- package/src/widgets/CapabilityMultiSelectField.tsx +0 -229
- package/src/widgets/CharacterCount.tsx +0 -263
- package/src/widgets/CheckboxesField.cascade.test.tsx +0 -143
- package/src/widgets/CheckboxesField.tsx +0 -136
- package/src/widgets/CodeField.tsx +0 -41
- package/src/widgets/ColorField.tsx +0 -53
- package/src/widgets/CurrencyField.tsx +0 -95
- package/src/widgets/DateField.tsx +0 -31
- package/src/widgets/DateTimeField.tsx +0 -37
- package/src/widgets/EmailField.tsx +0 -37
- package/src/widgets/FileField.tsx +0 -494
- package/src/widgets/FilterConditionField.tsx +0 -454
- package/src/widgets/FormulaField.tsx +0 -33
- package/src/widgets/FullscreenFieldEditor.tsx +0 -271
- package/src/widgets/GeolocationField.tsx +0 -167
- package/src/widgets/GeolocationField.uniqueIds.test.tsx +0 -88
- package/src/widgets/GridField.test.tsx +0 -406
- package/src/widgets/GridField.tsx +0 -966
- package/src/widgets/ImageCropperDialog.tsx +0 -245
- package/src/widgets/ImageField.tsx +0 -255
- package/src/widgets/ImageLightbox.test.tsx +0 -52
- package/src/widgets/ImageLightbox.tsx +0 -108
- package/src/widgets/LocationField.tsx +0 -57
- package/src/widgets/LookupField.dependsOn.test.tsx +0 -233
- package/src/widgets/LookupField.gateHintLabel.test.tsx +0 -135
- package/src/widgets/LookupField.hydration.test.tsx +0 -136
- package/src/widgets/LookupField.idField.test.tsx +0 -61
- package/src/widgets/LookupField.tsx +0 -1291
- package/src/widgets/MarkdownContent.tsx +0 -19
- package/src/widgets/MasterDetailField.tsx +0 -131
- package/src/widgets/MultiSelectField.cascade.test.tsx +0 -143
- package/src/widgets/MultiSelectField.tsx +0 -142
- package/src/widgets/NumberField.tsx +0 -49
- package/src/widgets/ObjectField.tsx +0 -94
- package/src/widgets/ObjectRefField.tsx +0 -121
- package/src/widgets/OptionsEmptyState.no-provider.test.tsx +0 -88
- package/src/widgets/OptionsEmptyState.test.tsx +0 -169
- package/src/widgets/OptionsEmptyState.tsx +0 -83
- package/src/widgets/PasswordField.tsx +0 -49
- package/src/widgets/PeoplePicker.test.tsx +0 -360
- package/src/widgets/PeoplePicker.tsx +0 -579
- package/src/widgets/PeoplePickerComponents.test.tsx +0 -104
- package/src/widgets/PercentField.tsx +0 -95
- package/src/widgets/PersonRow.tsx +0 -117
- package/src/widgets/PhoneField.tsx +0 -37
- package/src/widgets/QRCodeField.tsx +0 -103
- package/src/widgets/RadioField.cascade.test.tsx +0 -141
- package/src/widgets/RadioField.tsx +0 -111
- package/src/widgets/RatingField.tsx +0 -81
- package/src/widgets/RecipientPickerField.test.tsx +0 -157
- package/src/widgets/RecipientPickerField.tsx +0 -188
- package/src/widgets/RecordPickerDialog.filterOptions.test.tsx +0 -611
- package/src/widgets/RecordPickerDialog.selectLabel.test.tsx +0 -112
- package/src/widgets/RecordPickerDialog.tsx +0 -1316
- package/src/widgets/RichTextField.tsx +0 -176
- package/src/widgets/SelectField.cascade.test.tsx +0 -138
- package/src/widgets/SelectField.tsx +0 -162
- package/src/widgets/SelectionTray.tsx +0 -110
- package/src/widgets/SignatureField.tsx +0 -140
- package/src/widgets/SliderField.tsx +0 -39
- package/src/widgets/SummaryField.tsx +0 -31
- package/src/widgets/TagsField.placeholder.no-provider.test.tsx +0 -68
- package/src/widgets/TagsField.placeholder.test.tsx +0 -95
- package/src/widgets/TagsField.tsx +0 -88
- package/src/widgets/TextAreaField.tsx +0 -213
- package/src/widgets/TextField.tsx +0 -45
- package/src/widgets/TimeField.tsx +0 -31
- package/src/widgets/UrlField.tsx +0 -46
- package/src/widgets/UserField.tsx +0 -58
- package/src/widgets/UserFieldPicker.test.tsx +0 -78
- package/src/widgets/VectorField.tsx +0 -29
- package/src/widgets/__tests__/FilterConditionField.matchAll.test.ts +0 -66
- package/src/widgets/__tests__/FilterConditionField.operators.test.ts +0 -142
- package/src/widgets/__tests__/FullscreenFieldEditor.i18n.test.tsx +0 -248
- package/src/widgets/__tests__/FullscreenFieldEditor.no-provider.test.tsx +0 -116
- package/src/widgets/__tests__/RichTextField.fullscreenDisabled.test.tsx +0 -244
- package/src/widgets/__tests__/RichTextField.mobileFullscreen.test.tsx +0 -195
- package/src/widgets/__tests__/TextAreaField.characterCount.announcements.test.tsx +0 -417
- package/src/widgets/__tests__/TextAreaField.characterCount.i18n.test.tsx +0 -287
- package/src/widgets/__tests__/TextAreaField.characterCount.no-provider.test.tsx +0 -160
- package/src/widgets/__tests__/TextAreaField.fullscreenCharacterCount.i18n.test.tsx +0 -161
- package/src/widgets/__tests__/TextAreaField.fullscreenCharacterCount.test.tsx +0 -346
- package/src/widgets/__tests__/TextAreaField.fullscreenDisabled.test.tsx +0 -246
- package/src/widgets/__tests__/TextAreaField.mobileFullscreen.test.tsx +0 -175
- package/src/widgets/_cell-renderer-bridge.ts +0 -19
- package/src/widgets/deriveLookupColumns.test.ts +0 -112
- package/src/widgets/deriveLookupColumns.ts +0 -108
- package/src/widgets/file-value.test.ts +0 -230
- package/src/widgets/file-value.ts +0 -246
- package/src/widgets/openNativePicker.ts +0 -18
- package/src/widgets/personDisplay.test.ts +0 -113
- package/src/widgets/personDisplay.ts +0 -92
- package/src/widgets/recentLookups.test.ts +0 -45
- package/src/widgets/recentLookups.ts +0 -47
- package/src/widgets/toDomProps.ts +0 -175
- package/src/widgets/types.ts +0 -242
- package/src/widgets/useCascadingOptions.ts +0 -46
- package/src/widgets/useFieldTranslation.ts +0 -150
- package/src/widgets/useRecordQuery.test.ts +0 -174
- package/src/widgets/useRecordQuery.ts +0 -264
- package/src/widgets/useUploadingSignal.test.tsx +0 -62
- package/src/widgets/useUploadingSignal.ts +0 -20
- package/src/withFieldCarrier.tsx +0 -75
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ObjectUI
|
|
3
|
-
* Copyright (c) 2024-present ObjectStack Inc.
|
|
4
|
-
*
|
|
5
|
-
* This source code is licensed under the MIT license found in the
|
|
6
|
-
* LICENSE file in the root directory of this source tree.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* `FieldWidgetComponentProps` is a CLOSED contract (objectui#3221).
|
|
11
|
-
*
|
|
12
|
-
* It used to end in `[key: string]: any`, which made every check over it
|
|
13
|
-
* vacuous: a type claiming to have every key can never be reported as missing
|
|
14
|
-
* one (objectstack#4075). Three consequences, one test each below:
|
|
15
|
-
*
|
|
16
|
-
* 1. a key the type does not declare is a compile error, not a silent `any`
|
|
17
|
-
* — which is what let objectui#3222 rename the validation slot to the
|
|
18
|
-
* spec's `error` with the compiler, not grep, proving no call site was
|
|
19
|
-
* missed;
|
|
20
|
-
* 2. a MISSPELLED prop (`readOnly` for `readonly`) is rejected;
|
|
21
|
-
* 3. the pass-through keys hosts genuinely forward still type-check, and
|
|
22
|
-
* still reach the rendered control at runtime — closing the type must not
|
|
23
|
-
* have been paid for by dropping real behaviour.
|
|
24
|
-
*
|
|
25
|
-
* (1) and (2) are compile-time: a violation fails `pnpm --filter
|
|
26
|
-
* @object-ui/fields type-check`, not this run. `@ts-expect-error` inverts
|
|
27
|
-
* that — the line fails to compile if the error it expects ever STOPS
|
|
28
|
-
* happening, i.e. if the index signature comes back.
|
|
29
|
-
*/
|
|
30
|
-
|
|
31
|
-
import { describe, it, expect } from 'vitest';
|
|
32
|
-
import { render, screen } from '@testing-library/react';
|
|
33
|
-
|
|
34
|
-
import { TextField } from '../widgets/TextField';
|
|
35
|
-
import { BooleanField } from '../widgets/BooleanField';
|
|
36
|
-
import type { FieldWidgetComponentProps } from '../widgets/types';
|
|
37
|
-
import type { FieldMetadata } from '@object-ui/types';
|
|
38
|
-
|
|
39
|
-
type Assert<T extends true> = T;
|
|
40
|
-
type Equal<A, B> = (<T>() => T extends A ? 1 : 2) extends <T>() => T extends B ? 1 : 2 ? true : false;
|
|
41
|
-
type Extends<A, B> = [A] extends [B] ? true : false;
|
|
42
|
-
|
|
43
|
-
const field = { name: 'title', label: 'Title', type: 'text' } as unknown as FieldMetadata;
|
|
44
|
-
|
|
45
|
-
describe('FieldWidgetComponentProps is closed (objectui#3221)', () => {
|
|
46
|
-
it('has no `[key: string]` index signature', () => {
|
|
47
|
-
// The single assertion the whole change turns on. While the index
|
|
48
|
-
// signature existed this was `true`, and every check below was vacuous.
|
|
49
|
-
type _NotOpen = Assert<Equal<Extends<string, keyof FieldWidgetComponentProps>, false>>;
|
|
50
|
-
expect(true).toBe(true);
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
it('rejects keys it does not declare', () => {
|
|
54
|
-
const props = {} as FieldWidgetComponentProps<string>;
|
|
55
|
-
|
|
56
|
-
// `required` stays out on purpose (objectui#3222): the required marker has
|
|
57
|
-
// exactly one author, the form renderer's `<FormLabel>`, and handing the
|
|
58
|
-
// flag to widgets invites a second one. Its sibling `error` went the other
|
|
59
|
-
// way — the spec declares it, so the slot below adopted the spec's name and
|
|
60
|
-
// the form renderer now produces it.
|
|
61
|
-
// @ts-expect-error `required` is not part of this contract
|
|
62
|
-
void props.required;
|
|
63
|
-
const message: string | undefined = props.error;
|
|
64
|
-
void message;
|
|
65
|
-
|
|
66
|
-
// …and the class of bug the index signature hid best: a typo.
|
|
67
|
-
// @ts-expect-error the prop is `readonly`, not React's DOM `readOnly`
|
|
68
|
-
void props.readOnly;
|
|
69
|
-
// @ts-expect-error the prop is `onChange`
|
|
70
|
-
void props.onchange;
|
|
71
|
-
|
|
72
|
-
// The second metadata carrier is gone (objectui#3233). `schema` was a
|
|
73
|
-
// DECLARED key here through #3221 — one concept under two spellings, which
|
|
74
|
-
// is how ~30 widgets ended up resolving `field || schema`. v17 converged it
|
|
75
|
-
// at the producers, so reading it is now a compile error rather than a
|
|
76
|
-
// silent second contract for the next widget author to discover.
|
|
77
|
-
// @ts-expect-error `schema` was retired from the widget contract in v17
|
|
78
|
-
void props.schema;
|
|
79
|
-
|
|
80
|
-
expect(true).toBe(true);
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
it('still accepts the pass-through keys hosts actually forward', () => {
|
|
84
|
-
// Closing the type is only correct if the real call sites still compile.
|
|
85
|
-
// Each key here has a named producer: the form renderer, the inline-edit
|
|
86
|
-
// host, or the line-item grid. Deleting one from the type breaks this.
|
|
87
|
-
const passThrough: FieldWidgetComponentProps<string> = {
|
|
88
|
-
value: '',
|
|
89
|
-
onChange: () => {},
|
|
90
|
-
// The single metadata carrier (objectui#3233) — every host produces this
|
|
91
|
-
// one key: the form renderer (`renderFieldComponent`), the inline-edit
|
|
92
|
-
// hosts, and the registry adapter that maps `SchemaRenderer`'s SDUI node
|
|
93
|
-
// onto it.
|
|
94
|
-
field,
|
|
95
|
-
dataSource: {},
|
|
96
|
-
dependentValues: { country: 'cn' },
|
|
97
|
-
dependsOn: ['country'],
|
|
98
|
-
emptyHint: 'Select country first',
|
|
99
|
-
name: 'title',
|
|
100
|
-
// inline-edit hosts / line-item grid
|
|
101
|
-
compact: true,
|
|
102
|
-
autoFocus: true,
|
|
103
|
-
onSelectRecord: () => {},
|
|
104
|
-
onCreateNew: () => {},
|
|
105
|
-
// DOM / a11y
|
|
106
|
-
id: 'title-input',
|
|
107
|
-
'aria-label': 'Title',
|
|
108
|
-
'data-testid': 'field-title',
|
|
109
|
-
};
|
|
110
|
-
expect(passThrough.compact).toBe(true);
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
describe('closing the type kept the pass-through behaviour', () => {
|
|
115
|
-
it('forwards a11y and data attributes to the rendered input', () => {
|
|
116
|
-
render(
|
|
117
|
-
<TextField
|
|
118
|
-
value="hello"
|
|
119
|
-
onChange={() => {}}
|
|
120
|
-
field={field}
|
|
121
|
-
aria-label="Title"
|
|
122
|
-
data-testid="title-input"
|
|
123
|
-
/>,
|
|
124
|
-
);
|
|
125
|
-
const input = screen.getByTestId('title-input');
|
|
126
|
-
expect(input).toHaveAttribute('aria-label', 'Title');
|
|
127
|
-
expect(input).toHaveValue('hello');
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
it('forwards `disabled` — a declared key, not an index-signature accident', () => {
|
|
131
|
-
render(
|
|
132
|
-
<BooleanField
|
|
133
|
-
value={false}
|
|
134
|
-
onChange={() => {}}
|
|
135
|
-
field={{ name: 'active', label: 'Active', type: 'boolean' } as unknown as FieldMetadata}
|
|
136
|
-
disabled
|
|
137
|
-
data-testid="active-switch"
|
|
138
|
-
/>,
|
|
139
|
-
);
|
|
140
|
-
expect(screen.getByTestId('active-switch')).toBeDisabled();
|
|
141
|
-
});
|
|
142
|
-
});
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { coerceToSafeValue } from './index';
|
|
3
|
-
|
|
4
|
-
describe('coerceToSafeValue — reference / lookup values', () => {
|
|
5
|
-
it('extracts a label from a JSON-string reference (unresolved external-id ref)', () => {
|
|
6
|
-
// Regression: a master_detail/lookup value can arrive as a JSON-encoded
|
|
7
|
-
// string; it must render a label, not raw '{"externalId":"..."}'.
|
|
8
|
-
expect(coerceToSafeValue('{"externalId":"Website Relaunch"}')).toBe('Website Relaunch');
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
it('extracts a label from a reference object, name > label > externalId > id', () => {
|
|
12
|
-
expect(coerceToSafeValue({ externalId: 'X' })).toBe('X');
|
|
13
|
-
expect(coerceToSafeValue({ name: 'N', externalId: 'X' })).toBe('N');
|
|
14
|
-
expect(coerceToSafeValue({ label: 'L', externalId: 'X' })).toBe('L');
|
|
15
|
-
expect(coerceToSafeValue({ id: 'id1' })).toBe('id1');
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
it('handles a JSON-string array of references', () => {
|
|
19
|
-
expect(coerceToSafeValue('[{"name":"A"},{"externalId":"B"}]')).toBe('A, B');
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
it('leaves plain strings and non-JSON-looking strings untouched', () => {
|
|
23
|
-
expect(coerceToSafeValue('Website Relaunch')).toBe('Website Relaunch');
|
|
24
|
-
expect(coerceToSafeValue('{not valid json')).toBe('{not valid json');
|
|
25
|
-
expect(coerceToSafeValue('hello')).toBe('hello');
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
it('passes through primitives and null/undefined', () => {
|
|
29
|
-
expect(coerceToSafeValue(42)).toBe(42);
|
|
30
|
-
expect(coerceToSafeValue(true)).toBe(true);
|
|
31
|
-
expect(coerceToSafeValue(null)).toBe(null);
|
|
32
|
-
expect(coerceToSafeValue(undefined)).toBe(undefined);
|
|
33
|
-
});
|
|
34
|
-
});
|