From 73c05c3828f9f720f1cba85bb2f606c47b48e349 Mon Sep 17 00:00:00 2001 From: Murilo Habermann Torquato Date: Tue, 17 Sep 2019 23:47:21 -0300 Subject: [PATCH] IDEMPIERE-3831 info column style --- .../oracle/201909121529_IDEMPIERE-3831.sql | 32 +++++ .../201909121529_IDEMPIERE-3831.sql | 29 ++++ .../org/compiere/model/I_AD_InfoColumn.java | 15 +++ .../org/compiere/model/X_AD_InfoColumn.java | 30 ++++- .../WInfoWindowListItemRenderer.java | 126 +++++++++++++++++- .../webui/component/WListItemRenderer.java | 2 +- .../org/adempiere/webui/info/InfoWindow.java | 9 +- .../org/adempiere/webui/panel/InfoPanel.java | 1 + 8 files changed, 236 insertions(+), 8 deletions(-) create mode 100644 migration/i6.2z/oracle/201909121529_IDEMPIERE-3831.sql create mode 100644 migration/i6.2z/postgresql/201909121529_IDEMPIERE-3831.sql diff --git a/migration/i6.2z/oracle/201909121529_IDEMPIERE-3831.sql b/migration/i6.2z/oracle/201909121529_IDEMPIERE-3831.sql new file mode 100644 index 0000000000..8bb6b64059 --- /dev/null +++ b/migration/i6.2z/oracle/201909121529_IDEMPIERE-3831.sql @@ -0,0 +1,32 @@ +SET SQLBLANKLINES ON +SET DEFINE OFF + +-- IDEMPIERE-3831 Implement AD_FieldStyle for Info Windows +-- Sep 17, 2019, 3:25:02 PM BRT +INSERT INTO AD_Column (AD_Column_ID,Version,Name,Description,AD_Table_ID,ColumnName,FieldLength,IsKey,IsParent,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsEncrypted,AD_Reference_ID,AD_Reference_Value_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 (214051,0,'Field Style','Field CSS Style ',897,'AD_FieldStyle_ID',10,'N','N','N','N','N',0,'N',18,200121,0,0,'Y',TO_DATE('2019-09-17 15:25:02','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2019-09-17 15:25:02','YYYY-MM-DD HH24:MI:SS'),100,203012,'Y','N','D','N','N','N','Y','f70da853-fe44-41e9-9c68-62638cfc90d8','Y',0,'N','N','N','N') +; + +-- Sep 17, 2019, 3:25:08 PM BRT +UPDATE AD_Column SET FKConstraintName='ADFieldStyle_ADInfoColumn', FKConstraintType='N',Updated=TO_DATE('2019-09-17 15:25:08','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=214051 +; + +-- Sep 17, 2019, 3:25:08 PM BRT +ALTER TABLE AD_InfoColumn ADD AD_FieldStyle_ID NUMBER(10) DEFAULT NULL +; + +-- Sep 17, 2019, 3:25:08 PM BRT +ALTER TABLE AD_InfoColumn ADD CONSTRAINT ADFieldStyle_ADInfoColumn FOREIGN KEY (AD_FieldStyle_ID) REFERENCES ad_style(ad_style_id) DEFERRABLE INITIALLY DEFERRED +; + +-- Sep 17, 2019, 3:26:02 PM BRT +UPDATE AD_Column SET EntityType='D',Updated=TO_DATE('2019-09-17 15:26:02','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=214051 +; + +-- Sep 17, 2019, 3:26:12 PM BRT +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,ColumnSpan) VALUES (206178,'Field Style','Field CSS Style ',844,214051,'Y',10,310,'N','N','N','N',0,0,'Y',TO_DATE('2019-09-17 15:26:12','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2019-09-17 15:26:12','YYYY-MM-DD HH24:MI:SS'),100,'N','Y','D','d6b6f5e1-1436-49fc-b57a-12bb4b0c247c','Y',10280,2) +; + + +SELECT register_migration_script('201909121529_IDEMPIERE-3831.sql') FROM dual +; + diff --git a/migration/i6.2z/postgresql/201909121529_IDEMPIERE-3831.sql b/migration/i6.2z/postgresql/201909121529_IDEMPIERE-3831.sql new file mode 100644 index 0000000000..08dfabda39 --- /dev/null +++ b/migration/i6.2z/postgresql/201909121529_IDEMPIERE-3831.sql @@ -0,0 +1,29 @@ +-- IDEMPIERE-3831 Implement AD_FieldStyle for Info Windows +-- Sep 17, 2019, 3:25:02 PM BRT +INSERT INTO AD_Column (AD_Column_ID,Version,Name,Description,AD_Table_ID,ColumnName,FieldLength,IsKey,IsParent,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsEncrypted,AD_Reference_ID,AD_Reference_Value_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 (214051,0,'Field Style','Field CSS Style ',897,'AD_FieldStyle_ID',10,'N','N','N','N','N',0,'N',18,200121,0,0,'Y',TO_TIMESTAMP('2019-09-17 15:25:02','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2019-09-17 15:25:02','YYYY-MM-DD HH24:MI:SS'),100,203012,'Y','N','D','N','N','N','Y','f70da853-fe44-41e9-9c68-62638cfc90d8','Y',0,'N','N','N','N') +; + +-- Sep 17, 2019, 3:25:08 PM BRT +UPDATE AD_Column SET FKConstraintName='ADFieldStyle_ADInfoColumn', FKConstraintType='N',Updated=TO_TIMESTAMP('2019-09-17 15:25:08','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=214051 +; + +-- Sep 17, 2019, 3:25:08 PM BRT +ALTER TABLE AD_InfoColumn ADD COLUMN AD_FieldStyle_ID NUMERIC(10) DEFAULT NULL +; + +-- Sep 17, 2019, 3:25:08 PM BRT +ALTER TABLE AD_InfoColumn ADD CONSTRAINT ADFieldStyle_ADInfoColumn FOREIGN KEY (AD_FieldStyle_ID) REFERENCES ad_style(ad_style_id) DEFERRABLE INITIALLY DEFERRED +; + +-- Sep 17, 2019, 3:26:02 PM BRT +UPDATE AD_Column SET EntityType='D',Updated=TO_TIMESTAMP('2019-09-17 15:26:02','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=214051 +; + +-- Sep 17, 2019, 3:26:12 PM BRT +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,ColumnSpan) VALUES (206178,'Field Style','Field CSS Style ',844,214051,'Y',10,310,'N','N','N','N',0,0,'Y',TO_TIMESTAMP('2019-09-17 15:26:12','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2019-09-17 15:26:12','YYYY-MM-DD HH24:MI:SS'),100,'N','Y','D','d6b6f5e1-1436-49fc-b57a-12bb4b0c247c','Y',10280,2) +; + + +SELECT register_migration_script('201909121529_IDEMPIERE-3831.sql') FROM dual +; + diff --git a/org.adempiere.base/src/org/compiere/model/I_AD_InfoColumn.java b/org.adempiere.base/src/org/compiere/model/I_AD_InfoColumn.java index b90d8d0cba..992e3b2701 100644 --- a/org.adempiere.base/src/org/compiere/model/I_AD_InfoColumn.java +++ b/org.adempiere.base/src/org/compiere/model/I_AD_InfoColumn.java @@ -64,6 +64,21 @@ public interface I_AD_InfoColumn public org.compiere.model.I_AD_Element getAD_Element() throws RuntimeException; + /** Column name AD_FieldStyle_ID */ + public static final String COLUMNNAME_AD_FieldStyle_ID = "AD_FieldStyle_ID"; + + /** Set Field Style. + * Field CSS Style + */ + public void setAD_FieldStyle_ID (int AD_FieldStyle_ID); + + /** Get Field Style. + * Field CSS Style + */ + public int getAD_FieldStyle_ID(); + + public org.compiere.model.I_AD_Style getAD_FieldStyle() throws RuntimeException; + /** Column name AD_InfoColumn_ID */ public static final String COLUMNNAME_AD_InfoColumn_ID = "AD_InfoColumn_ID"; diff --git a/org.adempiere.base/src/org/compiere/model/X_AD_InfoColumn.java b/org.adempiere.base/src/org/compiere/model/X_AD_InfoColumn.java index b5e45e8738..cfcf6ce99c 100644 --- a/org.adempiere.base/src/org/compiere/model/X_AD_InfoColumn.java +++ b/org.adempiere.base/src/org/compiere/model/X_AD_InfoColumn.java @@ -30,7 +30,7 @@ public class X_AD_InfoColumn extends PO implements I_AD_InfoColumn, I_Persistent /** * */ - private static final long serialVersionUID = 20190106L; + private static final long serialVersionUID = 20190917L; /** Standard Constructor */ public X_AD_InfoColumn (Properties ctx, int AD_InfoColumn_ID, String trxName) @@ -118,6 +118,34 @@ public class X_AD_InfoColumn extends PO implements I_AD_InfoColumn, I_Persistent return ii.intValue(); } + public org.compiere.model.I_AD_Style getAD_FieldStyle() throws RuntimeException + { + return (org.compiere.model.I_AD_Style)MTable.get(getCtx(), org.compiere.model.I_AD_Style.Table_Name) + .getPO(getAD_FieldStyle_ID(), get_TrxName()); } + + /** Set Field Style. + @param AD_FieldStyle_ID + Field CSS Style + */ + public void setAD_FieldStyle_ID (int AD_FieldStyle_ID) + { + if (AD_FieldStyle_ID < 1) + set_Value (COLUMNNAME_AD_FieldStyle_ID, null); + else + set_Value (COLUMNNAME_AD_FieldStyle_ID, Integer.valueOf(AD_FieldStyle_ID)); + } + + /** Get Field Style. + @return Field CSS Style + */ + public int getAD_FieldStyle_ID () + { + Integer ii = (Integer)get_Value(COLUMNNAME_AD_FieldStyle_ID); + if (ii == null) + return 0; + return ii.intValue(); + } + /** Set Info Column. @param AD_InfoColumn_ID Info Window Column 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 799344fe50..3f4da1276b 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 @@ -28,11 +28,18 @@ import org.adempiere.webui.editor.WebEditorFactory; import org.adempiere.webui.event.ValueChangeEvent; import org.adempiere.webui.event.ValueChangeListener; import org.adempiere.webui.info.InfoWindow; +import org.adempiere.webui.theme.ThemeManager; import org.compiere.minigrid.ColumnInfo; import org.compiere.minigrid.IDColumn; import org.compiere.model.GridField; import org.compiere.model.MInfoColumn; +import org.compiere.model.MStyle; +import org.compiere.model.X_AD_StyleLine; +import org.compiere.util.Env; +import org.compiere.util.Evaluatee; +import org.compiere.util.Evaluator; import org.compiere.util.KeyNamePair; +import org.compiere.util.Util; import org.zkoss.zul.Listcell; public class WInfoWindowListItemRenderer extends WListItemRenderer @@ -72,16 +79,19 @@ public class WInfoWindowListItemRenderer extends WListItemRenderer Object obj = model.get(rowIndex); MInfoColumn infoColumn = gridDisplayedInfoColumns[columnIndex]; + if (infoColumn != null) + { - if(model.isSelected(obj) && infoColumn != null) // First index may be null + final GridField gridField = gridDisplayedColumnInfos[columnIndex].getGridField(); + final WEditor editor = WebEditorFactory.getEditor(gridField, false); + + if(model.isSelected(obj)) // First index may be null { if(infoColumn.isReadOnly() == false && columnIndex > 0) { ListCell listCell = new ListCell(); - final GridField gridField = gridDisplayedColumnInfos[columnIndex].getGridField(); - final WEditor editor = WebEditorFactory.getEditor(gridField, false); // Set editor value @@ -117,7 +127,117 @@ public class WInfoWindowListItemRenderer extends WListItemRenderer if(listcell == null) listcell = super.getCellComponent(table, field, rowIndex, columnIndex); + if (gridField.getAD_FieldStyle_ID() > 0) + { + MStyle style = MStyle.get(Env.getCtx(), gridField.getAD_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(); + String theme = line.getTheme(); + if (!Util.isEmpty(theme)) { + if (!ThemeManager.getTheme().equals(theme)) + continue; + } + if (!Util.isEmpty(displayLogic)) + { + Evaluatee ev = new Evaluatee() { + + @Override + public String get_ValueAsString(String variableName) { + String value = null; + + int idx = 0; + for (MInfoColumn ic : gridDisplayedInfoColumns) + { + if (ic != null && ic.getColumnName().equals(variableName)) + { + value = String.valueOf(table.getValueAt(rowIndex, idx)); + break; + } + + idx++; + } + + return value; + } + }; + + if (!Evaluator.evaluateLogic(ev, displayLogic)) + continue; + } + + if (styleBuilder.length() > 0 && !(styleBuilder.charAt(styleBuilder.length()-1)==';')) + styleBuilder.append("; "); + styleBuilder.append(inlineStyle); + } + + //devCoffee #5960 + String styleStr = styleBuilder.toString(); + 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 { + listcell.setStyle(styleStr); + } + } + } + + if(listcell == null) + listcell = super.getCellComponent(table, field, rowIndex, columnIndex); + return listcell; } +// +// //devCoffee #5960 - Get CSS Style if pass through display logic. +// private String getStatusStyle(ListCell listcell, PO po) { +// if(po instanceof MInfoWindow) { +// if(po.get_ValueAsInt("AD_FieldStyle_ID") != 0 && listcell != null) { +// try { +// MTable t = new MTable(Env.getCtx(), po.get_ValueAsInt("AD_Table_ID"), null); +// PO recordPO = (PO) new Query(Env.getCtx(), t.getTableName(), t.getTableName() + "_ID =" + listcell.getValue(), null).first(); +// +// List lines = new Query(Env.getCtx(), X_AD_StyleLine.Table_Name, "AD_Style_ID = " + po.get_ValueAsInt("AD_FieldStyle_ID"), null).list(); +// +// StringBuilder styleBuilder = new StringBuilder(); +// for (X_AD_StyleLine line : lines) +// { +// String inlineStyle = line.getInlineStyle().trim(); +// String displayLogic = line.getDisplayLogic(); +// String theme = line.getTheme(); +// if (!Util.isEmpty(theme)) { +// if (!ThemeManager.getTheme().equals(theme)) +// continue; +// } +// if (!Util.isEmpty(displayLogic)) +// { +// if (!Evaluator.evaluateLogic(recordPO, displayLogic)) +// continue; +// } +// if (styleBuilder.length() > 0 && !(styleBuilder.charAt(styleBuilder.length()-1)==';')) +// styleBuilder.append("; "); +// +// styleBuilder.append(inlineStyle); +// } +// +// //listcell.setStyle(styleBuilder.toString()); +// return styleBuilder.toString(); +// } catch (Exception e) { +// throw new AdempiereException(e.getMessage()); +// } +// } +// } +// +// return ""; +// } + + + + } diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/WListItemRenderer.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/WListItemRenderer.java index c9b9558cf7..e71651ea85 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/WListItemRenderer.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/component/WListItemRenderer.java @@ -328,7 +328,7 @@ public class WListItemRenderer implements ListitemRenderer, EventListene AImage aImage = new AImage(url); Image image = new Image(); image.setContent(aImage); - image.setStyle("width: 48px; height: 48px;"); + image.setStyle("width: 16px; height: 16px; display: block;"); listcell.appendChild(image); listcell.setStyle("text-align: center;"); } catch (MalformedURLException e) { diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/info/InfoWindow.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/info/InfoWindow.java index 0070ab77bd..8266e1236b 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/info/InfoWindow.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/info/InfoWindow.java @@ -603,6 +603,7 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL vo.Description = desc != null ? desc : ""; String help = infoColumn.get_Translation("Help"); vo.Help = help != null ? help : ""; + vo.AD_FieldStyle_ID = infoColumn.getAD_FieldStyle_ID(); GridField gridField = new GridField(vo); gridFields.add(gridField); } @@ -628,14 +629,15 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL } } - if(hasEditable) - { + } + infoWindowListItemRenderer = new WInfoWindowListItemRenderer(this); contentPanel.setItemRenderer(infoWindowListItemRenderer); + if(hasEditable) + { contentPanel.setAllowIDColumnForReadWrite(true); infoWindowListItemRenderer.addTableValueChangeListener(contentPanel); // Replicated from WListbox constructor } - } StringBuilder builder = new StringBuilder(p_whereClause != null ? p_whereClause.trim() : ""); String infoWhereClause = infoWindow.getWhereClause(); @@ -2067,6 +2069,7 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL vo.Description = desc != null ? desc : ""; String help = infoColumn.get_Translation("Help"); vo.Help = help != null ? help : ""; + vo.AD_FieldStyle_ID = infoColumn.getAD_FieldStyle_ID(); GridField gridField = new GridField(vo); return gridField; diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/InfoPanel.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/InfoPanel.java index 98f71aab8b..2c479cf892 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/InfoPanel.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/InfoPanel.java @@ -2142,6 +2142,7 @@ public abstract class InfoPanel extends Window implements EventListener, null); saveResultSelection(getInfoColumnIDFromProcess(processModalDialog.getAD_Process_ID())); createT_Selection_InfoWindow(pInstanceID); + recordSelectedData.clear(); }else if (ProcessModalDialog.ON_WINDOW_CLOSE.equals(event.getName())){ if (processModalDialog.isCancel()){ //clear back