From 9aa25b4f1472b407e8c0da5301fbbfe63ce50641 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Tue, 18 Mar 2025 10:43:40 -0500 Subject: [PATCH] Add exportStyleCustomizer to QReportMetaData, plus clonable here and on child metadata --- .../core/model/metadata/layout/QIcon.java | 23 +++- .../metadata/reporting/QReportDataSource.java | 37 ++++++- .../metadata/reporting/QReportMetaData.java | 100 +++++++++++++++++- 3 files changed, 154 insertions(+), 6 deletions(-) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/layout/QIcon.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/layout/QIcon.java index 72117679..71c26660 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/layout/QIcon.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/layout/QIcon.java @@ -31,7 +31,7 @@ package com.kingsrook.qqq.backend.core.model.metadata.layout; ** Future may allow something like a "namespace", and/or multiple icons for ** use in different frontends, etc. *******************************************************************************/ -public class QIcon +public class QIcon implements Cloneable { private String name; private String path; @@ -58,6 +58,25 @@ public class QIcon + /*************************************************************************** + ** + ***************************************************************************/ + @Override + public QIcon clone() + { + try + { + QIcon clone = (QIcon) super.clone(); + return clone; + } + catch(CloneNotSupportedException e) + { + throw new AssertionError(); + } + } + + + /******************************************************************************* ** Getter for name ** @@ -154,6 +173,4 @@ public class QIcon this.color = color; return (this); } - - } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/reporting/QReportDataSource.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/reporting/QReportDataSource.java index 843c5241..712e1513 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/reporting/QReportDataSource.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/reporting/QReportDataSource.java @@ -40,7 +40,7 @@ import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference; ** (optionally along with queryJoins and queryInputCustomizer) is used. ** - else a staticDataSupplier is used. *******************************************************************************/ -public class QReportDataSource +public class QReportDataSource implements Cloneable { private String name; @@ -55,6 +55,39 @@ public class QReportDataSource + /*************************************************************************** + ** + ***************************************************************************/ + @Override + public QReportDataSource clone() + { + try + { + QReportDataSource clone = (QReportDataSource) super.clone(); + if(queryFilter != null) + { + clone.queryFilter = queryFilter.clone(); + } + + if(queryJoins != null) + { + clone.queryJoins = new ArrayList<>(); + for(QueryJoin join : queryJoins) + { + queryJoins.add(join.clone()); + } + } + + return clone; + } + catch(CloneNotSupportedException e) + { + throw new AssertionError(); + } + } + + + /******************************************************************************* ** Getter for name ** @@ -274,6 +307,7 @@ public class QReportDataSource } + /******************************************************************************* ** Getter for customRecordSource *******************************************************************************/ @@ -303,5 +337,4 @@ public class QReportDataSource return (this); } - } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/reporting/QReportMetaData.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/reporting/QReportMetaData.java index 649de4ee..c5b9bf9f 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/reporting/QReportMetaData.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/reporting/QReportMetaData.java @@ -26,6 +26,7 @@ import java.util.ArrayList; import java.util.List; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; import com.kingsrook.qqq.backend.core.model.metadata.TopLevelMetaDataInterface; +import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference; import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData; import com.kingsrook.qqq.backend.core.model.metadata.layout.QAppChildMetaData; import com.kingsrook.qqq.backend.core.model.metadata.layout.QIcon; @@ -37,7 +38,7 @@ import com.kingsrook.qqq.backend.core.utils.CollectionUtils; /******************************************************************************* ** Meta-data definition of a report generated by QQQ *******************************************************************************/ -public class QReportMetaData implements QAppChildMetaData, MetaDataWithPermissionRules, TopLevelMetaDataInterface +public class QReportMetaData implements QAppChildMetaData, MetaDataWithPermissionRules, TopLevelMetaDataInterface, Cloneable { private String name; private String label; @@ -52,6 +53,72 @@ public class QReportMetaData implements QAppChildMetaData, MetaDataWithPermissio private QIcon icon; + private QCodeReference exportStyleCustomizer; + + + /*************************************************************************** + ** + ***************************************************************************/ + @Override + public QReportMetaData clone() + { + try + { + QReportMetaData clone = (QReportMetaData) super.clone(); + + ////////////////////////////// + // Deep copy mutable fields // + ////////////////////////////// + if(this.inputFields != null) + { + clone.inputFields = new ArrayList<>(); + for(QFieldMetaData inputField : this.inputFields) + { + clone.inputFields.add(inputField.clone()); + } + } + + if(this.dataSources != null) + { + clone.dataSources = new ArrayList<>(); + for(QReportDataSource dataSource : this.dataSources) + { + clone.dataSources.add(dataSource.clone()); + } + } + + if(this.views != null) + { + clone.views = new ArrayList<>(); + for(QReportView view : this.views) + { + clone.views.add(view.clone()); + } + } + + if(this.permissionRules != null) + { + clone.permissionRules = this.permissionRules.clone(); + } + + if(this.icon != null) + { + clone.icon = this.icon.clone(); + } + + if(this.exportStyleCustomizer != null) + { + clone.exportStyleCustomizer = this.exportStyleCustomizer.clone(); + } + + return clone; + } + catch(CloneNotSupportedException e) + { + throw new AssertionError("Cloning not supported", e); + } + } + /******************************************************************************* @@ -397,4 +464,35 @@ public class QReportMetaData implements QAppChildMetaData, MetaDataWithPermissio qInstance.addReport(this); } + + /******************************************************************************* + ** Getter for exportStyleCustomizer + *******************************************************************************/ + public QCodeReference getExportStyleCustomizer() + { + return (this.exportStyleCustomizer); + } + + + + /******************************************************************************* + ** Setter for exportStyleCustomizer + *******************************************************************************/ + public void setExportStyleCustomizer(QCodeReference exportStyleCustomizer) + { + this.exportStyleCustomizer = exportStyleCustomizer; + } + + + + /******************************************************************************* + ** Fluent setter for exportStyleCustomizer + *******************************************************************************/ + public QReportMetaData withExportStyleCustomizer(QCodeReference exportStyleCustomizer) + { + this.exportStyleCustomizer = exportStyleCustomizer; + return (this); + } + + }