@saltcorn/server 1.1.4-beta.9 → 1.2.0-beta.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 (392) hide show
  1. package/CHANGELOG.md +17 -1
  2. package/auth/admin.js +24 -1
  3. package/auth/routes.js +24 -0
  4. package/docs/assets/search.js +1 -1
  5. package/docs/classes/_saltcorn_common_code.Relation.html +31 -9
  6. package/docs/classes/_saltcorn_common_code.RelationsFinder.html +5 -5
  7. package/docs/classes/_saltcorn_data.models.Crash-1.html +18 -18
  8. package/docs/classes/_saltcorn_data.models.EventLog-1.html +19 -19
  9. package/docs/classes/_saltcorn_data.models.Field.html +71 -71
  10. package/docs/classes/_saltcorn_data.models.FieldRepeat-1.html +17 -17
  11. package/docs/classes/_saltcorn_data.models.File-1.html +48 -48
  12. package/docs/classes/_saltcorn_data.models.Form-1.html +38 -38
  13. package/docs/classes/_saltcorn_data.models.Library.html +13 -13
  14. package/docs/classes/_saltcorn_data.models.Page.html +24 -24
  15. package/docs/classes/_saltcorn_data.models.PageGroup-1.html +25 -25
  16. package/docs/classes/_saltcorn_data.models.Plugin.html +25 -25
  17. package/docs/classes/_saltcorn_data.models.Role.html +9 -9
  18. package/docs/classes/_saltcorn_data.models.Table-1.html +96 -96
  19. package/docs/classes/_saltcorn_data.models.TableConstraint-1.html +14 -14
  20. package/docs/classes/_saltcorn_data.models.Trigger.html +36 -36
  21. package/docs/classes/_saltcorn_data.models.User-1.html +48 -48
  22. package/docs/classes/_saltcorn_data.models.View-1.html +52 -52
  23. package/docs/classes/_saltcorn_data.models.Workflow-1.html +17 -17
  24. package/docs/classes/_saltcorn_data.models.WorkflowRun.html +35 -35
  25. package/docs/classes/_saltcorn_data.models.WorkflowStep.html +25 -25
  26. package/docs/classes/_saltcorn_data.models.WorkflowTrace.html +18 -18
  27. package/docs/classes/_saltcorn_mobile_builder.MobileBuilder.html +36 -36
  28. package/docs/enums/_saltcorn_common_code.RelationType.html +7 -7
  29. package/docs/enums/_saltcorn_common_code.ViewDisplayType.html +4 -4
  30. package/docs/functions/_saltcorn_admin_models.backup.create_backup.html +1 -1
  31. package/docs/functions/_saltcorn_admin_models.backup.create_csv_from_rows.html +1 -1
  32. package/docs/functions/_saltcorn_admin_models.backup.restore.html +1 -1
  33. package/docs/functions/_saltcorn_admin_models.pack.add_to_menu.html +1 -1
  34. package/docs/functions/_saltcorn_admin_models.pack.can_install_pack.html +1 -1
  35. package/docs/functions/_saltcorn_admin_models.pack.fetch_available_packs.html +1 -1
  36. package/docs/functions/_saltcorn_admin_models.pack.fetch_pack_by_name.html +1 -1
  37. package/docs/functions/_saltcorn_admin_models.pack.install_pack.html +1 -1
  38. package/docs/functions/_saltcorn_admin_models.pack.library_pack.html +1 -1
  39. package/docs/functions/_saltcorn_admin_models.pack.model_instance_pack.html +1 -1
  40. package/docs/functions/_saltcorn_admin_models.pack.model_pack.html +1 -1
  41. package/docs/functions/_saltcorn_admin_models.pack.page_group_pack.html +1 -1
  42. package/docs/functions/_saltcorn_admin_models.pack.page_pack.html +1 -1
  43. package/docs/functions/_saltcorn_admin_models.pack.plugin_pack.html +1 -1
  44. package/docs/functions/_saltcorn_admin_models.pack.role_pack.html +1 -1
  45. package/docs/functions/_saltcorn_admin_models.pack.table_pack.html +1 -1
  46. package/docs/functions/_saltcorn_admin_models.pack.trigger_pack.html +1 -1
  47. package/docs/functions/_saltcorn_admin_models.pack.uninstall_pack.html +1 -1
  48. package/docs/functions/_saltcorn_admin_models.pack.view_pack.html +1 -1
  49. package/docs/functions/_saltcorn_admin_models.tenant.copy_tenant_template.html +1 -1
  50. package/docs/functions/_saltcorn_admin_models.tenant.create_tenant.html +1 -1
  51. package/docs/functions/_saltcorn_admin_models.tenant.deleteTenant.html +1 -1
  52. package/docs/functions/_saltcorn_admin_models.tenant.domain_sanitize.html +1 -1
  53. package/docs/functions/_saltcorn_admin_models.tenant.eachTenant.html +1 -1
  54. package/docs/functions/_saltcorn_admin_models.tenant.getAllTenantRows.html +1 -1
  55. package/docs/functions/_saltcorn_admin_models.tenant.getAllTenants.html +1 -1
  56. package/docs/functions/_saltcorn_admin_models.tenant.insertTenant.html +1 -1
  57. package/docs/functions/_saltcorn_admin_models.tenant.switchToTenant.html +1 -1
  58. package/docs/functions/_saltcorn_common_code.buildTableCaches.html +1 -1
  59. package/docs/functions/_saltcorn_common_code.parseLegacyRelation.html +1 -1
  60. package/docs/functions/_saltcorn_common_code.parseRelationPath.html +1 -1
  61. package/docs/functions/_saltcorn_data.models.config.check_email_mask.html +1 -1
  62. package/docs/functions/_saltcorn_data.models.config.deleteConfig.html +1 -1
  63. package/docs/functions/_saltcorn_data.models.config.getAllConfig.html +1 -1
  64. package/docs/functions/_saltcorn_data.models.config.getConfig.html +1 -1
  65. package/docs/functions/_saltcorn_data.models.config.get_base_url.html +1 -1
  66. package/docs/functions/_saltcorn_data.models.config.get_latest_npm_version.html +1 -1
  67. package/docs/functions/_saltcorn_data.models.config.remove_from_menu.html +1 -1
  68. package/docs/functions/_saltcorn_data.models.config.save_menu_items.html +1 -1
  69. package/docs/functions/_saltcorn_data.models.config.setConfig.html +1 -1
  70. package/docs/functions/_saltcorn_data.models.discovery.discover_tables.html +1 -1
  71. package/docs/functions/_saltcorn_data.models.discovery.discoverable_tables.html +1 -1
  72. package/docs/functions/_saltcorn_data.models.discovery.findType.html +3 -3
  73. package/docs/functions/_saltcorn_data.models.discovery.get_existing_views.html +1 -1
  74. package/docs/functions/_saltcorn_data.models.discovery.implement_discovery.html +1 -1
  75. package/docs/functions/_saltcorn_data.models.email.getMailTransport.html +1 -1
  76. package/docs/functions/_saltcorn_data.models.email.send_verification_email.html +1 -1
  77. package/docs/functions/_saltcorn_data.models.email.viewToEmailHtml.html +1 -1
  78. package/docs/functions/_saltcorn_data.models.expression.apply_calculated_fields.html +1 -1
  79. package/docs/functions/_saltcorn_data.models.expression.apply_calculated_fields_stored.html +1 -1
  80. package/docs/functions/_saltcorn_data.models.expression.eval_expression.html +1 -1
  81. package/docs/functions/_saltcorn_data.models.expression.expressionValidator.html +1 -1
  82. package/docs/functions/_saltcorn_data.models.expression.get_async_expression_function.html +1 -1
  83. package/docs/functions/_saltcorn_data.models.expression.get_expression_function.html +1 -1
  84. package/docs/functions/_saltcorn_data.models.expression.jsexprToWhere.html +1 -1
  85. package/docs/functions/_saltcorn_data.models.expression.recalculate_for_stored.html +1 -1
  86. package/docs/functions/_saltcorn_data.models.expression.transform_for_async.html +1 -1
  87. package/docs/functions/_saltcorn_data.models.layout.eachView.html +1 -1
  88. package/docs/functions/_saltcorn_data.models.layout.getStringsForI18n.html +1 -1
  89. package/docs/functions/_saltcorn_data.models.layout.getViews.html +1 -1
  90. package/docs/functions/_saltcorn_data.models.layout.translateLayout.html +1 -1
  91. package/docs/functions/_saltcorn_data.models.layout.traverse.html +1 -1
  92. package/docs/functions/_saltcorn_data.models.layout.traverseSync.html +1 -1
  93. package/docs/functions/_saltcorn_data.models.random.all_views.html +1 -1
  94. package/docs/functions/_saltcorn_data.models.random.fill_table_row.html +1 -1
  95. package/docs/functions/_saltcorn_data.models.random.initial_view.html +1 -1
  96. package/docs/functions/_saltcorn_data.models.random.random_table.html +1 -1
  97. package/docs/functions/_saltcorn_db_common.buildInsertBulkSql.html +1 -1
  98. package/docs/functions/_saltcorn_db_common.buildInsertSql.html +1 -1
  99. package/docs/functions/_saltcorn_db_common.doCount.html +1 -1
  100. package/docs/functions/_saltcorn_db_common.doDeleteWhere.html +1 -1
  101. package/docs/functions/_saltcorn_db_common.doListScTables.html +1 -1
  102. package/docs/functions/_saltcorn_db_common.doListTables.html +1 -1
  103. package/docs/functions/_saltcorn_db_common.doListUserDefinedTables.html +1 -1
  104. package/docs/functions/_saltcorn_db_common.do_add_index.html +1 -1
  105. package/docs/functions/_saltcorn_db_common.do_drop_index.html +1 -1
  106. package/docs/functions/_saltcorn_db_common.ftsFieldsSqlExpr.html +1 -1
  107. package/docs/functions/_saltcorn_db_common.mkSelectOptions.html +1 -1
  108. package/docs/functions/_saltcorn_db_common.mkVal.html +1 -1
  109. package/docs/functions/_saltcorn_db_common.mkWhere.html +1 -1
  110. package/docs/functions/_saltcorn_db_common.multi_tenant.enable_multi_tenant.html +1 -1
  111. package/docs/functions/_saltcorn_db_common.multi_tenant.getRequestContext.html +1 -1
  112. package/docs/functions/_saltcorn_db_common.multi_tenant.getTenantSchema.html +1 -1
  113. package/docs/functions/_saltcorn_db_common.multi_tenant.init.html +1 -1
  114. package/docs/functions/_saltcorn_db_common.multi_tenant.is_it_multi_tenant.html +1 -1
  115. package/docs/functions/_saltcorn_db_common.multi_tenant.runWithTenant.html +1 -1
  116. package/docs/functions/_saltcorn_db_common.orderByIsObject.html +1 -1
  117. package/docs/functions/_saltcorn_db_common.orderByIsOperator.html +1 -1
  118. package/docs/functions/_saltcorn_db_common.prefixFieldsInWhere.html +1 -1
  119. package/docs/functions/_saltcorn_db_common.reprAsJson.html +1 -1
  120. package/docs/functions/_saltcorn_db_common.sqlBinOp.html +1 -1
  121. package/docs/functions/_saltcorn_db_common.sqlFun.html +1 -1
  122. package/docs/functions/_saltcorn_db_common.sqlsanitize.html +1 -1
  123. package/docs/functions/_saltcorn_db_common.sqlsanitizeAllowDots.html +1 -1
  124. package/docs/functions/_saltcorn_db_common.subSelectWhere.html +1 -1
  125. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.androidFeatures.html +1 -1
  126. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.androidPermissions.html +1 -1
  127. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.buildTablesFile.html +1 -1
  128. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyPrepopulatedDb.html +1 -1
  129. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyServerFiles.html +1 -1
  130. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyShareExtFiles.html +1 -1
  131. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copySiteLogo.html +1 -1
  132. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyTranslationFiles.html +1 -1
  133. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.createSqliteDb.html +1 -1
  134. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.decodeProvisioningProfile.html +1 -1
  135. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.extractDomain.html +1 -1
  136. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.generateAndroidVersionCode.html +1 -1
  137. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyAndroidManifest.html +1 -1
  138. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyConfigXml.html +1 -1
  139. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyGradleConfig.html +1 -1
  140. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyInfoPlist.html +1 -1
  141. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyXcodeProjectFile.html +1 -1
  142. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepAppIcon.html +1 -1
  143. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareAppIcon.html +1 -1
  144. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareBuildDir.html +1 -1
  145. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareExportOptionsPlist.html +1 -1
  146. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareSplashIcon.html +1 -1
  147. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareSplashPage.html +1 -1
  148. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeCapacitorConfig.html +1 -1
  149. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeCfgFile.html +1 -1
  150. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeDataExtractionRules.html +1 -1
  151. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeNetworkSecurityConfig.html +1 -1
  152. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writePodfile.html +1 -1
  153. package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writePrivacyInfo.html +1 -1
  154. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.bundleMobileAppCode.html +1 -1
  155. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.bundlePackagesAndPlugins.html +1 -1
  156. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.copyMobileAppDirs.html +1 -1
  157. package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.copyPublicDirs.html +1 -1
  158. package/docs/functions/_saltcorn_sqlite.add_index.html +1 -1
  159. package/docs/functions/_saltcorn_sqlite.add_unique_constraint.html +1 -1
  160. package/docs/functions/_saltcorn_sqlite.begin.html +1 -1
  161. package/docs/functions/_saltcorn_sqlite.changeConnection.html +1 -1
  162. package/docs/functions/_saltcorn_sqlite.close.html +1 -1
  163. package/docs/functions/_saltcorn_sqlite.commit.html +1 -1
  164. package/docs/functions/_saltcorn_sqlite.count.html +1 -1
  165. package/docs/functions/_saltcorn_sqlite.deleteWhere.html +1 -1
  166. package/docs/functions/_saltcorn_sqlite.dropTable.html +1 -1
  167. package/docs/functions/_saltcorn_sqlite.dropTables.html +1 -1
  168. package/docs/functions/_saltcorn_sqlite.drop_index.html +1 -1
  169. package/docs/functions/_saltcorn_sqlite.drop_reset_schema.html +1 -1
  170. package/docs/functions/_saltcorn_sqlite.drop_unique_constraint.html +1 -1
  171. package/docs/functions/_saltcorn_sqlite.getVersion.html +1 -1
  172. package/docs/functions/_saltcorn_sqlite.get_db_filepath.html +1 -1
  173. package/docs/functions/_saltcorn_sqlite.get_sql_logging.html +1 -1
  174. package/docs/functions/_saltcorn_sqlite.init.html +1 -1
  175. package/docs/functions/_saltcorn_sqlite.insert.html +1 -1
  176. package/docs/functions/_saltcorn_sqlite.listScTables.html +1 -1
  177. package/docs/functions/_saltcorn_sqlite.listTables.html +1 -1
  178. package/docs/functions/_saltcorn_sqlite.listUserDefinedTables.html +1 -1
  179. package/docs/functions/_saltcorn_sqlite.query.html +1 -1
  180. package/docs/functions/_saltcorn_sqlite.rollback.html +1 -1
  181. package/docs/functions/_saltcorn_sqlite.select.html +1 -1
  182. package/docs/functions/_saltcorn_sqlite.selectMaybeOne.html +1 -1
  183. package/docs/functions/_saltcorn_sqlite.selectOne.html +1 -1
  184. package/docs/functions/_saltcorn_sqlite.set_sql_logging.html +1 -1
  185. package/docs/functions/_saltcorn_sqlite.slugify.html +1 -1
  186. package/docs/functions/_saltcorn_sqlite.sql_log.html +1 -1
  187. package/docs/functions/_saltcorn_sqlite.tryCatchInTransaction.html +1 -1
  188. package/docs/functions/_saltcorn_sqlite.update.html +1 -1
  189. package/docs/functions/_saltcorn_sqlite.updateWhere.html +1 -1
  190. package/docs/functions/_saltcorn_sqlite.withTransaction.html +1 -1
  191. package/docs/functions/_saltcorn_sqlite_mobile.add_index.html +1 -1
  192. package/docs/functions/_saltcorn_sqlite_mobile.add_unique_constraint.html +1 -1
  193. package/docs/functions/_saltcorn_sqlite_mobile.count.html +1 -1
  194. package/docs/functions/_saltcorn_sqlite_mobile.deleteWhere.html +1 -1
  195. package/docs/functions/_saltcorn_sqlite_mobile.drop_index.html +1 -1
  196. package/docs/functions/_saltcorn_sqlite_mobile.drop_reset_schema.html +1 -1
  197. package/docs/functions/_saltcorn_sqlite_mobile.drop_unique_constraint.html +1 -1
  198. package/docs/functions/_saltcorn_sqlite_mobile.init.html +1 -1
  199. package/docs/functions/_saltcorn_sqlite_mobile.insert.html +1 -1
  200. package/docs/functions/_saltcorn_sqlite_mobile.insertRows.html +1 -1
  201. package/docs/functions/_saltcorn_sqlite_mobile.listScTables.html +1 -1
  202. package/docs/functions/_saltcorn_sqlite_mobile.listTables.html +1 -1
  203. package/docs/functions/_saltcorn_sqlite_mobile.listUserDefinedTables.html +1 -1
  204. package/docs/functions/_saltcorn_sqlite_mobile.query.html +1 -1
  205. package/docs/functions/_saltcorn_sqlite_mobile.select.html +1 -1
  206. package/docs/functions/_saltcorn_sqlite_mobile.selectMaybeOne.html +1 -1
  207. package/docs/functions/_saltcorn_sqlite_mobile.selectOne.html +1 -1
  208. package/docs/functions/_saltcorn_sqlite_mobile.setConnectionObject.html +1 -1
  209. package/docs/functions/_saltcorn_sqlite_mobile.tableExists.html +1 -1
  210. package/docs/functions/_saltcorn_sqlite_mobile.time.html +1 -1
  211. package/docs/functions/_saltcorn_sqlite_mobile.update.html +1 -1
  212. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_field.instanceOfField.html +1 -1
  213. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_page.instanceOfPage.html +1 -1
  214. package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_view.instanceOfView.html +1 -1
  215. package/docs/functions/_saltcorn_types.Types.base_types.instanceOWithHtmlFile.html +1 -1
  216. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfErrorMsg.html +1 -1
  217. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfSuccessMsg.html +1 -1
  218. package/docs/functions/_saltcorn_types.Types.common_types.instanceOfType.html +1 -1
  219. package/docs/functions/_saltcorn_types.generators.generateBool.html +1 -1
  220. package/docs/functions/_saltcorn_types.generators.generateString.html +1 -1
  221. package/docs/functions/_saltcorn_types.generators.num_between.html +1 -1
  222. package/docs/functions/_saltcorn_types.generators.oneOf.html +1 -1
  223. package/docs/interfaces/_saltcorn_mobile_builder.common_build_utils.ScCapacitorConfig.html +10 -10
  224. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_field.AbstractField.html +14 -14
  225. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_field.AbstractFieldRepeat.html +3 -3
  226. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_form.AbstractForm.html +26 -26
  227. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_page.AbstractPage.html +7 -7
  228. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_role.AbstractRole.html +3 -3
  229. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_table.AbstractTable.html +7 -7
  230. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_trigger.AbstractTrigger.html +16 -16
  231. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_view.AbstractView.html +10 -10
  232. package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_workflow.AbstractWorkflow.html +13 -13
  233. package/docs/modules/_saltcorn_admin_models.backup.html +1 -1
  234. package/docs/modules/_saltcorn_admin_models.html +1 -1
  235. package/docs/modules/_saltcorn_admin_models.pack.html +1 -1
  236. package/docs/modules/_saltcorn_admin_models.tenant.html +1 -1
  237. package/docs/modules/_saltcorn_common_code.html +1 -1
  238. package/docs/modules/_saltcorn_data.html +56 -18
  239. package/docs/modules/_saltcorn_data.models.Crash.html +2 -2
  240. package/docs/modules/_saltcorn_data.models.EventLog.html +2 -2
  241. package/docs/modules/_saltcorn_data.models.FieldRepeat.html +2 -2
  242. package/docs/modules/_saltcorn_data.models.File.html +2 -2
  243. package/docs/modules/_saltcorn_data.models.Form.html +2 -2
  244. package/docs/modules/_saltcorn_data.models.PageGroup.html +2 -2
  245. package/docs/modules/_saltcorn_data.models.Table.html +2 -2
  246. package/docs/modules/_saltcorn_data.models.TableConstraint.html +2 -2
  247. package/docs/modules/_saltcorn_data.models.User.html +2 -2
  248. package/docs/modules/_saltcorn_data.models.View.html +2 -2
  249. package/docs/modules/_saltcorn_data.models.Workflow.html +2 -2
  250. package/docs/modules/_saltcorn_data.models.config.html +1 -1
  251. package/docs/modules/_saltcorn_data.models.discovery.html +1 -1
  252. package/docs/modules/_saltcorn_data.models.email.html +1 -1
  253. package/docs/modules/_saltcorn_data.models.expression.html +1 -1
  254. package/docs/modules/_saltcorn_data.models.html +1 -1
  255. package/docs/modules/_saltcorn_data.models.layout.html +1 -1
  256. package/docs/modules/_saltcorn_data.models.random.html +1 -1
  257. package/docs/modules/_saltcorn_data.models.scheduler.html +1 -1
  258. package/docs/modules/_saltcorn_data.plugin_helper.html +1 -1
  259. package/docs/modules/_saltcorn_data.utils.html +1 -1
  260. package/docs/modules/_saltcorn_db_common.html +2 -2
  261. package/docs/modules/_saltcorn_db_common.multi_tenant.html +1 -1
  262. package/docs/modules/_saltcorn_markup.html +13 -13
  263. package/docs/modules/_saltcorn_mobile_builder.common_build_utils.html +1 -1
  264. package/docs/modules/_saltcorn_mobile_builder.html +1 -1
  265. package/docs/modules/_saltcorn_mobile_builder.package_bundle_utils.html +1 -1
  266. package/docs/modules/_saltcorn_sqlite.html +1 -1
  267. package/docs/modules/_saltcorn_sqlite_mobile.html +1 -1
  268. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_field.html +1 -1
  269. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_form.html +1 -1
  270. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_library.html +1 -1
  271. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_page.html +1 -1
  272. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_plugin.html +1 -1
  273. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_role.html +1 -1
  274. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_table.html +1 -1
  275. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_trigger.html +1 -1
  276. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_view.html +1 -1
  277. package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_workflow.html +1 -1
  278. package/docs/modules/_saltcorn_types.ModelAbstracts.html +1 -1
  279. package/docs/modules/_saltcorn_types.Types.base_types.html +1 -1
  280. package/docs/modules/_saltcorn_types.Types.common_types.html +1 -1
  281. package/docs/modules/_saltcorn_types.Types.html +1 -1
  282. package/docs/modules/_saltcorn_types.generators.html +1 -1
  283. package/docs/modules/_saltcorn_types.html +1 -1
  284. package/docs/types/_saltcorn_data.models.Crash.CrashCfg.html +1 -1
  285. package/docs/types/_saltcorn_data.models.EventLog.EventLogCfg.html +1 -1
  286. package/docs/types/_saltcorn_data.models.FieldRepeat.FieldRepeatCfg.html +1 -1
  287. package/docs/types/_saltcorn_data.models.File.FileCfg.html +1 -1
  288. package/docs/types/_saltcorn_data.models.Form.AdditionalButton.html +1 -1
  289. package/docs/types/_saltcorn_data.models.Form.FormCfg.html +1 -1
  290. package/docs/types/_saltcorn_data.models.PageGroup.ScreenInfoParams.html +1 -1
  291. package/docs/types/_saltcorn_data.models.Table.ChildRelations.html +1 -1
  292. package/docs/types/_saltcorn_data.models.Table.ParentRelations.html +1 -1
  293. package/docs/types/_saltcorn_data.models.Table.RelationData.html +1 -1
  294. package/docs/types/_saltcorn_data.models.TableConstraint.TableConstraintCfg.html +1 -1
  295. package/docs/types/_saltcorn_data.models.User.UserCfg.html +1 -1
  296. package/docs/types/_saltcorn_data.models.View.FindViewsPred.html +1 -1
  297. package/docs/types/_saltcorn_data.models.Workflow.WorkflowCfg.html +1 -1
  298. package/docs/types/_saltcorn_db_common.AggregationOptions.html +1 -1
  299. package/docs/types/_saltcorn_db_common.CoordOpts.html +1 -1
  300. package/docs/types/_saltcorn_db_common.DatabaseClient.html +1 -1
  301. package/docs/types/_saltcorn_db_common.JoinField.html +1 -1
  302. package/docs/types/_saltcorn_db_common.JoinFields.html +1 -1
  303. package/docs/types/_saltcorn_db_common.JoinOptions.html +1 -1
  304. package/docs/types/_saltcorn_db_common.JsonPath.html +1 -1
  305. package/docs/types/_saltcorn_db_common.JsonPathElem.html +1 -1
  306. package/docs/types/_saltcorn_db_common.Operator.html +1 -1
  307. package/docs/types/_saltcorn_db_common.PrimaryKeyValue.html +1 -1
  308. package/docs/types/_saltcorn_db_common.Row.html +1 -1
  309. package/docs/types/_saltcorn_db_common.SelectOptions.html +1 -1
  310. package/docs/types/_saltcorn_db_common.SqlAndValues.html +1 -1
  311. package/docs/types/_saltcorn_db_common.SubselectOptions.html +1 -1
  312. package/docs/types/_saltcorn_db_common.Value.html +1 -1
  313. package/docs/types/_saltcorn_db_common.Where.html +1 -1
  314. package/docs/types/_saltcorn_mobile_builder.IosCfg.html +1 -1
  315. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_field.FieldCfg.html +1 -1
  316. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_field.InputType.html +1 -1
  317. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_form.AdditionalButton.html +1 -1
  318. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_library.LibraryCfg.html +1 -1
  319. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_library.LibraryPack.html +1 -1
  320. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_page.PageCfg.html +1 -1
  321. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_page.PagePack.html +1 -1
  322. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_plugin.PluginCfg.html +1 -1
  323. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_plugin.PluginPack.html +1 -1
  324. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_role.RoleCfg.html +1 -1
  325. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_role.RolePack.html +1 -1
  326. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_table.TableCfg.html +1 -1
  327. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_table.TablePack.html +1 -1
  328. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_trigger.TriggerCfg.html +1 -1
  329. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_trigger.TriggerPack.html +1 -1
  330. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_view.ViewCfg.html +1 -1
  331. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_view.ViewPack.html +1 -1
  332. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_workflow.ConfigWorkflowStep.html +1 -1
  333. package/docs/types/_saltcorn_types.ModelAbstracts.abstract_workflow.RunResult.html +1 -1
  334. package/docs/types/_saltcorn_types.Types.base_types.Action.html +1 -1
  335. package/docs/types/_saltcorn_types.Types.base_types.AuthenticationMethod.html +1 -1
  336. package/docs/types/_saltcorn_types.Types.base_types.CapacitorPlugin.html +1 -1
  337. package/docs/types/_saltcorn_types.Types.base_types.CodePagePack.html +1 -1
  338. package/docs/types/_saltcorn_types.Types.base_types.Column.html +1 -1
  339. package/docs/types/_saltcorn_types.Types.base_types.ConnectedObjects.html +1 -1
  340. package/docs/types/_saltcorn_types.Types.base_types.CopilotSkill.html +1 -1
  341. package/docs/types/_saltcorn_types.Types.base_types.FieldLike.html +1 -1
  342. package/docs/types/_saltcorn_types.Types.base_types.FieldView.html +1 -1
  343. package/docs/types/_saltcorn_types.Types.base_types.Header.html +1 -1
  344. package/docs/types/_saltcorn_types.Types.base_types.JoinFieldOption.html +1 -1
  345. package/docs/types/_saltcorn_types.Types.base_types.Layout.html +1 -1
  346. package/docs/types/_saltcorn_types.Types.base_types.MobileConfig.html +1 -1
  347. package/docs/types/_saltcorn_types.Types.base_types.ModelPattern.html +1 -1
  348. package/docs/types/_saltcorn_types.Types.base_types.Pack.html +1 -1
  349. package/docs/types/_saltcorn_types.Types.base_types.Plugin.html +1 -1
  350. package/docs/types/_saltcorn_types.Types.base_types.PluginFunction.html +1 -1
  351. package/docs/types/_saltcorn_types.Types.base_types.PluginLayout.html +1 -1
  352. package/docs/types/_saltcorn_types.Types.base_types.PluginRoute.html +1 -1
  353. package/docs/types/_saltcorn_types.Types.base_types.PluginSourceType.html +1 -1
  354. package/docs/types/_saltcorn_types.Types.base_types.PluginType.html +1 -1
  355. package/docs/types/_saltcorn_types.Types.base_types.PluginWrap.html +1 -1
  356. package/docs/types/_saltcorn_types.Types.base_types.PluginWrapArg.html +1 -1
  357. package/docs/types/_saltcorn_types.Types.base_types.RelationOption.html +1 -1
  358. package/docs/types/_saltcorn_types.Types.base_types.Req.html +1 -1
  359. package/docs/types/_saltcorn_types.Types.base_types.Res.html +1 -1
  360. package/docs/types/_saltcorn_types.Types.base_types.RouteAction.html +1 -1
  361. package/docs/types/_saltcorn_types.Types.base_types.RunExtra.html +1 -1
  362. package/docs/types/_saltcorn_types.Types.base_types.TableProvider.html +1 -1
  363. package/docs/types/_saltcorn_types.Types.base_types.TableQuery.html +1 -1
  364. package/docs/types/_saltcorn_types.Types.base_types.Tablely.html +1 -1
  365. package/docs/types/_saltcorn_types.Types.base_types.ViewTemplate.html +1 -1
  366. package/docs/types/_saltcorn_types.Types.common_types.ErrorMessage.html +1 -1
  367. package/docs/types/_saltcorn_types.Types.common_types.GenObj.html +1 -1
  368. package/docs/types/_saltcorn_types.Types.common_types.ReqRes.html +1 -1
  369. package/docs/types/_saltcorn_types.Types.common_types.ResultMessage.html +1 -1
  370. package/docs/types/_saltcorn_types.Types.common_types.SuccessMessage.html +1 -1
  371. package/docs/types/_saltcorn_types.Types.common_types.Type.html +17 -4
  372. package/docs/variables/_saltcorn_data.db.html +1 -1
  373. package/docs/variables/_saltcorn_data.migrations.html +1 -1
  374. package/docs/variables/_saltcorn_data.models.config.available_languages.html +1 -1
  375. package/docs/variables/_saltcorn_data.models.config.configTypes.html +1 -1
  376. package/docs/variables/_saltcorn_data.models.scheduler.runScheduler.html +1 -1
  377. package/docs/variables/_saltcorn_data.plugin_helper.run_action_column.html +1 -1
  378. package/docs/variables/_saltcorn_data.utils.NotAuthorized.html +1 -1
  379. package/docs/variables/_saltcorn_data.utils.sleep.html +1 -1
  380. package/docs/variables/_saltcorn_db_common.multi_tenant.tenantNamespace.html +1 -1
  381. package/locales/da.json +57 -1
  382. package/locales/en.json +3 -1
  383. package/package.json +9 -9
  384. package/public/saltcorn-common.js +22 -11
  385. package/public/saltcorn.js +10 -3
  386. package/routes/admin.js +36 -28
  387. package/routes/fields.js +1 -6
  388. package/routes/infoarch.js +60 -15
  389. package/routes/menu.js +1 -1
  390. package/routes/plugins.js +1 -1
  391. package/routes/registry.js +17 -0
  392. package/tests/menu.test.js +122 -0
package/locales/da.json CHANGED
@@ -860,5 +860,61 @@
860
860
  "Always show create view": "Vis altid opret visning",
861
861
  "If off, only show create view if the query state is about the current user": "Hvis slukket, vis kun opret visning, hvis forespørgselstilstanden handler om den nuværende bruger.",
862
862
  "The current theme has no user specific settings": "The current theme has no user specific settings",
863
- "View '%s' was loaded": "View '%s' was loaded"
863
+ "View '%s' was loaded": "View '%s' was loaded",
864
+ "After delete": "After delete",
865
+ "Working directory": "Working directory",
866
+ "All tags": "All tags",
867
+ "Manage tags...": "Manage tags...",
868
+ "Triggers on table": "Triggers on table",
869
+ "Create trigger": "Create trigger",
870
+ "Create model": "Create model",
871
+ "Delete table": "Delete table",
872
+ "Delete table+views+triggers": "Delete table+views+triggers",
873
+ "Sync information": "Sync information",
874
+ "Sync information tracks the last modification or deletion timestamp so that the table data can be synchronized with the mobile app": "Sync information tracks the last modification or deletion timestamp so that the table data can be synchronized with the mobile app",
875
+ "Models": "Models",
876
+ "Row inclusion formula": "Row inclusion formula",
877
+ "Only include rows where this formula is true. ": "Only include rows where this formula is true. ",
878
+ "In scope:": "In scope:",
879
+ "Error message": "Error message",
880
+ "Error shown to user if uniqueness is violated": "Error shown to user if uniqueness is violated",
881
+ "Calculated field will be stored in Database": "Calculated field will be stored in Database",
882
+ "Protected": "Protected",
883
+ "Set role to access": "Set role to access",
884
+ "User must have this role or higher to update or create field values": "User must have this role or higher to update or create field values",
885
+ "The field that will be shown to the user when choosing a value": "The field that will be shown to the user when choosing a value",
886
+ "Include in full-text search": "Include in full-text search",
887
+ "On delete": "On delete",
888
+ "Prevent any deletion of parent rows": "Prevent any deletion of parent rows",
889
+ "If the parent row is deleted, automatically delete the child rows.": "If the parent row is deleted, automatically delete the child rows.",
890
+ "If the parent row is deleted, set key fields on child rows to null": "If the parent row is deleted, set key fields on child rows to null",
891
+ "If the parent row is deleted, do this to the child rows.": "If the parent row is deleted, do this to the child rows.",
892
+ "Installed theme": "Installed theme",
893
+ "Theme for role": "Theme for role",
894
+ "Set theme for each user role »": "Set theme for each user role »",
895
+ "Available themes": "Available themes",
896
+ "Install more themes »": "Install more themes »",
897
+ "The view name is part of the URL when it is shown alone.": "The view name is part of the URL when it is shown alone.",
898
+ "Some view patterns accept interpolations. Ex: <code>{{ name }}</code> or <code>{{ row ? `Edit ${row.name}` : `New person` }}</code>": "Some view patterns accept interpolations. Ex: <code>{{ name }}</code> or <code>{{ row ? `Edit ${row.name}` : `New person` }}</code>",
899
+ "Page description": "Page description",
900
+ "For search engines. Some view patterns accept interpolations.": "For search engines. Some view patterns accept interpolations.",
901
+ "No menu": "No menu",
902
+ "Omit the menu from this view": "Omit the menu from this view",
903
+ "Popup width": "Popup width",
904
+ "Popup min width": "Popup min width",
905
+ "Show an icon in the title bar to indicate when form data is being saved": "Show an icon in the title bar to indicate when form data is being saved",
906
+ "Link out?": "Link out?",
907
+ "Show a link to open popup contents in new tab": "Show a link to open popup contents in new tab",
908
+ "Search for...": "Search for...",
909
+ "Clean modules and restart": "Clean modules and restart",
910
+ "Mobile": "Mobile",
911
+ "Create new row": "Create new row",
912
+ "Locale identifier short code, e.g. en, zh, fr, ar etc. ": "Locale identifier short code, e.g. en, zh, fr, ar etc. ",
913
+ "Is this the default language in which the application is built?": "Is this the default language in which the application is built?",
914
+ "Translate with LLM": "Translate with LLM",
915
+ "Pagegroups": "Pagegroups",
916
+ "Registry editor": "Registry editor",
917
+ "Choose File": "Choose File",
918
+ "No file chosen": "No file chosen",
919
+ "Fixed and blocked fields": "Fixed and blocked fields"
864
920
  }
package/locales/en.json CHANGED
@@ -1602,5 +1602,7 @@
1602
1602
  "Translated %s strings. Click 'Translate with LLM' again to continue": "Translated %s strings. Click 'Translate with LLM' again to continue",
1603
1603
  "Translate with LLM": "Translate with LLM",
1604
1604
  "You may need to adjust view relations associated with this table after renaming it": "You may need to adjust view relations associated with this table after renaming it",
1605
- "Error running workflow": "Error running workflow"
1605
+ "Error running workflow": "Error running workflow",
1606
+ "Choose File": "Choose File",
1607
+ "No file chosen": "No file chosen"
1606
1608
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@saltcorn/server",
3
- "version": "1.1.4-beta.9",
3
+ "version": "1.2.0-beta.0",
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.14.1",
11
- "@saltcorn/base-plugin": "1.1.4-beta.9",
12
- "@saltcorn/builder": "1.1.4-beta.9",
13
- "@saltcorn/data": "1.1.4-beta.9",
14
- "@saltcorn/admin-models": "1.1.4-beta.9",
15
- "@saltcorn/filemanager": "1.1.4-beta.9",
16
- "@saltcorn/markup": "1.1.4-beta.9",
17
- "@saltcorn/plugins-loader": "1.1.4-beta.9",
18
- "@saltcorn/sbadmin2": "1.1.4-beta.9",
11
+ "@saltcorn/base-plugin": "1.2.0-beta.0",
12
+ "@saltcorn/builder": "1.2.0-beta.0",
13
+ "@saltcorn/data": "1.2.0-beta.0",
14
+ "@saltcorn/admin-models": "1.2.0-beta.0",
15
+ "@saltcorn/filemanager": "1.2.0-beta.0",
16
+ "@saltcorn/markup": "1.2.0-beta.0",
17
+ "@saltcorn/plugins-loader": "1.2.0-beta.0",
18
+ "@saltcorn/sbadmin2": "1.2.0-beta.0",
19
19
  "@socket.io/cluster-adapter": "^0.2.1",
20
20
  "@socket.io/sticky": "^1.0.1",
21
21
  "adm-zip": "0.5.16",
@@ -736,6 +736,14 @@ function escapeHtml(text) {
736
736
  });
737
737
  }
738
738
 
739
+ function unescapeHtml(str) {
740
+ if (!str || !str.replace) return str;
741
+ return str
742
+ .replaceAll("&lt;", "<")
743
+ .replaceAll("&gt;", ">")
744
+ .replaceAll("&amp;", "&");
745
+ }
746
+
739
747
  function reload_on_init() {
740
748
  localStorage.setItem("reload_on_init", true);
741
749
  }
@@ -1018,7 +1026,8 @@ function initialize_page() {
1018
1026
  );
1019
1027
  }
1020
1028
  });
1021
- $("[data-inline-edit-dest-url]").click(function () {
1029
+ $("[data-inline-edit-dest-url]").click(function (event) {
1030
+ event.stopPropagation();
1022
1031
  var url = $(this).attr("data-inline-edit-dest-url");
1023
1032
  var current =
1024
1033
  $(this).attr("data-inline-edit-current") ||
@@ -1042,7 +1051,7 @@ function initialize_page() {
1042
1051
  })
1043
1052
  );
1044
1053
  $(this).replaceWith(
1045
- `<form method="post" action="/field/save-click-edit" onsubmit="inline_ajax_submit_with_fielddata(event, '${opts}')"
1054
+ `<form method="post" action="/field/save-click-edit" onclick="event.stopPropagation()" onsubmit="inline_ajax_submit_with_fielddata(event, '${opts}')"
1046
1055
  <input type="hidden" name="_csrf" value="${_sc_globalCsrf}">
1047
1056
  <input type="hidden" name="_fielddata" value="${fielddata}">
1048
1057
  <div class="input-group">
@@ -1124,7 +1133,8 @@ function initialize_page() {
1124
1133
  } else if (is_key) {
1125
1134
  const [tblName, target] = type.replace("Key:", "").split(".");
1126
1135
  doAjaxOptionsFetch(tblName, target);
1127
- } else
1136
+ } else {
1137
+ const parent = $(this).parent();
1128
1138
  $(this).replaceWith(
1129
1139
  `<form method="post" action="${url}" ${
1130
1140
  ajax
@@ -1154,17 +1164,18 @@ function initialize_page() {
1154
1164
  : "any"
1155
1165
  }"`
1156
1166
  : ""
1157
- } name="${key}" ${
1158
- type === "Bool"
1159
- ? current
1160
- ? "checked"
1161
- : ""
1162
- : `value="${escapeHtml(current)}"`
1163
- }>
1167
+ } name="${key}" ${type === "Bool" ? (current ? "checked" : "") : ``}>
1164
1168
  <button type="submit" class="btn btn-sm btn-primary">OK</button>
1165
- <button onclick="cancel_inline_edit(event, '${opts}')" type="button" class="btn btn-sm btn-danger"><i class="fas fa-times"></i></button>
1169
+ <button onclick="cancel_inline_edit(event, '${opts.replaceAll("'", "\\'")}')" type="button" class="btn btn-sm btn-danger"><i class="fas fa-times"></i></button>
1166
1170
  </form>`
1167
1171
  );
1172
+ if (type !== "Bool") {
1173
+ const newVal = $(this).attr("data-inline-edit-unescape")
1174
+ ? unescapeHtml(current)
1175
+ : current;
1176
+ parent.find(`[name="${key}"]`).val(newVal);
1177
+ }
1178
+ }
1168
1179
  });
1169
1180
  if (!isNode) {
1170
1181
  doMobileTransforms();
@@ -215,6 +215,7 @@ function pjax_to(href, e) {
215
215
  $dest.html(res);
216
216
  if (localizer.length) localizer.attr("data-sc-local-state", href);
217
217
  initialize_page();
218
+ document.dispatchEvent(new Event("pjax-loaded"));
218
219
  },
219
220
  error: function (res) {
220
221
  if (!checkNetworkError(res))
@@ -722,9 +723,15 @@ function checkNetworkError(e) {
722
723
  }
723
724
 
724
725
  function ajax_post_btn(e, reload_on_done, reload_delay) {
725
- var form = $(e).closest("form");
726
- var url = form.attr("action");
727
- var form_data = form.serialize();
726
+ let form_data = "";
727
+ let url;
728
+ if (typeof e === "string") url = e;
729
+ else if (e) {
730
+ var form = $(e).closest("form");
731
+ url = form.attr("action");
732
+ form_data = form.serialize();
733
+ }
734
+
728
735
  $.ajax(url, {
729
736
  type: "POST",
730
737
  headers: {
package/routes/admin.js CHANGED
@@ -360,7 +360,16 @@ router.get(
360
360
  */
361
361
  router.get(
362
362
  "/help/:topic",
363
- isAdmin,
363
+ isAdminOrHasConfigMinRole([
364
+ "min_role_edit_tables",
365
+ "min_role_inspect_tables",
366
+ "min_role_edit_views",
367
+ "min_role_edit_pages",
368
+ "min_role_edit_triggers",
369
+ "min_role_edit_search",
370
+ "min_role_edit_menu",
371
+ "min_role_edit_files",
372
+ ]),
364
373
  error_catcher(async (req, res) => {
365
374
  const { topic } = req.params;
366
375
  const { markup } = await get_help_markup(topic, req.query, req);
@@ -846,12 +855,12 @@ router.post(
846
855
  is_relative_url("/" + req.query.on_done_redirect)
847
856
  ? `/${req.query.on_done_redirect}`
848
857
  : type == "codepage"
849
- ? `/admin/edit-codepage/${name}`
850
- : type === "trigger"
851
- ? `/actions`
852
- : /^[a-z]+$/g.test(type)
853
- ? `/${type}edit`
854
- : "/"
858
+ ? `/admin/edit-codepage/${name}`
859
+ : type === "trigger"
860
+ ? `/actions`
861
+ : /^[a-z]+$/g.test(type)
862
+ ? `/${type}edit`
863
+ : "/"
855
864
  );
856
865
  })
857
866
  );
@@ -1352,20 +1361,20 @@ router.get(
1352
1361
  }
1353
1362
  )
1354
1363
  : isRoot && is_latest
1355
- ? span(
1356
- { class: "badge bg-primary ms-2" },
1357
- req.__("Latest")
1358
- ) +
1359
- post_btn(
1360
- "/admin/check-for-upgrade",
1361
- req.__("Check updates"),
1362
- req.csrfToken(),
1363
- {
1364
- btnClass: "btn-primary btn-sm px-1 py-0",
1365
- formClass: "d-inline",
1366
- }
1367
- )
1368
- : "",
1364
+ ? span(
1365
+ { class: "badge bg-primary ms-2" },
1366
+ req.__("Latest")
1367
+ ) +
1368
+ post_btn(
1369
+ "/admin/check-for-upgrade",
1370
+ req.__("Check updates"),
1371
+ req.csrfToken(),
1372
+ {
1373
+ btnClass: "btn-primary btn-sm px-1 py-0",
1374
+ formClass: "d-inline",
1375
+ }
1376
+ )
1377
+ : "",
1369
1378
  isRoot &&
1370
1379
  !git_commit &&
1371
1380
  a(
@@ -2134,9 +2143,8 @@ router.get(
2134
2143
  const filename = `${moment(start).format("YYYYMMDDHHmm")}.html`;
2135
2144
  await File.new_folder("configuration_checks");
2136
2145
  const go = async () => {
2137
- const { passes, errors, pass, warnings } = await runConfigurationCheck(
2138
- req
2139
- );
2146
+ const { passes, errors, pass, warnings } =
2147
+ await runConfigurationCheck(req);
2140
2148
  const end = new Date();
2141
2149
  const secs = Math.round((end.getTime() - start.getTime()) / 1000);
2142
2150
 
@@ -3413,8 +3421,8 @@ router.get(
3413
3421
  mode === "prepare"
3414
3422
  ? "_prepare_step"
3415
3423
  : mode === "finish"
3416
- ? "_finish_step"
3417
- : "";
3424
+ ? "_finish_step"
3425
+ : "";
3418
3426
  res.json({
3419
3427
  finished: await checkFiles(out_dir_name, [
3420
3428
  `logs${stepDesc}.txt`,
@@ -3489,8 +3497,8 @@ router.get(
3489
3497
  mode === "prepare"
3490
3498
  ? "_prepare_step"
3491
3499
  : mode === "finish"
3492
- ? "_finish_step"
3493
- : "";
3500
+ ? "_finish_step"
3501
+ : "";
3494
3502
  const resultMsg = files.find(
3495
3503
  (file) => file.filename === `logs${stepDesc}.txt`
3496
3504
  )
package/routes/fields.js CHANGED
@@ -307,12 +307,7 @@ const fieldFlow = (req) =>
307
307
  try {
308
308
  await db.withTransaction(async () => {
309
309
  if (context.id) {
310
- const field = await Field.findOne({ id: context.id });
311
-
312
- if (fldRow.label && field.label != fldRow.label) {
313
- fldRow.name = Field.labelToName(fldRow.label);
314
- }
315
-
310
+ const field = await Field.findOne({ id: context.id });
316
311
  await field.update(fldRow);
317
312
  Trigger.emitEvent(
318
313
  "AppChange",
@@ -19,13 +19,19 @@ const {
19
19
  upload_language_pack,
20
20
  } = require("../markup/admin.js");
21
21
  const { getState } = require("@saltcorn/data/db/state");
22
- const { div, a, i, text, button } = require("@saltcorn/markup/tags");
23
- const { mkTable, renderForm, post_delete_btn } = require("@saltcorn/markup");
22
+ const { span, div, a, i, text, button } = require("@saltcorn/markup/tags");
23
+ const {
24
+ mkTable,
25
+ renderForm,
26
+ post_delete_btn,
27
+ post_btn,
28
+ } = require("@saltcorn/markup");
24
29
  const Form = require("@saltcorn/data/models/form");
25
30
  const Snapshot = require("@saltcorn/admin-models/models/snapshot");
26
31
  const { stringify } = require("csv-stringify");
27
32
  const csvtojson = require("csvtojson");
28
33
  const { hasLLM, translate } = require("@saltcorn/data/translate");
34
+ const { escapeHtml } = require("@saltcorn/data/utils");
29
35
 
30
36
  /**
31
37
  * @type {object}
@@ -365,18 +371,35 @@ router.get(
365
371
  [
366
372
  {
367
373
  label: req.__("In default language"),
368
- key: "in_default",
374
+ key: (r) => escapeHtml(r.in_default),
369
375
  },
370
376
  {
371
377
  label: req.__("In %s", form.values.name),
372
378
  key: (r) =>
373
- div(
374
- {
375
- "data-inline-edit-dest-url": `/site-structure/localizer/save-string/${lang}/${encodeURIComponent(
376
- r.in_default
377
- )}`,
378
- },
379
- r.translated
379
+ span(
380
+ div(
381
+ {
382
+ "data-inline-edit-dest-url": `/site-structure/localizer/save-string/${lang}/${encodeURIComponent(
383
+ r.in_default
384
+ )}`,
385
+ "data-inline-edit-unescape": "true",
386
+ class: "d-inline",
387
+ },
388
+ escapeHtml(r.translated)
389
+ ),
390
+ r.in_default !== r.translated &&
391
+ post_btn(
392
+ `/site-structure/localizer/delete-string/${lang}/${encodeURIComponent(
393
+ r.in_default
394
+ )}`,
395
+ "",
396
+ req.csrfToken(),
397
+ {
398
+ icon: "fas fa-trash-alt",
399
+ btnClass: "btn-sm btn-xs btn-link link-danger",
400
+ formClass: "d-inline",
401
+ }
402
+ )
380
403
  ),
381
404
  },
382
405
  ],
@@ -415,6 +438,7 @@ router.post(
415
438
  let count = 0;
416
439
  for (const defstring of getState().getStringsForI18n()) {
417
440
  const cfgStrings = getState().getConfigCopy("localizer_strings", {});
441
+ if (!cfgStrings[lang]) cfgStrings[lang] = {};
418
442
  if (
419
443
  cfgStrings[lang][defstring] &&
420
444
  cfgStrings[lang][defstring] !== defstring
@@ -431,10 +455,12 @@ router.post(
431
455
  req.flash(
432
456
  "success",
433
457
  req.__(
434
- `Translated %s strings. Click 'Translate with LLM' again to continue`, count
458
+ `Translated %s strings. Click 'Translate with LLM' again to continue`,
459
+ count
435
460
  )
436
461
  );
437
- else req.flash("success", req.__(`Finished translating %s strings.`, count));
462
+ else
463
+ req.flash("success", req.__(`Finished translating %s strings.`, count));
438
464
  res.redirect(`/site-structure/localizer/edit/${lang}`);
439
465
  })
440
466
  );
@@ -459,9 +485,28 @@ router.post(
459
485
  return;
460
486
  }
461
487
  const cfgStrings = getState().getConfigCopy("localizer_strings");
462
- if (cfgStrings[lang])
463
- cfgStrings[lang][defstring] = text((req.body || {}).value);
464
- else cfgStrings[lang] = { [defstring]: text((req.body || {}).value) };
488
+ if (cfgStrings[lang]) cfgStrings[lang][defstring] = (req.body || {}).value;
489
+ else cfgStrings[lang] = { [defstring]: (req.body || {}).value };
490
+ await getState().setConfig("localizer_strings", cfgStrings);
491
+ res.redirect(`/site-structure/localizer/edit/${lang}`);
492
+ })
493
+ );
494
+
495
+ router.post(
496
+ "/localizer/delete-string/:lang/:defstring",
497
+ isAdmin,
498
+ error_catcher(async (req, res) => {
499
+ const { lang, defstring } = req.params;
500
+ if (
501
+ lang === "__proto__" ||
502
+ defstring === "__proto__" ||
503
+ lang === "constructor"
504
+ ) {
505
+ res.redirect(`/`);
506
+ return;
507
+ }
508
+ const cfgStrings = getState().getConfigCopy("localizer_strings");
509
+ if (cfgStrings[lang]) delete cfgStrings[lang][defstring];
465
510
  await getState().setConfig("localizer_strings", cfgStrings);
466
511
  res.redirect(`/site-structure/localizer/edit/${lang}`);
467
512
  })
package/routes/menu.js CHANGED
@@ -413,7 +413,7 @@ const menuForm = async (req) => {
413
413
  //default: "Standard",
414
414
  attributes: {
415
415
  inline: true,
416
- options: "Standard, Mobile Bottom, Secondary Menu",
416
+ options: ["Standard", "Mobile Bottom", "Secondary Menu"],
417
417
  },
418
418
  },
419
419
  ],
package/routes/plugins.js CHANGED
@@ -102,7 +102,7 @@ const pluginForm = (req, plugin) => {
102
102
  name: "source",
103
103
  type: getState().types.String,
104
104
  required: true,
105
- attributes: { options: "npm,local,github,git" },
105
+ attributes: { options: ["npm", "local", "github", "git"] },
106
106
  sublabel: req.__(
107
107
  "Source of module for install. Few options:" +
108
108
  "npm - download from npm repository," +
@@ -374,6 +374,23 @@ router.post(
374
374
  await db.withTransaction(async () => {
375
375
  await install_pack(pack);
376
376
  });
377
+ switch (etype) {
378
+ case "table":
379
+ await getState().refresh_tables();
380
+ break;
381
+ case "view":
382
+ await getState().refresh_views();
383
+ break;
384
+ case "page":
385
+ await getState().refresh_pages();
386
+ break;
387
+ case "trigger":
388
+ await getState().refresh_triggers();
389
+ break;
390
+ case "config":
391
+ await getState().refresh_config();
392
+ break;
393
+ }
377
394
  res.redirect(
378
395
  `/registry-editor?etype=${etype}&ename=${encodeURIComponent(
379
396
  ename
@@ -0,0 +1,122 @@
1
+ const request = require("supertest");
2
+ const getApp = require("../app");
3
+ const {
4
+ getAdminLoginCookie,
5
+ toInclude,
6
+ succeedJsonWith,
7
+ toSucceed,
8
+ toNotInclude,
9
+ resetToFixtures,
10
+ } = require("../auth/testhelp");
11
+ const { save_menu_items } = require("@saltcorn/data/models/config");
12
+
13
+ const db = require("@saltcorn/data/db");
14
+ const Page = require("@saltcorn/data/models/page");
15
+
16
+ beforeAll(async () => {
17
+ await resetToFixtures();
18
+ });
19
+ afterAll(db.close);
20
+
21
+ const createPagesIssue2952 = async () => {
22
+ await Page.create({
23
+ name: "test",
24
+ title: "myTitle",
25
+ description: "desc",
26
+ min_role: 100,
27
+ layout: {
28
+ above: [
29
+ {
30
+ type: "blank",
31
+ block: false,
32
+ contents: "test",
33
+ textStyle: "",
34
+ },
35
+ ],
36
+ },
37
+ fixed_states: {},
38
+ });
39
+ await Page.create({
40
+ name: "test-second",
41
+ title: "myTitle",
42
+ description: "desc",
43
+ min_role: 100,
44
+ layout: {
45
+ above: [
46
+ {
47
+ type: "blank",
48
+ block: false,
49
+ contents: "test-second",
50
+ textStyle: "",
51
+ },
52
+ ],
53
+ },
54
+ fixed_states: {},
55
+ });
56
+
57
+ await save_menu_items([
58
+ {
59
+ text: "test",
60
+ href: "",
61
+ icon: "undefined",
62
+ target: "_self",
63
+ title: "",
64
+ type: "Page",
65
+ label: "test",
66
+ style: "",
67
+ tooltip: "",
68
+ in_modal: false,
69
+ location: "Standard",
70
+ max_role: "1",
71
+ min_role: "1",
72
+ pagename: "test",
73
+ target_blank: false,
74
+ disable_on_mobile: false,
75
+ children: undefined,
76
+ },
77
+ {
78
+ text: "test-second",
79
+ href: "",
80
+ icon: "undefined",
81
+ target: "_self",
82
+ title: "",
83
+ type: "Page",
84
+ label: "test-second",
85
+ style: "",
86
+ tooltip: "",
87
+ in_modal: false,
88
+ location: "Standard",
89
+ max_role: "1",
90
+ min_role: "1",
91
+ pagename: "test-second",
92
+ target_blank: false,
93
+ disable_on_mobile: false,
94
+ children: undefined,
95
+ },
96
+ ]);
97
+ };
98
+
99
+ describe("Menu tests", () => {
100
+ it("highlights active menu item", async () => {
101
+ await createPagesIssue2952();
102
+ const app = await getApp({ disableCsrf: true });
103
+ const loginCookie = await getAdminLoginCookie();
104
+ {
105
+ const res = await request(app)
106
+ .get("/page/test")
107
+ .set("Cookie", loginCookie);
108
+ const matches = res.text.match(/class="nav-item active"/g);
109
+ expect(matches).toBeTruthy();
110
+ expect(matches?.length).toBe(1);
111
+ }
112
+ {
113
+ const res = await request(app)
114
+ .get("/page/test-second")
115
+ .set("Cookie", loginCookie);
116
+ expect(true).toBe(true);
117
+ const matches = res.text.match(/class="nav-item active"/g);
118
+ expect(matches).toBeTruthy();
119
+ expect(matches?.length).toBe(1);
120
+ }
121
+ });
122
+ });