@saltcorn/data 1.3.0-beta.1 → 1.3.0-beta.11

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 (99) hide show
  1. package/dist/base-plugin/actions.d.ts +18 -1
  2. package/dist/base-plugin/actions.d.ts.map +1 -1
  3. package/dist/base-plugin/actions.js +12 -2
  4. package/dist/base-plugin/actions.js.map +1 -1
  5. package/dist/base-plugin/index.d.ts +25 -0
  6. package/dist/base-plugin/index.d.ts.map +1 -1
  7. package/dist/base-plugin/types.d.ts.map +1 -1
  8. package/dist/base-plugin/types.js +3 -2
  9. package/dist/base-plugin/types.js.map +1 -1
  10. package/dist/base-plugin/viewtemplates/edit.d.ts +7 -0
  11. package/dist/base-plugin/viewtemplates/edit.d.ts.map +1 -1
  12. package/dist/base-plugin/viewtemplates/edit.js +149 -18
  13. package/dist/base-plugin/viewtemplates/edit.js.map +1 -1
  14. package/dist/base-plugin/viewtemplates/filter.d.ts.map +1 -1
  15. package/dist/base-plugin/viewtemplates/filter.js +4 -2
  16. package/dist/base-plugin/viewtemplates/filter.js.map +1 -1
  17. package/dist/base-plugin/viewtemplates/list.d.ts +7 -0
  18. package/dist/base-plugin/viewtemplates/list.d.ts.map +1 -1
  19. package/dist/base-plugin/viewtemplates/list.js +129 -0
  20. package/dist/base-plugin/viewtemplates/list.js.map +1 -1
  21. package/dist/base-plugin/viewtemplates/show.d.ts +7 -0
  22. package/dist/base-plugin/viewtemplates/show.d.ts.map +1 -1
  23. package/dist/base-plugin/viewtemplates/show.js +65 -287
  24. package/dist/base-plugin/viewtemplates/show.js.map +1 -1
  25. package/dist/base-plugin/viewtemplates/viewable_fields.d.ts +24 -0
  26. package/dist/base-plugin/viewtemplates/viewable_fields.d.ts.map +1 -1
  27. package/dist/base-plugin/viewtemplates/viewable_fields.js +335 -7
  28. package/dist/base-plugin/viewtemplates/viewable_fields.js.map +1 -1
  29. package/dist/base-plugin/viewtemplates/workflow-room.d.ts +5 -0
  30. package/dist/base-plugin/viewtemplates/workflow-room.d.ts.map +1 -1
  31. package/dist/base-plugin/viewtemplates/workflow-room.js +15 -3
  32. package/dist/base-plugin/viewtemplates/workflow-room.js.map +1 -1
  33. package/dist/db/state.d.ts +5 -0
  34. package/dist/db/state.d.ts.map +1 -1
  35. package/dist/db/state.js +26 -1
  36. package/dist/db/state.js.map +1 -1
  37. package/dist/migrations/202506050958.d.ts +2 -0
  38. package/dist/migrations/202506050958.d.ts.map +1 -0
  39. package/dist/migrations/202506050958.js +12 -0
  40. package/dist/migrations/202506050958.js.map +1 -0
  41. package/dist/model-helper.d.ts.map +1 -1
  42. package/dist/model-helper.js +10 -0
  43. package/dist/model-helper.js.map +1 -1
  44. package/dist/models/config.d.ts.map +1 -1
  45. package/dist/models/config.js +96 -19
  46. package/dist/models/config.js.map +1 -1
  47. package/dist/models/expression.d.ts +5 -2
  48. package/dist/models/expression.d.ts.map +1 -1
  49. package/dist/models/expression.js +29 -0
  50. package/dist/models/expression.js.map +1 -1
  51. package/dist/models/field.d.ts +7 -0
  52. package/dist/models/field.d.ts.map +1 -1
  53. package/dist/models/field.js +22 -6
  54. package/dist/models/field.js.map +1 -1
  55. package/dist/models/form.d.ts +2 -0
  56. package/dist/models/form.d.ts.map +1 -1
  57. package/dist/models/form.js +1 -0
  58. package/dist/models/form.js.map +1 -1
  59. package/dist/models/index.d.ts +1 -1
  60. package/dist/models/layout.d.ts +6 -0
  61. package/dist/models/layout.d.ts.map +1 -1
  62. package/dist/models/layout.js +64 -0
  63. package/dist/models/layout.js.map +1 -1
  64. package/dist/models/metadata.d.ts +60 -0
  65. package/dist/models/metadata.d.ts.map +1 -0
  66. package/dist/models/metadata.js +81 -0
  67. package/dist/models/metadata.js.map +1 -0
  68. package/dist/models/table.d.ts +1 -0
  69. package/dist/models/table.d.ts.map +1 -1
  70. package/dist/models/table.js +44 -20
  71. package/dist/models/table.js.map +1 -1
  72. package/dist/models/trigger.d.ts +3 -3
  73. package/dist/models/trigger.d.ts.map +1 -1
  74. package/dist/models/trigger.js +12 -5
  75. package/dist/models/trigger.js.map +1 -1
  76. package/dist/models/view.d.ts +16 -0
  77. package/dist/models/view.d.ts.map +1 -1
  78. package/dist/models/view.js +25 -0
  79. package/dist/models/view.js.map +1 -1
  80. package/dist/plugin-helper.d.ts.map +1 -1
  81. package/dist/plugin-helper.js +11 -2
  82. package/dist/plugin-helper.js.map +1 -1
  83. package/dist/tests/edit.test.js +6 -3
  84. package/dist/tests/edit.test.js.map +1 -1
  85. package/dist/tests/exact_views.test.js +14 -14
  86. package/dist/tests/exact_views.test.js.map +1 -1
  87. package/dist/tests/field.test.js +5 -0
  88. package/dist/tests/field.test.js.map +1 -1
  89. package/dist/tests/list.test.js +40 -0
  90. package/dist/tests/list.test.js.map +1 -1
  91. package/dist/tests/mocks.d.ts.map +1 -1
  92. package/dist/tests/mocks.js +5 -1
  93. package/dist/tests/mocks.js.map +1 -1
  94. package/dist/tests/models.test.js +32 -0
  95. package/dist/tests/models.test.js.map +1 -1
  96. package/dist/tests/table.test.js +120 -1
  97. package/dist/tests/table.test.js.map +1 -1
  98. package/package.json +8 -8
  99. package/webpack.config.js +1 -0
@@ -1263,6 +1263,7 @@ class Table {
1263
1263
  [pk_name]: id,
1264
1264
  _version: {
1265
1265
  next_version_by_id: id,
1266
+ pk_name,
1266
1267
  },
1267
1268
  _time: new Date(),
1268
1269
  _userid: user?.id,
@@ -1336,6 +1337,7 @@ class Table {
1336
1337
  this.stringify_json_fields(v1);
1337
1338
  const id = await db_1.default.insert(this.name + "__history", v1, {
1338
1339
  onConflictDoNothing: true,
1340
+ pk_name: this.pk_name,
1339
1341
  });
1340
1342
  if (!id && retry <= 3)
1341
1343
  await this.insert_history_row(v1, retry + 1);
@@ -1598,6 +1600,7 @@ class Table {
1598
1600
  [pk_name]: id,
1599
1601
  _version: {
1600
1602
  next_version_by_id: id,
1603
+ pk_name,
1601
1604
  },
1602
1605
  _userid: user?.id,
1603
1606
  _time: new Date(),
@@ -1646,7 +1649,7 @@ class Table {
1646
1649
  let v = v0;
1647
1650
  if (refetch && (calc_agg_fields.length || calc_join_agg_fields.length)) {
1648
1651
  v = (await this.getJoinedRow({
1649
- where: { [pk_name]: v0.id },
1652
+ where: { [pk_name]: v0[pk_name] },
1650
1653
  }));
1651
1654
  }
1652
1655
  //track which rows in which tables are updated
@@ -1722,7 +1725,7 @@ class Table {
1722
1725
  [matching.field]: {
1723
1726
  inSelect: {
1724
1727
  table: matching.throughTable[0],
1725
- field: "id",
1728
+ field: Table.findOne(matching.throughTable[0])?.pk_name || "id",
1726
1729
  tenant: db_1.default.isSQLite ? undefined : db_1.default.getTenantSchema(),
1727
1730
  where: { [matching.through[0]]: v[this.pk_name] },
1728
1731
  },
@@ -1923,7 +1926,7 @@ class Table {
1923
1926
  */
1924
1927
  async restore_row_version(id, version, user) {
1925
1928
  const row = await db_1.default.selectOne(`${db_1.default.sqlsanitize(this.name)}__history`, {
1926
- id,
1929
+ [this.pk_name]: id,
1927
1930
  _version: version,
1928
1931
  });
1929
1932
  var r = {};
@@ -1940,10 +1943,10 @@ class Table {
1940
1943
  * @param user
1941
1944
  */
1942
1945
  async undo_row_changes(id, user) {
1943
- const current_version_row = await db_1.default.selectMaybeOne(`${(0, internal_1.sqlsanitize)(this.name)}__history`, { id }, { orderBy: "_version", orderDesc: true, limit: 1 });
1946
+ const current_version_row = await db_1.default.selectMaybeOne(`${(0, internal_1.sqlsanitize)(this.name)}__history`, { [this.pk_name]: id }, { orderBy: "_version", orderDesc: true, limit: 1 });
1944
1947
  //get max that is not a restore
1945
1948
  const last_non_restore = await db_1.default.selectMaybeOne(`${(0, internal_1.sqlsanitize)(this.name)}__history`, {
1946
- id,
1949
+ [this.pk_name]: id,
1947
1950
  _version: {
1948
1951
  lt: current_version_row._restore_of_version
1949
1952
  ? current_version_row._restore_of_version
@@ -1960,10 +1963,10 @@ class Table {
1960
1963
  * @param user
1961
1964
  */
1962
1965
  async redo_row_changes(id, user) {
1963
- const current_version_row = await db_1.default.selectMaybeOne(`${(0, internal_1.sqlsanitize)(this.name)}__history`, { id }, { orderBy: "_version", orderDesc: true, limit: 1 });
1966
+ const current_version_row = await db_1.default.selectMaybeOne(`${(0, internal_1.sqlsanitize)(this.name)}__history`, { [this.pk_name]: id }, { orderBy: "_version", orderDesc: true, limit: 1 });
1964
1967
  if (current_version_row._restore_of_version) {
1965
1968
  const next_version = await db_1.default.selectMaybeOne(`${(0, internal_1.sqlsanitize)(this.name)}__history`, {
1966
- id,
1969
+ [this.pk_name]: id,
1967
1970
  _version: {
1968
1971
  gt: current_version_row._restore_of_version,
1969
1972
  },
@@ -1984,10 +1987,10 @@ class Table {
1984
1987
  if (typeof interval_secs === "number" && interval_secs > 0.199) {
1985
1988
  await db_1.default.query(`
1986
1989
  delete from ${schemaPrefix}"${(0, internal_1.sqlsanitize)(this.name)}__history"
1987
- where (${(0, internal_1.sqlsanitize)(pk)}, _version) in (
1990
+ where ("${(0, internal_1.sqlsanitize)(pk)}", _version) in (
1988
1991
  select h1."${(0, internal_1.sqlsanitize)(pk)}", h1._version
1989
1992
  FROM ${schemaPrefix}"${(0, internal_1.sqlsanitize)(this.name)}__history" h1
1990
- JOIN ${schemaPrefix}"${(0, internal_1.sqlsanitize)(this.name)}__history" h2 ON h1.${(0, internal_1.sqlsanitize)(pk)} = h2.${(0, internal_1.sqlsanitize)(pk)}
1993
+ JOIN ${schemaPrefix}"${(0, internal_1.sqlsanitize)(this.name)}__history" h2 ON h1."${(0, internal_1.sqlsanitize)(pk)}" = h2."${(0, internal_1.sqlsanitize)(pk)}"
1991
1994
  AND h1._version < h2._version
1992
1995
  AND h1._time < h2._time
1993
1996
  AND h2._time - h1._time <= INTERVAL '${+interval_secs} seconds'
@@ -2015,7 +2018,7 @@ class Table {
2015
2018
  ON curr.rn = prev.rn + 1 AND curr."${pk}" = prev."${pk}"
2016
2019
  )
2017
2020
  DELETE FROM ${schemaPrefix}"${(0, internal_1.sqlsanitize)(this.name)}__history"
2018
- where (${(0, internal_1.sqlsanitize)(pk)}, _version) in (select id, this_version from paired where not is_changed);`);
2021
+ where ("${(0, internal_1.sqlsanitize)(pk)}", _version) in (select id, this_version from paired where not is_changed);`);
2019
2022
  }
2020
2023
  }
2021
2024
  /**
@@ -2151,8 +2154,10 @@ class Table {
2151
2154
  isBools.includes(v && v.toLowerCase && v.toLowerCase())))
2152
2155
  type = "Bool";
2153
2156
  else if (nonEmpties.every((v) => !isNaN(v)))
2154
- if (nonEmpties.every((v) => Number.isSafeInteger(+v)))
2157
+ if (nonEmpties.every((v) => Number.isSafeInteger(+v) && v <= 2147483647 && v > -2147483648))
2155
2158
  type = "Integer";
2159
+ else if (nonEmpties.every((v) => Number.isSafeInteger(+v)))
2160
+ type = "String";
2156
2161
  else
2157
2162
  type = "Float";
2158
2163
  else if (nonEmpties.every((v) => isDate(v)))
@@ -2360,11 +2365,12 @@ class Table {
2360
2365
  let i = 1;
2361
2366
  let rejects = 0;
2362
2367
  let rejectDetails = "";
2363
- const client = db_1.default.isSQLite ? db_1.default : await db_1.default.getClient();
2368
+ const client = db_1.default.isSQLite || options?.no_transaction ? db_1.default : await db_1.default.getClient();
2364
2369
  const stats = await (0, promises_1.stat)(filePath);
2365
2370
  const fileSizeInMegabytes = stats.size / (1024 * 1024);
2366
2371
  // start sql transaction
2367
- await client.query("BEGIN");
2372
+ if (!options?.no_transaction)
2373
+ await client.query("BEGIN");
2368
2374
  const readStream = (0, fs_1.createReadStream)(filePath);
2369
2375
  const returnedRows = [];
2370
2376
  try {
@@ -2455,6 +2461,7 @@ class Table {
2455
2461
  const existing = await db_1.default.selectMaybeOne(this.name, {
2456
2462
  [this.pk_name]: rec[this.pk_name],
2457
2463
  });
2464
+ this.stringify_json_fields(rec);
2458
2465
  if (options?.no_table_write) {
2459
2466
  if (existing) {
2460
2467
  Object.entries(existing).forEach(([k, v]) => {
@@ -2479,6 +2486,7 @@ class Table {
2479
2486
  });
2480
2487
  }
2481
2488
  catch (e) {
2489
+ console.log(e);
2482
2490
  if (!(e?.message || "").includes("current transaction is aborted, commands ignored until end of transaction"))
2483
2491
  rejectDetails += `Reject row ${i} because: ${e?.message}\n`;
2484
2492
  rejects += 1;
@@ -2507,8 +2515,9 @@ class Table {
2507
2515
  }
2508
2516
  }
2509
2517
  catch (e) {
2510
- await client.query("ROLLBACK");
2511
- if (!db_1.default.isSQLite)
2518
+ if (!options?.no_transaction)
2519
+ await client.query("ROLLBACK");
2520
+ if (!db_1.default.isSQLite && !options?.no_transaction)
2512
2521
  await client.release(true);
2513
2522
  if (e instanceof Error)
2514
2523
  reject({ error: `${e.message} in row ${i}` });
@@ -2531,8 +2540,9 @@ ${rejectDetails}`,
2531
2540
  if (rejectDetails)
2532
2541
  state.log(6, `CSV import rejectDetails: ` + rejectDetails);
2533
2542
  // stop sql transaction
2534
- await client.query("COMMIT");
2535
- if (!db_1.default.isSQLite)
2543
+ if (!options?.no_transaction)
2544
+ await client.query("COMMIT");
2545
+ if (!db_1.default.isSQLite && !options?.no_transaction)
2536
2546
  await client.release(true);
2537
2547
  if (options?.no_table_write) {
2538
2548
  return {
@@ -3039,7 +3049,8 @@ ${rejectDetails}`,
3039
3049
  fldNms.push("a.*");
3040
3050
  else
3041
3051
  for (const f of fields.filter((f) => !f.calculated || f.stored)) {
3042
- fldNms.push(`a."${(0, internal_1.sqlsanitize)(f.name)}"`);
3052
+ if (!opts.fields || opts.fields.includes(f.name))
3053
+ fldNms.push(`a."${(0, internal_1.sqlsanitize)(f.name)}"`);
3043
3054
  }
3044
3055
  const whereObj = prefixFieldsInWhere(opts.where, "a");
3045
3056
  const { where, values } = (0, internal_1.mkWhere)(whereObj, db_1.default.isSQLite);
@@ -3130,9 +3141,22 @@ ${rejectDetails}`,
3130
3141
  }
3131
3142
  });
3132
3143
  }
3133
- //rename joinfields
3134
- if (Object.values(joinFields || {}).some((jf) => jf.rename_object)) {
3144
+ //rename aggregations and joinfields
3145
+ if (Object.values(joinFields || {}).some((jf) => jf.rename_object) ||
3146
+ Object.values(aggregations || {}).some((jf) => jf.rename_to)) {
3135
3147
  let f = (x) => x;
3148
+ Object.entries(aggregations || {}).forEach(([k, v]) => {
3149
+ if (v.rename_to) {
3150
+ const oldf = f;
3151
+ f = (x) => {
3152
+ if (typeof x[k] !== "undefined") {
3153
+ x[v.rename_to] = x[k];
3154
+ delete x[k];
3155
+ }
3156
+ return oldf(x);
3157
+ };
3158
+ }
3159
+ });
3136
3160
  Object.entries(joinFields || {}).forEach(([k, v]) => {
3137
3161
  if (v.rename_object) {
3138
3162
  if (v.rename_object.length === 2) {