@saltcorn/server 1.6.0-alpha.5 → 1.6.0-alpha.7
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/auth/admin.js +30 -15
- 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 +11 -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 +10 -10
- package/docs/classes/_saltcorn_data.models_role.Role.html +2 -2
- package/docs/classes/_saltcorn_data.models_table.Table.html +65 -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 +19 -19
- package/docs/classes/_saltcorn_data.models_user.User.html +32 -32
- package/docs/classes/_saltcorn_data.models_view.View.html +15 -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 +4 -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_fieldviews.radio_select.run.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_fieldviews.search_or_create.configFields.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_fieldviews.search_or_create.run.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_fieldviews.select.run.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_fieldviews.select_from_table.fill_options.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_fieldviews.select_from_table.run.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.bool.contract.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.bool.fieldviews.TrueFalse.run.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.bool.fieldviews.checkboxes.run.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.bool.fieldviews.edit.run.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.bool.fieldviews.show.run.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.bool.fieldviews.tristate.run.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.bool.listAs.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.bool.read.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.bool.readFromDB.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.bool.readFromFormRecord.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.bool.validate.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.color.contract.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.color.fieldviews.edit.run.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.color.fieldviews.show.run.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.color.read.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.color.validate.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.date.contract.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.date.equals.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.date.fieldviews.edit.run.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.date.fieldviews.editDay.run.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.date.fieldviews.format.run.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.date.fieldviews.relative.run.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.date.fieldviews.show.run.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.date.fieldviews.showDay.run.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.date.fieldviews.yearsAgo.run.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.date.presets.Now.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.date.read.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.date.validate.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.float.contract.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.float.equals.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.float.fieldviews.edit.run.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.float.fieldviews.show.run.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.float.read.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.float.validate.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.int.contract.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.int.read.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.int.validate.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.int.validate_attributes.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.attributes.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.contract.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.fieldviews.as_header.run.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.fieldviews.as_link.run.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.fieldviews.as_text.run.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.fieldviews.edit.configFields.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.fieldviews.edit.run.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.fieldviews.img_from_url.run.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.fieldviews.password.run.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.fieldviews.radio_group.run.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.fieldviews.textarea.run.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.presets.IP.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.presets.SessionID.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.read.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.validate.html +1 -1
- package/docs/functions/_saltcorn_data.base-plugin_types.string.validate_attributes.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 +2 -2
- 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 +3 -3
- 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 +2 -2
- package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.view_linker.html +2 -2
- package/docs/functions/_saltcorn_data.db_connect_mobile.getConnectObject.html +1 -1
- package/docs/functions/_saltcorn_data.db_reset_schema.reset.html +3 -3
- 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 +3 -3
- 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.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.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 +5 -5
- package/docs/functions/_saltcorn_data.plugin-helper.displayType.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-helper.field_picker_fields.html +2 -2
- package/docs/functions/_saltcorn_data.plugin-helper.generate_joined_query.html +1 -1
- package/docs/functions/_saltcorn_data.plugin-helper.getActionConfigFields.html +2 -2
- package/docs/functions/_saltcorn_data.plugin-helper.get_child_views.html +2 -2
- package/docs/functions/_saltcorn_data.plugin-helper.get_inbound_relation_opts.html +2 -2
- 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 +4 -4
- package/docs/functions/_saltcorn_data.plugin-helper.get_parent_views.html +2 -2
- package/docs/functions/_saltcorn_data.plugin-helper.initial_config_all_fields.html +2 -2
- package/docs/functions/_saltcorn_data.plugin-helper.json_list_to_external_table.html +2 -2
- 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 +2 -2
- package/docs/functions/_saltcorn_data.plugin-helper.readState.html +2 -2
- package/docs/functions/_saltcorn_data.plugin-helper.readStateStrict.html +3 -3
- package/docs/functions/_saltcorn_data.plugin-helper.runCollabEvents.html +4 -4
- package/docs/functions/_saltcorn_data.plugin-helper.run_action_column.html +2 -2
- package/docs/functions/_saltcorn_data.plugin-helper.stateFieldsToQuery.html +2 -2
- 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 +2 -2
- 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 -0
- 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 +4 -2
- 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.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_view.instanceOfView.html +1 -1
- package/docs/hierarchy.html +1 -1
- package/docs/interfaces/_saltcorn_data.plugin-testing.CheckResult.html +3 -0
- 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_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.model-helper.html +2 -1
- package/docs/modules/_saltcorn_data.plugin-testing.html +1 -1
- package/docs/modules/_saltcorn_data.standard-menu.html +2 -1
- package/docs/modules/_saltcorn_mobile-builder.utils_common-build-utils.html +1 -1
- 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.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 +2 -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 +2 -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 +2 -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 +2 -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 +2 -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 +5 -5
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.radio_select.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.radio_select.isEdit.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.radio_select.type.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.search_join_field.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.search_or_create.blockDisplay.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.search_or_create.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.search_or_create.isEdit.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.search_or_create.type.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.select.blockDisplay.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.select.configFields.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.select.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.select.isEdit.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.select.type.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.select_by_code.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.select_by_view.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.select_from_table.blockDisplay.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.select_from_table.configFields.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.select_from_table.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.select_from_table.isEdit.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.select_from_table.type.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_fieldviews.two_level_select.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_fileview.fileview.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_index.index.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.attributes.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.TrueFalse.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.TrueFalse.isEdit.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.checkboxes.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.checkboxes.isEdit.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.edit.configFields.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.edit.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.edit.isEdit.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.show.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.show.isEdit.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.show_with_html.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.switch.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.thumbs_up_down.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.tristate.configFields.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.tristate.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.fieldviews.tristate.isEdit.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.js_type.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.name.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.bool.sql_name.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.color.attributes.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.color.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.color.fieldviews.edit.blockDisplay.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.color.fieldviews.edit.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.color.fieldviews.edit.isEdit.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.color.fieldviews.show.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.color.fieldviews.show.isEdit.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.color.fieldviews.show_with_html.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.color.js_type.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.color.name.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.color.sql_name.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.attributes.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.edit.blockDisplay.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.edit.configFields.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.edit.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.edit.isEdit.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.editDay.blockDisplay.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.editDay.configFields.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.editDay.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.editDay.isEdit.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.format.configFields.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.format.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.format.isEdit.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.relative.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.relative.isEdit.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.show.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.show.isEdit.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.showDay.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.showDay.isEdit.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.show_with_html.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.yearsAgo.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.fieldviews.yearsAgo.isEdit.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.js_type.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.name.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.date.sql_name.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.attributes.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.distance_operators.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.fieldviews.above_input.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.fieldviews.below_input.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.fieldviews.edit.blockDisplay.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.fieldviews.edit.configFields.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.fieldviews.edit.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.fieldviews.edit.isEdit.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.fieldviews.heat_cell.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.fieldviews.number_slider.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.fieldviews.progress_bar.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.fieldviews.range_interval.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.fieldviews.show.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.fieldviews.show.isEdit.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.fieldviews.show_with_html.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.fieldviews.to_locale_string.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.js_type.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.name.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.float.sql_name.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.int.attributes.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.int.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.int.distance_operators.near.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.int.fieldviews.html +2 -2
- package/docs/variables/_saltcorn_data.base-plugin_types.int.js_type.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.int.name.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.int.primaryKey.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.int.sql_name.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.as_header.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.as_header.isEdit.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.as_link.configFields.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.as_link.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.as_link.isEdit.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.as_text.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.as_text.isEdit.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.checkbox_group.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.code.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.code_editor.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.edit.blockDisplay.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.edit.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.edit.isEdit.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.ellipsize.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.fill_formula_btn.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.img_from_url.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.img_from_url.isEdit.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.make_unique.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.monospace_block.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.password.blockDisplay.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.password.configFields.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.password.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.password.isEdit.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.preFormatted.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.radio_group.configFields.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.radio_group.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.radio_group.isEdit.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.select_by_code.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.show_with_html.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.textarea.blockDisplay.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.textarea.configFields.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.textarea.description.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.fieldviews.textarea.isEdit.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.js_type.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.name.html +1 -1
- package/docs/variables/_saltcorn_data.base-plugin_types.string.sql_name.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.base-plugin_viewtemplates_viewable_fields.viewableFields.html +1 -1
- package/docs/variables/_saltcorn_data.contract.fieldlike.html +1 -1
- package/docs/variables/_saltcorn_data.contract.is_column.html +1 -1
- package/docs/variables/_saltcorn_data.contract.is_header.html +1 -1
- package/docs/variables/_saltcorn_data.contract.is_pack.html +1 -1
- package/docs/variables/_saltcorn_data.contract.is_plugin.html +1 -1
- package/docs/variables/_saltcorn_data.contract.is_plugin_layout.html +1 -1
- package/docs/variables/_saltcorn_data.contract.is_plugin_type.html +1 -1
- package/docs/variables/_saltcorn_data.contract.is_plugin_wrap.html +1 -1
- package/docs/variables/_saltcorn_data.contract.is_plugin_wrap_arg.html +1 -1
- package/docs/variables/_saltcorn_data.contract.is_table_query.html +1 -1
- package/docs/variables/_saltcorn_data.contract.is_tablely.html +1 -1
- package/docs/variables/_saltcorn_data.contract.is_viewtemplate.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.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 +1 -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 +2 -2
- 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 +3 -3
- 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/locales/en.json +22 -1
- package/package.json +10 -10
- package/public/ios_share_tutorial/01_xcode_open_exisiting.png +0 -0
- package/public/ios_share_tutorial/02_open_xc_ws_file.png +0 -0
- package/public/ios_share_tutorial/03_share_extension_dialog.png +0 -0
- package/public/ios_share_tutorial/04_share_extension_dialog_b.png +0 -0
- package/public/ios_share_tutorial/05_activate.png +0 -0
- package/public/ios_share_tutorial/06_show_new_share_ext_target.png +0 -0
- package/public/ios_share_tutorial/07_convert_to_group.png +0 -0
- package/public/saltcorn-common.js +1 -0
- package/public/saltcorn.css +5 -0
- package/routes/actions.js +54 -5
- package/routes/admin.js +174 -18
- package/routes/api.js +1 -1
- package/routes/common_lists.js +9 -10
- package/routes/entities.js +1390 -57
- package/routes/packs.js +16 -6
- package/routes/pageedit.js +14 -0
- package/routes/plugins.js +45 -14
- package/routes/utils.js +2 -1
- package/routes/viewedit.js +3 -1
- package/serve.js +92 -25
package/routes/entities.js
CHANGED
|
@@ -13,6 +13,8 @@ const Trigger = require("@saltcorn/data/models/trigger");
|
|
|
13
13
|
const Tag = require("@saltcorn/data/models/tag");
|
|
14
14
|
const TagEntry = require("@saltcorn/data/models/tag_entry");
|
|
15
15
|
const User = require("@saltcorn/data/models/user");
|
|
16
|
+
const Role = require("@saltcorn/data/models/role");
|
|
17
|
+
const Plugin = require("@saltcorn/data/models/plugin");
|
|
16
18
|
const db = require("@saltcorn/data/db");
|
|
17
19
|
const { getState } = require("@saltcorn/data/db/state");
|
|
18
20
|
const {
|
|
@@ -31,14 +33,28 @@ const {
|
|
|
31
33
|
tr,
|
|
32
34
|
th,
|
|
33
35
|
td,
|
|
36
|
+
label,
|
|
34
37
|
} = require("@saltcorn/markup/tags");
|
|
35
|
-
const {
|
|
38
|
+
const {
|
|
39
|
+
post_dropdown_item,
|
|
40
|
+
settingsDropdown,
|
|
41
|
+
post_btn,
|
|
42
|
+
} = require("@saltcorn/markup");
|
|
36
43
|
const {
|
|
37
44
|
view_dropdown,
|
|
38
45
|
page_dropdown,
|
|
39
46
|
trigger_dropdown,
|
|
40
47
|
} = require("./common_lists.js");
|
|
41
48
|
const { error_catcher, isAdminOrHasConfigMinRole } = require("./utils.js");
|
|
49
|
+
const {
|
|
50
|
+
fetch_pack_by_name,
|
|
51
|
+
fetch_available_packs,
|
|
52
|
+
table_pack,
|
|
53
|
+
view_pack,
|
|
54
|
+
page_pack,
|
|
55
|
+
trigger_pack,
|
|
56
|
+
uninstall_pack,
|
|
57
|
+
} = require("@saltcorn/admin-models/models/pack");
|
|
42
58
|
|
|
43
59
|
/**
|
|
44
60
|
* @type {object}
|
|
@@ -54,6 +70,325 @@ module.exports = router;
|
|
|
54
70
|
const stripLeadingSlash = (path = "") =>
|
|
55
71
|
path.startsWith("/") ? path.slice(1) : path;
|
|
56
72
|
|
|
73
|
+
/**
|
|
74
|
+
* Get additional entities (modules, users)
|
|
75
|
+
*/
|
|
76
|
+
const req__ = (req, s) => (req && req.__(s)) || s;
|
|
77
|
+
|
|
78
|
+
const getExtendedEntites = async (req, { includeAllModules = false } = {}) => {
|
|
79
|
+
const entities = [];
|
|
80
|
+
const can_reset = getState().getConfig("smtp_host", "") !== "";
|
|
81
|
+
|
|
82
|
+
const users = await User.find({}, { cached: true });
|
|
83
|
+
users.forEach((u) => {
|
|
84
|
+
entities.push({
|
|
85
|
+
type: "user",
|
|
86
|
+
name: u.email,
|
|
87
|
+
id: u.id,
|
|
88
|
+
viewLink: `/useradmin/${u.id}`,
|
|
89
|
+
editLink: `/useradmin/${u.id}`,
|
|
90
|
+
metadata: {
|
|
91
|
+
email: u.email,
|
|
92
|
+
username: u.username,
|
|
93
|
+
role_id: u.role_id,
|
|
94
|
+
disabled: u.disabled,
|
|
95
|
+
},
|
|
96
|
+
actionsHtml: buildUserActionsDropdown(u, req, can_reset),
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
const statePlugins = getState().plugins;
|
|
101
|
+
const csrfToken = req?.csrfToken ? req.csrfToken() : null;
|
|
102
|
+
const packs = getState().getConfig("installed_packs", []);
|
|
103
|
+
const installedPackNames = new Set(packs);
|
|
104
|
+
const packDetails = await Promise.all(
|
|
105
|
+
packs.map(async (pname) => {
|
|
106
|
+
try {
|
|
107
|
+
return (await fetch_pack_by_name(pname)) || { name: pname };
|
|
108
|
+
} catch (e) {
|
|
109
|
+
getState().log?.(
|
|
110
|
+
2,
|
|
111
|
+
`Failed to fetch installed pack ${pname}: ${e.message}`
|
|
112
|
+
);
|
|
113
|
+
return { name: pname };
|
|
114
|
+
}
|
|
115
|
+
})
|
|
116
|
+
);
|
|
117
|
+
const availablePackSummaries = new Map();
|
|
118
|
+
let storeModules = [];
|
|
119
|
+
const storeModuleSummaries = new Map();
|
|
120
|
+
try {
|
|
121
|
+
storeModules = await Plugin.store_plugins_available();
|
|
122
|
+
storeModules.forEach((mod) => {
|
|
123
|
+
if (mod?.name) storeModuleSummaries.set(mod.name, mod);
|
|
124
|
+
});
|
|
125
|
+
} catch (e) {
|
|
126
|
+
getState().log?.(2, `Failed to fetch available modules: ${e.message}`);
|
|
127
|
+
}
|
|
128
|
+
if (includeAllModules) {
|
|
129
|
+
try {
|
|
130
|
+
const availablePacks = await fetch_available_packs();
|
|
131
|
+
availablePacks.forEach((pack) => {
|
|
132
|
+
if (pack?.name) availablePackSummaries.set(pack.name, pack);
|
|
133
|
+
});
|
|
134
|
+
} catch (e) {
|
|
135
|
+
getState().log?.(2, `Failed to fetch available packs: ${e.message}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const buildModuleActions = (moduleName, installed) => {
|
|
140
|
+
if (!csrfToken) return "";
|
|
141
|
+
if (installed) {
|
|
142
|
+
return post_btn(
|
|
143
|
+
`/plugins/delete/${encodeURIComponent(moduleName)}`,
|
|
144
|
+
req.__("Uninstall"),
|
|
145
|
+
csrfToken,
|
|
146
|
+
{
|
|
147
|
+
formClass: "d-inline",
|
|
148
|
+
btnClass: "btn btn-sm btn-danger",
|
|
149
|
+
klass: "extended-entity-remove",
|
|
150
|
+
confirm: true,
|
|
151
|
+
req,
|
|
152
|
+
}
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
return post_btn(
|
|
156
|
+
`/plugins/install/${encodeURIComponent(moduleName)}`,
|
|
157
|
+
req.__("Install"),
|
|
158
|
+
csrfToken,
|
|
159
|
+
{
|
|
160
|
+
formClass: "d-inline",
|
|
161
|
+
btnClass: "btn btn-sm btn-primary",
|
|
162
|
+
klass: "extended-entity-install",
|
|
163
|
+
}
|
|
164
|
+
);
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
const modules = await Plugin.find();
|
|
168
|
+
const installedModuleNames = new Set();
|
|
169
|
+
modules
|
|
170
|
+
.filter((mod) => mod.name !== "base")
|
|
171
|
+
.forEach((mod) => {
|
|
172
|
+
installedModuleNames.add(mod.name);
|
|
173
|
+
const has_theme =
|
|
174
|
+
typeof mod.has_theme !== "undefined"
|
|
175
|
+
? mod.has_theme
|
|
176
|
+
: !!statePlugins[mod.name]?.layout;
|
|
177
|
+
const has_auth =
|
|
178
|
+
typeof mod.has_auth !== "undefined"
|
|
179
|
+
? mod.has_auth
|
|
180
|
+
: !!statePlugins[mod.name]?.authentication;
|
|
181
|
+
const ready_for_mobile = !!statePlugins[mod.name]?.ready_for_mobile;
|
|
182
|
+
const source = mod.source;
|
|
183
|
+
const description =
|
|
184
|
+
storeModuleSummaries.get(mod.name)?.description ||
|
|
185
|
+
mod.description ||
|
|
186
|
+
statePlugins[mod.name]?.description ||
|
|
187
|
+
"";
|
|
188
|
+
entities.push({
|
|
189
|
+
type: "module",
|
|
190
|
+
name: mod.name,
|
|
191
|
+
id: mod.id,
|
|
192
|
+
viewLink: `/plugins/info/${mod.name}`,
|
|
193
|
+
editLink: statePlugins[mod.name]?.configuration_workflow
|
|
194
|
+
? `/plugins/configure/${mod.name}`
|
|
195
|
+
: null,
|
|
196
|
+
metadata: {
|
|
197
|
+
version: mod.version,
|
|
198
|
+
hasConfig: !!statePlugins[mod.name]?.configuration_workflow,
|
|
199
|
+
has_theme,
|
|
200
|
+
has_auth,
|
|
201
|
+
ready_for_mobile,
|
|
202
|
+
source,
|
|
203
|
+
description,
|
|
204
|
+
local: source === "local",
|
|
205
|
+
installed: true,
|
|
206
|
+
type: "module",
|
|
207
|
+
},
|
|
208
|
+
actionsHtml: buildModuleActions(mod.name, true),
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
if (includeAllModules) {
|
|
213
|
+
try {
|
|
214
|
+
storeModules
|
|
215
|
+
.filter(
|
|
216
|
+
(mod) => mod.name !== "base" && !installedModuleNames.has(mod.name)
|
|
217
|
+
)
|
|
218
|
+
.forEach((mod) => {
|
|
219
|
+
const source = mod.source;
|
|
220
|
+
entities.push({
|
|
221
|
+
type: "module",
|
|
222
|
+
name: mod.name,
|
|
223
|
+
id: mod.id,
|
|
224
|
+
viewLink: `/plugins/info/${mod.name}`,
|
|
225
|
+
editLink: null,
|
|
226
|
+
metadata: {
|
|
227
|
+
version: mod.version,
|
|
228
|
+
hasConfig: false,
|
|
229
|
+
has_theme: !!mod.has_theme,
|
|
230
|
+
has_auth: !!mod.has_auth,
|
|
231
|
+
ready_for_mobile: !!mod.ready_for_mobile,
|
|
232
|
+
source,
|
|
233
|
+
description: mod.description || "",
|
|
234
|
+
local: source === "local",
|
|
235
|
+
installed: false,
|
|
236
|
+
type: "module",
|
|
237
|
+
},
|
|
238
|
+
actionsHtml: buildModuleActions(mod.name, false),
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
} catch (e) {
|
|
242
|
+
getState().log?.(2, `Failed to fetch available modules: ${e.message}`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
const buildPackActions = (packName, installed) => {
|
|
247
|
+
if (!csrfToken) return "";
|
|
248
|
+
if (installed) {
|
|
249
|
+
return post_btn(
|
|
250
|
+
`/packs/uninstall/${encodeURIComponent(packName)}`,
|
|
251
|
+
req.__("Uninstall"),
|
|
252
|
+
csrfToken,
|
|
253
|
+
{
|
|
254
|
+
formClass: "d-inline",
|
|
255
|
+
btnClass: "btn btn-sm btn-danger",
|
|
256
|
+
klass: "extended-entity-remove",
|
|
257
|
+
}
|
|
258
|
+
);
|
|
259
|
+
}
|
|
260
|
+
return post_btn(
|
|
261
|
+
`/packs/install-named/${encodeURIComponent(packName)}`,
|
|
262
|
+
req.__("Install"),
|
|
263
|
+
csrfToken,
|
|
264
|
+
{
|
|
265
|
+
formClass: "d-inline",
|
|
266
|
+
btnClass: "btn btn-sm btn-primary",
|
|
267
|
+
klass: "extended-entity-install",
|
|
268
|
+
}
|
|
269
|
+
);
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
packDetails.forEach((pack) => {
|
|
273
|
+
if (!pack || !pack.name) return;
|
|
274
|
+
const summary = availablePackSummaries.get(pack.name);
|
|
275
|
+
if (summary) availablePackSummaries.delete(pack.name);
|
|
276
|
+
const version = pack.version ?? pack.pack?.version ?? null;
|
|
277
|
+
const description =
|
|
278
|
+
pack.description || pack.pack?.description || summary?.description || "";
|
|
279
|
+
entities.push({
|
|
280
|
+
type: "module",
|
|
281
|
+
name: pack.name,
|
|
282
|
+
id: pack.id || pack.pack?.id || pack.name,
|
|
283
|
+
viewLink: null,
|
|
284
|
+
editLink: null,
|
|
285
|
+
metadata: {
|
|
286
|
+
version,
|
|
287
|
+
description,
|
|
288
|
+
hasConfig: false,
|
|
289
|
+
has_theme: false,
|
|
290
|
+
local: false,
|
|
291
|
+
installed: true,
|
|
292
|
+
type: "pack",
|
|
293
|
+
},
|
|
294
|
+
actionsHtml: buildPackActions(pack.name, true),
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
if (availablePackSummaries.size) {
|
|
299
|
+
for (const [packName, pack] of availablePackSummaries.entries()) {
|
|
300
|
+
if (installedPackNames.has(packName)) continue;
|
|
301
|
+
entities.push({
|
|
302
|
+
type: "module",
|
|
303
|
+
name: packName,
|
|
304
|
+
id: pack.id || packName,
|
|
305
|
+
viewLink: null,
|
|
306
|
+
editLink: null,
|
|
307
|
+
metadata: {
|
|
308
|
+
version: null,
|
|
309
|
+
description: pack.description || "",
|
|
310
|
+
hasConfig: false,
|
|
311
|
+
has_theme: false,
|
|
312
|
+
local: false,
|
|
313
|
+
installed: false,
|
|
314
|
+
type: "pack",
|
|
315
|
+
},
|
|
316
|
+
actionsHtml: buildPackActions(packName, false),
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
return entities;
|
|
322
|
+
};
|
|
323
|
+
|
|
324
|
+
const buildUserActionsDropdown = (user, req, can_reset) => {
|
|
325
|
+
if (!req) return "";
|
|
326
|
+
const dropdownId = `entityUserDropdown${user.id}`;
|
|
327
|
+
const items = [
|
|
328
|
+
a(
|
|
329
|
+
{
|
|
330
|
+
class: "dropdown-item",
|
|
331
|
+
href: `/useradmin/${user.id}`,
|
|
332
|
+
},
|
|
333
|
+
'<i class="fas fa-edit"></i> ' + req__(req, "Edit")
|
|
334
|
+
),
|
|
335
|
+
post_dropdown_item(
|
|
336
|
+
`/useradmin/become-user/${user.id}`,
|
|
337
|
+
'<i class="fas fa-ghost"></i> ' + req__(req, "Become user"),
|
|
338
|
+
req
|
|
339
|
+
),
|
|
340
|
+
post_dropdown_item(
|
|
341
|
+
`/useradmin/set-random-password/${user.id}`,
|
|
342
|
+
'<i class="fas fa-random"></i> ' + req__(req, "Set random password"),
|
|
343
|
+
req,
|
|
344
|
+
true
|
|
345
|
+
),
|
|
346
|
+
can_reset &&
|
|
347
|
+
post_dropdown_item(
|
|
348
|
+
`/useradmin/reset-password/${user.id}`,
|
|
349
|
+
'<i class="fas fa-envelope"></i> ' +
|
|
350
|
+
req__(req, "Send password reset email"),
|
|
351
|
+
req
|
|
352
|
+
),
|
|
353
|
+
can_reset &&
|
|
354
|
+
!user.verified_on &&
|
|
355
|
+
getState().getConfig("verification_view", "") &&
|
|
356
|
+
post_dropdown_item(
|
|
357
|
+
`/useradmin/send-verification/${user.id}`,
|
|
358
|
+
'<i class="fas fa-envelope"></i> ' +
|
|
359
|
+
req__(req, "Send verification email"),
|
|
360
|
+
req
|
|
361
|
+
),
|
|
362
|
+
user.disabled &&
|
|
363
|
+
post_dropdown_item(
|
|
364
|
+
`/useradmin/enable/${user.id}`,
|
|
365
|
+
'<i class="fas fa-play"></i> ' + req__(req, "Enable"),
|
|
366
|
+
req
|
|
367
|
+
),
|
|
368
|
+
!user.disabled &&
|
|
369
|
+
post_dropdown_item(
|
|
370
|
+
`/useradmin/disable/${user.id}`,
|
|
371
|
+
'<i class="fas fa-pause"></i> ' + req__(req, "Disable"),
|
|
372
|
+
req
|
|
373
|
+
),
|
|
374
|
+
!user.disabled &&
|
|
375
|
+
post_dropdown_item(
|
|
376
|
+
`/useradmin/force-logout/${user.id}`,
|
|
377
|
+
'<i class="fas fa-sign-out-alt"></i> ' +
|
|
378
|
+
req__(req, "Force logout"),
|
|
379
|
+
req
|
|
380
|
+
),
|
|
381
|
+
post_dropdown_item(
|
|
382
|
+
`/useradmin/delete/${user.id}`,
|
|
383
|
+
'<i class="far fa-trash-alt"></i> ' + req__(req, "Delete"),
|
|
384
|
+
req,
|
|
385
|
+
true,
|
|
386
|
+
user.email
|
|
387
|
+
),
|
|
388
|
+
].filter(Boolean);
|
|
389
|
+
return settingsDropdown(dropdownId, items);
|
|
390
|
+
};
|
|
391
|
+
|
|
57
392
|
/**
|
|
58
393
|
* Get all entities with their type and metadata
|
|
59
394
|
*/
|
|
@@ -163,6 +498,9 @@ const entityTypeBadge = (type) => {
|
|
|
163
498
|
view: { class: "success", icon: "eye", label: "View" },
|
|
164
499
|
page: { class: "info", icon: "file", label: "Page" },
|
|
165
500
|
trigger: { class: "warning", icon: "play", label: "Trigger" },
|
|
501
|
+
module: { class: "secondary", icon: "cube", label: "Module" },
|
|
502
|
+
user: { class: "dark", icon: "user", label: "User" },
|
|
503
|
+
role: { class: "danger", icon: "lock", label: "Role" },
|
|
166
504
|
};
|
|
167
505
|
const badge = badges[type];
|
|
168
506
|
return span(
|
|
@@ -173,7 +511,7 @@ const entityTypeBadge = (type) => {
|
|
|
173
511
|
};
|
|
174
512
|
|
|
175
513
|
// Helper: build details column content based on entity type
|
|
176
|
-
const detailsContent = (entity, req) => {
|
|
514
|
+
const detailsContent = (entity, req, roles) => {
|
|
177
515
|
const bits = [];
|
|
178
516
|
if (entity.type === "table") {
|
|
179
517
|
if (entity.metadata.external)
|
|
@@ -222,6 +560,23 @@ const detailsContent = (entity, req) => {
|
|
|
222
560
|
text(entity.metadata.action)
|
|
223
561
|
)
|
|
224
562
|
);
|
|
563
|
+
} else if (entity.type === "user") {
|
|
564
|
+
const disabled = entity.metadata.disabled;
|
|
565
|
+
const roleName = Array.isArray(roles)
|
|
566
|
+
? roles.find((r) => r.id === entity.metadata.role_id)?.role
|
|
567
|
+
: null;
|
|
568
|
+
if (roleName)
|
|
569
|
+
bits.push(span({ class: "badge bg-secondary me-1" }, text(roleName)));
|
|
570
|
+
if (disabled)
|
|
571
|
+
bits.push(span({ class: "badge bg-danger me-1" }, req.__("Disabled")));
|
|
572
|
+
} else if (entity.type === "module") {
|
|
573
|
+
if (entity.metadata.version)
|
|
574
|
+
bits.push(
|
|
575
|
+
span(
|
|
576
|
+
{ class: "text-muted small me-2" },
|
|
577
|
+
text(`v${entity.metadata.version}`)
|
|
578
|
+
)
|
|
579
|
+
);
|
|
225
580
|
}
|
|
226
581
|
return bits.length ? div(...bits) : "";
|
|
227
582
|
};
|
|
@@ -317,8 +672,45 @@ router.get(
|
|
|
317
672
|
isAdminOrHasConfigMinRole("min_role_edit_views"),
|
|
318
673
|
error_catcher(async (req, res) => {
|
|
319
674
|
const entities = await getAllEntities();
|
|
675
|
+
const deepSearchIndex = {};
|
|
676
|
+
const addDeepSearch = (key, pack) => {
|
|
677
|
+
if (!pack) return;
|
|
678
|
+
try {
|
|
679
|
+
deepSearchIndex[key] = JSON.stringify(pack).toLowerCase();
|
|
680
|
+
} catch (e) {
|
|
681
|
+
console.error(
|
|
682
|
+
`Failed to stringify pack ${pack.name} for deep search index:`,
|
|
683
|
+
e
|
|
684
|
+
);
|
|
685
|
+
}
|
|
686
|
+
};
|
|
687
|
+
|
|
688
|
+
for (const entity of entities) {
|
|
689
|
+
const key = (useId = true) =>
|
|
690
|
+
`${entity.type}:${useId ? entity.id : entity.name}`; // Using name for views as some table_less views have undefined ids
|
|
691
|
+
try {
|
|
692
|
+
if (entity.type === "table") {
|
|
693
|
+
const table = Table.findOne({ id: entity.id });
|
|
694
|
+
if (table) addDeepSearch(key(), await table_pack(table));
|
|
695
|
+
} else if (entity.type === "view") {
|
|
696
|
+
const view = View.findOne({ name: entity.name });
|
|
697
|
+
if (view) addDeepSearch(key(false), await view_pack(view));
|
|
698
|
+
} else if (entity.type === "page") {
|
|
699
|
+
const page = Page.findOne({ name: entity.name });
|
|
700
|
+
if (page) addDeepSearch(key(), await page_pack(page));
|
|
701
|
+
} else if (entity.type === "trigger") {
|
|
702
|
+
const trigger = Trigger.findOne({ id: entity.id });
|
|
703
|
+
if (trigger) addDeepSearch(key(), await trigger_pack(trigger));
|
|
704
|
+
}
|
|
705
|
+
} catch (e) {
|
|
706
|
+
getState().log?.(
|
|
707
|
+
2,
|
|
708
|
+
`Failed to build deep search index for ${key()}: ${e.message}`
|
|
709
|
+
);
|
|
710
|
+
}
|
|
711
|
+
}
|
|
320
712
|
// fetch roles and tags
|
|
321
|
-
const roles = await
|
|
713
|
+
const roles = await Role.find({}, { orderBy: "id" });
|
|
322
714
|
const tags = await Tag.find();
|
|
323
715
|
const tagEntries = await TagEntry.find();
|
|
324
716
|
const userRoleId = req.user?.role_id ?? Infinity;
|
|
@@ -358,7 +750,7 @@ router.get(
|
|
|
358
750
|
|
|
359
751
|
const filterToggles = div(
|
|
360
752
|
{
|
|
361
|
-
class: "btn-group btn-group-sm",
|
|
753
|
+
class: "btn-group btn-group-sm entity-type-group",
|
|
362
754
|
role: "group",
|
|
363
755
|
"aria-label": "Entity type filters",
|
|
364
756
|
},
|
|
@@ -367,6 +759,7 @@ router.get(
|
|
|
367
759
|
type: "button",
|
|
368
760
|
class: "btn btn-sm btn-outline-primary entity-filter-btn",
|
|
369
761
|
"data-entity-type": "table",
|
|
762
|
+
title: req.__("Show tables (Alt+T)"),
|
|
370
763
|
},
|
|
371
764
|
i({ class: "fas fa-table me-1" }),
|
|
372
765
|
req.__("Tables")
|
|
@@ -376,6 +769,7 @@ router.get(
|
|
|
376
769
|
type: "button",
|
|
377
770
|
class: "btn btn-sm btn-outline-primary entity-filter-btn",
|
|
378
771
|
"data-entity-type": "view",
|
|
772
|
+
title: req.__("Show views (Alt+V)"),
|
|
379
773
|
},
|
|
380
774
|
i({ class: "fas fa-eye me-1" }),
|
|
381
775
|
req.__("Views")
|
|
@@ -385,6 +779,7 @@ router.get(
|
|
|
385
779
|
type: "button",
|
|
386
780
|
class: "btn btn-sm btn-outline-primary entity-filter-btn",
|
|
387
781
|
"data-entity-type": "page",
|
|
782
|
+
title: req.__("Show pages (Alt+P)"),
|
|
388
783
|
},
|
|
389
784
|
i({ class: "fas fa-file me-1" }),
|
|
390
785
|
req.__("Pages")
|
|
@@ -394,21 +789,78 @@ router.get(
|
|
|
394
789
|
type: "button",
|
|
395
790
|
class: "btn btn-sm btn-outline-primary entity-filter-btn",
|
|
396
791
|
"data-entity-type": "trigger",
|
|
792
|
+
title: req.__("Show triggers (Alt+R)"),
|
|
397
793
|
},
|
|
398
794
|
i({ class: "fas fa-play me-1" }),
|
|
399
795
|
req.__("Triggers")
|
|
796
|
+
),
|
|
797
|
+
button(
|
|
798
|
+
{
|
|
799
|
+
type: "button",
|
|
800
|
+
class:
|
|
801
|
+
"btn btn-sm btn-outline-primary entity-filter-btn entity-extended-btn d-none",
|
|
802
|
+
"data-entity-type": "user",
|
|
803
|
+
title: req.__("Show users (Alt+U)"),
|
|
804
|
+
},
|
|
805
|
+
i({ class: "fas fa-user me-1" }),
|
|
806
|
+
req.__("Users")
|
|
807
|
+
),
|
|
808
|
+
button(
|
|
809
|
+
{
|
|
810
|
+
type: "button",
|
|
811
|
+
class:
|
|
812
|
+
"btn btn-sm btn-outline-primary entity-filter-btn entity-extended-btn d-none",
|
|
813
|
+
"data-entity-type": "module",
|
|
814
|
+
title: req.__("Show modules (Alt+M)"),
|
|
815
|
+
},
|
|
816
|
+
i({ class: "fas fa-cube me-1" }),
|
|
817
|
+
req.__("Modules")
|
|
818
|
+
),
|
|
819
|
+
button(
|
|
820
|
+
{
|
|
821
|
+
type: "button",
|
|
822
|
+
class: "btn btn-sm btn-outline-secondary",
|
|
823
|
+
id: "entity-more-btn",
|
|
824
|
+
onclick: "toggleEntityExpanded(true)",
|
|
825
|
+
},
|
|
826
|
+
req.__("More...")
|
|
827
|
+
),
|
|
828
|
+
button(
|
|
829
|
+
{
|
|
830
|
+
type: "button",
|
|
831
|
+
class: "btn btn-sm btn-outline-secondary d-none",
|
|
832
|
+
id: "entity-less-btn",
|
|
833
|
+
onclick: "toggleEntityExpanded(false)",
|
|
834
|
+
},
|
|
835
|
+
req.__("Less...")
|
|
400
836
|
)
|
|
401
837
|
);
|
|
402
838
|
|
|
403
839
|
const searchBox = div(
|
|
404
|
-
{ class: "mb-
|
|
840
|
+
{ class: "input-group mb-2" },
|
|
405
841
|
input({
|
|
406
|
-
type: "
|
|
842
|
+
type: "search",
|
|
407
843
|
class: "form-control",
|
|
408
|
-
|
|
844
|
+
name: "q",
|
|
409
845
|
placeholder: req.__("Search entities by name or type..."),
|
|
846
|
+
"aria-label": req.__("Search entities by name or type..."),
|
|
410
847
|
autocomplete: "off",
|
|
411
|
-
|
|
848
|
+
id: "entity-search",
|
|
849
|
+
}),
|
|
850
|
+
span({ class: "input-group-text" }, [
|
|
851
|
+
input({
|
|
852
|
+
class: "form-check-input mt-0 me-2",
|
|
853
|
+
type: "checkbox",
|
|
854
|
+
id: "entity-deep-search",
|
|
855
|
+
}),
|
|
856
|
+
label(
|
|
857
|
+
{
|
|
858
|
+
class: "form-check-label mb-0",
|
|
859
|
+
for: "entity-deep-search",
|
|
860
|
+
},
|
|
861
|
+
req.__("Deep search")
|
|
862
|
+
),
|
|
863
|
+
])
|
|
412
864
|
);
|
|
413
865
|
|
|
414
866
|
// Tag filter buttons
|
|
@@ -434,11 +886,13 @@ router.get(
|
|
|
434
886
|
// One row for type filters and tag filters
|
|
435
887
|
const filtersRow = div(
|
|
436
888
|
{
|
|
889
|
+
id: "entity-filters-row",
|
|
437
890
|
class:
|
|
438
|
-
"d-flex flex-wrap align-items-center justify-content-between mb-
|
|
891
|
+
"d-flex flex-wrap align-items-center justify-content-between mb-2 gap-2 p-2 border rounded",
|
|
892
|
+
style: "border-color: transparent !important;",
|
|
439
893
|
},
|
|
440
894
|
div(
|
|
441
|
-
{ class: "d-flex align-items-center gap-2" },
|
|
895
|
+
{ class: "d-flex align-items-center gap-2 flex-wrap" },
|
|
442
896
|
span(
|
|
443
897
|
{ class: "me-1 text-muted" },
|
|
444
898
|
i({ class: "fas fa-filter me-1" }),
|
|
@@ -446,7 +900,46 @@ router.get(
|
|
|
446
900
|
),
|
|
447
901
|
filterToggles
|
|
448
902
|
),
|
|
449
|
-
tagFilterBar
|
|
903
|
+
tags.length > 0 ? tagFilterBar : null
|
|
904
|
+
);
|
|
905
|
+
|
|
906
|
+
const selectionBar = div(
|
|
907
|
+
{
|
|
908
|
+
id: "entity-selection-bar",
|
|
909
|
+
class:
|
|
910
|
+
"d-flex flex-wrap align-items-center justify-content-between mb-2 gap-2 d-none p-2 border rounded",
|
|
911
|
+
style:
|
|
912
|
+
"background-color: var(--bs-secondary-bg, var(--bs-secondary-bg-fallback)); border-color: transparent !important;",
|
|
913
|
+
},
|
|
914
|
+
div(
|
|
915
|
+
{ class: "d-flex align-items-center gap-2 flex-wrap" },
|
|
916
|
+
button(
|
|
917
|
+
{
|
|
918
|
+
type: "button",
|
|
919
|
+
class: "btn btn-sm btn-outline-secondary selection-control-btn",
|
|
920
|
+
id: "entity-clear-selection",
|
|
921
|
+
"aria-label": req.__("Clear selection"),
|
|
922
|
+
},
|
|
923
|
+
i({ class: "fas fa-times" })
|
|
924
|
+
),
|
|
925
|
+
span(
|
|
926
|
+
{ id: "entity-selection-count", class: "fw-semibold" },
|
|
927
|
+
req.__("%s selected", "0")
|
|
928
|
+
)
|
|
929
|
+
),
|
|
930
|
+
div(
|
|
931
|
+
{ class: "d-flex align-items-center gap-2 flex-wrap" },
|
|
932
|
+
button(
|
|
933
|
+
{
|
|
934
|
+
type: "button",
|
|
935
|
+
class: "btn btn-sm btn-danger selection-control-btn",
|
|
936
|
+
id: "entity-bulk-delete",
|
|
937
|
+
"aria-label": req.__("Delete selected"),
|
|
938
|
+
disabled: true,
|
|
939
|
+
},
|
|
940
|
+
i({ class: "fas fa-trash" })
|
|
941
|
+
)
|
|
942
|
+
)
|
|
450
943
|
);
|
|
451
944
|
|
|
452
945
|
// Build table
|
|
@@ -473,8 +966,11 @@ router.get(
|
|
|
473
966
|
};
|
|
474
967
|
|
|
475
968
|
const bodyRows = entities.map((entity) => {
|
|
476
|
-
const key = `${entity.type}:${
|
|
969
|
+
const key = `${entity.type}:${
|
|
970
|
+
entity.type === "view" ? entity.name : entity.id
|
|
971
|
+
}`;
|
|
477
972
|
const tagIds = tagsByEntityKey.get(key) || [];
|
|
973
|
+
const deepSearchable = deepSearchIndex[key];
|
|
478
974
|
const tagBadges = tagIds.map((tid) =>
|
|
479
975
|
a(
|
|
480
976
|
{
|
|
@@ -534,9 +1030,9 @@ router.get(
|
|
|
534
1030
|
return a(
|
|
535
1031
|
{
|
|
536
1032
|
href: entity.viewLink,
|
|
537
|
-
class: "
|
|
1033
|
+
class: "link-primary text-decoration-none",
|
|
538
1034
|
},
|
|
539
|
-
i({ class: "fas fa-play me-1" }),
|
|
1035
|
+
// i({ class: "fas fa-play me-1" }),
|
|
540
1036
|
req.__("Run")
|
|
541
1037
|
);
|
|
542
1038
|
}
|
|
@@ -544,9 +1040,9 @@ router.get(
|
|
|
544
1040
|
return a(
|
|
545
1041
|
{
|
|
546
1042
|
href: entity.viewLink,
|
|
547
|
-
class: "
|
|
1043
|
+
class: "link-primary text-decoration-none",
|
|
548
1044
|
},
|
|
549
|
-
i({ class: "fas fa-play me-1" }),
|
|
1045
|
+
// i({ class: "fas fa-play me-1" }),
|
|
550
1046
|
req.__("Run")
|
|
551
1047
|
);
|
|
552
1048
|
}
|
|
@@ -554,9 +1050,9 @@ router.get(
|
|
|
554
1050
|
return a(
|
|
555
1051
|
{
|
|
556
1052
|
href: `/actions/testrun/${entity.id}${on_done_redirect_str}`,
|
|
557
|
-
class: "
|
|
1053
|
+
class: "link-primary text-decoration-none text-nowrap",
|
|
558
1054
|
},
|
|
559
|
-
i({ class: "fas fa-running me-1" }),
|
|
1055
|
+
// i({ class: "fas fa-running me-1" }),
|
|
560
1056
|
req.__("Test run")
|
|
561
1057
|
);
|
|
562
1058
|
}
|
|
@@ -567,19 +1063,23 @@ router.get(
|
|
|
567
1063
|
class: "entity-row",
|
|
568
1064
|
"data-entity-type": entity.type,
|
|
569
1065
|
"data-entity-name": entity.name.toLowerCase(),
|
|
1066
|
+
"data-entity-label": entity.name,
|
|
1067
|
+
"data-entity-id": entity?.id ?? "",
|
|
1068
|
+
"data-entity-key": key,
|
|
570
1069
|
"data-searchable": searchableValues.join(" "),
|
|
1070
|
+
"data-deep-searchable": deepSearchable || searchableValues.join(" "),
|
|
571
1071
|
"data-tags": tagIds.join(" "),
|
|
572
1072
|
},
|
|
573
1073
|
td(entityTypeBadge(entity.type)),
|
|
574
1074
|
td(
|
|
575
1075
|
entity.type === "view" &&
|
|
576
|
-
|
|
577
|
-
|
|
1076
|
+
!entity.metadata.table_id &&
|
|
1077
|
+
!entity.metadata.has_config
|
|
578
1078
|
? span({ class: "fw-bold" }, text(entity.name))
|
|
579
1079
|
: a({ href: mainLinkHref, class: "fw-bold" }, text(entity.name))
|
|
580
1080
|
),
|
|
581
1081
|
td(runCell),
|
|
582
|
-
td(detailsContent(entity, req)),
|
|
1082
|
+
td(detailsContent(entity, req, roles)),
|
|
583
1083
|
td(
|
|
584
1084
|
text(
|
|
585
1085
|
roleLabel(
|
|
@@ -631,33 +1131,147 @@ router.get(
|
|
|
631
1131
|
);
|
|
632
1132
|
|
|
633
1133
|
const clientScript = script(
|
|
634
|
-
domReady(`
|
|
1134
|
+
domReady(/*js*/ `
|
|
635
1135
|
const searchInput = document.getElementById("entity-search");
|
|
1136
|
+
const deepSearchToggle = document.getElementById("entity-deep-search");
|
|
636
1137
|
const entitiesList = document.getElementById("entities-list");
|
|
637
1138
|
const noResults = document.getElementById("no-results");
|
|
638
1139
|
const filterButtons = document.querySelectorAll(".entity-filter-btn");
|
|
639
|
-
const
|
|
1140
|
+
const filterButtonsByType = {};
|
|
1141
|
+
filterButtons.forEach((btn) => {
|
|
1142
|
+
const type = btn.dataset.entityType;
|
|
1143
|
+
if (type) filterButtonsByType[type] = btn;
|
|
1144
|
+
});
|
|
640
1145
|
const tagButtons = document.querySelectorAll(".tag-filter-btn");
|
|
641
1146
|
const LEGACY_LINK_META = ${JSON.stringify(legacyLinkMeta)};
|
|
642
1147
|
const legacyButton = document.getElementById("legacy-entity-link");
|
|
643
1148
|
const legacyLabel = legacyButton ? legacyButton.querySelector(".legacy-label") : null;
|
|
1149
|
+
const filtersRow = document.getElementById("entity-filters-row");
|
|
1150
|
+
const selectionBar = document.getElementById("entity-selection-bar");
|
|
1151
|
+
const selectionCountEl = document.getElementById("entity-selection-count");
|
|
1152
|
+
const clearSelectionBtn = document.getElementById("entity-clear-selection");
|
|
1153
|
+
const bulkDeleteBtn = document.getElementById("entity-bulk-delete");
|
|
1154
|
+
const entitiesTbody = entitiesList ? entitiesList.querySelector("tbody") : null;
|
|
1155
|
+
|
|
1156
|
+
const TXT_SELECTED = ${JSON.stringify(req.__("selected"))};
|
|
1157
|
+
const TXT_DELETE_SELECTED_CONFIRM = ${JSON.stringify(req.__("Delete %s selected items?"))};
|
|
1158
|
+
const TXT_DELETE_SELECTED_FALLBACK = ${JSON.stringify(req.__("Delete selected items?"))};
|
|
1159
|
+
const TXT_DELETE_FAILED = ${JSON.stringify(req.__("Failed to delete selected items"))};
|
|
1160
|
+
|
|
1161
|
+
const BASE_TYPES = ["table","view","page","trigger"];
|
|
1162
|
+
const EXTENDED_TYPES = window.ENTITY_EXTENDED_TYPES || ["module","user"];
|
|
1163
|
+
const ALL_TYPES = BASE_TYPES.concat(EXTENDED_TYPES);
|
|
1164
|
+
|
|
1165
|
+
const selectedKeys = new Set();
|
|
1166
|
+
let lastSelectedIndex = null;
|
|
1167
|
+
|
|
1168
|
+
const isRowSelectable = (row) => {
|
|
1169
|
+
if (!row) return false;
|
|
1170
|
+
const type = row.dataset.entityType;
|
|
1171
|
+
const installed = row.dataset.installed !== 'false';
|
|
1172
|
+
if (type === 'module' && !installed) return false;
|
|
1173
|
+
return true;
|
|
1174
|
+
};
|
|
1175
|
+
|
|
1176
|
+
const findRowByKey = (key) =>
|
|
1177
|
+
Array.from(document.querySelectorAll('.entity-row')).find(
|
|
1178
|
+
(row) => row.dataset.entityKey === key
|
|
1179
|
+
);
|
|
1180
|
+
|
|
1181
|
+
const selectionPayloadFromRow = (row) => {
|
|
1182
|
+
if (!row) return null;
|
|
1183
|
+
return {
|
|
1184
|
+
key: row.dataset.entityKey,
|
|
1185
|
+
type: row.dataset.entityType,
|
|
1186
|
+
id: row.dataset.entityId || null,
|
|
1187
|
+
name: row.dataset.entityLabel || row.dataset.entityName || "",
|
|
1188
|
+
};
|
|
1189
|
+
};
|
|
1190
|
+
|
|
1191
|
+
const getVisibleRows = () =>
|
|
1192
|
+
Array.from(document.querySelectorAll('.entity-row')).filter(
|
|
1193
|
+
(row) => row.style.display !== 'none'
|
|
1194
|
+
);
|
|
1195
|
+
|
|
1196
|
+
const getSelectableVisibleRows = () =>
|
|
1197
|
+
getVisibleRows().filter((row) => isRowSelectable(row));
|
|
1198
|
+
|
|
1199
|
+
const isTypingTarget = (el) => {
|
|
1200
|
+
if (!el) return false;
|
|
1201
|
+
if (el.isContentEditable) return true;
|
|
1202
|
+
const tag = el.tagName;
|
|
1203
|
+
if (!tag) return false;
|
|
1204
|
+
const tagName = tag.toUpperCase();
|
|
1205
|
+
if (tagName === 'INPUT' || tagName === 'TEXTAREA' || tagName === 'SELECT') return true;
|
|
1206
|
+
return !!el.closest('[contenteditable="true"]');
|
|
1207
|
+
};
|
|
1208
|
+
|
|
1209
|
+
const refreshSelectionStyles = () => {
|
|
1210
|
+
document.querySelectorAll('.entity-row').forEach((row) => {
|
|
1211
|
+
const key = row.dataset.entityKey;
|
|
1212
|
+
if (!isRowSelectable(row) && selectedKeys.has(key)) {
|
|
1213
|
+
selectedKeys.delete(key);
|
|
1214
|
+
}
|
|
1215
|
+
if (selectedKeys.has(key)) {
|
|
1216
|
+
row.classList.add('table-active', 'entity-row-selected');
|
|
1217
|
+
} else {
|
|
1218
|
+
row.classList.remove('table-active', 'entity-row-selected');
|
|
1219
|
+
}
|
|
1220
|
+
});
|
|
1221
|
+
};
|
|
1222
|
+
|
|
1223
|
+
const updateSelectionUI = () => {
|
|
1224
|
+
refreshSelectionStyles();
|
|
1225
|
+
const count = selectedKeys.size ?? 0;
|
|
1226
|
+
if (selectionCountEl) {
|
|
1227
|
+
const suffix = TXT_SELECTED || 'selected';
|
|
1228
|
+
selectionCountEl.textContent = count + ' ' + suffix;
|
|
1229
|
+
}
|
|
1230
|
+
if (filtersRow && selectionBar) {
|
|
1231
|
+
if (count > 0) {
|
|
1232
|
+
filtersRow.classList.add('d-none');
|
|
1233
|
+
selectionBar.classList.remove('d-none');
|
|
1234
|
+
} else {
|
|
1235
|
+
filtersRow.classList.remove('d-none');
|
|
1236
|
+
selectionBar.classList.add('d-none');
|
|
1237
|
+
}
|
|
1238
|
+
}
|
|
1239
|
+
if (bulkDeleteBtn) bulkDeleteBtn.disabled = count === 0;
|
|
1240
|
+
if (clearSelectionBtn) clearSelectionBtn.disabled = count === 0;
|
|
1241
|
+
};
|
|
1242
|
+
|
|
1243
|
+
const clearSelection = () => {
|
|
1244
|
+
selectedKeys.clear();
|
|
1245
|
+
lastSelectedIndex = null;
|
|
1246
|
+
updateSelectionUI();
|
|
1247
|
+
};
|
|
644
1248
|
|
|
645
1249
|
// Track active filters
|
|
646
1250
|
const activeFilters = new Set([]);
|
|
647
1251
|
const activeTags = new Set([]);
|
|
1252
|
+
const isModulesFilterExclusive = () =>
|
|
1253
|
+
activeFilters.size === 1 && activeFilters.has("module");
|
|
1254
|
+
window.isModulesFilterExclusive = isModulesFilterExclusive;
|
|
648
1255
|
|
|
649
1256
|
// URL state helpers
|
|
650
|
-
const TYPES = ["table","view","page","trigger"];
|
|
651
1257
|
const updateUrl = () => {
|
|
652
1258
|
const params = new URLSearchParams(window.location.search);
|
|
653
1259
|
// search
|
|
654
1260
|
if (searchInput.value) params.set('q', searchInput.value);
|
|
655
1261
|
else params.delete('q');
|
|
1262
|
+
if (deepSearchToggle && deepSearchToggle.checked) params.set('deep', 'on');
|
|
1263
|
+
else params.delete('deep');
|
|
656
1264
|
// types
|
|
657
|
-
|
|
1265
|
+
ALL_TYPES.forEach(t => {
|
|
658
1266
|
if (activeFilters.has(t)) params.set(t+'s', 'on');
|
|
659
1267
|
else params.delete(t+'s');
|
|
660
1268
|
});
|
|
1269
|
+
// extended flag
|
|
1270
|
+
if (typeof isExtendedExpanded !== 'undefined' && isExtendedExpanded) {
|
|
1271
|
+
params.set('extended', 'on');
|
|
1272
|
+
} else {
|
|
1273
|
+
params.delete('extended');
|
|
1274
|
+
}
|
|
661
1275
|
// tags (comma-separated ids)
|
|
662
1276
|
if (activeTags.size > 0) params.set('tags', Array.from(activeTags).join(','));
|
|
663
1277
|
else params.delete('tags');
|
|
@@ -665,35 +1279,53 @@ router.get(
|
|
|
665
1279
|
window.history.replaceState(null, '', newUrl);
|
|
666
1280
|
};
|
|
667
1281
|
|
|
668
|
-
const
|
|
1282
|
+
const getCurrentOnDoneTarget = () => {
|
|
669
1283
|
const path = window.location.pathname.startsWith("/")
|
|
670
1284
|
? window.location.pathname.slice(1)
|
|
671
1285
|
: window.location.pathname;
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
}
|
|
1286
|
+
return path + window.location.search;
|
|
1287
|
+
};
|
|
1288
|
+
|
|
1289
|
+
const shouldSkipOnDoneHref = (raw) => {
|
|
1290
|
+
if (!raw) return true;
|
|
1291
|
+
const trimmed = raw.trim();
|
|
1292
|
+
const lowered = trimmed.toLowerCase();
|
|
1293
|
+
return trimmed === "#" || trimmed === "" || lowered.startsWith("javascript:");
|
|
1294
|
+
};
|
|
1295
|
+
|
|
1296
|
+
const toRelativeHrefWithOnDone = (raw) => {
|
|
1297
|
+
if (shouldSkipOnDoneHref(raw)) return null;
|
|
1298
|
+
try {
|
|
1299
|
+
const url = new URL(raw, window.location.origin);
|
|
1300
|
+
url.searchParams.set("on_done_redirect", getCurrentOnDoneTarget());
|
|
1301
|
+
return url.pathname + url.search + url.hash;
|
|
1302
|
+
} catch (e) {
|
|
1303
|
+
return null;
|
|
1304
|
+
}
|
|
1305
|
+
};
|
|
1306
|
+
|
|
1307
|
+
const updateElementOnDoneHref = (el, attr) => {
|
|
1308
|
+
const raw = el.getAttribute(attr) || el[attr];
|
|
1309
|
+
const updated = toRelativeHrefWithOnDone(raw);
|
|
1310
|
+
if (updated) el.setAttribute(attr, updated);
|
|
1311
|
+
};
|
|
1312
|
+
|
|
1313
|
+
const ensureOnDoneHiddenInput = (form) => {
|
|
1314
|
+
if (form.querySelector('input[name="on_done_redirect"]')) return;
|
|
1315
|
+
const hidden = document.createElement('input');
|
|
1316
|
+
hidden.type = 'hidden';
|
|
1317
|
+
hidden.name = 'on_done_redirect';
|
|
1318
|
+
hidden.value = getCurrentOnDoneTarget();
|
|
1319
|
+
form.appendChild(hidden);
|
|
1320
|
+
};
|
|
1321
|
+
|
|
1322
|
+
const updateOnDoneRedirectTargets = () => {
|
|
691
1323
|
document
|
|
692
1324
|
.querySelectorAll('a[href*="on_done_redirect="]')
|
|
693
|
-
.forEach((link) =>
|
|
1325
|
+
.forEach((link) => updateElementOnDoneHref(link, "href"));
|
|
694
1326
|
document
|
|
695
1327
|
.querySelectorAll('form[action*="on_done_redirect="]')
|
|
696
|
-
.forEach((form) =>
|
|
1328
|
+
.forEach((form) => updateElementOnDoneHref(form, "action"));
|
|
697
1329
|
};
|
|
698
1330
|
|
|
699
1331
|
const updateLegacyButton = () => {
|
|
@@ -716,8 +1348,13 @@ router.get(
|
|
|
716
1348
|
// search
|
|
717
1349
|
const q = params.get('q') || '';
|
|
718
1350
|
if (q) searchInput.value = q;
|
|
1351
|
+
const deep = params.get('deep') === 'on';
|
|
1352
|
+
if (deep && deepSearchToggle) deepSearchToggle.checked = true;
|
|
1353
|
+
const shouldExpandExtended =
|
|
1354
|
+
params.get('extended') === 'on' ||
|
|
1355
|
+
EXTENDED_TYPES.some((t) => params.get(t + 's') === 'on');
|
|
719
1356
|
// types
|
|
720
|
-
|
|
1357
|
+
ALL_TYPES.forEach(t => {
|
|
721
1358
|
if (params.get(t+'s') === 'on') activeFilters.add(t);
|
|
722
1359
|
});
|
|
723
1360
|
// apply button classes for types
|
|
@@ -741,17 +1378,39 @@ router.get(
|
|
|
741
1378
|
btn.classList.remove('btn-outline-secondary');
|
|
742
1379
|
}
|
|
743
1380
|
});
|
|
1381
|
+
return { shouldExpandExtended };
|
|
744
1382
|
};
|
|
745
1383
|
|
|
746
1384
|
// Filter function
|
|
747
1385
|
function filterEntities() {
|
|
1386
|
+
const entityRows = document.querySelectorAll(".entity-row");
|
|
748
1387
|
const searchTerm = searchInput.value.toLowerCase();
|
|
1388
|
+
const useDeep = deepSearchToggle && deepSearchToggle.checked;
|
|
749
1389
|
let visibleCount = 0;
|
|
1390
|
+
const visibleKeys = new Set();
|
|
1391
|
+
const allowAllModules = isModulesFilterExclusive();
|
|
1392
|
+
const canShowAllModules =
|
|
1393
|
+
allowAllModules && typeof isExtendedExpanded !== "undefined" && isExtendedExpanded;
|
|
1394
|
+
if (
|
|
1395
|
+
canShowAllModules &&
|
|
1396
|
+
typeof ensureAllModulesLoaded === "function" &&
|
|
1397
|
+
typeof hasLoadedAllModules !== "undefined" &&
|
|
1398
|
+
!hasLoadedAllModules
|
|
1399
|
+
) {
|
|
1400
|
+
ensureAllModulesLoaded();
|
|
1401
|
+
}
|
|
750
1402
|
|
|
751
|
-
entityRows.forEach((row) => {
|
|
1403
|
+
entityRows.forEach((row, id) => {
|
|
752
1404
|
const entityType = row.dataset.entityType;
|
|
753
|
-
const
|
|
1405
|
+
const key = row.dataset.entityKey;
|
|
1406
|
+
const deepText =
|
|
1407
|
+
useDeep && window.ENTITY_DEEP_SEARCH
|
|
1408
|
+
? window.ENTITY_DEEP_SEARCH[key]
|
|
1409
|
+
: null;
|
|
1410
|
+
const searchableText = useDeep ? deepText || row.dataset.deepSearchable || "" : row.dataset.searchable || "";
|
|
1411
|
+
|
|
754
1412
|
const rowTags = (row.dataset.tags || "").split(" ").filter(Boolean);
|
|
1413
|
+
const rowInstalled = row.dataset.installed !== "false";
|
|
755
1414
|
|
|
756
1415
|
// Check if entity type is active
|
|
757
1416
|
const typeMatch = activeFilters.has(entityType);
|
|
@@ -768,15 +1427,28 @@ router.get(
|
|
|
768
1427
|
tagMatch = rowTags.some((tid) => activeTags.has(tid));
|
|
769
1428
|
}
|
|
770
1429
|
|
|
1430
|
+
const moduleVisibilityOk =
|
|
1431
|
+
entityType !== "module" || rowInstalled || canShowAllModules;
|
|
1432
|
+
|
|
771
1433
|
// Show/hide row
|
|
772
|
-
if (
|
|
1434
|
+
if (
|
|
1435
|
+
(activeFilters.size === 0 || typeMatch) &&
|
|
1436
|
+
searchMatch &&
|
|
1437
|
+
tagMatch &&
|
|
1438
|
+
moduleVisibilityOk
|
|
1439
|
+
) {
|
|
773
1440
|
row.style.display = "";
|
|
1441
|
+
visibleKeys.add(row.dataset.entityKey);
|
|
774
1442
|
visibleCount++;
|
|
775
1443
|
} else {
|
|
776
1444
|
row.style.display = "none";
|
|
777
1445
|
}
|
|
778
1446
|
});
|
|
779
1447
|
|
|
1448
|
+
selectedKeys.forEach((key) => {
|
|
1449
|
+
if (!visibleKeys.has(key)) selectedKeys.delete(key);
|
|
1450
|
+
});
|
|
1451
|
+
|
|
780
1452
|
// Show/hide no results message
|
|
781
1453
|
if (visibleCount === 0) {
|
|
782
1454
|
entitiesList.parentElement.classList.add("d-none");
|
|
@@ -789,10 +1461,20 @@ router.get(
|
|
|
789
1461
|
updateUrl();
|
|
790
1462
|
updateOnDoneRedirectTargets();
|
|
791
1463
|
updateLegacyButton();
|
|
1464
|
+
updateSelectionUI();
|
|
792
1465
|
}
|
|
793
1466
|
|
|
794
1467
|
// Search input handler
|
|
795
1468
|
searchInput.addEventListener("input", filterEntities);
|
|
1469
|
+
searchInput.addEventListener("keydown", (e) => {
|
|
1470
|
+
if (e.key === "Escape" || e.key === "Esc") {
|
|
1471
|
+
e.preventDefault();
|
|
1472
|
+
searchInput.blur();
|
|
1473
|
+
}
|
|
1474
|
+
});
|
|
1475
|
+
if (deepSearchToggle) {
|
|
1476
|
+
deepSearchToggle.addEventListener("change", filterEntities);
|
|
1477
|
+
}
|
|
796
1478
|
|
|
797
1479
|
// Filter button handlers
|
|
798
1480
|
filterButtons.forEach((btn) => {
|
|
@@ -810,6 +1492,9 @@ router.get(
|
|
|
810
1492
|
}
|
|
811
1493
|
|
|
812
1494
|
filterEntities();
|
|
1495
|
+
if (searchInput && typeof searchInput.focus === 'function') {
|
|
1496
|
+
searchInput.focus({ preventScroll: true });
|
|
1497
|
+
}
|
|
813
1498
|
});
|
|
814
1499
|
});
|
|
815
1500
|
|
|
@@ -830,22 +1515,236 @@ router.get(
|
|
|
830
1515
|
});
|
|
831
1516
|
});
|
|
832
1517
|
|
|
1518
|
+
const keyboardShortcutTypeMap = {
|
|
1519
|
+
KeyT: "table",
|
|
1520
|
+
KeyV: "view",
|
|
1521
|
+
KeyP: "page",
|
|
1522
|
+
KeyR: "trigger",
|
|
1523
|
+
KeyM: "module",
|
|
1524
|
+
KeyU: "user",
|
|
1525
|
+
};
|
|
1526
|
+
|
|
1527
|
+
document.addEventListener("keydown", (e) => {
|
|
1528
|
+
const isFromSearchInput = e.target === searchInput;
|
|
1529
|
+
const typingTarget = isTypingTarget(e.target);
|
|
1530
|
+
|
|
1531
|
+
if (e.altKey && !e.ctrlKey && !e.metaKey) {
|
|
1532
|
+
const type = keyboardShortcutTypeMap[e.code];
|
|
1533
|
+
if (type) {
|
|
1534
|
+
const isExtendedType = EXTENDED_TYPES.includes(type);
|
|
1535
|
+
if (isExtendedType && typeof isExtendedExpanded !== "undefined" && !isExtendedExpanded) {
|
|
1536
|
+
return;
|
|
1537
|
+
}
|
|
1538
|
+
const btn = filterButtonsByType[type];
|
|
1539
|
+
if (btn) {
|
|
1540
|
+
e.preventDefault();
|
|
1541
|
+
btn.click();
|
|
1542
|
+
if (searchInput && typeof searchInput.focus === 'function') {
|
|
1543
|
+
searchInput.focus({ preventScroll: true });
|
|
1544
|
+
}
|
|
1545
|
+
}
|
|
1546
|
+
return;
|
|
1547
|
+
}
|
|
1548
|
+
return;
|
|
1549
|
+
}
|
|
1550
|
+
if (typingTarget && !isFromSearchInput) return;
|
|
1551
|
+
|
|
1552
|
+
const isSelectAllKey = e.key === "a" || e.key === "A";
|
|
1553
|
+
if ((e.metaKey || e.ctrlKey) && !e.altKey && isSelectAllKey) {
|
|
1554
|
+
const visibleRows = getSelectableVisibleRows();
|
|
1555
|
+
if (!visibleRows.length) return;
|
|
1556
|
+
e.preventDefault();
|
|
1557
|
+
visibleRows.forEach((row) => {
|
|
1558
|
+
const key = row.dataset.entityKey;
|
|
1559
|
+
if (key) selectedKeys.add(key);
|
|
1560
|
+
});
|
|
1561
|
+
lastSelectedIndex = visibleRows.length - 1;
|
|
1562
|
+
updateSelectionUI();
|
|
1563
|
+
}
|
|
1564
|
+
});
|
|
1565
|
+
|
|
1566
|
+
if (clearSelectionBtn) {
|
|
1567
|
+
clearSelectionBtn.addEventListener('click', () => {
|
|
1568
|
+
clearSelection();
|
|
1569
|
+
filterEntities();
|
|
1570
|
+
});
|
|
1571
|
+
}
|
|
1572
|
+
|
|
1573
|
+
const collectSelectionItems = () =>
|
|
1574
|
+
Array.from(selectedKeys)
|
|
1575
|
+
.map((key) => selectionPayloadFromRow(findRowByKey(key)))
|
|
1576
|
+
.filter(Boolean);
|
|
1577
|
+
|
|
1578
|
+
const formatDeleteError = (err) => {
|
|
1579
|
+
const displayType = err?.isPack
|
|
1580
|
+
? "Pack"
|
|
1581
|
+
: (() => {
|
|
1582
|
+
const t = (err?.type || "").toString();
|
|
1583
|
+
if (!t) return "Item";
|
|
1584
|
+
return t.charAt(0).toUpperCase() + t.slice(1);
|
|
1585
|
+
})();
|
|
1586
|
+
const label = err?.name || err?.id || err?.key || "(unknown)";
|
|
1587
|
+
const message = err?.message || TXT_DELETE_FAILED || "Failed to delete selected items";
|
|
1588
|
+
return displayType + " (" + label + "): " + message;
|
|
1589
|
+
};
|
|
1590
|
+
|
|
1591
|
+
const showBulkDeleteErrors = (errs) => {
|
|
1592
|
+
if (!errs || !errs.length) return;
|
|
1593
|
+
const body = errs
|
|
1594
|
+
.map((e) => formatDeleteError(e))
|
|
1595
|
+
.join("\\n-----\\n");
|
|
1596
|
+
alert(body);
|
|
1597
|
+
};
|
|
1598
|
+
|
|
1599
|
+
const removeRowsByKeys = (keysToRemove) => {
|
|
1600
|
+
if (!keysToRemove || !keysToRemove.size) return;
|
|
1601
|
+
document.querySelectorAll('.entity-row').forEach((row) => {
|
|
1602
|
+
if (keysToRemove.has(row.dataset.entityKey)) row.remove();
|
|
1603
|
+
});
|
|
1604
|
+
};
|
|
1605
|
+
|
|
1606
|
+
const refreshExtendedEntitiesAfterDelete = async () => {
|
|
1607
|
+
if (typeof isExtendedExpanded !== 'undefined' && !isExtendedExpanded) return;
|
|
1608
|
+
if (typeof loadExtendedEntities !== 'function' || typeof renderExtendedEntityRows !== 'function') return;
|
|
1609
|
+
const tbody = document.querySelector('#entities-list tbody');
|
|
1610
|
+
if (!tbody) return;
|
|
1611
|
+
const shouldLoadAll = typeof window.isModulesFilterExclusive === 'function'
|
|
1612
|
+
? window.isModulesFilterExclusive()
|
|
1613
|
+
: false;
|
|
1614
|
+
try {
|
|
1615
|
+
const extendedEntities = await loadExtendedEntities(shouldLoadAll);
|
|
1616
|
+
window.extendedEntities = extendedEntities;
|
|
1617
|
+
renderExtendedEntityRows(extendedEntities, tbody);
|
|
1618
|
+
} catch (err) {
|
|
1619
|
+
console.error('Failed to refresh extended entities after delete:', err);
|
|
1620
|
+
}
|
|
1621
|
+
};
|
|
1622
|
+
|
|
1623
|
+
if (bulkDeleteBtn) {
|
|
1624
|
+
bulkDeleteBtn.addEventListener('click', async () => {
|
|
1625
|
+
const items = collectSelectionItems();
|
|
1626
|
+
if (!items.length) return;
|
|
1627
|
+
const template = TXT_DELETE_SELECTED_CONFIRM || TXT_DELETE_SELECTED_FALLBACK;
|
|
1628
|
+
const msg = template.includes('%s')
|
|
1629
|
+
? template.replace('%s', items.length)
|
|
1630
|
+
: template;
|
|
1631
|
+
if (!window.confirm(msg)) return;
|
|
1632
|
+
bulkDeleteBtn.disabled = true;
|
|
1633
|
+
try {
|
|
1634
|
+
const res = await fetch('/entities/bulk-delete', {
|
|
1635
|
+
method: 'POST',
|
|
1636
|
+
headers: {
|
|
1637
|
+
'Content-Type': 'application/json',
|
|
1638
|
+
'CSRF-Token': window._sc_globalCsrf || '',
|
|
1639
|
+
},
|
|
1640
|
+
body: JSON.stringify({ items }),
|
|
1641
|
+
});
|
|
1642
|
+
if (!res.ok) throw new Error(await res.text());
|
|
1643
|
+
const payload = await res.json();
|
|
1644
|
+
const keysToRemove = new Set(
|
|
1645
|
+
(payload.deletedKeys && payload.deletedKeys.length
|
|
1646
|
+
? payload.deletedKeys
|
|
1647
|
+
: items.map((i) => i.key))
|
|
1648
|
+
);
|
|
1649
|
+
removeRowsByKeys(keysToRemove);
|
|
1650
|
+
if (payload.errors && payload.errors.length) {
|
|
1651
|
+
console.error('Bulk delete errors', payload.errors);
|
|
1652
|
+
showBulkDeleteErrors(payload.errors);
|
|
1653
|
+
}
|
|
1654
|
+
clearSelection();
|
|
1655
|
+
await refreshExtendedEntitiesAfterDelete();
|
|
1656
|
+
filterEntities();
|
|
1657
|
+
} catch (e) {
|
|
1658
|
+
console.error(e);
|
|
1659
|
+
alert(TXT_DELETE_FAILED || 'Failed to delete selected items');
|
|
1660
|
+
}
|
|
1661
|
+
bulkDeleteBtn.disabled = false;
|
|
1662
|
+
});
|
|
1663
|
+
}
|
|
1664
|
+
|
|
1665
|
+
if (entitiesTbody) {
|
|
1666
|
+
entitiesTbody.addEventListener('click', (e) => {
|
|
1667
|
+
const row = e.target.closest('.entity-row');
|
|
1668
|
+
if (!row) return;
|
|
1669
|
+
if (e.target.closest('a, button, input, select, textarea, label'))
|
|
1670
|
+
return;
|
|
1671
|
+
if (!isRowSelectable(row)) {
|
|
1672
|
+
lastSelectedIndex = null;
|
|
1673
|
+
return;
|
|
1674
|
+
}
|
|
1675
|
+
const visibleRows = getSelectableVisibleRows();
|
|
1676
|
+
const index = visibleRows.indexOf(row);
|
|
1677
|
+
const key = row.dataset.entityKey;
|
|
1678
|
+
if (!key) return;
|
|
1679
|
+
const isShift = e.shiftKey;
|
|
1680
|
+
const isMeta = e.metaKey || e.ctrlKey;
|
|
1681
|
+
|
|
1682
|
+
if (isShift && lastSelectedIndex !== null && visibleRows[lastSelectedIndex]) {
|
|
1683
|
+
selectedKeys.clear();
|
|
1684
|
+
const start = Math.min(lastSelectedIndex, index);
|
|
1685
|
+
const end = Math.max(lastSelectedIndex, index);
|
|
1686
|
+
for (let i = start; i <= end; i++) {
|
|
1687
|
+
const rangeKey = visibleRows[i].dataset.entityKey;
|
|
1688
|
+
if (rangeKey) selectedKeys.add(rangeKey);
|
|
1689
|
+
}
|
|
1690
|
+
} else if (isMeta) {
|
|
1691
|
+
if (selectedKeys.has(key)) {
|
|
1692
|
+
selectedKeys.delete(key);
|
|
1693
|
+
} else {
|
|
1694
|
+
selectedKeys.add(key);
|
|
1695
|
+
}
|
|
1696
|
+
lastSelectedIndex = index;
|
|
1697
|
+
} else {
|
|
1698
|
+
selectedKeys.clear();
|
|
1699
|
+
selectedKeys.add(key);
|
|
1700
|
+
lastSelectedIndex = index;
|
|
1701
|
+
}
|
|
1702
|
+
updateSelectionUI();
|
|
1703
|
+
});
|
|
1704
|
+
}
|
|
1705
|
+
|
|
833
1706
|
// Init from URL and run first filter
|
|
834
|
-
initFromUrl();
|
|
835
|
-
|
|
1707
|
+
const { shouldExpandExtended } = initFromUrl();
|
|
1708
|
+
if (shouldExpandExtended) {
|
|
1709
|
+
toggleEntityExpanded(true);
|
|
1710
|
+
} else {
|
|
1711
|
+
filterEntities();
|
|
1712
|
+
}
|
|
836
1713
|
// Focus search on load
|
|
837
1714
|
searchInput.focus();
|
|
1715
|
+
updateSelectionUI();
|
|
838
1716
|
`)
|
|
839
1717
|
);
|
|
840
1718
|
|
|
841
|
-
const styles = `
|
|
1719
|
+
const styles = /*css*/ `
|
|
842
1720
|
<style>
|
|
1721
|
+
/* Temporary fallback selection bg color */
|
|
1722
|
+
:root {
|
|
1723
|
+
--bs-secondary-bg-fallback: #ececec;
|
|
1724
|
+
}
|
|
1725
|
+
[data-bs-theme="dark"] {
|
|
1726
|
+
--bs-secondary-bg-fallback: #2c2c2c;
|
|
1727
|
+
}
|
|
843
1728
|
.entity-row td { vertical-align: middle; }
|
|
844
|
-
.entity-
|
|
1729
|
+
.entity-row { user-select: none; }
|
|
1730
|
+
.entity-row-selection-disabled {
|
|
1731
|
+
cursor: not-allowed;
|
|
1732
|
+
/* opacity: 0.8; */
|
|
1733
|
+
}
|
|
1734
|
+
.entity-filter-btn { transition: all 0.15s ease-in-out; max-width: 105px; }
|
|
845
1735
|
.tag-filter-btn { transition: all 0.15s ease-in-out; }
|
|
846
1736
|
/* Show plus badge only on hover over tag cell */
|
|
847
1737
|
td:nth-child(6) .add-tag { visibility: hidden; cursor: pointer; }
|
|
848
1738
|
tr:hover td:nth-child(6) .add-tag { visibility: visible; }
|
|
1739
|
+
|
|
1740
|
+
#entity-more-btn:not(.d-none) {
|
|
1741
|
+
border-top-right-radius: 0.25rem !important;
|
|
1742
|
+
border-bottom-right-radius: 0.25rem !important;
|
|
1743
|
+
max-width: 80px;
|
|
1744
|
+
}
|
|
1745
|
+
#entity-less-btn:not(.d-none) {
|
|
1746
|
+
max-width: 80px;
|
|
1747
|
+
}
|
|
849
1748
|
</style>
|
|
850
1749
|
`;
|
|
851
1750
|
|
|
@@ -862,16 +1761,333 @@ router.get(
|
|
|
862
1761
|
title: req.__("All entities"),
|
|
863
1762
|
contents: [
|
|
864
1763
|
div(
|
|
865
|
-
{ class: "d-flex flex-column gap-
|
|
1764
|
+
{ class: "d-flex flex-column gap-0" },
|
|
866
1765
|
searchBox,
|
|
867
1766
|
filtersRow,
|
|
1767
|
+
selectionBar,
|
|
868
1768
|
div(
|
|
869
1769
|
{ class: "flex-grow-1 card-max-full-screen-scroll" },
|
|
870
1770
|
entitiesList,
|
|
871
1771
|
noResultsMessage
|
|
872
1772
|
)
|
|
873
1773
|
),
|
|
874
|
-
clientScript,
|
|
1774
|
+
// clientScript,
|
|
1775
|
+
script(
|
|
1776
|
+
domReady(/*js*/ `
|
|
1777
|
+
window.ENTITY_ROLES = ${JSON.stringify(roles)};
|
|
1778
|
+
window.TXT_DISABLED = ${JSON.stringify(req.__("Disabled"))};
|
|
1779
|
+
window.TXT_CONFIGURABLE = ${JSON.stringify(req.__("Configurable"))};
|
|
1780
|
+
window.TXT_THEME = ${JSON.stringify(req.__("Theme"))};
|
|
1781
|
+
window.TXT_LOCAL = ${JSON.stringify(req.__("Local"))};
|
|
1782
|
+
window.TXT_INSTALLED = ${JSON.stringify(req.__("Installed"))};
|
|
1783
|
+
window.TXT_MODULE = ${JSON.stringify(req.__("Module"))};
|
|
1784
|
+
window.TXT_PACK = ${JSON.stringify(req.__("Pack"))};
|
|
1785
|
+
window.TXT_INFO = ${JSON.stringify(req.__("Info"))};
|
|
1786
|
+
window.TXT_AUTH = ${JSON.stringify(req.__("Authentication"))};
|
|
1787
|
+
window.TXT_MOBILE = ${JSON.stringify(req.__("Mobile"))};
|
|
1788
|
+
window.ENTITY_DEEP_SEARCH = ${JSON.stringify(deepSearchIndex)};
|
|
1789
|
+
|
|
1790
|
+
const EXTENDED_ENTITY_TYPES = ["module","user"];
|
|
1791
|
+
window.ENTITY_EXTENDED_TYPES = EXTENDED_ENTITY_TYPES;
|
|
1792
|
+
let isExtendedExpanded = false;
|
|
1793
|
+
let hasLoadedAllModules = false;
|
|
1794
|
+
let isLoadingAllModules = false;
|
|
1795
|
+
const clearExtendedTypeFilters = () => {
|
|
1796
|
+
if (typeof activeFilters === 'undefined') return;
|
|
1797
|
+
EXTENDED_ENTITY_TYPES.forEach((type) => {
|
|
1798
|
+
if (activeFilters.has(type)) {
|
|
1799
|
+
activeFilters.delete(type);
|
|
1800
|
+
const btn = document.querySelector('.entity-filter-btn[data-entity-type="' + type + '"]');
|
|
1801
|
+
if (btn) {
|
|
1802
|
+
btn.classList.remove('btn-primary');
|
|
1803
|
+
btn.classList.add('btn-outline-primary');
|
|
1804
|
+
}
|
|
1805
|
+
}
|
|
1806
|
+
});
|
|
1807
|
+
};
|
|
1808
|
+
// Fetch extended entities via AJAX
|
|
1809
|
+
const loadExtendedEntities = async (includeAllModules = false) => {
|
|
1810
|
+
try {
|
|
1811
|
+
const query = includeAllModules ? '?include_all_modules=1' : '';
|
|
1812
|
+
const res = await fetch('/entities/extended' + query);
|
|
1813
|
+
const data = await res.json();
|
|
1814
|
+
return data.entities || [];
|
|
1815
|
+
} catch (e) {
|
|
1816
|
+
console.error('Failed to load extended entities:', e);
|
|
1817
|
+
return [];
|
|
1818
|
+
}
|
|
1819
|
+
};
|
|
1820
|
+
|
|
1821
|
+
const renderExtendedEntityRows = (extendedEntities, tbody) => {
|
|
1822
|
+
document
|
|
1823
|
+
.querySelectorAll('[data-is-extended]')
|
|
1824
|
+
.forEach((row) => row.remove());
|
|
1825
|
+
extendedEntities.forEach((entity) => {
|
|
1826
|
+
const row = createExtendedEntityRow(entity);
|
|
1827
|
+
tbody.appendChild(row);
|
|
1828
|
+
});
|
|
1829
|
+
if (typeof updateSelectionUI === 'function') updateSelectionUI();
|
|
1830
|
+
};
|
|
1831
|
+
|
|
1832
|
+
const ensureAllModulesLoaded = async () => {
|
|
1833
|
+
if (hasLoadedAllModules || isLoadingAllModules) return;
|
|
1834
|
+
if (!isExtendedExpanded) return;
|
|
1835
|
+
isLoadingAllModules = true;
|
|
1836
|
+
let updated = false;
|
|
1837
|
+
try {
|
|
1838
|
+
const extendedEntities = await loadExtendedEntities(true);
|
|
1839
|
+
window.extendedEntities = extendedEntities;
|
|
1840
|
+
const tbody = document.querySelector('#entities-list tbody');
|
|
1841
|
+
renderExtendedEntityRows(extendedEntities, tbody);
|
|
1842
|
+
hasLoadedAllModules = true;
|
|
1843
|
+
updated = true;
|
|
1844
|
+
} catch (e) {
|
|
1845
|
+
console.error('Failed to load all modules:', e);
|
|
1846
|
+
} finally {
|
|
1847
|
+
isLoadingAllModules = false;
|
|
1848
|
+
if (updated && typeof filterEntities === 'function') filterEntities();
|
|
1849
|
+
}
|
|
1850
|
+
};
|
|
1851
|
+
|
|
1852
|
+
// Toggle expanded state
|
|
1853
|
+
window.toggleEntityExpanded = async (expand) => {
|
|
1854
|
+
const moreBtn = document.getElementById('entity-more-btn');
|
|
1855
|
+
const lessBtn = document.getElementById('entity-less-btn');
|
|
1856
|
+
const extendedButtons = document.querySelectorAll('.entity-extended-btn');
|
|
1857
|
+
const tbody = document.querySelector('#entities-list tbody');
|
|
1858
|
+
|
|
1859
|
+
if (expand) {
|
|
1860
|
+
if (isExtendedExpanded) return;
|
|
1861
|
+
extendedButtons.forEach(btn => btn.classList.remove('d-none'));
|
|
1862
|
+
moreBtn.classList.add('d-none');
|
|
1863
|
+
lessBtn.classList.remove('d-none');
|
|
1864
|
+
isExtendedExpanded = true;
|
|
1865
|
+
const shouldLoadAll = typeof window.isModulesFilterExclusive === 'function'
|
|
1866
|
+
? window.isModulesFilterExclusive()
|
|
1867
|
+
: false;
|
|
1868
|
+
// Load extended entities
|
|
1869
|
+
const extendedEntities = await loadExtendedEntities(shouldLoadAll);
|
|
1870
|
+
window.extendedEntities = extendedEntities;
|
|
1871
|
+
renderExtendedEntityRows(extendedEntities, tbody);
|
|
1872
|
+
hasLoadedAllModules = shouldLoadAll;
|
|
1873
|
+
filterEntities();
|
|
1874
|
+
} else {
|
|
1875
|
+
if (!isExtendedExpanded) return;
|
|
1876
|
+
extendedButtons.forEach(btn => btn.classList.add('d-none'));
|
|
1877
|
+
moreBtn.classList.remove('d-none');
|
|
1878
|
+
lessBtn.classList.add('d-none');
|
|
1879
|
+
isExtendedExpanded = false;
|
|
1880
|
+
hasLoadedAllModules = false;
|
|
1881
|
+
isLoadingAllModules = false;
|
|
1882
|
+
window.extendedEntities = [];
|
|
1883
|
+
renderExtendedEntityRows([], tbody);
|
|
1884
|
+
clearExtendedTypeFilters();
|
|
1885
|
+
// Update filter
|
|
1886
|
+
filterEntities();
|
|
1887
|
+
}
|
|
1888
|
+
};
|
|
1889
|
+
|
|
1890
|
+
// Helper to create entity row for extended entities
|
|
1891
|
+
const createExtendedEntityRow = (entity) => {
|
|
1892
|
+
const tr = document.createElement('tr');
|
|
1893
|
+
tr.className = 'entity-row';
|
|
1894
|
+
tr.dataset.entityType = entity.type;
|
|
1895
|
+
tr.dataset.entityName = entity.name.toLowerCase();
|
|
1896
|
+
if (entity.id) {
|
|
1897
|
+
tr.dataset.entityId = entity.id;
|
|
1898
|
+
} else {
|
|
1899
|
+
tr.dataset.entityId = '';
|
|
1900
|
+
}
|
|
1901
|
+
tr.dataset.entityLabel = entity.name;
|
|
1902
|
+
const key = entity.type + ':' + (entity.type === 'module' ? entity.name : entity.id);
|
|
1903
|
+
tr.dataset.entityKey = key;
|
|
1904
|
+
let searchable = ((entity.name || '').toLowerCase() + ' ' + entity.type).trim();
|
|
1905
|
+
if (entity.metadata) {
|
|
1906
|
+
Object.keys(entity.metadata).forEach((key) => {
|
|
1907
|
+
const val = entity.metadata[key];
|
|
1908
|
+
const shouldSkipDescription =
|
|
1909
|
+
entity.type === 'module' && key === 'description';
|
|
1910
|
+
const shouldSkipForSearchable =
|
|
1911
|
+
entity.type === 'user' && key === 'username';
|
|
1912
|
+
if (!shouldSkipDescription && !shouldSkipForSearchable && val && typeof val === 'string') {
|
|
1913
|
+
searchable += ' ' + val.toLowerCase();
|
|
1914
|
+
}
|
|
1915
|
+
});
|
|
1916
|
+
}
|
|
1917
|
+
tr.dataset.tags = '';
|
|
1918
|
+
tr.dataset.isExtended = 'true';
|
|
1919
|
+
tr.dataset.installed =
|
|
1920
|
+
entity.metadata && entity.metadata.installed === false
|
|
1921
|
+
? 'false'
|
|
1922
|
+
: 'true';
|
|
1923
|
+
|
|
1924
|
+
if (!isRowSelectable(tr)) {
|
|
1925
|
+
tr.classList.add('entity-row-selection-disabled');
|
|
1926
|
+
tr.setAttribute('aria-disabled', 'true');
|
|
1927
|
+
}
|
|
1928
|
+
|
|
1929
|
+
// Type badge
|
|
1930
|
+
const badges = {
|
|
1931
|
+
module: { class: "secondary", icon: "cube", label: "Module" },
|
|
1932
|
+
user: { class: "dark", icon: "user", label: "User" },
|
|
1933
|
+
};
|
|
1934
|
+
const badge = badges[entity.type];
|
|
1935
|
+
const typeBadge = document.createElement('td');
|
|
1936
|
+
typeBadge.innerHTML = '<span class="badge bg-' + badge.class + ' me-2"><i class="fas fa-' + badge.icon + ' me-1"></i>' + badge.label + '</span>';
|
|
1937
|
+
tr.appendChild(typeBadge);
|
|
1938
|
+
|
|
1939
|
+
const hasConfig = entity.metadata && entity.metadata.hasConfig;
|
|
1940
|
+
const isInstalled = entity.metadata && entity.metadata.installed;
|
|
1941
|
+
|
|
1942
|
+
// Name
|
|
1943
|
+
const nameTd = document.createElement('td');
|
|
1944
|
+
const isStaticModule = entity.type === 'module' && !hasConfig;
|
|
1945
|
+
const nameLink = document.createElement(isStaticModule ? 'span' : 'a');
|
|
1946
|
+
if (!isStaticModule) {
|
|
1947
|
+
const baseHref = entity.editLink || '#';
|
|
1948
|
+
const updatedHref = toRelativeHrefWithOnDone(baseHref);
|
|
1949
|
+
nameLink.setAttribute('href', updatedHref || baseHref);
|
|
1950
|
+
}
|
|
1951
|
+
nameLink.className = 'fw-bold';
|
|
1952
|
+
nameLink.textContent = entity.name;
|
|
1953
|
+
nameTd.appendChild(nameLink);
|
|
1954
|
+
tr.appendChild(nameTd);
|
|
1955
|
+
|
|
1956
|
+
// Run cell (info link for modules)
|
|
1957
|
+
const runTd = document.createElement('td');
|
|
1958
|
+
if (
|
|
1959
|
+
entity.type === 'module' &&
|
|
1960
|
+
entity.metadata &&
|
|
1961
|
+
entity.metadata.type !== 'pack' &&
|
|
1962
|
+
entity.viewLink &&
|
|
1963
|
+
isInstalled
|
|
1964
|
+
) {
|
|
1965
|
+
const infoLink = document.createElement('a');
|
|
1966
|
+
infoLink.className = 'link-primary text-decoration-none';
|
|
1967
|
+
infoLink.innerHTML =
|
|
1968
|
+
// '<i class="fas fa-info-circle me-1"></i>' +
|
|
1969
|
+
(window.TXT_INFO || 'Info');
|
|
1970
|
+
const updatedInfoHref = toRelativeHrefWithOnDone(entity.viewLink);
|
|
1971
|
+
infoLink.setAttribute('href', updatedInfoHref || entity.viewLink);
|
|
1972
|
+
runTd.appendChild(infoLink);
|
|
1973
|
+
}
|
|
1974
|
+
tr.appendChild(runTd);
|
|
1975
|
+
|
|
1976
|
+
// Details cell
|
|
1977
|
+
const detailsTd = document.createElement('td');
|
|
1978
|
+
let detailsHtml = '';
|
|
1979
|
+
if (entity.type === 'user') {
|
|
1980
|
+
const disabled = entity.metadata && entity.metadata.disabled;
|
|
1981
|
+
const roleId = entity.metadata && entity.metadata.role_id;
|
|
1982
|
+
if (Array.isArray(window.ENTITY_ROLES)) {
|
|
1983
|
+
const role = window.ENTITY_ROLES.find(function (r) {
|
|
1984
|
+
return String(r.id) === String(roleId);
|
|
1985
|
+
});
|
|
1986
|
+
if (role && role.role) {
|
|
1987
|
+
detailsHtml += '<span class="text-muted small me-2">' + role.role + '</span>';
|
|
1988
|
+
}
|
|
1989
|
+
}
|
|
1990
|
+
if (disabled) {
|
|
1991
|
+
detailsHtml += '<span class="badge bg-danger me-1">' + (window.TXT_DISABLED || 'Disabled') + '</span>';
|
|
1992
|
+
searchable += ' disabled';
|
|
1993
|
+
}
|
|
1994
|
+
} else if (entity.type === 'module') {
|
|
1995
|
+
const version = entity.metadata && entity.metadata.version;
|
|
1996
|
+
const hasTheme = entity.metadata && entity.metadata.has_theme;
|
|
1997
|
+
const hasAuth = entity.metadata && entity.metadata.has_auth;
|
|
1998
|
+
const isReadyForMobile = entity.metadata && entity.metadata.ready_for_mobile;
|
|
1999
|
+
const isLocal = entity.metadata && entity.metadata.local;
|
|
2000
|
+
const isPack = entity.metadata && entity.metadata.type === 'pack';
|
|
2001
|
+
if (version) {
|
|
2002
|
+
detailsHtml += '<span class="text-muted small me-2">v' + version + '</span>';
|
|
2003
|
+
}
|
|
2004
|
+
if (isPack) {
|
|
2005
|
+
detailsHtml += '<span class="badge bg-secondary me-1">' + (window.TXT_PACK || 'Pack') + '</span>';
|
|
2006
|
+
}
|
|
2007
|
+
if (hasTheme) {
|
|
2008
|
+
detailsHtml += '<span class="badge bg-secondary me-1">' + (window.TXT_THEME || 'Theme') + '</span>';
|
|
2009
|
+
searchable += ' theme';
|
|
2010
|
+
}
|
|
2011
|
+
if (isLocal) {
|
|
2012
|
+
detailsHtml += '<span class="badge bg-secondary me-1">' + (window.TXT_LOCAL || 'Local') + '</span>';
|
|
2013
|
+
searchable += ' local';
|
|
2014
|
+
}
|
|
2015
|
+
if (isInstalled) {
|
|
2016
|
+
detailsHtml += '<span class="badge bg-secondary me-1">' + (window.TXT_INSTALLED || 'Installed') + '</span>';
|
|
2017
|
+
searchable += ' installed';
|
|
2018
|
+
}
|
|
2019
|
+
if (hasAuth) {
|
|
2020
|
+
detailsHtml += '<span class="badge bg-secondary me-1">' + (window.TXT_AUTH || 'Authentication') + '</span>';
|
|
2021
|
+
searchable += ' authentication auth';
|
|
2022
|
+
}
|
|
2023
|
+
if (isReadyForMobile) {
|
|
2024
|
+
detailsHtml += '<span class="badge bg-secondary me-1">' + (window.TXT_MOBILE || 'Mobile') + '</span>';
|
|
2025
|
+
searchable += ' mobile';
|
|
2026
|
+
}
|
|
2027
|
+
}
|
|
2028
|
+
if (detailsHtml) detailsTd.innerHTML = detailsHtml;
|
|
2029
|
+
tr.appendChild(detailsTd);
|
|
2030
|
+
|
|
2031
|
+
// Access cell (empty for extended entities)
|
|
2032
|
+
const accessTd = document.createElement('td');
|
|
2033
|
+
tr.appendChild(accessTd);
|
|
2034
|
+
|
|
2035
|
+
// Tags cell
|
|
2036
|
+
const tagsTd = document.createElement('td');
|
|
2037
|
+
tr.appendChild(tagsTd);
|
|
2038
|
+
|
|
2039
|
+
// Actions cell (empty for extended entities)
|
|
2040
|
+
const actionsTd = document.createElement('td');
|
|
2041
|
+
if (entity.actionsHtml) {
|
|
2042
|
+
actionsTd.innerHTML = entity.actionsHtml;
|
|
2043
|
+
actionsTd
|
|
2044
|
+
.querySelectorAll('a')
|
|
2045
|
+
.forEach((link) => {
|
|
2046
|
+
const href = link.getAttribute('href');
|
|
2047
|
+
const updated = toRelativeHrefWithOnDone(href);
|
|
2048
|
+
if (updated) link.setAttribute('href', updated);
|
|
2049
|
+
});
|
|
2050
|
+
actionsTd
|
|
2051
|
+
.querySelectorAll('form')
|
|
2052
|
+
.forEach((form) => {
|
|
2053
|
+
const action = form.getAttribute('action');
|
|
2054
|
+
const updated = toRelativeHrefWithOnDone(action);
|
|
2055
|
+
if (updated) form.setAttribute('action', updated);
|
|
2056
|
+
if (entity.type === 'user') ensureOnDoneHiddenInput(form);
|
|
2057
|
+
});
|
|
2058
|
+
const dropdownToggle = actionsTd.querySelector('[data-bs-toggle="dropdown"]');
|
|
2059
|
+
if (dropdownToggle && window.bootstrap && window.bootstrap.Dropdown) {
|
|
2060
|
+
window.bootstrap.Dropdown.getOrCreateInstance(dropdownToggle);
|
|
2061
|
+
}
|
|
2062
|
+
}
|
|
2063
|
+
tr.appendChild(actionsTd);
|
|
2064
|
+
|
|
2065
|
+
tr.dataset.searchable = searchable.trim();
|
|
2066
|
+
let deepSearchable = (entity.deepSearchable || searchable).trim();
|
|
2067
|
+
if (entity.type === 'module') {
|
|
2068
|
+
const description =
|
|
2069
|
+
entity.metadata && typeof entity.metadata.description === 'string'
|
|
2070
|
+
? entity.metadata.description.toLowerCase()
|
|
2071
|
+
: '';
|
|
2072
|
+
if (description && !deepSearchable.includes(description)) {
|
|
2073
|
+
deepSearchable = (deepSearchable + ' ' + description).trim();
|
|
2074
|
+
}
|
|
2075
|
+
} else if (entity.type === 'user' && entity.metadata && typeof entity.metadata.username === 'string') {
|
|
2076
|
+
const usernameLower = entity.metadata.username.toLowerCase();
|
|
2077
|
+
if (!deepSearchable.includes(usernameLower)) {
|
|
2078
|
+
deepSearchable = (deepSearchable + ' ' + usernameLower).trim();
|
|
2079
|
+
}
|
|
2080
|
+
}
|
|
2081
|
+
tr.dataset.deepSearchable = deepSearchable;
|
|
2082
|
+
if (window.ENTITY_DEEP_SEARCH) {
|
|
2083
|
+
window.ENTITY_DEEP_SEARCH[key] = tr.dataset.deepSearchable;
|
|
2084
|
+
}
|
|
2085
|
+
return tr;
|
|
2086
|
+
};
|
|
2087
|
+
|
|
2088
|
+
${clientScript.substring(clientScript.indexOf("const searchInput"), clientScript.lastIndexOf("}"))}
|
|
2089
|
+
`)
|
|
2090
|
+
),
|
|
875
2091
|
],
|
|
876
2092
|
footer: div(
|
|
877
2093
|
{
|
|
@@ -925,3 +2141,120 @@ router.get(
|
|
|
925
2141
|
);
|
|
926
2142
|
})
|
|
927
2143
|
);
|
|
2144
|
+
|
|
2145
|
+
/**
|
|
2146
|
+
* AJAX endpoint to fetch extended entities (modules, users)
|
|
2147
|
+
*/
|
|
2148
|
+
router.get(
|
|
2149
|
+
"/extended",
|
|
2150
|
+
isAdminOrHasConfigMinRole("min_role_edit_views"),
|
|
2151
|
+
error_catcher(async (req, res) => {
|
|
2152
|
+
const includeAllModules =
|
|
2153
|
+
req.query.include_all_modules === "1" ||
|
|
2154
|
+
req.query.include_all_modules === "true";
|
|
2155
|
+
const extendedEntities = await getExtendedEntites(req, {
|
|
2156
|
+
includeAllModules,
|
|
2157
|
+
});
|
|
2158
|
+
res.json({
|
|
2159
|
+
entities: extendedEntities.map((entity) => ({
|
|
2160
|
+
type: entity.type,
|
|
2161
|
+
name: entity.name,
|
|
2162
|
+
id: entity.id,
|
|
2163
|
+
viewLink: entity.viewLink,
|
|
2164
|
+
editLink: entity.editLink,
|
|
2165
|
+
metadata: entity.metadata,
|
|
2166
|
+
actionsHtml: entity.actionsHtml || "",
|
|
2167
|
+
})),
|
|
2168
|
+
});
|
|
2169
|
+
})
|
|
2170
|
+
);
|
|
2171
|
+
|
|
2172
|
+
router.post(
|
|
2173
|
+
"/bulk-delete",
|
|
2174
|
+
isAdminOrHasConfigMinRole("min_role_edit_views"),
|
|
2175
|
+
error_catcher(async (req, res) => {
|
|
2176
|
+
const items = Array.isArray(req.body.items) ? req.body.items : [];
|
|
2177
|
+
if (!items.length)
|
|
2178
|
+
return res.status(400).json({ error: "No items selected" });
|
|
2179
|
+
|
|
2180
|
+
const deletedKeys = [];
|
|
2181
|
+
const errors = [];
|
|
2182
|
+
const installedPackNames = new Set(
|
|
2183
|
+
getState().getConfig("installed_packs", []) || []
|
|
2184
|
+
);
|
|
2185
|
+
const asNumber = (val) => {
|
|
2186
|
+
if (val === null || typeof val === "undefined") return null;
|
|
2187
|
+
if (val === "") return null;
|
|
2188
|
+
const num = Number(val);
|
|
2189
|
+
return Number.isNaN(num) ? null : num;
|
|
2190
|
+
};
|
|
2191
|
+
|
|
2192
|
+
for (const item of items) {
|
|
2193
|
+
const type = item?.type;
|
|
2194
|
+
const id = asNumber(item?.id);
|
|
2195
|
+
const name = item?.name;
|
|
2196
|
+
const key = item?.key;
|
|
2197
|
+
try {
|
|
2198
|
+
if (type === "table" && id) {
|
|
2199
|
+
const table = Table.findOne({ id });
|
|
2200
|
+
if (!table) throw new Error("Table not found");
|
|
2201
|
+
await table.delete(false);
|
|
2202
|
+
if (key) deletedKeys.push(key);
|
|
2203
|
+
} else if (type === "view" && id) {
|
|
2204
|
+
const view = View.findOne({ id });
|
|
2205
|
+
if (!view) throw new Error("View not found");
|
|
2206
|
+
await view.delete();
|
|
2207
|
+
if (key) deletedKeys.push(key);
|
|
2208
|
+
} else if (type === "page" && id) {
|
|
2209
|
+
const page = Page.findOne({ id });
|
|
2210
|
+
if (!page) throw new Error("Page not found");
|
|
2211
|
+
await page.delete();
|
|
2212
|
+
if (key) deletedKeys.push(key);
|
|
2213
|
+
} else if (type === "trigger" && id) {
|
|
2214
|
+
const trigger = await Trigger.findOne({ id });
|
|
2215
|
+
if (!trigger) throw new Error("Trigger not found");
|
|
2216
|
+
await trigger.delete();
|
|
2217
|
+
if (key) deletedKeys.push(key);
|
|
2218
|
+
} else if (type === "module" && name) {
|
|
2219
|
+
const isPack = installedPackNames.has(name);
|
|
2220
|
+
if (isPack) {
|
|
2221
|
+
const pack = await fetch_pack_by_name(name);
|
|
2222
|
+
if (!pack) throw new Error("Pack not found");
|
|
2223
|
+
await db.withTransaction(async () => {
|
|
2224
|
+
await uninstall_pack(pack.pack, name);
|
|
2225
|
+
});
|
|
2226
|
+
await getState().refresh();
|
|
2227
|
+
} else {
|
|
2228
|
+
const plugin = await Plugin.findOne({ name });
|
|
2229
|
+
if (!plugin) throw new Error("Plugin not found");
|
|
2230
|
+
await plugin.delete();
|
|
2231
|
+
}
|
|
2232
|
+
if (key) deletedKeys.push(key);
|
|
2233
|
+
} else if (type === "user" && id) {
|
|
2234
|
+
const user = await User.findOne({ id });
|
|
2235
|
+
if (!user) throw new Error("User not found");
|
|
2236
|
+
await user.delete();
|
|
2237
|
+
if (key) deletedKeys.push(key);
|
|
2238
|
+
} else {
|
|
2239
|
+
throw new Error("Invalid item type or id: " + JSON.stringify(item));
|
|
2240
|
+
}
|
|
2241
|
+
} catch (e) {
|
|
2242
|
+
const isPack = type === "module" && installedPackNames.has(name);
|
|
2243
|
+
errors.push({
|
|
2244
|
+
type: isPack ? "pack" : type,
|
|
2245
|
+
isPack,
|
|
2246
|
+
id,
|
|
2247
|
+
name,
|
|
2248
|
+
key,
|
|
2249
|
+
message: e.message,
|
|
2250
|
+
});
|
|
2251
|
+
}
|
|
2252
|
+
}
|
|
2253
|
+
|
|
2254
|
+
res.status(errors.length ? 207 : 200).json({
|
|
2255
|
+
ok: errors.length === 0,
|
|
2256
|
+
deletedKeys,
|
|
2257
|
+
errors,
|
|
2258
|
+
});
|
|
2259
|
+
})
|
|
2260
|
+
);
|