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

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 (396) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/docs/assets/search.js +1 -1
  3. package/docs/classes/_saltcorn_common_code.Relation.html +8 -8
  4. package/docs/classes/_saltcorn_common_code.RelationsFinder.html +5 -5
  5. package/docs/classes/_saltcorn_data.models.Crash-1.html +18 -18
  6. package/docs/classes/_saltcorn_data.models.EventLog-1.html +19 -19
  7. package/docs/classes/_saltcorn_data.models.Field.html +71 -71
  8. package/docs/classes/_saltcorn_data.models.FieldRepeat-1.html +17 -17
  9. package/docs/classes/_saltcorn_data.models.File-1.html +48 -48
  10. package/docs/classes/_saltcorn_data.models.Form-1.html +38 -38
  11. package/docs/classes/_saltcorn_data.models.Library.html +13 -13
  12. package/docs/classes/_saltcorn_data.models.Page.html +33 -23
  13. package/docs/classes/_saltcorn_data.models.PageGroup-1.html +28 -33
  14. package/docs/classes/_saltcorn_data.models.Plugin.html +25 -25
  15. package/docs/classes/_saltcorn_data.models.Role.html +9 -9
  16. package/docs/classes/_saltcorn_data.models.Table-1.html +101 -91
  17. package/docs/classes/_saltcorn_data.models.TableConstraint-1.html +14 -14
  18. package/docs/classes/_saltcorn_data.models.Trigger.html +45 -35
  19. package/docs/classes/_saltcorn_data.models.User-1.html +48 -48
  20. package/docs/classes/_saltcorn_data.models.View-1.html +61 -51
  21. package/docs/classes/_saltcorn_data.models.Workflow-1.html +17 -17
  22. package/docs/classes/_saltcorn_data.models.WorkflowRun.html +35 -35
  23. package/docs/classes/_saltcorn_data.models.WorkflowStep.html +25 -25
  24. package/docs/classes/_saltcorn_data.models.WorkflowTrace.html +18 -18
  25. package/docs/classes/_saltcorn_mobile_builder.MobileBuilder.html +36 -36
  26. package/docs/enums/_saltcorn_common_code.RelationType.html +7 -7
  27. package/docs/enums/_saltcorn_common_code.ViewDisplayType.html +4 -4
  28. package/docs/functions/_saltcorn_admin_models.backup.create_backup.html +1 -1
  29. package/docs/functions/_saltcorn_admin_models.backup.create_csv_from_rows.html +1 -1
  30. package/docs/functions/_saltcorn_admin_models.backup.restore.html +1 -1
  31. package/docs/functions/_saltcorn_admin_models.pack.add_to_menu.html +1 -1
  32. package/docs/functions/_saltcorn_admin_models.pack.can_install_pack.html +1 -1
  33. package/docs/functions/_saltcorn_admin_models.pack.fetch_available_packs.html +1 -1
  34. package/docs/functions/_saltcorn_admin_models.pack.fetch_pack_by_name.html +1 -1
  35. package/docs/functions/_saltcorn_admin_models.pack.install_pack.html +1 -1
  36. package/docs/functions/_saltcorn_admin_models.pack.library_pack.html +1 -1
  37. package/docs/functions/_saltcorn_admin_models.pack.model_instance_pack.html +1 -1
  38. package/docs/functions/_saltcorn_admin_models.pack.model_pack.html +1 -1
  39. package/docs/functions/_saltcorn_admin_models.pack.page_group_pack.html +1 -1
  40. package/docs/functions/_saltcorn_admin_models.pack.page_pack.html +1 -1
  41. package/docs/functions/_saltcorn_admin_models.pack.plugin_pack.html +1 -1
  42. package/docs/functions/_saltcorn_admin_models.pack.role_pack.html +1 -1
  43. package/docs/functions/_saltcorn_admin_models.pack.table_pack.html +1 -1
  44. package/docs/functions/_saltcorn_admin_models.pack.trigger_pack.html +1 -1
  45. package/docs/functions/_saltcorn_admin_models.pack.uninstall_pack.html +1 -1
  46. package/docs/functions/_saltcorn_admin_models.pack.view_pack.html +1 -1
  47. package/docs/functions/_saltcorn_admin_models.tenant.copy_tenant_template.html +1 -1
  48. package/docs/functions/_saltcorn_admin_models.tenant.create_tenant.html +1 -1
  49. package/docs/functions/_saltcorn_admin_models.tenant.deleteTenant.html +1 -1
  50. package/docs/functions/_saltcorn_admin_models.tenant.domain_sanitize.html +1 -1
  51. package/docs/functions/_saltcorn_admin_models.tenant.eachTenant.html +1 -1
  52. package/docs/functions/_saltcorn_admin_models.tenant.getAllTenantRows.html +1 -1
  53. package/docs/functions/_saltcorn_admin_models.tenant.getAllTenants.html +1 -1
  54. package/docs/functions/_saltcorn_admin_models.tenant.insertTenant.html +1 -1
  55. package/docs/functions/_saltcorn_admin_models.tenant.switchToTenant.html +1 -1
  56. package/docs/functions/_saltcorn_common_code.buildTableCaches.html +1 -1
  57. package/docs/functions/_saltcorn_common_code.parseLegacyRelation.html +1 -1
  58. package/docs/functions/_saltcorn_common_code.parseRelationPath.html +1 -1
  59. package/docs/functions/_saltcorn_data.models.config.check_email_mask.html +1 -1
  60. package/docs/functions/_saltcorn_data.models.config.deleteConfig.html +1 -1
  61. package/docs/functions/_saltcorn_data.models.config.getAllConfig.html +1 -1
  62. package/docs/functions/_saltcorn_data.models.config.getConfig.html +1 -1
  63. package/docs/functions/_saltcorn_data.models.config.get_base_url.html +1 -1
  64. package/docs/functions/_saltcorn_data.models.config.get_latest_npm_version.html +1 -1
  65. package/docs/functions/_saltcorn_data.models.config.remove_from_menu.html +1 -1
  66. package/docs/functions/_saltcorn_data.models.config.save_menu_items.html +1 -1
  67. package/docs/functions/_saltcorn_data.models.config.setConfig.html +1 -1
  68. package/docs/functions/_saltcorn_data.models.discovery.discover_tables.html +1 -1
  69. package/docs/functions/_saltcorn_data.models.discovery.discoverable_tables.html +1 -1
  70. package/docs/functions/_saltcorn_data.models.discovery.findType.html +1 -1
  71. package/docs/functions/_saltcorn_data.models.discovery.get_existing_views.html +1 -1
  72. package/docs/functions/_saltcorn_data.models.discovery.implement_discovery.html +1 -1
  73. package/docs/functions/_saltcorn_data.models.email.getMailTransport.html +1 -1
  74. package/docs/functions/_saltcorn_data.models.email.send_verification_email.html +1 -1
  75. package/docs/functions/_saltcorn_data.models.email.viewToEmailHtml.html +1 -1
  76. package/docs/functions/_saltcorn_data.models.expression.apply_calculated_fields.html +1 -1
  77. package/docs/functions/_saltcorn_data.models.expression.apply_calculated_fields_stored.html +1 -1
  78. package/docs/functions/_saltcorn_data.models.expression.eval_expression.html +1 -1
  79. package/docs/functions/_saltcorn_data.models.expression.expressionValidator.html +1 -1
  80. package/docs/functions/_saltcorn_data.models.expression.get_async_expression_function.html +1 -1
  81. package/docs/functions/_saltcorn_data.models.expression.get_expression_function.html +1 -1
  82. package/docs/functions/_saltcorn_data.models.expression.jsexprToWhere.html +1 -1
  83. package/docs/functions/_saltcorn_data.models.expression.recalculate_for_stored.html +1 -1
  84. package/docs/functions/_saltcorn_data.models.expression.transform_for_async.html +1 -1
  85. package/docs/functions/_saltcorn_data.models.layout.eachView.html +1 -1
  86. package/docs/functions/_saltcorn_data.models.layout.getStringsForI18n.html +1 -1
  87. package/docs/functions/_saltcorn_data.models.layout.getViews.html +1 -1
  88. package/docs/functions/_saltcorn_data.models.layout.translateLayout.html +1 -1
  89. package/docs/functions/_saltcorn_data.models.layout.traverse.html +1 -1
  90. package/docs/functions/_saltcorn_data.models.layout.traverseSync.html +1 -1
  91. package/docs/functions/_saltcorn_data.models.random.all_views.html +1 -1
  92. package/docs/functions/_saltcorn_data.models.random.fill_table_row.html +1 -1
  93. package/docs/functions/_saltcorn_data.models.random.initial_view.html +1 -1
  94. package/docs/functions/_saltcorn_data.models.random.random_table.html +1 -1
  95. package/docs/functions/_saltcorn_db_common.buildInsertBulkSql.html +2 -2
  96. package/docs/functions/_saltcorn_db_common.buildInsertSql.html +2 -2
  97. package/docs/functions/_saltcorn_db_common.doCount.html +2 -2
  98. package/docs/functions/_saltcorn_db_common.doDeleteWhere.html +2 -2
  99. package/docs/functions/_saltcorn_db_common.doListScTables.html +2 -2
  100. package/docs/functions/_saltcorn_db_common.doListTables.html +2 -2
  101. package/docs/functions/_saltcorn_db_common.doListUserDefinedTables.html +2 -2
  102. package/docs/functions/_saltcorn_db_common.do_add_index.html +2 -2
  103. package/docs/functions/_saltcorn_db_common.do_drop_index.html +2 -2
  104. package/docs/functions/_saltcorn_db_common.ftsFieldsSqlExpr.html +2 -2
  105. package/docs/functions/_saltcorn_db_common.mkSelectOptions.html +2 -2
  106. package/docs/functions/_saltcorn_db_common.mkVal.html +2 -2
  107. package/docs/functions/_saltcorn_db_common.mkWhere.html +2 -2
  108. package/docs/functions/_saltcorn_db_common.multi_tenant.enable_multi_tenant.html +3 -2
  109. package/docs/functions/{_saltcorn_db_common.single_tenant.enable_multi_tenant.html → _saltcorn_db_common.multi_tenant.getRequestContext.html} +16 -15
  110. package/docs/functions/_saltcorn_db_common.multi_tenant.getTenantSchema.html +3 -2
  111. package/docs/functions/_saltcorn_db_common.multi_tenant.init.html +3 -2
  112. package/docs/functions/_saltcorn_db_common.multi_tenant.is_it_multi_tenant.html +3 -2
  113. package/docs/functions/_saltcorn_db_common.multi_tenant.runWithTenant.html +5 -5
  114. package/docs/functions/_saltcorn_db_common.orderByIsObject.html +2 -2
  115. package/docs/functions/_saltcorn_db_common.orderByIsOperator.html +2 -2
  116. package/docs/functions/_saltcorn_db_common.prefixFieldsInWhere.html +2 -2
  117. package/docs/functions/_saltcorn_db_common.reprAsJson.html +2 -2
  118. package/docs/functions/_saltcorn_db_common.sqlBinOp.html +2 -2
  119. package/docs/functions/_saltcorn_db_common.sqlFun.html +2 -2
  120. package/docs/functions/_saltcorn_db_common.sqlsanitize.html +2 -2
  121. package/docs/functions/_saltcorn_db_common.sqlsanitizeAllowDots.html +2 -2
  122. package/docs/functions/_saltcorn_db_common.subSelectWhere.html +2 -2
  123. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.androidFeatures.html +1 -1
  124. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.androidPermissions.html +1 -1
  125. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.buildTablesFile.html +1 -1
  126. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyPrepopulatedDb.html +1 -1
  127. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyServerFiles.html +1 -1
  128. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyShareExtFiles.html +1 -1
  129. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copySiteLogo.html +1 -1
  130. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyTranslationFiles.html +1 -1
  131. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.createSqliteDb.html +1 -1
  132. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.decodeProvisioningProfile.html +1 -1
  133. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.extractDomain.html +1 -1
  134. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.generateAndroidVersionCode.html +1 -1
  135. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyAndroidManifest.html +1 -1
  136. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyConfigXml.html +1 -1
  137. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyGradleConfig.html +1 -1
  138. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyInfoPlist.html +1 -1
  139. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyXcodeProjectFile.html +1 -1
  140. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepAppIcon.html +1 -1
  141. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareAppIcon.html +1 -1
  142. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareBuildDir.html +1 -1
  143. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareExportOptionsPlist.html +1 -1
  144. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareSplashIcon.html +1 -1
  145. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareSplashPage.html +1 -1
  146. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeCapacitorConfig.html +1 -1
  147. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeCfgFile.html +1 -1
  148. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeDataExtractionRules.html +1 -1
  149. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeNetworkSecurityConfig.html +1 -1
  150. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writePodfile.html +1 -1
  151. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writePrivacyInfo.html +1 -1
  152. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.bundleMobileAppCode.html +1 -1
  153. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.bundlePackagesAndPlugins.html +1 -1
  154. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.copyMobileAppDirs.html +1 -1
  155. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.copyPublicDirs.html +1 -1
  156. package/docs/functions/_saltcorn_sqlite.add_index.html +3 -2
  157. package/docs/functions/_saltcorn_sqlite.add_unique_constraint.html +3 -2
  158. package/docs/functions/_saltcorn_sqlite.begin.html +3 -2
  159. package/docs/functions/_saltcorn_sqlite.changeConnection.html +3 -2
  160. package/docs/functions/_saltcorn_sqlite.close.html +3 -2
  161. package/docs/functions/_saltcorn_sqlite.commit.html +3 -2
  162. package/docs/functions/_saltcorn_sqlite.count.html +3 -2
  163. package/docs/functions/_saltcorn_sqlite.deleteWhere.html +3 -2
  164. package/docs/functions/_saltcorn_sqlite.dropTable.html +3 -2
  165. package/docs/functions/_saltcorn_sqlite.dropTables.html +3 -2
  166. package/docs/functions/_saltcorn_sqlite.drop_index.html +3 -2
  167. package/docs/functions/_saltcorn_sqlite.drop_reset_schema.html +3 -2
  168. package/docs/functions/_saltcorn_sqlite.drop_unique_constraint.html +3 -2
  169. package/docs/functions/_saltcorn_sqlite.getVersion.html +3 -2
  170. package/docs/functions/_saltcorn_sqlite.get_db_filepath.html +3 -2
  171. package/docs/functions/_saltcorn_sqlite.get_sql_logging.html +3 -2
  172. package/docs/functions/_saltcorn_sqlite.init.html +3 -2
  173. package/docs/functions/_saltcorn_sqlite.insert.html +3 -2
  174. package/docs/functions/_saltcorn_sqlite.listScTables.html +3 -2
  175. package/docs/functions/_saltcorn_sqlite.listTables.html +3 -2
  176. package/docs/functions/_saltcorn_sqlite.listUserDefinedTables.html +3 -2
  177. package/docs/functions/_saltcorn_sqlite.query.html +3 -2
  178. package/docs/functions/_saltcorn_sqlite.rollback.html +3 -2
  179. package/docs/functions/_saltcorn_sqlite.select.html +3 -2
  180. package/docs/functions/_saltcorn_sqlite.selectMaybeOne.html +3 -2
  181. package/docs/functions/_saltcorn_sqlite.selectOne.html +3 -2
  182. package/docs/functions/_saltcorn_sqlite.set_sql_logging.html +3 -2
  183. package/docs/functions/_saltcorn_sqlite.slugify.html +3 -2
  184. package/docs/functions/_saltcorn_sqlite.sql_log.html +3 -2
  185. package/docs/functions/_saltcorn_sqlite.update.html +3 -2
  186. package/docs/functions/_saltcorn_sqlite.updateWhere.html +3 -2
  187. package/docs/functions/_saltcorn_sqlite.withTransaction.html +96 -0
  188. package/docs/functions/_saltcorn_sqlite_mobile.add_index.html +1 -1
  189. package/docs/functions/_saltcorn_sqlite_mobile.add_unique_constraint.html +1 -1
  190. package/docs/functions/_saltcorn_sqlite_mobile.count.html +1 -1
  191. package/docs/functions/_saltcorn_sqlite_mobile.deleteWhere.html +1 -1
  192. package/docs/functions/_saltcorn_sqlite_mobile.drop_index.html +1 -1
  193. package/docs/functions/_saltcorn_sqlite_mobile.drop_reset_schema.html +1 -1
  194. package/docs/functions/_saltcorn_sqlite_mobile.drop_unique_constraint.html +1 -1
  195. package/docs/functions/_saltcorn_sqlite_mobile.init.html +1 -1
  196. package/docs/functions/_saltcorn_sqlite_mobile.insert.html +1 -1
  197. package/docs/functions/_saltcorn_sqlite_mobile.insertRows.html +1 -1
  198. package/docs/functions/_saltcorn_sqlite_mobile.listScTables.html +1 -1
  199. package/docs/functions/_saltcorn_sqlite_mobile.listTables.html +1 -1
  200. package/docs/functions/_saltcorn_sqlite_mobile.listUserDefinedTables.html +1 -1
  201. package/docs/functions/_saltcorn_sqlite_mobile.query.html +1 -1
  202. package/docs/functions/_saltcorn_sqlite_mobile.select.html +1 -1
  203. package/docs/functions/_saltcorn_sqlite_mobile.selectMaybeOne.html +1 -1
  204. package/docs/functions/_saltcorn_sqlite_mobile.selectOne.html +1 -1
  205. package/docs/functions/_saltcorn_sqlite_mobile.setConnectionObject.html +1 -1
  206. package/docs/functions/_saltcorn_sqlite_mobile.tableExists.html +1 -1
  207. package/docs/functions/_saltcorn_sqlite_mobile.time.html +1 -1
  208. package/docs/functions/_saltcorn_sqlite_mobile.update.html +1 -1
  209. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_field.instanceOfField.html +1 -1
  210. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_page.instanceOfPage.html +1 -1
  211. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_view.instanceOfView.html +1 -1
  212. package/docs/functions/_saltcorn_types.Types.base_types.instanceOWithHtmlFile.html +1 -1
  213. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfErrorMsg.html +1 -1
  214. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfSuccessMsg.html +1 -1
  215. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfType.html +1 -1
  216. package/docs/functions/_saltcorn_types.generators.generateBool.html +1 -1
  217. package/docs/functions/_saltcorn_types.generators.generateString.html +1 -1
  218. package/docs/functions/_saltcorn_types.generators.num_between.html +1 -1
  219. package/docs/functions/_saltcorn_types.generators.oneOf.html +1 -1
  220. package/docs/interfaces/_saltcorn_mobile_builder.common_build_utils.ScCapacitorConfig.html +10 -10
  221. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_field.AbstractField.html +14 -14
  222. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_field.AbstractFieldRepeat.html +3 -3
  223. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_form.AbstractForm.html +26 -26
  224. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_page.AbstractPage.html +7 -7
  225. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_role.AbstractRole.html +3 -3
  226. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_table.AbstractTable.html +7 -7
  227. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_trigger.AbstractTrigger.html +16 -16
  228. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_view.AbstractView.html +10 -10
  229. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_workflow.AbstractWorkflow.html +13 -13
  230. package/docs/modules/_saltcorn_admin_models.backup.html +1 -1
  231. package/docs/modules/_saltcorn_admin_models.html +1 -1
  232. package/docs/modules/_saltcorn_admin_models.pack.html +1 -1
  233. package/docs/modules/_saltcorn_admin_models.tenant.html +1 -1
  234. package/docs/modules/_saltcorn_common_code.html +1 -1
  235. package/docs/modules/_saltcorn_data.html +3 -3
  236. package/docs/modules/_saltcorn_data.models.Crash.html +2 -2
  237. package/docs/modules/_saltcorn_data.models.EventLog.html +2 -2
  238. package/docs/modules/_saltcorn_data.models.FieldRepeat.html +2 -2
  239. package/docs/modules/_saltcorn_data.models.File.html +2 -2
  240. package/docs/modules/_saltcorn_data.models.Form.html +2 -2
  241. package/docs/modules/_saltcorn_data.models.PageGroup.html +2 -2
  242. package/docs/modules/_saltcorn_data.models.Table.html +2 -2
  243. package/docs/modules/_saltcorn_data.models.TableConstraint.html +2 -2
  244. package/docs/modules/_saltcorn_data.models.User.html +2 -2
  245. package/docs/modules/_saltcorn_data.models.View.html +2 -2
  246. package/docs/modules/_saltcorn_data.models.Workflow.html +2 -2
  247. package/docs/modules/_saltcorn_data.models.config.html +1 -1
  248. package/docs/modules/_saltcorn_data.models.discovery.html +1 -1
  249. package/docs/modules/_saltcorn_data.models.email.html +1 -1
  250. package/docs/modules/_saltcorn_data.models.expression.html +1 -1
  251. package/docs/modules/_saltcorn_data.models.html +1 -1
  252. package/docs/modules/_saltcorn_data.models.layout.html +1 -1
  253. package/docs/modules/_saltcorn_data.models.random.html +1 -1
  254. package/docs/modules/_saltcorn_data.models.scheduler.html +1 -1
  255. package/docs/modules/_saltcorn_data.plugin_helper.html +1 -1
  256. package/docs/modules/_saltcorn_data.utils.html +1 -1
  257. package/docs/modules/_saltcorn_db_common.html +7 -7
  258. package/docs/modules/_saltcorn_db_common.multi_tenant.html +4 -2
  259. package/docs/modules/_saltcorn_markup.html +2 -2
  260. package/docs/modules/_saltcorn_mobile_builder.common_build_utils.html +1 -1
  261. package/docs/modules/_saltcorn_mobile_builder.html +1 -1
  262. package/docs/modules/_saltcorn_mobile_builder.package_bundle_utils.html +1 -1
  263. package/docs/modules/_saltcorn_sqlite.html +4 -2
  264. package/docs/modules/_saltcorn_sqlite_mobile.html +1 -1
  265. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_field.html +1 -1
  266. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_form.html +1 -1
  267. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_library.html +1 -1
  268. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_page.html +1 -1
  269. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_plugin.html +1 -1
  270. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_role.html +1 -1
  271. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_table.html +1 -1
  272. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_trigger.html +1 -1
  273. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_view.html +1 -1
  274. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_workflow.html +1 -1
  275. package/docs/modules/_saltcorn_types.ModelAbstracts.html +1 -1
  276. package/docs/modules/_saltcorn_types.Types.base_types.html +1 -1
  277. package/docs/modules/_saltcorn_types.Types.common_types.html +1 -1
  278. package/docs/modules/_saltcorn_types.Types.html +1 -1
  279. package/docs/modules/_saltcorn_types.generators.html +1 -1
  280. package/docs/modules/_saltcorn_types.html +1 -1
  281. package/docs/types/_saltcorn_data.models.Crash.CrashCfg.html +1 -1
  282. package/docs/types/_saltcorn_data.models.EventLog.EventLogCfg.html +1 -1
  283. package/docs/types/_saltcorn_data.models.FieldRepeat.FieldRepeatCfg.html +1 -1
  284. package/docs/types/_saltcorn_data.models.File.FileCfg.html +1 -1
  285. package/docs/types/_saltcorn_data.models.Form.AdditionalButton.html +1 -1
  286. package/docs/types/_saltcorn_data.models.Form.FormCfg.html +1 -1
  287. package/docs/types/_saltcorn_data.models.PageGroup.ScreenInfoParams.html +1 -1
  288. package/docs/types/_saltcorn_data.models.Table.ChildRelations.html +1 -1
  289. package/docs/types/_saltcorn_data.models.Table.ParentRelations.html +1 -1
  290. package/docs/types/_saltcorn_data.models.Table.RelationData.html +1 -1
  291. package/docs/types/_saltcorn_data.models.TableConstraint.TableConstraintCfg.html +1 -1
  292. package/docs/types/_saltcorn_data.models.User.UserCfg.html +1 -1
  293. package/docs/types/_saltcorn_data.models.View.FindViewsPred.html +1 -1
  294. package/docs/types/_saltcorn_data.models.Workflow.WorkflowCfg.html +1 -1
  295. package/docs/types/_saltcorn_db_common.AggregationOptions.html +2 -2
  296. package/docs/types/_saltcorn_db_common.CoordOpts.html +2 -2
  297. package/docs/types/_saltcorn_db_common.DatabaseClient.html +111 -0
  298. package/docs/types/_saltcorn_db_common.JoinField.html +2 -2
  299. package/docs/types/_saltcorn_db_common.JoinFields.html +2 -2
  300. package/docs/types/_saltcorn_db_common.JoinOptions.html +2 -2
  301. package/docs/types/_saltcorn_db_common.JsonPath.html +2 -2
  302. package/docs/types/_saltcorn_db_common.JsonPathElem.html +2 -2
  303. package/docs/types/_saltcorn_db_common.Operator.html +2 -2
  304. package/docs/types/_saltcorn_db_common.PrimaryKeyValue.html +2 -2
  305. package/docs/types/_saltcorn_db_common.Row.html +2 -2
  306. package/docs/types/_saltcorn_db_common.SelectOptions.html +5 -3
  307. package/docs/types/_saltcorn_db_common.SqlAndValues.html +2 -2
  308. package/docs/types/_saltcorn_db_common.SubselectOptions.html +2 -2
  309. package/docs/types/_saltcorn_db_common.Value.html +2 -2
  310. package/docs/types/_saltcorn_db_common.Where.html +2 -2
  311. package/docs/types/_saltcorn_mobile_builder.IosCfg.html +1 -1
  312. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_field.FieldCfg.html +1 -1
  313. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_field.InputType.html +1 -1
  314. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_form.AdditionalButton.html +1 -1
  315. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_library.LibraryCfg.html +1 -1
  316. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_library.LibraryPack.html +1 -1
  317. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_page.PageCfg.html +1 -1
  318. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_page.PagePack.html +1 -1
  319. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_plugin.PluginCfg.html +1 -1
  320. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_plugin.PluginPack.html +1 -1
  321. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_role.RoleCfg.html +1 -1
  322. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_role.RolePack.html +1 -1
  323. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_table.TableCfg.html +3 -3
  324. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_table.TablePack.html +1 -1
  325. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_trigger.TriggerCfg.html +1 -1
  326. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_trigger.TriggerPack.html +1 -1
  327. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_view.ViewCfg.html +1 -1
  328. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_view.ViewPack.html +1 -1
  329. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_workflow.ConfigWorkflowStep.html +1 -1
  330. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_workflow.RunResult.html +1 -1
  331. package/docs/types/_saltcorn_types.Types.base_types.Action.html +1 -1
  332. package/docs/types/_saltcorn_types.Types.base_types.AuthenticationMethod.html +1 -1
  333. package/docs/types/_saltcorn_types.Types.base_types.CapacitorPlugin.html +1 -1
  334. package/docs/types/_saltcorn_types.Types.base_types.CodePagePack.html +1 -1
  335. package/docs/types/_saltcorn_types.Types.base_types.Column.html +1 -1
  336. package/docs/types/_saltcorn_types.Types.base_types.ConnectedObjects.html +1 -1
  337. package/docs/types/_saltcorn_types.Types.base_types.CopilotSkill.html +1 -1
  338. package/docs/types/_saltcorn_types.Types.base_types.FieldLike.html +1 -1
  339. package/docs/types/_saltcorn_types.Types.base_types.FieldView.html +1 -1
  340. package/docs/types/_saltcorn_types.Types.base_types.Header.html +1 -1
  341. package/docs/types/_saltcorn_types.Types.base_types.JoinFieldOption.html +1 -1
  342. package/docs/types/_saltcorn_types.Types.base_types.Layout.html +1 -1
  343. package/docs/types/_saltcorn_types.Types.base_types.MobileConfig.html +1 -1
  344. package/docs/types/_saltcorn_types.Types.base_types.ModelPattern.html +1 -1
  345. package/docs/types/_saltcorn_types.Types.base_types.Pack.html +1 -1
  346. package/docs/types/_saltcorn_types.Types.base_types.Plugin.html +1 -1
  347. package/docs/types/_saltcorn_types.Types.base_types.PluginFunction.html +1 -1
  348. package/docs/types/_saltcorn_types.Types.base_types.PluginLayout.html +1 -1
  349. package/docs/types/_saltcorn_types.Types.base_types.PluginRoute.html +1 -1
  350. package/docs/types/_saltcorn_types.Types.base_types.PluginSourceType.html +1 -1
  351. package/docs/types/_saltcorn_types.Types.base_types.PluginType.html +1 -1
  352. package/docs/types/_saltcorn_types.Types.base_types.PluginWrap.html +1 -1
  353. package/docs/types/_saltcorn_types.Types.base_types.PluginWrapArg.html +1 -1
  354. package/docs/types/_saltcorn_types.Types.base_types.RelationOption.html +1 -1
  355. package/docs/types/_saltcorn_types.Types.base_types.Req.html +1 -1
  356. package/docs/types/_saltcorn_types.Types.base_types.Res.html +1 -1
  357. package/docs/types/_saltcorn_types.Types.base_types.RouteAction.html +1 -1
  358. package/docs/types/_saltcorn_types.Types.base_types.RunExtra.html +1 -1
  359. package/docs/types/_saltcorn_types.Types.base_types.TableProvider.html +1 -1
  360. package/docs/types/_saltcorn_types.Types.base_types.TableQuery.html +1 -1
  361. package/docs/types/_saltcorn_types.Types.base_types.Tablely.html +1 -1
  362. package/docs/types/_saltcorn_types.Types.base_types.ViewTemplate.html +1 -1
  363. package/docs/types/_saltcorn_types.Types.common_types.ErrorMessage.html +1 -1
  364. package/docs/types/_saltcorn_types.Types.common_types.GenObj.html +1 -1
  365. package/docs/types/_saltcorn_types.Types.common_types.ReqRes.html +1 -1
  366. package/docs/types/_saltcorn_types.Types.common_types.ResultMessage.html +1 -1
  367. package/docs/types/_saltcorn_types.Types.common_types.SuccessMessage.html +1 -1
  368. package/docs/types/_saltcorn_types.Types.common_types.Type.html +1 -1
  369. package/docs/variables/_saltcorn_data.db.html +1 -1
  370. package/docs/variables/_saltcorn_data.migrations.html +1 -1
  371. package/docs/variables/_saltcorn_data.models.config.available_languages.html +1 -1
  372. package/docs/variables/_saltcorn_data.models.config.configTypes.html +1 -1
  373. package/docs/variables/_saltcorn_data.models.scheduler.runScheduler.html +1 -1
  374. package/docs/variables/_saltcorn_data.plugin_helper.run_action_column.html +1 -1
  375. package/docs/variables/_saltcorn_data.utils.NotAuthorized.html +1 -1
  376. package/docs/variables/_saltcorn_data.utils.sleep.html +1 -1
  377. package/docs/variables/_saltcorn_db_common.multi_tenant.tenantNamespace.html +4 -3
  378. package/locales/en.json +2 -0
  379. package/package.json +9 -9
  380. package/routes/actions.js +10 -2
  381. package/routes/api.js +49 -40
  382. package/routes/fields.js +51 -52
  383. package/routes/menu.js +10 -8
  384. package/routes/packs.js +15 -7
  385. package/routes/page.js +17 -13
  386. package/routes/page_groupedit.js +8 -0
  387. package/routes/pageedit.js +10 -1
  388. package/routes/sync.js +60 -72
  389. package/routes/tables.js +129 -90
  390. package/routes/utils.js +21 -17
  391. package/routes/viewedit.js +18 -2
  392. package/docs/functions/_saltcorn_db_common.single_tenant.getTenantSchema.html +0 -109
  393. package/docs/functions/_saltcorn_db_common.single_tenant.init.html +0 -115
  394. package/docs/functions/_saltcorn_db_common.single_tenant.is_it_multi_tenant.html +0 -109
  395. package/docs/functions/_saltcorn_db_common.single_tenant.runWithTenant.html +0 -129
  396. package/docs/modules/_saltcorn_db_common.single_tenant.html +0 -115
package/routes/fields.js CHANGED
@@ -304,60 +304,56 @@ const fieldFlow = (req) =>
304
304
  fldRow.required = false;
305
305
  }
306
306
  const table = Table.findOne({ id: table_id });
307
- if (context.id) {
308
- const field = await Field.findOne({ id: context.id });
309
- try {
310
- if (fldRow.label && field.label != fldRow.label) {
311
- fldRow.name = Field.labelToName(fldRow.label);
312
- }
307
+ try {
308
+ await db.withTransaction(async () => {
309
+ if (context.id) {
310
+ const field = await Field.findOne({ id: context.id });
313
311
 
314
- await field.update(fldRow);
315
- Trigger.emitEvent(
316
- "AppChange",
317
- `Field ${fldRow.name} on table ${table?.name}`,
318
- req.user,
319
- {
320
- entity_type: "Field",
321
- entity_name: fldRow.name || fldRow.label,
322
- }
323
- );
324
- } catch (e) {
325
- console.error(e);
326
- return {
327
- redirect: `/table/${context.table_id}`,
328
- flash: ["error", e.message],
329
- };
330
- }
331
- } else {
332
- try {
333
- await Field.create(fldRow);
334
- Trigger.emitEvent(
335
- "AppChange",
336
- `Field ${fldRow.name} on table ${table?.name}`,
337
- req.user,
338
- {
339
- entity_type: "Field",
340
- entity_name: fldRow.name || fldRow.label,
312
+ if (fldRow.label && field.label != fldRow.label) {
313
+ fldRow.name = Field.labelToName(fldRow.label);
341
314
  }
342
- );
343
- } catch (e) {
344
- console.error(e);
345
- return {
346
- redirect: `/table/${context.table_id}`,
347
- flash: ["error", e.message],
348
- };
349
- }
350
- }
351
315
 
352
- return {
353
- redirect: `/table/${context.table_id}`,
354
- flash: [
355
- "success",
356
- context.id
357
- ? req.__("Field %s saved", label)
358
- : req.__("Field %s created", label),
359
- ],
360
- };
316
+ await field.update(fldRow);
317
+ Trigger.emitEvent(
318
+ "AppChange",
319
+ `Field ${fldRow.name} on table ${table?.name}`,
320
+ req.user,
321
+ {
322
+ entity_type: "Field",
323
+ entity_name: fldRow.name || fldRow.label,
324
+ }
325
+ );
326
+ } else {
327
+ await Field.create(fldRow);
328
+ Trigger.emitEvent(
329
+ "AppChange",
330
+ `Field ${fldRow.name} on table ${table?.name}`,
331
+ req.user,
332
+ {
333
+ entity_type: "Field",
334
+ entity_name: fldRow.name || fldRow.label,
335
+ }
336
+ );
337
+ }
338
+ });
339
+ await getState().refresh_tables();
340
+
341
+ return {
342
+ redirect: `/table/${context.table_id}`,
343
+ flash: [
344
+ "success",
345
+ context.id
346
+ ? req.__("Field %s saved", label)
347
+ : req.__("Field %s created", label),
348
+ ],
349
+ };
350
+ } catch (e) {
351
+ console.error(e);
352
+ return {
353
+ redirect: `/table/${context.table_id}`,
354
+ flash: ["error", e.message],
355
+ };
356
+ }
361
357
  },
362
358
  steps: [
363
359
  {
@@ -897,8 +893,11 @@ router.post(
897
893
  return;
898
894
  }
899
895
  const table_id = f.table_id;
896
+ await db.withTransaction(async () => {
897
+ await f.delete();
898
+ });
899
+ await getState().refresh_tables();
900
900
 
901
- await f.delete();
902
901
  req.flash("success", req.__(`Field %s deleted`, f.label));
903
902
  res.redirect(`/table/${table_id}`);
904
903
  })
package/routes/menu.js CHANGED
@@ -605,20 +605,22 @@ router.post(
605
605
  else if (item.subitems) search(item.subitems);
606
606
  });
607
607
  search(menu_items);
608
- if (menu_item)
608
+ if (menu_item) {
609
609
  try {
610
- const result = await run_action_column({
611
- col: menu_item,
612
- referrer: req.get("Referrer"),
613
- req,
614
- res,
610
+ const result = await db.withTransaction(async () => {
611
+ return await run_action_column({
612
+ col: menu_item,
613
+ referrer: req.get("Referrer"),
614
+ req,
615
+ res,
616
+ });
615
617
  });
616
618
  res.json({ success: "ok", ...(result || {}) });
617
619
  } catch (e) {
618
620
  console.error(e);
619
621
  res.status(400).json({ error: e.message || e });
620
622
  }
621
- else res.status(404).json({ error: "Action not found" });
623
+ } else res.status(404).json({ error: "Action not found" });
622
624
  })
623
625
  );
624
626
 
@@ -656,7 +658,7 @@ router.get(
656
658
  break;
657
659
  case "json":
658
660
  res.json(icons);
659
-
661
+ break;
660
662
  default:
661
663
  res.send("");
662
664
  break;
package/routes/packs.js CHANGED
@@ -18,6 +18,8 @@ const EventLog = require("@saltcorn/data/models/eventlog");
18
18
  const Model = require("@saltcorn/data/models/model");
19
19
  const ModelInstance = require("@saltcorn/data/models/model_instance");
20
20
  const load_plugins = require("../load_plugins");
21
+ const { getState } = require("@saltcorn/data/db/state");
22
+ const db = require("@saltcorn/data/db/index");
21
23
 
22
24
  const { is_pack } = require("@saltcorn/data/contracts");
23
25
  const {
@@ -414,6 +416,7 @@ router.post(
414
416
  if (!error && !is_pack.check(pack)) {
415
417
  error = req.__("Not a valid pack");
416
418
  }
419
+
417
420
  if (!error) {
418
421
  const can_install = await can_install_pack(pack);
419
422
  if (can_install.error) {
@@ -444,10 +447,12 @@ router.post(
444
447
  ],
445
448
  });
446
449
  } else {
447
- await install_pack(pack, undefined, (p) =>
448
- load_plugins.loadAndSaveNewPlugin(p)
449
- );
450
-
450
+ await db.withTransaction(async () => {
451
+ await install_pack(pack, undefined, (p) =>
452
+ load_plugins.loadAndSaveNewPlugin(p)
453
+ );
454
+ });
455
+ await getState().refresh();
451
456
  res.redirect(`/`);
452
457
  }
453
458
  })
@@ -480,9 +485,12 @@ router.post(
480
485
  } else if (can_install.warning) {
481
486
  req.flash("warning", can_install.warning);
482
487
  }
483
- await install_pack(pack.pack, name, (p) =>
484
- load_plugins.loadAndSaveNewPlugin(p)
485
- );
488
+ await db.withTransaction(async () => {
489
+ await install_pack(pack.pack, name, (p) =>
490
+ load_plugins.loadAndSaveNewPlugin(p)
491
+ );
492
+ });
493
+ await getState().refresh();
486
494
  req.flash("success", req.__(`Pack %s installed`, text(name)));
487
495
  res.redirect(`/`);
488
496
  })
package/routes/page.js CHANGED
@@ -68,13 +68,15 @@ const runPage = async (page, req, res, tic) => {
68
68
  no_menu: page.attributes?.no_menu,
69
69
  requestFluidLayout: page.attributes?.request_fluid_layout,
70
70
  } || `${page.name} page`,
71
- req.smr ? contents : add_edit_bar({
72
- role,
73
- title: page.name,
74
- what: req.__("Page"),
75
- url: `/pageedit/edit/${encodeURIComponent(page.name)}`,
76
- contents,
77
- }),
71
+ req.smr
72
+ ? contents
73
+ : add_edit_bar({
74
+ role,
75
+ title: page.name,
76
+ what: req.__("Page"),
77
+ url: `/pageedit/edit/${encodeURIComponent(page.name)}`,
78
+ contents,
79
+ })
78
80
  );
79
81
  } else {
80
82
  getState().log(2, `Page ${page.name} not authorized`);
@@ -201,15 +203,17 @@ router.post(
201
203
  });
202
204
  if (col) {
203
205
  try {
204
- const result = await run_action_column({
205
- col,
206
- referrer: req.get("Referrer"),
207
- req,
208
- res,
206
+ const result = await db.withTransaction(async () => {
207
+ return await run_action_column({
208
+ col,
209
+ referrer: req.get("Referrer"),
210
+ req,
211
+ res,
212
+ });
209
213
  });
210
214
  res.json({ success: "ok", ...(result || {}) });
211
215
  } catch (e) {
212
- getState().log(2, e?.stack)
216
+ getState().log(2, e?.stack);
213
217
  res.status(400).json({ error: e.message || e });
214
218
  }
215
219
  } else res.status(404).json({ error: "Action not found" });
@@ -412,9 +412,11 @@ router.post(
412
412
  const { id, ...row } = form.values;
413
413
  if (+id) {
414
414
  await PageGroup.update(id, row);
415
+ await getState().refresh_page_groups();
415
416
  res.json({ success: "ok", row });
416
417
  } else {
417
418
  const pageGroup = await PageGroup.create(row);
419
+ await getState().refresh_page_groups();
418
420
  res.redirect(`/page_groupedit/${pageGroup.name}`);
419
421
  }
420
422
  }
@@ -478,6 +480,7 @@ router.post(
478
480
  eligible_formula,
479
481
  description: description || "",
480
482
  });
483
+ await getState().refresh_page_groups();
481
484
  req.flash("success", req.__("Added member"));
482
485
  res.redirect(`/page_groupedit/${page_groupname}`);
483
486
  }
@@ -497,6 +500,7 @@ router.post(
497
500
  const member = PageGroupMember.findOne({ id: member_id });
498
501
  const pageGroup = PageGroup.findOne({ id: member.page_group_id });
499
502
  await pageGroup.moveMember(member, mode);
503
+ await getState().refresh_page_groups();
500
504
  res.json({ success: "ok" });
501
505
  } catch (error) {
502
506
  getState().log(2, `POST /page_groupedit/move-member: '${error.message}'`);
@@ -573,6 +577,7 @@ router.post(
573
577
  eligible_formula,
574
578
  description: description || "",
575
579
  });
580
+ await getState().refresh_page_groups();
576
581
  req.flash("success", req.__("Updated member"));
577
582
  res.redirect(`/page_groupedit/${group.name}`);
578
583
  }
@@ -593,6 +598,7 @@ router.post(
593
598
  res.redirect("/pageedit");
594
599
  } else {
595
600
  await group.delete();
601
+ await getState().refresh_page_groups();
596
602
  req.flash("success", req.__("Deleted page group %s", group_id));
597
603
  res.redirect("/pageedit");
598
604
  }
@@ -622,6 +628,7 @@ router.post(
622
628
  } else {
623
629
  try {
624
630
  await group.removeMember(member_id);
631
+ await getState().refresh_page_groups();
625
632
  req.flash(
626
633
  "success",
627
634
  req.__("Removed member %s", member.name || member_id)
@@ -651,6 +658,7 @@ router.post(
651
658
  res.redirect("/pageedit");
652
659
  } else {
653
660
  const copy = await group.clone();
661
+ await getState().refresh_page_groups();
654
662
  req.flash("success", req.__("Cloned page group %s", group.name));
655
663
  res.redirect(`/page_groupedit/${copy.name}`);
656
664
  }
@@ -508,6 +508,7 @@ router.post(
508
508
  pageRow.layout = {};
509
509
  }
510
510
  await Page.update(+id, pageRow);
511
+ await getState().refresh_pages();
511
512
  Trigger.emitEvent("AppChange", `Page ${dbPage.name}`, req.user, {
512
513
  entity_type: "Page",
513
514
  entity_name: dbPage.name,
@@ -518,6 +519,7 @@ router.post(
518
519
  if (!pageRow.layout) pageRow.layout = {};
519
520
  if (!pageRow.fixed_states) pageRow.fixed_states = {};
520
521
  await Page.create(pageRow);
522
+ await getState().refresh_pages();
521
523
  Trigger.emitEvent("AppChange", `Page ${pageRow.name}`, req.user, {
522
524
  entity_type: "Page",
523
525
  entity_name: pageRow.name,
@@ -693,6 +695,7 @@ router.post(
693
695
  await Page.update(page.id, {
694
696
  layout: decodeURIComponent((req.body || {}).layout),
695
697
  });
698
+ await getState().refresh_pages();
696
699
  Trigger.emitEvent("AppChange", `Page ${page.name}`, req.user, {
697
700
  entity_type: "Page",
698
701
  entity_name: page.name,
@@ -746,6 +749,8 @@ router.post(
746
749
  if (id && (req.body || {}).layout) {
747
750
  await Page.update(+id, { layout: (req.body || {}).layout });
748
751
  const page = await Page.findOne({ id });
752
+ await getState().refresh_pages();
753
+
749
754
  Trigger.emitEvent("AppChange", `Page ${page.name}`, req.user, {
750
755
  entity_type: "Page",
751
756
  entity_name: page.name,
@@ -775,7 +780,10 @@ router.post(
775
780
  entity_type: "Page",
776
781
  entity_name: page.name,
777
782
  });
778
- await page.delete();
783
+ await db.withTransaction(async () => {
784
+ await page.delete();
785
+ });
786
+ await getState().refresh_pages();
779
787
  req.flash("success", req.__(`Page deleted`));
780
788
  res.redirect(`/pageedit`);
781
789
  })
@@ -856,6 +864,7 @@ router.post(
856
864
  entity_type: "Page",
857
865
  entity_name: newpage.name,
858
866
  });
867
+ await getState().refresh_pages();
859
868
  req.flash(
860
869
  "success",
861
870
  req.__("Page %s duplicated as %s", page.name, newpage.name)
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
  );