@saltcorn/data 1.1.2-beta.9 → 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 (267) 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 +25 -67
  9. package/dist/base-plugin/index.d.ts.map +1 -1
  10. package/dist/base-plugin/types.d.ts +3 -3
  11. package/dist/base-plugin/types.d.ts.map +1 -1
  12. package/dist/base-plugin/types.js.map +1 -1
  13. package/dist/base-plugin/viewtemplates/edit.d.ts +3 -4
  14. package/dist/base-plugin/viewtemplates/edit.d.ts.map +1 -1
  15. package/dist/base-plugin/viewtemplates/edit.js +50 -16
  16. package/dist/base-plugin/viewtemplates/edit.js.map +1 -1
  17. package/dist/base-plugin/viewtemplates/feed.d.ts +2 -2
  18. package/dist/base-plugin/viewtemplates/feed.d.ts.map +1 -1
  19. package/dist/base-plugin/viewtemplates/feed.js +18 -4
  20. package/dist/base-plugin/viewtemplates/feed.js.map +1 -1
  21. package/dist/base-plugin/viewtemplates/filter.d.ts +0 -1
  22. package/dist/base-plugin/viewtemplates/filter.d.ts.map +1 -1
  23. package/dist/base-plugin/viewtemplates/filter.js +1 -3
  24. package/dist/base-plugin/viewtemplates/filter.js.map +1 -1
  25. package/dist/base-plugin/viewtemplates/list.d.ts +1 -2
  26. package/dist/base-plugin/viewtemplates/list.d.ts.map +1 -1
  27. package/dist/base-plugin/viewtemplates/list.js +9 -11
  28. package/dist/base-plugin/viewtemplates/list.js.map +1 -1
  29. package/dist/base-plugin/viewtemplates/listshowlist.d.ts +1 -12
  30. package/dist/base-plugin/viewtemplates/listshowlist.d.ts.map +1 -1
  31. package/dist/base-plugin/viewtemplates/listshowlist.js +1 -1
  32. package/dist/base-plugin/viewtemplates/listshowlist.js.map +1 -1
  33. package/dist/base-plugin/viewtemplates/room.d.ts +1 -74
  34. package/dist/base-plugin/viewtemplates/room.d.ts.map +1 -1
  35. package/dist/base-plugin/viewtemplates/room.js +0 -1
  36. package/dist/base-plugin/viewtemplates/room.js.map +1 -1
  37. package/dist/base-plugin/viewtemplates/show.d.ts +0 -1
  38. package/dist/base-plugin/viewtemplates/show.d.ts.map +1 -1
  39. package/dist/base-plugin/viewtemplates/show.js +9 -2
  40. package/dist/base-plugin/viewtemplates/show.js.map +1 -1
  41. package/dist/base-plugin/viewtemplates/viewable_fields.d.ts +4 -3
  42. package/dist/base-plugin/viewtemplates/viewable_fields.d.ts.map +1 -1
  43. package/dist/base-plugin/viewtemplates/viewable_fields.js +21 -19
  44. package/dist/base-plugin/viewtemplates/viewable_fields.js.map +1 -1
  45. package/dist/base-plugin/viewtemplates/workflow-room.d.ts +0 -1
  46. package/dist/base-plugin/viewtemplates/workflow-room.d.ts.map +1 -1
  47. package/dist/base-plugin/viewtemplates/workflow-room.js +1 -3
  48. package/dist/base-plugin/viewtemplates/workflow-room.js.map +1 -1
  49. package/dist/db/connect.d.ts.map +1 -1
  50. package/dist/db/connect.js.map +1 -1
  51. package/dist/db/fixtures.d.ts.map +1 -1
  52. package/dist/db/fixtures.js +1 -1
  53. package/dist/db/fixtures.js.map +1 -1
  54. package/dist/db/index.js.map +1 -1
  55. package/dist/db/reset_schema.d.ts.map +1 -1
  56. package/dist/db/reset_schema.js.map +1 -1
  57. package/dist/db/state.d.ts +23 -16
  58. package/dist/db/state.d.ts.map +1 -1
  59. package/dist/db/state.js +13 -18
  60. package/dist/db/state.js.map +1 -1
  61. package/dist/diagram/cy_generate_utils.js +3 -2
  62. package/dist/diagram/cy_generate_utils.js.map +1 -1
  63. package/dist/diagram/cy_raster.js.map +1 -1
  64. package/dist/diagram/node_extract_utils.js +5 -4
  65. package/dist/diagram/node_extract_utils.js.map +1 -1
  66. package/dist/diagram/nodes/table_node.js.map +1 -1
  67. package/dist/index.js +7 -17
  68. package/dist/index.js.map +1 -1
  69. package/dist/migrate.d.ts.map +1 -1
  70. package/dist/migrate.js.map +1 -1
  71. package/dist/migrations/202007091707.d.ts.map +1 -1
  72. package/dist/migrations/202007202144.d.ts.map +1 -1
  73. package/dist/migrations/202008031500.d.ts.map +1 -1
  74. package/dist/migrations/202009221105.d.ts.map +1 -1
  75. package/dist/migrations/202009231331.d.ts.map +1 -1
  76. package/dist/migrations/202010231444.d.ts.map +1 -1
  77. package/dist/migrations/202011021749.d.ts.map +1 -1
  78. package/dist/migrations/202012011203.d.ts.map +1 -1
  79. package/dist/migrations/202012100841.d.ts.map +1 -1
  80. package/dist/migrations/202012281835.d.ts.map +1 -1
  81. package/dist/migrations/202101061051.d.ts.map +1 -1
  82. package/dist/migrations/202101141128.d.ts.map +1 -1
  83. package/dist/migrations/202102091312.d.ts.map +1 -1
  84. package/dist/migrations/202102091312.js.map +1 -1
  85. package/dist/migrations/202102172148.d.ts.map +1 -1
  86. package/dist/migrations/202106102347.d.ts.map +1 -1
  87. package/dist/migrations/202106112120.d.ts.map +1 -1
  88. package/dist/migrations/202106120012.d.ts.map +1 -1
  89. package/dist/migrations/202106120220.d.ts.map +1 -1
  90. package/dist/migrations/202106121701.d.ts.map +1 -1
  91. package/dist/migrations/202107281619.d.ts.map +1 -1
  92. package/dist/migrations/202109201624.d.ts.map +1 -1
  93. package/dist/migrations/202207022002.d.ts.map +1 -1
  94. package/dist/migrations/202210051058.js.map +1 -1
  95. package/dist/migrations/202210101540.js.map +1 -1
  96. package/dist/migrations/202301130917.d.ts.map +1 -1
  97. package/dist/migrations/202304281224.js.map +1 -1
  98. package/dist/migrations/202307211459.js.map +1 -1
  99. package/dist/migrations/202308211648.d.ts.map +1 -1
  100. package/dist/migrations/202402071125.d.ts.map +1 -1
  101. package/dist/migrations/202501081226.d.ts.map +1 -1
  102. package/dist/migrations/202502131103.d.ts +2 -0
  103. package/dist/migrations/202502131103.d.ts.map +1 -0
  104. package/dist/migrations/{202501181439.js → 202502131103.js} +1 -2
  105. package/dist/migrations/202502131103.js.map +1 -0
  106. package/dist/mobile-mocks/node/fs/promises.js +6 -5
  107. package/dist/mobile-mocks/node/fs/promises.js.map +1 -1
  108. package/dist/mobile-mocks/node/fs.js +4 -3
  109. package/dist/mobile-mocks/node/fs.js.map +1 -1
  110. package/dist/mobile-mocks/node/latest-version.js +1 -1
  111. package/dist/mobile-mocks/node/latest-version.js.map +1 -1
  112. package/dist/mobile-mocks/node/v8.js +3 -2
  113. package/dist/mobile-mocks/node/v8.js.map +1 -1
  114. package/dist/model-helper.d.ts +2 -2
  115. package/dist/model-helper.js.map +1 -1
  116. package/dist/models/config.d.ts +1 -0
  117. package/dist/models/config.d.ts.map +1 -1
  118. package/dist/models/config.js +119 -110
  119. package/dist/models/config.js.map +1 -1
  120. package/dist/models/crash.js +7 -17
  121. package/dist/models/crash.js.map +1 -1
  122. package/dist/models/discovery.d.ts +5 -5
  123. package/dist/models/discovery.d.ts.map +1 -1
  124. package/dist/models/discovery.js +9 -7
  125. package/dist/models/discovery.js.map +1 -1
  126. package/dist/models/email.d.ts +4 -2
  127. package/dist/models/email.d.ts.map +1 -1
  128. package/dist/models/email.js +14 -21
  129. package/dist/models/email.js.map +1 -1
  130. package/dist/models/eventlog.d.ts +1 -1
  131. package/dist/models/eventlog.d.ts.map +1 -1
  132. package/dist/models/eventlog.js +8 -4
  133. package/dist/models/eventlog.js.map +1 -1
  134. package/dist/models/expression.d.ts +2 -2
  135. package/dist/models/expression.d.ts.map +1 -1
  136. package/dist/models/expression.js +12 -9
  137. package/dist/models/expression.js.map +1 -1
  138. package/dist/models/field.d.ts +1 -0
  139. package/dist/models/field.d.ts.map +1 -1
  140. package/dist/models/field.js +9 -3
  141. package/dist/models/field.js.map +1 -1
  142. package/dist/models/fieldrepeat.js.map +1 -1
  143. package/dist/models/file.d.ts +4 -2
  144. package/dist/models/file.d.ts.map +1 -1
  145. package/dist/models/file.js.map +1 -1
  146. package/dist/models/form.d.ts +2 -0
  147. package/dist/models/form.d.ts.map +1 -1
  148. package/dist/models/form.js +16 -0
  149. package/dist/models/form.js.map +1 -1
  150. package/dist/models/index.d.ts +20 -23
  151. package/dist/models/index.d.ts.map +1 -1
  152. package/dist/models/index.js +7 -1
  153. package/dist/models/index.js.map +1 -1
  154. package/dist/models/internal/async_json_stream.js +1 -1
  155. package/dist/models/internal/async_json_stream.js.map +1 -1
  156. package/dist/models/internal/query.d.ts.map +1 -1
  157. package/dist/models/internal/query.js.map +1 -1
  158. package/dist/models/internal/table_helper.js.map +1 -1
  159. package/dist/models/layout.d.ts +1 -1
  160. package/dist/models/layout.d.ts.map +1 -1
  161. package/dist/models/layout.js.map +1 -1
  162. package/dist/models/model.d.ts +1 -1
  163. package/dist/models/model.d.ts.map +1 -1
  164. package/dist/models/model.js +2 -1
  165. package/dist/models/model.js.map +1 -1
  166. package/dist/models/model_instance.d.ts +7 -4
  167. package/dist/models/model_instance.d.ts.map +1 -1
  168. package/dist/models/model_instance.js +8 -17
  169. package/dist/models/model_instance.js.map +1 -1
  170. package/dist/models/notification.js.map +1 -1
  171. package/dist/models/page.js +7 -17
  172. package/dist/models/page.js.map +1 -1
  173. package/dist/models/page_group.js +7 -17
  174. package/dist/models/page_group.js.map +1 -1
  175. package/dist/models/page_group_member.js.map +1 -1
  176. package/dist/models/plugin.js.map +1 -1
  177. package/dist/models/random.d.ts.map +1 -1
  178. package/dist/models/random.js.map +1 -1
  179. package/dist/models/scheduler.d.ts +3 -10
  180. package/dist/models/scheduler.d.ts.map +1 -1
  181. package/dist/models/scheduler.js +1 -1
  182. package/dist/models/scheduler.js.map +1 -1
  183. package/dist/models/table.d.ts +39 -31
  184. package/dist/models/table.d.ts.map +1 -1
  185. package/dist/models/table.js +99 -52
  186. package/dist/models/table.js.map +1 -1
  187. package/dist/models/table_constraints.js.map +1 -1
  188. package/dist/models/tag.js.map +1 -1
  189. package/dist/models/trigger.js +7 -17
  190. package/dist/models/trigger.js.map +1 -1
  191. package/dist/models/user.d.ts +1 -1
  192. package/dist/models/user.d.ts.map +1 -1
  193. package/dist/models/user.js +2 -2
  194. package/dist/models/user.js.map +1 -1
  195. package/dist/models/view.d.ts +6 -2
  196. package/dist/models/view.d.ts.map +1 -1
  197. package/dist/models/view.js +27 -22
  198. package/dist/models/view.js.map +1 -1
  199. package/dist/models/workflow.js +7 -17
  200. package/dist/models/workflow.js.map +1 -1
  201. package/dist/models/workflow_run.d.ts.map +1 -1
  202. package/dist/models/workflow_run.js +13 -19
  203. package/dist/models/workflow_run.js.map +1 -1
  204. package/dist/models/workflow_step.d.ts.map +1 -1
  205. package/dist/models/workflow_step.js +11 -1
  206. package/dist/models/workflow_step.js.map +1 -1
  207. package/dist/plugin-helper.d.ts +2 -5
  208. package/dist/plugin-helper.d.ts.map +1 -1
  209. package/dist/plugin-helper.js +47 -19
  210. package/dist/plugin-helper.js.map +1 -1
  211. package/dist/plugin-testing.d.ts +1 -1
  212. package/dist/plugin-testing.d.ts.map +1 -1
  213. package/dist/plugin-testing.js.map +1 -1
  214. package/dist/tests/actions.test.js +8 -18
  215. package/dist/tests/actions.test.js.map +1 -1
  216. package/dist/tests/assertions.js +7 -6
  217. package/dist/tests/assertions.js.map +1 -1
  218. package/dist/tests/auth.test.js +51 -1
  219. package/dist/tests/auth.test.js.map +1 -1
  220. package/dist/tests/auxtest.test.js.map +1 -1
  221. package/dist/tests/calc.test.js +6 -0
  222. package/dist/tests/calc.test.js.map +1 -1
  223. package/dist/tests/common_helpers.js +8 -7
  224. package/dist/tests/common_helpers.js.map +1 -1
  225. package/dist/tests/db.test.js.map +1 -1
  226. package/dist/tests/discover.test.js +36 -0
  227. package/dist/tests/discover.test.js.map +1 -1
  228. package/dist/tests/edit.test.js +6 -2
  229. package/dist/tests/edit.test.js.map +1 -1
  230. package/dist/tests/email.test.js +20 -16
  231. package/dist/tests/email.test.js.map +1 -1
  232. package/dist/tests/exact_views.test.js.map +1 -1
  233. package/dist/tests/field.test.js.map +1 -1
  234. package/dist/tests/fieldviews.test.js.map +1 -1
  235. package/dist/tests/file.test.js.map +1 -1
  236. package/dist/tests/filter.test.js +2 -2
  237. package/dist/tests/filter.test.js.map +1 -1
  238. package/dist/tests/list.test.js +1 -1
  239. package/dist/tests/list.test.js.map +1 -1
  240. package/dist/tests/mocks.d.ts +2 -2
  241. package/dist/tests/mocks.d.ts.map +1 -1
  242. package/dist/tests/mocks.js +2 -2
  243. package/dist/tests/mocks.js.map +1 -1
  244. package/dist/tests/page_group.test.js.map +1 -1
  245. package/dist/tests/show.test.js +1 -1
  246. package/dist/tests/show.test.js.map +1 -1
  247. package/dist/tests/table.test.js.map +1 -1
  248. package/dist/tests/table_history.test.js.map +1 -1
  249. package/dist/tests/tag.test.js.map +1 -1
  250. package/dist/tests/user.test.js +2 -0
  251. package/dist/tests/user.test.js.map +1 -1
  252. package/dist/tests/view.test.js +1 -0
  253. package/dist/tests/view.test.js.map +1 -1
  254. package/dist/tests/workflow.test.js +0 -15
  255. package/dist/tests/workflow.test.js.map +1 -1
  256. package/dist/utils.d.ts +7 -6
  257. package/dist/utils.d.ts.map +1 -1
  258. package/dist/utils.js +10 -1
  259. package/dist/utils.js.map +1 -1
  260. package/dist/web-mobile-commons.d.ts +6 -1
  261. package/dist/web-mobile-commons.d.ts.map +1 -1
  262. package/dist/web-mobile-commons.js +43 -1
  263. package/dist/web-mobile-commons.js.map +1 -1
  264. package/package.json +9 -9
  265. package/dist/migrations/202501181439.d.ts +0 -2
  266. package/dist/migrations/202501181439.d.ts.map +0 -1
  267. 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
  };
@@ -354,12 +344,12 @@ class Table {
354
344
  * tbd why this function in this file - needs to models
355
345
  * @param opts
356
346
  */
357
- async get_models(opts) {
347
+ async get_models(where) {
358
348
  const Model = require("./model");
359
- if (typeof opts === "string")
360
- 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 });
361
351
  else
362
- return await Model.find({ ...(opts || {}), table_id: this.id });
352
+ return await Model.find({ ...(where || {}), table_id: this.id });
363
353
  }
364
354
  /**
365
355
  * Get owner column name
@@ -370,7 +360,7 @@ class Table {
370
360
  if (!this.ownership_field_id || !fields)
371
361
  return null;
372
362
  const field = fields.find((f) => f.id === this.ownership_field_id);
373
- return field?.name;
363
+ return field?.name || null;
374
364
  }
375
365
  /**
376
366
  * Get owner column name
@@ -387,7 +377,7 @@ class Table {
387
377
  * Check if user is owner of row
388
378
  * @param user - user
389
379
  * @param row - table row
390
- * @returns {Promise<string|null|*|boolean>}
380
+ * @returns {boolean}
391
381
  */
392
382
  is_owner(user, row) {
393
383
  if (!user)
@@ -399,7 +389,7 @@ class Table {
399
389
  const field_name = this.owner_fieldname();
400
390
  // users are owners of their own row in users table
401
391
  if (this.name === "users" && !field_name)
402
- return user.id && `${row?.id}` === `${user.id}`;
392
+ return !!user.id && `${row?.id}` === `${user.id}`;
403
393
  return (typeof field_name === "string" &&
404
394
  (row[field_name] === user.id || row[field_name]?.id === user.id));
405
395
  }
@@ -707,7 +697,7 @@ class Table {
707
697
  if (db_1.default.reset_sequence &&
708
698
  (0, common_types_1.instanceOfType)(pk.type) &&
709
699
  pk.type.name === "Integer")
710
- await db_1.default.reset_sequence(this.name);
700
+ await db_1.default.reset_sequence(this.name, this.pk_name);
711
701
  }
712
702
  /**
713
703
  * update Where with Ownership
@@ -723,7 +713,11 @@ class Table {
723
713
  role > min_role &&
724
714
  ((!this.ownership_field_id && !this.ownership_formula) || role === 100))
725
715
  return { notAuthorized: true };
726
- 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) {
727
721
  const owner_field = fields.find((f) => f.id === this.ownership_field_id);
728
722
  if (!owner_field)
729
723
  throw new Error(`Owner field in table ${this.name} not found`);
@@ -732,6 +726,7 @@ class Table {
732
726
  });
733
727
  }
734
728
  else if (user &&
729
+ role &&
735
730
  role < 100 &&
736
731
  role > min_role &&
737
732
  this.ownership_formula) {
@@ -1095,8 +1090,25 @@ class Table {
1095
1090
  * @returns
1096
1091
  */
1097
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;
1098
1105
  let existing;
1099
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
+ ]);
1100
1112
  const fields = this.fields;
1101
1113
  const pk_name = this.pk_name;
1102
1114
  const role = user?.role_id;
@@ -1217,7 +1229,7 @@ class Table {
1217
1229
  joinFields,
1218
1230
  });
1219
1231
  }
1220
- 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);
1221
1233
  for (const f of fields)
1222
1234
  if (f.calculated && f.stored) {
1223
1235
  if (typeof f.type !== "string" &&
@@ -1274,7 +1286,7 @@ class Table {
1274
1286
  await this.insertSyncInfo(id, syncTimestamp);
1275
1287
  }
1276
1288
  const newRow = { ...existing, ...v, [pk_name]: id };
1277
- await this.auto_update_calc_aggregations(newRow, !existing, autoRecalcIterations || 1);
1289
+ await this.auto_update_calc_aggregations(newRow, !existing, (autoRecalcIterations || 0) + 1, changedFieldNames);
1278
1290
  if (!noTrigger) {
1279
1291
  const trigPromise = trigger_1.default.runTableTriggers("Update", this, { ...(additionalTriggerValues || {}), ...newRow }, resultCollector, role === 100 ? undefined : user, { old_row: existing, updated_fields: v_in });
1280
1292
  if (resultCollector)
@@ -1386,17 +1398,17 @@ class Table {
1386
1398
  get pk_name() {
1387
1399
  const pkField = this.fields?.find((f) => f.primary_key)?.name;
1388
1400
  if (!pkField) {
1389
- throw new Error("A primary key field is mandatory");
1401
+ throw new Error(`A primary key field is mandatory (Table ${this.name})`);
1390
1402
  }
1391
1403
  return pkField;
1392
1404
  }
1393
1405
  get pk_type() {
1394
1406
  const pkField = this.fields?.find((f) => f.primary_key);
1395
1407
  if (!pkField) {
1396
- throw new Error("A primary key field is mandatory");
1408
+ throw new Error(`A primary key field is mandatory (Table ${this.name})`);
1397
1409
  }
1398
1410
  if (!(0, common_types_1.instanceOfType)(pkField.type)) {
1399
- 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})`);
1400
1412
  }
1401
1413
  return pkField.type;
1402
1414
  }
@@ -1562,7 +1574,8 @@ class Table {
1562
1574
  if (isNode()) {
1563
1575
  const schemaPrefix = db_1.default.getTenantSchemaPrefix();
1564
1576
  await db_1.default.query(`insert into ${schemaPrefix}"${db_1.default.sqlsanitize(this.name)}_sync_info"
1565
- 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})))`);
1566
1579
  }
1567
1580
  else {
1568
1581
  await db_1.default.query(`insert into "${db_1.default.sqlsanitize(this.name)}_sync_info"
@@ -1579,7 +1592,7 @@ class Table {
1579
1592
  }
1580
1593
  return id;
1581
1594
  }
1582
- async auto_update_calc_aggregations(v0, refetch, iterations = 1) {
1595
+ async auto_update_calc_aggregations(v0, refetch, iterations = 1, changedFields) {
1583
1596
  if (iterations > 5)
1584
1597
  return;
1585
1598
  const calc_agg_fields = await field_1.default.find({
@@ -1595,6 +1608,9 @@ class Table {
1595
1608
  }));
1596
1609
  }
1597
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;
1598
1614
  const refTable = Table.findOne({ id: calc_field.table_id });
1599
1615
  if (!refTable || !v[calc_field.attributes.ref])
1600
1616
  continue;
@@ -1621,6 +1637,11 @@ class Table {
1621
1637
  continue;
1622
1638
  const refTable = field.table || Table.findOne({ id: field.table_id });
1623
1639
  for (const matching of matchings) {
1640
+ //console.log({ matching, changedFields });
1641
+ if (changedFields &&
1642
+ matching.targetField &&
1643
+ !changedFields.has(matching.targetField))
1644
+ continue;
1624
1645
  if (matching.through?.length === 1) {
1625
1646
  // select readings where patient_id.favbook = v.id
1626
1647
  // select reftable where field.through[0] = v.id
@@ -1971,7 +1992,7 @@ class Table {
1971
1992
  * @returns {Promise<*>}
1972
1993
  */
1973
1994
  async get_history(id) {
1974
- 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" });
1975
1996
  }
1976
1997
  /**
1977
1998
  * Enable constraints
@@ -2220,7 +2241,10 @@ class Table {
2220
2241
  const returnedRows = [];
2221
2242
  try {
2222
2243
  // for files more 1MB
2223
- 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)) {
2224
2248
  let theError;
2225
2249
  const copyres = await db_1.default
2226
2250
  .copyFrom(readStream, this.name, fieldNames, client)
@@ -2772,8 +2796,9 @@ ${rejectDetails}`,
2772
2796
  }
2773
2797
  }
2774
2798
  }
2799
+ const isConstant = (x) => ["string", "number", "boolean"].includes(typeof x);
2775
2800
  //TODO user groups
2776
- if (wh.eq)
2801
+ if (wh.eq && !wh.eq.every(isConstant))
2777
2802
  return {};
2778
2803
  return wh;
2779
2804
  }
@@ -2841,9 +2866,9 @@ ${rejectDetails}`,
2841
2866
  if (!joinTables.includes(jtNm)) {
2842
2867
  joinTables.push(jtNm);
2843
2868
  if (ontable)
2844
- 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}"`;
2845
2870
  else
2846
- 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)}"`;
2847
2872
  }
2848
2873
  if (through) {
2849
2874
  const throughs = Array.isArray(through) ? through : [through];
@@ -2863,21 +2888,22 @@ ${rejectDetails}`,
2863
2888
  if (!throughRefField)
2864
2889
  throw new InvalidConfiguration(`Reference field field ${through} not found in table ${throughTable.name}`);
2865
2890
  const finalTable = throughRefField.reftable_name;
2891
+ const finalTableObj = Table.findOne({ name: finalTable });
2866
2892
  jtNm1 = `${(0, internal_1.sqlsanitize)(last_reffield.reftable_name)}_jt_${(0, internal_1.sqlsanitize)(throughPath.join("_"))}_jt_${(0, internal_1.sqlsanitize)(ref)}`;
2867
2893
  if (!joinTables.includes(jtNm1)) {
2868
2894
  if (!finalTable)
2869
2895
  throw new Error("Unable to build a joind without a reftable_name.");
2870
2896
  joinTables.push(jtNm1);
2871
- 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)}"`;
2872
2898
  }
2873
2899
  last_reffield = throughRefField;
2874
2900
  lastJtNm = jtNm1;
2875
2901
  }
2876
2902
  // todo warning variable might not have been initialized
2877
- 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)}"`);
2878
2904
  }
2879
2905
  else {
2880
- 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)}"`);
2881
2907
  }
2882
2908
  }
2883
2909
  if (opts.starFields)
@@ -3106,22 +3132,43 @@ ${rejectDetails}`,
3106
3132
  return (0, table_helper_1.get_formula_examples)(typename, this.fields.filter((f) => !f.calculated));
3107
3133
  }
3108
3134
  async repairCompositePrimary() {
3109
- 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
3110
3145
  from information_schema.table_constraints
3111
3146
  where table_schema = '${db_1.default.getTenantSchema() || "public"}'
3112
3147
  and table_name = '${this.name}'
3113
3148
  and constraint_type = 'PRIMARY KEY';`);
3114
- const cname = rows[0]?.constraint_name;
3115
- const schemaPrefix = db_1.default.getTenantSchemaPrefix();
3116
- await db_1.default.query(`alter table ${schemaPrefix}"${this.name}" drop constraint "${cname}"`);
3117
- for (const field of this.fields) {
3118
- if (field.primary_key)
3119
- await field.update({ primary_key: false });
3120
- }
3121
- const { pk_type, pk_sql_type } = Table.pkSqlType(this.fields);
3122
- await db_1.default.query(`alter table ${schemaPrefix}"${this.name}" add column id ${pk_sql_type} primary key;`);
3123
- 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)
3124
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();
3125
3172
  }
3126
3173
  async move_include_fts_to_search_context() {
3127
3174
  const include_fts_fields = this.fields.filter((f) => f.attributes?.include_fts);