@fieldia/core 0.11.0 → 0.13.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 (203) hide show
  1. package/README.md +5 -0
  2. package/package.json +1 -1
  3. package/schema/page.schema.json +3998 -893
  4. package/src/index.d.mts +1 -1
  5. package/src/index.d.ts +1 -1
  6. package/src/index.js +4 -1
  7. package/src/index.js.map +1 -1
  8. package/src/index.mjs +1 -1
  9. package/src/index.mjs.map +1 -1
  10. package/src/lib/expression/built-ins.d.mts +4 -0
  11. package/src/lib/expression/built-ins.d.ts +4 -0
  12. package/src/lib/expression/built-ins.js +8 -0
  13. package/src/lib/expression/built-ins.js.map +1 -0
  14. package/src/lib/expression/built-ins.mjs +5 -0
  15. package/src/lib/expression/built-ins.mjs.map +1 -0
  16. package/src/lib/expression/evaluator.js +17 -7
  17. package/src/lib/expression/evaluator.js.map +1 -1
  18. package/src/lib/expression/evaluator.mjs +17 -7
  19. package/src/lib/expression/evaluator.mjs.map +1 -1
  20. package/src/lib/expression/expression.d.mts +7 -0
  21. package/src/lib/expression/expression.d.ts +7 -0
  22. package/src/lib/expression/expression.js +2 -0
  23. package/src/lib/expression/expression.js.map +1 -1
  24. package/src/lib/expression/expression.mjs +3 -1
  25. package/src/lib/expression/expression.mjs.map +1 -1
  26. package/src/lib/expression/functions.d.mts +2 -0
  27. package/src/lib/expression/functions.d.ts +2 -0
  28. package/src/lib/expression/functions.js +38 -5
  29. package/src/lib/expression/functions.js.map +1 -1
  30. package/src/lib/expression/functions.mjs +38 -5
  31. package/src/lib/expression/functions.mjs.map +1 -1
  32. package/src/lib/expression/modifier.d.mts +7 -0
  33. package/src/lib/expression/modifier.d.ts +7 -0
  34. package/src/lib/expression/modifier.js +3 -1
  35. package/src/lib/expression/modifier.js.map +1 -1
  36. package/src/lib/expression/modifier.mjs +4 -2
  37. package/src/lib/expression/modifier.mjs.map +1 -1
  38. package/src/lib/expression/parser.d.mts +8 -1
  39. package/src/lib/expression/parser.d.ts +8 -1
  40. package/src/lib/expression/parser.js +30 -2
  41. package/src/lib/expression/parser.js.map +1 -1
  42. package/src/lib/expression/parser.mjs +30 -2
  43. package/src/lib/expression/parser.mjs.map +1 -1
  44. package/src/lib/expression/reads.d.mts +7 -0
  45. package/src/lib/expression/reads.d.ts +7 -0
  46. package/src/lib/expression/reads.js +23 -0
  47. package/src/lib/expression/reads.js.map +1 -1
  48. package/src/lib/expression/reads.mjs +21 -0
  49. package/src/lib/expression/reads.mjs.map +1 -1
  50. package/src/lib/format/actions.d.mts +486 -2
  51. package/src/lib/format/actions.d.ts +486 -2
  52. package/src/lib/format/actions.js +9 -0
  53. package/src/lib/format/actions.js.map +1 -1
  54. package/src/lib/format/actions.mjs +9 -0
  55. package/src/lib/format/actions.mjs.map +1 -1
  56. package/src/lib/format/check-page.d.mts +7 -2
  57. package/src/lib/format/check-page.d.ts +7 -2
  58. package/src/lib/format/check-page.js +6 -3
  59. package/src/lib/format/check-page.js.map +1 -1
  60. package/src/lib/format/check-page.mjs +6 -3
  61. package/src/lib/format/check-page.mjs.map +1 -1
  62. package/src/lib/format/field.d.mts +3285 -214
  63. package/src/lib/format/field.d.ts +3285 -214
  64. package/src/lib/format/field.js +101 -14
  65. package/src/lib/format/field.js.map +1 -1
  66. package/src/lib/format/field.mjs +100 -13
  67. package/src/lib/format/field.mjs.map +1 -1
  68. package/src/lib/format/hotkeys.d.mts +6 -0
  69. package/src/lib/format/hotkeys.d.ts +6 -0
  70. package/src/lib/format/hotkeys.js +11 -0
  71. package/src/lib/format/hotkeys.js.map +1 -0
  72. package/src/lib/format/hotkeys.mjs +7 -0
  73. package/src/lib/format/hotkeys.mjs.map +1 -0
  74. package/src/lib/format/layout.d.mts +4185 -352
  75. package/src/lib/format/layout.d.ts +4185 -352
  76. package/src/lib/format/layout.js +131 -20
  77. package/src/lib/format/layout.js.map +1 -1
  78. package/src/lib/format/layout.mjs +130 -19
  79. package/src/lib/format/layout.mjs.map +1 -1
  80. package/src/lib/format/page.d.mts +2938 -196
  81. package/src/lib/format/page.d.ts +2938 -196
  82. package/src/lib/format/page.js +7 -1
  83. package/src/lib/format/page.js.map +1 -1
  84. package/src/lib/format/page.mjs +6 -1
  85. package/src/lib/format/page.mjs.map +1 -1
  86. package/src/lib/format/references.d.mts +35 -2
  87. package/src/lib/format/references.d.ts +35 -2
  88. package/src/lib/format/references.js +321 -43
  89. package/src/lib/format/references.js.map +1 -1
  90. package/src/lib/format/references.mjs +321 -43
  91. package/src/lib/format/references.mjs.map +1 -1
  92. package/src/lib/format/themes.d.mts +9 -0
  93. package/src/lib/format/themes.d.ts +9 -0
  94. package/src/lib/format/themes.js +13 -0
  95. package/src/lib/format/themes.js.map +1 -0
  96. package/src/lib/format/themes.mjs +10 -0
  97. package/src/lib/format/themes.mjs.map +1 -0
  98. package/src/lib/format/translate.js +5 -3
  99. package/src/lib/format/translate.js.map +1 -1
  100. package/src/lib/format/translate.mjs +5 -3
  101. package/src/lib/format/translate.mjs.map +1 -1
  102. package/src/lib/format/words.d.mts +9 -0
  103. package/src/lib/format/words.d.ts +9 -0
  104. package/src/lib/format/words.js +35 -0
  105. package/src/lib/format/words.js.map +1 -0
  106. package/src/lib/format/words.mjs +30 -0
  107. package/src/lib/format/words.mjs.map +1 -0
  108. package/src/lib/record/cells.d.mts +37 -0
  109. package/src/lib/record/cells.d.ts +37 -0
  110. package/src/lib/record/cells.js +59 -0
  111. package/src/lib/record/cells.js.map +1 -0
  112. package/src/lib/record/cells.mjs +54 -0
  113. package/src/lib/record/cells.mjs.map +1 -0
  114. package/src/lib/record/compute.d.mts +5 -4
  115. package/src/lib/record/compute.d.ts +5 -4
  116. package/src/lib/record/compute.js +11 -10
  117. package/src/lib/record/compute.js.map +1 -1
  118. package/src/lib/record/compute.mjs +12 -11
  119. package/src/lib/record/compute.mjs.map +1 -1
  120. package/src/lib/record/data-source.d.mts +32 -2
  121. package/src/lib/record/data-source.d.ts +32 -2
  122. package/src/lib/record/data-source.js.map +1 -1
  123. package/src/lib/record/data-source.mjs.map +1 -1
  124. package/src/lib/record/env.d.mts +38 -1
  125. package/src/lib/record/env.d.ts +38 -1
  126. package/src/lib/record/env.js +41 -3
  127. package/src/lib/record/env.js.map +1 -1
  128. package/src/lib/record/env.mjs +38 -3
  129. package/src/lib/record/env.mjs.map +1 -1
  130. package/src/lib/record/filter.d.mts +10 -0
  131. package/src/lib/record/filter.d.ts +10 -0
  132. package/src/lib/record/filter.js +49 -0
  133. package/src/lib/record/filter.js.map +1 -1
  134. package/src/lib/record/filter.mjs +48 -0
  135. package/src/lib/record/filter.mjs.map +1 -1
  136. package/src/lib/record/form.d.mts +143 -8
  137. package/src/lib/record/form.d.ts +143 -8
  138. package/src/lib/record/form.js +495 -58
  139. package/src/lib/record/form.js.map +1 -1
  140. package/src/lib/record/form.mjs +496 -60
  141. package/src/lib/record/form.mjs.map +1 -1
  142. package/src/lib/record/locales/ar.js +3 -0
  143. package/src/lib/record/locales/ar.js.map +1 -1
  144. package/src/lib/record/locales/ar.mjs +3 -0
  145. package/src/lib/record/locales/ar.mjs.map +1 -1
  146. package/src/lib/record/locales/de.js +3 -0
  147. package/src/lib/record/locales/de.js.map +1 -1
  148. package/src/lib/record/locales/de.mjs +3 -0
  149. package/src/lib/record/locales/de.mjs.map +1 -1
  150. package/src/lib/record/locales/fr.js +3 -0
  151. package/src/lib/record/locales/fr.js.map +1 -1
  152. package/src/lib/record/locales/fr.mjs +3 -0
  153. package/src/lib/record/locales/fr.mjs.map +1 -1
  154. package/src/lib/record/memory-data-source.d.mts +26 -2
  155. package/src/lib/record/memory-data-source.d.ts +26 -2
  156. package/src/lib/record/memory-data-source.js +98 -7
  157. package/src/lib/record/memory-data-source.js.map +1 -1
  158. package/src/lib/record/memory-data-source.mjs +98 -7
  159. package/src/lib/record/memory-data-source.mjs.map +1 -1
  160. package/src/lib/record/messages.d.mts +5 -0
  161. package/src/lib/record/messages.d.ts +5 -0
  162. package/src/lib/record/messages.js +3 -0
  163. package/src/lib/record/messages.js.map +1 -1
  164. package/src/lib/record/messages.mjs +3 -0
  165. package/src/lib/record/messages.mjs.map +1 -1
  166. package/src/lib/record/roles.d.mts +10 -0
  167. package/src/lib/record/roles.d.ts +10 -0
  168. package/src/lib/record/roles.js +21 -0
  169. package/src/lib/record/roles.js.map +1 -0
  170. package/src/lib/record/roles.mjs +18 -0
  171. package/src/lib/record/roles.mjs.map +1 -0
  172. package/src/lib/record/rules.js +30 -0
  173. package/src/lib/record/rules.js.map +1 -1
  174. package/src/lib/record/rules.mjs +31 -1
  175. package/src/lib/record/rules.mjs.map +1 -1
  176. package/src/lib/record/run.d.mts +79 -0
  177. package/src/lib/record/run.d.ts +79 -0
  178. package/src/lib/record/run.js +105 -0
  179. package/src/lib/record/run.js.map +1 -1
  180. package/src/lib/record/run.mjs +105 -0
  181. package/src/lib/record/run.mjs.map +1 -1
  182. package/src/lib/record/set-when.d.mts +5 -2
  183. package/src/lib/record/set-when.d.ts +5 -2
  184. package/src/lib/record/set-when.js +28 -12
  185. package/src/lib/record/set-when.js.map +1 -1
  186. package/src/lib/record/set-when.mjs +30 -14
  187. package/src/lib/record/set-when.mjs.map +1 -1
  188. package/src/lib/record/value-map.d.mts +41 -0
  189. package/src/lib/record/value-map.d.ts +41 -0
  190. package/src/lib/record/value-map.js +80 -0
  191. package/src/lib/record/value-map.js.map +1 -0
  192. package/src/lib/record/value-map.mjs +73 -0
  193. package/src/lib/record/value-map.mjs.map +1 -0
  194. package/src/lib/record/values.d.mts +10 -0
  195. package/src/lib/record/values.d.ts +10 -0
  196. package/src/lib/record/values.js.map +1 -1
  197. package/src/lib/record/values.mjs.map +1 -1
  198. package/src/runtime.d.mts +11 -6
  199. package/src/runtime.d.ts +11 -6
  200. package/src/runtime.js +13 -1
  201. package/src/runtime.js.map +1 -1
  202. package/src/runtime.mjs +4 -0
  203. package/src/runtime.mjs.map +1 -1
@@ -1,5 +1,6 @@
1
1
  import type { Field, LineField } from '../format/field.mjs';
2
2
  import type { Page } from '../format/page.mjs';
3
+ import { type About } from './env.mjs';
3
4
  import { type Value, type Values } from './values.mjs';
4
5
  /**
5
6
  * Values worked out from others: a field's `compute`. A page's own fields are
@@ -11,8 +12,8 @@ import { type Value, type Values } from './values.mjs';
11
12
  export interface Computed {
12
13
  /** The values with every worked-out field brought up to date. */
13
14
  apply(values: Values): Values;
14
- /** One line of a one2many with its worked-out fields brought up to date. */
15
- line(field: string, values: Values): Values;
15
+ /** One line of a one2many on the record `values`, with its worked-out fields brought up to date. */
16
+ line(field: string, line: Values, values: Values): Values;
16
17
  }
17
18
  /**
18
19
  * A worked-out value as its field holds it: a whole number rounded, a number
@@ -20,5 +21,5 @@ export interface Computed {
20
21
  * Python's idea of true, and null for what the field cannot hold.
21
22
  */
22
23
  export declare function fitTo(def: Field | LineField, value: unknown): Value;
23
- /** Read every `compute` of a page once. `today` is the day `today()` gives. */
24
- export declare function compileComputed(page: Page, today: () => string): Computed;
24
+ /** Read every `compute` of a page once. `today` is the day `today()` gives; `about`, the record's id and the person, as lines read them on `parent`. */
25
+ export declare function compileComputed(page: Page, today: () => string, about?: () => About): Computed;
@@ -1,5 +1,6 @@
1
1
  import type { Field, LineField } from '../format/field';
2
2
  import type { Page } from '../format/page';
3
+ import { type About } from './env';
3
4
  import { type Value, type Values } from './values';
4
5
  /**
5
6
  * Values worked out from others: a field's `compute`. A page's own fields are
@@ -11,8 +12,8 @@ import { type Value, type Values } from './values';
11
12
  export interface Computed {
12
13
  /** The values with every worked-out field brought up to date. */
13
14
  apply(values: Values): Values;
14
- /** One line of a one2many with its worked-out fields brought up to date. */
15
- line(field: string, values: Values): Values;
15
+ /** One line of a one2many on the record `values`, with its worked-out fields brought up to date. */
16
+ line(field: string, line: Values, values: Values): Values;
16
17
  }
17
18
  /**
18
19
  * A worked-out value as its field holds it: a whole number rounded, a number
@@ -20,5 +21,5 @@ export interface Computed {
20
21
  * Python's idea of true, and null for what the field cannot hold.
21
22
  */
22
23
  export declare function fitTo(def: Field | LineField, value: unknown): Value;
23
- /** Read every `compute` of a page once. `today` is the day `today()` gives. */
24
- export declare function compileComputed(page: Page, today: () => string): Computed;
24
+ /** Read every `compute` of a page once. `today` is the day `today()` gives; `about`, the record's id and the person, as lines read them on `parent`. */
25
+ export declare function compileComputed(page: Page, today: () => string, about?: () => About): Computed;
@@ -45,8 +45,8 @@ function fitTo(def, value) {
45
45
  return value;
46
46
  }
47
47
  }
48
- /** Read every `compute` of a page once. `today` is the day `today()` gives. */
49
- function compileComputed(page, today) {
48
+ /** Read every `compute` of a page once. `today` is the day `today()` gives; `about`, the record's id and the person, as lines read them on `parent`. */
49
+ function compileComputed(page, today, about = () => ({ recordId: null })) {
50
50
  const own = steps(page.fields);
51
51
  const lineSteps = new Map();
52
52
  for (const [name, def] of Object.entries(page.fields)) {
@@ -58,10 +58,10 @@ function compileComputed(page, today) {
58
58
  }
59
59
  // Lines hold no lines of their own: inside one, only today() needs the env.
60
60
  const lineEnv = { today };
61
- /** Work out the steps on these values, writing each change into a copy. */
62
- function run(values, list, fields, env) {
61
+ /** Work out the steps on these values, writing each change into a copy; `read` gives the values as expressions read them. */
62
+ function run(values, list, fields, env, read) {
63
63
  let next = values;
64
- const context = (0, values_1.expressionContext)(values, fields);
64
+ const context = read(values);
65
65
  for (const [name, expression, def] of list) {
66
66
  const value = fitTo(def, expression.evaluate(context, env));
67
67
  if ((0, values_1.sameValue)(value, next[name]))
@@ -72,24 +72,25 @@ function compileComputed(page, today) {
72
72
  }
73
73
  return next;
74
74
  }
75
- function line(field, values) {
75
+ function line(field, values, parent) {
76
76
  const found = lineSteps.get(field);
77
77
  // A section or a note has nothing to work out.
78
78
  if (!found || (0, values_1.lineKind)(found.def, values) !== null)
79
79
  return values;
80
- return run(values, found.steps, found.def.fields, lineEnv);
80
+ return run(values, found.steps, found.def.fields, lineEnv, (v) => (0, env_1.lineContext)(v, found.def.fields, parent));
81
81
  }
82
82
  return {
83
- line,
83
+ line: (field, values, record) => line(field, values, (0, env_1.recordContext)(record, page.fields, about())),
84
84
  apply(values) {
85
85
  let next = values;
86
+ const parent = lineSteps.size ? (0, env_1.recordContext)(values, page.fields, about()) : {};
86
87
  for (const field of lineSteps.keys()) {
87
88
  const current = next[field];
88
89
  if (!Array.isArray(current))
89
90
  continue;
90
91
  let changed = false;
91
92
  const updated = current.map((l) => {
92
- const worked = line(field, l.values);
93
+ const worked = line(field, l.values, parent);
93
94
  if (worked === l.values)
94
95
  return l;
95
96
  changed = true;
@@ -100,7 +101,7 @@ function compileComputed(page, today) {
100
101
  }
101
102
  if (!own.length)
102
103
  return next;
103
- return run(next, own, page.fields, (0, env_1.expressionEnv)(next, page.fields, today));
104
+ return run(next, own, page.fields, (0, env_1.expressionEnv)(next, page.fields, today), (v) => (0, env_1.recordContext)(v, page.fields, about()));
104
105
  },
105
106
  };
106
107
  }
@@ -1 +1 @@
1
- {"version":3,"file":"compute.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/compute.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compute.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/compute.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { compileExpression } from '../expression/expression.mjs';
2
2
  import { isNumber, roundTo, truthy } from '../expression/operations.mjs';
3
3
  import { dependencyOrder } from '../expression/order.mjs';
4
- import { expressionEnv } from './env.mjs';
4
+ import { expressionEnv, lineContext, recordContext } from './env.mjs';
5
5
  import { expressionContext, lineKind, sameValue } from './values.mjs';
6
6
  /** The worked-out fields among `fields`, each read once, in the order to work them out. */
7
7
  function steps(fields) {
@@ -41,8 +41,8 @@ export function fitTo(def, value) {
41
41
  return value;
42
42
  }
43
43
  }
44
- /** Read every `compute` of a page once. `today` is the day `today()` gives. */
45
- export function compileComputed(page, today) {
44
+ /** Read every `compute` of a page once. `today` is the day `today()` gives; `about`, the record's id and the person, as lines read them on `parent`. */
45
+ export function compileComputed(page, today, about = () => ({ recordId: null })) {
46
46
  const own = steps(page.fields);
47
47
  const lineSteps = new Map();
48
48
  for (const [name, def] of Object.entries(page.fields)) {
@@ -54,10 +54,10 @@ export function compileComputed(page, today) {
54
54
  }
55
55
  // Lines hold no lines of their own: inside one, only today() needs the env.
56
56
  const lineEnv = { today };
57
- /** Work out the steps on these values, writing each change into a copy. */
58
- function run(values, list, fields, env) {
57
+ /** Work out the steps on these values, writing each change into a copy; `read` gives the values as expressions read them. */
58
+ function run(values, list, fields, env, read) {
59
59
  let next = values;
60
- const context = expressionContext(values, fields);
60
+ const context = read(values);
61
61
  for (const [name, expression, def] of list) {
62
62
  const value = fitTo(def, expression.evaluate(context, env));
63
63
  if (sameValue(value, next[name]))
@@ -68,24 +68,25 @@ export function compileComputed(page, today) {
68
68
  }
69
69
  return next;
70
70
  }
71
- function line(field, values) {
71
+ function line(field, values, parent) {
72
72
  const found = lineSteps.get(field);
73
73
  // A section or a note has nothing to work out.
74
74
  if (!found || lineKind(found.def, values) !== null)
75
75
  return values;
76
- return run(values, found.steps, found.def.fields, lineEnv);
76
+ return run(values, found.steps, found.def.fields, lineEnv, (v) => lineContext(v, found.def.fields, parent));
77
77
  }
78
78
  return {
79
- line,
79
+ line: (field, values, record) => line(field, values, recordContext(record, page.fields, about())),
80
80
  apply(values) {
81
81
  let next = values;
82
+ const parent = lineSteps.size ? recordContext(values, page.fields, about()) : {};
82
83
  for (const field of lineSteps.keys()) {
83
84
  const current = next[field];
84
85
  if (!Array.isArray(current))
85
86
  continue;
86
87
  let changed = false;
87
88
  const updated = current.map((l) => {
88
- const worked = line(field, l.values);
89
+ const worked = line(field, l.values, parent);
89
90
  if (worked === l.values)
90
91
  return l;
91
92
  changed = true;
@@ -96,7 +97,7 @@ export function compileComputed(page, today) {
96
97
  }
97
98
  if (!own.length)
98
99
  return next;
99
- return run(next, own, page.fields, expressionEnv(next, page.fields, today));
100
+ return run(next, own, page.fields, expressionEnv(next, page.fields, today), (v) => recordContext(v, page.fields, about()));
100
101
  },
101
102
  };
102
103
  }
@@ -1 +1 @@
1
- {"version":3,"file":"compute.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/compute.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compute.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/compute.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAA+C,MAAM,0BAA0B,CAAC;AAC1G,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAc,MAAM,OAAO,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,SAAS,EAAsC,MAAM,UAAU,CAAC;AAkBtG,2FAA2F;AAC3F,SAAS,KAAK,CAAC,MAAyC;IACtD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAC;IACvD,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS;YAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IACpI,MAAM,EAAE,KAAK,EAAE,GAAG,eAAe,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACjH,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAuB,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC7F,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,KAAK,CAAC,GAAsB,EAAE,KAAc;IAC1D,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACvD,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,SAAS;YACZ,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACpD,KAAK,OAAO,CAAC;QACb,KAAK,UAAU;YACb,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YAClC,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC5D,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM;YACT,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACpF,KAAK,MAAM,CAAC;QACZ,KAAK,UAAU;YACb,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QAClD;YACE,OAAO,KAAc,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,wJAAwJ;AACxJ,MAAM,UAAU,eAAe,CAAC,IAAU,EAAE,KAAmB,EAAE,QAAqB,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC9G,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAwE,CAAC;IAClG,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtD,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU;YAAE,SAAS;QACtC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,KAAK,CAAC,MAAM;YAAE,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,4EAA4E;IAC5E,MAAM,OAAO,GAAkB,EAAE,KAAK,EAAE,CAAC;IAEzC,6HAA6H;IAC7H,SAAS,GAAG,CAAC,MAAc,EAAE,IAAY,EAAE,MAAyC,EAAE,GAAkB,EAAE,IAAiD;QACzJ,IAAI,IAAI,GAAG,MAAM,CAAC;QAClB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;YAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAC5D,IAAI,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAAE,SAAS;YAC3C,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC;YAClC,kDAAkD;YAClD,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,iBAAiB,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,IAAI,CAAC,KAAa,EAAE,MAAc,EAAE,MAA+B;QAC1E,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnC,+CAA+C;QAC/C,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,IAAI;YAAE,OAAO,MAAM,CAAC;QAClE,OAAO,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9G,CAAC;IAED,OAAO;QACL,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACjG,KAAK,CAAC,MAAM;YACV,IAAI,IAAI,GAAG,MAAM,CAAC;YAClB,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACjF,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;gBACrC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;oBAAE,SAAS;gBACtC,IAAI,OAAO,GAAG,KAAK,CAAC;gBACpB,MAAM,OAAO,GAAI,OAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;oBAC7C,IAAI,MAAM,KAAK,CAAC,CAAC,MAAM;wBAAE,OAAO,CAAC,CAAC;oBAClC,OAAO,GAAG,IAAI,CAAC;oBACf,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;gBAClC,CAAC,CAAC,CAAC;gBACH,IAAI,OAAO;oBAAE,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;YACpD,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YAC7B,OAAO,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC7H,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,6 +1,6 @@
1
- import type { FilterCondition, Fields, Option } from '../format/field.mjs';
1
+ import type { FilterCondition, Fields, Option, PropertyDefinition } from '../format/field.mjs';
2
2
  import type { JsonValue } from '../format/json.mjs';
3
- import type { RecordId, RelatedRecord, Values } from './values.mjs';
3
+ import type { FileValue, RecordId, RelatedRecord, Values } from './values.mjs';
4
4
  import type { RunStop } from './run.mjs';
5
5
  /**
6
6
  * How Fieldia reaches data. Fieldia knows no backend: an app implements this
@@ -26,6 +26,34 @@ export interface DataSource {
26
26
  groups?(request: GroupRequest): Promise<Group[]>;
27
27
  /** The choices of one of the app's lists, for a selection with `optionsFrom`. */
28
28
  options?(request: OptionsRequest): Promise<Option[]>;
29
+ /** The definitions of a properties field with `definitionsFrom`: those the linked record keeps. */
30
+ definitions?(request: OptionsRequest): Promise<PropertyDefinition[]>;
31
+ /** Keep a properties field's definitions, a property added in place among them, on the record they come from. */
32
+ saveDefinitions?(request: OptionsRequest & {
33
+ definitions: PropertyDefinition[];
34
+ }): Promise<void>;
35
+ /** Archive a record, or bring it back (`archive: false`): Flectra's `active` set false or true. For the `archive` and `unarchive` steps. */
36
+ archive?(request: ArchiveRequest): Promise<void>;
37
+ /** Copy a record, as a backend's copy does: the copy's id, and its values when the source has them. For the `duplicate` step. */
38
+ copy?(request: RecordRequest): Promise<SaveResult>;
39
+ /** Delete a record. For the `delete` step. */
40
+ delete?(request: RecordRequest): Promise<void>;
41
+ /**
42
+ * The record's attachments, its main one first, for a sheet's attachment
43
+ * preview: each a file with its `url` (or its `data`) and its media type.
44
+ */
45
+ attachments?(request: RecordRequest): Promise<FileValue[]>;
46
+ }
47
+ /** One stored record, by its model and id. */
48
+ export interface RecordRequest {
49
+ model: string;
50
+ id: RecordId;
51
+ /** The page's fields, so the source knows what the page shows of it. */
52
+ fields: Fields;
53
+ }
54
+ export interface ArchiveRequest extends RecordRequest {
55
+ /** True to archive it, false to bring it back. */
56
+ archive: boolean;
29
57
  }
30
58
  export interface OptionsRequest {
31
59
  /** The list's name, from the field's `optionsFrom.list`. */
@@ -37,6 +65,8 @@ export interface CreateRequest {
37
65
  model: string;
38
66
  /** What the person typed: the new record's name. */
39
67
  name: string;
68
+ /** What else it starts with, from the link's `createValues`: links as `{ id, label }`. */
69
+ values?: Values;
40
70
  }
41
71
  export interface LoadRequest {
42
72
  model: string;
@@ -1,6 +1,6 @@
1
- import type { FilterCondition, Fields, Option } from '../format/field';
1
+ import type { FilterCondition, Fields, Option, PropertyDefinition } from '../format/field';
2
2
  import type { JsonValue } from '../format/json';
3
- import type { RecordId, RelatedRecord, Values } from './values';
3
+ import type { FileValue, RecordId, RelatedRecord, Values } from './values';
4
4
  import type { RunStop } from './run';
5
5
  /**
6
6
  * How Fieldia reaches data. Fieldia knows no backend: an app implements this
@@ -26,6 +26,34 @@ export interface DataSource {
26
26
  groups?(request: GroupRequest): Promise<Group[]>;
27
27
  /** The choices of one of the app's lists, for a selection with `optionsFrom`. */
28
28
  options?(request: OptionsRequest): Promise<Option[]>;
29
+ /** The definitions of a properties field with `definitionsFrom`: those the linked record keeps. */
30
+ definitions?(request: OptionsRequest): Promise<PropertyDefinition[]>;
31
+ /** Keep a properties field's definitions, a property added in place among them, on the record they come from. */
32
+ saveDefinitions?(request: OptionsRequest & {
33
+ definitions: PropertyDefinition[];
34
+ }): Promise<void>;
35
+ /** Archive a record, or bring it back (`archive: false`): Flectra's `active` set false or true. For the `archive` and `unarchive` steps. */
36
+ archive?(request: ArchiveRequest): Promise<void>;
37
+ /** Copy a record, as a backend's copy does: the copy's id, and its values when the source has them. For the `duplicate` step. */
38
+ copy?(request: RecordRequest): Promise<SaveResult>;
39
+ /** Delete a record. For the `delete` step. */
40
+ delete?(request: RecordRequest): Promise<void>;
41
+ /**
42
+ * The record's attachments, its main one first, for a sheet's attachment
43
+ * preview: each a file with its `url` (or its `data`) and its media type.
44
+ */
45
+ attachments?(request: RecordRequest): Promise<FileValue[]>;
46
+ }
47
+ /** One stored record, by its model and id. */
48
+ export interface RecordRequest {
49
+ model: string;
50
+ id: RecordId;
51
+ /** The page's fields, so the source knows what the page shows of it. */
52
+ fields: Fields;
53
+ }
54
+ export interface ArchiveRequest extends RecordRequest {
55
+ /** True to archive it, false to bring it back. */
56
+ archive: boolean;
29
57
  }
30
58
  export interface OptionsRequest {
31
59
  /** The list's name, from the field's `optionsFrom.list`. */
@@ -37,6 +65,8 @@ export interface CreateRequest {
37
65
  model: string;
38
66
  /** What the person typed: the new record's name. */
39
67
  name: string;
68
+ /** What else it starts with, from the link's `createValues`: links as `{ id, label }`. */
69
+ values?: Values;
40
70
  }
41
71
  export interface LoadRequest {
42
72
  model: string;
@@ -1 +1 @@
1
- {"version":3,"file":"data-source.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/data-source.ts"],"names":[],"mappings":";;AA0LA,kCAEC;AAGD,sCAMC;AAZD,8EAA8E;AAC9E,SAAgB,WAAW,CAAC,OAAoB;IAC9C,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;AAChE,CAAC;AAED,wGAAwG;AACxG,SAAgB,aAAa,CAAC,KAAc;IAC1C,MAAM,OAAO,GAAI,KAA0C,EAAE,OAAO,CAAC;IACrE,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChE,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,IAAI,KAAK,YAAY,SAAS,IAAI,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IAClH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"data-source.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/data-source.ts"],"names":[],"mappings":";;AAwNA,kCAEC;AAGD,sCAMC;AAZD,8EAA8E;AAC9E,SAAgB,WAAW,CAAC,OAAoB;IAC9C,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;AAChE,CAAC;AAED,wGAAwG;AACxG,SAAgB,aAAa,CAAC,KAAc;IAC1C,MAAM,OAAO,GAAI,KAA0C,EAAE,OAAO,CAAC;IACrE,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChE,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,IAAI,KAAK,YAAY,SAAS,IAAI,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IAClH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AACpC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"data-source.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/data-source.ts"],"names":[],"mappings":"AAyLA,8EAA8E;AAC9E,MAAM,UAAU,WAAW,CAAC,OAAoB;IAC9C,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;AAChE,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,MAAM,OAAO,GAAI,KAA0C,EAAE,OAAO,CAAC;IACrE,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChE,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,IAAI,KAAK,YAAY,SAAS,IAAI,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IAClH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"data-source.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/data-source.ts"],"names":[],"mappings":"AAuNA,8EAA8E;AAC9E,MAAM,UAAU,WAAW,CAAC,OAAoB;IAC9C,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;AAChE,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,MAAM,OAAO,GAAI,KAA0C,EAAE,OAAO,CAAC;IACrE,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChE,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,IAAI,KAAK,YAAY,SAAS,IAAI,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IAClH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AACpC,CAAC"}
@@ -1,9 +1,46 @@
1
1
  import type { Field, LineField } from '../format/field.mjs';
2
2
  import type { ExpressionEnv } from '../expression/functions.mjs';
3
- import { type Values } from './values.mjs';
3
+ import type { JsonValue } from '../format/json.mjs';
4
+ import { type RecordId, type Values } from './values.mjs';
5
+ /**
6
+ * What expressions read besides a record's fields: `id`, the record's id
7
+ * (null while it is new), `user`, the person using the form (`id`, `name`,
8
+ * `roles`), `editing`, whether the record is being edited — false while
9
+ * a view shows it locked, to be read, as Flectra's oe_edit_only and
10
+ * oe_read_only — and `context`, the values the app passes in, as Flectra's
11
+ * context. A page's own field of the same name comes first.
12
+ */
13
+ export declare function builtIns(fields: Record<string, unknown>, recordId: RecordId | null, user: {
14
+ id: RecordId | null;
15
+ name?: string;
16
+ roles?: readonly string[];
17
+ } | undefined, editing?: boolean, context?: Readonly<Record<string, JsonValue>>, parent?: Record<string, unknown>): Record<string, unknown>;
4
18
  /**
5
19
  * What an expression on a record is worked out with besides its values: the
6
20
  * rows of each one2many for `sum` and `count` — the items, not the sections
7
21
  * and notes between them — and today's date for `today()`.
8
22
  */
23
+ /** The record's id and the person, for what is worked out away from the form. */
24
+ export interface About {
25
+ recordId: RecordId | null;
26
+ user?: {
27
+ id: RecordId | null;
28
+ name?: string;
29
+ roles?: readonly string[];
30
+ };
31
+ /** Whether the record is being edited; true unless said. */
32
+ editing?: boolean;
33
+ /** The values the app passes in (the form's `context`). */
34
+ context?: Readonly<Record<string, JsonValue>>;
35
+ /** For a line's own form: the record the line is on, as expressions read it. */
36
+ parent?: Record<string, unknown>;
37
+ }
38
+ /** The record as expressions read it: its values, its `id` and `user`. What a line reads as `parent`. */
39
+ export declare function recordContext(values: Values, fields: Record<string, Field | LineField>, about: About): Record<string, unknown>;
40
+ /**
41
+ * A line as its expressions read it: its values, `parent` — the record it is
42
+ * on, as that record's expressions read it — and `user`. A line field of the
43
+ * same name comes first.
44
+ */
45
+ export declare function lineContext(values: Values, fields: Record<string, LineField>, parent: Record<string, unknown>, id?: RecordId | null): Record<string, unknown>;
9
46
  export declare function expressionEnv(values: Values, fields: Record<string, Field | LineField>, today: () => string): ExpressionEnv;
@@ -1,9 +1,46 @@
1
1
  import type { Field, LineField } from '../format/field';
2
2
  import type { ExpressionEnv } from '../expression/functions';
3
- import { type Values } from './values';
3
+ import type { JsonValue } from '../format/json';
4
+ import { type RecordId, type Values } from './values';
5
+ /**
6
+ * What expressions read besides a record's fields: `id`, the record's id
7
+ * (null while it is new), `user`, the person using the form (`id`, `name`,
8
+ * `roles`), `editing`, whether the record is being edited — false while
9
+ * a view shows it locked, to be read, as Flectra's oe_edit_only and
10
+ * oe_read_only — and `context`, the values the app passes in, as Flectra's
11
+ * context. A page's own field of the same name comes first.
12
+ */
13
+ export declare function builtIns(fields: Record<string, unknown>, recordId: RecordId | null, user: {
14
+ id: RecordId | null;
15
+ name?: string;
16
+ roles?: readonly string[];
17
+ } | undefined, editing?: boolean, context?: Readonly<Record<string, JsonValue>>, parent?: Record<string, unknown>): Record<string, unknown>;
4
18
  /**
5
19
  * What an expression on a record is worked out with besides its values: the
6
20
  * rows of each one2many for `sum` and `count` — the items, not the sections
7
21
  * and notes between them — and today's date for `today()`.
8
22
  */
23
+ /** The record's id and the person, for what is worked out away from the form. */
24
+ export interface About {
25
+ recordId: RecordId | null;
26
+ user?: {
27
+ id: RecordId | null;
28
+ name?: string;
29
+ roles?: readonly string[];
30
+ };
31
+ /** Whether the record is being edited; true unless said. */
32
+ editing?: boolean;
33
+ /** The values the app passes in (the form's `context`). */
34
+ context?: Readonly<Record<string, JsonValue>>;
35
+ /** For a line's own form: the record the line is on, as expressions read it. */
36
+ parent?: Record<string, unknown>;
37
+ }
38
+ /** The record as expressions read it: its values, its `id` and `user`. What a line reads as `parent`. */
39
+ export declare function recordContext(values: Values, fields: Record<string, Field | LineField>, about: About): Record<string, unknown>;
40
+ /**
41
+ * A line as its expressions read it: its values, `parent` — the record it is
42
+ * on, as that record's expressions read it — and `user`. A line field of the
43
+ * same name comes first.
44
+ */
45
+ export declare function lineContext(values: Values, fields: Record<string, LineField>, parent: Record<string, unknown>, id?: RecordId | null): Record<string, unknown>;
9
46
  export declare function expressionEnv(values: Values, fields: Record<string, Field | LineField>, today: () => string): ExpressionEnv;
@@ -1,12 +1,50 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.builtIns = builtIns;
4
+ exports.recordContext = recordContext;
5
+ exports.lineContext = lineContext;
3
6
  exports.expressionEnv = expressionEnv;
4
7
  const values_1 = require("./values");
5
8
  /**
6
- * What an expression on a record is worked out with besides its values: the
7
- * rows of each one2many for `sum` and `count` — the items, not the sections
8
- * and notes between them — and today's date for `today()`.
9
+ * What expressions read besides a record's fields: `id`, the record's id
10
+ * (null while it is new), `user`, the person using the form (`id`, `name`,
11
+ * `roles`), `editing`, whether the record is being edited — false while
12
+ * a view shows it locked, to be read, as Flectra's oe_edit_only and
13
+ * oe_read_only — and `context`, the values the app passes in, as Flectra's
14
+ * context. A page's own field of the same name comes first.
9
15
  */
16
+ function builtIns(fields, recordId, user, editing = true, context = {}, parent) {
17
+ const names = {
18
+ id: recordId ?? null,
19
+ user: { id: user?.id ?? null, name: user?.name ?? null, roles: [...(user?.roles ?? [])] },
20
+ editing,
21
+ context,
22
+ // A line's own form reads the record the line is on, as a line does.
23
+ ...(parent ? { parent } : {}),
24
+ };
25
+ for (const name of Object.keys(names))
26
+ if (name in fields)
27
+ delete names[name];
28
+ return names;
29
+ }
30
+ /** The record as expressions read it: its values, its `id` and `user`. What a line reads as `parent`. */
31
+ function recordContext(values, fields, about) {
32
+ return { ...builtIns(fields, about.recordId, about.user, about.editing, about.context, about.parent), ...(0, values_1.expressionContext)(values, fields) };
33
+ }
34
+ /**
35
+ * A line as its expressions read it: its values, `parent` — the record it is
36
+ * on, as that record's expressions read it — and `user`. A line field of the
37
+ * same name comes first.
38
+ */
39
+ function lineContext(values, fields, parent, id = null) {
40
+ // The line's own id, empty until it is saved: Flectra's readonly="id" on a saved line.
41
+ // The app's values a line reads are its record's.
42
+ const names = { parent, user: parent['user'] ?? builtIns({}, null, undefined)['user'], id, context: parent['context'] ?? {} };
43
+ for (const name of Object.keys(names))
44
+ if (name in fields)
45
+ delete names[name];
46
+ return { ...names, ...(0, values_1.expressionContext)(values, fields) };
47
+ }
10
48
  function expressionEnv(values, fields, today) {
11
49
  const rows = new Map();
12
50
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/env.ts"],"names":[],"mappings":";;AASA,sCAgBC;AAvBD,qCAA+E;AAE/E;;;;GAIG;AACH,SAAgB,aAAa,CAAC,MAAc,EAAE,MAAyC,EAAE,KAAmB;IAC1G,MAAM,IAAI,GAAG,IAAI,GAAG,EAAqC,CAAC;IAC1D,OAAO;QACL,KAAK;QACL,KAAK,CAAC,IAAI;YACR,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YACzB,IAAI,GAAG,EAAE,IAAI,KAAK,UAAU;gBAAE,OAAO,SAAS,CAAC;YAC/C,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,KAAK,GAAG,CAAE,MAAM,CAAC,IAAI,CAAmB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,iBAAQ,EAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;gBAC5G,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,0BAAiB,EAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;gBACxE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACxB,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/env.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,44 @@
1
1
  import { expressionContext, lineKind } from './values.mjs';
2
2
  /**
3
- * What an expression on a record is worked out with besides its values: the
4
- * rows of each one2many for `sum` and `count` — the items, not the sections
5
- * and notes between them — and today's date for `today()`.
3
+ * What expressions read besides a record's fields: `id`, the record's id
4
+ * (null while it is new), `user`, the person using the form (`id`, `name`,
5
+ * `roles`), `editing`, whether the record is being edited — false while
6
+ * a view shows it locked, to be read, as Flectra's oe_edit_only and
7
+ * oe_read_only — and `context`, the values the app passes in, as Flectra's
8
+ * context. A page's own field of the same name comes first.
6
9
  */
10
+ export function builtIns(fields, recordId, user, editing = true, context = {}, parent) {
11
+ const names = {
12
+ id: recordId ?? null,
13
+ user: { id: user?.id ?? null, name: user?.name ?? null, roles: [...(user?.roles ?? [])] },
14
+ editing,
15
+ context,
16
+ // A line's own form reads the record the line is on, as a line does.
17
+ ...(parent ? { parent } : {}),
18
+ };
19
+ for (const name of Object.keys(names))
20
+ if (name in fields)
21
+ delete names[name];
22
+ return names;
23
+ }
24
+ /** The record as expressions read it: its values, its `id` and `user`. What a line reads as `parent`. */
25
+ export function recordContext(values, fields, about) {
26
+ return { ...builtIns(fields, about.recordId, about.user, about.editing, about.context, about.parent), ...expressionContext(values, fields) };
27
+ }
28
+ /**
29
+ * A line as its expressions read it: its values, `parent` — the record it is
30
+ * on, as that record's expressions read it — and `user`. A line field of the
31
+ * same name comes first.
32
+ */
33
+ export function lineContext(values, fields, parent, id = null) {
34
+ // The line's own id, empty until it is saved: Flectra's readonly="id" on a saved line.
35
+ // The app's values a line reads are its record's.
36
+ const names = { parent, user: parent['user'] ?? builtIns({}, null, undefined)['user'], id, context: parent['context'] ?? {} };
37
+ for (const name of Object.keys(names))
38
+ if (name in fields)
39
+ delete names[name];
40
+ return { ...names, ...expressionContext(values, fields) };
41
+ }
7
42
  export function expressionEnv(values, fields, today) {
8
43
  const rows = new Map();
9
44
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"env.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/env.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAA0B,MAAM,UAAU,CAAC;AAE/E;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,MAAyC,EAAE,KAAmB;IAC1G,MAAM,IAAI,GAAG,IAAI,GAAG,EAAqC,CAAC;IAC1D,OAAO;QACL,KAAK;QACL,KAAK,CAAC,IAAI;YACR,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YACzB,IAAI,GAAG,EAAE,IAAI,KAAK,UAAU;gBAAE,OAAO,SAAS,CAAC;YAC/C,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,KAAK,GAAG,CAAE,MAAM,CAAC,IAAI,CAAmB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;gBAC5G,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;gBACxE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACxB,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"env.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/env.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { FilterItem } from '../format/field.mjs';
1
2
  import type { ResolvedFilter } from './data-source.mjs';
2
3
  import type { Values } from './values.mjs';
3
4
  /**
@@ -6,3 +7,12 @@ import type { Values } from './values.mjs';
6
7
  * group when each does. The memory data source searches with it; an app may too.
7
8
  */
8
9
  export declare function matchesFilter(values: Values, filter: readonly ResolvedFilter[]): boolean;
10
+ /**
11
+ * A filter as a search or a list receives it: each `valueFrom` — a field, or a
12
+ * path such as `parent.company_id` or `user.id` — replaced by its value in
13
+ * `context`. A `=?` whose value is empty is left out, and so is a group it
14
+ * makes always hold: an `any` group with one item always holding, an `all`
15
+ * group left with none. A `=?` with a value goes as `=`, so a data source
16
+ * never sees `=?`.
17
+ */
18
+ export declare function resolveFilter(items: readonly FilterItem[], context: Readonly<Record<string, unknown>>): ResolvedFilter[];
@@ -1,3 +1,4 @@
1
+ import type { FilterItem } from '../format/field';
1
2
  import type { ResolvedFilter } from './data-source';
2
3
  import type { Values } from './values';
3
4
  /**
@@ -6,3 +7,12 @@ import type { Values } from './values';
6
7
  * group when each does. The memory data source searches with it; an app may too.
7
8
  */
8
9
  export declare function matchesFilter(values: Values, filter: readonly ResolvedFilter[]): boolean;
10
+ /**
11
+ * A filter as a search or a list receives it: each `valueFrom` — a field, or a
12
+ * path such as `parent.company_id` or `user.id` — replaced by its value in
13
+ * `context`. A `=?` whose value is empty is left out, and so is a group it
14
+ * makes always hold: an `any` group with one item always holding, an `all`
15
+ * group left with none. A `=?` with a value goes as `=`, so a data source
16
+ * never sees `=?`.
17
+ */
18
+ export declare function resolveFilter(items: readonly FilterItem[], context: Readonly<Record<string, unknown>>): ResolvedFilter[];