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); } 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; } 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