@object-ui/fields 17.3.0 → 17.5.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.
Files changed (156) hide show
  1. package/CHANGELOG.md +941 -0
  2. package/README.md +1 -12
  3. package/dist/FieldEditWidget.d.ts +7 -1
  4. package/dist/currency.d.ts +46 -0
  5. package/dist/field-type-alias.d.ts +19 -1
  6. package/dist/index.cjs +4 -4
  7. package/dist/index.css +633 -0
  8. package/dist/index.d.ts +48 -12
  9. package/dist/index.js +5026 -4933
  10. package/dist/widgets/AddressField.d.ts +3 -11
  11. package/dist/widgets/FullscreenFieldEditor.d.ts +42 -152
  12. package/dist/widgets/GridField.d.ts +12 -2
  13. package/dist/widgets/OptionsEmptyState.d.ts +15 -1
  14. package/dist/widgets/RecordPickerDialog.d.ts +32 -6
  15. package/dist/widgets/SelectField.d.ts +25 -5
  16. package/dist/widgets/address-format.d.ts +68 -0
  17. package/dist/widgets/file-size-guard.d.ts +41 -0
  18. package/dist/widgets/nativeDateValue.d.ts +37 -0
  19. package/dist/widgets/toDomProps.d.ts +30 -10
  20. package/dist/widgets/toHostGroupProps.d.ts +91 -0
  21. package/dist/widgets/useRecordQuery.d.ts +7 -1
  22. package/package.json +17 -13
  23. package/src/FieldEditWidget.tsx +17 -1
  24. package/src/__tests__/AddressCellRenderer.test.tsx +166 -0
  25. package/src/__tests__/CurrencyField.minorUnits.test.tsx +191 -0
  26. package/src/__tests__/CurrencyField.symbol.test.tsx +198 -0
  27. package/src/__tests__/DateCellRenderer.test.tsx +9 -0
  28. package/src/__tests__/NumberCellRenderer.grouping.test.tsx +146 -0
  29. package/src/__tests__/PercentCellRenderer.locale.test.tsx +152 -0
  30. package/src/__tests__/PercentCellRenderer.test.tsx +115 -0
  31. package/src/__tests__/boolean-label-association-e2e.test.tsx +298 -0
  32. package/src/__tests__/capability-multiselect-retired.test.ts +109 -0
  33. package/src/__tests__/composite-group-label-e2e.test.tsx +436 -0
  34. package/src/__tests__/composite-group-label-readonly-e2e.test.tsx +403 -0
  35. package/src/__tests__/date-formatter-residue-4272.test.ts +120 -0
  36. package/src/__tests__/date-locale-channel.test.tsx +305 -0
  37. package/src/__tests__/formatCurrency.centsDigit.test.tsx +158 -0
  38. package/src/__tests__/formatCurrency.minorUnits.test.tsx +221 -0
  39. package/src/__tests__/group-labelling-declaration.test.ts +148 -0
  40. package/src/__tests__/lookupCellRecordLink.test.tsx +171 -0
  41. package/src/__tests__/percent-cell-vs-measure-4576.test.ts +115 -0
  42. package/src/__tests__/percent-formatter-locale-4553.test.ts +147 -0
  43. package/src/__tests__/percent-tie-halfup-4590.test.ts +224 -0
  44. package/src/__tests__/select-label-association-e2e.test.tsx +199 -0
  45. package/src/__tests__/widget-dom-leak-e2e.test.tsx +29 -270
  46. package/src/complex-widgets.test.tsx +22 -6
  47. package/src/currency.ts +130 -0
  48. package/src/datetime-widgets.test.tsx +94 -2
  49. package/src/field-type-alias.multiple.test.ts +81 -0
  50. package/src/field-type-alias.ts +58 -2
  51. package/src/index.css +44 -0
  52. package/src/index.tsx +489 -247
  53. package/src/standard-widgets.test.tsx +8 -1
  54. package/src/widgets/AddressField.postalCode.test.tsx +257 -0
  55. package/src/widgets/AddressField.tsx +79 -29
  56. package/src/widgets/AddressField.uniqueIds.test.tsx +2 -1
  57. package/src/widgets/BooleanField.tsx +41 -7
  58. package/src/widgets/CapabilityMultiSelectField.tsx +17 -5
  59. package/src/widgets/CheckboxesField.tsx +35 -2
  60. package/src/widgets/CurrencyField.tsx +55 -15
  61. package/src/widgets/DateField.tsx +11 -2
  62. package/src/widgets/DateTimeField.tsx +12 -3
  63. package/src/widgets/FileField.tsx +27 -9
  64. package/src/widgets/FormulaField.tsx +6 -1
  65. package/src/widgets/FullscreenFieldEditor.tsx +47 -258
  66. package/src/widgets/GeolocationField.tsx +29 -3
  67. package/src/widgets/GridField.test.tsx +226 -0
  68. package/src/widgets/GridField.tsx +114 -10
  69. package/src/widgets/ImageField.maxSize.test.tsx +154 -0
  70. package/src/widgets/ImageField.tsx +54 -4
  71. package/src/widgets/LookupField.hydration.test.tsx +1 -1
  72. package/src/widgets/LookupField.tsx +8 -4
  73. package/src/widgets/MultiSelectField.tsx +56 -2
  74. package/src/widgets/OptionsEmptyState.tsx +16 -0
  75. package/src/widgets/RadioField.tsx +35 -3
  76. package/src/widgets/RatingField.tsx +15 -2
  77. package/src/widgets/RecordPickerDialog.baseFilterShapes.test.tsx +191 -0
  78. package/src/widgets/RecordPickerDialog.dateLocale.test.tsx +124 -0
  79. package/src/widgets/RecordPickerDialog.tsx +64 -15
  80. package/src/widgets/RichTextField.tsx +1 -1
  81. package/src/widgets/SelectField.tsx +36 -5
  82. package/src/widgets/UserField.tsx +3 -2
  83. package/src/widgets/__tests__/FilterConditionField.operators.test.ts +25 -1
  84. package/src/widgets/address-format.ts +120 -0
  85. package/src/widgets/file-size-guard.ts +55 -0
  86. package/src/widgets/nativeDateValue.test.ts +115 -0
  87. package/src/widgets/nativeDateValue.ts +112 -0
  88. package/src/widgets/optionWidgets.gatedOptions.test.tsx +267 -0
  89. package/src/widgets/optionWidgets.unconfiguredOptions.test.tsx +150 -0
  90. package/src/widgets/toDomProps.ts +48 -19
  91. package/src/widgets/toHostGroupProps.ts +102 -0
  92. package/src/widgets/useFieldTranslation.ts +15 -33
  93. package/src/widgets/useRecordQuery.ts +30 -3
  94. package/dist/FieldEditWidget.test.d.ts +0 -8
  95. package/dist/__tests__/DateCellRenderer.test.d.ts +0 -0
  96. package/dist/__tests__/NumberCellRenderer.test.d.ts +0 -0
  97. package/dist/__tests__/cell-truncation.test.d.ts +0 -0
  98. package/dist/__tests__/field-carrier-sdui.test.d.ts +0 -0
  99. package/dist/__tests__/lookupCellDisplayField.test.d.ts +0 -0
  100. package/dist/__tests__/lookupCellDisplayName.test.d.ts +0 -0
  101. package/dist/__tests__/lookupCellReferenceKey.test.d.ts +0 -0
  102. package/dist/__tests__/registry-collision.test.d.ts +0 -0
  103. package/dist/__tests__/resolveFieldCurrency.test.d.ts +0 -1
  104. package/dist/__tests__/spec-symbol-batch7.test.d.ts +0 -8
  105. package/dist/__tests__/validation-feedback.test.d.ts +0 -0
  106. package/dist/__tests__/widget-aria-invalid-e2e.test.d.ts +0 -0
  107. package/dist/__tests__/widget-aria-invalid-registry-e2e.test.d.ts +0 -0
  108. package/dist/__tests__/widget-dom-leak-e2e.test.d.ts +0 -0
  109. package/dist/__tests__/widget-props-contract.test.d.ts +0 -8
  110. package/dist/coerce-safe-value.test.d.ts +0 -1
  111. package/dist/complex-widgets.test.d.ts +0 -1
  112. package/dist/datetime-widgets.test.d.ts +0 -1
  113. package/dist/field-type-coverage.test.d.ts +0 -1
  114. package/dist/standard-widgets.test.d.ts +0 -0
  115. package/dist/widgets/AddressField.uniqueIds.test.d.ts +0 -0
  116. package/dist/widgets/CapabilityMultiSelectField.test.d.ts +0 -0
  117. package/dist/widgets/CheckboxesField.cascade.test.d.ts +0 -0
  118. package/dist/widgets/GeolocationField.uniqueIds.test.d.ts +0 -0
  119. package/dist/widgets/GridField.test.d.ts +0 -1
  120. package/dist/widgets/ImageLightbox.test.d.ts +0 -1
  121. package/dist/widgets/LookupField.dependsOn.test.d.ts +0 -8
  122. package/dist/widgets/LookupField.gateHintLabel.test.d.ts +0 -8
  123. package/dist/widgets/LookupField.hydration.test.d.ts +0 -1
  124. package/dist/widgets/LookupField.idField.test.d.ts +0 -1
  125. package/dist/widgets/MultiSelectField.cascade.test.d.ts +0 -0
  126. package/dist/widgets/OptionsEmptyState.no-provider.test.d.ts +0 -0
  127. package/dist/widgets/OptionsEmptyState.test.d.ts +0 -0
  128. package/dist/widgets/PeoplePicker.test.d.ts +0 -8
  129. package/dist/widgets/PeoplePickerComponents.test.d.ts +0 -8
  130. package/dist/widgets/RadioField.cascade.test.d.ts +0 -0
  131. package/dist/widgets/RecipientPickerField.test.d.ts +0 -0
  132. package/dist/widgets/RecordPickerDialog.filterOptions.test.d.ts +0 -8
  133. package/dist/widgets/RecordPickerDialog.selectLabel.test.d.ts +0 -8
  134. package/dist/widgets/SelectField.cascade.test.d.ts +0 -0
  135. package/dist/widgets/TagsField.placeholder.no-provider.test.d.ts +0 -0
  136. package/dist/widgets/TagsField.placeholder.test.d.ts +0 -0
  137. package/dist/widgets/UserFieldPicker.test.d.ts +0 -8
  138. package/dist/widgets/__tests__/FilterConditionField.matchAll.test.d.ts +0 -8
  139. package/dist/widgets/__tests__/FilterConditionField.operators.test.d.ts +0 -8
  140. package/dist/widgets/__tests__/FullscreenFieldEditor.i18n.test.d.ts +0 -0
  141. package/dist/widgets/__tests__/FullscreenFieldEditor.no-provider.test.d.ts +0 -0
  142. package/dist/widgets/__tests__/RichTextField.fullscreenDisabled.test.d.ts +0 -0
  143. package/dist/widgets/__tests__/RichTextField.mobileFullscreen.test.d.ts +0 -0
  144. package/dist/widgets/__tests__/TextAreaField.characterCount.announcements.test.d.ts +0 -0
  145. package/dist/widgets/__tests__/TextAreaField.characterCount.i18n.test.d.ts +0 -0
  146. package/dist/widgets/__tests__/TextAreaField.characterCount.no-provider.test.d.ts +0 -0
  147. package/dist/widgets/__tests__/TextAreaField.fullscreenCharacterCount.i18n.test.d.ts +0 -0
  148. package/dist/widgets/__tests__/TextAreaField.fullscreenCharacterCount.test.d.ts +0 -0
  149. package/dist/widgets/__tests__/TextAreaField.fullscreenDisabled.test.d.ts +0 -0
  150. package/dist/widgets/__tests__/TextAreaField.mobileFullscreen.test.d.ts +0 -0
  151. package/dist/widgets/deriveLookupColumns.test.d.ts +0 -1
  152. package/dist/widgets/file-value.test.d.ts +0 -1
  153. package/dist/widgets/personDisplay.test.d.ts +0 -8
  154. package/dist/widgets/recentLookups.test.d.ts +0 -1
  155. package/dist/widgets/useRecordQuery.test.d.ts +0 -8
  156. package/dist/widgets/useUploadingSignal.test.d.ts +0 -1
package/dist/index.d.ts CHANGED
@@ -29,24 +29,36 @@ export interface CellRendererProps {
29
29
  */
30
30
  export declare function coerceToSafeValue(value: unknown): string | number | boolean | null | undefined;
31
31
  export { resolveFieldCurrency };
32
- export declare function formatCurrency(value: number, currency?: string): string;
32
+ export declare function formatCurrency(value: number, currency?: string, locale?: string): string;
33
33
  /**
34
34
  * Format currency value in compact form for mobile display.
35
35
  * E.g., $150,000 → $150K, $1,200,000 → $1.2M
36
36
  * When `currency` is undefined, returns a compact number without symbol.
37
37
  */
38
- export declare function formatCompactCurrency(value: number, currency?: string): string;
38
+ export declare function formatCompactCurrency(value: number, currency?: string, locale?: string): string;
39
39
  /**
40
40
  * Format a plain number with thousands separators, no currency symbol.
41
41
  * Used as a safe fallback when a currency-typed field has no `currency`
42
42
  * configured — we'd rather render `1,234.50` than silently assume USD.
43
43
  */
44
- export declare function formatNumber(value: number, decimals?: number): string;
44
+ export declare function formatNumber(value: number, decimals?: number, locale?: string): string;
45
45
  /**
46
- * Format percent value
46
+ * Format percent value.
47
47
  * Handles both decimal (0.8 = 80%) and whole number (80 = 80%) inputs.
48
+ *
49
+ * `locale` is the third positional parameter, matching {@link formatNumber} and
50
+ * {@link formatCurrency} — the shape the sibling formatters already use.
51
+ * Callers should pass the tag from `useDisplayLocale()`.
52
+ *
53
+ * Before objectui#4553 this function took no locale and never touched `Intl`:
54
+ * its whole body was `${percentDisplayValue(value).toFixed(precision)}%`, so it
55
+ * rendered in NO locale rather than the machine's — an ASCII decimal mark and
56
+ * never a grouping separator, byte-identical on every machine. That made
57
+ * `1235%` the output everywhere, which is wrong in en-US as well as in German,
58
+ * so the grouping and the locale are fixed together: en output MOVES from
59
+ * `1235%` to `1,235%` at four digits and up, and that move is the fix.
48
60
  */
49
- export declare function formatPercent(value: number, precision?: number): string;
61
+ export declare function formatPercent(value: number, precision?: number, locale?: string): string;
50
62
  /**
51
63
  * Humanize a snake_case or kebab-case string into Title Case.
52
64
  * Used as fallback label when no explicit option.label exists.
@@ -81,9 +93,17 @@ export declare function formatRelativeDate(value: string | Date | number, option
81
93
  */
82
94
  export declare function formatDate(value: string | Date | number, style?: string, options?: DateDisplayOptions): string;
83
95
  /**
84
- * Format datetime value
96
+ * Format datetime value.
97
+ *
98
+ * `options` mirrors {@link formatDate}'s and is optional, so an existing
99
+ * caller that passes nothing keeps the exact runtime-default behavior it had.
100
+ * Before objectui#4272 the parameter did not exist at all, which meant no
101
+ * caller could localize this function however hard it tried — it always handed
102
+ * `Intl` an `undefined` tag, i.e. the MACHINE's locale, which is neither of
103
+ * the repo's two locale channels. Callers should pass the tag from
104
+ * `useDisplayLocale()`.
85
105
  */
86
- export declare function formatDateTime(value: string | Date | number): string;
106
+ export declare function formatDateTime(value: string | Date | number, options?: DateDisplayOptions): string;
87
107
  /**
88
108
  * Text field cell renderer
89
109
  */
@@ -240,6 +260,26 @@ export declare function HtmlCellRenderer({ value }: CellRendererProps): React.Re
240
260
  * or a `[lat, lng]` array. Falls back to compact JSON for anything else.
241
261
  */
242
262
  export declare function LocationCellRenderer({ value }: CellRendererProps): React.ReactElement;
263
+ /**
264
+ * Renders an `address` value as a formatted single-line postal address instead
265
+ * of stringified JSON (objectui#4037).
266
+ *
267
+ * The detail page's display registry mapped `address` to {@link JsonCellRenderer},
268
+ * so a populated address read as `{"street":"中策路 1 号","city":"杭州",…}` on the
269
+ * detail page and in its inline-edit read state — while the very same value
270
+ * rendered correctly in the create/edit dialog, whose input registry has always
271
+ * carried `address`. Read side only: nothing about the input widget changes.
272
+ *
273
+ * Layout is not invented here. It is {@link formatAddress} — the rule
274
+ * `AddressField`'s own readonly branch already applied, over the sub-field set
275
+ * its inputs expose — so a readonly form and a detail page cannot spell one
276
+ * stored address two ways.
277
+ *
278
+ * Anything `formatAddress` cannot recognize falls back to compact JSON rather
279
+ * than rendering blank: an unknown shape stays visible (today's behaviour) and
280
+ * is never silently swallowed by the fix.
281
+ */
282
+ export declare function AddressCellRenderer({ value }: CellRendererProps): React.ReactElement;
243
283
  /**
244
284
  * Get the appropriate cell renderer for a field type
245
285
  */
@@ -304,11 +344,6 @@ export declare function registerField(fieldType: string): void;
304
344
  * registerAllFields();
305
345
  */
306
346
  export declare function registerAllFields(): void;
307
- /**
308
- * Legacy function - kept for backward compatibility
309
- * @deprecated Use registerAllFields() instead
310
- */
311
- export declare function registerFields(): void;
312
347
  export * from './widgets/types';
313
348
  export * from './widgets/file-value';
314
349
  export * from './FieldEditWidget';
@@ -363,3 +398,4 @@ export * from './widgets/TagsField';
363
398
  export { withFieldCarrier } from './withFieldCarrier';
364
399
  export { toDomProps } from './widgets/toDomProps';
365
400
  export type { DomProps } from './widgets/toDomProps';
401
+ export { toDateInputValue, toDateTimeInputValue, fromDateTimeInputValue, } from './widgets/nativeDateValue';