diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ChildRecordListRenderer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ChildRecordListRenderer.java index adabbd3a..b201e31e 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ChildRecordListRenderer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ChildRecordListRenderer.java @@ -25,11 +25,13 @@ package com.kingsrook.qqq.backend.core.actions.dashboard.widgets; import java.io.Serializable; import java.net.URLEncoder; import java.nio.charset.Charset; +import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import com.google.gson.reflect.TypeToken; import com.kingsrook.qqq.backend.core.actions.tables.CountAction; import com.kingsrook.qqq.backend.core.actions.tables.GetAction; import com.kingsrook.qqq.backend.core.actions.tables.QueryAction; @@ -66,6 +68,7 @@ import com.kingsrook.qqq.backend.core.utils.CollectionUtils; import com.kingsrook.qqq.backend.core.utils.JsonUtils; import com.kingsrook.qqq.backend.core.utils.StringUtils; import com.kingsrook.qqq.backend.core.utils.ValueUtils; +import com.kingsrook.qqq.backend.core.utils.collections.MutableList; import org.apache.commons.lang.BooleanUtils; import static com.kingsrook.qqq.backend.core.logging.LogUtils.logPair; @@ -177,6 +180,18 @@ public class ChildRecordListRenderer extends AbstractWidgetRenderer return (this); } + + + /******************************************************************************* + ** + *******************************************************************************/ + public Builder withOmitFieldNames(List omitFieldNames) + { + ArrayList arrayList = CollectionUtils.useOrWrap(omitFieldNames, new TypeToken<>() {}); + widgetMetaData.withDefaultValue("omitFieldNames", arrayList); + return (this); + } + } @@ -197,6 +212,15 @@ public class ChildRecordListRenderer extends AbstractWidgetRenderer QTableMetaData rightTable = QContext.getQInstance().getTable(join.getRightTable()); Map widgetMetaDataDefaultValues = input.getWidgetMetaData().getDefaultValues(); + List omitFieldNames = (List) widgetMetaDataDefaultValues.get("omitFieldNames"); + if(omitFieldNames == null) + { + omitFieldNames = new ArrayList<>(); + } + else + { + omitFieldNames = new MutableList<>(omitFieldNames); + } Integer maxRows = null; if(StringUtils.hasContent(input.getQueryParams().get("maxRows"))) @@ -237,6 +261,7 @@ public class ChildRecordListRenderer extends AbstractWidgetRenderer for(JoinOn joinOn : join.getJoinOns()) { filter.addCriteria(new QFilterCriteria(joinOn.getRightField(), QCriteriaOperator.EQUALS, List.of(primaryRecord.getValue(joinOn.getLeftField())))); + omitFieldNames.add(joinOn.getRightField()); } Serializable orderBy = widgetMetaDataDefaultValues.get("orderBy"); @@ -278,6 +303,7 @@ public class ChildRecordListRenderer extends AbstractWidgetRenderer String viewAllLink = tablePath == null ? null : (tablePath + "?filter=" + URLEncoder.encode(JsonUtils.toJson(filter), Charset.defaultCharset())); ChildRecordListData widgetData = new ChildRecordListData(widgetLabel, queryOutput, rightTable, tablePath, viewAllLink, totalRows); + widgetData.setOmitFieldNames(omitFieldNames); if(BooleanUtils.isTrue(ValueUtils.getValueAsBoolean(input.getQueryParams().get("canAddChildRecord")))) { diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/ChildRecordListData.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/ChildRecordListData.java index a5992234..1193b521 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/ChildRecordListData.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/ChildRecordListData.java @@ -23,6 +23,7 @@ package com.kingsrook.qqq.backend.core.model.dashboard.widgets; import java.io.Serializable; +import java.util.List; import java.util.Map; import java.util.Set; import com.kingsrook.qqq.backend.core.model.actions.tables.query.QueryOutput; @@ -52,6 +53,7 @@ public class ChildRecordListData extends QWidgetData private Map defaultValuesForNewChildRecords; private Set disabledFieldsForNewChildRecords; private Map defaultValuesForNewChildRecordsFromParentFields; + private List omitFieldNames; @@ -555,6 +557,37 @@ public class ChildRecordListData extends QWidgetData return (this); } + + + /******************************************************************************* + ** Getter for omitFieldNames + *******************************************************************************/ + public List getOmitFieldNames() + { + return (this.omitFieldNames); + } + + + + /******************************************************************************* + ** Setter for omitFieldNames + *******************************************************************************/ + public void setOmitFieldNames(List omitFieldNames) + { + this.omitFieldNames = omitFieldNames; + } + + + + /******************************************************************************* + ** Fluent setter for omitFieldNames + *******************************************************************************/ + public ChildRecordListData withOmitFieldNames(List omitFieldNames) + { + this.omitFieldNames = omitFieldNames; + return (this); + } + } diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ChildRecordListRendererTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ChildRecordListRendererTest.java index 78a2c161..4bcda611 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ChildRecordListRendererTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/widgets/ChildRecordListRendererTest.java @@ -43,6 +43,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertTrue; /******************************************************************************* @@ -153,6 +154,61 @@ class ChildRecordListRendererTest extends BaseTest assertThat(childRecordListData.getQueryOutput().getRecords()).hasSize(2); assertThat(childRecordListData.getQueryOutput().getRecords().get(0).getValueString("sku")).isEqualTo("BCD"); assertThat(childRecordListData.getQueryOutput().getRecords().get(1).getValueString("sku")).isEqualTo("ABC"); + + //////////////////////////////////////////////////////////////////////////////////////////////////// + // order id, being the join field, should implicitly be omitted - and we asked to omit lineNumber // + //////////////////////////////////////////////////////////////////////////////////////////////////// + assertTrue(childRecordListData.getOmitFieldNames().contains("orderId")); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + void testOmitFields() throws QException + { + QInstance qInstance = QContext.getQInstance(); + QContext.getQSession().withSecurityKeyValue(TestUtils.SECURITY_KEY_TYPE_STORE_ALL_ACCESS, true); + QWidgetMetaData widget = ChildRecordListRenderer.widgetMetaDataBuilder(qInstance.getJoin("orderLineItem")) + .withLabel("Line Items") + .withOmitFieldNames(List.of("lineNumber")) + .getWidgetMetaData(); + qInstance.addWidget(widget); + + TestUtils.insertRecords(qInstance.getTable(TestUtils.TABLE_NAME_ORDER), List.of( + new QRecord().withValue("id", 1), + new QRecord().withValue("id", 2) + )); + + TestUtils.insertRecords(qInstance.getTable(TestUtils.TABLE_NAME_LINE_ITEM), List.of( + new QRecord().withValue("orderId", 1).withValue("sku", "ABC").withValue("lineNumber", 2), + new QRecord().withValue("orderId", 1).withValue("sku", "BCD").withValue("lineNumber", 1), + new QRecord().withValue("orderId", 2).withValue("sku", "XYZ") // should not be found. + )); + + RenderWidgetInput input = new RenderWidgetInput(); + input.setWidgetMetaData(widget); + input.setQueryParams(new HashMap<>(Map.of("id", "1"))); + + RenderWidgetAction renderWidgetAction = new RenderWidgetAction(); + RenderWidgetOutput output = renderWidgetAction.execute(input); + + ChildRecordListData childRecordListData = (ChildRecordListData) output.getWidgetData(); + assertThat(childRecordListData.getChildTableMetaData()).hasFieldOrPropertyWithValue("name", TestUtils.TABLE_NAME_LINE_ITEM); + assertThat(childRecordListData.getQueryOutput().getRecords()).hasSize(2); + + /////////////////////////////////////////////////////////////////////////// + // we still get the data - it just includes a list of omitFieldNames now // + /////////////////////////////////////////////////////////////////////////// + assertThat(childRecordListData.getQueryOutput().getRecords().get(0).getValue("orderId")).isNotNull(); + + //////////////////////////////////////////////////////////////////////////////////////////////////// + // order id, being the join field, should implicitly be omitted - and we asked to omit lineNumber // + //////////////////////////////////////////////////////////////////////////////////////////////////// + assertTrue(childRecordListData.getOmitFieldNames().contains("orderId")); + assertTrue(childRecordListData.getOmitFieldNames().contains("lineNumber")); } } \ No newline at end of file