@saltcorn/server 1.3.1-beta.1 → 1.3.1-beta.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/auth/admin.js +9 -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 +68 -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 +25 -25
- 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 +1 -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 +1 -1
- 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 +4 -2
- 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 +1 -1
- package/docs/variables/_saltcorn_data.utils.isPushEnabled.html +1 -1
- package/docs/variables/_saltcorn_data.utils.sleep.html +1 -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 +94 -39
- package/public/saltcorn.css +12 -0
- package/public/saltcorn.js +44 -6
- package/routes/actions.js +14 -0
- package/routes/admin.js +71 -18
- package/routes/common_lists.js +8 -1
- package/routes/eventlog.js +20 -0
- package/routes/fields.js +1 -1
- package/routes/menu.js +98 -6
- package/routes/page.js +4 -1
- package/routes/pageedit.js +1 -0
- package/routes/plugins.js +8 -7
- package/routes/tables.js +11 -0
- package/routes/view.js +12 -3
- package/serve.js +97 -43
- package/tests/admin.test.js +3 -3
- package/tests/auth.test.js +1 -0
- package/tests/viewedit.test.js +2 -0
- package/wrapper.js +23 -191
|
@@ -151,15 +151,15 @@ function valid_js_var_name(s) {
|
|
|
151
151
|
return !!s.match(/^[a-zA-Z_$][a-zA-Z_$0-9]*$/);
|
|
152
152
|
}
|
|
153
153
|
|
|
154
|
-
function add_extra_state(base_url, extra_state_fml, row) {
|
|
154
|
+
function add_extra_state(base_url, extra_state_fml, row, outerState = {}) {
|
|
155
155
|
//console.log("add_extra_state", { base_url, extra_state_fml, row });
|
|
156
|
-
if (!extra_state_fml) return base_url;
|
|
156
|
+
if (!extra_state_fml && !Object.keys(outerState).length) return base_url;
|
|
157
157
|
let extra_state = new Function(
|
|
158
158
|
"row",
|
|
159
159
|
`{${Object.keys(row).join(",")}}`,
|
|
160
|
-
"return " + extra_state_fml
|
|
160
|
+
"return " + extra_state_fml||"{}"
|
|
161
161
|
)(row, row);
|
|
162
|
-
let qs = Object.entries(extra_state)
|
|
162
|
+
let qs = Object.entries({ ...outerState, ...extra_state })
|
|
163
163
|
.map(([k, v]) => `${k}=${encodeURIComponent(v)}`)
|
|
164
164
|
.join("&");
|
|
165
165
|
let sepChar = base_url.includes("?") ? "&" : "?";
|
|
@@ -1699,10 +1699,13 @@ function notifyAlert(note, spin) {
|
|
|
1699
1699
|
if ($modal.length && $modal.hasClass("show"))
|
|
1700
1700
|
$("#modal-toasts-area").append(html);
|
|
1701
1701
|
else $("#toasts-area").append(html);
|
|
1702
|
-
if (type === "success") {
|
|
1703
|
-
setTimeout(
|
|
1704
|
-
|
|
1705
|
-
|
|
1702
|
+
if (type === "success" || note.remove_delay) {
|
|
1703
|
+
setTimeout(
|
|
1704
|
+
() => {
|
|
1705
|
+
$(`#${id}`).removeClass("show");
|
|
1706
|
+
},
|
|
1707
|
+
note.remove_delay ? note.remove_delay * 1000 : 5000
|
|
1708
|
+
);
|
|
1706
1709
|
}
|
|
1707
1710
|
}
|
|
1708
1711
|
|
|
@@ -1723,6 +1726,8 @@ function press_store_button(clicked, keepOld, disable) {
|
|
|
1723
1726
|
.html('<i class="fas fa-spinner fa-spin"></i>')
|
|
1724
1727
|
.width(width)
|
|
1725
1728
|
.height(height);
|
|
1729
|
+
$(document).trigger("activate-spinner", $(btn));
|
|
1730
|
+
$(btn).trigger("spin");
|
|
1726
1731
|
setTimeout(() => {
|
|
1727
1732
|
$(btn).prop("disabled", true);
|
|
1728
1733
|
}, 50);
|
|
@@ -1751,6 +1756,9 @@ async function common_done(res, viewnameOrElem0, isWeb = true) {
|
|
|
1751
1756
|
.attr("data-sc-embed-viewname");
|
|
1752
1757
|
if (window._sc_loglevel > 4)
|
|
1753
1758
|
console.log("ajax result directives", viewname, res);
|
|
1759
|
+
|
|
1760
|
+
if (res.page_load_tag && res.page_load_tag !== _sc_pageloadtag) return;
|
|
1761
|
+
|
|
1754
1762
|
const handle = async (element, fn) => {
|
|
1755
1763
|
if (Array.isArray(element))
|
|
1756
1764
|
for (const current of element) await fn(current);
|
|
@@ -1776,17 +1784,32 @@ async function common_done(res, viewnameOrElem0, isWeb = true) {
|
|
|
1776
1784
|
};
|
|
1777
1785
|
if (res.notify)
|
|
1778
1786
|
await handle(res.notify, (text) =>
|
|
1779
|
-
notifyAlert({
|
|
1787
|
+
notifyAlert({
|
|
1788
|
+
type: "info",
|
|
1789
|
+
text,
|
|
1790
|
+
toast_title: res.toast_title,
|
|
1791
|
+
remove_delay: res.remove_delay,
|
|
1792
|
+
})
|
|
1780
1793
|
);
|
|
1781
1794
|
if (res.error) {
|
|
1782
1795
|
if (window._sc_loglevel > 4) console.trace("error response", res.error);
|
|
1783
1796
|
await handle(res.error, (text) =>
|
|
1784
|
-
notifyAlert({
|
|
1797
|
+
notifyAlert({
|
|
1798
|
+
type: "danger",
|
|
1799
|
+
text,
|
|
1800
|
+
toast_title: res.toast_title,
|
|
1801
|
+
remove_delay: res.remove_delay,
|
|
1802
|
+
})
|
|
1785
1803
|
);
|
|
1786
1804
|
}
|
|
1787
1805
|
if (res.notify_success)
|
|
1788
1806
|
await handle(res.notify_success, (text) =>
|
|
1789
|
-
notifyAlert({
|
|
1807
|
+
notifyAlert({
|
|
1808
|
+
type: "success",
|
|
1809
|
+
text,
|
|
1810
|
+
toast_title: res.toast_title,
|
|
1811
|
+
remove_delay: res.remove_delay,
|
|
1812
|
+
})
|
|
1790
1813
|
);
|
|
1791
1814
|
if (res.set_fields && (viewname || res.set_fields._viewname)) {
|
|
1792
1815
|
const form =
|
|
@@ -1821,10 +1844,10 @@ async function common_done(res, viewnameOrElem0, isWeb = true) {
|
|
|
1821
1844
|
input.attr("data-selected", res.set_fields[k]);
|
|
1822
1845
|
}
|
|
1823
1846
|
|
|
1824
|
-
input.trigger("set_form_field");
|
|
1847
|
+
input.trigger("set_form_field", { no_onchange: res.no_onchange });
|
|
1825
1848
|
});
|
|
1826
1849
|
}
|
|
1827
|
-
form.trigger("change");
|
|
1850
|
+
if (!res.no_onchange) form.trigger("change");
|
|
1828
1851
|
}
|
|
1829
1852
|
|
|
1830
1853
|
if (res.download) {
|
|
@@ -2055,17 +2078,24 @@ function room_older(viewname, room_id, btn) {
|
|
|
2055
2078
|
);
|
|
2056
2079
|
}
|
|
2057
2080
|
|
|
2058
|
-
function
|
|
2059
|
-
let socket = null;
|
|
2060
|
-
if (
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
|
|
2081
|
+
function get_shared_socket() {
|
|
2082
|
+
let socket = window.sharedSocket || null;
|
|
2083
|
+
if (!socket) {
|
|
2084
|
+
if (parent?.saltcorn?.data?.state) {
|
|
2085
|
+
const { server_path, jwt } =
|
|
2086
|
+
parent.saltcorn.data.state.getState().mobileConfig;
|
|
2087
|
+
socket = io(server_path, {
|
|
2088
|
+
query: `jwt=${jwt}`,
|
|
2089
|
+
transports: ["websocket"],
|
|
2090
|
+
});
|
|
2091
|
+
} else socket = io({ transports: ["websocket"] });
|
|
2092
|
+
window.sharedSocket = socket;
|
|
2093
|
+
}
|
|
2094
|
+
return socket;
|
|
2095
|
+
}
|
|
2068
2096
|
|
|
2097
|
+
function init_room(viewname, room_id) {
|
|
2098
|
+
let socket = get_shared_socket();
|
|
2069
2099
|
socket.emit("join_room", [viewname, room_id]);
|
|
2070
2100
|
socket.on("message", (msg) => {
|
|
2071
2101
|
if (msg.not_for_user_id) {
|
|
@@ -2088,32 +2118,51 @@ function init_room(viewname, room_id) {
|
|
|
2088
2118
|
}
|
|
2089
2119
|
|
|
2090
2120
|
function init_collab_room(viewname, eventCfgs) {
|
|
2091
|
-
let socket =
|
|
2092
|
-
if (parent?.saltcorn?.data?.state) {
|
|
2093
|
-
const { server_path, jwt } =
|
|
2094
|
-
parent.saltcorn.data.state.getState().mobileConfig;
|
|
2095
|
-
socket = io(server_path, {
|
|
2096
|
-
query: `jwt=${jwt}`,
|
|
2097
|
-
transports: ["websocket"],
|
|
2098
|
-
});
|
|
2099
|
-
} else socket = io({ transports: ["websocket"] });
|
|
2121
|
+
let socket = get_shared_socket();
|
|
2100
2122
|
for (const [event, callback] of Object.entries(eventCfgs.events)) {
|
|
2101
2123
|
socket.on(event, callback);
|
|
2102
2124
|
}
|
|
2103
|
-
|
|
2125
|
+
const joinFn = () => {
|
|
2104
2126
|
socket.emit("join_collab_room", viewname, (ack) => {
|
|
2105
|
-
if (ack && ack.status === "ok")
|
|
2127
|
+
if (ack && ack.status === "ok")
|
|
2106
2128
|
console.log(`Joined collaboration room for view '${viewname}'`);
|
|
2107
|
-
|
|
2108
|
-
console.error("Failed to join collaboration room:", ack);
|
|
2109
|
-
}
|
|
2129
|
+
else console.error("Failed to join collaboration room:", ack);
|
|
2110
2130
|
});
|
|
2111
|
-
}
|
|
2131
|
+
};
|
|
2132
|
+
if (socket.connected) joinFn();
|
|
2133
|
+
else socket.on("connect", joinFn);
|
|
2112
2134
|
socket.on("disconnect", function () {
|
|
2113
2135
|
console.log("Disconnected from the server");
|
|
2114
2136
|
});
|
|
2115
2137
|
}
|
|
2116
2138
|
|
|
2139
|
+
function init_dynamic_update_room() {
|
|
2140
|
+
const isNode = getIsNode();
|
|
2141
|
+
if (
|
|
2142
|
+
!window.io ||
|
|
2143
|
+
navigator.userAgent.includes("jsdom") ||
|
|
2144
|
+
(isNode && !dynamic_updates_cfg?.enabled)
|
|
2145
|
+
)
|
|
2146
|
+
return;
|
|
2147
|
+
if (!isNode) {
|
|
2148
|
+
const state = parent.saltcorn.data.state.getState();
|
|
2149
|
+
if (!state.getConfig("enable_dynamic_updates", true)) return;
|
|
2150
|
+
}
|
|
2151
|
+
let socket = get_shared_socket();
|
|
2152
|
+
socket.on("dynamic_update", async (data) => {
|
|
2153
|
+
await common_done(data);
|
|
2154
|
+
});
|
|
2155
|
+
const joinFn = () => {
|
|
2156
|
+
socket.emit("join_dynamic_update_room", (ack) => {
|
|
2157
|
+
if (ack && ack.status === "ok") {
|
|
2158
|
+
if (window._sc_loglevel > 5) console.log("Joined dynamic update room");
|
|
2159
|
+
} else console.error("Failed to join dynamic update room:", ack);
|
|
2160
|
+
});
|
|
2161
|
+
};
|
|
2162
|
+
if (socket.connected) joinFn();
|
|
2163
|
+
else socket.on("connect", joinFn);
|
|
2164
|
+
}
|
|
2165
|
+
|
|
2117
2166
|
function cancel_form(form) {
|
|
2118
2167
|
if (!form) return;
|
|
2119
2168
|
$(form).trigger("reset");
|
|
@@ -2159,7 +2208,7 @@ function check_saltcorn_notifications() {
|
|
|
2159
2208
|
.then((resp) => {
|
|
2160
2209
|
if (resp.success) {
|
|
2161
2210
|
const n = resp.success;
|
|
2162
|
-
const menu_item = $(
|
|
2211
|
+
const menu_item = $('a[href="/notifications"]');
|
|
2163
2212
|
|
|
2164
2213
|
menu_item.html(
|
|
2165
2214
|
`<i class="fa-fw mr-05 fas fa-bell"></i>Notifications (${n})`
|
|
@@ -2561,3 +2610,9 @@ async function initPushNotify() {
|
|
|
2561
2610
|
console.error("Push notification initialization failed:", error);
|
|
2562
2611
|
}
|
|
2563
2612
|
}
|
|
2613
|
+
|
|
2614
|
+
if (document.readyState !== "loading") {
|
|
2615
|
+
init_dynamic_update_room();
|
|
2616
|
+
} else {
|
|
2617
|
+
document.addEventListener("DOMContentLoaded", init_dynamic_update_room);
|
|
2618
|
+
}
|
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;
|
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
|
})
|
|
@@ -1121,12 +1129,42 @@ function check_capacitor_builder() {
|
|
|
1121
1129
|
success: function (res) {
|
|
1122
1130
|
window.capacitorBuilderAvailable = !!res.installed;
|
|
1123
1131
|
if (window.capacitorBuilderAvailable) {
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1132
|
+
if (res.version !== res.sc_version) {
|
|
1133
|
+
$("#dockerBuilderStatusId").html(`
|
|
1134
|
+
<div
|
|
1135
|
+
id="mismatchBoxId" class="mt-3 p-3 border rounded bg-light"
|
|
1136
|
+
>
|
|
1137
|
+
<div
|
|
1138
|
+
class="d-flex align-items-center mb-2"
|
|
1139
|
+
>
|
|
1140
|
+
installed<i title="Information" class="ps-2 fas fa-info-circle text-warning"></i>
|
|
1141
|
+
</div>
|
|
1142
|
+
<div
|
|
1143
|
+
class="fw-bold text-danger mb-1"
|
|
1144
|
+
>
|
|
1145
|
+
Version Mismatch:
|
|
1146
|
+
</div>
|
|
1147
|
+
<ul
|
|
1148
|
+
class="list-unstyled mb-0"
|
|
1149
|
+
>
|
|
1150
|
+
<li>
|
|
1151
|
+
<span class="fw-semibold text-muted">Docker tag:</span>1.3.1-beta.0
|
|
1152
|
+
</li>
|
|
1153
|
+
<li>
|
|
1154
|
+
<span class="fw-semibold text-muted">SC version:</span>1.3.1-beta.10
|
|
1155
|
+
</li>
|
|
1156
|
+
</ul>
|
|
1157
|
+
</div>`);
|
|
1158
|
+
$("#dockerBuilderVersionBoxId").removeClass("d-none");
|
|
1159
|
+
$("#dockerBuilderVersionId").html(` ${res.version}`);
|
|
1160
|
+
} else {
|
|
1161
|
+
$("#dockerBuilderStatusId").html(
|
|
1162
|
+
`<span>
|
|
1163
|
+
installed<i class="ps-2 fas fa-check text-success"></i>
|
|
1164
|
+
</span>
|
|
1165
|
+
`
|
|
1166
|
+
);
|
|
1167
|
+
}
|
|
1130
1168
|
} else {
|
|
1131
1169
|
$("#dockerBuilderStatusId").html(
|
|
1132
1170
|
`<span>
|
package/routes/actions.js
CHANGED
|
@@ -179,6 +179,7 @@ const triggerForm = async (req, trigger) => {
|
|
|
179
179
|
workflow: true,
|
|
180
180
|
});
|
|
181
181
|
const table_triggers = ["Insert", "Update", "Delete", "Validate"];
|
|
182
|
+
const additional_triggers_with_onlyif = ["Login", "PageLoad"];
|
|
182
183
|
const action_options = {};
|
|
183
184
|
const actionsNotRequiringRow = Trigger.action_options({
|
|
184
185
|
notRequireRow: true,
|
|
@@ -337,6 +338,19 @@ const triggerForm = async (req, trigger) => {
|
|
|
337
338
|
type: "String",
|
|
338
339
|
showIf: { when_trigger: ["API call"], _raw_output: true },
|
|
339
340
|
},
|
|
341
|
+
{
|
|
342
|
+
name: "_only_if",
|
|
343
|
+
label: req.__("Only if"),
|
|
344
|
+
type: "String",
|
|
345
|
+
class: "validate-expression",
|
|
346
|
+
sublabel: req.__(
|
|
347
|
+
"Optional JavaScript expression to determine if the trigger should run."
|
|
348
|
+
),
|
|
349
|
+
parent_field: "configuration",
|
|
350
|
+
showIf: {
|
|
351
|
+
when_trigger: [...table_triggers, ...additional_triggers_with_onlyif],
|
|
352
|
+
},
|
|
353
|
+
},
|
|
340
354
|
],
|
|
341
355
|
});
|
|
342
356
|
// if (trigger) {
|
package/routes/admin.js
CHANGED
|
@@ -500,11 +500,12 @@ router.get(
|
|
|
500
500
|
"backup_s3_access_secret"
|
|
501
501
|
);
|
|
502
502
|
backupForm.values.backup_s3_region =
|
|
503
|
-
|
|
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");
|
|
@@ -2268,7 +2269,7 @@ router.get(
|
|
|
2268
2269
|
);
|
|
2269
2270
|
const buildDialogScript = (capacitorBuilderAvailable, isSbadmin2) =>
|
|
2270
2271
|
`<script>
|
|
2271
|
-
var capacitorBuilderAvailable = ${capacitorBuilderAvailable};
|
|
2272
|
+
var capacitorBuilderAvailable = ${capacitorBuilderAvailable.installed};
|
|
2272
2273
|
var isSbadmin2 = ${isSbadmin2};
|
|
2273
2274
|
function showEntrySelect(type) {
|
|
2274
2275
|
for( const currentType of ["view", "page", "pagegroup"]) {
|
|
@@ -2307,16 +2308,22 @@ const buildDialogScript = (capacitorBuilderAvailable, isSbadmin2) =>
|
|
|
2307
2308
|
`)}
|
|
2308
2309
|
</script>`;
|
|
2309
2310
|
|
|
2310
|
-
const imageAvailable = async () => {
|
|
2311
|
+
const imageAvailable = async (preferedVersion) => {
|
|
2312
|
+
const docker = new Docker();
|
|
2311
2313
|
try {
|
|
2312
|
-
const
|
|
2313
|
-
|
|
2314
|
-
`saltcorn/capacitor-builder:${state.scVersion}`
|
|
2314
|
+
const image = docker.getImage(
|
|
2315
|
+
`saltcorn/capacitor-builder:${preferedVersion}`
|
|
2315
2316
|
);
|
|
2316
2317
|
await image.inspect();
|
|
2317
|
-
return true;
|
|
2318
|
+
return { installed: true, version: preferedVersion };
|
|
2318
2319
|
} catch (e) {
|
|
2319
|
-
|
|
2320
|
+
const images = await docker.listImages({
|
|
2321
|
+
filters: { reference: ["saltcorn/capacitor-builder:*"] },
|
|
2322
|
+
});
|
|
2323
|
+
const tags = images.flatMap((img) => img.RepoTags || []);
|
|
2324
|
+
if (tags.length > 0)
|
|
2325
|
+
return { installed: true, version: tags[0].split(":")[1] };
|
|
2326
|
+
return { installed: false };
|
|
2320
2327
|
}
|
|
2321
2328
|
};
|
|
2322
2329
|
|
|
@@ -2372,7 +2379,8 @@ router.get(
|
|
|
2372
2379
|
.map((plugin) => plugin.name);
|
|
2373
2380
|
const builderSettings =
|
|
2374
2381
|
getState().getConfig("mobile_builder_settings") || {};
|
|
2375
|
-
const
|
|
2382
|
+
const scVersion = getState().scVersion;
|
|
2383
|
+
const dockerAvailable = await imageAvailable(scVersion);
|
|
2376
2384
|
const xcodeCheckRes = await checkXcodebuild();
|
|
2377
2385
|
const xcodebuildAvailable = xcodeCheckRes.installed;
|
|
2378
2386
|
const xcodebuildVersion = xcodeCheckRes.version;
|
|
@@ -3132,15 +3140,58 @@ router.get(
|
|
|
3132
3140
|
id: "dockerBuilderStatusId",
|
|
3133
3141
|
class: "",
|
|
3134
3142
|
},
|
|
3135
|
-
dockerAvailable
|
|
3143
|
+
dockerAvailable.installed &&
|
|
3144
|
+
dockerAvailable.version === scVersion
|
|
3136
3145
|
? span(
|
|
3137
3146
|
req.__("installed"),
|
|
3138
3147
|
i({ class: "ps-2 fas fa-check text-success" })
|
|
3139
3148
|
)
|
|
3140
|
-
:
|
|
3141
|
-
|
|
3142
|
-
|
|
3143
|
-
|
|
3149
|
+
: dockerAvailable.installed
|
|
3150
|
+
? div(
|
|
3151
|
+
{
|
|
3152
|
+
id: "mismatchBoxId",
|
|
3153
|
+
class: "mt-3 p-3 border rounded bg-light",
|
|
3154
|
+
},
|
|
3155
|
+
div(
|
|
3156
|
+
{
|
|
3157
|
+
class: "d-flex align-items-center mb-2",
|
|
3158
|
+
},
|
|
3159
|
+
req.__("installed"),
|
|
3160
|
+
i({
|
|
3161
|
+
title: req.__("Information"),
|
|
3162
|
+
class:
|
|
3163
|
+
"ps-2 fas fa-info-circle text-warning",
|
|
3164
|
+
})
|
|
3165
|
+
),
|
|
3166
|
+
div(
|
|
3167
|
+
{ class: "fw-bold text-danger mb-1" },
|
|
3168
|
+
"Version Mismatch:"
|
|
3169
|
+
),
|
|
3170
|
+
|
|
3171
|
+
ul(
|
|
3172
|
+
{ class: "list-unstyled mb-0" },
|
|
3173
|
+
li(
|
|
3174
|
+
span(
|
|
3175
|
+
{ class: "fw-semibold text-muted" },
|
|
3176
|
+
req.__("Docker tag:")
|
|
3177
|
+
),
|
|
3178
|
+
dockerAvailable.version
|
|
3179
|
+
),
|
|
3180
|
+
li(
|
|
3181
|
+
span(
|
|
3182
|
+
{ class: "fw-semibold text-muted" },
|
|
3183
|
+
req.__("SC version:")
|
|
3184
|
+
),
|
|
3185
|
+
scVersion
|
|
3186
|
+
)
|
|
3187
|
+
)
|
|
3188
|
+
)
|
|
3189
|
+
: span(
|
|
3190
|
+
req.__("not available"),
|
|
3191
|
+
i({
|
|
3192
|
+
class: "ps-2 fas fa-times text-danger",
|
|
3193
|
+
})
|
|
3194
|
+
)
|
|
3144
3195
|
)
|
|
3145
3196
|
),
|
|
3146
3197
|
div(
|
|
@@ -3996,8 +4047,9 @@ router.get(
|
|
|
3996
4047
|
"/mobile-app/check-capacitor-builder",
|
|
3997
4048
|
isAdmin,
|
|
3998
4049
|
error_catcher(async (req, res) => {
|
|
3999
|
-
const
|
|
4000
|
-
|
|
4050
|
+
const state = getState();
|
|
4051
|
+
const { installed, version } = await imageAvailable(state.scVersion);
|
|
4052
|
+
res.json({ installed, version, sc_version: state.scVersion });
|
|
4001
4053
|
})
|
|
4002
4054
|
);
|
|
4003
4055
|
|
|
@@ -4126,6 +4178,8 @@ router.post(
|
|
|
4126
4178
|
await db.deleteWhere("_sc_config", { not: { key: "letsencrypt" } });
|
|
4127
4179
|
}
|
|
4128
4180
|
await getState().refresh();
|
|
4181
|
+
await require("@saltcorn/data/standard-menu")();
|
|
4182
|
+
|
|
4129
4183
|
if (form.values.users) {
|
|
4130
4184
|
await db.deleteWhere("_sc_notifications");
|
|
4131
4185
|
|
|
@@ -4532,7 +4586,6 @@ admin_config_route({
|
|
|
4532
4586
|
path: "/notifications",
|
|
4533
4587
|
super_path: "/admin",
|
|
4534
4588
|
field_names: [
|
|
4535
|
-
"notification_in_menu",
|
|
4536
4589
|
{ section_header: "Progressive Web Application" },
|
|
4537
4590
|
"pwa_enabled",
|
|
4538
4591
|
{ name: "pwa_display", showIf: { pwa_enabled: true } },
|
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
|
@@ -1530,7 +1530,7 @@ router.post(
|
|
|
1530
1530
|
const table = Table.findOne({ name: table_name });
|
|
1531
1531
|
const field = table.getField(field_name);
|
|
1532
1532
|
let val = field.type?.read
|
|
1533
|
-
? field.type?.read(req.body[field_name])
|
|
1533
|
+
? field.type?.read(req.body[field_name], field.attributes)
|
|
1534
1534
|
: req.body[field_name];
|
|
1535
1535
|
await db.withTransaction(async () => {
|
|
1536
1536
|
await table.updateRow({ [field_name]: val }, pk, req.user);
|