@saltcorn/server 1.1.3-beta.8 → 1.1.3-rc.0

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 (413) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/auth/admin.js +2 -0
  3. package/auth/resetpw.js +37 -9
  4. package/auth/roleadmin.js +52 -0
  5. package/auth/routes.js +9 -2
  6. package/docs/assets/search.js +1 -1
  7. package/docs/classes/_saltcorn_common_code.Relation.html +8 -8
  8. package/docs/classes/_saltcorn_common_code.RelationsFinder.html +5 -5
  9. package/docs/classes/_saltcorn_data.models.Crash-1.html +18 -18
  10. package/docs/classes/_saltcorn_data.models.EventLog-1.html +19 -19
  11. package/docs/classes/_saltcorn_data.models.Field.html +71 -71
  12. package/docs/classes/_saltcorn_data.models.FieldRepeat-1.html +17 -17
  13. package/docs/classes/_saltcorn_data.models.File-1.html +48 -48
  14. package/docs/classes/_saltcorn_data.models.Form-1.html +38 -38
  15. package/docs/classes/_saltcorn_data.models.Library.html +13 -13
  16. package/docs/classes/_saltcorn_data.models.Page.html +23 -23
  17. package/docs/classes/_saltcorn_data.models.PageGroup-1.html +25 -25
  18. package/docs/classes/_saltcorn_data.models.Plugin.html +25 -25
  19. package/docs/classes/_saltcorn_data.models.Role.html +9 -9
  20. package/docs/classes/_saltcorn_data.models.Table-1.html +90 -90
  21. package/docs/classes/_saltcorn_data.models.TableConstraint-1.html +14 -14
  22. package/docs/classes/_saltcorn_data.models.Trigger.html +34 -34
  23. package/docs/classes/_saltcorn_data.models.User-1.html +63 -48
  24. package/docs/classes/_saltcorn_data.models.View-1.html +51 -51
  25. package/docs/classes/_saltcorn_data.models.Workflow-1.html +17 -17
  26. package/docs/classes/_saltcorn_data.models.WorkflowRun.html +35 -35
  27. package/docs/classes/_saltcorn_data.models.WorkflowStep.html +25 -25
  28. package/docs/classes/_saltcorn_data.models.WorkflowTrace.html +18 -18
  29. package/docs/classes/_saltcorn_mobile_builder.MobileBuilder.html +36 -43
  30. package/docs/enums/_saltcorn_common_code.RelationType.html +7 -7
  31. package/docs/enums/_saltcorn_common_code.ViewDisplayType.html +4 -4
  32. package/docs/functions/_saltcorn_admin_models.backup.create_backup.html +1 -1
  33. package/docs/functions/_saltcorn_admin_models.backup.create_csv_from_rows.html +1 -1
  34. package/docs/functions/_saltcorn_admin_models.backup.restore.html +1 -1
  35. package/docs/functions/_saltcorn_admin_models.pack.add_to_menu.html +1 -1
  36. package/docs/functions/_saltcorn_admin_models.pack.can_install_pack.html +1 -1
  37. package/docs/functions/_saltcorn_admin_models.pack.fetch_available_packs.html +1 -1
  38. package/docs/functions/_saltcorn_admin_models.pack.fetch_pack_by_name.html +1 -1
  39. package/docs/functions/_saltcorn_admin_models.pack.install_pack.html +1 -1
  40. package/docs/functions/_saltcorn_admin_models.pack.library_pack.html +1 -1
  41. package/docs/functions/_saltcorn_admin_models.pack.model_instance_pack.html +1 -1
  42. package/docs/functions/_saltcorn_admin_models.pack.model_pack.html +1 -1
  43. package/docs/functions/_saltcorn_admin_models.pack.page_group_pack.html +1 -1
  44. package/docs/functions/_saltcorn_admin_models.pack.page_pack.html +1 -1
  45. package/docs/functions/_saltcorn_admin_models.pack.plugin_pack.html +1 -1
  46. package/docs/functions/_saltcorn_admin_models.pack.role_pack.html +1 -1
  47. package/docs/functions/_saltcorn_admin_models.pack.table_pack.html +1 -1
  48. package/docs/functions/_saltcorn_admin_models.pack.trigger_pack.html +1 -1
  49. package/docs/functions/_saltcorn_admin_models.pack.uninstall_pack.html +1 -1
  50. package/docs/functions/_saltcorn_admin_models.pack.view_pack.html +1 -1
  51. package/docs/functions/_saltcorn_admin_models.tenant.copy_tenant_template.html +1 -1
  52. package/docs/functions/_saltcorn_admin_models.tenant.create_tenant.html +1 -1
  53. package/docs/functions/_saltcorn_admin_models.tenant.deleteTenant.html +1 -1
  54. package/docs/functions/_saltcorn_admin_models.tenant.domain_sanitize.html +1 -1
  55. package/docs/functions/_saltcorn_admin_models.tenant.eachTenant.html +1 -1
  56. package/docs/functions/_saltcorn_admin_models.tenant.getAllTenantRows.html +1 -1
  57. package/docs/functions/_saltcorn_admin_models.tenant.getAllTenants.html +1 -1
  58. package/docs/functions/_saltcorn_admin_models.tenant.insertTenant.html +1 -1
  59. package/docs/functions/_saltcorn_admin_models.tenant.switchToTenant.html +1 -1
  60. package/docs/functions/_saltcorn_common_code.buildTableCaches.html +1 -1
  61. package/docs/functions/_saltcorn_common_code.parseLegacyRelation.html +1 -1
  62. package/docs/functions/_saltcorn_common_code.parseRelationPath.html +1 -1
  63. package/docs/functions/_saltcorn_data.models.config.check_email_mask.html +1 -1
  64. package/docs/functions/_saltcorn_data.models.config.deleteConfig.html +1 -1
  65. package/docs/functions/_saltcorn_data.models.config.getAllConfig.html +1 -1
  66. package/docs/functions/_saltcorn_data.models.config.getConfig.html +1 -1
  67. package/docs/functions/_saltcorn_data.models.config.get_base_url.html +1 -1
  68. package/docs/functions/_saltcorn_data.models.config.get_latest_npm_version.html +1 -1
  69. package/docs/functions/_saltcorn_data.models.config.remove_from_menu.html +1 -1
  70. package/docs/functions/_saltcorn_data.models.config.save_menu_items.html +1 -1
  71. package/docs/functions/_saltcorn_data.models.config.setConfig.html +1 -1
  72. package/docs/functions/_saltcorn_data.models.discovery.discover_tables.html +1 -1
  73. package/docs/functions/_saltcorn_data.models.discovery.discoverable_tables.html +1 -1
  74. package/docs/functions/_saltcorn_data.models.discovery.findType.html +1 -1
  75. package/docs/functions/_saltcorn_data.models.discovery.get_existing_views.html +1 -1
  76. package/docs/functions/_saltcorn_data.models.discovery.implement_discovery.html +1 -1
  77. package/docs/functions/_saltcorn_data.models.email.getMailTransport.html +1 -1
  78. package/docs/functions/_saltcorn_data.models.email.send_verification_email.html +1 -1
  79. package/docs/functions/_saltcorn_data.models.email.viewToEmailHtml.html +1 -1
  80. package/docs/functions/_saltcorn_data.models.expression.apply_calculated_fields.html +1 -1
  81. package/docs/functions/_saltcorn_data.models.expression.apply_calculated_fields_stored.html +1 -1
  82. package/docs/functions/_saltcorn_data.models.expression.eval_expression.html +1 -1
  83. package/docs/functions/_saltcorn_data.models.expression.expressionValidator.html +1 -1
  84. package/docs/functions/_saltcorn_data.models.expression.get_async_expression_function.html +1 -1
  85. package/docs/functions/_saltcorn_data.models.expression.get_expression_function.html +1 -1
  86. package/docs/functions/_saltcorn_data.models.expression.jsexprToWhere.html +1 -1
  87. package/docs/functions/_saltcorn_data.models.expression.recalculate_for_stored.html +1 -1
  88. package/docs/functions/_saltcorn_data.models.expression.transform_for_async.html +1 -1
  89. package/docs/functions/_saltcorn_data.models.layout.eachView.html +1 -1
  90. package/docs/functions/_saltcorn_data.models.layout.getStringsForI18n.html +1 -1
  91. package/docs/functions/_saltcorn_data.models.layout.getViews.html +1 -1
  92. package/docs/functions/_saltcorn_data.models.layout.translateLayout.html +1 -1
  93. package/docs/functions/_saltcorn_data.models.layout.traverse.html +1 -1
  94. package/docs/functions/_saltcorn_data.models.layout.traverseSync.html +1 -1
  95. package/docs/functions/_saltcorn_data.models.random.all_views.html +1 -1
  96. package/docs/functions/_saltcorn_data.models.random.fill_table_row.html +1 -1
  97. package/docs/functions/_saltcorn_data.models.random.initial_view.html +1 -1
  98. package/docs/functions/_saltcorn_data.models.random.random_table.html +1 -1
  99. package/docs/functions/_saltcorn_db_common.buildInsertBulkSql.html +1 -1
  100. package/docs/functions/_saltcorn_db_common.buildInsertSql.html +1 -1
  101. package/docs/functions/_saltcorn_db_common.doCount.html +1 -1
  102. package/docs/functions/_saltcorn_db_common.doDeleteWhere.html +1 -1
  103. package/docs/functions/_saltcorn_db_common.doListScTables.html +1 -1
  104. package/docs/functions/_saltcorn_db_common.doListTables.html +1 -1
  105. package/docs/functions/_saltcorn_db_common.doListUserDefinedTables.html +1 -1
  106. package/docs/functions/_saltcorn_db_common.do_add_index.html +1 -1
  107. package/docs/functions/_saltcorn_db_common.do_drop_index.html +1 -1
  108. package/docs/functions/_saltcorn_db_common.ftsFieldsSqlExpr.html +1 -1
  109. package/docs/functions/_saltcorn_db_common.mkSelectOptions.html +1 -1
  110. package/docs/functions/_saltcorn_db_common.mkVal.html +1 -1
  111. package/docs/functions/_saltcorn_db_common.mkWhere.html +1 -1
  112. package/docs/functions/_saltcorn_db_common.multi_tenant.enable_multi_tenant.html +1 -1
  113. package/docs/functions/_saltcorn_db_common.multi_tenant.getTenantSchema.html +1 -1
  114. package/docs/functions/_saltcorn_db_common.multi_tenant.init.html +1 -1
  115. package/docs/functions/_saltcorn_db_common.multi_tenant.is_it_multi_tenant.html +1 -1
  116. package/docs/functions/_saltcorn_db_common.multi_tenant.runWithTenant.html +1 -1
  117. package/docs/functions/_saltcorn_db_common.orderByIsObject.html +1 -1
  118. package/docs/functions/_saltcorn_db_common.orderByIsOperator.html +1 -1
  119. package/docs/functions/_saltcorn_db_common.prefixFieldsInWhere.html +1 -1
  120. package/docs/functions/_saltcorn_db_common.reprAsJson.html +1 -1
  121. package/docs/functions/_saltcorn_db_common.single_tenant.enable_multi_tenant.html +1 -1
  122. package/docs/functions/_saltcorn_db_common.single_tenant.getTenantSchema.html +1 -1
  123. package/docs/functions/_saltcorn_db_common.single_tenant.init.html +1 -1
  124. package/docs/functions/_saltcorn_db_common.single_tenant.is_it_multi_tenant.html +1 -1
  125. package/docs/functions/_saltcorn_db_common.single_tenant.runWithTenant.html +1 -1
  126. package/docs/functions/_saltcorn_db_common.sqlBinOp.html +1 -1
  127. package/docs/functions/_saltcorn_db_common.sqlFun.html +1 -1
  128. package/docs/functions/_saltcorn_db_common.sqlsanitize.html +1 -1
  129. package/docs/functions/_saltcorn_db_common.sqlsanitizeAllowDots.html +1 -1
  130. package/docs/functions/_saltcorn_db_common.subSelectWhere.html +1 -1
  131. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.androidFeatures.html +95 -0
  132. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.androidPermissions.html +95 -0
  133. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.buildTablesFile.html +4 -2
  134. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyPrepopulatedDb.html +4 -2
  135. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyServerFiles.html +4 -2
  136. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyShareExtFiles.html +4 -2
  137. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copySiteLogo.html +4 -2
  138. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyTranslationFiles.html +4 -2
  139. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.createSqliteDb.html +4 -2
  140. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.decodeProvisioningProfile.html +4 -2
  141. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.extractDomain.html +4 -2
  142. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.generateAndroidVersionCode.html +4 -2
  143. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyAndroidManifest.html +6 -6
  144. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyConfigXml.html +4 -2
  145. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyGradleConfig.html +4 -2
  146. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyInfoPlist.html +4 -2
  147. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyXcodeProjectFile.html +4 -2
  148. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepAppIcon.html +4 -2
  149. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareAppIcon.html +4 -2
  150. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareBuildDir.html +4 -2
  151. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareExportOptionsPlist.html +4 -2
  152. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareSplashIcon.html +4 -2
  153. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareSplashPage.html +4 -2
  154. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeCapacitorConfig.html +4 -2
  155. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeCfgFile.html +4 -2
  156. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeDataExtractionRules.html +4 -2
  157. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeNetworkSecurityConfig.html +4 -2
  158. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writePodfile.html +4 -2
  159. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writePrivacyInfo.html +4 -2
  160. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.bundleMobileAppCode.html +2 -1
  161. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.bundlePackagesAndPlugins.html +2 -1
  162. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.copyMobileAppDirs.html +74 -0
  163. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.copyPublicDirs.html +2 -1
  164. package/docs/functions/_saltcorn_sqlite.add_index.html +1 -1
  165. package/docs/functions/_saltcorn_sqlite.add_unique_constraint.html +1 -1
  166. package/docs/functions/_saltcorn_sqlite.begin.html +1 -1
  167. package/docs/functions/_saltcorn_sqlite.changeConnection.html +1 -1
  168. package/docs/functions/_saltcorn_sqlite.close.html +1 -1
  169. package/docs/functions/_saltcorn_sqlite.commit.html +1 -1
  170. package/docs/functions/_saltcorn_sqlite.count.html +1 -1
  171. package/docs/functions/_saltcorn_sqlite.deleteWhere.html +1 -1
  172. package/docs/functions/_saltcorn_sqlite.dropTable.html +1 -1
  173. package/docs/functions/_saltcorn_sqlite.dropTables.html +1 -1
  174. package/docs/functions/_saltcorn_sqlite.drop_index.html +1 -1
  175. package/docs/functions/_saltcorn_sqlite.drop_reset_schema.html +1 -1
  176. package/docs/functions/_saltcorn_sqlite.drop_unique_constraint.html +1 -1
  177. package/docs/functions/_saltcorn_sqlite.getVersion.html +1 -1
  178. package/docs/functions/_saltcorn_sqlite.get_db_filepath.html +1 -1
  179. package/docs/functions/_saltcorn_sqlite.get_sql_logging.html +1 -1
  180. package/docs/functions/_saltcorn_sqlite.init.html +1 -1
  181. package/docs/functions/_saltcorn_sqlite.insert.html +1 -1
  182. package/docs/functions/_saltcorn_sqlite.listScTables.html +1 -1
  183. package/docs/functions/_saltcorn_sqlite.listTables.html +1 -1
  184. package/docs/functions/_saltcorn_sqlite.listUserDefinedTables.html +1 -1
  185. package/docs/functions/_saltcorn_sqlite.query.html +1 -1
  186. package/docs/functions/_saltcorn_sqlite.rollback.html +1 -1
  187. package/docs/functions/_saltcorn_sqlite.select.html +1 -1
  188. package/docs/functions/_saltcorn_sqlite.selectMaybeOne.html +1 -1
  189. package/docs/functions/_saltcorn_sqlite.selectOne.html +1 -1
  190. package/docs/functions/_saltcorn_sqlite.set_sql_logging.html +1 -1
  191. package/docs/functions/_saltcorn_sqlite.slugify.html +1 -1
  192. package/docs/functions/_saltcorn_sqlite.sql_log.html +1 -1
  193. package/docs/functions/_saltcorn_sqlite.update.html +1 -1
  194. package/docs/functions/_saltcorn_sqlite.updateWhere.html +1 -1
  195. package/docs/functions/_saltcorn_sqlite_mobile.add_index.html +1 -1
  196. package/docs/functions/_saltcorn_sqlite_mobile.add_unique_constraint.html +1 -1
  197. package/docs/functions/_saltcorn_sqlite_mobile.count.html +1 -1
  198. package/docs/functions/_saltcorn_sqlite_mobile.deleteWhere.html +1 -1
  199. package/docs/functions/_saltcorn_sqlite_mobile.drop_index.html +1 -1
  200. package/docs/functions/_saltcorn_sqlite_mobile.drop_reset_schema.html +1 -1
  201. package/docs/functions/_saltcorn_sqlite_mobile.drop_unique_constraint.html +1 -1
  202. package/docs/functions/_saltcorn_sqlite_mobile.init.html +1 -1
  203. package/docs/functions/_saltcorn_sqlite_mobile.insert.html +1 -1
  204. package/docs/functions/_saltcorn_sqlite_mobile.insertRows.html +1 -1
  205. package/docs/functions/_saltcorn_sqlite_mobile.listScTables.html +1 -1
  206. package/docs/functions/_saltcorn_sqlite_mobile.listTables.html +1 -1
  207. package/docs/functions/_saltcorn_sqlite_mobile.listUserDefinedTables.html +1 -1
  208. package/docs/functions/_saltcorn_sqlite_mobile.query.html +1 -1
  209. package/docs/functions/_saltcorn_sqlite_mobile.select.html +1 -1
  210. package/docs/functions/_saltcorn_sqlite_mobile.selectMaybeOne.html +1 -1
  211. package/docs/functions/_saltcorn_sqlite_mobile.selectOne.html +1 -1
  212. package/docs/functions/_saltcorn_sqlite_mobile.setConnectionObject.html +1 -1
  213. package/docs/functions/_saltcorn_sqlite_mobile.tableExists.html +1 -1
  214. package/docs/functions/_saltcorn_sqlite_mobile.time.html +1 -1
  215. package/docs/functions/_saltcorn_sqlite_mobile.update.html +1 -1
  216. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_field.instanceOfField.html +1 -1
  217. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_page.instanceOfPage.html +1 -1
  218. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_view.instanceOfView.html +1 -1
  219. package/docs/functions/_saltcorn_types.Types.base_types.instanceOWithHtmlFile.html +2 -1
  220. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfErrorMsg.html +1 -1
  221. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfSuccessMsg.html +1 -1
  222. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfType.html +1 -1
  223. package/docs/functions/_saltcorn_types.generators.generateBool.html +1 -1
  224. package/docs/functions/_saltcorn_types.generators.generateString.html +1 -1
  225. package/docs/functions/_saltcorn_types.generators.num_between.html +1 -1
  226. package/docs/functions/_saltcorn_types.generators.oneOf.html +1 -1
  227. package/docs/interfaces/_saltcorn_mobile_builder.common_build_utils.ScCapacitorConfig.html +13 -11
  228. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_field.AbstractField.html +14 -14
  229. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_field.AbstractFieldRepeat.html +3 -3
  230. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_form.AbstractForm.html +26 -26
  231. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_page.AbstractPage.html +7 -7
  232. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_role.AbstractRole.html +3 -3
  233. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_table.AbstractTable.html +7 -7
  234. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_trigger.AbstractTrigger.html +16 -16
  235. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_view.AbstractView.html +10 -10
  236. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_workflow.AbstractWorkflow.html +13 -13
  237. package/docs/modules/_saltcorn_admin_models.backup.html +1 -1
  238. package/docs/modules/_saltcorn_admin_models.html +1 -1
  239. package/docs/modules/_saltcorn_admin_models.pack.html +1 -1
  240. package/docs/modules/_saltcorn_admin_models.tenant.html +1 -1
  241. package/docs/modules/_saltcorn_common_code.html +1 -1
  242. package/docs/modules/_saltcorn_data.html +3 -3
  243. package/docs/modules/_saltcorn_data.models.Crash.html +2 -2
  244. package/docs/modules/_saltcorn_data.models.EventLog.html +2 -2
  245. package/docs/modules/_saltcorn_data.models.FieldRepeat.html +2 -2
  246. package/docs/modules/_saltcorn_data.models.File.html +2 -2
  247. package/docs/modules/_saltcorn_data.models.Form.html +2 -2
  248. package/docs/modules/_saltcorn_data.models.PageGroup.html +2 -2
  249. package/docs/modules/_saltcorn_data.models.Table.html +2 -2
  250. package/docs/modules/_saltcorn_data.models.TableConstraint.html +2 -2
  251. package/docs/modules/_saltcorn_data.models.User.html +2 -2
  252. package/docs/modules/_saltcorn_data.models.View.html +2 -2
  253. package/docs/modules/_saltcorn_data.models.Workflow.html +2 -2
  254. package/docs/modules/_saltcorn_data.models.config.html +1 -1
  255. package/docs/modules/_saltcorn_data.models.discovery.html +1 -1
  256. package/docs/modules/_saltcorn_data.models.email.html +1 -1
  257. package/docs/modules/_saltcorn_data.models.expression.html +1 -1
  258. package/docs/modules/_saltcorn_data.models.html +1 -1
  259. package/docs/modules/_saltcorn_data.models.layout.html +1 -1
  260. package/docs/modules/_saltcorn_data.models.random.html +1 -1
  261. package/docs/modules/_saltcorn_data.models.scheduler.html +1 -1
  262. package/docs/modules/_saltcorn_data.plugin_helper.html +1 -1
  263. package/docs/modules/_saltcorn_data.utils.html +1 -1
  264. package/docs/modules/_saltcorn_db_common.html +2 -2
  265. package/docs/modules/_saltcorn_db_common.multi_tenant.html +1 -1
  266. package/docs/modules/_saltcorn_db_common.single_tenant.html +1 -1
  267. package/docs/modules/_saltcorn_markup.html +2 -2
  268. package/docs/modules/_saltcorn_mobile_builder.common_build_utils.html +6 -2
  269. package/docs/modules/_saltcorn_mobile_builder.html +1 -1
  270. package/docs/modules/_saltcorn_mobile_builder.package_bundle_utils.html +3 -1
  271. package/docs/modules/_saltcorn_sqlite.html +1 -1
  272. package/docs/modules/_saltcorn_sqlite_mobile.html +1 -1
  273. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_field.html +1 -1
  274. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_form.html +1 -1
  275. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_library.html +1 -1
  276. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_page.html +1 -1
  277. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_plugin.html +1 -1
  278. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_role.html +1 -1
  279. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_table.html +1 -1
  280. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_trigger.html +1 -1
  281. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_view.html +1 -1
  282. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_workflow.html +1 -1
  283. package/docs/modules/_saltcorn_types.ModelAbstracts.html +1 -1
  284. package/docs/modules/_saltcorn_types.Types.base_types.html +3 -1
  285. package/docs/modules/_saltcorn_types.Types.common_types.html +1 -1
  286. package/docs/modules/_saltcorn_types.Types.html +1 -1
  287. package/docs/modules/_saltcorn_types.generators.html +1 -1
  288. package/docs/modules/_saltcorn_types.html +1 -1
  289. package/docs/types/_saltcorn_data.models.Crash.CrashCfg.html +1 -1
  290. package/docs/types/_saltcorn_data.models.EventLog.EventLogCfg.html +1 -1
  291. package/docs/types/_saltcorn_data.models.FieldRepeat.FieldRepeatCfg.html +1 -1
  292. package/docs/types/_saltcorn_data.models.File.FileCfg.html +1 -1
  293. package/docs/types/_saltcorn_data.models.Form.AdditionalButton.html +1 -1
  294. package/docs/types/_saltcorn_data.models.Form.FormCfg.html +1 -1
  295. package/docs/types/_saltcorn_data.models.PageGroup.ScreenInfoParams.html +1 -1
  296. package/docs/types/_saltcorn_data.models.Table.ChildRelations.html +1 -1
  297. package/docs/types/_saltcorn_data.models.Table.ParentRelations.html +1 -1
  298. package/docs/types/_saltcorn_data.models.Table.RelationData.html +1 -1
  299. package/docs/types/_saltcorn_data.models.TableConstraint.TableConstraintCfg.html +1 -1
  300. package/docs/types/_saltcorn_data.models.User.UserCfg.html +1 -1
  301. package/docs/types/_saltcorn_data.models.View.FindViewsPred.html +1 -1
  302. package/docs/types/_saltcorn_data.models.Workflow.WorkflowCfg.html +1 -1
  303. package/docs/types/_saltcorn_db_common.AggregationOptions.html +1 -1
  304. package/docs/types/_saltcorn_db_common.CoordOpts.html +1 -1
  305. package/docs/types/_saltcorn_db_common.JoinField.html +1 -1
  306. package/docs/types/_saltcorn_db_common.JoinFields.html +1 -1
  307. package/docs/types/_saltcorn_db_common.JoinOptions.html +1 -1
  308. package/docs/types/_saltcorn_db_common.JsonPath.html +1 -1
  309. package/docs/types/_saltcorn_db_common.JsonPathElem.html +1 -1
  310. package/docs/types/_saltcorn_db_common.Operator.html +1 -1
  311. package/docs/types/_saltcorn_db_common.PrimaryKeyValue.html +1 -1
  312. package/docs/types/_saltcorn_db_common.Row.html +1 -1
  313. package/docs/types/_saltcorn_db_common.SelectOptions.html +1 -1
  314. package/docs/types/_saltcorn_db_common.SqlAndValues.html +1 -1
  315. package/docs/types/_saltcorn_db_common.SubselectOptions.html +1 -1
  316. package/docs/types/_saltcorn_db_common.Value.html +1 -1
  317. package/docs/types/_saltcorn_db_common.Where.html +1 -1
  318. package/docs/types/_saltcorn_mobile_builder.IosCfg.html +1 -1
  319. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_field.FieldCfg.html +1 -1
  320. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_field.InputType.html +1 -1
  321. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_form.AdditionalButton.html +1 -1
  322. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_library.LibraryCfg.html +1 -1
  323. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_library.LibraryPack.html +1 -1
  324. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_page.PageCfg.html +1 -1
  325. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_page.PagePack.html +1 -1
  326. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_plugin.PluginCfg.html +1 -1
  327. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_plugin.PluginPack.html +1 -1
  328. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_role.RoleCfg.html +1 -1
  329. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_role.RolePack.html +1 -1
  330. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_table.TableCfg.html +1 -1
  331. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_table.TablePack.html +1 -1
  332. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_trigger.TriggerCfg.html +1 -1
  333. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_trigger.TriggerPack.html +1 -1
  334. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_view.ViewCfg.html +1 -1
  335. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_view.ViewPack.html +1 -1
  336. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_workflow.ConfigWorkflowStep.html +1 -1
  337. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_workflow.RunResult.html +1 -1
  338. package/docs/types/_saltcorn_types.Types.base_types.Action.html +2 -1
  339. package/docs/types/_saltcorn_types.Types.base_types.AuthenticationMethod.html +2 -1
  340. package/docs/types/_saltcorn_types.Types.base_types.CapacitorPlugin.html +110 -0
  341. package/docs/types/_saltcorn_types.Types.base_types.CodePagePack.html +2 -1
  342. package/docs/types/_saltcorn_types.Types.base_types.Column.html +2 -1
  343. package/docs/types/_saltcorn_types.Types.base_types.ConnectedObjects.html +2 -1
  344. package/docs/types/_saltcorn_types.Types.base_types.CopilotSkill.html +2 -1
  345. package/docs/types/_saltcorn_types.Types.base_types.FieldLike.html +2 -1
  346. package/docs/types/_saltcorn_types.Types.base_types.FieldView.html +2 -1
  347. package/docs/types/_saltcorn_types.Types.base_types.Header.html +2 -1
  348. package/docs/types/_saltcorn_types.Types.base_types.JoinFieldOption.html +2 -1
  349. package/docs/types/_saltcorn_types.Types.base_types.Layout.html +2 -1
  350. package/docs/types/_saltcorn_types.Types.base_types.MobileConfig.html +2 -1
  351. package/docs/types/_saltcorn_types.Types.base_types.ModelPattern.html +2 -1
  352. package/docs/types/_saltcorn_types.Types.base_types.Pack.html +2 -1
  353. package/docs/types/_saltcorn_types.Types.base_types.Plugin.html +2 -1
  354. package/docs/types/_saltcorn_types.Types.base_types.PluginFunction.html +2 -1
  355. package/docs/types/_saltcorn_types.Types.base_types.PluginLayout.html +2 -1
  356. package/docs/types/_saltcorn_types.Types.base_types.PluginRoute.html +2 -1
  357. package/docs/types/_saltcorn_types.Types.base_types.PluginSourceType.html +2 -1
  358. package/docs/types/_saltcorn_types.Types.base_types.PluginType.html +2 -1
  359. package/docs/types/_saltcorn_types.Types.base_types.PluginWrap.html +2 -1
  360. package/docs/types/_saltcorn_types.Types.base_types.PluginWrapArg.html +2 -1
  361. package/docs/types/_saltcorn_types.Types.base_types.RelationOption.html +2 -1
  362. package/docs/types/_saltcorn_types.Types.base_types.Req.html +2 -1
  363. package/docs/types/_saltcorn_types.Types.base_types.Res.html +2 -1
  364. package/docs/types/_saltcorn_types.Types.base_types.RouteAction.html +2 -1
  365. package/docs/types/_saltcorn_types.Types.base_types.RunExtra.html +2 -1
  366. package/docs/types/_saltcorn_types.Types.base_types.TableProvider.html +2 -1
  367. package/docs/types/_saltcorn_types.Types.base_types.TableQuery.html +2 -1
  368. package/docs/types/_saltcorn_types.Types.base_types.Tablely.html +2 -1
  369. package/docs/types/_saltcorn_types.Types.base_types.ViewTemplate.html +2 -1
  370. package/docs/types/_saltcorn_types.Types.common_types.ErrorMessage.html +1 -1
  371. package/docs/types/_saltcorn_types.Types.common_types.GenObj.html +1 -1
  372. package/docs/types/_saltcorn_types.Types.common_types.ReqRes.html +1 -1
  373. package/docs/types/_saltcorn_types.Types.common_types.ResultMessage.html +1 -1
  374. package/docs/types/_saltcorn_types.Types.common_types.SuccessMessage.html +1 -1
  375. package/docs/types/_saltcorn_types.Types.common_types.Type.html +1 -1
  376. package/docs/variables/_saltcorn_data.db.html +1 -1
  377. package/docs/variables/_saltcorn_data.migrations.html +1 -1
  378. package/docs/variables/_saltcorn_data.models.config.available_languages.html +1 -1
  379. package/docs/variables/_saltcorn_data.models.config.configTypes.html +1 -1
  380. package/docs/variables/_saltcorn_data.models.scheduler.runScheduler.html +1 -1
  381. package/docs/variables/_saltcorn_data.plugin_helper.run_action_column.html +1 -1
  382. package/docs/variables/_saltcorn_data.utils.NotAuthorized.html +1 -1
  383. package/docs/variables/_saltcorn_data.utils.sleep.html +1 -1
  384. package/docs/variables/_saltcorn_db_common.multi_tenant.tenantNamespace.html +1 -1
  385. package/locales/ar.json +22 -3
  386. package/locales/de.json +66 -45
  387. package/locales/en.json +14 -1
  388. package/locales/es.json +20 -1
  389. package/locales/fr.json +22 -3
  390. package/locales/hi.json +21 -2
  391. package/locales/pl.json +109 -80
  392. package/locales/pt.json +23 -4
  393. package/locales/ru.json +21 -2
  394. package/locales/si.json +23 -4
  395. package/locales/uk.json +23 -4
  396. package/locales/zh.json +20 -1
  397. package/markup/admin.js +13 -1
  398. package/package.json +9 -9
  399. package/public/saltcorn-common.js +57 -23
  400. package/routes/actions.js +5 -4
  401. package/routes/admin.js +45 -21
  402. package/routes/common_lists.js +29 -11
  403. package/routes/delete.js +1 -0
  404. package/routes/fields.js +2 -0
  405. package/routes/infoarch.js +1 -0
  406. package/routes/menu.js +1 -0
  407. package/routes/page_groupedit.js +1 -0
  408. package/routes/plugins.js +2 -0
  409. package/routes/registry.js +11 -7
  410. package/routes/scapi.js +39 -3
  411. package/routes/tables.js +1 -14
  412. package/routes/utils.js +2 -1
  413. package/tests/auth.test.js +41 -9
@@ -597,6 +597,7 @@ function get_form_record(e_in, select_labels) {
597
597
  $(e_in).prop("data-join-values", {});
598
598
  const keyVals = {};
599
599
  for (const { ref, target, refTable } of joinFields) {
600
+ if (!rec[ref]) continue;
600
601
  keyVals[ref] = rec[ref];
601
602
  $.ajax(`/api/${refTable}?id=${rec[ref]}`, {
602
603
  success: (val) => {
@@ -913,6 +914,29 @@ function doMobileTransforms() {
913
914
  );
914
915
  }
915
916
 
917
+ function validate_expression_elem(target) {
918
+ const next = target.next();
919
+ if (next.hasClass("expr-error")) next.remove();
920
+ const val = target.val();
921
+ if (target.hasClass("validate-expression-conditional")) {
922
+ const box = target
923
+ .closest(".form-namespace")
924
+ .find(`[name="${target.attr("name")}_formula"]`);
925
+ if (!box.prop("checked")) return;
926
+ }
927
+ if (!val) return;
928
+ try {
929
+ const AsyncFunction = Object.getPrototypeOf(
930
+ async function () {}
931
+ ).constructor;
932
+ AsyncFunction("return " + val);
933
+ } catch (error) {
934
+ target.after(`<small class="text-danger font-monospace d-block expr-error">
935
+ ${error.message}
936
+ </small>`);
937
+ }
938
+ }
939
+
916
940
  function initialize_page() {
917
941
  if (window._sc_locale && window.dayjs) dayjs.locale(window._sc_locale);
918
942
  const isNode = getIsNode();
@@ -942,28 +966,6 @@ function initialize_page() {
942
966
  validate_identifier_elem(target);
943
967
  });
944
968
 
945
- const validate_expression_elem = (target) => {
946
- const next = target.next();
947
- if (next.hasClass("expr-error")) next.remove();
948
- const val = target.val();
949
- if (target.hasClass("validate-expression-conditional")) {
950
- const box = target
951
- .closest(".form-namespace")
952
- .find(`[name="${target.attr("name")}_formula"]`);
953
- if (!box.prop("checked")) return;
954
- }
955
- if (!val) return;
956
- try {
957
- const AsyncFunction = Object.getPrototypeOf(
958
- async function () {}
959
- ).constructor;
960
- AsyncFunction("return " + val);
961
- } catch (error) {
962
- target.after(`<small class="text-danger font-monospace d-block expr-error">
963
- ${error.message}
964
- </small>`);
965
- }
966
- };
967
969
  $(".validate-expression").bind("input", function (e) {
968
970
  const target = $(e.target);
969
971
  validate_expression_elem(target);
@@ -1193,6 +1195,7 @@ function initialize_page() {
1193
1195
  if (_sc_lightmode === "dark") cmOpts.theme = "blackboard";
1194
1196
  const cm = CodeMirror.fromTextArea(el, cmOpts);
1195
1197
  $(el).addClass("codemirror-enabled");
1198
+ if ($(el).hasClass("enlarge-in-card")) enlarge_in_code($(el), cm);
1196
1199
  cm.on(
1197
1200
  "change",
1198
1201
  $.debounce(
@@ -1295,6 +1298,22 @@ function initialize_page() {
1295
1298
 
1296
1299
  $(initialize_page);
1297
1300
 
1301
+ function enlarge_in_code($textarea, cm) {
1302
+ const $card = $textarea.closest("div.card");
1303
+ if (!$card.length) return;
1304
+ const cardTop = $card.position().top;
1305
+ const cardHeight = $card.height();
1306
+ const vh = $(window).height();
1307
+ const cmHeight = cm.getWrapperElement().offsetHeight;
1308
+ const newCardHeight = vh - cardTop - 35;
1309
+ if (newCardHeight > cardHeight) {
1310
+ const extending = newCardHeight - cardHeight;
1311
+ cm.setSize("100%", `${cmHeight + extending}px`);
1312
+ cm.refresh();
1313
+ $card.css("min-height", newCardHeight + "px");
1314
+ }
1315
+ }
1316
+
1298
1317
  function cancel_inline_edit(e, opts1) {
1299
1318
  var opts = JSON.parse(decodeURIComponent(opts1 || "") || "{}");
1300
1319
  var form = $(e.target).closest("form");
@@ -1563,7 +1582,7 @@ function notifyAlert(note, spin) {
1563
1582
  type = "info";
1564
1583
  txt = JSON.stringify(note, null, 2);
1565
1584
  }
1566
-
1585
+
1567
1586
  const { id, html } = buildToast(txt, type, spin, note.toast_title);
1568
1587
  let $modal = $("#scmodal");
1569
1588
  if ($modal.length && $modal.hasClass("show"))
@@ -1750,6 +1769,21 @@ async function common_done(res, viewnameOrElem0, isWeb = true) {
1750
1769
  }
1751
1770
  }
1752
1771
 
1772
+ function editAllowedAuthByRole(id, event) {
1773
+ ajax_post_json(
1774
+ `/roleadmin/setrole_allowed_auth_methods/${id}`,
1775
+ {
1776
+ enabled: event.target.checked,
1777
+ method: event.target.value,
1778
+ },
1779
+ {
1780
+ complete() {
1781
+ location.reload();
1782
+ },
1783
+ }
1784
+ );
1785
+ }
1786
+
1753
1787
  function reloadEmbeddedEditOwnViews(form, id) {
1754
1788
  form.find("div[sc-load-on-assign-id]").each(function () {
1755
1789
  const $e = $(this);
package/routes/actions.js CHANGED
@@ -1526,13 +1526,13 @@ router.get(
1526
1526
 
1527
1527
  const wfTable = mkTable(
1528
1528
  [
1529
- { label: "Trigger", key: (run) => trNames[run.trigger_id] },
1530
- { label: "Started", key: (run) => localeDateTime(run.started_at) },
1529
+ { label: req.__("Trigger"), key: (run) => trNames[run.trigger_id] },
1530
+ { label: req.__("Started"), key: (run) => localeDateTime(run.started_at) },
1531
1531
  {
1532
- label: "Updated",
1532
+ label: req.__("Updated"),
1533
1533
  key: (run) => localeDateTime(run.status_updated_at),
1534
1534
  },
1535
- { label: "Status", key: "status" },
1535
+ { label: req.__("Status"), key: "status" },
1536
1536
  {
1537
1537
  label: "",
1538
1538
  key: (run) => {
@@ -1743,6 +1743,7 @@ router.get(
1743
1743
  const title = run.wait_info.output ? "Workflow output" : "Fill form";
1744
1744
  res.sendWrap(title, renderForm(form, req.csrfToken()));
1745
1745
  } catch (e) {
1746
+ console.error(e);
1746
1747
  await run.markAsError(e, step, req.user);
1747
1748
  const title = req.__("Error running workflow");
1748
1749
  res.sendWrap(title, renderForm(e.message, req.csrfToken()));
package/routes/admin.js CHANGED
@@ -307,7 +307,12 @@ router.get(
307
307
  .replace(/^(\.\.(\/|\\|$))+/, "");
308
308
  const fullpath = path.join(location, "help", safeFile);
309
309
  if (fs.existsSync(fullpath)) {
310
- const { markup } = await get_help_markup(fullpath, req.query, req, true);
310
+ const { markup } = await get_help_markup(
311
+ fullpath,
312
+ req.query,
313
+ req,
314
+ true
315
+ );
311
316
 
312
317
  res.sendWrap(`Help: ${topic}`, { above: [markup] });
313
318
  } else {
@@ -753,11 +758,13 @@ router.post(
753
758
  );
754
759
  }
755
760
  res.redirect(
756
- type === "trigger"
757
- ? `/actions`
758
- : /^[a-z]+$/g.test(type)
759
- ? `/${type}edit`
760
- : "/"
761
+ type == "codepage"
762
+ ? `/admin/edit-codepage/${name}`
763
+ : type === "trigger"
764
+ ? `/actions`
765
+ : /^[a-z]+$/g.test(type)
766
+ ? `/${type}edit`
767
+ : "/"
761
768
  );
762
769
  })
763
770
  );
@@ -1140,6 +1147,7 @@ router.post(
1140
1147
  else
1141
1148
  req.flash("success", req.__("No changes detected, snapshot skipped"));
1142
1149
  } catch (e) {
1150
+ console.error(e);
1143
1151
  req.flash("error", e.message);
1144
1152
  }
1145
1153
  res.json({ reload_page: true });
@@ -1636,6 +1644,7 @@ const doInstall = async (req, res, version, deepClean, runPull) => {
1636
1644
  try {
1637
1645
  await cleanNodeModules();
1638
1646
  } catch (e) {
1647
+ console.error(e);
1639
1648
  res_write(req.__("Error cleaning node_modules: %s\n", e.message));
1640
1649
  }
1641
1650
  }
@@ -1896,6 +1905,7 @@ router.post(
1896
1905
  notify: "Certificate added, please restart server",
1897
1906
  });
1898
1907
  } catch (e) {
1908
+ console.error(e);
1899
1909
  res.json({ error: e.message });
1900
1910
  }
1901
1911
  } else {
@@ -1983,6 +1993,7 @@ router.post(
1983
1993
  );
1984
1994
  res.redirect("/useradmin/ssl");
1985
1995
  } catch (e) {
1996
+ console.error(e);
1986
1997
  req.flash("error", e.message);
1987
1998
  res.redirect("/useradmin/ssl");
1988
1999
  }
@@ -4098,15 +4109,6 @@ router.get(
4098
4109
  values: { code: existing },
4099
4110
  noSubmitButton: true,
4100
4111
  labelCols: 0,
4101
- additionalButtons: [
4102
- {
4103
- label: req.__("Delete code page"),
4104
- class: "btn btn-outline-danger btn-sm",
4105
- onclick: `if(confirm('Are you sure you would like to delete this code page?'))ajax_post('/admin/delete-codepage/${encodeURIComponent(
4106
- name
4107
- )}')`,
4108
- },
4109
- ],
4110
4112
  fields: [
4111
4113
  {
4112
4114
  name: "code",
@@ -4123,7 +4125,7 @@ router.get(
4123
4125
  ),
4124
4126
  input_type: "code",
4125
4127
  attributes: { mode: "text/javascript" },
4126
- class: "validate-statements",
4128
+ class: "validate-statements enlarge-in-card",
4127
4129
  validator(s) {
4128
4130
  try {
4129
4131
  let AsyncFunction = Object.getPrototypeOf(
@@ -4143,7 +4145,8 @@ router.get(
4143
4145
  {}
4144
4146
  );
4145
4147
  const tags = await Tag.find();
4146
- const tagMarkup = div(
4148
+ const tagMarkup = span(
4149
+ { class: "ms-1" },
4147
4150
  "Tags:",
4148
4151
  (function_code_pages_tags[name] || []).map((tagnm) =>
4149
4152
  span(
@@ -4205,7 +4208,28 @@ router.get(
4205
4208
  contents: {
4206
4209
  type: "card",
4207
4210
  title: req.__(`%s code page`, name),
4208
- contents: [renderForm(form, req.csrfToken()), tagMarkup],
4211
+ contents: [
4212
+ renderForm(form, req.csrfToken()),
4213
+ a(
4214
+ {
4215
+ href: `javascript:if(confirm('Are you sure you would like to delete this code page?'))ajax_post('/admin/delete-codepage/${encodeURIComponent(
4216
+ name
4217
+ )}')`,
4218
+ class: "me-1 text-danger",
4219
+ },
4220
+ req.__("Delete code page")
4221
+ ),
4222
+ " | ",
4223
+ a(
4224
+ {
4225
+ href: `javascript:ajax_modal('/admin/snapshot-restore/codepage/${name}')`,
4226
+ class: "ms-1 me-1",
4227
+ },
4228
+ req.__("Restore")
4229
+ ),
4230
+ " | ",
4231
+ tagMarkup,
4232
+ ],
4209
4233
  },
4210
4234
  });
4211
4235
  })
@@ -4223,9 +4247,9 @@ router.post(
4223
4247
  ...code_pages,
4224
4248
  [name]: code,
4225
4249
  });
4226
- await getState().refresh_codepages();
4227
-
4228
- res.json({ success: true });
4250
+ const err = await getState().refresh_codepages();
4251
+ if (err) res.json({ success: false, error: `Error evaluating code pages: ${err}` });
4252
+ else res.json({ success: true });
4229
4253
  })
4230
4254
  );
4231
4255
  router.post(
@@ -93,7 +93,8 @@ const tablesList = async (
93
93
  {
94
94
  label: tagsDropdown(
95
95
  tags,
96
- filterOnTag ? `Tag:${filterOnTag.name}` : undefined
96
+ filterOnTag ? `Tag:${filterOnTag.name}` : undefined,
97
+ req
97
98
  ),
98
99
  key: (r) => tagBadges(r),
99
100
  },
@@ -240,7 +241,7 @@ const tagBadge = (tag, type) =>
240
241
  tag.name
241
242
  );
242
243
 
243
- const tagsDropdown = (tags, altHeader) =>
244
+ const tagsDropdown = (tags, altHeader, req) =>
244
245
  div(
245
246
  { class: "dropdown" },
246
247
  div(
@@ -253,7 +254,7 @@ const tagsDropdown = (tags, altHeader) =>
253
254
  "aria-haspopup": "true",
254
255
  "aria-expanded": "false",
255
256
  },
256
- altHeader || "Tags",
257
+ altHeader || req.__("Tags"),
257
258
  i({ class: "ms-1 fas fa-caret-down" })
258
259
  ),
259
260
  div(
@@ -267,7 +268,7 @@ const tagsDropdown = (tags, altHeader) =>
267
268
  // TODO check url why view for page, what do we need for page group
268
269
  href: `javascript:unset_state_field('_tag', this)`,
269
270
  },
270
- "All tags"
271
+ req.__("All tags")
271
272
  ),
272
273
  tags.map((tag) =>
273
274
  a(
@@ -285,7 +286,7 @@ const tagsDropdown = (tags, altHeader) =>
285
286
  // TODO check url why view for page, what do we need for page group
286
287
  href: `tag`,
287
288
  },
288
- "Manage tags..."
289
+ req.__("Manage tags...")
289
290
  )
290
291
  )
291
292
  );
@@ -314,7 +315,7 @@ const mkAddBtn = (tags, entityType, id, req, myTagIds, on_done_redirect_str) =>
314
315
  post_dropdown_item(
315
316
  `/tag-entries/add-tag-entity/${encodeURIComponent(
316
317
  t.name
317
- )}/${entityType}/${id}${on_done_redirect_str||""}`,
318
+ )}/${entityType}/${id}${on_done_redirect_str || ""}`,
318
319
  t.name,
319
320
  req
320
321
  )
@@ -345,7 +346,14 @@ const viewsList = async (
345
346
  const tagBadges = (view) => {
346
347
  const myTags = tag_entries.filter((te) => te.view_id === view.id);
347
348
  const myTagIds = new Set(myTags.map((t) => t.tag_id));
348
- const addBtn = mkAddBtn(tags, "views", view.id, req, myTagIds, on_done_redirect_str);
349
+ const addBtn = mkAddBtn(
350
+ tags,
351
+ "views",
352
+ view.id,
353
+ req,
354
+ myTagIds,
355
+ on_done_redirect_str
356
+ );
349
357
  return (
350
358
  myTags.map((te) => tagBadge(tagsById[te.tag_id], "views")).join(nbsp) +
351
359
  addBtn
@@ -380,7 +388,8 @@ const viewsList = async (
380
388
  {
381
389
  label: tagsDropdown(
382
390
  tags,
383
- filterOnTag ? `Tag:${filterOnTag.name}` : undefined
391
+ filterOnTag ? `Tag:${filterOnTag.name}` : undefined,
392
+ req
384
393
  ),
385
394
  key: (r) => tagBadges(r),
386
395
  },
@@ -585,7 +594,8 @@ const getPageList = async (
585
594
  {
586
595
  label: tagsDropdown(
587
596
  tags,
588
- filterOnTag ? `Tag:${filterOnTag.name}` : undefined
597
+ filterOnTag ? `Tag:${filterOnTag.name}` : undefined,
598
+ req
589
599
  ),
590
600
  key: (r) => tagBadges(r),
591
601
  },
@@ -709,7 +719,14 @@ const getTriggerList = async (
709
719
  const myTagIds = new Set(myTags.map((t) => t.tag_id));
710
720
  return (
711
721
  myTags.map((te) => tagBadge(tagsById[te.tag_id], "triggers")).join(nbsp) +
712
- mkAddBtn(tags, "triggers", trigger.id, req, myTagIds, on_done_redirect_str)
722
+ mkAddBtn(
723
+ tags,
724
+ "triggers",
725
+ trigger.id,
726
+ req,
727
+ myTagIds,
728
+ on_done_redirect_str
729
+ )
713
730
  );
714
731
  };
715
732
  return mkTable(
@@ -729,7 +746,8 @@ const getTriggerList = async (
729
746
  {
730
747
  label: tagsDropdown(
731
748
  tags,
732
- filterOnTag ? `Tag:${filterOnTag.name}` : undefined
749
+ filterOnTag ? `Tag:${filterOnTag.name}` : undefined,
750
+ req
733
751
  ),
734
752
  key: (r) => tagBadges(r),
735
753
  },
package/routes/delete.js CHANGED
@@ -57,6 +57,7 @@ router.post(
57
57
  req.__("Not allowed to write to table %s", table.name)
58
58
  );
59
59
  } catch (e) {
60
+ console.error(e);
60
61
  req.flash("error", e.message);
61
62
  }
62
63
  if (req.xhr) res.send("OK");
package/routes/fields.js CHANGED
@@ -322,6 +322,7 @@ const fieldFlow = (req) =>
322
322
  }
323
323
  );
324
324
  } catch (e) {
325
+ console.error(e);
325
326
  return {
326
327
  redirect: `/table/${context.table_id}`,
327
328
  flash: ["error", e.message],
@@ -340,6 +341,7 @@ const fieldFlow = (req) =>
340
341
  }
341
342
  );
342
343
  } catch (e) {
344
+ console.error(e);
343
345
  return {
344
346
  redirect: `/table/${context.table_id}`,
345
347
  flash: ["error", e.message],
@@ -90,6 +90,7 @@ router.post(
90
90
  else
91
91
  req.flash("success", req.__("No changes detected, snapshot skipped"));
92
92
  } catch (e) {
93
+ console.error(e);
93
94
  req.flash("error", e.message);
94
95
  }
95
96
  res.json({ reload_page: true });
package/routes/menu.js CHANGED
@@ -615,6 +615,7 @@ router.post(
615
615
  });
616
616
  res.json({ success: "ok", ...(result || {}) });
617
617
  } catch (e) {
618
+ console.error(e);
618
619
  res.status(400).json({ error: e.message || e });
619
620
  }
620
621
  else res.status(404).json({ error: "Action not found" });
@@ -628,6 +628,7 @@ router.post(
628
628
  );
629
629
  res.redirect(`/page_groupedit/${group.name}`);
630
630
  } catch (e) {
631
+ console.error(e);
631
632
  req.flash("error", e.message);
632
633
  res.redirect(`/page_groupedit/${group.name}`);
633
634
  }
package/routes/plugins.js CHANGED
@@ -1489,6 +1489,7 @@ router.post(
1489
1489
  for (const msg of msgs) req.flash("warning", msg);
1490
1490
  res.redirect(`/plugins`);
1491
1491
  } catch (e) {
1492
+ console.error(e);
1492
1493
  req.flash("error", `${e.message}`);
1493
1494
  const form = pluginForm(req, plugin);
1494
1495
  res.sendWrap(req.__(`Edit Module`), renderForm(form, req.csrfToken()));
@@ -1595,6 +1596,7 @@ router.post(
1595
1596
  req.__
1596
1597
  );
1597
1598
  } catch (e) {
1599
+ console.error(e);
1598
1600
  req.flash(
1599
1601
  "error",
1600
1602
  e.message || req.__("Error installing module %s", plugin.name)
@@ -145,6 +145,7 @@ router.get(
145
145
  name: "regval",
146
146
  label: "",
147
147
  input_type: "code",
148
+ class: "enlarge-in-card",
148
149
  attributes: { mode: "application/json" },
149
150
  },
150
151
  ],
@@ -319,13 +320,16 @@ router.get(
319
320
  ),
320
321
  },
321
322
  {
322
- type: "card",
323
- title: cfg_link
324
- ? `Registry editor: ${cfg_link}`
325
- : ename && etype
326
- ? `Registry editor: ${ename} ${etype}`
327
- : "Registry editor",
328
- contents: edContents,
323
+ type: "container",
324
+ contents: {
325
+ type: "card",
326
+ title: cfg_link
327
+ ? `Registry editor: ${cfg_link}`
328
+ : ename && etype
329
+ ? `Registry editor: ${ename} ${etype}`
330
+ : "Registry editor",
331
+ contents: edContents,
332
+ },
329
333
  },
330
334
  ],
331
335
  },
package/routes/scapi.js CHANGED
@@ -25,7 +25,13 @@ const {
25
25
  stateFieldsToWhere,
26
26
  readState,
27
27
  } = require("@saltcorn/data/plugin-helper");
28
- const { getState } = require("@saltcorn/data/db/state");
28
+ const {
29
+ getState,
30
+ process_send,
31
+ add_tenant,
32
+ } = require("@saltcorn/data/db/state");
33
+ const db = require("@saltcorn/data/db");
34
+ const { loadAllPlugins } = require("../load_plugins");
29
35
 
30
36
  /**
31
37
  * @type {object}
@@ -49,8 +55,8 @@ function accessAllowedRead(req, user) {
49
55
  req.user && req.user.id
50
56
  ? req.user.role_id
51
57
  : user && user.role_id
52
- ? user.role_id
53
- : 100;
58
+ ? user.role_id
59
+ : 100;
54
60
 
55
61
  if (role === 1) return true;
56
62
  return false;
@@ -326,3 +332,33 @@ router.get(
326
332
  )(req, res, next);
327
333
  })
328
334
  );
335
+
336
+ router.post(
337
+ "/reload",
338
+ error_catcher(async (req, res, next) => {
339
+ await passport.authenticate(
340
+ "api-bearer",
341
+ { session: false },
342
+ async function (err, user, info) {
343
+ if (accessAllowedRead(req, user)) {
344
+ const { tenant, new_tenant } = req.body;
345
+ if (new_tenant) {
346
+ add_tenant(new_tenant);
347
+
348
+ await db.runWithTenant(new_tenant, loadAllPlugins);
349
+
350
+ process_send({ createTenant: new_tenant });
351
+ }
352
+ if (tenant) {
353
+ await db.runWithTenant(tenant, async () => {
354
+ await getState().refresh_plugins();
355
+ });
356
+ } else await getState().refresh_plugins();
357
+ res.json({ success: true });
358
+ } else {
359
+ res.status(401).json({ error: req.__("Not authorized") });
360
+ }
361
+ }
362
+ )(req, res, next);
363
+ })
364
+ );
package/routes/tables.js CHANGED
@@ -2219,6 +2219,7 @@ router.post(
2219
2219
  await table.deleteRows({}, req.user, true);
2220
2220
  req.flash("success", req.__("Deleted all rows"));
2221
2221
  } catch (e) {
2222
+ console.error(e)
2222
2223
  req.flash("error", e.message);
2223
2224
  }
2224
2225
 
@@ -2475,20 +2476,6 @@ router.post(
2475
2476
  },
2476
2477
  edit.id
2477
2478
  );
2478
- const add_to_menu = async (item) => {
2479
- const current_menu = getState().getConfigCopy("menu_items", []);
2480
- const existing = current_menu.findIndex((m) => m.label === item.label);
2481
- if (existing >= 0) current_menu[existing] = item;
2482
- else current_menu.push(item);
2483
- await save_menu_items(current_menu);
2484
- };
2485
-
2486
- await add_to_menu({
2487
- label: table.name,
2488
- type: "View",
2489
- min_role: 100,
2490
- viewname: `List ${table.name}`,
2491
- });
2492
2479
 
2493
2480
  res.redirect(`/table/${table.id}`);
2494
2481
  })
package/routes/utils.js CHANGED
@@ -164,7 +164,7 @@ const set_custom_http_headers = (res, req, state) => {
164
164
  validateHeaderName(k);
165
165
  validateHeaderValue(k, val);
166
166
  res.header(k, val);
167
- } catch (e) {
167
+ } catch (e) {
168
168
  Crash.create(e, { url: "/", headers: {} });
169
169
  }
170
170
  }
@@ -504,6 +504,7 @@ const sendHtmlFile = async (req, res, file) => {
504
504
  .sendWrap(req.__("An error occurred"), req.__("File not found"));
505
505
  }
506
506
  } catch (e) {
507
+ console.error(e)
507
508
  return res
508
509
  .status(404)
509
510
  .sendWrap(