@saltcorn/server 1.1.3-beta.0 → 1.1.3-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 (420) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/app.js +38 -6
  3. package/auth/admin.js +2 -0
  4. package/auth/resetpw.js +37 -9
  5. package/auth/roleadmin.js +1 -0
  6. package/auth/routes.js +22 -8
  7. package/docs/assets/search.js +1 -1
  8. package/docs/classes/_saltcorn_common_code.Relation.html +8 -8
  9. package/docs/classes/_saltcorn_common_code.RelationsFinder.html +5 -5
  10. package/docs/classes/_saltcorn_data.models.Crash-1.html +18 -18
  11. package/docs/classes/_saltcorn_data.models.EventLog-1.html +19 -19
  12. package/docs/classes/_saltcorn_data.models.Field.html +71 -71
  13. package/docs/classes/_saltcorn_data.models.FieldRepeat-1.html +17 -17
  14. package/docs/classes/_saltcorn_data.models.File-1.html +48 -48
  15. package/docs/classes/_saltcorn_data.models.Form-1.html +38 -38
  16. package/docs/classes/_saltcorn_data.models.Library.html +13 -13
  17. package/docs/classes/_saltcorn_data.models.Page.html +23 -23
  18. package/docs/classes/_saltcorn_data.models.PageGroup-1.html +25 -25
  19. package/docs/classes/_saltcorn_data.models.Plugin.html +25 -25
  20. package/docs/classes/_saltcorn_data.models.Role.html +9 -9
  21. package/docs/classes/_saltcorn_data.models.Table-1.html +90 -111
  22. package/docs/classes/_saltcorn_data.models.TableConstraint-1.html +14 -14
  23. package/docs/classes/_saltcorn_data.models.Trigger.html +34 -34
  24. package/docs/classes/_saltcorn_data.models.User-1.html +47 -47
  25. package/docs/classes/_saltcorn_data.models.View-1.html +55 -53
  26. package/docs/classes/_saltcorn_data.models.Workflow-1.html +17 -17
  27. package/docs/classes/_saltcorn_data.models.WorkflowRun.html +57 -36
  28. package/docs/classes/_saltcorn_data.models.WorkflowStep.html +39 -24
  29. package/docs/classes/_saltcorn_data.models.WorkflowTrace.html +18 -18
  30. package/docs/classes/_saltcorn_mobile_builder.MobileBuilder.html +36 -43
  31. package/docs/enums/_saltcorn_common_code.RelationType.html +7 -7
  32. package/docs/enums/_saltcorn_common_code.ViewDisplayType.html +4 -4
  33. package/docs/functions/_saltcorn_admin_models.backup.create_backup.html +1 -1
  34. package/docs/functions/_saltcorn_admin_models.backup.create_csv_from_rows.html +1 -1
  35. package/docs/functions/_saltcorn_admin_models.backup.restore.html +1 -1
  36. package/docs/functions/_saltcorn_admin_models.pack.add_to_menu.html +1 -1
  37. package/docs/functions/_saltcorn_admin_models.pack.can_install_pack.html +1 -1
  38. package/docs/functions/_saltcorn_admin_models.pack.fetch_available_packs.html +1 -1
  39. package/docs/functions/_saltcorn_admin_models.pack.fetch_pack_by_name.html +1 -1
  40. package/docs/functions/_saltcorn_admin_models.pack.install_pack.html +1 -1
  41. package/docs/functions/_saltcorn_admin_models.pack.library_pack.html +1 -1
  42. package/docs/functions/_saltcorn_admin_models.pack.model_instance_pack.html +1 -1
  43. package/docs/functions/_saltcorn_admin_models.pack.model_pack.html +1 -1
  44. package/docs/functions/_saltcorn_admin_models.pack.page_group_pack.html +1 -1
  45. package/docs/functions/_saltcorn_admin_models.pack.page_pack.html +1 -1
  46. package/docs/functions/_saltcorn_admin_models.pack.plugin_pack.html +1 -1
  47. package/docs/functions/_saltcorn_admin_models.pack.role_pack.html +1 -1
  48. package/docs/functions/_saltcorn_admin_models.pack.table_pack.html +1 -1
  49. package/docs/functions/_saltcorn_admin_models.pack.trigger_pack.html +1 -1
  50. package/docs/functions/_saltcorn_admin_models.pack.uninstall_pack.html +1 -1
  51. package/docs/functions/_saltcorn_admin_models.pack.view_pack.html +1 -1
  52. package/docs/functions/_saltcorn_admin_models.tenant.copy_tenant_template.html +1 -1
  53. package/docs/functions/_saltcorn_admin_models.tenant.create_tenant.html +1 -1
  54. package/docs/functions/_saltcorn_admin_models.tenant.deleteTenant.html +1 -1
  55. package/docs/functions/_saltcorn_admin_models.tenant.domain_sanitize.html +1 -1
  56. package/docs/functions/_saltcorn_admin_models.tenant.eachTenant.html +1 -1
  57. package/docs/functions/_saltcorn_admin_models.tenant.getAllTenantRows.html +1 -1
  58. package/docs/functions/_saltcorn_admin_models.tenant.getAllTenants.html +1 -1
  59. package/docs/functions/_saltcorn_admin_models.tenant.insertTenant.html +1 -1
  60. package/docs/functions/_saltcorn_admin_models.tenant.switchToTenant.html +1 -1
  61. package/docs/functions/_saltcorn_common_code.buildTableCaches.html +1 -1
  62. package/docs/functions/_saltcorn_common_code.parseLegacyRelation.html +1 -1
  63. package/docs/functions/_saltcorn_common_code.parseRelationPath.html +1 -1
  64. package/docs/functions/_saltcorn_data.models.config.check_email_mask.html +1 -1
  65. package/docs/functions/_saltcorn_data.models.config.deleteConfig.html +1 -1
  66. package/docs/functions/_saltcorn_data.models.config.getAllConfig.html +1 -1
  67. package/docs/functions/_saltcorn_data.models.config.getConfig.html +1 -1
  68. package/docs/functions/_saltcorn_data.models.config.get_base_url.html +1 -1
  69. package/docs/functions/_saltcorn_data.models.config.get_latest_npm_version.html +1 -1
  70. package/docs/functions/_saltcorn_data.models.config.remove_from_menu.html +1 -1
  71. package/docs/functions/_saltcorn_data.models.config.save_menu_items.html +1 -1
  72. package/docs/functions/_saltcorn_data.models.config.setConfig.html +1 -1
  73. package/docs/functions/_saltcorn_data.models.discovery.discover_tables.html +1 -1
  74. package/docs/functions/_saltcorn_data.models.discovery.discoverable_tables.html +1 -1
  75. package/docs/functions/_saltcorn_data.models.discovery.findType.html +1 -1
  76. package/docs/functions/_saltcorn_data.models.discovery.get_existing_views.html +1 -1
  77. package/docs/functions/_saltcorn_data.models.discovery.implement_discovery.html +1 -1
  78. package/docs/functions/_saltcorn_data.models.email.getMailTransport.html +1 -1
  79. package/docs/functions/_saltcorn_data.models.email.send_verification_email.html +1 -1
  80. package/docs/functions/_saltcorn_data.models.email.viewToEmailHtml.html +1 -1
  81. package/docs/functions/_saltcorn_data.models.expression.apply_calculated_fields.html +1 -1
  82. package/docs/functions/_saltcorn_data.models.expression.apply_calculated_fields_stored.html +1 -1
  83. package/docs/functions/_saltcorn_data.models.expression.eval_expression.html +1 -1
  84. package/docs/functions/_saltcorn_data.models.expression.expressionValidator.html +1 -1
  85. package/docs/functions/_saltcorn_data.models.expression.get_async_expression_function.html +1 -1
  86. package/docs/functions/_saltcorn_data.models.expression.get_expression_function.html +1 -1
  87. package/docs/functions/_saltcorn_data.models.expression.jsexprToWhere.html +1 -1
  88. package/docs/functions/_saltcorn_data.models.expression.recalculate_for_stored.html +1 -1
  89. package/docs/functions/_saltcorn_data.models.expression.transform_for_async.html +1 -1
  90. package/docs/functions/_saltcorn_data.models.layout.eachView.html +1 -1
  91. package/docs/functions/_saltcorn_data.models.layout.getStringsForI18n.html +1 -1
  92. package/docs/functions/_saltcorn_data.models.layout.getViews.html +1 -1
  93. package/docs/functions/_saltcorn_data.models.layout.translateLayout.html +1 -1
  94. package/docs/functions/_saltcorn_data.models.layout.traverse.html +1 -1
  95. package/docs/functions/_saltcorn_data.models.layout.traverseSync.html +1 -1
  96. package/docs/functions/_saltcorn_data.models.random.all_views.html +1 -1
  97. package/docs/functions/_saltcorn_data.models.random.fill_table_row.html +1 -1
  98. package/docs/functions/_saltcorn_data.models.random.initial_view.html +1 -1
  99. package/docs/functions/_saltcorn_data.models.random.random_table.html +1 -1
  100. package/docs/functions/_saltcorn_db_common.buildInsertBulkSql.html +1 -1
  101. package/docs/functions/_saltcorn_db_common.buildInsertSql.html +1 -1
  102. package/docs/functions/_saltcorn_db_common.doCount.html +1 -1
  103. package/docs/functions/_saltcorn_db_common.doDeleteWhere.html +1 -1
  104. package/docs/functions/_saltcorn_db_common.doListScTables.html +1 -1
  105. package/docs/functions/_saltcorn_db_common.doListTables.html +1 -1
  106. package/docs/functions/_saltcorn_db_common.doListUserDefinedTables.html +1 -1
  107. package/docs/functions/_saltcorn_db_common.do_add_index.html +1 -1
  108. package/docs/functions/_saltcorn_db_common.do_drop_index.html +1 -1
  109. package/docs/functions/_saltcorn_db_common.ftsFieldsSqlExpr.html +1 -1
  110. package/docs/functions/_saltcorn_db_common.mkSelectOptions.html +1 -1
  111. package/docs/functions/_saltcorn_db_common.mkVal.html +1 -1
  112. package/docs/functions/_saltcorn_db_common.mkWhere.html +1 -1
  113. package/docs/functions/_saltcorn_db_common.multi_tenant.enable_multi_tenant.html +1 -1
  114. package/docs/functions/_saltcorn_db_common.multi_tenant.getTenantSchema.html +1 -1
  115. package/docs/functions/_saltcorn_db_common.multi_tenant.init.html +1 -1
  116. package/docs/functions/_saltcorn_db_common.multi_tenant.is_it_multi_tenant.html +1 -1
  117. package/docs/functions/_saltcorn_db_common.multi_tenant.runWithTenant.html +1 -1
  118. package/docs/functions/_saltcorn_db_common.orderByIsObject.html +1 -1
  119. package/docs/functions/_saltcorn_db_common.orderByIsOperator.html +1 -1
  120. package/docs/functions/_saltcorn_db_common.prefixFieldsInWhere.html +1 -1
  121. package/docs/functions/_saltcorn_db_common.reprAsJson.html +1 -1
  122. package/docs/functions/_saltcorn_db_common.single_tenant.enable_multi_tenant.html +1 -1
  123. package/docs/functions/_saltcorn_db_common.single_tenant.getTenantSchema.html +1 -1
  124. package/docs/functions/_saltcorn_db_common.single_tenant.init.html +1 -1
  125. package/docs/functions/_saltcorn_db_common.single_tenant.is_it_multi_tenant.html +1 -1
  126. package/docs/functions/_saltcorn_db_common.single_tenant.runWithTenant.html +1 -1
  127. package/docs/functions/_saltcorn_db_common.sqlBinOp.html +1 -1
  128. package/docs/functions/_saltcorn_db_common.sqlFun.html +1 -1
  129. package/docs/functions/_saltcorn_db_common.sqlsanitize.html +1 -1
  130. package/docs/functions/_saltcorn_db_common.sqlsanitizeAllowDots.html +1 -1
  131. package/docs/functions/_saltcorn_db_common.subSelectWhere.html +1 -1
  132. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.androidFeatures.html +95 -0
  133. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.androidPermissions.html +95 -0
  134. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.buildTablesFile.html +4 -2
  135. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyPrepopulatedDb.html +4 -2
  136. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyServerFiles.html +4 -2
  137. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyShareExtFiles.html +4 -2
  138. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copySiteLogo.html +4 -2
  139. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyTranslationFiles.html +4 -2
  140. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.createSqliteDb.html +4 -2
  141. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.decodeProvisioningProfile.html +4 -2
  142. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.extractDomain.html +4 -2
  143. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.generateAndroidVersionCode.html +4 -2
  144. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyAndroidManifest.html +6 -6
  145. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyConfigXml.html +4 -2
  146. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyGradleConfig.html +4 -2
  147. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyInfoPlist.html +4 -2
  148. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyXcodeProjectFile.html +4 -2
  149. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepAppIcon.html +4 -2
  150. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareAppIcon.html +4 -2
  151. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareBuildDir.html +4 -2
  152. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareExportOptionsPlist.html +4 -2
  153. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareSplashIcon.html +4 -2
  154. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareSplashPage.html +4 -2
  155. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeCapacitorConfig.html +4 -2
  156. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeCfgFile.html +4 -2
  157. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeDataExtractionRules.html +4 -2
  158. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeNetworkSecurityConfig.html +4 -2
  159. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writePodfile.html +4 -2
  160. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writePrivacyInfo.html +4 -2
  161. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.bundleMobileAppCode.html +2 -1
  162. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.bundlePackagesAndPlugins.html +2 -1
  163. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.copyMobileAppDirs.html +74 -0
  164. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.copyPublicDirs.html +2 -1
  165. package/docs/functions/_saltcorn_sqlite.add_index.html +1 -1
  166. package/docs/functions/_saltcorn_sqlite.add_unique_constraint.html +1 -1
  167. package/docs/functions/_saltcorn_sqlite.begin.html +1 -1
  168. package/docs/functions/_saltcorn_sqlite.changeConnection.html +1 -1
  169. package/docs/functions/_saltcorn_sqlite.close.html +1 -1
  170. package/docs/functions/_saltcorn_sqlite.commit.html +1 -1
  171. package/docs/functions/_saltcorn_sqlite.count.html +1 -1
  172. package/docs/functions/_saltcorn_sqlite.deleteWhere.html +1 -1
  173. package/docs/functions/_saltcorn_sqlite.dropTable.html +1 -1
  174. package/docs/functions/_saltcorn_sqlite.dropTables.html +1 -1
  175. package/docs/functions/_saltcorn_sqlite.drop_index.html +1 -1
  176. package/docs/functions/_saltcorn_sqlite.drop_reset_schema.html +1 -1
  177. package/docs/functions/_saltcorn_sqlite.drop_unique_constraint.html +1 -1
  178. package/docs/functions/_saltcorn_sqlite.getVersion.html +1 -1
  179. package/docs/functions/_saltcorn_sqlite.get_db_filepath.html +1 -1
  180. package/docs/functions/_saltcorn_sqlite.get_sql_logging.html +1 -1
  181. package/docs/functions/_saltcorn_sqlite.init.html +1 -1
  182. package/docs/functions/_saltcorn_sqlite.insert.html +1 -1
  183. package/docs/functions/_saltcorn_sqlite.listScTables.html +1 -1
  184. package/docs/functions/_saltcorn_sqlite.listTables.html +1 -1
  185. package/docs/functions/_saltcorn_sqlite.listUserDefinedTables.html +1 -1
  186. package/docs/functions/_saltcorn_sqlite.query.html +1 -1
  187. package/docs/functions/_saltcorn_sqlite.rollback.html +1 -1
  188. package/docs/functions/_saltcorn_sqlite.select.html +1 -1
  189. package/docs/functions/_saltcorn_sqlite.selectMaybeOne.html +1 -1
  190. package/docs/functions/_saltcorn_sqlite.selectOne.html +1 -1
  191. package/docs/functions/_saltcorn_sqlite.set_sql_logging.html +1 -1
  192. package/docs/functions/_saltcorn_sqlite.slugify.html +1 -1
  193. package/docs/functions/_saltcorn_sqlite.sql_log.html +1 -1
  194. package/docs/functions/_saltcorn_sqlite.update.html +1 -1
  195. package/docs/functions/_saltcorn_sqlite.updateWhere.html +1 -1
  196. package/docs/functions/_saltcorn_sqlite_mobile.add_index.html +1 -1
  197. package/docs/functions/_saltcorn_sqlite_mobile.add_unique_constraint.html +1 -1
  198. package/docs/functions/_saltcorn_sqlite_mobile.count.html +1 -1
  199. package/docs/functions/_saltcorn_sqlite_mobile.deleteWhere.html +1 -1
  200. package/docs/functions/_saltcorn_sqlite_mobile.drop_index.html +1 -1
  201. package/docs/functions/_saltcorn_sqlite_mobile.drop_reset_schema.html +1 -1
  202. package/docs/functions/_saltcorn_sqlite_mobile.drop_unique_constraint.html +1 -1
  203. package/docs/functions/_saltcorn_sqlite_mobile.init.html +1 -1
  204. package/docs/functions/_saltcorn_sqlite_mobile.insert.html +1 -1
  205. package/docs/functions/_saltcorn_sqlite_mobile.insertRows.html +1 -1
  206. package/docs/functions/_saltcorn_sqlite_mobile.listScTables.html +1 -1
  207. package/docs/functions/_saltcorn_sqlite_mobile.listTables.html +1 -1
  208. package/docs/functions/_saltcorn_sqlite_mobile.listUserDefinedTables.html +1 -1
  209. package/docs/functions/_saltcorn_sqlite_mobile.query.html +1 -1
  210. package/docs/functions/_saltcorn_sqlite_mobile.select.html +1 -1
  211. package/docs/functions/_saltcorn_sqlite_mobile.selectMaybeOne.html +1 -1
  212. package/docs/functions/_saltcorn_sqlite_mobile.selectOne.html +1 -1
  213. package/docs/functions/_saltcorn_sqlite_mobile.setConnectionObject.html +1 -1
  214. package/docs/functions/_saltcorn_sqlite_mobile.tableExists.html +1 -1
  215. package/docs/functions/_saltcorn_sqlite_mobile.time.html +1 -1
  216. package/docs/functions/_saltcorn_sqlite_mobile.update.html +1 -1
  217. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_field.instanceOfField.html +1 -1
  218. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_page.instanceOfPage.html +1 -1
  219. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_view.instanceOfView.html +1 -1
  220. package/docs/functions/_saltcorn_types.Types.base_types.instanceOWithHtmlFile.html +2 -1
  221. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfErrorMsg.html +1 -1
  222. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfSuccessMsg.html +1 -1
  223. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfType.html +1 -1
  224. package/docs/functions/_saltcorn_types.generators.generateBool.html +1 -1
  225. package/docs/functions/_saltcorn_types.generators.generateString.html +1 -1
  226. package/docs/functions/_saltcorn_types.generators.num_between.html +1 -1
  227. package/docs/functions/_saltcorn_types.generators.oneOf.html +1 -1
  228. package/docs/interfaces/_saltcorn_mobile_builder.common_build_utils.ScCapacitorConfig.html +13 -11
  229. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_field.AbstractField.html +14 -14
  230. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_field.AbstractFieldRepeat.html +3 -3
  231. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_form.AbstractForm.html +26 -26
  232. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_page.AbstractPage.html +7 -7
  233. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_role.AbstractRole.html +3 -3
  234. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_table.AbstractTable.html +7 -7
  235. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_trigger.AbstractTrigger.html +16 -16
  236. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_view.AbstractView.html +10 -10
  237. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_workflow.AbstractWorkflow.html +13 -13
  238. package/docs/modules/_saltcorn_admin_models.backup.html +1 -1
  239. package/docs/modules/_saltcorn_admin_models.html +1 -1
  240. package/docs/modules/_saltcorn_admin_models.pack.html +1 -1
  241. package/docs/modules/_saltcorn_admin_models.tenant.html +1 -1
  242. package/docs/modules/_saltcorn_common_code.html +1 -1
  243. package/docs/modules/_saltcorn_data.html +3 -3
  244. package/docs/modules/_saltcorn_data.models.Crash.html +2 -2
  245. package/docs/modules/_saltcorn_data.models.EventLog.html +2 -2
  246. package/docs/modules/_saltcorn_data.models.FieldRepeat.html +2 -2
  247. package/docs/modules/_saltcorn_data.models.File.html +2 -2
  248. package/docs/modules/_saltcorn_data.models.Form.html +2 -2
  249. package/docs/modules/_saltcorn_data.models.PageGroup.html +2 -2
  250. package/docs/modules/_saltcorn_data.models.Table.html +2 -2
  251. package/docs/modules/_saltcorn_data.models.TableConstraint.html +2 -2
  252. package/docs/modules/_saltcorn_data.models.User.html +2 -2
  253. package/docs/modules/_saltcorn_data.models.View.html +2 -2
  254. package/docs/modules/_saltcorn_data.models.Workflow.html +2 -2
  255. package/docs/modules/_saltcorn_data.models.config.html +1 -1
  256. package/docs/modules/_saltcorn_data.models.discovery.html +1 -1
  257. package/docs/modules/_saltcorn_data.models.email.html +1 -1
  258. package/docs/modules/_saltcorn_data.models.expression.html +1 -1
  259. package/docs/modules/_saltcorn_data.models.html +1 -1
  260. package/docs/modules/_saltcorn_data.models.layout.html +1 -1
  261. package/docs/modules/_saltcorn_data.models.random.html +1 -1
  262. package/docs/modules/_saltcorn_data.models.scheduler.html +1 -1
  263. package/docs/modules/_saltcorn_data.plugin_helper.html +1 -1
  264. package/docs/modules/_saltcorn_data.utils.html +1 -1
  265. package/docs/modules/_saltcorn_db_common.html +2 -2
  266. package/docs/modules/_saltcorn_db_common.multi_tenant.html +1 -1
  267. package/docs/modules/_saltcorn_db_common.single_tenant.html +1 -1
  268. package/docs/modules/_saltcorn_markup.html +2 -2
  269. package/docs/modules/_saltcorn_mobile_builder.common_build_utils.html +6 -2
  270. package/docs/modules/_saltcorn_mobile_builder.html +1 -1
  271. package/docs/modules/_saltcorn_mobile_builder.package_bundle_utils.html +3 -1
  272. package/docs/modules/_saltcorn_sqlite.html +1 -1
  273. package/docs/modules/_saltcorn_sqlite_mobile.html +1 -1
  274. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_field.html +1 -1
  275. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_form.html +1 -1
  276. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_library.html +1 -1
  277. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_page.html +1 -1
  278. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_plugin.html +1 -1
  279. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_role.html +1 -1
  280. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_table.html +1 -1
  281. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_trigger.html +1 -1
  282. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_view.html +1 -1
  283. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_workflow.html +1 -1
  284. package/docs/modules/_saltcorn_types.ModelAbstracts.html +1 -1
  285. package/docs/modules/_saltcorn_types.Types.base_types.html +3 -1
  286. package/docs/modules/_saltcorn_types.Types.common_types.html +1 -1
  287. package/docs/modules/_saltcorn_types.Types.html +1 -1
  288. package/docs/modules/_saltcorn_types.generators.html +1 -1
  289. package/docs/modules/_saltcorn_types.html +1 -1
  290. package/docs/types/_saltcorn_data.models.Crash.CrashCfg.html +1 -1
  291. package/docs/types/_saltcorn_data.models.EventLog.EventLogCfg.html +1 -1
  292. package/docs/types/_saltcorn_data.models.FieldRepeat.FieldRepeatCfg.html +1 -1
  293. package/docs/types/_saltcorn_data.models.File.FileCfg.html +1 -1
  294. package/docs/types/_saltcorn_data.models.Form.AdditionalButton.html +1 -1
  295. package/docs/types/_saltcorn_data.models.Form.FormCfg.html +1 -1
  296. package/docs/types/_saltcorn_data.models.PageGroup.ScreenInfoParams.html +1 -1
  297. package/docs/types/_saltcorn_data.models.Table.ChildRelations.html +1 -1
  298. package/docs/types/_saltcorn_data.models.Table.ParentRelations.html +1 -1
  299. package/docs/types/_saltcorn_data.models.Table.RelationData.html +1 -1
  300. package/docs/types/_saltcorn_data.models.TableConstraint.TableConstraintCfg.html +1 -1
  301. package/docs/types/_saltcorn_data.models.User.UserCfg.html +1 -1
  302. package/docs/types/_saltcorn_data.models.View.FindViewsPred.html +1 -1
  303. package/docs/types/_saltcorn_data.models.Workflow.WorkflowCfg.html +1 -1
  304. package/docs/types/_saltcorn_db_common.AggregationOptions.html +1 -1
  305. package/docs/types/_saltcorn_db_common.CoordOpts.html +1 -1
  306. package/docs/types/_saltcorn_db_common.JoinField.html +1 -1
  307. package/docs/types/_saltcorn_db_common.JoinFields.html +1 -1
  308. package/docs/types/_saltcorn_db_common.JoinOptions.html +1 -1
  309. package/docs/types/_saltcorn_db_common.JsonPath.html +1 -1
  310. package/docs/types/_saltcorn_db_common.JsonPathElem.html +1 -1
  311. package/docs/types/_saltcorn_db_common.Operator.html +1 -1
  312. package/docs/types/_saltcorn_db_common.PrimaryKeyValue.html +1 -1
  313. package/docs/types/_saltcorn_db_common.Row.html +1 -1
  314. package/docs/types/_saltcorn_db_common.SelectOptions.html +1 -1
  315. package/docs/types/_saltcorn_db_common.SqlAndValues.html +1 -1
  316. package/docs/types/_saltcorn_db_common.SubselectOptions.html +1 -1
  317. package/docs/types/_saltcorn_db_common.Value.html +1 -1
  318. package/docs/types/_saltcorn_db_common.Where.html +1 -1
  319. package/docs/types/_saltcorn_mobile_builder.IosCfg.html +1 -1
  320. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_field.FieldCfg.html +1 -1
  321. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_field.InputType.html +1 -1
  322. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_form.AdditionalButton.html +1 -1
  323. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_library.LibraryCfg.html +1 -1
  324. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_library.LibraryPack.html +1 -1
  325. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_page.PageCfg.html +1 -1
  326. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_page.PagePack.html +1 -1
  327. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_plugin.PluginCfg.html +1 -1
  328. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_plugin.PluginPack.html +1 -1
  329. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_role.RoleCfg.html +1 -1
  330. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_role.RolePack.html +1 -1
  331. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_table.TableCfg.html +1 -1
  332. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_table.TablePack.html +1 -1
  333. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_trigger.TriggerCfg.html +1 -1
  334. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_trigger.TriggerPack.html +1 -1
  335. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_view.ViewCfg.html +1 -1
  336. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_view.ViewPack.html +1 -1
  337. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_workflow.ConfigWorkflowStep.html +1 -1
  338. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_workflow.RunResult.html +1 -1
  339. package/docs/types/_saltcorn_types.Types.base_types.Action.html +2 -1
  340. package/docs/types/_saltcorn_types.Types.base_types.AuthenticationMethod.html +2 -1
  341. package/docs/types/_saltcorn_types.Types.base_types.CapacitorPlugin.html +110 -0
  342. package/docs/types/_saltcorn_types.Types.base_types.CodePagePack.html +2 -1
  343. package/docs/types/_saltcorn_types.Types.base_types.Column.html +2 -1
  344. package/docs/types/_saltcorn_types.Types.base_types.ConnectedObjects.html +2 -1
  345. package/docs/types/_saltcorn_types.Types.base_types.CopilotSkill.html +2 -1
  346. package/docs/types/_saltcorn_types.Types.base_types.FieldLike.html +2 -1
  347. package/docs/types/_saltcorn_types.Types.base_types.FieldView.html +2 -1
  348. package/docs/types/_saltcorn_types.Types.base_types.Header.html +2 -1
  349. package/docs/types/_saltcorn_types.Types.base_types.JoinFieldOption.html +2 -1
  350. package/docs/types/_saltcorn_types.Types.base_types.Layout.html +2 -1
  351. package/docs/types/_saltcorn_types.Types.base_types.MobileConfig.html +2 -1
  352. package/docs/types/_saltcorn_types.Types.base_types.ModelPattern.html +2 -1
  353. package/docs/types/_saltcorn_types.Types.base_types.Pack.html +2 -1
  354. package/docs/types/_saltcorn_types.Types.base_types.Plugin.html +2 -1
  355. package/docs/types/_saltcorn_types.Types.base_types.PluginFunction.html +2 -1
  356. package/docs/types/_saltcorn_types.Types.base_types.PluginLayout.html +2 -1
  357. package/docs/types/_saltcorn_types.Types.base_types.PluginRoute.html +2 -1
  358. package/docs/types/_saltcorn_types.Types.base_types.PluginSourceType.html +2 -1
  359. package/docs/types/_saltcorn_types.Types.base_types.PluginType.html +2 -1
  360. package/docs/types/_saltcorn_types.Types.base_types.PluginWrap.html +2 -1
  361. package/docs/types/_saltcorn_types.Types.base_types.PluginWrapArg.html +2 -1
  362. package/docs/types/_saltcorn_types.Types.base_types.RelationOption.html +2 -1
  363. package/docs/types/_saltcorn_types.Types.base_types.Req.html +2 -1
  364. package/docs/types/_saltcorn_types.Types.base_types.Res.html +2 -1
  365. package/docs/types/_saltcorn_types.Types.base_types.RouteAction.html +2 -1
  366. package/docs/types/_saltcorn_types.Types.base_types.RunExtra.html +2 -1
  367. package/docs/types/_saltcorn_types.Types.base_types.TableProvider.html +2 -1
  368. package/docs/types/_saltcorn_types.Types.base_types.TableQuery.html +2 -1
  369. package/docs/types/_saltcorn_types.Types.base_types.Tablely.html +2 -1
  370. package/docs/types/_saltcorn_types.Types.base_types.ViewTemplate.html +5 -2
  371. package/docs/types/_saltcorn_types.Types.common_types.ErrorMessage.html +1 -1
  372. package/docs/types/_saltcorn_types.Types.common_types.GenObj.html +1 -1
  373. package/docs/types/_saltcorn_types.Types.common_types.ReqRes.html +1 -1
  374. package/docs/types/_saltcorn_types.Types.common_types.ResultMessage.html +1 -1
  375. package/docs/types/_saltcorn_types.Types.common_types.SuccessMessage.html +1 -1
  376. package/docs/types/_saltcorn_types.Types.common_types.Type.html +1 -1
  377. package/docs/variables/_saltcorn_data.db.html +1 -1
  378. package/docs/variables/_saltcorn_data.migrations.html +1 -1
  379. package/docs/variables/_saltcorn_data.models.config.available_languages.html +1 -1
  380. package/docs/variables/_saltcorn_data.models.config.configTypes.html +1 -1
  381. package/docs/variables/_saltcorn_data.models.scheduler.runScheduler.html +1 -1
  382. package/docs/variables/_saltcorn_data.plugin_helper.run_action_column.html +1 -1
  383. package/docs/variables/_saltcorn_data.utils.NotAuthorized.html +1 -1
  384. package/docs/variables/_saltcorn_data.utils.sleep.html +1 -1
  385. package/docs/variables/_saltcorn_db_common.multi_tenant.tenantNamespace.html +1 -1
  386. package/help/Where formula.tmd +2 -0
  387. package/help/index.js +13 -8
  388. package/locales/ar.json +22 -3
  389. package/locales/de.json +66 -45
  390. package/locales/en.json +20 -1
  391. package/locales/es.json +20 -1
  392. package/locales/fr.json +22 -3
  393. package/locales/hi.json +21 -2
  394. package/locales/pl.json +109 -80
  395. package/locales/pt.json +23 -4
  396. package/locales/ru.json +21 -2
  397. package/locales/si.json +23 -4
  398. package/locales/uk.json +23 -4
  399. package/locales/zh.json +20 -1
  400. package/markup/admin.js +13 -1
  401. package/package.json +9 -9
  402. package/public/saltcorn-common.js +52 -29
  403. package/public/saltcorn.js +5 -3
  404. package/routes/actions.js +48 -15
  405. package/routes/admin.js +74 -21
  406. package/routes/common_lists.js +29 -11
  407. package/routes/delete.js +1 -0
  408. package/routes/fields.js +5 -2
  409. package/routes/infoarch.js +1 -0
  410. package/routes/list.js +11 -7
  411. package/routes/menu.js +1 -0
  412. package/routes/page.js +9 -1
  413. package/routes/page_groupedit.js +1 -0
  414. package/routes/pageedit.js +1 -0
  415. package/routes/plugins.js +2 -0
  416. package/routes/registry.js +11 -7
  417. package/routes/tables.js +99 -6
  418. package/routes/utils.js +12 -7
  419. package/routes/viewedit.js +21 -1
  420. package/tests/viewedit.test.js +2 -0
@@ -520,6 +520,7 @@ function apply_showif() {
520
520
  var el = $(this);
521
521
  var date = new Date(el.attr("datetime"));
522
522
  const options = parse(el.attr("locale-date-options"));
523
+ options.timeZone = "UTC";
523
524
  el.text(date.toLocaleDateString(locale, options));
524
525
  });
525
526
  $("time[locale-date-format]").each(function () {
@@ -596,6 +597,7 @@ function get_form_record(e_in, select_labels) {
596
597
  $(e_in).prop("data-join-values", {});
597
598
  const keyVals = {};
598
599
  for (const { ref, target, refTable } of joinFields) {
600
+ if (!rec[ref]) continue;
599
601
  keyVals[ref] = rec[ref];
600
602
  $.ajax(`/api/${refTable}?id=${rec[ref]}`, {
601
603
  success: (val) => {
@@ -912,6 +914,29 @@ function doMobileTransforms() {
912
914
  );
913
915
  }
914
916
 
917
+ function validate_expression_elem(target) {
918
+ const next = target.next();
919
+ if (next.hasClass("expr-error")) next.remove();
920
+ const val = target.val();
921
+ if (target.hasClass("validate-expression-conditional")) {
922
+ const box = target
923
+ .closest(".form-namespace")
924
+ .find(`[name="${target.attr("name")}_formula"]`);
925
+ if (!box.prop("checked")) return;
926
+ }
927
+ if (!val) return;
928
+ try {
929
+ const AsyncFunction = Object.getPrototypeOf(
930
+ async function () {}
931
+ ).constructor;
932
+ AsyncFunction("return " + val);
933
+ } catch (error) {
934
+ target.after(`<small class="text-danger font-monospace d-block expr-error">
935
+ ${error.message}
936
+ </small>`);
937
+ }
938
+ }
939
+
915
940
  function initialize_page() {
916
941
  if (window._sc_locale && window.dayjs) dayjs.locale(window._sc_locale);
917
942
  const isNode = getIsNode();
@@ -941,28 +966,6 @@ function initialize_page() {
941
966
  validate_identifier_elem(target);
942
967
  });
943
968
 
944
- const validate_expression_elem = (target) => {
945
- const next = target.next();
946
- if (next.hasClass("expr-error")) next.remove();
947
- const val = target.val();
948
- if (target.hasClass("validate-expression-conditional")) {
949
- const box = target
950
- .closest(".form-namespace")
951
- .find(`[name="${target.attr("name")}_formula"]`);
952
- if (!box.prop("checked")) return;
953
- }
954
- if (!val) return;
955
- try {
956
- const AsyncFunction = Object.getPrototypeOf(
957
- async function () {}
958
- ).constructor;
959
- AsyncFunction("return " + val);
960
- } catch (error) {
961
- target.after(`<small class="text-danger font-monospace d-block expr-error">
962
- ${error.message}
963
- </small>`);
964
- }
965
- };
966
969
  $(".validate-expression").bind("input", function (e) {
967
970
  const target = $(e.target);
968
971
  validate_expression_elem(target);
@@ -1192,6 +1195,7 @@ function initialize_page() {
1192
1195
  if (_sc_lightmode === "dark") cmOpts.theme = "blackboard";
1193
1196
  const cm = CodeMirror.fromTextArea(el, cmOpts);
1194
1197
  $(el).addClass("codemirror-enabled");
1198
+ if ($(el).hasClass("enlarge-in-card")) enlarge_in_code($(el), cm);
1195
1199
  cm.on(
1196
1200
  "change",
1197
1201
  $.debounce(
@@ -1294,6 +1298,22 @@ function initialize_page() {
1294
1298
 
1295
1299
  $(initialize_page);
1296
1300
 
1301
+ function enlarge_in_code($textarea, cm) {
1302
+ const $card = $textarea.closest("div.card");
1303
+ if (!$card.length) return;
1304
+ const cardTop = $card.position().top;
1305
+ const cardHeight = $card.height();
1306
+ const vh = $(window).height();
1307
+ const cmHeight = cm.getWrapperElement().offsetHeight;
1308
+ const newCardHeight = vh - cardTop - 35;
1309
+ if (newCardHeight > cardHeight) {
1310
+ const extending = newCardHeight - cardHeight;
1311
+ cm.setSize("100%", `${cmHeight + extending}px`);
1312
+ cm.refresh();
1313
+ $card.css("min-height", newCardHeight + "px");
1314
+ }
1315
+ }
1316
+
1297
1317
  function cancel_inline_edit(e, opts1) {
1298
1318
  var opts = JSON.parse(decodeURIComponent(opts1 || "") || "{}");
1299
1319
  var form = $(e.target).closest("form");
@@ -1484,7 +1504,7 @@ function getIsNode() {
1484
1504
  }
1485
1505
  }
1486
1506
 
1487
- function buildToast(txt, type, spin) {
1507
+ function buildToast(txt, type, spin, title) {
1488
1508
  const realtype = type === "error" ? "danger" : type;
1489
1509
  const icon =
1490
1510
  realtype === "success"
@@ -1513,7 +1533,7 @@ function buildToast(txt, type, spin) {
1513
1533
  <div class="toast-header bg-${realtype} text-white py-1 ">
1514
1534
  <i class="fas ${icon} me-2"></i>
1515
1535
  <strong class="me-auto" >
1516
- ${type}
1536
+ ${title || type}
1517
1537
  </strong>
1518
1538
  ${
1519
1539
  spin
@@ -1563,7 +1583,7 @@ function notifyAlert(note, spin) {
1563
1583
  txt = JSON.stringify(note, null, 2);
1564
1584
  }
1565
1585
 
1566
- const { id, html } = buildToast(txt, type, spin);
1586
+ const { id, html } = buildToast(txt, type, spin, note.toast_title);
1567
1587
  let $modal = $("#scmodal");
1568
1588
  if ($modal.length && $modal.hasClass("show"))
1569
1589
  $("#modal-toasts-area").append(html);
@@ -1638,16 +1658,19 @@ async function common_done(res, viewnameOrElem0, isWeb = true) {
1638
1658
  if (evalres) await common_done(evalres, viewnameOrElem, isWeb);
1639
1659
  }
1640
1660
  };
1641
- if (res.notify) await handle(res.notify, notifyAlert);
1661
+ if (res.notify)
1662
+ await handle(res.notify, (text) =>
1663
+ notifyAlert({ type: "info", text, toast_title: res.toast_title })
1664
+ );
1642
1665
  if (res.error) {
1643
1666
  if (window._sc_loglevel > 4) console.trace("error response", res.error);
1644
1667
  await handle(res.error, (text) =>
1645
- notifyAlert({ type: "danger", text: text })
1668
+ notifyAlert({ type: "danger", text, toast_title: res.toast_title })
1646
1669
  );
1647
1670
  }
1648
1671
  if (res.notify_success)
1649
1672
  await handle(res.notify_success, (text) =>
1650
- notifyAlert({ type: "success", text: text })
1673
+ notifyAlert({ type: "success", text, toast_title: res.toast_title })
1651
1674
  );
1652
1675
  if (res.set_fields && (viewname || res.set_fields._viewname)) {
1653
1676
  const form =
@@ -2145,7 +2168,7 @@ function update_time_of_week(nm) {
2145
2168
  };
2146
2169
  }
2147
2170
 
2148
- function select_by_view_click(element, event, required) {
2171
+ function select_by_view_click(element, event, required, multiple) {
2149
2172
  const isAlreadySelected = $(element).hasClass("selected");
2150
2173
  $(element)
2151
2174
  .closest(".select-by-view-container")
@@ -76,7 +76,7 @@ function removeQueryStringParameter(uri1, key, value) {
76
76
  let re;
77
77
  if (value) {
78
78
  re = new RegExp(
79
- "([?&])" + escapeRegExp(key) + "=" + value + "?(&|$)",
79
+ "([?&])" + escapeRegExp(key) + "=" + encodeURIComponent(value) + "?(&|$)",
80
80
  "gi"
81
81
  );
82
82
  } else {
@@ -131,11 +131,13 @@ function set_state_field(key, value, e) {
131
131
  function check_state_field(that, e) {
132
132
  const checked = that.checked;
133
133
  const name = that.name;
134
- const value = encodeURIComponent(that.value);
134
+ const value = that.value;
135
135
  let dest;
136
136
  if (checked)
137
137
  dest = addQueryStringParameter(get_current_state_url(e), name, value);
138
138
  else dest = removeQueryStringParameter(get_current_state_url(e), name, value);
139
+ console.log({ dest, name, value, tvalue: that.value });
140
+
139
141
  pjax_to(dest.replace("&&", "&").replace("?&", "?"), e);
140
142
  }
141
143
 
@@ -922,7 +924,7 @@ function poll_mobile_build_finished(
922
924
  data: { out_dir_name: outDirName, mode: mode },
923
925
  success: function (res) {
924
926
  if (!res.finished) {
925
- if (pollCount >= 100) {
927
+ if (pollCount >= 150) {
926
928
  removeSpinner("buildMobileAppBtnId", orginalBtnHtml);
927
929
  notifyAlert({
928
930
  type: "danger",
package/routes/actions.js CHANGED
@@ -562,7 +562,10 @@ const getWorkflowConfig = async (req, id, table, trigger) => {
562
562
  const idnext = cls.split(" ").find(c=>c.startsWith("btw-nodes-")).
563
563
  substr(10);
564
564
  const [idprev, nmnext] = idnext.split("-");
565
- location.href = '/actions/stepedit/${trigger.id}?after_step='+idprev+'&before_step='+nmnext;
565
+ if(cls.includes("init-for-body"))
566
+ location.href = '/actions/stepedit/${trigger.id}?after_step_for='+idprev+'&before_step='+nmnext;
567
+ else
568
+ location.href = '/actions/stepedit/${trigger.id}?after_step='+idprev+'&before_step='+nmnext;
566
569
  })
567
570
  $("g.node").on("click", (e)=>{
568
571
  const $e = $(e.target || e).closest("g.node")
@@ -613,7 +616,8 @@ const getWorkflowStepForm = async (
613
616
  req,
614
617
  step_id,
615
618
  after_step,
616
- before_step
619
+ before_step,
620
+ after_step_for
617
621
  ) => {
618
622
  const table = trigger.table_id ? Table.findOne(trigger.table_id) : null;
619
623
  const actionExplainers = {};
@@ -632,6 +636,7 @@ const getWorkflowStepForm = async (
632
636
  try {
633
637
  const cfgFields = await getActionConfigFields(action, table, {
634
638
  mode: "workflow",
639
+ req,
635
640
  });
636
641
 
637
642
  for (const field of cfgFields) {
@@ -655,7 +660,9 @@ const getWorkflowStepForm = async (
655
660
  //if (cfgFld.input_type === "code") cfgFld.input_type = "textarea";
656
661
  actionConfigFields.push(cfgFld);
657
662
  }
658
- } catch {}
663
+ } catch {
664
+ //ignore
665
+ }
659
666
  }
660
667
  actionConfigFields.push({
661
668
  label: "Subcontext",
@@ -778,9 +785,11 @@ const getWorkflowStepForm = async (
778
785
  });
779
786
  form.hidden("wf_step_id");
780
787
  form.hidden("_after_step");
788
+ form.hidden("_after_step_for");
781
789
  if (before_step) form.values.wf_next_step = before_step;
782
790
  if (after_step == "0") form.values.wf_initial_step = true;
783
791
  else if (after_step) form.values._after_step = after_step;
792
+ else if (after_step_for) form.values._after_step_for = after_step_for;
784
793
  if (step_id) {
785
794
  const step = await WorkflowStep.findOne({ id: step_id });
786
795
  if (!step) throw new Error("Step not found");
@@ -812,7 +821,7 @@ const getMultiStepForm = async (req, id, table) => {
812
821
  const actionConfigFields = [];
813
822
  for (const [name, action] of Object.entries(stateActions)) {
814
823
  if (!stateActionKeys.includes(name)) continue;
815
- const cfgFields = await getActionConfigFields(action, table);
824
+ const cfgFields = await getActionConfigFields(action, table, { req });
816
825
 
817
826
  for (const field of cfgFields) {
818
827
  const cfgFld = {
@@ -1034,6 +1043,7 @@ router.get(
1034
1043
  const cfgFields = await getActionConfigFields(action, table, {
1035
1044
  mode: "trigger",
1036
1045
  when_trigger: trigger.when_trigger,
1046
+ req,
1037
1047
  });
1038
1048
  // create form
1039
1049
  const form = new Form({
@@ -1092,6 +1102,7 @@ router.post(
1092
1102
  const cfgFields = await getActionConfigFields(action, table, {
1093
1103
  mode: "trigger",
1094
1104
  when_trigger: trigger.when_trigger,
1105
+ req,
1095
1106
  });
1096
1107
  form = new Form({
1097
1108
  action: `/actions/configure/${id}`,
@@ -1309,14 +1320,15 @@ router.get(
1309
1320
  isAdminOrHasConfigMinRole("min_role_edit_triggers"),
1310
1321
  error_catcher(async (req, res) => {
1311
1322
  const { trigger_id, step_id } = req.params;
1312
- const { initial_step, after_step, before_step } = req.query;
1323
+ const { initial_step, after_step, before_step, after_step_for } = req.query;
1313
1324
  const trigger = await Trigger.findOne({ id: trigger_id });
1314
1325
  const form = await getWorkflowStepForm(
1315
1326
  trigger,
1316
1327
  req,
1317
1328
  step_id,
1318
1329
  after_step,
1319
- before_step
1330
+ before_step,
1331
+ after_step_for
1320
1332
  );
1321
1333
 
1322
1334
  if (initial_step) form.values.wf_initial_step = true;
@@ -1384,6 +1396,7 @@ router.post(
1384
1396
  wf_only_if,
1385
1397
  wf_step_id,
1386
1398
  _after_step,
1399
+ _after_step_for,
1387
1400
  ...configuration
1388
1401
  } = form.values;
1389
1402
  Object.entries(configuration).forEach(([k, v]) => {
@@ -1430,7 +1443,21 @@ router.post(
1430
1443
  });
1431
1444
  if (astep) await astep.update({ next_step: step.name });
1432
1445
  }
1446
+ if (_after_step_for && _after_step_for !== "undefined") {
1447
+ const astep = await WorkflowStep.findOne({
1448
+ id: _after_step_for,
1449
+ trigger_id,
1450
+ });
1451
+ if (astep)
1452
+ await astep.update({
1453
+ configuration: {
1454
+ ...step.configuration,
1455
+ loop_body_initial_step: step.name,
1456
+ },
1457
+ });
1458
+ }
1433
1459
  } catch (e) {
1460
+ console.error(e);
1434
1461
  const emsg =
1435
1462
  e.message ===
1436
1463
  'duplicate key value violates unique constraint "workflow_steps_name_uniq"'
@@ -1499,13 +1526,13 @@ router.get(
1499
1526
 
1500
1527
  const wfTable = mkTable(
1501
1528
  [
1502
- { label: "Trigger", key: (run) => trNames[run.trigger_id] },
1503
- { label: "Started", key: (run) => localeDateTime(run.started_at) },
1529
+ { label: req.__("Trigger"), key: (run) => trNames[run.trigger_id] },
1530
+ { label: req.__("Started"), key: (run) => localeDateTime(run.started_at) },
1504
1531
  {
1505
- label: "Updated",
1532
+ label: req.__("Updated"),
1506
1533
  key: (run) => localeDateTime(run.status_updated_at),
1507
1534
  },
1508
- { label: "Status", key: "status" },
1535
+ { label: req.__("Status"), key: "status" },
1509
1536
  {
1510
1537
  label: "",
1511
1538
  key: (run) => {
@@ -1710,11 +1737,17 @@ router.get(
1710
1737
  trigger_id: trigger.id,
1711
1738
  name: run.current_step_name,
1712
1739
  });
1713
-
1714
- const form = await getWorkflowStepUserForm(run, trigger, step, req);
1715
- if (req.xhr) form.xhrSubmit = true;
1716
- const title = run.wait_info.output ? "Workflow output" : "Fill form";
1717
- res.sendWrap(title, renderForm(form, req.csrfToken()));
1740
+ try {
1741
+ const form = await getWorkflowStepUserForm(run, trigger, step, req);
1742
+ if (req.xhr) form.xhrSubmit = true;
1743
+ const title = run.wait_info.output ? "Workflow output" : "Fill form";
1744
+ res.sendWrap(title, renderForm(form, req.csrfToken()));
1745
+ } catch (e) {
1746
+ console.error(e);
1747
+ await run.markAsError(e, step, req.user);
1748
+ const title = req.__("Error running workflow");
1749
+ res.sendWrap(title, renderForm(e.message, req.csrfToken()));
1750
+ }
1718
1751
  })
1719
1752
  );
1720
1753
 
package/routes/admin.js CHANGED
@@ -295,6 +295,37 @@ router.get(
295
295
  })
296
296
  );
297
297
 
298
+ router.get(
299
+ "/help-plugin/:plugin/:topic",
300
+ isAdmin,
301
+ error_catcher(async (req, res) => {
302
+ const { plugin, topic } = req.params;
303
+ const location = getState().plugin_locations[plugin];
304
+ if (location) {
305
+ const safeFile = path
306
+ .normalize(topic + ".tmd")
307
+ .replace(/^(\.\.(\/|\\|$))+/, "");
308
+ const fullpath = path.join(location, "help", safeFile);
309
+ if (fs.existsSync(fullpath)) {
310
+ const { markup } = await get_help_markup(
311
+ fullpath,
312
+ req.query,
313
+ req,
314
+ true
315
+ );
316
+
317
+ res.sendWrap(`Help: ${topic}`, { above: [markup] });
318
+ } else {
319
+ getState().log(6, `Plugin serve help: file not found ${fullpath}`);
320
+ res.status(404).send(req.__("Not found"));
321
+ }
322
+ } else {
323
+ getState().log(6, `Plugin serve heko: plogin not found ${plugin}`);
324
+ res.status(404).send(req.__("Not found"));
325
+ }
326
+ })
327
+ );
328
+
298
329
  router.get(
299
330
  "/jsdoc/*filepath",
300
331
  isAdminOrHasConfigMinRole("min_role_edit_triggers"),
@@ -727,11 +758,13 @@ router.post(
727
758
  );
728
759
  }
729
760
  res.redirect(
730
- type === "trigger"
731
- ? `/actions`
732
- : /^[a-z]+$/g.test(type)
733
- ? `/${type}edit`
734
- : "/"
761
+ type == "codepage"
762
+ ? `/admin/edit-codepage/${name}`
763
+ : type === "trigger"
764
+ ? `/actions`
765
+ : /^[a-z]+$/g.test(type)
766
+ ? `/${type}edit`
767
+ : "/"
735
768
  );
736
769
  })
737
770
  );
@@ -1114,6 +1147,7 @@ router.post(
1114
1147
  else
1115
1148
  req.flash("success", req.__("No changes detected, snapshot skipped"));
1116
1149
  } catch (e) {
1150
+ console.error(e);
1117
1151
  req.flash("error", e.message);
1118
1152
  }
1119
1153
  res.json({ reload_page: true });
@@ -1610,6 +1644,7 @@ const doInstall = async (req, res, version, deepClean, runPull) => {
1610
1644
  try {
1611
1645
  await cleanNodeModules();
1612
1646
  } catch (e) {
1647
+ console.error(e);
1613
1648
  res_write(req.__("Error cleaning node_modules: %s\n", e.message));
1614
1649
  }
1615
1650
  }
@@ -1870,6 +1905,7 @@ router.post(
1870
1905
  notify: "Certificate added, please restart server",
1871
1906
  });
1872
1907
  } catch (e) {
1908
+ console.error(e);
1873
1909
  res.json({ error: e.message });
1874
1910
  }
1875
1911
  } else {
@@ -1957,6 +1993,7 @@ router.post(
1957
1993
  );
1958
1994
  res.redirect("/useradmin/ssl");
1959
1995
  } catch (e) {
1996
+ console.error(e);
1960
1997
  req.flash("error", e.message);
1961
1998
  res.redirect("/useradmin/ssl");
1962
1999
  }
@@ -2126,7 +2163,10 @@ const buildDialogScript = (capacitorBuilderAvailable, isSbadmin2) =>
2126
2163
 
2127
2164
  const imageAvailable = async () => {
2128
2165
  try {
2129
- const image = new Docker().getImage("saltcorn/capacitor-builder");
2166
+ const state = getState();
2167
+ const image = new Docker().getImage(
2168
+ `saltcorn/capacitor-builder:${state.scVersion}`
2169
+ );
2130
2170
  await image.inspect();
2131
2171
  return true;
2132
2172
  } catch (e) {
@@ -4069,15 +4109,6 @@ router.get(
4069
4109
  values: { code: existing },
4070
4110
  noSubmitButton: true,
4071
4111
  labelCols: 0,
4072
- additionalButtons: [
4073
- {
4074
- label: req.__("Delete code page"),
4075
- class: "btn btn-outline-danger btn-sm",
4076
- onclick: `if(confirm('Are you sure you would like to delete this code page?'))ajax_post('/admin/delete-codepage/${encodeURIComponent(
4077
- name
4078
- )}')`,
4079
- },
4080
- ],
4081
4112
  fields: [
4082
4113
  {
4083
4114
  name: "code",
@@ -4094,7 +4125,7 @@ router.get(
4094
4125
  ),
4095
4126
  input_type: "code",
4096
4127
  attributes: { mode: "text/javascript" },
4097
- class: "validate-statements",
4128
+ class: "validate-statements enlarge-in-card",
4098
4129
  validator(s) {
4099
4130
  try {
4100
4131
  let AsyncFunction = Object.getPrototypeOf(
@@ -4114,7 +4145,8 @@ router.get(
4114
4145
  {}
4115
4146
  );
4116
4147
  const tags = await Tag.find();
4117
- const tagMarkup = div(
4148
+ const tagMarkup = span(
4149
+ { class: "ms-1" },
4118
4150
  "Tags:",
4119
4151
  (function_code_pages_tags[name] || []).map((tagnm) =>
4120
4152
  span(
@@ -4176,7 +4208,28 @@ router.get(
4176
4208
  contents: {
4177
4209
  type: "card",
4178
4210
  title: req.__(`%s code page`, name),
4179
- contents: [renderForm(form, req.csrfToken()), tagMarkup],
4211
+ contents: [
4212
+ renderForm(form, req.csrfToken()),
4213
+ a(
4214
+ {
4215
+ href: `javascript:if(confirm('Are you sure you would like to delete this code page?'))ajax_post('/admin/delete-codepage/${encodeURIComponent(
4216
+ name
4217
+ )}')`,
4218
+ class: "me-1 text-danger",
4219
+ },
4220
+ req.__("Delete code page")
4221
+ ),
4222
+ " | ",
4223
+ a(
4224
+ {
4225
+ href: `javascript:ajax_modal('/admin/snapshot-restore/codepage/${name}')`,
4226
+ class: "ms-1 me-1",
4227
+ },
4228
+ req.__("Restore")
4229
+ ),
4230
+ " | ",
4231
+ tagMarkup,
4232
+ ],
4180
4233
  },
4181
4234
  });
4182
4235
  })
@@ -4194,9 +4247,9 @@ router.post(
4194
4247
  ...code_pages,
4195
4248
  [name]: code,
4196
4249
  });
4197
- await getState().refresh_codepages();
4198
-
4199
- res.json({ success: true });
4250
+ const err = await getState().refresh_codepages();
4251
+ if (err) res.json({ success: false, error: `Error evaluating code pages: ${err}` });
4252
+ else res.json({ success: true });
4200
4253
  })
4201
4254
  );
4202
4255
  router.post(
@@ -93,7 +93,8 @@ const tablesList = async (
93
93
  {
94
94
  label: tagsDropdown(
95
95
  tags,
96
- filterOnTag ? `Tag:${filterOnTag.name}` : undefined
96
+ filterOnTag ? `Tag:${filterOnTag.name}` : undefined,
97
+ req
97
98
  ),
98
99
  key: (r) => tagBadges(r),
99
100
  },
@@ -240,7 +241,7 @@ const tagBadge = (tag, type) =>
240
241
  tag.name
241
242
  );
242
243
 
243
- const tagsDropdown = (tags, altHeader) =>
244
+ const tagsDropdown = (tags, altHeader, req) =>
244
245
  div(
245
246
  { class: "dropdown" },
246
247
  div(
@@ -253,7 +254,7 @@ const tagsDropdown = (tags, altHeader) =>
253
254
  "aria-haspopup": "true",
254
255
  "aria-expanded": "false",
255
256
  },
256
- altHeader || "Tags",
257
+ altHeader || req.__("Tags"),
257
258
  i({ class: "ms-1 fas fa-caret-down" })
258
259
  ),
259
260
  div(
@@ -267,7 +268,7 @@ const tagsDropdown = (tags, altHeader) =>
267
268
  // TODO check url why view for page, what do we need for page group
268
269
  href: `javascript:unset_state_field('_tag', this)`,
269
270
  },
270
- "All tags"
271
+ req.__("All tags")
271
272
  ),
272
273
  tags.map((tag) =>
273
274
  a(
@@ -285,7 +286,7 @@ const tagsDropdown = (tags, altHeader) =>
285
286
  // TODO check url why view for page, what do we need for page group
286
287
  href: `tag`,
287
288
  },
288
- "Manage tags..."
289
+ req.__("Manage tags...")
289
290
  )
290
291
  )
291
292
  );
@@ -314,7 +315,7 @@ const mkAddBtn = (tags, entityType, id, req, myTagIds, on_done_redirect_str) =>
314
315
  post_dropdown_item(
315
316
  `/tag-entries/add-tag-entity/${encodeURIComponent(
316
317
  t.name
317
- )}/${entityType}/${id}${on_done_redirect_str||""}`,
318
+ )}/${entityType}/${id}${on_done_redirect_str || ""}`,
318
319
  t.name,
319
320
  req
320
321
  )
@@ -345,7 +346,14 @@ const viewsList = async (
345
346
  const tagBadges = (view) => {
346
347
  const myTags = tag_entries.filter((te) => te.view_id === view.id);
347
348
  const myTagIds = new Set(myTags.map((t) => t.tag_id));
348
- const addBtn = mkAddBtn(tags, "views", view.id, req, myTagIds, on_done_redirect_str);
349
+ const addBtn = mkAddBtn(
350
+ tags,
351
+ "views",
352
+ view.id,
353
+ req,
354
+ myTagIds,
355
+ on_done_redirect_str
356
+ );
349
357
  return (
350
358
  myTags.map((te) => tagBadge(tagsById[te.tag_id], "views")).join(nbsp) +
351
359
  addBtn
@@ -380,7 +388,8 @@ const viewsList = async (
380
388
  {
381
389
  label: tagsDropdown(
382
390
  tags,
383
- filterOnTag ? `Tag:${filterOnTag.name}` : undefined
391
+ filterOnTag ? `Tag:${filterOnTag.name}` : undefined,
392
+ req
384
393
  ),
385
394
  key: (r) => tagBadges(r),
386
395
  },
@@ -585,7 +594,8 @@ const getPageList = async (
585
594
  {
586
595
  label: tagsDropdown(
587
596
  tags,
588
- filterOnTag ? `Tag:${filterOnTag.name}` : undefined
597
+ filterOnTag ? `Tag:${filterOnTag.name}` : undefined,
598
+ req
589
599
  ),
590
600
  key: (r) => tagBadges(r),
591
601
  },
@@ -709,7 +719,14 @@ const getTriggerList = async (
709
719
  const myTagIds = new Set(myTags.map((t) => t.tag_id));
710
720
  return (
711
721
  myTags.map((te) => tagBadge(tagsById[te.tag_id], "triggers")).join(nbsp) +
712
- mkAddBtn(tags, "triggers", trigger.id, req, myTagIds, on_done_redirect_str)
722
+ mkAddBtn(
723
+ tags,
724
+ "triggers",
725
+ trigger.id,
726
+ req,
727
+ myTagIds,
728
+ on_done_redirect_str
729
+ )
713
730
  );
714
731
  };
715
732
  return mkTable(
@@ -729,7 +746,8 @@ const getTriggerList = async (
729
746
  {
730
747
  label: tagsDropdown(
731
748
  tags,
732
- filterOnTag ? `Tag:${filterOnTag.name}` : undefined
749
+ filterOnTag ? `Tag:${filterOnTag.name}` : undefined,
750
+ req
733
751
  ),
734
752
  key: (r) => tagBadges(r),
735
753
  },
package/routes/delete.js CHANGED
@@ -57,6 +57,7 @@ router.post(
57
57
  req.__("Not allowed to write to table %s", table.name)
58
58
  );
59
59
  } catch (e) {
60
+ console.error(e);
60
61
  req.flash("error", e.message);
61
62
  }
62
63
  if (req.xhr) res.send("OK");
package/routes/fields.js CHANGED
@@ -230,7 +230,7 @@ const translateAttributes = (attrs, req) =>
230
230
  * @returns {object}
231
231
  */
232
232
  const translateAttribute = (attr, req) => {
233
- let res = { ...attr };
233
+ let res = { ...attr, label: req.__(attr.label) };
234
234
  if (res.sublabel) res.sublabel = req.__(res.sublabel);
235
235
  if (res.isRepeat) res = new FieldRepeat(res);
236
236
  return res;
@@ -322,6 +322,7 @@ const fieldFlow = (req) =>
322
322
  }
323
323
  );
324
324
  } catch (e) {
325
+ console.error(e);
325
326
  return {
326
327
  redirect: `/table/${context.table_id}`,
327
328
  flash: ["error", e.message],
@@ -340,6 +341,7 @@ const fieldFlow = (req) =>
340
341
  }
341
342
  );
342
343
  } catch (e) {
344
+ console.error(e);
343
345
  return {
344
346
  redirect: `/table/${context.table_id}`,
345
347
  flash: ["error", e.message],
@@ -1430,7 +1432,8 @@ router.post(
1430
1432
  [field],
1431
1433
  false,
1432
1434
  0,
1433
- mode
1435
+ mode,
1436
+ req
1434
1437
  );
1435
1438
  const formFields = fieldViewConfigForms[field.name][fv_name];
1436
1439
  if (!formFields) {