@ai-matrx/detail 0.1.176 → 0.1.178
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 +20 -2
- package/dist/DetailLinked-57SRZLYJ.js +18 -0
- package/dist/DetailLinked-57SRZLYJ.js.map +1 -0
- package/dist/{chunk-D62JZJMB.js → chunk-OZZG6JAG.js} +1 -1
- package/dist/{chunk-D62JZJMB.js.map → chunk-OZZG6JAG.js.map} +1 -1
- package/dist/{host-DTqudYIw.d.cts → host-B6yGRMky.d.cts} +7 -2
- package/dist/{host-DTqudYIw.d.ts → host-B6yGRMky.d.ts} +7 -2
- package/dist/react.cjs +156 -117
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +2 -2
- package/dist/react.d.ts +2 -2
- package/dist/react.js +32 -28
- package/dist/react.js.map +1 -1
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +1 -1
- package/dist/testing.d.ts +1 -1
- package/dist/testing.js +1 -1
- package/package.json +12 -14
package/dist/react.cjs
CHANGED
|
@@ -4,6 +4,14 @@ var __defProp = Object.defineProperty;
|
|
|
4
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
6
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __esm = (fn, res, err) => function __init() {
|
|
8
|
+
if (err) throw err[0];
|
|
9
|
+
try {
|
|
10
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
11
|
+
} catch (e) {
|
|
12
|
+
throw err = [e], e;
|
|
13
|
+
}
|
|
14
|
+
};
|
|
7
15
|
var __export = (target, all) => {
|
|
8
16
|
for (var name in all)
|
|
9
17
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -18,6 +26,30 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
26
|
};
|
|
19
27
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
28
|
|
|
29
|
+
// src/react/DetailLinked.tsx
|
|
30
|
+
var DetailLinked_exports = {};
|
|
31
|
+
__export(DetailLinked_exports, {
|
|
32
|
+
default: () => DetailLinked
|
|
33
|
+
});
|
|
34
|
+
function DetailLinked({ token, id, label, wanted, heading }) {
|
|
35
|
+
const tokens = wanted.filter(import_contracts.isEntityTypeToken);
|
|
36
|
+
if (tokens.length === 0) return null;
|
|
37
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("section", { className: "space-y-2", "data-detail-section": "associations", children: [
|
|
38
|
+
heading,
|
|
39
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react9.PrimaryEntityProvider, { value: { type: token, id, label }, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react9.AssociationCardGrid, { tokens }) })
|
|
40
|
+
] });
|
|
41
|
+
}
|
|
42
|
+
var import_contracts, import_react9, import_jsx_runtime4;
|
|
43
|
+
var init_DetailLinked = __esm({
|
|
44
|
+
"src/react/DetailLinked.tsx"() {
|
|
45
|
+
"use strict";
|
|
46
|
+
"use client";
|
|
47
|
+
import_contracts = require("@ai-matrx/associations/contracts");
|
|
48
|
+
import_react9 = require("@ai-matrx/associations/react");
|
|
49
|
+
import_jsx_runtime4 = require("react/jsx-runtime");
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
|
|
21
53
|
// src/react/index.ts
|
|
22
54
|
var react_exports = {};
|
|
23
55
|
__export(react_exports, {
|
|
@@ -466,9 +498,7 @@ function useDetailCore(data, presentation, options) {
|
|
|
466
498
|
onNext: hasNext ? () => openNeighbour(1) : null,
|
|
467
499
|
// 🚨 NEW-22 — Cmd+Enter is one of the three promised bindings; on a record
|
|
468
500
|
// with no editor open it ANSWERS rather than doing nothing in silence.
|
|
469
|
-
onSaveUnavailable: () => host.notify.error(
|
|
470
|
-
`There is nothing to save on this ${typeLabel.toLowerCase()} \u2014 nothing here is being edited. Changes to the record are made where it lives.`
|
|
471
|
-
)
|
|
501
|
+
onSaveUnavailable: () => host.notify.error("Nothing to save", { description: `Edit this ${typeLabel.toLowerCase()} where it lives` })
|
|
472
502
|
});
|
|
473
503
|
return {
|
|
474
504
|
ref,
|
|
@@ -532,9 +562,7 @@ function useOpenDetail(warmType) {
|
|
|
532
562
|
} catch (error) {
|
|
533
563
|
const message = error instanceof Error ? error.message : String(error);
|
|
534
564
|
console.error(`[detail] ${DETAIL_PRESENTATION_KNOB} could not be resolved`, error);
|
|
535
|
-
host.notify.error(
|
|
536
|
-
`Your detail presentation setting could not be read (${DETAIL_PRESENTATION_KNOB}: ${message}). Opening as a window until it can be read; an administrator can register or repair the setting.`
|
|
537
|
-
);
|
|
565
|
+
host.notify.error("Opened as a window", { description: "Detail setting couldn't be read" });
|
|
538
566
|
presentation = "window";
|
|
539
567
|
}
|
|
540
568
|
}
|
|
@@ -654,7 +682,7 @@ function useDetailMenuActions(core) {
|
|
|
654
682
|
onSelect: () => {
|
|
655
683
|
void host.copyText(core.ref.id).then((ok) => {
|
|
656
684
|
if (ok) host.notify.success("Record id copied");
|
|
657
|
-
else host.notify.error("
|
|
685
|
+
else host.notify.error("Record id not copied");
|
|
658
686
|
});
|
|
659
687
|
}
|
|
660
688
|
}
|
|
@@ -667,7 +695,7 @@ function DetailActions({ core, optional = "inline" }) {
|
|
|
667
695
|
const copyId = async () => {
|
|
668
696
|
const ok = await host.copyText(core.ref.id);
|
|
669
697
|
if (!ok) {
|
|
670
|
-
host.notify.error("
|
|
698
|
+
host.notify.error("Record id not copied");
|
|
671
699
|
return;
|
|
672
700
|
}
|
|
673
701
|
host.notify.success("Record id copied");
|
|
@@ -811,10 +839,9 @@ function DetailActions({ core, optional = "inline" }) {
|
|
|
811
839
|
}
|
|
812
840
|
|
|
813
841
|
// src/react/DetailBody.tsx
|
|
814
|
-
var
|
|
842
|
+
var import_react10 = require("react");
|
|
815
843
|
var import_design_system3 = require("@ai-matrx/design-system");
|
|
816
|
-
var
|
|
817
|
-
var import_react10 = require("@ai-matrx/associations/react");
|
|
844
|
+
var import_contracts2 = require("@ai-matrx/associations/contracts");
|
|
818
845
|
var import_format = require("@ai-matrx/kit/format");
|
|
819
846
|
|
|
820
847
|
// src/format.ts
|
|
@@ -861,9 +888,9 @@ function DetailPresentationPane({ core }) {
|
|
|
861
888
|
});
|
|
862
889
|
if (result.ok) {
|
|
863
890
|
setState({ status: "saved" });
|
|
864
|
-
host.notify.success(
|
|
865
|
-
forThisType ? `Every ${core.typeLabel.toLowerCase()}
|
|
866
|
-
);
|
|
891
|
+
host.notify.success("Saved", {
|
|
892
|
+
description: forThisType ? `Every ${core.typeLabel.toLowerCase()} opens as ${WORD[pending]}` : `Details open as ${WORD[pending]}`
|
|
893
|
+
});
|
|
867
894
|
} else {
|
|
868
895
|
setState({ status: "refused", reason: result.reason });
|
|
869
896
|
}
|
|
@@ -1025,11 +1052,12 @@ function DetailPresentationPane({ core }) {
|
|
|
1025
1052
|
// src/react/DetailBody.tsx
|
|
1026
1053
|
var import_icons7 = require("@ai-matrx/design-system/icons");
|
|
1027
1054
|
var import_outbound_react = require("@ai-matrx/kit/outbound-react");
|
|
1028
|
-
var
|
|
1055
|
+
var import_error_sentence = require("@ai-matrx/design-system/error-sentence");
|
|
1056
|
+
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
1029
1057
|
var SLOW_LOAD_NOTICE_MS = 6e3;
|
|
1030
1058
|
function useSlowLoadNotice(active, key) {
|
|
1031
|
-
const [slow, setSlow] = (0,
|
|
1032
|
-
(0,
|
|
1059
|
+
const [slow, setSlow] = (0, import_react10.useState)(false);
|
|
1060
|
+
(0, import_react10.useEffect)(() => {
|
|
1033
1061
|
if (!active) {
|
|
1034
1062
|
setSlow(false);
|
|
1035
1063
|
return void 0;
|
|
@@ -1041,7 +1069,7 @@ function useSlowLoadNotice(active, key) {
|
|
|
1041
1069
|
return slow;
|
|
1042
1070
|
}
|
|
1043
1071
|
function SectionHeading({ icon, children }) {
|
|
1044
|
-
return /* @__PURE__ */ (0,
|
|
1072
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("h3", { className: "flex items-center gap-1.5 text-[11px] font-medium uppercase tracking-wide text-muted-foreground", children: [
|
|
1045
1073
|
icon,
|
|
1046
1074
|
children
|
|
1047
1075
|
] });
|
|
@@ -1050,8 +1078,8 @@ function Notice({
|
|
|
1050
1078
|
tone,
|
|
1051
1079
|
children
|
|
1052
1080
|
}) {
|
|
1053
|
-
return /* @__PURE__ */ (0,
|
|
1054
|
-
/* @__PURE__ */ (0,
|
|
1081
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "flex flex-col items-center gap-2 py-8 text-center", children: [
|
|
1082
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
1055
1083
|
AlertCircleIcon,
|
|
1056
1084
|
{
|
|
1057
1085
|
className: (0, import_design_system3.cn)(
|
|
@@ -1062,7 +1090,7 @@ function Notice({
|
|
|
1062
1090
|
)
|
|
1063
1091
|
}
|
|
1064
1092
|
),
|
|
1065
|
-
/* @__PURE__ */ (0,
|
|
1093
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "max-w-prose text-sm text-muted-foreground", children })
|
|
1066
1094
|
] });
|
|
1067
1095
|
}
|
|
1068
1096
|
var GRANT_WORD = {
|
|
@@ -1083,7 +1111,7 @@ function deriveOpenAtSourceLabel(source) {
|
|
|
1083
1111
|
}
|
|
1084
1112
|
function HealthStrip({ health }) {
|
|
1085
1113
|
const ok = health.grant === "ok";
|
|
1086
|
-
const [refreshing, setRefreshing] = (0,
|
|
1114
|
+
const [refreshing, setRefreshing] = (0, import_react10.useState)(false);
|
|
1087
1115
|
const host = useDetailHost();
|
|
1088
1116
|
const refresh = async () => {
|
|
1089
1117
|
if (!health.onRefresh) return;
|
|
@@ -1091,14 +1119,12 @@ function HealthStrip({ health }) {
|
|
|
1091
1119
|
try {
|
|
1092
1120
|
await health.onRefresh();
|
|
1093
1121
|
} catch (error) {
|
|
1094
|
-
host.notify.error(
|
|
1095
|
-
`Refresh from ${health.source} failed: ${error instanceof Error ? error.message : String(error)}`
|
|
1096
|
-
);
|
|
1122
|
+
host.notify.error("Not refreshed", { description: `${health.source}: ${(0, import_error_sentence.peopleErrorSentence)(error, null, { card: true })}` });
|
|
1097
1123
|
} finally {
|
|
1098
1124
|
setRefreshing(false);
|
|
1099
1125
|
}
|
|
1100
1126
|
};
|
|
1101
|
-
return /* @__PURE__ */ (0,
|
|
1127
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
1102
1128
|
"div",
|
|
1103
1129
|
{
|
|
1104
1130
|
className: (0, import_design_system3.cn)(
|
|
@@ -1107,9 +1133,9 @@ function HealthStrip({ health }) {
|
|
|
1107
1133
|
),
|
|
1108
1134
|
"data-detail-health": true,
|
|
1109
1135
|
children: [
|
|
1110
|
-
ok ? /* @__PURE__ */ (0,
|
|
1111
|
-
/* @__PURE__ */ (0,
|
|
1112
|
-
ok ? null : /* @__PURE__ */ (0,
|
|
1136
|
+
ok ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ShieldCheckIcon, { className: "h-3.5 w-3.5 text-primary" }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ShieldAlertIcon, { className: "h-3.5 w-3.5 text-destructive" }),
|
|
1137
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "font-medium", children: health.source }),
|
|
1138
|
+
ok ? null : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
1113
1139
|
"span",
|
|
1114
1140
|
{
|
|
1115
1141
|
className: "rounded bg-destructive/10 px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-destructive",
|
|
@@ -1117,13 +1143,13 @@ function HealthStrip({ health }) {
|
|
|
1117
1143
|
children: GRANT_WORD[health.grant]
|
|
1118
1144
|
}
|
|
1119
1145
|
),
|
|
1120
|
-
health.lastRefreshedAt ? /* @__PURE__ */ (0,
|
|
1146
|
+
health.lastRefreshedAt ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { children: [
|
|
1121
1147
|
"Refreshed ",
|
|
1122
1148
|
formatWhen(health.lastRefreshedAt)
|
|
1123
|
-
] }) : /* @__PURE__ */ (0,
|
|
1124
|
-
health.grantDetail ? /* @__PURE__ */ (0,
|
|
1125
|
-
/* @__PURE__ */ (0,
|
|
1126
|
-
health.onRefresh ? /* @__PURE__ */ (0,
|
|
1149
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { children: "Never refreshed" }),
|
|
1150
|
+
health.grantDetail ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { children: health.grantDetail }) : null,
|
|
1151
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "ml-auto flex items-center gap-1", children: [
|
|
1152
|
+
health.onRefresh ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
1127
1153
|
"button",
|
|
1128
1154
|
{
|
|
1129
1155
|
type: "button",
|
|
@@ -1131,12 +1157,12 @@ function HealthStrip({ health }) {
|
|
|
1131
1157
|
disabled: refreshing,
|
|
1132
1158
|
className: "inline-flex h-6 items-center gap-1 rounded px-1.5 hover:bg-accent hover:text-foreground disabled:opacity-50 pointer-coarse:h-10",
|
|
1133
1159
|
children: [
|
|
1134
|
-
/* @__PURE__ */ (0,
|
|
1160
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_icons7.RefreshCwIcon, { className: (0, import_design_system3.cn)("h-3 w-3", refreshing && "animate-spin") }),
|
|
1135
1161
|
"Refresh"
|
|
1136
1162
|
]
|
|
1137
1163
|
}
|
|
1138
1164
|
) : null,
|
|
1139
|
-
!ok && health.onReconnect ? /* @__PURE__ */ (0,
|
|
1165
|
+
!ok && health.onReconnect ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
1140
1166
|
"button",
|
|
1141
1167
|
{
|
|
1142
1168
|
type: "button",
|
|
@@ -1145,13 +1171,13 @@ function HealthStrip({ health }) {
|
|
|
1145
1171
|
children: "Reconnect"
|
|
1146
1172
|
}
|
|
1147
1173
|
) : null,
|
|
1148
|
-
health.openAtSourceHref ? /* @__PURE__ */ (0,
|
|
1174
|
+
health.openAtSourceHref ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
1149
1175
|
import_outbound_react.OutboundLink,
|
|
1150
1176
|
{
|
|
1151
1177
|
href: health.openAtSourceHref,
|
|
1152
1178
|
className: "inline-flex h-6 items-center gap-1 rounded px-1.5 hover:bg-accent hover:text-foreground pointer-coarse:h-10",
|
|
1153
1179
|
children: [
|
|
1154
|
-
/* @__PURE__ */ (0,
|
|
1180
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_icons7.ExternalLinkIcon, { className: "h-3 w-3" }),
|
|
1155
1181
|
health.openAtSourceLabel ?? deriveOpenAtSourceLabel(health.source)
|
|
1156
1182
|
]
|
|
1157
1183
|
}
|
|
@@ -1169,16 +1195,16 @@ function FieldsSection({ core }) {
|
|
|
1169
1195
|
const RefCell = host.doors.RefCell;
|
|
1170
1196
|
const label = core.recordType?.label.toLowerCase() ?? "record";
|
|
1171
1197
|
if (!core.recordType) {
|
|
1172
|
-
return /* @__PURE__ */ (0,
|
|
1198
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Notice, { tone: "warn", children: `This is a ${core.ref.type} record. Nothing more about it is stored here yet, so there is nothing else to show. ${whatTheControlsDo(core)}` });
|
|
1173
1199
|
}
|
|
1174
1200
|
if (core.status === "loading") {
|
|
1175
|
-
return /* @__PURE__ */ (0,
|
|
1201
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(LoadingFields, { core, label });
|
|
1176
1202
|
}
|
|
1177
1203
|
if (core.status === "not-found") {
|
|
1178
1204
|
const sentence = `This ${label} couldn't be found \u2014 it may have been moved, deleted, or isn't shared with you.`;
|
|
1179
|
-
return /* @__PURE__ */ (0,
|
|
1205
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(Notice, { tone: "warn", children: [
|
|
1180
1206
|
sentence,
|
|
1181
|
-
/* @__PURE__ */ (0,
|
|
1207
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
1182
1208
|
import_design_system3.ErrorActions,
|
|
1183
1209
|
{
|
|
1184
1210
|
origin: "detail/DetailBody",
|
|
@@ -1190,24 +1216,24 @@ function FieldsSection({ core }) {
|
|
|
1190
1216
|
] });
|
|
1191
1217
|
}
|
|
1192
1218
|
if (core.status === "error") {
|
|
1193
|
-
return /* @__PURE__ */ (0,
|
|
1219
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(Notice, { tone: "error", children: [
|
|
1194
1220
|
`Couldn't load the details for this ${label}. ${core.errorMessage ?? ""}`.trim(),
|
|
1195
|
-
/* @__PURE__ */ (0,
|
|
1221
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system3.ErrorActions, { origin: "detail/DetailBody", operation: `Load this ${label}`, error: core.errorMessage })
|
|
1196
1222
|
] });
|
|
1197
1223
|
}
|
|
1198
1224
|
if (core.status === "none") {
|
|
1199
|
-
return /* @__PURE__ */ (0,
|
|
1225
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Notice, { tone: "muted", children: `Nothing more about this ${label} is stored here, so there is nothing else to show. ` + whatTheControlsDo(core) });
|
|
1200
1226
|
}
|
|
1201
1227
|
if (core.fields.length === 0) {
|
|
1202
|
-
return /* @__PURE__ */ (0,
|
|
1228
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "text-sm text-muted-foreground", children: "No additional fields to show." });
|
|
1203
1229
|
}
|
|
1204
|
-
return /* @__PURE__ */ (0,
|
|
1230
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("dl", { className: "grid grid-cols-1 gap-x-4 gap-y-2.5", children: core.fields.map((field) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
1205
1231
|
"div",
|
|
1206
1232
|
{
|
|
1207
1233
|
className: "flex flex-col gap-0.5 border-b border-border/40 pb-2 last:border-b-0",
|
|
1208
1234
|
children: [
|
|
1209
|
-
/* @__PURE__ */ (0,
|
|
1210
|
-
/* @__PURE__ */ (0,
|
|
1235
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("dt", { className: "text-[11px] font-medium uppercase tracking-wide text-muted-foreground", children: field.label }),
|
|
1236
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
1211
1237
|
"dd",
|
|
1212
1238
|
{
|
|
1213
1239
|
className: (0, import_design_system3.cn)(
|
|
@@ -1219,7 +1245,7 @@ function FieldsSection({ core }) {
|
|
|
1219
1245
|
// `field.ref.id` alone, so a field whose text was "Brightwater Robotics"
|
|
1220
1246
|
// printed a truncated uuid. The ref's own `name` wins; otherwise the
|
|
1221
1247
|
// field's text, unless that text IS the id and says nothing more.
|
|
1222
|
-
/* @__PURE__ */ (0,
|
|
1248
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
1223
1249
|
RefCell,
|
|
1224
1250
|
{
|
|
1225
1251
|
value: field.ref.id,
|
|
@@ -1238,8 +1264,8 @@ function FieldsSection({ core }) {
|
|
|
1238
1264
|
}
|
|
1239
1265
|
function LoadingFields({ core, label }) {
|
|
1240
1266
|
const slow = useSlowLoadNotice(true, `${core.ref.type}:${core.ref.id}`);
|
|
1241
|
-
return /* @__PURE__ */ (0,
|
|
1242
|
-
slow ? /* @__PURE__ */ (0,
|
|
1267
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "space-y-3", "aria-busy": "true", "aria-label": `Loading ${label} details`, children: [
|
|
1268
|
+
slow ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("p", { className: "text-xs text-muted-foreground", "data-detail-slow-load": true, children: [
|
|
1243
1269
|
"Still loading this ",
|
|
1244
1270
|
label,
|
|
1245
1271
|
" \u2014 the read has been running for more than",
|
|
@@ -1247,38 +1273,48 @@ function LoadingFields({ core, label }) {
|
|
|
1247
1273
|
(0, import_format.formatDurationMs)(SLOW_LOAD_NOTICE_MS, { style: "long" }),
|
|
1248
1274
|
". If nothing appears, the record may be unreachable from here; closing and reopening it starts a fresh read."
|
|
1249
1275
|
] }) : null,
|
|
1250
|
-
Array.from({ length: 5 }).map((_, i) => /* @__PURE__ */ (0,
|
|
1251
|
-
/* @__PURE__ */ (0,
|
|
1252
|
-
/* @__PURE__ */ (0,
|
|
1276
|
+
Array.from({ length: 5 }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "space-y-1.5", children: [
|
|
1277
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system3.Skeleton, { className: "h-2.5 w-20" }),
|
|
1278
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system3.Skeleton, { className: (0, import_design_system3.cn)("h-4", i % 2 ? "w-3/4" : "w-1/2") })
|
|
1253
1279
|
] }, i))
|
|
1254
1280
|
] });
|
|
1255
1281
|
}
|
|
1256
1282
|
function isAssociationTarget(token) {
|
|
1257
|
-
return
|
|
1283
|
+
return import_contracts2.ASSOCIATION_TARGET_TYPES.includes(token);
|
|
1258
1284
|
}
|
|
1285
|
+
var loadDetailLinked = () => Promise.resolve().then(() => (init_DetailLinked(), DetailLinked_exports));
|
|
1286
|
+
var DetailLinked2 = (0, import_react10.lazy)(loadDetailLinked);
|
|
1259
1287
|
function AssociationsSection({ core }) {
|
|
1260
1288
|
const host = useDetailHost();
|
|
1261
1289
|
const token = core.entityToken;
|
|
1262
1290
|
if (!token || !isAssociationTarget(token) || !host.associations.canAnchor(token)) return null;
|
|
1263
1291
|
if (core.recordType?.associationTokens === null) return null;
|
|
1264
|
-
const wanted = core.recordType?.associationTokens ?? host.associations.defaultTokens
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1292
|
+
const wanted = (core.recordType?.associationTokens ?? host.associations.defaultTokens).filter(
|
|
1293
|
+
(t) => t !== token
|
|
1294
|
+
);
|
|
1295
|
+
if (wanted.length === 0) return null;
|
|
1296
|
+
const heading = /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SectionHeading, { icon: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Link2Icon, { className: "h-3 w-3" }), children: "Linked" });
|
|
1297
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
1298
|
+
import_react10.Suspense,
|
|
1299
|
+
{
|
|
1300
|
+
fallback: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("section", { className: "space-y-2", "data-detail-section": "associations", "aria-busy": "true", children: [
|
|
1301
|
+
heading,
|
|
1302
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system3.Skeleton, { className: "h-16 w-full" })
|
|
1303
|
+
] }),
|
|
1304
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DetailLinked2, { token, id: core.ref.id, label: core.title, wanted, heading })
|
|
1305
|
+
}
|
|
1306
|
+
);
|
|
1271
1307
|
}
|
|
1272
1308
|
var ACTOR_COLUMNS = ["actor_id", "user_id", "person_id", "created_by_id"];
|
|
1273
1309
|
function HistorySection({ core }) {
|
|
1274
1310
|
const host = useDetailHost();
|
|
1275
1311
|
const token = core.entityToken;
|
|
1276
1312
|
const wanted = core.recordType?.history ?? Boolean(token);
|
|
1277
|
-
const [state, setState] = (0,
|
|
1278
|
-
const lastKey = (0,
|
|
1313
|
+
const [state, setState] = (0, import_react10.useState)({ status: "loading" });
|
|
1314
|
+
const lastKey = (0, import_react10.useRef)(null);
|
|
1279
1315
|
const listHistory = host.history.list;
|
|
1280
1316
|
const recordId = core.ref.id;
|
|
1281
|
-
(0,
|
|
1317
|
+
(0, import_react10.useEffect)(() => {
|
|
1282
1318
|
if (!wanted || !token) return void 0;
|
|
1283
1319
|
const key = `${token}:${recordId}`;
|
|
1284
1320
|
if (lastKey.current !== key) {
|
|
@@ -1303,33 +1339,33 @@ function HistorySection({ core }) {
|
|
|
1303
1339
|
(candidate) => Boolean(candidate)
|
|
1304
1340
|
);
|
|
1305
1341
|
const ActorName = host.history.ActorName ?? null;
|
|
1306
|
-
return /* @__PURE__ */ (0,
|
|
1307
|
-
/* @__PURE__ */ (0,
|
|
1308
|
-
state.status === "loading" ? /* @__PURE__ */ (0,
|
|
1309
|
-
/* @__PURE__ */ (0,
|
|
1310
|
-
/* @__PURE__ */ (0,
|
|
1311
|
-
] }) : state.status === "error" ? /* @__PURE__ */ (0,
|
|
1342
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("section", { className: "space-y-2", "data-detail-section": "history", children: [
|
|
1343
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SectionHeading, { icon: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(HistoryIcon, { className: "h-3 w-3" }), children: "History" }),
|
|
1344
|
+
state.status === "loading" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "space-y-1.5", "aria-busy": "true", "aria-label": "Loading history", children: [
|
|
1345
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system3.Skeleton, { className: "h-3.5 w-2/3" }),
|
|
1346
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system3.Skeleton, { className: "h-3.5 w-1/2" })
|
|
1347
|
+
] }) : state.status === "error" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("p", { className: "text-xs text-muted-foreground", children: [
|
|
1312
1348
|
state.message.toLowerCase().includes("access denied") ? "History is only shown to people who can view this record." : `History could not be read: ${state.message}`,
|
|
1313
|
-
/* @__PURE__ */ (0,
|
|
1314
|
-
] }) : state.entries.length === 0 ? /* @__PURE__ */ (0,
|
|
1349
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system3.ErrorActions, { origin: "detail/DetailBody", operation: "Read the history", error: state.message })
|
|
1350
|
+
] }) : state.entries.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "text-xs text-muted-foreground", children: "No recorded changes yet." }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("ol", { className: "space-y-1", children: state.entries.map((entry) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
1315
1351
|
"li",
|
|
1316
1352
|
{
|
|
1317
1353
|
className: "flex flex-wrap items-center gap-x-2 gap-y-0.5 text-xs",
|
|
1318
1354
|
children: [
|
|
1319
|
-
/* @__PURE__ */ (0,
|
|
1355
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "rounded bg-muted px-1.5 py-0.5 font-mono text-[10px] text-muted-foreground", children: [
|
|
1320
1356
|
"v",
|
|
1321
1357
|
entry.version
|
|
1322
1358
|
] }),
|
|
1323
|
-
/* @__PURE__ */ (0,
|
|
1324
|
-
/* @__PURE__ */ (0,
|
|
1325
|
-
entry.isCurrent ? /* @__PURE__ */ (0,
|
|
1326
|
-
entry.actorId ? ActorName ? /* @__PURE__ */ (0,
|
|
1359
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "capitalize text-foreground", children: entry.operation.toLowerCase() }),
|
|
1360
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "text-muted-foreground", children: formatWhen(entry.occurredAt) }),
|
|
1361
|
+
entry.isCurrent ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "text-[10px] uppercase tracking-wide text-primary", children: "current" }) : null,
|
|
1362
|
+
entry.actorId ? ActorName ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "text-muted-foreground", "data-detail-history-actor-person": true, children: [
|
|
1327
1363
|
"Changed by ",
|
|
1328
|
-
/* @__PURE__ */ (0,
|
|
1329
|
-
] }) : actorToken ? /* @__PURE__ */ (0,
|
|
1364
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ActorName, { actorId: entry.actorId, row: core.row })
|
|
1365
|
+
] }) : actorToken ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "inline-flex items-center", "data-detail-history-actor": true, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ActorCell, { value: entry.actorId, label: "Changed by", token: actorToken }) }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "text-muted-foreground", "data-detail-history-actor-raw": true, children: [
|
|
1330
1366
|
"Changed by",
|
|
1331
1367
|
" ",
|
|
1332
|
-
/* @__PURE__ */ (0,
|
|
1368
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
1333
1369
|
"span",
|
|
1334
1370
|
{
|
|
1335
1371
|
className: "font-mono text-[10px]",
|
|
@@ -1337,7 +1373,7 @@ function HistorySection({ core }) {
|
|
|
1337
1373
|
children: entry.actorId
|
|
1338
1374
|
}
|
|
1339
1375
|
)
|
|
1340
|
-
] }) : /* @__PURE__ */ (0,
|
|
1376
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "text-muted-foreground", "data-detail-history-actor-absent": true, children: "No person recorded for this change" })
|
|
1341
1377
|
]
|
|
1342
1378
|
},
|
|
1343
1379
|
`${entry.version}-${entry.occurredAt}`
|
|
@@ -1349,34 +1385,37 @@ function CustomFieldsPort({ core }) {
|
|
|
1349
1385
|
const Section = host.customFields?.Section;
|
|
1350
1386
|
const token = core.entityToken;
|
|
1351
1387
|
if (!Section || !token) return null;
|
|
1352
|
-
return /* @__PURE__ */ (0,
|
|
1388
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Section, { token, id: core.ref.id });
|
|
1353
1389
|
}
|
|
1354
1390
|
function DetailBody({ core }) {
|
|
1391
|
+
(0, import_react10.useEffect)(() => {
|
|
1392
|
+
loadDetailLinked().catch(() => void 0);
|
|
1393
|
+
}, []);
|
|
1355
1394
|
const extra = core.recordType?.extraSections && core.frameCtx ? core.recordType.extraSections(core.row, core.frameCtx) : [];
|
|
1356
1395
|
const Frame = core.recordType?.Frame ?? null;
|
|
1357
1396
|
const body = (
|
|
1358
1397
|
// `min-h-full` so a Frame's right-click menu answers anywhere in the body,
|
|
1359
1398
|
// not only on the rows — a short dossier otherwise leaves a dead band.
|
|
1360
|
-
/* @__PURE__ */ (0,
|
|
1361
|
-
/* @__PURE__ */ (0,
|
|
1362
|
-
core.health ? /* @__PURE__ */ (0,
|
|
1363
|
-
core.about ? /* @__PURE__ */ (0,
|
|
1364
|
-
/* @__PURE__ */ (0,
|
|
1365
|
-
/* @__PURE__ */ (0,
|
|
1366
|
-
core.status === "ready" || core.status === "none" ? /* @__PURE__ */ (0,
|
|
1367
|
-
/* @__PURE__ */ (0,
|
|
1368
|
-
/* @__PURE__ */ (0,
|
|
1369
|
-
/* @__PURE__ */ (0,
|
|
1370
|
-
extra.map((section) => /* @__PURE__ */ (0,
|
|
1371
|
-
/* @__PURE__ */ (0,
|
|
1399
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "flex min-h-full flex-col", children: [
|
|
1400
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DetailRecordMeta, { core }),
|
|
1401
|
+
core.health ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(HealthStrip, { health: core.health }) : null,
|
|
1402
|
+
core.about ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "line-clamp-3 border-b border-border/60 p-4 text-xs leading-snug text-muted-foreground", children: core.about }) : null,
|
|
1403
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "space-y-6 p-4", children: [
|
|
1404
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(FieldsSection, { core }),
|
|
1405
|
+
core.status === "ready" || core.status === "none" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
|
|
1406
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CustomFieldsPort, { core }),
|
|
1407
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(AssociationsSection, { core }),
|
|
1408
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(HistorySection, { core }),
|
|
1409
|
+
extra.map((section) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("section", { className: "space-y-2", "data-detail-section": section.id, children: [
|
|
1410
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SectionHeading, { children: section.label }),
|
|
1372
1411
|
section.content
|
|
1373
1412
|
] }, section.id))
|
|
1374
1413
|
] }) : null,
|
|
1375
|
-
/* @__PURE__ */ (0,
|
|
1414
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DetailPresentationPane, { core })
|
|
1376
1415
|
] })
|
|
1377
1416
|
] })
|
|
1378
1417
|
);
|
|
1379
|
-
if (Frame && core.frameCtx) return /* @__PURE__ */ (0,
|
|
1418
|
+
if (Frame && core.frameCtx) return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Frame, { ctx: core.frameCtx, children: body });
|
|
1380
1419
|
return body;
|
|
1381
1420
|
}
|
|
1382
1421
|
|
|
@@ -1399,9 +1438,9 @@ function detailInstanceKey(ref) {
|
|
|
1399
1438
|
var DEFAULT_PANEL_URL_RESERVE_BYTES = Math.floor(DETAIL_URL_BUDGET_BYTES / 2);
|
|
1400
1439
|
|
|
1401
1440
|
// src/react/presentations.tsx
|
|
1402
|
-
var
|
|
1441
|
+
var import_jsx_runtime6 = require("react/jsx-runtime");
|
|
1403
1442
|
function KeyboardSlot({ core, children }) {
|
|
1404
|
-
return /* @__PURE__ */ (0,
|
|
1443
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
1405
1444
|
"div",
|
|
1406
1445
|
{
|
|
1407
1446
|
onKeyDownCapture: core.keyboard.rootProps.onKeyDownCapture,
|
|
@@ -1412,7 +1451,7 @@ function KeyboardSlot({ core, children }) {
|
|
|
1412
1451
|
);
|
|
1413
1452
|
}
|
|
1414
1453
|
function KeyboardActionsSlot({ core, children }) {
|
|
1415
|
-
return /* @__PURE__ */ (0,
|
|
1454
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
1416
1455
|
"div",
|
|
1417
1456
|
{
|
|
1418
1457
|
onKeyDownCapture: core.keyboard.rootProps.onKeyDownCapture,
|
|
@@ -1431,7 +1470,7 @@ function KeyboardRoot({ core, children }) {
|
|
|
1431
1470
|
if (active instanceof HTMLElement && active !== document.body && root.contains(active)) return;
|
|
1432
1471
|
root.focus({ preventScroll: true });
|
|
1433
1472
|
}, [core.ref.id, core.ref.type]);
|
|
1434
|
-
return /* @__PURE__ */ (0,
|
|
1473
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
1435
1474
|
"div",
|
|
1436
1475
|
{
|
|
1437
1476
|
ref: rootRef,
|
|
@@ -1449,19 +1488,19 @@ function DetailWindowPresentation({ data, onClose }) {
|
|
|
1449
1488
|
const core = useDetailCore(data, "window", { onClose });
|
|
1450
1489
|
const menuActions = useDetailMenuActions(core);
|
|
1451
1490
|
const Shell = requireShell(host.shells, "Window");
|
|
1452
|
-
return /* @__PURE__ */ (0,
|
|
1491
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
1453
1492
|
Shell,
|
|
1454
1493
|
{
|
|
1455
1494
|
instanceKey: detailInstanceKey(core.ref),
|
|
1456
1495
|
target: core.ref,
|
|
1457
1496
|
list: core.list.context,
|
|
1458
1497
|
title: core.title,
|
|
1459
|
-
titleNode: /* @__PURE__ */ (0,
|
|
1460
|
-
actions: /* @__PURE__ */ (0,
|
|
1461
|
-
navActions: /* @__PURE__ */ (0,
|
|
1498
|
+
titleNode: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(KeyboardSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DetailTitle, { core }) }),
|
|
1499
|
+
actions: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(KeyboardActionsSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DetailActions, { core }) }),
|
|
1500
|
+
navActions: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(KeyboardActionsSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DetailActions, { core, optional: "none" }) }),
|
|
1462
1501
|
menuActions,
|
|
1463
1502
|
onClose: core.close,
|
|
1464
|
-
children: /* @__PURE__ */ (0,
|
|
1503
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(KeyboardRoot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DetailBody, { core }) })
|
|
1465
1504
|
}
|
|
1466
1505
|
);
|
|
1467
1506
|
}
|
|
@@ -1470,18 +1509,18 @@ function DetailDockedPresentation({ data, onClose }) {
|
|
|
1470
1509
|
const core = useDetailCore(data, "docked", { onClose });
|
|
1471
1510
|
const menuActions = useDetailMenuActions(core);
|
|
1472
1511
|
const Shell = requireShell(host.shells, "Docked");
|
|
1473
|
-
return /* @__PURE__ */ (0,
|
|
1512
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
1474
1513
|
Shell,
|
|
1475
1514
|
{
|
|
1476
1515
|
instanceKey: detailInstanceKey(core.ref),
|
|
1477
1516
|
target: core.ref,
|
|
1478
1517
|
title: core.title,
|
|
1479
|
-
titleNode: /* @__PURE__ */ (0,
|
|
1480
|
-
actions: /* @__PURE__ */ (0,
|
|
1481
|
-
navActions: /* @__PURE__ */ (0,
|
|
1518
|
+
titleNode: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(KeyboardSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DetailTitle, { core }) }),
|
|
1519
|
+
actions: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(KeyboardActionsSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DetailActions, { core }) }),
|
|
1520
|
+
navActions: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(KeyboardActionsSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DetailActions, { core, optional: "none" }) }),
|
|
1482
1521
|
menuActions,
|
|
1483
1522
|
onClose: core.close,
|
|
1484
|
-
children: /* @__PURE__ */ (0,
|
|
1523
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(KeyboardRoot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DetailBody, { core }) })
|
|
1485
1524
|
}
|
|
1486
1525
|
);
|
|
1487
1526
|
}
|
|
@@ -1490,18 +1529,18 @@ function DetailPagePresentation({ data }) {
|
|
|
1490
1529
|
const core = useDetailCore(data, "page", {});
|
|
1491
1530
|
const menuActions = useDetailMenuActions(core);
|
|
1492
1531
|
const Shell = requireShell(host.shells, "Page");
|
|
1493
|
-
return /* @__PURE__ */ (0,
|
|
1532
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
1494
1533
|
Shell,
|
|
1495
1534
|
{
|
|
1496
1535
|
target: core.ref,
|
|
1497
1536
|
title: core.title,
|
|
1498
|
-
titleNode: /* @__PURE__ */ (0,
|
|
1499
|
-
actions: /* @__PURE__ */ (0,
|
|
1500
|
-
navActions: /* @__PURE__ */ (0,
|
|
1537
|
+
titleNode: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(KeyboardSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DetailTitle, { core }) }),
|
|
1538
|
+
actions: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(KeyboardActionsSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DetailActions, { core }) }),
|
|
1539
|
+
navActions: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(KeyboardActionsSlot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DetailActions, { core, optional: "none" }) }),
|
|
1501
1540
|
menuActions,
|
|
1502
1541
|
onClose: core.close,
|
|
1503
1542
|
onBack: core.leave,
|
|
1504
|
-
children: /* @__PURE__ */ (0,
|
|
1543
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(KeyboardRoot, { core, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DetailBody, { core }) })
|
|
1505
1544
|
}
|
|
1506
1545
|
);
|
|
1507
1546
|
}
|