From e012b1f090af41016c38aa35da8cab678726ad9c Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Tue, 14 Jan 2025 10:52:39 -0600 Subject: [PATCH 1/4] Add properties: hidePreview, filterFieldName, columnFieldName --- .../widgets/FilterAndColumnsSetupData.java | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/FilterAndColumnsSetupData.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/FilterAndColumnsSetupData.java index 10a562a0..f35afbb3 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/FilterAndColumnsSetupData.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/FilterAndColumnsSetupData.java @@ -34,8 +34,12 @@ public class FilterAndColumnsSetupData extends QWidgetData private String tableName; private Boolean allowVariables = false; private Boolean hideColumns = false; + private Boolean hidePreview = false; private List filterDefaultFieldNames; + private String filterFieldName = "queryFilterJson"; + private String columnFieldName = "columnsJson"; + /******************************************************************************* @@ -193,4 +197,97 @@ public class FilterAndColumnsSetupData extends QWidgetData return (this); } + + + /******************************************************************************* + ** Getter for hidePreview + *******************************************************************************/ + public Boolean getHidePreview() + { + return (this.hidePreview); + } + + + + /******************************************************************************* + ** Setter for hidePreview + *******************************************************************************/ + public void setHidePreview(Boolean hidePreview) + { + this.hidePreview = hidePreview; + } + + + + /******************************************************************************* + ** Fluent setter for hidePreview + *******************************************************************************/ + public FilterAndColumnsSetupData withHidePreview(Boolean hidePreview) + { + this.hidePreview = hidePreview; + return (this); + } + + + + /******************************************************************************* + ** Getter for filterFieldName + *******************************************************************************/ + public String getFilterFieldName() + { + return (this.filterFieldName); + } + + + + /******************************************************************************* + ** Setter for filterFieldName + *******************************************************************************/ + public void setFilterFieldName(String filterFieldName) + { + this.filterFieldName = filterFieldName; + } + + + + /******************************************************************************* + ** Fluent setter for filterFieldName + *******************************************************************************/ + public FilterAndColumnsSetupData withFilterFieldName(String filterFieldName) + { + this.filterFieldName = filterFieldName; + return (this); + } + + + + /******************************************************************************* + ** Getter for columnFieldName + *******************************************************************************/ + public String getColumnFieldName() + { + return (this.columnFieldName); + } + + + + /******************************************************************************* + ** Setter for columnFieldName + *******************************************************************************/ + public void setColumnFieldName(String columnFieldName) + { + this.columnFieldName = columnFieldName; + } + + + + /******************************************************************************* + ** Fluent setter for columnFieldName + *******************************************************************************/ + public FilterAndColumnsSetupData withColumnFieldName(String columnFieldName) + { + this.columnFieldName = columnFieldName; + return (this); + } + } From f4b54518fa52ad1129336758b68c931412811bd1 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Tue, 14 Jan 2025 10:53:53 -0600 Subject: [PATCH 2/4] Override getDefault, to return a NOOP instance --- .../metadata/fields/FieldDisplayBehavior.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/FieldDisplayBehavior.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/FieldDisplayBehavior.java index 5ea1cfa3..9fbdecdf 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/FieldDisplayBehavior.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/FieldDisplayBehavior.java @@ -22,11 +22,45 @@ package com.kingsrook.qqq.backend.core.model.metadata.fields; +import java.util.List; +import com.kingsrook.qqq.backend.core.actions.values.ValueBehaviorApplier; +import com.kingsrook.qqq.backend.core.model.data.QRecord; +import com.kingsrook.qqq.backend.core.model.metadata.QInstance; +import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; + + /******************************************************************************* ** Interface to mark a field behavior as one to be used during generating ** display values. *******************************************************************************/ public interface FieldDisplayBehavior> extends FieldBehavior { + NoopFieldDisplayBehavior NOOP = new NoopFieldDisplayBehavior(); + /*************************************************************************** + ** + ***************************************************************************/ + @Override + @SuppressWarnings("unchecked") + default T getDefault() + { + return (T) NOOP; + } + + + /*************************************************************************** + ** a default implementation for this behavior type, which does nothing. + ***************************************************************************/ + class NoopFieldDisplayBehavior implements FieldDisplayBehavior + { + + /*************************************************************************** + ** + ***************************************************************************/ + @Override + public void apply(ValueBehaviorApplier.Action action, List recordList, QInstance instance, QTableMetaData table, QFieldMetaData field) + { + + } + } } From 4b904471aff54b53286a70e9c4f7219e60ec3168 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Tue, 14 Jan 2025 10:54:24 -0600 Subject: [PATCH 3/4] Initial checkin - reusable FieldDisplayBehavior for fields storing a JSON-serialized queryFilter. --- .../FilterJsonFieldDisplayValueFormatter.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/FilterJsonFieldDisplayValueFormatter.java diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/FilterJsonFieldDisplayValueFormatter.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/FilterJsonFieldDisplayValueFormatter.java new file mode 100644 index 00000000..7c5cf7e4 --- /dev/null +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/FilterJsonFieldDisplayValueFormatter.java @@ -0,0 +1,56 @@ +/* + * Copyright © 2022-2024. ColdTrack . All Rights Reserved. + */ + +package com.kingsrook.qqq.backend.core.model.metadata.fields; + + +import java.util.List; +import java.util.function.Consumer; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.kingsrook.qqq.backend.core.actions.values.ValueBehaviorApplier; +import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter; +import com.kingsrook.qqq.backend.core.model.data.QRecord; +import com.kingsrook.qqq.backend.core.model.metadata.QInstance; +import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; +import com.kingsrook.qqq.backend.core.utils.CollectionUtils; +import com.kingsrook.qqq.backend.core.utils.JsonUtils; +import com.kingsrook.qqq.backend.core.utils.StringUtils; + + +/******************************************************************************* + ** Display value formatter for fields which store a QQueryFilter as JSON. + *******************************************************************************/ +public class FilterJsonFieldDisplayValueFormatter implements FieldDisplayBehavior +{ + private static Consumer jsonMapperCustomizer = om -> om.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + + + + /******************************************************************************* + ** + *******************************************************************************/ + @Override + public void apply(ValueBehaviorApplier.Action action, List recordList, QInstance instance, QTableMetaData table, QFieldMetaData field) + { + for(QRecord record : CollectionUtils.nonNullList(recordList)) + { + String queryFilterJson = record.getValueString(field.getName()); + if(StringUtils.hasContent(queryFilterJson)) + { + try + { + QQueryFilter qQueryFilter = JsonUtils.toObject(queryFilterJson, QQueryFilter.class, jsonMapperCustomizer); + int criteriaCount = CollectionUtils.nonNullList(qQueryFilter.getCriteria()).size(); + record.setDisplayValue(field.getName(), criteriaCount + " Filter" + StringUtils.plural(criteriaCount)); + } + catch(Exception e) + { + record.setDisplayValue(field.getName(), "Invalid Filter..."); + } + } + } + } + +} From 68f9bb20f7fe5c6d455748147aec074980b72827 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Tue, 14 Jan 2025 11:07:16 -0600 Subject: [PATCH 4/4] Copyright --- .../FilterJsonFieldDisplayValueFormatter.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/FilterJsonFieldDisplayValueFormatter.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/FilterJsonFieldDisplayValueFormatter.java index 7c5cf7e4..00b7475e 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/FilterJsonFieldDisplayValueFormatter.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/FilterJsonFieldDisplayValueFormatter.java @@ -1,5 +1,22 @@ /* - * Copyright © 2022-2024. ColdTrack . All Rights Reserved. + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2025. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package com.kingsrook.qqq.backend.core.model.metadata.fields;