From 4b904471aff54b53286a70e9c4f7219e60ec3168 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Tue, 14 Jan 2025 10:54:24 -0600 Subject: [PATCH] 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..."); + } + } + } + } + +}