Add exportStyleCustomizer to QReportMetaData, plus clonable here and on child metadata

This commit is contained in:
2025-03-18 10:43:40 -05:00
parent b863d62688
commit 9aa25b4f14
3 changed files with 154 additions and 6 deletions

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}