diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/AbstractHTMLWidgetRenderer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/AbstractHTMLWidgetRenderer.java
index 9cd907df..c5854dc6 100644
--- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/AbstractHTMLWidgetRenderer.java
+++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/AbstractHTMLWidgetRenderer.java
@@ -39,6 +39,7 @@ import com.kingsrook.qqq.backend.core.model.actions.widgets.RenderWidgetInput;
import com.kingsrook.qqq.backend.core.model.metadata.fields.DisplayFormat;
import com.kingsrook.qqq.backend.core.model.metadata.processes.QProcessMetaData;
import com.kingsrook.qqq.backend.core.utils.JsonUtils;
+import com.kingsrook.qqq.backend.core.utils.StringUtils;
/*******************************************************************************
@@ -173,7 +174,7 @@ public abstract class AbstractHTMLWidgetRenderer extends AbstractWidgetRenderer
public static String aHrefTableFilterNoOfRecords(RenderWidgetInput input, String tableName, QQueryFilter filter, Integer noOfRecords, String singularLabel, String pluralLabel) throws QException
{
String href = linkTableFilter(input, tableName, filter);
- return ("" + QValueFormatter.formatValue(DisplayFormat.COMMAS, noOfRecords) + " " + pluralize(noOfRecords, singularLabel, pluralLabel) + "");
+ return ("" + QValueFormatter.formatValue(DisplayFormat.COMMAS, noOfRecords) + " " + StringUtils.plural(noOfRecords, singularLabel, pluralLabel) + "");
}
@@ -265,19 +266,4 @@ public abstract class AbstractHTMLWidgetRenderer extends AbstractWidgetRenderer
return ("Create new");
}
-
-
- /*******************************************************************************
- **
- *******************************************************************************/
- public static String pluralize(Integer count, String singular, String plural)
- {
- if(count != null && count.equals(1))
- {
- return (singular);
- }
-
- return (plural);
- }
-
}
diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/AbstractWidgetRenderer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/AbstractWidgetRenderer.java
index 628f7acb..a13c1e79 100644
--- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/AbstractWidgetRenderer.java
+++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/AbstractWidgetRenderer.java
@@ -24,10 +24,29 @@ package com.kingsrook.qqq.backend.core.actions.dashboard.widgets;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
import com.kingsrook.qqq.backend.core.actions.values.QValueFormatter;
+import com.kingsrook.qqq.backend.core.actions.values.SearchPossibleValueSourceAction;
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.QQueryFilter;
+import com.kingsrook.qqq.backend.core.model.actions.values.SearchPossibleValueSourceInput;
+import com.kingsrook.qqq.backend.core.model.actions.values.SearchPossibleValueSourceOutput;
import com.kingsrook.qqq.backend.core.model.actions.widgets.RenderWidgetInput;
import com.kingsrook.qqq.backend.core.model.actions.widgets.RenderWidgetOutput;
+import com.kingsrook.qqq.backend.core.model.dashboard.widgets.QWidgetData;
+import com.kingsrook.qqq.backend.core.model.metadata.dashboard.QWidgetMetaData;
+import com.kingsrook.qqq.backend.core.model.metadata.dashboard.WidgetDropdownData;
+import com.kingsrook.qqq.backend.core.model.metadata.possiblevalues.QPossibleValue;
+import com.kingsrook.qqq.backend.core.model.metadata.possiblevalues.QPossibleValueSource;
+import com.kingsrook.qqq.backend.core.utils.CollectionUtils;
+import com.kingsrook.qqq.backend.core.utils.StringUtils;
/*******************************************************************************
@@ -46,4 +65,103 @@ public abstract class AbstractWidgetRenderer
*******************************************************************************/
public abstract RenderWidgetOutput render(RenderWidgetInput input) throws QException;
+
+
+ /*******************************************************************************
+ **
+ *******************************************************************************/
+ protected boolean setupDropdowns(RenderWidgetInput input, QWidgetMetaData metaData, QWidgetData widgetData) throws QException
+ {
+ List>> pvsData = new ArrayList<>();
+ List pvsLabels = new ArrayList<>();
+ List pvsNames = new ArrayList<>();
+ List missingRequiredSelections = new ArrayList<>();
+ for(WidgetDropdownData dropdownData : CollectionUtils.nonNullList(metaData.getDropdowns()))
+ {
+ String possibleValueSourceName = dropdownData.getPossibleValueSourceName();
+ QPossibleValueSource possibleValueSource = input.getInstance().getPossibleValueSource(possibleValueSourceName);
+
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ // this looks complicated, but is just look for a label in the dropdown data and if found use it, //
+ // otherwise look for label in PVS and if found use that, otherwise just use the PVS name //
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ String pvsLabel = dropdownData.getLabel() != null ? dropdownData.getLabel() : (possibleValueSource.getLabel() != null ? possibleValueSource.getLabel() : possibleValueSourceName);
+ pvsLabels.add(pvsLabel);
+ pvsNames.add(possibleValueSourceName);
+
+ SearchPossibleValueSourceInput pvsInput = new SearchPossibleValueSourceInput(input.getInstance());
+ pvsInput.setSession(input.getSession());
+ pvsInput.setPossibleValueSourceName(possibleValueSourceName);
+
+ if(dropdownData.getForeignKeyFieldName() != null)
+ {
+ ////////////////////////////////////////
+ // look for an id in the query params //
+ ////////////////////////////////////////
+ Integer id = null;
+ if(input.getQueryParams() != null && input.getQueryParams().containsKey("id") && StringUtils.hasContent(input.getQueryParams().get("id")))
+ {
+ id = Integer.parseInt(input.getQueryParams().get("id"));
+ }
+ if(id != null)
+ {
+ pvsInput.setDefaultQueryFilter(new QQueryFilter().withCriteria(
+ new QFilterCriteria(
+ dropdownData.getForeignKeyFieldName(),
+ QCriteriaOperator.EQUALS,
+ id)));
+ }
+ }
+
+ SearchPossibleValueSourceOutput output = new SearchPossibleValueSourceAction().execute(pvsInput);
+
+ List