From aff18963c39cb8885cedea7c4f0ef8e4e3bad4f2 Mon Sep 17 00:00:00 2001 From: Binal Date: Mon, 6 Jul 2020 12:56:09 -0700 Subject: [PATCH 1/3] Merge from wnprc18.3 svn r.64261-64312 --- .../org/labkey/api/reader/ExcelFactory.java | 50 +++++++++++++++++++ study/src/org/labkey/study/StudyModule.java | 4 +- .../study/query/DatasetUpdateService.java | 12 +++++ 3 files changed, 65 insertions(+), 1 deletion(-) diff --git a/api/src/org/labkey/api/reader/ExcelFactory.java b/api/src/org/labkey/api/reader/ExcelFactory.java index 100c990f259..80f4673dfff 100644 --- a/api/src/org/labkey/api/reader/ExcelFactory.java +++ b/api/src/org/labkey/api/reader/ExcelFactory.java @@ -22,13 +22,18 @@ import org.apache.poi.ss.formula.FormulaParseException; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.ClientAnchor; +import org.apache.poi.ss.usermodel.Comment; +import org.apache.poi.ss.usermodel.CreationHelper; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.DataFormat; import org.apache.poi.ss.usermodel.DataFormatter; import org.apache.poi.ss.usermodel.DateUtil; +import org.apache.poi.ss.usermodel.Drawing; import org.apache.poi.ss.usermodel.FormulaError; import org.apache.poi.ss.usermodel.FormulaEvaluator; import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.RichTextString; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Row.MissingCellPolicy; import org.apache.poi.ss.usermodel.Sheet; @@ -133,6 +138,7 @@ public static Workbook create(InputStream is) throws IOException, InvalidFormatE public static Workbook createFromArray(JSONArray sheetsArray, ExcelWriter.ExcelDocumentType docType) { Workbook workbook = docType.createWorkbook(); + CreationHelper factory = workbook.getCreationHelper(); Map customStyles = new HashMap<>(); @@ -175,6 +181,11 @@ public static Workbook createFromArray(JSONArray sheetsArray, ExcelWriter.ExcelD boolean forceString = metadataObject != null && metadataObject.has("forceString") && Boolean.TRUE.equals(metadataObject.get("forceString")); + String cellComment = null; + if ( metadataObject != null && metadataObject.has("cellComment")){ + cellComment = metadataObject.getString("cellComment"); + } + Cell cell = row.createCell(colIndex); if (value instanceof java.lang.Number) { @@ -229,6 +240,45 @@ else if (value != null) { cell.setCellStyle(cellStyle); } + if (cell != null && cellComment != null) + { + //Determine the size of the comment box based on the length of the comment + int commentBoxWidth = 3; + int commentBoxHeight = 4; + + if (cellComment.length() > 30 ) + { + commentBoxHeight= 5; + } + if (cellComment.length() > 45 && cellComment.length() < 60) + { + commentBoxWidth= 4; + commentBoxHeight= 4; + } + if (cellComment.length() >= 60) + { + commentBoxHeight = 5; + } + if (cellComment.length() > 70) + { + commentBoxHeight = 6; + commentBoxWidth = 4; + } + ClientAnchor anchor = factory.createClientAnchor(); + Drawing drawing = sheet.createDrawingPatriarch(); + + anchor.setCol1(cell.getColumnIndex()+1); + anchor.setCol2(cell.getColumnIndex()+commentBoxWidth); + anchor.setRow1(row.getRowNum()+1); + anchor.setRow2(row.getRowNum()+commentBoxHeight); + + Comment comment = drawing.createCellComment(anchor); + RichTextString str = factory.createRichTextString(cellComment); + comment.setString(str); + comment.setAuthor("LabKey Server"); + + cell.setCellComment(comment); + } } } } diff --git a/study/src/org/labkey/study/StudyModule.java b/study/src/org/labkey/study/StudyModule.java index fe46f9624c6..7a2496f44e3 100644 --- a/study/src/org/labkey/study/StudyModule.java +++ b/study/src/org/labkey/study/StudyModule.java @@ -76,6 +76,7 @@ import org.labkey.api.study.assay.AssayPublishService; import org.labkey.api.study.reports.CrosstabReport; import org.labkey.api.study.reports.CrosstabReportDescriptor; +import org.labkey.api.study.security.StudySecurityEscalationAuditProvider; import org.labkey.api.usageMetrics.UsageMetricsService; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.SystemMaintenance; @@ -270,7 +271,7 @@ protected void init() StudySerializationRegistry.setInstance(StudySerializationRegistryImpl.get()); ExperimentService.get().addExperimentListener(new ExperimentListenerImpl()); - + DataViewService.get().registerProvider(DatasetViewProvider.TYPE, new DatasetViewProvider()); DataViewService.get().registerProvider(ReportViewProvider.TYPE, new ReportViewProvider()); @@ -354,6 +355,7 @@ protected void startupAfterSpringConfig(ModuleContext moduleContext) AuditLogService.get().registerAuditType(new DatasetAuditProvider()); AuditLogService.get().registerAuditType(new StudyAuditProvider()); AuditLogService.get().registerAuditType(new SpecimenCommentAuditProvider()); + AuditLogService.get().registerAuditType(new StudySecurityEscalationAuditProvider()); ReportService.get().registerReport(new StudyController.StudyChartReport()); ReportService.get().registerReport(new StudyQueryReport()); diff --git a/study/src/org/labkey/study/query/DatasetUpdateService.java b/study/src/org/labkey/study/query/DatasetUpdateService.java index 890cde3aff1..fa4e688bb4b 100644 --- a/study/src/org/labkey/study/query/DatasetUpdateService.java +++ b/study/src/org/labkey/study/query/DatasetUpdateService.java @@ -32,7 +32,9 @@ import org.labkey.api.query.SimpleValidationError; import org.labkey.api.query.ValidationException; import org.labkey.api.security.User; +import org.labkey.api.security.permissions.Permission; import org.labkey.api.study.Dataset; +import org.labkey.api.study.security.StudySecurityEscalator; import org.labkey.study.StudyServiceImpl; import org.labkey.study.model.DatasetDefinition; import org.labkey.api.qc.QCState; @@ -83,6 +85,16 @@ public DatasetUpdateService(DatasetTableImpl table) _columnMapping = createMVMapping(domain); } + protected boolean hasPermission(User user, Class acl) + { + if (StudySecurityEscalator.isEscalated()) { + return true; + } + else { + return super.hasPermission(user, acl); + } + } + @Override protected Map getRow(User user, Container container, Map keys) throws InvalidKeyException From cabe1623742410e5b4ec2cffd2e2a36631d5860c Mon Sep 17 00:00:00 2001 From: Binal Date: Tue, 7 Jul 2020 15:36:13 -0700 Subject: [PATCH 2/3] Merge from wnprc18.3 svn r.64600 to 64828 --- api/src/org/labkey/api/data/DisplayColumn.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/org/labkey/api/data/DisplayColumn.java b/api/src/org/labkey/api/data/DisplayColumn.java index 6a3e3a1eec3..41498d01b87 100644 --- a/api/src/org/labkey/api/data/DisplayColumn.java +++ b/api/src/org/labkey/api/data/DisplayColumn.java @@ -1013,7 +1013,7 @@ public String getCssStyle(RenderContext ctx) // 34871: Support for column display width if (!StringUtils.isBlank(getWidth())) - style += "word-break:break-all;"; + style += "word-break:break-word;"; return style; } From 979485a452217b5e94c0d5c739c94d2dd8e57c01 Mon Sep 17 00:00:00 2001 From: labkey-jeckels Date: Fri, 28 Aug 2020 14:00:22 -0700 Subject: [PATCH 3/3] Fix ViralLoadAssayTest - restore WNPRC test code, updated to new DOM in 20.x line, and avoiding WNPRC_EHR query metadata if the module is deployed but not enabled in the container --- api/src/org/labkey/api/assay/AssayProtocolSchema.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/org/labkey/api/assay/AssayProtocolSchema.java b/api/src/org/labkey/api/assay/AssayProtocolSchema.java index 6a6f73b5e94..18fd43693a0 100644 --- a/api/src/org/labkey/api/assay/AssayProtocolSchema.java +++ b/api/src/org/labkey/api/assay/AssayProtocolSchema.java @@ -318,7 +318,7 @@ protected void overlayMetadata(TableInfo table, String name) errors = new ArrayList<>(); Path dir = new Path(AssayService.ASSAY_DIR_NAME, getProvider().getResourceName(), QueryService.MODULE_QUERIES_DIRECTORY); - Collection metadata = QueryService.get().findMetadataOverride(this, name, false, true, errors, dir); + Collection metadata = QueryService.get().findMetadataOverride(this, name, false, false, errors, dir); if (errors.isEmpty()) table.overlayMetadata(metadata, this, errors); }