diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/AdornmentType.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/AdornmentType.java
new file mode 100644
index 00000000..d476d993
--- /dev/null
+++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/AdornmentType.java
@@ -0,0 +1,88 @@
+/*
+ * QQQ - Low-code Application Framework for Engineers.
+ * Copyright (C) 2021-2022. 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;
+
+
+import java.io.Serializable;
+import com.kingsrook.qqq.backend.core.utils.Pair;
+
+
+/*******************************************************************************
+ ** Types of adornments that can be added to fields - with utilities for
+ ** constructing their values.
+ *******************************************************************************/
+public enum AdornmentType
+{
+ LINK,
+ CHIP,
+ SIZE;
+
+
+
+ /*******************************************************************************
+ **
+ *******************************************************************************/
+ public interface LinkValues
+ {
+ String TARGET = "target";
+ }
+
+
+
+ /*******************************************************************************
+ **
+ *******************************************************************************/
+ public interface ChipValues
+ {
+ /*******************************************************************************
+ **
+ *******************************************************************************/
+ static Pair colorValue(Serializable value, String colorName)
+ {
+ return (new Pair<>("color." + value, colorName));
+ }
+
+ /*******************************************************************************
+ **
+ *******************************************************************************/
+ static Pair iconValue(Serializable value, String iconName)
+ {
+ return (new Pair<>("icon." + value, iconName));
+ }
+ }
+
+
+
+ /*******************************************************************************
+ **
+ *******************************************************************************/
+ public interface SizeValues
+ {
+ String WIDTH = "width";
+ String XSMALL = "xsmall";
+ String SMALL = "small";
+ String MEDIUM = "medium";
+ String LARGE = "large";
+ String XLARGE = "xlarge";
+ }
+
+}
diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/FieldAdornment.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/FieldAdornment.java
new file mode 100644
index 00000000..69d119e3
--- /dev/null
+++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/FieldAdornment.java
@@ -0,0 +1,167 @@
+/*
+ * QQQ - Low-code Application Framework for Engineers.
+ * Copyright (C) 2021-2022. 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;
+
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+import com.kingsrook.qqq.backend.core.utils.Pair;
+
+
+/*******************************************************************************
+ ** Special fancy things that fields might do in UIs.
+ *******************************************************************************/
+public class FieldAdornment
+{
+ private AdornmentType type;
+ private Map values = new HashMap<>();
+
+
+
+ /*******************************************************************************
+ ** Constructor
+ **
+ *******************************************************************************/
+ public FieldAdornment()
+ {
+ }
+
+
+
+ /*******************************************************************************
+ ** Constructor
+ **
+ *******************************************************************************/
+ public FieldAdornment(AdornmentType type)
+ {
+ this.type = type;
+ }
+
+
+
+ /*******************************************************************************
+ ** Constructor
+ **
+ *******************************************************************************/
+ public FieldAdornment(AdornmentType type, Map values)
+ {
+ this.type = type;
+ this.values = values;
+ }
+
+
+
+ /*******************************************************************************
+ ** Getter for type
+ **
+ *******************************************************************************/
+ public AdornmentType getType()
+ {
+ return type;
+ }
+
+
+
+ /*******************************************************************************
+ ** Setter for type
+ **
+ *******************************************************************************/
+ public void setType(AdornmentType type)
+ {
+ this.type = type;
+ }
+
+
+
+ /*******************************************************************************
+ ** Fluent setter for type
+ **
+ *******************************************************************************/
+ public FieldAdornment withType(AdornmentType type)
+ {
+ this.type = type;
+ return (this);
+ }
+
+
+
+ /*******************************************************************************
+ ** Getter for values
+ **
+ *******************************************************************************/
+ public Map getValues()
+ {
+ return values;
+ }
+
+
+
+ /*******************************************************************************
+ ** Setter for values
+ **
+ *******************************************************************************/
+ public void setValues(Map values)
+ {
+ this.values = values;
+ }
+
+
+
+ /*******************************************************************************
+ ** Fluent setter for values
+ **
+ *******************************************************************************/
+ public FieldAdornment withValues(Map values)
+ {
+ this.values = values;
+ return (this);
+ }
+
+
+
+ /*******************************************************************************
+ ** Fluent setter for values
+ **
+ *******************************************************************************/
+ public FieldAdornment withValue(String key, Serializable value)
+ {
+ if(this.values == null)
+ {
+ this.values = new HashMap<>();
+ }
+ this.values.put(key, value);
+ return (this);
+ }
+
+
+
+ /*******************************************************************************
+ ** Fluent setter for values
+ **
+ *******************************************************************************/
+ public FieldAdornment withValue(Pair value)
+ {
+ return (withValue(value.getA(), value.getB()));
+ }
+
+}
diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/QFieldMetaData.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/QFieldMetaData.java
index 156a984f..8bdd67f9 100644
--- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/QFieldMetaData.java
+++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/QFieldMetaData.java
@@ -24,6 +24,8 @@ package com.kingsrook.qqq.backend.core.model.metadata.fields;
import java.io.Serializable;
import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Optional;
import com.github.hervian.reflection.Fun;
import com.kingsrook.qqq.backend.core.exceptions.QException;
@@ -54,6 +56,8 @@ public class QFieldMetaData
private Serializable defaultValue;
private String possibleValueSourceName;
+ private List adornments;
+
/*******************************************************************************
@@ -455,4 +459,54 @@ public class QFieldMetaData
return (this);
}
+
+
+ /*******************************************************************************
+ ** Getter for adornments
+ **
+ *******************************************************************************/
+ public List getAdornments()
+ {
+ return adornments;
+ }
+
+
+
+ /*******************************************************************************
+ ** Setter for adornments
+ **
+ *******************************************************************************/
+ public void setAdornments(List adornments)
+ {
+ this.adornments = adornments;
+ }
+
+
+
+ /*******************************************************************************
+ ** Fluent setter for adornments
+ **
+ *******************************************************************************/
+ public QFieldMetaData withFieldAdornments(List adornments)
+ {
+ this.adornments = adornments;
+ return (this);
+ }
+
+
+
+ /*******************************************************************************
+ ** Fluent setter for adornments
+ **
+ *******************************************************************************/
+ public QFieldMetaData withFieldAdornment(FieldAdornment adornment)
+ {
+ if(this.adornments == null)
+ {
+ this.adornments = new ArrayList<>();
+ }
+ this.adornments.add(adornment);
+ return (this);
+ }
+
}
diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/frontend/QFrontendFieldMetaData.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/frontend/QFrontendFieldMetaData.java
index 4dbbcfc6..d4414208 100644
--- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/frontend/QFrontendFieldMetaData.java
+++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/frontend/QFrontendFieldMetaData.java
@@ -22,8 +22,10 @@
package com.kingsrook.qqq.backend.core.model.metadata.frontend;
+import java.util.List;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.kingsrook.qqq.backend.core.model.metadata.fields.FieldAdornment;
import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldType;
@@ -44,6 +46,8 @@ public class QFrontendFieldMetaData
private String possibleValueSourceName;
private String displayFormat;
+ private List adornments;
+
//////////////////////////////////////////////////////////////////////////////////
// do not add setters. take values from the source-object in the constructor!! //
//////////////////////////////////////////////////////////////////////////////////
@@ -62,6 +66,7 @@ public class QFrontendFieldMetaData
this.isEditable = fieldMetaData.getIsEditable();
this.possibleValueSourceName = fieldMetaData.getPossibleValueSourceName();
this.displayFormat = fieldMetaData.getDisplayFormat();
+ this.adornments = fieldMetaData.getAdornments();
}
@@ -132,6 +137,17 @@ public class QFrontendFieldMetaData
+ /*******************************************************************************
+ ** Getter for adornments
+ **
+ *******************************************************************************/
+ public List getAdornments()
+ {
+ return adornments;
+ }
+
+
+
/*******************************************************************************
** Getter for possibleValueSourceName
**