@saltcorn/server 1.3.1-beta.0 → 1.3.1-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/auth/admin.js +9 -1
- package/auth/roleadmin.js +54 -1
- package/auth/routes.js +50 -5
- package/docs/assets/search.js +1 -1
- package/docs/classes/_saltcorn_common_code.Relation.html +10 -10
- package/docs/classes/_saltcorn_common_code.RelationsFinder.html +5 -5
- package/docs/classes/_saltcorn_data.models.Crash.html +17 -17
- package/docs/classes/_saltcorn_data.models.EventLog-1.html +19 -19
- package/docs/classes/_saltcorn_data.models.Field.html +74 -74
- package/docs/classes/_saltcorn_data.models.FieldRepeat.html +16 -16
- package/docs/classes/_saltcorn_data.models.File-1.html +48 -48
- package/docs/classes/_saltcorn_data.models.Form-1.html +39 -39
- package/docs/classes/_saltcorn_data.models.Library.html +13 -13
- package/docs/classes/_saltcorn_data.models.Page.html +24 -24
- package/docs/classes/_saltcorn_data.models.PageGroup-1.html +25 -25
- package/docs/classes/_saltcorn_data.models.Plugin.html +25 -25
- package/docs/classes/_saltcorn_data.models.Role.html +9 -9
- package/docs/classes/_saltcorn_data.models.Table-1.html +92 -92
- package/docs/classes/_saltcorn_data.models.TableConstraint.html +14 -14
- package/docs/classes/_saltcorn_data.models.Trigger.html +71 -39
- package/docs/classes/_saltcorn_data.models.User.html +51 -49
- package/docs/classes/_saltcorn_data.models.View-1.html +54 -54
- package/docs/classes/_saltcorn_data.models.Workflow.html +17 -17
- package/docs/classes/_saltcorn_data.models.WorkflowRun.html +35 -35
- package/docs/classes/_saltcorn_data.models.WorkflowStep.html +27 -27
- package/docs/classes/_saltcorn_data.models.WorkflowTrace.html +18 -18
- package/docs/classes/_saltcorn_mobile_builder.MobileBuilder.html +37 -37
- package/docs/enums/_saltcorn_common_code.RelationType.html +7 -7
- package/docs/enums/_saltcorn_common_code.ViewDisplayType.html +4 -4
- package/docs/functions/_saltcorn_admin_models.backup.create_backup.html +1 -1
- package/docs/functions/_saltcorn_admin_models.backup.create_csv_from_rows.html +1 -1
- package/docs/functions/_saltcorn_admin_models.backup.restore.html +1 -1
- package/docs/functions/_saltcorn_admin_models.pack.add_to_menu.html +1 -1
- package/docs/functions/_saltcorn_admin_models.pack.can_install_pack.html +1 -1
- package/docs/functions/_saltcorn_admin_models.pack.fetch_available_packs.html +1 -1
- package/docs/functions/_saltcorn_admin_models.pack.fetch_pack_by_name.html +1 -1
- package/docs/functions/_saltcorn_admin_models.pack.install_pack.html +1 -1
- package/docs/functions/_saltcorn_admin_models.pack.library_pack.html +1 -1
- package/docs/functions/_saltcorn_admin_models.pack.model_instance_pack.html +1 -1
- package/docs/functions/_saltcorn_admin_models.pack.model_pack.html +1 -1
- package/docs/functions/_saltcorn_admin_models.pack.page_group_pack.html +1 -1
- package/docs/functions/_saltcorn_admin_models.pack.page_pack.html +1 -1
- package/docs/functions/_saltcorn_admin_models.pack.plugin_pack.html +1 -1
- package/docs/functions/_saltcorn_admin_models.pack.role_pack.html +1 -1
- package/docs/functions/_saltcorn_admin_models.pack.table_pack.html +1 -1
- package/docs/functions/_saltcorn_admin_models.pack.trigger_pack.html +1 -1
- package/docs/functions/_saltcorn_admin_models.pack.uninstall_pack.html +1 -1
- package/docs/functions/_saltcorn_admin_models.pack.view_pack.html +1 -1
- package/docs/functions/_saltcorn_admin_models.tenant.copy_tenant_template.html +1 -1
- package/docs/functions/_saltcorn_admin_models.tenant.create_tenant.html +1 -1
- package/docs/functions/_saltcorn_admin_models.tenant.deleteTenant.html +1 -1
- package/docs/functions/_saltcorn_admin_models.tenant.domain_sanitize.html +1 -1
- package/docs/functions/_saltcorn_admin_models.tenant.eachTenant.html +1 -1
- package/docs/functions/_saltcorn_admin_models.tenant.getAllTenantRows.html +1 -1
- package/docs/functions/_saltcorn_admin_models.tenant.getAllTenants.html +1 -1
- package/docs/functions/_saltcorn_admin_models.tenant.insertTenant.html +1 -1
- package/docs/functions/_saltcorn_admin_models.tenant.switchToTenant.html +1 -1
- package/docs/functions/_saltcorn_common_code.buildTableCaches.html +1 -1
- package/docs/functions/_saltcorn_common_code.parseLegacyRelation.html +1 -1
- package/docs/functions/_saltcorn_common_code.parseRelationPath.html +1 -1
- package/docs/functions/_saltcorn_data.models.config.check_email_mask.html +1 -1
- package/docs/functions/_saltcorn_data.models.config.deleteConfig.html +1 -1
- package/docs/functions/_saltcorn_data.models.config.getAllConfig.html +1 -1
- package/docs/functions/_saltcorn_data.models.config.getConfig.html +1 -1
- package/docs/functions/_saltcorn_data.models.config.get_base_url.html +1 -1
- package/docs/functions/_saltcorn_data.models.config.get_latest_npm_version.html +1 -1
- package/docs/functions/_saltcorn_data.models.config.remove_from_menu.html +1 -1
- package/docs/functions/_saltcorn_data.models.config.save_menu_items.html +1 -1
- package/docs/functions/_saltcorn_data.models.config.setConfig.html +1 -1
- package/docs/functions/_saltcorn_data.models.discovery.discover_tables.html +1 -1
- package/docs/functions/_saltcorn_data.models.discovery.discoverable_tables.html +1 -1
- package/docs/functions/_saltcorn_data.models.discovery.findType.html +1 -1
- package/docs/functions/_saltcorn_data.models.discovery.get_existing_views.html +1 -1
- package/docs/functions/_saltcorn_data.models.discovery.implement_discovery.html +1 -1
- package/docs/functions/_saltcorn_data.models.email.getMailTransport.html +1 -1
- package/docs/functions/_saltcorn_data.models.email.send_verification_email.html +1 -1
- package/docs/functions/_saltcorn_data.models.email.viewToEmailHtml.html +1 -1
- package/docs/functions/_saltcorn_data.models.expression.apply_calculated_fields.html +1 -1
- package/docs/functions/_saltcorn_data.models.expression.apply_calculated_fields_stored.html +1 -1
- package/docs/functions/_saltcorn_data.models.expression.eval_expression.html +1 -1
- package/docs/functions/_saltcorn_data.models.expression.expressionValidator.html +1 -1
- package/docs/functions/_saltcorn_data.models.expression.get_async_expression_function.html +1 -1
- package/docs/functions/_saltcorn_data.models.expression.get_expression_function.html +1 -1
- package/docs/functions/_saltcorn_data.models.expression.jsexprToWhere.html +1 -1
- package/docs/functions/_saltcorn_data.models.expression.recalculate_for_stored.html +1 -1
- package/docs/functions/_saltcorn_data.models.expression.transform_for_async.html +1 -1
- package/docs/functions/_saltcorn_data.models.layout.eachView.html +1 -1
- package/docs/functions/_saltcorn_data.models.layout.getStringsForI18n.html +1 -1
- package/docs/functions/_saltcorn_data.models.layout.getViews.html +1 -1
- package/docs/functions/_saltcorn_data.models.layout.translateLayout.html +1 -1
- package/docs/functions/_saltcorn_data.models.layout.traverse.html +1 -1
- package/docs/functions/_saltcorn_data.models.layout.traverseSync.html +1 -1
- package/docs/functions/_saltcorn_data.models.random.all_views.html +1 -1
- package/docs/functions/_saltcorn_data.models.random.fill_table_row.html +1 -1
- package/docs/functions/_saltcorn_data.models.random.initial_view.html +1 -1
- package/docs/functions/_saltcorn_data.models.random.random_table.html +1 -1
- package/docs/functions/_saltcorn_db_common.buildInsertBulkSql.html +2 -1
- package/docs/functions/_saltcorn_db_common.buildInsertSql.html +2 -1
- package/docs/functions/_saltcorn_db_common.commitAndBeginNewTransaction.html +103 -0
- package/docs/functions/_saltcorn_db_common.doCount.html +2 -1
- package/docs/functions/_saltcorn_db_common.doDeleteWhere.html +2 -1
- package/docs/functions/_saltcorn_db_common.doListScTables.html +2 -1
- package/docs/functions/_saltcorn_db_common.doListTables.html +2 -1
- package/docs/functions/_saltcorn_db_common.doListUserDefinedTables.html +2 -1
- package/docs/functions/_saltcorn_db_common.do_add_index.html +2 -1
- package/docs/functions/_saltcorn_db_common.do_drop_index.html +2 -1
- package/docs/functions/_saltcorn_db_common.ftsFieldsSqlExpr.html +2 -1
- package/docs/functions/_saltcorn_db_common.mkSelectOptions.html +2 -1
- package/docs/functions/_saltcorn_db_common.mkVal.html +2 -1
- package/docs/functions/_saltcorn_db_common.mkWhere.html +2 -1
- package/docs/functions/_saltcorn_db_common.multi_tenant.enable_multi_tenant.html +2 -1
- package/docs/functions/_saltcorn_db_common.multi_tenant.getRequestContext.html +2 -1
- package/docs/functions/_saltcorn_db_common.multi_tenant.getTenantSchema.html +2 -1
- package/docs/functions/_saltcorn_db_common.multi_tenant.init.html +2 -1
- package/docs/functions/_saltcorn_db_common.multi_tenant.is_it_multi_tenant.html +2 -1
- package/docs/functions/_saltcorn_db_common.multi_tenant.runWithTenant.html +2 -1
- package/docs/functions/_saltcorn_db_common.orderByIsObject.html +2 -1
- package/docs/functions/_saltcorn_db_common.orderByIsOperator.html +2 -1
- package/docs/functions/_saltcorn_db_common.prefixFieldsInWhere.html +2 -1
- package/docs/functions/_saltcorn_db_common.reprAsJson.html +2 -1
- package/docs/functions/_saltcorn_db_common.slugify.html +2 -1
- package/docs/functions/_saltcorn_db_common.sqlBinOp.html +2 -1
- package/docs/functions/_saltcorn_db_common.sqlFun.html +2 -1
- package/docs/functions/_saltcorn_db_common.sqlsanitize.html +2 -1
- package/docs/functions/_saltcorn_db_common.sqlsanitizeAllowDots.html +2 -1
- package/docs/functions/_saltcorn_db_common.subSelectWhere.html +2 -1
- package/docs/functions/_saltcorn_db_common.tryCatchInTransaction.html +2 -1
- package/docs/functions/_saltcorn_db_common.withTransaction.html +2 -1
- package/docs/functions/_saltcorn_mobile_builder.common_build_utils.androidFeatures.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.common_build_utils.androidPermissions.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.common_build_utils.buildTablesFile.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyPrepopulatedDb.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyServerFiles.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyShareExtFiles.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copySiteLogo.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.common_build_utils.copyTranslationFiles.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.common_build_utils.createSqliteDb.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.common_build_utils.decodeProvisioningProfile.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.common_build_utils.extractDomain.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.common_build_utils.generateAndroidVersionCode.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyAndroidManifest.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyConfigXml.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyGradleConfig.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyInfoPlist.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.common_build_utils.modifyXcodeProjectFile.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepAppIcon.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareAppIcon.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareBuildDir.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareExportOptionsPlist.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareSplashIcon.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.common_build_utils.prepareSplashPage.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeCapacitorConfig.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeCfgFile.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeDataExtractionRules.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writeNetworkSecurityConfig.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writePodfile.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.common_build_utils.writePrivacyInfo.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.bundleMobileAppCode.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.bundlePackagesAndPlugins.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.copyMobileAppDirs.html +1 -1
- package/docs/functions/_saltcorn_mobile_builder.package_bundle_utils.copyPublicDirs.html +1 -1
- package/docs/functions/_saltcorn_sqlite.add_index.html +1 -1
- package/docs/functions/_saltcorn_sqlite.add_unique_constraint.html +1 -1
- package/docs/functions/_saltcorn_sqlite.begin.html +1 -1
- package/docs/functions/_saltcorn_sqlite.changeConnection.html +1 -1
- package/docs/functions/_saltcorn_sqlite.close.html +1 -1
- package/docs/functions/_saltcorn_sqlite.commit.html +1 -1
- package/docs/functions/_saltcorn_sqlite.count.html +1 -1
- package/docs/functions/_saltcorn_sqlite.deleteWhere.html +1 -1
- package/docs/functions/_saltcorn_sqlite.dropTable.html +1 -1
- package/docs/functions/_saltcorn_sqlite.dropTables.html +1 -1
- package/docs/functions/_saltcorn_sqlite.drop_index.html +1 -1
- package/docs/functions/_saltcorn_sqlite.drop_reset_schema.html +1 -1
- package/docs/functions/_saltcorn_sqlite.drop_unique_constraint.html +1 -1
- package/docs/functions/_saltcorn_sqlite.getVersion.html +1 -1
- package/docs/functions/_saltcorn_sqlite.get_db_filepath.html +1 -1
- package/docs/functions/_saltcorn_sqlite.get_sql_logging.html +1 -1
- package/docs/functions/_saltcorn_sqlite.init.html +1 -1
- package/docs/functions/_saltcorn_sqlite.insert.html +1 -1
- package/docs/functions/_saltcorn_sqlite.listScTables.html +1 -1
- package/docs/functions/_saltcorn_sqlite.listTables.html +1 -1
- package/docs/functions/_saltcorn_sqlite.listUserDefinedTables.html +1 -1
- package/docs/functions/_saltcorn_sqlite.query.html +1 -1
- package/docs/functions/_saltcorn_sqlite.rollback.html +1 -1
- package/docs/functions/_saltcorn_sqlite.select.html +1 -1
- package/docs/functions/_saltcorn_sqlite.selectMaybeOne.html +1 -1
- package/docs/functions/_saltcorn_sqlite.selectOne.html +1 -1
- package/docs/functions/_saltcorn_sqlite.set_sql_logging.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sql_log.html +1 -1
- package/docs/functions/_saltcorn_sqlite.update.html +1 -1
- package/docs/functions/_saltcorn_sqlite.updateWhere.html +1 -1
- package/docs/functions/_saltcorn_sqlite_mobile.add_index.html +1 -1
- package/docs/functions/_saltcorn_sqlite_mobile.add_unique_constraint.html +1 -1
- package/docs/functions/_saltcorn_sqlite_mobile.count.html +1 -1
- package/docs/functions/_saltcorn_sqlite_mobile.deleteWhere.html +1 -1
- package/docs/functions/_saltcorn_sqlite_mobile.drop_index.html +1 -1
- package/docs/functions/_saltcorn_sqlite_mobile.drop_reset_schema.html +1 -1
- package/docs/functions/_saltcorn_sqlite_mobile.drop_unique_constraint.html +1 -1
- package/docs/functions/_saltcorn_sqlite_mobile.init.html +1 -1
- package/docs/functions/_saltcorn_sqlite_mobile.insert.html +1 -1
- package/docs/functions/_saltcorn_sqlite_mobile.insertRows.html +1 -1
- package/docs/functions/_saltcorn_sqlite_mobile.listScTables.html +1 -1
- package/docs/functions/_saltcorn_sqlite_mobile.listTables.html +1 -1
- package/docs/functions/_saltcorn_sqlite_mobile.listUserDefinedTables.html +1 -1
- package/docs/functions/_saltcorn_sqlite_mobile.query.html +1 -1
- package/docs/functions/_saltcorn_sqlite_mobile.select.html +1 -1
- package/docs/functions/_saltcorn_sqlite_mobile.selectMaybeOne.html +1 -1
- package/docs/functions/_saltcorn_sqlite_mobile.selectOne.html +1 -1
- package/docs/functions/_saltcorn_sqlite_mobile.setConnectionObject.html +1 -1
- package/docs/functions/_saltcorn_sqlite_mobile.tableExists.html +1 -1
- package/docs/functions/_saltcorn_sqlite_mobile.time.html +1 -1
- package/docs/functions/_saltcorn_sqlite_mobile.update.html +1 -1
- package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_field.instanceOfField.html +1 -1
- package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_page.instanceOfPage.html +1 -1
- package/docs/functions/_saltcorn_types.ModelAbstracts.abstract_view.instanceOfView.html +1 -1
- package/docs/functions/_saltcorn_types.Types.base_types.instanceOWithHtmlFile.html +1 -1
- package/docs/functions/_saltcorn_types.Types.common_types.instanceOfErrorMsg.html +1 -1
- package/docs/functions/_saltcorn_types.Types.common_types.instanceOfSuccessMsg.html +1 -1
- package/docs/functions/_saltcorn_types.Types.common_types.instanceOfType.html +1 -1
- package/docs/functions/_saltcorn_types.generators.generateBool.html +1 -1
- package/docs/functions/_saltcorn_types.generators.generateString.html +1 -1
- package/docs/functions/_saltcorn_types.generators.num_between.html +1 -1
- package/docs/functions/_saltcorn_types.generators.oneOf.html +1 -1
- package/docs/interfaces/_saltcorn_mobile_builder.common_build_utils.ScCapacitorConfig.html +10 -10
- package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_field.AbstractField.html +15 -15
- package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_field.AbstractFieldRepeat.html +3 -3
- package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_form.AbstractForm.html +27 -27
- package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_page.AbstractPage.html +7 -7
- package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_role.AbstractRole.html +3 -3
- package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_table.AbstractTable.html +11 -11
- package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_trigger.AbstractTrigger.html +38 -16
- package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_view.AbstractView.html +10 -10
- package/docs/interfaces/_saltcorn_types.ModelAbstracts.abstract_workflow.AbstractWorkflow.html +13 -13
- package/docs/modules/_saltcorn_admin_models.backup.html +1 -1
- package/docs/modules/_saltcorn_admin_models.html +1 -1
- package/docs/modules/_saltcorn_admin_models.pack.html +1 -1
- package/docs/modules/_saltcorn_admin_models.tenant.html +1 -1
- package/docs/modules/_saltcorn_common_code.html +1 -1
- package/docs/modules/_saltcorn_data.html +3 -3
- package/docs/modules/_saltcorn_data.models.EventLog.html +2 -2
- package/docs/modules/_saltcorn_data.models.File.html +2 -2
- package/docs/modules/_saltcorn_data.models.Form.html +2 -2
- package/docs/modules/_saltcorn_data.models.PageGroup.html +2 -2
- package/docs/modules/_saltcorn_data.models.Table.html +2 -2
- package/docs/modules/_saltcorn_data.models.View.html +2 -2
- package/docs/modules/_saltcorn_data.models.config.html +1 -1
- package/docs/modules/_saltcorn_data.models.discovery.html +1 -1
- package/docs/modules/_saltcorn_data.models.email.html +1 -1
- package/docs/modules/_saltcorn_data.models.expression.html +1 -1
- package/docs/modules/_saltcorn_data.models.html +1 -1
- package/docs/modules/_saltcorn_data.models.layout.html +1 -1
- package/docs/modules/_saltcorn_data.models.random.html +1 -1
- package/docs/modules/_saltcorn_data.models.scheduler.html +1 -1
- package/docs/modules/_saltcorn_data.plugin_helper.html +1 -1
- package/docs/modules/_saltcorn_data.utils.html +3 -1
- package/docs/modules/_saltcorn_db_common.html +4 -2
- package/docs/modules/_saltcorn_db_common.multi_tenant.html +2 -1
- package/docs/modules/_saltcorn_markup.html +2 -2
- package/docs/modules/_saltcorn_mobile_builder.common_build_utils.html +1 -1
- package/docs/modules/_saltcorn_mobile_builder.html +1 -1
- package/docs/modules/_saltcorn_mobile_builder.package_bundle_utils.html +1 -1
- package/docs/modules/_saltcorn_sqlite.html +1 -1
- package/docs/modules/_saltcorn_sqlite_mobile.html +1 -1
- package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_field.html +1 -1
- package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_form.html +1 -1
- package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_library.html +1 -1
- package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_page.html +1 -1
- package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_plugin.html +1 -1
- package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_role.html +1 -1
- package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_table.html +1 -1
- package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_trigger.html +1 -1
- package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_view.html +1 -1
- package/docs/modules/_saltcorn_types.ModelAbstracts.abstract_workflow.html +1 -1
- package/docs/modules/_saltcorn_types.ModelAbstracts.html +1 -1
- package/docs/modules/_saltcorn_types.Types.base_types.html +1 -1
- package/docs/modules/_saltcorn_types.Types.common_types.html +1 -1
- package/docs/modules/_saltcorn_types.Types.html +1 -1
- package/docs/modules/_saltcorn_types.generators.html +1 -1
- package/docs/modules/_saltcorn_types.html +1 -1
- package/docs/types/_saltcorn_data.models.EventLog.EventLogCfg.html +1 -1
- package/docs/types/_saltcorn_data.models.File.FileCfg.html +1 -1
- package/docs/types/_saltcorn_data.models.Form.AdditionalButton.html +1 -1
- package/docs/types/_saltcorn_data.models.Form.FormCfg.html +1 -1
- package/docs/types/_saltcorn_data.models.PageGroup.ScreenInfoParams.html +1 -1
- package/docs/types/_saltcorn_data.models.Table.ChildRelations.html +1 -1
- package/docs/types/_saltcorn_data.models.Table.ParentRelations.html +1 -1
- package/docs/types/_saltcorn_data.models.Table.RelationData.html +1 -1
- package/docs/types/_saltcorn_data.models.View.FindViewsPred.html +1 -1
- package/docs/types/_saltcorn_db_common.AggregationOptions.html +2 -1
- package/docs/types/_saltcorn_db_common.CoordOpts.html +2 -1
- package/docs/types/_saltcorn_db_common.DatabaseClient.html +2 -1
- package/docs/types/_saltcorn_db_common.JoinField.html +2 -1
- package/docs/types/_saltcorn_db_common.JoinFields.html +2 -1
- package/docs/types/_saltcorn_db_common.JoinOptions.html +2 -1
- package/docs/types/_saltcorn_db_common.JsonPath.html +2 -1
- package/docs/types/_saltcorn_db_common.JsonPathElem.html +2 -1
- package/docs/types/_saltcorn_db_common.Operator.html +2 -1
- package/docs/types/_saltcorn_db_common.PartialSome.html +2 -1
- package/docs/types/_saltcorn_db_common.PrimaryKeyValue.html +2 -1
- package/docs/types/_saltcorn_db_common.Row.html +2 -1
- package/docs/types/_saltcorn_db_common.SelectOptions.html +2 -1
- package/docs/types/_saltcorn_db_common.SqlAndValues.html +2 -1
- package/docs/types/_saltcorn_db_common.StrongRow.html +2 -1
- package/docs/types/_saltcorn_db_common.SubselectOptions.html +2 -1
- package/docs/types/_saltcorn_db_common.Value.html +2 -1
- package/docs/types/_saltcorn_db_common.Where.html +2 -1
- package/docs/types/_saltcorn_mobile_builder.IosCfg.html +1 -1
- package/docs/types/_saltcorn_types.ModelAbstracts.abstract_field.FieldCfg.html +1 -1
- package/docs/types/_saltcorn_types.ModelAbstracts.abstract_field.InputType.html +1 -1
- package/docs/types/_saltcorn_types.ModelAbstracts.abstract_form.AdditionalButton.html +1 -1
- package/docs/types/_saltcorn_types.ModelAbstracts.abstract_library.LibraryCfg.html +1 -1
- package/docs/types/_saltcorn_types.ModelAbstracts.abstract_library.LibraryPack.html +1 -1
- package/docs/types/_saltcorn_types.ModelAbstracts.abstract_page.PageCfg.html +1 -1
- package/docs/types/_saltcorn_types.ModelAbstracts.abstract_page.PagePack.html +1 -1
- package/docs/types/_saltcorn_types.ModelAbstracts.abstract_plugin.PluginCfg.html +1 -1
- package/docs/types/_saltcorn_types.ModelAbstracts.abstract_plugin.PluginPack.html +1 -1
- package/docs/types/_saltcorn_types.ModelAbstracts.abstract_role.RoleCfg.html +1 -1
- package/docs/types/_saltcorn_types.ModelAbstracts.abstract_role.RolePack.html +1 -1
- package/docs/types/_saltcorn_types.ModelAbstracts.abstract_table.TableCfg.html +1 -1
- package/docs/types/_saltcorn_types.ModelAbstracts.abstract_table.TablePack.html +1 -1
- package/docs/types/_saltcorn_types.ModelAbstracts.abstract_trigger.TriggerCfg.html +1 -1
- package/docs/types/_saltcorn_types.ModelAbstracts.abstract_trigger.TriggerPack.html +1 -1
- package/docs/types/_saltcorn_types.ModelAbstracts.abstract_view.ViewCfg.html +1 -1
- package/docs/types/_saltcorn_types.ModelAbstracts.abstract_view.ViewPack.html +1 -1
- package/docs/types/_saltcorn_types.ModelAbstracts.abstract_workflow.ConfigWorkflowStep.html +1 -1
- package/docs/types/_saltcorn_types.ModelAbstracts.abstract_workflow.RunResult.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.Action.html +11 -3
- package/docs/types/_saltcorn_types.Types.base_types.AuthenticationMethod.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.CalcJoinfield.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.CapacitorPlugin.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.CodePagePack.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.Column.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.ConnectObjType.html +4 -2
- package/docs/types/_saltcorn_types.Types.base_types.ConnectedObjects.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.CopilotSkill.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.ErrorObj.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.FieldLike.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.FieldView.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.Header.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.JoinFieldOption.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.Layout.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.MobileConfig.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.ModelPattern.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.Pack.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.Plugin.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.PluginFunction.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.PluginLayout.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.PluginRoute.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.PluginSourceType.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.PluginType.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.PluginWrap.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.PluginWrapArg.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.RelationOption.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.Req.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.Res.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.ResultType.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.RouteAction.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.RunExtra.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.SlugStepType.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.StepResType.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.SubField.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.TableProvider.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.TableQuery.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.Tablely.html +1 -1
- package/docs/types/_saltcorn_types.Types.base_types.ViewTemplate.html +1 -1
- package/docs/types/_saltcorn_types.Types.common_types.ErrorMessage.html +1 -1
- package/docs/types/_saltcorn_types.Types.common_types.GenObj.html +1 -1
- package/docs/types/_saltcorn_types.Types.common_types.ReqRes.html +1 -1
- package/docs/types/_saltcorn_types.Types.common_types.ResultMessage.html +1 -1
- package/docs/types/_saltcorn_types.Types.common_types.SuccessMessage.html +1 -1
- package/docs/types/_saltcorn_types.Types.common_types.Type.html +1 -1
- package/docs/variables/_saltcorn_data.db.html +1 -1
- package/docs/variables/_saltcorn_data.migrations.html +1 -1
- package/docs/variables/_saltcorn_data.models.config.available_languages.html +1 -1
- package/docs/variables/_saltcorn_data.models.config.configTypes.html +1 -1
- package/docs/variables/_saltcorn_data.models.scheduler.runScheduler.html +1 -1
- package/docs/variables/_saltcorn_data.plugin_helper.run_action_column.html +1 -1
- package/docs/variables/_saltcorn_data.utils.NotAuthorized.html +2 -1
- package/docs/variables/_saltcorn_data.utils.isPushEnabled.html +67 -0
- package/docs/variables/_saltcorn_data.utils.sleep.html +2 -1
- package/docs/variables/_saltcorn_db_common.multi_tenant.tenantNamespace.html +2 -1
- package/help/JavaScript action code.tmd +10 -0
- package/locales/en.json +32 -1
- package/package.json +9 -9
- package/public/log_viewer_utils.js +3 -2
- package/public/saltcorn-common.js +100 -31
- package/public/saltcorn.css +16 -0
- package/public/saltcorn.js +8 -0
- package/routes/actions.js +17 -1
- package/routes/admin.js +5 -3
- package/routes/common_lists.js +8 -1
- package/routes/eventlog.js +20 -0
- package/routes/fields.js +10 -2
- package/routes/menu.js +98 -6
- package/routes/notifications.js +39 -11
- package/routes/page.js +4 -1
- package/routes/pageedit.js +4 -1
- package/routes/plugins.js +8 -7
- package/routes/tables.js +11 -0
- package/routes/view.js +12 -3
- package/serve.js +76 -21
- package/tests/admin.test.js +3 -3
- package/tests/auth.test.js +1 -0
- package/tests/viewedit.test.js +2 -0
- package/wrapper.js +26 -193
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@saltcorn/server",
|
|
3
|
-
"version": "1.3.1-beta.
|
|
3
|
+
"version": "1.3.1-beta.10",
|
|
4
4
|
"description": "Server app for Saltcorn, open-source no-code platform",
|
|
5
5
|
"homepage": "https://saltcorn.com",
|
|
6
6
|
"main": "index.js",
|
|
@@ -8,14 +8,14 @@
|
|
|
8
8
|
"dependencies": {
|
|
9
9
|
"@aws-sdk/client-s3": "^3.735.0",
|
|
10
10
|
"@dr.pogodin/csurf": "1.15.0",
|
|
11
|
-
"@saltcorn/admin-models": "1.3.1-beta.
|
|
12
|
-
"@saltcorn/base-plugin": "1.3.1-beta.
|
|
13
|
-
"@saltcorn/builder": "1.3.1-beta.
|
|
14
|
-
"@saltcorn/data": "1.3.1-beta.
|
|
15
|
-
"@saltcorn/filemanager": "1.3.1-beta.
|
|
16
|
-
"@saltcorn/markup": "1.3.1-beta.
|
|
17
|
-
"@saltcorn/plugins-loader": "1.3.1-beta.
|
|
18
|
-
"@saltcorn/sbadmin2": "1.3.1-beta.
|
|
11
|
+
"@saltcorn/admin-models": "1.3.1-beta.10",
|
|
12
|
+
"@saltcorn/base-plugin": "1.3.1-beta.10",
|
|
13
|
+
"@saltcorn/builder": "1.3.1-beta.10",
|
|
14
|
+
"@saltcorn/data": "1.3.1-beta.10",
|
|
15
|
+
"@saltcorn/filemanager": "1.3.1-beta.10",
|
|
16
|
+
"@saltcorn/markup": "1.3.1-beta.10",
|
|
17
|
+
"@saltcorn/plugins-loader": "1.3.1-beta.10",
|
|
18
|
+
"@saltcorn/sbadmin2": "1.3.1-beta.10",
|
|
19
19
|
"@socket.io/cluster-adapter": "^0.2.1",
|
|
20
20
|
"@socket.io/sticky": "^1.0.1",
|
|
21
21
|
"adm-zip": "0.5.16",
|
|
@@ -172,7 +172,7 @@ var logViewerHelpers = (() => {
|
|
|
172
172
|
}
|
|
173
173
|
}, 5000);
|
|
174
174
|
try {
|
|
175
|
-
socket =
|
|
175
|
+
socket = window.get_shared_socket();
|
|
176
176
|
} catch (e) {
|
|
177
177
|
notifyAlert({
|
|
178
178
|
type: "danger",
|
|
@@ -180,7 +180,8 @@ var logViewerHelpers = (() => {
|
|
|
180
180
|
});
|
|
181
181
|
}
|
|
182
182
|
startTrackingMsg();
|
|
183
|
-
socket.
|
|
183
|
+
if (socket.connected) handleConnect(socket);
|
|
184
|
+
else socket.on("connect", () => handleConnect(socket));
|
|
184
185
|
socket.on("disconnect", handleDisconnect);
|
|
185
186
|
socket.on("log_msg", handleLogMsg);
|
|
186
187
|
socket.on("test_conn_msg", handleTestConnMsg);
|
|
@@ -151,15 +151,15 @@ function valid_js_var_name(s) {
|
|
|
151
151
|
return !!s.match(/^[a-zA-Z_$][a-zA-Z_$0-9]*$/);
|
|
152
152
|
}
|
|
153
153
|
|
|
154
|
-
function add_extra_state(base_url, extra_state_fml, row) {
|
|
154
|
+
function add_extra_state(base_url, extra_state_fml, row, outerState = {}) {
|
|
155
155
|
//console.log("add_extra_state", { base_url, extra_state_fml, row });
|
|
156
|
-
if (!extra_state_fml) return base_url;
|
|
156
|
+
if (!extra_state_fml && !Object.keys(outerState).length) return base_url;
|
|
157
157
|
let extra_state = new Function(
|
|
158
158
|
"row",
|
|
159
159
|
`{${Object.keys(row).join(",")}}`,
|
|
160
|
-
"return " + extra_state_fml
|
|
160
|
+
"return " + extra_state_fml||"{}"
|
|
161
161
|
)(row, row);
|
|
162
|
-
let qs = Object.entries(extra_state)
|
|
162
|
+
let qs = Object.entries({ ...outerState, ...extra_state })
|
|
163
163
|
.map(([k, v]) => `${k}=${encodeURIComponent(v)}`)
|
|
164
164
|
.join("&");
|
|
165
165
|
let sepChar = base_url.includes("?") ? "&" : "?";
|
|
@@ -172,6 +172,17 @@ const global_fetch_options_cache = {};
|
|
|
172
172
|
|
|
173
173
|
function apply_showif() {
|
|
174
174
|
const isNode = getIsNode();
|
|
175
|
+
$(".toggle-password-vis")
|
|
176
|
+
.off("click")
|
|
177
|
+
.on("click", function (event) {
|
|
178
|
+
const $e = $(event.target);
|
|
179
|
+
const eyeIcon = $e.prop("tagName") === "I" ? $e : $e.find("i");
|
|
180
|
+
const passwordInput = eyeIcon.parent().prev();
|
|
181
|
+
|
|
182
|
+
const isPassword = passwordInput.attr("type") === "password";
|
|
183
|
+
passwordInput.attr("type", isPassword ? "text" : "password");
|
|
184
|
+
eyeIcon.toggleClass("fa-eye fa-eye-slash");
|
|
185
|
+
});
|
|
175
186
|
$("[data-show-if]").each(function (ix, element) {
|
|
176
187
|
var e = $(element);
|
|
177
188
|
try {
|
|
@@ -1688,10 +1699,13 @@ function notifyAlert(note, spin) {
|
|
|
1688
1699
|
if ($modal.length && $modal.hasClass("show"))
|
|
1689
1700
|
$("#modal-toasts-area").append(html);
|
|
1690
1701
|
else $("#toasts-area").append(html);
|
|
1691
|
-
if (type === "success") {
|
|
1692
|
-
setTimeout(
|
|
1693
|
-
|
|
1694
|
-
|
|
1702
|
+
if (type === "success" || note.remove_delay) {
|
|
1703
|
+
setTimeout(
|
|
1704
|
+
() => {
|
|
1705
|
+
$(`#${id}`).removeClass("show");
|
|
1706
|
+
},
|
|
1707
|
+
note.remove_delay ? note.remove_delay * 1000 : 5000
|
|
1708
|
+
);
|
|
1695
1709
|
}
|
|
1696
1710
|
}
|
|
1697
1711
|
|
|
@@ -1712,6 +1726,8 @@ function press_store_button(clicked, keepOld, disable) {
|
|
|
1712
1726
|
.html('<i class="fas fa-spinner fa-spin"></i>')
|
|
1713
1727
|
.width(width)
|
|
1714
1728
|
.height(height);
|
|
1729
|
+
$(document).trigger("activate-spinner", $(btn));
|
|
1730
|
+
$(btn).trigger("spin");
|
|
1715
1731
|
setTimeout(() => {
|
|
1716
1732
|
$(btn).prop("disabled", true);
|
|
1717
1733
|
}, 50);
|
|
@@ -1740,6 +1756,9 @@ async function common_done(res, viewnameOrElem0, isWeb = true) {
|
|
|
1740
1756
|
.attr("data-sc-embed-viewname");
|
|
1741
1757
|
if (window._sc_loglevel > 4)
|
|
1742
1758
|
console.log("ajax result directives", viewname, res);
|
|
1759
|
+
|
|
1760
|
+
if (res.page_load_tag && res.page_load_tag !== _sc_pageloadtag) return;
|
|
1761
|
+
|
|
1743
1762
|
const handle = async (element, fn) => {
|
|
1744
1763
|
if (Array.isArray(element))
|
|
1745
1764
|
for (const current of element) await fn(current);
|
|
@@ -1765,17 +1784,32 @@ async function common_done(res, viewnameOrElem0, isWeb = true) {
|
|
|
1765
1784
|
};
|
|
1766
1785
|
if (res.notify)
|
|
1767
1786
|
await handle(res.notify, (text) =>
|
|
1768
|
-
notifyAlert({
|
|
1787
|
+
notifyAlert({
|
|
1788
|
+
type: "info",
|
|
1789
|
+
text,
|
|
1790
|
+
toast_title: res.toast_title,
|
|
1791
|
+
remove_delay: res.remove_delay,
|
|
1792
|
+
})
|
|
1769
1793
|
);
|
|
1770
1794
|
if (res.error) {
|
|
1771
1795
|
if (window._sc_loglevel > 4) console.trace("error response", res.error);
|
|
1772
1796
|
await handle(res.error, (text) =>
|
|
1773
|
-
notifyAlert({
|
|
1797
|
+
notifyAlert({
|
|
1798
|
+
type: "danger",
|
|
1799
|
+
text,
|
|
1800
|
+
toast_title: res.toast_title,
|
|
1801
|
+
remove_delay: res.remove_delay,
|
|
1802
|
+
})
|
|
1774
1803
|
);
|
|
1775
1804
|
}
|
|
1776
1805
|
if (res.notify_success)
|
|
1777
1806
|
await handle(res.notify_success, (text) =>
|
|
1778
|
-
notifyAlert({
|
|
1807
|
+
notifyAlert({
|
|
1808
|
+
type: "success",
|
|
1809
|
+
text,
|
|
1810
|
+
toast_title: res.toast_title,
|
|
1811
|
+
remove_delay: res.remove_delay,
|
|
1812
|
+
})
|
|
1779
1813
|
);
|
|
1780
1814
|
if (res.set_fields && (viewname || res.set_fields._viewname)) {
|
|
1781
1815
|
const form =
|
|
@@ -1810,10 +1844,10 @@ async function common_done(res, viewnameOrElem0, isWeb = true) {
|
|
|
1810
1844
|
input.attr("data-selected", res.set_fields[k]);
|
|
1811
1845
|
}
|
|
1812
1846
|
|
|
1813
|
-
input.trigger("set_form_field");
|
|
1847
|
+
input.trigger("set_form_field", { no_onchange: res.no_onchange });
|
|
1814
1848
|
});
|
|
1815
1849
|
}
|
|
1816
|
-
form.trigger("change");
|
|
1850
|
+
if (!res.no_onchange) form.trigger("change");
|
|
1817
1851
|
}
|
|
1818
1852
|
|
|
1819
1853
|
if (res.download) {
|
|
@@ -2044,17 +2078,24 @@ function room_older(viewname, room_id, btn) {
|
|
|
2044
2078
|
);
|
|
2045
2079
|
}
|
|
2046
2080
|
|
|
2047
|
-
function
|
|
2048
|
-
let socket = null;
|
|
2049
|
-
if (
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
|
|
2081
|
+
function get_shared_socket() {
|
|
2082
|
+
let socket = window.sharedSocket || null;
|
|
2083
|
+
if (!socket) {
|
|
2084
|
+
if (parent?.saltcorn?.data?.state) {
|
|
2085
|
+
const { server_path, jwt } =
|
|
2086
|
+
parent.saltcorn.data.state.getState().mobileConfig;
|
|
2087
|
+
socket = io(server_path, {
|
|
2088
|
+
query: `jwt=${jwt}`,
|
|
2089
|
+
transports: ["websocket"],
|
|
2090
|
+
});
|
|
2091
|
+
} else socket = io({ transports: ["websocket"] });
|
|
2092
|
+
window.sharedSocket = socket;
|
|
2093
|
+
}
|
|
2094
|
+
return socket;
|
|
2095
|
+
}
|
|
2057
2096
|
|
|
2097
|
+
function init_room(viewname, room_id) {
|
|
2098
|
+
let socket = get_shared_socket();
|
|
2058
2099
|
socket.emit("join_room", [viewname, room_id]);
|
|
2059
2100
|
socket.on("message", (msg) => {
|
|
2060
2101
|
if (msg.not_for_user_id) {
|
|
@@ -2077,24 +2118,46 @@ function init_room(viewname, room_id) {
|
|
|
2077
2118
|
}
|
|
2078
2119
|
|
|
2079
2120
|
function init_collab_room(viewname, eventCfgs) {
|
|
2080
|
-
|
|
2121
|
+
let socket = get_shared_socket();
|
|
2081
2122
|
for (const [event, callback] of Object.entries(eventCfgs.events)) {
|
|
2082
2123
|
socket.on(event, callback);
|
|
2083
2124
|
}
|
|
2084
|
-
|
|
2125
|
+
const joinFn = () => {
|
|
2085
2126
|
socket.emit("join_collab_room", viewname, (ack) => {
|
|
2086
|
-
if (ack && ack.status === "ok")
|
|
2127
|
+
if (ack && ack.status === "ok")
|
|
2087
2128
|
console.log(`Joined collaboration room for view '${viewname}'`);
|
|
2088
|
-
|
|
2089
|
-
console.error("Failed to join collaboration room:", ack);
|
|
2090
|
-
}
|
|
2129
|
+
else console.error("Failed to join collaboration room:", ack);
|
|
2091
2130
|
});
|
|
2092
|
-
}
|
|
2131
|
+
};
|
|
2132
|
+
if (socket.connected) joinFn();
|
|
2133
|
+
else socket.on("connect", joinFn);
|
|
2093
2134
|
socket.on("disconnect", function () {
|
|
2094
2135
|
console.log("Disconnected from the server");
|
|
2095
2136
|
});
|
|
2096
2137
|
}
|
|
2097
2138
|
|
|
2139
|
+
function init_dynamic_update_room() {
|
|
2140
|
+
if (
|
|
2141
|
+
!window.io ||
|
|
2142
|
+
navigator.userAgent.includes("jsdom") ||
|
|
2143
|
+
!dynamic_updates_cfg?.enabled
|
|
2144
|
+
)
|
|
2145
|
+
return;
|
|
2146
|
+
let socket = get_shared_socket();
|
|
2147
|
+
socket.on("dynamic_update", async (data) => {
|
|
2148
|
+
await common_done(data);
|
|
2149
|
+
});
|
|
2150
|
+
const joinFn = () => {
|
|
2151
|
+
socket.emit("join_dynamic_update_room", (ack) => {
|
|
2152
|
+
if (ack && ack.status === "ok") {
|
|
2153
|
+
if (window._sc_loglevel > 5) console.log("Joined dynamic update room");
|
|
2154
|
+
} else console.error("Failed to join dynamic update room:", ack);
|
|
2155
|
+
});
|
|
2156
|
+
};
|
|
2157
|
+
if (socket.connected) joinFn();
|
|
2158
|
+
else socket.on("connect", joinFn);
|
|
2159
|
+
}
|
|
2160
|
+
|
|
2098
2161
|
function cancel_form(form) {
|
|
2099
2162
|
if (!form) return;
|
|
2100
2163
|
$(form).trigger("reset");
|
|
@@ -2140,7 +2203,7 @@ function check_saltcorn_notifications() {
|
|
|
2140
2203
|
.then((resp) => {
|
|
2141
2204
|
if (resp.success) {
|
|
2142
2205
|
const n = resp.success;
|
|
2143
|
-
const menu_item = $(
|
|
2206
|
+
const menu_item = $('a[href="/notifications"]');
|
|
2144
2207
|
|
|
2145
2208
|
menu_item.html(
|
|
2146
2209
|
`<i class="fa-fw mr-05 fas fa-bell"></i>Notifications (${n})`
|
|
@@ -2542,3 +2605,9 @@ async function initPushNotify() {
|
|
|
2542
2605
|
console.error("Push notification initialization failed:", error);
|
|
2543
2606
|
}
|
|
2544
2607
|
}
|
|
2608
|
+
|
|
2609
|
+
if (document.readyState !== "loading") {
|
|
2610
|
+
init_dynamic_update_room();
|
|
2611
|
+
} else {
|
|
2612
|
+
document.addEventListener("DOMContentLoaded", init_dynamic_update_room);
|
|
2613
|
+
}
|
package/public/saltcorn.css
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
.table-valign-middle > tbody > tr > td {
|
|
2
|
+
vertical-align: middle;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
.table-valign-top > tbody > tr > td {
|
|
6
|
+
vertical-align: top;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.table-valign-bottom > tbody > tr > td {
|
|
10
|
+
vertical-align: bottom;
|
|
11
|
+
}
|
|
12
|
+
|
|
1
13
|
div.form-repeat {
|
|
2
14
|
border: 1px dashed black;
|
|
3
15
|
padding: 3px;
|
|
@@ -838,3 +850,7 @@ input[type="file"].file-has-existing {
|
|
|
838
850
|
::file-selector-button {
|
|
839
851
|
font-size: initial;
|
|
840
852
|
}
|
|
853
|
+
|
|
854
|
+
.toggle-password-vis {
|
|
855
|
+
cursor: pointer;
|
|
856
|
+
}
|
package/public/saltcorn.js
CHANGED
|
@@ -218,6 +218,9 @@ function pjax_to(href, e) {
|
|
|
218
218
|
}
|
|
219
219
|
$dest.html(res);
|
|
220
220
|
if (localizer.length) localizer.attr("data-sc-local-state", href);
|
|
221
|
+
let $modal = $("#scmodal");
|
|
222
|
+
if ($modal.length && $modal.hasClass("show"))
|
|
223
|
+
$modal.prop("data-modal-state", href);
|
|
221
224
|
initialize_page();
|
|
222
225
|
document.dispatchEvent(new Event("pjax-loaded"));
|
|
223
226
|
},
|
|
@@ -261,6 +264,8 @@ function spin_action_link(e) {
|
|
|
261
264
|
|
|
262
265
|
$e.attr("data-innerhtml-prespin", $e.html());
|
|
263
266
|
$e.html('<i class="fas fa-spinner fa-spin"></i>').width(width).height(height);
|
|
267
|
+
$(document).trigger("activate-spinner", $e);
|
|
268
|
+
$e.trigger("spin");
|
|
264
269
|
}
|
|
265
270
|
|
|
266
271
|
function reset_spinners() {
|
|
@@ -289,6 +294,7 @@ function view_post(viewnameOrElem, route, data, onDone, sendState) {
|
|
|
289
294
|
type: "POST",
|
|
290
295
|
headers: {
|
|
291
296
|
"CSRF-Token": _sc_globalCsrf,
|
|
297
|
+
"Page-Load-Tag": _sc_pageloadtag,
|
|
292
298
|
},
|
|
293
299
|
...(!isFormData
|
|
294
300
|
? {
|
|
@@ -423,6 +429,7 @@ function ajax_modal(url, opts = {}) {
|
|
|
423
429
|
new bootstrap.Modal($("#scmodal"), {
|
|
424
430
|
focus: false,
|
|
425
431
|
}).show();
|
|
432
|
+
$("#scmodal .modal-body").find("[autofocus]").first().focus();
|
|
426
433
|
initialize_page();
|
|
427
434
|
(opts.onOpen || function () {})(res);
|
|
428
435
|
$("#scmodal").on("hidden.bs.modal", function (e) {
|
|
@@ -702,6 +709,7 @@ function ajax_post(url, args) {
|
|
|
702
709
|
type: "POST",
|
|
703
710
|
headers: {
|
|
704
711
|
"CSRF-Token": _sc_globalCsrf,
|
|
712
|
+
"Page-Load-Tag": _sc_pageloadtag,
|
|
705
713
|
},
|
|
706
714
|
...(args || {}),
|
|
707
715
|
})
|
package/routes/actions.js
CHANGED
|
@@ -179,6 +179,7 @@ const triggerForm = async (req, trigger) => {
|
|
|
179
179
|
workflow: true,
|
|
180
180
|
});
|
|
181
181
|
const table_triggers = ["Insert", "Update", "Delete", "Validate"];
|
|
182
|
+
const additional_triggers_with_onlyif = ["Login", "PageLoad"];
|
|
182
183
|
const action_options = {};
|
|
183
184
|
const actionsNotRequiringRow = Trigger.action_options({
|
|
184
185
|
notRequireRow: true,
|
|
@@ -337,6 +338,19 @@ const triggerForm = async (req, trigger) => {
|
|
|
337
338
|
type: "String",
|
|
338
339
|
showIf: { when_trigger: ["API call"], _raw_output: true },
|
|
339
340
|
},
|
|
341
|
+
{
|
|
342
|
+
name: "_only_if",
|
|
343
|
+
label: req.__("Only if"),
|
|
344
|
+
type: "String",
|
|
345
|
+
class: "validate-expression",
|
|
346
|
+
sublabel: req.__(
|
|
347
|
+
"Optional JavaScript expression to determine if the trigger should run."
|
|
348
|
+
),
|
|
349
|
+
parent_field: "configuration",
|
|
350
|
+
showIf: {
|
|
351
|
+
when_trigger: [...table_triggers, ...additional_triggers_with_onlyif],
|
|
352
|
+
},
|
|
353
|
+
},
|
|
340
354
|
],
|
|
341
355
|
});
|
|
342
356
|
// if (trigger) {
|
|
@@ -1795,7 +1809,9 @@ router.get(
|
|
|
1795
1809
|
try {
|
|
1796
1810
|
const form = await getWorkflowStepUserForm(run, trigger, step, req);
|
|
1797
1811
|
if (req.xhr) form.xhrSubmit = true;
|
|
1798
|
-
const title =
|
|
1812
|
+
const title =
|
|
1813
|
+
step.configuration?.popup_title ||
|
|
1814
|
+
(run.wait_info.output ? "Workflow output" : "Fill form");
|
|
1799
1815
|
res.sendWrap(title, renderForm(form, req.csrfToken()));
|
|
1800
1816
|
} catch (e) {
|
|
1801
1817
|
console.error(e);
|
package/routes/admin.js
CHANGED
|
@@ -500,11 +500,12 @@ router.get(
|
|
|
500
500
|
"backup_s3_access_secret"
|
|
501
501
|
);
|
|
502
502
|
backupForm.values.backup_s3_region =
|
|
503
|
-
|
|
503
|
+
getState().getConfig("backup_s3_region");
|
|
504
504
|
aBackupFilePrefixForm.values.backup_with_event_log = getState().getConfig(
|
|
505
505
|
"backup_with_event_log"
|
|
506
506
|
);
|
|
507
|
-
aBackupFilePrefixForm.values.backup_password =
|
|
507
|
+
aBackupFilePrefixForm.values.backup_password =
|
|
508
|
+
getState().getConfig("backup_password");
|
|
508
509
|
const aSnapshotForm = snapshotForm(req);
|
|
509
510
|
aSnapshotForm.values.snapshots_enabled =
|
|
510
511
|
getState().getConfig("snapshots_enabled");
|
|
@@ -4126,6 +4127,8 @@ router.post(
|
|
|
4126
4127
|
await db.deleteWhere("_sc_config", { not: { key: "letsencrypt" } });
|
|
4127
4128
|
}
|
|
4128
4129
|
await getState().refresh();
|
|
4130
|
+
await require("@saltcorn/data/standard-menu")();
|
|
4131
|
+
|
|
4129
4132
|
if (form.values.users) {
|
|
4130
4133
|
await db.deleteWhere("_sc_notifications");
|
|
4131
4134
|
|
|
@@ -4532,7 +4535,6 @@ admin_config_route({
|
|
|
4532
4535
|
path: "/notifications",
|
|
4533
4536
|
super_path: "/admin",
|
|
4534
4537
|
field_names: [
|
|
4535
|
-
"notification_in_menu",
|
|
4536
4538
|
{ section_header: "Progressive Web Application" },
|
|
4537
4539
|
"pwa_enabled",
|
|
4538
4540
|
{ name: "pwa_display", showIf: { pwa_enabled: true } },
|
package/routes/common_lists.js
CHANGED
|
@@ -138,6 +138,7 @@ const tablesList = async (
|
|
|
138
138
|
hover: true,
|
|
139
139
|
tableClass: listClass(tagId, showList),
|
|
140
140
|
tableId: domId,
|
|
141
|
+
class: "table-valign-middle",
|
|
141
142
|
}
|
|
142
143
|
) +
|
|
143
144
|
(tables.length == 0 && !filterOnTag
|
|
@@ -442,6 +443,7 @@ const viewsList = async (
|
|
|
442
443
|
hover: true,
|
|
443
444
|
tableClass: listClass(tagId, showList),
|
|
444
445
|
tableId: domId,
|
|
446
|
+
class: "table-valign-middle",
|
|
445
447
|
}
|
|
446
448
|
) +
|
|
447
449
|
(views.length == 0 && !filterOnTag
|
|
@@ -625,6 +627,7 @@ const getPageList = async (
|
|
|
625
627
|
hover: true,
|
|
626
628
|
tableClass: tagId ? `collapse ${showList ? "show" : ""}` : "",
|
|
627
629
|
tableId: domId,
|
|
630
|
+
class: "table-valign-middle",
|
|
628
631
|
}
|
|
629
632
|
);
|
|
630
633
|
};
|
|
@@ -657,6 +660,7 @@ const getPageGroupList = (rows, roles, req) => {
|
|
|
657
660
|
rows,
|
|
658
661
|
{
|
|
659
662
|
hover: true,
|
|
663
|
+
class: "table-valign-middle",
|
|
660
664
|
}
|
|
661
665
|
);
|
|
662
666
|
};
|
|
@@ -729,6 +733,8 @@ const getTriggerList = async (
|
|
|
729
733
|
)
|
|
730
734
|
);
|
|
731
735
|
};
|
|
736
|
+
const whenCanHaveTable = (when) =>
|
|
737
|
+
["Insert", "Update", "Delete", "Validate", "Never"].includes(when);
|
|
732
738
|
return mkTable(
|
|
733
739
|
[
|
|
734
740
|
{ label: req.__("Name"), key: "name" },
|
|
@@ -781,7 +787,7 @@ const getTriggerList = async (
|
|
|
781
787
|
{
|
|
782
788
|
label: req.__("Table or Channel"),
|
|
783
789
|
key: (r) =>
|
|
784
|
-
r.table_name
|
|
790
|
+
r.table_name && whenCanHaveTable(r.when_trigger)
|
|
785
791
|
? user_can_inspect_tables
|
|
786
792
|
? a({ href: `/table/${r.table_name}` }, r.table_name)
|
|
787
793
|
: r.table_name
|
|
@@ -807,6 +813,7 @@ const getTriggerList = async (
|
|
|
807
813
|
hover: true,
|
|
808
814
|
tableClass: tagId ? `collapse ${showList ? "show" : ""}` : "",
|
|
809
815
|
tableId: domId,
|
|
816
|
+
class: "table-valign-middle",
|
|
810
817
|
}
|
|
811
818
|
);
|
|
812
819
|
};
|
package/routes/eventlog.js
CHANGED
|
@@ -81,6 +81,18 @@ const logSettingsForm = async (req) => {
|
|
|
81
81
|
input_type: "date",
|
|
82
82
|
attributes: { minDate: new Date(), maxDate: hoursFuture(24 * 7 * 2) },
|
|
83
83
|
},
|
|
84
|
+
{
|
|
85
|
+
input_type: "section_header",
|
|
86
|
+
label: req.__("Dynamic server side updates"),
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: "enable_dynamic_updates",
|
|
90
|
+
label: req.__("Enable dynamic updates"),
|
|
91
|
+
type: "Bool",
|
|
92
|
+
sublabel: req.__(
|
|
93
|
+
"Enable server side updates from within run_js_code actions"
|
|
94
|
+
),
|
|
95
|
+
},
|
|
84
96
|
{
|
|
85
97
|
input_type: "section_header",
|
|
86
98
|
label: req.__("Delete old workflow runs with status after days"),
|
|
@@ -168,6 +180,10 @@ router.get(
|
|
|
168
180
|
"next_weekly_event",
|
|
169
181
|
{}
|
|
170
182
|
);
|
|
183
|
+
form.values.enable_dynamic_updates = getState().getConfig(
|
|
184
|
+
"enable_dynamic_updates",
|
|
185
|
+
true
|
|
186
|
+
);
|
|
171
187
|
["error", "finished", "running", "waiting"].forEach((k) => {
|
|
172
188
|
let cfgk = `delete_${k}_workflows_days`;
|
|
173
189
|
form.values[cfgk] = getState().getConfig(cfgk);
|
|
@@ -377,6 +393,10 @@ router.post(
|
|
|
377
393
|
delete form.values[k];
|
|
378
394
|
}
|
|
379
395
|
}
|
|
396
|
+
await getState().setConfig(
|
|
397
|
+
"enable_dynamic_updates",
|
|
398
|
+
form.values.enable_dynamic_updates
|
|
399
|
+
);
|
|
380
400
|
for (const status of ["error", "finished", "running", "waiting"]) {
|
|
381
401
|
let k = `delete_${status}_workflows_days`;
|
|
382
402
|
if (form.values[k]) {
|
package/routes/fields.js
CHANGED
|
@@ -1433,8 +1433,16 @@ router.post(
|
|
|
1433
1433
|
const inboundTable = Table.findOne(inboundTableName);
|
|
1434
1434
|
field = inboundTable.getField(refField);
|
|
1435
1435
|
}
|
|
1436
|
-
|
|
1436
|
+
if (
|
|
1437
|
+
!field &&
|
|
1438
|
+
table.name === "users" &&
|
|
1439
|
+
["passwordRepeat", "password"].includes(fieldName)
|
|
1440
|
+
) {
|
|
1441
|
+
field = new Field({ name: fieldName, type: "String" });
|
|
1442
|
+
}
|
|
1437
1443
|
if (!field) {
|
|
1444
|
+
console.log("no field");
|
|
1445
|
+
|
|
1438
1446
|
res.send(req.query?.accept == "json" ? "[]" : "");
|
|
1439
1447
|
return;
|
|
1440
1448
|
}
|
|
@@ -1522,7 +1530,7 @@ router.post(
|
|
|
1522
1530
|
const table = Table.findOne({ name: table_name });
|
|
1523
1531
|
const field = table.getField(field_name);
|
|
1524
1532
|
let val = field.type?.read
|
|
1525
|
-
? field.type?.read(req.body[field_name])
|
|
1533
|
+
? field.type?.read(req.body[field_name], field.attributes)
|
|
1526
1534
|
: req.body[field_name];
|
|
1527
1535
|
await db.withTransaction(async () => {
|
|
1528
1536
|
await table.updateRow({ [field_name]: val }, pk, req.user);
|