@saltcorn/data 1.6.0-beta.1 → 1.6.0-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/dist/base-plugin/actions.d.ts +191 -62
  2. package/dist/base-plugin/actions.d.ts.map +1 -1
  3. package/dist/base-plugin/actions.js +164 -66
  4. package/dist/base-plugin/actions.js.map +1 -1
  5. package/dist/base-plugin/fieldviews.d.ts +1 -0
  6. package/dist/base-plugin/fieldviews.d.ts.map +1 -1
  7. package/dist/base-plugin/fieldviews.js +5 -2
  8. package/dist/base-plugin/fieldviews.js.map +1 -1
  9. package/dist/base-plugin/fileviews.d.ts +6 -0
  10. package/dist/base-plugin/fileviews.d.ts.map +1 -1
  11. package/dist/base-plugin/fileviews.js +14 -0
  12. package/dist/base-plugin/fileviews.js.map +1 -1
  13. package/dist/base-plugin/index.d.ts +210 -65
  14. package/dist/base-plugin/index.d.ts.map +1 -1
  15. package/dist/base-plugin/types.d.ts +19 -9
  16. package/dist/base-plugin/types.d.ts.map +1 -1
  17. package/dist/base-plugin/types.js +41 -12
  18. package/dist/base-plugin/types.js.map +1 -1
  19. package/dist/base-plugin/viewtemplates/edit.d.ts.map +1 -1
  20. package/dist/base-plugin/viewtemplates/edit.js +12 -11
  21. package/dist/base-plugin/viewtemplates/edit.js.map +1 -1
  22. package/dist/base-plugin/viewtemplates/feed.d.ts.map +1 -1
  23. package/dist/base-plugin/viewtemplates/feed.js +1 -1
  24. package/dist/base-plugin/viewtemplates/feed.js.map +1 -1
  25. package/dist/base-plugin/viewtemplates/filter.js +2 -2
  26. package/dist/base-plugin/viewtemplates/filter.js.map +1 -1
  27. package/dist/base-plugin/viewtemplates/list.d.ts.map +1 -1
  28. package/dist/base-plugin/viewtemplates/list.js +14 -1
  29. package/dist/base-plugin/viewtemplates/list.js.map +1 -1
  30. package/dist/base-plugin/viewtemplates/room.d.ts.map +1 -1
  31. package/dist/base-plugin/viewtemplates/room.js +1 -1
  32. package/dist/base-plugin/viewtemplates/room.js.map +1 -1
  33. package/dist/base-plugin/viewtemplates/show.d.ts.map +1 -1
  34. package/dist/db/fixtures.d.ts.map +1 -1
  35. package/dist/db/fixtures.js +31 -1
  36. package/dist/db/fixtures.js.map +1 -1
  37. package/dist/db/state.d.ts +5 -3
  38. package/dist/db/state.d.ts.map +1 -1
  39. package/dist/db/state.js +36 -12
  40. package/dist/db/state.js.map +1 -1
  41. package/dist/migrate.d.ts.map +1 -1
  42. package/dist/migrate.js +3 -1
  43. package/dist/migrate.js.map +1 -1
  44. package/dist/migrations/202604091531.d.ts +2 -0
  45. package/dist/migrations/202604091531.d.ts.map +1 -0
  46. package/dist/migrations/202604091531.js +9 -0
  47. package/dist/migrations/202604091531.js.map +1 -0
  48. package/dist/migrations/202604111200.d.ts +2 -0
  49. package/dist/migrations/202604111200.d.ts.map +1 -0
  50. package/dist/migrations/202604111200.js +15 -0
  51. package/dist/migrations/202604111200.js.map +1 -0
  52. package/dist/migrations/202604141200.d.ts +2 -0
  53. package/dist/migrations/202604141200.d.ts.map +1 -0
  54. package/dist/migrations/202604141200.js +14 -0
  55. package/dist/migrations/202604141200.js.map +1 -0
  56. package/dist/mobile-mocks/node/fs/promises.d.ts +1 -0
  57. package/dist/mobile-mocks/node/fs/promises.d.ts.map +1 -1
  58. package/dist/mobile-mocks/node/fs/promises.js +4 -0
  59. package/dist/mobile-mocks/node/fs/promises.js.map +1 -1
  60. package/dist/mobile-mocks/node/fs.d.ts +2 -0
  61. package/dist/mobile-mocks/node/fs.d.ts.map +1 -1
  62. package/dist/mobile-mocks/node/fs.js +36 -0
  63. package/dist/mobile-mocks/node/fs.js.map +1 -1
  64. package/dist/mobile-mocks/npm/npm-registry-fetch.d.ts +3 -0
  65. package/dist/mobile-mocks/npm/npm-registry-fetch.d.ts.map +1 -0
  66. package/dist/mobile-mocks/npm/npm-registry-fetch.js +3 -0
  67. package/dist/mobile-mocks/npm/npm-registry-fetch.js.map +1 -0
  68. package/dist/mobile-mocks/saltcorn/admin-models-tenant.d.ts +1 -0
  69. package/dist/mobile-mocks/saltcorn/admin-models-tenant.d.ts.map +1 -0
  70. package/dist/mobile-mocks/saltcorn/admin-models-tenant.js +2 -0
  71. package/dist/mobile-mocks/saltcorn/admin-models-tenant.js.map +1 -0
  72. package/dist/mobile-mocks/saltcorn/plugins-loader-plugin-installer.d.ts +1 -0
  73. package/dist/mobile-mocks/saltcorn/plugins-loader-plugin-installer.d.ts.map +1 -0
  74. package/dist/mobile-mocks/saltcorn/plugins-loader-plugin-installer.js +2 -0
  75. package/dist/mobile-mocks/saltcorn/plugins-loader-plugin-installer.js.map +1 -0
  76. package/dist/mobile-mocks/saltcorn/plugins-loader-stable-versioning.d.ts +1 -0
  77. package/dist/mobile-mocks/saltcorn/plugins-loader-stable-versioning.d.ts.map +1 -0
  78. package/dist/mobile-mocks/saltcorn/plugins-loader-stable-versioning.js +2 -0
  79. package/dist/mobile-mocks/saltcorn/plugins-loader-stable-versioning.js.map +1 -0
  80. package/dist/models/config.d.ts.map +1 -1
  81. package/dist/models/config.js +46 -1
  82. package/dist/models/config.js.map +1 -1
  83. package/dist/models/discovery.d.ts +14 -0
  84. package/dist/models/discovery.d.ts.map +1 -1
  85. package/dist/models/discovery.js +63 -0
  86. package/dist/models/discovery.js.map +1 -1
  87. package/dist/models/expression.d.ts +7 -4
  88. package/dist/models/expression.d.ts.map +1 -1
  89. package/dist/models/expression.js +28 -14
  90. package/dist/models/expression.js.map +1 -1
  91. package/dist/models/field.d.ts.map +1 -1
  92. package/dist/models/field.js +39 -9
  93. package/dist/models/field.js.map +1 -1
  94. package/dist/models/index.d.ts +12 -2
  95. package/dist/models/index.d.ts.map +1 -1
  96. package/dist/models/index.js +1 -1
  97. package/dist/models/index.js.map +1 -1
  98. package/dist/models/page.d.ts +1 -0
  99. package/dist/models/page.d.ts.map +1 -1
  100. package/dist/models/page.js +36 -20
  101. package/dist/models/page.js.map +1 -1
  102. package/dist/models/plugin.d.ts +57 -0
  103. package/dist/models/plugin.d.ts.map +1 -1
  104. package/dist/models/plugin.js +322 -1
  105. package/dist/models/plugin.js.map +1 -1
  106. package/dist/models/scheduler.d.ts.map +1 -1
  107. package/dist/models/scheduler.js +15 -5
  108. package/dist/models/scheduler.js.map +1 -1
  109. package/dist/models/table.d.ts +3 -1
  110. package/dist/models/table.d.ts.map +1 -1
  111. package/dist/models/table.js +148 -44
  112. package/dist/models/table.js.map +1 -1
  113. package/dist/models/trigger.d.ts +3 -1
  114. package/dist/models/trigger.d.ts.map +1 -1
  115. package/dist/models/trigger.js +18 -4
  116. package/dist/models/trigger.js.map +1 -1
  117. package/dist/models/user.d.ts.map +1 -1
  118. package/dist/models/user.js +2 -1
  119. package/dist/models/user.js.map +1 -1
  120. package/dist/models/view.d.ts +1 -0
  121. package/dist/models/view.d.ts.map +1 -1
  122. package/dist/models/view.js +74 -14
  123. package/dist/models/view.js.map +1 -1
  124. package/dist/models/workflow_run.d.ts.map +1 -1
  125. package/dist/models/workflow_run.js +3 -2
  126. package/dist/models/workflow_run.js.map +1 -1
  127. package/dist/models/workflow_step.d.ts +1 -1
  128. package/dist/models/workflow_step.d.ts.map +1 -1
  129. package/dist/models/workflow_step.js +2 -1
  130. package/dist/models/workflow_step.js.map +1 -1
  131. package/dist/plugin-helper.d.ts +3 -11
  132. package/dist/plugin-helper.d.ts.map +1 -1
  133. package/dist/plugin-helper.js +102 -60
  134. package/dist/plugin-helper.js.map +1 -1
  135. package/dist/standard-menu.d.ts.map +1 -1
  136. package/dist/standard-menu.js +19 -0
  137. package/dist/standard-menu.js.map +1 -1
  138. package/dist/tests/remote_query_helper.js +1 -1
  139. package/dist/tests/remote_query_helper.js.map +1 -1
  140. package/dist/utils.d.ts +15 -0
  141. package/dist/utils.d.ts.map +1 -1
  142. package/dist/utils.js +102 -5
  143. package/dist/utils.js.map +1 -1
  144. package/dist/viewable_fields.d.ts +1 -1
  145. package/dist/viewable_fields.d.ts.map +1 -1
  146. package/dist/viewable_fields.js +48 -9
  147. package/dist/viewable_fields.js.map +1 -1
  148. package/dist/web-mobile-commons.d.ts.map +1 -1
  149. package/dist/web-mobile-commons.js +2 -1
  150. package/dist/web-mobile-commons.js.map +1 -1
  151. package/package.json +12 -9
  152. package/webpack.config.js +11 -0
@@ -62,11 +62,13 @@ const emit_to_client = (user) => (data, userIds) => {
62
62
  }
63
63
  const safeIds = Array.isArray(userIds)
64
64
  ? userIds
65
- : userIds
66
- ? [userIds]
67
- : user?.id
68
- ? [user.id]
69
- : [];
65
+ : userIds === null
66
+ ? null
67
+ : userIds
68
+ ? [userIds]
69
+ : user?.id
70
+ ? [user.id]
71
+ : [];
70
72
  state.emitDynamicUpdate(db.getTenantSchema(), data, safeIds);
71
73
  };
72
74
  /**
@@ -86,9 +88,10 @@ const run_code = async ({ row, table, channel, configuration, user, ...rest }) =
86
88
  const { stripTypeScriptTypes } = require("module");
87
89
  if (stripTypeScriptTypes)
88
90
  stripTypes = stripTypeScriptTypes;
89
- code = stripTypes(`async () =>{${configuration.code}}`)
91
+ code = stripTypes(`async () =>{${configuration.code}
92
+ }`)
90
93
  .replace("async () =>{", "")
91
- .slice(0, -1);
94
+ .slice(0, -2);
92
95
  }
93
96
  catch (e) {
94
97
  //console.error("strip error", e);
@@ -276,28 +279,64 @@ module.exports = {
276
279
  * @returns {object[]}
277
280
  */
278
281
  description: "Emit an event",
279
- configFields: () => [
280
- {
281
- name: "eventType",
282
- label: "Event type",
283
- required: true,
284
- input_type: "select",
285
- options: trigger_1.default.when_options,
286
- },
287
- {
288
- name: "channel",
289
- label: "Channel",
290
- type: "String",
291
- fieldview: "textarea",
292
- },
293
- {
294
- name: "payload",
295
- label: "Payload JSON",
296
- sublabel: "Leave blank to use row from table",
297
- type: "String",
298
- fieldview: "textarea",
299
- },
300
- ],
282
+ configFields: async ({ table }) => {
283
+ const evTypes = trigger_1.default.when_options;
284
+ const hasChannel = [];
285
+ const hasTable = [];
286
+ evTypes.forEach((ty) => {
287
+ if (eventlog_1.default.hasChannel(ty))
288
+ hasChannel.push(ty);
289
+ if (eventlog_1.default.hasTable(ty))
290
+ hasTable.push(ty);
291
+ });
292
+ const allTables = await table_1.default.find({}, { cached: true });
293
+ return [
294
+ {
295
+ name: "eventType",
296
+ label: "Event type",
297
+ required: true,
298
+ input_type: "select",
299
+ options: evTypes,
300
+ },
301
+ {
302
+ name: "channel",
303
+ label: "Channel",
304
+ type: "String",
305
+ showIf: { eventType: hasChannel },
306
+ help: {
307
+ topic: "Event channel and payload",
308
+ },
309
+ },
310
+ {
311
+ name: "channel",
312
+ label: "Table",
313
+ type: "String",
314
+ showIf: { eventType: hasTable },
315
+ required: true,
316
+ attributes: { options: allTables.map((t) => t.name) },
317
+ help: {
318
+ topic: "Event channel and payload",
319
+ },
320
+ },
321
+ {
322
+ name: "payload",
323
+ label: "Payload JSON",
324
+ sublabel: `Leave blank to use row from table. <code>user</code> ${table ? `and field variables ` : ""}in scope`,
325
+ input_type: "code",
326
+ attributes: {
327
+ mode: "application/javascript",
328
+ compact: true,
329
+ expression_type: "row",
330
+ table: table?.name,
331
+ nojoins: true,
332
+ user: true,
333
+ },
334
+ help: {
335
+ topic: "Event channel and payload",
336
+ },
337
+ },
338
+ ];
339
+ },
301
340
  /**
302
341
  * @param {object} opts
303
342
  * @param {object} opts.row
@@ -335,7 +374,7 @@ module.exports = {
335
374
  {
336
375
  name: "where",
337
376
  label: "Where",
338
- sublabel: "Where-expression for subset of rows to loop over",
377
+ sublabel: `Where-expression for subset of rows to loop over. For example: <code>{status: "Active"}</code>`,
339
378
  input_type: "code",
340
379
  attributes: {
341
380
  mode: "application/javascript",
@@ -440,7 +479,7 @@ module.exports = {
440
479
  name: "url",
441
480
  label: "URL",
442
481
  type: "String",
443
- sublabel: "Trigger will call specified URL",
482
+ sublabel: "Trigger will call specified URL. Interpolations <code>{{ }}</code> can be used",
444
483
  },
445
484
  {
446
485
  name: "method",
@@ -452,16 +491,23 @@ module.exports = {
452
491
  {
453
492
  name: "body",
454
493
  label: "JSON body",
455
- sublabel: "Leave blank to use row from table",
456
- type: "String",
457
- fieldview: "textarea",
458
494
  showIf: { method: ["POST", "PUT", "DELETE", "PATCH"] },
495
+ sublabel: `Leave blank to use row from table.${table ? ` <code>user</code> and field variables in scope` : ""}`,
496
+ input_type: "code",
497
+ attributes: {
498
+ mode: "application/javascript",
499
+ compact: true,
500
+ expression_type: "row",
501
+ table: table?.name,
502
+ nojoins: true,
503
+ user: true,
504
+ },
459
505
  },
460
506
  {
461
507
  name: "authorization",
462
508
  label: "Authorization header",
463
509
  type: "String",
464
- sublabel: "For example <code>Bearer xxxx</code>",
510
+ sublabel: "For example <code>Bearer xxxx</code>. Interpolations <code>{{ }}</code> can be used",
465
511
  },
466
512
  ...(field_opts.length
467
513
  ? [
@@ -492,7 +538,7 @@ module.exports = {
492
538
  * @returns {Promise<object>}
493
539
  */
494
540
  run: async ({ row, user, table, configuration: { url, body, authorization, response_field, response_var, method, }, }) => {
495
- let url1 = interpolate(url, row, user, "Webhook URL");
541
+ let url1 = interpolate(url, row || {}, user, "Webhook URL");
496
542
  const fetchOpts = {
497
543
  method: (method || "post").toLowerCase(),
498
544
  headers: { "Content-Type": "application/json" },
@@ -1084,12 +1130,13 @@ module.exports = {
1084
1130
  {
1085
1131
  name: "where",
1086
1132
  label: "Recalculate where",
1087
- sublabel: "Where-expression for subset of rows to recalculate",
1133
+ sublabel: "Where-expression for subset of rows to recalculate. Example: <code>{manager: id}</code>",
1088
1134
  input_type: "code",
1089
1135
  attributes: {
1090
1136
  mode: "application/javascript",
1091
1137
  singleline: true,
1092
1138
  expression_type: "query",
1139
+ ...(table ? { table: table.name } : {}),
1093
1140
  },
1094
1141
  },
1095
1142
  ];
@@ -1134,7 +1181,7 @@ module.exports = {
1134
1181
  * @returns {Promise<object[]>}
1135
1182
  */
1136
1183
  description: "insert a row into any table, using a formula expression",
1137
- configFields: async ({ mode }) => {
1184
+ configFields: async ({ mode, table }) => {
1138
1185
  const tables = await table_1.default.find({}, { cached: true });
1139
1186
  return [
1140
1187
  {
@@ -1148,11 +1195,14 @@ module.exports = {
1148
1195
  name: "row_expr",
1149
1196
  label: "Row expression",
1150
1197
  sublabel: "Expression for JavaScript object or array of objects. Example: <code>{first_name: name.split(' ')[0]}</code>",
1151
- type: "String",
1152
- fieldview: "textarea",
1153
- class: "validate-expression",
1198
+ input_type: "code",
1154
1199
  attributes: {
1155
- spellcheck: false,
1200
+ mode: "application/javascript",
1201
+ compact: true,
1202
+ expression_type: "row",
1203
+ table: table?.name,
1204
+ nojoins: true,
1205
+ user: true,
1156
1206
  },
1157
1207
  },
1158
1208
  ...(mode === "workflow"
@@ -1230,7 +1280,7 @@ module.exports = {
1230
1280
  */
1231
1281
  modify_row: {
1232
1282
  description: "Modify the triggering row",
1233
- configFields: async ({ mode, when_trigger, }) => {
1283
+ configFields: async ({ mode, when_trigger, table, }) => {
1234
1284
  return [
1235
1285
  {
1236
1286
  name: "row_expr",
@@ -1241,6 +1291,9 @@ module.exports = {
1241
1291
  mode: "application/javascript",
1242
1292
  compact: true,
1243
1293
  expression_type: "row",
1294
+ table: table?.name,
1295
+ nojoins: true,
1296
+ user: true,
1244
1297
  },
1245
1298
  },
1246
1299
  ...(mode === "edit" ||
@@ -1331,7 +1384,7 @@ module.exports = {
1331
1384
  * @returns {Promise<object[]>}
1332
1385
  */
1333
1386
  description: "Modify the triggering row",
1334
- configFields: async ({ mode, when_trigger }) => {
1387
+ configFields: async ({ mode, table, when_trigger }) => {
1335
1388
  const tables = await table_1.default.find({}, { cached: true });
1336
1389
  return [
1337
1390
  ...(mode === "workflow"
@@ -1354,10 +1407,15 @@ module.exports = {
1354
1407
  {
1355
1408
  name: "delete_where",
1356
1409
  label: "Delete where",
1357
- type: "String",
1410
+ input_type: "code",
1411
+ attributes: {
1412
+ mode: "application/javascript",
1413
+ singleline: true,
1414
+ expression_type: "query",
1415
+ ...(table ? { table: table.name } : {}),
1416
+ },
1358
1417
  sublabel: "Where expression, ex. <code>{manager: id}</code>",
1359
1418
  required: true,
1360
- class: "validate-expression",
1361
1419
  showIf: mode === "workflow" ? undefined : { delete_triggering_row: false },
1362
1420
  },
1363
1421
  ];
@@ -1370,7 +1428,7 @@ module.exports = {
1370
1428
  await table.deleteRows({ [table.pk_name]: row[table.pk_name] }, user, false, resultCollector);
1371
1429
  return resultCollector;
1372
1430
  }
1373
- const where = eval_expression(delete_where, row || {}, user, "recalculate_stored_fields where");
1431
+ const where = eval_expression(delete_where, row || {}, user, "delete_rows where");
1374
1432
  const tbl = table_1.default.findOne({ name: table_name });
1375
1433
  await tbl.deleteRows(where, user, false, resultCollector);
1376
1434
  return resultCollector;
@@ -1389,7 +1447,7 @@ module.exports = {
1389
1447
  * @returns {Promise<object[]>}
1390
1448
  */
1391
1449
  description: "Navigation action",
1392
- configFields: async () => {
1450
+ configFields: async ({ table }) => {
1393
1451
  const pages = await page_1.default.find({}, { cached: true });
1394
1452
  const views = await view_1.default.find({}, { cached: true });
1395
1453
  return [
@@ -1417,6 +1475,7 @@ module.exports = {
1417
1475
  type: "String",
1418
1476
  required: true,
1419
1477
  showIf: { nav_action: ["Go to URL", "Popup modal"] },
1478
+ sublabel: "Use interpolations <code>{{ }}</code> to access row variables",
1420
1479
  },
1421
1480
  {
1422
1481
  name: "page",
@@ -1435,9 +1494,20 @@ module.exports = {
1435
1494
  {
1436
1495
  name: "state_formula",
1437
1496
  label: "State",
1438
- type: "String",
1439
- class: "validate-expression",
1497
+ input_type: "code",
1498
+ attributes: {
1499
+ mode: "application/javascript",
1500
+ singleline: true,
1501
+ expression_type: "query",
1502
+ ...(table ? { table: table.name } : {}),
1503
+ },
1440
1504
  showIf: { nav_action: ["Go to Page", "Go to View"] },
1505
+ sublabel: `Additional state passed to the page. Example: <code>{id: 5}</code>`,
1506
+ help: {
1507
+ topic: "Extra state formula",
1508
+ context: table ? { srcTable: table.name } : {},
1509
+ dynContext: ["view"],
1510
+ },
1441
1511
  },
1442
1512
  {
1443
1513
  name: "new_tab",
@@ -1548,18 +1618,26 @@ module.exports = {
1548
1618
  {
1549
1619
  name: "form_action",
1550
1620
  label: "Form Action",
1551
- type: "String",
1621
+ input_type: "select",
1552
1622
  required: true,
1553
1623
  attributes: {
1554
- options: [
1555
- "RequestSubmit",
1556
- "Submit",
1557
- "Save",
1558
- "Reset",
1559
- "Submit with Ajax",
1560
- "Ajax Save Form Data",
1561
- ],
1624
+ explainers: {
1625
+ RequestSubmit: "Validate the form, and submit if no errors, or display errors",
1626
+ Submit: "Submit the form, skipping validation",
1627
+ Save: "Save the form contents on the server, stay on the form page",
1628
+ Reset: "Reset the form to the state it was in at page load time",
1629
+ "Submit with Ajax": "Submit the form with Ajax and follow the set destination if there are no errors",
1630
+ "Ajax Save Form Data": "Submit the form with Ajax and close the open popup ",
1631
+ },
1562
1632
  },
1633
+ options: [
1634
+ "RequestSubmit",
1635
+ "Submit",
1636
+ "Save",
1637
+ "Reset",
1638
+ "Submit with Ajax",
1639
+ "Ajax Save Form Data",
1640
+ ],
1563
1641
  },
1564
1642
  ],
1565
1643
  run: async ({ row, table, user, req, configuration: { form_action }, ...rest }) => {
@@ -1681,12 +1759,13 @@ module.exports = {
1681
1759
  label: "Text",
1682
1760
  type: "String",
1683
1761
  required: true,
1762
+ sublabel: "Interpolations <code>{{ }}</code> can be used",
1684
1763
  },
1685
1764
  {
1686
1765
  name: "title",
1687
1766
  label: "Title",
1688
- sublabel: "Optional",
1689
1767
  type: "String",
1768
+ sublabel: "Optional. Interpolations <code>{{ }}</code> can be used",
1690
1769
  },
1691
1770
  {
1692
1771
  name: "remove_delay",
@@ -1778,6 +1857,7 @@ module.exports = {
1778
1857
  table: table?.name || undefined,
1779
1858
  user: has_user,
1780
1859
  workflow: mode === "workflow",
1860
+ nojoins: true,
1781
1861
  },
1782
1862
  class: `validate-statements strip-types ${mode !== "workflow" ? "enlarge-in-card" : ""}`,
1783
1863
  validator(s) {
@@ -1792,7 +1872,8 @@ module.exports = {
1792
1872
  }
1793
1873
  try {
1794
1874
  let AsyncFunction = Object.getPrototypeOf(async function () { }).constructor;
1795
- AsyncFunction(stripTypes(`async () =>{${s}}`));
1875
+ AsyncFunction(stripTypes(`async () =>{${s}
1876
+ }`));
1796
1877
  return true;
1797
1878
  }
1798
1879
  catch (e) {
@@ -2168,7 +2249,7 @@ module.exports = {
2168
2249
  },
2169
2250
  reload_embedded_view: {
2170
2251
  description: "Reload an embedded view without full page reload",
2171
- configFields: async () => {
2252
+ configFields: async ({ table }) => {
2172
2253
  const views = await view_1.default.find({});
2173
2254
  return [
2174
2255
  {
@@ -2182,8 +2263,19 @@ module.exports = {
2182
2263
  {
2183
2264
  name: "new_state_fml",
2184
2265
  label: "New state formula",
2185
- type: "String",
2186
- class: "validate-expression",
2266
+ input_type: "code",
2267
+ attributes: {
2268
+ mode: "application/javascript",
2269
+ singleline: true,
2270
+ expression_type: "row",
2271
+ ...(table ? { table: table.name } : {}),
2272
+ },
2273
+ sublabel: `Optional. Updated view state. Example: <code>{id: 5}</code>. Leave blank to keep existing state`,
2274
+ help: {
2275
+ topic: "Extra state formula",
2276
+ context: table ? { srcTable: table.name } : {},
2277
+ dynContext: ["view"],
2278
+ },
2187
2279
  },
2188
2280
  {
2189
2281
  name: "interval",
@@ -2227,7 +2319,7 @@ module.exports = {
2227
2319
  type: "String",
2228
2320
  class: "validate-identifier",
2229
2321
  required: true,
2230
- sublabel: "A valid JavaScript identifier for updating existing progress toasts",
2322
+ sublabel: "A valid JavaScript identifier for updating existing progress toasts. Interpolations <code>{{ }}</code> can be used",
2231
2323
  showIf: { blocking: false },
2232
2324
  },
2233
2325
  {
@@ -2248,12 +2340,14 @@ module.exports = {
2248
2340
  label: "Title",
2249
2341
  type: "String",
2250
2342
  showIf: { close: false },
2343
+ sublabel: "Use interpolations <code>{{ }}</code> to access row variables",
2251
2344
  },
2252
2345
  {
2253
2346
  name: "message",
2254
2347
  label: "Message",
2255
2348
  type: "String",
2256
2349
  showIf: { close: false },
2350
+ sublabel: "Use interpolations <code>{{ }}</code> to access row variables",
2257
2351
  },
2258
2352
  {
2259
2353
  name: "percent",
@@ -2325,27 +2419,31 @@ module.exports = {
2325
2419
  },
2326
2420
  notify_user: {
2327
2421
  description: "Send a notification to a specific user",
2328
- configFields: () => [
2422
+ configFields: ({ table }) => [
2329
2423
  {
2330
2424
  name: "user_spec",
2331
2425
  label: "User where or email",
2332
2426
  type: "String",
2427
+ sublabel: `Valid input: <code>*</code> for all, a valid email address, or a where object, e.g. <code>{department: "Finance"}</code>${table ? ". Row values are in scope for where object." : ""}`,
2333
2428
  },
2334
2429
  {
2335
2430
  name: "title",
2336
2431
  label: "Title",
2337
2432
  required: true,
2338
2433
  type: "String",
2434
+ sublabel: "<code>{{ }}</code> interpolations usable",
2339
2435
  },
2340
2436
  {
2341
2437
  name: "body",
2342
2438
  label: "Body",
2343
2439
  type: "String",
2440
+ sublabel: "<code>{{ }}</code> interpolations usable",
2344
2441
  },
2345
2442
  {
2346
2443
  name: "link",
2347
2444
  label: "Link",
2348
2445
  type: "String",
2446
+ sublabel: "<code>{{ }}</code> interpolations usable",
2349
2447
  },
2350
2448
  ],
2351
2449
  /**