@saltcorn/server 1.3.1-beta.1 → 1.3.1-beta.11

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 (404) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/auth/admin.js +9 -1
  3. package/auth/routes.js +50 -5
  4. package/docs/assets/search.js +1 -1
  5. package/docs/classes/_saltcorn_common_code.Relation.html +10 -10
  6. package/docs/classes/_saltcorn_common_code.RelationsFinder.html +5 -5
  7. package/docs/classes/_saltcorn_data.models.Crash.html +17 -17
  8. package/docs/classes/_saltcorn_data.models.EventLog-1.html +19 -19
  9. package/docs/classes/_saltcorn_data.models.Field.html +74 -74
  10. package/docs/classes/_saltcorn_data.models.FieldRepeat.html +16 -16
  11. package/docs/classes/_saltcorn_data.models.File-1.html +48 -48
  12. package/docs/classes/_saltcorn_data.models.Form-1.html +39 -39
  13. package/docs/classes/_saltcorn_data.models.Library.html +13 -13
  14. package/docs/classes/_saltcorn_data.models.Page.html +24 -24
  15. package/docs/classes/_saltcorn_data.models.PageGroup-1.html +25 -25
  16. package/docs/classes/_saltcorn_data.models.Plugin.html +25 -25
  17. package/docs/classes/_saltcorn_data.models.Role.html +9 -9
  18. package/docs/classes/_saltcorn_data.models.Table-1.html +92 -92
  19. package/docs/classes/_saltcorn_data.models.TableConstraint.html +14 -14
  20. package/docs/classes/_saltcorn_data.models.Trigger.html +71 -39
  21. package/docs/classes/_saltcorn_data.models.User.html +51 -49
  22. package/docs/classes/_saltcorn_data.models.View-1.html +68 -54
  23. package/docs/classes/_saltcorn_data.models.Workflow.html +17 -17
  24. package/docs/classes/_saltcorn_data.models.WorkflowRun.html +35 -35
  25. package/docs/classes/_saltcorn_data.models.WorkflowStep.html +25 -25
  26. package/docs/classes/_saltcorn_data.models.WorkflowTrace.html +18 -18
  27. package/docs/classes/_saltcorn_mobile_builder.MobileBuilder.html +37 -37
  28. package/docs/enums/_saltcorn_common_code.RelationType.html +7 -7
  29. package/docs/enums/_saltcorn_common_code.ViewDisplayType.html +4 -4
  30. package/docs/functions/_saltcorn_admin_models.backup.create_backup.html +1 -1
  31. package/docs/functions/_saltcorn_admin_models.backup.create_csv_from_rows.html +1 -1
  32. package/docs/functions/_saltcorn_admin_models.backup.restore.html +1 -1
  33. package/docs/functions/_saltcorn_admin_models.pack.add_to_menu.html +1 -1
  34. package/docs/functions/_saltcorn_admin_models.pack.can_install_pack.html +1 -1
  35. package/docs/functions/_saltcorn_admin_models.pack.fetch_available_packs.html +1 -1
  36. package/docs/functions/_saltcorn_admin_models.pack.fetch_pack_by_name.html +1 -1
  37. package/docs/functions/_saltcorn_admin_models.pack.install_pack.html +1 -1
  38. package/docs/functions/_saltcorn_admin_models.pack.library_pack.html +1 -1
  39. package/docs/functions/_saltcorn_admin_models.pack.model_instance_pack.html +1 -1
  40. package/docs/functions/_saltcorn_admin_models.pack.model_pack.html +1 -1
  41. package/docs/functions/_saltcorn_admin_models.pack.page_group_pack.html +1 -1
  42. package/docs/functions/_saltcorn_admin_models.pack.page_pack.html +1 -1
  43. package/docs/functions/_saltcorn_admin_models.pack.plugin_pack.html +1 -1
  44. package/docs/functions/_saltcorn_admin_models.pack.role_pack.html +1 -1
  45. package/docs/functions/_saltcorn_admin_models.pack.table_pack.html +1 -1
  46. package/docs/functions/_saltcorn_admin_models.pack.trigger_pack.html +1 -1
  47. package/docs/functions/_saltcorn_admin_models.pack.uninstall_pack.html +1 -1
  48. package/docs/functions/_saltcorn_admin_models.pack.view_pack.html +1 -1
  49. package/docs/functions/_saltcorn_admin_models.tenant.copy_tenant_template.html +1 -1
  50. package/docs/functions/_saltcorn_admin_models.tenant.create_tenant.html +1 -1
  51. package/docs/functions/_saltcorn_admin_models.tenant.deleteTenant.html +1 -1
  52. package/docs/functions/_saltcorn_admin_models.tenant.domain_sanitize.html +1 -1
  53. package/docs/functions/_saltcorn_admin_models.tenant.eachTenant.html +1 -1
  54. package/docs/functions/_saltcorn_admin_models.tenant.getAllTenantRows.html +1 -1
  55. package/docs/functions/_saltcorn_admin_models.tenant.getAllTenants.html +1 -1
  56. package/docs/functions/_saltcorn_admin_models.tenant.insertTenant.html +1 -1
  57. package/docs/functions/_saltcorn_admin_models.tenant.switchToTenant.html +1 -1
  58. package/docs/functions/_saltcorn_common_code.buildTableCaches.html +1 -1
  59. package/docs/functions/_saltcorn_common_code.parseLegacyRelation.html +1 -1
  60. package/docs/functions/_saltcorn_common_code.parseRelationPath.html +1 -1
  61. package/docs/functions/_saltcorn_data.models.config.check_email_mask.html +1 -1
  62. package/docs/functions/_saltcorn_data.models.config.deleteConfig.html +1 -1
  63. package/docs/functions/_saltcorn_data.models.config.getAllConfig.html +1 -1
  64. package/docs/functions/_saltcorn_data.models.config.getConfig.html +1 -1
  65. package/docs/functions/_saltcorn_data.models.config.get_base_url.html +1 -1
  66. package/docs/functions/_saltcorn_data.models.config.get_latest_npm_version.html +1 -1
  67. package/docs/functions/_saltcorn_data.models.config.remove_from_menu.html +1 -1
  68. package/docs/functions/_saltcorn_data.models.config.save_menu_items.html +1 -1
  69. package/docs/functions/_saltcorn_data.models.config.setConfig.html +1 -1
  70. package/docs/functions/_saltcorn_data.models.discovery.discover_tables.html +1 -1
  71. package/docs/functions/_saltcorn_data.models.discovery.discoverable_tables.html +1 -1
  72. package/docs/functions/_saltcorn_data.models.discovery.findType.html +1 -1
  73. package/docs/functions/_saltcorn_data.models.discovery.get_existing_views.html +1 -1
  74. package/docs/functions/_saltcorn_data.models.discovery.implement_discovery.html +1 -1
  75. package/docs/functions/_saltcorn_data.models.email.getMailTransport.html +1 -1
  76. package/docs/functions/_saltcorn_data.models.email.send_verification_email.html +1 -1
  77. package/docs/functions/_saltcorn_data.models.email.viewToEmailHtml.html +1 -1
  78. package/docs/functions/_saltcorn_data.models.expression.apply_calculated_fields.html +1 -1
  79. package/docs/functions/_saltcorn_data.models.expression.apply_calculated_fields_stored.html +1 -1
  80. package/docs/functions/_saltcorn_data.models.expression.eval_expression.html +1 -1
  81. package/docs/functions/_saltcorn_data.models.expression.expressionValidator.html +1 -1
  82. package/docs/functions/_saltcorn_data.models.expression.get_async_expression_function.html +1 -1
  83. package/docs/functions/_saltcorn_data.models.expression.get_expression_function.html +1 -1
  84. package/docs/functions/_saltcorn_data.models.expression.jsexprToWhere.html +1 -1
  85. package/docs/functions/_saltcorn_data.models.expression.recalculate_for_stored.html +1 -1
  86. package/docs/functions/_saltcorn_data.models.expression.transform_for_async.html +1 -1
  87. package/docs/functions/_saltcorn_data.models.layout.eachView.html +1 -1
  88. package/docs/functions/_saltcorn_data.models.layout.getStringsForI18n.html +1 -1
  89. package/docs/functions/_saltcorn_data.models.layout.getViews.html +1 -1
  90. package/docs/functions/_saltcorn_data.models.layout.translateLayout.html +1 -1
  91. package/docs/functions/_saltcorn_data.models.layout.traverse.html +1 -1
  92. package/docs/functions/_saltcorn_data.models.layout.traverseSync.html +1 -1
  93. package/docs/functions/_saltcorn_data.models.random.all_views.html +1 -1
  94. package/docs/functions/_saltcorn_data.models.random.fill_table_row.html +1 -1
  95. package/docs/functions/_saltcorn_data.models.random.initial_view.html +1 -1
  96. package/docs/functions/_saltcorn_data.models.random.random_table.html +1 -1
  97. package/docs/functions/_saltcorn_db_common.buildInsertBulkSql.html +2 -1
  98. package/docs/functions/_saltcorn_db_common.buildInsertSql.html +2 -1
  99. package/docs/functions/_saltcorn_db_common.commitAndBeginNewTransaction.html +103 -0
  100. package/docs/functions/_saltcorn_db_common.doCount.html +2 -1
  101. package/docs/functions/_saltcorn_db_common.doDeleteWhere.html +2 -1
  102. package/docs/functions/_saltcorn_db_common.doListScTables.html +2 -1
  103. package/docs/functions/_saltcorn_db_common.doListTables.html +2 -1
  104. package/docs/functions/_saltcorn_db_common.doListUserDefinedTables.html +2 -1
  105. package/docs/functions/_saltcorn_db_common.do_add_index.html +2 -1
  106. package/docs/functions/_saltcorn_db_common.do_drop_index.html +2 -1
  107. package/docs/functions/_saltcorn_db_common.ftsFieldsSqlExpr.html +2 -1
  108. package/docs/functions/_saltcorn_db_common.mkSelectOptions.html +2 -1
  109. package/docs/functions/_saltcorn_db_common.mkVal.html +2 -1
  110. package/docs/functions/_saltcorn_db_common.mkWhere.html +2 -1
  111. package/docs/functions/_saltcorn_db_common.multi_tenant.enable_multi_tenant.html +2 -1
  112. package/docs/functions/_saltcorn_db_common.multi_tenant.getRequestContext.html +2 -1
  113. package/docs/functions/_saltcorn_db_common.multi_tenant.getTenantSchema.html +2 -1
  114. package/docs/functions/_saltcorn_db_common.multi_tenant.init.html +2 -1
  115. package/docs/functions/_saltcorn_db_common.multi_tenant.is_it_multi_tenant.html +2 -1
  116. package/docs/functions/_saltcorn_db_common.multi_tenant.runWithTenant.html +2 -1
  117. package/docs/functions/_saltcorn_db_common.orderByIsObject.html +2 -1
  118. package/docs/functions/_saltcorn_db_common.orderByIsOperator.html +2 -1
  119. package/docs/functions/_saltcorn_db_common.prefixFieldsInWhere.html +2 -1
  120. package/docs/functions/_saltcorn_db_common.reprAsJson.html +2 -1
  121. package/docs/functions/_saltcorn_db_common.slugify.html +2 -1
  122. package/docs/functions/_saltcorn_db_common.sqlBinOp.html +2 -1
  123. package/docs/functions/_saltcorn_db_common.sqlFun.html +2 -1
  124. package/docs/functions/_saltcorn_db_common.sqlsanitize.html +2 -1
  125. package/docs/functions/_saltcorn_db_common.sqlsanitizeAllowDots.html +2 -1
  126. package/docs/functions/_saltcorn_db_common.subSelectWhere.html +2 -1
  127. package/docs/functions/_saltcorn_db_common.tryCatchInTransaction.html +2 -1
  128. package/docs/functions/_saltcorn_db_common.withTransaction.html +2 -1
  129. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.androidFeatures.html +1 -1
  130. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.androidPermissions.html +1 -1
  131. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.buildTablesFile.html +1 -1
  132. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyPrepopulatedDb.html +1 -1
  133. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyServerFiles.html +1 -1
  134. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyShareExtFiles.html +1 -1
  135. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copySiteLogo.html +1 -1
  136. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyTranslationFiles.html +1 -1
  137. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.createSqliteDb.html +1 -1
  138. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.decodeProvisioningProfile.html +1 -1
  139. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.extractDomain.html +1 -1
  140. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.generateAndroidVersionCode.html +1 -1
  141. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyAndroidManifest.html +1 -1
  142. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyConfigXml.html +1 -1
  143. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyGradleConfig.html +1 -1
  144. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyInfoPlist.html +1 -1
  145. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyXcodeProjectFile.html +1 -1
  146. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepAppIcon.html +1 -1
  147. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareAppIcon.html +1 -1
  148. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareBuildDir.html +1 -1
  149. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareExportOptionsPlist.html +1 -1
  150. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareSplashIcon.html +1 -1
  151. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareSplashPage.html +1 -1
  152. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeCapacitorConfig.html +1 -1
  153. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeCfgFile.html +1 -1
  154. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeDataExtractionRules.html +1 -1
  155. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeNetworkSecurityConfig.html +1 -1
  156. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writePodfile.html +1 -1
  157. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writePrivacyInfo.html +1 -1
  158. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.bundleMobileAppCode.html +1 -1
  159. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.bundlePackagesAndPlugins.html +1 -1
  160. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.copyMobileAppDirs.html +1 -1
  161. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.copyPublicDirs.html +1 -1
  162. package/docs/functions/_saltcorn_sqlite.add_index.html +1 -1
  163. package/docs/functions/_saltcorn_sqlite.add_unique_constraint.html +1 -1
  164. package/docs/functions/_saltcorn_sqlite.begin.html +1 -1
  165. package/docs/functions/_saltcorn_sqlite.changeConnection.html +1 -1
  166. package/docs/functions/_saltcorn_sqlite.close.html +1 -1
  167. package/docs/functions/_saltcorn_sqlite.commit.html +1 -1
  168. package/docs/functions/_saltcorn_sqlite.count.html +1 -1
  169. package/docs/functions/_saltcorn_sqlite.deleteWhere.html +1 -1
  170. package/docs/functions/_saltcorn_sqlite.dropTable.html +1 -1
  171. package/docs/functions/_saltcorn_sqlite.dropTables.html +1 -1
  172. package/docs/functions/_saltcorn_sqlite.drop_index.html +1 -1
  173. package/docs/functions/_saltcorn_sqlite.drop_reset_schema.html +1 -1
  174. package/docs/functions/_saltcorn_sqlite.drop_unique_constraint.html +1 -1
  175. package/docs/functions/_saltcorn_sqlite.getVersion.html +1 -1
  176. package/docs/functions/_saltcorn_sqlite.get_db_filepath.html +1 -1
  177. package/docs/functions/_saltcorn_sqlite.get_sql_logging.html +1 -1
  178. package/docs/functions/_saltcorn_sqlite.init.html +1 -1
  179. package/docs/functions/_saltcorn_sqlite.insert.html +1 -1
  180. package/docs/functions/_saltcorn_sqlite.listScTables.html +1 -1
  181. package/docs/functions/_saltcorn_sqlite.listTables.html +1 -1
  182. package/docs/functions/_saltcorn_sqlite.listUserDefinedTables.html +1 -1
  183. package/docs/functions/_saltcorn_sqlite.query.html +1 -1
  184. package/docs/functions/_saltcorn_sqlite.rollback.html +1 -1
  185. package/docs/functions/_saltcorn_sqlite.select.html +1 -1
  186. package/docs/functions/_saltcorn_sqlite.selectMaybeOne.html +1 -1
  187. package/docs/functions/_saltcorn_sqlite.selectOne.html +1 -1
  188. package/docs/functions/_saltcorn_sqlite.set_sql_logging.html +1 -1
  189. package/docs/functions/_saltcorn_sqlite.sql_log.html +1 -1
  190. package/docs/functions/_saltcorn_sqlite.update.html +1 -1
  191. package/docs/functions/_saltcorn_sqlite.updateWhere.html +1 -1
  192. package/docs/functions/_saltcorn_sqlite_mobile.add_index.html +1 -1
  193. package/docs/functions/_saltcorn_sqlite_mobile.add_unique_constraint.html +1 -1
  194. package/docs/functions/_saltcorn_sqlite_mobile.count.html +1 -1
  195. package/docs/functions/_saltcorn_sqlite_mobile.deleteWhere.html +1 -1
  196. package/docs/functions/_saltcorn_sqlite_mobile.drop_index.html +1 -1
  197. package/docs/functions/_saltcorn_sqlite_mobile.drop_reset_schema.html +1 -1
  198. package/docs/functions/_saltcorn_sqlite_mobile.drop_unique_constraint.html +1 -1
  199. package/docs/functions/_saltcorn_sqlite_mobile.init.html +1 -1
  200. package/docs/functions/_saltcorn_sqlite_mobile.insert.html +1 -1
  201. package/docs/functions/_saltcorn_sqlite_mobile.insertRows.html +1 -1
  202. package/docs/functions/_saltcorn_sqlite_mobile.listScTables.html +1 -1
  203. package/docs/functions/_saltcorn_sqlite_mobile.listTables.html +1 -1
  204. package/docs/functions/_saltcorn_sqlite_mobile.listUserDefinedTables.html +1 -1
  205. package/docs/functions/_saltcorn_sqlite_mobile.query.html +1 -1
  206. package/docs/functions/_saltcorn_sqlite_mobile.select.html +1 -1
  207. package/docs/functions/_saltcorn_sqlite_mobile.selectMaybeOne.html +1 -1
  208. package/docs/functions/_saltcorn_sqlite_mobile.selectOne.html +1 -1
  209. package/docs/functions/_saltcorn_sqlite_mobile.setConnectionObject.html +1 -1
  210. package/docs/functions/_saltcorn_sqlite_mobile.tableExists.html +1 -1
  211. package/docs/functions/_saltcorn_sqlite_mobile.time.html +1 -1
  212. package/docs/functions/_saltcorn_sqlite_mobile.update.html +1 -1
  213. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_field.instanceOfField.html +1 -1
  214. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_page.instanceOfPage.html +1 -1
  215. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_view.instanceOfView.html +1 -1
  216. package/docs/functions/_saltcorn_types.Types.base_types.instanceOWithHtmlFile.html +1 -1
  217. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfErrorMsg.html +1 -1
  218. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfSuccessMsg.html +1 -1
  219. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfType.html +1 -1
  220. package/docs/functions/_saltcorn_types.generators.generateBool.html +1 -1
  221. package/docs/functions/_saltcorn_types.generators.generateString.html +1 -1
  222. package/docs/functions/_saltcorn_types.generators.num_between.html +1 -1
  223. package/docs/functions/_saltcorn_types.generators.oneOf.html +1 -1
  224. package/docs/interfaces/_saltcorn_mobile_builder.common_build_utils.ScCapacitorConfig.html +10 -10
  225. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_field.AbstractField.html +15 -15
  226. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_field.AbstractFieldRepeat.html +3 -3
  227. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_form.AbstractForm.html +27 -27
  228. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_page.AbstractPage.html +7 -7
  229. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_role.AbstractRole.html +3 -3
  230. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_table.AbstractTable.html +11 -11
  231. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_trigger.AbstractTrigger.html +38 -16
  232. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_view.AbstractView.html +10 -10
  233. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_workflow.AbstractWorkflow.html +13 -13
  234. package/docs/modules/_saltcorn_admin_models.backup.html +1 -1
  235. package/docs/modules/_saltcorn_admin_models.html +1 -1
  236. package/docs/modules/_saltcorn_admin_models.pack.html +1 -1
  237. package/docs/modules/_saltcorn_admin_models.tenant.html +1 -1
  238. package/docs/modules/_saltcorn_common_code.html +1 -1
  239. package/docs/modules/_saltcorn_data.html +3 -3
  240. package/docs/modules/_saltcorn_data.models.EventLog.html +2 -2
  241. package/docs/modules/_saltcorn_data.models.File.html +2 -2
  242. package/docs/modules/_saltcorn_data.models.Form.html +2 -2
  243. package/docs/modules/_saltcorn_data.models.PageGroup.html +2 -2
  244. package/docs/modules/_saltcorn_data.models.Table.html +2 -2
  245. package/docs/modules/_saltcorn_data.models.View.html +2 -2
  246. package/docs/modules/_saltcorn_data.models.config.html +1 -1
  247. package/docs/modules/_saltcorn_data.models.discovery.html +1 -1
  248. package/docs/modules/_saltcorn_data.models.email.html +1 -1
  249. package/docs/modules/_saltcorn_data.models.expression.html +1 -1
  250. package/docs/modules/_saltcorn_data.models.html +1 -1
  251. package/docs/modules/_saltcorn_data.models.layout.html +1 -1
  252. package/docs/modules/_saltcorn_data.models.random.html +1 -1
  253. package/docs/modules/_saltcorn_data.models.scheduler.html +1 -1
  254. package/docs/modules/_saltcorn_data.plugin_helper.html +1 -1
  255. package/docs/modules/_saltcorn_data.utils.html +1 -1
  256. package/docs/modules/_saltcorn_db_common.html +4 -2
  257. package/docs/modules/_saltcorn_db_common.multi_tenant.html +2 -1
  258. package/docs/modules/_saltcorn_markup.html +2 -2
  259. package/docs/modules/_saltcorn_mobile_builder.common_build_utils.html +1 -1
  260. package/docs/modules/_saltcorn_mobile_builder.html +1 -1
  261. package/docs/modules/_saltcorn_mobile_builder.package_bundle_utils.html +1 -1
  262. package/docs/modules/_saltcorn_sqlite.html +1 -1
  263. package/docs/modules/_saltcorn_sqlite_mobile.html +1 -1
  264. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_field.html +1 -1
  265. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_form.html +1 -1
  266. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_library.html +1 -1
  267. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_page.html +1 -1
  268. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_plugin.html +1 -1
  269. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_role.html +1 -1
  270. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_table.html +1 -1
  271. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_trigger.html +1 -1
  272. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_view.html +1 -1
  273. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_workflow.html +1 -1
  274. package/docs/modules/_saltcorn_types.ModelAbstracts.html +1 -1
  275. package/docs/modules/_saltcorn_types.Types.base_types.html +1 -1
  276. package/docs/modules/_saltcorn_types.Types.common_types.html +1 -1
  277. package/docs/modules/_saltcorn_types.Types.html +1 -1
  278. package/docs/modules/_saltcorn_types.generators.html +1 -1
  279. package/docs/modules/_saltcorn_types.html +1 -1
  280. package/docs/types/_saltcorn_data.models.EventLog.EventLogCfg.html +1 -1
  281. package/docs/types/_saltcorn_data.models.File.FileCfg.html +1 -1
  282. package/docs/types/_saltcorn_data.models.Form.AdditionalButton.html +1 -1
  283. package/docs/types/_saltcorn_data.models.Form.FormCfg.html +1 -1
  284. package/docs/types/_saltcorn_data.models.PageGroup.ScreenInfoParams.html +1 -1
  285. package/docs/types/_saltcorn_data.models.Table.ChildRelations.html +1 -1
  286. package/docs/types/_saltcorn_data.models.Table.ParentRelations.html +1 -1
  287. package/docs/types/_saltcorn_data.models.Table.RelationData.html +1 -1
  288. package/docs/types/_saltcorn_data.models.View.FindViewsPred.html +1 -1
  289. package/docs/types/_saltcorn_db_common.AggregationOptions.html +2 -1
  290. package/docs/types/_saltcorn_db_common.CoordOpts.html +2 -1
  291. package/docs/types/_saltcorn_db_common.DatabaseClient.html +2 -1
  292. package/docs/types/_saltcorn_db_common.JoinField.html +2 -1
  293. package/docs/types/_saltcorn_db_common.JoinFields.html +2 -1
  294. package/docs/types/_saltcorn_db_common.JoinOptions.html +2 -1
  295. package/docs/types/_saltcorn_db_common.JsonPath.html +2 -1
  296. package/docs/types/_saltcorn_db_common.JsonPathElem.html +2 -1
  297. package/docs/types/_saltcorn_db_common.Operator.html +2 -1
  298. package/docs/types/_saltcorn_db_common.PartialSome.html +2 -1
  299. package/docs/types/_saltcorn_db_common.PrimaryKeyValue.html +2 -1
  300. package/docs/types/_saltcorn_db_common.Row.html +2 -1
  301. package/docs/types/_saltcorn_db_common.SelectOptions.html +2 -1
  302. package/docs/types/_saltcorn_db_common.SqlAndValues.html +2 -1
  303. package/docs/types/_saltcorn_db_common.StrongRow.html +2 -1
  304. package/docs/types/_saltcorn_db_common.SubselectOptions.html +2 -1
  305. package/docs/types/_saltcorn_db_common.Value.html +2 -1
  306. package/docs/types/_saltcorn_db_common.Where.html +2 -1
  307. package/docs/types/_saltcorn_mobile_builder.IosCfg.html +1 -1
  308. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_field.FieldCfg.html +1 -1
  309. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_field.InputType.html +1 -1
  310. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_form.AdditionalButton.html +1 -1
  311. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_library.LibraryCfg.html +1 -1
  312. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_library.LibraryPack.html +1 -1
  313. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_page.PageCfg.html +1 -1
  314. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_page.PagePack.html +1 -1
  315. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_plugin.PluginCfg.html +1 -1
  316. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_plugin.PluginPack.html +1 -1
  317. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_role.RoleCfg.html +1 -1
  318. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_role.RolePack.html +1 -1
  319. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_table.TableCfg.html +1 -1
  320. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_table.TablePack.html +1 -1
  321. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_trigger.TriggerCfg.html +1 -1
  322. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_trigger.TriggerPack.html +1 -1
  323. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_view.ViewCfg.html +1 -1
  324. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_view.ViewPack.html +1 -1
  325. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_workflow.ConfigWorkflowStep.html +1 -1
  326. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_workflow.RunResult.html +1 -1
  327. package/docs/types/_saltcorn_types.Types.base_types.Action.html +1 -1
  328. package/docs/types/_saltcorn_types.Types.base_types.AuthenticationMethod.html +1 -1
  329. package/docs/types/_saltcorn_types.Types.base_types.CalcJoinfield.html +1 -1
  330. package/docs/types/_saltcorn_types.Types.base_types.CapacitorPlugin.html +1 -1
  331. package/docs/types/_saltcorn_types.Types.base_types.CodePagePack.html +1 -1
  332. package/docs/types/_saltcorn_types.Types.base_types.Column.html +1 -1
  333. package/docs/types/_saltcorn_types.Types.base_types.ConnectObjType.html +4 -2
  334. package/docs/types/_saltcorn_types.Types.base_types.ConnectedObjects.html +1 -1
  335. package/docs/types/_saltcorn_types.Types.base_types.CopilotSkill.html +1 -1
  336. package/docs/types/_saltcorn_types.Types.base_types.ErrorObj.html +1 -1
  337. package/docs/types/_saltcorn_types.Types.base_types.FieldLike.html +1 -1
  338. package/docs/types/_saltcorn_types.Types.base_types.FieldView.html +1 -1
  339. package/docs/types/_saltcorn_types.Types.base_types.Header.html +1 -1
  340. package/docs/types/_saltcorn_types.Types.base_types.JoinFieldOption.html +1 -1
  341. package/docs/types/_saltcorn_types.Types.base_types.Layout.html +1 -1
  342. package/docs/types/_saltcorn_types.Types.base_types.MobileConfig.html +1 -1
  343. package/docs/types/_saltcorn_types.Types.base_types.ModelPattern.html +1 -1
  344. package/docs/types/_saltcorn_types.Types.base_types.Pack.html +1 -1
  345. package/docs/types/_saltcorn_types.Types.base_types.Plugin.html +1 -1
  346. package/docs/types/_saltcorn_types.Types.base_types.PluginFunction.html +1 -1
  347. package/docs/types/_saltcorn_types.Types.base_types.PluginLayout.html +1 -1
  348. package/docs/types/_saltcorn_types.Types.base_types.PluginRoute.html +1 -1
  349. package/docs/types/_saltcorn_types.Types.base_types.PluginSourceType.html +1 -1
  350. package/docs/types/_saltcorn_types.Types.base_types.PluginType.html +1 -1
  351. package/docs/types/_saltcorn_types.Types.base_types.PluginWrap.html +1 -1
  352. package/docs/types/_saltcorn_types.Types.base_types.PluginWrapArg.html +1 -1
  353. package/docs/types/_saltcorn_types.Types.base_types.RelationOption.html +1 -1
  354. package/docs/types/_saltcorn_types.Types.base_types.Req.html +1 -1
  355. package/docs/types/_saltcorn_types.Types.base_types.Res.html +1 -1
  356. package/docs/types/_saltcorn_types.Types.base_types.ResultType.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.SlugStepType.html +1 -1
  360. package/docs/types/_saltcorn_types.Types.base_types.StepResType.html +1 -1
  361. package/docs/types/_saltcorn_types.Types.base_types.SubField.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 +4 -2
  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.isPushEnabled.html +1 -1
  380. package/docs/variables/_saltcorn_data.utils.sleep.html +1 -1
  381. package/docs/variables/_saltcorn_db_common.multi_tenant.tenantNamespace.html +2 -1
  382. package/help/JavaScript action code.tmd +10 -0
  383. package/locales/en.json +32 -1
  384. package/package.json +9 -9
  385. package/public/log_viewer_utils.js +3 -2
  386. package/public/saltcorn-common.js +94 -39
  387. package/public/saltcorn.css +12 -0
  388. package/public/saltcorn.js +44 -6
  389. package/routes/actions.js +14 -0
  390. package/routes/admin.js +71 -18
  391. package/routes/common_lists.js +8 -1
  392. package/routes/eventlog.js +20 -0
  393. package/routes/fields.js +1 -1
  394. package/routes/menu.js +98 -6
  395. package/routes/page.js +4 -1
  396. package/routes/pageedit.js +1 -0
  397. package/routes/plugins.js +8 -7
  398. package/routes/tables.js +11 -0
  399. package/routes/view.js +12 -3
  400. package/serve.js +97 -43
  401. package/tests/admin.test.js +3 -3
  402. package/tests/auth.test.js +1 -0
  403. package/tests/viewedit.test.js +2 -0
  404. package/wrapper.js +23 -191
@@ -151,15 +151,15 @@ function valid_js_var_name(s) {
151
151
  return !!s.match(/^[a-zA-Z_$][a-zA-Z_$0-9]*$/);
152
152
  }
153
153
 
154
- function add_extra_state(base_url, extra_state_fml, row) {
154
+ function add_extra_state(base_url, extra_state_fml, row, outerState = {}) {
155
155
  //console.log("add_extra_state", { base_url, extra_state_fml, row });
156
- if (!extra_state_fml) return base_url;
156
+ if (!extra_state_fml && !Object.keys(outerState).length) return base_url;
157
157
  let extra_state = new Function(
158
158
  "row",
159
159
  `{${Object.keys(row).join(",")}}`,
160
- "return " + extra_state_fml
160
+ "return " + extra_state_fml||"{}"
161
161
  )(row, row);
162
- let qs = Object.entries(extra_state)
162
+ let qs = Object.entries({ ...outerState, ...extra_state })
163
163
  .map(([k, v]) => `${k}=${encodeURIComponent(v)}`)
164
164
  .join("&");
165
165
  let sepChar = base_url.includes("?") ? "&" : "?";
@@ -1699,10 +1699,13 @@ function notifyAlert(note, spin) {
1699
1699
  if ($modal.length && $modal.hasClass("show"))
1700
1700
  $("#modal-toasts-area").append(html);
1701
1701
  else $("#toasts-area").append(html);
1702
- if (type === "success") {
1703
- setTimeout(() => {
1704
- $(`#${id}`).removeClass("show");
1705
- }, 5000);
1702
+ if (type === "success" || note.remove_delay) {
1703
+ setTimeout(
1704
+ () => {
1705
+ $(`#${id}`).removeClass("show");
1706
+ },
1707
+ note.remove_delay ? note.remove_delay * 1000 : 5000
1708
+ );
1706
1709
  }
1707
1710
  }
1708
1711
 
@@ -1723,6 +1726,8 @@ function press_store_button(clicked, keepOld, disable) {
1723
1726
  .html('<i class="fas fa-spinner fa-spin"></i>')
1724
1727
  .width(width)
1725
1728
  .height(height);
1729
+ $(document).trigger("activate-spinner", $(btn));
1730
+ $(btn).trigger("spin");
1726
1731
  setTimeout(() => {
1727
1732
  $(btn).prop("disabled", true);
1728
1733
  }, 50);
@@ -1751,6 +1756,9 @@ async function common_done(res, viewnameOrElem0, isWeb = true) {
1751
1756
  .attr("data-sc-embed-viewname");
1752
1757
  if (window._sc_loglevel > 4)
1753
1758
  console.log("ajax result directives", viewname, res);
1759
+
1760
+ if (res.page_load_tag && res.page_load_tag !== _sc_pageloadtag) return;
1761
+
1754
1762
  const handle = async (element, fn) => {
1755
1763
  if (Array.isArray(element))
1756
1764
  for (const current of element) await fn(current);
@@ -1776,17 +1784,32 @@ async function common_done(res, viewnameOrElem0, isWeb = true) {
1776
1784
  };
1777
1785
  if (res.notify)
1778
1786
  await handle(res.notify, (text) =>
1779
- notifyAlert({ type: "info", text, toast_title: res.toast_title })
1787
+ notifyAlert({
1788
+ type: "info",
1789
+ text,
1790
+ toast_title: res.toast_title,
1791
+ remove_delay: res.remove_delay,
1792
+ })
1780
1793
  );
1781
1794
  if (res.error) {
1782
1795
  if (window._sc_loglevel > 4) console.trace("error response", res.error);
1783
1796
  await handle(res.error, (text) =>
1784
- notifyAlert({ type: "danger", text, toast_title: res.toast_title })
1797
+ notifyAlert({
1798
+ type: "danger",
1799
+ text,
1800
+ toast_title: res.toast_title,
1801
+ remove_delay: res.remove_delay,
1802
+ })
1785
1803
  );
1786
1804
  }
1787
1805
  if (res.notify_success)
1788
1806
  await handle(res.notify_success, (text) =>
1789
- notifyAlert({ type: "success", text, toast_title: res.toast_title })
1807
+ notifyAlert({
1808
+ type: "success",
1809
+ text,
1810
+ toast_title: res.toast_title,
1811
+ remove_delay: res.remove_delay,
1812
+ })
1790
1813
  );
1791
1814
  if (res.set_fields && (viewname || res.set_fields._viewname)) {
1792
1815
  const form =
@@ -1821,10 +1844,10 @@ async function common_done(res, viewnameOrElem0, isWeb = true) {
1821
1844
  input.attr("data-selected", res.set_fields[k]);
1822
1845
  }
1823
1846
 
1824
- input.trigger("set_form_field");
1847
+ input.trigger("set_form_field", { no_onchange: res.no_onchange });
1825
1848
  });
1826
1849
  }
1827
- form.trigger("change");
1850
+ if (!res.no_onchange) form.trigger("change");
1828
1851
  }
1829
1852
 
1830
1853
  if (res.download) {
@@ -2055,17 +2078,24 @@ function room_older(viewname, room_id, btn) {
2055
2078
  );
2056
2079
  }
2057
2080
 
2058
- function init_room(viewname, room_id) {
2059
- let socket = null;
2060
- if (parent?.saltcorn?.data?.state) {
2061
- const { server_path, jwt } =
2062
- parent.saltcorn.data.state.getState().mobileConfig;
2063
- socket = io(server_path, {
2064
- query: `jwt=${jwt}`,
2065
- transports: ["websocket"],
2066
- });
2067
- } else socket = io({ transports: ["websocket"] });
2081
+ function get_shared_socket() {
2082
+ let socket = window.sharedSocket || null;
2083
+ if (!socket) {
2084
+ if (parent?.saltcorn?.data?.state) {
2085
+ const { server_path, jwt } =
2086
+ parent.saltcorn.data.state.getState().mobileConfig;
2087
+ socket = io(server_path, {
2088
+ query: `jwt=${jwt}`,
2089
+ transports: ["websocket"],
2090
+ });
2091
+ } else socket = io({ transports: ["websocket"] });
2092
+ window.sharedSocket = socket;
2093
+ }
2094
+ return socket;
2095
+ }
2068
2096
 
2097
+ function init_room(viewname, room_id) {
2098
+ let socket = get_shared_socket();
2069
2099
  socket.emit("join_room", [viewname, room_id]);
2070
2100
  socket.on("message", (msg) => {
2071
2101
  if (msg.not_for_user_id) {
@@ -2088,32 +2118,51 @@ function init_room(viewname, room_id) {
2088
2118
  }
2089
2119
 
2090
2120
  function init_collab_room(viewname, eventCfgs) {
2091
- let socket = null;
2092
- if (parent?.saltcorn?.data?.state) {
2093
- const { server_path, jwt } =
2094
- parent.saltcorn.data.state.getState().mobileConfig;
2095
- socket = io(server_path, {
2096
- query: `jwt=${jwt}`,
2097
- transports: ["websocket"],
2098
- });
2099
- } else socket = io({ transports: ["websocket"] });
2121
+ let socket = get_shared_socket();
2100
2122
  for (const [event, callback] of Object.entries(eventCfgs.events)) {
2101
2123
  socket.on(event, callback);
2102
2124
  }
2103
- socket.on("connect", function () {
2125
+ const joinFn = () => {
2104
2126
  socket.emit("join_collab_room", viewname, (ack) => {
2105
- if (ack && ack.status === "ok") {
2127
+ if (ack && ack.status === "ok")
2106
2128
  console.log(`Joined collaboration room for view '${viewname}'`);
2107
- } else {
2108
- console.error("Failed to join collaboration room:", ack);
2109
- }
2129
+ else console.error("Failed to join collaboration room:", ack);
2110
2130
  });
2111
- });
2131
+ };
2132
+ if (socket.connected) joinFn();
2133
+ else socket.on("connect", joinFn);
2112
2134
  socket.on("disconnect", function () {
2113
2135
  console.log("Disconnected from the server");
2114
2136
  });
2115
2137
  }
2116
2138
 
2139
+ function init_dynamic_update_room() {
2140
+ const isNode = getIsNode();
2141
+ if (
2142
+ !window.io ||
2143
+ navigator.userAgent.includes("jsdom") ||
2144
+ (isNode && !dynamic_updates_cfg?.enabled)
2145
+ )
2146
+ return;
2147
+ if (!isNode) {
2148
+ const state = parent.saltcorn.data.state.getState();
2149
+ if (!state.getConfig("enable_dynamic_updates", true)) return;
2150
+ }
2151
+ let socket = get_shared_socket();
2152
+ socket.on("dynamic_update", async (data) => {
2153
+ await common_done(data);
2154
+ });
2155
+ const joinFn = () => {
2156
+ socket.emit("join_dynamic_update_room", (ack) => {
2157
+ if (ack && ack.status === "ok") {
2158
+ if (window._sc_loglevel > 5) console.log("Joined dynamic update room");
2159
+ } else console.error("Failed to join dynamic update room:", ack);
2160
+ });
2161
+ };
2162
+ if (socket.connected) joinFn();
2163
+ else socket.on("connect", joinFn);
2164
+ }
2165
+
2117
2166
  function cancel_form(form) {
2118
2167
  if (!form) return;
2119
2168
  $(form).trigger("reset");
@@ -2159,7 +2208,7 @@ function check_saltcorn_notifications() {
2159
2208
  .then((resp) => {
2160
2209
  if (resp.success) {
2161
2210
  const n = resp.success;
2162
- const menu_item = $(`a.notify-menu-item`);
2211
+ const menu_item = $('a[href="/notifications"]');
2163
2212
 
2164
2213
  menu_item.html(
2165
2214
  `<i class="fa-fw mr-05 fas fa-bell"></i>Notifications (${n})`
@@ -2561,3 +2610,9 @@ async function initPushNotify() {
2561
2610
  console.error("Push notification initialization failed:", error);
2562
2611
  }
2563
2612
  }
2613
+
2614
+ if (document.readyState !== "loading") {
2615
+ init_dynamic_update_room();
2616
+ } else {
2617
+ document.addEventListener("DOMContentLoaded", init_dynamic_update_room);
2618
+ }
@@ -1,3 +1,15 @@
1
+ .table-valign-middle > tbody > tr > td {
2
+ vertical-align: middle;
3
+ }
4
+
5
+ .table-valign-top > tbody > tr > td {
6
+ vertical-align: top;
7
+ }
8
+
9
+ .table-valign-bottom > tbody > tr > td {
10
+ vertical-align: bottom;
11
+ }
12
+
1
13
  div.form-repeat {
2
14
  border: 1px dashed black;
3
15
  padding: 3px;
@@ -218,6 +218,9 @@ function pjax_to(href, e) {
218
218
  }
219
219
  $dest.html(res);
220
220
  if (localizer.length) localizer.attr("data-sc-local-state", href);
221
+ let $modal = $("#scmodal");
222
+ if ($modal.length && $modal.hasClass("show"))
223
+ $modal.prop("data-modal-state", href);
221
224
  initialize_page();
222
225
  document.dispatchEvent(new Event("pjax-loaded"));
223
226
  },
@@ -261,6 +264,8 @@ function spin_action_link(e) {
261
264
 
262
265
  $e.attr("data-innerhtml-prespin", $e.html());
263
266
  $e.html('<i class="fas fa-spinner fa-spin"></i>').width(width).height(height);
267
+ $(document).trigger("activate-spinner", $e);
268
+ $e.trigger("spin");
264
269
  }
265
270
 
266
271
  function reset_spinners() {
@@ -289,6 +294,7 @@ function view_post(viewnameOrElem, route, data, onDone, sendState) {
289
294
  type: "POST",
290
295
  headers: {
291
296
  "CSRF-Token": _sc_globalCsrf,
297
+ "Page-Load-Tag": _sc_pageloadtag,
292
298
  },
293
299
  ...(!isFormData
294
300
  ? {
@@ -423,6 +429,7 @@ function ajax_modal(url, opts = {}) {
423
429
  new bootstrap.Modal($("#scmodal"), {
424
430
  focus: false,
425
431
  }).show();
432
+ $("#scmodal .modal-body").find("[autofocus]").first().focus();
426
433
  initialize_page();
427
434
  (opts.onOpen || function () {})(res);
428
435
  $("#scmodal").on("hidden.bs.modal", function (e) {
@@ -702,6 +709,7 @@ function ajax_post(url, args) {
702
709
  type: "POST",
703
710
  headers: {
704
711
  "CSRF-Token": _sc_globalCsrf,
712
+ "Page-Load-Tag": _sc_pageloadtag,
705
713
  },
706
714
  ...(args || {}),
707
715
  })
@@ -1121,12 +1129,42 @@ function check_capacitor_builder() {
1121
1129
  success: function (res) {
1122
1130
  window.capacitorBuilderAvailable = !!res.installed;
1123
1131
  if (window.capacitorBuilderAvailable) {
1124
- $("#dockerBuilderStatusId").html(
1125
- `<span>
1126
- installed<i class="ps-2 fas fa-check text-success"></i>
1127
- </span>
1128
- `
1129
- );
1132
+ if (res.version !== res.sc_version) {
1133
+ $("#dockerBuilderStatusId").html(`
1134
+ <div
1135
+ id="mismatchBoxId" class="mt-3 p-3 border rounded bg-light"
1136
+ >
1137
+ <div
1138
+ class="d-flex align-items-center mb-2"
1139
+ >
1140
+ installed<i title="Information" class="ps-2 fas fa-info-circle text-warning"></i>
1141
+ </div>
1142
+ <div
1143
+ class="fw-bold text-danger mb-1"
1144
+ >
1145
+ Version Mismatch:
1146
+ </div>
1147
+ <ul
1148
+ class="list-unstyled mb-0"
1149
+ >
1150
+ <li>
1151
+ <span class="fw-semibold text-muted">Docker tag:</span>1.3.1-beta.0
1152
+ </li>
1153
+ <li>
1154
+ <span class="fw-semibold text-muted">SC version:</span>1.3.1-beta.10
1155
+ </li>
1156
+ </ul>
1157
+ </div>`);
1158
+ $("#dockerBuilderVersionBoxId").removeClass("d-none");
1159
+ $("#dockerBuilderVersionId").html(` ${res.version}`);
1160
+ } else {
1161
+ $("#dockerBuilderStatusId").html(
1162
+ `<span>
1163
+ installed<i class="ps-2 fas fa-check text-success"></i>
1164
+ </span>
1165
+ `
1166
+ );
1167
+ }
1130
1168
  } else {
1131
1169
  $("#dockerBuilderStatusId").html(
1132
1170
  `<span>
package/routes/actions.js CHANGED
@@ -179,6 +179,7 @@ const triggerForm = async (req, trigger) => {
179
179
  workflow: true,
180
180
  });
181
181
  const table_triggers = ["Insert", "Update", "Delete", "Validate"];
182
+ const additional_triggers_with_onlyif = ["Login", "PageLoad"];
182
183
  const action_options = {};
183
184
  const actionsNotRequiringRow = Trigger.action_options({
184
185
  notRequireRow: true,
@@ -337,6 +338,19 @@ const triggerForm = async (req, trigger) => {
337
338
  type: "String",
338
339
  showIf: { when_trigger: ["API call"], _raw_output: true },
339
340
  },
341
+ {
342
+ name: "_only_if",
343
+ label: req.__("Only if"),
344
+ type: "String",
345
+ class: "validate-expression",
346
+ sublabel: req.__(
347
+ "Optional JavaScript expression to determine if the trigger should run."
348
+ ),
349
+ parent_field: "configuration",
350
+ showIf: {
351
+ when_trigger: [...table_triggers, ...additional_triggers_with_onlyif],
352
+ },
353
+ },
340
354
  ],
341
355
  });
342
356
  // if (trigger) {
package/routes/admin.js CHANGED
@@ -500,11 +500,12 @@ router.get(
500
500
  "backup_s3_access_secret"
501
501
  );
502
502
  backupForm.values.backup_s3_region =
503
- getState().getConfig("backup_s3_region");
503
+ getState().getConfig("backup_s3_region");
504
504
  aBackupFilePrefixForm.values.backup_with_event_log = getState().getConfig(
505
505
  "backup_with_event_log"
506
506
  );
507
- aBackupFilePrefixForm.values.backup_password = getState().getConfig("backup_password");
507
+ aBackupFilePrefixForm.values.backup_password =
508
+ getState().getConfig("backup_password");
508
509
  const aSnapshotForm = snapshotForm(req);
509
510
  aSnapshotForm.values.snapshots_enabled =
510
511
  getState().getConfig("snapshots_enabled");
@@ -2268,7 +2269,7 @@ router.get(
2268
2269
  );
2269
2270
  const buildDialogScript = (capacitorBuilderAvailable, isSbadmin2) =>
2270
2271
  `<script>
2271
- var capacitorBuilderAvailable = ${capacitorBuilderAvailable};
2272
+ var capacitorBuilderAvailable = ${capacitorBuilderAvailable.installed};
2272
2273
  var isSbadmin2 = ${isSbadmin2};
2273
2274
  function showEntrySelect(type) {
2274
2275
  for( const currentType of ["view", "page", "pagegroup"]) {
@@ -2307,16 +2308,22 @@ const buildDialogScript = (capacitorBuilderAvailable, isSbadmin2) =>
2307
2308
  `)}
2308
2309
  </script>`;
2309
2310
 
2310
- const imageAvailable = async () => {
2311
+ const imageAvailable = async (preferedVersion) => {
2312
+ const docker = new Docker();
2311
2313
  try {
2312
- const state = getState();
2313
- const image = new Docker().getImage(
2314
- `saltcorn/capacitor-builder:${state.scVersion}`
2314
+ const image = docker.getImage(
2315
+ `saltcorn/capacitor-builder:${preferedVersion}`
2315
2316
  );
2316
2317
  await image.inspect();
2317
- return true;
2318
+ return { installed: true, version: preferedVersion };
2318
2319
  } catch (e) {
2319
- return false;
2320
+ const images = await docker.listImages({
2321
+ filters: { reference: ["saltcorn/capacitor-builder:*"] },
2322
+ });
2323
+ const tags = images.flatMap((img) => img.RepoTags || []);
2324
+ if (tags.length > 0)
2325
+ return { installed: true, version: tags[0].split(":")[1] };
2326
+ return { installed: false };
2320
2327
  }
2321
2328
  };
2322
2329
 
@@ -2372,7 +2379,8 @@ router.get(
2372
2379
  .map((plugin) => plugin.name);
2373
2380
  const builderSettings =
2374
2381
  getState().getConfig("mobile_builder_settings") || {};
2375
- const dockerAvailable = await imageAvailable();
2382
+ const scVersion = getState().scVersion;
2383
+ const dockerAvailable = await imageAvailable(scVersion);
2376
2384
  const xcodeCheckRes = await checkXcodebuild();
2377
2385
  const xcodebuildAvailable = xcodeCheckRes.installed;
2378
2386
  const xcodebuildVersion = xcodeCheckRes.version;
@@ -3132,15 +3140,58 @@ router.get(
3132
3140
  id: "dockerBuilderStatusId",
3133
3141
  class: "",
3134
3142
  },
3135
- dockerAvailable
3143
+ dockerAvailable.installed &&
3144
+ dockerAvailable.version === scVersion
3136
3145
  ? span(
3137
3146
  req.__("installed"),
3138
3147
  i({ class: "ps-2 fas fa-check text-success" })
3139
3148
  )
3140
- : span(
3141
- req.__("not available"),
3142
- i({ class: "ps-2 fas fa-times text-danger" })
3143
- )
3149
+ : dockerAvailable.installed
3150
+ ? div(
3151
+ {
3152
+ id: "mismatchBoxId",
3153
+ class: "mt-3 p-3 border rounded bg-light",
3154
+ },
3155
+ div(
3156
+ {
3157
+ class: "d-flex align-items-center mb-2",
3158
+ },
3159
+ req.__("installed"),
3160
+ i({
3161
+ title: req.__("Information"),
3162
+ class:
3163
+ "ps-2 fas fa-info-circle text-warning",
3164
+ })
3165
+ ),
3166
+ div(
3167
+ { class: "fw-bold text-danger mb-1" },
3168
+ "Version Mismatch:"
3169
+ ),
3170
+
3171
+ ul(
3172
+ { class: "list-unstyled mb-0" },
3173
+ li(
3174
+ span(
3175
+ { class: "fw-semibold text-muted" },
3176
+ req.__("Docker tag:")
3177
+ ),
3178
+ dockerAvailable.version
3179
+ ),
3180
+ li(
3181
+ span(
3182
+ { class: "fw-semibold text-muted" },
3183
+ req.__("SC version:")
3184
+ ),
3185
+ scVersion
3186
+ )
3187
+ )
3188
+ )
3189
+ : span(
3190
+ req.__("not available"),
3191
+ i({
3192
+ class: "ps-2 fas fa-times text-danger",
3193
+ })
3194
+ )
3144
3195
  )
3145
3196
  ),
3146
3197
  div(
@@ -3996,8 +4047,9 @@ router.get(
3996
4047
  "/mobile-app/check-capacitor-builder",
3997
4048
  isAdmin,
3998
4049
  error_catcher(async (req, res) => {
3999
- const installed = await imageAvailable();
4000
- res.json({ installed });
4050
+ const state = getState();
4051
+ const { installed, version } = await imageAvailable(state.scVersion);
4052
+ res.json({ installed, version, sc_version: state.scVersion });
4001
4053
  })
4002
4054
  );
4003
4055
 
@@ -4126,6 +4178,8 @@ router.post(
4126
4178
  await db.deleteWhere("_sc_config", { not: { key: "letsencrypt" } });
4127
4179
  }
4128
4180
  await getState().refresh();
4181
+ await require("@saltcorn/data/standard-menu")();
4182
+
4129
4183
  if (form.values.users) {
4130
4184
  await db.deleteWhere("_sc_notifications");
4131
4185
 
@@ -4532,7 +4586,6 @@ admin_config_route({
4532
4586
  path: "/notifications",
4533
4587
  super_path: "/admin",
4534
4588
  field_names: [
4535
- "notification_in_menu",
4536
4589
  { section_header: "Progressive Web Application" },
4537
4590
  "pwa_enabled",
4538
4591
  { name: "pwa_display", showIf: { pwa_enabled: true } },
@@ -138,6 +138,7 @@ const tablesList = async (
138
138
  hover: true,
139
139
  tableClass: listClass(tagId, showList),
140
140
  tableId: domId,
141
+ class: "table-valign-middle",
141
142
  }
142
143
  ) +
143
144
  (tables.length == 0 && !filterOnTag
@@ -442,6 +443,7 @@ const viewsList = async (
442
443
  hover: true,
443
444
  tableClass: listClass(tagId, showList),
444
445
  tableId: domId,
446
+ class: "table-valign-middle",
445
447
  }
446
448
  ) +
447
449
  (views.length == 0 && !filterOnTag
@@ -625,6 +627,7 @@ const getPageList = async (
625
627
  hover: true,
626
628
  tableClass: tagId ? `collapse ${showList ? "show" : ""}` : "",
627
629
  tableId: domId,
630
+ class: "table-valign-middle",
628
631
  }
629
632
  );
630
633
  };
@@ -657,6 +660,7 @@ const getPageGroupList = (rows, roles, req) => {
657
660
  rows,
658
661
  {
659
662
  hover: true,
663
+ class: "table-valign-middle",
660
664
  }
661
665
  );
662
666
  };
@@ -729,6 +733,8 @@ const getTriggerList = async (
729
733
  )
730
734
  );
731
735
  };
736
+ const whenCanHaveTable = (when) =>
737
+ ["Insert", "Update", "Delete", "Validate", "Never"].includes(when);
732
738
  return mkTable(
733
739
  [
734
740
  { label: req.__("Name"), key: "name" },
@@ -781,7 +787,7 @@ const getTriggerList = async (
781
787
  {
782
788
  label: req.__("Table or Channel"),
783
789
  key: (r) =>
784
- r.table_name
790
+ r.table_name && whenCanHaveTable(r.when_trigger)
785
791
  ? user_can_inspect_tables
786
792
  ? a({ href: `/table/${r.table_name}` }, r.table_name)
787
793
  : r.table_name
@@ -807,6 +813,7 @@ const getTriggerList = async (
807
813
  hover: true,
808
814
  tableClass: tagId ? `collapse ${showList ? "show" : ""}` : "",
809
815
  tableId: domId,
816
+ class: "table-valign-middle",
810
817
  }
811
818
  );
812
819
  };
@@ -81,6 +81,18 @@ const logSettingsForm = async (req) => {
81
81
  input_type: "date",
82
82
  attributes: { minDate: new Date(), maxDate: hoursFuture(24 * 7 * 2) },
83
83
  },
84
+ {
85
+ input_type: "section_header",
86
+ label: req.__("Dynamic server side updates"),
87
+ },
88
+ {
89
+ name: "enable_dynamic_updates",
90
+ label: req.__("Enable dynamic updates"),
91
+ type: "Bool",
92
+ sublabel: req.__(
93
+ "Enable server side updates from within run_js_code actions"
94
+ ),
95
+ },
84
96
  {
85
97
  input_type: "section_header",
86
98
  label: req.__("Delete old workflow runs with status after days"),
@@ -168,6 +180,10 @@ router.get(
168
180
  "next_weekly_event",
169
181
  {}
170
182
  );
183
+ form.values.enable_dynamic_updates = getState().getConfig(
184
+ "enable_dynamic_updates",
185
+ true
186
+ );
171
187
  ["error", "finished", "running", "waiting"].forEach((k) => {
172
188
  let cfgk = `delete_${k}_workflows_days`;
173
189
  form.values[cfgk] = getState().getConfig(cfgk);
@@ -377,6 +393,10 @@ router.post(
377
393
  delete form.values[k];
378
394
  }
379
395
  }
396
+ await getState().setConfig(
397
+ "enable_dynamic_updates",
398
+ form.values.enable_dynamic_updates
399
+ );
380
400
  for (const status of ["error", "finished", "running", "waiting"]) {
381
401
  let k = `delete_${status}_workflows_days`;
382
402
  if (form.values[k]) {
package/routes/fields.js CHANGED
@@ -1530,7 +1530,7 @@ router.post(
1530
1530
  const table = Table.findOne({ name: table_name });
1531
1531
  const field = table.getField(field_name);
1532
1532
  let val = field.type?.read
1533
- ? field.type?.read(req.body[field_name])
1533
+ ? field.type?.read(req.body[field_name], field.attributes)
1534
1534
  : req.body[field_name];
1535
1535
  await db.withTransaction(async () => {
1536
1536
  await table.updateRow({ [field_name]: val }, pk, req.user);