@saltcorn/server 1.1.3 → 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 (400) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/app.js +5 -3
  3. package/auth/admin.js +1 -0
  4. package/auth/testhelp.js +55 -0
  5. package/docs/assets/search.js +1 -1
  6. package/docs/classes/_saltcorn_common_code.Relation.html +8 -8
  7. package/docs/classes/_saltcorn_common_code.RelationsFinder.html +5 -5
  8. package/docs/classes/_saltcorn_data.models.Crash-1.html +18 -18
  9. package/docs/classes/_saltcorn_data.models.EventLog-1.html +19 -19
  10. package/docs/classes/_saltcorn_data.models.Field.html +71 -71
  11. package/docs/classes/_saltcorn_data.models.FieldRepeat-1.html +17 -17
  12. package/docs/classes/_saltcorn_data.models.File-1.html +48 -48
  13. package/docs/classes/_saltcorn_data.models.Form-1.html +38 -38
  14. package/docs/classes/_saltcorn_data.models.Library.html +13 -13
  15. package/docs/classes/_saltcorn_data.models.Page.html +33 -23
  16. package/docs/classes/_saltcorn_data.models.PageGroup-1.html +28 -33
  17. package/docs/classes/_saltcorn_data.models.Plugin.html +25 -25
  18. package/docs/classes/_saltcorn_data.models.Role.html +9 -9
  19. package/docs/classes/_saltcorn_data.models.Table-1.html +101 -91
  20. package/docs/classes/_saltcorn_data.models.TableConstraint-1.html +14 -14
  21. package/docs/classes/_saltcorn_data.models.Trigger.html +66 -34
  22. package/docs/classes/_saltcorn_data.models.User-1.html +48 -48
  23. package/docs/classes/_saltcorn_data.models.View-1.html +61 -51
  24. package/docs/classes/_saltcorn_data.models.Workflow-1.html +17 -17
  25. package/docs/classes/_saltcorn_data.models.WorkflowRun.html +35 -35
  26. package/docs/classes/_saltcorn_data.models.WorkflowStep.html +25 -25
  27. package/docs/classes/_saltcorn_data.models.WorkflowTrace.html +18 -18
  28. package/docs/classes/_saltcorn_mobile_builder.MobileBuilder.html +36 -36
  29. package/docs/enums/_saltcorn_common_code.RelationType.html +7 -7
  30. package/docs/enums/_saltcorn_common_code.ViewDisplayType.html +4 -4
  31. package/docs/functions/_saltcorn_admin_models.backup.create_backup.html +1 -1
  32. package/docs/functions/_saltcorn_admin_models.backup.create_csv_from_rows.html +1 -1
  33. package/docs/functions/_saltcorn_admin_models.backup.restore.html +1 -1
  34. package/docs/functions/_saltcorn_admin_models.pack.add_to_menu.html +1 -1
  35. package/docs/functions/_saltcorn_admin_models.pack.can_install_pack.html +1 -1
  36. package/docs/functions/_saltcorn_admin_models.pack.fetch_available_packs.html +1 -1
  37. package/docs/functions/_saltcorn_admin_models.pack.fetch_pack_by_name.html +1 -1
  38. package/docs/functions/_saltcorn_admin_models.pack.install_pack.html +1 -1
  39. package/docs/functions/_saltcorn_admin_models.pack.library_pack.html +1 -1
  40. package/docs/functions/_saltcorn_admin_models.pack.model_instance_pack.html +1 -1
  41. package/docs/functions/_saltcorn_admin_models.pack.model_pack.html +1 -1
  42. package/docs/functions/_saltcorn_admin_models.pack.page_group_pack.html +1 -1
  43. package/docs/functions/_saltcorn_admin_models.pack.page_pack.html +1 -1
  44. package/docs/functions/_saltcorn_admin_models.pack.plugin_pack.html +1 -1
  45. package/docs/functions/_saltcorn_admin_models.pack.role_pack.html +1 -1
  46. package/docs/functions/_saltcorn_admin_models.pack.table_pack.html +1 -1
  47. package/docs/functions/_saltcorn_admin_models.pack.trigger_pack.html +1 -1
  48. package/docs/functions/_saltcorn_admin_models.pack.uninstall_pack.html +1 -1
  49. package/docs/functions/_saltcorn_admin_models.pack.view_pack.html +1 -1
  50. package/docs/functions/_saltcorn_admin_models.tenant.copy_tenant_template.html +1 -1
  51. package/docs/functions/_saltcorn_admin_models.tenant.create_tenant.html +1 -1
  52. package/docs/functions/_saltcorn_admin_models.tenant.deleteTenant.html +1 -1
  53. package/docs/functions/_saltcorn_admin_models.tenant.domain_sanitize.html +1 -1
  54. package/docs/functions/_saltcorn_admin_models.tenant.eachTenant.html +1 -1
  55. package/docs/functions/_saltcorn_admin_models.tenant.getAllTenantRows.html +1 -1
  56. package/docs/functions/_saltcorn_admin_models.tenant.getAllTenants.html +1 -1
  57. package/docs/functions/_saltcorn_admin_models.tenant.insertTenant.html +1 -1
  58. package/docs/functions/_saltcorn_admin_models.tenant.switchToTenant.html +1 -1
  59. package/docs/functions/_saltcorn_common_code.buildTableCaches.html +1 -1
  60. package/docs/functions/_saltcorn_common_code.parseLegacyRelation.html +1 -1
  61. package/docs/functions/_saltcorn_common_code.parseRelationPath.html +1 -1
  62. package/docs/functions/_saltcorn_data.models.config.check_email_mask.html +1 -1
  63. package/docs/functions/_saltcorn_data.models.config.deleteConfig.html +1 -1
  64. package/docs/functions/_saltcorn_data.models.config.getAllConfig.html +1 -1
  65. package/docs/functions/_saltcorn_data.models.config.getConfig.html +1 -1
  66. package/docs/functions/_saltcorn_data.models.config.get_base_url.html +1 -1
  67. package/docs/functions/_saltcorn_data.models.config.get_latest_npm_version.html +1 -1
  68. package/docs/functions/_saltcorn_data.models.config.remove_from_menu.html +1 -1
  69. package/docs/functions/_saltcorn_data.models.config.save_menu_items.html +1 -1
  70. package/docs/functions/_saltcorn_data.models.config.setConfig.html +1 -1
  71. package/docs/functions/_saltcorn_data.models.discovery.discover_tables.html +1 -1
  72. package/docs/functions/_saltcorn_data.models.discovery.discoverable_tables.html +1 -1
  73. package/docs/functions/_saltcorn_data.models.discovery.findType.html +1 -1
  74. package/docs/functions/_saltcorn_data.models.discovery.get_existing_views.html +1 -1
  75. package/docs/functions/_saltcorn_data.models.discovery.implement_discovery.html +1 -1
  76. package/docs/functions/_saltcorn_data.models.email.getMailTransport.html +1 -1
  77. package/docs/functions/_saltcorn_data.models.email.send_verification_email.html +1 -1
  78. package/docs/functions/_saltcorn_data.models.email.viewToEmailHtml.html +1 -1
  79. package/docs/functions/_saltcorn_data.models.expression.apply_calculated_fields.html +1 -1
  80. package/docs/functions/_saltcorn_data.models.expression.apply_calculated_fields_stored.html +1 -1
  81. package/docs/functions/_saltcorn_data.models.expression.eval_expression.html +1 -1
  82. package/docs/functions/_saltcorn_data.models.expression.expressionValidator.html +1 -1
  83. package/docs/functions/_saltcorn_data.models.expression.get_async_expression_function.html +1 -1
  84. package/docs/functions/_saltcorn_data.models.expression.get_expression_function.html +1 -1
  85. package/docs/functions/_saltcorn_data.models.expression.jsexprToWhere.html +1 -1
  86. package/docs/functions/_saltcorn_data.models.expression.recalculate_for_stored.html +1 -1
  87. package/docs/functions/_saltcorn_data.models.expression.transform_for_async.html +1 -1
  88. package/docs/functions/_saltcorn_data.models.layout.eachView.html +1 -1
  89. package/docs/functions/_saltcorn_data.models.layout.getStringsForI18n.html +1 -1
  90. package/docs/functions/_saltcorn_data.models.layout.getViews.html +1 -1
  91. package/docs/functions/_saltcorn_data.models.layout.translateLayout.html +1 -1
  92. package/docs/functions/_saltcorn_data.models.layout.traverse.html +1 -1
  93. package/docs/functions/_saltcorn_data.models.layout.traverseSync.html +1 -1
  94. package/docs/functions/_saltcorn_data.models.random.all_views.html +1 -1
  95. package/docs/functions/_saltcorn_data.models.random.fill_table_row.html +1 -1
  96. package/docs/functions/_saltcorn_data.models.random.initial_view.html +1 -1
  97. package/docs/functions/_saltcorn_data.models.random.random_table.html +1 -1
  98. package/docs/functions/_saltcorn_db_common.buildInsertBulkSql.html +2 -2
  99. package/docs/functions/_saltcorn_db_common.buildInsertSql.html +2 -2
  100. package/docs/functions/_saltcorn_db_common.doCount.html +2 -2
  101. package/docs/functions/_saltcorn_db_common.doDeleteWhere.html +2 -2
  102. package/docs/functions/_saltcorn_db_common.doListScTables.html +2 -2
  103. package/docs/functions/_saltcorn_db_common.doListTables.html +2 -2
  104. package/docs/functions/_saltcorn_db_common.doListUserDefinedTables.html +2 -2
  105. package/docs/functions/_saltcorn_db_common.do_add_index.html +2 -2
  106. package/docs/functions/_saltcorn_db_common.do_drop_index.html +2 -2
  107. package/docs/functions/_saltcorn_db_common.ftsFieldsSqlExpr.html +2 -2
  108. package/docs/functions/_saltcorn_db_common.mkSelectOptions.html +2 -2
  109. package/docs/functions/_saltcorn_db_common.mkVal.html +2 -2
  110. package/docs/functions/_saltcorn_db_common.mkWhere.html +2 -2
  111. package/docs/functions/_saltcorn_db_common.multi_tenant.enable_multi_tenant.html +3 -2
  112. package/docs/functions/{_saltcorn_db_common.single_tenant.enable_multi_tenant.html → _saltcorn_db_common.multi_tenant.getRequestContext.html} +16 -15
  113. package/docs/functions/_saltcorn_db_common.multi_tenant.getTenantSchema.html +3 -2
  114. package/docs/functions/_saltcorn_db_common.multi_tenant.init.html +3 -2
  115. package/docs/functions/_saltcorn_db_common.multi_tenant.is_it_multi_tenant.html +3 -2
  116. package/docs/functions/_saltcorn_db_common.multi_tenant.runWithTenant.html +5 -5
  117. package/docs/functions/_saltcorn_db_common.orderByIsObject.html +2 -2
  118. package/docs/functions/_saltcorn_db_common.orderByIsOperator.html +2 -2
  119. package/docs/functions/_saltcorn_db_common.prefixFieldsInWhere.html +2 -2
  120. package/docs/functions/_saltcorn_db_common.reprAsJson.html +2 -2
  121. package/docs/functions/_saltcorn_db_common.sqlBinOp.html +2 -2
  122. package/docs/functions/_saltcorn_db_common.sqlFun.html +2 -2
  123. package/docs/functions/_saltcorn_db_common.sqlsanitize.html +2 -2
  124. package/docs/functions/_saltcorn_db_common.sqlsanitizeAllowDots.html +2 -2
  125. package/docs/functions/_saltcorn_db_common.subSelectWhere.html +2 -2
  126. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.androidFeatures.html +1 -1
  127. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.androidPermissions.html +1 -1
  128. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.buildTablesFile.html +1 -1
  129. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyPrepopulatedDb.html +1 -1
  130. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyServerFiles.html +1 -1
  131. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyShareExtFiles.html +1 -1
  132. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copySiteLogo.html +1 -1
  133. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyTranslationFiles.html +1 -1
  134. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.createSqliteDb.html +1 -1
  135. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.decodeProvisioningProfile.html +1 -1
  136. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.extractDomain.html +1 -1
  137. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.generateAndroidVersionCode.html +1 -1
  138. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyAndroidManifest.html +1 -1
  139. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyConfigXml.html +1 -1
  140. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyGradleConfig.html +1 -1
  141. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyInfoPlist.html +1 -1
  142. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyXcodeProjectFile.html +1 -1
  143. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepAppIcon.html +1 -1
  144. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareAppIcon.html +1 -1
  145. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareBuildDir.html +1 -1
  146. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareExportOptionsPlist.html +1 -1
  147. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareSplashIcon.html +1 -1
  148. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareSplashPage.html +1 -1
  149. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeCapacitorConfig.html +1 -1
  150. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeCfgFile.html +1 -1
  151. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeDataExtractionRules.html +1 -1
  152. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeNetworkSecurityConfig.html +1 -1
  153. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writePodfile.html +1 -1
  154. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writePrivacyInfo.html +1 -1
  155. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.bundleMobileAppCode.html +1 -1
  156. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.bundlePackagesAndPlugins.html +1 -1
  157. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.copyMobileAppDirs.html +1 -1
  158. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.copyPublicDirs.html +1 -1
  159. package/docs/functions/_saltcorn_sqlite.add_index.html +3 -2
  160. package/docs/functions/_saltcorn_sqlite.add_unique_constraint.html +3 -2
  161. package/docs/functions/_saltcorn_sqlite.begin.html +3 -2
  162. package/docs/functions/_saltcorn_sqlite.changeConnection.html +3 -2
  163. package/docs/functions/_saltcorn_sqlite.close.html +3 -2
  164. package/docs/functions/_saltcorn_sqlite.commit.html +3 -2
  165. package/docs/functions/_saltcorn_sqlite.count.html +3 -2
  166. package/docs/functions/_saltcorn_sqlite.deleteWhere.html +3 -2
  167. package/docs/functions/_saltcorn_sqlite.dropTable.html +3 -2
  168. package/docs/functions/_saltcorn_sqlite.dropTables.html +3 -2
  169. package/docs/functions/_saltcorn_sqlite.drop_index.html +3 -2
  170. package/docs/functions/_saltcorn_sqlite.drop_reset_schema.html +3 -2
  171. package/docs/functions/_saltcorn_sqlite.drop_unique_constraint.html +3 -2
  172. package/docs/functions/_saltcorn_sqlite.getVersion.html +3 -2
  173. package/docs/functions/_saltcorn_sqlite.get_db_filepath.html +3 -2
  174. package/docs/functions/_saltcorn_sqlite.get_sql_logging.html +3 -2
  175. package/docs/functions/_saltcorn_sqlite.init.html +3 -2
  176. package/docs/functions/_saltcorn_sqlite.insert.html +3 -2
  177. package/docs/functions/_saltcorn_sqlite.listScTables.html +3 -2
  178. package/docs/functions/_saltcorn_sqlite.listTables.html +3 -2
  179. package/docs/functions/_saltcorn_sqlite.listUserDefinedTables.html +3 -2
  180. package/docs/functions/_saltcorn_sqlite.query.html +3 -2
  181. package/docs/functions/_saltcorn_sqlite.rollback.html +3 -2
  182. package/docs/functions/_saltcorn_sqlite.select.html +3 -2
  183. package/docs/functions/_saltcorn_sqlite.selectMaybeOne.html +3 -2
  184. package/docs/functions/_saltcorn_sqlite.selectOne.html +3 -2
  185. package/docs/functions/_saltcorn_sqlite.set_sql_logging.html +3 -2
  186. package/docs/functions/_saltcorn_sqlite.slugify.html +3 -2
  187. package/docs/functions/_saltcorn_sqlite.sql_log.html +3 -2
  188. package/docs/functions/_saltcorn_sqlite.update.html +3 -2
  189. package/docs/functions/_saltcorn_sqlite.updateWhere.html +3 -2
  190. package/docs/functions/_saltcorn_sqlite.withTransaction.html +96 -0
  191. package/docs/functions/_saltcorn_sqlite_mobile.add_index.html +1 -1
  192. package/docs/functions/_saltcorn_sqlite_mobile.add_unique_constraint.html +1 -1
  193. package/docs/functions/_saltcorn_sqlite_mobile.count.html +1 -1
  194. package/docs/functions/_saltcorn_sqlite_mobile.deleteWhere.html +1 -1
  195. package/docs/functions/_saltcorn_sqlite_mobile.drop_index.html +1 -1
  196. package/docs/functions/_saltcorn_sqlite_mobile.drop_reset_schema.html +1 -1
  197. package/docs/functions/_saltcorn_sqlite_mobile.drop_unique_constraint.html +1 -1
  198. package/docs/functions/_saltcorn_sqlite_mobile.init.html +1 -1
  199. package/docs/functions/_saltcorn_sqlite_mobile.insert.html +1 -1
  200. package/docs/functions/_saltcorn_sqlite_mobile.insertRows.html +1 -1
  201. package/docs/functions/_saltcorn_sqlite_mobile.listScTables.html +1 -1
  202. package/docs/functions/_saltcorn_sqlite_mobile.listTables.html +1 -1
  203. package/docs/functions/_saltcorn_sqlite_mobile.listUserDefinedTables.html +1 -1
  204. package/docs/functions/_saltcorn_sqlite_mobile.query.html +1 -1
  205. package/docs/functions/_saltcorn_sqlite_mobile.select.html +1 -1
  206. package/docs/functions/_saltcorn_sqlite_mobile.selectMaybeOne.html +1 -1
  207. package/docs/functions/_saltcorn_sqlite_mobile.selectOne.html +1 -1
  208. package/docs/functions/_saltcorn_sqlite_mobile.setConnectionObject.html +1 -1
  209. package/docs/functions/_saltcorn_sqlite_mobile.tableExists.html +1 -1
  210. package/docs/functions/_saltcorn_sqlite_mobile.time.html +1 -1
  211. package/docs/functions/_saltcorn_sqlite_mobile.update.html +1 -1
  212. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_field.instanceOfField.html +1 -1
  213. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_page.instanceOfPage.html +1 -1
  214. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_view.instanceOfView.html +1 -1
  215. package/docs/functions/_saltcorn_types.Types.base_types.instanceOWithHtmlFile.html +1 -1
  216. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfErrorMsg.html +1 -1
  217. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfSuccessMsg.html +1 -1
  218. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfType.html +1 -1
  219. package/docs/functions/_saltcorn_types.generators.generateBool.html +1 -1
  220. package/docs/functions/_saltcorn_types.generators.generateString.html +1 -1
  221. package/docs/functions/_saltcorn_types.generators.num_between.html +1 -1
  222. package/docs/functions/_saltcorn_types.generators.oneOf.html +1 -1
  223. package/docs/interfaces/_saltcorn_mobile_builder.common_build_utils.ScCapacitorConfig.html +10 -10
  224. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_field.AbstractField.html +14 -14
  225. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_field.AbstractFieldRepeat.html +3 -3
  226. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_form.AbstractForm.html +26 -26
  227. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_page.AbstractPage.html +7 -7
  228. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_role.AbstractRole.html +3 -3
  229. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_table.AbstractTable.html +7 -7
  230. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_trigger.AbstractTrigger.html +16 -16
  231. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_view.AbstractView.html +10 -10
  232. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_workflow.AbstractWorkflow.html +13 -13
  233. package/docs/modules/_saltcorn_admin_models.backup.html +1 -1
  234. package/docs/modules/_saltcorn_admin_models.html +1 -1
  235. package/docs/modules/_saltcorn_admin_models.pack.html +1 -1
  236. package/docs/modules/_saltcorn_admin_models.tenant.html +1 -1
  237. package/docs/modules/_saltcorn_common_code.html +1 -1
  238. package/docs/modules/_saltcorn_data.html +3 -3
  239. package/docs/modules/_saltcorn_data.models.Crash.html +2 -2
  240. package/docs/modules/_saltcorn_data.models.EventLog.html +2 -2
  241. package/docs/modules/_saltcorn_data.models.FieldRepeat.html +2 -2
  242. package/docs/modules/_saltcorn_data.models.File.html +2 -2
  243. package/docs/modules/_saltcorn_data.models.Form.html +2 -2
  244. package/docs/modules/_saltcorn_data.models.PageGroup.html +2 -2
  245. package/docs/modules/_saltcorn_data.models.Table.html +2 -2
  246. package/docs/modules/_saltcorn_data.models.TableConstraint.html +2 -2
  247. package/docs/modules/_saltcorn_data.models.User.html +2 -2
  248. package/docs/modules/_saltcorn_data.models.View.html +2 -2
  249. package/docs/modules/_saltcorn_data.models.Workflow.html +2 -2
  250. package/docs/modules/_saltcorn_data.models.config.html +1 -1
  251. package/docs/modules/_saltcorn_data.models.discovery.html +1 -1
  252. package/docs/modules/_saltcorn_data.models.email.html +1 -1
  253. package/docs/modules/_saltcorn_data.models.expression.html +1 -1
  254. package/docs/modules/_saltcorn_data.models.html +1 -1
  255. package/docs/modules/_saltcorn_data.models.layout.html +1 -1
  256. package/docs/modules/_saltcorn_data.models.random.html +1 -1
  257. package/docs/modules/_saltcorn_data.models.scheduler.html +1 -1
  258. package/docs/modules/_saltcorn_data.plugin_helper.html +1 -1
  259. package/docs/modules/_saltcorn_data.utils.html +1 -1
  260. package/docs/modules/_saltcorn_db_common.html +7 -7
  261. package/docs/modules/_saltcorn_db_common.multi_tenant.html +4 -2
  262. package/docs/modules/_saltcorn_markup.html +2 -2
  263. package/docs/modules/_saltcorn_mobile_builder.common_build_utils.html +1 -1
  264. package/docs/modules/_saltcorn_mobile_builder.html +1 -1
  265. package/docs/modules/_saltcorn_mobile_builder.package_bundle_utils.html +1 -1
  266. package/docs/modules/_saltcorn_sqlite.html +4 -2
  267. package/docs/modules/_saltcorn_sqlite_mobile.html +1 -1
  268. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_field.html +1 -1
  269. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_form.html +1 -1
  270. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_library.html +1 -1
  271. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_page.html +1 -1
  272. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_plugin.html +1 -1
  273. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_role.html +1 -1
  274. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_table.html +1 -1
  275. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_trigger.html +1 -1
  276. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_view.html +1 -1
  277. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_workflow.html +1 -1
  278. package/docs/modules/_saltcorn_types.ModelAbstracts.html +1 -1
  279. package/docs/modules/_saltcorn_types.Types.base_types.html +1 -1
  280. package/docs/modules/_saltcorn_types.Types.common_types.html +1 -1
  281. package/docs/modules/_saltcorn_types.Types.html +1 -1
  282. package/docs/modules/_saltcorn_types.generators.html +1 -1
  283. package/docs/modules/_saltcorn_types.html +1 -1
  284. package/docs/types/_saltcorn_data.models.Crash.CrashCfg.html +1 -1
  285. package/docs/types/_saltcorn_data.models.EventLog.EventLogCfg.html +1 -1
  286. package/docs/types/_saltcorn_data.models.FieldRepeat.FieldRepeatCfg.html +1 -1
  287. package/docs/types/_saltcorn_data.models.File.FileCfg.html +1 -1
  288. package/docs/types/_saltcorn_data.models.Form.AdditionalButton.html +1 -1
  289. package/docs/types/_saltcorn_data.models.Form.FormCfg.html +1 -1
  290. package/docs/types/_saltcorn_data.models.PageGroup.ScreenInfoParams.html +1 -1
  291. package/docs/types/_saltcorn_data.models.Table.ChildRelations.html +1 -1
  292. package/docs/types/_saltcorn_data.models.Table.ParentRelations.html +1 -1
  293. package/docs/types/_saltcorn_data.models.Table.RelationData.html +1 -1
  294. package/docs/types/_saltcorn_data.models.TableConstraint.TableConstraintCfg.html +1 -1
  295. package/docs/types/_saltcorn_data.models.User.UserCfg.html +1 -1
  296. package/docs/types/_saltcorn_data.models.View.FindViewsPred.html +1 -1
  297. package/docs/types/_saltcorn_data.models.Workflow.WorkflowCfg.html +1 -1
  298. package/docs/types/_saltcorn_db_common.AggregationOptions.html +2 -2
  299. package/docs/types/_saltcorn_db_common.CoordOpts.html +2 -2
  300. package/docs/types/_saltcorn_db_common.DatabaseClient.html +111 -0
  301. package/docs/types/_saltcorn_db_common.JoinField.html +2 -2
  302. package/docs/types/_saltcorn_db_common.JoinFields.html +2 -2
  303. package/docs/types/_saltcorn_db_common.JoinOptions.html +2 -2
  304. package/docs/types/_saltcorn_db_common.JsonPath.html +2 -2
  305. package/docs/types/_saltcorn_db_common.JsonPathElem.html +2 -2
  306. package/docs/types/_saltcorn_db_common.Operator.html +2 -2
  307. package/docs/types/_saltcorn_db_common.PrimaryKeyValue.html +2 -2
  308. package/docs/types/_saltcorn_db_common.Row.html +2 -2
  309. package/docs/types/_saltcorn_db_common.SelectOptions.html +5 -3
  310. package/docs/types/_saltcorn_db_common.SqlAndValues.html +2 -2
  311. package/docs/types/_saltcorn_db_common.SubselectOptions.html +2 -2
  312. package/docs/types/_saltcorn_db_common.Value.html +2 -2
  313. package/docs/types/_saltcorn_db_common.Where.html +2 -2
  314. package/docs/types/_saltcorn_mobile_builder.IosCfg.html +1 -1
  315. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_field.FieldCfg.html +1 -1
  316. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_field.InputType.html +1 -1
  317. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_form.AdditionalButton.html +1 -1
  318. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_library.LibraryCfg.html +1 -1
  319. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_library.LibraryPack.html +1 -1
  320. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_page.PageCfg.html +1 -1
  321. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_page.PagePack.html +1 -1
  322. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_plugin.PluginCfg.html +1 -1
  323. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_plugin.PluginPack.html +1 -1
  324. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_role.RoleCfg.html +1 -1
  325. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_role.RolePack.html +1 -1
  326. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_table.TableCfg.html +3 -3
  327. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_table.TablePack.html +1 -1
  328. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_trigger.TriggerCfg.html +1 -1
  329. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_trigger.TriggerPack.html +1 -1
  330. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_view.ViewCfg.html +1 -1
  331. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_view.ViewPack.html +1 -1
  332. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_workflow.ConfigWorkflowStep.html +1 -1
  333. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_workflow.RunResult.html +1 -1
  334. package/docs/types/_saltcorn_types.Types.base_types.Action.html +1 -1
  335. package/docs/types/_saltcorn_types.Types.base_types.AuthenticationMethod.html +1 -1
  336. package/docs/types/_saltcorn_types.Types.base_types.CapacitorPlugin.html +1 -1
  337. package/docs/types/_saltcorn_types.Types.base_types.CodePagePack.html +1 -1
  338. package/docs/types/_saltcorn_types.Types.base_types.Column.html +1 -1
  339. package/docs/types/_saltcorn_types.Types.base_types.ConnectedObjects.html +1 -1
  340. package/docs/types/_saltcorn_types.Types.base_types.CopilotSkill.html +1 -1
  341. package/docs/types/_saltcorn_types.Types.base_types.FieldLike.html +1 -1
  342. package/docs/types/_saltcorn_types.Types.base_types.FieldView.html +1 -1
  343. package/docs/types/_saltcorn_types.Types.base_types.Header.html +1 -1
  344. package/docs/types/_saltcorn_types.Types.base_types.JoinFieldOption.html +1 -1
  345. package/docs/types/_saltcorn_types.Types.base_types.Layout.html +1 -1
  346. package/docs/types/_saltcorn_types.Types.base_types.MobileConfig.html +1 -1
  347. package/docs/types/_saltcorn_types.Types.base_types.ModelPattern.html +1 -1
  348. package/docs/types/_saltcorn_types.Types.base_types.Pack.html +1 -1
  349. package/docs/types/_saltcorn_types.Types.base_types.Plugin.html +1 -1
  350. package/docs/types/_saltcorn_types.Types.base_types.PluginFunction.html +1 -1
  351. package/docs/types/_saltcorn_types.Types.base_types.PluginLayout.html +1 -1
  352. package/docs/types/_saltcorn_types.Types.base_types.PluginRoute.html +1 -1
  353. package/docs/types/_saltcorn_types.Types.base_types.PluginSourceType.html +1 -1
  354. package/docs/types/_saltcorn_types.Types.base_types.PluginType.html +1 -1
  355. package/docs/types/_saltcorn_types.Types.base_types.PluginWrap.html +1 -1
  356. package/docs/types/_saltcorn_types.Types.base_types.PluginWrapArg.html +1 -1
  357. package/docs/types/_saltcorn_types.Types.base_types.RelationOption.html +1 -1
  358. package/docs/types/_saltcorn_types.Types.base_types.Req.html +1 -1
  359. package/docs/types/_saltcorn_types.Types.base_types.Res.html +1 -1
  360. package/docs/types/_saltcorn_types.Types.base_types.RouteAction.html +1 -1
  361. package/docs/types/_saltcorn_types.Types.base_types.RunExtra.html +1 -1
  362. package/docs/types/_saltcorn_types.Types.base_types.TableProvider.html +1 -1
  363. package/docs/types/_saltcorn_types.Types.base_types.TableQuery.html +1 -1
  364. package/docs/types/_saltcorn_types.Types.base_types.Tablely.html +1 -1
  365. package/docs/types/_saltcorn_types.Types.base_types.ViewTemplate.html +1 -1
  366. package/docs/types/_saltcorn_types.Types.common_types.ErrorMessage.html +1 -1
  367. package/docs/types/_saltcorn_types.Types.common_types.GenObj.html +1 -1
  368. package/docs/types/_saltcorn_types.Types.common_types.ReqRes.html +1 -1
  369. package/docs/types/_saltcorn_types.Types.common_types.ResultMessage.html +1 -1
  370. package/docs/types/_saltcorn_types.Types.common_types.SuccessMessage.html +1 -1
  371. package/docs/types/_saltcorn_types.Types.common_types.Type.html +1 -1
  372. package/docs/variables/_saltcorn_data.db.html +1 -1
  373. package/docs/variables/_saltcorn_data.migrations.html +1 -1
  374. package/docs/variables/_saltcorn_data.models.config.available_languages.html +1 -1
  375. package/docs/variables/_saltcorn_data.models.config.configTypes.html +1 -1
  376. package/docs/variables/_saltcorn_data.models.scheduler.runScheduler.html +1 -1
  377. package/docs/variables/_saltcorn_data.plugin_helper.run_action_column.html +1 -1
  378. package/docs/variables/_saltcorn_data.utils.NotAuthorized.html +1 -1
  379. package/docs/variables/_saltcorn_data.utils.sleep.html +1 -1
  380. package/docs/variables/_saltcorn_db_common.multi_tenant.tenantNamespace.html +4 -3
  381. package/locales/en.json +5 -1
  382. package/package.json +9 -9
  383. package/routes/actions.js +21 -3
  384. package/routes/api.js +87 -41
  385. package/routes/fields.js +51 -52
  386. package/routes/menu.js +10 -8
  387. package/routes/packs.js +15 -7
  388. package/routes/page.js +17 -13
  389. package/routes/page_groupedit.js +8 -0
  390. package/routes/pageedit.js +10 -1
  391. package/routes/sync.js +60 -72
  392. package/routes/tables.js +129 -90
  393. package/routes/utils.js +21 -17
  394. package/routes/viewedit.js +18 -2
  395. package/tests/api.test.js +23 -0
  396. package/docs/functions/_saltcorn_db_common.single_tenant.getTenantSchema.html +0 -109
  397. package/docs/functions/_saltcorn_db_common.single_tenant.init.html +0 -115
  398. package/docs/functions/_saltcorn_db_common.single_tenant.is_it_multi_tenant.html +0 -109
  399. package/docs/functions/_saltcorn_db_common.single_tenant.runWithTenant.html +0 -129
  400. package/docs/modules/_saltcorn_db_common.single_tenant.html +0 -115
package/routes/api.js CHANGED
@@ -15,7 +15,7 @@
15
15
  */
16
16
  /** @type {module:express-promise-router} */
17
17
  const Router = require("express-promise-router");
18
- //const db = require("@saltcorn/data/db");
18
+ const db = require("@saltcorn/data/db");
19
19
  const { error_catcher } = require("./utils.js");
20
20
  //const { mkTable, renderForm, link, post_btn } = require("@saltcorn/markup");
21
21
  const { getState } = require("@saltcorn/data/db/state");
@@ -434,6 +434,34 @@ router.get(
434
434
  })
435
435
  );
436
436
 
437
+ /**
438
+ * Emit Event using POST
439
+ * This is used from the mobile app to send an event to the server.
440
+ *
441
+ * The user comes the JWT token and actions,
442
+ * listening for the event, have to check on their own if the user is allowed to run it.
443
+ */
444
+ router.post(
445
+ "/emit-event/:eventname",
446
+ error_catcher(async (req, res, next) => {
447
+ await passport.authenticate(
448
+ "jwt",
449
+ { session: false },
450
+ async function (err, user, info) {
451
+ if (user) {
452
+ const { eventname } = req.params;
453
+ const { channel, payload } = req.body;
454
+ Trigger.emitEvent(eventname, channel, user, payload);
455
+ res.json({ success: true });
456
+ } else {
457
+ getState().log(3, `API POST emit-event not authorized`);
458
+ res.status(401).json({ error: req.__("Not authorized") });
459
+ }
460
+ }
461
+ )(req, res, next);
462
+ })
463
+ );
464
+
437
465
  /**
438
466
  * Call Action (Trigger) using POST
439
467
  * Attention! if you have table with name "action" it can be problem in future
@@ -494,7 +522,16 @@ router.all(
494
522
  else if (req.headers?.scgotourl)
495
523
  res.redirect(req.headers?.scgotourl);
496
524
  else {
497
- if (trigger.configuration?._raw_output) res.json(resp);
525
+ if (
526
+ trigger.configuration?._raw_output &&
527
+ trigger.configuration?._response_mime
528
+ ) {
529
+ res.setHeader(
530
+ "content-type",
531
+ trigger.configuration?._response_mime
532
+ );
533
+ res.send(resp);
534
+ } else if (trigger.configuration?._raw_output) res.json(resp);
498
535
  else if (resp?.error) {
499
536
  const { error, ...rest } = resp;
500
537
  res.json({ success: false, error, data: rest });
@@ -537,6 +574,7 @@ router.post(
537
574
  const { _versions, ...row } = req.body || {};
538
575
  const fields = table.getFields();
539
576
  readState(row, fields, req);
577
+
540
578
  const errors = await prepare_insert_row(row, fields);
541
579
  if (errors.length > 0) {
542
580
  getState().log(
@@ -546,11 +584,13 @@ router.post(
546
584
  res.status(400).json({ error: errors.join(", ") });
547
585
  return;
548
586
  }
549
- const ins_res = await table.tryInsertRow(
550
- row,
551
- req.user || user || { role_id: 100 }
552
- );
553
- if (ins_res.error) {
587
+ let ins_res = await db.withTransaction(async () => {
588
+ return await table.tryInsertRow(
589
+ row,
590
+ req.user || user || { role_id: 100 }
591
+ );
592
+ });
593
+ if (ins_res?.error) {
554
594
  getState().log(2, `API POST ${table.name} error: ${ins_res.error}`);
555
595
  res.status(400).json(ins_res);
556
596
  } else res.json(ins_res);
@@ -586,20 +626,22 @@ router.post(
586
626
  async function (err, user, info) {
587
627
  if (accessAllowedWrite(req, user, table)) {
588
628
  try {
589
- if (id === "undefined") {
590
- const pk_name = table.pk_name;
591
- //const fields = table.getFields();
592
- const row = req.body || {};
593
- //readState(row, fields);
594
- await table.deleteRows(
595
- { [pk_name]: row[pk_name] },
596
- user || req.user || { role_id: 100 }
597
- );
598
- } else
599
- await table.deleteRows(
600
- { id },
601
- user || req.user || { role_id: 100 }
602
- );
629
+ await db.withTransaction(async () => {
630
+ if (id === "undefined") {
631
+ const pk_name = table.pk_name;
632
+ //const fields = table.getFields();
633
+ const row = req.body || {};
634
+ //readState(row, fields);
635
+ await table.deleteRows(
636
+ { [pk_name]: row[pk_name] },
637
+ user || req.user || { role_id: 100 }
638
+ );
639
+ } else
640
+ await table.deleteRows(
641
+ { id },
642
+ user || req.user || { role_id: 100 }
643
+ );
644
+ });
603
645
  res.json({ success: true });
604
646
  } catch (e) {
605
647
  getState().log(2, `API DELETE ${table.name} error: ${e.message}`);
@@ -648,13 +690,15 @@ router.post(
648
690
  res.status(400).json({ error: errors.join(", ") });
649
691
  return;
650
692
  }
651
- const ins_res = await table.tryUpdateRow(
652
- row,
653
- id,
654
- user || req.user || { role_id: 100 }
655
- );
693
+ let ins_res = await db.withTransaction(async () => {
694
+ return await table.tryUpdateRow(
695
+ row,
696
+ id,
697
+ user || req.user || { role_id: 100 }
698
+ );
699
+ });
656
700
 
657
- if (ins_res.error) {
701
+ if (ins_res?.error) {
658
702
  getState().log(2, `API POST ${table.name} error: ${ins_res.error}`);
659
703
  res.status(400).json(ins_res);
660
704
  } else res.json(ins_res);
@@ -690,20 +734,22 @@ router.delete(
690
734
  async function (err, user, info) {
691
735
  if (accessAllowedWrite(req, user, table)) {
692
736
  try {
693
- if (id === "undefined") {
694
- const pk_name = table.pk_name;
695
- //const fields = table.getFields();
696
- const row = req.body || {};
697
- //readState(row, fields);
698
- await table.deleteRows(
699
- { [pk_name]: row[pk_name] },
700
- user || req.user || { role_id: 100 }
701
- );
702
- } else
703
- await table.deleteRows(
704
- { [table.pk_name]: id },
705
- user || req.user || { role_id: 100 }
706
- );
737
+ await db.withTransaction(async () => {
738
+ if (id === "undefined") {
739
+ const pk_name = table.pk_name;
740
+ //const fields = table.getFields();
741
+ const row = req.body || {};
742
+ //readState(row, fields);
743
+ await table.deleteRows(
744
+ { [pk_name]: row[pk_name] },
745
+ user || req.user || { role_id: 100 }
746
+ );
747
+ } else
748
+ await table.deleteRows(
749
+ { [table.pk_name]: id },
750
+ user || req.user || { role_id: 100 }
751
+ );
752
+ });
707
753
  res.json({ success: true });
708
754
  } catch (e) {
709
755
  getState().log(2, `API DELETE ${table.name} error: ${e.message}`);
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)