@object-ui/plugin-detail 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.
Files changed (35) hide show
  1. package/CHANGELOG.md +1115 -0
  2. package/README.md +61 -17
  3. package/dist/DetailSection.d.ts.map +1 -1
  4. package/dist/DetailView.d.ts.map +1 -1
  5. package/dist/HeaderHighlight.d.ts.map +1 -1
  6. package/dist/HistoryTimeline.d.ts.map +1 -1
  7. package/dist/InlineFieldInput.d.ts +78 -5
  8. package/dist/InlineFieldInput.d.ts.map +1 -1
  9. package/dist/RelatedList.d.ts +42 -1
  10. package/dist/RelatedList.d.ts.map +1 -1
  11. package/dist/autoLayout.d.ts.map +1 -1
  12. package/dist/fieldEnrichment.d.ts +61 -0
  13. package/dist/fieldEnrichment.d.ts.map +1 -1
  14. package/dist/index.d.ts +88 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +2676 -2503
  17. package/dist/index.umd.cjs +3 -3
  18. package/dist/renderers/record-alert.d.ts +61 -11
  19. package/dist/renderers/record-alert.d.ts.map +1 -1
  20. package/dist/renderers/record-details.d.ts.map +1 -1
  21. package/dist/renderers/record-path.d.ts.map +1 -1
  22. package/dist/renderers/record-quick-actions.d.ts +7 -0
  23. package/dist/renderers/record-quick-actions.d.ts.map +1 -1
  24. package/dist/renderers/record-reference-rail.d.ts +2 -17
  25. package/dist/renderers/record-reference-rail.d.ts.map +1 -1
  26. package/dist/renderers/record-related-list.d.ts +29 -1
  27. package/dist/renderers/record-related-list.d.ts.map +1 -1
  28. package/dist/renderers/recordActivityFeed.d.ts +95 -8
  29. package/dist/renderers/recordActivityFeed.d.ts.map +1 -1
  30. package/dist/synth/buildDefaultPageSchema.d.ts +21 -9
  31. package/dist/synth/buildDefaultPageSchema.d.ts.map +1 -1
  32. package/dist/useDetailTranslation.d.ts +7 -0
  33. package/dist/useDetailTranslation.d.ts.map +1 -1
  34. package/dist/useRecordEditable.d.ts.map +1 -1
  35. package/package.json +20 -18
@@ -1,3 +1,4 @@
1
+ import { I18nLabel } from '@objectstack/spec/ui';
1
2
  /**
2
3
  * ObjectUI
3
4
  * Copyright (c) 2024-present ObjectStack Inc.
@@ -31,11 +32,39 @@
31
32
  *
32
33
  * Visibility model
33
34
  * ----------------
34
- * Reuses `useCondition` + `toPredicateInput` (same pipeline as every
35
- * `<ActionButton>` / `<ActionBar>`), so the predicate evaluates against
36
- * the same scope: `record`, `user`, `objectName`, `features`, plus
37
- * `ctx.*` namespace mirror. Missing predicate → always visible.
38
- * Empty `record` (loading) → hidden (no flash of stale alert).
35
+ * `properties.visible` is normalized by `toPredicateInput` and evaluated by
36
+ * `useCondition` against `usePredicateRecordContext(record)` — the repo's one
37
+ * row-binding rule (objectui#4075 / #4077), shared with `<ActionButton>` /
38
+ * `<ActionMenu>` / `<ActionGroup>` / `<ActionIcon>` and app-shell's
39
+ * `DeclaredActionsBar`, so this banner cannot disagree with the buttons it
40
+ * pairs with. The row therefore resolves the three ways objectui#5330 ruled
41
+ * on (maintainer, 2026-08-20): `record.status` — the CANON, what an author
42
+ * should write — plus the deprecated-but-kept row-action shorthand `status`
43
+ * and legacy `data.status`.
44
+ *
45
+ * Merged UNDER the row is whatever the host put in the ambient predicate
46
+ * scope (`PredicateScopeProvider`; app-shell's `ExpressionProvider` supplies
47
+ * `current_user` / `user` / `ctx.user` / `os.user` / `app` / `data` /
48
+ * `features`). The row wins, so a host-supplied `record` / `data` cannot
49
+ * shadow it. `objectName` is NOT in the predicate scope — it is read from
50
+ * `useRecordContext()` for the metadata lookup and the dismiss key only.
51
+ *
52
+ * Missing predicate → always visible. A predicate that cannot be evaluated →
53
+ * also visible: this call site is FAIL-SOFT (it does not pass
54
+ * `throwOnError`), which is why the unbound spellings above were a
55
+ * user-visible defect rather than a console line — objectui#4807.
56
+ * Empty `record` (loading) → hidden (no flash of stale alert), AND the
57
+ * predicate is not evaluated at all in that frame — a bare/`${…}`
58
+ * `record.*` reference against an unbound row faults, and evaluating a
59
+ * verdict this component is about to discard anyway only produced a
60
+ * permanently misleading `record is not defined` console line on every
61
+ * load (objectui#5776).
62
+ *
63
+ * A node-level `visibleWhen` is a SEPARATE gate one tier up, evaluated by
64
+ * `SchemaRenderer` on its own bindings (notably `data` = the data-source
65
+ * ADAPTER, not the row). The two compose as AND. Both facts are pinned in
66
+ * `__tests__/record-alert.visibleWhen.evidence.test.tsx` (group 4) and
67
+ * `__tests__/record-alert.rowBinding.test.tsx`.
39
68
  *
40
69
  * CTA wiring
41
70
  * ----------
@@ -46,30 +75,51 @@
46
75
  */
47
76
  import * as React from 'react';
48
77
  type Severity = 'info' | 'warning' | 'error' | 'success';
78
+ /**
79
+ * Local (unexported) prop shape for the renderer below.
80
+ *
81
+ * `title` / `body` accept the inline locale map as well as a plain string
82
+ * (objectui#4970): both are read through `pickLocalized` further down, and the
83
+ * block's published authoring surface declares the two arms
84
+ * (`plugin-detail/src/index.tsx`, `type: ['string', 'object']` since
85
+ * objectui#3832), so while these two said `string` they were narrower than both
86
+ * the renderer and this block's own published surface — the
87
+ * declaration-narrower-than-the-renderer family of objectui#4581.
88
+ *
89
+ * The CTA's `action.label` below is the same slot one level down, widened here
90
+ * (objectui#4998) to match: it is read through the same `pickLocalized` call as
91
+ * `title` / `body` (`const ctaLabel = pickLocalized(props.action?.label, language)`
92
+ * further down), so a declaration of bare `string` was narrower than the
93
+ * renderer's own runtime behaviour, exactly as `title` / `body` were before
94
+ * objectui#4970. This widening is TYPE-only: the block's published surface still
95
+ * declares `action` as a bare `object` with the member shape in prose
96
+ * (`plugin-detail/src/index.tsx`), so there is no manifest arm to align — that
97
+ * half stays parked on the `ComponentInput` member-shape question (PR #3795).
98
+ */
49
99
  interface RecordAlertProps {
50
100
  schema?: {
51
101
  properties?: {
52
102
  severity?: Severity;
53
- title?: string;
54
- body?: string;
103
+ title?: string | I18nLabel;
104
+ body?: string | I18nLabel;
55
105
  visible?: any;
56
106
  icon?: string;
57
107
  action?: {
58
108
  actionName: string;
59
- label?: string;
109
+ label?: string | I18nLabel;
60
110
  variant?: string;
61
111
  };
62
112
  dismissible?: boolean;
63
113
  dismissKey?: string;
64
114
  };
65
115
  severity?: Severity;
66
- title?: string;
67
- body?: string;
116
+ title?: string | I18nLabel;
117
+ body?: string | I18nLabel;
68
118
  visible?: any;
69
119
  icon?: string;
70
120
  action?: {
71
121
  actionName: string;
72
- label?: string;
122
+ label?: string | I18nLabel;
73
123
  variant?: string;
74
124
  };
75
125
  dismissible?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"record-alert.d.ts","sourceRoot":"","sources":["../../src/renderers/record-alert.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAY/B,KAAK,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAEzD,UAAU,gBAAgB;IACxB,MAAM,CAAC,EAAE;QACP,UAAU,CAAC,EAAE;YACX,QAAQ,CAAC,EAAE,QAAQ,CAAC;YACpB,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,OAAO,CAAC,EAAE,GAAG,CAAC;YACd,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,MAAM,CAAC,EAAE;gBAAE,UAAU,EAAE,MAAM,CAAC;gBAAC,KAAK,CAAC,EAAE,MAAM,CAAC;gBAAC,OAAO,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC;YAClE,WAAW,CAAC,EAAE,OAAO,CAAC;YACtB,UAAU,CAAC,EAAE,MAAM,CAAC;SACrB,CAAC;QAEF,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,GAAG,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE;YAAE,UAAU,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAClE,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;CAClB;AA6BD,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAiI1D,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"record-alert.d.ts","sourceRoot":"","sources":["../../src/renderers/record-alert.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyEG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAkB/B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,KAAK,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAEzD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,UAAU,gBAAgB;IACxB,MAAM,CAAC,EAAE;QACP,UAAU,CAAC,EAAE;YACX,QAAQ,CAAC,EAAE,QAAQ,CAAC;YACpB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;YAC3B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;YAC1B,OAAO,CAAC,EAAE,GAAG,CAAC;YACd,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,MAAM,CAAC,EAAE;gBAAE,UAAU,EAAE,MAAM,CAAC;gBAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;gBAAC,OAAO,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC;YAC9E,WAAW,CAAC,EAAE,OAAO,CAAC;YACtB,UAAU,CAAC,EAAE,MAAM,CAAC;SACrB,CAAC;QAEF,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC1B,OAAO,CAAC,EAAE,GAAG,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE;YAAE,UAAU,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC9E,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;CAClB;AA6BD,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAuJ1D,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"record-details.d.ts","sourceRoot":"","sources":["../../src/renderers/record-details.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAYpE,MAAM,WAAW,0BAA0B;IACzC,MAAM,CAAC,EAAE,2BAA2B,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;CAClB;AAED,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,0BAA0B,CA2OtE,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"record-details.d.ts","sourceRoot":"","sources":["../../src/renderers/record-details.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAYpE,MAAM,WAAW,0BAA0B;IACzC,MAAM,CAAC,EAAE,2BAA2B,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;CAClB;AAED,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,0BAA0B,CAgPtE,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"record-path.d.ts","sourceRoot":"","sources":["../../src/renderers/record-path.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAQjE,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,wBAAwB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;CAClB;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CA+KhE,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"record-path.d.ts","sourceRoot":"","sources":["../../src/renderers/record-path.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAWjE,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,wBAAwB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;CAClB;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CA0ShE,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -8,7 +8,14 @@ export interface RecordQuickActionsRendererProps {
8
8
  align?: 'start' | 'center' | 'end';
9
9
  size?: 'sm' | 'default' | 'lg';
10
10
  variant?: 'default' | 'secondary' | 'outline' | 'ghost' | 'destructive' | 'link';
11
+ /**
12
+ * Accessible name for the toolbar. `ariaLabel` is the spelling
13
+ * `@objectstack/spec`'s `AriaPropsSchema` accepts; `label` is that shape's
14
+ * alias entry — refused on parse — and is kept here as a back-compat read
15
+ * for documents written before the contract closed (objectui#4663).
16
+ */
11
17
  aria?: {
18
+ ariaLabel?: string;
12
19
  label?: string;
13
20
  };
14
21
  properties?: Record<string, any>;
@@ -1 +1 @@
1
- {"version":3,"file":"record-quick-actions.d.ts","sourceRoot":"","sources":["../../src/renderers/record-quick-actions.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAOjE,MAAM,WAAW,+BAA+B;IAC9C,MAAM,CAAC,EAAE;QACP,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;QACtB,QAAQ,CAAC,EAAE,cAAc,CAAC;QAC1B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC/B,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;QACnC,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC;QAC/B,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,GAAG,MAAM,CAAC;QACjF,IAAI,CAAC,EAAE;YAAE,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC1B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;KAClB,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;CAClB;AAED,eAAO,MAAM,0BAA0B,EAAE,KAAK,CAAC,EAAE,CAAC,+BAA+B,CAsIhF,CAAC;AA4CF,eAAe,0BAA0B,CAAC"}
1
+ {"version":3,"file":"record-quick-actions.d.ts","sourceRoot":"","sources":["../../src/renderers/record-quick-actions.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAOjE,MAAM,WAAW,+BAA+B;IAC9C,MAAM,CAAC,EAAE;QACP,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;QACtB,QAAQ,CAAC,EAAE,cAAc,CAAC;QAC1B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC/B,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;QACnC,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC;QAC/B,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,GAAG,MAAM,CAAC;QACjF;;;;;WAKG;QACH,IAAI,CAAC,EAAE;YAAE,SAAS,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC9C,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;KAClB,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;CAClB;AAED,eAAO,MAAM,0BAA0B,EAAE,KAAK,CAAC,EAAE,CAAC,+BAA+B,CAqLhF,CAAC;AAsDF,eAAe,0BAA0B,CAAC"}
@@ -1,21 +1,6 @@
1
1
  import { default as React } from 'react';
2
- export interface ReferenceRailEntry {
3
- /** Related object's API name (e.g. 'opportunity_quote'). */
4
- objectName: string;
5
- /** FK field on the related object pointing back to the host record. */
6
- relationshipField: string;
7
- /** Optional override for the rail card title. */
8
- title?: string;
9
- /** Lucide icon name (defaults vary by object). */
10
- icon?: string;
11
- /** Top-N preview cap. Defaults to 3. */
12
- limit?: number;
13
- /**
14
- * Canonical field on the related object to render in each preview row.
15
- * Falls back to `name / title / subject / label / id` when omitted.
16
- */
17
- displayField?: string;
18
- }
2
+ import { ReferenceRailEntry } from '@objectstack/spec/ui';
3
+ export type { ReferenceRailEntry } from '@objectstack/spec/ui';
19
4
  export interface RecordReferenceRailRendererProps {
20
5
  schema?: {
21
6
  entries?: ReferenceRailEntry[];
@@ -1 +1 @@
1
- {"version":3,"file":"record-reference-rail.d.ts","sourceRoot":"","sources":["../../src/renderers/record-reference-rail.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAY1B,MAAM,WAAW,kBAAkB;IACjC,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gCAAgC;IAC/C,MAAM,CAAC,EAAE;QACP,OAAO,CAAC,EAAE,kBAAkB,EAAE,CAAC;QAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB;;;;;;WAMG;QACH,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;KAClB,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;CAClB;AAoCD,eAAO,MAAM,2BAA2B,EAAE,KAAK,CAAC,EAAE,CAAC,gCAAgC,CAmQlF,CAAC;AAEF,eAAe,2BAA2B,CAAC"}
1
+ {"version":3,"file":"record-reference-rail.d.ts","sourceRoot":"","sources":["../../src/renderers/record-reference-rail.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAU/D,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAO/D,MAAM,WAAW,gCAAgC;IAC/C,MAAM,CAAC,EAAE;QACP,OAAO,CAAC,EAAE,kBAAkB,EAAE,CAAC;QAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB;;;;;;WAMG;QACH,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;KAClB,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;CAClB;AAoCD,eAAO,MAAM,2BAA2B,EAAE,KAAK,CAAC,EAAE,CAAC,gCAAgC,CAmQlF,CAAC;AAEF,eAAe,2BAA2B,CAAC"}
@@ -1,10 +1,38 @@
1
1
  import { default as React } from 'react';
2
2
  import { RecordRelatedListComponentProps } from '@object-ui/types';
3
3
  export interface RecordRelatedListRendererProps {
4
- schema?: RecordRelatedListComponentProps & Record<string, any>;
4
+ /**
5
+ * The AUTHORED node, before the per-element `dataSource` binding is resolved.
6
+ *
7
+ * `objectName` is optional HERE and required everywhere else, and the
8
+ * difference is the whole point of objectstack#6953: the exported name is the
9
+ * `ElementDataSourceGate` wrapper below, and the gate maps the binding's
10
+ * `object` onto `objectName` (its default target — see `ElementDataSourceGate`
11
+ * `objectKey = 'objectName'`) before `RecordRelatedListBody` ever sees the
12
+ * schema. A related list authored as `{ relationshipField, dataSource: {
13
+ * object, view } }` is therefore legal input to this component and illegal
14
+ * input to the spec's `RecordRelatedListProps`, which is correct on both
15
+ * sides — one describes what an author writes, the other what the block reads.
16
+ *
17
+ * Spelling it `RecordRelatedListComponentProps` flat said the opposite, and
18
+ * said it about the wrapper: the exact authoring shape #6953 added did not
19
+ * type-check against the component that exists to accept it. The body already
20
+ * reads the key defensively (`objectName && …`, `objectName || ''`) precisely
21
+ * because it can arrive unbound; this declaration now agrees with that code.
22
+ */
23
+ schema?: Omit<RecordRelatedListComponentProps, 'objectName'> & Partial<Pick<RecordRelatedListComponentProps, 'objectName'>> & Record<string, any>;
5
24
  className?: string;
6
25
  [k: string]: any;
7
26
  }
27
+ /**
28
+ * `record:related_list` with the spec's per-element `dataSource` binding mapped
29
+ * onto the keys the body reads (objectstack#6953).
30
+ *
31
+ * The gate wraps the EXPORTED name rather than being added at the registration
32
+ * site, so a host that imports this renderer directly gets the binding too — a
33
+ * block bound under one entry point and unbound under another is the same
34
+ * "declared but not reached" shape in miniature.
35
+ */
8
36
  export declare const RecordRelatedListRenderer: React.FC<RecordRelatedListRendererProps>;
9
37
  export default RecordRelatedListRenderer;
10
38
  //# sourceMappingURL=record-related-list.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"record-related-list.d.ts","sourceRoot":"","sources":["../../src/renderers/record-related-list.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,kBAAkB,CAAC;AA4BxE,MAAM,WAAW,8BAA8B;IAC7C,MAAM,CAAC,EAAE,+BAA+B,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;CAClB;AAED,eAAO,MAAM,yBAAyB,EAAE,KAAK,CAAC,EAAE,CAAC,8BAA8B,CA2L9E,CAAC;AAEF,eAAe,yBAAyB,CAAC"}
1
+ {"version":3,"file":"record-related-list.d.ts","sourceRoot":"","sources":["../../src/renderers/record-related-list.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAY1B,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,kBAAkB,CAAC;AA4BxE,MAAM,WAAW,8BAA8B;IAC7C;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,EAAE,IAAI,CAAC,+BAA+B,EAAE,YAAY,CAAC,GAC1D,OAAO,CAAC,IAAI,CAAC,+BAA+B,EAAE,YAAY,CAAC,CAAC,GAC5D,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;CAClB;AAsOD;;;;;;;;GAQG;AACH,eAAO,MAAM,yBAAyB,EAAE,KAAK,CAAC,EAAE,CAAC,8BAA8B,CAiB9E,CAAC;AAEF,eAAe,yBAAyB,CAAC"}
@@ -5,19 +5,65 @@ export declare const DEFAULT_ACTIVITY_LIMIT = 20;
5
5
  /**
6
6
  * `sys_activity.type` → `FeedItem.type`.
7
7
  *
8
- * Identical to the map `RecordDetailView` uses when it merges `sys_activity`
9
- * into the discussion feed, deliberately: one table, one reading. Two renderers
10
- * that disagree about what a `created` row IS would put the same record's
11
- * history under two different icons depending on which block an author reached
12
- * for, so the richer `record_create` / `record_delete` / `sharing` feed types
13
- * the spec offers are NOT used here — adopting them is a change to that shared
14
- * map, not to this block.
8
+ * Meant to be one reading with the map `RecordDetailView` uses when it merges
9
+ * `sys_activity` into the discussion feed. Two renderers that disagree about what a `created` row IS would put
10
+ * the same record's history under two different icons depending on which block
11
+ * an author reached for, so the richer `record_create` / `record_delete` /
12
+ * `sharing` feed types the spec offers are NOT used here — adopting them is a
13
+ * change to that shared map, not to this block.
14
+ *
15
+ * ⚠️ That copy is a hand-written literal in `app-shell`, not an import of this
16
+ * one, and nothing fails when the two disagree — so the `scheduled` entry below
17
+ * is currently present here and absent there. Tracked as objectui#5878; fixing
18
+ * it means the second copy reading this export, which is a different package's
19
+ * surface than this card's.
15
20
  *
16
21
  * `commented` / `mentioned` map to nothing because their content lives in
17
22
  * `sys_comment` (with reactions and threading attached) — a host that has both
18
23
  * merges the comment rows, and the block on its own has no comment write path
19
24
  * to pair them with. `login` / `logout` are account events, not record
20
25
  * activity.
26
+ *
27
+ * ## Two vocabularies, not one (objectui#5840)
28
+ *
29
+ * The keys were originally set-equal to plugin-audit's declared
30
+ * `sys_activity.type` select options, and the test pinned exactly that. They no
31
+ * longer are, because those options are **not** what the column stores:
32
+ *
33
+ * - Every field on `sys_activity` is `readonly: true`, and objectql's
34
+ * `validateRecord` skips readonly fields on both the insert and the update
35
+ * branch. The eleven-value enum is therefore documentation, not a contract —
36
+ * an undeclared value is written silently (measured upstream by
37
+ * plugin-audit's own `sys-activity-type-vocabulary.test.ts`).
38
+ * - The platform itself forwards author-declared values into the column:
39
+ * ADR-0052 §5b.2 `activityMilestones[].type` is applied verbatim by
40
+ * plugin-audit's `audit-writers.ts` (`if (milestone.type) activityType =
41
+ * milestone.type`). That is how `completed` is produced, and it is a general
42
+ * door, not a special case.
43
+ *
44
+ * So `scheduled` is a value that is written, stored and queryable while being
45
+ * undeclared upstream. Dropping it was not a decision this map made; it was the
46
+ * absence of one. Its producer is HotCRM's `schedule_meeting` action
47
+ * (`src/actions/global.actions.ts` — `type: EVENT_STATUS === 'held' ?
48
+ * 'completed' : 'scheduled'`), registered for `crm_lead`, `crm_contact`,
49
+ * `crm_account`, `crm_opportunity` and `crm_case`: the held branch reached the
50
+ * timeline, the scheduled branch never did.
51
+ *
52
+ * `scheduled` → `event` is the semantic pairing and it is what makes the
53
+ * declared `event` feed type reachable at all. Note the two branches of that
54
+ * one producer now land at different DEFAULT visibility, which is the intended
55
+ * reading: a held meeting is `completed` → `task`, hidden unless
56
+ * `showCompleted`; a not-yet-held meeting is `scheduled` → `event`, shown,
57
+ * because an upcoming meeting is the part of a timeline you still act on.
58
+ *
59
+ * Whether the upstream enum should GAIN `scheduled` is a platform ruling, not
60
+ * this block's to make — filed as objectstack#11424. Until it is ruled, the
61
+ * honest statement of this table is the one the test now pins: the upstream
62
+ * declaration PLUS the values a shipped producer measurably writes.
63
+ *
64
+ * Values outside BOTH groups are still dropped — see
65
+ * {@link activityRowToFeedItem}, which now says so out loud instead of
66
+ * silently.
21
67
  */
22
68
  export declare const ACTIVITY_TYPE_TO_FEED_TYPE: Readonly<Record<string, FeedItemType | undefined>>;
23
69
  /** A row as `sys_activity` returns it. Loose on purpose: the block reads a
@@ -43,7 +89,42 @@ export interface SysActivityRow {
43
89
  * filter token is skipped, never turned into a filter that can't match.
44
90
  */
45
91
  export declare function normalizeFilterMode(value: unknown): FeedFilterMode;
46
- /** Keep only the `types` entries the spec actually defines. */
92
+ /** Test seam: forget which `types` entries have already been named. */
93
+ export declare function resetUnrecognisedFeedTypeWarnings(): void;
94
+ /**
95
+ * Sanitise an authored `types` allow-list. Narrowing or refusal, never widening.
96
+ *
97
+ * Three distinct authored intents used to collapse into one rendering
98
+ * (objectui#5841). They are three again:
99
+ *
100
+ * | authored | returns | rendered |
101
+ * | ----------------------------- | ----------- | ------------------------------ |
102
+ * | absent (`undefined`/`null`) | `undefined` | every kind — no filter authored |
103
+ * | `[]` | `[]` | nothing — the author said "no kinds" |
104
+ * | `['crm_task']` (none known) | `[]` | nothing, plus one diagnostic |
105
+ * | `['task', 'crm_task']` | `['task']` | the recognised members, plus one diagnostic |
106
+ *
107
+ * `undefined` now means "no `types` key was authored" and ONLY that. It used to
108
+ * mean that OR "everything you authored was dropped", and {@link applyFeedConfig}
109
+ * reads it as "apply no filter" — so a single typo served the author every
110
+ * activity on the record with nothing said anywhere, and the tell was a
111
+ * PLAUSIBLE result (a populated timeline) rather than an empty one that gets
112
+ * investigated. That is the principle this function now holds: a sanitiser may
113
+ * narrow an author's request or refuse it, but it must never silently widen it,
114
+ * because widening turns a typo into "show the user everything" — the one
115
+ * outcome no author asked for.
116
+ *
117
+ * `[]` is honoured rather than reinterpreted, and silently: rendering every kind
118
+ * is the maximally wrong answer to "no kinds", and there is nothing to report
119
+ * about a request that was carried out exactly.
120
+ *
121
+ * Membership is read from `@objectstack/spec`'s `FeedItemType` at runtime, never
122
+ * re-typed here — see the file header for what a hand copy of a spec enum cost.
123
+ *
124
+ * NOT pure: an entry it cannot recognise logs once (see {@link warnOnce}). The
125
+ * failure being repaired is invisibility, so the diagnostic is the other half of
126
+ * the fix rather than a nicety.
127
+ */
47
128
  export declare function normalizeFeedTypes(value: unknown): FeedItemType[] | undefined;
48
129
  /** Coerce `limit` to a positive integer, falling back to the spec default. */
49
130
  export declare function normalizeLimit(value: unknown): number;
@@ -56,9 +137,15 @@ export declare function normalizeLimit(value: unknown): number;
56
137
  * type map is: same rows, same quirk.
57
138
  */
58
139
  export declare function activityTimestamp(row: SysActivityRow): string;
140
+ /** Test seam: forget which unknown types have already been warned about. */
141
+ export declare function resetUnknownActivityTypeWarnings(): void;
59
142
  /**
60
143
  * One `sys_activity` row → one {@link FeedItem}, or `null` when the row is not
61
144
  * record activity (see {@link ACTIVITY_TYPE_TO_FEED_TYPE}).
145
+ *
146
+ * Two different `null`s, and the difference is the point: a type the table
147
+ * maps to `undefined` is a deliberate exclusion and returns quietly; a type the
148
+ * table does not contain at all is an unmapped producer and says so once.
62
149
  */
63
150
  export declare function activityRowToFeedItem(row: SysActivityRow, systemActorLabel: string): FeedItem | null;
64
151
  /** The subset of `RecordActivityProps` that decides which items survive. */
@@ -1 +1 @@
1
- {"version":3,"file":"recordActivityFeed.d.ts","sourceRoot":"","sources":["../../src/renderers/recordActivityFeed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAKhE,oDAAoD;AACpD,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,CAAC,CAYzF,CAAC;AAgBF;2EAC2E;AAC3E,MAAM,WAAW,cAAc;IAC7B,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACnC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAIlE;AAED,+DAA+D;AAC/D,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,EAAE,GAAG,SAAS,CAM7E;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGrD;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAM7D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,cAAc,EACnB,gBAAgB,EAAE,MAAM,GACvB,QAAQ,GAAG,IAAI,CAejB;AAED,4EAA4E;AAC5E,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,2EAA2E;IAC3E,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,SAAS,QAAQ,EAAE,EAC1B,MAAM,EAAE,iBAAiB,EACzB,QAAQ,EAAE,MAAM,GACf,WAAW,CAoCb;AAED,kFAAkF;AAClF,wBAAgB,cAAc,CAAC,GAAG,MAAM,EAAE,SAAS,QAAQ,EAAE,EAAE,GAAG,QAAQ,EAAE,CAU3E"}
1
+ {"version":3,"file":"recordActivityFeed.d.ts","sourceRoot":"","sources":["../../src/renderers/recordActivityFeed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAKhE,oDAAoD;AACpD,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8DG;AACH,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,CAAC,CAazF,CAAC;AAgBF;2EAC2E;AAC3E,MAAM,WAAW,cAAc;IAC7B,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACnC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAIlE;AAkCD,uEAAuE;AACvE,wBAAgB,iCAAiC,IAAI,IAAI,CAExD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,EAAE,GAAG,SAAS,CAuC7E;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGrD;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAM7D;AAiCD,4EAA4E;AAC5E,wBAAgB,gCAAgC,IAAI,IAAI,CAEvD;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,cAAc,EACnB,gBAAgB,EAAE,MAAM,GACvB,QAAQ,GAAG,IAAI,CAoBjB;AAED,4EAA4E;AAC5E,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,2EAA2E;IAC3E,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,SAAS,QAAQ,EAAE,EAC1B,MAAM,EAAE,iBAAiB,EACzB,QAAQ,EAAE,MAAM,GACf,WAAW,CAyCb;AAED,kFAAkF;AAClF,wBAAgB,cAAc,CAAC,GAAG,MAAM,EAAE,SAAS,QAAQ,EAAE,EAAE,GAAG,QAAQ,EAAE,CAU3E"}
@@ -1,3 +1,4 @@
1
+ import { ServiceObject } from '@objectstack/spec/data';
1
2
  import { detectStatusField } from '@object-ui/types';
2
3
  /** Minimal shape of an object definition we read here. We deliberately
3
4
  * duck-type so this helper has zero hard dependency on a specific
@@ -31,16 +32,27 @@ export interface ObjectDefLike {
31
32
  * Declared field groups from the object designer. Fields opt in via
32
33
  * `field.group === group.key`; the detail synthesizer derives sections
33
34
  * from them when no explicit sections are provided.
35
+ *
36
+ * DERIVED from the spec's own authorable group, not restated. This key is a
37
+ * pass-through: nothing here reads a member of it, `deriveFieldGroupLayout`
38
+ * (`@objectstack/spec/data`) does — so the set of members this type should
39
+ * admit is by definition the set the spec declares, and hand-listing them
40
+ * could only ever drift from it. It had: the hand-written list this replaces
41
+ * carried `key`/`label`/`collapse` and the deprecated `collapsible`/`collapsed`
42
+ * pair, but not `icon`, `description` or `defaultExpanded`. Two of those three
43
+ * are read by this very file — `deriveFieldGroupDetailSections` passes
44
+ * `s.icon`/`s.description` through to the section descriptors under a comment
45
+ * citing #2548 ("Dropping them here made the spec keys silently inert on
46
+ * detail pages") — so an author declaring the icon the synthesizer honours was
47
+ * rejected by the type of the function that honours it.
48
+ *
49
+ * `Partial` is the one shape difference and it is deliberate: the spec makes
50
+ * `key`/`label` required and `collapse` defaulted, but this is the duck type
51
+ * for a raw object definition that has NOT been through a spec parse (the
52
+ * whole reason it exists — see the interface header), so every member has to
53
+ * be admissible as absent. Nothing here requires a group member to be present.
34
54
  */
35
- fieldGroups?: Array<{
36
- key?: string;
37
- label?: string;
38
- collapse?: 'none' | 'expanded' | 'collapsed';
39
- /** @deprecated pre-ADR-0085 pair; honoured by the shared derivation. */
40
- collapsible?: boolean;
41
- /** @deprecated pre-ADR-0085 pair; honoured by the shared derivation. */
42
- collapsed?: boolean;
43
- }>;
55
+ fieldGroups?: Array<Partial<NonNullable<ServiceObject['fieldGroups']>[number]>>;
44
56
  /**
45
57
  * Spec `enable` capability toggles. Only `files` is read here:
46
58
  * `enable.files === true` (opt-in, #2727) makes the synthesizer emit an
@@ -1 +1 @@
1
- {"version":3,"file":"buildDefaultPageSchema.d.ts","sourceRoot":"","sources":["../../src/synth/buildDefaultPageSchema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"buildDefaultPageSchema.d.ts","sourceRoot":"","sources":["../../src/synth/buildDefaultPageSchema.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,13 @@ export declare const createSafeTranslationHook: typeof createSafeTranslation;
15
15
  /**
16
16
  * Default English translations for detail view components.
17
17
  * Used as fallback when no I18nProvider is available.
18
+ *
19
+ * Every row whose key the `en` pack also defines must stay byte-identical to it
20
+ * — otherwise this control is labelled one way on a provider-less host and
21
+ * another in the console. Enforced since objectui#4401 by
22
+ * `app-shell/src/__tests__/defaults-maps-mirror-en-pack.test.tsx`, which
23
+ * compares this map, `LIST_DEFAULT_TRANSLATIONS` and
24
+ * `DESIGNER_DEFAULT_TRANSLATIONS` key by key against the pack.
18
25
  */
19
26
  export declare const DETAIL_DEFAULT_TRANSLATIONS: Record<string, string>;
20
27
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"useDetailTranslation.d.ts","sourceRoot":"","sources":["../src/useDetailTranslation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,yBAAyB,8BAAwB,CAAC;AAE/D;;;GAGG;AACH,eAAO,MAAM,2BAA2B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAoL9D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB;4BAjNhC,CAAC;;;;;CAoND,CAAC"}
1
+ {"version":3,"file":"useDetailTranslation.d.ts","sourceRoot":"","sources":["../src/useDetailTranslation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,yBAAyB,8BAAwB,CAAC;AAE/D;;;;;;;;;;GAUG;AACH,eAAO,MAAM,2BAA2B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA2N9D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB;4BA/PhC,CAAC;;;;;CAkQD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useRecordEditable.d.ts","sourceRoot":"","sources":["../src/useRecordEditable.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAsCH,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAElD,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,SAAS,GAAE,eAA0B,EACrC,OAAO,UAAO,GACb,OAAO,CA6CT;AAED,+CAA+C;AAC/C,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD"}
1
+ {"version":3,"file":"useRecordEditable.d.ts","sourceRoot":"","sources":["../src/useRecordEditable.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAuCH,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAElD,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,SAAS,GAAE,eAA0B,EACrC,OAAO,UAAO,GACb,OAAO,CA6CT;AAED,+CAA+C;AAC/C,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@object-ui/plugin-detail",
3
- "version": "17.3.0",
3
+ "version": "17.6.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "DetailView plugin for Object UI - comprehensive detail page with sections, tabs, and related lists",
@@ -24,34 +24,36 @@
24
24
  }
25
25
  },
26
26
  "dependencies": {
27
- "@objectstack/spec": "^17.0.0-rc.2",
28
- "lucide-react": "^1.28.0",
29
- "@object-ui/i18n": "17.3.0"
27
+ "@objectstack/spec": "^17.0.0",
28
+ "lucide-react": "^1.31.0",
29
+ "@object-ui/i18n": "17.6.0"
30
30
  },
31
31
  "peerDependencies": {
32
32
  "react": "^18.0.0 || ^19.0.0",
33
33
  "react-dom": "^18.0.0 || ^19.0.0",
34
- "@object-ui/components": "^17.3.0",
35
- "@object-ui/core": "^17.3.0",
36
- "@object-ui/fields": "^17.3.0",
37
- "@object-ui/permissions": "^17.3.0",
38
- "@object-ui/react": "^17.3.0",
39
- "@object-ui/types": "^17.3.0"
34
+ "react-router-dom": "^6.0.0 || ^7.0.0",
35
+ "@object-ui/components": "^17.6.0",
36
+ "@object-ui/core": "^17.6.0",
37
+ "@object-ui/fields": "^17.6.0",
38
+ "@object-ui/permissions": "^17.6.0",
39
+ "@object-ui/react": "^17.6.0",
40
+ "@object-ui/types": "^17.6.0"
40
41
  },
41
42
  "devDependencies": {
42
43
  "@types/react": "19.2.18",
43
44
  "@types/react-dom": "19.2.4",
44
45
  "@vitejs/plugin-react": "^6.0.5",
45
46
  "typescript": "^6.0.3",
46
- "vite": "^8.2.0",
47
+ "vite": "^8.2.1",
47
48
  "vite-plugin-dts": "^5.0.3",
48
49
  "vitest": "^4.1.10",
49
- "@object-ui/components": "17.3.0",
50
- "@object-ui/core": "17.3.0",
51
- "@object-ui/fields": "17.3.0",
52
- "@object-ui/permissions": "17.3.0",
53
- "@object-ui/react": "17.3.0",
54
- "@object-ui/types": "17.3.0"
50
+ "@object-ui/components": "17.6.0",
51
+ "@object-ui/core": "17.6.0",
52
+ "@object-ui/fields": "17.6.0",
53
+ "@object-ui/permissions": "17.6.0",
54
+ "@object-ui/test-support": "17.4.0",
55
+ "@object-ui/react": "17.6.0",
56
+ "@object-ui/types": "17.6.0"
55
57
  },
56
58
  "keywords": [
57
59
  "objectui",
@@ -79,7 +81,7 @@
79
81
  "build": "vite build",
80
82
  "test": "vitest run",
81
83
  "test:watch": "vitest",
82
- "type-check": "tsc --noEmit && tsc -p tsconfig.typetests.json",
84
+ "type-check": "tsc --noEmit && tsc -p tsconfig.test.json",
83
85
  "lint": "eslint ."
84
86
  }
85
87
  }