From 89a093ca4907472df27a052df8a928722db4d996 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Tak=C3=A1cs?= <93127072+PeterTakacs300@users.noreply.github.com> Date: Tue, 11 Apr 2023 16:22:10 +0200 Subject: [PATCH] IDEMPIERE-5482 - Field Style Scope HTML Element (#1572) * IDEMPIERE-5482 - Field Style Scope HTML Element * IDEMPIERE-5482 - implemented in report engine, removed the new field * IDEMPIERE-5482 - add IsWrapWithSpan to AD_Style * IDEMPIERE-5482 - pr1572 patch --- .../oracle/202304111343_IDEMPIERE-5482.sql | 30 +++++++ .../202304111343_IDEMPIERE-5482.sql | 27 +++++++ .../src/org/compiere/model/I_AD_Style.java | 15 +++- .../src/org/compiere/model/X_AD_Style.java | 69 ++++++++++++++-- .../src/org/compiere/print/ReportEngine.java | 81 +++++++++++++------ .../WInfoWindowListItemRenderer.java | 32 ++++++-- 6 files changed, 214 insertions(+), 40 deletions(-) create mode 100644 migration/iD11/oracle/202304111343_IDEMPIERE-5482.sql create mode 100644 migration/iD11/postgresql/202304111343_IDEMPIERE-5482.sql diff --git a/migration/iD11/oracle/202304111343_IDEMPIERE-5482.sql b/migration/iD11/oracle/202304111343_IDEMPIERE-5482.sql new file mode 100644 index 0000000000..08c6b4629d --- /dev/null +++ b/migration/iD11/oracle/202304111343_IDEMPIERE-5482.sql @@ -0,0 +1,30 @@ +-- IDEMPIERE-5482 +SELECT register_migration_script('202304111343_IDEMPIERE-5482.sql') FROM dual; + +SET SQLBLANKLINES ON +SET DEFINE OFF + +-- Apr 11, 2023, 1:43:46 PM CEST +INSERT INTO AD_Element (AD_Element_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,ColumnName,Name,Description,PrintName,EntityType,AD_Element_UU) VALUES (203805,0,0,'Y',TO_TIMESTAMP('2023-04-11 13:43:45','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2023-04-11 13:43:45','YYYY-MM-DD HH24:MI:SS'),100,'IsWrapWithSpan','Wrap With Span','Wrap content in Span and apply the Style to it.','Wrap With Span','D','8c87a12e-eded-48c5-89d4-7c49fd29f4fa') +; + +-- Apr 11, 2023, 1:46:32 PM CEST +INSERT INTO AD_Column (AD_Column_ID,Version,Name,Description,AD_Table_ID,ColumnName,DefaultValue,FieldLength,IsKey,IsParent,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsEncrypted,AD_Reference_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Element_ID,IsUpdateable,IsSelectionColumn,EntityType,IsSyncDatabase,IsAlwaysUpdateable,IsAutocomplete,IsAllowLogging,AD_Column_UU,IsAllowCopy,SeqNoSelection,IsToolbarButton,IsSecure,FKConstraintType,IsHtml) VALUES (215834,0,'Wrap With Span','Wrap content in Span and apply the Style to it.',200207,'IsWrapWithSpan','N',1,'N','N','Y','N','N',0,'N',20,0,0,'Y',TO_TIMESTAMP('2023-04-11 13:46:32','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2023-04-11 13:46:32','YYYY-MM-DD HH24:MI:SS'),100,203805,'Y','N','D','N','N','N','Y','5ca5f2d0-6f43-4643-b63d-6e299d20f869','Y',0,'N','N','N','N') +; + +-- Apr 11, 2023, 1:46:36 PM CEST +ALTER TABLE AD_Style ADD IsWrapWithSpan CHAR(1) DEFAULT 'N' CHECK (IsWrapWithSpan IN ('Y','N')) NOT NULL +; + +-- Apr 11, 2023, 1:46:55 PM CEST +INSERT INTO AD_Field (AD_Field_ID,Name,Description,AD_Tab_ID,AD_Column_ID,IsDisplayed,DisplayLength,SeqNo,IsSameLine,IsHeading,IsFieldOnly,IsEncrypted,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,IsReadOnly,IsCentrallyMaintained,EntityType,AD_Field_UU,IsDisplayedGrid,SeqNoGrid,XPosition,ColumnSpan) VALUES (207618,'Wrap With Span','Wrap content in Span and apply the Style to it.',200213,215834,'Y',1,70,'N','N','N','N',0,0,'Y',TO_TIMESTAMP('2023-04-11 13:46:55','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2023-04-11 13:46:55','YYYY-MM-DD HH24:MI:SS'),100,'N','Y','D','7ee72596-5bcd-47ea-a2ad-b6631a969034','Y',50,2,2) +; + +-- Apr 11, 2023, 1:47:29 PM CEST +UPDATE AD_Field SET IsDisplayed='Y', SeqNo=60, XPosition=2,Updated=TO_TIMESTAMP('2023-04-11 13:47:29','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=207618 +; + +-- Apr 11, 2023, 1:47:29 PM CEST +UPDATE AD_Field SET IsDisplayed='Y', SeqNo=70, XPosition=5,Updated=TO_TIMESTAMP('2023-04-11 13:47:29','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=204202 +; + diff --git a/migration/iD11/postgresql/202304111343_IDEMPIERE-5482.sql b/migration/iD11/postgresql/202304111343_IDEMPIERE-5482.sql new file mode 100644 index 0000000000..9a978e2643 --- /dev/null +++ b/migration/iD11/postgresql/202304111343_IDEMPIERE-5482.sql @@ -0,0 +1,27 @@ +-- IDEMPIERE-5482 +SELECT register_migration_script('202304111343_IDEMPIERE-5482.sql') FROM dual; + +-- Apr 11, 2023, 1:43:46 PM CEST +INSERT INTO AD_Element (AD_Element_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,ColumnName,Name,Description,PrintName,EntityType,AD_Element_UU) VALUES (203805,0,0,'Y',TO_TIMESTAMP('2023-04-11 13:43:45','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2023-04-11 13:43:45','YYYY-MM-DD HH24:MI:SS'),100,'IsWrapWithSpan','Wrap With Span','Wrap content in Span and apply the Style to it.','Wrap With Span','D','8c87a12e-eded-48c5-89d4-7c49fd29f4fa') +; + +-- Apr 11, 2023, 1:46:32 PM CEST +INSERT INTO AD_Column (AD_Column_ID,Version,Name,Description,AD_Table_ID,ColumnName,DefaultValue,FieldLength,IsKey,IsParent,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsEncrypted,AD_Reference_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Element_ID,IsUpdateable,IsSelectionColumn,EntityType,IsSyncDatabase,IsAlwaysUpdateable,IsAutocomplete,IsAllowLogging,AD_Column_UU,IsAllowCopy,SeqNoSelection,IsToolbarButton,IsSecure,FKConstraintType,IsHtml) VALUES (215834,0,'Wrap With Span','Wrap content in Span and apply the Style to it.',200207,'IsWrapWithSpan','N',1,'N','N','Y','N','N',0,'N',20,0,0,'Y',TO_TIMESTAMP('2023-04-11 13:46:32','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2023-04-11 13:46:32','YYYY-MM-DD HH24:MI:SS'),100,203805,'Y','N','D','N','N','N','Y','5ca5f2d0-6f43-4643-b63d-6e299d20f869','Y',0,'N','N','N','N') +; + +-- Apr 11, 2023, 1:46:36 PM CEST +ALTER TABLE AD_Style ADD COLUMN IsWrapWithSpan CHAR(1) DEFAULT 'N' CHECK (IsWrapWithSpan IN ('Y','N')) NOT NULL +; + +-- Apr 11, 2023, 1:46:55 PM CEST +INSERT INTO AD_Field (AD_Field_ID,Name,Description,AD_Tab_ID,AD_Column_ID,IsDisplayed,DisplayLength,SeqNo,IsSameLine,IsHeading,IsFieldOnly,IsEncrypted,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,IsReadOnly,IsCentrallyMaintained,EntityType,AD_Field_UU,IsDisplayedGrid,SeqNoGrid,XPosition,ColumnSpan) VALUES (207618,'Wrap With Span','Wrap content in Span and apply the Style to it.',200213,215834,'Y',1,70,'N','N','N','N',0,0,'Y',TO_TIMESTAMP('2023-04-11 13:46:55','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2023-04-11 13:46:55','YYYY-MM-DD HH24:MI:SS'),100,'N','Y','D','7ee72596-5bcd-47ea-a2ad-b6631a969034','Y',50,2,2) +; + +-- Apr 11, 2023, 1:47:29 PM CEST +UPDATE AD_Field SET IsDisplayed='Y', SeqNo=60, XPosition=2,Updated=TO_TIMESTAMP('2023-04-11 13:47:29','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=207618 +; + +-- Apr 11, 2023, 1:47:29 PM CEST +UPDATE AD_Field SET IsDisplayed='Y', SeqNo=70, XPosition=5,Updated=TO_TIMESTAMP('2023-04-11 13:47:29','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=204202 +; + diff --git a/org.adempiere.base/src/org/compiere/model/I_AD_Style.java b/org.adempiere.base/src/org/compiere/model/I_AD_Style.java index 9f3acbb133..00090f8d97 100644 --- a/org.adempiere.base/src/org/compiere/model/I_AD_Style.java +++ b/org.adempiere.base/src/org/compiere/model/I_AD_Style.java @@ -22,7 +22,7 @@ import org.compiere.util.KeyNamePair; /** Generated Interface for AD_Style * @author iDempiere (generated) - * @version Release 10 + * @version Release 11 */ public interface I_AD_Style { @@ -145,6 +145,19 @@ public interface I_AD_Style */ public boolean isActive(); + /** Column name IsWrapWithSpan */ + public static final String COLUMNNAME_IsWrapWithSpan = "IsWrapWithSpan"; + + /** Set Wrap With Span. + * Wrap content in Span and apply the Style to it. + */ + public void setIsWrapWithSpan (boolean IsWrapWithSpan); + + /** Get Wrap With Span. + * Wrap content in Span and apply the Style to it. + */ + public boolean isWrapWithSpan(); + /** Column name Name */ public static final String COLUMNNAME_Name = "Name"; diff --git a/org.adempiere.base/src/org/compiere/model/X_AD_Style.java b/org.adempiere.base/src/org/compiere/model/X_AD_Style.java index 8b60155749..600a617a32 100644 --- a/org.adempiere.base/src/org/compiere/model/X_AD_Style.java +++ b/org.adempiere.base/src/org/compiere/model/X_AD_Style.java @@ -21,16 +21,16 @@ import java.sql.ResultSet; import java.util.Properties; /** Generated Model for AD_Style - * @author iDempiere (generated) - * @version Release 10 - $Id$ */ + * @author iDempiere (generated) + * @version Release 11 - $Id$ */ @org.adempiere.base.Model(table="AD_Style") -public class X_AD_Style extends PO implements I_AD_Style, I_Persistent +public class X_AD_Style extends PO implements I_AD_Style, I_Persistent { /** * */ - private static final long serialVersionUID = 20221224L; + private static final long serialVersionUID = 20230411L; /** Standard Constructor */ public X_AD_Style (Properties ctx, int AD_Style_ID, String trxName) @@ -42,6 +42,8 @@ public class X_AD_Style extends PO implements I_AD_Style, I_Persistent setAD_Style_UU (null); setEntityType (null); // @SQL=SELECT CASE WHEN '@P|AdempiereSys:N@'='Y' THEN 'D' ELSE get_sysconfig('DEFAULT_ENTITYTYPE','U',0,0) END FROM Dual + setIsWrapWithSpan (false); +// N setName (null); } */ } @@ -56,6 +58,40 @@ public class X_AD_Style extends PO implements I_AD_Style, I_Persistent setAD_Style_UU (null); setEntityType (null); // @SQL=SELECT CASE WHEN '@P|AdempiereSys:N@'='Y' THEN 'D' ELSE get_sysconfig('DEFAULT_ENTITYTYPE','U',0,0) END FROM Dual + setIsWrapWithSpan (false); +// N + setName (null); + } */ + } + + /** Standard Constructor */ + public X_AD_Style (Properties ctx, String AD_Style_UU, String trxName) + { + super (ctx, AD_Style_UU, trxName); + /** if (AD_Style_UU == null) + { + setAD_Style_ID (0); + setAD_Style_UU (null); + setEntityType (null); +// @SQL=SELECT CASE WHEN '@P|AdempiereSys:N@'='Y' THEN 'D' ELSE get_sysconfig('DEFAULT_ENTITYTYPE','U',0,0) END FROM Dual + setIsWrapWithSpan (false); +// N + setName (null); + } */ + } + + /** Standard Constructor */ + public X_AD_Style (Properties ctx, String AD_Style_UU, String trxName, String ... virtualColumns) + { + super (ctx, AD_Style_UU, trxName, virtualColumns); + /** if (AD_Style_UU == null) + { + setAD_Style_ID (0); + setAD_Style_UU (null); + setEntityType (null); +// @SQL=SELECT CASE WHEN '@P|AdempiereSys:N@'='Y' THEN 'D' ELSE get_sysconfig('DEFAULT_ENTITYTYPE','U',0,0) END FROM Dual + setIsWrapWithSpan (false); +// N setName (null); } */ } @@ -67,7 +103,7 @@ public class X_AD_Style extends PO implements I_AD_Style, I_Persistent } /** AccessLevel - * @return 6 - System - Client + * @return 6 - System - Client */ protected int get_AccessLevel() { @@ -161,6 +197,29 @@ public class X_AD_Style extends PO implements I_AD_Style, I_Persistent return (String)get_Value(COLUMNNAME_EntityType); } + /** Set Wrap With Span. + @param IsWrapWithSpan Wrap content in Span and apply the Style to it. + */ + public void setIsWrapWithSpan (boolean IsWrapWithSpan) + { + set_Value (COLUMNNAME_IsWrapWithSpan, Boolean.valueOf(IsWrapWithSpan)); + } + + /** Get Wrap With Span. + @return Wrap content in Span and apply the Style to it. + */ + public boolean isWrapWithSpan() + { + Object oo = get_Value(COLUMNNAME_IsWrapWithSpan); + if (oo != null) + { + if (oo instanceof Boolean) + return ((Boolean)oo).booleanValue(); + return "Y".equals(oo); + } + return false; + } + /** Set Name. @param Name Alphanumeric identifier of the entity */ diff --git a/org.adempiere.base/src/org/compiere/print/ReportEngine.java b/org.adempiere.base/src/org/compiere/print/ReportEngine.java index 0898c51a01..83ace82417 100644 --- a/org.adempiere.base/src/org/compiere/print/ReportEngine.java +++ b/org.adempiere.base/src/org/compiere/print/ReportEngine.java @@ -63,9 +63,11 @@ import org.adempiere.exceptions.AdempiereException; import org.adempiere.pdf.Document; import org.adempiere.print.export.PrintDataExcelExporter; import org.adempiere.print.export.PrintDataXLSXExporter; +import org.apache.ecs.MultiPartElement; import org.apache.ecs.XhtmlDocument; import org.apache.ecs.xhtml.a; import org.apache.ecs.xhtml.script; +import org.apache.ecs.xhtml.span; import org.apache.ecs.xhtml.style; import org.apache.ecs.xhtml.table; import org.apache.ecs.xhtml.tbody; @@ -994,29 +996,7 @@ queued-job-count = 0 (class javax.print.attribute.standard.QueuedJobCount) { td td = new td(); tr.addElement(td); - //set style - int AD_FieldStyle_ID = item.getAD_FieldStyle_ID(); - if(AD_FieldStyle_ID > 0) { - MStyle style = MStyle.get(Env.getCtx(), AD_FieldStyle_ID); - X_AD_StyleLine[] lines = style.getStyleLines(); - StringBuilder styleBuilder = new StringBuilder(); - for (X_AD_StyleLine line : lines) - { - String inlineStyle = line.getInlineStyle().trim(); - String displayLogic = line.getDisplayLogic(); - if (!Util.isEmpty(displayLogic)) - { - if (!Evaluator.evaluateLogic(new PrintDataEvaluatee(null, m_printData), displayLogic)) - continue; - } - if (styleBuilder.length() > 0 && !(styleBuilder.charAt(styleBuilder.length()-1)==';')) - styleBuilder.append("; "); - styleBuilder.append(inlineStyle); - } - if(styleBuilder.length() > 0) - td.setStyle(styleBuilder.toString()); - } - // + MStyle style = item.getAD_FieldStyle_ID() > 0 ? MStyle.get(Env.getCtx(), item.getAD_FieldStyle_ID()) : null; Object obj = instanceAttributeColumn != null ? instanceAttributeColumn.getPrintDataElement(row) : m_printData.getNodeByPrintFormatItemId(item.getAD_PrintFormatItem_ID()); if (obj == null || !isDisplayPFItem(item)){ @@ -1116,21 +1096,46 @@ queued-job-count = 0 (class javax.print.attribute.standard.QueuedJobCount) } if (isZoom) { //link for column - a href = new a("javascript:void(0)"); + a href = new a("javascript:void(0)"); href.setID(pde.getColumnName() + "_" + row + "_a"); td.addElement(href); href.addElement(Util.maskHTML(value)); if (cssPrefix != null) href.setClass(cssPrefix + "-href"); + // Set Style + if(style != null && style.isWrapWithSpan()) + setStyle(href, style); + else + setStyle(td, style); extension.extendIDColumn(row, td, href, pde); } else { - td.addElement(Util.maskHTML(value)); + // Set Style + if(style != null && style.isWrapWithSpan()) { + span span = new span(); + setStyle(span, style); + span.addElement(Util.maskHTML(value)); + td.addElement(span); + } + else { + setStyle(td, style); + td.addElement(Util.maskHTML(value)); + } } } else { - td.addElement(Util.maskHTML(value)); + // Set Style + if(style != null && style.isWrapWithSpan()) { + span span = new span(); + setStyle(span, style); + span.addElement(Util.maskHTML(value)); + td.addElement(span); + } + else { + setStyle(td, style); + td.addElement(Util.maskHTML(value)); + } } if (cssPrefix != null) { @@ -2764,4 +2769,28 @@ queued-job-count = 0 (class javax.print.attribute.standard.QueuedJobCount) instance.setReportType(type); } } + + private void setStyle(MultiPartElement element, MStyle style) { + if (style == null || style.getAD_Style_ID() == 0) + return; + + X_AD_StyleLine[] lines = style.getStyleLines(); + StringBuilder styleBuilder = new StringBuilder(); + for (X_AD_StyleLine line : lines) + { + String inlineStyle = line.getInlineStyle().trim(); + String displayLogic = line.getDisplayLogic(); + if (!Util.isEmpty(displayLogic)) + { + if (!Evaluator.evaluateLogic(new PrintDataEvaluatee(null, m_printData), displayLogic)) + continue; + } + if (styleBuilder.length() > 0 && !(styleBuilder.charAt(styleBuilder.length()-1)==';')) + styleBuilder.append("; "); + styleBuilder.append(inlineStyle); + } + if(styleBuilder.length() > 0) + element.setStyle(styleBuilder.toString()); + // + } } // ReportEngine diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/WInfoWindowListItemRenderer.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/WInfoWindowListItemRenderer.java index 2dc37b1008..69b4452e1a 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/WInfoWindowListItemRenderer.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/WInfoWindowListItemRenderer.java @@ -38,7 +38,10 @@ import org.compiere.model.MStyle; import org.compiere.util.Env; import org.compiere.util.Evaluatee; import org.compiere.util.KeyNamePair; +import org.zkoss.zhtml.Text; +import org.zkoss.zk.ui.HtmlBasedComponent; import org.zkoss.zul.Listcell; +import org.zkoss.zul.Span; /** * List item renderer for Info Window list box. @@ -165,14 +168,15 @@ public class WInfoWindowListItemRenderer extends WListItemRenderer return value; } }); - if (styleStr != null && styleStr.startsWith(MStyle.SCLASS_PREFIX)) { - String sclass = styleStr.substring(MStyle.SCLASS_PREFIX.length()); - listcell.setSclass(sclass); - } else if (style != null && styleStr.startsWith(MStyle.ZCLASS_PREFIX)) { - String zclass = styleStr.substring(MStyle.ZCLASS_PREFIX.length()); - listcell.setZclass(zclass); - } else { - ZkCssHelper.appendStyle(listcell, styleStr); + if(style.isWrapWithSpan()) { + Span span = new Span(); + span.appendChild(new Text(listcell.getValue())); + listcell.setLabel(null); + listcell.appendChild(span); + setStyle(span, styleStr); + } + else { + setStyle(listcell, styleStr); } } } @@ -182,4 +186,16 @@ public class WInfoWindowListItemRenderer extends WListItemRenderer return listcell; } + + private void setStyle(HtmlBasedComponent component, String style) { + if (style != null && style.startsWith(MStyle.SCLASS_PREFIX)) { + String sclass = style.substring(MStyle.SCLASS_PREFIX.length()); + component.setSclass(sclass); + } else if (style != null && style.startsWith(MStyle.ZCLASS_PREFIX)) { + String zclass = style.substring(MStyle.ZCLASS_PREFIX.length()); + component.setZclass(zclass); + } else { + ZkCssHelper.appendStyle(component, style); + } + } }