@fieldia/core 0.28.0 → 0.29.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 (233) hide show
  1. package/README.md +125 -1
  2. package/package.json +1 -1
  3. package/schema/page.schema.json +263 -6
  4. package/src/index.d.mts +8 -2
  5. package/src/index.d.ts +8 -2
  6. package/src/index.js +29 -2
  7. package/src/index.js.map +1 -1
  8. package/src/index.mjs +11 -2
  9. package/src/index.mjs.map +1 -1
  10. package/src/lib/format/approval-checks.d.mts +8 -0
  11. package/src/lib/format/approval-checks.d.ts +8 -0
  12. package/src/lib/format/approval-checks.js +29 -0
  13. package/src/lib/format/approval-checks.js.map +1 -0
  14. package/src/lib/format/approval-checks.mjs +26 -0
  15. package/src/lib/format/approval-checks.mjs.map +1 -0
  16. package/src/lib/format/approval.d.mts +20 -0
  17. package/src/lib/format/approval.d.ts +20 -0
  18. package/src/lib/format/approval.js +25 -0
  19. package/src/lib/format/approval.js.map +1 -0
  20. package/src/lib/format/approval.mjs +22 -0
  21. package/src/lib/format/approval.mjs.map +1 -0
  22. package/src/lib/format/assist-checks.d.mts +14 -0
  23. package/src/lib/format/assist-checks.d.ts +14 -0
  24. package/src/lib/format/assist-checks.js +68 -0
  25. package/src/lib/format/assist-checks.js.map +1 -0
  26. package/src/lib/format/assist-checks.mjs +64 -0
  27. package/src/lib/format/assist-checks.mjs.map +1 -0
  28. package/src/lib/format/assist.d.mts +41 -0
  29. package/src/lib/format/assist.d.ts +41 -0
  30. package/src/lib/format/assist.js +29 -0
  31. package/src/lib/format/assist.js.map +1 -0
  32. package/src/lib/format/assist.mjs +26 -0
  33. package/src/lib/format/assist.mjs.map +1 -0
  34. package/src/lib/format/editable-checks.d.mts +8 -0
  35. package/src/lib/format/editable-checks.d.ts +8 -0
  36. package/src/lib/format/editable-checks.js +38 -0
  37. package/src/lib/format/editable-checks.js.map +1 -0
  38. package/src/lib/format/editable-checks.mjs +35 -0
  39. package/src/lib/format/editable-checks.mjs.map +1 -0
  40. package/src/lib/format/field.d.mts +86 -0
  41. package/src/lib/format/field.d.ts +86 -0
  42. package/src/lib/format/field.js +56 -10
  43. package/src/lib/format/field.js.map +1 -1
  44. package/src/lib/format/field.mjs +55 -9
  45. package/src/lib/format/field.mjs.map +1 -1
  46. package/src/lib/format/languages-checks.d.mts +8 -0
  47. package/src/lib/format/languages-checks.d.ts +8 -0
  48. package/src/lib/format/languages-checks.js +40 -0
  49. package/src/lib/format/languages-checks.js.map +1 -0
  50. package/src/lib/format/languages-checks.mjs +37 -0
  51. package/src/lib/format/languages-checks.mjs.map +1 -0
  52. package/src/lib/format/later-checks.d.mts +4 -3
  53. package/src/lib/format/later-checks.d.ts +4 -3
  54. package/src/lib/format/later-checks.js +4 -3
  55. package/src/lib/format/later-checks.js.map +1 -1
  56. package/src/lib/format/later-checks.mjs +4 -3
  57. package/src/lib/format/later-checks.mjs.map +1 -1
  58. package/src/lib/format/layout.d.mts +100 -26
  59. package/src/lib/format/layout.d.ts +100 -26
  60. package/src/lib/format/layout.js +19 -3
  61. package/src/lib/format/layout.js.map +1 -1
  62. package/src/lib/format/layout.mjs +17 -1
  63. package/src/lib/format/layout.mjs.map +1 -1
  64. package/src/lib/format/layout.types.d.mts +2 -1
  65. package/src/lib/format/layout.types.d.ts +2 -1
  66. package/src/lib/format/list-editable.d.mts +20 -0
  67. package/src/lib/format/list-editable.d.ts +20 -0
  68. package/src/lib/format/list-editable.js +33 -0
  69. package/src/lib/format/list-editable.js.map +1 -0
  70. package/src/lib/format/list-editable.mjs +28 -0
  71. package/src/lib/format/list-editable.mjs.map +1 -0
  72. package/src/lib/format/page.d.mts +84 -9
  73. package/src/lib/format/page.d.ts +84 -9
  74. package/src/lib/format/page.js +4 -0
  75. package/src/lib/format/page.js.map +1 -1
  76. package/src/lib/format/page.mjs +4 -0
  77. package/src/lib/format/page.mjs.map +1 -1
  78. package/src/lib/format/photos-options.d.mts +29 -0
  79. package/src/lib/format/photos-options.d.ts +29 -0
  80. package/src/lib/format/photos-options.js +49 -0
  81. package/src/lib/format/photos-options.js.map +1 -0
  82. package/src/lib/format/photos-options.mjs +45 -0
  83. package/src/lib/format/photos-options.mjs.map +1 -0
  84. package/src/lib/format/references.js +31 -1
  85. package/src/lib/format/references.js.map +1 -1
  86. package/src/lib/format/references.mjs +31 -1
  87. package/src/lib/format/references.mjs.map +1 -1
  88. package/src/lib/format/scan-checks.d.mts +12 -0
  89. package/src/lib/format/scan-checks.d.ts +12 -0
  90. package/src/lib/format/scan-checks.js +89 -0
  91. package/src/lib/format/scan-checks.js.map +1 -0
  92. package/src/lib/format/scan-checks.mjs +86 -0
  93. package/src/lib/format/scan-checks.mjs.map +1 -0
  94. package/src/lib/format/scan-options.d.mts +84 -0
  95. package/src/lib/format/scan-options.d.ts +84 -0
  96. package/src/lib/format/scan-options.js +58 -0
  97. package/src/lib/format/scan-options.js.map +1 -0
  98. package/src/lib/format/scan-options.mjs +54 -0
  99. package/src/lib/format/scan-options.mjs.map +1 -0
  100. package/src/lib/format/upgrade.d.mts +4 -2
  101. package/src/lib/format/upgrade.d.ts +4 -2
  102. package/src/lib/format/upgrade.js +4 -2
  103. package/src/lib/format/upgrade.js.map +1 -1
  104. package/src/lib/format/upgrade.mjs +4 -2
  105. package/src/lib/format/upgrade.mjs.map +1 -1
  106. package/src/lib/format/version.d.mts +2 -2
  107. package/src/lib/format/version.d.ts +2 -2
  108. package/src/lib/format/version.js +2 -2
  109. package/src/lib/format/version.js.map +1 -1
  110. package/src/lib/format/version.mjs +2 -2
  111. package/src/lib/format/version.mjs.map +1 -1
  112. package/src/lib/record/approvals-part.d.mts +6 -0
  113. package/src/lib/record/approvals-part.d.ts +6 -0
  114. package/src/lib/record/approvals-part.js +14 -0
  115. package/src/lib/record/approvals-part.js.map +1 -0
  116. package/src/lib/record/approvals-part.mjs +7 -0
  117. package/src/lib/record/approvals-part.mjs.map +1 -0
  118. package/src/lib/record/approving.d.mts +45 -0
  119. package/src/lib/record/approving.d.ts +45 -0
  120. package/src/lib/record/approving.js +10 -0
  121. package/src/lib/record/approving.js.map +1 -0
  122. package/src/lib/record/approving.mjs +7 -0
  123. package/src/lib/record/approving.mjs.map +1 -0
  124. package/src/lib/record/check.js +4 -0
  125. package/src/lib/record/check.js.map +1 -1
  126. package/src/lib/record/check.mjs +4 -0
  127. package/src/lib/record/check.mjs.map +1 -1
  128. package/src/lib/record/data-source.d.mts +270 -0
  129. package/src/lib/record/data-source.d.ts +270 -0
  130. package/src/lib/record/data-source.js.map +1 -1
  131. package/src/lib/record/data-source.mjs.map +1 -1
  132. package/src/lib/record/files-part.d.mts +7 -0
  133. package/src/lib/record/files-part.d.ts +7 -0
  134. package/src/lib/record/files-part.js +167 -0
  135. package/src/lib/record/files-part.js.map +1 -0
  136. package/src/lib/record/files-part.mjs +163 -0
  137. package/src/lib/record/files-part.mjs.map +1 -0
  138. package/src/lib/record/filter.d.mts +5 -0
  139. package/src/lib/record/filter.d.ts +5 -0
  140. package/src/lib/record/filter.js +1 -0
  141. package/src/lib/record/filter.js.map +1 -1
  142. package/src/lib/record/filter.mjs +1 -1
  143. package/src/lib/record/filter.mjs.map +1 -1
  144. package/src/lib/record/form-approvals.d.mts +47 -0
  145. package/src/lib/record/form-approvals.d.ts +47 -0
  146. package/src/lib/record/form-approvals.js +186 -0
  147. package/src/lib/record/form-approvals.js.map +1 -0
  148. package/src/lib/record/form-approvals.mjs +180 -0
  149. package/src/lib/record/form-approvals.mjs.map +1 -0
  150. package/src/lib/record/form.d.mts +32 -1
  151. package/src/lib/record/form.d.ts +32 -1
  152. package/src/lib/record/form.js +49 -5
  153. package/src/lib/record/form.js.map +1 -1
  154. package/src/lib/record/form.mjs +49 -5
  155. package/src/lib/record/form.mjs.map +1 -1
  156. package/src/lib/record/languages-part.d.mts +32 -0
  157. package/src/lib/record/languages-part.d.ts +32 -0
  158. package/src/lib/record/languages-part.js +104 -0
  159. package/src/lib/record/languages-part.js.map +1 -0
  160. package/src/lib/record/languages-part.mjs +96 -0
  161. package/src/lib/record/languages-part.mjs.map +1 -0
  162. package/src/lib/record/languages.d.mts +26 -0
  163. package/src/lib/record/languages.d.ts +26 -0
  164. package/src/lib/record/languages.js +20 -0
  165. package/src/lib/record/languages.js.map +1 -0
  166. package/src/lib/record/languages.mjs +15 -0
  167. package/src/lib/record/languages.mjs.map +1 -0
  168. package/src/lib/record/locales/ar.js +5 -0
  169. package/src/lib/record/locales/ar.js.map +1 -1
  170. package/src/lib/record/locales/ar.mjs +5 -0
  171. package/src/lib/record/locales/ar.mjs.map +1 -1
  172. package/src/lib/record/locales/de.js +5 -0
  173. package/src/lib/record/locales/de.js.map +1 -1
  174. package/src/lib/record/locales/de.mjs +5 -0
  175. package/src/lib/record/locales/de.mjs.map +1 -1
  176. package/src/lib/record/locales/fr.js +5 -0
  177. package/src/lib/record/locales/fr.js.map +1 -1
  178. package/src/lib/record/locales/fr.mjs +5 -0
  179. package/src/lib/record/locales/fr.mjs.map +1 -1
  180. package/src/lib/record/memory-approvals.d.mts +47 -0
  181. package/src/lib/record/memory-approvals.d.ts +47 -0
  182. package/src/lib/record/memory-approvals.js +78 -0
  183. package/src/lib/record/memory-approvals.js.map +1 -0
  184. package/src/lib/record/memory-approvals.mjs +75 -0
  185. package/src/lib/record/memory-approvals.mjs.map +1 -0
  186. package/src/lib/record/memory-assist.d.mts +53 -0
  187. package/src/lib/record/memory-assist.d.ts +53 -0
  188. package/src/lib/record/memory-assist.js +519 -0
  189. package/src/lib/record/memory-assist.js.map +1 -0
  190. package/src/lib/record/memory-assist.mjs +513 -0
  191. package/src/lib/record/memory-assist.mjs.map +1 -0
  192. package/src/lib/record/memory-clusters.d.mts +18 -0
  193. package/src/lib/record/memory-clusters.d.ts +18 -0
  194. package/src/lib/record/memory-clusters.js +83 -0
  195. package/src/lib/record/memory-clusters.js.map +1 -0
  196. package/src/lib/record/memory-clusters.mjs +80 -0
  197. package/src/lib/record/memory-clusters.mjs.map +1 -0
  198. package/src/lib/record/memory-data-source.d.mts +43 -3
  199. package/src/lib/record/memory-data-source.d.ts +43 -3
  200. package/src/lib/record/memory-data-source.js +105 -19
  201. package/src/lib/record/memory-data-source.js.map +1 -1
  202. package/src/lib/record/memory-data-source.mjs +105 -19
  203. package/src/lib/record/memory-data-source.mjs.map +1 -1
  204. package/src/lib/record/memory-later.d.mts +1 -1
  205. package/src/lib/record/memory-later.d.ts +1 -1
  206. package/src/lib/record/memory-later.js +4 -1
  207. package/src/lib/record/memory-later.js.map +1 -1
  208. package/src/lib/record/memory-later.mjs +4 -1
  209. package/src/lib/record/memory-later.mjs.map +1 -1
  210. package/src/lib/record/messages.d.mts +14 -0
  211. package/src/lib/record/messages.d.ts +14 -0
  212. package/src/lib/record/messages.js +5 -0
  213. package/src/lib/record/messages.js.map +1 -1
  214. package/src/lib/record/messages.mjs +5 -0
  215. package/src/lib/record/messages.mjs.map +1 -1
  216. package/src/lib/record/uploads.d.mts +35 -9
  217. package/src/lib/record/uploads.d.ts +35 -9
  218. package/src/lib/record/uploads.js +49 -169
  219. package/src/lib/record/uploads.js.map +1 -1
  220. package/src/lib/record/uploads.mjs +42 -164
  221. package/src/lib/record/uploads.mjs.map +1 -1
  222. package/src/lib/record/values.d.mts +23 -0
  223. package/src/lib/record/values.d.ts +23 -0
  224. package/src/lib/record/values.js +4 -0
  225. package/src/lib/record/values.js.map +1 -1
  226. package/src/lib/record/values.mjs +4 -0
  227. package/src/lib/record/values.mjs.map +1 -1
  228. package/src/runtime.d.mts +12 -5
  229. package/src/runtime.d.ts +12 -5
  230. package/src/runtime.js +18 -3
  231. package/src/runtime.js.map +1 -1
  232. package/src/runtime.mjs +7 -1
  233. package/src/runtime.mjs.map +1 -1
@@ -0,0 +1,84 @@
1
+ import * as z from 'zod';
2
+ /**
3
+ * A code scanned with the camera into a field (`options.scan`): a Scan button beside its box opens the camera in a sheet
4
+ * (the back camera on a phone), and a code read fills the field — a char's or a text's words, a link's record found by
5
+ * its code. On a table of lines, each code read counts: the line holding what it names gets one more, else a line is
6
+ * added with one. A scanner gun (a keyboard wedge) types into the box as ever.
7
+ *
8
+ * `true`, or its settings:
9
+ *
10
+ * - `formats`: the kinds of code read — `qr_code`, `data_matrix`, `ean_13`, `ean_8`, `upc_a`, `upc_e`, `code_128`,
11
+ * `code_39`; every one when left out. Fewer read faster, and never mistake a box's other codes for the one meant.
12
+ * - `by`: a link's — the field of the linked records that holds their code ("barcode"), whose value must be the code
13
+ * exactly; left out, the code is searched as a name is (an app's name search may find a product by its barcode).
14
+ * - `part`: a GS1 code's part this field takes, by its Application Identifier — "10" a batch or lot, "21" a serial
15
+ * number, "01" a product's GTIN, "17" an expiry date; left out, the whole code.
16
+ * - `fills`: the other fields the same GS1 code fills, each by its part — `{ "expiry": "17", "product_id": { "part":
17
+ * "01", "by": "barcode" } }` — a line's other columns for a cell or a counted line.
18
+ * - `sound`: false keeps the scan silent (a beep where the browser lets it, and a phone's buzz, otherwise).
19
+ * - A table of lines' own: `field`, the column a code names (a link, found as above, or words) and `count`, the column
20
+ * counted (a whole number).
21
+ *
22
+ * { "field": "lot", "options": { "scan": { "formats": ["data_matrix"], "part": "10", "fills": { "expiry": "17" } } } }
23
+ * { "field": "line_ids", "options": { "scan": { "field": "product_id", "count": "counted", "by": "barcode" } } }
24
+ */
25
+ export declare const SCAN_FORMATS: readonly ["qr_code", "data_matrix", "ean_13", "ean_8", "upc_a", "upc_e", "code_128", "code_39"];
26
+ export type ScanFormat = (typeof SCAN_FORMATS)[number];
27
+ /** What one field takes of a GS1 code, among those a scan `fills`: its part, and for a link the field holding the code. */
28
+ export declare const ScanFillSchema: z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
29
+ part: z.ZodString;
30
+ by: z.ZodOptional<z.ZodString>;
31
+ }, z.z.core.$strict>]>;
32
+ export declare const ScanSettingsSchema: z.ZodObject<{
33
+ formats: z.ZodOptional<z.ZodArray<z.ZodEnum<{
34
+ qr_code: "qr_code";
35
+ data_matrix: "data_matrix";
36
+ ean_13: "ean_13";
37
+ ean_8: "ean_8";
38
+ upc_a: "upc_a";
39
+ upc_e: "upc_e";
40
+ code_128: "code_128";
41
+ code_39: "code_39";
42
+ }>>>;
43
+ by: z.ZodOptional<z.ZodString>;
44
+ part: z.ZodOptional<z.ZodString>;
45
+ fills: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
46
+ part: z.ZodString;
47
+ by: z.ZodOptional<z.ZodString>;
48
+ }, z.z.core.$strict>]>>>;
49
+ sound: z.ZodOptional<z.ZodBoolean>;
50
+ field: z.ZodOptional<z.ZodString>;
51
+ count: z.ZodOptional<z.ZodString>;
52
+ }, z.z.core.$strict>;
53
+ /** `options.scan`: true for a Scan button as the field is, or its settings; false for none. */
54
+ export declare const ScanOptionSchema: z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
55
+ formats: z.ZodOptional<z.ZodArray<z.ZodEnum<{
56
+ qr_code: "qr_code";
57
+ data_matrix: "data_matrix";
58
+ ean_13: "ean_13";
59
+ ean_8: "ean_8";
60
+ upc_a: "upc_a";
61
+ upc_e: "upc_e";
62
+ code_128: "code_128";
63
+ code_39: "code_39";
64
+ }>>>;
65
+ by: z.ZodOptional<z.ZodString>;
66
+ part: z.ZodOptional<z.ZodString>;
67
+ fills: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
68
+ part: z.ZodString;
69
+ by: z.ZodOptional<z.ZodString>;
70
+ }, z.z.core.$strict>]>>>;
71
+ sound: z.ZodOptional<z.ZodBoolean>;
72
+ field: z.ZodOptional<z.ZodString>;
73
+ count: z.ZodOptional<z.ZodString>;
74
+ }, z.z.core.$strict>]>;
75
+ export type ScanFill = z.infer<typeof ScanFillSchema>;
76
+ export type ScanSettings = z.infer<typeof ScanSettingsSchema>;
77
+ export type ScanOption = z.infer<typeof ScanOptionSchema>;
78
+ /** The issues of a field's or a cell's `options.scan`, each at its path under `options`. */
79
+ export declare function scanOptionIssues(node: {
80
+ options?: Record<string, unknown>;
81
+ }): {
82
+ message: string;
83
+ path: (string | number)[];
84
+ }[];
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ScanOptionSchema = exports.ScanSettingsSchema = exports.ScanFillSchema = exports.SCAN_FORMATS = void 0;
4
+ exports.scanOptionIssues = scanOptionIssues;
5
+ const z = require("zod");
6
+ /**
7
+ * A code scanned with the camera into a field (`options.scan`): a Scan button beside its box opens the camera in a sheet
8
+ * (the back camera on a phone), and a code read fills the field — a char's or a text's words, a link's record found by
9
+ * its code. On a table of lines, each code read counts: the line holding what it names gets one more, else a line is
10
+ * added with one. A scanner gun (a keyboard wedge) types into the box as ever.
11
+ *
12
+ * `true`, or its settings:
13
+ *
14
+ * - `formats`: the kinds of code read — `qr_code`, `data_matrix`, `ean_13`, `ean_8`, `upc_a`, `upc_e`, `code_128`,
15
+ * `code_39`; every one when left out. Fewer read faster, and never mistake a box's other codes for the one meant.
16
+ * - `by`: a link's — the field of the linked records that holds their code ("barcode"), whose value must be the code
17
+ * exactly; left out, the code is searched as a name is (an app's name search may find a product by its barcode).
18
+ * - `part`: a GS1 code's part this field takes, by its Application Identifier — "10" a batch or lot, "21" a serial
19
+ * number, "01" a product's GTIN, "17" an expiry date; left out, the whole code.
20
+ * - `fills`: the other fields the same GS1 code fills, each by its part — `{ "expiry": "17", "product_id": { "part":
21
+ * "01", "by": "barcode" } }` — a line's other columns for a cell or a counted line.
22
+ * - `sound`: false keeps the scan silent (a beep where the browser lets it, and a phone's buzz, otherwise).
23
+ * - A table of lines' own: `field`, the column a code names (a link, found as above, or words) and `count`, the column
24
+ * counted (a whole number).
25
+ *
26
+ * { "field": "lot", "options": { "scan": { "formats": ["data_matrix"], "part": "10", "fills": { "expiry": "17" } } } }
27
+ * { "field": "line_ids", "options": { "scan": { "field": "product_id", "count": "counted", "by": "barcode" } } }
28
+ */
29
+ exports.SCAN_FORMATS = ['qr_code', 'data_matrix', 'ean_13', 'ean_8', 'upc_a', 'upc_e', 'code_128', 'code_39'];
30
+ /** A GS1 Application Identifier: two to four digits. */
31
+ const AI = /^\d{2,4}$/;
32
+ const part = z.string().regex(AI, 'a GS1 part is its Application Identifier, two to four digits: "10" a lot, "17" an expiry, "01" a GTIN');
33
+ const fieldName = z.string().min(1);
34
+ /** What one field takes of a GS1 code, among those a scan `fills`: its part, and for a link the field holding the code. */
35
+ exports.ScanFillSchema = z.union([part, z.strictObject({ part, by: fieldName.optional() })], { error: 'a field filled is its GS1 part ("17"), or { "part": "01", "by": "barcode" } for a link' }).meta({ id: 'ScanFill' });
36
+ exports.ScanSettingsSchema = z
37
+ .strictObject({
38
+ formats: z.array(z.enum(exports.SCAN_FORMATS, { error: `a format is one of ${exports.SCAN_FORMATS.join(', ')}` })).min(1).optional(),
39
+ by: fieldName.optional(),
40
+ part: part.optional(),
41
+ fills: z.record(fieldName, exports.ScanFillSchema).optional(),
42
+ sound: z.boolean().optional(),
43
+ field: fieldName.optional(),
44
+ count: fieldName.optional(),
45
+ })
46
+ .meta({ id: 'ScanSettings' });
47
+ /** `options.scan`: true for a Scan button as the field is, or its settings; false for none. */
48
+ exports.ScanOptionSchema = z.union([z.boolean(), exports.ScanSettingsSchema], { error: 'scan is true, or its settings: { "formats": […], "by": "barcode", "part": "10", "fills": {…} }' }).meta({ id: 'ScanOption' });
49
+ /** The issues of a field's or a cell's `options.scan`, each at its path under `options`. */
50
+ function scanOptionIssues(node) {
51
+ const scan = node.options?.['scan'];
52
+ if (scan === undefined)
53
+ return [];
54
+ // Its settings checked as settings, so what is wrong in them is said where it is: never as "true or its settings".
55
+ const schema = scan && typeof scan === 'object' && !Array.isArray(scan) ? exports.ScanSettingsSchema : exports.ScanOptionSchema;
56
+ return (schema.safeParse(scan).error?.issues ?? []).map((issue) => ({ message: issue.message, path: ['options', 'scan', ...issue.path] }));
57
+ }
58
+ //# sourceMappingURL=scan-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-options.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/format/scan-options.ts"],"names":[],"mappings":";;;AAwDA,4CAMC;AA9DD,yBAAyB;AAEzB;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACU,QAAA,YAAY,GAAG,CAAC,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,CAAU,CAAC;AAG5H,wDAAwD;AACxD,MAAM,EAAE,GAAG,WAAW,CAAC;AACvB,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,uGAAuG,CAAC,CAAC;AAC3I,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAEpC,2HAA2H;AAC9G,QAAA,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,wFAAwF,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;AAEnN,QAAA,kBAAkB,GAAG,CAAC;KAChC,YAAY,CAAC;IACZ,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAY,EAAE,EAAE,KAAK,EAAE,sBAAsB,oBAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACpH,EAAE,EAAE,SAAS,CAAC,QAAQ,EAAE;IACxB,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;IACrB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,sBAAc,CAAC,CAAC,QAAQ,EAAE;IACrD,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC7B,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE;IAC3B,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE;CAC5B,CAAC;KACD,IAAI,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;AAEhC,+FAA+F;AAClF,QAAA,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,0BAAkB,CAAC,EAAE,EAAE,KAAK,EAAE,gGAAgG,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;AAMnN,4FAA4F;AAC5F,SAAgB,gBAAgB,CAAC,IAA2C;IAC1E,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAClC,mHAAmH;IACnH,MAAM,MAAM,GAAG,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,0BAAkB,CAAC,CAAC,CAAC,wBAAgB,CAAC;IAChH,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAwB,EAAE,CAAC,CAAC,CAAC;AACpK,CAAC"}
@@ -0,0 +1,54 @@
1
+ import * as z from 'zod';
2
+ /**
3
+ * A code scanned with the camera into a field (`options.scan`): a Scan button beside its box opens the camera in a sheet
4
+ * (the back camera on a phone), and a code read fills the field — a char's or a text's words, a link's record found by
5
+ * its code. On a table of lines, each code read counts: the line holding what it names gets one more, else a line is
6
+ * added with one. A scanner gun (a keyboard wedge) types into the box as ever.
7
+ *
8
+ * `true`, or its settings:
9
+ *
10
+ * - `formats`: the kinds of code read — `qr_code`, `data_matrix`, `ean_13`, `ean_8`, `upc_a`, `upc_e`, `code_128`,
11
+ * `code_39`; every one when left out. Fewer read faster, and never mistake a box's other codes for the one meant.
12
+ * - `by`: a link's — the field of the linked records that holds their code ("barcode"), whose value must be the code
13
+ * exactly; left out, the code is searched as a name is (an app's name search may find a product by its barcode).
14
+ * - `part`: a GS1 code's part this field takes, by its Application Identifier — "10" a batch or lot, "21" a serial
15
+ * number, "01" a product's GTIN, "17" an expiry date; left out, the whole code.
16
+ * - `fills`: the other fields the same GS1 code fills, each by its part — `{ "expiry": "17", "product_id": { "part":
17
+ * "01", "by": "barcode" } }` — a line's other columns for a cell or a counted line.
18
+ * - `sound`: false keeps the scan silent (a beep where the browser lets it, and a phone's buzz, otherwise).
19
+ * - A table of lines' own: `field`, the column a code names (a link, found as above, or words) and `count`, the column
20
+ * counted (a whole number).
21
+ *
22
+ * { "field": "lot", "options": { "scan": { "formats": ["data_matrix"], "part": "10", "fills": { "expiry": "17" } } } }
23
+ * { "field": "line_ids", "options": { "scan": { "field": "product_id", "count": "counted", "by": "barcode" } } }
24
+ */
25
+ export const SCAN_FORMATS = ['qr_code', 'data_matrix', 'ean_13', 'ean_8', 'upc_a', 'upc_e', 'code_128', 'code_39'];
26
+ /** A GS1 Application Identifier: two to four digits. */
27
+ const AI = /^\d{2,4}$/;
28
+ const part = z.string().regex(AI, 'a GS1 part is its Application Identifier, two to four digits: "10" a lot, "17" an expiry, "01" a GTIN');
29
+ const fieldName = z.string().min(1);
30
+ /** What one field takes of a GS1 code, among those a scan `fills`: its part, and for a link the field holding the code. */
31
+ export const ScanFillSchema = z.union([part, z.strictObject({ part, by: fieldName.optional() })], { error: 'a field filled is its GS1 part ("17"), or { "part": "01", "by": "barcode" } for a link' }).meta({ id: 'ScanFill' });
32
+ export const ScanSettingsSchema = z
33
+ .strictObject({
34
+ formats: z.array(z.enum(SCAN_FORMATS, { error: `a format is one of ${SCAN_FORMATS.join(', ')}` })).min(1).optional(),
35
+ by: fieldName.optional(),
36
+ part: part.optional(),
37
+ fills: z.record(fieldName, ScanFillSchema).optional(),
38
+ sound: z.boolean().optional(),
39
+ field: fieldName.optional(),
40
+ count: fieldName.optional(),
41
+ })
42
+ .meta({ id: 'ScanSettings' });
43
+ /** `options.scan`: true for a Scan button as the field is, or its settings; false for none. */
44
+ export const ScanOptionSchema = z.union([z.boolean(), ScanSettingsSchema], { error: 'scan is true, or its settings: { "formats": […], "by": "barcode", "part": "10", "fills": {…} }' }).meta({ id: 'ScanOption' });
45
+ /** The issues of a field's or a cell's `options.scan`, each at its path under `options`. */
46
+ export function scanOptionIssues(node) {
47
+ const scan = node.options?.['scan'];
48
+ if (scan === undefined)
49
+ return [];
50
+ // Its settings checked as settings, so what is wrong in them is said where it is: never as "true or its settings".
51
+ const schema = scan && typeof scan === 'object' && !Array.isArray(scan) ? ScanSettingsSchema : ScanOptionSchema;
52
+ return (schema.safeParse(scan).error?.issues ?? []).map((issue) => ({ message: issue.message, path: ['options', 'scan', ...issue.path] }));
53
+ }
54
+ //# sourceMappingURL=scan-options.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-options.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/format/scan-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,CAAU,CAAC;AAG5H,wDAAwD;AACxD,MAAM,EAAE,GAAG,WAAW,CAAC;AACvB,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,uGAAuG,CAAC,CAAC;AAC3I,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAEpC,2HAA2H;AAC3H,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,wFAAwF,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;AAEhO,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC;KAChC,YAAY,CAAC;IACZ,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,sBAAsB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACpH,EAAE,EAAE,SAAS,CAAC,QAAQ,EAAE;IACxB,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;IACrB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,QAAQ,EAAE;IACrD,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC7B,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE;IAC3B,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE;CAC5B,CAAC;KACD,IAAI,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;AAEhC,+FAA+F;AAC/F,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,kBAAkB,CAAC,EAAE,EAAE,KAAK,EAAE,gGAAgG,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;AAMnN,4FAA4F;AAC5F,MAAM,UAAU,gBAAgB,CAAC,IAA2C;IAC1E,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAClC,mHAAmH;IACnH,MAAM,MAAM,GAAG,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAChH,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAwB,EAAE,CAAC,CAAC,CAAC;AACpK,CAAC"}
@@ -30,8 +30,10 @@ export interface PageUpgrade {
30
30
  * page's `endings`, `limits` and `continueLater`, an option's `seats` and `invisible`, `optionsFrom` carried from a
31
31
  * question (`{ field, picked }`) and on a table's line, a signature's `signs` and `signerField`, a list's
32
32
  * `filterRanges`, `filterCounts` and `filterSheet`, `{field}` words in a page's words — so a 0.5 page is a 0.6 page as
33
- * it is; and 0.7 (Fieldia 0.28) only added — a table of lines' `cards: "never"`, its rows kept at a phone's width — so a
34
- * 0.6 page is a 0.7 page as it is. A release that renames or reshapes a setting adds a step here, with its example; one that only adds needs
33
+ * it is; 0.7 (Fieldia 0.28) only added — a table of lines' `cards: "never"`, its rows kept at a phone's width — so a
34
+ * 0.6 page is a 0.7 page as it is; and 0.8 (Fieldia 0.29) only added — a record's `approval`, a list's `editable` and
35
+ * `searchToFilter`, a text's `translate` and `requiredIn`, a page's `suggest`, a text field's `options.rewrite`, a
36
+ * photo set's options and a field's `options.scan` — so a 0.7 page is a 0.8 page as it is. A release that renames or reshapes a setting adds a step here, with its example; one that only adds needs
35
37
  * none: the page is the same, and upgradePage writes the new version in it.
36
38
  */
37
39
  export declare const PAGE_UPGRADES: readonly PageUpgrade[];
@@ -30,8 +30,10 @@ export interface PageUpgrade {
30
30
  * page's `endings`, `limits` and `continueLater`, an option's `seats` and `invisible`, `optionsFrom` carried from a
31
31
  * question (`{ field, picked }`) and on a table's line, a signature's `signs` and `signerField`, a list's
32
32
  * `filterRanges`, `filterCounts` and `filterSheet`, `{field}` words in a page's words — so a 0.5 page is a 0.6 page as
33
- * it is; and 0.7 (Fieldia 0.28) only added — a table of lines' `cards: "never"`, its rows kept at a phone's width — so a
34
- * 0.6 page is a 0.7 page as it is. A release that renames or reshapes a setting adds a step here, with its example; one that only adds needs
33
+ * it is; 0.7 (Fieldia 0.28) only added — a table of lines' `cards: "never"`, its rows kept at a phone's width — so a
34
+ * 0.6 page is a 0.7 page as it is; and 0.8 (Fieldia 0.29) only added — a record's `approval`, a list's `editable` and
35
+ * `searchToFilter`, a text's `translate` and `requiredIn`, a page's `suggest`, a text field's `options.rewrite`, a
36
+ * photo set's options and a field's `options.scan` — so a 0.7 page is a 0.8 page as it is. A release that renames or reshapes a setting adds a step here, with its example; one that only adds needs
35
37
  * none: the page is the same, and upgradePage writes the new version in it.
36
38
  */
37
39
  export declare const PAGE_UPGRADES: readonly PageUpgrade[];
@@ -17,8 +17,10 @@ const version_1 = require("./version");
17
17
  * page's `endings`, `limits` and `continueLater`, an option's `seats` and `invisible`, `optionsFrom` carried from a
18
18
  * question (`{ field, picked }`) and on a table's line, a signature's `signs` and `signerField`, a list's
19
19
  * `filterRanges`, `filterCounts` and `filterSheet`, `{field}` words in a page's words — so a 0.5 page is a 0.6 page as
20
- * it is; and 0.7 (Fieldia 0.28) only added — a table of lines' `cards: "never"`, its rows kept at a phone's width — so a
21
- * 0.6 page is a 0.7 page as it is. A release that renames or reshapes a setting adds a step here, with its example; one that only adds needs
20
+ * it is; 0.7 (Fieldia 0.28) only added — a table of lines' `cards: "never"`, its rows kept at a phone's width — so a
21
+ * 0.6 page is a 0.7 page as it is; and 0.8 (Fieldia 0.29) only added — a record's `approval`, a list's `editable` and
22
+ * `searchToFilter`, a text's `translate` and `requiredIn`, a page's `suggest`, a text field's `options.rewrite`, a
23
+ * photo set's options and a field's `options.scan` — so a 0.7 page is a 0.8 page as it is. A release that renames or reshapes a setting adds a step here, with its example; one that only adds needs
22
24
  * none: the page is the same, and upgradePage writes the new version in it.
23
25
  */
24
26
  exports.PAGE_UPGRADES = [];
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/format/upgrade.ts"],"names":[],"mappings":";;;AAuDA,kCAYC;AAnED,uCAA4D;AAiB5D;;;;;;;;;;;;;;;;;GAiBG;AACU,QAAA,aAAa,GAA2B,EAAE,CAAC;AAQxD,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAqB,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAE7H;;;;;;;;;GASG;AACH,SAAgB,WAAW,CAAI,IAAO,EAAE,UAAyB,EAAE,QAAQ,EAAE,yBAAe,EAAE,KAAK,EAAE,qBAAa,EAAE;IAClH,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9D,IAAI,IAAI,KAAK,OAAO,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAClG,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAA,wBAAc,EAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAA,wBAAc,EAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACvI,mHAAmH;IACnH,gFAAgF;IAChF,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,EAAO,CAAC;IAC7D,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAa,CAAC;IACxD,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;IAC7E,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,EAAO,CAAC;AAC5C,CAAC"}
1
+ {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/format/upgrade.ts"],"names":[],"mappings":";;;AAyDA,kCAYC;AArED,uCAA4D;AAiB5D;;;;;;;;;;;;;;;;;;;GAmBG;AACU,QAAA,aAAa,GAA2B,EAAE,CAAC;AAQxD,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAqB,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAE7H;;;;;;;;;GASG;AACH,SAAgB,WAAW,CAAI,IAAO,EAAE,UAAyB,EAAE,QAAQ,EAAE,yBAAe,EAAE,KAAK,EAAE,qBAAa,EAAE;IAClH,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9D,IAAI,IAAI,KAAK,OAAO,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAClG,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAA,wBAAc,EAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAA,wBAAc,EAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACvI,mHAAmH;IACnH,gFAAgF;IAChF,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,EAAO,CAAC;IAC7D,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAa,CAAC;IACxD,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;IAC7E,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,EAAO,CAAC;AAC5C,CAAC"}
@@ -13,8 +13,10 @@ import { compareFormats, FORMAT_VERSIONS } from './version.mjs';
13
13
  * page's `endings`, `limits` and `continueLater`, an option's `seats` and `invisible`, `optionsFrom` carried from a
14
14
  * question (`{ field, picked }`) and on a table's line, a signature's `signs` and `signerField`, a list's
15
15
  * `filterRanges`, `filterCounts` and `filterSheet`, `{field}` words in a page's words — so a 0.5 page is a 0.6 page as
16
- * it is; and 0.7 (Fieldia 0.28) only added — a table of lines' `cards: "never"`, its rows kept at a phone's width — so a
17
- * 0.6 page is a 0.7 page as it is. A release that renames or reshapes a setting adds a step here, with its example; one that only adds needs
16
+ * it is; 0.7 (Fieldia 0.28) only added — a table of lines' `cards: "never"`, its rows kept at a phone's width — so a
17
+ * 0.6 page is a 0.7 page as it is; and 0.8 (Fieldia 0.29) only added — a record's `approval`, a list's `editable` and
18
+ * `searchToFilter`, a text's `translate` and `requiredIn`, a page's `suggest`, a text field's `options.rewrite`, a
19
+ * photo set's options and a field's `options.scan` — so a 0.7 page is a 0.8 page as it is. A release that renames or reshapes a setting adds a step here, with its example; one that only adds needs
18
20
  * none: the page is the same, and upgradePage writes the new version in it.
19
21
  */
20
22
  export const PAGE_UPGRADES = [];
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/format/upgrade.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAiB5D;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,aAAa,GAA2B,EAAE,CAAC;AAQxD,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAqB,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAE7H;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CAAI,IAAO,EAAE,UAAyB,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAE;IAClH,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9D,IAAI,IAAI,KAAK,OAAO,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAClG,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACvI,mHAAmH;IACnH,gFAAgF;IAChF,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,EAAO,CAAC;IAC7D,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAa,CAAC;IACxD,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;IAC7E,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,EAAO,CAAC;AAC5C,CAAC"}
1
+ {"version":3,"file":"upgrade.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/format/upgrade.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAiB5D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,aAAa,GAA2B,EAAE,CAAC;AAQxD,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAqB,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAE7H;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CAAI,IAAO,EAAE,UAAyB,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAE;IAClH,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9D,IAAI,IAAI,KAAK,OAAO,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAClG,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACvI,mHAAmH;IACnH,gFAAgF;IAChF,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,EAAO,CAAC;IAC7D,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAa,CAAC;IACxD,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;IAC7E,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,EAAO,CAAC;AAC5C,CAAC"}
@@ -1,11 +1,11 @@
1
1
  /** The page format version this build reads and writes. */
2
- export declare const FORMAT_VERSION: "0.7";
2
+ export declare const FORMAT_VERSION: "0.8";
3
3
  /**
4
4
  * Every format Fieldia has had, oldest first; the last is FORMAT_VERSION. A page in an older one is brought up to date
5
5
  * by `upgradePage`, step by step (`PAGE_UPGRADES`), wherever it is read: `checkPage`, `validatePage`, the viewer, the
6
6
  * designer. A release that changes what a page may say adds its version here (see the format's docs, "Versions").
7
7
  */
8
- export declare const FORMAT_VERSIONS: readonly ["0.1", "0.2", "0.3", "0.4", "0.5", "0.6", "0.7"];
8
+ export declare const FORMAT_VERSIONS: readonly ["0.1", "0.2", "0.3", "0.4", "0.5", "0.6", "0.7", "0.8"];
9
9
  /** A format Fieldia has had: a page may say any of them, and is read in the current one. */
10
10
  export type FormatVersion = (typeof FORMAT_VERSIONS)[number];
11
11
  /** Which of two format versions is newer: below 0 when `a` is older, 0 when they are the same, null when either is not a version. */
@@ -1,11 +1,11 @@
1
1
  /** The page format version this build reads and writes. */
2
- export declare const FORMAT_VERSION: "0.7";
2
+ export declare const FORMAT_VERSION: "0.8";
3
3
  /**
4
4
  * Every format Fieldia has had, oldest first; the last is FORMAT_VERSION. A page in an older one is brought up to date
5
5
  * by `upgradePage`, step by step (`PAGE_UPGRADES`), wherever it is read: `checkPage`, `validatePage`, the viewer, the
6
6
  * designer. A release that changes what a page may say adds its version here (see the format's docs, "Versions").
7
7
  */
8
- export declare const FORMAT_VERSIONS: readonly ["0.1", "0.2", "0.3", "0.4", "0.5", "0.6", "0.7"];
8
+ export declare const FORMAT_VERSIONS: readonly ["0.1", "0.2", "0.3", "0.4", "0.5", "0.6", "0.7", "0.8"];
9
9
  /** A format Fieldia has had: a page may say any of them, and is read in the current one. */
10
10
  export type FormatVersion = (typeof FORMAT_VERSIONS)[number];
11
11
  /** Which of two format versions is newer: below 0 when `a` is older, 0 when they are the same, null when either is not a version. */
@@ -4,13 +4,13 @@ exports.FORMAT_VERSIONS = exports.FORMAT_VERSION = void 0;
4
4
  exports.compareFormats = compareFormats;
5
5
  exports.formatProblem = formatProblem;
6
6
  /** The page format version this build reads and writes. */
7
- exports.FORMAT_VERSION = '0.7';
7
+ exports.FORMAT_VERSION = '0.8';
8
8
  /**
9
9
  * Every format Fieldia has had, oldest first; the last is FORMAT_VERSION. A page in an older one is brought up to date
10
10
  * by `upgradePage`, step by step (`PAGE_UPGRADES`), wherever it is read: `checkPage`, `validatePage`, the viewer, the
11
11
  * designer. A release that changes what a page may say adds its version here (see the format's docs, "Versions").
12
12
  */
13
- exports.FORMAT_VERSIONS = ['0.1', '0.2', '0.3', '0.4', '0.5', '0.6', '0.7'];
13
+ exports.FORMAT_VERSIONS = ['0.1', '0.2', '0.3', '0.4', '0.5', '0.6', '0.7', '0.8'];
14
14
  /** `major.minor` as two numbers, or null when it is not a version at all. */
15
15
  function parts(version) {
16
16
  const match = typeof version === 'string' ? /^(\d+)\.(\d+)$/.exec(version) : null;
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/format/version.ts"],"names":[],"mappings":";;;AAoBA,wCAIC;AAMD,sCAQC;AAtCD,2DAA2D;AAC9C,QAAA,cAAc,GAAG,KAAc,CAAC;AAE7C;;;;GAIG;AACU,QAAA,eAAe,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAsC,CAAC;AAKtH,6EAA6E;AAC7E,SAAS,KAAK,CAAC,OAAgB;IAC7B,MAAM,KAAK,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClF,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7D,CAAC;AAED,qIAAqI;AACrI,SAAgB,cAAc,CAAC,CAAU,EAAE,CAAU;IACnD,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,SAAgB,aAAa,CAAC,OAAgB,EAAE,WAA8B,uBAAe;IAC3F,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9C,IAAI,OAAO,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClD,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,wDAAwD,OAAO,oBAAoB,CAAC;IAClH,IAAI,QAAQ,GAAG,CAAC;QAAE,OAAO,0BAA0B,OAAiB,oCAAoC,OAAO,8BAA8B,CAAC;IAC9I,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAiB,CAAC;QAAE,OAAO,0BAA0B,OAAiB,oCAAoC,OAAO,EAAE,CAAC;IAC1I,OAAO,UAAU,OAAiB,mDAAmD,OAAO,EAAE,CAAC;AACjG,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/format/version.ts"],"names":[],"mappings":";;;AAoBA,wCAIC;AAMD,sCAQC;AAtCD,2DAA2D;AAC9C,QAAA,cAAc,GAAG,KAAc,CAAC;AAE7C;;;;GAIG;AACU,QAAA,eAAe,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAsC,CAAC;AAK7H,6EAA6E;AAC7E,SAAS,KAAK,CAAC,OAAgB;IAC7B,MAAM,KAAK,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClF,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7D,CAAC;AAED,qIAAqI;AACrI,SAAgB,cAAc,CAAC,CAAU,EAAE,CAAU;IACnD,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,SAAgB,aAAa,CAAC,OAAgB,EAAE,WAA8B,uBAAe;IAC3F,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9C,IAAI,OAAO,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClD,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,wDAAwD,OAAO,oBAAoB,CAAC;IAClH,IAAI,QAAQ,GAAG,CAAC;QAAE,OAAO,0BAA0B,OAAiB,oCAAoC,OAAO,8BAA8B,CAAC;IAC9I,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAiB,CAAC;QAAE,OAAO,0BAA0B,OAAiB,oCAAoC,OAAO,EAAE,CAAC;IAC1I,OAAO,UAAU,OAAiB,mDAAmD,OAAO,EAAE,CAAC;AACjG,CAAC"}
@@ -1,11 +1,11 @@
1
1
  /** The page format version this build reads and writes. */
2
- export const FORMAT_VERSION = '0.7';
2
+ export const FORMAT_VERSION = '0.8';
3
3
  /**
4
4
  * Every format Fieldia has had, oldest first; the last is FORMAT_VERSION. A page in an older one is brought up to date
5
5
  * by `upgradePage`, step by step (`PAGE_UPGRADES`), wherever it is read: `checkPage`, `validatePage`, the viewer, the
6
6
  * designer. A release that changes what a page may say adds its version here (see the format's docs, "Versions").
7
7
  */
8
- export const FORMAT_VERSIONS = ['0.1', '0.2', '0.3', '0.4', '0.5', '0.6', '0.7'];
8
+ export const FORMAT_VERSIONS = ['0.1', '0.2', '0.3', '0.4', '0.5', '0.6', '0.7', '0.8'];
9
9
  /** `major.minor` as two numbers, or null when it is not a version at all. */
10
10
  function parts(version) {
11
11
  const match = typeof version === 'string' ? /^(\d+)\.(\d+)$/.exec(version) : null;
@@ -1 +1 @@
1
- {"version":3,"file":"version.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/format/version.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,MAAM,CAAC,MAAM,cAAc,GAAG,KAAc,CAAC;AAE7C;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAsC,CAAC;AAKtH,6EAA6E;AAC7E,SAAS,KAAK,CAAC,OAAgB;IAC7B,MAAM,KAAK,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClF,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7D,CAAC;AAED,qIAAqI;AACrI,MAAM,UAAU,cAAc,CAAC,CAAU,EAAE,CAAU;IACnD,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,OAAgB,EAAE,WAA8B,eAAe;IAC3F,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9C,IAAI,OAAO,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClD,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,wDAAwD,OAAO,oBAAoB,CAAC;IAClH,IAAI,QAAQ,GAAG,CAAC;QAAE,OAAO,0BAA0B,OAAiB,oCAAoC,OAAO,8BAA8B,CAAC;IAC9I,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAiB,CAAC;QAAE,OAAO,0BAA0B,OAAiB,oCAAoC,OAAO,EAAE,CAAC;IAC1I,OAAO,UAAU,OAAiB,mDAAmD,OAAO,EAAE,CAAC;AACjG,CAAC"}
1
+ {"version":3,"file":"version.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/format/version.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,MAAM,CAAC,MAAM,cAAc,GAAG,KAAc,CAAC;AAE7C;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAsC,CAAC;AAK7H,6EAA6E;AAC7E,SAAS,KAAK,CAAC,OAAgB;IAC7B,MAAM,KAAK,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClF,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7D,CAAC;AAED,qIAAqI;AACrI,MAAM,UAAU,cAAc,CAAC,CAAU,EAAE,CAAU;IACnD,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,OAAgB,EAAE,WAA8B,eAAe;IAC3F,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9C,IAAI,OAAO,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClD,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,wDAAwD,OAAO,oBAAoB,CAAC;IAClH,IAAI,QAAQ,GAAG,CAAC;QAAE,OAAO,0BAA0B,OAAiB,oCAAoC,OAAO,8BAA8B,CAAC;IAC9I,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAiB,CAAC;QAAE,OAAO,0BAA0B,OAAiB,oCAAoC,OAAO,EAAE,CAAC;IAC1I,OAAO,UAAU,OAAiB,mDAAmD,OAAO,EAAE,CAAC;AACjG,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * The approvals part's form code (approving.ts, `formApprovalsPart`): a record's approvals asked of the data source,
3
+ * a decision taken, its fields locked while it waits, and a moment of its history in words (form-approvals.ts). In the
4
+ * one-tag script it comes in one script with the viewer's approvals part, which draws them (fieldia.approvals.js).
5
+ */
6
+ export { approvalOf, approvalStatus, approvalWhen, formApprovals } from './form-approvals.mjs';
@@ -0,0 +1,6 @@
1
+ /**
2
+ * The approvals part's form code (approving.ts, `formApprovalsPart`): a record's approvals asked of the data source,
3
+ * a decision taken, its fields locked while it waits, and a moment of its history in words (form-approvals.ts). In the
4
+ * one-tag script it comes in one script with the viewer's approvals part, which draws them (fieldia.approvals.js).
5
+ */
6
+ export { approvalOf, approvalStatus, approvalWhen, formApprovals } from './form-approvals';
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formApprovals = exports.approvalWhen = exports.approvalStatus = exports.approvalOf = void 0;
4
+ /**
5
+ * The approvals part's form code (approving.ts, `formApprovalsPart`): a record's approvals asked of the data source,
6
+ * a decision taken, its fields locked while it waits, and a moment of its history in words (form-approvals.ts). In the
7
+ * one-tag script it comes in one script with the viewer's approvals part, which draws them (fieldia.approvals.js).
8
+ */
9
+ var form_approvals_1 = require("./form-approvals");
10
+ Object.defineProperty(exports, "approvalOf", { enumerable: true, get: function () { return form_approvals_1.approvalOf; } });
11
+ Object.defineProperty(exports, "approvalStatus", { enumerable: true, get: function () { return form_approvals_1.approvalStatus; } });
12
+ Object.defineProperty(exports, "approvalWhen", { enumerable: true, get: function () { return form_approvals_1.approvalWhen; } });
13
+ Object.defineProperty(exports, "formApprovals", { enumerable: true, get: function () { return form_approvals_1.formApprovals; } });
14
+ //# sourceMappingURL=approvals-part.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approvals-part.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/approvals-part.ts"],"names":[],"mappings":";;;AAAA;;;;GAIG;AACH,mDAA2F;AAAlF,4GAAA,UAAU,OAAA;AAAE,gHAAA,cAAc,OAAA;AAAE,8GAAA,YAAY,OAAA;AAAE,+GAAA,aAAa,OAAA"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * The approvals part's form code (approving.ts, `formApprovalsPart`): a record's approvals asked of the data source,
3
+ * a decision taken, its fields locked while it waits, and a moment of its history in words (form-approvals.ts). In the
4
+ * one-tag script it comes in one script with the viewer's approvals part, which draws them (fieldia.approvals.js).
5
+ */
6
+ export { approvalOf, approvalStatus, approvalWhen, formApprovals } from './form-approvals.mjs';
7
+ //# sourceMappingURL=approvals-part.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approvals-part.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/approvals-part.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { type Part } from '../parts.mjs';
2
+ import type * as ApprovalsModule from './approvals-part.mjs';
3
+ import type { ApprovalDecision, ApprovalEntry, ApprovalLevel } from './data-source.mjs';
4
+ /**
5
+ * Approvals on a record (`approval` on a page): what the data source's `approvals` told of the record shown — the
6
+ * levels it must pass, what was decided so far, the levels this person may decide — kept in the form's state
7
+ * (`FormState.approval`), worked out by the approvals part (form-approvals.ts). A viewer says where it stands, offers
8
+ * Approve and Reject, and locks the record while it waits.
9
+ */
10
+ /**
11
+ * Where a record stands as a whole: `none`, no approval asked of it (no levels, or not told yet); `needed`, levels to
12
+ * pass and none asked yet (it is not sent for approval); `waiting`, a level waits now; `approved`, every level passed;
13
+ * `rejected`, a level rejected it.
14
+ */
15
+ export type ApprovalStatus = 'none' | 'needed' | 'waiting' | 'approved' | 'rejected';
16
+ /** What a form knows of its record's approvals now (`FormState.approval`). */
17
+ export interface FormApproval {
18
+ /** `asking`: the record shown's are asked and not told yet; `told`; `failed`: they could not be read (`error`). */
19
+ readonly state: 'asking' | 'told' | 'failed';
20
+ readonly status: ApprovalStatus;
21
+ /** The levels in their order, as the source told them. */
22
+ readonly levels: readonly ApprovalLevel[];
23
+ /** Asked all at once, not one after another. */
24
+ readonly together: boolean;
25
+ /** What happened, oldest first. */
26
+ readonly history: readonly ApprovalEntry[];
27
+ /** The levels this person may decide now, by id — where the source takes decisions (`decide`), each one waiting. */
28
+ readonly mine: readonly string[];
29
+ /** Why it needs approval, in the source's words. */
30
+ readonly why?: string;
31
+ /** A decision on its way: its level and what it decides. */
32
+ readonly deciding?: {
33
+ readonly level: string;
34
+ readonly decision: ApprovalDecision;
35
+ } | null;
36
+ /** Why they could not be read, where they could not (`failed`). */
37
+ readonly error?: string;
38
+ }
39
+ /** The approvals part's form code (form-approvals.ts). */
40
+ export type FormApprovalsPart = typeof ApprovalsModule;
41
+ /**
42
+ * A record's approvals — asked of the source, a decision taken, its fields locked while it waits — loaded before a page
43
+ * with `approval` is drawn: in the one-tag script, one script with the viewer's approvals part (fieldia.approvals.js).
44
+ */
45
+ export declare const formApprovalsPart: Part<FormApprovalsPart>;
@@ -0,0 +1,45 @@
1
+ import { type Part } from '../parts';
2
+ import type * as ApprovalsModule from './approvals-part';
3
+ import type { ApprovalDecision, ApprovalEntry, ApprovalLevel } from './data-source';
4
+ /**
5
+ * Approvals on a record (`approval` on a page): what the data source's `approvals` told of the record shown — the
6
+ * levels it must pass, what was decided so far, the levels this person may decide — kept in the form's state
7
+ * (`FormState.approval`), worked out by the approvals part (form-approvals.ts). A viewer says where it stands, offers
8
+ * Approve and Reject, and locks the record while it waits.
9
+ */
10
+ /**
11
+ * Where a record stands as a whole: `none`, no approval asked of it (no levels, or not told yet); `needed`, levels to
12
+ * pass and none asked yet (it is not sent for approval); `waiting`, a level waits now; `approved`, every level passed;
13
+ * `rejected`, a level rejected it.
14
+ */
15
+ export type ApprovalStatus = 'none' | 'needed' | 'waiting' | 'approved' | 'rejected';
16
+ /** What a form knows of its record's approvals now (`FormState.approval`). */
17
+ export interface FormApproval {
18
+ /** `asking`: the record shown's are asked and not told yet; `told`; `failed`: they could not be read (`error`). */
19
+ readonly state: 'asking' | 'told' | 'failed';
20
+ readonly status: ApprovalStatus;
21
+ /** The levels in their order, as the source told them. */
22
+ readonly levels: readonly ApprovalLevel[];
23
+ /** Asked all at once, not one after another. */
24
+ readonly together: boolean;
25
+ /** What happened, oldest first. */
26
+ readonly history: readonly ApprovalEntry[];
27
+ /** The levels this person may decide now, by id — where the source takes decisions (`decide`), each one waiting. */
28
+ readonly mine: readonly string[];
29
+ /** Why it needs approval, in the source's words. */
30
+ readonly why?: string;
31
+ /** A decision on its way: its level and what it decides. */
32
+ readonly deciding?: {
33
+ readonly level: string;
34
+ readonly decision: ApprovalDecision;
35
+ } | null;
36
+ /** Why they could not be read, where they could not (`failed`). */
37
+ readonly error?: string;
38
+ }
39
+ /** The approvals part's form code (form-approvals.ts). */
40
+ export type FormApprovalsPart = typeof ApprovalsModule;
41
+ /**
42
+ * A record's approvals — asked of the source, a decision taken, its fields locked while it waits — loaded before a page
43
+ * with `approval` is drawn: in the one-tag script, one script with the viewer's approvals part (fieldia.approvals.js).
44
+ */
45
+ export declare const formApprovalsPart: Part<FormApprovalsPart>;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formApprovalsPart = void 0;
4
+ const parts_1 = require("../parts");
5
+ /**
6
+ * A record's approvals — asked of the source, a decision taken, its fields locked while it waits — loaded before a page
7
+ * with `approval` is drawn: in the one-tag script, one script with the viewer's approvals part (fieldia.approvals.js).
8
+ */
9
+ exports.formApprovalsPart = (0, parts_1.lazyPart)('approvals', () => Promise.resolve().then(() => require('./approvals-part')));
10
+ //# sourceMappingURL=approving.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approving.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/approving.ts"],"names":[],"mappings":";;;AAAA,oCAA+C;AA0C/C;;;GAGG;AACU,QAAA,iBAAiB,GAA4B,IAAA,gBAAQ,EAAC,WAAW,EAAE,GAAG,EAAE,sCAAQ,kBAAkB,EAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { lazyPart } from '../parts.mjs';
2
+ /**
3
+ * A record's approvals — asked of the source, a decision taken, its fields locked while it waits — loaded before a page
4
+ * with `approval` is drawn: in the one-tag script, one script with the viewer's approvals part (fieldia.approvals.js).
5
+ */
6
+ export const formApprovalsPart = lazyPart('approvals', () => import('./approvals-part.mjs'));
7
+ //# sourceMappingURL=approving.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approving.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/approving.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAa,MAAM,UAAU,CAAC;AA0C/C;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAA4B,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC"}
@@ -11,6 +11,7 @@ const limits_1 = require("./limits");
11
11
  const messages_1 = require("./messages");
12
12
  const input_rules_1 = require("./input-rules");
13
13
  const record_words_1 = require("./record-words");
14
+ const languages_1 = require("./languages");
14
15
  const values_1 = require("./values");
15
16
  /**
16
17
  * Check one value against its field. Returns the message to show, or
@@ -35,6 +36,9 @@ widget) {
35
36
  return required ? say((0, record_words_1.isQuestion)(label) ? 'requiredQuestion' : 'required') : undefined;
36
37
  if (field.type === 'matrix')
37
38
  return checkMatrix(field, value, required, say);
39
+ // A text kept in several languages, language by language, by its part: until it has come (a save waits for it), nothing is said.
40
+ if ((0, languages_1.languagesOf)(field))
41
+ return languages_1.formLanguagesPart.loaded?.checkTranslated(field, value, required, messages, today, widget);
38
42
  switch (field.type) {
39
43
  case 'char':
40
44
  case 'text':