@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.
- 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 +33 -77
- package/dist/base-plugin/index.d.ts.map +1 -1
- package/dist/base-plugin/types.d.ts +7 -8
- package/dist/base-plugin/types.d.ts.map +1 -1
- package/dist/base-plugin/types.js +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 +51 -17
- 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 +13 -2
- package/dist/base-plugin/viewtemplates/show.js.map +1 -1
- package/dist/base-plugin/viewtemplates/viewable_fields.d.ts +6 -5
- package/dist/base-plugin/viewtemplates/viewable_fields.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/viewable_fields.js +29 -24
- 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/models/internal/async_json_stream.d.ts +1 -0
- package/dist/mobile-mocks/models/internal/async_json_stream.d.ts.map +1 -0
- package/dist/mobile-mocks/models/internal/async_json_stream.js +2 -0
- package/dist/mobile-mocks/models/internal/async_json_stream.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 +129 -112
- 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 +15 -22
- 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.d.ts +4 -0
- package/dist/models/internal/async_json_stream.d.ts.map +1 -0
- package/dist/models/internal/async_json_stream.js +36 -0
- package/dist/models/internal/async_json_stream.js.map +1 -0
- 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 +40 -31
- package/dist/models/table.d.ts.map +1 -1
- package/dist/models/table.js +118 -60
- 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 +18 -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 +50 -21
- 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 +18 -0
- 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 +32 -43
- 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 +19 -15
- package/webpack.config.js +6 -0
- 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
|
};
|
|
@@ -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(
|
|
347
|
+
async get_models(where) {
|
|
357
348
|
const Model = require("./model");
|
|
358
|
-
if (typeof
|
|
359
|
-
return await Model.find({ name:
|
|
349
|
+
if (typeof where === "string")
|
|
350
|
+
return await Model.find({ name: where, table_id: this.id });
|
|
360
351
|
else
|
|
361
|
-
return await Model.find({ ...(
|
|
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 {
|
|
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 &&
|
|
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(
|
|
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(
|
|
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(
|
|
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() /
|
|
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 (
|
|
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
|
-
|
|
2472
|
+
const consume = async (rec) => {
|
|
2445
2473
|
i += 1;
|
|
2446
2474
|
if (skip_first_data_row && i === 2)
|
|
2447
|
-
|
|
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
|
-
|
|
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 ${
|
|
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}.
|
|
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(
|
|
2903
|
+
fldNms.push(`"${jtNm1}"."${(0, internal_1.sqlsanitize)(target)}" as "${(0, internal_1.sqlsanitize)(fldnm)}"`);
|
|
2867
2904
|
}
|
|
2868
2905
|
else {
|
|
2869
|
-
fldNms.push(
|
|
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
|
|
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
|
-
|
|
3104
|
-
|
|
3105
|
-
|
|
3106
|
-
|
|
3107
|
-
|
|
3108
|
-
|
|
3109
|
-
|
|
3110
|
-
|
|
3111
|
-
|
|
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);
|