From 384195a2c3cbeb10442169514f3a790359ba15e6 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Mon, 14 Jul 2025 16:32:00 -0500 Subject: [PATCH] Update possibleValuesStandalone to accept filter as formParam. --- .../javalin/QJavalinImplementation.java | 22 ++++++++++++-- .../javalin/QJavalinImplementationTest.java | 29 ++++++++++++++++++- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java index 1aaf8fa5..0213141b 100644 --- a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java +++ b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java @@ -1856,7 +1856,23 @@ public class QJavalinImplementation throw (new QNotFoundException("Could not find possible value source " + possibleValueSourceName + " in this instance.")); } - finishPossibleValuesRequest(context, possibleValueSourceName, null, otherValues); + ////////////////////////////////////////////////// + // allow a filter to be passed in from frontend // + ////////////////////////////////////////////////// + QQueryFilter defaultQueryFilter = null; + List filterParam = context.formParamMap().get("filter"); + if(CollectionUtils.nullSafeHasContents(filterParam)) + { + String possibleValueSourceFilterJSON = filterParam.get(0); + defaultQueryFilter = JsonUtils.toObject(possibleValueSourceFilterJSON, QQueryFilter.class); + + String useCaseParam = QJavalinUtils.getQueryParamOrFormParam(context, "useCase"); + PossibleValueSearchFilterUseCase useCase = ObjectUtils.tryElse(() -> PossibleValueSearchFilterUseCase.valueOf(useCaseParam.toUpperCase()), PossibleValueSearchFilterUseCase.FORM); + + defaultQueryFilter.interpretValues(otherValues, useCase); + } + + finishPossibleValuesRequest(context, possibleValueSourceName, defaultQueryFilter, otherValues); } catch(Exception e) { @@ -1871,8 +1887,8 @@ public class QJavalinImplementation *******************************************************************************/ static void finishPossibleValuesRequest(Context context, QFieldMetaData field) throws IOException, QException { - QQueryFilter defaultQueryFilter = null; - Map otherValues = getOtherValueForPossibleValueRequest(context); + QQueryFilter defaultQueryFilter = null; + Map otherValues = getOtherValueForPossibleValueRequest(context); if(field.getPossibleValueSourceFilter() != null) { diff --git a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementationTest.java b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementationTest.java index ba9f2d02..b5397bb5 100644 --- a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementationTest.java +++ b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementationTest.java @@ -39,6 +39,9 @@ import com.kingsrook.qqq.backend.core.exceptions.QInstanceValidationException; import com.kingsrook.qqq.backend.core.logging.QCollectingLogger; import com.kingsrook.qqq.backend.core.logging.QLogger; import com.kingsrook.qqq.backend.core.model.actions.reporting.ReportFormat; +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.QQueryFilter; import com.kingsrook.qqq.backend.core.model.dashboard.widgets.WidgetType; import com.kingsrook.qqq.backend.core.model.metadata.QAuthenticationType; import com.kingsrook.qqq.backend.core.model.metadata.QBackendMetaData; @@ -1075,7 +1078,7 @@ class QJavalinImplementationTest extends QJavalinTestBase ** *******************************************************************************/ @Test - void testPossibleValueWithoutTableOrProcess() + void testStandalonePossibleValueSource() { HttpResponse response = Unirest.get(BASE_URL + "/possibleValues/person").asString(); assertEquals(200, response.getStatus()); @@ -1089,6 +1092,28 @@ class QJavalinImplementationTest extends QJavalinTestBase + /******************************************************************************* + ** + *******************************************************************************/ + @Test + void testStandalonePossibleValueSourceWithFilter() + { + HttpResponse response = Unirest.post(BASE_URL + "/possibleValues/person") + .field("values", JsonUtils.toJson(Map.of("firstInitial", "D"))) + .field("filter", JsonUtils.toJson(new QQueryFilter(new QFilterCriteria("firstName", QCriteriaOperator.STARTS_WITH, "${input.firstInitial}")))) + .asString(); + + assertEquals(200, response.getStatus()); + JSONObject jsonObject = JsonUtils.toJSONObject(response.getBody()); + assertNotNull(jsonObject); + assertNotNull(jsonObject.getJSONArray("options")); + assertEquals(1, jsonObject.getJSONArray("options").length()); + assertEquals(1, jsonObject.getJSONArray("options").getJSONObject(0).getInt("id")); + assertEquals("Darin Kelkhoff (1)", jsonObject.getJSONArray("options").getJSONObject(0).getString("label")); + } + + + /******************************************************************************* ** *******************************************************************************/ @@ -1481,6 +1506,8 @@ class QJavalinImplementationTest extends QJavalinTestBase { static int callCount = 0; + + @Override public void run(DownloadFileSupplementalActionInput input, DownloadFileSupplementalActionOutput output) throws QException {