From 11a16590ef398700a205f2b05d0c8e52757bce6f Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Wed, 8 Mar 2023 08:39:09 -0600 Subject: [PATCH] Possible value source filtering --- .../reporting/GenerateReportAction.java | 20 +---------- .../actions/tables/query/QQueryFilter.java | 31 +++++++++++++++++ .../model/metadata/fields/QFieldMetaData.java | 33 +++++++++++++++++++ .../scripts/ScriptsMetaDataProvider.java | 12 +++++-- .../javalin/QJavalinProcessHandler.java | 18 ++++++++++ 5 files changed, 93 insertions(+), 21 deletions(-) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/GenerateReportAction.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/GenerateReportAction.java index c748e813..f5722436 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/GenerateReportAction.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/GenerateReportAction.java @@ -52,7 +52,6 @@ import com.kingsrook.qqq.backend.core.model.actions.reporting.ExportInput; import com.kingsrook.qqq.backend.core.model.actions.reporting.ReportFormat; import com.kingsrook.qqq.backend.core.model.actions.reporting.ReportInput; import com.kingsrook.qqq.backend.core.model.actions.tables.query.JoinsContext; -import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria; import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterOrderBy; import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter; import com.kingsrook.qqq.backend.core.model.actions.tables.query.QueryInput; @@ -69,7 +68,6 @@ import com.kingsrook.qqq.backend.core.processes.implementations.etl.streamedwith import com.kingsrook.qqq.backend.core.utils.CollectionUtils; import com.kingsrook.qqq.backend.core.utils.Pair; import com.kingsrook.qqq.backend.core.utils.StringUtils; -import com.kingsrook.qqq.backend.core.utils.ValueUtils; import com.kingsrook.qqq.backend.core.utils.aggregates.AggregatesInterface; import com.kingsrook.qqq.backend.core.utils.aggregates.BigDecimalAggregates; import com.kingsrook.qqq.backend.core.utils.aggregates.IntegerAggregates; @@ -412,23 +410,7 @@ public class GenerateReportAction return; } - QMetaDataVariableInterpreter variableInterpreter = new QMetaDataVariableInterpreter(); - variableInterpreter.addValueMap("input", reportInput.getInputValues()); - for(QFilterCriteria criterion : queryFilter.getCriteria()) - { - if(criterion.getValues() != null) - { - List newValues = new ArrayList<>(); - - for(Serializable value : criterion.getValues()) - { - String valueAsString = ValueUtils.getValueAsString(value); - Serializable interpretedValue = variableInterpreter.interpretForObject(valueAsString); - newValues.add(interpretedValue); - } - criterion.setValues(newValues); - } - } + queryFilter.interpretValues(reportInput.getInputValues()); } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/query/QQueryFilter.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/query/QQueryFilter.java index 81ca719f..88485f0e 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/query/QQueryFilter.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/query/QQueryFilter.java @@ -26,8 +26,11 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; +import com.kingsrook.qqq.backend.core.instances.QMetaDataVariableInterpreter; import com.kingsrook.qqq.backend.core.logging.QLogger; import com.kingsrook.qqq.backend.core.utils.CollectionUtils; +import com.kingsrook.qqq.backend.core.utils.ValueUtils; /******************************************************************************* @@ -363,4 +366,32 @@ public class QQueryFilter implements Serializable, Cloneable return (rs.toString()); } + + + + /******************************************************************************* + ** Replace any criteria values that look like ${input.XXX} with the value of XXX + ** from the supplied inputValues map. + *******************************************************************************/ + public void interpretValues(Map inputValues) + { + QMetaDataVariableInterpreter variableInterpreter = new QMetaDataVariableInterpreter(); + variableInterpreter.addValueMap("input", inputValues); + for(QFilterCriteria criterion : getCriteria()) + { + if(criterion.getValues() != null) + { + List newValues = new ArrayList<>(); + + for(Serializable value : criterion.getValues()) + { + String valueAsString = ValueUtils.getValueAsString(value); + Serializable interpretedValue = variableInterpreter.interpretForObject(valueAsString); + newValues.add(interpretedValue); + } + criterion.setValues(newValues); + } + } + } + } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/QFieldMetaData.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/QFieldMetaData.java index d39c5766..cd9cfeeb 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/QFieldMetaData.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/QFieldMetaData.java @@ -31,6 +31,7 @@ import java.util.Optional; import java.util.Set; import com.github.hervian.reflection.Fun; import com.kingsrook.qqq.backend.core.exceptions.QException; +import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter; import com.kingsrook.qqq.backend.core.model.data.QField; import com.kingsrook.qqq.backend.core.model.data.QRecordEntity; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; @@ -63,6 +64,7 @@ public class QFieldMetaData implements Cloneable private String displayFormat = "%s"; private Serializable defaultValue; private String possibleValueSourceName; + private QQueryFilter possibleValueSourceFilter; private Integer maxLength; private Set behaviors; @@ -755,4 +757,35 @@ public class QFieldMetaData implements Cloneable return (this); } + + + /******************************************************************************* + ** Getter for possibleValueSourceFilter + *******************************************************************************/ + public QQueryFilter getPossibleValueSourceFilter() + { + return (this.possibleValueSourceFilter); + } + + + + /******************************************************************************* + ** Setter for possibleValueSourceFilter + *******************************************************************************/ + public void setPossibleValueSourceFilter(QQueryFilter possibleValueSourceFilter) + { + this.possibleValueSourceFilter = possibleValueSourceFilter; + } + + + + /******************************************************************************* + ** Fluent setter for possibleValueSourceFilter + *******************************************************************************/ + public QFieldMetaData withPossibleValueSourceFilter(QQueryFilter possibleValueSourceFilter) + { + this.possibleValueSourceFilter = possibleValueSourceFilter; + return (this); + } + } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/scripts/ScriptsMetaDataProvider.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/scripts/ScriptsMetaDataProvider.java index 5403cd0f..8b7cefed 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/scripts/ScriptsMetaDataProvider.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/scripts/ScriptsMetaDataProvider.java @@ -28,7 +28,10 @@ import java.util.function.Consumer; import com.kingsrook.qqq.backend.core.actions.dashboard.widgets.ChildRecordListRenderer; import com.kingsrook.qqq.backend.core.actions.dashboard.widgets.DefaultWidgetRenderer; import com.kingsrook.qqq.backend.core.exceptions.QException; +import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator; +import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria; import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterOrderBy; +import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter; import com.kingsrook.qqq.backend.core.model.automation.TableTrigger; import com.kingsrook.qqq.backend.core.model.dashboard.widgets.WidgetType; import com.kingsrook.qqq.backend.core.model.data.QRecordEntity; @@ -69,6 +72,8 @@ public class ScriptsMetaDataProvider public static final String RUN_RECORD_SCRIPT_PROCESS_NAME = "runRecordScript"; public static final String STORE_SCRIPT_REVISION_PROCESS_NAME = "storeScriptRevision"; + public static final String SCRIPT_TYPE_NAME_RECORD = "Record Script"; + /******************************************************************************* @@ -121,8 +126,11 @@ public class ScriptsMetaDataProvider processMetaData.addStep(0, new QFrontendStepMetaData() .withName("input") .withComponent(new QFrontendComponentMetaData().withType(QComponentType.EDIT_FORM)) - .withFormField(new QFieldMetaData("scriptId", QFieldType.INTEGER).withPossibleValueSourceName(Script.TABLE_NAME)) - ); + .withFormField(new QFieldMetaData("scriptId", QFieldType.INTEGER).withPossibleValueSourceName(Script.TABLE_NAME) + .withPossibleValueSourceFilter(new QQueryFilter( + new QFilterCriteria("scriptType.name", QCriteriaOperator.EQUALS, SCRIPT_TYPE_NAME_RECORD), + new QFilterCriteria("tableName", QCriteriaOperator.EQUALS, "${input.tableName}") + )))); return (processMetaData); } diff --git a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinProcessHandler.java b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinProcessHandler.java index b7af91ea..08205cdf 100644 --- a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinProcessHandler.java +++ b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinProcessHandler.java @@ -131,6 +131,7 @@ public class QJavalinProcessHandler }); get("/possibleValues/{fieldName}", QJavalinProcessHandler::possibleValues); + post("/possibleValues/{fieldName}", QJavalinProcessHandler::possibleValues); }); }); get("/download/{file}", QJavalinProcessHandler::downloadFile); @@ -751,6 +752,17 @@ public class QJavalinProcessHandler String searchTerm = context.queryParam("searchTerm"); String ids = context.queryParam("ids"); + Map values = new HashMap<>(); + if(context.formParamMap().containsKey("values")) + { + List valuesParamList = context.formParamMap().get("values"); + if(CollectionUtils.nullSafeHasContents(valuesParamList)) + { + String valuesParam = valuesParamList.get(0); + values = JsonUtils.toObject(valuesParam, Map.class); + } + } + QProcessMetaData process = QJavalinImplementation.qInstance.getProcess(processName); if(process == null) { @@ -770,6 +782,12 @@ public class QJavalinProcessHandler input.setPossibleValueSourceName(field.getPossibleValueSourceName()); input.setSearchTerm(searchTerm); + if(field.getPossibleValueSourceFilter() != null) + { + field.getPossibleValueSourceFilter().interpretValues(values); + input.setDefaultQueryFilter(field.getPossibleValueSourceFilter()); + } + if(StringUtils.hasContent(ids)) { List idList = new ArrayList<>(Arrays.asList(ids.split(",")));