@saltcorn/data 1.1.2-beta.8 → 1.1.2

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 (276) hide show
  1. package/dist/base-plugin/actions.d.ts +47 -8
  2. package/dist/base-plugin/actions.d.ts.map +1 -1
  3. package/dist/base-plugin/actions.js +61 -9
  4. package/dist/base-plugin/actions.js.map +1 -1
  5. package/dist/base-plugin/fieldviews.d.ts.map +1 -1
  6. package/dist/base-plugin/fieldviews.js.map +1 -1
  7. package/dist/base-plugin/fileviews.js.map +1 -1
  8. package/dist/base-plugin/index.d.ts +33 -77
  9. package/dist/base-plugin/index.d.ts.map +1 -1
  10. package/dist/base-plugin/types.d.ts +7 -8
  11. package/dist/base-plugin/types.d.ts.map +1 -1
  12. package/dist/base-plugin/types.js +1 -1
  13. package/dist/base-plugin/types.js.map +1 -1
  14. package/dist/base-plugin/viewtemplates/edit.d.ts +3 -4
  15. package/dist/base-plugin/viewtemplates/edit.d.ts.map +1 -1
  16. package/dist/base-plugin/viewtemplates/edit.js +51 -17
  17. package/dist/base-plugin/viewtemplates/edit.js.map +1 -1
  18. package/dist/base-plugin/viewtemplates/feed.d.ts +2 -2
  19. package/dist/base-plugin/viewtemplates/feed.d.ts.map +1 -1
  20. package/dist/base-plugin/viewtemplates/feed.js +18 -4
  21. package/dist/base-plugin/viewtemplates/feed.js.map +1 -1
  22. package/dist/base-plugin/viewtemplates/filter.d.ts +0 -1
  23. package/dist/base-plugin/viewtemplates/filter.d.ts.map +1 -1
  24. package/dist/base-plugin/viewtemplates/filter.js +1 -3
  25. package/dist/base-plugin/viewtemplates/filter.js.map +1 -1
  26. package/dist/base-plugin/viewtemplates/list.d.ts +1 -2
  27. package/dist/base-plugin/viewtemplates/list.d.ts.map +1 -1
  28. package/dist/base-plugin/viewtemplates/list.js +9 -11
  29. package/dist/base-plugin/viewtemplates/list.js.map +1 -1
  30. package/dist/base-plugin/viewtemplates/listshowlist.d.ts +1 -12
  31. package/dist/base-plugin/viewtemplates/listshowlist.d.ts.map +1 -1
  32. package/dist/base-plugin/viewtemplates/listshowlist.js +1 -1
  33. package/dist/base-plugin/viewtemplates/listshowlist.js.map +1 -1
  34. package/dist/base-plugin/viewtemplates/room.d.ts +1 -74
  35. package/dist/base-plugin/viewtemplates/room.d.ts.map +1 -1
  36. package/dist/base-plugin/viewtemplates/room.js +0 -1
  37. package/dist/base-plugin/viewtemplates/room.js.map +1 -1
  38. package/dist/base-plugin/viewtemplates/show.d.ts +0 -1
  39. package/dist/base-plugin/viewtemplates/show.d.ts.map +1 -1
  40. package/dist/base-plugin/viewtemplates/show.js +13 -2
  41. package/dist/base-plugin/viewtemplates/show.js.map +1 -1
  42. package/dist/base-plugin/viewtemplates/viewable_fields.d.ts +6 -5
  43. package/dist/base-plugin/viewtemplates/viewable_fields.d.ts.map +1 -1
  44. package/dist/base-plugin/viewtemplates/viewable_fields.js +29 -24
  45. package/dist/base-plugin/viewtemplates/viewable_fields.js.map +1 -1
  46. package/dist/base-plugin/viewtemplates/workflow-room.d.ts +0 -1
  47. package/dist/base-plugin/viewtemplates/workflow-room.d.ts.map +1 -1
  48. package/dist/base-plugin/viewtemplates/workflow-room.js +1 -3
  49. package/dist/base-plugin/viewtemplates/workflow-room.js.map +1 -1
  50. package/dist/db/connect.d.ts.map +1 -1
  51. package/dist/db/connect.js.map +1 -1
  52. package/dist/db/fixtures.d.ts.map +1 -1
  53. package/dist/db/fixtures.js +1 -1
  54. package/dist/db/fixtures.js.map +1 -1
  55. package/dist/db/index.js.map +1 -1
  56. package/dist/db/reset_schema.d.ts.map +1 -1
  57. package/dist/db/reset_schema.js.map +1 -1
  58. package/dist/db/state.d.ts +23 -16
  59. package/dist/db/state.d.ts.map +1 -1
  60. package/dist/db/state.js +13 -18
  61. package/dist/db/state.js.map +1 -1
  62. package/dist/diagram/cy_generate_utils.js +3 -2
  63. package/dist/diagram/cy_generate_utils.js.map +1 -1
  64. package/dist/diagram/cy_raster.js.map +1 -1
  65. package/dist/diagram/node_extract_utils.js +5 -4
  66. package/dist/diagram/node_extract_utils.js.map +1 -1
  67. package/dist/diagram/nodes/table_node.js.map +1 -1
  68. package/dist/index.js +7 -17
  69. package/dist/index.js.map +1 -1
  70. package/dist/migrate.d.ts.map +1 -1
  71. package/dist/migrate.js.map +1 -1
  72. package/dist/migrations/202007091707.d.ts.map +1 -1
  73. package/dist/migrations/202007202144.d.ts.map +1 -1
  74. package/dist/migrations/202008031500.d.ts.map +1 -1
  75. package/dist/migrations/202009221105.d.ts.map +1 -1
  76. package/dist/migrations/202009231331.d.ts.map +1 -1
  77. package/dist/migrations/202010231444.d.ts.map +1 -1
  78. package/dist/migrations/202011021749.d.ts.map +1 -1
  79. package/dist/migrations/202012011203.d.ts.map +1 -1
  80. package/dist/migrations/202012100841.d.ts.map +1 -1
  81. package/dist/migrations/202012281835.d.ts.map +1 -1
  82. package/dist/migrations/202101061051.d.ts.map +1 -1
  83. package/dist/migrations/202101141128.d.ts.map +1 -1
  84. package/dist/migrations/202102091312.d.ts.map +1 -1
  85. package/dist/migrations/202102091312.js.map +1 -1
  86. package/dist/migrations/202102172148.d.ts.map +1 -1
  87. package/dist/migrations/202106102347.d.ts.map +1 -1
  88. package/dist/migrations/202106112120.d.ts.map +1 -1
  89. package/dist/migrations/202106120012.d.ts.map +1 -1
  90. package/dist/migrations/202106120220.d.ts.map +1 -1
  91. package/dist/migrations/202106121701.d.ts.map +1 -1
  92. package/dist/migrations/202107281619.d.ts.map +1 -1
  93. package/dist/migrations/202109201624.d.ts.map +1 -1
  94. package/dist/migrations/202207022002.d.ts.map +1 -1
  95. package/dist/migrations/202210051058.js.map +1 -1
  96. package/dist/migrations/202210101540.js.map +1 -1
  97. package/dist/migrations/202301130917.d.ts.map +1 -1
  98. package/dist/migrations/202304281224.js.map +1 -1
  99. package/dist/migrations/202307211459.js.map +1 -1
  100. package/dist/migrations/202308211648.d.ts.map +1 -1
  101. package/dist/migrations/202402071125.d.ts.map +1 -1
  102. package/dist/migrations/202501081226.d.ts.map +1 -1
  103. package/dist/migrations/202502131103.d.ts +2 -0
  104. package/dist/migrations/202502131103.d.ts.map +1 -0
  105. package/dist/migrations/{202501181439.js → 202502131103.js} +1 -2
  106. package/dist/migrations/202502131103.js.map +1 -0
  107. package/dist/mobile-mocks/models/internal/async_json_stream.d.ts +1 -0
  108. package/dist/mobile-mocks/models/internal/async_json_stream.d.ts.map +1 -0
  109. package/dist/mobile-mocks/models/internal/async_json_stream.js +2 -0
  110. package/dist/mobile-mocks/models/internal/async_json_stream.js.map +1 -0
  111. package/dist/mobile-mocks/node/fs/promises.js +6 -5
  112. package/dist/mobile-mocks/node/fs/promises.js.map +1 -1
  113. package/dist/mobile-mocks/node/fs.js +4 -3
  114. package/dist/mobile-mocks/node/fs.js.map +1 -1
  115. package/dist/mobile-mocks/node/latest-version.js +1 -1
  116. package/dist/mobile-mocks/node/latest-version.js.map +1 -1
  117. package/dist/mobile-mocks/node/v8.js +3 -2
  118. package/dist/mobile-mocks/node/v8.js.map +1 -1
  119. package/dist/model-helper.d.ts +2 -2
  120. package/dist/model-helper.js.map +1 -1
  121. package/dist/models/config.d.ts +1 -0
  122. package/dist/models/config.d.ts.map +1 -1
  123. package/dist/models/config.js +129 -112
  124. package/dist/models/config.js.map +1 -1
  125. package/dist/models/crash.js +7 -17
  126. package/dist/models/crash.js.map +1 -1
  127. package/dist/models/discovery.d.ts +5 -5
  128. package/dist/models/discovery.d.ts.map +1 -1
  129. package/dist/models/discovery.js +9 -7
  130. package/dist/models/discovery.js.map +1 -1
  131. package/dist/models/email.d.ts +4 -2
  132. package/dist/models/email.d.ts.map +1 -1
  133. package/dist/models/email.js +15 -22
  134. package/dist/models/email.js.map +1 -1
  135. package/dist/models/eventlog.d.ts +1 -1
  136. package/dist/models/eventlog.d.ts.map +1 -1
  137. package/dist/models/eventlog.js +8 -4
  138. package/dist/models/eventlog.js.map +1 -1
  139. package/dist/models/expression.d.ts +2 -2
  140. package/dist/models/expression.d.ts.map +1 -1
  141. package/dist/models/expression.js +12 -9
  142. package/dist/models/expression.js.map +1 -1
  143. package/dist/models/field.d.ts +1 -0
  144. package/dist/models/field.d.ts.map +1 -1
  145. package/dist/models/field.js +9 -3
  146. package/dist/models/field.js.map +1 -1
  147. package/dist/models/fieldrepeat.js.map +1 -1
  148. package/dist/models/file.d.ts +4 -2
  149. package/dist/models/file.d.ts.map +1 -1
  150. package/dist/models/file.js.map +1 -1
  151. package/dist/models/form.d.ts +2 -0
  152. package/dist/models/form.d.ts.map +1 -1
  153. package/dist/models/form.js +16 -0
  154. package/dist/models/form.js.map +1 -1
  155. package/dist/models/index.d.ts +20 -23
  156. package/dist/models/index.d.ts.map +1 -1
  157. package/dist/models/index.js +7 -1
  158. package/dist/models/index.js.map +1 -1
  159. package/dist/models/internal/async_json_stream.d.ts +4 -0
  160. package/dist/models/internal/async_json_stream.d.ts.map +1 -0
  161. package/dist/models/internal/async_json_stream.js +36 -0
  162. package/dist/models/internal/async_json_stream.js.map +1 -0
  163. package/dist/models/internal/query.d.ts.map +1 -1
  164. package/dist/models/internal/query.js.map +1 -1
  165. package/dist/models/internal/table_helper.js.map +1 -1
  166. package/dist/models/layout.d.ts +1 -1
  167. package/dist/models/layout.d.ts.map +1 -1
  168. package/dist/models/layout.js.map +1 -1
  169. package/dist/models/model.d.ts +1 -1
  170. package/dist/models/model.d.ts.map +1 -1
  171. package/dist/models/model.js +2 -1
  172. package/dist/models/model.js.map +1 -1
  173. package/dist/models/model_instance.d.ts +7 -4
  174. package/dist/models/model_instance.d.ts.map +1 -1
  175. package/dist/models/model_instance.js +8 -17
  176. package/dist/models/model_instance.js.map +1 -1
  177. package/dist/models/notification.js.map +1 -1
  178. package/dist/models/page.js +7 -17
  179. package/dist/models/page.js.map +1 -1
  180. package/dist/models/page_group.js +7 -17
  181. package/dist/models/page_group.js.map +1 -1
  182. package/dist/models/page_group_member.js.map +1 -1
  183. package/dist/models/plugin.js.map +1 -1
  184. package/dist/models/random.d.ts.map +1 -1
  185. package/dist/models/random.js.map +1 -1
  186. package/dist/models/scheduler.d.ts +3 -10
  187. package/dist/models/scheduler.d.ts.map +1 -1
  188. package/dist/models/scheduler.js +1 -1
  189. package/dist/models/scheduler.js.map +1 -1
  190. package/dist/models/table.d.ts +40 -31
  191. package/dist/models/table.d.ts.map +1 -1
  192. package/dist/models/table.js +118 -60
  193. package/dist/models/table.js.map +1 -1
  194. package/dist/models/table_constraints.js.map +1 -1
  195. package/dist/models/tag.js.map +1 -1
  196. package/dist/models/trigger.js +7 -17
  197. package/dist/models/trigger.js.map +1 -1
  198. package/dist/models/user.d.ts +1 -1
  199. package/dist/models/user.d.ts.map +1 -1
  200. package/dist/models/user.js +2 -2
  201. package/dist/models/user.js.map +1 -1
  202. package/dist/models/view.d.ts +6 -2
  203. package/dist/models/view.d.ts.map +1 -1
  204. package/dist/models/view.js +27 -22
  205. package/dist/models/view.js.map +1 -1
  206. package/dist/models/workflow.js +7 -17
  207. package/dist/models/workflow.js.map +1 -1
  208. package/dist/models/workflow_run.d.ts.map +1 -1
  209. package/dist/models/workflow_run.js +13 -19
  210. package/dist/models/workflow_run.js.map +1 -1
  211. package/dist/models/workflow_step.d.ts.map +1 -1
  212. package/dist/models/workflow_step.js +18 -1
  213. package/dist/models/workflow_step.js.map +1 -1
  214. package/dist/plugin-helper.d.ts +2 -5
  215. package/dist/plugin-helper.d.ts.map +1 -1
  216. package/dist/plugin-helper.js +50 -21
  217. package/dist/plugin-helper.js.map +1 -1
  218. package/dist/plugin-testing.d.ts +1 -1
  219. package/dist/plugin-testing.d.ts.map +1 -1
  220. package/dist/plugin-testing.js.map +1 -1
  221. package/dist/tests/actions.test.js +8 -18
  222. package/dist/tests/actions.test.js.map +1 -1
  223. package/dist/tests/assertions.js +7 -6
  224. package/dist/tests/assertions.js.map +1 -1
  225. package/dist/tests/auth.test.js +51 -1
  226. package/dist/tests/auth.test.js.map +1 -1
  227. package/dist/tests/auxtest.test.js +18 -0
  228. package/dist/tests/auxtest.test.js.map +1 -1
  229. package/dist/tests/calc.test.js +6 -0
  230. package/dist/tests/calc.test.js.map +1 -1
  231. package/dist/tests/common_helpers.js +8 -7
  232. package/dist/tests/common_helpers.js.map +1 -1
  233. package/dist/tests/db.test.js.map +1 -1
  234. package/dist/tests/discover.test.js +36 -0
  235. package/dist/tests/discover.test.js.map +1 -1
  236. package/dist/tests/edit.test.js +6 -2
  237. package/dist/tests/edit.test.js.map +1 -1
  238. package/dist/tests/email.test.js +32 -43
  239. package/dist/tests/email.test.js.map +1 -1
  240. package/dist/tests/exact_views.test.js.map +1 -1
  241. package/dist/tests/field.test.js.map +1 -1
  242. package/dist/tests/fieldviews.test.js.map +1 -1
  243. package/dist/tests/file.test.js.map +1 -1
  244. package/dist/tests/filter.test.js +2 -2
  245. package/dist/tests/filter.test.js.map +1 -1
  246. package/dist/tests/list.test.js +1 -1
  247. package/dist/tests/list.test.js.map +1 -1
  248. package/dist/tests/mocks.d.ts +2 -2
  249. package/dist/tests/mocks.d.ts.map +1 -1
  250. package/dist/tests/mocks.js +2 -2
  251. package/dist/tests/mocks.js.map +1 -1
  252. package/dist/tests/page_group.test.js.map +1 -1
  253. package/dist/tests/show.test.js +1 -1
  254. package/dist/tests/show.test.js.map +1 -1
  255. package/dist/tests/table.test.js.map +1 -1
  256. package/dist/tests/table_history.test.js.map +1 -1
  257. package/dist/tests/tag.test.js.map +1 -1
  258. package/dist/tests/user.test.js +2 -0
  259. package/dist/tests/user.test.js.map +1 -1
  260. package/dist/tests/view.test.js +1 -0
  261. package/dist/tests/view.test.js.map +1 -1
  262. package/dist/tests/workflow.test.js +0 -15
  263. package/dist/tests/workflow.test.js.map +1 -1
  264. package/dist/utils.d.ts +7 -6
  265. package/dist/utils.d.ts.map +1 -1
  266. package/dist/utils.js +10 -1
  267. package/dist/utils.js.map +1 -1
  268. package/dist/web-mobile-commons.d.ts +6 -1
  269. package/dist/web-mobile-commons.d.ts.map +1 -1
  270. package/dist/web-mobile-commons.js +43 -1
  271. package/dist/web-mobile-commons.js.map +1 -1
  272. package/package.json +19 -15
  273. package/webpack.config.js +6 -0
  274. package/dist/migrations/202501181439.d.ts +0 -2
  275. package/dist/migrations/202501181439.d.ts.map +0 -1
  276. package/dist/migrations/202501181439.js.map +0 -1
@@ -15,23 +15,13 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
15
15
  }) : function(o, v) {
16
16
  o["default"] = v;
17
17
  });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
35
25
  var __importDefault = (this && this.__importDefault) || function (mod) {
36
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
27
  };
@@ -60,6 +50,7 @@ const tags_1 = __importDefault(require("@saltcorn/markup/tags"));
60
50
  const { text } = tags_1.default;
61
51
  const table_helper_1 = require("./internal/table_helper");
62
52
  const query_1 = require("./internal/query");
53
+ const async_json_stream_1 = __importDefault(require("./internal/async_json_stream"));
63
54
  /**
64
55
  * Transponce Objects
65
56
  * TODO more detailed explanation
@@ -353,12 +344,12 @@ class Table {
353
344
  * tbd why this function in this file - needs to models
354
345
  * @param opts
355
346
  */
356
- async get_models(opts) {
347
+ async get_models(where) {
357
348
  const Model = require("./model");
358
- if (typeof opts === "string")
359
- return await Model.find({ name: opts, table_id: this.id });
349
+ if (typeof where === "string")
350
+ return await Model.find({ name: where, table_id: this.id });
360
351
  else
361
- return await Model.find({ ...(opts || {}), table_id: this.id });
352
+ return await Model.find({ ...(where || {}), table_id: this.id });
362
353
  }
363
354
  /**
364
355
  * Get owner column name
@@ -369,7 +360,7 @@ class Table {
369
360
  if (!this.ownership_field_id || !fields)
370
361
  return null;
371
362
  const field = fields.find((f) => f.id === this.ownership_field_id);
372
- return field?.name;
363
+ return field?.name || null;
373
364
  }
374
365
  /**
375
366
  * Get owner column name
@@ -386,7 +377,7 @@ class Table {
386
377
  * Check if user is owner of row
387
378
  * @param user - user
388
379
  * @param row - table row
389
- * @returns {Promise<string|null|*|boolean>}
380
+ * @returns {boolean}
390
381
  */
391
382
  is_owner(user, row) {
392
383
  if (!user)
@@ -398,7 +389,7 @@ class Table {
398
389
  const field_name = this.owner_fieldname();
399
390
  // users are owners of their own row in users table
400
391
  if (this.name === "users" && !field_name)
401
- return user.id && `${row?.id}` === `${user.id}`;
392
+ return !!user.id && `${row?.id}` === `${user.id}`;
402
393
  return (typeof field_name === "string" &&
403
394
  (row[field_name] === user.id || row[field_name]?.id === user.id));
404
395
  }
@@ -706,7 +697,7 @@ class Table {
706
697
  if (db_1.default.reset_sequence &&
707
698
  (0, common_types_1.instanceOfType)(pk.type) &&
708
699
  pk.type.name === "Integer")
709
- await db_1.default.reset_sequence(this.name);
700
+ await db_1.default.reset_sequence(this.name, this.pk_name);
710
701
  }
711
702
  /**
712
703
  * update Where with Ownership
@@ -722,7 +713,11 @@ class Table {
722
713
  role > min_role &&
723
714
  ((!this.ownership_field_id && !this.ownership_formula) || role === 100))
724
715
  return { notAuthorized: true };
725
- if (user && role < 100 && role > min_role && this.ownership_field_id) {
716
+ if (user &&
717
+ role &&
718
+ role < 100 &&
719
+ role > min_role &&
720
+ this.ownership_field_id) {
726
721
  const owner_field = fields.find((f) => f.id === this.ownership_field_id);
727
722
  if (!owner_field)
728
723
  throw new Error(`Owner field in table ${this.name} not found`);
@@ -731,6 +726,7 @@ class Table {
731
726
  });
732
727
  }
733
728
  else if (user &&
729
+ role &&
734
730
  role < 100 &&
735
731
  role > min_role &&
736
732
  this.ownership_formula) {
@@ -1094,8 +1090,25 @@ class Table {
1094
1090
  * @returns
1095
1091
  */
1096
1092
  async updateRow(v_in, id, user, noTrigger, resultCollector, restore_of_version, syncTimestamp, additionalTriggerValues, autoRecalcIterations) {
1093
+ // migrating to options arg
1094
+ if (typeof noTrigger === "object") {
1095
+ const extraOptions = noTrigger;
1096
+ noTrigger = extraOptions.noTrigger;
1097
+ resultCollector = extraOptions.resultCollector;
1098
+ restore_of_version = extraOptions.restore_of_version;
1099
+ syncTimestamp = extraOptions.syncTimestamp;
1100
+ additionalTriggerValues = extraOptions.additionalTriggerValues;
1101
+ autoRecalcIterations = extraOptions.autoRecalcIterations;
1102
+ }
1103
+ if (typeof autoRecalcIterations === "number" && autoRecalcIterations > 5)
1104
+ return;
1097
1105
  let existing;
1098
1106
  let v = { ...v_in };
1107
+ //these may have changed
1108
+ let changedFieldNames = new Set([
1109
+ ...Object.keys(v_in),
1110
+ ...this.fields.filter((f) => f.calculated).map((f) => f.name),
1111
+ ]);
1099
1112
  const fields = this.fields;
1100
1113
  const pk_name = this.pk_name;
1101
1114
  const role = user?.role_id;
@@ -1216,7 +1229,7 @@ class Table {
1216
1229
  joinFields,
1217
1230
  });
1218
1231
  }
1219
- let calced = await apply_calculated_fields_stored(need_to_update ? updated : { ...existing, ...v_in }, this.fields, this);
1232
+ let calced = await apply_calculated_fields_stored(need_to_update ? updated || {} : { ...existing, ...v_in }, this.fields, this);
1220
1233
  for (const f of fields)
1221
1234
  if (f.calculated && f.stored) {
1222
1235
  if (typeof f.type !== "string" &&
@@ -1273,7 +1286,7 @@ class Table {
1273
1286
  await this.insertSyncInfo(id, syncTimestamp);
1274
1287
  }
1275
1288
  const newRow = { ...existing, ...v, [pk_name]: id };
1276
- await this.auto_update_calc_aggregations(newRow, !existing, autoRecalcIterations || 1);
1289
+ await this.auto_update_calc_aggregations(newRow, !existing, (autoRecalcIterations || 0) + 1, changedFieldNames);
1277
1290
  if (!noTrigger) {
1278
1291
  const trigPromise = trigger_1.default.runTableTriggers("Update", this, { ...(additionalTriggerValues || {}), ...newRow }, resultCollector, role === 100 ? undefined : user, { old_row: existing, updated_fields: v_in });
1279
1292
  if (resultCollector)
@@ -1385,17 +1398,17 @@ class Table {
1385
1398
  get pk_name() {
1386
1399
  const pkField = this.fields?.find((f) => f.primary_key)?.name;
1387
1400
  if (!pkField) {
1388
- throw new Error("A primary key field is mandatory");
1401
+ throw new Error(`A primary key field is mandatory (Table ${this.name})`);
1389
1402
  }
1390
1403
  return pkField;
1391
1404
  }
1392
1405
  get pk_type() {
1393
1406
  const pkField = this.fields?.find((f) => f.primary_key);
1394
1407
  if (!pkField) {
1395
- throw new Error("A primary key field is mandatory");
1408
+ throw new Error(`A primary key field is mandatory (Table ${this.name})`);
1396
1409
  }
1397
1410
  if (!(0, common_types_1.instanceOfType)(pkField.type)) {
1398
- throw new Error("A primary key field must have a type");
1411
+ throw new Error(`A primary key field must have a type (Table ${this.name})`);
1399
1412
  }
1400
1413
  return pkField.type;
1401
1414
  }
@@ -1561,7 +1574,8 @@ class Table {
1561
1574
  if (isNode()) {
1562
1575
  const schemaPrefix = db_1.default.getTenantSchemaPrefix();
1563
1576
  await db_1.default.query(`insert into ${schemaPrefix}"${db_1.default.sqlsanitize(this.name)}_sync_info"
1564
- values(${id}, date_trunc('milliseconds', to_timestamp(${(syncTimestamp ? syncTimestamp : await db_1.default.time()).valueOf() / 1000.0})))`);
1577
+ values(${id}, date_trunc('milliseconds', to_timestamp(${(syncTimestamp ? syncTimestamp : await db_1.default.time()).valueOf() /
1578
+ 1000.0})))`);
1565
1579
  }
1566
1580
  else {
1567
1581
  await db_1.default.query(`insert into "${db_1.default.sqlsanitize(this.name)}_sync_info"
@@ -1578,7 +1592,7 @@ class Table {
1578
1592
  }
1579
1593
  return id;
1580
1594
  }
1581
- async auto_update_calc_aggregations(v0, refetch, iterations = 1) {
1595
+ async auto_update_calc_aggregations(v0, refetch, iterations = 1, changedFields) {
1582
1596
  if (iterations > 5)
1583
1597
  return;
1584
1598
  const calc_agg_fields = await field_1.default.find({
@@ -1594,6 +1608,9 @@ class Table {
1594
1608
  }));
1595
1609
  }
1596
1610
  for (const calc_field of calc_agg_fields) {
1611
+ const agg_field_name = calc_field.attributes.agg_field.split("@")[0];
1612
+ if (changedFields && !changedFields.has(agg_field_name))
1613
+ continue;
1597
1614
  const refTable = Table.findOne({ id: calc_field.table_id });
1598
1615
  if (!refTable || !v[calc_field.attributes.ref])
1599
1616
  continue;
@@ -1620,6 +1637,11 @@ class Table {
1620
1637
  continue;
1621
1638
  const refTable = field.table || Table.findOne({ id: field.table_id });
1622
1639
  for (const matching of matchings) {
1640
+ //console.log({ matching, changedFields });
1641
+ if (changedFields &&
1642
+ matching.targetField &&
1643
+ !changedFields.has(matching.targetField))
1644
+ continue;
1623
1645
  if (matching.through?.length === 1) {
1624
1646
  // select readings where patient_id.favbook = v.id
1625
1647
  // select reftable where field.through[0] = v.id
@@ -1970,7 +1992,7 @@ class Table {
1970
1992
  * @returns {Promise<*>}
1971
1993
  */
1972
1994
  async get_history(id) {
1973
- return await db_1.default.select(`${(0, internal_1.sqlsanitize)(this.name)}__history`, id ? { id } : {}, { orderBy: "_version" });
1995
+ return await db_1.default.select(`${(0, internal_1.sqlsanitize)(this.name)}__history`, id ? { [this.pk_name]: id } : {}, { orderBy: "_version" });
1974
1996
  }
1975
1997
  /**
1976
1998
  * Enable constraints
@@ -2219,7 +2241,10 @@ class Table {
2219
2241
  const returnedRows = [];
2220
2242
  try {
2221
2243
  // for files more 1MB
2222
- if (db_1.default.copyFrom && fileSizeInMegabytes > 1) {
2244
+ if (options?.method === "copy" ||
2245
+ (options?.method !== "row-by-row" &&
2246
+ db_1.default.copyFrom &&
2247
+ fileSizeInMegabytes > 1)) {
2223
2248
  let theError;
2224
2249
  const copyres = await db_1.default
2225
2250
  .copyFrom(readStream, this.name, fieldNames, client)
@@ -2424,6 +2449,11 @@ ${rejectDetails}`,
2424
2449
  });
2425
2450
  return v1;
2426
2451
  }
2452
+ async import_json_history_file(filePath) {
2453
+ return await (0, async_json_stream_1.default)(filePath, async (row) => {
2454
+ await this.insert_history_row(row);
2455
+ });
2456
+ }
2427
2457
  /**
2428
2458
  * Import JSON table description
2429
2459
  * @param filePath
@@ -2431,20 +2461,20 @@ ${rejectDetails}`,
2431
2461
  * @returns {Promise<{error: string}|{success: string}>}
2432
2462
  */
2433
2463
  async import_json_file(filePath, skip_first_data_row) {
2434
- const contents = (await (0, promises_1.readFile)(filePath)).toString();
2435
- // todo argument type buffer is not assignable for type String...
2436
- const file_rows = contents === "\\N\n" ? [] : JSON.parse(contents);
2437
2464
  const fields = this.fields;
2438
2465
  const pk_name = this.pk_name;
2439
2466
  const { readState } = require("../plugin-helper");
2440
2467
  const jsonFields = fields.filter((f) => typeof f.type !== "string" && f?.type?.name === "JSON");
2441
2468
  let i = 1;
2469
+ let importError;
2442
2470
  const client = db_1.default.isSQLite ? db_1.default : await db_1.default.getClient();
2443
2471
  await client.query("BEGIN");
2444
- for (const rec of file_rows) {
2472
+ const consume = async (rec) => {
2445
2473
  i += 1;
2446
2474
  if (skip_first_data_row && i === 2)
2447
- continue;
2475
+ return;
2476
+ if (importError)
2477
+ return;
2448
2478
  fields
2449
2479
  .filter((f) => f.calculated && !f.stored)
2450
2480
  .forEach((f) => {
@@ -2466,15 +2496,20 @@ ${rejectDetails}`,
2466
2496
  await client.query("ROLLBACK");
2467
2497
  if (!db_1.default.isSQLite)
2468
2498
  await client.release(true);
2469
- return { error: `${e.message} in row ${i}` };
2499
+ importError = `${e.message} in row ${i}`;
2470
2500
  }
2471
- }
2501
+ };
2502
+ await (0, async_json_stream_1.default)(filePath, async (row) => {
2503
+ await consume(row);
2504
+ });
2505
+ if (importError)
2506
+ return { error: importError };
2472
2507
  await client.query("COMMIT");
2473
2508
  if (!db_1.default.isSQLite)
2474
2509
  await client.release(true);
2475
2510
  await this.resetSequence();
2476
2511
  return {
2477
- success: `Imported ${file_rows.length} rows into table ${this.name}`,
2512
+ success: `Imported ${i - 1} rows into table ${this.name}`,
2478
2513
  };
2479
2514
  }
2480
2515
  /**
@@ -2761,8 +2796,9 @@ ${rejectDetails}`,
2761
2796
  }
2762
2797
  }
2763
2798
  }
2799
+ const isConstant = (x) => ["string", "number", "boolean"].includes(typeof x);
2764
2800
  //TODO user groups
2765
- if (wh.eq)
2801
+ if (wh.eq && !wh.eq.every(isConstant))
2766
2802
  return {};
2767
2803
  return wh;
2768
2804
  }
@@ -2830,9 +2866,9 @@ ${rejectDetails}`,
2830
2866
  if (!joinTables.includes(jtNm)) {
2831
2867
  joinTables.push(jtNm);
2832
2868
  if (ontable)
2833
- joinq += `\n left join ${schema}"${(0, internal_1.sqlsanitize)(reftable)}" ${jtNm} on ${jtNm}."${(0, internal_1.sqlsanitize)(ref)}"=a."${reffield.refname}"`;
2869
+ joinq += `\n left join ${schema}"${(0, internal_1.sqlsanitize)(reftable)}" "${jtNm}" on "${jtNm}"."${(0, internal_1.sqlsanitize)(ref)}"=a."${reffield.refname}"`;
2834
2870
  else
2835
- joinq += `\n left join ${schema}"${(0, internal_1.sqlsanitize)(reftable)}" ${jtNm} on ${jtNm}."${reffield.refname}"=a."${(0, internal_1.sqlsanitize)(ref)}"`;
2871
+ joinq += `\n left join ${schema}"${(0, internal_1.sqlsanitize)(reftable)}" "${jtNm}" on "${jtNm}"."${reffield.refname}"=a."${(0, internal_1.sqlsanitize)(ref)}"`;
2836
2872
  }
2837
2873
  if (through) {
2838
2874
  const throughs = Array.isArray(through) ? through : [through];
@@ -2852,21 +2888,22 @@ ${rejectDetails}`,
2852
2888
  if (!throughRefField)
2853
2889
  throw new InvalidConfiguration(`Reference field field ${through} not found in table ${throughTable.name}`);
2854
2890
  const finalTable = throughRefField.reftable_name;
2891
+ const finalTableObj = Table.findOne({ name: finalTable });
2855
2892
  jtNm1 = `${(0, internal_1.sqlsanitize)(last_reffield.reftable_name)}_jt_${(0, internal_1.sqlsanitize)(throughPath.join("_"))}_jt_${(0, internal_1.sqlsanitize)(ref)}`;
2856
2893
  if (!joinTables.includes(jtNm1)) {
2857
2894
  if (!finalTable)
2858
2895
  throw new Error("Unable to build a joind without a reftable_name.");
2859
2896
  joinTables.push(jtNm1);
2860
- joinq += `\n left join ${schema}"${(0, internal_1.sqlsanitize)(finalTable)}" ${jtNm1} on ${jtNm1}.id=${lastJtNm}."${(0, internal_1.sqlsanitize)(through1)}"`;
2897
+ joinq += `\n left join ${schema}"${(0, internal_1.sqlsanitize)(finalTable)}" "${jtNm1}" on "${jtNm1}"."${finalTableObj.pk_name}"="${lastJtNm}"."${(0, internal_1.sqlsanitize)(through1)}"`;
2861
2898
  }
2862
2899
  last_reffield = throughRefField;
2863
2900
  lastJtNm = jtNm1;
2864
2901
  }
2865
2902
  // todo warning variable might not have been initialized
2866
- fldNms.push(`${jtNm1}.${(0, internal_1.sqlsanitize)(target)} as ${(0, internal_1.sqlsanitize)(fldnm)}`);
2903
+ fldNms.push(`"${jtNm1}"."${(0, internal_1.sqlsanitize)(target)}" as "${(0, internal_1.sqlsanitize)(fldnm)}"`);
2867
2904
  }
2868
2905
  else {
2869
- fldNms.push(`${jtNm}.${(0, internal_1.sqlsanitize)(target)} as ${(0, internal_1.sqlsanitize)(fldnm)}`);
2906
+ fldNms.push(`"${jtNm}"."${(0, internal_1.sqlsanitize)(target)}" as "${(0, internal_1.sqlsanitize)(fldnm)}"`);
2870
2907
  }
2871
2908
  }
2872
2909
  if (opts.starFields)
@@ -3095,22 +3132,43 @@ ${rejectDetails}`,
3095
3132
  return (0, table_helper_1.get_formula_examples)(typename, this.fields.filter((f) => !f.calculated));
3096
3133
  }
3097
3134
  async repairCompositePrimary() {
3098
- const { rows } = await db_1.default.query(`select constraint_name
3135
+ const primaryKeys = this.fields.filter((f) => f.primary_key);
3136
+ const nonSerialPKS = primaryKeys.some((f) => f.attributes?.NonSerial);
3137
+ const schemaPrefix = db_1.default.getTenantSchemaPrefix();
3138
+ if (primaryKeys.length == 0) {
3139
+ await db_1.default.query(`alter table ${schemaPrefix}"${this.name}" add column id serial primary key;`);
3140
+ await db_1.default.query(`insert into ${schemaPrefix}_sc_fields(table_id, name, label, type, attributes, required, is_unique,primary_key)
3141
+ values($1,'id','ID','Integer', '{}', true, true, true) returning id`, [this.id]);
3142
+ }
3143
+ else if (primaryKeys.length > 1) {
3144
+ const { rows } = await db_1.default.query(`select constraint_name
3099
3145
  from information_schema.table_constraints
3100
3146
  where table_schema = '${db_1.default.getTenantSchema() || "public"}'
3101
3147
  and table_name = '${this.name}'
3102
3148
  and constraint_type = 'PRIMARY KEY';`);
3103
- const cname = rows[0]?.constraint_name;
3104
- const schemaPrefix = db_1.default.getTenantSchemaPrefix();
3105
- await db_1.default.query(`alter table ${schemaPrefix}"${this.name}" drop constraint "${cname}"`);
3106
- for (const field of this.fields) {
3107
- if (field.primary_key)
3108
- await field.update({ primary_key: false });
3109
- }
3110
- const { pk_type, pk_sql_type } = Table.pkSqlType(this.fields);
3111
- await db_1.default.query(`alter table ${schemaPrefix}"${this.name}" add column id ${pk_sql_type} primary key;`);
3112
- await db_1.default.query(`insert into ${schemaPrefix}_sc_fields(table_id, name, label, type, attributes, required, is_unique,primary_key)
3149
+ const cname = rows[0]?.constraint_name;
3150
+ await db_1.default.query(`alter table ${schemaPrefix}"${this.name}" drop constraint "${cname}"`);
3151
+ for (const field of this.fields) {
3152
+ if (field.primary_key)
3153
+ await field.update({ primary_key: false });
3154
+ }
3155
+ const { pk_type, pk_sql_type } = Table.pkSqlType(this.fields);
3156
+ await db_1.default.query(`alter table ${schemaPrefix}"${this.name}" add column id ${pk_sql_type} primary key;`);
3157
+ await db_1.default.query(`insert into ${schemaPrefix}_sc_fields(table_id, name, label, type, attributes, required, is_unique,primary_key)
3113
3158
  values($1,'id','ID','${pk_type}', '{}', true, true, true) returning id`, [this.id]);
3159
+ }
3160
+ else if (nonSerialPKS) {
3161
+ //https://stackoverflow.com/questions/23578427/changing-primary-key-int-type-to-serial
3162
+ await db_1.default.query(`CREATE SEQUENCE ${schemaPrefix}"${this.name}_id_seq";`);
3163
+ await db_1.default.query(`ALTER SEQUENCE ${schemaPrefix}"${this.name}_id_seq" OWNED BY ${schemaPrefix}"${this.name}"."${this.pk_name}"`);
3164
+ await db_1.default.query(`SELECT setval('${schemaPrefix}"${this.name}_id_seq"', MAX(a."${this.pk_name}")) from ${schemaPrefix}"${this.name}" a`);
3165
+ await db_1.default.query(`ALTER TABLE ${schemaPrefix}"${this.name}" ALTER COLUMN "${this.pk_name}" SET DEFAULT nextval('${schemaPrefix}"${this.name}_id_seq"')`);
3166
+ const pk = this.getField(this.pk_name);
3167
+ const attrs = { ...pk.attributes };
3168
+ delete attrs.NonSerial;
3169
+ await pk.update({ attributes: attrs });
3170
+ }
3171
+ await require("../db/state").getState().refresh_tables();
3114
3172
  }
3115
3173
  async move_include_fts_to_search_context() {
3116
3174
  const include_fts_fields = this.fields.filter((f) => f.attributes?.include_fts);