@object-ui/plugin-detail 17.7.0 → 18.0.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 +1014 -0
- package/README.md +153 -0
- package/dist/CommentAuthorControls.d.ts +40 -0
- package/dist/CommentAuthorControls.d.ts.map +1 -0
- package/dist/ConcurrentUpdateDialog.d.ts +1 -2
- package/dist/ConcurrentUpdateDialog.d.ts.map +1 -1
- package/dist/DetailSection.d.ts.map +1 -1
- package/dist/DetailSectionNode.d.ts +2 -2
- package/dist/DetailView.d.ts +13 -0
- package/dist/DetailView.d.ts.map +1 -1
- package/dist/HeaderHighlight.d.ts.map +1 -1
- package/dist/HistoryTimeline.d.ts +13 -3
- package/dist/HistoryTimeline.d.ts.map +1 -1
- package/dist/InlineEditSaveBar.d.ts.map +1 -1
- package/dist/InlineFieldInput.d.ts +1 -1
- package/dist/InlineFieldInput.d.ts.map +1 -1
- package/dist/RecordActivityTimeline.d.ts +13 -0
- package/dist/RecordActivityTimeline.d.ts.map +1 -1
- package/dist/RecordChatterPanel.d.ts +4 -0
- package/dist/RecordChatterPanel.d.ts.map +1 -1
- package/dist/RecordDetailPanel.d.ts.map +1 -1
- package/dist/RelatedList.d.ts.map +1 -1
- package/dist/ThreadedReplies.d.ts +8 -0
- package/dist/ThreadedReplies.d.ts.map +1 -1
- package/dist/fieldEnrichment.d.ts +3 -2
- package/dist/fieldEnrichment.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2509 -1931
- package/dist/index.umd.cjs +2 -2
- package/dist/recordPageProvenance.d.ts +39 -0
- package/dist/recordPageProvenance.d.ts.map +1 -0
- package/dist/renderers/record-activity.d.ts.map +1 -1
- package/dist/renderers/record-alert.d.ts.map +1 -1
- package/dist/renderers/record-chatter.d.ts.map +1 -1
- package/dist/renderers/record-details.d.ts +10 -0
- package/dist/renderers/record-details.d.ts.map +1 -1
- package/dist/renderers/record-highlights.d.ts +10 -0
- package/dist/renderers/record-highlights.d.ts.map +1 -1
- package/dist/renderers/record-history.d.ts.map +1 -1
- package/dist/renderers/record-path.d.ts.map +1 -1
- package/dist/renderers/record-quick-actions.d.ts +10 -0
- package/dist/renderers/record-quick-actions.d.ts.map +1 -1
- package/dist/renderers/record-reference-rail.d.ts.map +1 -1
- package/dist/renderers/record-related-list.d.ts +14 -4
- package/dist/renderers/record-related-list.d.ts.map +1 -1
- package/dist/renderers/recordActivityFeed.d.ts +69 -11
- package/dist/renderers/recordActivityFeed.d.ts.map +1 -1
- package/dist/renderers/recordBinding.d.ts +180 -0
- package/dist/renderers/recordBinding.d.ts.map +1 -0
- package/dist/synth/buildDefaultPageSchema.d.ts +90 -4
- package/dist/synth/buildDefaultPageSchema.d.ts.map +1 -1
- package/dist/useDetailTranslation.d.ts.map +1 -1
- package/dist/useRecordEditable.d.ts +4 -1
- package/dist/useRecordEditable.d.ts.map +1 -1
- package/package.json +16 -16
- package/dist/renderers/PermissionFacetLink.d.ts +0 -38
- package/dist/renderers/PermissionFacetLink.d.ts.map +0 -1
|
@@ -0,0 +1,39 @@
|
|
|
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
|
+
import * as React from 'react';
|
|
9
|
+
/**
|
|
10
|
+
* Whether the record PAGE draws a `DetailView`'s provenance footer for it
|
|
11
|
+
* (objectui#12307).
|
|
12
|
+
*
|
|
13
|
+
* A record page shows ONE record, so its `RecordMetaFooter` is the page's and
|
|
14
|
+
* is drawn once, by the page host (app-shell's `RecordDetailView`, and the
|
|
15
|
+
* Studio `PagePreview` that mirrors it), whatever the number of
|
|
16
|
+
* `record:details` nodes the page carries. Before this, every `DetailView`
|
|
17
|
+
* mounted its own: a page with two `record:details` nodes printed the same
|
|
18
|
+
* line twice, and a node whose sections were all hidden drew a block holding
|
|
19
|
+
* nothing but that line.
|
|
20
|
+
*
|
|
21
|
+
* `record:details` provides `true` around the one `DetailView` it mounts when
|
|
22
|
+
* the node reads the page's record, i.e. when it carries no `dataSource`
|
|
23
|
+
* binding (`renderers/record-details.tsx`). Everything else reads the default,
|
|
24
|
+
* `false`, and keeps its footer:
|
|
25
|
+
*
|
|
26
|
+
* - a standalone `DetailView` (the `detail-view` node, the record drawer and
|
|
27
|
+
* overlay panel, a direct React caller) has no page to draw it for it;
|
|
28
|
+
* - a BOUND `record:details` shows the first row of its own query, a record
|
|
29
|
+
* the page does not show, so the page's footer is not that record's.
|
|
30
|
+
*
|
|
31
|
+
* ⛔ Module-internal on purpose: not re-exported from the package barrel, and
|
|
32
|
+
* neither a `DetailView` prop nor a `DetailViewSchema` key. Where the footer
|
|
33
|
+
* sits is the renderer's placement, not something a page authors (the triage
|
|
34
|
+
* on objectui#12307 ruled out a prop and a spec key for it). It lives in its
|
|
35
|
+
* own module, not in `DetailView.tsx`, so that file keeps exporting
|
|
36
|
+
* components only.
|
|
37
|
+
*/
|
|
38
|
+
export declare const RecordPageProvenanceContext: React.Context<boolean>;
|
|
39
|
+
//# sourceMappingURL=recordPageProvenance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recordPageProvenance.d.ts","sourceRoot":"","sources":["../src/recordPageProvenance.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,2BAA2B,wBAAsC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-activity.d.ts","sourceRoot":"","sources":["../../src/renderers/record-activity.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"record-activity.d.ts","sourceRoot":"","sources":["../../src/renderers/record-activity.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8DG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,QAAQ,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAC;AA2B/E,MAAM,WAAW,2BAA2B;IAC1C,MAAM,CAAC,EAAE,4BAA4B,GAAG;QACtC;oEAC4D;QAC5D,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;QACnB,uDAAuD;QACvD,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,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,sBAAsB,EAAE,KAAK,CAAC,EAAE,CAAC,2BAA2B,CAuNxE,CAAC;AAEF,eAAe,sBAAsB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-alert.d.ts","sourceRoot":"","sources":["../../src/renderers/record-alert.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8EG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAuB/B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,KAAK,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAEzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,UAAU,wBAAwB;IAChC,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;AAwBD,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,
|
|
1
|
+
{"version":3,"file":"record-alert.d.ts","sourceRoot":"","sources":["../../src/renderers/record-alert.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8EG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAuB/B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,KAAK,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAEzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,UAAU,wBAAwB;IAChC,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;AAwBD,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAgLlE,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-chatter.d.ts","sourceRoot":"","sources":["../../src/renderers/record-chatter.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"record-chatter.d.ts","sourceRoot":"","sources":["../../src/renderers/record-chatter.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAA0C,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAW5G,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,CAqLtE,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
|
|
@@ -7,6 +7,16 @@ export interface RecordDetailsRendererProps {
|
|
|
7
7
|
className?: string;
|
|
8
8
|
[k: string]: any;
|
|
9
9
|
}
|
|
10
|
+
/**
|
|
11
|
+
* `record:details` with the spec's per-element `dataSource` binding honoured
|
|
12
|
+
* (objectui#12294). Unbound, the body reads the record page's record exactly as
|
|
13
|
+
* before; bound, it reads the FIRST row of the bound set. `recordBindingBlock`
|
|
14
|
+
* (`./recordBinding`, which states the semantics) wraps the body in the gate and
|
|
15
|
+
* the one-record scope, and passes the result through the declaration seam.
|
|
16
|
+
*
|
|
17
|
+
* Wraps the EXPORTED name, as `record:related_list` does, so a host that
|
|
18
|
+
* imports this renderer directly gets the binding too.
|
|
19
|
+
*/
|
|
10
20
|
export declare const RecordDetailsRenderer: React.FC<RecordDetailsRendererProps>;
|
|
11
21
|
export default RecordDetailsRenderer;
|
|
12
22
|
//# sourceMappingURL=record-details.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-details.d.ts","sourceRoot":"","sources":["../../src/renderers/record-details.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"record-details.d.ts","sourceRoot":"","sources":["../../src/renderers/record-details.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AA0GpE,+EAA+E;AAC/E,wBAAgB,kCAAkC,IAAI,IAAI,CAEzD;AAmND,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;AA41BD;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,0BAA0B,CAA2D,CAAC;AAEnI,eAAe,qBAAqB,CAAC"}
|
|
@@ -5,6 +5,16 @@ export interface RecordHighlightsRendererProps {
|
|
|
5
5
|
className?: string;
|
|
6
6
|
[k: string]: any;
|
|
7
7
|
}
|
|
8
|
+
/**
|
|
9
|
+
* `record:highlights` with the spec's per-element `dataSource` binding honoured
|
|
10
|
+
* (objectui#12294). Unbound, the body reads the record page's record exactly as
|
|
11
|
+
* before; bound, it reads the FIRST row of the bound set. `recordBindingBlock`
|
|
12
|
+
* (`./recordBinding`, which states the semantics) wraps the body in the gate and
|
|
13
|
+
* the one-record scope, and passes the result through the declaration seam.
|
|
14
|
+
*
|
|
15
|
+
* Wraps the EXPORTED name, as `record:related_list` does, so a host that
|
|
16
|
+
* imports this renderer directly gets the binding too.
|
|
17
|
+
*/
|
|
8
18
|
export declare const RecordHighlightsRenderer: React.FC<RecordHighlightsRendererProps>;
|
|
9
19
|
export default RecordHighlightsRenderer;
|
|
10
20
|
//# sourceMappingURL=record-highlights.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-highlights.d.ts","sourceRoot":"","sources":["../../src/renderers/record-highlights.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"record-highlights.d.ts","sourceRoot":"","sources":["../../src/renderers/record-highlights.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,kBAAkB,CAAC;AAUvE,MAAM,WAAW,6BAA6B;IAC5C,MAAM,CAAC,EAAE,8BAA8B,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;CAClB;AA+JD;;;;;;;;;GASG;AACH,eAAO,MAAM,wBAAwB,EAAE,KAAK,CAAC,EAAE,CAAC,6BAA6B,CAAiE,CAAC;AAE/I,eAAe,wBAAwB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-history.d.ts","sourceRoot":"","sources":["../../src/renderers/record-history.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"record-history.d.ts","sourceRoot":"","sources":["../../src/renderers/record-history.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQxE,MAAM,WAAW,0BAA0B;IACzC,MAAM,CAAC,EAAE;QACP,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;QACzB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,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;AAsGD,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,0BAA0B,CA8FtE,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAmDjE,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,
|
|
1
|
+
{"version":3,"file":"record-path.d.ts","sourceRoot":"","sources":["../../src/renderers/record-path.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAmDjE,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,CAkYhE,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
|
@@ -34,6 +34,16 @@ export interface RecordQuickActionsRendererProps {
|
|
|
34
34
|
className?: string;
|
|
35
35
|
[k: string]: any;
|
|
36
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* `record:quick_actions` with the spec's per-element `dataSource` binding honoured
|
|
39
|
+
* (objectui#12294). Unbound, the body reads the record page's record exactly as
|
|
40
|
+
* before; bound, it reads the FIRST row of the bound set. `recordBindingBlock`
|
|
41
|
+
* (`./recordBinding`, which states the semantics) wraps the body in the gate and
|
|
42
|
+
* the one-record scope, and passes the result through the declaration seam.
|
|
43
|
+
*
|
|
44
|
+
* Wraps the EXPORTED name, as `record:related_list` does, so a host that
|
|
45
|
+
* imports this renderer directly gets the binding too.
|
|
46
|
+
*/
|
|
37
47
|
export declare const RecordQuickActionsRenderer: React.FC<RecordQuickActionsRendererProps>;
|
|
38
48
|
export default RecordQuickActionsRenderer;
|
|
39
49
|
//# sourceMappingURL=record-quick-actions.d.ts.map
|
|
@@ -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;
|
|
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;AAgB1B,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjE,OAAO,EAAsB,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAkEpF,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;;;;;;;;;;;;;;;;;WAiBG;QACH,IAAI,CAAC,EAAE,kBAAkB,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;AAkYD;;;;;;;;;GASG;AACH,eAAO,MAAM,0BAA0B,EAAE,KAAK,CAAC,EAAE,CAAC,+BAA+B,CAAsE,CAAC;AAExJ,eAAe,0BAA0B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-reference-rail.d.ts","sourceRoot":"","sources":["../../src/renderers/record-reference-rail.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"record-reference-rail.d.ts","sourceRoot":"","sources":["../../src/renderers/record-reference-rail.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAY1B,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;;;;;;;;;;;;;;;;;;;;;;;;;;;WA2BG;QACH,UAAU,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,kBAAkB,EAAE,CAAA;SAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACtE,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;KAClB,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;CAClB;AASD;;;;;;;GAOG;AACH,eAAO,MAAM,4BAA4B,IAAI,CAAC;AA6H9C,eAAO,MAAM,2BAA2B,EAAE,KAAK,CAAC,EAAE,CAAC,gCAAgC,CA6elF,CAAC;AAEF,eAAe,2BAA2B,CAAC"}
|
|
@@ -59,11 +59,21 @@ export interface RecordRelatedListRendererProps {
|
|
|
59
59
|
'data-obj-type'?: string;
|
|
60
60
|
}
|
|
61
61
|
/**
|
|
62
|
-
* `record:related_list
|
|
63
|
-
* onto the keys the body reads (objectstack#6953).
|
|
62
|
+
* `record:related_list`, with its TWO bindings (ruling B on objectui#12296):
|
|
64
63
|
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
64
|
+
* - the PARENT record — `parentDataSource`, the spec row's member, read by
|
|
65
|
+
* {@link ParentRecordBinding}: the first row of the binding by its `sort`
|
|
66
|
+
* becomes the record context the body reads, and no row is a loud absence.
|
|
67
|
+
* Absent, the parent is the record page's record context, as it always was;
|
|
68
|
+
* - the CHILD rows — the node's `dataSource`, mapped onto the keys the body
|
|
69
|
+
* reads by {@link RecordRelatedListChildRows}. It keeps its published
|
|
70
|
+
* meaning and is never read as the parent.
|
|
71
|
+
*
|
|
72
|
+
* The parent scope sits OUTSIDE the child gate because the child gate and the
|
|
73
|
+
* body read the parent's record context (its id, its row, its adapter).
|
|
74
|
+
*
|
|
75
|
+
* The gates wrap the EXPORTED name rather than being added at the registration
|
|
76
|
+
* site, so a host that imports this renderer directly gets both bindings too — a
|
|
67
77
|
* block bound under one entry point and unbound under another is the same
|
|
68
78
|
* "declared but not reached" shape in miniature.
|
|
69
79
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-related-list.d.ts","sourceRoot":"","sources":["../../src/renderers/record-related-list.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"record-related-list.d.ts","sourceRoot":"","sources":["../../src/renderers/record-related-list.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAc1B,OAAO,EAIL,KAAK,uBAAuB,EAC7B,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,kBAAkB,CAAC;AAgGxE,MAAM,WAAW,8BAA8B;IAC7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmCG;IACH,MAAM,CAAC,EAAE,IAAI,CAAC,+BAA+B,EAAE,YAAY,CAAC,GAC1D,OAAO,CAAC,IAAI,CAAC,+BAA+B,EAAE,YAAY,CAAC,CAAC,GAAG;QAC7D;;;;;WAKG;QACH,UAAU,CAAC,EAAE,uBAAuB,CAAC;KACtC,CAAC;IACJ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAylBD;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,yBAAyB,EAAE,KAAK,CAAC,EAAE,CAAC,8BAA8B,CAkB7E,CAAC;AAEH,eAAe,yBAAyB,CAAC"}
|
|
@@ -39,22 +39,28 @@ export declare const DEFAULT_ACTIVITY_LIMIT = 20;
|
|
|
39
39
|
* ADR-0052 §5b.2 `activityMilestones[].type` is applied verbatim by
|
|
40
40
|
* plugin-audit's `audit-writers.ts` (`if (milestone.type) activityType =
|
|
41
41
|
* milestone.type`). That is how `completed` is produced, and it is a general
|
|
42
|
-
* door, not a special case.
|
|
42
|
+
* door, not a special case. A row that door wrote also carries
|
|
43
|
+
* `metadata.kind: 'milestone'`, and the mapper overrides this table's
|
|
44
|
+
* `completed` entry for it: see {@link MILESTONE_ACTIVITY_FEED_TYPE}
|
|
45
|
+
* (objectui#12106).
|
|
43
46
|
*
|
|
44
47
|
* So `scheduled` is a value that is written, stored and queryable while being
|
|
45
48
|
* undeclared upstream. Dropping it was not a decision this map made; it was the
|
|
46
|
-
* absence of one. Its producer is HotCRM's
|
|
47
|
-
* (`src/actions/global.actions.ts`
|
|
48
|
-
* 'completed' : 'scheduled'`),
|
|
49
|
-
* `
|
|
50
|
-
*
|
|
49
|
+
* absence of one. Its producer is HotCRM's activity-action factory
|
|
50
|
+
* (`src/sales/actions/activity-actions.ts`, once `src/actions/global.actions.ts`
|
|
51
|
+
* — `type: EVENT_STATUS === 'held' ? 'completed' : 'scheduled'`), which builds
|
|
52
|
+
* `log_call`, `log_meeting` and `schedule_meeting` for `crm_lead`,
|
|
53
|
+
* `crm_contact`, `crm_account`, `crm_opportunity` and `crm_case`: the held
|
|
54
|
+
* branch reached the timeline, the scheduled branch never did.
|
|
51
55
|
*
|
|
52
56
|
* `scheduled` → `event` is the semantic pairing and it is what makes the
|
|
53
|
-
* declared `event` feed type reachable at all.
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
* `
|
|
57
|
-
*
|
|
57
|
+
* declared `event` feed type reachable at all. Both branches of that producer
|
|
58
|
+
* show by default: a not-yet-held meeting is `scheduled` → `event`, because an
|
|
59
|
+
* upcoming meeting is the part of a timeline you still act on; a held one is
|
|
60
|
+
* `completed` → `task`, and shows because it is a LOGGED INTERACTION, a `task`
|
|
61
|
+
* item that points at the record it was logged as (objectui#12228, see
|
|
62
|
+
* {@link isLoggedInteraction}). Until objectui#12228 the held branch was hidden
|
|
63
|
+
* unless `showCompleted`.
|
|
58
64
|
*
|
|
59
65
|
* ## The vocabulary is OPEN — ruled. Do NOT restore set-equality.
|
|
60
66
|
*
|
|
@@ -110,6 +116,31 @@ export declare const ACTIVITY_TYPE_TO_FEED_TYPE: Readonly<Record<string, FeedIte
|
|
|
110
116
|
* names each one so somebody can.
|
|
111
117
|
*/
|
|
112
118
|
export declare const UNMAPPED_ACTIVITY_FEED_TYPE: FeedItemType;
|
|
119
|
+
/**
|
|
120
|
+
* The feed type a milestone row renders as when its `type` would otherwise land
|
|
121
|
+
* on a feed type `showCompleted` hides (objectui#12106).
|
|
122
|
+
*
|
|
123
|
+
* Today that is a `completed` row that a milestone fired, such as "Case
|
|
124
|
+
* resolved", or a task's own "Task completed" on that task's page. Triage
|
|
125
|
+
* ruled route B: a milestone is not a completed activity, so it shows whatever
|
|
126
|
+
* `showCompleted` says. `showCompleted` keeps its spec meaning ("Include
|
|
127
|
+
* completed activities") for every row without the marker.
|
|
128
|
+
*
|
|
129
|
+
* `system`, not `task` with an exemption, because every other reader of the
|
|
130
|
+
* feed type then stays right with no new member on `FeedItem`:
|
|
131
|
+
*
|
|
132
|
+
* - `filterMode: 'tasks_only'` and `types: ['task']` keep meaning tasks. A
|
|
133
|
+
* case milestone is not one.
|
|
134
|
+
* - {@link COMPLETED_FEED_TYPES} stays exact: `task` is still produced only by
|
|
135
|
+
* completed activities.
|
|
136
|
+
* - The icon and colour are the ones every other author-typed milestone
|
|
137
|
+
* already gets (`escalated` reaches `system` through
|
|
138
|
+
* {@link UNMAPPED_ACTIVITY_FEED_TYPE}), and the ones app-shell's
|
|
139
|
+
* `ActivityItem` surface gives `completed`.
|
|
140
|
+
* - A host feed arrives already mapped, so the rule needs nothing carried
|
|
141
|
+
* past this module.
|
|
142
|
+
*/
|
|
143
|
+
export declare const MILESTONE_ACTIVITY_FEED_TYPE: FeedItemType;
|
|
113
144
|
/**
|
|
114
145
|
* Feed kinds an ObjectUI surface produces WITHOUT going through
|
|
115
146
|
* {@link ACTIVITY_TYPE_TO_FEED_TYPE}.
|
|
@@ -338,6 +369,27 @@ export declare function describeRefusedFeedLimit(block: string, authored: unknow
|
|
|
338
369
|
export declare function activityTimestamp(row: SysActivityRow): string;
|
|
339
370
|
/** Test seam: forget which unknown types have already been warned about. */
|
|
340
371
|
export declare function resetUnknownActivityTypeWarnings(): void;
|
|
372
|
+
/**
|
|
373
|
+
* The name of whoever acted on a `sys_activity` row, or `null` when the row
|
|
374
|
+
* names nobody this viewer can name (objectui#12067). One reading for every
|
|
375
|
+
* surface that shows these rows: `record:history`, and through
|
|
376
|
+
* {@link activityRowToFeedItem} the `record:activity` block and the console
|
|
377
|
+
* record page's merged feed.
|
|
378
|
+
*
|
|
379
|
+
* 1. `actor_name`, when it is non-blank. It is the snapshot the writer took at
|
|
380
|
+
* the time of the action, so it wins even over the user's current name.
|
|
381
|
+
* 2. `actor_id`, a lookup to `sys_user`. A read that passes
|
|
382
|
+
* `$expand: ['actor_id']` gets the user's record in place of the id, and
|
|
383
|
+
* that record's `name` (`sys_user`'s declared name field) names the actor.
|
|
384
|
+
* The engine expands every row of a page in one batched read. This is the
|
|
385
|
+
* row the `@objectstack/*` 17.7.0 writer leaves: `actor_id` set and no
|
|
386
|
+
* `actor_name` (objectstack#22510 fills `actor_name` from then on).
|
|
387
|
+
* 3. `null`, so the caller shows its existing fallback. That covers a row
|
|
388
|
+
* with neither, and an `actor_id` the engine kept as the bare id because
|
|
389
|
+
* this viewer may not read that user or the user is gone. A raw id is
|
|
390
|
+
* never shown as a name.
|
|
391
|
+
*/
|
|
392
|
+
export declare function activityActorName(row: SysActivityRow): string | null;
|
|
341
393
|
/**
|
|
342
394
|
* One `sys_activity` row → one {@link FeedItem}, or `null` when the row is not
|
|
343
395
|
* record activity (see {@link ACTIVITY_TYPE_TO_FEED_TYPE}).
|
|
@@ -354,6 +406,12 @@ export declare function resetUnknownActivityTypeWarnings(): void;
|
|
|
354
406
|
* {@link UNMAPPED_ACTIVITY_FEED_TYPE} and says so once. It used to return
|
|
355
407
|
* `null` here, which made every extended value invisible — the same outcome
|
|
356
408
|
* objectui#5840 was filed for, reached by a different route.
|
|
409
|
+
*
|
|
410
|
+
* One override sits on top of the first outcome (objectui#12106): a row whose
|
|
411
|
+
* type maps to a feed type `showCompleted` hides, but which carries the
|
|
412
|
+
* milestone marker, renders as {@link MILESTONE_ACTIVITY_FEED_TYPE}. A
|
|
413
|
+
* milestone is not a completed activity. A row without the marker is mapped
|
|
414
|
+
* exactly as before.
|
|
357
415
|
*/
|
|
358
416
|
export declare function activityRowToFeedItem(row: SysActivityRow, systemActorLabel: string): FeedItem | null;
|
|
359
417
|
/** 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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAIH,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
|
|
1
|
+
{"version":3,"file":"recordActivityFeed.d.ts","sourceRoot":"","sources":["../../src/renderers/recordActivityFeed.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,180 @@
|
|
|
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
|
+
* The ONE-RECORD binding of the record blocks (objectui#12294).
|
|
9
|
+
*
|
|
10
|
+
* `PageComponentSchema.dataSource` is the spec's per-element data binding, and
|
|
11
|
+
* the spec declares it on every page component ("Overrides the page-level
|
|
12
|
+
* object context for this block"). `ElementDataSourceGate` (`@object-ui/react`)
|
|
13
|
+
* honours it for the LIST-shaped blocks by mapping the binding onto keys the
|
|
14
|
+
* block then queries with. The record blocks query nothing: they read the row
|
|
15
|
+
* the record page put in `RecordContextProvider`. So on an `app` page, with no
|
|
16
|
+
* record page around them, `record:details`, `record:highlights` and
|
|
17
|
+
* `record:quick_actions` drew an empty box or "no actions configured" even
|
|
18
|
+
* with a binding that returns one row.
|
|
19
|
+
*
|
|
20
|
+
* This module is the one-record consumer those three share, and
|
|
21
|
+
* {@link recordBindingBlock} is the one way a record block takes it. The gate
|
|
22
|
+
* still resolves the binding (the named view, the AND-combined filter, the
|
|
23
|
+
* sort, and every configuration panel the family draws), so a record block's
|
|
24
|
+
* binding means exactly what it means on a list block. What this adds is the
|
|
25
|
+
* last hop: read the bound set, take its FIRST row, and provide that row
|
|
26
|
+
* through the existing `RecordContextProvider` — so the block bodies are
|
|
27
|
+
* unchanged and there is no second rendering path inside a block.
|
|
28
|
+
*
|
|
29
|
+
* ## Semantics of the bound set (the card's, verbatim in intent)
|
|
30
|
+
*
|
|
31
|
+
* - 0 rows → the block's authored `emptyState` when it declares one (see
|
|
32
|
+
* "The authored empty state" below). Without one, the block is mounted under
|
|
33
|
+
* a record context that names the bound object and NO record, so each block
|
|
34
|
+
* draws what it draws for a record that is not there: `record:details` its
|
|
35
|
+
* "record not found" state, `record:highlights` nothing,
|
|
36
|
+
* `record:quick_actions` its empty bar. A row the caller may not read never
|
|
37
|
+
* comes back from the server, and a read the server refuses outright
|
|
38
|
+
* (`classifyLoadError` → `forbidden`) is treated the same, so "absent" and
|
|
39
|
+
* "not yours to read" are indistinguishable — and the authored empty state
|
|
40
|
+
* is drawn for both.
|
|
41
|
+
* - 1 row → that record.
|
|
42
|
+
* - more than one row → the FIRST by the binding's `sort`. Only one row is
|
|
43
|
+
* ever asked for (`$top: 1`): the first row of the authored `limit` and the
|
|
44
|
+
* first row of a one-row read are the same row under the same `sort`.
|
|
45
|
+
* `objectui validate` warns on a record block whose binding has no
|
|
46
|
+
* `limit: 1`, so an author says which one they mean.
|
|
47
|
+
*
|
|
48
|
+
* The row is read with the adapter the page already uses, so under the
|
|
49
|
+
* caller's identity: nothing here widens what the server serves.
|
|
50
|
+
*
|
|
51
|
+
* ## The authored empty state (objectui#12932)
|
|
52
|
+
*
|
|
53
|
+
* The spec declares `emptyState` on the three bound record blocks
|
|
54
|
+
* (`RecordDetailsProps`, `RecordHighlightsProps`, `RecordQuickActionsProps`;
|
|
55
|
+
* objectstack#24266), the list view's own `EmptyStateSchema` by reference:
|
|
56
|
+
* `{ title, message, icon, link }`. It is drawn on ONE condition, the spec's:
|
|
57
|
+
* the block carries a `dataSource` binding and the settled read answered no
|
|
58
|
+
* row. {@link BoundRecordEmptyState} draws it IN PLACE of the block body, with
|
|
59
|
+
* the pieces `ObjectGrid` draws its authored empty state with —
|
|
60
|
+
* `DataEmptyState`, `resolveIcon` for the `icon`, the spec's own
|
|
61
|
+
* `resolveI18nLabel` for `title` and `message` against the display locale,
|
|
62
|
+
* and the one shared `EmptyStateLink` for `link` — so one key draws one
|
|
63
|
+
* picture on every surface that takes it.
|
|
64
|
+
*
|
|
65
|
+
* It is NOT drawn while the read is in flight (the loading state), for a read
|
|
66
|
+
* that failed (the error panel stays the error panel), for a bound row that is
|
|
67
|
+
* there but leaves the block nothing to show, or on an unbound block: an
|
|
68
|
+
* unbound block reads the record page's record and never reaches this module's
|
|
69
|
+
* read. A block that declares none keeps its own no-record state above.
|
|
70
|
+
*
|
|
71
|
+
* ## The record page path is untouched
|
|
72
|
+
*
|
|
73
|
+
* {@link BoundRecordScope} renders its children AS THEY ARE when the block
|
|
74
|
+
* carries no binding: no provider, no element, no fetch. A record page's own
|
|
75
|
+
* `RecordContextProvider` therefore still reaches the block, byte-identically.
|
|
76
|
+
* With a binding, the binding wins, as the spec says it does: the bound record
|
|
77
|
+
* shadows the page record for this block only.
|
|
78
|
+
*
|
|
79
|
+
* ## Freshness: the data-invalidation bus (objectstack#4444's bar)
|
|
80
|
+
*
|
|
81
|
+
* A fetching record context that does not listen to the bus shows a STALE
|
|
82
|
+
* record that looks correct after a write elsewhere on the page — harder to
|
|
83
|
+
* notice than an empty one. So the read is keyed on `useDataInvalidation` for
|
|
84
|
+
* the bound OBJECT, the same bus `RecordDetailView` keys its record read on.
|
|
85
|
+
* Object-scoped, not row-scoped, because the binding is a query: a write to any
|
|
86
|
+
* row of the object can change which row is first. A refetch replaces the row
|
|
87
|
+
* in place (no remount), and an equal answer is not republished as a new object
|
|
88
|
+
* (AGENTS.md #10).
|
|
89
|
+
*
|
|
90
|
+
* ## What a bound block does NOT join
|
|
91
|
+
*
|
|
92
|
+
* A bound block sits inside the record page's providers when it is placed on a
|
|
93
|
+
* record page, and two of them are about THAT page's record:
|
|
94
|
+
*
|
|
95
|
+
* - the page's inline-edit session (`InlineEditProvider`): a bound
|
|
96
|
+
* `record:details` or `record:highlights` joining it would put the bound
|
|
97
|
+
* record's fields into the page record's draft, and the page's Save bar
|
|
98
|
+
* would write them to the page record. The bound scope mounts a read-only
|
|
99
|
+
* session instead (`canEdit: false`), which is also what an `app` page,
|
|
100
|
+
* with no session at all, already gives these blocks;
|
|
101
|
+
* - the page's highlight-field registry (`HighlightFieldsProvider`): a bound
|
|
102
|
+
* `record:highlights` would otherwise hide fields from the PAGE record's
|
|
103
|
+
* `record:details`. The bound scope gets its own registry.
|
|
104
|
+
*
|
|
105
|
+
* ## The PARENT binding of `record:related_list` ({@link ParentRecordBinding})
|
|
106
|
+
*
|
|
107
|
+
* `record:related_list` is the one record block with two bindings (ruling B on
|
|
108
|
+
* objectui#12296): its node-level `dataSource` is the CHILD rows the list
|
|
109
|
+
* draws (objectstack#6953), and the spec row's `parentDataSource` is the record
|
|
110
|
+
* the list hangs off. The parent binding is read here, by the same one-record
|
|
111
|
+
* read: the same gate, the same first row by `sort`, the same invalidation bus,
|
|
112
|
+
* provided through the same `RecordContextProvider` the related-list body
|
|
113
|
+
* already reads. It differs from the three blocks above in ONE place, and the
|
|
114
|
+
* spec's describe is why: no row is a LOUD ABSENCE drawn in the block's place,
|
|
115
|
+
* never an empty record context — under one the list would query nothing and
|
|
116
|
+
* draw an empty list, which reads as "this record has no related records", a
|
|
117
|
+
* wrong fact in the silent direction.
|
|
118
|
+
*/
|
|
119
|
+
import * as React from 'react';
|
|
120
|
+
/**
|
|
121
|
+
* Wrap a record block's body so its `dataSource` binding supplies its record,
|
|
122
|
+
* and declare the key through the seam.
|
|
123
|
+
*
|
|
124
|
+
* The one way a record block takes the binding, so a fourth one cannot take it
|
|
125
|
+
* differently: `ElementDataSourceGate` resolves the binding (and draws the
|
|
126
|
+
* family's panels for an unresolvable view, a refused filter, or no adapter),
|
|
127
|
+
* {@link BoundRecordScope} reads and provides the first row, and
|
|
128
|
+
* `elementDataSourceBlock` makes the registration publish the injected
|
|
129
|
+
* `dataSource` input — from `@object-ui/core`, the import source
|
|
130
|
+
* `check:element-data-source-declaration` holds every call site to.
|
|
131
|
+
*
|
|
132
|
+
* `requiresDataSource` is set for a BOUND block only: a bound block with no
|
|
133
|
+
* adapter has nothing to read its row with, and says so through the family's
|
|
134
|
+
* no-data-source panel. An unbound block is the record page path, left as it was.
|
|
135
|
+
*
|
|
136
|
+
* @param Body The block's renderer, unchanged: it reads `useRecordContext()`.
|
|
137
|
+
* @param blockKey The registry key (`record:details`, …); the panel test ids are
|
|
138
|
+
* derived from it the way `record-related-list` spells its own.
|
|
139
|
+
*/
|
|
140
|
+
export declare function recordBindingBlock<RendererProps extends {
|
|
141
|
+
schema?: unknown;
|
|
142
|
+
}>(Body: React.ComponentType<RendererProps>, blockKey: string): React.FC<RendererProps>;
|
|
143
|
+
export interface ParentRecordBindingProps {
|
|
144
|
+
/**
|
|
145
|
+
* The PARENT binding as authored — `record:related_list`'s
|
|
146
|
+
* `parentDataSource`, the spec's `ElementDataSourceSchema` by reference.
|
|
147
|
+
* Anything that is not a binding the gate would resolve (absent included)
|
|
148
|
+
* leaves the children exactly as they are.
|
|
149
|
+
*/
|
|
150
|
+
binding: unknown;
|
|
151
|
+
/** The block's registry key, named in the no-adapter panel. */
|
|
152
|
+
blockKey: string;
|
|
153
|
+
/** `data-testid` stem for this scope's states (`<stem>-loading-record`, …). */
|
|
154
|
+
testId: string;
|
|
155
|
+
/** Heading of the panels a binding that cannot be read draws. */
|
|
156
|
+
errorTitle?: string;
|
|
157
|
+
/** What the block draws in its own place when no row answers: the loud absence. */
|
|
158
|
+
absent: React.ReactNode;
|
|
159
|
+
children: React.ReactNode;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* The parent record of a block, from a binding of its own (ruling B on
|
|
163
|
+
* objectui#12296, the spec's `RecordRelatedListProps.parentDataSource`).
|
|
164
|
+
*
|
|
165
|
+
* Unbound → the children as they are, so the record page's own context still
|
|
166
|
+
* reaches the block, byte-identically. Bound → the binding is resolved by
|
|
167
|
+
* `ElementDataSourceGate` (a named view, the AND-combined filter, the sort, and
|
|
168
|
+
* the family's panels for a view that does not resolve, a refused filter, or no
|
|
169
|
+
* adapter), its FIRST row is read by {@link BoundRecordProvider} — the one
|
|
170
|
+
* read the three one-record blocks take, keyed on the same invalidation bus —
|
|
171
|
+
* and provided through `RecordContextProvider` as the children's record. No row
|
|
172
|
+
* draws `absent` instead of the children.
|
|
173
|
+
*
|
|
174
|
+
* The gate is handed the parent binding ALONE, as a node's `dataSource`, and
|
|
175
|
+
* never the block's own schema: with the schema, the gate's filter and sort
|
|
176
|
+
* mapping would compose the block's own `filter` and `sort` — the CHILD list's
|
|
177
|
+
* — into the parent's query.
|
|
178
|
+
*/
|
|
179
|
+
export declare function ParentRecordBinding({ binding, blockKey, testId, errorTitle, absent, children, }: ParentRecordBindingProps): React.ReactElement;
|
|
180
|
+
//# sourceMappingURL=recordBinding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recordBinding.d.ts","sourceRoot":"","sources":["../../src/renderers/recordBinding.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqHG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AA+C/B;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,SAAS;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,EAC3E,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC,aAAa,CAAC,EACxC,QAAQ,EAAE,MAAM,GACf,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,CA0BzB;AA6FD,MAAM,WAAW,wBAAwB;IACvC;;;;;OAKG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,MAAM,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mFAAmF;IACnF,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,OAAO,EACP,QAAQ,EACR,MAAM,EACN,UAAU,EACV,MAAM,EACN,QAAQ,GACT,EAAE,wBAAwB,GAAG,KAAK,CAAC,YAAY,CAgC/C"}
|