@saltcorn/server 1.1.4-alpha.0 → 1.1.4-alpha.2

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 (402) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/auth/resetpw.js +8 -5
  3. package/docs/assets/search.js +1 -1
  4. package/docs/classes/_saltcorn_common_code.Relation.html +8 -8
  5. package/docs/classes/_saltcorn_common_code.RelationsFinder.html +5 -5
  6. package/docs/classes/_saltcorn_data.models.Crash-1.html +18 -18
  7. package/docs/classes/_saltcorn_data.models.EventLog-1.html +19 -19
  8. package/docs/classes/_saltcorn_data.models.Field.html +71 -71
  9. package/docs/classes/_saltcorn_data.models.FieldRepeat-1.html +17 -17
  10. package/docs/classes/_saltcorn_data.models.File-1.html +48 -48
  11. package/docs/classes/_saltcorn_data.models.Form-1.html +38 -38
  12. package/docs/classes/_saltcorn_data.models.Library.html +13 -13
  13. package/docs/classes/_saltcorn_data.models.Page.html +33 -23
  14. package/docs/classes/_saltcorn_data.models.PageGroup-1.html +28 -33
  15. package/docs/classes/_saltcorn_data.models.Plugin.html +25 -25
  16. package/docs/classes/_saltcorn_data.models.Role.html +9 -9
  17. package/docs/classes/_saltcorn_data.models.Table-1.html +101 -91
  18. package/docs/classes/_saltcorn_data.models.TableConstraint-1.html +14 -14
  19. package/docs/classes/_saltcorn_data.models.Trigger.html +45 -35
  20. package/docs/classes/_saltcorn_data.models.User-1.html +48 -48
  21. package/docs/classes/_saltcorn_data.models.View-1.html +61 -51
  22. package/docs/classes/_saltcorn_data.models.Workflow-1.html +17 -17
  23. package/docs/classes/_saltcorn_data.models.WorkflowRun.html +35 -35
  24. package/docs/classes/_saltcorn_data.models.WorkflowStep.html +25 -25
  25. package/docs/classes/_saltcorn_data.models.WorkflowTrace.html +18 -18
  26. package/docs/classes/_saltcorn_mobile_builder.MobileBuilder.html +36 -36
  27. package/docs/enums/_saltcorn_common_code.RelationType.html +7 -7
  28. package/docs/enums/_saltcorn_common_code.ViewDisplayType.html +4 -4
  29. package/docs/functions/_saltcorn_admin_models.backup.create_backup.html +1 -1
  30. package/docs/functions/_saltcorn_admin_models.backup.create_csv_from_rows.html +1 -1
  31. package/docs/functions/_saltcorn_admin_models.backup.restore.html +1 -1
  32. package/docs/functions/_saltcorn_admin_models.pack.add_to_menu.html +1 -1
  33. package/docs/functions/_saltcorn_admin_models.pack.can_install_pack.html +1 -1
  34. package/docs/functions/_saltcorn_admin_models.pack.fetch_available_packs.html +1 -1
  35. package/docs/functions/_saltcorn_admin_models.pack.fetch_pack_by_name.html +1 -1
  36. package/docs/functions/_saltcorn_admin_models.pack.install_pack.html +1 -1
  37. package/docs/functions/_saltcorn_admin_models.pack.library_pack.html +1 -1
  38. package/docs/functions/_saltcorn_admin_models.pack.model_instance_pack.html +1 -1
  39. package/docs/functions/_saltcorn_admin_models.pack.model_pack.html +1 -1
  40. package/docs/functions/_saltcorn_admin_models.pack.page_group_pack.html +1 -1
  41. package/docs/functions/_saltcorn_admin_models.pack.page_pack.html +1 -1
  42. package/docs/functions/_saltcorn_admin_models.pack.plugin_pack.html +1 -1
  43. package/docs/functions/_saltcorn_admin_models.pack.role_pack.html +1 -1
  44. package/docs/functions/_saltcorn_admin_models.pack.table_pack.html +1 -1
  45. package/docs/functions/_saltcorn_admin_models.pack.trigger_pack.html +1 -1
  46. package/docs/functions/_saltcorn_admin_models.pack.uninstall_pack.html +1 -1
  47. package/docs/functions/_saltcorn_admin_models.pack.view_pack.html +1 -1
  48. package/docs/functions/_saltcorn_admin_models.tenant.copy_tenant_template.html +1 -1
  49. package/docs/functions/_saltcorn_admin_models.tenant.create_tenant.html +1 -1
  50. package/docs/functions/_saltcorn_admin_models.tenant.deleteTenant.html +1 -1
  51. package/docs/functions/_saltcorn_admin_models.tenant.domain_sanitize.html +1 -1
  52. package/docs/functions/_saltcorn_admin_models.tenant.eachTenant.html +1 -1
  53. package/docs/functions/_saltcorn_admin_models.tenant.getAllTenantRows.html +1 -1
  54. package/docs/functions/_saltcorn_admin_models.tenant.getAllTenants.html +1 -1
  55. package/docs/functions/_saltcorn_admin_models.tenant.insertTenant.html +1 -1
  56. package/docs/functions/_saltcorn_admin_models.tenant.switchToTenant.html +1 -1
  57. package/docs/functions/_saltcorn_common_code.buildTableCaches.html +1 -1
  58. package/docs/functions/_saltcorn_common_code.parseLegacyRelation.html +1 -1
  59. package/docs/functions/_saltcorn_common_code.parseRelationPath.html +1 -1
  60. package/docs/functions/_saltcorn_data.models.config.check_email_mask.html +1 -1
  61. package/docs/functions/_saltcorn_data.models.config.deleteConfig.html +1 -1
  62. package/docs/functions/_saltcorn_data.models.config.getAllConfig.html +1 -1
  63. package/docs/functions/_saltcorn_data.models.config.getConfig.html +1 -1
  64. package/docs/functions/_saltcorn_data.models.config.get_base_url.html +1 -1
  65. package/docs/functions/_saltcorn_data.models.config.get_latest_npm_version.html +1 -1
  66. package/docs/functions/_saltcorn_data.models.config.remove_from_menu.html +1 -1
  67. package/docs/functions/_saltcorn_data.models.config.save_menu_items.html +1 -1
  68. package/docs/functions/_saltcorn_data.models.config.setConfig.html +1 -1
  69. package/docs/functions/_saltcorn_data.models.discovery.discover_tables.html +1 -1
  70. package/docs/functions/_saltcorn_data.models.discovery.discoverable_tables.html +1 -1
  71. package/docs/functions/_saltcorn_data.models.discovery.findType.html +1 -1
  72. package/docs/functions/_saltcorn_data.models.discovery.get_existing_views.html +1 -1
  73. package/docs/functions/_saltcorn_data.models.discovery.implement_discovery.html +1 -1
  74. package/docs/functions/_saltcorn_data.models.email.getMailTransport.html +1 -1
  75. package/docs/functions/_saltcorn_data.models.email.send_verification_email.html +1 -1
  76. package/docs/functions/_saltcorn_data.models.email.viewToEmailHtml.html +1 -1
  77. package/docs/functions/_saltcorn_data.models.expression.apply_calculated_fields.html +1 -1
  78. package/docs/functions/_saltcorn_data.models.expression.apply_calculated_fields_stored.html +1 -1
  79. package/docs/functions/_saltcorn_data.models.expression.eval_expression.html +1 -1
  80. package/docs/functions/_saltcorn_data.models.expression.expressionValidator.html +1 -1
  81. package/docs/functions/_saltcorn_data.models.expression.get_async_expression_function.html +1 -1
  82. package/docs/functions/_saltcorn_data.models.expression.get_expression_function.html +1 -1
  83. package/docs/functions/_saltcorn_data.models.expression.jsexprToWhere.html +1 -1
  84. package/docs/functions/_saltcorn_data.models.expression.recalculate_for_stored.html +1 -1
  85. package/docs/functions/_saltcorn_data.models.expression.transform_for_async.html +1 -1
  86. package/docs/functions/_saltcorn_data.models.layout.eachView.html +1 -1
  87. package/docs/functions/_saltcorn_data.models.layout.getStringsForI18n.html +1 -1
  88. package/docs/functions/_saltcorn_data.models.layout.getViews.html +1 -1
  89. package/docs/functions/_saltcorn_data.models.layout.translateLayout.html +1 -1
  90. package/docs/functions/_saltcorn_data.models.layout.traverse.html +1 -1
  91. package/docs/functions/_saltcorn_data.models.layout.traverseSync.html +1 -1
  92. package/docs/functions/_saltcorn_data.models.random.all_views.html +1 -1
  93. package/docs/functions/_saltcorn_data.models.random.fill_table_row.html +1 -1
  94. package/docs/functions/_saltcorn_data.models.random.initial_view.html +1 -1
  95. package/docs/functions/_saltcorn_data.models.random.random_table.html +1 -1
  96. package/docs/functions/_saltcorn_db_common.buildInsertBulkSql.html +2 -2
  97. package/docs/functions/_saltcorn_db_common.buildInsertSql.html +2 -2
  98. package/docs/functions/_saltcorn_db_common.doCount.html +2 -2
  99. package/docs/functions/_saltcorn_db_common.doDeleteWhere.html +2 -2
  100. package/docs/functions/_saltcorn_db_common.doListScTables.html +2 -2
  101. package/docs/functions/_saltcorn_db_common.doListTables.html +2 -2
  102. package/docs/functions/_saltcorn_db_common.doListUserDefinedTables.html +2 -2
  103. package/docs/functions/_saltcorn_db_common.do_add_index.html +2 -2
  104. package/docs/functions/_saltcorn_db_common.do_drop_index.html +2 -2
  105. package/docs/functions/_saltcorn_db_common.ftsFieldsSqlExpr.html +2 -2
  106. package/docs/functions/_saltcorn_db_common.mkSelectOptions.html +2 -2
  107. package/docs/functions/_saltcorn_db_common.mkVal.html +2 -2
  108. package/docs/functions/_saltcorn_db_common.mkWhere.html +2 -2
  109. package/docs/functions/_saltcorn_db_common.multi_tenant.enable_multi_tenant.html +3 -2
  110. package/docs/functions/{_saltcorn_db_common.single_tenant.enable_multi_tenant.html → _saltcorn_db_common.multi_tenant.getRequestContext.html} +16 -15
  111. package/docs/functions/_saltcorn_db_common.multi_tenant.getTenantSchema.html +3 -2
  112. package/docs/functions/_saltcorn_db_common.multi_tenant.init.html +3 -2
  113. package/docs/functions/_saltcorn_db_common.multi_tenant.is_it_multi_tenant.html +3 -2
  114. package/docs/functions/_saltcorn_db_common.multi_tenant.runWithTenant.html +5 -5
  115. package/docs/functions/_saltcorn_db_common.orderByIsObject.html +2 -2
  116. package/docs/functions/_saltcorn_db_common.orderByIsOperator.html +2 -2
  117. package/docs/functions/_saltcorn_db_common.prefixFieldsInWhere.html +2 -2
  118. package/docs/functions/_saltcorn_db_common.reprAsJson.html +2 -2
  119. package/docs/functions/_saltcorn_db_common.sqlBinOp.html +2 -2
  120. package/docs/functions/_saltcorn_db_common.sqlFun.html +2 -2
  121. package/docs/functions/_saltcorn_db_common.sqlsanitize.html +2 -2
  122. package/docs/functions/_saltcorn_db_common.sqlsanitizeAllowDots.html +2 -2
  123. package/docs/functions/_saltcorn_db_common.subSelectWhere.html +2 -2
  124. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.androidFeatures.html +1 -1
  125. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.androidPermissions.html +1 -1
  126. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.buildTablesFile.html +1 -1
  127. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyPrepopulatedDb.html +1 -1
  128. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyServerFiles.html +1 -1
  129. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyShareExtFiles.html +1 -1
  130. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copySiteLogo.html +1 -1
  131. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyTranslationFiles.html +1 -1
  132. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.createSqliteDb.html +1 -1
  133. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.decodeProvisioningProfile.html +1 -1
  134. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.extractDomain.html +1 -1
  135. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.generateAndroidVersionCode.html +1 -1
  136. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyAndroidManifest.html +1 -1
  137. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyConfigXml.html +1 -1
  138. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyGradleConfig.html +1 -1
  139. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyInfoPlist.html +1 -1
  140. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyXcodeProjectFile.html +1 -1
  141. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepAppIcon.html +1 -1
  142. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareAppIcon.html +1 -1
  143. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareBuildDir.html +1 -1
  144. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareExportOptionsPlist.html +1 -1
  145. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareSplashIcon.html +1 -1
  146. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareSplashPage.html +1 -1
  147. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeCapacitorConfig.html +1 -1
  148. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeCfgFile.html +1 -1
  149. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeDataExtractionRules.html +1 -1
  150. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeNetworkSecurityConfig.html +1 -1
  151. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writePodfile.html +1 -1
  152. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writePrivacyInfo.html +1 -1
  153. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.bundleMobileAppCode.html +1 -1
  154. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.bundlePackagesAndPlugins.html +1 -1
  155. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.copyMobileAppDirs.html +1 -1
  156. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.copyPublicDirs.html +1 -1
  157. package/docs/functions/_saltcorn_sqlite.add_index.html +3 -2
  158. package/docs/functions/_saltcorn_sqlite.add_unique_constraint.html +3 -2
  159. package/docs/functions/_saltcorn_sqlite.begin.html +3 -2
  160. package/docs/functions/_saltcorn_sqlite.changeConnection.html +3 -2
  161. package/docs/functions/_saltcorn_sqlite.close.html +3 -2
  162. package/docs/functions/_saltcorn_sqlite.commit.html +3 -2
  163. package/docs/functions/_saltcorn_sqlite.count.html +3 -2
  164. package/docs/functions/_saltcorn_sqlite.deleteWhere.html +3 -2
  165. package/docs/functions/_saltcorn_sqlite.dropTable.html +3 -2
  166. package/docs/functions/_saltcorn_sqlite.dropTables.html +3 -2
  167. package/docs/functions/_saltcorn_sqlite.drop_index.html +3 -2
  168. package/docs/functions/_saltcorn_sqlite.drop_reset_schema.html +3 -2
  169. package/docs/functions/_saltcorn_sqlite.drop_unique_constraint.html +3 -2
  170. package/docs/functions/_saltcorn_sqlite.getVersion.html +3 -2
  171. package/docs/functions/_saltcorn_sqlite.get_db_filepath.html +3 -2
  172. package/docs/functions/_saltcorn_sqlite.get_sql_logging.html +3 -2
  173. package/docs/functions/_saltcorn_sqlite.init.html +3 -2
  174. package/docs/functions/_saltcorn_sqlite.insert.html +3 -2
  175. package/docs/functions/_saltcorn_sqlite.listScTables.html +3 -2
  176. package/docs/functions/_saltcorn_sqlite.listTables.html +3 -2
  177. package/docs/functions/_saltcorn_sqlite.listUserDefinedTables.html +3 -2
  178. package/docs/functions/_saltcorn_sqlite.query.html +3 -2
  179. package/docs/functions/_saltcorn_sqlite.rollback.html +3 -2
  180. package/docs/functions/_saltcorn_sqlite.select.html +3 -2
  181. package/docs/functions/_saltcorn_sqlite.selectMaybeOne.html +3 -2
  182. package/docs/functions/_saltcorn_sqlite.selectOne.html +3 -2
  183. package/docs/functions/_saltcorn_sqlite.set_sql_logging.html +3 -2
  184. package/docs/functions/_saltcorn_sqlite.slugify.html +3 -2
  185. package/docs/functions/_saltcorn_sqlite.sql_log.html +3 -2
  186. package/docs/functions/_saltcorn_sqlite.update.html +3 -2
  187. package/docs/functions/_saltcorn_sqlite.updateWhere.html +3 -2
  188. package/docs/functions/_saltcorn_sqlite.withTransaction.html +96 -0
  189. package/docs/functions/_saltcorn_sqlite_mobile.add_index.html +1 -1
  190. package/docs/functions/_saltcorn_sqlite_mobile.add_unique_constraint.html +1 -1
  191. package/docs/functions/_saltcorn_sqlite_mobile.count.html +1 -1
  192. package/docs/functions/_saltcorn_sqlite_mobile.deleteWhere.html +1 -1
  193. package/docs/functions/_saltcorn_sqlite_mobile.drop_index.html +1 -1
  194. package/docs/functions/_saltcorn_sqlite_mobile.drop_reset_schema.html +1 -1
  195. package/docs/functions/_saltcorn_sqlite_mobile.drop_unique_constraint.html +1 -1
  196. package/docs/functions/_saltcorn_sqlite_mobile.init.html +1 -1
  197. package/docs/functions/_saltcorn_sqlite_mobile.insert.html +1 -1
  198. package/docs/functions/_saltcorn_sqlite_mobile.insertRows.html +1 -1
  199. package/docs/functions/_saltcorn_sqlite_mobile.listScTables.html +1 -1
  200. package/docs/functions/_saltcorn_sqlite_mobile.listTables.html +1 -1
  201. package/docs/functions/_saltcorn_sqlite_mobile.listUserDefinedTables.html +1 -1
  202. package/docs/functions/_saltcorn_sqlite_mobile.query.html +1 -1
  203. package/docs/functions/_saltcorn_sqlite_mobile.select.html +1 -1
  204. package/docs/functions/_saltcorn_sqlite_mobile.selectMaybeOne.html +1 -1
  205. package/docs/functions/_saltcorn_sqlite_mobile.selectOne.html +1 -1
  206. package/docs/functions/_saltcorn_sqlite_mobile.setConnectionObject.html +1 -1
  207. package/docs/functions/_saltcorn_sqlite_mobile.tableExists.html +1 -1
  208. package/docs/functions/_saltcorn_sqlite_mobile.time.html +1 -1
  209. package/docs/functions/_saltcorn_sqlite_mobile.update.html +1 -1
  210. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_field.instanceOfField.html +1 -1
  211. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_page.instanceOfPage.html +1 -1
  212. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_view.instanceOfView.html +1 -1
  213. package/docs/functions/_saltcorn_types.Types.base_types.instanceOWithHtmlFile.html +1 -1
  214. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfErrorMsg.html +1 -1
  215. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfSuccessMsg.html +1 -1
  216. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfType.html +1 -1
  217. package/docs/functions/_saltcorn_types.generators.generateBool.html +1 -1
  218. package/docs/functions/_saltcorn_types.generators.generateString.html +1 -1
  219. package/docs/functions/_saltcorn_types.generators.num_between.html +1 -1
  220. package/docs/functions/_saltcorn_types.generators.oneOf.html +1 -1
  221. package/docs/interfaces/_saltcorn_mobile_builder.common_build_utils.ScCapacitorConfig.html +10 -10
  222. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_field.AbstractField.html +14 -14
  223. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_field.AbstractFieldRepeat.html +3 -3
  224. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_form.AbstractForm.html +26 -26
  225. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_page.AbstractPage.html +7 -7
  226. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_role.AbstractRole.html +3 -3
  227. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_table.AbstractTable.html +7 -7
  228. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_trigger.AbstractTrigger.html +16 -16
  229. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_view.AbstractView.html +10 -10
  230. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_workflow.AbstractWorkflow.html +13 -13
  231. package/docs/modules/_saltcorn_admin_models.backup.html +1 -1
  232. package/docs/modules/_saltcorn_admin_models.html +1 -1
  233. package/docs/modules/_saltcorn_admin_models.pack.html +1 -1
  234. package/docs/modules/_saltcorn_admin_models.tenant.html +1 -1
  235. package/docs/modules/_saltcorn_common_code.html +1 -1
  236. package/docs/modules/_saltcorn_data.html +3 -3
  237. package/docs/modules/_saltcorn_data.models.Crash.html +2 -2
  238. package/docs/modules/_saltcorn_data.models.EventLog.html +2 -2
  239. package/docs/modules/_saltcorn_data.models.FieldRepeat.html +2 -2
  240. package/docs/modules/_saltcorn_data.models.File.html +2 -2
  241. package/docs/modules/_saltcorn_data.models.Form.html +2 -2
  242. package/docs/modules/_saltcorn_data.models.PageGroup.html +2 -2
  243. package/docs/modules/_saltcorn_data.models.Table.html +2 -2
  244. package/docs/modules/_saltcorn_data.models.TableConstraint.html +2 -2
  245. package/docs/modules/_saltcorn_data.models.User.html +2 -2
  246. package/docs/modules/_saltcorn_data.models.View.html +2 -2
  247. package/docs/modules/_saltcorn_data.models.Workflow.html +2 -2
  248. package/docs/modules/_saltcorn_data.models.config.html +1 -1
  249. package/docs/modules/_saltcorn_data.models.discovery.html +1 -1
  250. package/docs/modules/_saltcorn_data.models.email.html +1 -1
  251. package/docs/modules/_saltcorn_data.models.expression.html +1 -1
  252. package/docs/modules/_saltcorn_data.models.html +1 -1
  253. package/docs/modules/_saltcorn_data.models.layout.html +1 -1
  254. package/docs/modules/_saltcorn_data.models.random.html +1 -1
  255. package/docs/modules/_saltcorn_data.models.scheduler.html +1 -1
  256. package/docs/modules/_saltcorn_data.plugin_helper.html +1 -1
  257. package/docs/modules/_saltcorn_data.utils.html +1 -1
  258. package/docs/modules/_saltcorn_db_common.html +7 -7
  259. package/docs/modules/_saltcorn_db_common.multi_tenant.html +4 -2
  260. package/docs/modules/_saltcorn_markup.html +2 -2
  261. package/docs/modules/_saltcorn_mobile_builder.common_build_utils.html +1 -1
  262. package/docs/modules/_saltcorn_mobile_builder.html +1 -1
  263. package/docs/modules/_saltcorn_mobile_builder.package_bundle_utils.html +1 -1
  264. package/docs/modules/_saltcorn_sqlite.html +4 -2
  265. package/docs/modules/_saltcorn_sqlite_mobile.html +1 -1
  266. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_field.html +1 -1
  267. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_form.html +1 -1
  268. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_library.html +1 -1
  269. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_page.html +1 -1
  270. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_plugin.html +1 -1
  271. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_role.html +1 -1
  272. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_table.html +1 -1
  273. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_trigger.html +1 -1
  274. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_view.html +1 -1
  275. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_workflow.html +1 -1
  276. package/docs/modules/_saltcorn_types.ModelAbstracts.html +1 -1
  277. package/docs/modules/_saltcorn_types.Types.base_types.html +1 -1
  278. package/docs/modules/_saltcorn_types.Types.common_types.html +1 -1
  279. package/docs/modules/_saltcorn_types.Types.html +1 -1
  280. package/docs/modules/_saltcorn_types.generators.html +1 -1
  281. package/docs/modules/_saltcorn_types.html +1 -1
  282. package/docs/types/_saltcorn_data.models.Crash.CrashCfg.html +1 -1
  283. package/docs/types/_saltcorn_data.models.EventLog.EventLogCfg.html +1 -1
  284. package/docs/types/_saltcorn_data.models.FieldRepeat.FieldRepeatCfg.html +1 -1
  285. package/docs/types/_saltcorn_data.models.File.FileCfg.html +1 -1
  286. package/docs/types/_saltcorn_data.models.Form.AdditionalButton.html +1 -1
  287. package/docs/types/_saltcorn_data.models.Form.FormCfg.html +1 -1
  288. package/docs/types/_saltcorn_data.models.PageGroup.ScreenInfoParams.html +1 -1
  289. package/docs/types/_saltcorn_data.models.Table.ChildRelations.html +1 -1
  290. package/docs/types/_saltcorn_data.models.Table.ParentRelations.html +1 -1
  291. package/docs/types/_saltcorn_data.models.Table.RelationData.html +1 -1
  292. package/docs/types/_saltcorn_data.models.TableConstraint.TableConstraintCfg.html +1 -1
  293. package/docs/types/_saltcorn_data.models.User.UserCfg.html +1 -1
  294. package/docs/types/_saltcorn_data.models.View.FindViewsPred.html +1 -1
  295. package/docs/types/_saltcorn_data.models.Workflow.WorkflowCfg.html +1 -1
  296. package/docs/types/_saltcorn_db_common.AggregationOptions.html +2 -2
  297. package/docs/types/_saltcorn_db_common.CoordOpts.html +2 -2
  298. package/docs/types/_saltcorn_db_common.DatabaseClient.html +111 -0
  299. package/docs/types/_saltcorn_db_common.JoinField.html +2 -2
  300. package/docs/types/_saltcorn_db_common.JoinFields.html +2 -2
  301. package/docs/types/_saltcorn_db_common.JoinOptions.html +2 -2
  302. package/docs/types/_saltcorn_db_common.JsonPath.html +2 -2
  303. package/docs/types/_saltcorn_db_common.JsonPathElem.html +2 -2
  304. package/docs/types/_saltcorn_db_common.Operator.html +2 -2
  305. package/docs/types/_saltcorn_db_common.PrimaryKeyValue.html +2 -2
  306. package/docs/types/_saltcorn_db_common.Row.html +2 -2
  307. package/docs/types/_saltcorn_db_common.SelectOptions.html +5 -3
  308. package/docs/types/_saltcorn_db_common.SqlAndValues.html +2 -2
  309. package/docs/types/_saltcorn_db_common.SubselectOptions.html +2 -2
  310. package/docs/types/_saltcorn_db_common.Value.html +2 -2
  311. package/docs/types/_saltcorn_db_common.Where.html +2 -2
  312. package/docs/types/_saltcorn_mobile_builder.IosCfg.html +1 -1
  313. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_field.FieldCfg.html +1 -1
  314. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_field.InputType.html +1 -1
  315. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_form.AdditionalButton.html +1 -1
  316. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_library.LibraryCfg.html +1 -1
  317. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_library.LibraryPack.html +1 -1
  318. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_page.PageCfg.html +1 -1
  319. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_page.PagePack.html +1 -1
  320. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_plugin.PluginCfg.html +1 -1
  321. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_plugin.PluginPack.html +1 -1
  322. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_role.RoleCfg.html +1 -1
  323. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_role.RolePack.html +1 -1
  324. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_table.TableCfg.html +3 -3
  325. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_table.TablePack.html +1 -1
  326. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_trigger.TriggerCfg.html +1 -1
  327. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_trigger.TriggerPack.html +1 -1
  328. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_view.ViewCfg.html +1 -1
  329. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_view.ViewPack.html +1 -1
  330. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_workflow.ConfigWorkflowStep.html +1 -1
  331. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_workflow.RunResult.html +1 -1
  332. package/docs/types/_saltcorn_types.Types.base_types.Action.html +1 -1
  333. package/docs/types/_saltcorn_types.Types.base_types.AuthenticationMethod.html +1 -1
  334. package/docs/types/_saltcorn_types.Types.base_types.CapacitorPlugin.html +1 -1
  335. package/docs/types/_saltcorn_types.Types.base_types.CodePagePack.html +1 -1
  336. package/docs/types/_saltcorn_types.Types.base_types.Column.html +1 -1
  337. package/docs/types/_saltcorn_types.Types.base_types.ConnectedObjects.html +1 -1
  338. package/docs/types/_saltcorn_types.Types.base_types.CopilotSkill.html +1 -1
  339. package/docs/types/_saltcorn_types.Types.base_types.FieldLike.html +1 -1
  340. package/docs/types/_saltcorn_types.Types.base_types.FieldView.html +1 -1
  341. package/docs/types/_saltcorn_types.Types.base_types.Header.html +1 -1
  342. package/docs/types/_saltcorn_types.Types.base_types.JoinFieldOption.html +1 -1
  343. package/docs/types/_saltcorn_types.Types.base_types.Layout.html +1 -1
  344. package/docs/types/_saltcorn_types.Types.base_types.MobileConfig.html +1 -1
  345. package/docs/types/_saltcorn_types.Types.base_types.ModelPattern.html +1 -1
  346. package/docs/types/_saltcorn_types.Types.base_types.Pack.html +1 -1
  347. package/docs/types/_saltcorn_types.Types.base_types.Plugin.html +1 -1
  348. package/docs/types/_saltcorn_types.Types.base_types.PluginFunction.html +1 -1
  349. package/docs/types/_saltcorn_types.Types.base_types.PluginLayout.html +1 -1
  350. package/docs/types/_saltcorn_types.Types.base_types.PluginRoute.html +1 -1
  351. package/docs/types/_saltcorn_types.Types.base_types.PluginSourceType.html +1 -1
  352. package/docs/types/_saltcorn_types.Types.base_types.PluginType.html +1 -1
  353. package/docs/types/_saltcorn_types.Types.base_types.PluginWrap.html +1 -1
  354. package/docs/types/_saltcorn_types.Types.base_types.PluginWrapArg.html +1 -1
  355. package/docs/types/_saltcorn_types.Types.base_types.RelationOption.html +1 -1
  356. package/docs/types/_saltcorn_types.Types.base_types.Req.html +1 -1
  357. package/docs/types/_saltcorn_types.Types.base_types.Res.html +1 -1
  358. package/docs/types/_saltcorn_types.Types.base_types.RouteAction.html +1 -1
  359. package/docs/types/_saltcorn_types.Types.base_types.RunExtra.html +1 -1
  360. package/docs/types/_saltcorn_types.Types.base_types.TableProvider.html +1 -1
  361. package/docs/types/_saltcorn_types.Types.base_types.TableQuery.html +1 -1
  362. package/docs/types/_saltcorn_types.Types.base_types.Tablely.html +1 -1
  363. package/docs/types/_saltcorn_types.Types.base_types.ViewTemplate.html +1 -1
  364. package/docs/types/_saltcorn_types.Types.common_types.ErrorMessage.html +1 -1
  365. package/docs/types/_saltcorn_types.Types.common_types.GenObj.html +1 -1
  366. package/docs/types/_saltcorn_types.Types.common_types.ReqRes.html +1 -1
  367. package/docs/types/_saltcorn_types.Types.common_types.ResultMessage.html +1 -1
  368. package/docs/types/_saltcorn_types.Types.common_types.SuccessMessage.html +1 -1
  369. package/docs/types/_saltcorn_types.Types.common_types.Type.html +1 -1
  370. package/docs/variables/_saltcorn_data.db.html +1 -1
  371. package/docs/variables/_saltcorn_data.migrations.html +1 -1
  372. package/docs/variables/_saltcorn_data.models.config.available_languages.html +1 -1
  373. package/docs/variables/_saltcorn_data.models.config.configTypes.html +1 -1
  374. package/docs/variables/_saltcorn_data.models.scheduler.runScheduler.html +1 -1
  375. package/docs/variables/_saltcorn_data.plugin_helper.run_action_column.html +1 -1
  376. package/docs/variables/_saltcorn_data.utils.NotAuthorized.html +1 -1
  377. package/docs/variables/_saltcorn_data.utils.sleep.html +1 -1
  378. package/docs/variables/_saltcorn_db_common.multi_tenant.tenantNamespace.html +4 -3
  379. package/locales/en.json +2 -0
  380. package/package.json +9 -9
  381. package/routes/actions.js +11 -2
  382. package/routes/admin.js +18 -7
  383. package/routes/api.js +49 -40
  384. package/routes/fields.js +54 -53
  385. package/routes/list.js +3 -1
  386. package/routes/menu.js +10 -8
  387. package/routes/models.js +4 -2
  388. package/routes/packs.js +19 -8
  389. package/routes/page.js +17 -13
  390. package/routes/page_groupedit.js +8 -0
  391. package/routes/pageedit.js +10 -1
  392. package/routes/registry.js +3 -1
  393. package/routes/sync.js +60 -72
  394. package/routes/tables.js +129 -90
  395. package/routes/utils.js +27 -17
  396. package/routes/viewedit.js +18 -2
  397. package/tests/auth.test.js +1 -1
  398. package/docs/functions/_saltcorn_db_common.single_tenant.getTenantSchema.html +0 -109
  399. package/docs/functions/_saltcorn_db_common.single_tenant.init.html +0 -115
  400. package/docs/functions/_saltcorn_db_common.single_tenant.is_it_multi_tenant.html +0 -109
  401. package/docs/functions/_saltcorn_db_common.single_tenant.runWithTenant.html +0 -129
  402. package/docs/modules/_saltcorn_db_common.single_tenant.html +0 -115
package/routes/sync.js CHANGED
@@ -24,7 +24,7 @@ router.get(
24
24
  })
25
25
  );
26
26
 
27
- const getSyncRows = async (syncInfo, table, syncUntil, client, user) => {
27
+ const getSyncRows = async (syncInfo, table, syncUntil, user) => {
28
28
  const tblName = table.name;
29
29
  const pkName = table.pk_name;
30
30
  const minRole = table.min_role_read;
@@ -50,17 +50,17 @@ const getSyncRows = async (syncInfo, table, syncUntil, client, user) => {
50
50
  }
51
51
  const schema = db.getTenantSchemaPrefix();
52
52
  if (!syncInfo.syncFrom) {
53
- const { rows } = await client.query(
53
+ const { rows } = await db.query(
54
54
  `select
55
55
  info_tbl.ref "_sync_info_tbl_ref_",
56
56
  info_tbl.last_modified "_sync_info_tbl_last_modified_",
57
57
  info_tbl.deleted "_sync_info_tbl_deleted_",
58
58
  data_tbl.*
59
59
  from ${schema}"${db.sqlsanitize(
60
- tblName
61
- )}_sync_info" "info_tbl" right join "${db.sqlsanitize(
62
- tblName
63
- )}" "data_tbl"
60
+ tblName
61
+ )}_sync_info" "info_tbl" right join "${db.sqlsanitize(
62
+ tblName
63
+ )}" "data_tbl"
64
64
  on info_tbl.ref = data_tbl."${db.sqlsanitize(
65
65
  pkName
66
66
  )}" and info_tbl.deleted = false
@@ -77,17 +77,17 @@ const getSyncRows = async (syncInfo, table, syncUntil, client, user) => {
77
77
  }
78
78
  return rows;
79
79
  } else {
80
- const { rows } = await client.query(
80
+ const { rows } = await db.query(
81
81
  `select
82
82
  info_tbl.ref "_sync_info_tbl_ref_",
83
83
  info_tbl.last_modified "_sync_info_tbl_last_modified_",
84
84
  info_tbl.deleted "_sync_info_tbl_deleted_",
85
85
  data_tbl.*
86
86
  from ${schema}"${db.sqlsanitize(
87
- tblName
88
- )}_sync_info" "info_tbl" join ${schema}"${db.sqlsanitize(
89
- tblName
90
- )}" "data_tbl"
87
+ tblName
88
+ )}_sync_info" "info_tbl" join ${schema}"${db.sqlsanitize(
89
+ tblName
90
+ )}" "data_tbl"
91
91
  on info_tbl.ref = data_tbl."${db.sqlsanitize(pkName)}"
92
92
  where date_trunc('milliseconds', info_tbl.last_modified) > to_timestamp(${
93
93
  new Date(syncInfo.syncFrom).valueOf() / 1000.0
@@ -117,7 +117,6 @@ const getSyncRows = async (syncInfo, table, syncUntil, client, user) => {
117
117
  router.post(
118
118
  "/load_changes",
119
119
  error_catcher(async (req, res) => {
120
- const result = {};
121
120
  const { syncInfos, loadUntil } = req.body || {};
122
121
  if (!loadUntil) {
123
122
  getState().log(2, `POST /load_changes: loadUntil is missing`);
@@ -128,62 +127,55 @@ router.post(
128
127
  return res.status(400).json({ error: "syncInfos is missing" });
129
128
  }
130
129
  const role = req.user ? req.user.role_id : 100;
131
- const client = await db.getClient();
132
- let rowLimit = 1000;
133
130
  try {
134
- await client.query(`BEGIN`);
135
- for (const [tblName, syncInfo] of Object.entries(syncInfos)) {
136
- const table = Table.findOne({ name: tblName });
137
- if (!table) throw new Error(`The table '${tblName}' does not exists`);
138
- const pkName = table.pk_name;
139
- let rows = await getSyncRows(
140
- syncInfo,
141
- table,
142
- loadUntil,
143
- client,
144
- req.user
145
- );
146
- if (!rows) continue;
147
- if (role > table.min_role_read) {
148
- if (
149
- role === 100 ||
150
- (!table.ownership_field_id && !table.ownership_formula)
151
- )
152
- continue;
153
- else if (table.ownership_field_id) {
154
- } else if (table.ownership_formula) {
155
- rows = rows.filter((row) => table.is_owner(req.user, row));
131
+ const result = await db.withTransaction(async () => {
132
+ let rowLimit = 1000;
133
+ const result = {};
134
+
135
+ for (const [tblName, syncInfo] of Object.entries(syncInfos)) {
136
+ const table = Table.findOne({ name: tblName });
137
+ if (!table) throw new Error(`The table '${tblName}' does not exists`);
138
+ const pkName = table.pk_name;
139
+ let rows = await getSyncRows(syncInfo, table, loadUntil, req.user);
140
+ if (!rows) continue;
141
+ if (role > table.min_role_read) {
142
+ if (
143
+ role === 100 ||
144
+ (!table.ownership_field_id && !table.ownership_formula)
145
+ )
146
+ continue;
147
+ else if (table.ownership_field_id) {
148
+ } else if (table.ownership_formula) {
149
+ rows = rows.filter((row) => table.is_owner(req.user, row));
150
+ }
156
151
  }
152
+ if (rows.length > rowLimit) {
153
+ rows.splice(rowLimit);
154
+ }
155
+ rowLimit -= rows.length;
156
+ result[tblName] = {
157
+ rows,
158
+ maxLoadedId: rows.length > 0 ? rows[rows.length - 1][pkName] : 0,
159
+ };
157
160
  }
158
- if (rows.length > rowLimit) {
159
- rows.splice(rowLimit);
160
- }
161
- rowLimit -= rows.length;
162
- result[tblName] = {
163
- rows,
164
- maxLoadedId: rows.length > 0 ? rows[rows.length - 1][pkName] : 0,
165
- };
166
- }
167
- await client.query("COMMIT");
161
+ return result;
162
+ });
168
163
  res.json(result);
169
164
  } catch (error) {
170
- await client.query("ROLLBACK");
171
165
  getState().log(2, `POST /load_changes: '${error.message}'`);
172
166
  res.status(400).json({ error: error.message || error });
173
- } finally {
174
- client.release(true);
175
167
  }
176
168
  })
177
169
  );
178
170
 
179
- const getDelRows = async (tblName, syncFrom, syncUntil, client) => {
171
+ const getDelRows = async (tblName, syncFrom, syncUntil) => {
180
172
  const schema = db.getTenantSchemaPrefix();
181
- const dbRes = await client.query(
173
+ const dbRes = await db.query(
182
174
  `select *
183
175
  from (
184
176
  select ref, max(last_modified) from ${schema}"${db.sqlsanitize(
185
- tblName
186
- )}_sync_info"
177
+ tblName
178
+ )}_sync_info"
187
179
  group by ref, deleted having deleted = true) as alias
188
180
  where alias.max < to_timestamp(${syncUntil.valueOf() / 1000.0})
189
181
  and alias.max > to_timestamp(${syncFrom.valueOf() / 1000.0})`
@@ -203,31 +195,27 @@ router.post(
203
195
  "/deletes",
204
196
  error_catcher(async (req, res) => {
205
197
  const { syncInfos, syncTimestamp } = req.body || {};
206
- const client = await db.getClient();
207
198
  try {
208
- await client.query(`BEGIN`);
209
- const syncUntil = new Date(syncTimestamp);
210
- const result = {
211
- deletes: {},
212
- };
213
- for (const [tblName, syncInfo] of Object.entries(syncInfos)) {
214
- if (syncInfo.syncFrom) {
215
- result.deletes[tblName] = await getDelRows(
216
- tblName,
217
- new Date(syncInfo.syncFrom),
218
- syncUntil,
219
- client
220
- );
199
+ const result = await db.withTransaction(async () => {
200
+ const syncUntil = new Date(syncTimestamp);
201
+ const result = {
202
+ deletes: {},
203
+ };
204
+ for (const [tblName, syncInfo] of Object.entries(syncInfos)) {
205
+ if (syncInfo.syncFrom) {
206
+ result.deletes[tblName] = await getDelRows(
207
+ tblName,
208
+ new Date(syncInfo.syncFrom),
209
+ syncUntil
210
+ );
211
+ }
221
212
  }
222
- }
223
- await client.query("COMMIT");
213
+ return result;
214
+ });
224
215
  res.json(result);
225
216
  } catch (error) {
226
- await client.query("ROLLBACK");
227
217
  getState().log(2, `POST /sync/deletes: '${error.message}'`);
228
218
  res.status(400).json({ error: error.message || error });
229
- } finally {
230
- client.release(true);
231
219
  }
232
220
  })
233
221
  );
package/routes/tables.js CHANGED
@@ -373,6 +373,7 @@ router.post(
373
373
  .map((t) => t.table_name);
374
374
  const pack = await discover_tables(tableNames);
375
375
  await implement_discovery(pack);
376
+ await getState().refresh_tables();
376
377
  req.flash(
377
378
  "success",
378
379
  req.__("Discovered tables: %s", tableNames.join(", "))
@@ -469,6 +470,7 @@ router.post(
469
470
  req.flash("error", parse_res.error);
470
471
  res.redirect(`/table/create-from-csv`);
471
472
  } else {
473
+ await getState().refresh_tables();
472
474
  Trigger.emitEvent(
473
475
  "AppChange",
474
476
  `Table ${parse_res.table.name}`,
@@ -1247,11 +1249,15 @@ router.post(
1247
1249
  res.redirect(`/table/provider-cfg/${table.id}`);
1248
1250
  } else {
1249
1251
  delete rest.provider_name;
1250
- const table = await Table.create(name, rest);
1251
- Trigger.emitEvent("AppChange", `Table ${name}`, req.user, {
1252
- entity_type: "Table",
1253
- entity_name: name,
1252
+ let table;
1253
+ await db.withTransaction(async () => {
1254
+ table = await Table.create(name, rest);
1255
+ Trigger.emitEvent("AppChange", `Table ${name}`, req.user, {
1256
+ entity_type: "Table",
1257
+ entity_name: name,
1258
+ });
1254
1259
  });
1260
+ await getState().refresh_tables();
1255
1261
  req.flash("success", req.__(`Table %s created`, name));
1256
1262
  res.redirect(`/table/${table.id}`);
1257
1263
  }
@@ -1299,8 +1305,10 @@ router.post(
1299
1305
  rest.ownership_formula = rest.ownership_field_id.replace("Fml:", "");
1300
1306
  rest.ownership_field_id = null;
1301
1307
  } else rest.ownership_formula = null;
1302
- await table.update(rest);
1303
-
1308
+ await db.withTransaction(async () => {
1309
+ await table.update(rest);
1310
+ });
1311
+ await getState().refresh_tables();
1304
1312
  if (!req.xhr) {
1305
1313
  if (!old_versioned && rest.versioned)
1306
1314
  req.flash(
@@ -1344,16 +1352,22 @@ router.post(
1344
1352
  res.redirect(`/table`);
1345
1353
  return;
1346
1354
  }
1347
- const views = await View.find(
1348
- t.id ? { table_id: t.id } : { exttable_name: t.name }
1349
- );
1350
- for (const view of views) await view.delete();
1351
- if (t.id) {
1352
- const triggers = await Trigger.find({ table_id: t.id });
1353
- for (const trig of triggers) await trig.delete();
1354
- }
1355
1355
  try {
1356
- await t.delete();
1356
+ await db.withTransaction(async () => {
1357
+ const views = await View.find(
1358
+ t.id ? { table_id: t.id } : { exttable_name: t.name }
1359
+ );
1360
+ for (const view of views) await view.delete();
1361
+ if (t.id) {
1362
+ const triggers = await Trigger.find({ table_id: t.id });
1363
+ for (const trig of triggers) await trig.delete();
1364
+ }
1365
+
1366
+ await t.delete();
1367
+ });
1368
+ await getState().refresh_tables();
1369
+ await getState().refresh_views();
1370
+ await getState().refresh_triggers();
1357
1371
  req.flash("success", req.__(`Table %s deleted`, t.name));
1358
1372
  res.redirect(`/table`);
1359
1373
  } catch (err) {
@@ -1414,12 +1428,15 @@ router.post(
1414
1428
  }
1415
1429
  }
1416
1430
  try {
1417
- await t.delete();
1418
- req.flash("success", req.__(`Table %s deleted`, t.name));
1419
- Trigger.emitEvent("AppChange", `Table ${t.name} deleted`, req.user, {
1420
- entity_type: "Table",
1421
- entity_name: t.name,
1431
+ await db.withTransaction(async () => {
1432
+ await t.delete();
1433
+ req.flash("success", req.__(`Table %s deleted`, t.name));
1434
+ Trigger.emitEvent("AppChange", `Table ${t.name} deleted`, req.user, {
1435
+ entity_type: "Table",
1436
+ entity_name: t.name,
1437
+ });
1422
1438
  });
1439
+ await getState().refresh_tables();
1423
1440
  res.redirect(`/table`);
1424
1441
  } catch (err) {
1425
1442
  req.flash("error", err.message);
@@ -1444,7 +1461,10 @@ router.post(
1444
1461
  return;
1445
1462
  }
1446
1463
  try {
1447
- await t.delete(true);
1464
+ await db.withTransaction(async () => {
1465
+ await t.delete(true);
1466
+ });
1467
+ await getState().refresh_tables();
1448
1468
  req.flash(
1449
1469
  "success",
1450
1470
  req.__(`Table %s forgotten. You can now discover it.`, t.name)
@@ -1850,11 +1870,15 @@ router.post(
1850
1870
  .filter((f) => form.values[f]);
1851
1871
  configuration.errormsg = form.values.errormsg;
1852
1872
  } else configuration = form.values;
1853
- await TableConstraint.create({
1854
- table_id: table.id,
1855
- type,
1856
- configuration,
1873
+ await db.withTransaction(async () => {
1874
+ await TableConstraint.create({
1875
+ table_id: table.id,
1876
+ type,
1877
+ configuration,
1878
+ });
1857
1879
  });
1880
+ await getState().refresh_tables();
1881
+
1858
1882
  Trigger.emitEvent(
1859
1883
  "AppChange",
1860
1884
  `Constraint ${type} on table ${table?.name}`,
@@ -1943,8 +1967,12 @@ router.post(
1943
1967
  form.validate(req.body || {});
1944
1968
  if (form.hasErrors) req.flash("error", req.__("An error occurred"));
1945
1969
  else {
1946
- await table.rename(form.values.name);
1970
+ await db.withTransaction(async () => {
1971
+ await table.rename(form.values.name);
1972
+ });
1973
+ await getState().refresh_tables();
1947
1974
  }
1975
+
1948
1976
  res.redirect(`/table/${table.id}`);
1949
1977
  })
1950
1978
  );
@@ -1962,7 +1990,10 @@ router.post(
1962
1990
  error_catcher(async (req, res) => {
1963
1991
  const { id } = req.params;
1964
1992
  const cons = await TableConstraint.findOne({ id });
1965
- await cons.delete();
1993
+ await db.withTransaction(async () => {
1994
+ await cons.delete();
1995
+ });
1996
+ await getState().refresh_tables();
1966
1997
  res.redirect(`/table/constraints/${cons.table_id}`);
1967
1998
  })
1968
1999
  );
@@ -2216,10 +2247,12 @@ router.post(
2216
2247
  const table = Table.findOne({ name });
2217
2248
 
2218
2249
  try {
2219
- await table.deleteRows({}, req.user, true);
2250
+ await db.withTransaction(async () => {
2251
+ await table.deleteRows({}, req.user, true);
2252
+ });
2220
2253
  req.flash("success", req.__("Deleted all rows"));
2221
2254
  } catch (e) {
2222
- console.error(e)
2255
+ console.error(e);
2223
2256
  req.flash("error", e.message);
2224
2257
  }
2225
2258
 
@@ -2382,6 +2415,7 @@ router.post(
2382
2415
  const workflow = get_provider_workflow(table, req);
2383
2416
  const wfres = await workflow.run(req.body || {}, req);
2384
2417
  respondWorkflow(table, workflow, wfres, req, res);
2418
+ await getState().refresh_tables();
2385
2419
  })
2386
2420
  );
2387
2421
 
@@ -2397,7 +2431,10 @@ router.post(
2397
2431
  res.redirect(`/table`);
2398
2432
  return;
2399
2433
  }
2400
- await table.repairCompositePrimary();
2434
+ await db.withTransaction(async () => {
2435
+ await table.repairCompositePrimary();
2436
+ });
2437
+ await getState().refresh_tables();
2401
2438
  res.redirect(`/table/${table.id}`);
2402
2439
  })
2403
2440
  );
@@ -2415,68 +2452,70 @@ router.post(
2415
2452
  res.redirect(`/table`);
2416
2453
  return;
2417
2454
  }
2418
- const initial_view = async (table, viewtemplate) => {
2419
- const configuration = await initial_config_all_fields(
2420
- viewtemplate === "Edit"
2421
- )({ table_id: table.id });
2422
- //console.log(configuration);
2423
- const name = `${viewtemplate} ${table.name}`;
2424
- const view = await View.create({
2425
- name,
2426
- configuration,
2427
- viewtemplate,
2428
- table_id: table.id,
2429
- min_role: 100,
2430
- });
2431
- return view;
2432
- };
2433
- const list = await initial_view(table, "List");
2434
- const edit = await initial_view(table, "Edit");
2435
- const show = await initial_view(table, "Show");
2436
- await View.update(
2437
- {
2438
- configuration: {
2439
- ...list.configuration,
2440
- columns: [
2441
- ...list.configuration.columns,
2442
- {
2443
- type: "ViewLink",
2444
- view: `Own:Show ${table.name}`,
2445
- view_name: `Show ${table.name}`,
2446
- link_style: "",
2447
- view_label: "Show",
2448
- header_label: "Show",
2449
- },
2450
- {
2451
- type: "ViewLink",
2452
- view: `Own:Edit ${table.name}`,
2453
- view_name: `Edit ${table.name}`,
2454
- link_style: "",
2455
- view_label: "Edit",
2456
- header_label: "Edit",
2457
- },
2458
- {
2459
- type: "Action",
2460
- action_name: "Delete",
2461
- action_style: "btn-primary",
2462
- },
2463
- ],
2464
- view_to_create: `Edit ${table.name}`,
2455
+ await db.withTransaction(async () => {
2456
+ const initial_view = async (table, viewtemplate) => {
2457
+ const configuration = await initial_config_all_fields(
2458
+ viewtemplate === "Edit"
2459
+ )({ table_id: table.id });
2460
+ //console.log(configuration);
2461
+ const name = `${viewtemplate} ${table.name}`;
2462
+ const view = await View.create({
2463
+ name,
2464
+ configuration,
2465
+ viewtemplate,
2466
+ table_id: table.id,
2467
+ min_role: 100,
2468
+ });
2469
+ return view;
2470
+ };
2471
+ const list = await initial_view(table, "List");
2472
+ const edit = await initial_view(table, "Edit");
2473
+ const show = await initial_view(table, "Show");
2474
+ await View.update(
2475
+ {
2476
+ configuration: {
2477
+ ...list.configuration,
2478
+ columns: [
2479
+ ...list.configuration.columns,
2480
+ {
2481
+ type: "ViewLink",
2482
+ view: `Own:Show ${table.name}`,
2483
+ view_name: `Show ${table.name}`,
2484
+ link_style: "",
2485
+ view_label: "Show",
2486
+ header_label: "Show",
2487
+ },
2488
+ {
2489
+ type: "ViewLink",
2490
+ view: `Own:Edit ${table.name}`,
2491
+ view_name: `Edit ${table.name}`,
2492
+ link_style: "",
2493
+ view_label: "Edit",
2494
+ header_label: "Edit",
2495
+ },
2496
+ {
2497
+ type: "Action",
2498
+ action_name: "Delete",
2499
+ action_style: "btn-primary",
2500
+ },
2501
+ ],
2502
+ view_to_create: `Edit ${table.name}`,
2503
+ },
2465
2504
  },
2466
- },
2467
- list.id
2468
- );
2469
- await View.update(
2470
- {
2471
- configuration: {
2472
- ...edit.configuration,
2473
- view_when_done: `List ${table.name}`,
2474
- destination_type: "View",
2505
+ list.id
2506
+ );
2507
+ await View.update(
2508
+ {
2509
+ configuration: {
2510
+ ...edit.configuration,
2511
+ view_when_done: `List ${table.name}`,
2512
+ destination_type: "View",
2513
+ },
2475
2514
  },
2476
- },
2477
- edit.id
2478
- );
2479
-
2515
+ edit.id
2516
+ );
2517
+ });
2518
+ await getState().refresh_views();
2480
2519
  res.redirect(`/table/${table.id}`);
2481
2520
  })
2482
2521
  );
package/routes/utils.js CHANGED
@@ -164,7 +164,7 @@ const set_custom_http_headers = (res, req, state) => {
164
164
  validateHeaderName(k);
165
165
  validateHeaderValue(k, val);
166
166
  res.header(k, val);
167
- } catch (e) {
167
+ } catch (e) {
168
168
  Crash.create(e, { url: "/", headers: {} });
169
169
  }
170
170
  }
@@ -200,7 +200,26 @@ const get_tenant_from_req = (req, hostPartsOffset) => {
200
200
  * @param {function} next
201
201
  */
202
202
  const setTenant = (req, res, next) => {
203
- if (db.is_it_multi_tenant()) {
203
+ let wrap =
204
+ req.method === "POST" && !db.isSQLite
205
+ ? (f) => {
206
+ db.getClient().then((client) => {
207
+ let released = false;
208
+ res.on("finish", function () {
209
+ if (!released) client.release();
210
+ released = true;
211
+ });
212
+ res.on("close", function () {
213
+ if (!released) client.release();
214
+ released = true;
215
+ });
216
+ f(client);
217
+ });
218
+ }
219
+ : (f) => {
220
+ f(null);
221
+ };
222
+ wrap((client) => {
204
223
  // for a saltcorn mobile request use 'req.user.tenant'
205
224
  if (req.smr) {
206
225
  if (
@@ -212,7 +231,7 @@ const setTenant = (req, res, next) => {
212
231
  setLanguage(req, res);
213
232
  next();
214
233
  } else {
215
- db.runWithTenant(req.user.tenant, () => {
234
+ db.runWithTenant({ tenant: req.user.tenant, req, client }, () => {
216
235
  setLanguage(req, res, state);
217
236
  state.log(5, `${req.method} ${req.originalUrl}`);
218
237
  next();
@@ -230,7 +249,7 @@ const setTenant = (req, res, next) => {
230
249
  setLanguage(req, res);
231
250
  next();
232
251
  } else {
233
- db.runWithTenant(other_domain, () => {
252
+ db.runWithTenant({ tenant: other_domain, req, client }, () => {
234
253
  setLanguage(req, res, state);
235
254
  if (state.logLevel >= 5)
236
255
  state.log(
@@ -251,7 +270,7 @@ const setTenant = (req, res, next) => {
251
270
  setLanguage(req, res);
252
271
  next();
253
272
  } else {
254
- db.runWithTenant(ten, () => {
273
+ db.runWithTenant({ tenant: ten, req, client }, () => {
255
274
  setLanguage(req, res, state);
256
275
  if (state.logLevel >= 5)
257
276
  state.log(
@@ -267,17 +286,7 @@ const setTenant = (req, res, next) => {
267
286
  }
268
287
  }
269
288
  }
270
- } else {
271
- const state = getState();
272
- setLanguage(req, res, state);
273
- state.log(
274
- 5,
275
- `${req.method} ${req.originalUrl}${
276
- state.getConfig("log_ip_address", false) ? ` IP=${req.ip}` : ""
277
- }`
278
- );
279
- next();
280
- }
289
+ });
281
290
  };
282
291
 
283
292
  /**
@@ -504,7 +513,7 @@ const sendHtmlFile = async (req, res, file) => {
504
513
  .sendWrap(req.__("An error occurred"), req.__("File not found"));
505
514
  }
506
515
  } catch (e) {
507
- console.error(e)
516
+ console.error(e);
508
517
  return res
509
518
  .status(404)
510
519
  .sendWrap(
@@ -531,6 +540,7 @@ const setRole = async (req, res, model) => {
531
540
  roleRow && page
532
541
  ? req.__(`Minimum role for %s updated to %s`, page.name, roleRow.role)
533
542
  : req.__(`Minimum role updated`);
543
+ if (model.state_refresh) await model.state_refresh();
534
544
  if (!req.xhr) {
535
545
  req.flash("success", message);
536
546
  res.redirect("/pageedit");