@object-ui/plugin-form 17.5.0 → 17.7.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 (78) hide show
  1. package/CHANGELOG.md +4841 -0
  2. package/README.md +772 -77
  3. package/dist/DrawerForm.d.ts +30 -2
  4. package/dist/DrawerForm.d.ts.map +1 -1
  5. package/dist/EmbeddableForm.d.ts.map +1 -1
  6. package/dist/FormAnalytics.d.ts.map +1 -1
  7. package/dist/LineItemsPanel.d.ts +6 -3
  8. package/dist/LineItemsPanel.d.ts.map +1 -1
  9. package/dist/MasterDetailForm.d.ts +31 -10
  10. package/dist/MasterDetailForm.d.ts.map +1 -1
  11. package/dist/ModalForm.d.ts +48 -4
  12. package/dist/ModalForm.d.ts.map +1 -1
  13. package/dist/ObjectForm.d.ts +18 -2
  14. package/dist/ObjectForm.d.ts.map +1 -1
  15. package/dist/SplitForm.d.ts +37 -2
  16. package/dist/SplitForm.d.ts.map +1 -1
  17. package/dist/TabbedForm.d.ts +65 -3
  18. package/dist/TabbedForm.d.ts.map +1 -1
  19. package/dist/WizardForm.d.ts +149 -11
  20. package/dist/WizardForm.d.ts.map +1 -1
  21. package/dist/autoLayout.d.ts +12 -3
  22. package/dist/autoLayout.d.ts.map +1 -1
  23. package/dist/closedAffordanceNotice.d.ts +14 -0
  24. package/dist/closedAffordanceNotice.d.ts.map +1 -0
  25. package/dist/customFieldsMerge.d.ts +29 -0
  26. package/dist/customFieldsMerge.d.ts.map +1 -0
  27. package/dist/deriveMasterDetail.d.ts +33 -9
  28. package/dist/deriveMasterDetail.d.ts.map +1 -1
  29. package/dist/fieldGroups.d.ts +176 -0
  30. package/dist/fieldGroups.d.ts.map +1 -1
  31. package/dist/fieldWriteGate.d.ts +116 -0
  32. package/dist/fieldWriteGate.d.ts.map +1 -0
  33. package/dist/flatFields.d.ts +30 -0
  34. package/dist/flatFields.d.ts.map +1 -0
  35. package/dist/formChrome.d.ts +55 -0
  36. package/dist/formChrome.d.ts.map +1 -0
  37. package/dist/index.d.ts +131 -25
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +3676 -1967
  40. package/dist/index.umd.cjs +1 -1
  41. package/dist/initialRecord.d.ts +72 -0
  42. package/dist/initialRecord.d.ts.map +1 -0
  43. package/dist/loadFailure.d.ts +28 -0
  44. package/dist/loadFailure.d.ts.map +1 -0
  45. package/dist/masterDetailTx.d.ts.map +1 -1
  46. package/dist/occSave.d.ts +6 -1
  47. package/dist/occSave.d.ts.map +1 -1
  48. package/dist/recordInvalidation.d.ts +33 -0
  49. package/dist/recordInvalidation.d.ts.map +1 -0
  50. package/dist/recordReadGate.d.ts +34 -0
  51. package/dist/recordReadGate.d.ts.map +1 -0
  52. package/dist/sanitize.d.ts +187 -5
  53. package/dist/sanitize.d.ts.map +1 -1
  54. package/dist/schemaDefaults.d.ts +51 -30
  55. package/dist/schemaDefaults.d.ts.map +1 -1
  56. package/dist/sectionFields.d.ts +65 -2
  57. package/dist/sectionFields.d.ts.map +1 -1
  58. package/dist/sectionGroups.d.ts +62 -0
  59. package/dist/sectionGroups.d.ts.map +1 -0
  60. package/dist/sectionPredicateDiagnostic.d.ts +38 -0
  61. package/dist/sectionPredicateDiagnostic.d.ts.map +1 -0
  62. package/dist/submitRedirect.d.ts +148 -0
  63. package/dist/submitRedirect.d.ts.map +1 -0
  64. package/dist/submitRedirectNavigation.d.ts +82 -0
  65. package/dist/submitRedirectNavigation.d.ts.map +1 -0
  66. package/dist/submitTarget.d.ts +119 -0
  67. package/dist/submitTarget.d.ts.map +1 -0
  68. package/dist/successBehavior.d.ts +44 -8
  69. package/dist/successBehavior.d.ts.map +1 -1
  70. package/dist/thankYouRedirectCountdown.d.ts +17 -0
  71. package/dist/thankYouRedirectCountdown.d.ts.map +1 -0
  72. package/dist/thankYouRedirectNavigation.d.ts +111 -0
  73. package/dist/thankYouRedirectNavigation.d.ts.map +1 -0
  74. package/dist/uploadGate.d.ts +35 -0
  75. package/dist/uploadGate.d.ts.map +1 -0
  76. package/dist/writePayload.d.ts +68 -0
  77. package/dist/writePayload.d.ts.map +1 -0
  78. package/package.json +13 -12
@@ -0,0 +1,116 @@
1
+ import { SchemaLike } from '@object-ui/core';
2
+ /**
3
+ * The permission surface this module consumes — structurally the subset of
4
+ * `usePermissions()` that answers the write question. Declared structurally so
5
+ * `@object-ui/plugin-form` binds to the two members it actually reads rather
6
+ * than to the whole context type.
7
+ */
8
+ export interface FieldWritePrincipal {
9
+ isLoaded: boolean;
10
+ checkField: (object: string, field: string, action: 'read' | 'write') => boolean;
11
+ }
12
+ /** A field-name predicate: `true` when the caller may write that field. */
13
+ export type FieldWriteGate = (fieldName: string) => boolean;
14
+ /**
15
+ * Build the outbound write gate for one object, or `undefined` when there is
16
+ * no resolved principal to ask.
17
+ *
18
+ * `undefined` rather than an always-true function on purpose: the callers hand
19
+ * this straight to `sanitizeFormData`, whose option is absent-or-predicate, so
20
+ * an unresolved principal produces the byte-identical payload it produced
21
+ * before this gate existed.
22
+ */
23
+ export declare function fieldWriteGate(perms: FieldWritePrincipal | null | undefined, objectName: string): FieldWriteGate | undefined;
24
+ export interface ApplyFieldPermissionsOptions {
25
+ perms: FieldWritePrincipal | null | undefined;
26
+ objectName: string;
27
+ /** A `view`-mode form renders everything read-only already. */
28
+ mode?: string;
29
+ /**
30
+ * Optional hint placed on a field the caller may read but not edit, used
31
+ * only when the field declares no description of its own. `ObjectForm`'s
32
+ * simple variant is the one container that shows it.
33
+ */
34
+ deniedDescription?: string;
35
+ }
36
+ /**
37
+ * The render half for a FORM: drop what the caller may not READ, and mark what
38
+ * they may read but not WRITE as non-editable.
39
+ */
40
+ export declare function applyFieldPermissions<T extends Record<string, any>>(fields: T[] | undefined, { perms, objectName, mode, deniedDescription }: ApplyFieldPermissionsOptions): T[] | undefined;
41
+ /**
42
+ * The principal surface {@link gateFormFields} reads: the field-level resolver
43
+ * plus the server's effective API operation set for an object (`/me/permissions`
44
+ * `apiOperations`, objectstack#3391). `undefined` from it means "no effective set", which
45
+ * leaves the object's own affordance standing.
46
+ */
47
+ export interface FormFieldPrincipal extends FieldWritePrincipal {
48
+ getObjectApiOperations?: (object: string) => readonly string[] | undefined;
49
+ }
50
+ export interface GateFormFieldsOptions extends ApplyFieldPermissionsOptions {
51
+ perms: FormFieldPrincipal | null | undefined;
52
+ /**
53
+ * The object schema the form resolved (its `managedBy` bucket and
54
+ * `userActions` opt-ins). `null` while it has not loaded, or when the form
55
+ * has no metadata source, reads as the default bucket.
56
+ */
57
+ objectSchema: SchemaLike | null | undefined;
58
+ }
59
+ /** The form-level affordance {@link closedFormAffordance} can report closed. */
60
+ export type ClosedFormAffordance = 'create' | 'edit';
61
+ /**
62
+ * Which affordance the managed-object lock found CLOSED for this form, or
63
+ * `undefined` when the lock does not engage (objectui#11000).
64
+ *
65
+ * It is {@link managedModeLocked}, the very predicate {@link gateFormFields}
66
+ * disables every drawn field on, read for its reason: `create` for a create
67
+ * form, `edit` for an edit form. The locked form's notice
68
+ * (`ClosedAffordanceNotice`) and the wizard's navigation gate read THIS, not a
69
+ * verdict of their own, so a form cannot explain a lock it did not draw, nor
70
+ * draw one it does not explain.
71
+ *
72
+ * A per-field lock never answers here: a field the caller may read but not
73
+ * edit ({@link applyFieldPermissions}) or a field declared `readonly` locks
74
+ * that one field while the form's affordance stays open.
75
+ */
76
+ export declare function closedFormAffordance({ perms, objectName, mode, objectSchema, }: Pick<GateFormFieldsOptions, 'perms' | 'objectName' | 'mode' | 'objectSchema'>): ClosedFormAffordance | undefined;
77
+ /**
78
+ * The ONE field-gate step every `ObjectForm` layout draws its RESOLVED fields
79
+ * through (objectui#10612): the default arm (flat and sectioned), `DrawerForm`
80
+ * and `ModalForm` (sections, derived field groups and flat), and `TabbedForm`,
81
+ * `SplitForm` and `WizardForm` (sections).
82
+ *
83
+ * Two gates, in one pass, so no layout can apply one and skip the other:
84
+ *
85
+ * 1. field-level security — {@link applyFieldPermissions}: drop what the
86
+ * caller may not READ, lock what they may read but not WRITE;
87
+ * 2. the managed-object lock — every drawn field is `disabled` when
88
+ * {@link managedModeLocked} says the mode's affordance is closed. Only
89
+ * `disabled`, not `readOnly`: the default arm's lock always drew a
90
+ * disabled input, and the submit button is left as it is.
91
+ *
92
+ * Before this step the lock was stamped by the default arm's field generator
93
+ * alone, so the drawer, modal, tabbed, split and wizard layouts drew live
94
+ * inputs on a managed object whose write the server refuses (objectui#10613,
95
+ * folded into objectui#10612). It runs on the resolved list rather than in a
96
+ * generator, so every drawn field is locked — an inline `customFields` member
97
+ * and an already-built section entry as much as a field generated from the
98
+ * object — which is what "blanket" says.
99
+ *
100
+ * Entries with no `name` pass through untouched, as in the render pass.
101
+ */
102
+ export declare function gateFormFields<T extends Record<string, any>>(fields: T[] | undefined, { objectSchema, ...options }: GateFormFieldsOptions): T[] | undefined;
103
+ /**
104
+ * The render half for a line-items GRID: the same pass over its columns — drop
105
+ * what the caller may not READ, and lock the cells of what they may read but
106
+ * not WRITE (objectui#10163).
107
+ *
108
+ * ⛔ Not a second gate: the verdict is {@link gateByPermission}'s, the same one
109
+ * the three form containers render through, so the grid and the form above it
110
+ * cannot disagree about which field is refused. A column that is refused
111
+ * replaces any `readonlyWhen` it declared — a lock on every row already covers
112
+ * every row a narrower lock would. Rows are untouched: whether a line may be
113
+ * added or removed stays the container's own answer.
114
+ */
115
+ export declare function applyColumnPermissions<T extends Record<string, any>>(columns: T[] | undefined, { perms, objectName }: Pick<ApplyFieldPermissionsOptions, 'perms' | 'objectName'>): T[] | undefined;
116
+ //# sourceMappingURL=fieldWriteGate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fieldWriteGate.d.ts","sourceRoot":"","sources":["../src/fieldWriteGate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAEH,OAAO,EAAmC,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnF;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,KAAK,OAAO,CAAC;CAClF;AAED,2EAA2E;AAC3E,MAAM,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;AAE5D;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,EAC7C,UAAU,EAAE,MAAM,GACjB,cAAc,GAAG,SAAS,CAG5B;AAED,MAAM,WAAW,4BAA4B;IAC3C,KAAK,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,CAAC;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAqCD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjE,MAAM,EAAE,CAAC,EAAE,GAAG,SAAS,EACvB,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,4BAA4B,GAC3E,CAAC,EAAE,GAAG,SAAS,CAMjB;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAmB,SAAQ,mBAAmB;IAC7D,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CAC5E;AAED,MAAM,WAAW,qBAAsB,SAAQ,4BAA4B;IACzE,KAAK,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,CAAC;IAC7C;;;;OAIG;IACH,YAAY,EAAE,UAAU,GAAG,IAAI,GAAG,SAAS,CAAC;CAC7C;AAoCD,gFAAgF;AAChF,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,MAAM,CAAC;AAErD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,EACL,UAAU,EACV,IAAI,EACJ,YAAY,GACb,EAAE,IAAI,CAAC,qBAAqB,EAAE,OAAO,GAAG,YAAY,GAAG,MAAM,GAAG,cAAc,CAAC,GAC5E,oBAAoB,GACpB,SAAS,CAGZ;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1D,MAAM,EAAE,CAAC,EAAE,GAAG,SAAS,EACvB,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE,EAAE,qBAAqB,GAClD,CAAC,EAAE,GAAG,SAAS,CAOjB;AAcD;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAClE,OAAO,EAAE,CAAC,EAAE,GAAG,SAAS,EACxB,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,IAAI,CAAC,4BAA4B,EAAE,OAAO,GAAG,YAAY,CAAC,GAChF,CAAC,EAAE,GAAG,SAAS,CAKjB"}
@@ -0,0 +1,30 @@
1
+ import { FormField } from '@object-ui/types';
2
+ import { SectionFieldsContext } from './sectionFields.js';
3
+ export interface FlatFieldsContext extends SectionFieldsContext {
4
+ /**
5
+ * The caller's explicit field whitelist, in render order. Entries are field
6
+ * names or objects carrying one (`{ name }`). Omitted → every field the
7
+ * object schema declares, in schema order.
8
+ */
9
+ fields?: Array<string | Record<string, any>>;
10
+ /**
11
+ * The authored inline members (`schema.customFields`), MERGED over the
12
+ * generated set exactly as `ObjectForm` merges them — override by name in
13
+ * place, keep the rest, append the unmatched in authored order
14
+ * (objectui#10073; the rule lives in `customFieldsMerge.ts`).
15
+ */
16
+ customFields?: FormField[];
17
+ }
18
+ /**
19
+ * Build the runtime `FormField` list for a container rendering an object's
20
+ * fields flat (no sections).
21
+ *
22
+ * Fields the object schema does not declare are SKIPPED — the flat containers
23
+ * have always dropped them rather than rendering `fromObjectSchema`'s bare
24
+ * `input` stub, and a whitelist naming a field the object does not have is an
25
+ * authoring error the form should not paper over with an untyped control. A
26
+ * `customFields` member naming such a field is drawn in its place: the member
27
+ * is a whole definition, not an untyped stub.
28
+ */
29
+ export declare function buildFlatFields(ctx: FlatFieldsContext): FormField[];
30
+ //# sourceMappingURL=flatFields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flatFields.d.ts","sourceRoot":"","sources":["../src/flatFields.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAiD,KAAK,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAG3G,MAAM,WAAW,iBAAkB,SAAQ,oBAAoB;IAC7D;;;;OAIG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7C;;;;;OAKG;IACH,YAAY,CAAC,EAAE,SAAS,EAAE,CAAC;CAC5B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,iBAAiB,GAAG,SAAS,EAAE,CA8BnE"}
@@ -0,0 +1,55 @@
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
+ * What the submitter is told when a DECLARED `navigateOnSuccess` produced no
10
+ * destination — objectui#5034 point 2.
11
+ *
12
+ * The write succeeded, so this rides on the success toast as a note rather than
13
+ * becoming an error or a blocking panel: turning a successful write into an
14
+ * error state would be a worse lie than the silence it replaces. What was
15
+ * missing is one fact, and only one: the navigation the author declared did not
16
+ * happen. Before this, the toast was byte-identical to the toast a form with no
17
+ * `navigateOnSuccess` at all produces, so an author who mistyped the destination
18
+ * — or whose record carried no usable id — saw a form that looked entirely
19
+ * healthy and had silently stopped honouring a key they wrote.
20
+ *
21
+ * Maintainer ruling, 2026-08-17: "A refused declared navigation is surfaced: the
22
+ * success toast carries a note that the declared navigation was not performed —
23
+ * never indistinguishable from the no-key case."
24
+ *
25
+ * The note names no REASON on purpose. `resolveSuccessNavigate` answers null for
26
+ * two different causes (no usable id on the written record; a destination the
27
+ * same-origin guard refused) and returns no discriminant, so a reason in this
28
+ * copy could only be re-derived by reimplementing that helper's internals at the
29
+ * call site — where it would drift from the helper, and would additionally bake
30
+ * an acceptance rule into user-visible prose, which objectui#5034 has since
31
+ * narrowed once already. The diagnosable detail — the template the author
32
+ * actually wrote — goes to `console.warn` at each call site instead.
33
+ *
34
+ * The submitter sees it (it is the toast's description), so it is pack key
35
+ * `form.navigateRefused` and each form renders `t('form.navigateRefused')`
36
+ * (objectui#11039). This constant is that key's English default, read from the
37
+ * table above so there is one spelling of it; `WizardForm` re-exports it,
38
+ * because that is where it used to live and where its tests import it from.
39
+ * Single-sourced so a wizard and a flat form cannot tell a submitter two
40
+ * different things about one refusal; a test pins that they do not.
41
+ */
42
+ export declare const NAVIGATE_ON_SUCCESS_REFUSED_NOTE: string;
43
+ /**
44
+ * The form family's feedback chrome. Falls back to the English table above
45
+ * when no i18n provider is mounted, or when the mounted catalogue predates
46
+ * these keys (`form.errorLoading` is the probe).
47
+ */
48
+ export declare const useFormChromeTranslation: () => {
49
+ t: (key: string, options?: Record<string, unknown>) => string;
50
+ language: string;
51
+ } | {
52
+ t: import('i18next').TFunction<string, undefined>;
53
+ language: string;
54
+ };
55
+ //# sourceMappingURL=formChrome.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formChrome.d.ts","sourceRoot":"","sources":["../src/formChrome.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA6EH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,gCAAgC,QAA+C,CAAC;AAE7F;;;;GAIG;AACH,eAAO,MAAM,wBAAwB;4BAvHpC,CAAC;;;;;CA0HD,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,27 +1,133 @@
1
- import { ObjectForm } from './ObjectForm';
1
+ import { ObjectForm } from './ObjectForm.js';
2
2
  export { ObjectForm };
3
- export type { ObjectFormProps } from './ObjectForm';
4
- export { FormSectionContainer } from './FormSection';
5
- export type { FormSectionContainerProps } from './FormSection';
6
- export { applyAutoLayout, inferColumns, inferModalSize, isWideFieldType, isAutoGeneratedFieldType, applyAutoColSpan, containerGridColsFor, filterCreateModeFields, filterSystemFields, filterAutoGeneratedFields, } from './autoLayout';
7
- export { TabbedForm } from './TabbedForm';
8
- export type { TabbedFormProps, TabbedFormSchema, FormSectionConfig } from './TabbedForm';
9
- export { WizardForm } from './WizardForm';
10
- export type { WizardFormProps, WizardFormSchema } from './WizardForm';
11
- export { SplitForm } from './SplitForm';
12
- export type { SplitFormProps, SplitFormSchema } from './SplitForm';
13
- export { DrawerForm } from './DrawerForm';
14
- export type { DrawerFormProps, DrawerFormSchema } from './DrawerForm';
15
- export { ModalForm } from './ModalForm';
16
- export type { ModalFormProps, ModalFormSchema } from './ModalForm';
17
- export { EmbeddableForm } from './EmbeddableForm';
18
- export type { EmbeddableFormProps, EmbeddableFormConfig, EmbeddableFormTexts } from './EmbeddableForm';
19
- export { FormAnalytics } from './FormAnalytics';
20
- export type { FormAnalyticsProps, FormSubmissionMetric } from './FormAnalytics';
21
- export { MasterDetailForm } from './MasterDetailForm';
22
- export type { MasterDetailFormProps, MasterDetailFormSchema, MasterDetailDetailConfig, } from './MasterDetailForm';
23
- export { LineItemsPanel } from './LineItemsPanel';
24
- export type { LineItemsPanelSchema } from './LineItemsPanel';
25
- export { deriveDetail, deriveColumns, deriveFormFields, findRelationshipField, resolveInlineMode } from './deriveMasterDetail';
26
- export type { DerivedDetail, InlineMode } from './deriveMasterDetail';
3
+ export type { ObjectFormComponentProps } from './ObjectForm.js';
4
+ /**
5
+ * @deprecated Use `ObjectFormComponentProps`. Renamed in objectui#4650 because
6
+ * `@objectstack/spec/ui` owns `ObjectFormProps` from 17.0.0, where it means the
7
+ * AUTHORED props document of the `object-form` element — not this component's
8
+ * props. The alias denotes the SAME type and is kept only so existing importers
9
+ * keep compiling.
10
+ */
11
+ export type { ObjectFormComponentProps as ObjectFormProps } from './ObjectForm.js';
12
+ export { FormSectionContainer } from './FormSection.js';
13
+ export type { FormSectionContainerProps } from './FormSection.js';
14
+ export { applyAutoLayout, inferColumns, inferModalSize, isWideFieldType, isAutoGeneratedFieldType, applyAutoColSpan, containerGridColsFor, filterCreateModeFields, filterSystemFields, filterAutoGeneratedFields, } from './autoLayout.js';
15
+ export { TabbedForm } from './TabbedForm.js';
16
+ export type { TabbedFormProps, TabbedFormSchema, FormSectionConfig } from './TabbedForm.js';
17
+ export { WizardForm } from './WizardForm.js';
18
+ export type { WizardFormProps, WizardFormSchema, WizardStepConfig } from './WizardForm.js';
19
+ export { SplitForm } from './SplitForm.js';
20
+ export type { SplitFormProps, SplitFormSchema } from './SplitForm.js';
21
+ export { DrawerForm } from './DrawerForm.js';
22
+ export type { DrawerFormProps, DrawerFormSchema } from './DrawerForm.js';
23
+ export { ModalForm } from './ModalForm.js';
24
+ export type { ModalFormProps, ModalFormSchema } from './ModalForm.js';
25
+ export { EmbeddableForm } from './EmbeddableForm.js';
26
+ export type { EmbeddableFormProps, EmbeddableFormConfig, EmbeddableFormTexts } from './EmbeddableForm.js';
27
+ export { FormAnalytics } from './FormAnalytics.js';
28
+ export type { FormAnalyticsProps, FormSubmissionMetric } from './FormAnalytics.js';
29
+ export { MasterDetailForm } from './MasterDetailForm.js';
30
+ export type { MasterDetailFormProps, MasterDetailFormSchema, MasterDetailDetailConfig, } from './MasterDetailForm.js';
31
+ export { LineItemsPanel } from './LineItemsPanel.js';
32
+ export type { LineItemsPanelSchema } from './LineItemsPanel.js';
33
+ export { deriveDetail, deriveColumns, deriveFormFields, findRelationshipField, resolveInlineMode } from './deriveMasterDetail.js';
34
+ export type { DerivedDetail, InlineMode, ChildObjectSchemaLike } from './deriveMasterDetail.js';
35
+ /**
36
+ * The CREATE-payload rule this package owns, published for the OTHER form
37
+ * renderer (objectui#6059).
38
+ *
39
+ * `omitServerResolvedDefaults` is a pure function over a values object and an
40
+ * object schema — no React, no registry, no container — and it is the
41
+ * COMPOSITION of two `@object-ui/core` predicates (`isRuntimeDefault` AND
42
+ * `isMissingForRequired`, on create only) rather than a third opinion about
43
+ * either. It stayed module-private through the whole #4047 / #4068 / #4069 /
44
+ * #4085 / #5683 / #5727 / #5883 chain, so the console's `FormPage` — the SECOND
45
+ * form renderer in this repo — had to spell that composition out by hand for
46
+ * #5883, and the next renderer would have had to as well. Neither PREDICATE was
47
+ * ever copied (both live in `@object-ui/core` precisely so they cannot fork),
48
+ * but two hand-written copies of the composition are still free to disagree
49
+ * about a case neither author had in mind. One importable function is not.
50
+ *
51
+ * `isRequiredInForm` travels with it because each one's docblock names the
52
+ * other as its half: excusing a server-owned field from `required` and then
53
+ * submitting the key anyway is not half a fix, it is no fix. A consumer able to
54
+ * reach one and not the other can build exactly that state, which is the defect
55
+ * #4069 and #5883 closed on the two chains separately.
56
+ *
57
+ * Deliberately NOT the rest of `schemaDefaults.ts`. `seedCreateValues`,
58
+ * `schemaDefaultValues`, `isSeedableDefault`, `isCreateFormMode` and
59
+ * `SeedContext` are adjacent, not asked for — no consumer outside this package
60
+ * has needed them, and every added name is published surface somebody then has
61
+ * to keep. `isRuntimeDefault` stays out for a stronger reason: it is
62
+ * `@object-ui/core`'s to publish, this module only re-exports it for its own
63
+ * call sites, and a second published spelling of one classifier is the very
64
+ * thing #4085 collapsed.
65
+ */
66
+ export { omitServerResolvedDefaults, isRequiredInForm } from './schemaDefaults.js';
67
+ /**
68
+ * The `form.sections[].group` RESOLVER, published for the third form-section
69
+ * consumer (objectui#8641).
70
+ *
71
+ * `resolveSectionGroupReferences` replaces every `{ group: 'x' }` section with
72
+ * the section that group declares, and returns its input UNCHANGED — the same
73
+ * array reference — when no section uses the reference form. It is a pure
74
+ * function over plain data: no React, no registry, no container.
75
+ *
76
+ * ## Why it is published rather than copied
77
+ *
78
+ * `apps/console`'s `FormPage` has its OWN section builder (`buildSections`),
79
+ * on none of this package's code path, and it read `sec.fields ?? []` — so a
80
+ * spec-legal `{ group }` section produced a section with no label and no
81
+ * fields, measured in the DOM as an empty bordered card with zero inputs on
82
+ * both the internal `/forms/:name` and public `/f/:slug` routes. That is the
83
+ * silent-drop class objectui#7051 closed HERE, arriving at a renderer #7051's
84
+ * fix could not reach.
85
+ *
86
+ * The standing constraint of objectui#7051 / objectstack#13855 is that no
87
+ * assembly rule may be re-implemented on the objectui side — not declared
88
+ * order, not the empty-group drop, not the ungrouped trailing bucket, not the
89
+ * collapse / `visibleWhen` passthrough. Every one of those comes from
90
+ * `deriveFieldGroupLayout` (ADR-0085 §5) through this package's ONE adapter,
91
+ * `deriveFieldGroupSections`, which this resolver calls. A consumer that
92
+ * reached for `deriveFieldGroupLayout` directly would have to re-spell the
93
+ * `collapse` enum -> `{ collapsible, collapsed }` mapping and the `visibleWhen`
94
+ * passthrough to land on a section shape, which is that constraint's exact
95
+ * prohibition. So the importable resolver is the only arm that keeps one
96
+ * assembler and one behaviour for all three consumers.
97
+ *
98
+ * This is the same surface decision as objectui#6059's create-payload pair,
99
+ * for the same file, and it is deliberately as small: the resolver and the
100
+ * options type its signature requires (objectui#7324's rule — a consumer must
101
+ * be able to NAME what it passes; a type adds no runtime surface).
102
+ * `hasSectionGroupReference` stays module-private because the resolver already
103
+ * answers it by returning its input unchanged, and `resetSectionGroupReports`
104
+ * stays private because it is this package's own test seam.
105
+ */
106
+ export { resolveSectionGroupReferences } from './sectionGroups.js';
107
+ export type { ResolveSectionGroupsOptions } from './sectionGroups.js';
108
+ /**
109
+ * The parameter types those published signatures require, so a consumer can
110
+ * NAME what it must pass (objectui#7324).
111
+ *
112
+ * Both were unnameable: `ChildObjectSchemaLike` is the `childSchema` of the
113
+ * five derive functions exported above, and `FieldDefaultsSchemaLike` is the
114
+ * `objectSchema` of `omitServerResolvedDefaults`. Neither reached this barrel,
115
+ * so a host held them in a variable it could not annotate and wrote the shape
116
+ * out by hand instead — a producer-owned shape copied into every consumer,
117
+ * which is what `declared = enforced` exists to prevent.
118
+ *
119
+ * Two names, not one. They arrived carrying the SAME name (`ObjectSchemaLike`)
120
+ * in two files, and they are not the same type: measured with `tsc`, the
121
+ * defaults one is a strict subtype of the child one, and the compiler calls
122
+ * them mutually assignable ONLY because the child one's field values are
123
+ * `any` — swap that single `any` for `unknown` and the child -> defaults
124
+ * direction fails (TS2322). Lifting either under the shared name would have
125
+ * put a name on this package's public surface that already meant something
126
+ * else two files over, with nothing in the name to say which.
127
+ *
128
+ * These are types, not values: they add no runtime surface, and each is the
129
+ * type a signature already published requires — not an adjacent name lifted
130
+ * because it was nearby.
131
+ */
132
+ export type { FieldDefaultsSchemaLike } from './schemaDefaults.js';
27
133
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,CAAC;AACtB,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,YAAY,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EACL,eAAe,EACf,YAAY,EACZ,cAAc,EACd,eAAe,EACf,wBAAwB,EACxB,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACzF,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvG,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EACV,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC/H,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,CAAC;AACtB,YAAY,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAE7D;;;;;;GAMG;AACH,YAAY,EAAE,wBAAwB,IAAI,eAAe,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,YAAY,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EACL,eAAe,EACf,YAAY,EACZ,cAAc,EACd,eAAe,EACf,wBAAwB,EACxB,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACzF,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvG,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EACV,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC/H,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,OAAO,EAAE,6BAA6B,EAAE,MAAM,iBAAiB,CAAC;AAChE,YAAY,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAEnE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,YAAY,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC"}