diff --git a/migration/i9/oracle/202203072105_IDEMPIERE-5222.sql b/migration/i9/oracle/202203072105_IDEMPIERE-5222.sql new file mode 100644 index 0000000000..4650d76ba0 --- /dev/null +++ b/migration/i9/oracle/202203072105_IDEMPIERE-5222.sql @@ -0,0 +1,18 @@ +-- IDEMPIERE-5222 Add Attach button to report viewer (similar to Archive but with Attachment) +SELECT register_migration_script('202203072105_IDEMPIERE-5222.sql') FROM dual; + +SET SQLBLANKLINES ON +SET DEFINE OFF + +-- Mar 7, 2022, 9:05:46 PM CET +INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('I','Document Attached',0,0,'Y',TO_TIMESTAMP('2022-03-07 21:05:46','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2022-03-07 21:05:46','YYYY-MM-DD HH24:MI:SS'),100,200738,'DocumentAttached','D','40056a6d-100f-4c1f-9748-1d0ccdda901a') +; + +-- Mar 7, 2022, 9:05:59 PM CET +INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('I','Attach Error',0,0,'Y',TO_TIMESTAMP('2022-03-07 21:05:59','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2022-03-07 21:05:59','YYYY-MM-DD HH24:MI:SS'),100,200739,'AttachError','D','55248ed3-7703-41f3-821a-753fbcc1c06b') +; + +-- Mar 7, 2022, 9:06:54 PM CET +INSERT INTO AD_ToolBarButton (AD_Client_ID,AD_Org_ID,Created,CreatedBy,ComponentName,IsActive,AD_ToolBarButton_ID,Name,Updated,UpdatedBy,IsCustomization,KeyStroke_KeyCode,KeyStroke_Modifiers,AD_ToolBarButton_UU,Action,IsAdvancedButton,IsAddSeparator,EntityType,IsShowMore) VALUES (0,0,TO_TIMESTAMP('2022-03-07 21:06:54','YYYY-MM-DD HH24:MI:SS'),100,'Attachment','Y',200117,'Report - Attach',TO_TIMESTAMP('2022-03-07 21:06:54','YYYY-MM-DD HH24:MI:SS'),100,'N',0,0,'4e060cb2-f2a7-496c-b882-604814506b5b','R','N','N','D','N') +; + diff --git a/migration/i9/postgresql/202203072105_IDEMPIERE-5222.sql b/migration/i9/postgresql/202203072105_IDEMPIERE-5222.sql new file mode 100644 index 0000000000..4ce548d25e --- /dev/null +++ b/migration/i9/postgresql/202203072105_IDEMPIERE-5222.sql @@ -0,0 +1,15 @@ +-- IDEMPIERE-5222 Add Attach button to report viewer (similar to Archive but with Attachment) +SELECT register_migration_script('202203072105_IDEMPIERE-5222.sql') FROM dual; + +-- Mar 7, 2022, 9:05:46 PM CET +INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('I','Document Attached',0,0,'Y',TO_TIMESTAMP('2022-03-07 21:05:46','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2022-03-07 21:05:46','YYYY-MM-DD HH24:MI:SS'),100,200738,'DocumentAttached','D','40056a6d-100f-4c1f-9748-1d0ccdda901a') +; + +-- Mar 7, 2022, 9:05:59 PM CET +INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('I','Attach Error',0,0,'Y',TO_TIMESTAMP('2022-03-07 21:05:59','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2022-03-07 21:05:59','YYYY-MM-DD HH24:MI:SS'),100,200739,'AttachError','D','55248ed3-7703-41f3-821a-753fbcc1c06b') +; + +-- Mar 7, 2022, 9:06:54 PM CET +INSERT INTO AD_ToolBarButton (AD_Client_ID,AD_Org_ID,Created,CreatedBy,ComponentName,IsActive,AD_ToolBarButton_ID,Name,Updated,UpdatedBy,IsCustomization,KeyStroke_KeyCode,KeyStroke_Modifiers,AD_ToolBarButton_UU,"action",IsAdvancedButton,IsAddSeparator,EntityType,IsShowMore) VALUES (0,0,TO_TIMESTAMP('2022-03-07 21:06:54','YYYY-MM-DD HH24:MI:SS'),100,'Attachment','Y',200117,'Report - Attach',TO_TIMESTAMP('2022-03-07 21:06:54','YYYY-MM-DD HH24:MI:SS'),100,'N',0,0,'4e060cb2-f2a7-496c-b882-604814506b5b','R','N','N','D','N') +; + diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/ZkJRViewer.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/ZkJRViewer.java index 7d03e1186e..54c06a51bc 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/ZkJRViewer.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/ZkJRViewer.java @@ -8,6 +8,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; +import java.util.Properties; import java.util.function.Supplier; import java.util.logging.Level; @@ -30,11 +31,16 @@ import org.adempiere.webui.session.SessionManager; import org.adempiere.webui.theme.ThemeManager; import org.adempiere.webui.util.ZKUpdateUtil; import org.compiere.model.MArchive; +import org.compiere.model.MAttachment; import org.compiere.model.MAuthorizationAccount; import org.compiere.model.MRole; import org.compiere.model.MSysConfig; +import org.compiere.model.MTable; +import org.compiere.model.MToolBarButtonRestrict; import org.compiere.model.MUser; +import org.compiere.model.PO; import org.compiere.model.PrintInfo; +import org.compiere.model.X_AD_ToolBarButton; import org.compiere.tools.FileUtil; import org.compiere.util.CLogger; import org.compiere.util.Env; @@ -59,6 +65,7 @@ import org.zkoss.zul.North; import org.zkoss.zul.Separator; import org.zkoss.zul.Tab; import org.zkoss.zul.Toolbar; +import org.zkoss.zul.Toolbarbutton; import org.zkoss.zul.impl.Utils; import org.zkoss.zul.impl.XulElement; @@ -86,7 +93,7 @@ public class ZkJRViewer extends Window implements EventListener, ITabOnCl /** * */ - private static final long serialVersionUID = -812700088629098149L; + private static final long serialVersionUID = -7204858572267608018L; private JasperPrint jasperPrint; private java.util.List jasperPrintList; @@ -106,7 +113,9 @@ public class ZkJRViewer extends Window implements EventListener, ITabOnCl private KeyEvent prevKeyEvent; private String m_title; // local title - embedded windows clear the title + Toolbar toolbar = new Toolbar(); protected ToolBarButton bArchive = new ToolBarButton(); + protected ToolBarButton bAttachment = new ToolBarButton(); protected ToolBarButton bExport = new ToolBarButton(); protected ToolBarButton bCloudUpload = new ToolBarButton(); private PrintInfo m_printInfo; @@ -192,7 +201,6 @@ public class ZkJRViewer extends Window implements EventListener, ITabOnCl this.appendChild(layout); this.setStyle("width: 100%; height: 100%; position: absolute"); - Toolbar toolbar = new Toolbar(); ZKUpdateUtil.setHeight(toolbar, "32px"); previewType.setMold("select"); @@ -260,6 +268,20 @@ public class ZkJRViewer extends Window implements EventListener, ITabOnCl toolbar.appendChild(bArchive); bArchive.addEventListener(Events.ON_CLICK, this); + int tableId = m_printInfo.getAD_Table_ID(); + int recordId = m_printInfo.getRecord_ID(); + if (tableId > 0 && recordId > 0) { + toolbar.appendChild(new Separator("vertical")); + bAttachment.setName("Attachment"); + if (ThemeManager.isUseFontIconForImage()) + bAttachment.setIconSclass("z-icon-Attachment"); + else + bAttachment.setImage(ThemeManager.getThemeResource("images/Attachment24.png")); + bAttachment.setTooltiptext(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "Attachment"))); + toolbar.appendChild(bAttachment); + bAttachment.addEventListener(Events.ON_CLICK, this); + } + if ( isCanExport ) { bExport.setName("Export"); @@ -300,6 +322,10 @@ public class ZkJRViewer extends Window implements EventListener, ITabOnCl ZKUpdateUtil.setHeight(iframe, "100%"); ZKUpdateUtil.setWidth(iframe, "100%"); + int AD_Window_ID = Env.getContextAsInt(Env.getCtx(), m_WindowNo, "_WinInfo_AD_Window_ID", true); + int AD_Process_ID = m_printInfo.getAD_Process_ID(); + updateToolbarAccess(AD_Window_ID, AD_Process_ID); + try { renderReport(); } catch (Exception e) { @@ -311,6 +337,42 @@ public class ZkJRViewer extends Window implements EventListener, ITabOnCl this.setBorder("normal"); } + private boolean ToolBarMenuRestictionLoaded = false; + public void updateToolbarAccess(int AD_Window_ID, int AD_Process_ID) { + if (ToolBarMenuRestictionLoaded) + return; + Properties m_ctx = Env.getCtx(); + int ToolBarButton_ID = 0; + + int[] restrictionList = AD_Window_ID > 0 + ? MToolBarButtonRestrict.getOfWindow(m_ctx, MRole.getDefault().getAD_Role_ID(), AD_Window_ID, true, null) + : MToolBarButtonRestrict.getOfReport(m_ctx, MRole.getDefault().getAD_Role_ID(), AD_Process_ID, null); + if (log.isLoggable(Level.INFO)) + log.info("restrictionList="+restrictionList.toString()); + + for (int i = 0; i < restrictionList.length; i++) + { + ToolBarButton_ID= restrictionList[i]; + X_AD_ToolBarButton tbt = new X_AD_ToolBarButton(m_ctx, ToolBarButton_ID, null); + if (!"R".equals(tbt.getAction())) + continue; + + String restrictName = tbt.getComponentName(); + if (log.isLoggable(Level.CONFIG)) log.config("tbt="+tbt.getAD_ToolBarButton_ID() + " / " + restrictName); + + for (Component p = this.toolbar.getFirstChild(); p != null; p = p.getNextSibling()) { + if (p instanceof Toolbarbutton) { + if ( restrictName.equals(((ToolBarButton)p).getName()) ) { + this.toolbar.removeChild(p); + break; + } + } + } + } // All restrictions + + ToolBarMenuRestictionLoaded = true; + }//updateToolbarAccess + private void initMediaSuppliers() { mediaSuppliers.put(toMediaType(PDF_MIME_TYPE, PDF_FILE_EXT), () -> { try { @@ -525,6 +587,8 @@ public class ZkJRViewer extends Window implements EventListener, ITabOnCl cmd_sendMail(); else if (e.getTarget() == bArchive) cmd_archive(); + else if (e.getTarget() == bAttachment) + cmd_attachment(); else if (e.getTarget() == bExport) cmd_export(); else if (e.getTarget() == bCloudUpload) @@ -810,6 +874,29 @@ public class ZkJRViewer extends Window implements EventListener, ITabOnCl } } // cmd_archive + /** + * Create archive for jasper report + */ + protected void cmd_attachment() + { + int tableId = m_printInfo.getAD_Table_ID(); + int recordId = m_printInfo.getRecord_ID(); + if (tableId == 0 || recordId == 0) + return; + boolean success = false; + MTable table = MTable.get(tableId); + PO po = table.getPO(recordId, null); + MAttachment attachment = po.createAttachment(); + String fileName = m_title.replace(" ", "_")+ "_" + m_printInfo.getName() + "." + media.getFormat(); + byte[] data = media.isBinary() ? media.getByteData() : media.getStringData().getBytes(); + attachment.addEntry(fileName, data); + success = attachment.save(); + if (success) + FDialog.info(m_WindowNo, this, "Attached", fileName); + else + FDialog.error(m_WindowNo, this, "AttachError"); + } // cmd_archive + /** * convert File data into Byte Data * @param tempFile diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/ZkReportViewer.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/ZkReportViewer.java index 69954d3909..31dd97bb37 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/ZkReportViewer.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/ZkReportViewer.java @@ -67,6 +67,7 @@ import org.adempiere.webui.util.ServerPushTemplate; import org.adempiere.webui.util.ZKUpdateUtil; import org.compiere.model.GridField; import org.compiere.model.MArchive; +import org.compiere.model.MAttachment; import org.compiere.model.MAuthorizationAccount; import org.compiere.model.MClient; import org.compiere.model.MLanguage; @@ -76,6 +77,7 @@ import org.compiere.model.MSysConfig; import org.compiere.model.MTable; import org.compiere.model.MToolBarButtonRestrict; import org.compiere.model.MUser; +import org.compiere.model.PO; import org.compiere.model.SystemIDs; import org.compiere.model.X_AD_ToolBarButton; import org.compiere.print.ArchiveEngine; @@ -180,6 +182,7 @@ public class ZkReportViewer extends Window implements EventListener, ITab private Toolbar toolBar = new Toolbar(); private ToolBarButton bSendMail = new ToolBarButton(); private ToolBarButton bArchive = new ToolBarButton(); + private ToolBarButton bAttachment = new ToolBarButton(); private ToolBarButton bCustomize = new ToolBarButton(); private ToolBarButton bFind = new ToolBarButton(); private ToolBarButton bExport = new ToolBarButton(); @@ -630,7 +633,28 @@ public class ZkReportViewer extends Window implements EventListener, ITab bArchive.addEventListener(Events.ON_CLICK, this); if (ThemeManager.isUseFontIconForImage()) LayoutUtils.addSclass("medium-toolbarbutton", bArchive); - + + int tableId = m_reportEngine.getPrintInfo().getAD_Table_ID(); + int recordId = m_reportEngine.getPrintInfo().getRecord_ID(); + if (tableId > 0 && recordId > 0) { + bAttachment.setName("Attachment"); + if (ThemeManager.isUseFontIconForImage()) + bAttachment.setIconSclass("z-icon-Attachment"); + else + bAttachment.setImage(ThemeManager.getThemeResource("images/Attachment24.png")); + bAttachment.setTooltiptext(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "Attachment"))); + if (toolbarPopup != null) + { + toolbarPopupLayout.appendChild(bAttachment); + bAttachment.setLabel(bAttachment.getTooltiptext()); + } + else + toolBar.appendChild(bAttachment); + bAttachment.addEventListener(Events.ON_CLICK, this); + if (ThemeManager.isUseFontIconForImage()) + LayoutUtils.addSclass("medium-toolbarbutton", bAttachment); + } + if ( m_isCanExport ) { bExport.setName("Export"); @@ -1242,6 +1266,8 @@ public class ZkReportViewer extends Window implements EventListener, ITab cmd_sendMail(); else if (e.getTarget() == bArchive) cmd_archive(); + else if (e.getTarget() == bAttachment) + cmd_attachment(); else if (e.getTarget() == bCustomize) cmd_customize(); else if (e.getTarget() == bWizard) @@ -1339,6 +1365,29 @@ public class ZkReportViewer extends Window implements EventListener, ITab FDialog.error(m_WindowNo, this, "ArchiveError"); } // cmd_archive + /** + * Add Report to Attachment directly + */ + private void cmd_attachment() + { + int tableId = m_reportEngine.getPrintInfo().getAD_Table_ID(); + int recordId = m_reportEngine.getPrintInfo().getRecord_ID(); + if (tableId == 0 || recordId == 0) + return; + boolean success = false; + MTable table = MTable.get(tableId); + PO po = table.getPO(recordId, null); + MAttachment attachment = po.createAttachment(); + byte[] data = media.isBinary() ? media.getByteData() : media.getStringData().getBytes(); + String fileName = m_reportEngine.getName().replace(" ", "_") + "_" + m_reportEngine.getPrintInfo().getName() + "." + media.getFormat(); + attachment.addEntry(fileName, data); + success = attachment.save(); + if (success) + FDialog.info(m_WindowNo, this, "DocumentAttached", fileName); + else + FDialog.error(m_WindowNo, this, "AttachError"); + } // cmd_attachment + /** * Export */ @@ -1623,7 +1672,7 @@ public class ZkReportViewer extends Window implements EventListener, ITab } // All restrictions ToolBarMenuRestictionLoaded = true; - }//updateToolBarAndMenuWithRestriction + }//updateToolbarAccess private void showBusyDialog() { progressWindow = new BusyDialog();