@saltcorn/data 1.6.0-alpha.7 → 1.6.0-alpha.9
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 -1656
- package/dist/base-plugin/actions.d.ts.map +1 -1
- package/dist/base-plugin/actions.js +122 -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 -1293
- 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 +292 -349
- 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 +86 -82
- package/dist/base-plugin/viewtemplates/filter.js.map +1 -1
- package/dist/base-plugin/viewtemplates/list.d.ts +40 -115
- package/dist/base-plugin/viewtemplates/list.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/list.js +154 -168
- 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 -133
- package/dist/base-plugin/viewtemplates/show.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/show.js +72 -182
- 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/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/model-helper.d.ts +4 -16
- package/dist/model-helper.d.ts.map +1 -1
- package/dist/model-helper.js +3 -3
- 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/plugin-helper.d.ts.map +1 -1
- package/dist/plugin-helper.js +4 -0
- package/dist/plugin-helper.js.map +1 -1
- package/dist/plugin-testing.d.ts +3 -63
- package/dist/plugin-testing.d.ts.map +1 -1
- package/dist/plugin-testing.js +34 -15
- package/dist/plugin-testing.js.map +1 -1
- package/dist/standard-menu.d.ts.map +1 -1
- package/dist/standard-menu.js +15 -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 +5 -4
- package/dist/viewable_fields.d.ts.map +1 -1
- package/dist/viewable_fields.js +12 -6
- package/dist/viewable_fields.js.map +1 -1
- package/dist/web-mobile-commons.d.ts.map +1 -1
- package/dist/web-mobile-commons.js +1 -0
- 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
|
}
|
|
@@ -1809,15 +1825,15 @@ module.exports = {
|
|
|
1809
1825
|
},
|
|
1810
1826
|
];
|
|
1811
1827
|
const field_opts = table.fields
|
|
1812
|
-
.filter((f) => f.
|
|
1828
|
+
.filter((f) => f.type_name === "String")
|
|
1813
1829
|
.map((f) => f.name);
|
|
1814
1830
|
table.fields.forEach((f) => {
|
|
1815
1831
|
if (f.is_fkey && f.type !== "File") {
|
|
1816
|
-
const refTable =
|
|
1832
|
+
const refTable = table_1.default.findOne({ name: f.reftable_name });
|
|
1817
1833
|
if (!refTable)
|
|
1818
1834
|
throw new Error(`Unable to find table '${f.reftable_name}`);
|
|
1819
1835
|
field_opts.push(...refTable.fields
|
|
1820
|
-
.filter((jf) => jf.
|
|
1836
|
+
.filter((jf) => jf.type_name === "String")
|
|
1821
1837
|
.map((jf) => `${f.name}.${jf.name}`));
|
|
1822
1838
|
}
|
|
1823
1839
|
});
|
|
@@ -1855,7 +1871,7 @@ module.exports = {
|
|
|
1855
1871
|
return;
|
|
1856
1872
|
else {
|
|
1857
1873
|
const keyfield = table.getField(ref);
|
|
1858
|
-
const refTable =
|
|
1874
|
+
const refTable = table_1.default.findOne({ name: keyfield.reftable_name });
|
|
1859
1875
|
const refRow = await refTable.getRow({ [table.pk_name]: row[ref] });
|
|
1860
1876
|
code = refRow[target];
|
|
1861
1877
|
}
|
|
@@ -1867,7 +1883,7 @@ module.exports = {
|
|
|
1867
1883
|
...rest,
|
|
1868
1884
|
table,
|
|
1869
1885
|
row,
|
|
1870
|
-
configuration: { run_where, code },
|
|
1886
|
+
configuration: { run_where: run_where || "Server", code },
|
|
1871
1887
|
});
|
|
1872
1888
|
},
|
|
1873
1889
|
namespace: "Code",
|
|
@@ -1875,7 +1891,7 @@ module.exports = {
|
|
|
1875
1891
|
duplicate_row_prefill_edit: {
|
|
1876
1892
|
configFields: async ({ table }) => {
|
|
1877
1893
|
const fields = table ? table.getFields() : [];
|
|
1878
|
-
const views = await
|
|
1894
|
+
const views = await view_1.default.find_table_views_where(table, ({ viewtemplate, viewrow, state_fields }) => viewrow.viewtemplate === "Edit");
|
|
1879
1895
|
const fldOpts = fields.map((f) => ({
|
|
1880
1896
|
label: f.name,
|
|
1881
1897
|
name: f.name,
|
|
@@ -1894,7 +1910,7 @@ module.exports = {
|
|
|
1894
1910
|
},
|
|
1895
1911
|
disableInWorkflow: true,
|
|
1896
1912
|
requireRow: true,
|
|
1897
|
-
run: async ({ row, table, configuration: { viewname, ...flds }, user }) => {
|
|
1913
|
+
run: async ({ row, table, configuration: { viewname, ...flds }, user, }) => {
|
|
1898
1914
|
const qs = Object.entries(flds)
|
|
1899
1915
|
.map(([k, v]) => v && typeof row[k] !== "undefined"
|
|
1900
1916
|
? `${encodeURIComponent(k)}=${encodeURIComponent(row[k])}`
|
|
@@ -1925,9 +1941,9 @@ module.exports = {
|
|
|
1925
1941
|
},
|
|
1926
1942
|
},
|
|
1927
1943
|
],
|
|
1928
|
-
run: async ({ configuration: { language }, user, req, res }) => {
|
|
1944
|
+
run: async ({ configuration: { language }, user, req, res, }) => {
|
|
1929
1945
|
if (user?.id) {
|
|
1930
|
-
const u = await
|
|
1946
|
+
const u = await user_1.default.findForSession({ id: user.id });
|
|
1931
1947
|
await u.set_language(language);
|
|
1932
1948
|
req.login(u.session_object, function (err) {
|
|
1933
1949
|
if (!err) {
|
|
@@ -1959,7 +1975,7 @@ module.exports = {
|
|
|
1959
1975
|
*/
|
|
1960
1976
|
description: "Synchronize a database table with an external/provider table by copying rows from the external table",
|
|
1961
1977
|
configFields: async ({ table }) => {
|
|
1962
|
-
const tables = await
|
|
1978
|
+
const tables = await table_1.default.find_with_external();
|
|
1963
1979
|
const pk_options = {};
|
|
1964
1980
|
for (const table of tables) {
|
|
1965
1981
|
const fields = table.getFields();
|
|
@@ -2042,7 +2058,7 @@ module.exports = {
|
|
|
2042
2058
|
// https://stackoverflow.com/a/36504668/19839414
|
|
2043
2059
|
const set_diff = (a, b) => new Set([...a].filter((x) => !b.has(x)));
|
|
2044
2060
|
let set_intersect = (a, b) => new Set([...a].filter((x) => b.has(x)));
|
|
2045
|
-
const source_table =
|
|
2061
|
+
const source_table = table_1.default.findOne({ name: table_src });
|
|
2046
2062
|
if (!source_table)
|
|
2047
2063
|
return { error: "Source table not found" };
|
|
2048
2064
|
let q = {};
|
|
@@ -2051,7 +2067,7 @@ module.exports = {
|
|
|
2051
2067
|
const source_rows = await source_table.getRows(q);
|
|
2052
2068
|
if (!source_rows)
|
|
2053
2069
|
return { error: "No data received" };
|
|
2054
|
-
const table_for_insert =
|
|
2070
|
+
const table_for_insert = table_1.default.findOne({ name: table_dest });
|
|
2055
2071
|
const dest_rows = await table_for_insert.getRows({});
|
|
2056
2072
|
const srcPKfield = source_table.fields.find((f) => f.primary_key).name;
|
|
2057
2073
|
const src_pks = new Set(source_rows.map((r) => r[srcPKfield]));
|
|
@@ -2074,7 +2090,7 @@ module.exports = {
|
|
|
2074
2090
|
.join(",")}})`;
|
|
2075
2091
|
}
|
|
2076
2092
|
// new rows
|
|
2077
|
-
for (const newPK of set_diff(src_pks, dest_pks)) {
|
|
2093
|
+
for (const newPK of Array.from(set_diff(src_pks, dest_pks))) {
|
|
2078
2094
|
const srcRow = source_rows.find((r) => r[srcPKfield] === newPK);
|
|
2079
2095
|
const newRow = {
|
|
2080
2096
|
[pk_field]: newPK,
|
|
@@ -2085,10 +2101,10 @@ module.exports = {
|
|
|
2085
2101
|
// delete rows
|
|
2086
2102
|
if (delete_rows)
|
|
2087
2103
|
await table_for_insert.deleteRows({
|
|
2088
|
-
[pk_field]: { in:
|
|
2104
|
+
[pk_field]: { in: Array.from(set_diff(dest_pks, src_pks)) },
|
|
2089
2105
|
}, user);
|
|
2090
2106
|
//update existing
|
|
2091
|
-
for (const existPK of set_intersect(src_pks, dest_pks)) {
|
|
2107
|
+
for (const existPK of Array.from(set_intersect(src_pks, dest_pks))) {
|
|
2092
2108
|
const srcRow = source_rows.find((r) => r[srcPKfield] === existPK);
|
|
2093
2109
|
const newRow = {
|
|
2094
2110
|
[pk_field]: existPK,
|
|
@@ -2111,7 +2127,7 @@ module.exports = {
|
|
|
2111
2127
|
reload_embedded_view: {
|
|
2112
2128
|
description: "Reload an embedded view without full page reload",
|
|
2113
2129
|
configFields: async () => {
|
|
2114
|
-
const views = await
|
|
2130
|
+
const views = await view_1.default.find({});
|
|
2115
2131
|
return [
|
|
2116
2132
|
{
|
|
2117
2133
|
name: "view",
|
|
@@ -2242,7 +2258,7 @@ module.exports = {
|
|
|
2242
2258
|
options: ["Client page", "Server"],
|
|
2243
2259
|
},
|
|
2244
2260
|
],
|
|
2245
|
-
run: async ({ configuration: { seconds, sleep_where } }) => {
|
|
2261
|
+
run: async ({ configuration: { seconds, sleep_where }, }) => {
|
|
2246
2262
|
if (sleep_where === "Server") {
|
|
2247
2263
|
await sleep((seconds || 0) * 1000);
|
|
2248
2264
|
return;
|
|
@@ -2258,7 +2274,7 @@ module.exports = {
|
|
|
2258
2274
|
run: async ({ user, req }) => {
|
|
2259
2275
|
if (!user?.id)
|
|
2260
2276
|
return;
|
|
2261
|
-
const u = await
|
|
2277
|
+
const u = await user_1.default.findOne({ id: user.id });
|
|
2262
2278
|
if (!u)
|
|
2263
2279
|
return;
|
|
2264
2280
|
await u.relogin(req);
|
|
@@ -2304,14 +2320,14 @@ module.exports = {
|
|
|
2304
2320
|
? { id: user_spec }
|
|
2305
2321
|
: typeof user_spec === "object"
|
|
2306
2322
|
? user_spec
|
|
2307
|
-
:
|
|
2323
|
+
: user_1.default.valid_email(user_spec)
|
|
2308
2324
|
? { email: user_spec }
|
|
2309
2325
|
: user_spec === "*"
|
|
2310
2326
|
? {}
|
|
2311
2327
|
: eval_expression(user_spec, row || {}, user, "Notify user user where");
|
|
2312
|
-
const users = await
|
|
2328
|
+
const users = await user_1.default.find(user_where);
|
|
2313
2329
|
for (const user of users) {
|
|
2314
|
-
await
|
|
2330
|
+
await notification_1.default.create({
|
|
2315
2331
|
title: interpolate(title, row, user, "notify_user title"),
|
|
2316
2332
|
body: interpolate(body, row, user, "notify_user body"),
|
|
2317
2333
|
link: interpolate(link, row, user, "notify_user link"),
|
|
@@ -2324,13 +2340,13 @@ module.exports = {
|
|
|
2324
2340
|
convert_session_to_user: {
|
|
2325
2341
|
description: "Convert session id fields to user key fields on a table on Login events",
|
|
2326
2342
|
configFields: async ({ table }) => {
|
|
2327
|
-
const tables = await
|
|
2343
|
+
const tables = await table_1.default.find_with_external();
|
|
2328
2344
|
const sess_options = {};
|
|
2329
2345
|
const user_options = {};
|
|
2330
2346
|
for (const table of tables) {
|
|
2331
2347
|
const fields = table.getFields();
|
|
2332
2348
|
sess_options[table.name] = fields
|
|
2333
|
-
.filter((f) => f.
|
|
2349
|
+
.filter((f) => f.type_name === "String")
|
|
2334
2350
|
.map((f) => f.name);
|
|
2335
2351
|
user_options[table.name] = fields
|
|
2336
2352
|
.filter((f) => f.reftable_name === "users")
|
|
@@ -2369,7 +2385,7 @@ module.exports = {
|
|
|
2369
2385
|
run: async ({ row, configuration: { table_name, session_field, user_field }, user, }) => {
|
|
2370
2386
|
if (!row?.old_session_id || !user || !session_field || !user_field)
|
|
2371
2387
|
return;
|
|
2372
|
-
const table =
|
|
2388
|
+
const table = table_1.default.findOne({ name: table_name });
|
|
2373
2389
|
const rows = await table.getRows({
|
|
2374
2390
|
[session_field]: row.old_session_id,
|
|
2375
2391
|
[user_field]: null,
|
|
@@ -2382,17 +2398,17 @@ module.exports = {
|
|
|
2382
2398
|
},
|
|
2383
2399
|
train_model_instance: {
|
|
2384
2400
|
description: "Train a model instance",
|
|
2385
|
-
disableIf: () => !
|
|
2401
|
+
disableIf: () => !model_1.default.has_templates,
|
|
2386
2402
|
configFields: async () => {
|
|
2387
|
-
const models = await
|
|
2403
|
+
const models = await model_1.default.find({});
|
|
2388
2404
|
const explainers = {};
|
|
2389
2405
|
for (const model of models) {
|
|
2390
2406
|
try {
|
|
2391
|
-
const table =
|
|
2407
|
+
const table = table_1.default.findOne({ id: model.table_id });
|
|
2392
2408
|
if (!model.templateObj)
|
|
2393
2409
|
continue;
|
|
2394
2410
|
const hyperparameter_fields = model.templateObj.hyperparameter_fields?.({
|
|
2395
|
-
table,
|
|
2411
|
+
table: table,
|
|
2396
2412
|
...model,
|
|
2397
2413
|
}) || [];
|
|
2398
2414
|
if (hyperparameter_fields.length)
|
|
@@ -2411,7 +2427,7 @@ module.exports = {
|
|
|
2411
2427
|
input_type: "select",
|
|
2412
2428
|
required: true,
|
|
2413
2429
|
options: models.map((model) => ({
|
|
2414
|
-
label: `${model.name} [${model.modelpattern} on ${
|
|
2430
|
+
label: `${model.name} [${model.modelpattern} on ${table_1.default.findOne({ id: model.table_id }).name}]`,
|
|
2415
2431
|
value: model.id,
|
|
2416
2432
|
})),
|
|
2417
2433
|
attributes: {
|
|
@@ -2455,7 +2471,7 @@ module.exports = {
|
|
|
2455
2471
|
const hpars = hyperparameters
|
|
2456
2472
|
? eval_expression(hyperparameters, row || {}, user, "train_model_instance hyperparameters")
|
|
2457
2473
|
: {};
|
|
2458
|
-
const model = await
|
|
2474
|
+
const model = await model_1.default.findOne({ id: model_id });
|
|
2459
2475
|
if (!model)
|
|
2460
2476
|
throw new Error("model not found");
|
|
2461
2477
|
const inst = await model.train_instance(use_instance_name, hpars, state);
|
|
@@ -2503,7 +2519,9 @@ module.exports = {
|
|
|
2503
2519
|
filepath = row[file_field];
|
|
2504
2520
|
if (!filepath)
|
|
2505
2521
|
return;
|
|
2506
|
-
const file = await
|
|
2522
|
+
const file = await file_1.default.findOne(filepath);
|
|
2523
|
+
if (!file)
|
|
2524
|
+
throw new Error("File not found");
|
|
2507
2525
|
return {
|
|
2508
2526
|
download: {
|
|
2509
2527
|
filename: file.filename,
|