@saltcorn/data 1.6.0-alpha.6 → 1.6.0-alpha.8
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 +1850 -1653
- package/dist/base-plugin/actions.d.ts.map +1 -1
- package/dist/base-plugin/actions.js +130 -104
- package/dist/base-plugin/actions.js.map +1 -1
- package/dist/base-plugin/fieldviews.d.ts +284 -114
- package/dist/base-plugin/fieldviews.d.ts.map +1 -1
- package/dist/base-plugin/fieldviews.js +23 -69
- package/dist/base-plugin/fieldviews.js.map +1 -1
- package/dist/base-plugin/fileviews.d.ts +15 -14
- package/dist/base-plugin/fileviews.d.ts.map +1 -1
- package/dist/base-plugin/fileviews.js +22 -18
- package/dist/base-plugin/fileviews.js.map +1 -1
- package/dist/base-plugin/index.d.ts +3369 -1299
- package/dist/base-plugin/index.d.ts.map +1 -1
- package/dist/base-plugin/index.js +39 -25
- package/dist/base-plugin/index.js.map +1 -1
- package/dist/base-plugin/types.d.ts +1438 -1029
- package/dist/base-plugin/types.d.ts.map +1 -1
- package/dist/base-plugin/types.js +3 -2
- package/dist/base-plugin/types.js.map +1 -1
- package/dist/base-plugin/viewtemplates/edit.d.ts +133 -257
- package/dist/base-plugin/viewtemplates/edit.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/edit.js +306 -348
- package/dist/base-plugin/viewtemplates/edit.js.map +1 -1
- package/dist/base-plugin/viewtemplates/feed.d.ts +30 -81
- package/dist/base-plugin/viewtemplates/feed.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/feed.js +37 -30
- package/dist/base-plugin/viewtemplates/feed.js.map +1 -1
- package/dist/base-plugin/viewtemplates/filter.d.ts +42 -64
- package/dist/base-plugin/viewtemplates/filter.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/filter.js +100 -81
- package/dist/base-plugin/viewtemplates/filter.js.map +1 -1
- package/dist/base-plugin/viewtemplates/list.d.ts +40 -118
- package/dist/base-plugin/viewtemplates/list.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/list.js +157 -161
- package/dist/base-plugin/viewtemplates/list.js.map +1 -1
- package/dist/base-plugin/viewtemplates/listshowlist.d.ts +65 -49
- package/dist/base-plugin/viewtemplates/listshowlist.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/listshowlist.js +33 -58
- package/dist/base-plugin/viewtemplates/listshowlist.js.map +1 -1
- package/dist/base-plugin/viewtemplates/room.d.ts +102 -109
- package/dist/base-plugin/viewtemplates/room.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/room.js +53 -50
- package/dist/base-plugin/viewtemplates/room.js.map +1 -1
- package/dist/base-plugin/viewtemplates/show.d.ts +72 -136
- package/dist/base-plugin/viewtemplates/show.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/show.js +86 -181
- package/dist/base-plugin/viewtemplates/show.js.map +1 -1
- package/dist/base-plugin/viewtemplates/viewable_fields.d.ts +2 -2
- package/dist/base-plugin/viewtemplates/viewable_fields.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/viewable_fields.js +2 -1
- package/dist/base-plugin/viewtemplates/viewable_fields.js.map +1 -1
- package/dist/base-plugin/viewtemplates/workflow-room.d.ts +37 -61
- package/dist/base-plugin/viewtemplates/workflow-room.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/workflow-room.js +42 -65
- package/dist/base-plugin/viewtemplates/workflow-room.js.map +1 -1
- package/dist/contracts.d.ts +4 -48
- package/dist/contracts.d.ts.map +1 -1
- package/dist/contracts.js +18 -2
- package/dist/contracts.js.map +1 -1
- package/dist/db/connect.d.ts.map +1 -1
- package/dist/db/connect.js +1 -0
- package/dist/db/connect.js.map +1 -1
- package/dist/db/fixtures.d.ts +2 -7
- package/dist/db/fixtures.d.ts.map +1 -1
- package/dist/db/fixtures.js +2349 -2352
- package/dist/db/fixtures.js.map +1 -1
- package/dist/db/reset_schema.d.ts +3 -3
- package/dist/db/reset_schema.d.ts.map +1 -1
- package/dist/db/reset_schema.js +10 -10
- package/dist/db/reset_schema.js.map +1 -1
- package/dist/db/state.d.ts +31 -28
- package/dist/db/state.d.ts.map +1 -1
- package/dist/db/state.js +5 -2
- package/dist/db/state.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/migrate.d.ts +9 -3
- package/dist/migrate.d.ts.map +1 -1
- package/dist/migrate.js +26 -20
- package/dist/migrate.js.map +1 -1
- package/dist/model-helper.d.ts +18 -17
- package/dist/model-helper.d.ts.map +1 -1
- package/dist/model-helper.js +46 -29
- package/dist/model-helper.js.map +1 -1
- package/dist/models/config.d.ts +5 -0
- package/dist/models/config.d.ts.map +1 -1
- package/dist/models/config.js +5 -0
- package/dist/models/config.js.map +1 -1
- package/dist/models/field.d.ts +1 -1
- package/dist/models/field.d.ts.map +1 -1
- package/dist/models/field.js +3 -2
- package/dist/models/field.js.map +1 -1
- package/dist/models/file.d.ts +1 -1
- package/dist/models/file.d.ts.map +1 -1
- package/dist/models/file.js.map +1 -1
- package/dist/models/form.js +1 -1
- package/dist/models/form.js.map +1 -1
- package/dist/models/index.d.ts +5 -0
- package/dist/models/index.d.ts.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 +12 -0
- package/dist/models/layout.js.map +1 -1
- package/dist/models/plugin.d.ts +3 -2
- package/dist/models/plugin.d.ts.map +1 -1
- package/dist/models/plugin.js +7 -0
- package/dist/models/plugin.js.map +1 -1
- package/dist/models/table.d.ts.map +1 -1
- package/dist/models/table.js +6 -1
- package/dist/models/table.js.map +1 -1
- package/dist/models/trigger.d.ts +2 -1
- package/dist/models/trigger.d.ts.map +1 -1
- package/dist/models/trigger.js +3 -1
- package/dist/models/trigger.js.map +1 -1
- package/dist/models/view.js +4 -4
- package/dist/models/view.js.map +1 -1
- package/dist/plugin-helper.d.ts +218 -191
- package/dist/plugin-helper.d.ts.map +1 -1
- package/dist/plugin-helper.js +237 -185
- package/dist/plugin-helper.js.map +1 -1
- package/dist/plugin-testing.d.ts +6 -6
- package/dist/plugin-testing.d.ts.map +1 -1
- package/dist/plugin-testing.js +66 -31
- package/dist/plugin-testing.js.map +1 -1
- package/dist/standard-menu.d.ts +6 -1
- package/dist/standard-menu.d.ts.map +1 -1
- package/dist/standard-menu.js +20 -0
- package/dist/standard-menu.js.map +1 -1
- package/dist/tests/actions.test.d.ts +2 -0
- package/dist/tests/actions.test.d.ts.map +1 -0
- package/dist/tests/actions.test.js +936 -0
- package/dist/tests/actions.test.js.map +1 -0
- package/dist/tests/auth.test.d.ts +2 -0
- package/dist/tests/auth.test.d.ts.map +1 -0
- package/dist/tests/auth.test.js +824 -0
- package/dist/tests/auth.test.js.map +1 -0
- package/dist/tests/auxtest.test.d.ts +2 -0
- package/dist/tests/auxtest.test.d.ts.map +1 -0
- package/dist/tests/auxtest.test.js +562 -0
- package/dist/tests/auxtest.test.js.map +1 -0
- package/dist/tests/base.test.d.ts +2 -0
- package/dist/tests/base.test.d.ts.map +1 -0
- package/dist/tests/base.test.js +30 -0
- package/dist/tests/base.test.js.map +1 -0
- package/dist/tests/calc.test.d.ts +2 -0
- package/dist/tests/calc.test.d.ts.map +1 -0
- package/dist/tests/calc.test.js +1081 -0
- package/dist/tests/calc.test.js.map +1 -0
- package/dist/tests/composite_pk.test.d.ts +2 -0
- package/dist/tests/composite_pk.test.d.ts.map +1 -0
- package/dist/tests/composite_pk.test.js +98 -0
- package/dist/tests/composite_pk.test.js.map +1 -0
- package/dist/tests/config.test.d.ts +2 -0
- package/dist/tests/config.test.d.ts.map +1 -0
- package/dist/tests/config.test.js +86 -0
- package/dist/tests/config.test.js.map +1 -0
- package/dist/tests/db.test.d.ts +2 -0
- package/dist/tests/db.test.d.ts.map +1 -0
- package/dist/tests/db.test.js +178 -0
- package/dist/tests/db.test.js.map +1 -0
- package/dist/tests/discover.test.d.ts +2 -0
- package/dist/tests/discover.test.d.ts.map +1 -0
- package/dist/tests/discover.test.js +245 -0
- package/dist/tests/discover.test.js.map +1 -0
- package/dist/tests/edit.test.d.ts +2 -0
- package/dist/tests/edit.test.d.ts.map +1 -0
- package/dist/tests/edit.test.js +1161 -0
- package/dist/tests/edit.test.js.map +1 -0
- package/dist/tests/email.test.d.ts +2 -0
- package/dist/tests/email.test.d.ts.map +1 -0
- package/dist/tests/email.test.js +255 -0
- package/dist/tests/email.test.js.map +1 -0
- package/dist/tests/exact_views.test.d.ts +2 -0
- package/dist/tests/exact_views.test.d.ts.map +1 -0
- package/dist/tests/exact_views.test.js +1363 -0
- package/dist/tests/exact_views.test.js.map +1 -0
- package/dist/tests/field.test.d.ts +2 -0
- package/dist/tests/field.test.d.ts.map +1 -0
- package/dist/tests/field.test.js +588 -0
- package/dist/tests/field.test.js.map +1 -0
- package/dist/tests/fieldviews.test.d.ts +2 -0
- package/dist/tests/fieldviews.test.d.ts.map +1 -0
- package/dist/tests/fieldviews.test.js +74 -0
- package/dist/tests/fieldviews.test.js.map +1 -0
- package/dist/tests/file.test.d.ts +2 -0
- package/dist/tests/file.test.d.ts.map +1 -0
- package/dist/tests/file.test.js +148 -0
- package/dist/tests/file.test.js.map +1 -0
- package/dist/tests/filter.test.d.ts +2 -0
- package/dist/tests/filter.test.d.ts.map +1 -0
- package/dist/tests/filter.test.js +496 -0
- package/dist/tests/filter.test.js.map +1 -0
- package/dist/tests/form.test.d.ts +2 -0
- package/dist/tests/form.test.d.ts.map +1 -0
- package/dist/tests/form.test.js +264 -0
- package/dist/tests/form.test.js.map +1 -0
- package/dist/tests/list.test.d.ts +2 -0
- package/dist/tests/list.test.d.ts.map +1 -0
- package/dist/tests/list.test.js +1037 -0
- package/dist/tests/list.test.js.map +1 -0
- package/dist/tests/models.test.d.ts +2 -0
- package/dist/tests/models.test.d.ts.map +1 -0
- package/dist/tests/models.test.js +417 -0
- package/dist/tests/models.test.js.map +1 -0
- package/dist/tests/page.test.d.ts +2 -0
- package/dist/tests/page.test.d.ts.map +1 -0
- package/dist/tests/page.test.js +26 -0
- package/dist/tests/page.test.js.map +1 -0
- package/dist/tests/page_group.test.d.ts +2 -0
- package/dist/tests/page_group.test.d.ts.map +1 -0
- package/dist/tests/page_group.test.js +51 -0
- package/dist/tests/page_group.test.js.map +1 -0
- package/dist/tests/plugin.test.d.ts +2 -0
- package/dist/tests/plugin.test.d.ts.map +1 -0
- package/dist/tests/plugin.test.js +60 -0
- package/dist/tests/plugin.test.js.map +1 -0
- package/dist/tests/show.test.d.ts +2 -0
- package/dist/tests/show.test.d.ts.map +1 -0
- package/dist/tests/show.test.js +561 -0
- package/dist/tests/show.test.js.map +1 -0
- package/dist/tests/state.test.d.ts +2 -0
- package/dist/tests/state.test.d.ts.map +1 -0
- package/dist/tests/state.test.js +82 -0
- package/dist/tests/state.test.js.map +1 -0
- package/dist/tests/table.test.d.ts +2 -0
- package/dist/tests/table.test.d.ts.map +1 -0
- package/dist/tests/table.test.js +2717 -0
- package/dist/tests/table.test.js.map +1 -0
- package/dist/tests/table_history.test.d.ts +2 -0
- package/dist/tests/table_history.test.d.ts.map +1 -0
- package/dist/tests/table_history.test.js +413 -0
- package/dist/tests/table_history.test.js.map +1 -0
- package/dist/tests/tag.test.d.ts +2 -0
- package/dist/tests/tag.test.d.ts.map +1 -0
- package/dist/tests/tag.test.js +97 -0
- package/dist/tests/tag.test.js.map +1 -0
- package/dist/tests/user.test.d.ts +2 -0
- package/dist/tests/user.test.d.ts.map +1 -0
- package/dist/tests/user.test.js +441 -0
- package/dist/tests/user.test.js.map +1 -0
- package/dist/tests/view.test.d.ts +2 -0
- package/dist/tests/view.test.d.ts.map +1 -0
- package/dist/tests/view.test.js +699 -0
- package/dist/tests/view.test.js.map +1 -0
- package/dist/tests/workflow.test.d.ts +2 -0
- package/dist/tests/workflow.test.d.ts.map +1 -0
- package/dist/tests/workflow.test.js +303 -0
- package/dist/tests/workflow.test.js.map +1 -0
- package/dist/tests/workflow_run.test.d.ts +2 -0
- package/dist/tests/workflow_run.test.d.ts.map +1 -0
- package/dist/tests/workflow_run.test.js +922 -0
- package/dist/tests/workflow_run.test.js.map +1 -0
- package/dist/viewable_fields.d.ts +151 -112
- package/dist/viewable_fields.d.ts.map +1 -1
- package/dist/viewable_fields.js +136 -113
- package/dist/viewable_fields.js.map +1 -1
- package/dist/web-mobile-commons.d.ts +1 -2
- package/dist/web-mobile-commons.d.ts.map +1 -1
- package/dist/web-mobile-commons.js +4 -4
- package/dist/web-mobile-commons.js.map +1 -1
- package/package.json +8 -8
|
@@ -5,20 +5,24 @@
|
|
|
5
5
|
* @module base-plugin/actions
|
|
6
6
|
* @subcategory base-plugin
|
|
7
7
|
*/
|
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
8
11
|
const fetch = require("node-fetch");
|
|
9
12
|
const vm = require("vm");
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
const
|
|
13
|
+
const table_1 = __importDefault(require("../models/table"));
|
|
14
|
+
const eventlog_1 = __importDefault(require("../models/eventlog"));
|
|
15
|
+
const view_1 = __importDefault(require("../models/view"));
|
|
16
|
+
const model_1 = __importDefault(require("../models/model"));
|
|
17
|
+
const page_1 = __importDefault(require("../models/page"));
|
|
18
|
+
const field_1 = __importDefault(require("../models/field"));
|
|
19
|
+
const user_1 = __importDefault(require("../models/user"));
|
|
20
|
+
const trigger_1 = __importDefault(require("../models/trigger"));
|
|
21
|
+
const workflow_run_1 = __importDefault(require("../models/workflow_run"));
|
|
22
|
+
const notification_1 = __importDefault(require("../models/notification"));
|
|
23
|
+
const file_1 = __importDefault(require("../models/file"));
|
|
24
|
+
const state_1 = __importDefault(require("../db/state"));
|
|
25
|
+
const { getState } = state_1.default;
|
|
22
26
|
const { getMailTransport, viewToEmailHtml, loadAttachments, getFileAggregations, mjml2html, } = require("../models/email");
|
|
23
27
|
const { get_async_expression_function, recalculate_for_stored, eval_expression, freeVariablesInInterpolation, add_free_variables_to_joinfields, freeVariables, } = require("../models/expression");
|
|
24
28
|
const { div, code, a, span } = require("@saltcorn/markup/tags");
|
|
@@ -58,7 +62,9 @@ const emit_to_client = (user) => (data, userIds) => {
|
|
|
58
62
|
? userIds
|
|
59
63
|
: userIds
|
|
60
64
|
? [userIds]
|
|
61
|
-
:
|
|
65
|
+
: user?.id
|
|
66
|
+
? [user.id]
|
|
67
|
+
: [];
|
|
62
68
|
state.emitDynamicUpdate(db.getTenantSchema(), data, safeIds);
|
|
63
69
|
};
|
|
64
70
|
/**
|
|
@@ -79,7 +85,7 @@ const run_code = async ({ row, table, channel, configuration: { code, run_where
|
|
|
79
85
|
field_names: table ? table.fields.map((f) => f.name) : undefined,
|
|
80
86
|
};
|
|
81
87
|
if (!isNode()) {
|
|
82
|
-
const { isOfflineMode } = getState().mobileConfig;
|
|
88
|
+
const { isOfflineMode } = getState().mobileConfig || {};
|
|
83
89
|
if (!isOfflineMode && run_where === "Server") {
|
|
84
90
|
// stop on the app and run the action server side
|
|
85
91
|
return { server_eval: true };
|
|
@@ -91,7 +97,7 @@ const run_code = async ({ row, table, channel, configuration: { code, run_where
|
|
|
91
97
|
return v.run({ row, table, user, configuration: args, ...rest, ...args });
|
|
92
98
|
};
|
|
93
99
|
});
|
|
94
|
-
const trigger_actions = await
|
|
100
|
+
const trigger_actions = await trigger_1.default.find({
|
|
95
101
|
when_trigger: { or: ["API call", "Never"] },
|
|
96
102
|
});
|
|
97
103
|
for (const trigger of trigger_actions) {
|
|
@@ -130,7 +136,7 @@ const run_code = async ({ row, table, channel, configuration: { code, run_where
|
|
|
130
136
|
...restArgs,
|
|
131
137
|
});
|
|
132
138
|
};
|
|
133
|
-
const emitEvent = (eventType, channel, payload) =>
|
|
139
|
+
const emitEvent = (eventType, channel, payload) => trigger_1.default.emitEvent(eventType, channel, user, payload);
|
|
134
140
|
const fetchJSON = async (...args) => await (await fetch(...args)).json();
|
|
135
141
|
const sysState = getState();
|
|
136
142
|
const require = (nm) => sysState.codeNPMmodules[nm];
|
|
@@ -142,14 +148,16 @@ const run_code = async ({ row, table, channel, configuration: { code, run_where
|
|
|
142
148
|
await sysState.refresh(true);
|
|
143
149
|
//other workers
|
|
144
150
|
db.whenTransactionisFree(async () => {
|
|
145
|
-
if (which)
|
|
146
|
-
|
|
151
|
+
if (which) {
|
|
152
|
+
const state = getState();
|
|
153
|
+
await state[`refresh_${which}`]();
|
|
154
|
+
}
|
|
147
155
|
else
|
|
148
|
-
await getState().refresh();
|
|
156
|
+
await getState().refresh(false);
|
|
149
157
|
});
|
|
150
158
|
};
|
|
151
159
|
const f = vm.runInNewContext(`async () => {${code}\n}`, {
|
|
152
|
-
Table,
|
|
160
|
+
Table: table_1.default,
|
|
153
161
|
table,
|
|
154
162
|
row,
|
|
155
163
|
context: row,
|
|
@@ -170,16 +178,16 @@ const run_code = async ({ row, table, channel, configuration: { code, run_where
|
|
|
170
178
|
await sysState.refresh();
|
|
171
179
|
},
|
|
172
180
|
URL,
|
|
173
|
-
File,
|
|
174
|
-
User,
|
|
175
|
-
View,
|
|
176
|
-
Page,
|
|
177
|
-
Field,
|
|
178
|
-
EventLog,
|
|
181
|
+
File: file_1.default,
|
|
182
|
+
User: user_1.default,
|
|
183
|
+
View: view_1.default,
|
|
184
|
+
Page: page_1.default,
|
|
185
|
+
Field: field_1.default,
|
|
186
|
+
EventLog: eventlog_1.default,
|
|
179
187
|
Buffer: isNode() ? Buffer : require("buffer"),
|
|
180
|
-
Trigger,
|
|
181
|
-
Notification,
|
|
182
|
-
WorkflowRun,
|
|
188
|
+
Trigger: trigger_1.default,
|
|
189
|
+
Notification: notification_1.default,
|
|
190
|
+
WorkflowRun: workflow_run_1.default,
|
|
183
191
|
setTimeout,
|
|
184
192
|
interpolate,
|
|
185
193
|
require,
|
|
@@ -241,7 +249,7 @@ module.exports = {
|
|
|
241
249
|
label: "Event type",
|
|
242
250
|
required: true,
|
|
243
251
|
input_type: "select",
|
|
244
|
-
options:
|
|
252
|
+
options: trigger_1.default.when_options,
|
|
245
253
|
},
|
|
246
254
|
{
|
|
247
255
|
name: "channel",
|
|
@@ -265,7 +273,7 @@ module.exports = {
|
|
|
265
273
|
* @returns {Promise<void>}
|
|
266
274
|
*/
|
|
267
275
|
run: async ({ row, configuration: { eventType, channel, payload }, user, }) => {
|
|
268
|
-
return await
|
|
276
|
+
return await trigger_1.default.emitEvent(eventType, channel, user, payload ? JSON.parse(payload) : row);
|
|
269
277
|
},
|
|
270
278
|
namespace: "Control",
|
|
271
279
|
},
|
|
@@ -275,8 +283,8 @@ module.exports = {
|
|
|
275
283
|
*/
|
|
276
284
|
description: "Repeat an action over some or all rows in a table",
|
|
277
285
|
configFields: async () => {
|
|
278
|
-
const tables = await
|
|
279
|
-
const trigger_actions0 = await
|
|
286
|
+
const tables = await table_1.default.find({}, { cached: true });
|
|
287
|
+
const trigger_actions0 = await trigger_1.default.find({});
|
|
280
288
|
const trigger_actions = trigger_actions0.sort(comparingCaseInsensitive("name"));
|
|
281
289
|
const order_options = {};
|
|
282
290
|
for (const table of tables) {
|
|
@@ -349,13 +357,13 @@ module.exports = {
|
|
|
349
357
|
* @returns {Promise<void>}
|
|
350
358
|
*/
|
|
351
359
|
run: async ({ row, configuration: { table_name, where, limit, orderBy, orderDesc, trigger_id, interval, }, user, ...rest }) => {
|
|
352
|
-
const table =
|
|
360
|
+
const table = table_1.default.findOne({ name: table_name });
|
|
353
361
|
const wh = where ? eval_expression(where, row, user) : {};
|
|
354
362
|
const selOpts = { orderDesc, orderBy };
|
|
355
363
|
if (limit)
|
|
356
364
|
selOpts.limit = limit;
|
|
357
365
|
const rows = await table.getRows(wh, selOpts);
|
|
358
|
-
const trigger =
|
|
366
|
+
const trigger = trigger_1.default.findOne({ id: trigger_id });
|
|
359
367
|
let result = {};
|
|
360
368
|
let first = true;
|
|
361
369
|
for (const row_i of rows) {
|
|
@@ -390,7 +398,8 @@ module.exports = {
|
|
|
390
398
|
let field_opts = [];
|
|
391
399
|
if (table) {
|
|
392
400
|
field_opts = table.fields
|
|
393
|
-
.filter((f) => f.type &&
|
|
401
|
+
.filter((f) => f.type &&
|
|
402
|
+
["String", "HTML", "JSON"].includes(typeof f.type === "string" ? f.type : f.type?.name))
|
|
394
403
|
.map((f) => f.name);
|
|
395
404
|
}
|
|
396
405
|
return [
|
|
@@ -488,6 +497,7 @@ module.exports = {
|
|
|
488
497
|
? await response.json()
|
|
489
498
|
: await response.text();
|
|
490
499
|
const saveResponse = isJSON &&
|
|
500
|
+
typeof field?.type !== "string" &&
|
|
491
501
|
(field?.type?.name === "String" || field?.type?.sql_name === "text")
|
|
492
502
|
? JSON.stringify(parsedResponse)
|
|
493
503
|
: parsedResponse;
|
|
@@ -508,7 +518,7 @@ module.exports = {
|
|
|
508
518
|
*/
|
|
509
519
|
description: "Find or create a direct message room for the user, redirect the page to this room",
|
|
510
520
|
configFields: async () => {
|
|
511
|
-
const views = await
|
|
521
|
+
const views = await view_1.default.find_all_views_where(({ viewrow }) => viewrow.viewtemplate === "Room");
|
|
512
522
|
const view_opts = views.map((v) => v.name);
|
|
513
523
|
return [
|
|
514
524
|
{
|
|
@@ -528,17 +538,17 @@ module.exports = {
|
|
|
528
538
|
* @param {object} opts.user
|
|
529
539
|
* @returns {Promise<object>}
|
|
530
540
|
*/
|
|
531
|
-
run: async ({ row, table, configuration: { viewname }, user }) => {
|
|
532
|
-
const view =
|
|
541
|
+
run: async ({ row, table, configuration: { viewname }, user, }) => {
|
|
542
|
+
const view = view_1.default.findOne({ name: viewname });
|
|
533
543
|
if (!view)
|
|
534
544
|
throw new Error(`In find_or_create_dm_room action, Room view ${viewname} does not exist`);
|
|
535
545
|
const { participant_field } = view.configuration;
|
|
536
546
|
const [part_table_name, part_key_to_room, part_user_field] = participant_field.split(".");
|
|
537
|
-
const roomtable =
|
|
538
|
-
const parttable =
|
|
547
|
+
const roomtable = table_1.default.findOne({ id: view.table_id });
|
|
548
|
+
const parttable = table_1.default.findOne({ name: part_table_name });
|
|
539
549
|
//find a room that has both participants
|
|
540
550
|
//select id from rooms r where uid1 in (select id from participants where...) and
|
|
541
|
-
const { rows } = await db.query(`with my_rooms as (select "${part_key_to_room}" from "${db.getTenantSchema()}"."${db.sqlsanitize(part_table_name)}" where "${part_user_field}" = $1)
|
|
551
|
+
const { rows } = await db.query(`with my_rooms as (select "${part_key_to_room}" from "${db.getTenantSchema()}"."${db.sqlsanitize(part_table_name)}" where "${part_user_field}" = $1)
|
|
542
552
|
select * from "${db.getTenantSchema()}"."${db.sqlsanitize(roomtable.name)}" r where r.id in (select "${part_key_to_room}" from my_rooms)
|
|
543
553
|
and $2 in (select "${part_user_field}" from "${db.getTenantSchema()}"."${db.sqlsanitize(part_table_name)}" where "${part_key_to_room}" = r.id)`, [user.id, row.id]);
|
|
544
554
|
if (rows.length > 0) {
|
|
@@ -630,17 +640,17 @@ module.exports = {
|
|
|
630
640
|
}
|
|
631
641
|
if (!table)
|
|
632
642
|
return [];
|
|
633
|
-
const views = await
|
|
643
|
+
const views = await view_1.default.find_table_views_where(table, ({ state_fields, viewtemplate, viewrow }) => !!(viewtemplate?.runMany || viewtemplate?.renderRows));
|
|
634
644
|
const view_opts = views.map((v) => v.name);
|
|
635
645
|
const fields = table.getFields();
|
|
636
646
|
const field_opts = fields
|
|
637
|
-
.filter((f) =>
|
|
647
|
+
.filter((f) => f.type_name === "String" || f.reftable_name === "users")
|
|
638
648
|
.map((f) => f.name);
|
|
639
649
|
const body_field_opts = fields
|
|
640
|
-
.filter((f) => f.
|
|
650
|
+
.filter((f) => f.type_name === "HTML" || f.type_name === "String")
|
|
641
651
|
.map((f) => f.name);
|
|
642
652
|
const confirm_field_opts = fields
|
|
643
|
-
.filter((f) => f.
|
|
653
|
+
.filter((f) => f.type_name === "Bool" || f.type_name === "Date")
|
|
644
654
|
.map((f) => f.name);
|
|
645
655
|
const attachment_opts = [""];
|
|
646
656
|
for (const field of fields) {
|
|
@@ -827,7 +837,9 @@ module.exports = {
|
|
|
827
837
|
if (field && field.type.name === "String")
|
|
828
838
|
to_addr = row[to_email_field];
|
|
829
839
|
else if (field && field.reftable_name === "users") {
|
|
830
|
-
const refuser = await
|
|
840
|
+
const refuser = await user_1.default.findOne({
|
|
841
|
+
id: row[to_email_field],
|
|
842
|
+
});
|
|
831
843
|
to_addr = refuser.email;
|
|
832
844
|
}
|
|
833
845
|
break;
|
|
@@ -837,13 +849,13 @@ module.exports = {
|
|
|
837
849
|
return;
|
|
838
850
|
}
|
|
839
851
|
const setBody = {};
|
|
840
|
-
if (body_type === "Text field") {
|
|
852
|
+
if (body_type === "Text field" && body_field) {
|
|
841
853
|
setBody.text = row[body_field];
|
|
842
854
|
}
|
|
843
|
-
else if (body_type === "HTML field") {
|
|
855
|
+
else if (body_type === "HTML field" && body_field) {
|
|
844
856
|
setBody.html = row[body_field];
|
|
845
857
|
}
|
|
846
|
-
else if (body_type === "MJML field") {
|
|
858
|
+
else if (body_type === "MJML field" && body_field) {
|
|
847
859
|
const mjml = row[body_field];
|
|
848
860
|
const html = mjml2html(mjml, { minify: true });
|
|
849
861
|
setBody.html = html.html;
|
|
@@ -859,7 +871,7 @@ module.exports = {
|
|
|
859
871
|
opts.locale = Object.values(cfgLangs).find((r) => r.name).locale;
|
|
860
872
|
}
|
|
861
873
|
}
|
|
862
|
-
const view = await
|
|
874
|
+
const view = await view_1.default.findOne({ name: viewname });
|
|
863
875
|
setBody.html = await viewToEmailHtml(view, {
|
|
864
876
|
[table.pk_name]: row[table.pk_name],
|
|
865
877
|
}, opts);
|
|
@@ -891,12 +903,12 @@ module.exports = {
|
|
|
891
903
|
if (confirm_field) {
|
|
892
904
|
const confirm_fld = table.getField(confirm_field);
|
|
893
905
|
if (sendres.accepted.length > 0) {
|
|
894
|
-
if (confirm_fld && confirm_fld.
|
|
906
|
+
if (confirm_fld && confirm_fld.type_name === "Date")
|
|
895
907
|
await table.updateRow({ [confirm_field]: new Date() }, row[table.pk_name]);
|
|
896
|
-
else if (confirm_fld && confirm_fld.
|
|
908
|
+
else if (confirm_fld && confirm_fld.type_name === "Bool")
|
|
897
909
|
await table.updateRow({ [confirm_field]: true }, row[table.pk_name]);
|
|
898
910
|
}
|
|
899
|
-
else if (confirm_fld && confirm_fld.
|
|
911
|
+
else if (confirm_fld && confirm_fld.type_name === "Bool") {
|
|
900
912
|
await table.updateRow({ [confirm_field]: false }, row[table.pk_name]);
|
|
901
913
|
}
|
|
902
914
|
}
|
|
@@ -908,7 +920,10 @@ module.exports = {
|
|
|
908
920
|
catch (e) {
|
|
909
921
|
if (confirm_field) {
|
|
910
922
|
const confirm_fld = table.getField(confirm_field);
|
|
911
|
-
if (confirm_fld &&
|
|
923
|
+
if (confirm_fld &&
|
|
924
|
+
(typeof confirm_fld.type === "string"
|
|
925
|
+
? confirm_fld.type === "Bool"
|
|
926
|
+
: confirm_fld.type?.name === "Bool"))
|
|
912
927
|
await table.updateRow({ [confirm_field]: false }, row[table.pk_name]);
|
|
913
928
|
throw e;
|
|
914
929
|
}
|
|
@@ -952,11 +967,11 @@ module.exports = {
|
|
|
952
967
|
* @param {object} opts.user
|
|
953
968
|
* @returns {Promise<object>}
|
|
954
969
|
*/
|
|
955
|
-
run: async ({ row, table, configuration: { joined_table }, user }) => {
|
|
970
|
+
run: async ({ row, table, configuration: { joined_table }, user, }) => {
|
|
956
971
|
if (!joined_table)
|
|
957
972
|
throw new Error(`Relation not specified in insert_joined_row action`);
|
|
958
973
|
const [join_table_name, join_field] = joined_table.split(".");
|
|
959
|
-
const joinTable =
|
|
974
|
+
const joinTable = table_1.default.findOne({ name: join_table_name });
|
|
960
975
|
if (!joinTable)
|
|
961
976
|
throw new Error(`Table ${join_table_name} not found in insert_joined_row action`);
|
|
962
977
|
const fields = joinTable.getFields();
|
|
@@ -992,7 +1007,7 @@ module.exports = {
|
|
|
992
1007
|
* @param {*} opts.user
|
|
993
1008
|
* @returns {Promise<object>}
|
|
994
1009
|
*/
|
|
995
|
-
run: async ({ row, table, user }) => {
|
|
1010
|
+
run: async ({ row, table, user, }) => {
|
|
996
1011
|
const newRow = { ...row };
|
|
997
1012
|
table.getFields();
|
|
998
1013
|
delete newRow[table.pk_name];
|
|
@@ -1018,7 +1033,7 @@ module.exports = {
|
|
|
1018
1033
|
*/
|
|
1019
1034
|
description: "Re-calculate the stored calculated fields for a table, optionally only for the triggering row",
|
|
1020
1035
|
configFields: async ({ table }) => {
|
|
1021
|
-
const tables = await
|
|
1036
|
+
const tables = await table_1.default.find({}, { cached: true });
|
|
1022
1037
|
return [
|
|
1023
1038
|
{
|
|
1024
1039
|
name: "table",
|
|
@@ -1051,12 +1066,13 @@ module.exports = {
|
|
|
1051
1066
|
* @param {object} opts.configuration
|
|
1052
1067
|
* @returns {Promise<void>}
|
|
1053
1068
|
*/
|
|
1054
|
-
run: async ({ table, row, configuration, user }) => {
|
|
1055
|
-
const table_for_recalc =
|
|
1069
|
+
run: async ({ table, row, configuration, user, }) => {
|
|
1070
|
+
const table_for_recalc = table_1.default.findOne({
|
|
1056
1071
|
name: configuration.table,
|
|
1057
1072
|
});
|
|
1058
1073
|
//intentionally omit await
|
|
1059
1074
|
if (configuration.only_triggering_row &&
|
|
1075
|
+
table &&
|
|
1060
1076
|
table.name === table_for_recalc?.name &&
|
|
1061
1077
|
row &&
|
|
1062
1078
|
row[table.pk_name]) {
|
|
@@ -1086,7 +1102,7 @@ module.exports = {
|
|
|
1086
1102
|
*/
|
|
1087
1103
|
description: "insert a row into any table, using a formula expression",
|
|
1088
1104
|
configFields: async ({ mode }) => {
|
|
1089
|
-
const tables = await
|
|
1105
|
+
const tables = await table_1.default.find({}, { cached: true });
|
|
1090
1106
|
return [
|
|
1091
1107
|
{
|
|
1092
1108
|
name: "table",
|
|
@@ -1136,7 +1152,7 @@ module.exports = {
|
|
|
1136
1152
|
...dollarizeObject(state),
|
|
1137
1153
|
});
|
|
1138
1154
|
const calcrow = await f(row || {}, user);
|
|
1139
|
-
const table_for_insert =
|
|
1155
|
+
const table_for_insert = table_1.default.findOne({ name: configuration.table });
|
|
1140
1156
|
const all_results = {};
|
|
1141
1157
|
const ids = [];
|
|
1142
1158
|
const upsertOne = async (row) => {
|
|
@@ -1181,7 +1197,7 @@ module.exports = {
|
|
|
1181
1197
|
*/
|
|
1182
1198
|
modify_row: {
|
|
1183
1199
|
description: "Modify the triggering row",
|
|
1184
|
-
configFields: async ({ mode, when_trigger }) => {
|
|
1200
|
+
configFields: async ({ mode, when_trigger, }) => {
|
|
1185
1201
|
return [
|
|
1186
1202
|
{
|
|
1187
1203
|
name: "row_expr",
|
|
@@ -1224,7 +1240,7 @@ module.exports = {
|
|
|
1224
1240
|
type: "String",
|
|
1225
1241
|
required: true,
|
|
1226
1242
|
attributes: {
|
|
1227
|
-
options: (await
|
|
1243
|
+
options: (await table_1.default.find()).map((t) => t.name),
|
|
1228
1244
|
showIf: { where: "Database" },
|
|
1229
1245
|
},
|
|
1230
1246
|
},
|
|
@@ -1246,7 +1262,7 @@ module.exports = {
|
|
|
1246
1262
|
},
|
|
1247
1263
|
requireRow: true,
|
|
1248
1264
|
run: async ({ row, table, configuration: { row_expr, where, select_table, query }, user, ...rest }) => {
|
|
1249
|
-
const f = get_async_expression_function(row_expr, table?.fields || Object.keys(row).map((k) => ({ name: k })), {
|
|
1265
|
+
const f = get_async_expression_function(row_expr, table?.fields || Object.keys(row || {}).map((k) => ({ name: k })), {
|
|
1250
1266
|
row: row || {},
|
|
1251
1267
|
user,
|
|
1252
1268
|
});
|
|
@@ -1258,7 +1274,7 @@ module.exports = {
|
|
|
1258
1274
|
return { set_fields: calcrow };
|
|
1259
1275
|
if (select_table && query) {
|
|
1260
1276
|
//get table
|
|
1261
|
-
const table =
|
|
1277
|
+
const table = table_1.default.findOne(select_table);
|
|
1262
1278
|
// evaluate query
|
|
1263
1279
|
const q = eval_expression(query, row, user, "Query expression in modify_row step");
|
|
1264
1280
|
const rows = await table.getRows(q);
|
|
@@ -1283,7 +1299,7 @@ module.exports = {
|
|
|
1283
1299
|
*/
|
|
1284
1300
|
description: "Modify the triggering row",
|
|
1285
1301
|
configFields: async ({ mode, when_trigger }) => {
|
|
1286
|
-
const tables = await
|
|
1302
|
+
const tables = await table_1.default.find({}, { cached: true });
|
|
1287
1303
|
return [
|
|
1288
1304
|
...(mode === "workflow"
|
|
1289
1305
|
? []
|
|
@@ -1322,7 +1338,7 @@ module.exports = {
|
|
|
1322
1338
|
return resultCollector;
|
|
1323
1339
|
}
|
|
1324
1340
|
const where = eval_expression(delete_where, row || {}, user, "recalculate_stored_fields where");
|
|
1325
|
-
const tbl =
|
|
1341
|
+
const tbl = table_1.default.findOne({ name: table_name });
|
|
1326
1342
|
await tbl.deleteRows(where, user, false, resultCollector);
|
|
1327
1343
|
return resultCollector;
|
|
1328
1344
|
},
|
|
@@ -1341,8 +1357,8 @@ module.exports = {
|
|
|
1341
1357
|
*/
|
|
1342
1358
|
description: "Navigation action",
|
|
1343
1359
|
configFields: async () => {
|
|
1344
|
-
const pages = await
|
|
1345
|
-
const views = await
|
|
1360
|
+
const pages = await page_1.default.find({}, { cached: true });
|
|
1361
|
+
const views = await view_1.default.find({}, { cached: true });
|
|
1346
1362
|
return [
|
|
1347
1363
|
{
|
|
1348
1364
|
name: "nav_action",
|
|
@@ -1473,7 +1489,7 @@ module.exports = {
|
|
|
1473
1489
|
showIf: { control_action: ["Goto step"] },
|
|
1474
1490
|
},
|
|
1475
1491
|
],
|
|
1476
|
-
run: async ({ row, user, configuration: { control_action, step } }) => {
|
|
1492
|
+
run: async ({ row, user, configuration: { control_action, step }, }) => {
|
|
1477
1493
|
switch (control_action) {
|
|
1478
1494
|
case "Halt steps":
|
|
1479
1495
|
return { halt_steps: true };
|
|
@@ -1539,7 +1555,7 @@ module.exports = {
|
|
|
1539
1555
|
: cfgFolder;
|
|
1540
1556
|
}
|
|
1541
1557
|
}
|
|
1542
|
-
const file = await
|
|
1558
|
+
const file = await file_1.default.from_req_files(req.files[field.name], user?.id, (field.attributes && +field.attributes.min_role_read) || 1, folder);
|
|
1543
1559
|
row[field.name] = file.path_to_serve;
|
|
1544
1560
|
processed = true;
|
|
1545
1561
|
}
|
|
@@ -1678,6 +1694,10 @@ module.exports = {
|
|
|
1678
1694
|
* @returns {Promise<object[]>}
|
|
1679
1695
|
*/
|
|
1680
1696
|
description: "Run arbitrary JavaScript code",
|
|
1697
|
+
configuration_summary: (cfg = {}) => {
|
|
1698
|
+
const where = cfg.run_where || "Server";
|
|
1699
|
+
return `Run arbitrary JavaScript code on ${where}`;
|
|
1700
|
+
},
|
|
1681
1701
|
configFormOptions: {
|
|
1682
1702
|
formStyle: "vert",
|
|
1683
1703
|
},
|
|
@@ -1783,6 +1803,10 @@ module.exports = {
|
|
|
1783
1803
|
* @returns {Promise<object[]>}
|
|
1784
1804
|
*/
|
|
1785
1805
|
description: "Run arbitrary JavaScript code from a String field",
|
|
1806
|
+
configuration_summary: (cfg = {}) => {
|
|
1807
|
+
const where = cfg.run_where || "Server";
|
|
1808
|
+
return `Run JavaScript from context field on ${where}`;
|
|
1809
|
+
},
|
|
1786
1810
|
configFields: async ({ table, mode }) => {
|
|
1787
1811
|
if (mode === "workflow")
|
|
1788
1812
|
return [
|
|
@@ -1801,15 +1825,15 @@ module.exports = {
|
|
|
1801
1825
|
},
|
|
1802
1826
|
];
|
|
1803
1827
|
const field_opts = table.fields
|
|
1804
|
-
.filter((f) => f.
|
|
1828
|
+
.filter((f) => f.type_name === "String")
|
|
1805
1829
|
.map((f) => f.name);
|
|
1806
1830
|
table.fields.forEach((f) => {
|
|
1807
1831
|
if (f.is_fkey && f.type !== "File") {
|
|
1808
|
-
const refTable =
|
|
1832
|
+
const refTable = table_1.default.findOne({ name: f.reftable_name });
|
|
1809
1833
|
if (!refTable)
|
|
1810
1834
|
throw new Error(`Unable to find table '${f.reftable_name}`);
|
|
1811
1835
|
field_opts.push(...refTable.fields
|
|
1812
|
-
.filter((jf) => jf.
|
|
1836
|
+
.filter((jf) => jf.type_name === "String")
|
|
1813
1837
|
.map((jf) => `${f.name}.${jf.name}`));
|
|
1814
1838
|
}
|
|
1815
1839
|
});
|
|
@@ -1847,7 +1871,7 @@ module.exports = {
|
|
|
1847
1871
|
return;
|
|
1848
1872
|
else {
|
|
1849
1873
|
const keyfield = table.getField(ref);
|
|
1850
|
-
const refTable =
|
|
1874
|
+
const refTable = table_1.default.findOne({ name: keyfield.reftable_name });
|
|
1851
1875
|
const refRow = await refTable.getRow({ [table.pk_name]: row[ref] });
|
|
1852
1876
|
code = refRow[target];
|
|
1853
1877
|
}
|
|
@@ -1859,7 +1883,7 @@ module.exports = {
|
|
|
1859
1883
|
...rest,
|
|
1860
1884
|
table,
|
|
1861
1885
|
row,
|
|
1862
|
-
configuration: { run_where, code },
|
|
1886
|
+
configuration: { run_where: run_where || "Server", code },
|
|
1863
1887
|
});
|
|
1864
1888
|
},
|
|
1865
1889
|
namespace: "Code",
|
|
@@ -1867,7 +1891,7 @@ module.exports = {
|
|
|
1867
1891
|
duplicate_row_prefill_edit: {
|
|
1868
1892
|
configFields: async ({ table }) => {
|
|
1869
1893
|
const fields = table ? table.getFields() : [];
|
|
1870
|
-
const views = await
|
|
1894
|
+
const views = await view_1.default.find_table_views_where(table, ({ viewtemplate, viewrow, state_fields }) => viewrow.viewtemplate === "Edit");
|
|
1871
1895
|
const fldOpts = fields.map((f) => ({
|
|
1872
1896
|
label: f.name,
|
|
1873
1897
|
name: f.name,
|
|
@@ -1886,7 +1910,7 @@ module.exports = {
|
|
|
1886
1910
|
},
|
|
1887
1911
|
disableInWorkflow: true,
|
|
1888
1912
|
requireRow: true,
|
|
1889
|
-
run: async ({ row, table, configuration: { viewname, ...flds }, user }) => {
|
|
1913
|
+
run: async ({ row, table, configuration: { viewname, ...flds }, user, }) => {
|
|
1890
1914
|
const qs = Object.entries(flds)
|
|
1891
1915
|
.map(([k, v]) => v && typeof row[k] !== "undefined"
|
|
1892
1916
|
? `${encodeURIComponent(k)}=${encodeURIComponent(row[k])}`
|
|
@@ -1917,9 +1941,9 @@ module.exports = {
|
|
|
1917
1941
|
},
|
|
1918
1942
|
},
|
|
1919
1943
|
],
|
|
1920
|
-
run: async ({ configuration: { language }, user, req, res }) => {
|
|
1944
|
+
run: async ({ configuration: { language }, user, req, res, }) => {
|
|
1921
1945
|
if (user?.id) {
|
|
1922
|
-
const u = await
|
|
1946
|
+
const u = await user_1.default.findForSession({ id: user.id });
|
|
1923
1947
|
await u.set_language(language);
|
|
1924
1948
|
req.login(u.session_object, function (err) {
|
|
1925
1949
|
if (!err) {
|
|
@@ -1951,7 +1975,7 @@ module.exports = {
|
|
|
1951
1975
|
*/
|
|
1952
1976
|
description: "Synchronize a database table with an external/provider table by copying rows from the external table",
|
|
1953
1977
|
configFields: async ({ table }) => {
|
|
1954
|
-
const tables = await
|
|
1978
|
+
const tables = await table_1.default.find_with_external();
|
|
1955
1979
|
const pk_options = {};
|
|
1956
1980
|
for (const table of tables) {
|
|
1957
1981
|
const fields = table.getFields();
|
|
@@ -2034,7 +2058,7 @@ module.exports = {
|
|
|
2034
2058
|
// https://stackoverflow.com/a/36504668/19839414
|
|
2035
2059
|
const set_diff = (a, b) => new Set([...a].filter((x) => !b.has(x)));
|
|
2036
2060
|
let set_intersect = (a, b) => new Set([...a].filter((x) => b.has(x)));
|
|
2037
|
-
const source_table =
|
|
2061
|
+
const source_table = table_1.default.findOne({ name: table_src });
|
|
2038
2062
|
if (!source_table)
|
|
2039
2063
|
return { error: "Source table not found" };
|
|
2040
2064
|
let q = {};
|
|
@@ -2043,7 +2067,7 @@ module.exports = {
|
|
|
2043
2067
|
const source_rows = await source_table.getRows(q);
|
|
2044
2068
|
if (!source_rows)
|
|
2045
2069
|
return { error: "No data received" };
|
|
2046
|
-
const table_for_insert =
|
|
2070
|
+
const table_for_insert = table_1.default.findOne({ name: table_dest });
|
|
2047
2071
|
const dest_rows = await table_for_insert.getRows({});
|
|
2048
2072
|
const srcPKfield = source_table.fields.find((f) => f.primary_key).name;
|
|
2049
2073
|
const src_pks = new Set(source_rows.map((r) => r[srcPKfield]));
|
|
@@ -2066,7 +2090,7 @@ module.exports = {
|
|
|
2066
2090
|
.join(",")}})`;
|
|
2067
2091
|
}
|
|
2068
2092
|
// new rows
|
|
2069
|
-
for (const newPK of set_diff(src_pks, dest_pks)) {
|
|
2093
|
+
for (const newPK of Array.from(set_diff(src_pks, dest_pks))) {
|
|
2070
2094
|
const srcRow = source_rows.find((r) => r[srcPKfield] === newPK);
|
|
2071
2095
|
const newRow = {
|
|
2072
2096
|
[pk_field]: newPK,
|
|
@@ -2077,10 +2101,10 @@ module.exports = {
|
|
|
2077
2101
|
// delete rows
|
|
2078
2102
|
if (delete_rows)
|
|
2079
2103
|
await table_for_insert.deleteRows({
|
|
2080
|
-
[pk_field]: { in:
|
|
2104
|
+
[pk_field]: { in: Array.from(set_diff(dest_pks, src_pks)) },
|
|
2081
2105
|
}, user);
|
|
2082
2106
|
//update existing
|
|
2083
|
-
for (const existPK of set_intersect(src_pks, dest_pks)) {
|
|
2107
|
+
for (const existPK of Array.from(set_intersect(src_pks, dest_pks))) {
|
|
2084
2108
|
const srcRow = source_rows.find((r) => r[srcPKfield] === existPK);
|
|
2085
2109
|
const newRow = {
|
|
2086
2110
|
[pk_field]: existPK,
|
|
@@ -2103,7 +2127,7 @@ module.exports = {
|
|
|
2103
2127
|
reload_embedded_view: {
|
|
2104
2128
|
description: "Reload an embedded view without full page reload",
|
|
2105
2129
|
configFields: async () => {
|
|
2106
|
-
const views = await
|
|
2130
|
+
const views = await view_1.default.find({});
|
|
2107
2131
|
return [
|
|
2108
2132
|
{
|
|
2109
2133
|
name: "view",
|
|
@@ -2234,7 +2258,7 @@ module.exports = {
|
|
|
2234
2258
|
options: ["Client page", "Server"],
|
|
2235
2259
|
},
|
|
2236
2260
|
],
|
|
2237
|
-
run: async ({ configuration: { seconds, sleep_where } }) => {
|
|
2261
|
+
run: async ({ configuration: { seconds, sleep_where }, }) => {
|
|
2238
2262
|
if (sleep_where === "Server") {
|
|
2239
2263
|
await sleep((seconds || 0) * 1000);
|
|
2240
2264
|
return;
|
|
@@ -2250,7 +2274,7 @@ module.exports = {
|
|
|
2250
2274
|
run: async ({ user, req }) => {
|
|
2251
2275
|
if (!user?.id)
|
|
2252
2276
|
return;
|
|
2253
|
-
const u = await
|
|
2277
|
+
const u = await user_1.default.findOne({ id: user.id });
|
|
2254
2278
|
if (!u)
|
|
2255
2279
|
return;
|
|
2256
2280
|
await u.relogin(req);
|
|
@@ -2296,14 +2320,14 @@ module.exports = {
|
|
|
2296
2320
|
? { id: user_spec }
|
|
2297
2321
|
: typeof user_spec === "object"
|
|
2298
2322
|
? user_spec
|
|
2299
|
-
:
|
|
2323
|
+
: user_1.default.valid_email(user_spec)
|
|
2300
2324
|
? { email: user_spec }
|
|
2301
2325
|
: user_spec === "*"
|
|
2302
2326
|
? {}
|
|
2303
2327
|
: eval_expression(user_spec, row || {}, user, "Notify user user where");
|
|
2304
|
-
const users = await
|
|
2328
|
+
const users = await user_1.default.find(user_where);
|
|
2305
2329
|
for (const user of users) {
|
|
2306
|
-
await
|
|
2330
|
+
await notification_1.default.create({
|
|
2307
2331
|
title: interpolate(title, row, user, "notify_user title"),
|
|
2308
2332
|
body: interpolate(body, row, user, "notify_user body"),
|
|
2309
2333
|
link: interpolate(link, row, user, "notify_user link"),
|
|
@@ -2316,13 +2340,13 @@ module.exports = {
|
|
|
2316
2340
|
convert_session_to_user: {
|
|
2317
2341
|
description: "Convert session id fields to user key fields on a table on Login events",
|
|
2318
2342
|
configFields: async ({ table }) => {
|
|
2319
|
-
const tables = await
|
|
2343
|
+
const tables = await table_1.default.find_with_external();
|
|
2320
2344
|
const sess_options = {};
|
|
2321
2345
|
const user_options = {};
|
|
2322
2346
|
for (const table of tables) {
|
|
2323
2347
|
const fields = table.getFields();
|
|
2324
2348
|
sess_options[table.name] = fields
|
|
2325
|
-
.filter((f) => f.
|
|
2349
|
+
.filter((f) => f.type_name === "String")
|
|
2326
2350
|
.map((f) => f.name);
|
|
2327
2351
|
user_options[table.name] = fields
|
|
2328
2352
|
.filter((f) => f.reftable_name === "users")
|
|
@@ -2361,7 +2385,7 @@ module.exports = {
|
|
|
2361
2385
|
run: async ({ row, configuration: { table_name, session_field, user_field }, user, }) => {
|
|
2362
2386
|
if (!row?.old_session_id || !user || !session_field || !user_field)
|
|
2363
2387
|
return;
|
|
2364
|
-
const table =
|
|
2388
|
+
const table = table_1.default.findOne({ name: table_name });
|
|
2365
2389
|
const rows = await table.getRows({
|
|
2366
2390
|
[session_field]: row.old_session_id,
|
|
2367
2391
|
[user_field]: null,
|
|
@@ -2374,17 +2398,17 @@ module.exports = {
|
|
|
2374
2398
|
},
|
|
2375
2399
|
train_model_instance: {
|
|
2376
2400
|
description: "Train a model instance",
|
|
2377
|
-
disableIf: () => !
|
|
2401
|
+
disableIf: () => !model_1.default.has_templates,
|
|
2378
2402
|
configFields: async () => {
|
|
2379
|
-
const models = await
|
|
2403
|
+
const models = await model_1.default.find({});
|
|
2380
2404
|
const explainers = {};
|
|
2381
2405
|
for (const model of models) {
|
|
2382
2406
|
try {
|
|
2383
|
-
const table =
|
|
2407
|
+
const table = table_1.default.findOne({ id: model.table_id });
|
|
2384
2408
|
if (!model.templateObj)
|
|
2385
2409
|
continue;
|
|
2386
2410
|
const hyperparameter_fields = model.templateObj.hyperparameter_fields?.({
|
|
2387
|
-
table,
|
|
2411
|
+
table: table,
|
|
2388
2412
|
...model,
|
|
2389
2413
|
}) || [];
|
|
2390
2414
|
if (hyperparameter_fields.length)
|
|
@@ -2403,7 +2427,7 @@ module.exports = {
|
|
|
2403
2427
|
input_type: "select",
|
|
2404
2428
|
required: true,
|
|
2405
2429
|
options: models.map((model) => ({
|
|
2406
|
-
label: `${model.name} [${model.modelpattern} on ${
|
|
2430
|
+
label: `${model.name} [${model.modelpattern} on ${table_1.default.findOne({ id: model.table_id }).name}]`,
|
|
2407
2431
|
value: model.id,
|
|
2408
2432
|
})),
|
|
2409
2433
|
attributes: {
|
|
@@ -2447,7 +2471,7 @@ module.exports = {
|
|
|
2447
2471
|
const hpars = hyperparameters
|
|
2448
2472
|
? eval_expression(hyperparameters, row || {}, user, "train_model_instance hyperparameters")
|
|
2449
2473
|
: {};
|
|
2450
|
-
const model = await
|
|
2474
|
+
const model = await model_1.default.findOne({ id: model_id });
|
|
2451
2475
|
if (!model)
|
|
2452
2476
|
throw new Error("model not found");
|
|
2453
2477
|
const inst = await model.train_instance(use_instance_name, hpars, state);
|
|
@@ -2495,7 +2519,9 @@ module.exports = {
|
|
|
2495
2519
|
filepath = row[file_field];
|
|
2496
2520
|
if (!filepath)
|
|
2497
2521
|
return;
|
|
2498
|
-
const file = await
|
|
2522
|
+
const file = await file_1.default.findOne(filepath);
|
|
2523
|
+
if (!file)
|
|
2524
|
+
throw new Error("File not found");
|
|
2499
2525
|
return {
|
|
2500
2526
|
download: {
|
|
2501
2527
|
filename: file.filename,
|