@saltcorn/server 1.1.3-beta.1 → 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 (417) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/auth/admin.js +2 -0
  3. package/auth/resetpw.js +37 -9
  4. package/auth/roleadmin.js +1 -0
  5. package/auth/routes.js +22 -8
  6. package/docs/assets/search.js +1 -1
  7. package/docs/classes/_saltcorn_common_code.Relation.html +8 -8
  8. package/docs/classes/_saltcorn_common_code.RelationsFinder.html +5 -5
  9. package/docs/classes/_saltcorn_data.models.Crash-1.html +18 -18
  10. package/docs/classes/_saltcorn_data.models.EventLog-1.html +19 -19
  11. package/docs/classes/_saltcorn_data.models.Field.html +71 -71
  12. package/docs/classes/_saltcorn_data.models.FieldRepeat-1.html +17 -17
  13. package/docs/classes/_saltcorn_data.models.File-1.html +48 -48
  14. package/docs/classes/_saltcorn_data.models.Form-1.html +38 -38
  15. package/docs/classes/_saltcorn_data.models.Library.html +13 -13
  16. package/docs/classes/_saltcorn_data.models.Page.html +23 -23
  17. package/docs/classes/_saltcorn_data.models.PageGroup-1.html +25 -25
  18. package/docs/classes/_saltcorn_data.models.Plugin.html +25 -25
  19. package/docs/classes/_saltcorn_data.models.Role.html +9 -9
  20. package/docs/classes/_saltcorn_data.models.Table-1.html +90 -111
  21. package/docs/classes/_saltcorn_data.models.TableConstraint-1.html +14 -14
  22. package/docs/classes/_saltcorn_data.models.Trigger.html +34 -34
  23. package/docs/classes/_saltcorn_data.models.User-1.html +47 -47
  24. package/docs/classes/_saltcorn_data.models.View-1.html +55 -53
  25. package/docs/classes/_saltcorn_data.models.Workflow-1.html +17 -17
  26. package/docs/classes/_saltcorn_data.models.WorkflowRun.html +57 -36
  27. package/docs/classes/_saltcorn_data.models.WorkflowStep.html +39 -24
  28. package/docs/classes/_saltcorn_data.models.WorkflowTrace.html +18 -18
  29. package/docs/classes/_saltcorn_mobile_builder.MobileBuilder.html +36 -43
  30. package/docs/enums/_saltcorn_common_code.RelationType.html +7 -7
  31. package/docs/enums/_saltcorn_common_code.ViewDisplayType.html +4 -4
  32. package/docs/functions/_saltcorn_admin_models.backup.create_backup.html +1 -1
  33. package/docs/functions/_saltcorn_admin_models.backup.create_csv_from_rows.html +1 -1
  34. package/docs/functions/_saltcorn_admin_models.backup.restore.html +1 -1
  35. package/docs/functions/_saltcorn_admin_models.pack.add_to_menu.html +1 -1
  36. package/docs/functions/_saltcorn_admin_models.pack.can_install_pack.html +1 -1
  37. package/docs/functions/_saltcorn_admin_models.pack.fetch_available_packs.html +1 -1
  38. package/docs/functions/_saltcorn_admin_models.pack.fetch_pack_by_name.html +1 -1
  39. package/docs/functions/_saltcorn_admin_models.pack.install_pack.html +1 -1
  40. package/docs/functions/_saltcorn_admin_models.pack.library_pack.html +1 -1
  41. package/docs/functions/_saltcorn_admin_models.pack.model_instance_pack.html +1 -1
  42. package/docs/functions/_saltcorn_admin_models.pack.model_pack.html +1 -1
  43. package/docs/functions/_saltcorn_admin_models.pack.page_group_pack.html +1 -1
  44. package/docs/functions/_saltcorn_admin_models.pack.page_pack.html +1 -1
  45. package/docs/functions/_saltcorn_admin_models.pack.plugin_pack.html +1 -1
  46. package/docs/functions/_saltcorn_admin_models.pack.role_pack.html +1 -1
  47. package/docs/functions/_saltcorn_admin_models.pack.table_pack.html +1 -1
  48. package/docs/functions/_saltcorn_admin_models.pack.trigger_pack.html +1 -1
  49. package/docs/functions/_saltcorn_admin_models.pack.uninstall_pack.html +1 -1
  50. package/docs/functions/_saltcorn_admin_models.pack.view_pack.html +1 -1
  51. package/docs/functions/_saltcorn_admin_models.tenant.copy_tenant_template.html +1 -1
  52. package/docs/functions/_saltcorn_admin_models.tenant.create_tenant.html +1 -1
  53. package/docs/functions/_saltcorn_admin_models.tenant.deleteTenant.html +1 -1
  54. package/docs/functions/_saltcorn_admin_models.tenant.domain_sanitize.html +1 -1
  55. package/docs/functions/_saltcorn_admin_models.tenant.eachTenant.html +1 -1
  56. package/docs/functions/_saltcorn_admin_models.tenant.getAllTenantRows.html +1 -1
  57. package/docs/functions/_saltcorn_admin_models.tenant.getAllTenants.html +1 -1
  58. package/docs/functions/_saltcorn_admin_models.tenant.insertTenant.html +1 -1
  59. package/docs/functions/_saltcorn_admin_models.tenant.switchToTenant.html +1 -1
  60. package/docs/functions/_saltcorn_common_code.buildTableCaches.html +1 -1
  61. package/docs/functions/_saltcorn_common_code.parseLegacyRelation.html +1 -1
  62. package/docs/functions/_saltcorn_common_code.parseRelationPath.html +1 -1
  63. package/docs/functions/_saltcorn_data.models.config.check_email_mask.html +1 -1
  64. package/docs/functions/_saltcorn_data.models.config.deleteConfig.html +1 -1
  65. package/docs/functions/_saltcorn_data.models.config.getAllConfig.html +1 -1
  66. package/docs/functions/_saltcorn_data.models.config.getConfig.html +1 -1
  67. package/docs/functions/_saltcorn_data.models.config.get_base_url.html +1 -1
  68. package/docs/functions/_saltcorn_data.models.config.get_latest_npm_version.html +1 -1
  69. package/docs/functions/_saltcorn_data.models.config.remove_from_menu.html +1 -1
  70. package/docs/functions/_saltcorn_data.models.config.save_menu_items.html +1 -1
  71. package/docs/functions/_saltcorn_data.models.config.setConfig.html +1 -1
  72. package/docs/functions/_saltcorn_data.models.discovery.discover_tables.html +1 -1
  73. package/docs/functions/_saltcorn_data.models.discovery.discoverable_tables.html +1 -1
  74. package/docs/functions/_saltcorn_data.models.discovery.findType.html +1 -1
  75. package/docs/functions/_saltcorn_data.models.discovery.get_existing_views.html +1 -1
  76. package/docs/functions/_saltcorn_data.models.discovery.implement_discovery.html +1 -1
  77. package/docs/functions/_saltcorn_data.models.email.getMailTransport.html +1 -1
  78. package/docs/functions/_saltcorn_data.models.email.send_verification_email.html +1 -1
  79. package/docs/functions/_saltcorn_data.models.email.viewToEmailHtml.html +1 -1
  80. package/docs/functions/_saltcorn_data.models.expression.apply_calculated_fields.html +1 -1
  81. package/docs/functions/_saltcorn_data.models.expression.apply_calculated_fields_stored.html +1 -1
  82. package/docs/functions/_saltcorn_data.models.expression.eval_expression.html +1 -1
  83. package/docs/functions/_saltcorn_data.models.expression.expressionValidator.html +1 -1
  84. package/docs/functions/_saltcorn_data.models.expression.get_async_expression_function.html +1 -1
  85. package/docs/functions/_saltcorn_data.models.expression.get_expression_function.html +1 -1
  86. package/docs/functions/_saltcorn_data.models.expression.jsexprToWhere.html +1 -1
  87. package/docs/functions/_saltcorn_data.models.expression.recalculate_for_stored.html +1 -1
  88. package/docs/functions/_saltcorn_data.models.expression.transform_for_async.html +1 -1
  89. package/docs/functions/_saltcorn_data.models.layout.eachView.html +1 -1
  90. package/docs/functions/_saltcorn_data.models.layout.getStringsForI18n.html +1 -1
  91. package/docs/functions/_saltcorn_data.models.layout.getViews.html +1 -1
  92. package/docs/functions/_saltcorn_data.models.layout.translateLayout.html +1 -1
  93. package/docs/functions/_saltcorn_data.models.layout.traverse.html +1 -1
  94. package/docs/functions/_saltcorn_data.models.layout.traverseSync.html +1 -1
  95. package/docs/functions/_saltcorn_data.models.random.all_views.html +1 -1
  96. package/docs/functions/_saltcorn_data.models.random.fill_table_row.html +1 -1
  97. package/docs/functions/_saltcorn_data.models.random.initial_view.html +1 -1
  98. package/docs/functions/_saltcorn_data.models.random.random_table.html +1 -1
  99. package/docs/functions/_saltcorn_db_common.buildInsertBulkSql.html +1 -1
  100. package/docs/functions/_saltcorn_db_common.buildInsertSql.html +1 -1
  101. package/docs/functions/_saltcorn_db_common.doCount.html +1 -1
  102. package/docs/functions/_saltcorn_db_common.doDeleteWhere.html +1 -1
  103. package/docs/functions/_saltcorn_db_common.doListScTables.html +1 -1
  104. package/docs/functions/_saltcorn_db_common.doListTables.html +1 -1
  105. package/docs/functions/_saltcorn_db_common.doListUserDefinedTables.html +1 -1
  106. package/docs/functions/_saltcorn_db_common.do_add_index.html +1 -1
  107. package/docs/functions/_saltcorn_db_common.do_drop_index.html +1 -1
  108. package/docs/functions/_saltcorn_db_common.ftsFieldsSqlExpr.html +1 -1
  109. package/docs/functions/_saltcorn_db_common.mkSelectOptions.html +1 -1
  110. package/docs/functions/_saltcorn_db_common.mkVal.html +1 -1
  111. package/docs/functions/_saltcorn_db_common.mkWhere.html +1 -1
  112. package/docs/functions/_saltcorn_db_common.multi_tenant.enable_multi_tenant.html +1 -1
  113. package/docs/functions/_saltcorn_db_common.multi_tenant.getTenantSchema.html +1 -1
  114. package/docs/functions/_saltcorn_db_common.multi_tenant.init.html +1 -1
  115. package/docs/functions/_saltcorn_db_common.multi_tenant.is_it_multi_tenant.html +1 -1
  116. package/docs/functions/_saltcorn_db_common.multi_tenant.runWithTenant.html +1 -1
  117. package/docs/functions/_saltcorn_db_common.orderByIsObject.html +1 -1
  118. package/docs/functions/_saltcorn_db_common.orderByIsOperator.html +1 -1
  119. package/docs/functions/_saltcorn_db_common.prefixFieldsInWhere.html +1 -1
  120. package/docs/functions/_saltcorn_db_common.reprAsJson.html +1 -1
  121. package/docs/functions/_saltcorn_db_common.single_tenant.enable_multi_tenant.html +1 -1
  122. package/docs/functions/_saltcorn_db_common.single_tenant.getTenantSchema.html +1 -1
  123. package/docs/functions/_saltcorn_db_common.single_tenant.init.html +1 -1
  124. package/docs/functions/_saltcorn_db_common.single_tenant.is_it_multi_tenant.html +1 -1
  125. package/docs/functions/_saltcorn_db_common.single_tenant.runWithTenant.html +1 -1
  126. package/docs/functions/_saltcorn_db_common.sqlBinOp.html +1 -1
  127. package/docs/functions/_saltcorn_db_common.sqlFun.html +1 -1
  128. package/docs/functions/_saltcorn_db_common.sqlsanitize.html +1 -1
  129. package/docs/functions/_saltcorn_db_common.sqlsanitizeAllowDots.html +1 -1
  130. package/docs/functions/_saltcorn_db_common.subSelectWhere.html +1 -1
  131. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.androidFeatures.html +95 -0
  132. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.androidPermissions.html +95 -0
  133. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.buildTablesFile.html +4 -2
  134. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyPrepopulatedDb.html +4 -2
  135. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyServerFiles.html +4 -2
  136. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyShareExtFiles.html +4 -2
  137. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copySiteLogo.html +4 -2
  138. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyTranslationFiles.html +4 -2
  139. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.createSqliteDb.html +4 -2
  140. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.decodeProvisioningProfile.html +4 -2
  141. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.extractDomain.html +4 -2
  142. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.generateAndroidVersionCode.html +4 -2
  143. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyAndroidManifest.html +6 -6
  144. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyConfigXml.html +4 -2
  145. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyGradleConfig.html +4 -2
  146. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyInfoPlist.html +4 -2
  147. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyXcodeProjectFile.html +4 -2
  148. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepAppIcon.html +4 -2
  149. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareAppIcon.html +4 -2
  150. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareBuildDir.html +4 -2
  151. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareExportOptionsPlist.html +4 -2
  152. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareSplashIcon.html +4 -2
  153. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareSplashPage.html +4 -2
  154. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeCapacitorConfig.html +4 -2
  155. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeCfgFile.html +4 -2
  156. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeDataExtractionRules.html +4 -2
  157. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeNetworkSecurityConfig.html +4 -2
  158. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writePodfile.html +4 -2
  159. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writePrivacyInfo.html +4 -2
  160. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.bundleMobileAppCode.html +2 -1
  161. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.bundlePackagesAndPlugins.html +2 -1
  162. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.copyMobileAppDirs.html +74 -0
  163. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.copyPublicDirs.html +2 -1
  164. package/docs/functions/_saltcorn_sqlite.add_index.html +1 -1
  165. package/docs/functions/_saltcorn_sqlite.add_unique_constraint.html +1 -1
  166. package/docs/functions/_saltcorn_sqlite.begin.html +1 -1
  167. package/docs/functions/_saltcorn_sqlite.changeConnection.html +1 -1
  168. package/docs/functions/_saltcorn_sqlite.close.html +1 -1
  169. package/docs/functions/_saltcorn_sqlite.commit.html +1 -1
  170. package/docs/functions/_saltcorn_sqlite.count.html +1 -1
  171. package/docs/functions/_saltcorn_sqlite.deleteWhere.html +1 -1
  172. package/docs/functions/_saltcorn_sqlite.dropTable.html +1 -1
  173. package/docs/functions/_saltcorn_sqlite.dropTables.html +1 -1
  174. package/docs/functions/_saltcorn_sqlite.drop_index.html +1 -1
  175. package/docs/functions/_saltcorn_sqlite.drop_reset_schema.html +1 -1
  176. package/docs/functions/_saltcorn_sqlite.drop_unique_constraint.html +1 -1
  177. package/docs/functions/_saltcorn_sqlite.getVersion.html +1 -1
  178. package/docs/functions/_saltcorn_sqlite.get_db_filepath.html +1 -1
  179. package/docs/functions/_saltcorn_sqlite.get_sql_logging.html +1 -1
  180. package/docs/functions/_saltcorn_sqlite.init.html +1 -1
  181. package/docs/functions/_saltcorn_sqlite.insert.html +1 -1
  182. package/docs/functions/_saltcorn_sqlite.listScTables.html +1 -1
  183. package/docs/functions/_saltcorn_sqlite.listTables.html +1 -1
  184. package/docs/functions/_saltcorn_sqlite.listUserDefinedTables.html +1 -1
  185. package/docs/functions/_saltcorn_sqlite.query.html +1 -1
  186. package/docs/functions/_saltcorn_sqlite.rollback.html +1 -1
  187. package/docs/functions/_saltcorn_sqlite.select.html +1 -1
  188. package/docs/functions/_saltcorn_sqlite.selectMaybeOne.html +1 -1
  189. package/docs/functions/_saltcorn_sqlite.selectOne.html +1 -1
  190. package/docs/functions/_saltcorn_sqlite.set_sql_logging.html +1 -1
  191. package/docs/functions/_saltcorn_sqlite.slugify.html +1 -1
  192. package/docs/functions/_saltcorn_sqlite.sql_log.html +1 -1
  193. package/docs/functions/_saltcorn_sqlite.update.html +1 -1
  194. package/docs/functions/_saltcorn_sqlite.updateWhere.html +1 -1
  195. package/docs/functions/_saltcorn_sqlite_mobile.add_index.html +1 -1
  196. package/docs/functions/_saltcorn_sqlite_mobile.add_unique_constraint.html +1 -1
  197. package/docs/functions/_saltcorn_sqlite_mobile.count.html +1 -1
  198. package/docs/functions/_saltcorn_sqlite_mobile.deleteWhere.html +1 -1
  199. package/docs/functions/_saltcorn_sqlite_mobile.drop_index.html +1 -1
  200. package/docs/functions/_saltcorn_sqlite_mobile.drop_reset_schema.html +1 -1
  201. package/docs/functions/_saltcorn_sqlite_mobile.drop_unique_constraint.html +1 -1
  202. package/docs/functions/_saltcorn_sqlite_mobile.init.html +1 -1
  203. package/docs/functions/_saltcorn_sqlite_mobile.insert.html +1 -1
  204. package/docs/functions/_saltcorn_sqlite_mobile.insertRows.html +1 -1
  205. package/docs/functions/_saltcorn_sqlite_mobile.listScTables.html +1 -1
  206. package/docs/functions/_saltcorn_sqlite_mobile.listTables.html +1 -1
  207. package/docs/functions/_saltcorn_sqlite_mobile.listUserDefinedTables.html +1 -1
  208. package/docs/functions/_saltcorn_sqlite_mobile.query.html +1 -1
  209. package/docs/functions/_saltcorn_sqlite_mobile.select.html +1 -1
  210. package/docs/functions/_saltcorn_sqlite_mobile.selectMaybeOne.html +1 -1
  211. package/docs/functions/_saltcorn_sqlite_mobile.selectOne.html +1 -1
  212. package/docs/functions/_saltcorn_sqlite_mobile.setConnectionObject.html +1 -1
  213. package/docs/functions/_saltcorn_sqlite_mobile.tableExists.html +1 -1
  214. package/docs/functions/_saltcorn_sqlite_mobile.time.html +1 -1
  215. package/docs/functions/_saltcorn_sqlite_mobile.update.html +1 -1
  216. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_field.instanceOfField.html +1 -1
  217. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_page.instanceOfPage.html +1 -1
  218. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_view.instanceOfView.html +1 -1
  219. package/docs/functions/_saltcorn_types.Types.base_types.instanceOWithHtmlFile.html +2 -1
  220. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfErrorMsg.html +1 -1
  221. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfSuccessMsg.html +1 -1
  222. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfType.html +1 -1
  223. package/docs/functions/_saltcorn_types.generators.generateBool.html +1 -1
  224. package/docs/functions/_saltcorn_types.generators.generateString.html +1 -1
  225. package/docs/functions/_saltcorn_types.generators.num_between.html +1 -1
  226. package/docs/functions/_saltcorn_types.generators.oneOf.html +1 -1
  227. package/docs/interfaces/_saltcorn_mobile_builder.common_build_utils.ScCapacitorConfig.html +13 -11
  228. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_field.AbstractField.html +14 -14
  229. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_field.AbstractFieldRepeat.html +3 -3
  230. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_form.AbstractForm.html +26 -26
  231. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_page.AbstractPage.html +7 -7
  232. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_role.AbstractRole.html +3 -3
  233. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_table.AbstractTable.html +7 -7
  234. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_trigger.AbstractTrigger.html +16 -16
  235. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_view.AbstractView.html +10 -10
  236. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_workflow.AbstractWorkflow.html +13 -13
  237. package/docs/modules/_saltcorn_admin_models.backup.html +1 -1
  238. package/docs/modules/_saltcorn_admin_models.html +1 -1
  239. package/docs/modules/_saltcorn_admin_models.pack.html +1 -1
  240. package/docs/modules/_saltcorn_admin_models.tenant.html +1 -1
  241. package/docs/modules/_saltcorn_common_code.html +1 -1
  242. package/docs/modules/_saltcorn_data.html +3 -3
  243. package/docs/modules/_saltcorn_data.models.Crash.html +2 -2
  244. package/docs/modules/_saltcorn_data.models.EventLog.html +2 -2
  245. package/docs/modules/_saltcorn_data.models.FieldRepeat.html +2 -2
  246. package/docs/modules/_saltcorn_data.models.File.html +2 -2
  247. package/docs/modules/_saltcorn_data.models.Form.html +2 -2
  248. package/docs/modules/_saltcorn_data.models.PageGroup.html +2 -2
  249. package/docs/modules/_saltcorn_data.models.Table.html +2 -2
  250. package/docs/modules/_saltcorn_data.models.TableConstraint.html +2 -2
  251. package/docs/modules/_saltcorn_data.models.User.html +2 -2
  252. package/docs/modules/_saltcorn_data.models.View.html +2 -2
  253. package/docs/modules/_saltcorn_data.models.Workflow.html +2 -2
  254. package/docs/modules/_saltcorn_data.models.config.html +1 -1
  255. package/docs/modules/_saltcorn_data.models.discovery.html +1 -1
  256. package/docs/modules/_saltcorn_data.models.email.html +1 -1
  257. package/docs/modules/_saltcorn_data.models.expression.html +1 -1
  258. package/docs/modules/_saltcorn_data.models.html +1 -1
  259. package/docs/modules/_saltcorn_data.models.layout.html +1 -1
  260. package/docs/modules/_saltcorn_data.models.random.html +1 -1
  261. package/docs/modules/_saltcorn_data.models.scheduler.html +1 -1
  262. package/docs/modules/_saltcorn_data.plugin_helper.html +1 -1
  263. package/docs/modules/_saltcorn_data.utils.html +1 -1
  264. package/docs/modules/_saltcorn_db_common.html +2 -2
  265. package/docs/modules/_saltcorn_db_common.multi_tenant.html +1 -1
  266. package/docs/modules/_saltcorn_db_common.single_tenant.html +1 -1
  267. package/docs/modules/_saltcorn_markup.html +2 -2
  268. package/docs/modules/_saltcorn_mobile_builder.common_build_utils.html +6 -2
  269. package/docs/modules/_saltcorn_mobile_builder.html +1 -1
  270. package/docs/modules/_saltcorn_mobile_builder.package_bundle_utils.html +3 -1
  271. package/docs/modules/_saltcorn_sqlite.html +1 -1
  272. package/docs/modules/_saltcorn_sqlite_mobile.html +1 -1
  273. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_field.html +1 -1
  274. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_form.html +1 -1
  275. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_library.html +1 -1
  276. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_page.html +1 -1
  277. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_plugin.html +1 -1
  278. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_role.html +1 -1
  279. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_table.html +1 -1
  280. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_trigger.html +1 -1
  281. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_view.html +1 -1
  282. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_workflow.html +1 -1
  283. package/docs/modules/_saltcorn_types.ModelAbstracts.html +1 -1
  284. package/docs/modules/_saltcorn_types.Types.base_types.html +3 -1
  285. package/docs/modules/_saltcorn_types.Types.common_types.html +1 -1
  286. package/docs/modules/_saltcorn_types.Types.html +1 -1
  287. package/docs/modules/_saltcorn_types.generators.html +1 -1
  288. package/docs/modules/_saltcorn_types.html +1 -1
  289. package/docs/types/_saltcorn_data.models.Crash.CrashCfg.html +1 -1
  290. package/docs/types/_saltcorn_data.models.EventLog.EventLogCfg.html +1 -1
  291. package/docs/types/_saltcorn_data.models.FieldRepeat.FieldRepeatCfg.html +1 -1
  292. package/docs/types/_saltcorn_data.models.File.FileCfg.html +1 -1
  293. package/docs/types/_saltcorn_data.models.Form.AdditionalButton.html +1 -1
  294. package/docs/types/_saltcorn_data.models.Form.FormCfg.html +1 -1
  295. package/docs/types/_saltcorn_data.models.PageGroup.ScreenInfoParams.html +1 -1
  296. package/docs/types/_saltcorn_data.models.Table.ChildRelations.html +1 -1
  297. package/docs/types/_saltcorn_data.models.Table.ParentRelations.html +1 -1
  298. package/docs/types/_saltcorn_data.models.Table.RelationData.html +1 -1
  299. package/docs/types/_saltcorn_data.models.TableConstraint.TableConstraintCfg.html +1 -1
  300. package/docs/types/_saltcorn_data.models.User.UserCfg.html +1 -1
  301. package/docs/types/_saltcorn_data.models.View.FindViewsPred.html +1 -1
  302. package/docs/types/_saltcorn_data.models.Workflow.WorkflowCfg.html +1 -1
  303. package/docs/types/_saltcorn_db_common.AggregationOptions.html +1 -1
  304. package/docs/types/_saltcorn_db_common.CoordOpts.html +1 -1
  305. package/docs/types/_saltcorn_db_common.JoinField.html +1 -1
  306. package/docs/types/_saltcorn_db_common.JoinFields.html +1 -1
  307. package/docs/types/_saltcorn_db_common.JoinOptions.html +1 -1
  308. package/docs/types/_saltcorn_db_common.JsonPath.html +1 -1
  309. package/docs/types/_saltcorn_db_common.JsonPathElem.html +1 -1
  310. package/docs/types/_saltcorn_db_common.Operator.html +1 -1
  311. package/docs/types/_saltcorn_db_common.PrimaryKeyValue.html +1 -1
  312. package/docs/types/_saltcorn_db_common.Row.html +1 -1
  313. package/docs/types/_saltcorn_db_common.SelectOptions.html +1 -1
  314. package/docs/types/_saltcorn_db_common.SqlAndValues.html +1 -1
  315. package/docs/types/_saltcorn_db_common.SubselectOptions.html +1 -1
  316. package/docs/types/_saltcorn_db_common.Value.html +1 -1
  317. package/docs/types/_saltcorn_db_common.Where.html +1 -1
  318. package/docs/types/_saltcorn_mobile_builder.IosCfg.html +1 -1
  319. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_field.FieldCfg.html +1 -1
  320. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_field.InputType.html +1 -1
  321. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_form.AdditionalButton.html +1 -1
  322. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_library.LibraryCfg.html +1 -1
  323. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_library.LibraryPack.html +1 -1
  324. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_page.PageCfg.html +1 -1
  325. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_page.PagePack.html +1 -1
  326. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_plugin.PluginCfg.html +1 -1
  327. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_plugin.PluginPack.html +1 -1
  328. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_role.RoleCfg.html +1 -1
  329. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_role.RolePack.html +1 -1
  330. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_table.TableCfg.html +1 -1
  331. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_table.TablePack.html +1 -1
  332. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_trigger.TriggerCfg.html +1 -1
  333. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_trigger.TriggerPack.html +1 -1
  334. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_view.ViewCfg.html +1 -1
  335. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_view.ViewPack.html +1 -1
  336. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_workflow.ConfigWorkflowStep.html +1 -1
  337. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_workflow.RunResult.html +1 -1
  338. package/docs/types/_saltcorn_types.Types.base_types.Action.html +2 -1
  339. package/docs/types/_saltcorn_types.Types.base_types.AuthenticationMethod.html +2 -1
  340. package/docs/types/_saltcorn_types.Types.base_types.CapacitorPlugin.html +110 -0
  341. package/docs/types/_saltcorn_types.Types.base_types.CodePagePack.html +2 -1
  342. package/docs/types/_saltcorn_types.Types.base_types.Column.html +2 -1
  343. package/docs/types/_saltcorn_types.Types.base_types.ConnectedObjects.html +2 -1
  344. package/docs/types/_saltcorn_types.Types.base_types.CopilotSkill.html +2 -1
  345. package/docs/types/_saltcorn_types.Types.base_types.FieldLike.html +2 -1
  346. package/docs/types/_saltcorn_types.Types.base_types.FieldView.html +2 -1
  347. package/docs/types/_saltcorn_types.Types.base_types.Header.html +2 -1
  348. package/docs/types/_saltcorn_types.Types.base_types.JoinFieldOption.html +2 -1
  349. package/docs/types/_saltcorn_types.Types.base_types.Layout.html +2 -1
  350. package/docs/types/_saltcorn_types.Types.base_types.MobileConfig.html +2 -1
  351. package/docs/types/_saltcorn_types.Types.base_types.ModelPattern.html +2 -1
  352. package/docs/types/_saltcorn_types.Types.base_types.Pack.html +2 -1
  353. package/docs/types/_saltcorn_types.Types.base_types.Plugin.html +2 -1
  354. package/docs/types/_saltcorn_types.Types.base_types.PluginFunction.html +2 -1
  355. package/docs/types/_saltcorn_types.Types.base_types.PluginLayout.html +2 -1
  356. package/docs/types/_saltcorn_types.Types.base_types.PluginRoute.html +2 -1
  357. package/docs/types/_saltcorn_types.Types.base_types.PluginSourceType.html +2 -1
  358. package/docs/types/_saltcorn_types.Types.base_types.PluginType.html +2 -1
  359. package/docs/types/_saltcorn_types.Types.base_types.PluginWrap.html +2 -1
  360. package/docs/types/_saltcorn_types.Types.base_types.PluginWrapArg.html +2 -1
  361. package/docs/types/_saltcorn_types.Types.base_types.RelationOption.html +2 -1
  362. package/docs/types/_saltcorn_types.Types.base_types.Req.html +2 -1
  363. package/docs/types/_saltcorn_types.Types.base_types.Res.html +2 -1
  364. package/docs/types/_saltcorn_types.Types.base_types.RouteAction.html +2 -1
  365. package/docs/types/_saltcorn_types.Types.base_types.RunExtra.html +2 -1
  366. package/docs/types/_saltcorn_types.Types.base_types.TableProvider.html +2 -1
  367. package/docs/types/_saltcorn_types.Types.base_types.TableQuery.html +2 -1
  368. package/docs/types/_saltcorn_types.Types.base_types.Tablely.html +2 -1
  369. package/docs/types/_saltcorn_types.Types.base_types.ViewTemplate.html +5 -2
  370. package/docs/types/_saltcorn_types.Types.common_types.ErrorMessage.html +1 -1
  371. package/docs/types/_saltcorn_types.Types.common_types.GenObj.html +1 -1
  372. package/docs/types/_saltcorn_types.Types.common_types.ReqRes.html +1 -1
  373. package/docs/types/_saltcorn_types.Types.common_types.ResultMessage.html +1 -1
  374. package/docs/types/_saltcorn_types.Types.common_types.SuccessMessage.html +1 -1
  375. package/docs/types/_saltcorn_types.Types.common_types.Type.html +1 -1
  376. package/docs/variables/_saltcorn_data.db.html +1 -1
  377. package/docs/variables/_saltcorn_data.migrations.html +1 -1
  378. package/docs/variables/_saltcorn_data.models.config.available_languages.html +1 -1
  379. package/docs/variables/_saltcorn_data.models.config.configTypes.html +1 -1
  380. package/docs/variables/_saltcorn_data.models.scheduler.runScheduler.html +1 -1
  381. package/docs/variables/_saltcorn_data.plugin_helper.run_action_column.html +1 -1
  382. package/docs/variables/_saltcorn_data.utils.NotAuthorized.html +1 -1
  383. package/docs/variables/_saltcorn_data.utils.sleep.html +1 -1
  384. package/docs/variables/_saltcorn_db_common.multi_tenant.tenantNamespace.html +1 -1
  385. package/help/Where formula.tmd +2 -0
  386. package/locales/ar.json +22 -3
  387. package/locales/de.json +66 -45
  388. package/locales/en.json +13 -1
  389. package/locales/es.json +20 -1
  390. package/locales/fr.json +22 -3
  391. package/locales/hi.json +21 -2
  392. package/locales/pl.json +109 -80
  393. package/locales/pt.json +23 -4
  394. package/locales/ru.json +21 -2
  395. package/locales/si.json +23 -4
  396. package/locales/uk.json +23 -4
  397. package/locales/zh.json +20 -1
  398. package/markup/admin.js +13 -1
  399. package/package.json +9 -9
  400. package/public/saltcorn-common.js +50 -28
  401. package/public/saltcorn.js +5 -3
  402. package/routes/actions.js +44 -14
  403. package/routes/admin.js +49 -22
  404. package/routes/common_lists.js +29 -11
  405. package/routes/delete.js +1 -0
  406. package/routes/fields.js +2 -0
  407. package/routes/infoarch.js +1 -0
  408. package/routes/list.js +11 -7
  409. package/routes/menu.js +1 -0
  410. package/routes/page.js +9 -1
  411. package/routes/page_groupedit.js +1 -0
  412. package/routes/plugins.js +2 -0
  413. package/routes/registry.js +11 -7
  414. package/routes/tables.js +99 -6
  415. package/routes/utils.js +12 -7
  416. package/routes/viewedit.js +21 -1
  417. package/tests/viewedit.test.js +2 -0
@@ -597,6 +597,7 @@ function get_form_record(e_in, select_labels) {
597
597
  $(e_in).prop("data-join-values", {});
598
598
  const keyVals = {};
599
599
  for (const { ref, target, refTable } of joinFields) {
600
+ if (!rec[ref]) continue;
600
601
  keyVals[ref] = rec[ref];
601
602
  $.ajax(`/api/${refTable}?id=${rec[ref]}`, {
602
603
  success: (val) => {
@@ -913,6 +914,29 @@ function doMobileTransforms() {
913
914
  );
914
915
  }
915
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
+
916
940
  function initialize_page() {
917
941
  if (window._sc_locale && window.dayjs) dayjs.locale(window._sc_locale);
918
942
  const isNode = getIsNode();
@@ -942,28 +966,6 @@ function initialize_page() {
942
966
  validate_identifier_elem(target);
943
967
  });
944
968
 
945
- const validate_expression_elem = (target) => {
946
- const next = target.next();
947
- if (next.hasClass("expr-error")) next.remove();
948
- const val = target.val();
949
- if (target.hasClass("validate-expression-conditional")) {
950
- const box = target
951
- .closest(".form-namespace")
952
- .find(`[name="${target.attr("name")}_formula"]`);
953
- if (!box.prop("checked")) return;
954
- }
955
- if (!val) return;
956
- try {
957
- const AsyncFunction = Object.getPrototypeOf(
958
- async function () {}
959
- ).constructor;
960
- AsyncFunction("return " + val);
961
- } catch (error) {
962
- target.after(`<small class="text-danger font-monospace d-block expr-error">
963
- ${error.message}
964
- </small>`);
965
- }
966
- };
967
969
  $(".validate-expression").bind("input", function (e) {
968
970
  const target = $(e.target);
969
971
  validate_expression_elem(target);
@@ -1193,6 +1195,7 @@ function initialize_page() {
1193
1195
  if (_sc_lightmode === "dark") cmOpts.theme = "blackboard";
1194
1196
  const cm = CodeMirror.fromTextArea(el, cmOpts);
1195
1197
  $(el).addClass("codemirror-enabled");
1198
+ if ($(el).hasClass("enlarge-in-card")) enlarge_in_code($(el), cm);
1196
1199
  cm.on(
1197
1200
  "change",
1198
1201
  $.debounce(
@@ -1295,6 +1298,22 @@ function initialize_page() {
1295
1298
 
1296
1299
  $(initialize_page);
1297
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
+
1298
1317
  function cancel_inline_edit(e, opts1) {
1299
1318
  var opts = JSON.parse(decodeURIComponent(opts1 || "") || "{}");
1300
1319
  var form = $(e.target).closest("form");
@@ -1485,7 +1504,7 @@ function getIsNode() {
1485
1504
  }
1486
1505
  }
1487
1506
 
1488
- function buildToast(txt, type, spin) {
1507
+ function buildToast(txt, type, spin, title) {
1489
1508
  const realtype = type === "error" ? "danger" : type;
1490
1509
  const icon =
1491
1510
  realtype === "success"
@@ -1514,7 +1533,7 @@ function buildToast(txt, type, spin) {
1514
1533
  <div class="toast-header bg-${realtype} text-white py-1 ">
1515
1534
  <i class="fas ${icon} me-2"></i>
1516
1535
  <strong class="me-auto" >
1517
- ${type}
1536
+ ${title || type}
1518
1537
  </strong>
1519
1538
  ${
1520
1539
  spin
@@ -1564,7 +1583,7 @@ function notifyAlert(note, spin) {
1564
1583
  txt = JSON.stringify(note, null, 2);
1565
1584
  }
1566
1585
 
1567
- const { id, html } = buildToast(txt, type, spin);
1586
+ const { id, html } = buildToast(txt, type, spin, note.toast_title);
1568
1587
  let $modal = $("#scmodal");
1569
1588
  if ($modal.length && $modal.hasClass("show"))
1570
1589
  $("#modal-toasts-area").append(html);
@@ -1639,16 +1658,19 @@ async function common_done(res, viewnameOrElem0, isWeb = true) {
1639
1658
  if (evalres) await common_done(evalres, viewnameOrElem, isWeb);
1640
1659
  }
1641
1660
  };
1642
- 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
+ );
1643
1665
  if (res.error) {
1644
1666
  if (window._sc_loglevel > 4) console.trace("error response", res.error);
1645
1667
  await handle(res.error, (text) =>
1646
- notifyAlert({ type: "danger", text: text })
1668
+ notifyAlert({ type: "danger", text, toast_title: res.toast_title })
1647
1669
  );
1648
1670
  }
1649
1671
  if (res.notify_success)
1650
1672
  await handle(res.notify_success, (text) =>
1651
- notifyAlert({ type: "success", text: text })
1673
+ notifyAlert({ type: "success", text, toast_title: res.toast_title })
1652
1674
  );
1653
1675
  if (res.set_fields && (viewname || res.set_fields._viewname)) {
1654
1676
  const form =
@@ -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 = {};
@@ -656,7 +660,9 @@ const getWorkflowStepForm = async (
656
660
  //if (cfgFld.input_type === "code") cfgFld.input_type = "textarea";
657
661
  actionConfigFields.push(cfgFld);
658
662
  }
659
- } catch {}
663
+ } catch {
664
+ //ignore
665
+ }
660
666
  }
661
667
  actionConfigFields.push({
662
668
  label: "Subcontext",
@@ -779,9 +785,11 @@ const getWorkflowStepForm = async (
779
785
  });
780
786
  form.hidden("wf_step_id");
781
787
  form.hidden("_after_step");
788
+ form.hidden("_after_step_for");
782
789
  if (before_step) form.values.wf_next_step = before_step;
783
790
  if (after_step == "0") form.values.wf_initial_step = true;
784
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;
785
793
  if (step_id) {
786
794
  const step = await WorkflowStep.findOne({ id: step_id });
787
795
  if (!step) throw new Error("Step not found");
@@ -1312,14 +1320,15 @@ router.get(
1312
1320
  isAdminOrHasConfigMinRole("min_role_edit_triggers"),
1313
1321
  error_catcher(async (req, res) => {
1314
1322
  const { trigger_id, step_id } = req.params;
1315
- const { initial_step, after_step, before_step } = req.query;
1323
+ const { initial_step, after_step, before_step, after_step_for } = req.query;
1316
1324
  const trigger = await Trigger.findOne({ id: trigger_id });
1317
1325
  const form = await getWorkflowStepForm(
1318
1326
  trigger,
1319
1327
  req,
1320
1328
  step_id,
1321
1329
  after_step,
1322
- before_step
1330
+ before_step,
1331
+ after_step_for
1323
1332
  );
1324
1333
 
1325
1334
  if (initial_step) form.values.wf_initial_step = true;
@@ -1387,6 +1396,7 @@ router.post(
1387
1396
  wf_only_if,
1388
1397
  wf_step_id,
1389
1398
  _after_step,
1399
+ _after_step_for,
1390
1400
  ...configuration
1391
1401
  } = form.values;
1392
1402
  Object.entries(configuration).forEach(([k, v]) => {
@@ -1433,7 +1443,21 @@ router.post(
1433
1443
  });
1434
1444
  if (astep) await astep.update({ next_step: step.name });
1435
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
+ }
1436
1459
  } catch (e) {
1460
+ console.error(e);
1437
1461
  const emsg =
1438
1462
  e.message ===
1439
1463
  'duplicate key value violates unique constraint "workflow_steps_name_uniq"'
@@ -1502,13 +1526,13 @@ router.get(
1502
1526
 
1503
1527
  const wfTable = mkTable(
1504
1528
  [
1505
- { label: "Trigger", key: (run) => trNames[run.trigger_id] },
1506
- { 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) },
1507
1531
  {
1508
- label: "Updated",
1532
+ label: req.__("Updated"),
1509
1533
  key: (run) => localeDateTime(run.status_updated_at),
1510
1534
  },
1511
- { label: "Status", key: "status" },
1535
+ { label: req.__("Status"), key: "status" },
1512
1536
  {
1513
1537
  label: "",
1514
1538
  key: (run) => {
@@ -1713,11 +1737,17 @@ router.get(
1713
1737
  trigger_id: trigger.id,
1714
1738
  name: run.current_step_name,
1715
1739
  });
1716
-
1717
- const form = await getWorkflowStepUserForm(run, trigger, step, req);
1718
- if (req.xhr) form.xhrSubmit = true;
1719
- const title = run.wait_info.output ? "Workflow output" : "Fill form";
1720
- 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
+ }
1721
1751
  })
1722
1752
  );
1723
1753
 
package/routes/admin.js CHANGED
@@ -307,7 +307,12 @@ router.get(
307
307
  .replace(/^(\.\.(\/|\\|$))+/, "");
308
308
  const fullpath = path.join(location, "help", safeFile);
309
309
  if (fs.existsSync(fullpath)) {
310
- const { markup } = await get_help_markup(fullpath, req.query, req, true);
310
+ const { markup } = await get_help_markup(
311
+ fullpath,
312
+ req.query,
313
+ req,
314
+ true
315
+ );
311
316
 
312
317
  res.sendWrap(`Help: ${topic}`, { above: [markup] });
313
318
  } else {
@@ -753,11 +758,13 @@ router.post(
753
758
  );
754
759
  }
755
760
  res.redirect(
756
- type === "trigger"
757
- ? `/actions`
758
- : /^[a-z]+$/g.test(type)
759
- ? `/${type}edit`
760
- : "/"
761
+ type == "codepage"
762
+ ? `/admin/edit-codepage/${name}`
763
+ : type === "trigger"
764
+ ? `/actions`
765
+ : /^[a-z]+$/g.test(type)
766
+ ? `/${type}edit`
767
+ : "/"
761
768
  );
762
769
  })
763
770
  );
@@ -1140,6 +1147,7 @@ router.post(
1140
1147
  else
1141
1148
  req.flash("success", req.__("No changes detected, snapshot skipped"));
1142
1149
  } catch (e) {
1150
+ console.error(e);
1143
1151
  req.flash("error", e.message);
1144
1152
  }
1145
1153
  res.json({ reload_page: true });
@@ -1636,6 +1644,7 @@ const doInstall = async (req, res, version, deepClean, runPull) => {
1636
1644
  try {
1637
1645
  await cleanNodeModules();
1638
1646
  } catch (e) {
1647
+ console.error(e);
1639
1648
  res_write(req.__("Error cleaning node_modules: %s\n", e.message));
1640
1649
  }
1641
1650
  }
@@ -1896,6 +1905,7 @@ router.post(
1896
1905
  notify: "Certificate added, please restart server",
1897
1906
  });
1898
1907
  } catch (e) {
1908
+ console.error(e);
1899
1909
  res.json({ error: e.message });
1900
1910
  }
1901
1911
  } else {
@@ -1983,6 +1993,7 @@ router.post(
1983
1993
  );
1984
1994
  res.redirect("/useradmin/ssl");
1985
1995
  } catch (e) {
1996
+ console.error(e);
1986
1997
  req.flash("error", e.message);
1987
1998
  res.redirect("/useradmin/ssl");
1988
1999
  }
@@ -2152,7 +2163,10 @@ const buildDialogScript = (capacitorBuilderAvailable, isSbadmin2) =>
2152
2163
 
2153
2164
  const imageAvailable = async () => {
2154
2165
  try {
2155
- 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
+ );
2156
2170
  await image.inspect();
2157
2171
  return true;
2158
2172
  } catch (e) {
@@ -4095,15 +4109,6 @@ router.get(
4095
4109
  values: { code: existing },
4096
4110
  noSubmitButton: true,
4097
4111
  labelCols: 0,
4098
- additionalButtons: [
4099
- {
4100
- label: req.__("Delete code page"),
4101
- class: "btn btn-outline-danger btn-sm",
4102
- onclick: `if(confirm('Are you sure you would like to delete this code page?'))ajax_post('/admin/delete-codepage/${encodeURIComponent(
4103
- name
4104
- )}')`,
4105
- },
4106
- ],
4107
4112
  fields: [
4108
4113
  {
4109
4114
  name: "code",
@@ -4120,7 +4125,7 @@ router.get(
4120
4125
  ),
4121
4126
  input_type: "code",
4122
4127
  attributes: { mode: "text/javascript" },
4123
- class: "validate-statements",
4128
+ class: "validate-statements enlarge-in-card",
4124
4129
  validator(s) {
4125
4130
  try {
4126
4131
  let AsyncFunction = Object.getPrototypeOf(
@@ -4140,7 +4145,8 @@ router.get(
4140
4145
  {}
4141
4146
  );
4142
4147
  const tags = await Tag.find();
4143
- const tagMarkup = div(
4148
+ const tagMarkup = span(
4149
+ { class: "ms-1" },
4144
4150
  "Tags:",
4145
4151
  (function_code_pages_tags[name] || []).map((tagnm) =>
4146
4152
  span(
@@ -4202,7 +4208,28 @@ router.get(
4202
4208
  contents: {
4203
4209
  type: "card",
4204
4210
  title: req.__(`%s code page`, name),
4205
- 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
+ ],
4206
4233
  },
4207
4234
  });
4208
4235
  })
@@ -4220,9 +4247,9 @@ router.post(
4220
4247
  ...code_pages,
4221
4248
  [name]: code,
4222
4249
  });
4223
- await getState().refresh_codepages();
4224
-
4225
- 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 });
4226
4253
  })
4227
4254
  );
4228
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
@@ -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],
@@ -90,6 +90,7 @@ router.post(
90
90
  else
91
91
  req.flash("success", req.__("No changes detected, snapshot skipped"));
92
92
  } catch (e) {
93
+ console.error(e);
93
94
  req.flash("error", e.message);
94
95
  }
95
96
  res.json({ reload_page: true });
package/routes/list.js CHANGED
@@ -190,7 +190,7 @@ const typeToGridType = (t, field) => {
190
190
  if (field.calculated) {
191
191
  jsgField.editor = false;
192
192
  }
193
- if (field.primary_key) {
193
+ if (field.primary_key && !field?.attributes?.NonSerial) {
194
194
  jsgField.editor = false;
195
195
  }
196
196
  return jsgField;
@@ -221,8 +221,8 @@ jsGrid.fields.versions = VersionsField;
221
221
  // end of versionsField
222
222
 
223
223
  const arrangeIdFirst = (flds) => {
224
- const noId = flds.filter((f) => f.name !== "id");
225
- const id = flds.find((f) => f.name === "id");
224
+ const noId = flds.filter((f) => !f.primary_key);
225
+ const id = flds.find((f) => f.primary_key);
226
226
  if (id) return [id, ...noId];
227
227
  else return flds;
228
228
  };
@@ -282,7 +282,7 @@ router.get(
282
282
  cellClick: "__delete_tabulator_row",
283
283
  });
284
284
  const isDark = getState().getLightDarkMode(req.user) === "dark";
285
- const pkNm = table.pk_name
285
+ const pkNm = table.pk_name;
286
286
  res.sendWrap(
287
287
  {
288
288
  title: req.__(`%s data table`, table.name),
@@ -407,8 +407,8 @@ router.get(
407
407
  ajaxURL:"/api/${encodeURIComponent(
408
408
  table.name
409
409
  )}?tabulator_pagination_format=true${
410
- table.versioned ? "&versioncount=on" : ""
411
- }",
410
+ table.versioned ? "&versioncount=on" : ""
411
+ }",
412
412
  layout:"fitColumns",
413
413
  columns,
414
414
  height:"100%",
@@ -427,10 +427,14 @@ router.get(
427
427
  });
428
428
  window.tabulator_table.on("cellEdited", function(cell){
429
429
  const row = cell.getRow().getData()
430
+ const fieldName = cell.getColumn().getField()
431
+ let ident = (row.${pkNm}||"");
432
+ if(fieldName === "${pkNm}")
433
+ ident = "";
430
434
  ajax_indicator(true);
431
435
  $.ajax({
432
436
  type: "POST",
433
- url: "/api/${table.name}/" + (row.${pkNm}||""),
437
+ url: "/api/${table.name}/" + ident,
434
438
  data: row,
435
439
  headers: {
436
440
  "CSRF-Token": _sc_globalCsrf,
package/routes/menu.js CHANGED
@@ -615,6 +615,7 @@ router.post(
615
615
  });
616
616
  res.json({ success: "ok", ...(result || {}) });
617
617
  } catch (e) {
618
+ console.error(e);
618
619
  res.status(400).json({ error: e.message || e });
619
620
  }
620
621
  else res.status(404).json({ error: "Action not found" });