mirror of
https://github.com/Kingsrook/qqq.git
synced 2025-07-18 05:01:07 +00:00
Possible value source filtering
This commit is contained in:
@ -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.ReportFormat;
|
||||||
import com.kingsrook.qqq.backend.core.model.actions.reporting.ReportInput;
|
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.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.QFilterOrderBy;
|
||||||
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
|
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
|
||||||
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QueryInput;
|
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.CollectionUtils;
|
||||||
import com.kingsrook.qqq.backend.core.utils.Pair;
|
import com.kingsrook.qqq.backend.core.utils.Pair;
|
||||||
import com.kingsrook.qqq.backend.core.utils.StringUtils;
|
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.AggregatesInterface;
|
||||||
import com.kingsrook.qqq.backend.core.utils.aggregates.BigDecimalAggregates;
|
import com.kingsrook.qqq.backend.core.utils.aggregates.BigDecimalAggregates;
|
||||||
import com.kingsrook.qqq.backend.core.utils.aggregates.IntegerAggregates;
|
import com.kingsrook.qqq.backend.core.utils.aggregates.IntegerAggregates;
|
||||||
@ -412,23 +410,7 @@ public class GenerateReportAction
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
QMetaDataVariableInterpreter variableInterpreter = new QMetaDataVariableInterpreter();
|
queryFilter.interpretValues(reportInput.getInputValues());
|
||||||
variableInterpreter.addValueMap("input", reportInput.getInputValues());
|
|
||||||
for(QFilterCriteria criterion : queryFilter.getCriteria())
|
|
||||||
{
|
|
||||||
if(criterion.getValues() != null)
|
|
||||||
{
|
|
||||||
List<Serializable> newValues = new ArrayList<>();
|
|
||||||
|
|
||||||
for(Serializable value : criterion.getValues())
|
|
||||||
{
|
|
||||||
String valueAsString = ValueUtils.getValueAsString(value);
|
|
||||||
Serializable interpretedValue = variableInterpreter.interpretForObject(valueAsString);
|
|
||||||
newValues.add(interpretedValue);
|
|
||||||
}
|
|
||||||
criterion.setValues(newValues);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -26,8 +26,11 @@ import java.io.Serializable;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
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.logging.QLogger;
|
||||||
import com.kingsrook.qqq.backend.core.utils.CollectionUtils;
|
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());
|
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<String, Serializable> inputValues)
|
||||||
|
{
|
||||||
|
QMetaDataVariableInterpreter variableInterpreter = new QMetaDataVariableInterpreter();
|
||||||
|
variableInterpreter.addValueMap("input", inputValues);
|
||||||
|
for(QFilterCriteria criterion : getCriteria())
|
||||||
|
{
|
||||||
|
if(criterion.getValues() != null)
|
||||||
|
{
|
||||||
|
List<Serializable> newValues = new ArrayList<>();
|
||||||
|
|
||||||
|
for(Serializable value : criterion.getValues())
|
||||||
|
{
|
||||||
|
String valueAsString = ValueUtils.getValueAsString(value);
|
||||||
|
Serializable interpretedValue = variableInterpreter.interpretForObject(valueAsString);
|
||||||
|
newValues.add(interpretedValue);
|
||||||
|
}
|
||||||
|
criterion.setValues(newValues);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -31,6 +31,7 @@ import java.util.Optional;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import com.github.hervian.reflection.Fun;
|
import com.github.hervian.reflection.Fun;
|
||||||
import com.kingsrook.qqq.backend.core.exceptions.QException;
|
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.QField;
|
||||||
import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
|
import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
|
import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
|
||||||
@ -63,6 +64,7 @@ public class QFieldMetaData implements Cloneable
|
|||||||
private String displayFormat = "%s";
|
private String displayFormat = "%s";
|
||||||
private Serializable defaultValue;
|
private Serializable defaultValue;
|
||||||
private String possibleValueSourceName;
|
private String possibleValueSourceName;
|
||||||
|
private QQueryFilter possibleValueSourceFilter;
|
||||||
|
|
||||||
private Integer maxLength;
|
private Integer maxLength;
|
||||||
private Set<FieldBehavior> behaviors;
|
private Set<FieldBehavior> behaviors;
|
||||||
@ -755,4 +757,35 @@ public class QFieldMetaData implements Cloneable
|
|||||||
return (this);
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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.ChildRecordListRenderer;
|
||||||
import com.kingsrook.qqq.backend.core.actions.dashboard.widgets.DefaultWidgetRenderer;
|
import com.kingsrook.qqq.backend.core.actions.dashboard.widgets.DefaultWidgetRenderer;
|
||||||
import com.kingsrook.qqq.backend.core.exceptions.QException;
|
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.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.automation.TableTrigger;
|
||||||
import com.kingsrook.qqq.backend.core.model.dashboard.widgets.WidgetType;
|
import com.kingsrook.qqq.backend.core.model.dashboard.widgets.WidgetType;
|
||||||
import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
|
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 RUN_RECORD_SCRIPT_PROCESS_NAME = "runRecordScript";
|
||||||
public static final String STORE_SCRIPT_REVISION_PROCESS_NAME = "storeScriptRevision";
|
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()
|
processMetaData.addStep(0, new QFrontendStepMetaData()
|
||||||
.withName("input")
|
.withName("input")
|
||||||
.withComponent(new QFrontendComponentMetaData().withType(QComponentType.EDIT_FORM))
|
.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);
|
return (processMetaData);
|
||||||
}
|
}
|
||||||
|
@ -131,6 +131,7 @@ public class QJavalinProcessHandler
|
|||||||
});
|
});
|
||||||
|
|
||||||
get("/possibleValues/{fieldName}", QJavalinProcessHandler::possibleValues);
|
get("/possibleValues/{fieldName}", QJavalinProcessHandler::possibleValues);
|
||||||
|
post("/possibleValues/{fieldName}", QJavalinProcessHandler::possibleValues);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
get("/download/{file}", QJavalinProcessHandler::downloadFile);
|
get("/download/{file}", QJavalinProcessHandler::downloadFile);
|
||||||
@ -751,6 +752,17 @@ public class QJavalinProcessHandler
|
|||||||
String searchTerm = context.queryParam("searchTerm");
|
String searchTerm = context.queryParam("searchTerm");
|
||||||
String ids = context.queryParam("ids");
|
String ids = context.queryParam("ids");
|
||||||
|
|
||||||
|
Map<String, Serializable> values = new HashMap<>();
|
||||||
|
if(context.formParamMap().containsKey("values"))
|
||||||
|
{
|
||||||
|
List<String> 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);
|
QProcessMetaData process = QJavalinImplementation.qInstance.getProcess(processName);
|
||||||
if(process == null)
|
if(process == null)
|
||||||
{
|
{
|
||||||
@ -770,6 +782,12 @@ public class QJavalinProcessHandler
|
|||||||
input.setPossibleValueSourceName(field.getPossibleValueSourceName());
|
input.setPossibleValueSourceName(field.getPossibleValueSourceName());
|
||||||
input.setSearchTerm(searchTerm);
|
input.setSearchTerm(searchTerm);
|
||||||
|
|
||||||
|
if(field.getPossibleValueSourceFilter() != null)
|
||||||
|
{
|
||||||
|
field.getPossibleValueSourceFilter().interpretValues(values);
|
||||||
|
input.setDefaultQueryFilter(field.getPossibleValueSourceFilter());
|
||||||
|
}
|
||||||
|
|
||||||
if(StringUtils.hasContent(ids))
|
if(StringUtils.hasContent(ids))
|
||||||
{
|
{
|
||||||
List<Serializable> idList = new ArrayList<>(Arrays.asList(ids.split(",")));
|
List<Serializable> idList = new ArrayList<>(Arrays.asList(ids.split(",")));
|
||||||
|
Reference in New Issue
Block a user