@saltcorn/server 1.3.1-beta.0 → 1.3.1-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (406) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/auth/admin.js +9 -1
  3. package/auth/roleadmin.js +54 -1
  4. package/auth/routes.js +50 -5
  5. package/docs/assets/search.js +1 -1
  6. package/docs/classes/_saltcorn_common_code.Relation.html +10 -10
  7. package/docs/classes/_saltcorn_common_code.RelationsFinder.html +5 -5
  8. package/docs/classes/_saltcorn_data.models.Crash.html +17 -17
  9. package/docs/classes/_saltcorn_data.models.EventLog-1.html +19 -19
  10. package/docs/classes/_saltcorn_data.models.Field.html +74 -74
  11. package/docs/classes/_saltcorn_data.models.FieldRepeat.html +16 -16
  12. package/docs/classes/_saltcorn_data.models.File-1.html +48 -48
  13. package/docs/classes/_saltcorn_data.models.Form-1.html +39 -39
  14. package/docs/classes/_saltcorn_data.models.Library.html +13 -13
  15. package/docs/classes/_saltcorn_data.models.Page.html +24 -24
  16. package/docs/classes/_saltcorn_data.models.PageGroup-1.html +25 -25
  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 +92 -92
  20. package/docs/classes/_saltcorn_data.models.TableConstraint.html +14 -14
  21. package/docs/classes/_saltcorn_data.models.Trigger.html +71 -39
  22. package/docs/classes/_saltcorn_data.models.User.html +51 -49
  23. package/docs/classes/_saltcorn_data.models.View-1.html +54 -54
  24. package/docs/classes/_saltcorn_data.models.Workflow.html +17 -17
  25. package/docs/classes/_saltcorn_data.models.WorkflowRun.html +35 -35
  26. package/docs/classes/_saltcorn_data.models.WorkflowStep.html +27 -27
  27. package/docs/classes/_saltcorn_data.models.WorkflowTrace.html +18 -18
  28. package/docs/classes/_saltcorn_mobile_builder.MobileBuilder.html +37 -37
  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 -1
  99. package/docs/functions/_saltcorn_db_common.buildInsertSql.html +2 -1
  100. package/docs/functions/_saltcorn_db_common.commitAndBeginNewTransaction.html +103 -0
  101. package/docs/functions/_saltcorn_db_common.doCount.html +2 -1
  102. package/docs/functions/_saltcorn_db_common.doDeleteWhere.html +2 -1
  103. package/docs/functions/_saltcorn_db_common.doListScTables.html +2 -1
  104. package/docs/functions/_saltcorn_db_common.doListTables.html +2 -1
  105. package/docs/functions/_saltcorn_db_common.doListUserDefinedTables.html +2 -1
  106. package/docs/functions/_saltcorn_db_common.do_add_index.html +2 -1
  107. package/docs/functions/_saltcorn_db_common.do_drop_index.html +2 -1
  108. package/docs/functions/_saltcorn_db_common.ftsFieldsSqlExpr.html +2 -1
  109. package/docs/functions/_saltcorn_db_common.mkSelectOptions.html +2 -1
  110. package/docs/functions/_saltcorn_db_common.mkVal.html +2 -1
  111. package/docs/functions/_saltcorn_db_common.mkWhere.html +2 -1
  112. package/docs/functions/_saltcorn_db_common.multi_tenant.enable_multi_tenant.html +2 -1
  113. package/docs/functions/_saltcorn_db_common.multi_tenant.getRequestContext.html +2 -1
  114. package/docs/functions/_saltcorn_db_common.multi_tenant.getTenantSchema.html +2 -1
  115. package/docs/functions/_saltcorn_db_common.multi_tenant.init.html +2 -1
  116. package/docs/functions/_saltcorn_db_common.multi_tenant.is_it_multi_tenant.html +2 -1
  117. package/docs/functions/_saltcorn_db_common.multi_tenant.runWithTenant.html +2 -1
  118. package/docs/functions/_saltcorn_db_common.orderByIsObject.html +2 -1
  119. package/docs/functions/_saltcorn_db_common.orderByIsOperator.html +2 -1
  120. package/docs/functions/_saltcorn_db_common.prefixFieldsInWhere.html +2 -1
  121. package/docs/functions/_saltcorn_db_common.reprAsJson.html +2 -1
  122. package/docs/functions/_saltcorn_db_common.slugify.html +2 -1
  123. package/docs/functions/_saltcorn_db_common.sqlBinOp.html +2 -1
  124. package/docs/functions/_saltcorn_db_common.sqlFun.html +2 -1
  125. package/docs/functions/_saltcorn_db_common.sqlsanitize.html +2 -1
  126. package/docs/functions/_saltcorn_db_common.sqlsanitizeAllowDots.html +2 -1
  127. package/docs/functions/_saltcorn_db_common.subSelectWhere.html +2 -1
  128. package/docs/functions/_saltcorn_db_common.tryCatchInTransaction.html +2 -1
  129. package/docs/functions/_saltcorn_db_common.withTransaction.html +2 -1
  130. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.androidFeatures.html +1 -1
  131. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.androidPermissions.html +1 -1
  132. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.buildTablesFile.html +1 -1
  133. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyPrepopulatedDb.html +1 -1
  134. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyServerFiles.html +1 -1
  135. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyShareExtFiles.html +1 -1
  136. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copySiteLogo.html +1 -1
  137. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyTranslationFiles.html +1 -1
  138. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.createSqliteDb.html +1 -1
  139. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.decodeProvisioningProfile.html +1 -1
  140. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.extractDomain.html +1 -1
  141. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.generateAndroidVersionCode.html +1 -1
  142. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyAndroidManifest.html +1 -1
  143. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyConfigXml.html +1 -1
  144. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyGradleConfig.html +1 -1
  145. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyInfoPlist.html +1 -1
  146. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyXcodeProjectFile.html +1 -1
  147. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepAppIcon.html +1 -1
  148. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareAppIcon.html +1 -1
  149. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareBuildDir.html +1 -1
  150. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareExportOptionsPlist.html +1 -1
  151. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareSplashIcon.html +1 -1
  152. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareSplashPage.html +1 -1
  153. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeCapacitorConfig.html +1 -1
  154. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeCfgFile.html +1 -1
  155. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeDataExtractionRules.html +1 -1
  156. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeNetworkSecurityConfig.html +1 -1
  157. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writePodfile.html +1 -1
  158. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writePrivacyInfo.html +1 -1
  159. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.bundleMobileAppCode.html +1 -1
  160. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.bundlePackagesAndPlugins.html +1 -1
  161. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.copyMobileAppDirs.html +1 -1
  162. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.copyPublicDirs.html +1 -1
  163. package/docs/functions/_saltcorn_sqlite.add_index.html +1 -1
  164. package/docs/functions/_saltcorn_sqlite.add_unique_constraint.html +1 -1
  165. package/docs/functions/_saltcorn_sqlite.begin.html +1 -1
  166. package/docs/functions/_saltcorn_sqlite.changeConnection.html +1 -1
  167. package/docs/functions/_saltcorn_sqlite.close.html +1 -1
  168. package/docs/functions/_saltcorn_sqlite.commit.html +1 -1
  169. package/docs/functions/_saltcorn_sqlite.count.html +1 -1
  170. package/docs/functions/_saltcorn_sqlite.deleteWhere.html +1 -1
  171. package/docs/functions/_saltcorn_sqlite.dropTable.html +1 -1
  172. package/docs/functions/_saltcorn_sqlite.dropTables.html +1 -1
  173. package/docs/functions/_saltcorn_sqlite.drop_index.html +1 -1
  174. package/docs/functions/_saltcorn_sqlite.drop_reset_schema.html +1 -1
  175. package/docs/functions/_saltcorn_sqlite.drop_unique_constraint.html +1 -1
  176. package/docs/functions/_saltcorn_sqlite.getVersion.html +1 -1
  177. package/docs/functions/_saltcorn_sqlite.get_db_filepath.html +1 -1
  178. package/docs/functions/_saltcorn_sqlite.get_sql_logging.html +1 -1
  179. package/docs/functions/_saltcorn_sqlite.init.html +1 -1
  180. package/docs/functions/_saltcorn_sqlite.insert.html +1 -1
  181. package/docs/functions/_saltcorn_sqlite.listScTables.html +1 -1
  182. package/docs/functions/_saltcorn_sqlite.listTables.html +1 -1
  183. package/docs/functions/_saltcorn_sqlite.listUserDefinedTables.html +1 -1
  184. package/docs/functions/_saltcorn_sqlite.query.html +1 -1
  185. package/docs/functions/_saltcorn_sqlite.rollback.html +1 -1
  186. package/docs/functions/_saltcorn_sqlite.select.html +1 -1
  187. package/docs/functions/_saltcorn_sqlite.selectMaybeOne.html +1 -1
  188. package/docs/functions/_saltcorn_sqlite.selectOne.html +1 -1
  189. package/docs/functions/_saltcorn_sqlite.set_sql_logging.html +1 -1
  190. package/docs/functions/_saltcorn_sqlite.sql_log.html +1 -1
  191. package/docs/functions/_saltcorn_sqlite.update.html +1 -1
  192. package/docs/functions/_saltcorn_sqlite.updateWhere.html +1 -1
  193. package/docs/functions/_saltcorn_sqlite_mobile.add_index.html +1 -1
  194. package/docs/functions/_saltcorn_sqlite_mobile.add_unique_constraint.html +1 -1
  195. package/docs/functions/_saltcorn_sqlite_mobile.count.html +1 -1
  196. package/docs/functions/_saltcorn_sqlite_mobile.deleteWhere.html +1 -1
  197. package/docs/functions/_saltcorn_sqlite_mobile.drop_index.html +1 -1
  198. package/docs/functions/_saltcorn_sqlite_mobile.drop_reset_schema.html +1 -1
  199. package/docs/functions/_saltcorn_sqlite_mobile.drop_unique_constraint.html +1 -1
  200. package/docs/functions/_saltcorn_sqlite_mobile.init.html +1 -1
  201. package/docs/functions/_saltcorn_sqlite_mobile.insert.html +1 -1
  202. package/docs/functions/_saltcorn_sqlite_mobile.insertRows.html +1 -1
  203. package/docs/functions/_saltcorn_sqlite_mobile.listScTables.html +1 -1
  204. package/docs/functions/_saltcorn_sqlite_mobile.listTables.html +1 -1
  205. package/docs/functions/_saltcorn_sqlite_mobile.listUserDefinedTables.html +1 -1
  206. package/docs/functions/_saltcorn_sqlite_mobile.query.html +1 -1
  207. package/docs/functions/_saltcorn_sqlite_mobile.select.html +1 -1
  208. package/docs/functions/_saltcorn_sqlite_mobile.selectMaybeOne.html +1 -1
  209. package/docs/functions/_saltcorn_sqlite_mobile.selectOne.html +1 -1
  210. package/docs/functions/_saltcorn_sqlite_mobile.setConnectionObject.html +1 -1
  211. package/docs/functions/_saltcorn_sqlite_mobile.tableExists.html +1 -1
  212. package/docs/functions/_saltcorn_sqlite_mobile.time.html +1 -1
  213. package/docs/functions/_saltcorn_sqlite_mobile.update.html +1 -1
  214. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_field.instanceOfField.html +1 -1
  215. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_page.instanceOfPage.html +1 -1
  216. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_view.instanceOfView.html +1 -1
  217. package/docs/functions/_saltcorn_types.Types.base_types.instanceOWithHtmlFile.html +1 -1
  218. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfErrorMsg.html +1 -1
  219. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfSuccessMsg.html +1 -1
  220. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfType.html +1 -1
  221. package/docs/functions/_saltcorn_types.generators.generateBool.html +1 -1
  222. package/docs/functions/_saltcorn_types.generators.generateString.html +1 -1
  223. package/docs/functions/_saltcorn_types.generators.num_between.html +1 -1
  224. package/docs/functions/_saltcorn_types.generators.oneOf.html +1 -1
  225. package/docs/interfaces/_saltcorn_mobile_builder.common_build_utils.ScCapacitorConfig.html +10 -10
  226. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_field.AbstractField.html +15 -15
  227. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_field.AbstractFieldRepeat.html +3 -3
  228. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_form.AbstractForm.html +27 -27
  229. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_page.AbstractPage.html +7 -7
  230. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_role.AbstractRole.html +3 -3
  231. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_table.AbstractTable.html +11 -11
  232. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_trigger.AbstractTrigger.html +38 -16
  233. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_view.AbstractView.html +10 -10
  234. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_workflow.AbstractWorkflow.html +13 -13
  235. package/docs/modules/_saltcorn_admin_models.backup.html +1 -1
  236. package/docs/modules/_saltcorn_admin_models.html +1 -1
  237. package/docs/modules/_saltcorn_admin_models.pack.html +1 -1
  238. package/docs/modules/_saltcorn_admin_models.tenant.html +1 -1
  239. package/docs/modules/_saltcorn_common_code.html +1 -1
  240. package/docs/modules/_saltcorn_data.html +3 -3
  241. package/docs/modules/_saltcorn_data.models.EventLog.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.View.html +2 -2
  247. package/docs/modules/_saltcorn_data.models.config.html +1 -1
  248. package/docs/modules/_saltcorn_data.models.discovery.html +1 -1
  249. package/docs/modules/_saltcorn_data.models.email.html +1 -1
  250. package/docs/modules/_saltcorn_data.models.expression.html +1 -1
  251. package/docs/modules/_saltcorn_data.models.html +1 -1
  252. package/docs/modules/_saltcorn_data.models.layout.html +1 -1
  253. package/docs/modules/_saltcorn_data.models.random.html +1 -1
  254. package/docs/modules/_saltcorn_data.models.scheduler.html +1 -1
  255. package/docs/modules/_saltcorn_data.plugin_helper.html +1 -1
  256. package/docs/modules/_saltcorn_data.utils.html +3 -1
  257. package/docs/modules/_saltcorn_db_common.html +4 -2
  258. package/docs/modules/_saltcorn_db_common.multi_tenant.html +2 -1
  259. package/docs/modules/_saltcorn_markup.html +2 -2
  260. package/docs/modules/_saltcorn_mobile_builder.common_build_utils.html +1 -1
  261. package/docs/modules/_saltcorn_mobile_builder.html +1 -1
  262. package/docs/modules/_saltcorn_mobile_builder.package_bundle_utils.html +1 -1
  263. package/docs/modules/_saltcorn_sqlite.html +1 -1
  264. package/docs/modules/_saltcorn_sqlite_mobile.html +1 -1
  265. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_field.html +1 -1
  266. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_form.html +1 -1
  267. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_library.html +1 -1
  268. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_page.html +1 -1
  269. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_plugin.html +1 -1
  270. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_role.html +1 -1
  271. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_table.html +1 -1
  272. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_trigger.html +1 -1
  273. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_view.html +1 -1
  274. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_workflow.html +1 -1
  275. package/docs/modules/_saltcorn_types.ModelAbstracts.html +1 -1
  276. package/docs/modules/_saltcorn_types.Types.base_types.html +1 -1
  277. package/docs/modules/_saltcorn_types.Types.common_types.html +1 -1
  278. package/docs/modules/_saltcorn_types.Types.html +1 -1
  279. package/docs/modules/_saltcorn_types.generators.html +1 -1
  280. package/docs/modules/_saltcorn_types.html +1 -1
  281. package/docs/types/_saltcorn_data.models.EventLog.EventLogCfg.html +1 -1
  282. package/docs/types/_saltcorn_data.models.File.FileCfg.html +1 -1
  283. package/docs/types/_saltcorn_data.models.Form.AdditionalButton.html +1 -1
  284. package/docs/types/_saltcorn_data.models.Form.FormCfg.html +1 -1
  285. package/docs/types/_saltcorn_data.models.PageGroup.ScreenInfoParams.html +1 -1
  286. package/docs/types/_saltcorn_data.models.Table.ChildRelations.html +1 -1
  287. package/docs/types/_saltcorn_data.models.Table.ParentRelations.html +1 -1
  288. package/docs/types/_saltcorn_data.models.Table.RelationData.html +1 -1
  289. package/docs/types/_saltcorn_data.models.View.FindViewsPred.html +1 -1
  290. package/docs/types/_saltcorn_db_common.AggregationOptions.html +2 -1
  291. package/docs/types/_saltcorn_db_common.CoordOpts.html +2 -1
  292. package/docs/types/_saltcorn_db_common.DatabaseClient.html +2 -1
  293. package/docs/types/_saltcorn_db_common.JoinField.html +2 -1
  294. package/docs/types/_saltcorn_db_common.JoinFields.html +2 -1
  295. package/docs/types/_saltcorn_db_common.JoinOptions.html +2 -1
  296. package/docs/types/_saltcorn_db_common.JsonPath.html +2 -1
  297. package/docs/types/_saltcorn_db_common.JsonPathElem.html +2 -1
  298. package/docs/types/_saltcorn_db_common.Operator.html +2 -1
  299. package/docs/types/_saltcorn_db_common.PartialSome.html +2 -1
  300. package/docs/types/_saltcorn_db_common.PrimaryKeyValue.html +2 -1
  301. package/docs/types/_saltcorn_db_common.Row.html +2 -1
  302. package/docs/types/_saltcorn_db_common.SelectOptions.html +2 -1
  303. package/docs/types/_saltcorn_db_common.SqlAndValues.html +2 -1
  304. package/docs/types/_saltcorn_db_common.StrongRow.html +2 -1
  305. package/docs/types/_saltcorn_db_common.SubselectOptions.html +2 -1
  306. package/docs/types/_saltcorn_db_common.Value.html +2 -1
  307. package/docs/types/_saltcorn_db_common.Where.html +2 -1
  308. package/docs/types/_saltcorn_mobile_builder.IosCfg.html +1 -1
  309. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_field.FieldCfg.html +1 -1
  310. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_field.InputType.html +1 -1
  311. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_form.AdditionalButton.html +1 -1
  312. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_library.LibraryCfg.html +1 -1
  313. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_library.LibraryPack.html +1 -1
  314. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_page.PageCfg.html +1 -1
  315. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_page.PagePack.html +1 -1
  316. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_plugin.PluginCfg.html +1 -1
  317. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_plugin.PluginPack.html +1 -1
  318. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_role.RoleCfg.html +1 -1
  319. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_role.RolePack.html +1 -1
  320. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_table.TableCfg.html +1 -1
  321. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_table.TablePack.html +1 -1
  322. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_trigger.TriggerCfg.html +1 -1
  323. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_trigger.TriggerPack.html +1 -1
  324. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_view.ViewCfg.html +1 -1
  325. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_view.ViewPack.html +1 -1
  326. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_workflow.ConfigWorkflowStep.html +1 -1
  327. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_workflow.RunResult.html +1 -1
  328. package/docs/types/_saltcorn_types.Types.base_types.Action.html +11 -3
  329. package/docs/types/_saltcorn_types.Types.base_types.AuthenticationMethod.html +1 -1
  330. package/docs/types/_saltcorn_types.Types.base_types.CalcJoinfield.html +1 -1
  331. package/docs/types/_saltcorn_types.Types.base_types.CapacitorPlugin.html +1 -1
  332. package/docs/types/_saltcorn_types.Types.base_types.CodePagePack.html +1 -1
  333. package/docs/types/_saltcorn_types.Types.base_types.Column.html +1 -1
  334. package/docs/types/_saltcorn_types.Types.base_types.ConnectObjType.html +4 -2
  335. package/docs/types/_saltcorn_types.Types.base_types.ConnectedObjects.html +1 -1
  336. package/docs/types/_saltcorn_types.Types.base_types.CopilotSkill.html +1 -1
  337. package/docs/types/_saltcorn_types.Types.base_types.ErrorObj.html +1 -1
  338. package/docs/types/_saltcorn_types.Types.base_types.FieldLike.html +1 -1
  339. package/docs/types/_saltcorn_types.Types.base_types.FieldView.html +1 -1
  340. package/docs/types/_saltcorn_types.Types.base_types.Header.html +1 -1
  341. package/docs/types/_saltcorn_types.Types.base_types.JoinFieldOption.html +1 -1
  342. package/docs/types/_saltcorn_types.Types.base_types.Layout.html +1 -1
  343. package/docs/types/_saltcorn_types.Types.base_types.MobileConfig.html +1 -1
  344. package/docs/types/_saltcorn_types.Types.base_types.ModelPattern.html +1 -1
  345. package/docs/types/_saltcorn_types.Types.base_types.Pack.html +1 -1
  346. package/docs/types/_saltcorn_types.Types.base_types.Plugin.html +1 -1
  347. package/docs/types/_saltcorn_types.Types.base_types.PluginFunction.html +1 -1
  348. package/docs/types/_saltcorn_types.Types.base_types.PluginLayout.html +1 -1
  349. package/docs/types/_saltcorn_types.Types.base_types.PluginRoute.html +1 -1
  350. package/docs/types/_saltcorn_types.Types.base_types.PluginSourceType.html +1 -1
  351. package/docs/types/_saltcorn_types.Types.base_types.PluginType.html +1 -1
  352. package/docs/types/_saltcorn_types.Types.base_types.PluginWrap.html +1 -1
  353. package/docs/types/_saltcorn_types.Types.base_types.PluginWrapArg.html +1 -1
  354. package/docs/types/_saltcorn_types.Types.base_types.RelationOption.html +1 -1
  355. package/docs/types/_saltcorn_types.Types.base_types.Req.html +1 -1
  356. package/docs/types/_saltcorn_types.Types.base_types.Res.html +1 -1
  357. package/docs/types/_saltcorn_types.Types.base_types.ResultType.html +1 -1
  358. package/docs/types/_saltcorn_types.Types.base_types.RouteAction.html +1 -1
  359. package/docs/types/_saltcorn_types.Types.base_types.RunExtra.html +1 -1
  360. package/docs/types/_saltcorn_types.Types.base_types.SlugStepType.html +1 -1
  361. package/docs/types/_saltcorn_types.Types.base_types.StepResType.html +1 -1
  362. package/docs/types/_saltcorn_types.Types.base_types.SubField.html +1 -1
  363. package/docs/types/_saltcorn_types.Types.base_types.TableProvider.html +1 -1
  364. package/docs/types/_saltcorn_types.Types.base_types.TableQuery.html +1 -1
  365. package/docs/types/_saltcorn_types.Types.base_types.Tablely.html +1 -1
  366. package/docs/types/_saltcorn_types.Types.base_types.ViewTemplate.html +1 -1
  367. package/docs/types/_saltcorn_types.Types.common_types.ErrorMessage.html +1 -1
  368. package/docs/types/_saltcorn_types.Types.common_types.GenObj.html +1 -1
  369. package/docs/types/_saltcorn_types.Types.common_types.ReqRes.html +1 -1
  370. package/docs/types/_saltcorn_types.Types.common_types.ResultMessage.html +1 -1
  371. package/docs/types/_saltcorn_types.Types.common_types.SuccessMessage.html +1 -1
  372. package/docs/types/_saltcorn_types.Types.common_types.Type.html +1 -1
  373. package/docs/variables/_saltcorn_data.db.html +1 -1
  374. package/docs/variables/_saltcorn_data.migrations.html +1 -1
  375. package/docs/variables/_saltcorn_data.models.config.available_languages.html +1 -1
  376. package/docs/variables/_saltcorn_data.models.config.configTypes.html +1 -1
  377. package/docs/variables/_saltcorn_data.models.scheduler.runScheduler.html +1 -1
  378. package/docs/variables/_saltcorn_data.plugin_helper.run_action_column.html +1 -1
  379. package/docs/variables/_saltcorn_data.utils.NotAuthorized.html +2 -1
  380. package/docs/variables/_saltcorn_data.utils.isPushEnabled.html +67 -0
  381. package/docs/variables/_saltcorn_data.utils.sleep.html +2 -1
  382. package/docs/variables/_saltcorn_db_common.multi_tenant.tenantNamespace.html +2 -1
  383. package/help/JavaScript action code.tmd +10 -0
  384. package/locales/en.json +32 -1
  385. package/package.json +9 -9
  386. package/public/log_viewer_utils.js +3 -2
  387. package/public/saltcorn-common.js +100 -31
  388. package/public/saltcorn.css +16 -0
  389. package/public/saltcorn.js +8 -0
  390. package/routes/actions.js +17 -1
  391. package/routes/admin.js +5 -3
  392. package/routes/common_lists.js +8 -1
  393. package/routes/eventlog.js +20 -0
  394. package/routes/fields.js +10 -2
  395. package/routes/menu.js +98 -6
  396. package/routes/notifications.js +39 -11
  397. package/routes/page.js +4 -1
  398. package/routes/pageedit.js +4 -1
  399. package/routes/plugins.js +8 -7
  400. package/routes/tables.js +11 -0
  401. package/routes/view.js +12 -3
  402. package/serve.js +76 -21
  403. package/tests/admin.test.js +3 -3
  404. package/tests/auth.test.js +1 -0
  405. package/tests/viewedit.test.js +2 -0
  406. package/wrapper.js +26 -193
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@saltcorn/server",
3
- "version": "1.3.1-beta.0",
3
+ "version": "1.3.1-beta.10",
4
4
  "description": "Server app for Saltcorn, open-source no-code platform",
5
5
  "homepage": "https://saltcorn.com",
6
6
  "main": "index.js",
@@ -8,14 +8,14 @@
8
8
  "dependencies": {
9
9
  "@aws-sdk/client-s3": "^3.735.0",
10
10
  "@dr.pogodin/csurf": "1.15.0",
11
- "@saltcorn/admin-models": "1.3.1-beta.0",
12
- "@saltcorn/base-plugin": "1.3.1-beta.0",
13
- "@saltcorn/builder": "1.3.1-beta.0",
14
- "@saltcorn/data": "1.3.1-beta.0",
15
- "@saltcorn/filemanager": "1.3.1-beta.0",
16
- "@saltcorn/markup": "1.3.1-beta.0",
17
- "@saltcorn/plugins-loader": "1.3.1-beta.0",
18
- "@saltcorn/sbadmin2": "1.3.1-beta.0",
11
+ "@saltcorn/admin-models": "1.3.1-beta.10",
12
+ "@saltcorn/base-plugin": "1.3.1-beta.10",
13
+ "@saltcorn/builder": "1.3.1-beta.10",
14
+ "@saltcorn/data": "1.3.1-beta.10",
15
+ "@saltcorn/filemanager": "1.3.1-beta.10",
16
+ "@saltcorn/markup": "1.3.1-beta.10",
17
+ "@saltcorn/plugins-loader": "1.3.1-beta.10",
18
+ "@saltcorn/sbadmin2": "1.3.1-beta.10",
19
19
  "@socket.io/cluster-adapter": "^0.2.1",
20
20
  "@socket.io/sticky": "^1.0.1",
21
21
  "adm-zip": "0.5.16",
@@ -172,7 +172,7 @@ var logViewerHelpers = (() => {
172
172
  }
173
173
  }, 5000);
174
174
  try {
175
- socket = io({ transports: ["websocket"] });
175
+ socket = window.get_shared_socket();
176
176
  } catch (e) {
177
177
  notifyAlert({
178
178
  type: "danger",
@@ -180,7 +180,8 @@ var logViewerHelpers = (() => {
180
180
  });
181
181
  }
182
182
  startTrackingMsg();
183
- socket.on("connect", () => handleConnect(socket));
183
+ if (socket.connected) handleConnect(socket);
184
+ else socket.on("connect", () => handleConnect(socket));
184
185
  socket.on("disconnect", handleDisconnect);
185
186
  socket.on("log_msg", handleLogMsg);
186
187
  socket.on("test_conn_msg", handleTestConnMsg);
@@ -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("?") ? "&" : "?";
@@ -172,6 +172,17 @@ const global_fetch_options_cache = {};
172
172
 
173
173
  function apply_showif() {
174
174
  const isNode = getIsNode();
175
+ $(".toggle-password-vis")
176
+ .off("click")
177
+ .on("click", function (event) {
178
+ const $e = $(event.target);
179
+ const eyeIcon = $e.prop("tagName") === "I" ? $e : $e.find("i");
180
+ const passwordInput = eyeIcon.parent().prev();
181
+
182
+ const isPassword = passwordInput.attr("type") === "password";
183
+ passwordInput.attr("type", isPassword ? "text" : "password");
184
+ eyeIcon.toggleClass("fa-eye fa-eye-slash");
185
+ });
175
186
  $("[data-show-if]").each(function (ix, element) {
176
187
  var e = $(element);
177
188
  try {
@@ -1688,10 +1699,13 @@ function notifyAlert(note, spin) {
1688
1699
  if ($modal.length && $modal.hasClass("show"))
1689
1700
  $("#modal-toasts-area").append(html);
1690
1701
  else $("#toasts-area").append(html);
1691
- if (type === "success") {
1692
- setTimeout(() => {
1693
- $(`#${id}`).removeClass("show");
1694
- }, 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
+ );
1695
1709
  }
1696
1710
  }
1697
1711
 
@@ -1712,6 +1726,8 @@ function press_store_button(clicked, keepOld, disable) {
1712
1726
  .html('<i class="fas fa-spinner fa-spin"></i>')
1713
1727
  .width(width)
1714
1728
  .height(height);
1729
+ $(document).trigger("activate-spinner", $(btn));
1730
+ $(btn).trigger("spin");
1715
1731
  setTimeout(() => {
1716
1732
  $(btn).prop("disabled", true);
1717
1733
  }, 50);
@@ -1740,6 +1756,9 @@ async function common_done(res, viewnameOrElem0, isWeb = true) {
1740
1756
  .attr("data-sc-embed-viewname");
1741
1757
  if (window._sc_loglevel > 4)
1742
1758
  console.log("ajax result directives", viewname, res);
1759
+
1760
+ if (res.page_load_tag && res.page_load_tag !== _sc_pageloadtag) return;
1761
+
1743
1762
  const handle = async (element, fn) => {
1744
1763
  if (Array.isArray(element))
1745
1764
  for (const current of element) await fn(current);
@@ -1765,17 +1784,32 @@ async function common_done(res, viewnameOrElem0, isWeb = true) {
1765
1784
  };
1766
1785
  if (res.notify)
1767
1786
  await handle(res.notify, (text) =>
1768
- 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
+ })
1769
1793
  );
1770
1794
  if (res.error) {
1771
1795
  if (window._sc_loglevel > 4) console.trace("error response", res.error);
1772
1796
  await handle(res.error, (text) =>
1773
- 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
+ })
1774
1803
  );
1775
1804
  }
1776
1805
  if (res.notify_success)
1777
1806
  await handle(res.notify_success, (text) =>
1778
- 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
+ })
1779
1813
  );
1780
1814
  if (res.set_fields && (viewname || res.set_fields._viewname)) {
1781
1815
  const form =
@@ -1810,10 +1844,10 @@ async function common_done(res, viewnameOrElem0, isWeb = true) {
1810
1844
  input.attr("data-selected", res.set_fields[k]);
1811
1845
  }
1812
1846
 
1813
- input.trigger("set_form_field");
1847
+ input.trigger("set_form_field", { no_onchange: res.no_onchange });
1814
1848
  });
1815
1849
  }
1816
- form.trigger("change");
1850
+ if (!res.no_onchange) form.trigger("change");
1817
1851
  }
1818
1852
 
1819
1853
  if (res.download) {
@@ -2044,17 +2078,24 @@ function room_older(viewname, room_id, btn) {
2044
2078
  );
2045
2079
  }
2046
2080
 
2047
- function init_room(viewname, room_id) {
2048
- let socket = null;
2049
- if (parent?.saltcorn?.data?.state) {
2050
- const { server_path, jwt } =
2051
- parent.saltcorn.data.state.getState().mobileConfig;
2052
- socket = io(server_path, {
2053
- query: `jwt=${jwt}`,
2054
- transports: ["websocket"],
2055
- });
2056
- } 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
+ }
2057
2096
 
2097
+ function init_room(viewname, room_id) {
2098
+ let socket = get_shared_socket();
2058
2099
  socket.emit("join_room", [viewname, room_id]);
2059
2100
  socket.on("message", (msg) => {
2060
2101
  if (msg.not_for_user_id) {
@@ -2077,24 +2118,46 @@ function init_room(viewname, room_id) {
2077
2118
  }
2078
2119
 
2079
2120
  function init_collab_room(viewname, eventCfgs) {
2080
- const socket = io({ transports: ["websocket"] });
2121
+ let socket = get_shared_socket();
2081
2122
  for (const [event, callback] of Object.entries(eventCfgs.events)) {
2082
2123
  socket.on(event, callback);
2083
2124
  }
2084
- socket.on("connect", function () {
2125
+ const joinFn = () => {
2085
2126
  socket.emit("join_collab_room", viewname, (ack) => {
2086
- if (ack && ack.status === "ok") {
2127
+ if (ack && ack.status === "ok")
2087
2128
  console.log(`Joined collaboration room for view '${viewname}'`);
2088
- } else {
2089
- console.error("Failed to join collaboration room:", ack);
2090
- }
2129
+ else console.error("Failed to join collaboration room:", ack);
2091
2130
  });
2092
- });
2131
+ };
2132
+ if (socket.connected) joinFn();
2133
+ else socket.on("connect", joinFn);
2093
2134
  socket.on("disconnect", function () {
2094
2135
  console.log("Disconnected from the server");
2095
2136
  });
2096
2137
  }
2097
2138
 
2139
+ function init_dynamic_update_room() {
2140
+ if (
2141
+ !window.io ||
2142
+ navigator.userAgent.includes("jsdom") ||
2143
+ !dynamic_updates_cfg?.enabled
2144
+ )
2145
+ return;
2146
+ let socket = get_shared_socket();
2147
+ socket.on("dynamic_update", async (data) => {
2148
+ await common_done(data);
2149
+ });
2150
+ const joinFn = () => {
2151
+ socket.emit("join_dynamic_update_room", (ack) => {
2152
+ if (ack && ack.status === "ok") {
2153
+ if (window._sc_loglevel > 5) console.log("Joined dynamic update room");
2154
+ } else console.error("Failed to join dynamic update room:", ack);
2155
+ });
2156
+ };
2157
+ if (socket.connected) joinFn();
2158
+ else socket.on("connect", joinFn);
2159
+ }
2160
+
2098
2161
  function cancel_form(form) {
2099
2162
  if (!form) return;
2100
2163
  $(form).trigger("reset");
@@ -2140,7 +2203,7 @@ function check_saltcorn_notifications() {
2140
2203
  .then((resp) => {
2141
2204
  if (resp.success) {
2142
2205
  const n = resp.success;
2143
- const menu_item = $(`a.notify-menu-item`);
2206
+ const menu_item = $('a[href="/notifications"]');
2144
2207
 
2145
2208
  menu_item.html(
2146
2209
  `<i class="fa-fw mr-05 fas fa-bell"></i>Notifications (${n})`
@@ -2542,3 +2605,9 @@ async function initPushNotify() {
2542
2605
  console.error("Push notification initialization failed:", error);
2543
2606
  }
2544
2607
  }
2608
+
2609
+ if (document.readyState !== "loading") {
2610
+ init_dynamic_update_room();
2611
+ } else {
2612
+ document.addEventListener("DOMContentLoaded", init_dynamic_update_room);
2613
+ }
@@ -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;
@@ -838,3 +850,7 @@ input[type="file"].file-has-existing {
838
850
  ::file-selector-button {
839
851
  font-size: initial;
840
852
  }
853
+
854
+ .toggle-password-vis {
855
+ cursor: pointer;
856
+ }
@@ -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
  })
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) {
@@ -1795,7 +1809,9 @@ router.get(
1795
1809
  try {
1796
1810
  const form = await getWorkflowStepUserForm(run, trigger, step, req);
1797
1811
  if (req.xhr) form.xhrSubmit = true;
1798
- const title = run.wait_info.output ? "Workflow output" : "Fill form";
1812
+ const title =
1813
+ step.configuration?.popup_title ||
1814
+ (run.wait_info.output ? "Workflow output" : "Fill form");
1799
1815
  res.sendWrap(title, renderForm(form, req.csrfToken()));
1800
1816
  } catch (e) {
1801
1817
  console.error(e);
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");
@@ -4126,6 +4127,8 @@ router.post(
4126
4127
  await db.deleteWhere("_sc_config", { not: { key: "letsencrypt" } });
4127
4128
  }
4128
4129
  await getState().refresh();
4130
+ await require("@saltcorn/data/standard-menu")();
4131
+
4129
4132
  if (form.values.users) {
4130
4133
  await db.deleteWhere("_sc_notifications");
4131
4134
 
@@ -4532,7 +4535,6 @@ admin_config_route({
4532
4535
  path: "/notifications",
4533
4536
  super_path: "/admin",
4534
4537
  field_names: [
4535
- "notification_in_menu",
4536
4538
  { section_header: "Progressive Web Application" },
4537
4539
  "pwa_enabled",
4538
4540
  { 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
@@ -1433,8 +1433,16 @@ router.post(
1433
1433
  const inboundTable = Table.findOne(inboundTableName);
1434
1434
  field = inboundTable.getField(refField);
1435
1435
  }
1436
-
1436
+ if (
1437
+ !field &&
1438
+ table.name === "users" &&
1439
+ ["passwordRepeat", "password"].includes(fieldName)
1440
+ ) {
1441
+ field = new Field({ name: fieldName, type: "String" });
1442
+ }
1437
1443
  if (!field) {
1444
+ console.log("no field");
1445
+
1438
1446
  res.send(req.query?.accept == "json" ? "[]" : "");
1439
1447
  return;
1440
1448
  }
@@ -1522,7 +1530,7 @@ router.post(
1522
1530
  const table = Table.findOne({ name: table_name });
1523
1531
  const field = table.getField(field_name);
1524
1532
  let val = field.type?.read
1525
- ? field.type?.read(req.body[field_name])
1533
+ ? field.type?.read(req.body[field_name], field.attributes)
1526
1534
  : req.body[field_name];
1527
1535
  await db.withTransaction(async () => {
1528
1536
  await table.updateRow({ [field_name]: val }, pk, req.user);