From cccd8177fa14ecc202a193455f5d659b035c805c Mon Sep 17 00:00:00 2001 From: Josef Rokos Date: Wed, 8 Jul 2015 12:55:41 +0200 Subject: [PATCH] =?UTF-8?q?Implementace=20ulo=C5=BEi=C5=A1t=C4=9B=20podeps?= =?UTF-8?q?an=C3=BDch=20dokument=C5=AF.=20P=C5=99i=20prvn=C3=ADm=20podpisu?= =?UTF-8?q?=20se=20ulo=C5=BE=C3=AD=20podepsan=C3=A9=20PDF=20a=20vytvo?= =?UTF-8?q?=C5=99=C3=AD=20se=20z=C3=A1znam=20v=20agend=C4=9B=20podepsan?= =?UTF-8?q?=C3=BDch=20dokument=C5=AF.=20closes=20#243?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/info/bukova/isspst/SpringUtils.java | 25 ++++++ .../bukova/isspst/data/SignedDocument.java | 17 ++-- .../isspst/data/SignedDocumentItem.java | 6 +- .../bukova/isspst/reporting/ParamFiller.java | 2 +- .../isspst/reporting/PredefinedGenerator.java | 38 ++++++--- .../isspst/reporting/ReportController.java | 31 +++++--- .../isspst/reporting/ReportDefinition.java | 10 +++ .../RequirementBaseServiceImpl.java | 40 ++++++++++ .../signeddocs/SignedDocumentService.java | 6 ++ .../signeddocs/SignedDocumentServiceImpl.java | 53 +++++++++++++ .../isspst/storage/AbstractFileStorage.java | 4 +- .../isspst/storage/ReportFileStorage.java | 10 +++ .../isspst/storage/ReportFileStorageImpl.java | 75 ++++++++++++++++++ .../isspst/ui/signeddocs/SignedDocsList.java | 21 ++++- .../webapp/WEB-INF/reports/tripBill.jasper | Bin 55261 -> 54109 bytes .../webapp/WEB-INF/reports/tripBill.jrxml | 50 +++++------- .../webapp/WEB-INF/spring/root-context.xml | 4 + src/main/webapp/WEB-INF/storage.properties | 3 +- src/main/webapp/lists/signeddocs/grid.zul | 13 ++- 19 files changed, 337 insertions(+), 71 deletions(-) create mode 100644 src/main/java/info/bukova/isspst/SpringUtils.java create mode 100644 src/main/java/info/bukova/isspst/storage/ReportFileStorage.java create mode 100644 src/main/java/info/bukova/isspst/storage/ReportFileStorageImpl.java diff --git a/src/main/java/info/bukova/isspst/SpringUtils.java b/src/main/java/info/bukova/isspst/SpringUtils.java new file mode 100644 index 00000000..67c3050b --- /dev/null +++ b/src/main/java/info/bukova/isspst/SpringUtils.java @@ -0,0 +1,25 @@ +package info.bukova.isspst; + +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; + +import javax.servlet.ServletContext; + +/** + * @author Pepa Rokos + */ +public class SpringUtils { + + private static WebApplicationContext webCtx(ServletContext sc) { + return WebApplicationContextUtils.getRequiredWebApplicationContext(sc); + } + + public static Object getBean(String name, ServletContext sc) { + return webCtx(sc).getBean(name); + } + + public static T getBean(Class clazz, ServletContext sc) { + return webCtx(sc).getBean(clazz); + } + +} diff --git a/src/main/java/info/bukova/isspst/data/SignedDocument.java b/src/main/java/info/bukova/isspst/data/SignedDocument.java index 55190466..608aae43 100644 --- a/src/main/java/info/bukova/isspst/data/SignedDocument.java +++ b/src/main/java/info/bukova/isspst/data/SignedDocument.java @@ -3,19 +3,18 @@ package info.bukova.isspst.data; import info.bukova.isspst.Constants; import info.bukova.isspst.Module; import info.bukova.isspst.StringUtils; - -import java.util.Date; -import java.util.List; +import org.hibernate.annotations.LazyCollection; +import org.hibernate.annotations.LazyCollectionOption; +import org.hibernate.search.annotations.IndexedEmbedded; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.OneToMany; import javax.persistence.Table; - -import org.hibernate.annotations.LazyCollection; -import org.hibernate.annotations.LazyCollectionOption; -import org.hibernate.search.annotations.IndexedEmbedded; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; @Entity @Table(name = "SIGNED_DOCUMENTS") @@ -105,6 +104,10 @@ public class SignedDocument extends BaseData { } public void addItem(SignedDocumentItem item) { + if (items == null) { + items = new ArrayList(); + } + item.setSignedDocument(this); this.items.add(item); } diff --git a/src/main/java/info/bukova/isspst/data/SignedDocumentItem.java b/src/main/java/info/bukova/isspst/data/SignedDocumentItem.java index 2e59e058..070c80a2 100644 --- a/src/main/java/info/bukova/isspst/data/SignedDocumentItem.java +++ b/src/main/java/info/bukova/isspst/data/SignedDocumentItem.java @@ -22,7 +22,7 @@ public class SignedDocumentItem { private int id; @Column(name = "REPORT_ID") - private int reportId; + private long reportId; @Column(name = "REPORT_NAME", length = Constants.LEN_TEXT) private String reportName; @@ -42,11 +42,11 @@ public class SignedDocumentItem { this.id = id; } - public int getReportId() { + public long getReportId() { return reportId; } - public void setReportId(int reportId) { + public void setReportId(long reportId) { this.reportId = reportId; } diff --git a/src/main/java/info/bukova/isspst/reporting/ParamFiller.java b/src/main/java/info/bukova/isspst/reporting/ParamFiller.java index 41aec3b7..5ee150b8 100644 --- a/src/main/java/info/bukova/isspst/reporting/ParamFiller.java +++ b/src/main/java/info/bukova/isspst/reporting/ParamFiller.java @@ -74,7 +74,7 @@ public class ParamFiller { definition.setParam("P_PREV_APPROVER_SIGNATURE", storage.serverPath(prevApproverSettings.getSignatureFile())); } - AuthItem lastAuth = tb.getApproval().getAuthorization().get(tb.getRequirement().getAuthorization().size() - 1); + AuthItem lastAuth = tb.getApproval().getAuthorization().get(tb.getApproval().getAuthorization().size() - 1); definition.setParam("P_APPROVE_DATE", lastAuth.getAuthDate()); User u = lastAuth.getApprover(); diff --git a/src/main/java/info/bukova/isspst/reporting/PredefinedGenerator.java b/src/main/java/info/bukova/isspst/reporting/PredefinedGenerator.java index 8bfac506..a9579f02 100644 --- a/src/main/java/info/bukova/isspst/reporting/PredefinedGenerator.java +++ b/src/main/java/info/bukova/isspst/reporting/PredefinedGenerator.java @@ -1,18 +1,21 @@ package info.bukova.isspst.reporting; -import java.io.File; - -import javax.servlet.ServletContext; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - +import info.bukova.isspst.SpringUtils; +import info.bukova.isspst.data.DataModel; +import info.bukova.isspst.data.SignedDocumentItem; +import info.bukova.isspst.services.signeddocs.SignedDocumentService; +import info.bukova.isspst.storage.ReportFileStorage; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.engine.JasperRunManager; import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; import net.sf.jasperreports.engine.util.JRLoader; import net.sf.jasperreports.engine.util.JRProperties; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.ServletContext; +import java.io.File; @SuppressWarnings("deprecation") public class PredefinedGenerator implements Generator { @@ -20,7 +23,7 @@ public class PredefinedGenerator implements Generator { private ReportDefinition definition; private ServletContext ctx; private final static Logger logger = LoggerFactory.getLogger(PredefinedGenerator.class); - + public PredefinedGenerator(ReportDefinition definition, ServletContext ctx) { this.definition = definition; this.ctx = ctx; @@ -29,7 +32,12 @@ public class PredefinedGenerator implements Generator { @Override public byte[] generate() { byte[] bytes = null; - + SignedDocumentItem signedItem = getSignedDocument(); + + if (signedItem != null) { + return fromStorage(signedItem); + } + try { JasperReport report = (JasperReport) JRLoader.loadObject(getReportFile()); JRProperties.setProperty("net.sf.jasperreports.default.pdf.encoding", "Cp1250"); @@ -43,6 +51,18 @@ public class PredefinedGenerator implements Generator { return bytes; } + + private byte[] fromStorage(SignedDocumentItem sdItem) { + ReportFileStorage reportStorage = SpringUtils.getBean(ReportFileStorage.class, ctx); + return reportStorage.fileData(sdItem); + } + + private SignedDocumentItem getSignedDocument() { + SignedDocumentService sdService = SpringUtils.getBean(SignedDocumentService.class, ctx); + SignedDocumentItem sdItem = sdService.getItem((DataModel) definition.getDataSet().get(0), definition.getReport().getReportId()); + + return sdItem; + } protected File getReportFile() { return new File(ctx.getRealPath("WEB-INF/reports") + "/" + definition.getReport().getJasperFile() + ".jasper"); diff --git a/src/main/java/info/bukova/isspst/reporting/ReportController.java b/src/main/java/info/bukova/isspst/reporting/ReportController.java index 5e06b347..39c7e4e7 100644 --- a/src/main/java/info/bukova/isspst/reporting/ReportController.java +++ b/src/main/java/info/bukova/isspst/reporting/ReportController.java @@ -1,17 +1,17 @@ package info.bukova.isspst.reporting; -import java.io.IOException; -import java.io.OutputStream; - -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServletResponse; - +import info.bukova.isspst.storage.ReportFileStorage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.OutputStream; + @Controller public class ReportController { @@ -21,6 +21,8 @@ public class ReportController { private GeneratorFactory factory; @Autowired private ParamFiller paramFiller; + @Autowired + private ReportFileStorage reportFileStorage; private static final String ERROR_MESSAGE = "Generator returned no data!
%s"; private final static Logger logger = LoggerFactory.getLogger(ReportController.class); @@ -46,13 +48,20 @@ public class ReportController { try { os = response.getOutputStream(); - if (reportDefinition.getReport() == null || reportDefinition.getDataSet() == null) { + if ((reportDefinition.getReport() == null || reportDefinition.getDataSet() == null) && reportDefinition.getSignedDocItem() == null) { throw new ReportException("Definition is null"); } - - paramFiller.fill(); - Generator gen = factory.createGenerator(reportDefinition); - byte[] data = gen.generate(); + + byte[] data; + + if (reportDefinition.getSignedDocItem() == null) { + paramFiller.fill(); + Generator gen = factory.createGenerator(reportDefinition); + data = gen.generate(); + } else { + data = reportFileStorage.fileData(reportDefinition.getSignedDocItem()); + } + response.setContentType(contentType); response.setContentLength(data.length); diff --git a/src/main/java/info/bukova/isspst/reporting/ReportDefinition.java b/src/main/java/info/bukova/isspst/reporting/ReportDefinition.java index b5a1b413..f6e0812d 100644 --- a/src/main/java/info/bukova/isspst/reporting/ReportDefinition.java +++ b/src/main/java/info/bukova/isspst/reporting/ReportDefinition.java @@ -1,5 +1,6 @@ package info.bukova.isspst.reporting; +import info.bukova.isspst.data.SignedDocumentItem; import info.bukova.isspst.services.Service; import java.io.Serializable; @@ -20,6 +21,7 @@ public class ReportDefinition implements Serializable { private List fieldsToPrint; private String reportTitle; private Service service; + private SignedDocumentItem signedDocItem; public ReportDefinition() { params = new HashMap(); @@ -92,6 +94,7 @@ public class ReportDefinition implements Serializable { reportTitle = ""; service = null; params.clear(); + signedDocItem = null; } public String getReportTitle() { @@ -110,4 +113,11 @@ public class ReportDefinition implements Serializable { this.service = service; } + public SignedDocumentItem getSignedDocItem() { + return signedDocItem; + } + + public void setSignedDocItem(SignedDocumentItem signedDocItem) { + this.signedDocItem = signedDocItem; + } } diff --git a/src/main/java/info/bukova/isspst/services/requirement/RequirementBaseServiceImpl.java b/src/main/java/info/bukova/isspst/services/requirement/RequirementBaseServiceImpl.java index d75f438c..d337cd14 100644 --- a/src/main/java/info/bukova/isspst/services/requirement/RequirementBaseServiceImpl.java +++ b/src/main/java/info/bukova/isspst/services/requirement/RequirementBaseServiceImpl.java @@ -10,6 +10,8 @@ import info.bukova.isspst.data.RequirementBase; import info.bukova.isspst.data.RequirementState; import info.bukova.isspst.data.Role; import info.bukova.isspst.data.SettingsData; +import info.bukova.isspst.data.SignedDocument; +import info.bukova.isspst.data.SignedDocumentItem; import info.bukova.isspst.data.User; import info.bukova.isspst.data.Workflow; import info.bukova.isspst.data.Workgroup; @@ -25,10 +27,12 @@ import info.bukova.isspst.services.AbstractOwnedService; import info.bukova.isspst.services.LazyLoader; import info.bukova.isspst.services.Service; import info.bukova.isspst.services.settings.GlobalSettingsService; +import info.bukova.isspst.services.signeddocs.SignedDocumentService; import info.bukova.isspst.services.users.UserService; import info.bukova.isspst.services.workgroups.WorkgroupService; import info.bukova.isspst.signapi.SignData; import info.bukova.isspst.storage.FileStorage; +import info.bukova.isspst.storage.ReportFileStorage; import org.hibernate.LazyInitializationException; import org.hibernate.Query; import org.springframework.beans.factory.annotation.Autowired; @@ -73,6 +77,10 @@ public abstract class RequirementBaseServiceImpl exte private ServletContext servletContext; @Autowired private FileStorage storage; + @Autowired + private SignedDocumentService signedDocumentService; + @Autowired + private ReportFileStorage signedDocStorage; @Override @Transactional @@ -292,6 +300,7 @@ public abstract class RequirementBaseServiceImpl exte } } + saveSignedDoc(e); postApprove(e); } @@ -333,6 +342,36 @@ public abstract class RequirementBaseServiceImpl exte } + protected void saveSignedDoc(T entity) { + /* + if (!entity.equals(reportDefinition.getDataSet().get(0))) { + throw new ApproveException(); + }*/ + + DataModel reportEntity = (DataModel) reportDefinition.getDataSet().get(0); + SignedDocumentItem signedItem = signedDocumentService.getItem(entity, reportDefinition.getReport().getReportId()); + SignData data = (SignData) sessionData.getProperty(Constants.KEY_SIGN_DATA); + + if (signedItem == null) { + data = (SignData) sessionData.getProperty(Constants.KEY_SIGN_DATA); + SignedDocument signDoc = new SignedDocument(); + signDoc.setDescription(entity.getDescription()); + signDoc.setNumser(entity.getNumser()); + signDoc.setRecordId(reportEntity.getId()); + signDoc.setModuleName(ModuleUtils.getModule(reportEntity, servletContext).getId()); + + SignedDocumentItem item = new SignedDocumentItem(); + item.setReportId(reportDefinition.getReport().getReportId()); + item.setReportName(reportDefinition.getReport().getName()); + signDoc.addItem(item); + + signedDocStorage.saveFile(data.getPdfData(), item); + signedDocumentService.addFromApprove(signDoc); + } else { + signedDocStorage.saveFile(data.getPdfData(), signedItem); + } + } + @Override @Transactional public boolean canApprove(T entity) { @@ -464,6 +503,7 @@ public abstract class RequirementBaseServiceImpl exte data.setDescription(entity.getDescription()); data.setNumser(entity.getNumser()); data.setSignDate(approveDate); + data.setSigned(signedDocumentService.getItem(entityForReport(entity), report.getReportId()) != null); if (entity.getState() == RequirementState.NEW) { data.setAreaId(1); diff --git a/src/main/java/info/bukova/isspst/services/signeddocs/SignedDocumentService.java b/src/main/java/info/bukova/isspst/services/signeddocs/SignedDocumentService.java index 51d74732..f3beaf3e 100644 --- a/src/main/java/info/bukova/isspst/services/signeddocs/SignedDocumentService.java +++ b/src/main/java/info/bukova/isspst/services/signeddocs/SignedDocumentService.java @@ -1,8 +1,14 @@ package info.bukova.isspst.services.signeddocs; +import info.bukova.isspst.data.DataModel; import info.bukova.isspst.data.SignedDocument; +import info.bukova.isspst.data.SignedDocumentItem; import info.bukova.isspst.services.Service; public interface SignedDocumentService extends Service { + SignedDocument getForEntity(DataModel entity); + SignedDocumentItem getItem(DataModel entity, long reportId); + void addFromApprove(SignedDocument document); + } diff --git a/src/main/java/info/bukova/isspst/services/signeddocs/SignedDocumentServiceImpl.java b/src/main/java/info/bukova/isspst/services/signeddocs/SignedDocumentServiceImpl.java index 8779dc3c..6550ade3 100644 --- a/src/main/java/info/bukova/isspst/services/signeddocs/SignedDocumentServiceImpl.java +++ b/src/main/java/info/bukova/isspst/services/signeddocs/SignedDocumentServiceImpl.java @@ -1,13 +1,25 @@ package info.bukova.isspst.services.signeddocs; +import info.bukova.isspst.Module; +import info.bukova.isspst.ModuleUtils; +import info.bukova.isspst.data.DataModel; import info.bukova.isspst.data.SignedDocument; +import info.bukova.isspst.data.SignedDocumentItem; import info.bukova.isspst.services.AbstractOwnedService; import info.bukova.isspst.services.LazyLoader; import org.hibernate.Hibernate; +import org.hibernate.Query; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; +import javax.servlet.ServletContext; + public class SignedDocumentServiceImpl extends AbstractOwnedService implements SignedDocumentService { + + @Autowired + private ServletContext servletContext; + @LazyLoader("grid") @Transactional public void lazyLoadItems(SignedDocument signedDocument) { @@ -19,4 +31,45 @@ public class SignedDocumentServiceImpl extends AbstractOwnedService implements FileStorage { os.flush(); os.close(); } catch (FileNotFoundException e) { - e.printStackTrace(); + throw new StorageException("File cannot be found: " + file.getName(), e.getCause()); } catch (IOException e) { - e.printStackTrace(); + throw new StorageException("Cannot write file: " + file.getName(), e.getCause()); } finally { try { if (os != null) { diff --git a/src/main/java/info/bukova/isspst/storage/ReportFileStorage.java b/src/main/java/info/bukova/isspst/storage/ReportFileStorage.java new file mode 100644 index 00000000..e84a4451 --- /dev/null +++ b/src/main/java/info/bukova/isspst/storage/ReportFileStorage.java @@ -0,0 +1,10 @@ +package info.bukova.isspst.storage; + +import info.bukova.isspst.data.SignedDocumentItem; + +/** + * @author Pepa Rokos + */ +public interface ReportFileStorage extends FileStorage { + +} diff --git a/src/main/java/info/bukova/isspst/storage/ReportFileStorageImpl.java b/src/main/java/info/bukova/isspst/storage/ReportFileStorageImpl.java new file mode 100644 index 00000000..93f59998 --- /dev/null +++ b/src/main/java/info/bukova/isspst/storage/ReportFileStorageImpl.java @@ -0,0 +1,75 @@ +package info.bukova.isspst.storage; + +import info.bukova.isspst.data.SignedDocumentItem; + +import java.io.File; +import java.util.UUID; + +/** + * @author Pepa Rokos + */ +public class ReportFileStorageImpl extends AbstractFileStorage implements ReportFileStorage { + + private String rootPath; + + public void setRootPath(String rootPath) { + this.rootPath = rootPath; + } + + private String getFilePath(String fileName) { + return rootPath + "/" + fileName; + } + + @Override + public void saveFile(byte[] data, SignedDocumentItem signedDocumentItem) { + String fileName = signedDocumentItem.getFileName(); + + if (fileName == null) { + fileName = UUID.randomUUID().toString() + ".pdf"; + } + + saveFileDataToPath(data, getFilePath(fileName)); + signedDocumentItem.setFileName(fileName); + } + + @Override + public void saveFile(File file, SignedDocumentItem fileId) { + throw new UnsupportedOperationException(); + } + + @Override + public void removeFile(SignedDocumentItem signedDocumentItem) { + removeFileByPath(getFilePath(signedDocumentItem.getFileName())); + } + + @Override + public void moveFile(String source, String destination) { + throw new UnsupportedOperationException(); + } + + @Override + public void createDirectory(String dir) { + throw new UnsupportedOperationException(); + } + + @Override + public byte[] fileData(SignedDocumentItem signedDocumentItem) { + return fileDataFromPath(getFilePath(signedDocumentItem.getFileName())); + } + + @Override + public File file(SignedDocumentItem signedDocumentItem) { + return null; + } + + @Override + public boolean dirExists(String path) { + return false; + } + + @Override + public String serverPath(SignedDocumentItem signedDocumentItem) { + return null; + } + +} diff --git a/src/main/java/info/bukova/isspst/ui/signeddocs/SignedDocsList.java b/src/main/java/info/bukova/isspst/ui/signeddocs/SignedDocsList.java index d5ee9511..2c2922ea 100644 --- a/src/main/java/info/bukova/isspst/ui/signeddocs/SignedDocsList.java +++ b/src/main/java/info/bukova/isspst/ui/signeddocs/SignedDocsList.java @@ -3,20 +3,22 @@ package info.bukova.isspst.ui.signeddocs; import info.bukova.isspst.data.SignedDocument; import info.bukova.isspst.data.SignedDocumentItem; import info.bukova.isspst.filters.SignedDocumentFilter; +import info.bukova.isspst.reporting.ReportDefinition; import info.bukova.isspst.services.signeddocs.SignedDocumentService; import info.bukova.isspst.ui.ListViewModel; - -import java.util.ArrayList; -import java.util.List; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.zkoss.bind.annotation.BindingParam; import org.zkoss.bind.annotation.Command; import org.zkoss.bind.annotation.Init; import org.zkoss.bind.annotation.NotifyChange; +import org.zkoss.zk.ui.Executions; import org.zkoss.zk.ui.select.annotation.WireVariable; import org.zkoss.zul.Listbox; +import org.zkoss.zul.Window; + +import java.util.ArrayList; +import java.util.List; public class SignedDocsList extends ListViewModel { @@ -30,6 +32,9 @@ public class SignedDocsList extends ListViewModel protected List signedDocumentItems; + @WireVariable + private ReportDefinition reportDefinition; + @Init(superclass = true) public void initSignedDocsList() { service = signedDocumentService; @@ -70,4 +75,12 @@ public class SignedDocsList extends ListViewModel this.signedDocumentItems = new ArrayList(); } } + + @Command + public void onOpen(@BindingParam("item") SignedDocumentItem item) { + reportDefinition.clear(); + reportDefinition.setSignedDocItem(item); + Window reportWin = (Window) Executions.createComponents("/app/reporting/report.zul", null, null); + reportWin.doModal(); + } } diff --git a/src/main/webapp/WEB-INF/reports/tripBill.jasper b/src/main/webapp/WEB-INF/reports/tripBill.jasper index 11f966a10d864a154cd14e100cca8e456686346d..21e069c495e2c193054c718f7abc3d4879076ea2 100644 GIT binary patch delta 9567 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 S;S`H{$B8Fj2o`7GZvB6Y3Xl!} delta 10091 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 - + @@ -58,12 +58,6 @@ - - - - - - @@ -236,11 +230,13 @@ tuzemské pracovní cesty]]> - - - - - + + + + + + + @@ -427,12 +423,6 @@ tuzemské pracovní cesty]]> - - - - - - @@ -472,11 +462,6 @@ tuzemské pracovní cesty]]> - - - - - @@ -571,13 +556,6 @@ tuzemské pracovní cesty]]> - - - - - - - @@ -585,6 +563,18 @@ tuzemské pracovní cesty]]> + + + + + + + + + + + + diff --git a/src/main/webapp/WEB-INF/spring/root-context.xml b/src/main/webapp/WEB-INF/spring/root-context.xml index a1057665..bfc9018f 100644 --- a/src/main/webapp/WEB-INF/spring/root-context.xml +++ b/src/main/webapp/WEB-INF/spring/root-context.xml @@ -183,6 +183,10 @@ + + + + diff --git a/src/main/webapp/WEB-INF/storage.properties b/src/main/webapp/WEB-INF/storage.properties index 3b71ef87..103f9058 100644 --- a/src/main/webapp/WEB-INF/storage.properties +++ b/src/main/webapp/WEB-INF/storage.properties @@ -1,2 +1,3 @@ storage.root=/home/pepa/tmp/isspst -storage.fulltextIndex=/home/pepa/tmp/isspst \ No newline at end of file +storage.fulltextIndex=/home/pepa/tmp/isspst +storage.signedDocuments=/home/pepa/tmp/isspst/signedDoc \ No newline at end of file diff --git a/src/main/webapp/lists/signeddocs/grid.zul b/src/main/webapp/lists/signeddocs/grid.zul index 74b72e37..e361df43 100644 --- a/src/main/webapp/lists/signeddocs/grid.zul +++ b/src/main/webapp/lists/signeddocs/grid.zul @@ -1,5 +1,7 @@ - + +