From a5117663b6477284ba0b2770f87ebcc2a64e8475 Mon Sep 17 00:00:00 2001 From: lewa <lene.wasskog@nibio.no> Date: Wed, 28 Aug 2024 10:02:33 +0200 Subject: [PATCH] feat: Add link to first column --- .../vips/logic/util/ExcelFileGenerator.java | 50 +++++++++++++------ .../vips/logic/i18n/vipslogictexts.properties | 5 +- .../logic/i18n/vipslogictexts_nb.properties | 5 +- 3 files changed, 42 insertions(+), 18 deletions(-) diff --git a/src/main/java/no/nibio/vips/logic/util/ExcelFileGenerator.java b/src/main/java/no/nibio/vips/logic/util/ExcelFileGenerator.java index 79ce3027..82d1d38f 100644 --- a/src/main/java/no/nibio/vips/logic/util/ExcelFileGenerator.java +++ b/src/main/java/no/nibio/vips/logic/util/ExcelFileGenerator.java @@ -7,6 +7,7 @@ import com.ibm.icu.util.ULocale; import no.nibio.vips.logic.entity.VipsLogicUser; import no.nibio.vips.logic.entity.rest.ObservationListItem; import no.nibio.vips.observationdata.ObservationDataSchema; +import org.apache.poi.common.usermodel.HyperlinkType; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.ss.usermodel.*; @@ -22,17 +23,18 @@ public final class ExcelFileGenerator { private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); private static final ObjectMapper objectMapper = new ObjectMapper(); - private static final int COL_INDEX_DATE = 0; - private static final int COL_INDEX_LOCATION = 1; - private static final int COL_INDEX_OBSERVER_ID = 2; - private static final int COL_INDEX_OBSERVER_NAME = 3; - private static final int COL_INDEX_OBSERVATION_TIME_SERIES_ID = 4; - private static final int COL_INDEX_OBSERVATION_TIME_SERIES_LABEL = 5; - private static final int COL_INDEX_ORGANISM = 6; - private static final int COL_INDEX_CROP_ORGANISM = 7; - private static final int COL_INDEX_HEADING = 8; - private static final int COL_INDEX_DESCRIPTION = 9; - private static final int COL_START_INDEX_DATA = 10; + private static final int COL_INDEX_ID = 0; + private static final int COL_INDEX_DATE = 1; + private static final int COL_INDEX_LOCATION = 2; + private static final int COL_INDEX_OBSERVER_ID = 3; + private static final int COL_INDEX_OBSERVER_NAME = 4; + private static final int COL_INDEX_OBSERVATION_TIME_SERIES_ID = 5; + private static final int COL_INDEX_OBSERVATION_TIME_SERIES_LABEL = 6; + private static final int COL_INDEX_ORGANISM = 7; + private static final int COL_INDEX_CROP_ORGANISM = 8; + private static final int COL_INDEX_HEADING = 9; + private static final int COL_INDEX_DESCRIPTION = 10; + private static final int COL_START_INDEX_DATA = 11; public static byte[] generateExcel(VipsLogicUser user, ULocale locale, List<ObservationListItem> observations) throws IOException { ResourceBundle rb = ResourceBundle.getBundle("no.nibio.vips.logic.i18n.vipslogictexts", locale.toLocale()); @@ -47,7 +49,7 @@ public final class ExcelFileGenerator { int mainSheetRowIndex = 1; // Add one row for each observation in list of all observations for (ObservationListItem item : observations) { - createItemRow(mainSheet, mainSheetRowIndex++, item); + createItemRow(workbook, mainSheet, mainSheetRowIndex++, item); } autoSizeColumns(mainSheet, 0, COL_INDEX_DESCRIPTION); @@ -71,7 +73,7 @@ public final class ExcelFileGenerator { int pestSheetRowIndex = 1; for (ObservationListItem item : observationsForPest) { - Row row = createItemRow(pestSheet, pestSheetRowIndex++, item); + Row row = createItemRow(workbook, pestSheet, pestSheetRowIndex++, item); if (item.getObservationData() != null) { Map<String, Object> observationDataMap = objectMapper.readValue(item.getObservationData(), HashMap.class); @@ -176,6 +178,7 @@ public final class ExcelFileGenerator { */ public static Row createHeaderRow(Sheet sheet, ResourceBundle rb) { Row headerRow = sheet.createRow(0); + headerRow.createCell(COL_INDEX_ID).setCellValue(rb.getString("observationId")); headerRow.createCell(COL_INDEX_DATE).setCellValue(rb.getString("timeOfObservation")); headerRow.createCell(COL_INDEX_LOCATION).setCellValue(rb.getString("location")); headerRow.createCell(COL_INDEX_OBSERVER_ID).setCellValue(rb.getString("observerId")); @@ -192,16 +195,18 @@ public final class ExcelFileGenerator { /** * Create row with given index, for given observation list item * + * @param workbook The current workbook * @param sheet The sheet to which a row will be added * @param rowIndex The index of the row * @param item The item of which to add data * @return the newly created row */ - private static Row createItemRow(Sheet sheet, int rowIndex, ObservationListItem item) throws JsonProcessingException { + private static Row createItemRow(XSSFWorkbook workbook, Sheet sheet, int rowIndex, ObservationListItem item) throws JsonProcessingException { LocalDate localDateOfObservation = item.getTimeOfObservation().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); String pointOfInterestName = getPointOfInterestName(item.getGeoInfo()); Row row = sheet.createRow(rowIndex); + addObservationLinkToFirstCol(workbook, row, item.getObservationId()); row.createCell(COL_INDEX_DATE).setCellValue(localDateOfObservation.format(DATE_FORMATTER)); row.createCell(COL_INDEX_LOCATION).setCellValue(pointOfInterestName); row.createCell(COL_INDEX_OBSERVER_ID).setCellValue(item.getObserverId()); @@ -219,4 +224,21 @@ public final class ExcelFileGenerator { return row; } + private static void addObservationLinkToFirstCol(Workbook workbook, Row row, Integer observationId) { + Cell cell = row.createCell(COL_INDEX_ID); + cell.setCellValue(observationId); + + CreationHelper creationHelper = workbook.getCreationHelper(); + Hyperlink hyperlink = creationHelper.createHyperlink(HyperlinkType.URL); + hyperlink.setAddress("https://www.vips-landbruk.no/observations/" + observationId); + cell.setHyperlink(hyperlink); + + CellStyle hlinkStyle = workbook.createCellStyle(); + Font hlinkFont = workbook.createFont(); + hlinkFont.setUnderline(Font.U_SINGLE); + hlinkFont.setColor(IndexedColors.BLUE.getIndex()); + hlinkStyle.setFont(hlinkFont); + cell.setCellStyle(hlinkStyle); + } + } diff --git a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties index 2f420383..75d9c6bc 100755 --- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties +++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties @@ -1056,5 +1056,6 @@ privacyStatement=Privacy statement privacyStatementFileName=Privacy_statement_NIBIO-VIPS.pdf thresholdDSVMax=DSV threshold for high infection risk thresholdDSVTempMin=Minimum temperature for DSV calculation -observationTimeSeriesId=Timeseries Id -observationTimeSeriesLabel=Timeseries +observationTimeSeriesId=Timeseries +observationTimeSeriesLabel=Timeseries label +observationId=Observation diff --git a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_nb.properties b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_nb.properties index 1ff55afb..c00c7ea4 100755 --- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_nb.properties +++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_nb.properties @@ -1055,5 +1055,6 @@ privacyStatement=Personvernerkl\u00e6ring privacyStatementFileName=Personvernerklaering_NIBIO-VIPS.pdf thresholdDSVMax=DSV-terskel for h\u00f8y infeksjonsrisiko thresholdDSVTempMin=Minimumstemperatur for beregning av DSV -observationTimeSeriesId=Tidsserie-Id -observationTimeSeriesLabel=Tidsserie +observationTimeSeriesId=Tidsserie +observationTimeSeriesLabel=Tidsseriemerkelapp +observationId=Observasjon -- GitLab