@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.
- package/dist/base-plugin/actions.d.ts +47 -8
- package/dist/base-plugin/actions.d.ts.map +1 -1
- package/dist/base-plugin/actions.js +61 -9
- package/dist/base-plugin/actions.js.map +1 -1
- package/dist/base-plugin/fieldviews.d.ts.map +1 -1
- package/dist/base-plugin/fieldviews.js.map +1 -1
- package/dist/base-plugin/fileviews.js.map +1 -1
- package/dist/base-plugin/index.d.ts +25 -67
- package/dist/base-plugin/index.d.ts.map +1 -1
- package/dist/base-plugin/types.d.ts +3 -3
- package/dist/base-plugin/types.d.ts.map +1 -1
- package/dist/base-plugin/types.js.map +1 -1
- package/dist/base-plugin/viewtemplates/edit.d.ts +3 -4
- package/dist/base-plugin/viewtemplates/edit.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/edit.js +50 -16
- package/dist/base-plugin/viewtemplates/edit.js.map +1 -1
- package/dist/base-plugin/viewtemplates/feed.d.ts +2 -2
- package/dist/base-plugin/viewtemplates/feed.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/feed.js +18 -4
- package/dist/base-plugin/viewtemplates/feed.js.map +1 -1
- package/dist/base-plugin/viewtemplates/filter.d.ts +0 -1
- package/dist/base-plugin/viewtemplates/filter.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/filter.js +1 -3
- package/dist/base-plugin/viewtemplates/filter.js.map +1 -1
- package/dist/base-plugin/viewtemplates/list.d.ts +1 -2
- package/dist/base-plugin/viewtemplates/list.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/list.js +9 -11
- package/dist/base-plugin/viewtemplates/list.js.map +1 -1
- package/dist/base-plugin/viewtemplates/listshowlist.d.ts +1 -12
- package/dist/base-plugin/viewtemplates/listshowlist.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/listshowlist.js +1 -1
- package/dist/base-plugin/viewtemplates/listshowlist.js.map +1 -1
- package/dist/base-plugin/viewtemplates/room.d.ts +1 -74
- package/dist/base-plugin/viewtemplates/room.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/room.js +0 -1
- package/dist/base-plugin/viewtemplates/room.js.map +1 -1
- package/dist/base-plugin/viewtemplates/show.d.ts +0 -1
- package/dist/base-plugin/viewtemplates/show.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/show.js +9 -2
- package/dist/base-plugin/viewtemplates/show.js.map +1 -1
- package/dist/base-plugin/viewtemplates/viewable_fields.d.ts +4 -3
- package/dist/base-plugin/viewtemplates/viewable_fields.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/viewable_fields.js +21 -19
- package/dist/base-plugin/viewtemplates/viewable_fields.js.map +1 -1
- package/dist/base-plugin/viewtemplates/workflow-room.d.ts +0 -1
- package/dist/base-plugin/viewtemplates/workflow-room.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/workflow-room.js +1 -3
- package/dist/base-plugin/viewtemplates/workflow-room.js.map +1 -1
- package/dist/db/connect.d.ts.map +1 -1
- package/dist/db/connect.js.map +1 -1
- package/dist/db/fixtures.d.ts.map +1 -1
- package/dist/db/fixtures.js +1 -1
- package/dist/db/fixtures.js.map +1 -1
- package/dist/db/index.js.map +1 -1
- package/dist/db/reset_schema.d.ts.map +1 -1
- package/dist/db/reset_schema.js.map +1 -1
- package/dist/db/state.d.ts +23 -16
- package/dist/db/state.d.ts.map +1 -1
- package/dist/db/state.js +13 -18
- package/dist/db/state.js.map +1 -1
- package/dist/diagram/cy_generate_utils.js +3 -2
- package/dist/diagram/cy_generate_utils.js.map +1 -1
- package/dist/diagram/cy_raster.js.map +1 -1
- package/dist/diagram/node_extract_utils.js +5 -4
- package/dist/diagram/node_extract_utils.js.map +1 -1
- package/dist/diagram/nodes/table_node.js.map +1 -1
- package/dist/index.js +7 -17
- package/dist/index.js.map +1 -1
- package/dist/migrate.d.ts.map +1 -1
- package/dist/migrate.js.map +1 -1
- package/dist/migrations/202007091707.d.ts.map +1 -1
- package/dist/migrations/202007202144.d.ts.map +1 -1
- package/dist/migrations/202008031500.d.ts.map +1 -1
- package/dist/migrations/202009221105.d.ts.map +1 -1
- package/dist/migrations/202009231331.d.ts.map +1 -1
- package/dist/migrations/202010231444.d.ts.map +1 -1
- package/dist/migrations/202011021749.d.ts.map +1 -1
- package/dist/migrations/202012011203.d.ts.map +1 -1
- package/dist/migrations/202012100841.d.ts.map +1 -1
- package/dist/migrations/202012281835.d.ts.map +1 -1
- package/dist/migrations/202101061051.d.ts.map +1 -1
- package/dist/migrations/202101141128.d.ts.map +1 -1
- package/dist/migrations/202102091312.d.ts.map +1 -1
- package/dist/migrations/202102091312.js.map +1 -1
- package/dist/migrations/202102172148.d.ts.map +1 -1
- package/dist/migrations/202106102347.d.ts.map +1 -1
- package/dist/migrations/202106112120.d.ts.map +1 -1
- package/dist/migrations/202106120012.d.ts.map +1 -1
- package/dist/migrations/202106120220.d.ts.map +1 -1
- package/dist/migrations/202106121701.d.ts.map +1 -1
- package/dist/migrations/202107281619.d.ts.map +1 -1
- package/dist/migrations/202109201624.d.ts.map +1 -1
- package/dist/migrations/202207022002.d.ts.map +1 -1
- package/dist/migrations/202210051058.js.map +1 -1
- package/dist/migrations/202210101540.js.map +1 -1
- package/dist/migrations/202301130917.d.ts.map +1 -1
- package/dist/migrations/202304281224.js.map +1 -1
- package/dist/migrations/202307211459.js.map +1 -1
- package/dist/migrations/202308211648.d.ts.map +1 -1
- package/dist/migrations/202402071125.d.ts.map +1 -1
- package/dist/migrations/202501081226.d.ts.map +1 -1
- package/dist/migrations/202502131103.d.ts +2 -0
- package/dist/migrations/202502131103.d.ts.map +1 -0
- package/dist/migrations/{202501181439.js → 202502131103.js} +1 -2
- package/dist/migrations/202502131103.js.map +1 -0
- package/dist/mobile-mocks/node/fs/promises.js +6 -5
- package/dist/mobile-mocks/node/fs/promises.js.map +1 -1
- package/dist/mobile-mocks/node/fs.js +4 -3
- package/dist/mobile-mocks/node/fs.js.map +1 -1
- package/dist/mobile-mocks/node/latest-version.js +1 -1
- package/dist/mobile-mocks/node/latest-version.js.map +1 -1
- package/dist/mobile-mocks/node/v8.js +3 -2
- package/dist/mobile-mocks/node/v8.js.map +1 -1
- package/dist/model-helper.d.ts +2 -2
- package/dist/model-helper.js.map +1 -1
- package/dist/models/config.d.ts +1 -0
- package/dist/models/config.d.ts.map +1 -1
- package/dist/models/config.js +119 -110
- package/dist/models/config.js.map +1 -1
- package/dist/models/crash.js +7 -17
- package/dist/models/crash.js.map +1 -1
- package/dist/models/discovery.d.ts +5 -5
- package/dist/models/discovery.d.ts.map +1 -1
- package/dist/models/discovery.js +9 -7
- package/dist/models/discovery.js.map +1 -1
- package/dist/models/email.d.ts +4 -2
- package/dist/models/email.d.ts.map +1 -1
- package/dist/models/email.js +14 -21
- package/dist/models/email.js.map +1 -1
- package/dist/models/eventlog.d.ts +1 -1
- package/dist/models/eventlog.d.ts.map +1 -1
- package/dist/models/eventlog.js +8 -4
- package/dist/models/eventlog.js.map +1 -1
- package/dist/models/expression.d.ts +2 -2
- package/dist/models/expression.d.ts.map +1 -1
- package/dist/models/expression.js +12 -9
- package/dist/models/expression.js.map +1 -1
- package/dist/models/field.d.ts +1 -0
- package/dist/models/field.d.ts.map +1 -1
- package/dist/models/field.js +9 -3
- package/dist/models/field.js.map +1 -1
- package/dist/models/fieldrepeat.js.map +1 -1
- package/dist/models/file.d.ts +4 -2
- package/dist/models/file.d.ts.map +1 -1
- package/dist/models/file.js.map +1 -1
- package/dist/models/form.d.ts +2 -0
- package/dist/models/form.d.ts.map +1 -1
- package/dist/models/form.js +16 -0
- package/dist/models/form.js.map +1 -1
- package/dist/models/index.d.ts +20 -23
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js +7 -1
- package/dist/models/index.js.map +1 -1
- package/dist/models/internal/async_json_stream.js +1 -1
- package/dist/models/internal/async_json_stream.js.map +1 -1
- package/dist/models/internal/query.d.ts.map +1 -1
- package/dist/models/internal/query.js.map +1 -1
- package/dist/models/internal/table_helper.js.map +1 -1
- package/dist/models/layout.d.ts +1 -1
- package/dist/models/layout.d.ts.map +1 -1
- package/dist/models/layout.js.map +1 -1
- package/dist/models/model.d.ts +1 -1
- package/dist/models/model.d.ts.map +1 -1
- package/dist/models/model.js +2 -1
- package/dist/models/model.js.map +1 -1
- package/dist/models/model_instance.d.ts +7 -4
- package/dist/models/model_instance.d.ts.map +1 -1
- package/dist/models/model_instance.js +8 -17
- package/dist/models/model_instance.js.map +1 -1
- package/dist/models/notification.js.map +1 -1
- package/dist/models/page.js +7 -17
- package/dist/models/page.js.map +1 -1
- package/dist/models/page_group.js +7 -17
- package/dist/models/page_group.js.map +1 -1
- package/dist/models/page_group_member.js.map +1 -1
- package/dist/models/plugin.js.map +1 -1
- package/dist/models/random.d.ts.map +1 -1
- package/dist/models/random.js.map +1 -1
- package/dist/models/scheduler.d.ts +3 -10
- package/dist/models/scheduler.d.ts.map +1 -1
- package/dist/models/scheduler.js +1 -1
- package/dist/models/scheduler.js.map +1 -1
- package/dist/models/table.d.ts +39 -31
- package/dist/models/table.d.ts.map +1 -1
- package/dist/models/table.js +99 -52
- package/dist/models/table.js.map +1 -1
- package/dist/models/table_constraints.js.map +1 -1
- package/dist/models/tag.js.map +1 -1
- package/dist/models/trigger.js +7 -17
- package/dist/models/trigger.js.map +1 -1
- package/dist/models/user.d.ts +1 -1
- package/dist/models/user.d.ts.map +1 -1
- package/dist/models/user.js +2 -2
- package/dist/models/user.js.map +1 -1
- package/dist/models/view.d.ts +6 -2
- package/dist/models/view.d.ts.map +1 -1
- package/dist/models/view.js +27 -22
- package/dist/models/view.js.map +1 -1
- package/dist/models/workflow.js +7 -17
- package/dist/models/workflow.js.map +1 -1
- package/dist/models/workflow_run.d.ts.map +1 -1
- package/dist/models/workflow_run.js +13 -19
- package/dist/models/workflow_run.js.map +1 -1
- package/dist/models/workflow_step.d.ts.map +1 -1
- package/dist/models/workflow_step.js +11 -1
- package/dist/models/workflow_step.js.map +1 -1
- package/dist/plugin-helper.d.ts +2 -5
- package/dist/plugin-helper.d.ts.map +1 -1
- package/dist/plugin-helper.js +47 -19
- package/dist/plugin-helper.js.map +1 -1
- package/dist/plugin-testing.d.ts +1 -1
- package/dist/plugin-testing.d.ts.map +1 -1
- package/dist/plugin-testing.js.map +1 -1
- package/dist/tests/actions.test.js +8 -18
- package/dist/tests/actions.test.js.map +1 -1
- package/dist/tests/assertions.js +7 -6
- package/dist/tests/assertions.js.map +1 -1
- package/dist/tests/auth.test.js +51 -1
- package/dist/tests/auth.test.js.map +1 -1
- package/dist/tests/auxtest.test.js.map +1 -1
- package/dist/tests/calc.test.js +6 -0
- package/dist/tests/calc.test.js.map +1 -1
- package/dist/tests/common_helpers.js +8 -7
- package/dist/tests/common_helpers.js.map +1 -1
- package/dist/tests/db.test.js.map +1 -1
- package/dist/tests/discover.test.js +36 -0
- package/dist/tests/discover.test.js.map +1 -1
- package/dist/tests/edit.test.js +6 -2
- package/dist/tests/edit.test.js.map +1 -1
- package/dist/tests/email.test.js +20 -16
- package/dist/tests/email.test.js.map +1 -1
- package/dist/tests/exact_views.test.js.map +1 -1
- package/dist/tests/field.test.js.map +1 -1
- package/dist/tests/fieldviews.test.js.map +1 -1
- package/dist/tests/file.test.js.map +1 -1
- package/dist/tests/filter.test.js +2 -2
- package/dist/tests/filter.test.js.map +1 -1
- package/dist/tests/list.test.js +1 -1
- package/dist/tests/list.test.js.map +1 -1
- package/dist/tests/mocks.d.ts +2 -2
- package/dist/tests/mocks.d.ts.map +1 -1
- package/dist/tests/mocks.js +2 -2
- package/dist/tests/mocks.js.map +1 -1
- package/dist/tests/page_group.test.js.map +1 -1
- package/dist/tests/show.test.js +1 -1
- package/dist/tests/show.test.js.map +1 -1
- package/dist/tests/table.test.js.map +1 -1
- package/dist/tests/table_history.test.js.map +1 -1
- package/dist/tests/tag.test.js.map +1 -1
- package/dist/tests/user.test.js +2 -0
- package/dist/tests/user.test.js.map +1 -1
- package/dist/tests/view.test.js +1 -0
- package/dist/tests/view.test.js.map +1 -1
- package/dist/tests/workflow.test.js +0 -15
- package/dist/tests/workflow.test.js.map +1 -1
- package/dist/utils.d.ts +7 -6
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +10 -1
- package/dist/utils.js.map +1 -1
- package/dist/web-mobile-commons.d.ts +6 -1
- package/dist/web-mobile-commons.d.ts.map +1 -1
- package/dist/web-mobile-commons.js +43 -1
- package/dist/web-mobile-commons.js.map +1 -1
- package/package.json +9 -9
- package/dist/migrations/202501181439.d.ts +0 -2
- package/dist/migrations/202501181439.d.ts.map +0 -1
- package/dist/migrations/202501181439.js.map +0 -1
package/dist/models/table.js
CHANGED
|
@@ -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) ||
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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(
|
|
347
|
+
async get_models(where) {
|
|
358
348
|
const Model = require("./model");
|
|
359
|
-
if (typeof
|
|
360
|
-
return await Model.find({ name:
|
|
349
|
+
if (typeof where === "string")
|
|
350
|
+
return await Model.find({ name: where, table_id: this.id });
|
|
361
351
|
else
|
|
362
|
-
return await Model.find({ ...(
|
|
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 {
|
|
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 &&
|
|
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(
|
|
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(
|
|
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(
|
|
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() /
|
|
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 (
|
|
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}.
|
|
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(
|
|
2903
|
+
fldNms.push(`"${jtNm1}"."${(0, internal_1.sqlsanitize)(target)}" as "${(0, internal_1.sqlsanitize)(fldnm)}"`);
|
|
2878
2904
|
}
|
|
2879
2905
|
else {
|
|
2880
|
-
fldNms.push(
|
|
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
|
|
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
|
-
|
|
3115
|
-
|
|
3116
|
-
|
|
3117
|
-
|
|
3118
|
-
|
|
3119
|
-
|
|
3120
|
-
|
|
3121
|
-
|
|
3122
|
-
|
|
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);
|