blixify-ui-web 1.2.162 → 1.2.165

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 (32) hide show
  1. package/lib/components/data/dataTemplate/activityChanges.d.ts +12 -4
  2. package/lib/components/data/dataTemplate/activityChanges.d.ts.map +1 -1
  3. package/lib/components/data/dataTemplate/activityChanges.js +256 -53
  4. package/lib/components/data/dataTemplate/activityChanges.js.map +1 -1
  5. package/lib/components/data/dataTemplate/activityModal.d.ts +3 -1
  6. package/lib/components/data/dataTemplate/activityModal.d.ts.map +1 -1
  7. package/lib/components/data/dataTemplate/activityModal.js +45 -28
  8. package/lib/components/data/dataTemplate/activityModal.js.map +1 -1
  9. package/lib/components/data/dataTemplate/dataStateModel.d.ts +1 -0
  10. package/lib/components/data/dataTemplate/dataStateModel.d.ts.map +1 -1
  11. package/lib/components/data/dataTemplate/dataStateModel.js.map +1 -1
  12. package/lib/components/data/dataTemplate/index.d.ts.map +1 -1
  13. package/lib/components/data/dataTemplate/index.js +398 -61
  14. package/lib/components/data/dataTemplate/index.js.map +1 -1
  15. package/lib/components/data/dataTemplate/viewStatePersistence.d.ts +1 -0
  16. package/lib/components/data/dataTemplate/viewStatePersistence.d.ts.map +1 -1
  17. package/lib/components/data/dataTemplate/viewStatePersistence.js +2 -1
  18. package/lib/components/data/dataTemplate/viewStatePersistence.js.map +1 -1
  19. package/lib/components/data/utils.d.ts +1 -0
  20. package/lib/components/data/utils.d.ts.map +1 -1
  21. package/lib/components/data/utils.js +20 -8
  22. package/lib/components/data/utils.js.map +1 -1
  23. package/lib/components/display/newTable/index.d.ts +13 -1
  24. package/lib/components/display/newTable/index.d.ts.map +1 -1
  25. package/lib/components/display/newTable/index.js +292 -54
  26. package/lib/components/display/newTable/index.js.map +1 -1
  27. package/lib/components/navigation/leftNav/index.d.ts +25 -0
  28. package/lib/components/navigation/leftNav/index.d.ts.map +1 -1
  29. package/lib/components/navigation/leftNav/index.js +62 -0
  30. package/lib/components/navigation/leftNav/index.js.map +1 -1
  31. package/lib/tail.css +2 -2
  32. package/package.json +1 -1
@@ -1,8 +1,16 @@
1
- import React from "react";
1
+ import React, { ReactNode } from "react";
2
+ import dayjs from "../../dayjs";
3
+ import { DataStructure } from "./model";
2
4
  export declare const handleActivityChanges: (record: any) => any[];
3
- export declare const ActivityChanges: ({ record, darkMode, showRecord, }: {
5
+ export declare const handleRelativeTime: (date: dayjs.Dayjs, now?: dayjs.Dayjs) => string;
6
+ interface LogRowsProps {
4
7
  record: any;
8
+ model?: DataStructure[];
9
+ authorName: string;
5
10
  darkMode?: boolean;
6
- showRecord: boolean;
7
- }) => React.JSX.Element;
11
+ personName?: (id: string) => string;
12
+ recordHeader?: ReactNode;
13
+ }
14
+ export declare const ActivityLogRows: (props: LogRowsProps) => React.JSX.Element;
15
+ export {};
8
16
  //# sourceMappingURL=activityChanges.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"activityChanges.d.ts","sourceRoot":"","sources":["../../../../src/components/data/dataTemplate/activityChanges.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,eAAO,MAAM,qBAAqB,WAAY,GAAG,KAAG,GAAG,EAMpD,CAAC;AAkCJ,eAAO,MAAM,eAAe,sCAIzB;IACD,MAAM,EAAE,GAAG,CAAC;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB,sBAkGA,CAAC"}
1
+ {"version":3,"file":"activityChanges.d.ts","sourceRoot":"","sources":["../../../../src/components/data/dataTemplate/activityChanges.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAY,MAAM,OAAO,CAAC;AACnD,OAAO,KAAK,MAAM,aAAa,CAAC;AAIhC,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,eAAO,MAAM,qBAAqB,WAAY,GAAG,KAAG,GAAG,EAMpD,CAAC;AAGJ,eAAO,MAAM,kBAAkB,SAAU,KAAK,CAAC,KAAK,8BAWnD,CAAC;AAgOF,UAAU,YAAY;IACpB,MAAM,EAAE,GAAG,CAAC;IACZ,KAAK,CAAC,EAAE,aAAa,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,YAAY,CAAC,EAAE,SAAS,CAAC;CAC1B;AAED,eAAO,MAAM,eAAe,UAAW,YAAY,sBA6RlD,CAAC"}
@@ -22,9 +22,17 @@ var __importStar = (this && this.__importStar) || function (mod) {
22
22
  __setModuleDefault(result, mod);
23
23
  return result;
24
24
  };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
25
28
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.ActivityChanges = exports.handleActivityChanges = void 0;
29
+ exports.ActivityLogRows = exports.handleRelativeTime = exports.handleActivityChanges = void 0;
30
+ var outline_1 = require("@heroicons/react/24/outline");
27
31
  var react_1 = __importStar(require("react"));
32
+ var dayjs_1 = __importDefault(require("../../dayjs"));
33
+ var chatBase_1 = require("../../chat/chatBase");
34
+ var tag_1 = require("../../display/tag");
35
+ var popUp_1 = require("../../advanced/popUp");
28
36
  var handleActivityChanges = function (record) {
29
37
  var _a;
30
38
  return Object.values((_a = record.values) !== null && _a !== void 0 ? _a : {}).filter(function (value) {
@@ -34,59 +42,254 @@ var handleActivityChanges = function (record) {
34
42
  });
35
43
  };
36
44
  exports.handleActivityChanges = handleActivityChanges;
37
- var ActivityValue = function (_a) {
38
- var value = _a.value, label = _a.label;
39
- var _b = (0, react_1.useState)(false), expanded = _b[0], setExpanded = _b[1];
40
- var text = value === undefined
41
- ? "—"
42
- : typeof value === "string"
43
- ? value
44
- : JSON.stringify(value);
45
- var long = text.length > 120 || text.split("\n").length > 3;
46
- return (react_1.default.createElement("div", { className: "min-w-0 whitespace-pre-wrap break-words [overflow-wrap:anywhere]" },
47
- long && !expanded
48
- ? "".concat(text.slice(0, 120).split("\n").slice(0, 3).join("\n"), "\u2026")
49
- : text,
50
- long && (react_1.default.createElement("button", { type: "button", "aria-label": "".concat(expanded ? "Collapse" : "Show full", " ").concat(label), "aria-expanded": expanded, className: "mt-1 block text-xs font-medium text-primary-500", onClick: function (event) {
51
- event.stopPropagation();
52
- setExpanded(!expanded);
53
- } }, expanded ? "Show less" : "Show more"))));
45
+ // INFO: compact monday-style age — the full timestamp is in the details popover
46
+ var handleRelativeTime = function (date, now) {
47
+ if (now === void 0) { now = (0, dayjs_1.default)(); }
48
+ var minutes = Math.max(now.diff(date, "minute"), 0);
49
+ if (minutes < 1)
50
+ return "now";
51
+ if (minutes < 60)
52
+ return "".concat(minutes, "m");
53
+ var hours = Math.floor(minutes / 60);
54
+ if (hours < 24)
55
+ return "".concat(hours, "h");
56
+ var days = Math.floor(hours / 24);
57
+ if (days < 7)
58
+ return "".concat(days, "d");
59
+ if (days < 30)
60
+ return "".concat(Math.floor(days / 7), "w");
61
+ if (days < 365)
62
+ return "".concat(Math.floor(days / 30), "mo");
63
+ return "".concat(Math.floor(days / 365), "y");
64
+ };
65
+ exports.handleRelativeTime = handleRelativeTime;
66
+ var isEmpty = function (value) {
67
+ return value === undefined ||
68
+ value === null ||
69
+ value === "" ||
70
+ (Array.isArray(value) && value.length === 0);
71
+ };
72
+ var urlPattern = /^https?:\/\/\S+$/i;
73
+ var renderFieldIcon = function (type) {
74
+ var className = "h-4 w-4 shrink-0";
75
+ switch (type) {
76
+ case "string":
77
+ case "password":
78
+ return (react_1.default.createElement("span", { "aria-hidden": "true", className: "w-4 shrink-0 text-center text-[11px] font-semibold leading-none" }, "Tt"));
79
+ case "email":
80
+ return react_1.default.createElement(outline_1.EnvelopeIcon, { "aria-hidden": "true", className: className });
81
+ case "contact":
82
+ return react_1.default.createElement(outline_1.DevicePhoneMobileIcon, { "aria-hidden": "true", className: className });
83
+ case "date":
84
+ return react_1.default.createElement(outline_1.CalendarIcon, { "aria-hidden": "true", className: className });
85
+ case "number":
86
+ case "math":
87
+ return react_1.default.createElement(outline_1.HashtagIcon, { "aria-hidden": "true", className: className });
88
+ case "boolean":
89
+ return react_1.default.createElement(outline_1.CheckCircleIcon, { "aria-hidden": "true", className: className });
90
+ case "person":
91
+ case "listPerson":
92
+ case "roles":
93
+ return react_1.default.createElement(outline_1.UserIcon, { "aria-hidden": "true", className: className });
94
+ case "list":
95
+ case "multipleList":
96
+ return react_1.default.createElement(outline_1.Bars3BottomLeftIcon, { "aria-hidden": "true", className: className });
97
+ case "reference":
98
+ case "listReference":
99
+ case "referenceSelection":
100
+ return react_1.default.createElement(outline_1.LinkIcon, { "aria-hidden": "true", className: className });
101
+ case "image":
102
+ case "multipleImage":
103
+ case "signature":
104
+ return react_1.default.createElement(outline_1.PhotoIcon, { "aria-hidden": "true", className: className });
105
+ case "file":
106
+ case "multipleFile":
107
+ return react_1.default.createElement(outline_1.PaperClipIcon, { "aria-hidden": "true", className: className });
108
+ case "address":
109
+ case "listAddress":
110
+ return react_1.default.createElement(outline_1.MapPinIcon, { "aria-hidden": "true", className: className });
111
+ case "textArea":
112
+ case "markdown":
113
+ return react_1.default.createElement(outline_1.DocumentTextIcon, { "aria-hidden": "true", className: className });
114
+ case "object":
115
+ case "listObject":
116
+ return react_1.default.createElement(outline_1.ListBulletIcon, { "aria-hidden": "true", className: className });
117
+ default:
118
+ return react_1.default.createElement(outline_1.MinusIcon, { "aria-hidden": "true", className: className });
119
+ }
120
+ };
121
+ var handleValueText = function (value, field, personName) {
122
+ if (typeof value === "string") {
123
+ if ((field === null || field === void 0 ? void 0 : field.type) === "date") {
124
+ var date = (0, dayjs_1.default)(value);
125
+ if (date.isValid())
126
+ return date.format(value.length <= 10 ? "D MMM YYYY" : "D MMM YYYY, HH:mm");
127
+ }
128
+ if ((field === null || field === void 0 ? void 0 : field.type) === "person" && personName)
129
+ return personName(value);
130
+ return value;
131
+ }
132
+ if ((field === null || field === void 0 ? void 0 : field.type) === "boolean" && typeof value === "boolean")
133
+ return value ? "Yes" : "No";
134
+ if ((field === null || field === void 0 ? void 0 : field.type) === "listPerson" && Array.isArray(value) && personName)
135
+ return value.map(function (id) { return personName(String(id)); }).join(", ");
136
+ if (Array.isArray(value) && value.every(function (item) { return typeof item !== "object"; }))
137
+ return value.join(", ");
138
+ if (typeof value === "number" || typeof value === "boolean")
139
+ return String(value);
140
+ return JSON.stringify(value);
141
+ };
142
+ // INFO: "compact" is the one-line cell inside the row trigger (plain text, no
143
+ // nested link — the row itself is a button); "full" is the untruncated value
144
+ // in the details popover, where URLs become real links
145
+ var renderValue = function (value, mode, field, darkMode, personName) {
146
+ var _a, _b, _c;
147
+ if (isEmpty(value))
148
+ return (react_1.default.createElement("span", { className: darkMode ? "text-gray-500" : "text-gray-400" }, "-"));
149
+ var text = handleValueText(value, field, personName);
150
+ if ((field === null || field === void 0 ? void 0 : field.type) === "list" && typeof value === "string") {
151
+ var index = (_b = (_a = field.listSelection) === null || _a === void 0 ? void 0 : _a.indexOf(value)) !== null && _b !== void 0 ? _b : -1;
152
+ return (react_1.default.createElement("span", { className: mode === "compact" ? "block min-w-0 truncate" : "" },
153
+ react_1.default.createElement(tag_1.Tag, { tagText: text, size: "small", variant: "flat", rounded: "md", color: index >= 0 ? (_c = field.listSelectionColour) === null || _c === void 0 ? void 0 : _c[index] : undefined })));
154
+ }
155
+ var isUrl = urlPattern.test(text);
156
+ if (mode === "compact")
157
+ return (react_1.default.createElement("span", { className: "block truncate ".concat(isUrl ? "text-primary-500" : "") }, text));
158
+ if (isUrl)
159
+ return (react_1.default.createElement("a", { href: text, target: "_blank", rel: "noopener noreferrer", className: "break-all text-primary-500 hover:underline" }, text));
160
+ return (react_1.default.createElement("span", { className: "whitespace-pre-wrap break-words [overflow-wrap:anywhere]" }, text));
161
+ };
162
+ // INFO: each row is a PopUp trigger, so a log with many or long values stays one
163
+ // line tall and the full before/after opens on demand instead of growing the list
164
+ var ActivityLogRow = function (props) {
165
+ var _a = (0, react_1.useState)("bottom"), direction = _a[0], setDirection = _a[1];
166
+ var muted = props.darkMode ? "text-gray-400" : "text-gray-500";
167
+ // INFO: the panel is not portalled (a body portal falls outside the Modal's
168
+ // dialog and closes it), so open upward when the clipping bounds leave no room below
169
+ var handleDirection = function (element) {
170
+ var _a, _b, _c;
171
+ var rect = element.getBoundingClientRect();
172
+ var bounds = (_a = element
173
+ .closest("[data-activity-bounds]")) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect();
174
+ var bottom = Math.min((_b = bounds === null || bounds === void 0 ? void 0 : bounds.bottom) !== null && _b !== void 0 ? _b : window.innerHeight, window.innerHeight);
175
+ var top = Math.max((_c = bounds === null || bounds === void 0 ? void 0 : bounds.top) !== null && _c !== void 0 ? _c : 0, 0);
176
+ var below = bottom - rect.bottom;
177
+ setDirection(below < 300 && rect.top - top > below ? "top" : "bottom");
178
+ };
179
+ return (react_1.default.createElement("li", { className: "border-t first:border-t-0 ".concat(props.darkMode ? "border-gray-700" : "border-gray-100") },
180
+ react_1.default.createElement(popUp_1.PopUp, { className: "w-full", anchor: "right", direction: direction, darkMode: props.darkMode, lib: { Transition: undefined }, ctaComp: react_1.default.createElement("button", { type: "button", "aria-haspopup": "dialog", className: "grid w-full grid-cols-[3rem_minmax(0,1fr)] items-center gap-x-3 gap-y-1 px-3 py-2 text-left focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary-500 sm:grid-cols-[3rem_minmax(0,1fr)_minmax(0,1fr)_minmax(0,1.6fr)] ".concat(props.darkMode ? "hover:bg-white/5" : "hover:bg-gray-50"), onPointerDown: function (event) { return handleDirection(event.currentTarget); }, onKeyDown: function (event) { return handleDirection(event.currentTarget); } },
181
+ props.meta,
182
+ react_1.default.createElement("span", { className: "col-span-2 flex min-w-0 items-center gap-2 text-sm sm:col-span-1" },
183
+ react_1.default.createElement("span", { className: muted }, props.icon),
184
+ props.srPrefix && (react_1.default.createElement("span", { className: "sr-only" }, props.srPrefix)),
185
+ react_1.default.createElement("span", { className: "truncate" }, props.label)),
186
+ react_1.default.createElement("span", { className: "col-span-2 min-w-0 text-sm sm:col-span-1" }, props.summary)), renderComp: react_1.default.createElement("div", { role: "dialog", "aria-label": "Change details", className: "w-80 max-w-[calc(100vw-3rem)] p-3 text-left text-sm" }, props.details) })));
54
187
  };
55
- var ActivityChanges = function (_a) {
56
- var record = _a.record, darkMode = _a.darkMode, showRecord = _a.showRecord;
57
- var _b = (0, react_1.useState)(false), expanded = _b[0], setExpanded = _b[1];
188
+ var ActivityLogRows = function (props) {
189
+ var record = props.record, darkMode = props.darkMode;
58
190
  var changes = (0, exports.handleActivityChanges)(record);
59
- var visible = expanded ? changes : changes.slice(0, 3);
60
- return (react_1.default.createElement("div", { className: "min-w-0 space-y-2" },
61
- showRecord && record.itemId && (react_1.default.createElement("p", { className: "break-all text-xs text-gray-500" },
62
- "Record: ",
63
- record.itemId)),
64
- changes.length ? (react_1.default.createElement("div", { className: "overflow-hidden rounded-lg border ".concat(darkMode ? "border-gray-700" : "border-gray-200") },
65
- react_1.default.createElement("table", { className: "w-full table-fixed text-left text-xs sm:text-sm" },
66
- react_1.default.createElement("caption", { className: "sr-only" }, "Field changes"),
67
- react_1.default.createElement("thead", { className: darkMode
68
- ? "bg-gray-800 text-gray-300"
69
- : "bg-gray-50 text-gray-500" },
70
- react_1.default.createElement("tr", null,
71
- react_1.default.createElement("th", { className: "w-1/3 px-2 py-2 font-medium sm:w-1/4", scope: "col" }, "Field"),
72
- record.type === "update" && (react_1.default.createElement("th", { className: "px-2 py-2 font-medium", scope: "col" }, "Before")),
73
- react_1.default.createElement("th", { className: "px-2 py-2 font-medium", scope: "col" }, record.type === "update" ? "After" : "Value"))),
74
- react_1.default.createElement("tbody", null, visible.map(function (change, index) { return (react_1.default.createElement("tr", { key: index, className: "border-t align-top ".concat(darkMode ? "border-gray-700" : "border-gray-100") },
75
- react_1.default.createElement("th", { scope: "row", className: "px-2 py-2 font-medium [overflow-wrap:anywhere]" }, change.columnId),
76
- record.type === "update" && (react_1.default.createElement("td", { className: "px-2 py-2" },
77
- react_1.default.createElement(ActivityValue, { value: change.oldValue, label: "before ".concat(change.columnId) }))),
78
- react_1.default.createElement("td", { className: "px-2 py-2" },
79
- react_1.default.createElement(ActivityValue, { value: record.type === "delete"
80
- ? change.oldValue !== undefined
81
- ? change.oldValue
82
- : change.newValue
83
- : change.newValue, label: "after ".concat(change.columnId) })))); }))),
84
- changes.length > 3 && (react_1.default.createElement("button", { type: "button", "aria-expanded": expanded, className: "w-full border-t border-inherit px-3 py-2 text-left text-xs font-medium text-primary-500", onClick: function (event) {
85
- event.stopPropagation();
86
- setExpanded(!expanded);
87
- } }, expanded
88
- ? "Show fewer changes"
89
- : "Show all ".concat(changes.length, " changes"))))) : (react_1.default.createElement("p", { className: "text-gray-500" }, "No field changes recorded."))));
191
+ var date = record.createdAt ? (0, dayjs_1.default)(record.createdAt) : null;
192
+ var muted = darkMode ? "text-gray-400" : "text-gray-500";
193
+ var panelDivider = darkMode ? "border-gray-700" : "border-gray-100";
194
+ var author = "".concat(props.authorName).concat(record.userRole ? " (".concat(record.userRole, ")") : "");
195
+ var handleField = function (columnId) { var _a; return (_a = props.model) === null || _a === void 0 ? void 0 : _a.find(function (field) { return field.id === columnId; }); };
196
+ var renderMeta = function () { return (react_1.default.createElement(react_1.default.Fragment, null,
197
+ react_1.default.createElement("span", { className: "flex items-center gap-1 text-xs ".concat(muted) },
198
+ react_1.default.createElement(outline_1.ClockIcon, { "aria-hidden": "true", className: "h-3.5 w-3.5 shrink-0" }),
199
+ (date === null || date === void 0 ? void 0 : date.isValid()) ? (react_1.default.createElement("time", { dateTime: date.toISOString() }, (0, exports.handleRelativeTime)(date))) : (react_1.default.createElement("span", null, "-"))),
200
+ react_1.default.createElement("span", { className: "flex min-w-0 items-center gap-2" },
201
+ (0, chatBase_1.renderChatAvatar)({ id: record.userId, name: props.authorName }, "h-6 w-6 shrink-0 text-[10px]", darkMode),
202
+ react_1.default.createElement("span", { className: "truncate text-sm font-medium" }, author)))); };
203
+ var renderDetailsHeader = function (icon, label) { return (react_1.default.createElement("div", { className: "mb-3 border-b pb-2 ".concat(panelDivider) },
204
+ react_1.default.createElement("p", { className: "flex items-center gap-2 font-semibold" },
205
+ react_1.default.createElement("span", { className: muted }, icon),
206
+ react_1.default.createElement("span", { className: "break-words" }, label)),
207
+ react_1.default.createElement("p", { className: "mt-1 text-xs ".concat(muted) },
208
+ author,
209
+ (date === null || date === void 0 ? void 0 : date.isValid()) && " \u00B7 ".concat(date.format("D MMM YYYY, HH:mm:ss"))))); };
210
+ var renderDetailsValue = function (title, value) { return (react_1.default.createElement("div", { className: "mt-2 first:mt-0" },
211
+ react_1.default.createElement("p", { className: "mb-1 text-xs font-medium uppercase tracking-wide ".concat(muted) }, title),
212
+ react_1.default.createElement("div", { className: "max-h-40 overflow-y-auto" }, value))); };
213
+ var renderChange = function (change) {
214
+ var _a;
215
+ var field = handleField(change.columnId);
216
+ var label = (_a = field === null || field === void 0 ? void 0 : field.name) !== null && _a !== void 0 ? _a : change.columnId;
217
+ var icon = renderFieldIcon(field === null || field === void 0 ? void 0 : field.type);
218
+ var before = record.type === "create" ? undefined : change.oldValue;
219
+ return (react_1.default.createElement(ActivityLogRow, { key: change.columnId, label: label, icon: icon, meta: renderMeta(), srPrefix: "changed ", darkMode: darkMode, summary: react_1.default.createElement("span", { className: "flex min-w-0 items-center gap-2" },
220
+ react_1.default.createElement("span", { className: "sr-only" }, "from "),
221
+ react_1.default.createElement("span", { className: "min-w-0 flex-1" }, renderValue(before, "compact", field, darkMode, props.personName)),
222
+ react_1.default.createElement(outline_1.ChevronRightIcon, { "aria-hidden": "true", className: "h-4 w-4 shrink-0 ".concat(muted) }),
223
+ react_1.default.createElement("span", { className: "sr-only" }, "to "),
224
+ react_1.default.createElement("span", { className: "min-w-0 flex-1" }, renderValue(change.newValue, "compact", field, darkMode, props.personName))), details: react_1.default.createElement(react_1.default.Fragment, null,
225
+ renderDetailsHeader(icon, label),
226
+ renderDetailsValue("Before", renderValue(before, "full", field, darkMode, props.personName)),
227
+ renderDetailsValue("After", renderValue(change.newValue, "full", field, darkMode, props.personName))) }));
228
+ };
229
+ var renderChangeDetails = function (change) {
230
+ var _a;
231
+ var field = handleField(change.columnId);
232
+ var before = record.type === "create" ? undefined : change.oldValue;
233
+ return (react_1.default.createElement("div", { key: change.columnId },
234
+ react_1.default.createElement("dt", { className: "flex items-center gap-2 text-xs ".concat(muted) },
235
+ renderFieldIcon(field === null || field === void 0 ? void 0 : field.type), (_a = field === null || field === void 0 ? void 0 : field.name) !== null && _a !== void 0 ? _a : change.columnId),
236
+ react_1.default.createElement("dd", { className: "mt-0.5 flex min-w-0 items-start gap-2" },
237
+ record.type !== "create" && (react_1.default.createElement(react_1.default.Fragment, null,
238
+ react_1.default.createElement("span", { className: "sr-only" }, "from "),
239
+ react_1.default.createElement("span", { className: "min-w-0 flex-1" }, renderValue(before, "full", field, darkMode, props.personName)),
240
+ react_1.default.createElement(outline_1.ChevronRightIcon, { "aria-hidden": "true", className: "mt-0.5 h-4 w-4 shrink-0 ".concat(muted) }),
241
+ react_1.default.createElement("span", { className: "sr-only" }, "to "))),
242
+ react_1.default.createElement("span", { className: "min-w-0 flex-1" }, renderValue(change.newValue, "full", field, darkMode, props.personName)))));
243
+ };
244
+ // INFO: one save that touched several columns stays one row; the field names
245
+ // are listed on the row and each before › after opens in the popover
246
+ var renderGroup = function () {
247
+ var isCreate = record.type === "create";
248
+ var label = isCreate ? "Created" : "Updated ".concat(changes.length, " fields");
249
+ var icon = isCreate ? (react_1.default.createElement(outline_1.PlusCircleIcon, { "aria-hidden": "true", className: "h-4 w-4 shrink-0" })) : (react_1.default.createElement(outline_1.PencilSquareIcon, { "aria-hidden": "true", className: "h-4 w-4 shrink-0" }));
250
+ var names = changes
251
+ .map(function (change) { var _a, _b; return (_b = (_a = handleField(change.columnId)) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : change.columnId; })
252
+ .join(", ");
253
+ return (react_1.default.createElement(ActivityLogRow, { key: "group", label: label, icon: icon, meta: renderMeta(), darkMode: darkMode, summary: react_1.default.createElement("span", { className: "block truncate ".concat(muted) }, names), details: react_1.default.createElement(react_1.default.Fragment, null,
254
+ renderDetailsHeader(icon, label),
255
+ react_1.default.createElement("dl", { className: "max-h-72 space-y-3 overflow-y-auto" }, changes.map(renderChangeDetails))) }));
256
+ };
257
+ var renderDeleted = function () {
258
+ var icon = react_1.default.createElement(outline_1.TrashIcon, { "aria-hidden": "true", className: "h-4 w-4 shrink-0" });
259
+ return (react_1.default.createElement(ActivityLogRow, { key: "deleted", label: "Deleted", icon: icon, meta: renderMeta(), darkMode: darkMode, summary: react_1.default.createElement("span", { className: "block truncate text-xs ".concat(muted) }, changes.length
260
+ ? "".concat(changes.length, " deleted value").concat(changes.length === 1 ? "" : "s")
261
+ : "No field values recorded."), details: react_1.default.createElement(react_1.default.Fragment, null,
262
+ renderDetailsHeader(icon, "Deleted"),
263
+ changes.length ? (react_1.default.createElement("dl", { className: "max-h-72 space-y-2 overflow-y-auto" }, changes.map(function (change) {
264
+ var _a;
265
+ var field = handleField(change.columnId);
266
+ return (react_1.default.createElement("div", { key: change.columnId },
267
+ react_1.default.createElement("dt", { className: "flex items-center gap-2 text-xs ".concat(muted) },
268
+ renderFieldIcon(field === null || field === void 0 ? void 0 : field.type), (_a = field === null || field === void 0 ? void 0 : field.name) !== null && _a !== void 0 ? _a : change.columnId),
269
+ react_1.default.createElement("dd", { className: "mt-0.5" }, renderValue(change.oldValue !== undefined
270
+ ? change.oldValue
271
+ : change.newValue, "full", field, darkMode, props.personName))));
272
+ }))) : (react_1.default.createElement("p", { className: muted }, "No field values recorded."))) }));
273
+ };
274
+ var renderRows = function () {
275
+ var _a;
276
+ if (record.type === "delete")
277
+ return [renderDeleted()];
278
+ if (changes.length > 1)
279
+ return [renderGroup()];
280
+ if (changes.length)
281
+ return [renderChange(changes[0])];
282
+ var label = record.type === "create" ? "Created" : ((_a = record.type) !== null && _a !== void 0 ? _a : "Activity");
283
+ var icon = record.type === "create" ? (react_1.default.createElement(outline_1.PlusCircleIcon, { "aria-hidden": "true", className: "h-4 w-4 shrink-0" })) : (renderFieldIcon());
284
+ return [
285
+ react_1.default.createElement(ActivityLogRow, { key: "empty", label: label, icon: icon, meta: renderMeta(), darkMode: darkMode, summary: react_1.default.createElement("span", { className: muted }, "No field changes recorded."), details: react_1.default.createElement(react_1.default.Fragment, null,
286
+ renderDetailsHeader(icon, label),
287
+ react_1.default.createElement("p", { className: muted }, "No field changes recorded.")) }),
288
+ ];
289
+ };
290
+ return (react_1.default.createElement("li", { className: "border-b last:border-b-0 ".concat(darkMode ? "border-gray-700" : "border-gray-200") },
291
+ props.recordHeader && (react_1.default.createElement("div", { className: "px-3 pt-2" }, props.recordHeader)),
292
+ react_1.default.createElement("ul", null, renderRows())));
90
293
  };
91
- exports.ActivityChanges = ActivityChanges;
294
+ exports.ActivityLogRows = ActivityLogRows;
92
295
  //# sourceMappingURL=activityChanges.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"activityChanges.js","sourceRoot":"","sources":["../../../../src/components/data/dataTemplate/activityChanges.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAAwC;AAEjC,IAAM,qBAAqB,GAAG,UAAC,MAAW;;IAC/C,OAAA,MAAM,CAAC,MAAM,CAAC,MAAA,MAAM,CAAC,MAAM,mCAAI,EAAE,CAAC,CAAC,MAAM,CACvC,UAAC,KAAU;QACT,OAAA,KAAK;YACL,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ;gBACvB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAFpE,CAEoE,CACvE,CAAA;CAAA,CAAC;AANS,QAAA,qBAAqB,yBAM9B;AAEJ,IAAM,aAAa,GAAG,UAAC,EAA+C;QAA7C,KAAK,WAAA,EAAE,KAAK,WAAA;IAC7B,IAAA,KAA0B,IAAA,gBAAQ,EAAC,KAAK,CAAC,EAAxC,QAAQ,QAAA,EAAE,WAAW,QAAmB,CAAC;IAChD,IAAM,IAAI,GACR,KAAK,KAAK,SAAS;QACjB,CAAC,CAAC,GAAG;QACL,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ;YACzB,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAM,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9D,OAAO,CACL,uCAAK,SAAS,EAAC,kEAAkE;QAC9E,IAAI,IAAI,CAAC,QAAQ;YAChB,CAAC,CAAC,UAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAG;YAC7D,CAAC,CAAC,IAAI;QACP,IAAI,IAAI,CACP,0CACE,IAAI,EAAC,QAAQ,gBACD,UAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,cAAI,KAAK,CAAE,mBAC9C,QAAQ,EACvB,SAAS,EAAC,iDAAiD,EAC3D,OAAO,EAAE,UAAC,KAAK;gBACb,KAAK,CAAC,eAAe,EAAE,CAAC;gBACxB,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC,IAEA,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAC9B,CACV,CACG,CACP,CAAC;AACJ,CAAC,CAAC;AAEK,IAAM,eAAe,GAAG,UAAC,EAQ/B;QAPC,MAAM,YAAA,EACN,QAAQ,cAAA,EACR,UAAU,gBAAA;IAMJ,IAAA,KAA0B,IAAA,gBAAQ,EAAC,KAAK,CAAC,EAAxC,QAAQ,QAAA,EAAE,WAAW,QAAmB,CAAC;IAChD,IAAM,OAAO,GAAG,IAAA,6BAAqB,EAAC,MAAM,CAAC,CAAC;IAC9C,IAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzD,OAAO,CACL,uCAAK,SAAS,EAAC,mBAAmB;QAC/B,UAAU,IAAI,MAAM,CAAC,MAAM,IAAI,CAC9B,qCAAG,SAAS,EAAC,iCAAiC;;YACnC,MAAM,CAAC,MAAM,CACpB,CACL;QACA,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAChB,uCACE,SAAS,EAAE,4CAAqC,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAE;YAElG,yCAAO,SAAS,EAAC,iDAAiD;gBAChE,2CAAS,SAAS,EAAC,SAAS,oBAAwB;gBACpD,yCACE,SAAS,EACP,QAAQ;wBACN,CAAC,CAAC,2BAA2B;wBAC7B,CAAC,CAAC,0BAA0B;oBAGhC;wBACE,sCACE,SAAS,EAAC,sCAAsC,EAChD,KAAK,EAAC,KAAK,YAGR;wBACJ,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAC3B,sCAAI,SAAS,EAAC,uBAAuB,EAAC,KAAK,EAAC,KAAK,aAE5C,CACN;wBACD,sCAAI,SAAS,EAAC,uBAAuB,EAAC,KAAK,EAAC,KAAK,IAC9C,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAC1C,CACF,CACC;gBACR,6CACG,OAAO,CAAC,GAAG,CAAC,UAAC,MAAM,EAAE,KAAK,IAAK,OAAA,CAC9B,sCACE,GAAG,EAAE,KAAK,EACV,SAAS,EAAE,6BAAsB,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAE;oBAEnF,sCACE,KAAK,EAAC,KAAK,EACX,SAAS,EAAC,gDAAgD,IAEzD,MAAM,CAAC,QAAQ,CACb;oBACJ,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAC3B,sCAAI,SAAS,EAAC,WAAW;wBACvB,8BAAC,aAAa,IACZ,KAAK,EAAE,MAAM,CAAC,QAAQ,EACtB,KAAK,EAAE,iBAAU,MAAM,CAAC,QAAQ,CAAE,GAClC,CACC,CACN;oBACD,sCAAI,SAAS,EAAC,WAAW;wBACvB,8BAAC,aAAa,IACZ,KAAK,EACH,MAAM,CAAC,IAAI,KAAK,QAAQ;gCACtB,CAAC,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS;oCAC7B,CAAC,CAAC,MAAM,CAAC,QAAQ;oCACjB,CAAC,CAAC,MAAM,CAAC,QAAQ;gCACnB,CAAC,CAAC,MAAM,CAAC,QAAQ,EAErB,KAAK,EAAE,gBAAS,MAAM,CAAC,QAAQ,CAAE,GACjC,CACC,CACF,CACN,EAhC+B,CAgC/B,CAAC,CACI,CACF;YACP,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CACrB,0CACE,IAAI,EAAC,QAAQ,mBACE,QAAQ,EACvB,SAAS,EAAC,yFAAyF,EACnG,OAAO,EAAE,UAAC,KAAK;oBACb,KAAK,CAAC,eAAe,EAAE,CAAC;oBACxB,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC;gBACzB,CAAC,IAEA,QAAQ;gBACP,CAAC,CAAC,oBAAoB;gBACtB,CAAC,CAAC,mBAAY,OAAO,CAAC,MAAM,aAAU,CACjC,CACV,CACG,CACP,CAAC,CAAC,CAAC,CACF,qCAAG,SAAS,EAAC,eAAe,iCAA+B,CAC5D,CACG,CACP,CAAC;AACJ,CAAC,CAAC;AA1GW,QAAA,eAAe,mBA0G1B"}
1
+ {"version":3,"file":"activityChanges.js","sourceRoot":"","sources":["../../../../src/components/data/dataTemplate/activityChanges.tsx"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import React from "react";
2
2
  import { Query } from "../readQuery";
3
3
  import { ActivityLog } from "./dataStateModel";
4
- import { DevSettings } from "./model";
4
+ import { DataStructure, DevSettings } from "./model";
5
5
  interface Props {
6
6
  title: string;
7
7
  devSettings: DevSettings;
@@ -12,6 +12,8 @@ interface Props {
12
12
  initialTab?: "comments" | "logs";
13
13
  recordTitleColumn?: string;
14
14
  recordQuery?: Query[];
15
+ /** Collection schema, used to show field names and type icons in logs. */
16
+ model?: DataStructure[];
15
17
  onOpenRecord?: (id: string) => void;
16
18
  }
17
19
  export declare const ActivityModal: (props: Props) => React.JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"activityModal.d.ts","sourceRoot":"","sources":["../../../../src/components/data/dataTemplate/activityModal.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAM3D,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAGrC,OAAO,EACL,WAAW,EAGZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAiB,WAAW,EAAE,MAAM,SAAS,CAAC;AAOrD,UAAU,KAAK;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,WAAW,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAeD,eAAO,MAAM,aAAa,UAAW,KAAK,sBAkBzC,CAAC"}
1
+ {"version":3,"file":"activityModal.d.ts","sourceRoot":"","sources":["../../../../src/components/data/dataTemplate/activityModal.tsx"],"names":[],"mappings":"AACA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAM3D,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAGrC,OAAO,EACL,WAAW,EAGZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAOrD,UAAU,KAAK;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,WAAW,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC;IACtB,0EAA0E;IAC1E,KAAK,CAAC,EAAE,aAAa,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAeD,eAAO,MAAM,aAAa,UAAW,KAAK,sBAkBzC,CAAC"}
@@ -83,7 +83,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
83
83
  };
84
84
  Object.defineProperty(exports, "__esModule", { value: true });
85
85
  exports.ActivityModal = void 0;
86
- var solid_1 = require("@heroicons/react/24/solid");
87
86
  var axios_1 = __importDefault(require("axios"));
88
87
  var react_1 = __importStar(require("react"));
89
88
  var uuid_1 = require("uuid");
@@ -432,43 +431,42 @@ var ActivityPanel = function (props) {
432
431
  setDeleteId(id);
433
432
  } }, "Delete"))));
434
433
  };
434
+ var renderRecordTitle = function (record) {
435
+ var _a;
436
+ return record.itemId ? (props.onOpenRecord && recordTitles[record.itemId] ? (react_1.default.createElement("button", { type: "button", className: "text-left text-xs font-medium text-primary-500 break-words", onClick: function (event) {
437
+ var _a;
438
+ event.stopPropagation();
439
+ (_a = props.onOpenRecord) === null || _a === void 0 ? void 0 : _a.call(props, record.itemId);
440
+ } }, recordTitles[record.itemId])) : (react_1.default.createElement("p", { className: "break-words text-xs text-gray-500" }, (_a = recordTitles[record.itemId]) !== null && _a !== void 0 ? _a : "Data ".concat(record.itemId, " (unavailable)")))) : (react_1.default.createElement("p", { className: "text-xs text-gray-500" }, "Collection discussion"));
441
+ };
435
442
  var renderFeedData = function (records) {
436
443
  return records.map(function (record) {
437
- var _a, _b, _c, _d;
444
+ var _a;
438
445
  var name = handleAuthorName(record.userId);
439
446
  var date = record.createdAt ? (0, dayjs_1.default)(record.createdAt) : null;
440
- var count = (0, activityChanges_1.handleActivityChanges)(record).length;
441
- var action = record.type === "update"
442
- ? "updated ".concat(count, " field").concat(count === 1 ? "" : "s")
443
- : record.type === "create"
444
- ? "created this record"
445
- : record.type === "delete"
446
- ? "deleted this record"
447
- : ((_a = record.type) !== null && _a !== void 0 ? _a : "Activity");
448
447
  return {
449
- id: (_b = record._id) !== null && _b !== void 0 ? _b : record.id,
448
+ id: (_a = record._id) !== null && _a !== void 0 ? _a : record.id,
450
449
  desc: null,
451
450
  title: (react_1.default.createElement("span", { className: "flex flex-wrap items-baseline gap-x-3 gap-y-1" },
452
- react_1.default.createElement("span", null, isComments
453
- ? name
454
- : "".concat(name).concat(record.userRole ? " (".concat(record.userRole, ")") : "", " ").concat(action)),
451
+ react_1.default.createElement("span", null, name),
455
452
  (date === null || date === void 0 ? void 0 : date.isValid()) && (react_1.default.createElement("time", { className: "text-xs font-normal ".concat(props.darkMode ? "text-gray-400" : "text-gray-500"), dateTime: date.toISOString(), title: date.format("YYYY-MM-DD HH:mm:ss") }, date.format("MMM D, HH:mm"))))),
456
- icon: isComments ? ((0, chatBase_1.renderChatAvatar)({ id: record.userId, name: name }, "h-7 w-7 sm:h-9 sm:w-9", props.darkMode)) : (react_1.default.createElement(solid_1.ClockIcon, { className: "h-4 w-4 text-primary-500" })),
457
- iconClass: isComments
458
- ? ""
459
- : props.darkMode
460
- ? "bg-gray-800"
461
- : "bg-primary-50",
453
+ icon: (0, chatBase_1.renderChatAvatar)({ id: record.userId, name: name }, "h-7 w-7 sm:h-9 sm:w-9", props.darkMode),
454
+ iconClass: "",
462
455
  content: (react_1.default.createElement("div", { className: "space-y-2" },
463
- record.itemId ? (props.onOpenRecord && recordTitles[record.itemId] ? (react_1.default.createElement("button", { type: "button", className: "text-left text-xs font-medium text-primary-500 break-words", onClick: function (event) {
464
- var _a;
465
- event.stopPropagation();
466
- (_a = props.onOpenRecord) === null || _a === void 0 ? void 0 : _a.call(props, record.itemId);
467
- } }, recordTitles[record.itemId])) : (react_1.default.createElement("p", { className: "break-words text-xs text-gray-500" }, (_c = recordTitles[record.itemId]) !== null && _c !== void 0 ? _c : "Data ".concat(record.itemId, " (unavailable)")))) : (react_1.default.createElement("p", { className: "text-xs text-gray-500" }, "Collection discussion")),
468
- isComments ? (renderComment(record)) : (react_1.default.createElement(activityChanges_1.ActivityChanges, { key: (_d = record._id) !== null && _d !== void 0 ? _d : record.id, record: record, darkMode: props.darkMode, showRecord: false })))),
456
+ renderRecordTitle(record),
457
+ renderComment(record))),
469
458
  };
470
459
  });
471
460
  };
461
+ // INFO: logs render as a flat, one-row-per-field list instead of feed cards
462
+ var renderLogList = function (records) {
463
+ return (records === null || records === void 0 ? void 0 : records.length) ? (react_1.default.createElement("ul", { "aria-label": "Activity logs",
464
+ // INFO: no overflow-hidden — it would clip the row details popovers
465
+ className: "rounded-lg border ".concat(props.darkMode ? "border-gray-700 bg-white/5" : "border-gray-200 bg-white") }, records.map(function (record) {
466
+ var _a;
467
+ return (react_1.default.createElement(activityChanges_1.ActivityLogRows, { key: (_a = record._id) !== null && _a !== void 0 ? _a : record.id, record: record, model: props.model, authorName: handleAuthorName(record.userId), personName: function (id) { return handleAuthorName(id); }, darkMode: props.darkMode, recordHeader: activeRecordId ? undefined : renderRecordTitle(record) }));
468
+ }))) : null;
469
+ };
472
470
  if (!commentsEnabled && !logsEnabled)
473
471
  return null;
474
472
  var filters = __spreadArray(__spreadArray(__spreadArray([
@@ -478,7 +476,7 @@ var ActivityPanel = function (props) {
478
476
  : []), true), ((_e = (isComments ? config === null || config === void 0 ? void 0 : config.commentQuery : config === null || config === void 0 ? void 0 : config.logQuery)) !== null && _e !== void 0 ? _e : []), true), (!isComments && logType !== "all"
479
477
  ? [{ type: "=", queryId: "type", value: logType }]
480
478
  : []), true);
481
- return (react_1.default.createElement("div", { className: "min-w-0 space-y-4 p-1 sm:p-3 ".concat(props.darkMode ? "text-gray-100" : "text-gray-800") },
479
+ return (react_1.default.createElement("div", { "data-activity-bounds": true, className: "min-w-0 space-y-4 p-1 sm:p-3 ".concat(props.darkMode ? "text-gray-100" : "text-gray-800") },
482
480
  react_1.default.createElement("div", { className: "flex flex-wrap items-center justify-between gap-3" },
483
481
  react_1.default.createElement(buttonGroup_1.ButtonGroup, { darkMode: props.darkMode, size: "small", selectedId: activeTab, selection: __spreadArray(__spreadArray([], (commentsEnabled ? [{ id: "comments", name: "Comments" }] : []), true), (logsEnabled ? [{ id: "logs", name: "Logs" }] : []), true), onClick: function (nextTab) {
484
482
  if (nextTab === activeTab)
@@ -568,7 +566,11 @@ var ActivityPanel = function (props) {
568
566
  }, devSettings: props.devSettings, edit: { allEditable: false, createBtn: false, deleteBtn: false }, sort: { sortId: "createdAt", type: "desc" }, organise: { hideSearch: true, darkMode: props.darkMode }, bareSettings: {
569
567
  bareNewDTW: true,
570
568
  bareListFilterQuery: filters,
569
+ bareListComponent: isComments
570
+ ? undefined
571
+ : function (records) { return renderLogList(records); },
571
572
  bareListHandleData: function (records) {
573
+ var _a;
572
574
  setRowCount(records.length);
573
575
  var itemIds = Array.from(new Set(records.map(function (record) { return record.itemId; }).filter(Boolean)));
574
576
  setRecordIds(function (previous) {
@@ -576,7 +578,22 @@ var ActivityPanel = function (props) {
576
578
  ? previous
577
579
  : itemIds;
578
580
  });
579
- var ids = Array.from(new Set(records.map(function (record) { return record.userId; }).filter(Boolean)));
581
+ // INFO: person and listPerson values are user ids too, so they are
582
+ // resolved to names with the authors instead of showing the raw id
583
+ var personColumns = new Set(((_a = props.model) !== null && _a !== void 0 ? _a : [])
584
+ .filter(function (field) {
585
+ return ["person", "listPerson"].includes(field.type);
586
+ })
587
+ .map(function (field) { return field.id; }));
588
+ var personIds = records.flatMap(function (record) {
589
+ var _a;
590
+ return Object.values((_a = record.values) !== null && _a !== void 0 ? _a : {}).flatMap(function (value) {
591
+ return value && personColumns.has(value.columnId)
592
+ ? [value.oldValue, value.newValue].flat()
593
+ : [];
594
+ });
595
+ });
596
+ var ids = Array.from(new Set(__spreadArray(__spreadArray([], records.map(function (record) { return record.userId; }), true), personIds, true).filter(function (id) { return typeof id === "string" && id; })));
580
597
  setAuthorIds(function (previous) {
581
598
  return JSON.stringify(previous) === JSON.stringify(ids) ? previous : ids;
582
599
  });