@multiplatform.one/frappe-ui 7.22.0 → 7.23.1

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 (222) hide show
  1. package/README.md +14 -0
  2. package/dist/cjs/FrappeForm.cjs +96 -52
  3. package/dist/cjs/FrappeForm.native.js +103 -52
  4. package/dist/cjs/FrappeForm.native.js.map +1 -1
  5. package/dist/cjs/FrappeFormActions.cjs +161 -0
  6. package/dist/cjs/FrappeFormActions.native.js +167 -0
  7. package/dist/cjs/FrappeFormActions.native.js.map +1 -0
  8. package/dist/cjs/FrappeTable.cjs +42 -13
  9. package/dist/cjs/FrappeTable.native.js +55 -19
  10. package/dist/cjs/FrappeTable.native.js.map +1 -1
  11. package/dist/cjs/desk/DeskFormPage.cjs +2 -1
  12. package/dist/cjs/desk/DeskFormPage.native.js +3 -0
  13. package/dist/cjs/desk/DeskFormPage.native.js.map +1 -1
  14. package/dist/cjs/filterFields.cjs +277 -34
  15. package/dist/cjs/filterFields.native.js +311 -36
  16. package/dist/cjs/filterFields.native.js.map +1 -1
  17. package/dist/cjs/formEngine/docLifecycle.cjs +98 -0
  18. package/dist/cjs/formEngine/docLifecycle.native.js +131 -0
  19. package/dist/cjs/formEngine/docLifecycle.native.js.map +1 -0
  20. package/dist/cjs/formEngine/useAmendedAs.cjs +48 -0
  21. package/dist/cjs/formEngine/useAmendedAs.native.js +60 -0
  22. package/dist/cjs/formEngine/useAmendedAs.native.js.map +1 -0
  23. package/dist/cjs/formEngine/useDocRights.cjs +2 -2
  24. package/dist/cjs/formEngine/useDocRights.native.js +2 -2
  25. package/dist/cjs/formEngine/useDocRights.native.js.map +1 -1
  26. package/dist/cjs/formEngine/useFormEngine.cjs +1 -0
  27. package/dist/cjs/formEngine/useFormEngine.native.js +1 -0
  28. package/dist/cjs/formEngine/useFormEngine.native.js.map +1 -1
  29. package/dist/cjs/index.cjs +30 -1
  30. package/dist/cjs/index.native.js +30 -1
  31. package/dist/cjs/index.native.js.map +1 -1
  32. package/dist/cjs/list/listColumns.cjs +397 -0
  33. package/dist/cjs/list/listColumns.native.js +447 -0
  34. package/dist/cjs/list/listColumns.native.js.map +1 -0
  35. package/dist/cjs/list/listFields.cjs +50 -0
  36. package/dist/cjs/list/listFields.native.js +79 -0
  37. package/dist/cjs/list/listFields.native.js.map +1 -0
  38. package/dist/cjs/list/listFormat.cjs +68 -0
  39. package/dist/cjs/list/listFormat.native.js +74 -0
  40. package/dist/cjs/list/listFormat.native.js.map +1 -0
  41. package/dist/cjs/list/statusColors.cjs +102 -0
  42. package/dist/cjs/list/statusColors.native.js +109 -0
  43. package/dist/cjs/list/statusColors.native.js.map +1 -0
  44. package/dist/cjs/useFrappeAggregate.cjs +1 -1
  45. package/dist/cjs/useFrappeAggregate.native.js +1 -1
  46. package/dist/cjs/useFrappeAggregate.native.js.map +1 -1
  47. package/dist/esm/FrappeForm.mjs +97 -53
  48. package/dist/esm/FrappeForm.mjs.map +1 -1
  49. package/dist/esm/FrappeForm.native.js +104 -53
  50. package/dist/esm/FrappeForm.native.js.map +1 -1
  51. package/dist/esm/FrappeFormActions.mjs +136 -0
  52. package/dist/esm/FrappeFormActions.mjs.map +1 -0
  53. package/dist/esm/FrappeFormActions.native.js +139 -0
  54. package/dist/esm/FrappeFormActions.native.js.map +1 -0
  55. package/dist/esm/FrappeTable.mjs +42 -13
  56. package/dist/esm/FrappeTable.mjs.map +1 -1
  57. package/dist/esm/FrappeTable.native.js +55 -19
  58. package/dist/esm/FrappeTable.native.js.map +1 -1
  59. package/dist/esm/desk/DeskFormPage.mjs +2 -1
  60. package/dist/esm/desk/DeskFormPage.mjs.map +1 -1
  61. package/dist/esm/desk/DeskFormPage.native.js +3 -0
  62. package/dist/esm/desk/DeskFormPage.native.js.map +1 -1
  63. package/dist/esm/filterFields.mjs +263 -34
  64. package/dist/esm/filterFields.mjs.map +1 -1
  65. package/dist/esm/filterFields.native.js +297 -36
  66. package/dist/esm/filterFields.native.js.map +1 -1
  67. package/dist/esm/formEngine/docLifecycle.mjs +68 -0
  68. package/dist/esm/formEngine/docLifecycle.mjs.map +1 -0
  69. package/dist/esm/formEngine/docLifecycle.native.js +98 -0
  70. package/dist/esm/formEngine/docLifecycle.native.js.map +1 -0
  71. package/dist/esm/formEngine/useAmendedAs.mjs +23 -0
  72. package/dist/esm/formEngine/useAmendedAs.mjs.map +1 -0
  73. package/dist/esm/formEngine/useAmendedAs.native.js +32 -0
  74. package/dist/esm/formEngine/useAmendedAs.native.js.map +1 -0
  75. package/dist/esm/formEngine/useDocRights.mjs +2 -2
  76. package/dist/esm/formEngine/useDocRights.mjs.map +1 -1
  77. package/dist/esm/formEngine/useDocRights.native.js +2 -2
  78. package/dist/esm/formEngine/useDocRights.native.js.map +1 -1
  79. package/dist/esm/formEngine/useFormEngine.mjs +1 -1
  80. package/dist/esm/formEngine/useFormEngine.mjs.map +1 -1
  81. package/dist/esm/formEngine/useFormEngine.native.js +1 -1
  82. package/dist/esm/formEngine/useFormEngine.native.js.map +1 -1
  83. package/dist/esm/index.mjs +6 -2
  84. package/dist/esm/index.mjs.map +1 -1
  85. package/dist/esm/index.native.js +6 -2
  86. package/dist/esm/index.native.js.map +1 -1
  87. package/dist/esm/list/listColumns.mjs +372 -0
  88. package/dist/esm/list/listColumns.mjs.map +1 -0
  89. package/dist/esm/list/listColumns.native.js +419 -0
  90. package/dist/esm/list/listColumns.native.js.map +1 -0
  91. package/dist/esm/list/listFields.mjs +23 -0
  92. package/dist/esm/list/listFields.mjs.map +1 -0
  93. package/dist/esm/list/listFields.native.js +49 -0
  94. package/dist/esm/list/listFields.native.js.map +1 -0
  95. package/dist/esm/list/listFormat.mjs +38 -0
  96. package/dist/esm/list/listFormat.mjs.map +1 -0
  97. package/dist/esm/list/listFormat.native.js +41 -0
  98. package/dist/esm/list/listFormat.native.js.map +1 -0
  99. package/dist/esm/list/statusColors.mjs +77 -0
  100. package/dist/esm/list/statusColors.mjs.map +1 -0
  101. package/dist/esm/list/statusColors.native.js +81 -0
  102. package/dist/esm/list/statusColors.native.js.map +1 -0
  103. package/dist/esm/useFrappeAggregate.mjs +1 -1
  104. package/dist/esm/useFrappeAggregate.mjs.map +1 -1
  105. package/dist/esm/useFrappeAggregate.native.js +1 -1
  106. package/dist/esm/useFrappeAggregate.native.js.map +1 -1
  107. package/dist/jsx/FrappeForm.mjs +97 -53
  108. package/dist/jsx/FrappeForm.mjs.map +1 -1
  109. package/dist/jsx/FrappeForm.native.js +103 -52
  110. package/dist/jsx/FrappeForm.native.js.map +1 -1
  111. package/dist/jsx/FrappeFormActions.mjs +136 -0
  112. package/dist/jsx/FrappeFormActions.mjs.map +1 -0
  113. package/dist/jsx/FrappeFormActions.native.js +167 -0
  114. package/dist/jsx/FrappeFormActions.native.js.map +1 -0
  115. package/dist/jsx/FrappeTable.mjs +42 -13
  116. package/dist/jsx/FrappeTable.mjs.map +1 -1
  117. package/dist/jsx/FrappeTable.native.js +55 -19
  118. package/dist/jsx/FrappeTable.native.js.map +1 -1
  119. package/dist/jsx/desk/DeskFormPage.mjs +2 -1
  120. package/dist/jsx/desk/DeskFormPage.mjs.map +1 -1
  121. package/dist/jsx/desk/DeskFormPage.native.js +3 -0
  122. package/dist/jsx/desk/DeskFormPage.native.js.map +1 -1
  123. package/dist/jsx/filterFields.mjs +263 -34
  124. package/dist/jsx/filterFields.mjs.map +1 -1
  125. package/dist/jsx/filterFields.native.js +311 -36
  126. package/dist/jsx/filterFields.native.js.map +1 -1
  127. package/dist/jsx/formEngine/docLifecycle.mjs +68 -0
  128. package/dist/jsx/formEngine/docLifecycle.mjs.map +1 -0
  129. package/dist/jsx/formEngine/docLifecycle.native.js +131 -0
  130. package/dist/jsx/formEngine/docLifecycle.native.js.map +1 -0
  131. package/dist/jsx/formEngine/useAmendedAs.mjs +23 -0
  132. package/dist/jsx/formEngine/useAmendedAs.mjs.map +1 -0
  133. package/dist/jsx/formEngine/useAmendedAs.native.js +60 -0
  134. package/dist/jsx/formEngine/useAmendedAs.native.js.map +1 -0
  135. package/dist/jsx/formEngine/useDocRights.mjs +2 -2
  136. package/dist/jsx/formEngine/useDocRights.mjs.map +1 -1
  137. package/dist/jsx/formEngine/useDocRights.native.js +2 -2
  138. package/dist/jsx/formEngine/useDocRights.native.js.map +1 -1
  139. package/dist/jsx/formEngine/useFormEngine.mjs +1 -1
  140. package/dist/jsx/formEngine/useFormEngine.mjs.map +1 -1
  141. package/dist/jsx/formEngine/useFormEngine.native.js +1 -0
  142. package/dist/jsx/formEngine/useFormEngine.native.js.map +1 -1
  143. package/dist/jsx/index.js +6 -2
  144. package/dist/jsx/index.js.map +1 -1
  145. package/dist/jsx/index.mjs +6 -2
  146. package/dist/jsx/index.mjs.map +1 -1
  147. package/dist/jsx/index.native.js +30 -1
  148. package/dist/jsx/index.native.js.map +1 -1
  149. package/dist/jsx/list/listColumns.mjs +372 -0
  150. package/dist/jsx/list/listColumns.mjs.map +1 -0
  151. package/dist/jsx/list/listColumns.native.js +447 -0
  152. package/dist/jsx/list/listColumns.native.js.map +1 -0
  153. package/dist/jsx/list/listFields.mjs +23 -0
  154. package/dist/jsx/list/listFields.mjs.map +1 -0
  155. package/dist/jsx/list/listFields.native.js +79 -0
  156. package/dist/jsx/list/listFields.native.js.map +1 -0
  157. package/dist/jsx/list/listFormat.mjs +38 -0
  158. package/dist/jsx/list/listFormat.mjs.map +1 -0
  159. package/dist/jsx/list/listFormat.native.js +74 -0
  160. package/dist/jsx/list/listFormat.native.js.map +1 -0
  161. package/dist/jsx/list/statusColors.mjs +77 -0
  162. package/dist/jsx/list/statusColors.mjs.map +1 -0
  163. package/dist/jsx/list/statusColors.native.js +109 -0
  164. package/dist/jsx/list/statusColors.native.js.map +1 -0
  165. package/dist/jsx/useFrappeAggregate.mjs +1 -1
  166. package/dist/jsx/useFrappeAggregate.mjs.map +1 -1
  167. package/dist/jsx/useFrappeAggregate.native.js +1 -1
  168. package/dist/jsx/useFrappeAggregate.native.js.map +1 -1
  169. package/package.json +22 -16
  170. package/src/FrappeForm.deskSemantics.spec.tsx +1 -1
  171. package/src/FrappeForm.lifecycle.spec.tsx +463 -0
  172. package/src/FrappeForm.lifecycle.stories.tsx +84 -0
  173. package/src/FrappeForm.tsx +124 -84
  174. package/src/FrappeFormActions.tsx +216 -0
  175. package/src/FrappeTable.defaultColumns.spec.tsx +229 -0
  176. package/src/FrappeTable.tsx +79 -32
  177. package/src/desk/DeskFormPage.tsx +1 -0
  178. package/src/filterFields.spec.ts +57 -2
  179. package/src/filterFields.ts +365 -38
  180. package/src/formEngine/docLifecycle.spec.ts +195 -0
  181. package/src/formEngine/docLifecycle.ts +148 -0
  182. package/src/formEngine/useAmendedAs.ts +38 -0
  183. package/src/formEngine/useDocRights.ts +11 -3
  184. package/src/formEngine/useFormEngine.ts +1 -1
  185. package/src/frappeViews.designLaw.spec.ts +6 -0
  186. package/src/index.ts +47 -1
  187. package/src/list/listColumns.tsx +488 -0
  188. package/src/list/listFields.spec.ts +147 -0
  189. package/src/list/listFields.ts +68 -0
  190. package/src/list/listFormat.spec.ts +151 -0
  191. package/src/list/listFormat.ts +80 -0
  192. package/src/list/seam.spec.ts +116 -0
  193. package/src/list/statusColors.spec.ts +100 -0
  194. package/src/list/statusColors.ts +94 -0
  195. package/src/useFrappeAggregate.ts +1 -1
  196. package/types/FrappeForm.d.ts +13 -3
  197. package/types/FrappeForm.d.ts.map +1 -1
  198. package/types/FrappeFormActions.d.ts +36 -0
  199. package/types/FrappeFormActions.d.ts.map +1 -0
  200. package/types/FrappeTable.d.ts +11 -5
  201. package/types/FrappeTable.d.ts.map +1 -1
  202. package/types/desk/DeskFormPage.d.ts.map +1 -1
  203. package/types/filterFields.d.ts +81 -10
  204. package/types/filterFields.d.ts.map +1 -1
  205. package/types/formEngine/docLifecycle.d.ts +59 -0
  206. package/types/formEngine/docLifecycle.d.ts.map +1 -0
  207. package/types/formEngine/useAmendedAs.d.ts +9 -0
  208. package/types/formEngine/useAmendedAs.d.ts.map +1 -0
  209. package/types/formEngine/useDocRights.d.ts +1 -1
  210. package/types/formEngine/useDocRights.d.ts.map +1 -1
  211. package/types/formEngine/useFormEngine.d.ts +1 -0
  212. package/types/formEngine/useFormEngine.d.ts.map +1 -1
  213. package/types/index.d.ts +5 -1
  214. package/types/index.d.ts.map +1 -1
  215. package/types/list/listColumns.d.ts +41 -0
  216. package/types/list/listColumns.d.ts.map +1 -0
  217. package/types/list/listFields.d.ts +16 -0
  218. package/types/list/listFields.d.ts.map +1 -0
  219. package/types/list/listFormat.d.ts +30 -0
  220. package/types/list/listFormat.d.ts.map +1 -0
  221. package/types/list/statusColors.d.ts +14 -0
  222. package/types/list/statusColors.d.ts.map +1 -0
@@ -0,0 +1,397 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all) __defProp(target, name, {
7
+ get: all[name],
8
+ enumerable: true
9
+ });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
14
+ get: () => from[key],
15
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
16
+ });
17
+ }
18
+ return to;
19
+ };
20
+ var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
21
+ value: true
22
+ }), mod);
23
+ var listColumns_exports = {};
24
+ __export(listColumns_exports, {
25
+ buildListColumns: () => buildListColumns
26
+ });
27
+ module.exports = __toCommonJS(listColumns_exports);
28
+ var import_components = require("@multiplatform.one/components");
29
+ var import_forms = require("@multiplatform.one/forms");
30
+ var import_react = require("@phosphor-icons/react");
31
+ var import_theme = require("@multiplatform.one/theme");
32
+ var import_listFields = require("./listFields.cjs");
33
+ var import_listFormat = require("./listFormat.cjs");
34
+ var import_statusColors = require("./statusColors.cjs");
35
+ var import_jsx_runtime = require("react/jsx-runtime");
36
+ const NUMERIC_FIELDTYPES = /* @__PURE__ */new Set(["Currency", "Float", "Int", "Percent", "Duration"]);
37
+ const RICH_TEXT_FIELDTYPES = /* @__PURE__ */new Set(["Text Editor", "HTML Editor", "HTML", "Markdown Editor", "Long Text", "Text", "Small Text"]);
38
+ function cellPreview(value, fieldtype) {
39
+ const text = fieldtype && RICH_TEXT_FIELDTYPES.has(fieldtype) ? (0, import_listFormat.stripHtmlPreview)(value) : value;
40
+ return text.replace(/\s+/g, " ").trim();
41
+ }
42
+ function isStatusField(field, meta) {
43
+ if (field.fieldname === "status") return true;
44
+ if (field.fieldtype !== "Select") return false;
45
+ const stateTitles = new Set((meta?.states ?? []).map(state => (state.title ?? "").trim().toLowerCase()));
46
+ if (stateTitles.size === 0) return false;
47
+ const options = (field.options ?? "").split("\n").map(option => option.trim().toLowerCase());
48
+ return options.some(option => option && stateTitles.has(option));
49
+ }
50
+ function isIndicatorField(field, meta) {
51
+ if (field.fieldtype === "Select") return true;
52
+ if (field.fieldtype === "Check" && field.fieldname === "enabled") return true;
53
+ return isStatusField(field, meta);
54
+ }
55
+ function stopRowPress(event) {
56
+ event?.stopPropagation?.();
57
+ }
58
+ function chipColorFromStatus(value, meta) {
59
+ const ramp = (0, import_statusColors.statusPillColors)(value, meta).background.replace(/^\$/, "").replace(/\d+$/, "");
60
+ if (ramp === "pink") return "purple";
61
+ if (ramp === "red" || ramp === "green" || ramp === "blue" || ramp === "yellow" || ramp === "orange" || ramp === "purple" || ramp === "gray") {
62
+ return ramp;
63
+ }
64
+ return "gray";
65
+ }
66
+ function IndicatorPill({
67
+ value,
68
+ meta,
69
+ fieldname,
70
+ filterValue,
71
+ onFilterClick
72
+ }) {
73
+ const chipColor = chipColorFromStatus(value, meta);
74
+ const applied = filterValue ?? value;
75
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.XStack, {
76
+ alignSelf: "flex-start",
77
+ ...(onFilterClick ? {
78
+ "data-filter": `${fieldname},=,${applied}`,
79
+ onPress: event => stopRowPress(event)
80
+ } : {}),
81
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Chip, {
82
+ size: "$2",
83
+ variant: "subtle",
84
+ color: chipColor,
85
+ onPress: onFilterClick ? () => onFilterClick(fieldname, applied) : void 0,
86
+ children: value
87
+ })
88
+ });
89
+ }
90
+ function FilterableText({
91
+ fieldname,
92
+ value,
93
+ children,
94
+ onFilterClick
95
+ }) {
96
+ if (!onFilterClick) return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, {
97
+ children
98
+ });
99
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.XStack, {
100
+ role: "button",
101
+ cursor: "pointer",
102
+ minWidth: 0,
103
+ flexShrink: 1,
104
+ onPress: event => {
105
+ stopRowPress(event);
106
+ onFilterClick(fieldname, value);
107
+ },
108
+ hoverStyle: {
109
+ opacity: 0.8
110
+ },
111
+ ...{
112
+ "data-filter": `${fieldname},=,${value}`
113
+ },
114
+ children
115
+ });
116
+ }
117
+ function commentCount(doc) {
118
+ const raw = doc._comment_count;
119
+ if (typeof raw === "number" && Number.isFinite(raw)) return raw;
120
+ if (typeof raw === "string" && raw.trim()) {
121
+ const parsed = Number(raw);
122
+ if (Number.isFinite(parsed)) return parsed;
123
+ }
124
+ const comments = doc._comments;
125
+ if (typeof comments === "string" && comments.trim()) {
126
+ try {
127
+ const parsed = JSON.parse(comments);
128
+ if (Array.isArray(parsed)) return parsed.length;
129
+ } catch {
130
+ return 0;
131
+ }
132
+ }
133
+ return 0;
134
+ }
135
+ function LikeControl({
136
+ doc,
137
+ t,
138
+ sessionUser,
139
+ onToggleLike,
140
+ likeOverrides
141
+ }) {
142
+ const name = doc.name ?? "";
143
+ const likedBy = (0, import_listFormat.parseUserListField)(doc._liked_by);
144
+ const liked = likeOverrides?.[name] ?? (sessionUser ? likedBy.includes(sessionUser) : false);
145
+ const likeLabel = liked ? t("list.unlike", "Remove from liked") : t("list.like", "Add to liked");
146
+ if (!onToggleLike || !name) {
147
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
148
+ fontSize: "$4",
149
+ color: liked ? "$red10" : "$color8",
150
+ role: "img",
151
+ "aria-label": likeLabel,
152
+ children: liked ? "\u2665" : "\u2661"
153
+ });
154
+ }
155
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_forms.Button, {
156
+ circular: true,
157
+ chromeless: true,
158
+ size: "$2",
159
+ col: liked ? "$red10" : "$color8",
160
+ icon: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_react.HeartIcon, {
161
+ size: 16,
162
+ weight: liked ? "fill" : "regular"
163
+ }),
164
+ "aria-label": likeLabel,
165
+ "aria-pressed": liked,
166
+ onPress: event => {
167
+ stopRowPress(event);
168
+ onToggleLike(name, !liked);
169
+ }
170
+ });
171
+ }
172
+ function ActivityCluster({
173
+ doc,
174
+ t,
175
+ sessionUser,
176
+ onToggleLike,
177
+ likeOverrides
178
+ }) {
179
+ const assignees = (0, import_listFormat.parseUserListField)(doc._assign);
180
+ const comments = commentCount(doc);
181
+ const modified = doc.modified ? String(doc.modified) : "";
182
+ const absolute = modified ? (0, import_theme.formatAbsoluteDateTime)(modified) : "";
183
+ return /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_components.XStack, {
184
+ alignItems: "center",
185
+ justifyContent: "flex-end",
186
+ gap: "$2",
187
+ minWidth: 0,
188
+ testID: "list-activity",
189
+ children: [assignees.slice(0, 3).map(user => /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Avatar, {
190
+ name: user,
191
+ size: 20,
192
+ circular: true,
193
+ "aria-label": user
194
+ }, user)), modified ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
195
+ fontSize: "$2",
196
+ color: "$color9",
197
+ ...{
198
+ title: absolute || void 0
199
+ },
200
+ children: (0, import_listFormat.formatTimeAgo)(modified)
201
+ }) : null, /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_components.XStack, {
202
+ alignItems: "center",
203
+ gap: "$1",
204
+ ...{
205
+ "aria-label": t("list.comments", "Comments")
206
+ },
207
+ children: [/* @__PURE__ */(0, import_jsx_runtime.jsx)(import_react.ChatCircleIcon, {
208
+ size: 14
209
+ }), /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
210
+ fontSize: "$2",
211
+ color: "$color9",
212
+ children: comments
213
+ })]
214
+ }), /* @__PURE__ */(0, import_jsx_runtime.jsx)(LikeControl, {
215
+ doc,
216
+ t,
217
+ sessionUser,
218
+ onToggleLike,
219
+ likeOverrides
220
+ })]
221
+ });
222
+ }
223
+ function fieldCell(field, meta, onFilterClick) {
224
+ return ({
225
+ getValue
226
+ }) => {
227
+ const raw = getValue();
228
+ if (raw === null || raw === void 0 || raw === "") return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
229
+ fontSize: "$3",
230
+ color: "$color8",
231
+ children: "\u2014"
232
+ });
233
+ if (field.fieldtype === "Check" && field.fieldname === "enabled") {
234
+ const on = raw === true || raw === 1 || raw === "1";
235
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(IndicatorPill, {
236
+ value: on ? "Active" : "Disabled",
237
+ meta,
238
+ fieldname: field.fieldname,
239
+ filterValue: on ? "1" : "0",
240
+ onFilterClick
241
+ });
242
+ }
243
+ const value = String(raw);
244
+ if (isIndicatorField(field, meta)) {
245
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(IndicatorPill, {
246
+ value,
247
+ meta,
248
+ fieldname: field.fieldname,
249
+ onFilterClick
250
+ });
251
+ }
252
+ switch (field.fieldtype) {
253
+ case "Check":
254
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
255
+ fontSize: "$3",
256
+ color: raw ? "$green11" : "$color8",
257
+ children: raw ? "\u2713" : "\u2014"
258
+ });
259
+ case "Date":
260
+ case "Datetime":
261
+ {
262
+ const display = (0, import_listFormat.formatDateCell)(value);
263
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(FilterableText, {
264
+ fieldname: field.fieldname,
265
+ value,
266
+ onFilterClick,
267
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
268
+ fontSize: "$3",
269
+ color: "$color11",
270
+ children: display
271
+ })
272
+ });
273
+ }
274
+ case "Currency":
275
+ case "Float":
276
+ case "Int":
277
+ case "Percent":
278
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
279
+ fontSize: "$3",
280
+ color: "$color12",
281
+ textAlign: "right",
282
+ children: value
283
+ });
284
+ case "Link":
285
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(FilterableText, {
286
+ fieldname: field.fieldname,
287
+ value,
288
+ onFilterClick,
289
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
290
+ fontSize: "$3",
291
+ color: "$color11",
292
+ numberOfLines: 1,
293
+ flexShrink: 1,
294
+ minWidth: 0,
295
+ children: value
296
+ })
297
+ });
298
+ default:
299
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
300
+ fontSize: "$3",
301
+ color: "$color11",
302
+ numberOfLines: 1,
303
+ flexShrink: 1,
304
+ minWidth: 0,
305
+ children: cellPreview(value, field.fieldtype)
306
+ });
307
+ }
308
+ };
309
+ }
310
+ function buildListColumns({
311
+ meta,
312
+ t,
313
+ sessionUser,
314
+ onToggleLike,
315
+ likeOverrides,
316
+ permMatrix,
317
+ getDocHref,
318
+ onFilterClick
319
+ }) {
320
+ const titleField = meta?.title_field || "name";
321
+ const columns = [];
322
+ const titleMeta = meta?.fields?.find(field => field.fieldname === titleField);
323
+ columns.push({
324
+ id: titleField,
325
+ header: titleField === "name" ? t("list.idColumn", "ID") : titleMeta?.label || t("list.titleColumn", "Title"),
326
+ accessorKey: titleField,
327
+ minWidth: 180,
328
+ meta: {
329
+ role: "title"
330
+ },
331
+ cell: ({
332
+ row,
333
+ getValue
334
+ }) => {
335
+ const raw = getValue();
336
+ const name = row.original.name ?? "";
337
+ const value = raw === null || raw === void 0 || raw === "" ? name : String(raw);
338
+ const href = name && getDocHref ? getDocHref(name) : void 0;
339
+ const label = cellPreview(value, titleMeta?.fieldtype);
340
+ const subject = /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
341
+ fontSize: "$3",
342
+ fontWeight: "400",
343
+ color: "$color12",
344
+ numberOfLines: 1,
345
+ flexShrink: 1,
346
+ minWidth: 0,
347
+ children: label
348
+ });
349
+ if (!href) return subject;
350
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Anchor, {
351
+ href,
352
+ textDecorationLine: "none",
353
+ minWidth: 0,
354
+ flexShrink: 1,
355
+ onPress: stopRowPress,
356
+ children: subject
357
+ });
358
+ }
359
+ });
360
+ for (const field of (0, import_listFields.listViewFields)(meta, titleField, permMatrix)) {
361
+ columns.push({
362
+ id: field.fieldname,
363
+ header: field.label || field.fieldname,
364
+ accessorKey: field.fieldname,
365
+ ...(NUMERIC_FIELDTYPES.has(field.fieldtype) ? {
366
+ align: "right"
367
+ } : {}),
368
+ cell: fieldCell(field, meta, onFilterClick)
369
+ });
370
+ }
371
+ columns.push({
372
+ id: "_activity",
373
+ header: t("list.activity", "Activity"),
374
+ meta: {
375
+ role: "actions",
376
+ label: t("list.activity", "Activity")
377
+ },
378
+ sortable: false,
379
+ filterable: false,
380
+ cell: ({
381
+ row
382
+ }) => /* @__PURE__ */(0, import_jsx_runtime.jsx)(ActivityCluster, {
383
+ doc: row.original,
384
+ t,
385
+ sessionUser,
386
+ onToggleLike,
387
+ likeOverrides
388
+ })
389
+ });
390
+ columns.push({
391
+ id: "modified",
392
+ accessorKey: "modified",
393
+ header: t("list.lastUpdated", "Last Updated On"),
394
+ enableHiding: true
395
+ });
396
+ return columns;
397
+ }