@saltcorn/server 1.6.0-beta.3 → 1.6.0-beta.5
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 +8 -0
- package/app.js +14 -5
- package/auth/routes.js +175 -60
- package/auth/testhelp.js +9 -19
- package/docs/assets/hierarchy.js +1 -1
- package/docs/assets/navigation.js +1 -1
- package/docs/assets/search.js +1 -1
- package/docs/classes/_saltcorn_admin-models.models_snapshot.Snapshot.html +2 -2
- package/docs/classes/_saltcorn_common-code.relations_relation.Relation.html +3 -3
- package/docs/classes/_saltcorn_common-code.relations_relations_finder.RelationsFinder.html +5 -5
- package/docs/classes/_saltcorn_data.diagram_cy_raster.CytoscapeRaster.html +4 -4
- package/docs/classes/_saltcorn_data.diagram_nodes_dummy_node.DummyNode.html +4 -4
- package/docs/classes/_saltcorn_data.diagram_nodes_node.Node.html +4 -4
- package/docs/classes/_saltcorn_data.diagram_nodes_page_node.PageNode.html +4 -4
- package/docs/classes/_saltcorn_data.diagram_nodes_table_node.TableNode.html +4 -4
- package/docs/classes/_saltcorn_data.diagram_nodes_trigger_node.TriggerNode.html +4 -4
- package/docs/classes/_saltcorn_data.diagram_nodes_view_node.ViewNode.html +4 -4
- package/docs/classes/_saltcorn_data.mobile-mocks_node_async_hooks.AsyncLocalStorage.html +2 -2
- package/docs/classes/_saltcorn_data.models_crash.Crash.html +2 -2
- package/docs/classes/_saltcorn_data.models_eventlog.EventLog.html +2 -2
- package/docs/classes/_saltcorn_data.models_field.Field.html +9 -9
- package/docs/classes/_saltcorn_data.models_fieldrepeat.FieldRepeat.html +2 -2
- package/docs/classes/_saltcorn_data.models_file.File.html +21 -21
- package/docs/classes/_saltcorn_data.models_form.Form.html +2 -2
- package/docs/classes/_saltcorn_data.models_internal_mail_queue.MailQueue.html +4 -4
- package/docs/classes/_saltcorn_data.models_internal_push_message_helper.PushMessageHelper.html +7 -7
- package/docs/classes/_saltcorn_data.models_library.Library.html +2 -2
- package/docs/classes/_saltcorn_data.models_model.Model.html +2 -2
- package/docs/classes/_saltcorn_data.models_model_instance.ModelInstance.html +2 -2
- package/docs/classes/_saltcorn_data.models_notification.Notification.html +2 -2
- package/docs/classes/_saltcorn_data.models_page.Page.html +12 -11
- package/docs/classes/_saltcorn_data.models_page_group.PageGroup.html +16 -16
- package/docs/classes/_saltcorn_data.models_page_group_member.PageGroupMember.html +8 -8
- package/docs/classes/_saltcorn_data.models_plugin.Plugin.html +44 -10
- package/docs/classes/_saltcorn_data.models_role.Role.html +2 -2
- package/docs/classes/_saltcorn_data.models_table.Table.html +67 -65
- package/docs/classes/_saltcorn_data.models_table_constraints.TableConstraint.html +2 -2
- package/docs/classes/_saltcorn_data.models_tag.Tag.html +2 -2
- package/docs/classes/_saltcorn_data.models_tag_entry.TagEntry.html +2 -2
- package/docs/classes/_saltcorn_data.models_trigger.Trigger.html +21 -20
- package/docs/classes/_saltcorn_data.models_user.User.html +32 -32
- package/docs/classes/_saltcorn_data.models_view.View.html +16 -15
- package/docs/classes/_saltcorn_data.models_workflow.Workflow.html +2 -2
- package/docs/classes/_saltcorn_data.models_workflow_run.WorkflowRun.html +2 -2
- package/docs/classes/_saltcorn_data.models_workflow_step.WorkflowStep.html +2 -2
- package/docs/classes/_saltcorn_data.models_workflow_trace.MetaData.html +2 -2
- package/docs/classes/_saltcorn_data.models_workflow_trace.WorkflowTrace.html +2 -2
- package/docs/classes/_saltcorn_mobile-builder.mobile-builder.MobileBuilder.html +2 -2
- package/docs/classes/_saltcorn_mobile-builder.utils_capacitor-helper.CapacitorHelper.html +2 -2
- package/docs/enums/_saltcorn_common-code.relations_relation_types.RelationType.html +2 -2
- package/docs/enums/_saltcorn_common-code.relations_relation_types.ViewDisplayType.html +2 -2
- package/docs/functions/_saltcorn_admin-models.models_config-check.runConfigurationCheck.html +1 -1
- package/docs/functions/_saltcorn_common-code.relations_relation_helpers.buildRelationPath.html +1 -1
- package/docs/functions/_saltcorn_common-code.relations_relation_helpers.buildTableCaches.html +1 -1
- package/docs/functions/_saltcorn_common-code.relations_relation_helpers.parseLegacyRelation.html +1 -1
- package/docs/functions/_saltcorn_common-code.relations_relation_helpers.parseRelationPath.html +1 -1
- package/docs/functions/_saltcorn_common-code.tests_test_data.fixturesData.html +1 -1
- package/docs/functions/_saltcorn_common-code.tests_test_data.withAnotherUserField.html +1 -1
- package/docs/functions/_saltcorn_common-code.tests_test_data.withKeyFromLayerThree.html +1 -1
- package/docs/functions/_saltcorn_common-code.tests_test_data.withKeyFromLayerTwo.html +1 -1
- package/docs/functions/_saltcorn_common-code.tests_test_data.withMultipleInbounds.html +1 -1
- package/docs/functions/_saltcorn_common-code.tests_test_data.withSecondTopicField.html +1 -1
- package/docs/functions/_saltcorn_common-code.tests_test_data.withSimplePostTopicrelation.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.action_link.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.action_url.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.fill_presets.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.getForm.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.get_view_link_query.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.get_viewable_fields.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.get_viewable_fields_from_layout.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.make_link.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.objToQueryString.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.parse_view_select.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.setDateLocales.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.splitUniques.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.standardBlockDispatch.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.standardLayoutRowVisitor.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.transformForm.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.updateViewSelect.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.view_linker.html +1 -1
- package/docs/functions/_saltcorn_data.db_connect_mobile.getConnectObject.html +1 -1
- package/docs/functions/_saltcorn_data.db_reset_schema.reset.html +1 -1
- package/docs/functions/_saltcorn_data.diagram_cy_generate_utils.generateCyCode.html +1 -1
- package/docs/functions/_saltcorn_data.diagram_cy_generate_utils.genereateCyCfg.html +1 -1
- package/docs/functions/_saltcorn_data.diagram_node_extract_utils.buildObjectTrees.html +1 -1
- package/docs/functions/_saltcorn_data.diagram_node_extract_utils.extractFromColumns.html +1 -1
- package/docs/functions/_saltcorn_data.diagram_node_extract_utils.extractFromLayout.html +1 -1
- package/docs/functions/_saltcorn_data.diagram_node_extract_utils.extractViewToCreate.html +1 -1
- package/docs/functions/_saltcorn_data.migrate.create_blank_migration.html +1 -1
- package/docs/functions/_saltcorn_data.migrate.getMigrationsInDB.html +1 -1
- package/docs/functions/_saltcorn_data.migrate.migrate.html +1 -1
- package/docs/functions/_saltcorn_data.migrations_202102091312.js.html +1 -1
- package/docs/functions/_saltcorn_data.migrations_202210051058.js.html +1 -1
- package/docs/functions/_saltcorn_data.migrations_202210101540.js.html +1 -1
- package/docs/functions/_saltcorn_data.migrations_202304281224.js.html +1 -1
- package/docs/functions/_saltcorn_data.migrations_202307211459.js.html +1 -1
- package/docs/functions/_saltcorn_data.migrations_202502131103.js.html +1 -1
- package/docs/functions/_saltcorn_data.migrations_202508011455.js.html +1 -1
- package/docs/functions/_saltcorn_data.migrations_202510152058.js.html +1 -1
- package/docs/functions/_saltcorn_data.migrations_202603101553.sql_pg.html +1 -1
- package/docs/functions/_saltcorn_data.migrations_202604111200.sql_pg.html +1 -0
- package/docs/functions/_saltcorn_data.mobile-mocks_node_child_process.execSync.html +1 -1
- package/docs/functions/_saltcorn_data.mobile-mocks_node_fs.createReadStream.html +1 -1
- package/docs/functions/_saltcorn_data.mobile-mocks_node_fs.readdirSync.html +1 -1
- package/docs/functions/_saltcorn_data.mobile-mocks_node_fs.writeFileSync.html +1 -1
- package/docs/functions/_saltcorn_data.mobile-mocks_node_fs_promises.mkdir.html +1 -1
- package/docs/functions/_saltcorn_data.mobile-mocks_node_fs_promises.readFile.html +1 -1
- package/docs/functions/_saltcorn_data.mobile-mocks_node_fs_promises.readdir.html +1 -1
- package/docs/functions/_saltcorn_data.mobile-mocks_node_fs_promises.stat.html +1 -1
- package/docs/functions/_saltcorn_data.mobile-mocks_node_fs_promises.unlink.html +1 -1
- package/docs/functions/_saltcorn_data.mobile-mocks_node_fs_promises.writeFile.html +1 -1
- package/docs/functions/_saltcorn_data.mobile-mocks_node_latest-version.latestVersion.html +1 -1
- package/docs/functions/_saltcorn_data.mobile-mocks_node_v8.deserialize.html +1 -1
- package/docs/functions/_saltcorn_data.mobile-mocks_node_v8.serialize.html +1 -1
- package/docs/functions/_saltcorn_data.mobile-mocks_npm_env-paths.envPaths.html +1 -1
- package/docs/functions/_saltcorn_data.model-helper.get_predictor.html +1 -1
- package/docs/functions/_saltcorn_data.model-helper.run_jupyter_model.html +1 -1
- package/docs/functions/_saltcorn_data.model-helper.shorten_trackback.html +1 -1
- package/docs/functions/_saltcorn_data.model-helper.write_csv.html +1 -1
- package/docs/functions/_saltcorn_data.models_internal_async_json_stream.async_json_stream.html +1 -1
- package/docs/functions/_saltcorn_data.models_internal_query.aggregation_query_fields.html +1 -1
- package/docs/functions/_saltcorn_data.models_internal_query.getAggAndField.html +1 -1
- package/docs/functions/_saltcorn_data.models_internal_query.joinfield_renamer.html +1 -1
- package/docs/functions/_saltcorn_data.models_internal_query.process_aggregations.html +1 -1
- package/docs/functions/_saltcorn_data.models_internal_s3_helpers.buildKeyFromRelative.html +1 -1
- package/docs/functions/_saltcorn_data.models_internal_s3_helpers.copyObject.html +1 -1
- package/docs/functions/_saltcorn_data.models_internal_s3_helpers.deleteObject.html +1 -1
- package/docs/functions/_saltcorn_data.models_internal_s3_helpers.downloadBuffer.html +1 -1
- package/docs/functions/_saltcorn_data.models_internal_s3_helpers.getPublicFileUrl.html +1 -1
- package/docs/functions/_saltcorn_data.models_internal_s3_helpers.getResolvedBucket.html +1 -1
- package/docs/functions/_saltcorn_data.models_internal_s3_helpers.getS3Client.html +1 -1
- package/docs/functions/_saltcorn_data.models_internal_s3_helpers.getServeUrl.html +1 -1
- package/docs/functions/_saltcorn_data.models_internal_s3_helpers.getSignedFileUrl.html +1 -1
- package/docs/functions/_saltcorn_data.models_internal_s3_helpers.headObject.html +1 -1
- package/docs/functions/_saltcorn_data.models_internal_s3_helpers.isS3Enabled.html +1 -1
- package/docs/functions/_saltcorn_data.models_internal_s3_helpers.listS3Folder.html +1 -1
- package/docs/functions/_saltcorn_data.models_internal_s3_helpers.publicUrlToRelativePath.html +1 -1
- package/docs/functions/_saltcorn_data.models_internal_s3_helpers.relativeKeyToPath.html +1 -1
- package/docs/functions/_saltcorn_data.models_internal_s3_helpers.setObjectMetadata.html +1 -1
- package/docs/functions/_saltcorn_data.models_internal_s3_helpers.uploadBuffer.html +1 -1
- package/docs/functions/_saltcorn_data.models_internal_table_helper.boolExamples.html +1 -1
- package/docs/functions/_saltcorn_data.models_internal_table_helper.colorExamples.html +1 -1
- package/docs/functions/_saltcorn_data.models_internal_table_helper.floatExamples.html +1 -1
- package/docs/functions/_saltcorn_data.models_internal_table_helper.get_formula_examples.html +1 -1
- package/docs/functions/_saltcorn_data.models_internal_table_helper.intExamples.html +1 -1
- package/docs/functions/_saltcorn_data.models_internal_table_helper.stringExamples.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-helper.build_schema_data.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-helper.calcfldViewConfig.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-helper.calcfldViewOptions.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-helper.calcrelViewOptions.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-helper.displayType.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-helper.field_picker_fields.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-helper.generate_joined_query.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-helper.getActionConfigFields.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-helper.get_child_views.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-helper.get_inbound_relation_opts.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-helper.get_inbound_self_relation_opts.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-helper.get_link_view_opts.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-helper.get_many_to_many_relation_opts.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-helper.get_parent_views.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-helper.initial_config_all_fields.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-helper.json_list_to_external_table.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-helper.link_view.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-helper.pathToState.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-helper.picked_fields_to_query.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-helper.readState.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-helper.readStateStrict.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-helper.runCollabEvents.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-helper.run_action_column.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-helper.stateFieldsToQuery.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-helper.stateFieldsToWhere.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-helper.stateToQueryString.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-helper.strictParseInt.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-testing.auto_test_plugin.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-testing.check_view_columns.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-testing.generate_attributes.html +1 -1
- package/docs/functions/_saltcorn_data.standard-menu.create_standard_menu.html +1 -1
- package/docs/functions/_saltcorn_data.tests_assertions.assertIsErrorMsg.html +1 -1
- package/docs/functions/_saltcorn_data.tests_assertions.assertIsErrorsMsg.html +1 -1
- package/docs/functions/_saltcorn_data.tests_assertions.assertIsRow.html +1 -1
- package/docs/functions/_saltcorn_data.tests_assertions.assertIsSet.html +1 -1
- package/docs/functions/_saltcorn_data.tests_assertions.assertIsType.html +1 -1
- package/docs/functions/_saltcorn_data.tests_assertions.assertsIsSuccessMessage.html +1 -1
- package/docs/functions/_saltcorn_data.tests_assertions.assertsObjectIsUser.html +1 -1
- package/docs/functions/_saltcorn_data.tests_common_helpers.createAnotherUserField.html +1 -1
- package/docs/functions/_saltcorn_data.tests_common_helpers.createKeyFromLevelTwo.html +1 -1
- package/docs/functions/_saltcorn_data.tests_common_helpers.createLevelThreeInbound.html +1 -1
- package/docs/functions/_saltcorn_data.tests_common_helpers.createMultipleInbounds.html +1 -1
- package/docs/functions/_saltcorn_data.tests_common_helpers.createSecondTopicField.html +1 -1
- package/docs/functions/_saltcorn_data.tests_common_helpers.prepareEmployeeDepartment.html +1 -1
- package/docs/functions/_saltcorn_data.tests_common_helpers.prepareSimpleTopicPostRelation.html +1 -1
- package/docs/functions/_saltcorn_data.tests_remote_query_helper.deleteViewFromServer.html +1 -1
- package/docs/functions/_saltcorn_data.tests_remote_query_helper.prepareQueryEnviroment.html +1 -1
- package/docs/functions/_saltcorn_data.tests_remote_query_helper.sendViewToServer.html +1 -1
- package/docs/functions/_saltcorn_data.translate.hasLLM.html +1 -1
- package/docs/functions/_saltcorn_data.translate.translate.html +1 -1
- package/docs/functions/_saltcorn_db-common.internal.ftsFieldsSqlExpr.html +1 -1
- package/docs/functions/_saltcorn_db-common.internal.mkSelectOptions.html +1 -1
- package/docs/functions/_saltcorn_db-common.internal.mkWhere.html +1 -1
- package/docs/functions/_saltcorn_db-common.internal.orderByIsObject.html +1 -1
- package/docs/functions/_saltcorn_db-common.internal.orderByIsOperator.html +1 -1
- package/docs/functions/_saltcorn_db-common.internal.prefixFieldsInWhere.html +1 -1
- package/docs/functions/_saltcorn_db-common.internal.sqlBinOp.html +1 -1
- package/docs/functions/_saltcorn_db-common.internal.sqlFun.html +1 -1
- package/docs/functions/_saltcorn_db-common.internal.sqlsanitize.html +1 -1
- package/docs/functions/_saltcorn_db-common.internal.sqlsanitizeAllowDots.html +1 -1
- package/docs/functions/_saltcorn_db-common.internal.subSelectWhere.html +1 -1
- package/docs/functions/_saltcorn_db-common.multi-tenant.enable_multi_tenant.html +1 -1
- package/docs/functions/_saltcorn_db-common.multi-tenant.getRequestContext.html +1 -1
- package/docs/functions/_saltcorn_db-common.multi-tenant.getTenantSchema.html +1 -1
- package/docs/functions/_saltcorn_db-common.multi-tenant.init.html +1 -1
- package/docs/functions/_saltcorn_db-common.multi-tenant.is_it_multi_tenant.html +1 -1
- package/docs/functions/_saltcorn_db-common.multi-tenant.runWithTenant.html +1 -1
- package/docs/functions/_saltcorn_db-common.sqlite-commons.buildInsertBulkSql.html +1 -1
- package/docs/functions/_saltcorn_db-common.sqlite-commons.buildInsertSql.html +1 -1
- package/docs/functions/_saltcorn_db-common.sqlite-commons.commitAndBeginNewTransaction.html +1 -1
- package/docs/functions/_saltcorn_db-common.sqlite-commons.doCount.html +1 -1
- package/docs/functions/_saltcorn_db-common.sqlite-commons.doDeleteWhere.html +1 -1
- package/docs/functions/_saltcorn_db-common.sqlite-commons.doListScTables.html +1 -1
- package/docs/functions/_saltcorn_db-common.sqlite-commons.doListTables.html +1 -1
- package/docs/functions/_saltcorn_db-common.sqlite-commons.doListUserDefinedTables.html +1 -1
- package/docs/functions/_saltcorn_db-common.sqlite-commons.do_add_index.html +1 -1
- package/docs/functions/_saltcorn_db-common.sqlite-commons.do_drop_index.html +1 -1
- package/docs/functions/_saltcorn_db-common.sqlite-commons.mkVal.html +1 -1
- package/docs/functions/_saltcorn_db-common.sqlite-commons.openOrUseTransaction.html +1 -1
- package/docs/functions/_saltcorn_db-common.sqlite-commons.reprAsJson.html +1 -1
- package/docs/functions/_saltcorn_db-common.sqlite-commons.slugify.html +1 -1
- package/docs/functions/_saltcorn_db-common.sqlite-commons.tryCatchInTransaction.html +1 -1
- package/docs/functions/_saltcorn_db-common.sqlite-commons.whenTransactionisFree.html +1 -1
- package/docs/functions/_saltcorn_db-common.sqlite-commons.withTransaction.html +1 -1
- package/docs/functions/_saltcorn_markup.mktag.mkTag.html +1 -1
- package/docs/functions/_saltcorn_markup.tabs.tabs.html +1 -1
- package/docs/functions/_saltcorn_markup.workflow.renderWorkflow.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.androidFeatures.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.androidPermissions.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.buildTablesFile.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.copyPrepopulatedDb.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.copyServerFiles.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.copyShareExtFiles.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.copySiteLogo.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.copyTranslationFiles.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.createSqliteDb.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.extractDomain.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.generateAndroidVersionCode.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.hasAuthMethod.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.modifyAndroidManifest.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.modifyAppDelegate.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.modifyConfigXml.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.modifyGradleConfig.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.modifyInfoPlist.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.modifyShareViewController.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.modifyXcodeProjectFile.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.prepAppIcon.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.prepareAppIcon.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.prepareBuildDir.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.prepareExportOptionsPlist.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.prepareSplashIcon.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.prepareSplashPage.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.runAddEntitlementsScript.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.writeCapacitorConfig.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.writeCfgFile.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.writeDataExtractionRules.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.writeEntitlementsPlist.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.writeNetworkSecurityConfig.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.writePodfile.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.writePrivacyInfo.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_package-bundle-utils.bundleMobileAppCode.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_package-bundle-utils.bundlePackagesAndPlugins.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_package-bundle-utils.copyOptionalSource.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_package-bundle-utils.copyPluginMobileAppDirs.html +1 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_package-bundle-utils.copyPublicDirs.html +1 -1
- package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.add_index.html +1 -1
- package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.add_unique_constraint.html +1 -1
- package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.count.html +1 -1
- package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.deleteWhere.html +1 -1
- package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.drop_index.html +1 -1
- package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.drop_reset_schema.html +1 -1
- package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.drop_unique_constraint.html +1 -1
- package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.init.html +1 -1
- package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.insert.html +1 -1
- package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.insertRows.html +1 -1
- package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.listScTables.html +1 -1
- package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.listTables.html +1 -1
- package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.listUserDefinedTables.html +1 -1
- package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.query.html +1 -1
- package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.select.html +1 -1
- package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.selectMaybeOne.html +1 -1
- package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.selectOne.html +1 -1
- package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.setConnectionObject.html +1 -1
- package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.tableExists.html +1 -1
- package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.time.html +1 -1
- package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.update.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.add_index.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.add_unique_constraint.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.begin.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.changeConnection.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.close.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.commit.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.count.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.deleteWhere.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.dropTable.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.dropTables.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.drop_index.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.drop_reset_schema.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.drop_unique_constraint.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.getVersion.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.get_db_filepath.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.get_sql_logging.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.init.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.insert.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.listScTables.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.listTables.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.listUserDefinedTables.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.query.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.rollback.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.select.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.selectMaybeOne.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.selectOne.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.set_sql_logging.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.sql_log.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.update.html +1 -1
- package/docs/functions/_saltcorn_sqlite.sqlite.updateWhere.html +1 -1
- package/docs/functions/_saltcorn_types.base_types.instanceOWithHtmlFile.html +1 -1
- package/docs/functions/_saltcorn_types.base_types.instanceOfFieldViewEdit.html +1 -1
- package/docs/functions/_saltcorn_types.base_types.instanceOfFieldViewShow.html +1 -1
- package/docs/functions/_saltcorn_types.base_types.instanceOfPack.html +1 -1
- package/docs/functions/_saltcorn_types.common_types.instanceOfErrorMsg.html +1 -1
- package/docs/functions/_saltcorn_types.common_types.instanceOfSuccessMsg.html +1 -1
- package/docs/functions/_saltcorn_types.common_types.instanceOfType.html +1 -1
- package/docs/functions/_saltcorn_types.model-abstracts_abstract_field.instanceOfField.html +1 -1
- package/docs/functions/_saltcorn_types.model-abstracts_abstract_page.instanceOfPage.html +1 -1
- package/docs/functions/_saltcorn_types.model-abstracts_abstract_plugin.instanceOfPlugin.html +1 -1
- package/docs/functions/_saltcorn_types.model-abstracts_abstract_table.instanceOfTable.html +1 -1
- package/docs/functions/_saltcorn_types.model-abstracts_abstract_view.instanceOfView.html +1 -1
- package/docs/hierarchy.html +1 -1
- package/docs/interfaces/_saltcorn_db-common.dbtypes.UserLike.html +2 -2
- package/docs/interfaces/_saltcorn_markup.types.TagExports.html +2 -2
- package/docs/interfaces/_saltcorn_mobile-builder.utils_common-build-utils.ScCapacitorConfig.html +2 -2
- package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_field.AbstractField.html +2 -2
- package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_field.AbstractFieldRepeat.html +2 -2
- package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_form.AbstractForm.html +2 -2
- package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_page.AbstractPage.html +2 -2
- package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_page_group.AbstractPageGroup.html +2 -2
- package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_page_group_member.AbstractPageGroupMember.html +2 -2
- package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_plugin.AbstractPlugin.html +2 -2
- package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_role.AbstractRole.html +2 -2
- package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_table.AbstractTable.html +2 -2
- package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_tag.AbstractTag.html +2 -2
- package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_tag_entry.AbstractTagEntry.html +2 -2
- package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_trigger.AbstractTrigger.html +2 -2
- package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_user.AbstractUser.html +2 -2
- package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_user.ForUserRequest.html +2 -2
- package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_view.AbstractView.html +2 -2
- package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_workflow.AbstractWorkflow.html +2 -2
- package/docs/modules/_saltcorn_data.html +1 -1
- package/docs/modules/_saltcorn_data.migrations_202604091531.html +1 -0
- package/docs/modules/_saltcorn_data.migrations_202604111200.html +1 -0
- package/docs/modules/_saltcorn_data.mobile-mocks_npm_npm-registry-fetch.html +1 -0
- package/docs/modules/_saltcorn_data.mobile-mocks_saltcorn_admin-models-tenant.html +1 -0
- package/docs/modules/_saltcorn_data.mobile-mocks_saltcorn_plugins-loader-plugin-installer.html +1 -0
- package/docs/modules/_saltcorn_data.mobile-mocks_saltcorn_plugins-loader-stable-versioning.html +1 -0
- package/docs/types/_saltcorn_data.diagram_node_extract_utils.ExtractOpts.html +2 -2
- package/docs/types/_saltcorn_data.diagram_node_extract_utils.ExtractResult.html +2 -2
- package/docs/types/_saltcorn_data.diagram_nodes_node.NodeType.html +1 -1
- package/docs/types/_saltcorn_data.models_config.ConfigTypes.html +1 -1
- package/docs/types/_saltcorn_data.models_config.SingleConfig.html +1 -1
- package/docs/types/_saltcorn_data.models_eventlog.EventLogCfg.html +2 -2
- package/docs/types/_saltcorn_data.models_file.FileCfg.html +2 -2
- package/docs/types/_saltcorn_data.models_form.AdditionalButton.html +1 -1
- package/docs/types/_saltcorn_data.models_form.FormCfg.html +2 -2
- package/docs/types/_saltcorn_data.models_internal_push_message_helper.MobileSubscription.html +2 -2
- package/docs/types/_saltcorn_data.models_internal_push_message_helper.WebPushSubscription.html +2 -2
- package/docs/types/_saltcorn_data.models_internal_s3_helpers.S3HeadResult.html +1 -1
- package/docs/types/_saltcorn_data.models_internal_s3_helpers.S3ListResult.html +2 -2
- package/docs/types/_saltcorn_data.models_page_group.ScreenInfoParams.html +2 -2
- package/docs/types/_saltcorn_data.models_table.ChildRelations.html +2 -2
- package/docs/types/_saltcorn_data.models_table.ParentRelations.html +2 -2
- package/docs/types/_saltcorn_data.models_table.RelationData.html +2 -2
- package/docs/types/_saltcorn_data.models_tag_entry.TagEntryCfg.html +1 -1
- package/docs/types/_saltcorn_data.models_view.FindViewsPred.html +1 -1
- package/docs/types/_saltcorn_db-common.dbtypes.AggregationOptions.html +2 -2
- package/docs/types/_saltcorn_db-common.dbtypes.CoordOpts.html +2 -2
- package/docs/types/_saltcorn_db-common.dbtypes.DatabaseClient.html +2 -2
- package/docs/types/_saltcorn_db-common.dbtypes.JoinField.html +2 -2
- package/docs/types/_saltcorn_db-common.dbtypes.JoinFields.html +1 -1
- package/docs/types/_saltcorn_db-common.dbtypes.JoinOptions.html +1 -1
- package/docs/types/_saltcorn_db-common.dbtypes.JsonPath.html +1 -1
- package/docs/types/_saltcorn_db-common.dbtypes.JsonPathElem.html +1 -1
- package/docs/types/_saltcorn_db-common.dbtypes.Operator.html +1 -1
- package/docs/types/_saltcorn_db-common.dbtypes.PartialSome.html +1 -1
- package/docs/types/_saltcorn_db-common.dbtypes.PrimaryKeyValue.html +1 -1
- package/docs/types/_saltcorn_db-common.dbtypes.Row.html +1 -1
- package/docs/types/_saltcorn_db-common.dbtypes.SelectOptions.html +2 -2
- package/docs/types/_saltcorn_db-common.dbtypes.StrongRow.html +1 -1
- package/docs/types/_saltcorn_db-common.dbtypes.SubselectOptions.html +2 -2
- package/docs/types/_saltcorn_db-common.dbtypes.Value.html +1 -1
- package/docs/types/_saltcorn_db-common.dbtypes.Where.html +2 -2
- package/docs/types/_saltcorn_db-common.sqlite-commons.SqlAndValues.html +2 -2
- package/docs/types/_saltcorn_db-common.types.DbExportsType.html +2 -2
- package/docs/types/_saltcorn_db-common.types.GenObj.html +1 -1
- package/docs/types/_saltcorn_markup.emergency_layout.WrapParams.html +2 -2
- package/docs/types/_saltcorn_markup.helpers.CheckBoxGroupOpts.html +2 -2
- package/docs/types/_saltcorn_markup.helpers.PaginationOpts.html +2 -2
- package/docs/types/_saltcorn_markup.helpers.RadioGroupOpts.html +2 -2
- package/docs/types/_saltcorn_markup.helpers.SearchBarOpts.html +2 -2
- package/docs/types/_saltcorn_markup.layout.RenderOpts-1.html +2 -2
- package/docs/types/_saltcorn_markup.layout.RenderOpts.html +2 -2
- package/docs/types/_saltcorn_markup.mjml-layout.RenderOpts.html +2 -2
- package/docs/types/_saltcorn_markup.table.HeadersParams.html +2 -2
- package/docs/types/_saltcorn_markup.table.OptsParams.html +2 -2
- package/docs/types/_saltcorn_markup.types.AttributeVal.html +1 -1
- package/docs/types/_saltcorn_markup.types.Attributes.html +2 -2
- package/docs/types/_saltcorn_markup.types.ClassVal.html +1 -1
- package/docs/types/_saltcorn_markup.types.Element.html +1 -1
- package/docs/types/_saltcorn_markup.types.Falsy.html +1 -1
- package/docs/types/_saltcorn_markup.types.StyleVal.html +1 -1
- package/docs/types/_saltcorn_markup.types.TagFunction.html +1 -1
- package/docs/types/_saltcorn_mobile-builder.mobile-builder.IosCfg.html +2 -2
- package/docs/types/_saltcorn_mobile-builder.utils_capacitor-helper.CapacitorCfg.html +2 -2
- package/docs/types/_saltcorn_types.base_types.Action.html +3 -3
- package/docs/types/_saltcorn_types.base_types.AuthenticationMethod.html +2 -2
- package/docs/types/_saltcorn_types.base_types.CalcJoinfield.html +2 -2
- package/docs/types/_saltcorn_types.base_types.CapacitorPlugin.html +2 -2
- package/docs/types/_saltcorn_types.base_types.CodePagePack.html +2 -2
- package/docs/types/_saltcorn_types.base_types.Column.html +2 -2
- package/docs/types/_saltcorn_types.base_types.ConnectObjType.html +2 -2
- package/docs/types/_saltcorn_types.base_types.ConnectedObjects.html +2 -2
- package/docs/types/_saltcorn_types.base_types.CopilotSkill.html +2 -2
- package/docs/types/_saltcorn_types.base_types.ErrorObj.html +2 -2
- package/docs/types/_saltcorn_types.base_types.FieldLike.html +1 -1
- package/docs/types/_saltcorn_types.base_types.FieldView.html +1 -1
- package/docs/types/_saltcorn_types.base_types.Header.html +2 -2
- package/docs/types/_saltcorn_types.base_types.JoinFieldOption.html +2 -2
- package/docs/types/_saltcorn_types.base_types.Layout.html +1 -1
- package/docs/types/_saltcorn_types.base_types.MenuItem.html +2 -2
- package/docs/types/_saltcorn_types.base_types.MobileConfig.html +2 -2
- package/docs/types/_saltcorn_types.base_types.ModelPattern.html +6 -6
- package/docs/types/_saltcorn_types.base_types.Pack.html +2 -2
- package/docs/types/_saltcorn_types.base_types.Plugin.html +1 -1
- package/docs/types/_saltcorn_types.base_types.PluginFunction.html +2 -2
- package/docs/types/_saltcorn_types.base_types.PluginLayout.html +2 -2
- package/docs/types/_saltcorn_types.base_types.PluginRoute.html +2 -2
- package/docs/types/_saltcorn_types.base_types.PluginSourceType.html +1 -1
- package/docs/types/_saltcorn_types.base_types.PluginType.html +2 -2
- package/docs/types/_saltcorn_types.base_types.PluginWrap.html +1 -1
- package/docs/types/_saltcorn_types.base_types.PluginWrapArg.html +2 -2
- package/docs/types/_saltcorn_types.base_types.RelationOption.html +2 -2
- package/docs/types/_saltcorn_types.base_types.Req.html +2 -2
- package/docs/types/_saltcorn_types.base_types.Res.html +2 -2
- package/docs/types/_saltcorn_types.base_types.ResultType.html +2 -2
- package/docs/types/_saltcorn_types.base_types.RouteAction.html +1 -1
- package/docs/types/_saltcorn_types.base_types.RunExtra.html +1 -1
- package/docs/types/_saltcorn_types.base_types.SlugStepType.html +2 -2
- package/docs/types/_saltcorn_types.base_types.StepResType.html +1 -1
- package/docs/types/_saltcorn_types.base_types.SubField.html +2 -2
- package/docs/types/_saltcorn_types.base_types.TableProvider.html +2 -2
- package/docs/types/_saltcorn_types.base_types.TableQuery.html +2 -2
- package/docs/types/_saltcorn_types.base_types.Tablely.html +1 -1
- package/docs/types/_saltcorn_types.base_types.ViewTemplate.html +2 -2
- package/docs/types/_saltcorn_types.common_types.ErrorMessage.html +2 -2
- package/docs/types/_saltcorn_types.common_types.GenObj.html +1 -1
- package/docs/types/_saltcorn_types.common_types.ReqRes.html +2 -2
- package/docs/types/_saltcorn_types.common_types.ResultMessage.html +1 -1
- package/docs/types/_saltcorn_types.common_types.SuccessMessage.html +2 -2
- package/docs/types/_saltcorn_types.common_types.Type.html +2 -2
- package/docs/types/_saltcorn_types.model-abstracts_abstract_event_log.EventLogPack.html +2 -2
- package/docs/types/_saltcorn_types.model-abstracts_abstract_field.FieldCfg.html +2 -2
- package/docs/types/_saltcorn_types.model-abstracts_abstract_field.InputType.html +1 -1
- package/docs/types/_saltcorn_types.model-abstracts_abstract_form.AdditionalButton.html +2 -2
- package/docs/types/_saltcorn_types.model-abstracts_abstract_library.LibraryCfg.html +2 -2
- package/docs/types/_saltcorn_types.model-abstracts_abstract_library.LibraryPack.html +1 -1
- package/docs/types/_saltcorn_types.model-abstracts_abstract_model.ModelCfg.html +2 -2
- package/docs/types/_saltcorn_types.model-abstracts_abstract_model.ModelPack.html +1 -1
- package/docs/types/_saltcorn_types.model-abstracts_abstract_model_instance.ModelInstanceCfg.html +2 -2
- package/docs/types/_saltcorn_types.model-abstracts_abstract_model_instance.ModelInstancePack.html +1 -1
- package/docs/types/_saltcorn_types.model-abstracts_abstract_page.PageCfg.html +3 -2
- package/docs/types/_saltcorn_types.model-abstracts_abstract_page.PagePack.html +1 -1
- package/docs/types/_saltcorn_types.model-abstracts_abstract_page_group.PageGroupCfg.html +2 -2
- package/docs/types/_saltcorn_types.model-abstracts_abstract_page_group.PageGroupPack.html +1 -1
- package/docs/types/_saltcorn_types.model-abstracts_abstract_page_group_member.PageGroupMemberCfg.html +2 -2
- package/docs/types/_saltcorn_types.model-abstracts_abstract_page_group_member.PageGroupMemberPack.html +1 -1
- package/docs/types/_saltcorn_types.model-abstracts_abstract_plugin.PluginCfg.html +2 -2
- package/docs/types/_saltcorn_types.model-abstracts_abstract_plugin.PluginPack.html +1 -1
- package/docs/types/_saltcorn_types.model-abstracts_abstract_role.RoleCfg.html +1 -1
- package/docs/types/_saltcorn_types.model-abstracts_abstract_role.RolePack.html +1 -1
- package/docs/types/_saltcorn_types.model-abstracts_abstract_table.TableCfg.html +3 -2
- package/docs/types/_saltcorn_types.model-abstracts_abstract_table.TablePack.html +1 -1
- package/docs/types/_saltcorn_types.model-abstracts_abstract_tag.TagPack.html +2 -2
- package/docs/types/_saltcorn_types.model-abstracts_abstract_tag_entry.TagEntryPack.html +2 -2
- package/docs/types/_saltcorn_types.model-abstracts_abstract_trigger.TriggerCfg.html +3 -2
- package/docs/types/_saltcorn_types.model-abstracts_abstract_trigger.TriggerPack.html +1 -1
- package/docs/types/_saltcorn_types.model-abstracts_abstract_view.ViewCfg.html +3 -2
- package/docs/types/_saltcorn_types.model-abstracts_abstract_view.ViewPack.html +1 -1
- package/docs/types/_saltcorn_types.model-abstracts_abstract_workflow.ConfigWorkflowStep.html +1 -1
- package/docs/types/_saltcorn_types.model-abstracts_abstract_workflow.RunResult.html +2 -2
- package/docs/types/_saltcorn_types.model-abstracts_abstract_workflow_run.WorkflowRunCfg.html +2 -2
- package/docs/types/_saltcorn_types.model-abstracts_abstract_workflow_step.WorkflowStepCfg.html +2 -2
- package/docs/types/_saltcorn_types.model-abstracts_abstract_workflow_step.WorkflowStepPack.html +1 -1
- package/docs/types/_saltcorn_types.model-abstracts_abstract_workflow_trace.WorkflowTraceCfg.html +2 -2
- package/docs/variables/_saltcorn_admin-models..backup.create_backup.html +1 -1
- package/docs/variables/_saltcorn_admin-models..backup.create_csv_from_rows.html +1 -1
- package/docs/variables/_saltcorn_admin-models..backup.restore.html +1 -1
- package/docs/variables/_saltcorn_admin-models..pack.add_to_menu.html +1 -1
- package/docs/variables/_saltcorn_admin-models..pack.can_install_pack.html +1 -1
- package/docs/variables/_saltcorn_admin-models..pack.fetch_available_packs.html +1 -1
- package/docs/variables/_saltcorn_admin-models..pack.fetch_pack_by_name.html +1 -1
- package/docs/variables/_saltcorn_admin-models..pack.install_pack.html +1 -1
- package/docs/variables/_saltcorn_admin-models..pack.library_pack.html +1 -1
- package/docs/variables/_saltcorn_admin-models..pack.model_instance_pack.html +1 -1
- package/docs/variables/_saltcorn_admin-models..pack.model_pack.html +1 -1
- package/docs/variables/_saltcorn_admin-models..pack.page_group_pack.html +1 -1
- package/docs/variables/_saltcorn_admin-models..pack.page_pack.html +1 -1
- package/docs/variables/_saltcorn_admin-models..pack.plugin_pack.html +1 -1
- package/docs/variables/_saltcorn_admin-models..pack.role_pack.html +1 -1
- package/docs/variables/_saltcorn_admin-models..pack.table_pack.html +1 -1
- package/docs/variables/_saltcorn_admin-models..pack.trigger_pack.html +1 -1
- package/docs/variables/_saltcorn_admin-models..pack.uninstall_pack.html +1 -1
- package/docs/variables/_saltcorn_admin-models..pack.view_pack.html +1 -1
- package/docs/variables/_saltcorn_admin-models..tenant.copy_tenant_template.html +1 -1
- package/docs/variables/_saltcorn_admin-models..tenant.create_tenant.html +1 -1
- package/docs/variables/_saltcorn_admin-models..tenant.deleteTenant.html +1 -1
- package/docs/variables/_saltcorn_admin-models..tenant.domain_sanitize.html +1 -1
- package/docs/variables/_saltcorn_admin-models..tenant.eachTenant.html +1 -1
- package/docs/variables/_saltcorn_admin-models..tenant.getAllTenantRows.html +1 -1
- package/docs/variables/_saltcorn_admin-models..tenant.getAllTenants.html +1 -1
- package/docs/variables/_saltcorn_admin-models..tenant.insertTenant.html +1 -1
- package/docs/variables/_saltcorn_admin-models..tenant.switchToTenant.html +1 -1
- package/docs/variables/_saltcorn_admin-models.models_backup.backup.html +1 -1
- package/docs/variables/_saltcorn_admin-models.pack.pack.html +1 -1
- package/docs/variables/_saltcorn_admin-models.tenant.tenant.html +1 -1
- package/docs/variables/_saltcorn_common-code.tests_expected_relations.expectedFive.html +1 -1
- package/docs/variables/_saltcorn_common-code.tests_expected_relations.expectedFour.html +1 -1
- package/docs/variables/_saltcorn_common-code.tests_expected_relations.expectedOne.html +1 -1
- package/docs/variables/_saltcorn_common-code.tests_expected_relations.expectedSix.html +1 -1
- package/docs/variables/_saltcorn_common-code.tests_expected_relations.expectedThree.html +1 -1
- package/docs/variables/_saltcorn_common-code.tests_expected_relations.expectedTwo.html +1 -1
- package/docs/variables/_saltcorn_data..migrations.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_data.base-plugin_actions.actions.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.fieldviews.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_fileview.fileviews.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_index.index.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.types.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_viewtemplates_edit.edit.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_viewtemplates_feed.feed.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_viewtemplates_filter.filter.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_viewtemplates_list.list.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_viewtemplates_listshowlist.listshowlist.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_viewtemplates_room.room-1.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_viewtemplates_room.room.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_viewtemplates_show.show.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.edit_build_in_actions.html +1 -1
- package/docs/variables/_saltcorn_data.contract.contract.html +1 -1
- package/docs/variables/_saltcorn_data.db_connect.connect.html +1 -1
- package/docs/variables/_saltcorn_data.db_fa5-icons.fa5Icons.html +1 -1
- package/docs/variables/_saltcorn_data.db_fixtures.fixtures.html +1 -1
- package/docs/variables/_saltcorn_data.db_index.dbExports.html +1 -1
- package/docs/variables/_saltcorn_data.db_state.state.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202005141503.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202005241712.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202005251037.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202005282134.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202006022156.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202006051507.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202006240906.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202007091707.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202007202144.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202008031500.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202008051415.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202008121149.sql_pg.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202008121149.sql_sqlite.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202009112140.sql_pg.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202009112140.sql_sqlite.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202009181655.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202009221105.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202009231331.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202009301531.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202010231444.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202010251412.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202011021749.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202011051353.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202011111127.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202012011203.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202012100841.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202012281835.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202101061051.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202101141128.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202102091312.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202102101624.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202102172148.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202102261650.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202106102347.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202106112120.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202106120012.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202106120220.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202106121701.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202106121703.sql_pg.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202106121703.sql_sqlite.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202106251126.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202107281619.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202107302158.sql_pg.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202107302158.sql_sqlite.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202108022257.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202109201624.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202109301031.sql_pg.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202109301031.sql_sqlite.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202111290253.sql_pg.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202111290253.sql_sqlite.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202112282254.sql_pg.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202112282254.sql_sqlite.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202207022002.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202207252150.sql_pg.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202207252150.sql_sqlite.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202207261221.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202208101144.sql_pg.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202208101144.sql_sqlite.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202211040031.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202212112152.sql_pg.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202212112152.sql_sqlite.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202301130917.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202303201126.sql_pg.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202303201126.sql_sqlite.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202303221944.sql_pg.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202303221944.sql_sqlite.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202304281224.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202305031518.sql_pg.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202305031518.sql_sqlite.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202308211648.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202311011755.sql_pg.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202311011755.sql_sqlite.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202311231356.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202402071125.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202406260915.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202412051957.sql_pg.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202412051957.sql_sqlite.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202412111526.sql_pg.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202412111526.sql_sqlite.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202501081226.sql_pg.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202501081226.sql_sqlite.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202501201239.sql_sqlite.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202501262157.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202503071353.sql_pg.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202506050958.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202510110312.sql_pg.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202510110312.sql_sqlite.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202511081024.sql.html +1 -1
- package/docs/variables/_saltcorn_data.migrations_202604091531.sql.html +1 -0
- package/docs/variables/_saltcorn_data.mobile-mocks_npm_npm-registry-fetch.npmRegistryFetch.html +1 -0
- package/docs/variables/_saltcorn_data.mobile-mocks_saltcorn_html-pdf-node.htmlPdfNode.html +1 -1
- package/docs/variables/_saltcorn_data.models_config.configExports.html +1 -1
- package/docs/variables/_saltcorn_data.models_discovery.discovery.html +1 -1
- package/docs/variables/_saltcorn_data.models_email.email.html +1 -1
- package/docs/variables/_saltcorn_data.models_expression.expression.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.config.available_languages.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.config.check_email_mask.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.config.configTypes.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.config.deleteConfig.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.config.getAllConfig.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.config.getConfig.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.config.get_base_url.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.config.get_latest_npm_version.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.config.remove_from_menu.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.config.save_menu_items.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.config.setConfig.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.discovery.discover_tables.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.discovery.discoverable_tables.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.discovery.findType.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.discovery.get_existing_views.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.discovery.implement_discovery.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.email.getMailTransport.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.email.send_verification_email.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.email.viewToEmailHtml.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.expression.apply_calculated_fields.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.expression.apply_calculated_fields_stored.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.expression.eval_expression.html +9 -1
- package/docs/variables/_saltcorn_data.models_index.expression.expressionValidator.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.expression.get_async_expression_function.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.expression.get_expression_function.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.expression.jsexprToWhere.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.expression.recalculate_for_stored.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.expression.transform_for_async.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.layout.eachView.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.layout.getStringsForI18n.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.layout.getViews.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.layout.translateLayout.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.layout.traverse.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.layout.traverseSync.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.random.all_views.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.random.fill_table_row.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.random.initial_view.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.random.random_table.html +1 -1
- package/docs/variables/_saltcorn_data.models_index.scheduler.runScheduler.html +1 -1
- package/docs/variables/_saltcorn_data.models_layout.layout.html +1 -1
- package/docs/variables/_saltcorn_data.models_random.random.html +1 -1
- package/docs/variables/_saltcorn_data.models_scheduler.scheduler.html +1 -1
- package/docs/variables/_saltcorn_data.plugin-helper.add_free_variables_to_joinfields.html +1 -1
- package/docs/variables/_saltcorn_data.tests_mocks.mocks.html +1 -1
- package/docs/variables/_saltcorn_data.tests_remote_query_helper.renderEditInEditConfig.html +1 -1
- package/docs/variables/_saltcorn_data.utils.utils.html +1 -1
- package/docs/variables/_saltcorn_data.web-mobile-commons.webMobileCommons.html +1 -1
- package/docs/variables/_saltcorn_db-common.internal.dbCommonModulePath.html +1 -1
- package/docs/variables/_saltcorn_db-common.multi-tenant.tenantNamespace.html +1 -1
- package/docs/variables/_saltcorn_db-common.tenants.tenants.html +1 -1
- package/docs/variables/_saltcorn_markup..export_.html +1 -1
- package/docs/variables/_saltcorn_markup.builder.builder.html +1 -1
- package/docs/variables/_saltcorn_markup.emergency_layout.EmergencyLayoutExports.html +1 -1
- package/docs/variables/_saltcorn_markup.form.form.html +1 -1
- package/docs/variables/_saltcorn_markup.helpers.HelpersExports.html +1 -1
- package/docs/variables/_saltcorn_markup.layout.LayoutExports-1.html +1 -1
- package/docs/variables/_saltcorn_markup.layout.LayoutExports.html +1 -1
- package/docs/variables/_saltcorn_markup.layout_utils.layoutUtils.html +1 -1
- package/docs/variables/_saltcorn_markup.mjml-layout.LayoutExports.html +1 -1
- package/docs/variables/_saltcorn_markup.mjml-tags.tagsExports.html +1 -1
- package/docs/variables/_saltcorn_markup.table.TableExports.html +1 -1
- package/docs/variables/_saltcorn_markup.tags.tagsExports.html +1 -1
- package/docs/variables/_saltcorn_types..generators.generateBool.html +1 -1
- package/docs/variables/_saltcorn_types..generators.generateString.html +1 -1
- package/docs/variables/_saltcorn_types..generators.num_between.html +1 -1
- package/docs/variables/_saltcorn_types..generators.oneOf.html +1 -1
- package/docs/variables/_saltcorn_types.generators.generators.html +1 -1
- package/load_plugins.js +7 -398
- package/locales/en.json +5 -1
- package/package.json +12 -12
- package/public/saltcorn-common.js +1 -0
- package/public/saltcorn.js +1433 -0
- package/routes/actions.js +190 -4
- package/routes/admin.js +3 -5
- package/routes/api.js +59 -26
- package/routes/delete.js +2 -5
- package/routes/edit.js +2 -5
- package/routes/entities.js +65 -1245
- package/routes/eventlog.js +47 -0
- package/routes/fields.js +3 -0
- package/routes/files.js +23 -3
- package/routes/packs.js +2 -3
- package/routes/plugins.js +14 -16
- package/routes/scapi.js +1 -2
- package/routes/sync.js +161 -45
- package/routes/tables.js +4 -0
- package/routes/tenant.js +3 -3
- package/routes/utils.js +36 -2
- package/routes/viewedit.js +2 -2
- package/serve.js +9 -14
- package/tests/api.test.js +268 -2
- package/tests/auth.test.js +230 -1
- package/tests/files.test.js +4 -7
- package/tests/plugin_install.test.js +12 -13
- package/tests/plugins.test.js +1 -2
- package/tests/sync.test.js +868 -2
- package/docs/functions/_saltcorn_data.base-plugin_fieldviews.radio_select.run.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_fieldviews.search_or_create.configFields.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_fieldviews.search_or_create.run.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_fieldviews.select.run.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_fieldviews.select_from_table.fill_options.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_fieldviews.select_from_table.run.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.bool.contract.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.bool.fieldviews.TrueFalse.run.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.bool.fieldviews.checkboxes.run.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.bool.fieldviews.edit.run.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.bool.fieldviews.show.run.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.bool.fieldviews.tristate.run.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.bool.listAs.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.bool.read.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.bool.readFromDB.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.bool.readFromFormRecord.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.bool.validate.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.color.contract.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.color.fieldviews.edit.run.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.color.fieldviews.show.run.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.color.read.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.color.validate.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.date.contract.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.date.equals.html +0 -3
- package/docs/functions/_saltcorn_data.base-plugin_types.date.fieldviews.edit.run.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.date.fieldviews.editDay.run.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.date.fieldviews.format.run.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.date.fieldviews.relative.run.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.date.fieldviews.show.run.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.date.fieldviews.showDay.run.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.date.fieldviews.yearsAgo.run.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.date.presets.Now.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.date.read.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.date.validate.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.float.contract.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.float.equals.html +0 -3
- package/docs/functions/_saltcorn_data.base-plugin_types.float.fieldviews.edit.run.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.float.fieldviews.show.run.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.float.read.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.float.validate.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.int.contract.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.int.read.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.int.validate.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.int.validate_attributes.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.attributes.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.contract.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.fieldviews.as_header.run.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.fieldviews.as_link.run.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.fieldviews.as_text.run.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.fieldviews.edit.configFields.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.fieldviews.edit.run.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.fieldviews.img_from_url.run.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.fieldviews.password.run.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.fieldviews.radio_group.run.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.fieldviews.textarea.run.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.presets.IP.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.presets.SessionID.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.read.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.validate.html +0 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.validate_attributes.html +0 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.decodeProvisioningProfile.html +0 -1
- package/docs/functions/_saltcorn_mobile-builder.utils_package-bundle-utils.copyMobileAppDirs.html +0 -1
- package/docs/modules/_saltcorn_admin-models.tests_backup.test.html +0 -1
- package/docs/modules/_saltcorn_admin-models.tests_cfgcheck.test.html +0 -1
- package/docs/modules/_saltcorn_admin-models.tests_pack.test.html +0 -1
- package/docs/modules/_saltcorn_admin-models.tests_random.test.html +0 -1
- package/docs/modules/_saltcorn_admin-models.tests_tenant.test.html +0 -1
- package/docs/modules/_saltcorn_data.base-plugin_fieldviews.radio_select.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_fieldviews.search_or_create.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_fieldviews.select.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_fieldviews.select_from_table.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.bool.fieldviews.TrueFalse.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.bool.fieldviews.checkboxes.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.bool.fieldviews.edit.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.bool.fieldviews.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.bool.fieldviews.show.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.bool.fieldviews.tristate.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.bool.html +0 -3
- package/docs/modules/_saltcorn_data.base-plugin_types.color.fieldviews.edit.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.color.fieldviews.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.color.fieldviews.show.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.color.html +0 -4
- package/docs/modules/_saltcorn_data.base-plugin_types.date.fieldviews.edit.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.date.fieldviews.editDay.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.date.fieldviews.format.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.date.fieldviews.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.date.fieldviews.relative.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.date.fieldviews.show.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.date.fieldviews.showDay.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.date.fieldviews.yearsAgo.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.date.html +0 -3
- package/docs/modules/_saltcorn_data.base-plugin_types.date.presets.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.float.fieldviews.edit.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.float.fieldviews.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.float.fieldviews.show.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.float.html +0 -3
- package/docs/modules/_saltcorn_data.base-plugin_types.int.distance_operators.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.int.html +0 -3
- package/docs/modules/_saltcorn_data.base-plugin_types.string.fieldviews.as_header.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.string.fieldviews.as_link.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.string.fieldviews.as_text.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.string.fieldviews.edit.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.string.fieldviews.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.string.fieldviews.img_from_url.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.string.fieldviews.password.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.string.fieldviews.radio_group.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.string.fieldviews.textarea.html +0 -2
- package/docs/modules/_saltcorn_data.base-plugin_types.string.html +0 -3
- package/docs/modules/_saltcorn_data.base-plugin_types.string.presets.html +0 -2
- package/docs/modules/_saltcorn_data.tests_actions.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_auth.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_auxtest.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_base.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_calc.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_composite_pk.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_config.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_db.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_discover.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_edit.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_email.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_exact_views.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_field.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_fieldviews.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_file.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_filter.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_form.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_list.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_models.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_page.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_page_group.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_plugin.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_show.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_state.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_table.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_table_history.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_tag.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_user.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_view.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_workflow.test.html +0 -1
- package/docs/modules/_saltcorn_data.tests_workflow_run.test.html +0 -1
- package/docs/modules/_saltcorn_mobile-builder.appium_tests_ui.test.html +0 -1
- package/docs/modules/_saltcorn_mobile-builder.tests_versioncode.test.html +0 -1
- package/docs/modules/_saltcorn_mobile-builder.tests_webpack.test.html +0 -1
- package/docs/types/_saltcorn_data.models_internal_push_message_helper.FcmSubscription.html +0 -4
- package/docs/types/_saltcorn_data.models_internal_push_message_helper.Subscription.html +0 -1
- package/docs/types/_saltcorn_db-common.internal.AggregationOptions.html +0 -11
- package/docs/types/_saltcorn_db-common.internal.CoordOpts.html +0 -5
- package/docs/types/_saltcorn_db-common.internal.DatabaseClient.html +0 -2
- package/docs/types/_saltcorn_db-common.internal.JoinField.html +0 -6
- package/docs/types/_saltcorn_db-common.internal.JoinFields.html +0 -1
- package/docs/types/_saltcorn_db-common.internal.JoinOptions.html +0 -1
- package/docs/types/_saltcorn_db-common.internal.JsonPath.html +0 -1
- package/docs/types/_saltcorn_db-common.internal.JsonPathElem.html +0 -1
- package/docs/types/_saltcorn_db-common.internal.Operator.html +0 -1
- package/docs/types/_saltcorn_db-common.internal.PartialSome.html +0 -1
- package/docs/types/_saltcorn_db-common.internal.PrimaryKeyValue.html +0 -1
- package/docs/types/_saltcorn_db-common.internal.Row.html +0 -1
- package/docs/types/_saltcorn_db-common.internal.SelectOptions.html +0 -21
- package/docs/types/_saltcorn_db-common.internal.StrongRow.html +0 -1
- package/docs/types/_saltcorn_db-common.internal.SubselectOptions.html +0 -5
- package/docs/types/_saltcorn_db-common.internal.Value.html +0 -1
- package/docs/types/_saltcorn_db-common.internal.Where.html +0 -5
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.radio_select.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.radio_select.isEdit.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.radio_select.type.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.search_join_field.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.search_or_create.blockDisplay.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.search_or_create.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.search_or_create.isEdit.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.search_or_create.type.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.select.blockDisplay.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.select.configFields.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.select.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.select.isEdit.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.select.type.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.select_by_code.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.select_by_view.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.select_from_table.blockDisplay.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.select_from_table.configFields.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.select_from_table.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.select_from_table.isEdit.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.select_from_table.type.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.two_level_select.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_fileview.fileview.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.attributes.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.TrueFalse.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.TrueFalse.isEdit.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.checkboxes.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.checkboxes.isEdit.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.edit.configFields.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.edit.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.edit.isEdit.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.show.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.show.isEdit.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.show_with_html.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.switch.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.thumbs_up_down.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.tristate.configFields.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.tristate.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.tristate.isEdit.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.js_type.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.name.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.sql_name.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.color.attributes.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.color.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.color.fieldviews.edit.blockDisplay.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.color.fieldviews.edit.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.color.fieldviews.edit.isEdit.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.color.fieldviews.show.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.color.fieldviews.show.isEdit.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.color.fieldviews.show_with_html.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.color.js_type.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.color.name.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.color.sql_name.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.attributes.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.edit.blockDisplay.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.edit.configFields.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.edit.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.edit.isEdit.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.editDay.blockDisplay.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.editDay.configFields.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.editDay.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.editDay.isEdit.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.format.configFields.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.format.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.format.isEdit.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.relative.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.relative.isEdit.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.show.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.show.isEdit.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.showDay.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.showDay.isEdit.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.show_with_html.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.yearsAgo.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.yearsAgo.isEdit.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.js_type.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.name.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.sql_name.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.attributes.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.distance_operators.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.fieldviews.above_input.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.fieldviews.below_input.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.fieldviews.edit.blockDisplay.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.fieldviews.edit.configFields.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.fieldviews.edit.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.fieldviews.edit.isEdit.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.fieldviews.heat_cell.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.fieldviews.number_slider.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.fieldviews.progress_bar.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.fieldviews.range_interval.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.fieldviews.show.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.fieldviews.show.isEdit.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.fieldviews.show_with_html.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.fieldviews.to_locale_string.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.js_type.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.name.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.sql_name.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.int.attributes.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.int.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.int.distance_operators.near.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.int.fieldviews.html +0 -3
- package/docs/variables/_saltcorn_data.base-plugin_types.int.js_type.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.int.name.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.int.primaryKey.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.int.sql_name.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.as_header.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.as_header.isEdit.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.as_link.configFields.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.as_link.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.as_link.isEdit.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.as_text.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.as_text.isEdit.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.checkbox_group.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.code.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.code_editor.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.edit.blockDisplay.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.edit.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.edit.isEdit.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.ellipsize.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.fill_formula_btn.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.img_from_url.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.img_from_url.isEdit.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.make_unique.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.monospace_block.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.password.blockDisplay.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.password.configFields.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.password.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.password.isEdit.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.preFormatted.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.radio_group.configFields.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.radio_group.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.radio_group.isEdit.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.select_by_code.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.show_with_html.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.textarea.blockDisplay.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.textarea.configFields.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.textarea.description.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.textarea.isEdit.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.js_type.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.name.html +0 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.sql_name.html +0 -1
- package/docs/variables/_saltcorn_data.contract.fieldlike.html +0 -1
- package/docs/variables/_saltcorn_data.contract.is_column.html +0 -1
- package/docs/variables/_saltcorn_data.contract.is_header.html +0 -1
- package/docs/variables/_saltcorn_data.contract.is_pack.html +0 -1
- package/docs/variables/_saltcorn_data.contract.is_plugin.html +0 -1
- package/docs/variables/_saltcorn_data.contract.is_plugin_layout.html +0 -1
- package/docs/variables/_saltcorn_data.contract.is_plugin_type.html +0 -1
- package/docs/variables/_saltcorn_data.contract.is_plugin_wrap.html +0 -1
- package/docs/variables/_saltcorn_data.contract.is_plugin_wrap_arg.html +0 -1
- package/docs/variables/_saltcorn_data.contract.is_table_query.html +0 -1
- package/docs/variables/_saltcorn_data.contract.is_tablely.html +0 -1
- package/docs/variables/_saltcorn_data.contract.is_viewtemplate.html +0 -1
package/public/saltcorn.js
CHANGED
|
@@ -1687,3 +1687,1436 @@ function ensure_css_loaded(src) {
|
|
|
1687
1687
|
return i(a, b, g, h, c, !0);
|
|
1688
1688
|
};
|
|
1689
1689
|
})(this);
|
|
1690
|
+
|
|
1691
|
+
// Entities list page
|
|
1692
|
+
function entitiesListInit(config) {
|
|
1693
|
+
const {
|
|
1694
|
+
LEGACY_LINK_META,
|
|
1695
|
+
TAGS_BY_ID,
|
|
1696
|
+
ROLES_BY_ID,
|
|
1697
|
+
TXT_SELECTED,
|
|
1698
|
+
TXT_DELETE_SELECTED_CONFIRM,
|
|
1699
|
+
TXT_DELETE_SELECTED_FALLBACK,
|
|
1700
|
+
TXT_DELETE_FAILED,
|
|
1701
|
+
} = config;
|
|
1702
|
+
|
|
1703
|
+
// DOM refs
|
|
1704
|
+
const searchInput = document.getElementById("entity-search");
|
|
1705
|
+
const deepSearchToggle = document.getElementById("entity-deep-search");
|
|
1706
|
+
const entitiesList = document.getElementById("entities-list");
|
|
1707
|
+
const noResults = document.getElementById("no-results");
|
|
1708
|
+
const filterButtons = document.querySelectorAll(".entity-filter-btn");
|
|
1709
|
+
const filterButtonsByType = {};
|
|
1710
|
+
filterButtons.forEach((btn) => {
|
|
1711
|
+
const type = btn.dataset.entityType;
|
|
1712
|
+
if (type) filterButtonsByType[type] = btn;
|
|
1713
|
+
});
|
|
1714
|
+
const tagButtons = document.querySelectorAll(".tag-filter-btn");
|
|
1715
|
+
const filtersRow = document.getElementById("entity-filters-row");
|
|
1716
|
+
const selectionBar = document.getElementById("entity-selection-bar");
|
|
1717
|
+
const selectionCountEl = document.getElementById("entity-selection-count");
|
|
1718
|
+
const clearSelectionBtn = document.getElementById("entity-clear-selection");
|
|
1719
|
+
const bulkDeleteBtn = document.getElementById("entity-bulk-delete");
|
|
1720
|
+
const bulkTagSelect = document.getElementById("entity-bulk-tag-select");
|
|
1721
|
+
const bulkApplyTagBtn = document.getElementById("entity-bulk-apply-tag");
|
|
1722
|
+
const bulkDownloadPackBtn = document.getElementById(
|
|
1723
|
+
"entity-bulk-download-pack"
|
|
1724
|
+
);
|
|
1725
|
+
const bulkRoleReadSelect = document.getElementById(
|
|
1726
|
+
"entity-bulk-role-read-select"
|
|
1727
|
+
);
|
|
1728
|
+
const bulkApplyRoleReadBtn = document.getElementById(
|
|
1729
|
+
"entity-bulk-apply-role-read"
|
|
1730
|
+
);
|
|
1731
|
+
const bulkRoleWriteSelect = document.getElementById(
|
|
1732
|
+
"entity-bulk-role-write-select"
|
|
1733
|
+
);
|
|
1734
|
+
const bulkApplyRoleWriteBtn = document.getElementById(
|
|
1735
|
+
"entity-bulk-apply-role-write"
|
|
1736
|
+
);
|
|
1737
|
+
const bulkRoleReadGroup = document.getElementById(
|
|
1738
|
+
"entity-bulk-role-read-group"
|
|
1739
|
+
);
|
|
1740
|
+
const bulkRoleWriteGroup = document.getElementById(
|
|
1741
|
+
"entity-bulk-role-write-group"
|
|
1742
|
+
);
|
|
1743
|
+
const entitiesTbody = document.getElementById("entities-main-body");
|
|
1744
|
+
const recentTbody = document.getElementById("entities-recent-body");
|
|
1745
|
+
|
|
1746
|
+
// Type constants
|
|
1747
|
+
const BASE_TYPES = ["table", "view", "page", "trigger"];
|
|
1748
|
+
const EXTENDED_TYPES = ["module", "user"];
|
|
1749
|
+
const ALL_TYPES = BASE_TYPES.concat(EXTENDED_TYPES);
|
|
1750
|
+
window.ENTITY_EXTENDED_TYPES = EXTENDED_TYPES;
|
|
1751
|
+
|
|
1752
|
+
// Selection state
|
|
1753
|
+
const selectedKeys = new Set();
|
|
1754
|
+
let lastSelectedIndex = null;
|
|
1755
|
+
|
|
1756
|
+
// Filter state
|
|
1757
|
+
const activeFilters = new Set([]);
|
|
1758
|
+
const activeTags = new Set([]);
|
|
1759
|
+
|
|
1760
|
+
// Extended entity state
|
|
1761
|
+
let isExtendedExpanded = false;
|
|
1762
|
+
let hasLoadedAllModules = false;
|
|
1763
|
+
let isLoadingAllModules = false;
|
|
1764
|
+
|
|
1765
|
+
// --- Row helpers ---
|
|
1766
|
+
|
|
1767
|
+
const isRowSelectable = (row) => {
|
|
1768
|
+
if (!row) return false;
|
|
1769
|
+
const type = row.dataset.entityType;
|
|
1770
|
+
if (type === "module" && row.dataset.installed === "false") return false;
|
|
1771
|
+
return true;
|
|
1772
|
+
};
|
|
1773
|
+
|
|
1774
|
+
const findRowByKey = (key) =>
|
|
1775
|
+
Array.from(document.querySelectorAll(".entity-row")).find(
|
|
1776
|
+
(row) => row.dataset.entityKey === key
|
|
1777
|
+
);
|
|
1778
|
+
|
|
1779
|
+
const selectionPayloadFromRow = (row) => {
|
|
1780
|
+
if (!row) return null;
|
|
1781
|
+
return {
|
|
1782
|
+
key: row.dataset.entityKey,
|
|
1783
|
+
type: row.dataset.entityType,
|
|
1784
|
+
id: row.dataset.entityId || null,
|
|
1785
|
+
name: row.dataset.entityLabel || row.dataset.entityName || "",
|
|
1786
|
+
installed: row.dataset.installed,
|
|
1787
|
+
moduleKind: row.dataset.moduleKind,
|
|
1788
|
+
};
|
|
1789
|
+
};
|
|
1790
|
+
|
|
1791
|
+
const getVisibleRows = () =>
|
|
1792
|
+
Array.from(document.querySelectorAll(".entity-row")).filter(
|
|
1793
|
+
(row) => row.style.display !== "none"
|
|
1794
|
+
);
|
|
1795
|
+
|
|
1796
|
+
const getSelectableVisibleRows = () =>
|
|
1797
|
+
getVisibleRows().filter((row) => isRowSelectable(row));
|
|
1798
|
+
|
|
1799
|
+
const isTypingTarget = (el) => {
|
|
1800
|
+
if (!el) return false;
|
|
1801
|
+
if (el.isContentEditable) return true;
|
|
1802
|
+
const tag = el.tagName;
|
|
1803
|
+
if (!tag) return false;
|
|
1804
|
+
const tagName = tag.toUpperCase();
|
|
1805
|
+
if (tagName === "INPUT" || tagName === "TEXTAREA" || tagName === "SELECT")
|
|
1806
|
+
return true;
|
|
1807
|
+
return !!el.closest('[contenteditable="true"]');
|
|
1808
|
+
};
|
|
1809
|
+
|
|
1810
|
+
const refreshSelectionStyles = () => {
|
|
1811
|
+
document.querySelectorAll(".entity-row").forEach((row) => {
|
|
1812
|
+
const key = row.dataset.entityKey;
|
|
1813
|
+
if (!isRowSelectable(row) && selectedKeys.has(key))
|
|
1814
|
+
selectedKeys.delete(key);
|
|
1815
|
+
if (selectedKeys.has(key)) {
|
|
1816
|
+
row.classList.add("table-active", "entity-row-selected");
|
|
1817
|
+
} else {
|
|
1818
|
+
row.classList.remove("table-active", "entity-row-selected");
|
|
1819
|
+
}
|
|
1820
|
+
});
|
|
1821
|
+
};
|
|
1822
|
+
|
|
1823
|
+
const syncSelectBorder = (el, varName) => {
|
|
1824
|
+
if (!el) return;
|
|
1825
|
+
const disabledBorder =
|
|
1826
|
+
"color-mix(in srgb, var(--bs-btn-disabled-color, var(--bs-secondary)) 70%, transparent)";
|
|
1827
|
+
const enabledBorder = "var(--bs-secondary)";
|
|
1828
|
+
el.style.setProperty(varName, el.disabled ? disabledBorder : enabledBorder);
|
|
1829
|
+
};
|
|
1830
|
+
|
|
1831
|
+
const markSelectChangedByUser = (sel) => {
|
|
1832
|
+
if (sel) sel.dataset.userSelected = "true";
|
|
1833
|
+
};
|
|
1834
|
+
const resetSelectUserFlag = (sel) => {
|
|
1835
|
+
if (sel) sel.dataset.userSelected = "";
|
|
1836
|
+
};
|
|
1837
|
+
|
|
1838
|
+
const isTaggableType = (type) =>
|
|
1839
|
+
["table", "view", "page", "trigger"].includes(type);
|
|
1840
|
+
const isDownloadableEntity = (item) =>
|
|
1841
|
+
!!item && ["table", "view", "page", "trigger"].includes(item.type);
|
|
1842
|
+
|
|
1843
|
+
const isModulesFilterExclusive = () =>
|
|
1844
|
+
activeFilters.size === 1 && activeFilters.has("module");
|
|
1845
|
+
window.isModulesFilterExclusive = isModulesFilterExclusive;
|
|
1846
|
+
|
|
1847
|
+
const collectSelectionItems = () =>
|
|
1848
|
+
Array.from(selectedKeys)
|
|
1849
|
+
.map((key) => selectionPayloadFromRow(findRowByKey(key)))
|
|
1850
|
+
.filter(Boolean);
|
|
1851
|
+
|
|
1852
|
+
const getRoleName = (rid) => {
|
|
1853
|
+
if (typeof rid === "undefined") return "";
|
|
1854
|
+
const key = String(rid);
|
|
1855
|
+
if (!ROLES_BY_ID) return "";
|
|
1856
|
+
return Object.prototype.hasOwnProperty.call(ROLES_BY_ID, key)
|
|
1857
|
+
? ROLES_BY_ID[key]
|
|
1858
|
+
: "?";
|
|
1859
|
+
};
|
|
1860
|
+
|
|
1861
|
+
const toNumberOrUndefined = (val) => {
|
|
1862
|
+
if (val === "" || typeof val === "undefined" || val === null)
|
|
1863
|
+
return undefined;
|
|
1864
|
+
const num = Number(val);
|
|
1865
|
+
return Number.isNaN(num) ? undefined : num;
|
|
1866
|
+
};
|
|
1867
|
+
|
|
1868
|
+
const updateRowAccess = (row, payload) => {
|
|
1869
|
+
if (!row) return;
|
|
1870
|
+
if (typeof payload.min_role_read !== "undefined")
|
|
1871
|
+
row.dataset.minRoleRead = String(payload.min_role_read ?? "");
|
|
1872
|
+
if (typeof payload.min_role_write !== "undefined")
|
|
1873
|
+
row.dataset.minRoleWrite = String(payload.min_role_write ?? "");
|
|
1874
|
+
if (typeof payload.min_role !== "undefined")
|
|
1875
|
+
row.dataset.minRole = String(payload.min_role ?? "");
|
|
1876
|
+
const cell = row.querySelector("td:nth-child(5)");
|
|
1877
|
+
if (cell) {
|
|
1878
|
+
const label = (() => {
|
|
1879
|
+
if (payload.type === "table") {
|
|
1880
|
+
const ext = row.dataset.external === "true";
|
|
1881
|
+
const rr = toNumberOrUndefined(payload.min_role_read);
|
|
1882
|
+
const rw = toNumberOrUndefined(payload.min_role_write);
|
|
1883
|
+
if (ext) return getRoleName(rr) + " (read only)";
|
|
1884
|
+
if (typeof rr !== "undefined" && typeof rw !== "undefined")
|
|
1885
|
+
return getRoleName(rr) + "/" + getRoleName(rw);
|
|
1886
|
+
return "";
|
|
1887
|
+
}
|
|
1888
|
+
const mr = toNumberOrUndefined(payload.min_role);
|
|
1889
|
+
return typeof mr !== "undefined" ? getRoleName(mr) : "";
|
|
1890
|
+
})();
|
|
1891
|
+
cell.textContent = label;
|
|
1892
|
+
}
|
|
1893
|
+
};
|
|
1894
|
+
|
|
1895
|
+
const updateSelectionUI = () => {
|
|
1896
|
+
refreshSelectionStyles();
|
|
1897
|
+
const count = selectedKeys.size ?? 0;
|
|
1898
|
+
if (selectionCountEl) {
|
|
1899
|
+
selectionCountEl.textContent = count + " " + (TXT_SELECTED || "selected");
|
|
1900
|
+
}
|
|
1901
|
+
if (filtersRow && selectionBar) {
|
|
1902
|
+
if (count > 0) {
|
|
1903
|
+
filtersRow.classList.add("d-none");
|
|
1904
|
+
selectionBar.classList.remove("d-none");
|
|
1905
|
+
} else {
|
|
1906
|
+
filtersRow.classList.remove("d-none");
|
|
1907
|
+
selectionBar.classList.add("d-none");
|
|
1908
|
+
}
|
|
1909
|
+
}
|
|
1910
|
+
if (bulkDeleteBtn) bulkDeleteBtn.disabled = count === 0;
|
|
1911
|
+
if (clearSelectionBtn) clearSelectionBtn.disabled = count === 0;
|
|
1912
|
+
const items = collectSelectionItems();
|
|
1913
|
+
const hasTaggable = items.some((item) => isTaggableType(item.type));
|
|
1914
|
+
const hasAccessRoleEntities = items.some((item) =>
|
|
1915
|
+
["table", "view", "page"].includes(item.type)
|
|
1916
|
+
);
|
|
1917
|
+
const hasWriteRoleEntities = items.some((item) => item.type === "table");
|
|
1918
|
+
if (items.length === 1) {
|
|
1919
|
+
const only = items[0];
|
|
1920
|
+
const row = findRowByKey(only.key);
|
|
1921
|
+
if (
|
|
1922
|
+
row &&
|
|
1923
|
+
bulkRoleReadSelect &&
|
|
1924
|
+
bulkRoleReadSelect.dataset.userSelected !== "true"
|
|
1925
|
+
) {
|
|
1926
|
+
const initRead =
|
|
1927
|
+
only.type === "table"
|
|
1928
|
+
? row.dataset.minRoleRead || ""
|
|
1929
|
+
: row.dataset.minRole || "";
|
|
1930
|
+
bulkRoleReadSelect.value = initRead || "";
|
|
1931
|
+
}
|
|
1932
|
+
if (
|
|
1933
|
+
row &&
|
|
1934
|
+
bulkRoleWriteSelect &&
|
|
1935
|
+
only.type === "table" &&
|
|
1936
|
+
bulkRoleWriteSelect.dataset.userSelected !== "true"
|
|
1937
|
+
) {
|
|
1938
|
+
bulkRoleWriteSelect.value = row.dataset.minRoleWrite || "";
|
|
1939
|
+
}
|
|
1940
|
+
} else if (items.length === 0) {
|
|
1941
|
+
if (bulkRoleReadSelect) {
|
|
1942
|
+
bulkRoleReadSelect.value = "";
|
|
1943
|
+
resetSelectUserFlag(bulkRoleReadSelect);
|
|
1944
|
+
}
|
|
1945
|
+
if (bulkRoleWriteSelect) {
|
|
1946
|
+
bulkRoleWriteSelect.value = "";
|
|
1947
|
+
resetSelectUserFlag(bulkRoleWriteSelect);
|
|
1948
|
+
}
|
|
1949
|
+
}
|
|
1950
|
+
if (bulkTagSelect) {
|
|
1951
|
+
bulkTagSelect.disabled = !(count > 0 && hasTaggable);
|
|
1952
|
+
syncSelectBorder(bulkTagSelect, "--entity-bulk-tag-border");
|
|
1953
|
+
}
|
|
1954
|
+
if (bulkApplyTagBtn) {
|
|
1955
|
+
bulkApplyTagBtn.disabled = !(
|
|
1956
|
+
count > 0 &&
|
|
1957
|
+
hasTaggable &&
|
|
1958
|
+
bulkTagSelect &&
|
|
1959
|
+
bulkTagSelect.value
|
|
1960
|
+
);
|
|
1961
|
+
}
|
|
1962
|
+
if (bulkRoleReadSelect) {
|
|
1963
|
+
bulkRoleReadSelect.disabled = !(count > 0 && hasAccessRoleEntities);
|
|
1964
|
+
syncSelectBorder(bulkRoleReadSelect, "--entity-bulk-role-border");
|
|
1965
|
+
}
|
|
1966
|
+
if (bulkApplyRoleReadBtn) {
|
|
1967
|
+
bulkApplyRoleReadBtn.disabled = !(
|
|
1968
|
+
count > 0 &&
|
|
1969
|
+
hasAccessRoleEntities &&
|
|
1970
|
+
bulkRoleReadSelect &&
|
|
1971
|
+
bulkRoleReadSelect.value
|
|
1972
|
+
);
|
|
1973
|
+
}
|
|
1974
|
+
if (bulkRoleWriteSelect) {
|
|
1975
|
+
bulkRoleWriteSelect.disabled = !(count > 0 && hasWriteRoleEntities);
|
|
1976
|
+
syncSelectBorder(bulkRoleWriteSelect, "--entity-bulk-role-border");
|
|
1977
|
+
}
|
|
1978
|
+
if (bulkApplyRoleWriteBtn) {
|
|
1979
|
+
bulkApplyRoleWriteBtn.disabled = !(
|
|
1980
|
+
count > 0 &&
|
|
1981
|
+
hasWriteRoleEntities &&
|
|
1982
|
+
bulkRoleWriteSelect &&
|
|
1983
|
+
bulkRoleWriteSelect.value
|
|
1984
|
+
);
|
|
1985
|
+
}
|
|
1986
|
+
if (bulkRoleWriteGroup) {
|
|
1987
|
+
if (hasWriteRoleEntities) bulkRoleWriteGroup.classList.remove("d-none");
|
|
1988
|
+
else bulkRoleWriteGroup.classList.add("d-none");
|
|
1989
|
+
}
|
|
1990
|
+
if (bulkDownloadPackBtn) bulkDownloadPackBtn.disabled = !(count > 0);
|
|
1991
|
+
};
|
|
1992
|
+
|
|
1993
|
+
const clearSelection = () => {
|
|
1994
|
+
selectedKeys.clear();
|
|
1995
|
+
lastSelectedIndex = null;
|
|
1996
|
+
updateSelectionUI();
|
|
1997
|
+
};
|
|
1998
|
+
|
|
1999
|
+
const updateRowTags = (row, tagId, tagName, entityType) => {
|
|
2000
|
+
if (!row || !tagId) return;
|
|
2001
|
+
const tagsCell = row.querySelector("td:nth-child(6)");
|
|
2002
|
+
if (!tagsCell) return;
|
|
2003
|
+
const dropdown = tagsCell.querySelector(".dropdown");
|
|
2004
|
+
const currentTags = (row.dataset.tags || "").split(" ").filter(Boolean);
|
|
2005
|
+
if (!currentTags.includes(String(tagId))) currentTags.push(String(tagId));
|
|
2006
|
+
row.dataset.tags = currentTags.join(" ");
|
|
2007
|
+
tagsCell.innerHTML = "";
|
|
2008
|
+
const pluralMap = {
|
|
2009
|
+
table: "tables",
|
|
2010
|
+
view: "views",
|
|
2011
|
+
page: "pages",
|
|
2012
|
+
trigger: "triggers",
|
|
2013
|
+
};
|
|
2014
|
+
currentTags.forEach((tid) => {
|
|
2015
|
+
const name = TAGS_BY_ID[tid] || tagName || tid;
|
|
2016
|
+
const plural = pluralMap[entityType] || "tables";
|
|
2017
|
+
const badge = document.createElement("a");
|
|
2018
|
+
badge.className = "badge bg-secondary me-1";
|
|
2019
|
+
badge.setAttribute(
|
|
2020
|
+
"href",
|
|
2021
|
+
"/tag/" + encodeURIComponent(tid) + "?show_list=" + plural
|
|
2022
|
+
);
|
|
2023
|
+
badge.textContent = name;
|
|
2024
|
+
tagsCell.appendChild(badge);
|
|
2025
|
+
});
|
|
2026
|
+
if (dropdown) tagsCell.appendChild(dropdown);
|
|
2027
|
+
};
|
|
2028
|
+
|
|
2029
|
+
// --- URL / on-done helpers ---
|
|
2030
|
+
|
|
2031
|
+
const getCurrentOnDoneTarget = () => {
|
|
2032
|
+
const path = window.location.pathname.startsWith("/")
|
|
2033
|
+
? window.location.pathname.slice(1)
|
|
2034
|
+
: window.location.pathname;
|
|
2035
|
+
return path + window.location.search;
|
|
2036
|
+
};
|
|
2037
|
+
|
|
2038
|
+
const shouldSkipOnDoneHref = (raw) => {
|
|
2039
|
+
if (!raw) return true;
|
|
2040
|
+
const trimmed = raw.trim();
|
|
2041
|
+
return (
|
|
2042
|
+
trimmed === "#" ||
|
|
2043
|
+
trimmed === "" ||
|
|
2044
|
+
trimmed.toLowerCase().startsWith("javascript:")
|
|
2045
|
+
);
|
|
2046
|
+
};
|
|
2047
|
+
|
|
2048
|
+
const toRelativeHrefWithOnDone = (raw) => {
|
|
2049
|
+
if (shouldSkipOnDoneHref(raw)) return null;
|
|
2050
|
+
try {
|
|
2051
|
+
const url = new URL(raw, window.location.origin);
|
|
2052
|
+
url.searchParams.set("on_done_redirect", getCurrentOnDoneTarget());
|
|
2053
|
+
return url.pathname + url.search + url.hash;
|
|
2054
|
+
} catch (e) {
|
|
2055
|
+
return null;
|
|
2056
|
+
}
|
|
2057
|
+
};
|
|
2058
|
+
|
|
2059
|
+
const updateElementOnDoneHref = (el, attr) => {
|
|
2060
|
+
const raw = el.getAttribute(attr) || el[attr];
|
|
2061
|
+
const updated = toRelativeHrefWithOnDone(raw);
|
|
2062
|
+
if (updated) el.setAttribute(attr, updated);
|
|
2063
|
+
};
|
|
2064
|
+
|
|
2065
|
+
const ensureOnDoneHiddenInput = (form) => {
|
|
2066
|
+
if (form.querySelector('input[name="on_done_redirect"]')) return;
|
|
2067
|
+
const hidden = document.createElement("input");
|
|
2068
|
+
hidden.type = "hidden";
|
|
2069
|
+
hidden.name = "on_done_redirect";
|
|
2070
|
+
hidden.value = getCurrentOnDoneTarget();
|
|
2071
|
+
form.appendChild(hidden);
|
|
2072
|
+
};
|
|
2073
|
+
|
|
2074
|
+
const updateOnDoneRedirectTargets = () => {
|
|
2075
|
+
document
|
|
2076
|
+
.querySelectorAll('a[href*="on_done_redirect="]')
|
|
2077
|
+
.forEach((link) => updateElementOnDoneHref(link, "href"));
|
|
2078
|
+
document
|
|
2079
|
+
.querySelectorAll('form[action*="on_done_redirect="]')
|
|
2080
|
+
.forEach((form) => updateElementOnDoneHref(form, "action"));
|
|
2081
|
+
};
|
|
2082
|
+
|
|
2083
|
+
const updateLegacyButton = () => {
|
|
2084
|
+
const legacyButton = document.getElementById("legacy-entity-link");
|
|
2085
|
+
const legacyLabel = legacyButton
|
|
2086
|
+
? legacyButton.querySelector(".legacy-label")
|
|
2087
|
+
: null;
|
|
2088
|
+
if (!legacyButton) return;
|
|
2089
|
+
const activeTypes = Array.from(activeFilters);
|
|
2090
|
+
if (activeTypes.length === 1) {
|
|
2091
|
+
const meta = LEGACY_LINK_META[activeTypes[0]];
|
|
2092
|
+
if (meta) {
|
|
2093
|
+
legacyButton.classList.remove("d-none");
|
|
2094
|
+
legacyButton.setAttribute("href", meta.href);
|
|
2095
|
+
if (legacyLabel) legacyLabel.textContent = meta.label;
|
|
2096
|
+
return;
|
|
2097
|
+
}
|
|
2098
|
+
}
|
|
2099
|
+
legacyButton.classList.add("d-none");
|
|
2100
|
+
};
|
|
2101
|
+
|
|
2102
|
+
const updateUrl = () => {
|
|
2103
|
+
const params = new URLSearchParams(window.location.search);
|
|
2104
|
+
if (searchInput.value) params.set("q", searchInput.value);
|
|
2105
|
+
else params.delete("q");
|
|
2106
|
+
if (deepSearchToggle && deepSearchToggle.checked) params.set("deep", "on");
|
|
2107
|
+
else params.delete("deep");
|
|
2108
|
+
ALL_TYPES.forEach((t) => {
|
|
2109
|
+
if (activeFilters.has(t)) params.set(t + "s", "on");
|
|
2110
|
+
else params.delete(t + "s");
|
|
2111
|
+
});
|
|
2112
|
+
if (isExtendedExpanded) params.set("extended", "on");
|
|
2113
|
+
else params.delete("extended");
|
|
2114
|
+
if (activeTags.size > 0)
|
|
2115
|
+
params.set("tags", Array.from(activeTags).join(","));
|
|
2116
|
+
else params.delete("tags");
|
|
2117
|
+
const newUrl =
|
|
2118
|
+
window.location.pathname +
|
|
2119
|
+
(params.toString() ? "?" + params.toString() : "");
|
|
2120
|
+
window.history.replaceState(null, "", newUrl);
|
|
2121
|
+
};
|
|
2122
|
+
|
|
2123
|
+
// --- Extended entity functions ---
|
|
2124
|
+
|
|
2125
|
+
const clearExtendedTypeFilters = () => {
|
|
2126
|
+
EXTENDED_TYPES.forEach((type) => {
|
|
2127
|
+
if (activeFilters.has(type)) {
|
|
2128
|
+
activeFilters.delete(type);
|
|
2129
|
+
const btn = document.querySelector(
|
|
2130
|
+
'.entity-filter-btn[data-entity-type="' + type + '"]'
|
|
2131
|
+
);
|
|
2132
|
+
if (btn) {
|
|
2133
|
+
btn.classList.remove("btn-primary");
|
|
2134
|
+
btn.classList.add("btn-outline-primary");
|
|
2135
|
+
}
|
|
2136
|
+
}
|
|
2137
|
+
});
|
|
2138
|
+
};
|
|
2139
|
+
|
|
2140
|
+
const loadExtendedEntities = async (includeAllModules = false) => {
|
|
2141
|
+
try {
|
|
2142
|
+
const query = includeAllModules ? "?include_all_modules=1" : "";
|
|
2143
|
+
const res = await fetch("/entities/extended" + query);
|
|
2144
|
+
const data = await res.json();
|
|
2145
|
+
return data.entities || [];
|
|
2146
|
+
} catch (e) {
|
|
2147
|
+
console.error("Failed to load extended entities:", e);
|
|
2148
|
+
return [];
|
|
2149
|
+
}
|
|
2150
|
+
};
|
|
2151
|
+
|
|
2152
|
+
const renderExtendedEntityRows = (extendedEntities, tbody) => {
|
|
2153
|
+
document
|
|
2154
|
+
.querySelectorAll("[data-is-extended]")
|
|
2155
|
+
.forEach((row) => row.remove());
|
|
2156
|
+
extendedEntities.forEach((entity) =>
|
|
2157
|
+
tbody.appendChild(createExtendedEntityRow(entity))
|
|
2158
|
+
);
|
|
2159
|
+
updateSelectionUI();
|
|
2160
|
+
};
|
|
2161
|
+
|
|
2162
|
+
const ensureAllModulesLoaded = async () => {
|
|
2163
|
+
if (hasLoadedAllModules || isLoadingAllModules || !isExtendedExpanded)
|
|
2164
|
+
return;
|
|
2165
|
+
isLoadingAllModules = true;
|
|
2166
|
+
let updated = false;
|
|
2167
|
+
try {
|
|
2168
|
+
const extendedEntities = await loadExtendedEntities(true);
|
|
2169
|
+
window.extendedEntities = extendedEntities;
|
|
2170
|
+
const tbody = entitiesTbody;
|
|
2171
|
+
renderExtendedEntityRows(extendedEntities, tbody);
|
|
2172
|
+
hasLoadedAllModules = true;
|
|
2173
|
+
updated = true;
|
|
2174
|
+
} catch (e) {
|
|
2175
|
+
console.error("Failed to load all modules:", e);
|
|
2176
|
+
} finally {
|
|
2177
|
+
isLoadingAllModules = false;
|
|
2178
|
+
if (updated) filterEntities();
|
|
2179
|
+
}
|
|
2180
|
+
};
|
|
2181
|
+
|
|
2182
|
+
window.toggleEntityExpanded = async (expand) => {
|
|
2183
|
+
const moreBtn = document.getElementById("entity-more-btn");
|
|
2184
|
+
const lessBtn = document.getElementById("entity-less-btn");
|
|
2185
|
+
const extendedButtons = document.querySelectorAll(".entity-extended-btn");
|
|
2186
|
+
const tbody = entitiesTbody;
|
|
2187
|
+
|
|
2188
|
+
if (expand) {
|
|
2189
|
+
if (isExtendedExpanded) return;
|
|
2190
|
+
extendedButtons.forEach((btn) => btn.classList.remove("d-none"));
|
|
2191
|
+
moreBtn.classList.add("d-none");
|
|
2192
|
+
lessBtn.classList.remove("d-none");
|
|
2193
|
+
isExtendedExpanded = true;
|
|
2194
|
+
const shouldLoadAll = isModulesFilterExclusive();
|
|
2195
|
+
const extendedEntities = await loadExtendedEntities(shouldLoadAll);
|
|
2196
|
+
window.extendedEntities = extendedEntities;
|
|
2197
|
+
renderExtendedEntityRows(extendedEntities, tbody);
|
|
2198
|
+
hasLoadedAllModules = shouldLoadAll;
|
|
2199
|
+
filterEntities();
|
|
2200
|
+
} else {
|
|
2201
|
+
if (!isExtendedExpanded) return;
|
|
2202
|
+
extendedButtons.forEach((btn) => btn.classList.add("d-none"));
|
|
2203
|
+
moreBtn.classList.remove("d-none");
|
|
2204
|
+
lessBtn.classList.add("d-none");
|
|
2205
|
+
isExtendedExpanded = false;
|
|
2206
|
+
hasLoadedAllModules = false;
|
|
2207
|
+
isLoadingAllModules = false;
|
|
2208
|
+
window.extendedEntities = [];
|
|
2209
|
+
renderExtendedEntityRows([], tbody);
|
|
2210
|
+
clearExtendedTypeFilters();
|
|
2211
|
+
filterEntities();
|
|
2212
|
+
}
|
|
2213
|
+
};
|
|
2214
|
+
|
|
2215
|
+
const createExtendedEntityRow = (entity) => {
|
|
2216
|
+
const tr = document.createElement("tr");
|
|
2217
|
+
tr.className = "entity-row";
|
|
2218
|
+
tr.dataset.entityType = entity.type;
|
|
2219
|
+
tr.dataset.entityName = entity.name.toLowerCase();
|
|
2220
|
+
tr.dataset.entityId = entity.id ? entity.id : "";
|
|
2221
|
+
tr.dataset.entityLabel = entity.name;
|
|
2222
|
+
const key =
|
|
2223
|
+
entity.type + ":" + (entity.type === "module" ? entity.name : entity.id);
|
|
2224
|
+
tr.dataset.entityKey = key;
|
|
2225
|
+
let searchable = (
|
|
2226
|
+
(entity.name || "").toLowerCase() +
|
|
2227
|
+
" " +
|
|
2228
|
+
entity.type
|
|
2229
|
+
).trim();
|
|
2230
|
+
if (entity.metadata) {
|
|
2231
|
+
Object.keys(entity.metadata).forEach((k) => {
|
|
2232
|
+
const val = entity.metadata[k];
|
|
2233
|
+
const skipDescription = entity.type === "module" && k === "description";
|
|
2234
|
+
const skipUsername = entity.type === "user" && k === "username";
|
|
2235
|
+
if (
|
|
2236
|
+
!skipDescription &&
|
|
2237
|
+
!skipUsername &&
|
|
2238
|
+
val &&
|
|
2239
|
+
typeof val === "string"
|
|
2240
|
+
) {
|
|
2241
|
+
searchable += " " + val.toLowerCase();
|
|
2242
|
+
}
|
|
2243
|
+
});
|
|
2244
|
+
}
|
|
2245
|
+
tr.dataset.tags = "";
|
|
2246
|
+
tr.dataset.isExtended = "true";
|
|
2247
|
+
tr.dataset.installed =
|
|
2248
|
+
entity.metadata && entity.metadata.installed === false ? "false" : "true";
|
|
2249
|
+
tr.dataset.moduleKind =
|
|
2250
|
+
entity.metadata && entity.metadata.type ? entity.metadata.type : "";
|
|
2251
|
+
|
|
2252
|
+
if (!isRowSelectable(tr)) {
|
|
2253
|
+
tr.classList.add("entity-row-selection-disabled");
|
|
2254
|
+
tr.setAttribute("aria-disabled", "true");
|
|
2255
|
+
}
|
|
2256
|
+
|
|
2257
|
+
// Type badge
|
|
2258
|
+
const badges = {
|
|
2259
|
+
module: { class: "secondary", icon: "cube", label: "Module" },
|
|
2260
|
+
user: { class: "dark", icon: "user", label: "User" },
|
|
2261
|
+
};
|
|
2262
|
+
const badge = badges[entity.type];
|
|
2263
|
+
const typeBadge = document.createElement("td");
|
|
2264
|
+
typeBadge.innerHTML =
|
|
2265
|
+
'<span class="badge bg-' +
|
|
2266
|
+
badge.class +
|
|
2267
|
+
' me-2"><i class="fas fa-' +
|
|
2268
|
+
badge.icon +
|
|
2269
|
+
' me-1"></i>' +
|
|
2270
|
+
badge.label +
|
|
2271
|
+
"</span>";
|
|
2272
|
+
tr.appendChild(typeBadge);
|
|
2273
|
+
|
|
2274
|
+
const hasConfig = entity.metadata && entity.metadata.hasConfig;
|
|
2275
|
+
const isInstalled = entity.metadata && entity.metadata.installed;
|
|
2276
|
+
|
|
2277
|
+
// Name
|
|
2278
|
+
const nameTd = document.createElement("td");
|
|
2279
|
+
const isStaticModule = entity.type === "module" && !hasConfig;
|
|
2280
|
+
const nameLink = document.createElement(isStaticModule ? "span" : "a");
|
|
2281
|
+
if (!isStaticModule) {
|
|
2282
|
+
const baseHref = entity.editLink || "#";
|
|
2283
|
+
const updatedHref = toRelativeHrefWithOnDone(baseHref);
|
|
2284
|
+
nameLink.setAttribute("href", updatedHref || baseHref);
|
|
2285
|
+
}
|
|
2286
|
+
nameLink.className = "fw-bold";
|
|
2287
|
+
nameLink.textContent = entity.name;
|
|
2288
|
+
nameTd.appendChild(nameLink);
|
|
2289
|
+
tr.appendChild(nameTd);
|
|
2290
|
+
|
|
2291
|
+
// Run / info cell
|
|
2292
|
+
const runTd = document.createElement("td");
|
|
2293
|
+
if (
|
|
2294
|
+
entity.type === "module" &&
|
|
2295
|
+
entity.metadata &&
|
|
2296
|
+
entity.metadata.type !== "pack" &&
|
|
2297
|
+
entity.viewLink &&
|
|
2298
|
+
isInstalled
|
|
2299
|
+
) {
|
|
2300
|
+
const infoLink = document.createElement("a");
|
|
2301
|
+
infoLink.className = "link-primary text-decoration-none";
|
|
2302
|
+
infoLink.innerHTML = window.TXT_INFO || "Info";
|
|
2303
|
+
const updatedInfoHref = toRelativeHrefWithOnDone(entity.viewLink);
|
|
2304
|
+
infoLink.setAttribute("href", updatedInfoHref || entity.viewLink);
|
|
2305
|
+
runTd.appendChild(infoLink);
|
|
2306
|
+
}
|
|
2307
|
+
tr.appendChild(runTd);
|
|
2308
|
+
|
|
2309
|
+
// Details cell
|
|
2310
|
+
const detailsTd = document.createElement("td");
|
|
2311
|
+
let detailsHtml = "";
|
|
2312
|
+
if (entity.type === "user") {
|
|
2313
|
+
const disabled = entity.metadata && entity.metadata.disabled;
|
|
2314
|
+
const roleId = entity.metadata && entity.metadata.role_id;
|
|
2315
|
+
if (Array.isArray(window.ENTITY_ROLES)) {
|
|
2316
|
+
const role = window.ENTITY_ROLES.find(
|
|
2317
|
+
(r) => String(r.id) === String(roleId)
|
|
2318
|
+
);
|
|
2319
|
+
if (role && role.role) {
|
|
2320
|
+
detailsHtml +=
|
|
2321
|
+
'<span class="text-muted small me-2">' + role.role + "</span>";
|
|
2322
|
+
}
|
|
2323
|
+
}
|
|
2324
|
+
if (disabled) {
|
|
2325
|
+
detailsHtml +=
|
|
2326
|
+
'<span class="badge bg-danger me-1">' +
|
|
2327
|
+
(window.TXT_DISABLED || "Disabled") +
|
|
2328
|
+
"</span>";
|
|
2329
|
+
searchable += " disabled";
|
|
2330
|
+
}
|
|
2331
|
+
} else if (entity.type === "module") {
|
|
2332
|
+
const version = entity.metadata && entity.metadata.version;
|
|
2333
|
+
const hasTheme = entity.metadata && entity.metadata.has_theme;
|
|
2334
|
+
const hasAuth = entity.metadata && entity.metadata.has_auth;
|
|
2335
|
+
const isReadyForMobile =
|
|
2336
|
+
entity.metadata && entity.metadata.ready_for_mobile;
|
|
2337
|
+
const isLocal = entity.metadata && entity.metadata.local;
|
|
2338
|
+
const isPack = entity.metadata && entity.metadata.type === "pack";
|
|
2339
|
+
if (version)
|
|
2340
|
+
detailsHtml +=
|
|
2341
|
+
'<span class="text-muted small me-2">v' + version + "</span>";
|
|
2342
|
+
if (isPack)
|
|
2343
|
+
detailsHtml +=
|
|
2344
|
+
'<span class="badge bg-secondary me-1">' +
|
|
2345
|
+
(window.TXT_PACK || "Pack") +
|
|
2346
|
+
"</span>";
|
|
2347
|
+
if (hasTheme) {
|
|
2348
|
+
detailsHtml +=
|
|
2349
|
+
'<span class="badge bg-secondary me-1">' +
|
|
2350
|
+
(window.TXT_THEME || "Theme") +
|
|
2351
|
+
"</span>";
|
|
2352
|
+
searchable += " theme";
|
|
2353
|
+
}
|
|
2354
|
+
if (isLocal) {
|
|
2355
|
+
detailsHtml +=
|
|
2356
|
+
'<span class="badge bg-secondary me-1">' +
|
|
2357
|
+
(window.TXT_LOCAL || "Local") +
|
|
2358
|
+
"</span>";
|
|
2359
|
+
searchable += " local";
|
|
2360
|
+
}
|
|
2361
|
+
if (isInstalled) {
|
|
2362
|
+
detailsHtml +=
|
|
2363
|
+
'<span class="badge bg-secondary me-1">' +
|
|
2364
|
+
(window.TXT_INSTALLED || "Installed") +
|
|
2365
|
+
"</span>";
|
|
2366
|
+
searchable += " installed";
|
|
2367
|
+
}
|
|
2368
|
+
if (hasAuth) {
|
|
2369
|
+
detailsHtml +=
|
|
2370
|
+
'<span class="badge bg-secondary me-1">' +
|
|
2371
|
+
(window.TXT_AUTH || "Authentication") +
|
|
2372
|
+
"</span>";
|
|
2373
|
+
searchable += " authentication auth";
|
|
2374
|
+
}
|
|
2375
|
+
if (isReadyForMobile) {
|
|
2376
|
+
detailsHtml +=
|
|
2377
|
+
'<span class="badge bg-secondary me-1">' +
|
|
2378
|
+
(window.TXT_MOBILE || "Mobile") +
|
|
2379
|
+
"</span>";
|
|
2380
|
+
searchable += " mobile";
|
|
2381
|
+
}
|
|
2382
|
+
}
|
|
2383
|
+
if (detailsHtml) detailsTd.innerHTML = detailsHtml;
|
|
2384
|
+
tr.appendChild(detailsTd);
|
|
2385
|
+
|
|
2386
|
+
tr.appendChild(document.createElement("td")); // access
|
|
2387
|
+
tr.appendChild(document.createElement("td")); // tags
|
|
2388
|
+
|
|
2389
|
+
// Actions cell
|
|
2390
|
+
const actionsTd = document.createElement("td");
|
|
2391
|
+
if (entity.actionsHtml) {
|
|
2392
|
+
actionsTd.innerHTML = entity.actionsHtml;
|
|
2393
|
+
actionsTd.querySelectorAll("a").forEach((link) => {
|
|
2394
|
+
const updated = toRelativeHrefWithOnDone(link.getAttribute("href"));
|
|
2395
|
+
if (updated) link.setAttribute("href", updated);
|
|
2396
|
+
});
|
|
2397
|
+
actionsTd.querySelectorAll("form").forEach((form) => {
|
|
2398
|
+
const updated = toRelativeHrefWithOnDone(form.getAttribute("action"));
|
|
2399
|
+
if (updated) form.setAttribute("action", updated);
|
|
2400
|
+
if (entity.type === "user") ensureOnDoneHiddenInput(form);
|
|
2401
|
+
});
|
|
2402
|
+
const dropdownToggle = actionsTd.querySelector(
|
|
2403
|
+
'[data-bs-toggle="dropdown"]'
|
|
2404
|
+
);
|
|
2405
|
+
if (dropdownToggle && window.bootstrap && window.bootstrap.Dropdown) {
|
|
2406
|
+
window.bootstrap.Dropdown.getOrCreateInstance(dropdownToggle);
|
|
2407
|
+
}
|
|
2408
|
+
}
|
|
2409
|
+
tr.appendChild(actionsTd);
|
|
2410
|
+
|
|
2411
|
+
tr.dataset.searchable = searchable.trim();
|
|
2412
|
+
let deepSearchable = (entity.deepSearchable || searchable).trim();
|
|
2413
|
+
if (entity.type === "module") {
|
|
2414
|
+
const description =
|
|
2415
|
+
entity.metadata && typeof entity.metadata.description === "string"
|
|
2416
|
+
? entity.metadata.description.toLowerCase()
|
|
2417
|
+
: "";
|
|
2418
|
+
if (description && !deepSearchable.includes(description)) {
|
|
2419
|
+
deepSearchable = (deepSearchable + " " + description).trim();
|
|
2420
|
+
}
|
|
2421
|
+
} else if (
|
|
2422
|
+
entity.type === "user" &&
|
|
2423
|
+
entity.metadata &&
|
|
2424
|
+
typeof entity.metadata.username === "string"
|
|
2425
|
+
) {
|
|
2426
|
+
const usernameLower = entity.metadata.username.toLowerCase();
|
|
2427
|
+
if (!deepSearchable.includes(usernameLower)) {
|
|
2428
|
+
deepSearchable = (deepSearchable + " " + usernameLower).trim();
|
|
2429
|
+
}
|
|
2430
|
+
}
|
|
2431
|
+
tr.dataset.deepSearchable = deepSearchable;
|
|
2432
|
+
if (window.ENTITY_DEEP_SEARCH) {
|
|
2433
|
+
window.ENTITY_DEEP_SEARCH[key] = deepSearchable;
|
|
2434
|
+
}
|
|
2435
|
+
return tr;
|
|
2436
|
+
};
|
|
2437
|
+
|
|
2438
|
+
// Recently edited
|
|
2439
|
+
|
|
2440
|
+
const relativeTime = (isoStr) => {
|
|
2441
|
+
if (!isoStr) return "";
|
|
2442
|
+
const diff = Date.now() - new Date(isoStr).getTime();
|
|
2443
|
+
const m = Math.floor(diff / 60000);
|
|
2444
|
+
if (m < 1) return "just now";
|
|
2445
|
+
if (m < 60) return m + "m ago";
|
|
2446
|
+
const h = Math.floor(m / 60);
|
|
2447
|
+
if (h < 24) return h + "h ago";
|
|
2448
|
+
const d = Math.floor(h / 24);
|
|
2449
|
+
if (d < 30) return d + "d ago";
|
|
2450
|
+
const mo = Math.floor(d / 30);
|
|
2451
|
+
return mo + "mo ago";
|
|
2452
|
+
};
|
|
2453
|
+
|
|
2454
|
+
const RECENT_COUNT = 5;
|
|
2455
|
+
|
|
2456
|
+
const updateRecentlyEdited = () => {
|
|
2457
|
+
if (!recentTbody) return;
|
|
2458
|
+
|
|
2459
|
+
// Only show when there is no active search
|
|
2460
|
+
const hasSearch = searchInput && searchInput.value.trim().length > 0;
|
|
2461
|
+
|
|
2462
|
+
// Collect visible main rows that have an updated_at timestamp
|
|
2463
|
+
const candidates = Array.from(
|
|
2464
|
+
entitiesTbody ? entitiesTbody.querySelectorAll(".entity-row") : []
|
|
2465
|
+
).filter((r) => r.style.display !== "none" && r.dataset.updatedAt);
|
|
2466
|
+
|
|
2467
|
+
if (hasSearch || candidates.length === 0) {
|
|
2468
|
+
Array.from(
|
|
2469
|
+
recentTbody.querySelectorAll(
|
|
2470
|
+
".entity-row-clone, .entity-section-header-row"
|
|
2471
|
+
)
|
|
2472
|
+
).forEach((r) => r.remove());
|
|
2473
|
+
recentTbody.classList.add("d-none");
|
|
2474
|
+
return;
|
|
2475
|
+
}
|
|
2476
|
+
|
|
2477
|
+
// Sort by updated_at descending, take top N
|
|
2478
|
+
candidates.sort(
|
|
2479
|
+
(a, b) => new Date(b.dataset.updatedAt) - new Date(a.dataset.updatedAt)
|
|
2480
|
+
);
|
|
2481
|
+
const recent = candidates.slice(0, RECENT_COUNT);
|
|
2482
|
+
|
|
2483
|
+
// Clear previous clones (keep the section header rows)
|
|
2484
|
+
Array.from(recentTbody.querySelectorAll(".entity-row-clone")).forEach((r) =>
|
|
2485
|
+
r.remove()
|
|
2486
|
+
);
|
|
2487
|
+
Array.from(
|
|
2488
|
+
recentTbody.querySelectorAll(".entity-section-header-row")
|
|
2489
|
+
).forEach((r) => r.remove());
|
|
2490
|
+
|
|
2491
|
+
// Build section header row for recent
|
|
2492
|
+
const recentHeaderTr = document.createElement("tr");
|
|
2493
|
+
recentHeaderTr.className = "entity-section-header-row";
|
|
2494
|
+
const recentHeaderTd = document.createElement("td");
|
|
2495
|
+
recentHeaderTd.colSpan = 7;
|
|
2496
|
+
recentHeaderTd.textContent = "Recently edited";
|
|
2497
|
+
recentHeaderTr.appendChild(recentHeaderTd);
|
|
2498
|
+
recentTbody.appendChild(recentHeaderTr);
|
|
2499
|
+
|
|
2500
|
+
// Insert clones
|
|
2501
|
+
recent.forEach((originalRow) => {
|
|
2502
|
+
const clone = originalRow.cloneNode(true);
|
|
2503
|
+
clone.dataset.recentClone = "true";
|
|
2504
|
+
clone.classList.remove("entity-row");
|
|
2505
|
+
clone.classList.add("entity-row-clone", "entity-row-recent");
|
|
2506
|
+
|
|
2507
|
+
const tds = clone.querySelectorAll("td");
|
|
2508
|
+
|
|
2509
|
+
const detailsTd = tds[3];
|
|
2510
|
+
if (detailsTd) {
|
|
2511
|
+
const timeBadge = document.createElement("span");
|
|
2512
|
+
timeBadge.className =
|
|
2513
|
+
"badge bg-secondary-subtle text-secondary fw-normal me-1 ms-1";
|
|
2514
|
+
timeBadge.textContent = relativeTime(originalRow.dataset.updatedAt);
|
|
2515
|
+
// detailsContent wraps badges in a div; insert inside it so they stay inline
|
|
2516
|
+
const detailsDiv = detailsTd.querySelector("div");
|
|
2517
|
+
if (detailsDiv) {
|
|
2518
|
+
// detailsDiv.insertBefore(timeBadge, detailsDiv.firstChild);
|
|
2519
|
+
detailsDiv.lastChild.after(timeBadge);
|
|
2520
|
+
} else {
|
|
2521
|
+
// detailsTd.insertBefore(timeBadge, detailsTd.firstChild);
|
|
2522
|
+
detailsTd.appendChild(timeBadge);
|
|
2523
|
+
}
|
|
2524
|
+
}
|
|
2525
|
+
|
|
2526
|
+
// Remove add-tag dropdown from tags cell to avoid duplicate IDs
|
|
2527
|
+
const tagsTd = tds[tds.length - 2];
|
|
2528
|
+
if (tagsTd) {
|
|
2529
|
+
const dropdown = tagsTd.querySelector(".dropdown");
|
|
2530
|
+
if (dropdown) dropdown.remove();
|
|
2531
|
+
}
|
|
2532
|
+
|
|
2533
|
+
// On row click (not a link/button), scroll to + flash the original
|
|
2534
|
+
clone.addEventListener("click", (e) => {
|
|
2535
|
+
if (e.target.closest("a, button, input, select, textarea, label"))
|
|
2536
|
+
return;
|
|
2537
|
+
const original = entitiesTbody
|
|
2538
|
+
? entitiesTbody.querySelector(
|
|
2539
|
+
'.entity-row[data-entity-key="' +
|
|
2540
|
+
originalRow.dataset.entityKey.replace(/"/g, '\\"') +
|
|
2541
|
+
'"]'
|
|
2542
|
+
)
|
|
2543
|
+
: null;
|
|
2544
|
+
if (original) {
|
|
2545
|
+
original.scrollIntoView({ behavior: "smooth", block: "center" });
|
|
2546
|
+
original.classList.remove("entity-row-flash");
|
|
2547
|
+
void original.offsetWidth; // reflow to restart animation
|
|
2548
|
+
original.classList.add("entity-row-flash");
|
|
2549
|
+
setTimeout(() => original.classList.remove("entity-row-flash"), 1500);
|
|
2550
|
+
}
|
|
2551
|
+
});
|
|
2552
|
+
|
|
2553
|
+
recentTbody.appendChild(clone);
|
|
2554
|
+
});
|
|
2555
|
+
|
|
2556
|
+
// Build "All entities" separator at bottom of recent section
|
|
2557
|
+
const allHeaderTr = document.createElement("tr");
|
|
2558
|
+
allHeaderTr.className = "entity-section-header-row";
|
|
2559
|
+
const allHeaderTd = document.createElement("td");
|
|
2560
|
+
allHeaderTd.colSpan = 7;
|
|
2561
|
+
allHeaderTd.textContent = "All entities";
|
|
2562
|
+
allHeaderTr.appendChild(allHeaderTd);
|
|
2563
|
+
recentTbody.appendChild(allHeaderTr);
|
|
2564
|
+
|
|
2565
|
+
recentTbody.classList.remove("d-none");
|
|
2566
|
+
};
|
|
2567
|
+
|
|
2568
|
+
// --- Main filter function ---
|
|
2569
|
+
|
|
2570
|
+
function filterEntities() {
|
|
2571
|
+
const entityRows = document.querySelectorAll(".entity-row");
|
|
2572
|
+
const searchTerm = searchInput.value.toLowerCase();
|
|
2573
|
+
const useDeep = deepSearchToggle && deepSearchToggle.checked;
|
|
2574
|
+
let visibleCount = 0;
|
|
2575
|
+
const visibleKeys = new Set();
|
|
2576
|
+
const allowAllModules = isModulesFilterExclusive();
|
|
2577
|
+
const canShowAllModules = allowAllModules && isExtendedExpanded;
|
|
2578
|
+
if (canShowAllModules && !hasLoadedAllModules) {
|
|
2579
|
+
ensureAllModulesLoaded();
|
|
2580
|
+
}
|
|
2581
|
+
|
|
2582
|
+
entityRows.forEach((row) => {
|
|
2583
|
+
const entityType = row.dataset.entityType;
|
|
2584
|
+
const key = row.dataset.entityKey;
|
|
2585
|
+
const deepText =
|
|
2586
|
+
useDeep && window.ENTITY_DEEP_SEARCH
|
|
2587
|
+
? window.ENTITY_DEEP_SEARCH[key]
|
|
2588
|
+
: null;
|
|
2589
|
+
const searchableText = useDeep
|
|
2590
|
+
? deepText || row.dataset.deepSearchable || ""
|
|
2591
|
+
: row.dataset.searchable || "";
|
|
2592
|
+
|
|
2593
|
+
const rowTags = (row.dataset.tags || "").split(" ").filter(Boolean);
|
|
2594
|
+
const rowInstalled = row.dataset.installed !== "false";
|
|
2595
|
+
const typeMatch = activeFilters.has(entityType);
|
|
2596
|
+
const searchMatch = !searchTerm || searchableText.includes(searchTerm);
|
|
2597
|
+
const tagMatch =
|
|
2598
|
+
activeTags.size === 0 || rowTags.some((tid) => activeTags.has(tid));
|
|
2599
|
+
const moduleVisibilityOk =
|
|
2600
|
+
entityType !== "module" || rowInstalled || canShowAllModules;
|
|
2601
|
+
|
|
2602
|
+
if (
|
|
2603
|
+
(activeFilters.size === 0 || typeMatch) &&
|
|
2604
|
+
searchMatch &&
|
|
2605
|
+
tagMatch &&
|
|
2606
|
+
moduleVisibilityOk
|
|
2607
|
+
) {
|
|
2608
|
+
row.style.display = "";
|
|
2609
|
+
visibleKeys.add(key);
|
|
2610
|
+
visibleCount++;
|
|
2611
|
+
} else {
|
|
2612
|
+
row.style.display = "none";
|
|
2613
|
+
}
|
|
2614
|
+
});
|
|
2615
|
+
|
|
2616
|
+
selectedKeys.forEach((key) => {
|
|
2617
|
+
if (!visibleKeys.has(key)) selectedKeys.delete(key);
|
|
2618
|
+
});
|
|
2619
|
+
|
|
2620
|
+
if (visibleCount === 0) {
|
|
2621
|
+
entitiesList.parentElement.classList.add("d-none");
|
|
2622
|
+
noResults.classList.remove("d-none");
|
|
2623
|
+
} else {
|
|
2624
|
+
entitiesList.parentElement.classList.remove("d-none");
|
|
2625
|
+
noResults.classList.add("d-none");
|
|
2626
|
+
}
|
|
2627
|
+
|
|
2628
|
+
updateUrl();
|
|
2629
|
+
updateOnDoneRedirectTargets();
|
|
2630
|
+
updateLegacyButton();
|
|
2631
|
+
updateSelectionUI();
|
|
2632
|
+
updateRecentlyEdited();
|
|
2633
|
+
}
|
|
2634
|
+
|
|
2635
|
+
// --- Bulk action helpers ---
|
|
2636
|
+
|
|
2637
|
+
const triggerDownload = (filename, content) => {
|
|
2638
|
+
const blob = new Blob([content], { type: "application/json" });
|
|
2639
|
+
const url = URL.createObjectURL(blob);
|
|
2640
|
+
const a = document.createElement("a");
|
|
2641
|
+
a.href = url;
|
|
2642
|
+
a.download = filename;
|
|
2643
|
+
document.body.appendChild(a);
|
|
2644
|
+
a.click();
|
|
2645
|
+
document.body.removeChild(a);
|
|
2646
|
+
URL.revokeObjectURL(url);
|
|
2647
|
+
};
|
|
2648
|
+
|
|
2649
|
+
const formatDeleteError = (err) => {
|
|
2650
|
+
const displayType =
|
|
2651
|
+
err && err.isPack
|
|
2652
|
+
? "Pack"
|
|
2653
|
+
: (() => {
|
|
2654
|
+
const t = ((err && err.type) || "").toString();
|
|
2655
|
+
if (!t) return "Item";
|
|
2656
|
+
return t.charAt(0).toUpperCase() + t.slice(1);
|
|
2657
|
+
})();
|
|
2658
|
+
const label = (err && (err.name || err.id || err.key)) || "(unknown)";
|
|
2659
|
+
const message =
|
|
2660
|
+
(err && err.message) ||
|
|
2661
|
+
TXT_DELETE_FAILED ||
|
|
2662
|
+
"Failed to delete selected items";
|
|
2663
|
+
return displayType + " (" + label + "): " + message;
|
|
2664
|
+
};
|
|
2665
|
+
|
|
2666
|
+
const showBulkDeleteErrors = (errs) => {
|
|
2667
|
+
if (!errs || !errs.length) return;
|
|
2668
|
+
alert(errs.map((e) => formatDeleteError(e)).join("\n-----\n"));
|
|
2669
|
+
};
|
|
2670
|
+
|
|
2671
|
+
const removeRowsByKeys = (keysToRemove) => {
|
|
2672
|
+
if (!keysToRemove || !keysToRemove.size) return;
|
|
2673
|
+
document.querySelectorAll(".entity-row").forEach((row) => {
|
|
2674
|
+
if (keysToRemove.has(row.dataset.entityKey)) row.remove();
|
|
2675
|
+
});
|
|
2676
|
+
};
|
|
2677
|
+
|
|
2678
|
+
const refreshExtendedEntitiesAfterDelete = async () => {
|
|
2679
|
+
if (!isExtendedExpanded) return;
|
|
2680
|
+
const tbody = entitiesTbody;
|
|
2681
|
+
if (!tbody) return;
|
|
2682
|
+
try {
|
|
2683
|
+
const extendedEntities = await loadExtendedEntities(
|
|
2684
|
+
isModulesFilterExclusive()
|
|
2685
|
+
);
|
|
2686
|
+
window.extendedEntities = extendedEntities;
|
|
2687
|
+
renderExtendedEntityRows(extendedEntities, tbody);
|
|
2688
|
+
} catch (err) {
|
|
2689
|
+
console.error("Failed to refresh extended entities after delete:", err);
|
|
2690
|
+
}
|
|
2691
|
+
};
|
|
2692
|
+
|
|
2693
|
+
const doBulkApplyTag = async () => {
|
|
2694
|
+
if (!bulkApplyTagBtn || !bulkTagSelect) return;
|
|
2695
|
+
const tagId = bulkTagSelect.value;
|
|
2696
|
+
if (!tagId) return;
|
|
2697
|
+
const items = collectSelectionItems().filter((item) =>
|
|
2698
|
+
isTaggableType(item.type)
|
|
2699
|
+
);
|
|
2700
|
+
if (!items.length) return;
|
|
2701
|
+
bulkApplyTagBtn.disabled = true;
|
|
2702
|
+
try {
|
|
2703
|
+
const res = await fetch("/entities/bulk-apply-tag", {
|
|
2704
|
+
method: "POST",
|
|
2705
|
+
headers: {
|
|
2706
|
+
"Content-Type": "application/json",
|
|
2707
|
+
"CSRF-Token": window._sc_globalCsrf || "",
|
|
2708
|
+
},
|
|
2709
|
+
body: JSON.stringify({ tag_id: tagId, items }),
|
|
2710
|
+
});
|
|
2711
|
+
if (!res.ok) throw new Error(await res.text());
|
|
2712
|
+
await res.json();
|
|
2713
|
+
const tagName = TAGS_BY_ID[tagId] || "";
|
|
2714
|
+
items.forEach((item) => {
|
|
2715
|
+
const row = findRowByKey(item.key);
|
|
2716
|
+
if (row) updateRowTags(row, tagId, tagName, item.type);
|
|
2717
|
+
});
|
|
2718
|
+
filterEntities();
|
|
2719
|
+
} catch (e) {
|
|
2720
|
+
console.error("Failed to apply tag to selected items", e);
|
|
2721
|
+
alert("Failed to apply tag to selected items");
|
|
2722
|
+
}
|
|
2723
|
+
bulkApplyTagBtn.disabled = false;
|
|
2724
|
+
};
|
|
2725
|
+
|
|
2726
|
+
const doBulkDownloadPack = async () => {
|
|
2727
|
+
if (!bulkDownloadPackBtn) return;
|
|
2728
|
+
const items = collectSelectionItems();
|
|
2729
|
+
if (!items.length) return;
|
|
2730
|
+
bulkDownloadPackBtn.disabled = true;
|
|
2731
|
+
try {
|
|
2732
|
+
const res = await fetch("/entities/download-pack", {
|
|
2733
|
+
method: "POST",
|
|
2734
|
+
headers: {
|
|
2735
|
+
"Content-Type": "application/json",
|
|
2736
|
+
"CSRF-Token": window._sc_globalCsrf || "",
|
|
2737
|
+
},
|
|
2738
|
+
body: JSON.stringify({ items }),
|
|
2739
|
+
});
|
|
2740
|
+
if (!res.ok) throw new Error(await res.text());
|
|
2741
|
+
const payload = await res.json();
|
|
2742
|
+
if (Array.isArray(payload && payload.packs)) {
|
|
2743
|
+
payload.packs.forEach((pack) => {
|
|
2744
|
+
if (pack && pack.name && pack.content) {
|
|
2745
|
+
const content =
|
|
2746
|
+
typeof pack.content === "string"
|
|
2747
|
+
? pack.content
|
|
2748
|
+
: JSON.stringify(pack.content, null, 2);
|
|
2749
|
+
triggerDownload(pack.name + ".json", content);
|
|
2750
|
+
}
|
|
2751
|
+
});
|
|
2752
|
+
}
|
|
2753
|
+
} catch (e) {
|
|
2754
|
+
console.error("Failed to download pack(s)", e);
|
|
2755
|
+
alert("Failed to download pack for selected items");
|
|
2756
|
+
}
|
|
2757
|
+
bulkDownloadPackBtn.disabled = false;
|
|
2758
|
+
};
|
|
2759
|
+
|
|
2760
|
+
const doBulkApplyRole = async (mode) => {
|
|
2761
|
+
const isWriteMode = mode === "write";
|
|
2762
|
+
const selectEl = isWriteMode ? bulkRoleWriteSelect : bulkRoleReadSelect;
|
|
2763
|
+
const buttonEl = isWriteMode ? bulkApplyRoleWriteBtn : bulkApplyRoleReadBtn;
|
|
2764
|
+
if (!selectEl || !buttonEl) return;
|
|
2765
|
+
const roleId = selectEl.value;
|
|
2766
|
+
if (!roleId) return;
|
|
2767
|
+
const items = collectSelectionItems().filter((item) =>
|
|
2768
|
+
isWriteMode
|
|
2769
|
+
? item.type === "table"
|
|
2770
|
+
: ["table", "view", "page"].includes(item.type)
|
|
2771
|
+
);
|
|
2772
|
+
if (!items.length) return;
|
|
2773
|
+
buttonEl.disabled = true;
|
|
2774
|
+
try {
|
|
2775
|
+
const res = await fetch("/entities/bulk-set-role", {
|
|
2776
|
+
method: "POST",
|
|
2777
|
+
headers: {
|
|
2778
|
+
"Content-Type": "application/json",
|
|
2779
|
+
"CSRF-Token": window._sc_globalCsrf || "",
|
|
2780
|
+
},
|
|
2781
|
+
body: JSON.stringify({ items, role_id: roleId, mode }),
|
|
2782
|
+
});
|
|
2783
|
+
if (!res.ok) throw new Error(await res.text());
|
|
2784
|
+
const payload = await res.json();
|
|
2785
|
+
const updatedKeys = new Set((payload && payload.updatedKeys) || []);
|
|
2786
|
+
const errors = (payload && payload.errors) || [];
|
|
2787
|
+
if (errors.length) {
|
|
2788
|
+
console.error("Failed to set role for some items", errors);
|
|
2789
|
+
alert("Failed to set role for some selected items");
|
|
2790
|
+
}
|
|
2791
|
+
items.forEach((item) => {
|
|
2792
|
+
if (updatedKeys.size && !updatedKeys.has(item.key)) return;
|
|
2793
|
+
const row = findRowByKey(item.key);
|
|
2794
|
+
if (!row) return;
|
|
2795
|
+
if (isWriteMode && item.type === "table") {
|
|
2796
|
+
updateRowAccess(row, {
|
|
2797
|
+
type: "table",
|
|
2798
|
+
min_role_write: Number(roleId),
|
|
2799
|
+
min_role_read: toNumberOrUndefined(row.dataset.minRoleRead),
|
|
2800
|
+
});
|
|
2801
|
+
} else if (!isWriteMode) {
|
|
2802
|
+
if (item.type === "table") {
|
|
2803
|
+
updateRowAccess(row, {
|
|
2804
|
+
type: "table",
|
|
2805
|
+
min_role_read: Number(roleId),
|
|
2806
|
+
min_role_write: toNumberOrUndefined(row.dataset.minRoleWrite),
|
|
2807
|
+
});
|
|
2808
|
+
} else if (item.type === "view") {
|
|
2809
|
+
updateRowAccess(row, { type: "view", min_role: Number(roleId) });
|
|
2810
|
+
} else if (item.type === "page") {
|
|
2811
|
+
updateRowAccess(row, { type: "page", min_role: Number(roleId) });
|
|
2812
|
+
}
|
|
2813
|
+
}
|
|
2814
|
+
});
|
|
2815
|
+
} catch (e) {
|
|
2816
|
+
console.error("Failed to set role for selected items", e);
|
|
2817
|
+
alert("Failed to set role for selected items");
|
|
2818
|
+
}
|
|
2819
|
+
buttonEl.disabled = false;
|
|
2820
|
+
updateSelectionUI();
|
|
2821
|
+
};
|
|
2822
|
+
|
|
2823
|
+
// --- URL state restore ---
|
|
2824
|
+
|
|
2825
|
+
const initFromUrl = () => {
|
|
2826
|
+
const params = new URLSearchParams(window.location.search);
|
|
2827
|
+
const q = params.get("q") || "";
|
|
2828
|
+
if (q) searchInput.value = q;
|
|
2829
|
+
const deep = params.get("deep") === "on";
|
|
2830
|
+
if (deep && deepSearchToggle) {
|
|
2831
|
+
deepSearchToggle.checked = true;
|
|
2832
|
+
deepSearchToggle.dispatchEvent(new Event("change"));
|
|
2833
|
+
}
|
|
2834
|
+
const shouldExpandExtended =
|
|
2835
|
+
params.get("extended") === "on" ||
|
|
2836
|
+
EXTENDED_TYPES.some((t) => params.get(t + "s") === "on");
|
|
2837
|
+
ALL_TYPES.forEach((t) => {
|
|
2838
|
+
if (params.get(t + "s") === "on") activeFilters.add(t);
|
|
2839
|
+
});
|
|
2840
|
+
filterButtons.forEach((btn) => {
|
|
2841
|
+
const t = btn.dataset.entityType;
|
|
2842
|
+
if (activeFilters.has(t)) {
|
|
2843
|
+
btn.classList.add("btn-primary");
|
|
2844
|
+
btn.classList.remove("btn-outline-primary");
|
|
2845
|
+
}
|
|
2846
|
+
});
|
|
2847
|
+
const tagsParam = params.get("tags");
|
|
2848
|
+
if (tagsParam) {
|
|
2849
|
+
tagsParam
|
|
2850
|
+
.split(",")
|
|
2851
|
+
.filter(Boolean)
|
|
2852
|
+
.forEach((id) => activeTags.add(id));
|
|
2853
|
+
}
|
|
2854
|
+
tagButtons.forEach((btn) => {
|
|
2855
|
+
const id = btn.dataset.tagId;
|
|
2856
|
+
if (activeTags.has(id)) {
|
|
2857
|
+
btn.classList.add("active", "btn-secondary");
|
|
2858
|
+
btn.classList.remove("btn-outline-secondary");
|
|
2859
|
+
}
|
|
2860
|
+
});
|
|
2861
|
+
return { shouldExpandExtended };
|
|
2862
|
+
};
|
|
2863
|
+
|
|
2864
|
+
// --- Event listeners ---
|
|
2865
|
+
|
|
2866
|
+
searchInput.addEventListener("input", filterEntities);
|
|
2867
|
+
searchInput.addEventListener("keydown", (e) => {
|
|
2868
|
+
if (e.key === "Escape" || e.key === "Esc") {
|
|
2869
|
+
e.preventDefault();
|
|
2870
|
+
searchInput.blur();
|
|
2871
|
+
}
|
|
2872
|
+
});
|
|
2873
|
+
|
|
2874
|
+
if (deepSearchToggle) {
|
|
2875
|
+
let deepSearchLoading = false;
|
|
2876
|
+
deepSearchToggle.addEventListener("change", function () {
|
|
2877
|
+
if (this.checked && !window.ENTITY_DEEP_SEARCH && !deepSearchLoading) {
|
|
2878
|
+
deepSearchLoading = true;
|
|
2879
|
+
fetch("/entities/deep-search-index")
|
|
2880
|
+
.then((r) => r.json())
|
|
2881
|
+
.then((data) => {
|
|
2882
|
+
window.ENTITY_DEEP_SEARCH = data;
|
|
2883
|
+
deepSearchLoading = false;
|
|
2884
|
+
filterEntities();
|
|
2885
|
+
})
|
|
2886
|
+
.catch(() => {
|
|
2887
|
+
deepSearchLoading = false;
|
|
2888
|
+
});
|
|
2889
|
+
} else {
|
|
2890
|
+
filterEntities();
|
|
2891
|
+
}
|
|
2892
|
+
});
|
|
2893
|
+
}
|
|
2894
|
+
|
|
2895
|
+
filterButtons.forEach((btn) => {
|
|
2896
|
+
btn.addEventListener("click", function () {
|
|
2897
|
+
const entityType = this.dataset.entityType;
|
|
2898
|
+
if (!activeFilters.has(entityType)) {
|
|
2899
|
+
activeFilters.add(entityType);
|
|
2900
|
+
this.classList.add("btn-primary");
|
|
2901
|
+
this.classList.remove("btn-outline-primary");
|
|
2902
|
+
} else {
|
|
2903
|
+
activeFilters.delete(entityType);
|
|
2904
|
+
this.classList.remove("btn-primary");
|
|
2905
|
+
this.classList.add("btn-outline-primary");
|
|
2906
|
+
}
|
|
2907
|
+
filterEntities();
|
|
2908
|
+
if (searchInput && typeof searchInput.focus === "function") {
|
|
2909
|
+
searchInput.focus({ preventScroll: true });
|
|
2910
|
+
}
|
|
2911
|
+
});
|
|
2912
|
+
});
|
|
2913
|
+
|
|
2914
|
+
tagButtons.forEach((btn) => {
|
|
2915
|
+
btn.addEventListener("click", function () {
|
|
2916
|
+
const tid = this.dataset.tagId;
|
|
2917
|
+
if (!activeTags.has(tid)) {
|
|
2918
|
+
activeTags.add(tid);
|
|
2919
|
+
this.classList.add("active", "btn-secondary");
|
|
2920
|
+
this.classList.remove("btn-outline-secondary");
|
|
2921
|
+
} else {
|
|
2922
|
+
activeTags.delete(tid);
|
|
2923
|
+
this.classList.remove("active", "btn-secondary");
|
|
2924
|
+
this.classList.add("btn-outline-secondary");
|
|
2925
|
+
}
|
|
2926
|
+
filterEntities();
|
|
2927
|
+
});
|
|
2928
|
+
});
|
|
2929
|
+
|
|
2930
|
+
const keyboardShortcutTypeMap = {
|
|
2931
|
+
KeyT: "table",
|
|
2932
|
+
KeyV: "view",
|
|
2933
|
+
KeyP: "page",
|
|
2934
|
+
KeyR: "trigger",
|
|
2935
|
+
KeyM: "module",
|
|
2936
|
+
KeyU: "user",
|
|
2937
|
+
};
|
|
2938
|
+
|
|
2939
|
+
document.addEventListener("keydown", async (e) => {
|
|
2940
|
+
const isFromSearchInput = e.target === searchInput;
|
|
2941
|
+
const typingTarget = isTypingTarget(e.target);
|
|
2942
|
+
|
|
2943
|
+
if (e.altKey && !e.ctrlKey && !e.metaKey) {
|
|
2944
|
+
const type = keyboardShortcutTypeMap[e.code];
|
|
2945
|
+
if (type) {
|
|
2946
|
+
e.preventDefault();
|
|
2947
|
+
if (EXTENDED_TYPES.includes(type) && !isExtendedExpanded) {
|
|
2948
|
+
await window.toggleEntityExpanded(true);
|
|
2949
|
+
}
|
|
2950
|
+
const btn = filterButtonsByType[type];
|
|
2951
|
+
if (btn) {
|
|
2952
|
+
btn.click();
|
|
2953
|
+
if (searchInput && typeof searchInput.focus === "function") {
|
|
2954
|
+
searchInput.focus({ preventScroll: true });
|
|
2955
|
+
}
|
|
2956
|
+
}
|
|
2957
|
+
return;
|
|
2958
|
+
}
|
|
2959
|
+
if (deepSearchToggle && e.code === "KeyS") {
|
|
2960
|
+
e.preventDefault();
|
|
2961
|
+
deepSearchToggle.checked = !deepSearchToggle.checked;
|
|
2962
|
+
deepSearchToggle.dispatchEvent(new Event("change"));
|
|
2963
|
+
if (searchInput && typeof searchInput.focus === "function") {
|
|
2964
|
+
searchInput.focus({ preventScroll: true });
|
|
2965
|
+
}
|
|
2966
|
+
}
|
|
2967
|
+
return;
|
|
2968
|
+
}
|
|
2969
|
+
if (typingTarget && !isFromSearchInput) return;
|
|
2970
|
+
|
|
2971
|
+
if (
|
|
2972
|
+
(e.metaKey || e.ctrlKey) &&
|
|
2973
|
+
!e.altKey &&
|
|
2974
|
+
(e.key === "a" || e.key === "A")
|
|
2975
|
+
) {
|
|
2976
|
+
const visibleRows = getSelectableVisibleRows();
|
|
2977
|
+
if (!visibleRows.length) return;
|
|
2978
|
+
e.preventDefault();
|
|
2979
|
+
visibleRows.forEach((row) => {
|
|
2980
|
+
if (row.dataset.entityKey) selectedKeys.add(row.dataset.entityKey);
|
|
2981
|
+
});
|
|
2982
|
+
lastSelectedIndex = visibleRows.length - 1;
|
|
2983
|
+
updateSelectionUI();
|
|
2984
|
+
}
|
|
2985
|
+
});
|
|
2986
|
+
|
|
2987
|
+
if (clearSelectionBtn) {
|
|
2988
|
+
clearSelectionBtn.addEventListener("click", () => {
|
|
2989
|
+
clearSelection();
|
|
2990
|
+
filterEntities();
|
|
2991
|
+
});
|
|
2992
|
+
}
|
|
2993
|
+
if (bulkTagSelect) {
|
|
2994
|
+
bulkTagSelect.addEventListener("change", () => updateSelectionUI());
|
|
2995
|
+
}
|
|
2996
|
+
if (bulkRoleReadSelect) {
|
|
2997
|
+
bulkRoleReadSelect.addEventListener("change", () => {
|
|
2998
|
+
markSelectChangedByUser(bulkRoleReadSelect);
|
|
2999
|
+
updateSelectionUI();
|
|
3000
|
+
});
|
|
3001
|
+
}
|
|
3002
|
+
if (bulkRoleWriteSelect) {
|
|
3003
|
+
bulkRoleWriteSelect.addEventListener("change", () => {
|
|
3004
|
+
markSelectChangedByUser(bulkRoleWriteSelect);
|
|
3005
|
+
updateSelectionUI();
|
|
3006
|
+
});
|
|
3007
|
+
}
|
|
3008
|
+
if (bulkApplyTagBtn)
|
|
3009
|
+
bulkApplyTagBtn.addEventListener("click", doBulkApplyTag);
|
|
3010
|
+
if (bulkDownloadPackBtn)
|
|
3011
|
+
bulkDownloadPackBtn.addEventListener("click", doBulkDownloadPack);
|
|
3012
|
+
if (bulkApplyRoleReadBtn) {
|
|
3013
|
+
bulkApplyRoleReadBtn.addEventListener("click", () =>
|
|
3014
|
+
doBulkApplyRole("read")
|
|
3015
|
+
);
|
|
3016
|
+
}
|
|
3017
|
+
if (bulkApplyRoleWriteBtn) {
|
|
3018
|
+
bulkApplyRoleWriteBtn.addEventListener("click", () =>
|
|
3019
|
+
doBulkApplyRole("write")
|
|
3020
|
+
);
|
|
3021
|
+
}
|
|
3022
|
+
|
|
3023
|
+
if (bulkDeleteBtn) {
|
|
3024
|
+
bulkDeleteBtn.addEventListener("click", async () => {
|
|
3025
|
+
const items = collectSelectionItems();
|
|
3026
|
+
if (!items.length) return;
|
|
3027
|
+
const template =
|
|
3028
|
+
TXT_DELETE_SELECTED_CONFIRM || TXT_DELETE_SELECTED_FALLBACK;
|
|
3029
|
+
const msg = template.includes("%s")
|
|
3030
|
+
? template.replace("%s", items.length)
|
|
3031
|
+
: template;
|
|
3032
|
+
if (!window.confirm(msg)) return;
|
|
3033
|
+
bulkDeleteBtn.disabled = true;
|
|
3034
|
+
try {
|
|
3035
|
+
const res = await fetch("/entities/bulk-delete", {
|
|
3036
|
+
method: "POST",
|
|
3037
|
+
headers: {
|
|
3038
|
+
"Content-Type": "application/json",
|
|
3039
|
+
"CSRF-Token": window._sc_globalCsrf || "",
|
|
3040
|
+
},
|
|
3041
|
+
body: JSON.stringify({ items }),
|
|
3042
|
+
});
|
|
3043
|
+
if (!res.ok) throw new Error(await res.text());
|
|
3044
|
+
const payload = await res.json();
|
|
3045
|
+
const keysToRemove = new Set(
|
|
3046
|
+
payload.deletedKeys && payload.deletedKeys.length
|
|
3047
|
+
? payload.deletedKeys
|
|
3048
|
+
: items.map((i) => i.key)
|
|
3049
|
+
);
|
|
3050
|
+
removeRowsByKeys(keysToRemove);
|
|
3051
|
+
if (payload.errors && payload.errors.length) {
|
|
3052
|
+
console.error("Bulk delete errors", payload.errors);
|
|
3053
|
+
showBulkDeleteErrors(payload.errors);
|
|
3054
|
+
}
|
|
3055
|
+
clearSelection();
|
|
3056
|
+
await refreshExtendedEntitiesAfterDelete();
|
|
3057
|
+
filterEntities();
|
|
3058
|
+
} catch (e) {
|
|
3059
|
+
console.error(e);
|
|
3060
|
+
alert(TXT_DELETE_FAILED || "Failed to delete selected items");
|
|
3061
|
+
}
|
|
3062
|
+
bulkDeleteBtn.disabled = false;
|
|
3063
|
+
});
|
|
3064
|
+
}
|
|
3065
|
+
|
|
3066
|
+
if (entitiesTbody) {
|
|
3067
|
+
entitiesTbody.addEventListener("click", (e) => {
|
|
3068
|
+
const row = e.target.closest(".entity-row");
|
|
3069
|
+
if (!row) return;
|
|
3070
|
+
if (e.target.closest("a, button, input, select, textarea, label")) return;
|
|
3071
|
+
if (!isRowSelectable(row)) {
|
|
3072
|
+
lastSelectedIndex = null;
|
|
3073
|
+
return;
|
|
3074
|
+
}
|
|
3075
|
+
const visibleRows = getSelectableVisibleRows();
|
|
3076
|
+
const index = visibleRows.indexOf(row);
|
|
3077
|
+
const key = row.dataset.entityKey;
|
|
3078
|
+
if (!key) return;
|
|
3079
|
+
|
|
3080
|
+
if (
|
|
3081
|
+
e.shiftKey &&
|
|
3082
|
+
lastSelectedIndex !== null &&
|
|
3083
|
+
visibleRows[lastSelectedIndex]
|
|
3084
|
+
) {
|
|
3085
|
+
selectedKeys.clear();
|
|
3086
|
+
const start = Math.min(lastSelectedIndex, index);
|
|
3087
|
+
const end = Math.max(lastSelectedIndex, index);
|
|
3088
|
+
for (let i = start; i <= end; i++) {
|
|
3089
|
+
const rangeKey = visibleRows[i].dataset.entityKey;
|
|
3090
|
+
if (rangeKey) selectedKeys.add(rangeKey);
|
|
3091
|
+
}
|
|
3092
|
+
} else if (e.metaKey || e.ctrlKey) {
|
|
3093
|
+
if (selectedKeys.has(key)) selectedKeys.delete(key);
|
|
3094
|
+
else selectedKeys.add(key);
|
|
3095
|
+
lastSelectedIndex = index;
|
|
3096
|
+
} else {
|
|
3097
|
+
const onlyThisSelected =
|
|
3098
|
+
selectedKeys.size === 1 && selectedKeys.has(key);
|
|
3099
|
+
selectedKeys.clear();
|
|
3100
|
+
if (!onlyThisSelected) {
|
|
3101
|
+
selectedKeys.add(key);
|
|
3102
|
+
lastSelectedIndex = index;
|
|
3103
|
+
} else {
|
|
3104
|
+
lastSelectedIndex = null;
|
|
3105
|
+
}
|
|
3106
|
+
}
|
|
3107
|
+
updateSelectionUI();
|
|
3108
|
+
});
|
|
3109
|
+
}
|
|
3110
|
+
|
|
3111
|
+
// --- Init ---
|
|
3112
|
+
|
|
3113
|
+
const { shouldExpandExtended } = initFromUrl();
|
|
3114
|
+
if (shouldExpandExtended) {
|
|
3115
|
+
window.toggleEntityExpanded(true);
|
|
3116
|
+
} else {
|
|
3117
|
+
filterEntities();
|
|
3118
|
+
}
|
|
3119
|
+
searchInput.focus();
|
|
3120
|
+
updateSelectionUI();
|
|
3121
|
+
setTimeout(updateLegacyButton, 200);
|
|
3122
|
+
}
|