@multiplatform.one/frappe-ui 7.22.0 → 7.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) 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/esm/FrappeForm.mjs +97 -53
  45. package/dist/esm/FrappeForm.mjs.map +1 -1
  46. package/dist/esm/FrappeForm.native.js +104 -53
  47. package/dist/esm/FrappeForm.native.js.map +1 -1
  48. package/dist/esm/FrappeFormActions.mjs +136 -0
  49. package/dist/esm/FrappeFormActions.mjs.map +1 -0
  50. package/dist/esm/FrappeFormActions.native.js +139 -0
  51. package/dist/esm/FrappeFormActions.native.js.map +1 -0
  52. package/dist/esm/FrappeTable.mjs +42 -13
  53. package/dist/esm/FrappeTable.mjs.map +1 -1
  54. package/dist/esm/FrappeTable.native.js +55 -19
  55. package/dist/esm/FrappeTable.native.js.map +1 -1
  56. package/dist/esm/desk/DeskFormPage.mjs +2 -1
  57. package/dist/esm/desk/DeskFormPage.mjs.map +1 -1
  58. package/dist/esm/desk/DeskFormPage.native.js +3 -0
  59. package/dist/esm/desk/DeskFormPage.native.js.map +1 -1
  60. package/dist/esm/filterFields.mjs +263 -34
  61. package/dist/esm/filterFields.mjs.map +1 -1
  62. package/dist/esm/filterFields.native.js +297 -36
  63. package/dist/esm/filterFields.native.js.map +1 -1
  64. package/dist/esm/formEngine/docLifecycle.mjs +68 -0
  65. package/dist/esm/formEngine/docLifecycle.mjs.map +1 -0
  66. package/dist/esm/formEngine/docLifecycle.native.js +98 -0
  67. package/dist/esm/formEngine/docLifecycle.native.js.map +1 -0
  68. package/dist/esm/formEngine/useAmendedAs.mjs +23 -0
  69. package/dist/esm/formEngine/useAmendedAs.mjs.map +1 -0
  70. package/dist/esm/formEngine/useAmendedAs.native.js +32 -0
  71. package/dist/esm/formEngine/useAmendedAs.native.js.map +1 -0
  72. package/dist/esm/formEngine/useDocRights.mjs +2 -2
  73. package/dist/esm/formEngine/useDocRights.mjs.map +1 -1
  74. package/dist/esm/formEngine/useDocRights.native.js +2 -2
  75. package/dist/esm/formEngine/useDocRights.native.js.map +1 -1
  76. package/dist/esm/formEngine/useFormEngine.mjs +1 -1
  77. package/dist/esm/formEngine/useFormEngine.mjs.map +1 -1
  78. package/dist/esm/formEngine/useFormEngine.native.js +1 -1
  79. package/dist/esm/formEngine/useFormEngine.native.js.map +1 -1
  80. package/dist/esm/index.mjs +6 -2
  81. package/dist/esm/index.mjs.map +1 -1
  82. package/dist/esm/index.native.js +6 -2
  83. package/dist/esm/index.native.js.map +1 -1
  84. package/dist/esm/list/listColumns.mjs +372 -0
  85. package/dist/esm/list/listColumns.mjs.map +1 -0
  86. package/dist/esm/list/listColumns.native.js +419 -0
  87. package/dist/esm/list/listColumns.native.js.map +1 -0
  88. package/dist/esm/list/listFields.mjs +23 -0
  89. package/dist/esm/list/listFields.mjs.map +1 -0
  90. package/dist/esm/list/listFields.native.js +49 -0
  91. package/dist/esm/list/listFields.native.js.map +1 -0
  92. package/dist/esm/list/listFormat.mjs +38 -0
  93. package/dist/esm/list/listFormat.mjs.map +1 -0
  94. package/dist/esm/list/listFormat.native.js +41 -0
  95. package/dist/esm/list/listFormat.native.js.map +1 -0
  96. package/dist/esm/list/statusColors.mjs +77 -0
  97. package/dist/esm/list/statusColors.mjs.map +1 -0
  98. package/dist/esm/list/statusColors.native.js +81 -0
  99. package/dist/esm/list/statusColors.native.js.map +1 -0
  100. package/dist/jsx/FrappeForm.mjs +97 -53
  101. package/dist/jsx/FrappeForm.mjs.map +1 -1
  102. package/dist/jsx/FrappeForm.native.js +103 -52
  103. package/dist/jsx/FrappeForm.native.js.map +1 -1
  104. package/dist/jsx/FrappeFormActions.mjs +136 -0
  105. package/dist/jsx/FrappeFormActions.mjs.map +1 -0
  106. package/dist/jsx/FrappeFormActions.native.js +167 -0
  107. package/dist/jsx/FrappeFormActions.native.js.map +1 -0
  108. package/dist/jsx/FrappeTable.mjs +42 -13
  109. package/dist/jsx/FrappeTable.mjs.map +1 -1
  110. package/dist/jsx/FrappeTable.native.js +55 -19
  111. package/dist/jsx/FrappeTable.native.js.map +1 -1
  112. package/dist/jsx/desk/DeskFormPage.mjs +2 -1
  113. package/dist/jsx/desk/DeskFormPage.mjs.map +1 -1
  114. package/dist/jsx/desk/DeskFormPage.native.js +3 -0
  115. package/dist/jsx/desk/DeskFormPage.native.js.map +1 -1
  116. package/dist/jsx/filterFields.mjs +263 -34
  117. package/dist/jsx/filterFields.mjs.map +1 -1
  118. package/dist/jsx/filterFields.native.js +311 -36
  119. package/dist/jsx/filterFields.native.js.map +1 -1
  120. package/dist/jsx/formEngine/docLifecycle.mjs +68 -0
  121. package/dist/jsx/formEngine/docLifecycle.mjs.map +1 -0
  122. package/dist/jsx/formEngine/docLifecycle.native.js +131 -0
  123. package/dist/jsx/formEngine/docLifecycle.native.js.map +1 -0
  124. package/dist/jsx/formEngine/useAmendedAs.mjs +23 -0
  125. package/dist/jsx/formEngine/useAmendedAs.mjs.map +1 -0
  126. package/dist/jsx/formEngine/useAmendedAs.native.js +60 -0
  127. package/dist/jsx/formEngine/useAmendedAs.native.js.map +1 -0
  128. package/dist/jsx/formEngine/useDocRights.mjs +2 -2
  129. package/dist/jsx/formEngine/useDocRights.mjs.map +1 -1
  130. package/dist/jsx/formEngine/useDocRights.native.js +2 -2
  131. package/dist/jsx/formEngine/useDocRights.native.js.map +1 -1
  132. package/dist/jsx/formEngine/useFormEngine.mjs +1 -1
  133. package/dist/jsx/formEngine/useFormEngine.mjs.map +1 -1
  134. package/dist/jsx/formEngine/useFormEngine.native.js +1 -0
  135. package/dist/jsx/formEngine/useFormEngine.native.js.map +1 -1
  136. package/dist/jsx/index.js +6 -2
  137. package/dist/jsx/index.js.map +1 -1
  138. package/dist/jsx/index.mjs +6 -2
  139. package/dist/jsx/index.mjs.map +1 -1
  140. package/dist/jsx/index.native.js +30 -1
  141. package/dist/jsx/index.native.js.map +1 -1
  142. package/dist/jsx/list/listColumns.mjs +372 -0
  143. package/dist/jsx/list/listColumns.mjs.map +1 -0
  144. package/dist/jsx/list/listColumns.native.js +447 -0
  145. package/dist/jsx/list/listColumns.native.js.map +1 -0
  146. package/dist/jsx/list/listFields.mjs +23 -0
  147. package/dist/jsx/list/listFields.mjs.map +1 -0
  148. package/dist/jsx/list/listFields.native.js +79 -0
  149. package/dist/jsx/list/listFields.native.js.map +1 -0
  150. package/dist/jsx/list/listFormat.mjs +38 -0
  151. package/dist/jsx/list/listFormat.mjs.map +1 -0
  152. package/dist/jsx/list/listFormat.native.js +74 -0
  153. package/dist/jsx/list/listFormat.native.js.map +1 -0
  154. package/dist/jsx/list/statusColors.mjs +77 -0
  155. package/dist/jsx/list/statusColors.mjs.map +1 -0
  156. package/dist/jsx/list/statusColors.native.js +109 -0
  157. package/dist/jsx/list/statusColors.native.js.map +1 -0
  158. package/package.json +22 -16
  159. package/src/FrappeForm.deskSemantics.spec.tsx +1 -1
  160. package/src/FrappeForm.lifecycle.spec.tsx +463 -0
  161. package/src/FrappeForm.lifecycle.stories.tsx +84 -0
  162. package/src/FrappeForm.tsx +124 -84
  163. package/src/FrappeFormActions.tsx +216 -0
  164. package/src/FrappeTable.defaultColumns.spec.tsx +229 -0
  165. package/src/FrappeTable.tsx +79 -32
  166. package/src/desk/DeskFormPage.tsx +1 -0
  167. package/src/filterFields.spec.ts +57 -2
  168. package/src/filterFields.ts +365 -38
  169. package/src/formEngine/docLifecycle.spec.ts +195 -0
  170. package/src/formEngine/docLifecycle.ts +148 -0
  171. package/src/formEngine/useAmendedAs.ts +38 -0
  172. package/src/formEngine/useDocRights.ts +11 -3
  173. package/src/formEngine/useFormEngine.ts +1 -1
  174. package/src/frappeViews.designLaw.spec.ts +6 -0
  175. package/src/index.ts +47 -1
  176. package/src/list/listColumns.tsx +488 -0
  177. package/src/list/listFields.spec.ts +147 -0
  178. package/src/list/listFields.ts +68 -0
  179. package/src/list/listFormat.spec.ts +151 -0
  180. package/src/list/listFormat.ts +80 -0
  181. package/src/list/seam.spec.ts +116 -0
  182. package/src/list/statusColors.spec.ts +100 -0
  183. package/src/list/statusColors.ts +94 -0
  184. package/types/FrappeForm.d.ts +13 -3
  185. package/types/FrappeForm.d.ts.map +1 -1
  186. package/types/FrappeFormActions.d.ts +36 -0
  187. package/types/FrappeFormActions.d.ts.map +1 -0
  188. package/types/FrappeTable.d.ts +11 -5
  189. package/types/FrappeTable.d.ts.map +1 -1
  190. package/types/desk/DeskFormPage.d.ts.map +1 -1
  191. package/types/filterFields.d.ts +81 -10
  192. package/types/filterFields.d.ts.map +1 -1
  193. package/types/formEngine/docLifecycle.d.ts +59 -0
  194. package/types/formEngine/docLifecycle.d.ts.map +1 -0
  195. package/types/formEngine/useAmendedAs.d.ts +9 -0
  196. package/types/formEngine/useAmendedAs.d.ts.map +1 -0
  197. package/types/formEngine/useDocRights.d.ts +1 -1
  198. package/types/formEngine/useDocRights.d.ts.map +1 -1
  199. package/types/formEngine/useFormEngine.d.ts +1 -0
  200. package/types/formEngine/useFormEngine.d.ts.map +1 -1
  201. package/types/index.d.ts +5 -1
  202. package/types/index.d.ts.map +1 -1
  203. package/types/list/listColumns.d.ts +41 -0
  204. package/types/list/listColumns.d.ts.map +1 -0
  205. package/types/list/listFields.d.ts +16 -0
  206. package/types/list/listFields.d.ts.map +1 -0
  207. package/types/list/listFormat.d.ts +30 -0
  208. package/types/list/listFormat.d.ts.map +1 -0
  209. package/types/list/statusColors.d.ts +14 -0
  210. package/types/list/statusColors.d.ts.map +1 -0
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all) __defProp(target, name, {
9
+ get: all[name],
10
+ enumerable: true
11
+ });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
16
+ get: () => from[key],
17
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
18
+ });
19
+ }
20
+ return to;
21
+ };
22
+ var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
23
+ value: true
24
+ }), mod);
25
+ var listFormat_exports = {};
26
+ __export(listFormat_exports, {
27
+ formatDateCell: () => formatDateCell,
28
+ formatTimeAgo: () => formatTimeAgo,
29
+ parseFrappeDate: () => parseFrappeDate,
30
+ parseTagsField: () => parseTagsField,
31
+ parseUserListField: () => parseUserListField,
32
+ stripHtmlPreview: () => stripHtmlPreview
33
+ });
34
+ module.exports = __toCommonJS(listFormat_exports);
35
+ var import_theme = require("@multiplatform.one/theme");
36
+ function parseFrappeDate(value) {
37
+ var isoish = value.includes(" ") ? value.replace(" ", "T") : value;
38
+ var date = new Date(isoish);
39
+ return Number.isNaN(date.getTime()) ? void 0 : date;
40
+ }
41
+ function formatDateCell(value, now) {
42
+ if (!parseFrappeDate(value)) return value;
43
+ var isoish = value.includes(" ") ? value.replace(" ", "T") : value;
44
+ return (0, import_theme.formatAbsoluteDate)(isoish, now ? {
45
+ now
46
+ } : void 0);
47
+ }
48
+ function formatTimeAgo(value) {
49
+ var now = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : /* @__PURE__ */new Date();
50
+ var date = parseFrappeDate(value);
51
+ if (!date) return value;
52
+ return (0, import_theme.formatRelativeTimestamp)(date, now.getTime());
53
+ }
54
+ function stripHtmlPreview(value) {
55
+ if (!value.includes("<") && !value.includes("&")) return value;
56
+ return value.replace(/<[^>]*>/g, " ").replace(/&nbsp;/gi, " ").replace(/&amp;/gi, "&").replace(/&lt;/gi, "<").replace(/&gt;/gi, ">").replace(/&#39;|&apos;/gi, "'").replace(/&quot;/gi, '"').replace(/\s+/g, " ").trim();
57
+ }
58
+ function parseUserListField(value) {
59
+ if (Array.isArray(value)) return value.map(String);
60
+ if (typeof value !== "string" || !value) return [];
61
+ try {
62
+ var parsed = JSON.parse(value);
63
+ return Array.isArray(parsed) ? parsed.map(String) : [];
64
+ } catch (unused) {
65
+ return [];
66
+ }
67
+ }
68
+ function parseTagsField(value) {
69
+ if (typeof value !== "string") return [];
70
+ return value.split(",").map(function (tag) {
71
+ return tag.trim();
72
+ }).filter(Boolean);
73
+ }
74
+ //# sourceMappingURL=listFormat.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","listFormat_exports","__export","formatDateCell","formatTimeAgo","parseFrappeDate","parseTagsField","parseUserListField","stripHtmlPreview","module","exports","import_theme","require","isoish","includes","replace","date","Date","Number","isNaN","getTime","now","formatAbsoluteDate","arguments","length","formatRelativeTimestamp","trim","Array","isArray","map","String","parsed","JSON","parse","unused"],"sources":["../../../src/list/listFormat.ts"],"sourcesContent":[null],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,YAAA,GAAAC,GAAA,IAAAC,WAAA,CAAAC,SAAA;EAAAC,KAAA;AAAA,IAAAH,GAAA;AAAA,IAAAI,kBAAA;AAAAC,QAAA,CAAAD,kBAAA;EAAAE,cAAA,EAAAA,CAAA,KAAAA,cAAA;EAAAC,aAAA,EAAAA,CAAA,KAAAA,aAAA;EAAAC,eAAA,EAAAA,CAAA,KAAAA,eAAA;EAAAC,cAAA,EAAAA,CAAA,KAAAA,cAAA;EAAAC,kBAAA,EAAAA,CAAA,KAAAA,kBAAA;EAAAC,gBAAA,EAAAA,CAAA,KAAAA;AAAA;AAIAC,MAAA,CAAAC,OAAA,GAAAd,YAA4D,CAAAK,kBAAA;AAGrD,IAAAU,YAAS,GAAAC,OAAgB,2BAAiC;AAE/D,SAAMP,eAAeA,CAAAL,KAAA,EAAS;EAC9B,IAAAa,MAAM,GAAOb,KAAI,CAAAc,QAAK,CAAM,OAAAd,KAAA,CAAAe,OAAA,aAAAf,KAAA;EAC5B,IAAAgB,IAAO,OAAOC,IAAA,CAAMJ,MAAK;EAC3B,OAAAK,MAAA,CAAAC,KAAA,CAAAH,IAAA,CAAAI,OAAA,eAAAJ,IAAA;AAUO;AACL,SAAKb,cAAgBA,CAAAH,KAAK,EAAGqB,GAAA;EAC7B,KAAAhB,eAAe,CAAML,KAAA,UAAYA,KAAI;EACrC,IAAAa,MAAA,GAAOb,KAAA,CAAAc,QAAA,QAAAd,KAAA,CAAAe,OAAmB,IAAQ,MAAM,GAAEf,KAAI;EAChD,WAAAW,YAAA,CAAAW,kBAAA,EAAAT,MAAA,EAAAQ,GAAA;IAOOA;EACL,SAAM;AACN;AACA,SAAAjB,aAAOA,CAAAJ,KAAA;EACT,IAAAqB,GAAA,GAAAE,SAAA,CAAAC,MAAA,QAAAD,SAAA,iBAAAA,SAAA,yBAAAN,IAAA;EASO,IAAAD,IAAS,GAAAX,eAAiB,CAAAL,KAAuB;EACtD,IAAI,CAACgB,IAAA,EAAM,OAAAhB,KAAY;EACvB,OAAO,IAAAW,YACI,CAAAc,uBACA,EAAAT,IAAA,EAAAK,GAAY,CAAAD,OACpB;AAOL;AAGO,SAASZ,iBAAAR,KAAmB;EACjC,IAAI,CAAAA,KAAM,CAAAc,QAAQ,IAAK,KAAG,CAAAd,KAAO,CAAAc,QAAU,OAAM,OAAAd,KAAA;EACjD,OAAIA,KAAO,CAAAe,OAAA,CAAU,YAAY,GAAC,EAAAA,OAAO,WAAQ,OAAAA,OAAA,iBAAAA,OAAA,gBAAAA,OAAA,gBAAAA,OAAA,wBAAAA,OAAA,kBAAAA,OAAA,cAAAW,IAAA;AACjD;AACE,SAAAnB,kBAAoBA,CAAAP,KAAM,EAAK;EAC/B,IAAA2B,KAAO,CAAAC,OAAM,CAAA5B,KAAQ,UAAUA,KAAA,CAAA6B,GAAO,CAAAC,MAAI,CAAM;EAClD,WAAQ9B,KAAA,kBAAAA,KAAA;EACN;IACF,IAAA+B,MAAA,GAAAC,IAAA,CAAAC,KAAA,CAAAjC,KAAA;IACF,OAAA2B,KAAA,CAAAC,OAAA,CAAAG,MAAA,IAAAA,MAAA,CAAAF,GAAA,CAAAC,MAAA;EAGO,SAASI,MAAA;IACd,OAAI,EAAO;EACX;AAIF","ignoreList":[]}
@@ -0,0 +1,102 @@
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 statusColors_exports = {};
24
+ __export(statusColors_exports, {
25
+ statusPillColors: () => statusPillColors
26
+ });
27
+ module.exports = __toCommonJS(statusColors_exports);
28
+ const DESK_COLOR_TO_RAMP = {
29
+ red: "red",
30
+ green: "green",
31
+ blue: "blue",
32
+ orange: "orange",
33
+ yellow: "yellow",
34
+ amber: "yellow",
35
+ gray: "gray",
36
+ grey: "gray",
37
+ darkgrey: "gray",
38
+ "light-blue": "blue",
39
+ purple: "purple",
40
+ pink: "pink",
41
+ cyan: "blue"
42
+ };
43
+ const STATUS_WORD_TO_RAMP = {
44
+ // green — done / healthy
45
+ closed: "green",
46
+ completed: "green",
47
+ complete: "green",
48
+ finished: "green",
49
+ active: "green",
50
+ enabled: "green",
51
+ approved: "green",
52
+ paid: "green",
53
+ success: "green",
54
+ resolved: "green",
55
+ delivered: "green",
56
+ received: "green",
57
+ // orange — needs attention / in flight
58
+ open: "orange",
59
+ pending: "orange",
60
+ "in progress": "orange",
61
+ "to deliver": "orange",
62
+ "to bill": "orange",
63
+ overdue: "orange",
64
+ medium: "orange",
65
+ // blue — submitted / informational
66
+ submitted: "blue",
67
+ running: "blue",
68
+ new: "blue",
69
+ "in review": "blue",
70
+ low: "blue",
71
+ // red — failed / stopped
72
+ cancelled: "red",
73
+ canceled: "red",
74
+ disabled: "red",
75
+ failed: "red",
76
+ rejected: "red",
77
+ error: "red",
78
+ expired: "red",
79
+ inactive: "red",
80
+ unpaid: "red",
81
+ lost: "red",
82
+ high: "red",
83
+ urgent: "red",
84
+ // gray — inert
85
+ draft: "gray"
86
+ };
87
+ function rampToPill(ramp) {
88
+ return {
89
+ background: `$${ramp}3`,
90
+ text: `$${ramp}11`
91
+ };
92
+ }
93
+ function statusPillColors(status, meta) {
94
+ const normalized = status.trim().toLowerCase();
95
+ const state = meta?.states?.find(s => (s.title ?? "").trim().toLowerCase() === normalized);
96
+ if (state?.color) {
97
+ const ramp2 = DESK_COLOR_TO_RAMP[state.color.trim().toLowerCase()];
98
+ if (ramp2) return rampToPill(ramp2);
99
+ }
100
+ const ramp = STATUS_WORD_TO_RAMP[normalized];
101
+ return rampToPill(ramp ?? "gray");
102
+ }
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all) __defProp(target, name, {
9
+ get: all[name],
10
+ enumerable: true
11
+ });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
16
+ get: () => from[key],
17
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
18
+ });
19
+ }
20
+ return to;
21
+ };
22
+ var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
23
+ value: true
24
+ }), mod);
25
+ var statusColors_exports = {};
26
+ __export(statusColors_exports, {
27
+ statusPillColors: () => statusPillColors
28
+ });
29
+ module.exports = __toCommonJS(statusColors_exports);
30
+ var DESK_COLOR_TO_RAMP = {
31
+ red: "red",
32
+ green: "green",
33
+ blue: "blue",
34
+ orange: "orange",
35
+ yellow: "yellow",
36
+ amber: "yellow",
37
+ gray: "gray",
38
+ grey: "gray",
39
+ darkgrey: "gray",
40
+ "light-blue": "blue",
41
+ purple: "purple",
42
+ pink: "pink",
43
+ cyan: "blue"
44
+ };
45
+ var STATUS_WORD_TO_RAMP = {
46
+ // green — done / healthy
47
+ closed: "green",
48
+ completed: "green",
49
+ complete: "green",
50
+ finished: "green",
51
+ active: "green",
52
+ enabled: "green",
53
+ approved: "green",
54
+ paid: "green",
55
+ success: "green",
56
+ resolved: "green",
57
+ delivered: "green",
58
+ received: "green",
59
+ // orange — needs attention / in flight
60
+ open: "orange",
61
+ pending: "orange",
62
+ "in progress": "orange",
63
+ "to deliver": "orange",
64
+ "to bill": "orange",
65
+ overdue: "orange",
66
+ medium: "orange",
67
+ // blue — submitted / informational
68
+ submitted: "blue",
69
+ running: "blue",
70
+ new: "blue",
71
+ "in review": "blue",
72
+ low: "blue",
73
+ // red — failed / stopped
74
+ cancelled: "red",
75
+ canceled: "red",
76
+ disabled: "red",
77
+ failed: "red",
78
+ rejected: "red",
79
+ error: "red",
80
+ expired: "red",
81
+ inactive: "red",
82
+ unpaid: "red",
83
+ lost: "red",
84
+ high: "red",
85
+ urgent: "red",
86
+ // gray — inert
87
+ draft: "gray"
88
+ };
89
+ function rampToPill(ramp) {
90
+ return {
91
+ background: `$${ramp}3`,
92
+ text: `$${ramp}11`
93
+ };
94
+ }
95
+ function statusPillColors(status, meta) {
96
+ var _meta_states;
97
+ var normalized = status.trim().toLowerCase();
98
+ var state = meta === null || meta === void 0 ? void 0 : (_meta_states = meta.states) === null || _meta_states === void 0 ? void 0 : _meta_states.find(function (s) {
99
+ var _s_title;
100
+ return ((_s_title = s.title) !== null && _s_title !== void 0 ? _s_title : "").trim().toLowerCase() === normalized;
101
+ });
102
+ if (state === null || state === void 0 ? void 0 : state.color) {
103
+ var ramp = DESK_COLOR_TO_RAMP[state.color.trim().toLowerCase()];
104
+ if (ramp) return rampToPill(ramp);
105
+ }
106
+ var ramp1 = STATUS_WORD_TO_RAMP[normalized];
107
+ return rampToPill(ramp1 !== null && ramp1 !== void 0 ? ramp1 : "gray");
108
+ }
109
+ //# sourceMappingURL=statusColors.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","statusColors_exports","__export","statusPillColors","module","exports","DESK_COLOR_TO_RAMP","red","green","blue","orange","yellow","amber","gray","grey","darkgrey","purple","pink","cyan","STATUS_WORD_TO_RAMP","closed","completed","complete","finished","active","enabled","approved","paid","success","resolved","delivered","received","open","pending","overdue","medium","submitted","running","new","low","cancelled","canceled","disabled","failed","rejected","error","expired","inactive","unpaid","lost","high","urgent","draft","rampToPill","ramp","background","text","status","meta","_meta_states","normalized","trim","toLowerCase","state","states","find","s","_s_title","title"],"sources":["../../../src/list/statusColors.ts"],"sourcesContent":[null],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,YAAA,GAAAC,GAAA,IAAAC,WAAA,CAAAC,SAAA;EAAAC,KAAA;AAAA,IAAAH,GAAA;AAAA,IAAAI,oBAAA;AAAAC,QAAA,CAAAD,oBAAA;EAAAE,gBAAA,EAAAA,CAAA,KAAAA;AAAA;AAaAC,MAAM,CAAAC,OAAA,GAAAT,YAA6C,CAAAK,oBAAA;AAAA,IACjDK,kBAAK;EACLC,GAAA,OAAO;EACPC,KAAA,EAAM;EACNC,IAAA,QAAQ;EACRC,MAAA,EAAQ;EACRC,MAAA,EAAO;EACPC,KAAA,EAAM;EACNC,IAAA,EAAM;EACNC,IAAA,QAAU;EACVC,QAAA,QAAc;EACd,YAAQ;EACRC,MAAM;EACNC,IAAA,EAAM;EACRC,IAAA;AAGA;AAAoD,IAAAC,mBAAA;EAElD;EACAC,MAAA,SAAW;EACXC,SAAA,EAAU;EACVC,QAAA,EAAU;EACVC,QAAQ;EACRC,MAAA,SAAS;EACTC,OAAA,SAAU;EACVC,QAAM;EACNC,IAAA,SAAS;EACTC,OAAA,SAAU;EACVC,QAAA,SAAW;EACXC,SAAA,EAAU;EAAAC,QAAA;EAEV;EACAC,IAAA,UAAS;EACTC,OAAA,UAAe;EACf,eAAc;EACd,YAAW;EACX,SAAS;EACTC,OAAA,EAAQ;EAAAC,MAAA;EAER;EACAC,SAAS;EACTC,OAAK;EACLC,GAAA;EACA,WAAK;EAAAC,GAAA;EAEL;EACAC,SAAA,EAAU;EACVC,QAAA,EAAU;EACVC,QAAQ;EACRC,MAAA,OAAU;EACVC,QAAO;EACPC,KAAA,OAAS;EACTC,OAAA,OAAU;EACVC,QAAQ;EACRC,MAAM;EACNC,IAAA,EAAM;EACNC,IAAA,OAAQ;EAAAC,MAAA;EAER;EACFC,KAAA;AAEA;AACE,SAAOC,UAAEA,CAAAC,IAAY;EACvB;IAOOC,UAAS,MAAAD,IAAA,GAAiB;IAC/BE,IAAM,MAAAF,IAAA;EACN;AACA;AACE,SAAAnD,gBAAaA,CAAAsD,MAAA,EAAAC,IAAmB;EAChC,IAAAC,YAAU;EACZ,IAAAC,UAAA,GAAAH,MAAA,CAAAI,IAAA,GAAAC,WAAA;EACA,IAAAC,KAAM,GAAAL,IAAO,aAAAA,IAAoB,UAAU,cAAAC,YAAA,GAAAD,IAAA,CAAAM,MAAA,cAAAL,YAAA,uBAAAA,YAAA,CAAAM,IAAA,WAAAC,CAAA;IAC3C,IAAAC,QAAO;IACT,SAAAA,QAAA,GAAAD,CAAA,CAAAE,KAAA,cAAAD,QAAA,cAAAA,QAAA,OAAAN,IAAA,GAAAC,WAAA,OAAAF,UAAA","ignoreList":[]}
@@ -3,7 +3,7 @@ import { AsyncBoundary, AsyncSkeleton, DetailPageLayout, EmptyState, PageHeader,
3
3
  import { SchemaForm } from "./schemaForm/index.mjs";
4
4
  import { FormSidebar } from "./FormSidebar.mjs";
5
5
  import { eq } from "@tanstack/db";
6
- import { ArrowLeftIcon, FloppyDiskIcon, PencilSimpleIcon, TrashIcon, XIcon } from "@phosphor-icons/react";
6
+ import { ArrowLeftIcon } from "@phosphor-icons/react";
7
7
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
8
8
  import { useTranslation } from "react-i18next";
9
9
  import { Button, Input, formCommonColors } from "@multiplatform.one/forms";
@@ -17,7 +17,12 @@ import { applyFetchedValues, buildFetchMap } from "./formEngine/fetchFrom.mjs";
17
17
  import { buildPermLevelMatrix } from "./formEngine/fieldPermissions.mjs";
18
18
  import { createHttpClient, validateLink } from "./formEngine/formActions.mjs";
19
19
  import { buildFormTabs, isPromptNamed } from "./formEngine/formLayout.mjs";
20
+ import { setCreatePrefill, takeCreatePrefill } from "./formEngine/createPrefill.mjs";
21
+ import { buildAmendValues, canDeleteDoc, canEditDoc, isAmendable, resolveDocAction, resolveDocIndicator } from "./formEngine/docLifecycle.mjs";
22
+ import { useAmendedAs } from "./formEngine/useAmendedAs.mjs";
20
23
  import { useDocRights } from "./formEngine/useDocRights.mjs";
24
+ import { extractServerError } from "./formEngine/useFormEngine.mjs";
25
+ import { FrappeFormActions } from "./FrappeFormActions.mjs";
21
26
  import { connectionFields, connectionsFromMeta } from "./frappeConnections.mjs";
22
27
  import { FrappeFormConnections } from "./FrappeFormConnections.mjs";
23
28
  import { FrappeRowsReader } from "./FrappeRowsReader.mjs";
@@ -144,6 +149,7 @@ function FrappeFormRoute({
144
149
  onCancel,
145
150
  onDelete,
146
151
  onEdit,
152
+ onAmend,
147
153
  ...props
148
154
  }) {
149
155
  const router = useFrappeRouter();
@@ -186,6 +192,9 @@ function FrappeFormRoute({
186
192
  })),
187
193
  onDelete: onDelete ?? (() => go({
188
194
  mode: "list"
195
+ })),
196
+ onAmend: onAmend ?? (() => go({
197
+ mode: "create"
189
198
  }))
190
199
  });
191
200
  }
@@ -206,6 +215,7 @@ function FrappeFormBody({
206
215
  onSave,
207
216
  onCancel,
208
217
  onDelete,
218
+ onAmend,
209
219
  onEdit,
210
220
  showToolbar = true,
211
221
  showSidebar = true,
@@ -243,6 +253,7 @@ function FrappeFormBody({
243
253
  localDocRef.current = localDoc;
244
254
  const baselineRef = useRef(baselineDoc);
245
255
  baselineRef.current = baselineDoc;
256
+ const createDraftRef = useRef(void 0);
246
257
  const finalBaseURL = baseURL ?? config?.baseURL;
247
258
  const finalAuth = auth ?? config?.auth;
248
259
  const finalSyncOptions = syncOptions ?? config?.syncOptions;
@@ -264,12 +275,14 @@ function FrappeFormBody({
264
275
  isLoading: isMetaLoading,
265
276
  error: metaError
266
277
  } = useDocTypeMeta(frappeConfig, doctype);
278
+ const isSubmittable = !!meta?.is_submittable;
267
279
  const isCreate = !name;
268
280
  const docstatus = Number(baselineDoc?.docstatus ?? 0);
269
281
  const layoutFields = useMemo(() => {
270
282
  if (!meta) return void 0;
271
283
  return sections ? sectionsToLayoutFields(sections) : meta.fields;
272
284
  }, [meta, sections]);
285
+ const amendedAs = useAmendedAs(isSubmittable && docstatus === 2 ? frappeConfig : void 0, doctype, name);
273
286
  const readsWithoutMeta = !children && !meta && Boolean(metaError) && Boolean(name);
274
287
  const recordTabs = useMemo(() => {
275
288
  if (!readsWithoutMeta || !baselineDoc) return void 0;
@@ -383,6 +396,7 @@ function FrappeFormBody({
383
396
  const assignmentRows = useMemo(() => assignmentCollection ? rawAssignmentRows ?? [] : void 0, [assignmentCollection, rawAssignmentRows]);
384
397
  useEffect(() => {
385
398
  everLoadedRef.current = false;
399
+ if (name) createDraftRef.current = void 0;
386
400
  setWasDeleted(false);
387
401
  setConflictFields([]);
388
402
  setDocError(null);
@@ -456,7 +470,14 @@ function FrappeFormBody({
456
470
  } else if (name && everLoadedRef.current && !liveDoc?.isLoading) {
457
471
  setWasDeleted(true);
458
472
  } else if (!name) {
473
+ if (createDraftRef.current?.doctype !== doctype) {
474
+ createDraftRef.current = {
475
+ doctype,
476
+ values: takeCreatePrefill(doctype)
477
+ };
478
+ }
459
479
  setLocalDoc({
480
+ ...createDraftRef.current.values,
460
481
  doctype
461
482
  });
462
483
  }
@@ -633,6 +654,43 @@ function FrappeFormBody({
633
654
  setIsSubmitting(false);
634
655
  }
635
656
  };
657
+ const transitionDocstatus = async (to, question, failure) => {
658
+ if (!docCollection || !name || wasDeleted || !rights[to === 1 ? "submit" : "cancel"]) return;
659
+ if (to === 1) {
660
+ const requiredErrors = validateRequiredFields();
661
+ if (Object.keys(requiredErrors).length > 0) {
662
+ setErrors(requiredErrors);
663
+ return;
664
+ }
665
+ }
666
+ if (!(await dialog.confirm(question))) return;
667
+ setIsSubmitting(true);
668
+ setErrors({});
669
+ try {
670
+ const tx = docCollection.update(name, draft => {
671
+ draft.docstatus = to;
672
+ });
673
+ await tx.isPersisted.promise;
674
+ } catch (err) {
675
+ setErrors({
676
+ general: extractServerError(err, failure)
677
+ });
678
+ } finally {
679
+ setIsSubmitting(false);
680
+ }
681
+ };
682
+ const handleSubmitDocument = () => transitionDocstatus(1, t("Permanently Submit {{name}}?", {
683
+ name
684
+ }), t("Failed to submit"));
685
+ const handleCancelDocument = () => transitionDocstatus(2, t("Permanently Cancel {{name}}?", {
686
+ name
687
+ }), t("Failed to cancel"));
688
+ const handleAmend = () => {
689
+ if (!meta || !name || !onAmend || !rights.amend) return;
690
+ const draft = buildAmendValues(meta.fields, localDoc, name);
691
+ setCreatePrefill(doctype, draft);
692
+ onAmend(draft);
693
+ };
636
694
  const titleField = meta?.title_field;
637
695
  const titleValue = titleField ? localDoc[titleField] : void 0;
638
696
  const pageTitle = isCreate ? t("New {{doctype}}", {
@@ -754,12 +812,30 @@ function FrappeFormBody({
754
812
  const effectiveDisabled = disabled || wasDeleted;
755
813
  const readOnlyView = Boolean(onEdit) || readsWithoutMeta;
756
814
  const fieldsDisabled = effectiveDisabled || readOnlyView || !canWriteRecord;
757
- const showDelete = Boolean(name && onDelete && !wasDeleted && rights.delete);
758
- const showEdit = Boolean(onEdit && rights.write);
759
- const showSave = !onEdit && canWriteRecord;
760
- const showCancel = !onEdit && Boolean(onCancel);
761
- const showNotSaved = hasUnsavedChanges && !onEdit;
762
- const toolbarShown = showToolbar && !readsWithoutMeta && (showDelete || showEdit || showSave || showCancel || showNotSaved);
815
+ const indicator = resolveDocIndicator({
816
+ docstatus,
817
+ isCreate,
818
+ isDirty: hasUnsavedChanges && !onEdit,
819
+ isSubmittable
820
+ });
821
+ const docAction = resolveDocAction({
822
+ docstatus,
823
+ isCreate,
824
+ isDirty: hasUnsavedChanges,
825
+ isSubmittable,
826
+ perms: {
827
+ write: canWriteRecord,
828
+ submit: rights.submit,
829
+ cancel: rights.cancel,
830
+ amend: rights.amend
831
+ },
832
+ isReadOnlyView: Boolean(onEdit)
833
+ });
834
+ const showDelete = Boolean(name && onDelete && !wasDeleted && rights.delete && canDeleteDoc(docstatus));
835
+ const showEdit = Boolean(onEdit && rights.write && canEditDoc(docstatus, meta));
836
+ const showAmend = Boolean(onAmend && isAmendable(meta));
837
+ const showClose = !onEdit && Boolean(onCancel);
838
+ const toolbarShown = showToolbar && !readsWithoutMeta && Boolean(indicator || docAction || showDelete || showEdit || showClose);
763
839
  const shownTabs = formTabs ?? recordTabs;
764
840
  const imageFieldName = meta?.image_field;
765
841
  const sidebarImageUrl = imageFieldName ? resolveFileUrl(localDoc[imageFieldName], finalBaseURL) : void 0;
@@ -895,52 +971,20 @@ function FrappeFormBody({
895
971
  color: formCommonColors.error,
896
972
  ...knobProps.body,
897
973
  children: errors.general
898
- }), toolbarShown && /* @__PURE__ */jsxs(XStack, {
899
- ...knobProps.gap,
900
- justifyContent: "flex-end",
901
- alignItems: "center",
902
- paddingTop: "$3",
903
- children: [showNotSaved && /* @__PURE__ */jsx(Text, {
904
- color: "$orange11",
905
- marginInlineEnd: "auto",
906
- ...knobProps.body,
907
- children: t("Not Saved")
908
- }), showDelete && /* @__PURE__ */jsx(Button, {
909
- outlined: true,
910
- error: true,
911
- icon: TrashIcon,
912
- loading: isSubmitting,
913
- disabled: effectiveDisabled,
914
- disabledReason: t("Form is read-only"),
915
- disabledReasonPlacement: "inline",
916
- onPress: handleDelete,
917
- children: t("Delete")
918
- }), showEdit && /* @__PURE__ */jsx(Button, {
919
- accent: true,
920
- icon: PencilSimpleIcon,
921
- disabled: effectiveDisabled,
922
- disabledReason: t("Form is read-only"),
923
- disabledReasonPlacement: "inline",
924
- onPress: onEdit,
925
- children: t("Edit")
926
- }), showCancel && /* @__PURE__ */jsx(Button, {
927
- outlined: true,
928
- icon: XIcon,
929
- disabled,
930
- disabledReason: t("Form is read-only"),
931
- disabledReasonPlacement: "inline",
932
- onPress: handleCancel,
933
- children: t("Cancel")
934
- }), showSave && /* @__PURE__ */jsx(Button, {
935
- accent: true,
936
- icon: FloppyDiskIcon,
937
- loading: isSubmitting,
938
- disabled: effectiveDisabled,
939
- disabledReason: t("Form is read-only"),
940
- disabledReasonPlacement: "inline",
941
- onPress: handleSave,
942
- children: isSubmitting ? t("Saving...") : t("Save")
943
- })]
974
+ }), toolbarShown && /* @__PURE__ */jsx(FrappeFormActions, {
975
+ indicator,
976
+ action: docAction,
977
+ busy: isSubmitting,
978
+ disabled: effectiveDisabled,
979
+ onSave: handleSave,
980
+ onSubmit: handleSubmitDocument,
981
+ onCancelDocument: handleCancelDocument,
982
+ onAmend: showAmend ? handleAmend : void 0,
983
+ amendedAs,
984
+ onDelete: showDelete ? handleDelete : void 0,
985
+ onEdit: showEdit ? onEdit : void 0,
986
+ onClose: showClose ? handleCancel : void 0,
987
+ closeDisabled: disabled
944
988
  })]
945
989
  })]
946
990
  }), showTimeline && name && !readsWithoutMeta && /* @__PURE__ */jsx(Timeline, {