diff --git a/api/src/org/labkey/api/data/TSVJSONWriter.java b/api/src/org/labkey/api/data/TSVJSONWriter.java new file mode 100644 index 00000000000..0804ef9891b --- /dev/null +++ b/api/src/org/labkey/api/data/TSVJSONWriter.java @@ -0,0 +1,50 @@ +package org.labkey.api.data; + +import org.json.JSONArray; +import org.labkey.api.util.FileUtil; + +import java.util.List; + +public class TSVJSONWriter extends TSVWriter +{ + private final JSONArray _rows; + private final String _filename; + + /** + * Writes a JSONArray of JSONArrays to TSV. + * @param filename The filename without a file extension + * @param rows A JSONArray object that is expected to be an array of arrays. e.g. [[1,2,3], [4,5,6]]. + */ + public TSVJSONWriter(String filename, JSONArray rows) + { + _filename = filename; + _rows = rows; + _headerRowVisible = false; + } + + private List jsonArrayToStringList(JSONArray jsonArray) + { + return jsonArray.toList() + .stream() + .map(obj -> (obj == null) ? "" : String.valueOf(obj)) + .toList(); + } + + @Override + protected int writeBody() + { + for (int i = 0; i < _rows.length(); i++) + { + List values = jsonArrayToStringList(_rows.getJSONArray(i)); + writeLine(values); + } + + return _rows.length(); + } + + @Override + protected String getFilename() + { + return FileUtil.makeLegalName(_filename + "." + getFilenameExtension()); + } +} diff --git a/assay/package-lock.json b/assay/package-lock.json index 05353f7b726..83c7fbf68c3 100644 --- a/assay/package-lock.json +++ b/assay/package-lock.json @@ -8,7 +8,7 @@ "name": "assay", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.68.1" + "@labkey/components": "6.68.2" }, "devDependencies": { "@labkey/build": "8.6.0", @@ -2458,9 +2458,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.68.1", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.68.1.tgz", - "integrity": "sha512-8YphakuF2oRaunHegtGkGhyu7duXSWTy7CbA4UI5phzQrWwZIDrKcjE3WUuCpiaMiahuvADG2v8RgzbwsWOEbA==", + "version": "6.68.2", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.68.2.tgz", + "integrity": "sha512-pZkWqRoa+VFTJBk+eNdgceylqpfqZbx7QB6hWXizvFDefeOZIMqCfQrvGJQQkDcDEQxbjB9NXtsqgPHrPCq+Ow==", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", diff --git a/assay/package.json b/assay/package.json index 42fe53474fb..0bb008f123a 100644 --- a/assay/package.json +++ b/assay/package.json @@ -12,7 +12,7 @@ "clean": "rimraf resources/web/assay/gen && rimraf resources/views/gen && rimraf resources/web/gen" }, "dependencies": { - "@labkey/components": "6.68.1" + "@labkey/components": "6.68.2" }, "devDependencies": { "@labkey/build": "8.6.0", diff --git a/core/package-lock.json b/core/package-lock.json index ddd43508597..369c7cc1b08 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -8,7 +8,7 @@ "name": "labkey-core", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.68.1", + "@labkey/components": "6.68.2", "@labkey/themes": "1.4.2" }, "devDependencies": { @@ -3504,9 +3504,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.68.1", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.68.1.tgz", - "integrity": "sha512-8YphakuF2oRaunHegtGkGhyu7duXSWTy7CbA4UI5phzQrWwZIDrKcjE3WUuCpiaMiahuvADG2v8RgzbwsWOEbA==", + "version": "6.68.2", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.68.2.tgz", + "integrity": "sha512-pZkWqRoa+VFTJBk+eNdgceylqpfqZbx7QB6hWXizvFDefeOZIMqCfQrvGJQQkDcDEQxbjB9NXtsqgPHrPCq+Ow==", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", diff --git a/core/package.json b/core/package.json index f23594ab7fc..f449f60f4d1 100644 --- a/core/package.json +++ b/core/package.json @@ -53,7 +53,7 @@ } }, "dependencies": { - "@labkey/components": "6.68.1", + "@labkey/components": "6.68.2", "@labkey/themes": "1.4.2" }, "devDependencies": { diff --git a/experiment/package-lock.json b/experiment/package-lock.json index c18f2c8f767..3c800e6f7cf 100644 --- a/experiment/package-lock.json +++ b/experiment/package-lock.json @@ -8,7 +8,7 @@ "name": "experiment", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.68.1" + "@labkey/components": "6.68.2" }, "devDependencies": { "@labkey/build": "8.6.0", @@ -3247,9 +3247,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.68.1", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.68.1.tgz", - "integrity": "sha512-8YphakuF2oRaunHegtGkGhyu7duXSWTy7CbA4UI5phzQrWwZIDrKcjE3WUuCpiaMiahuvADG2v8RgzbwsWOEbA==", + "version": "6.68.2", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.68.2.tgz", + "integrity": "sha512-pZkWqRoa+VFTJBk+eNdgceylqpfqZbx7QB6hWXizvFDefeOZIMqCfQrvGJQQkDcDEQxbjB9NXtsqgPHrPCq+Ow==", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", diff --git a/experiment/package.json b/experiment/package.json index ef74e50dfa2..5e870a1b2e0 100644 --- a/experiment/package.json +++ b/experiment/package.json @@ -13,7 +13,7 @@ "test-integration": "cross-env NODE_ENV=test jest --ci --runInBand -c test/js/jest.config.integration.js" }, "dependencies": { - "@labkey/components": "6.68.1" + "@labkey/components": "6.68.2" }, "devDependencies": { "@labkey/build": "8.6.0", diff --git a/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java b/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java index 00644fd3577..26e4decea5e 100644 --- a/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java +++ b/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java @@ -16,7 +16,6 @@ package org.labkey.experiment.controllers.exp; -import au.com.bytecode.opencsv.CSVWriter; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -25,7 +24,6 @@ import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.ss.usermodel.Workbook; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -90,6 +88,7 @@ import org.labkey.api.data.SimpleFilter; import org.labkey.api.data.Sort; import org.labkey.api.data.SqlSelector; +import org.labkey.api.data.TSVJSONWriter; import org.labkey.api.data.TSVWriter; import org.labkey.api.data.TableInfo; import org.labkey.api.data.TableSelector; @@ -226,6 +225,7 @@ import org.labkey.api.util.SafeToRender; import org.labkey.api.util.SessionHelper; import org.labkey.api.util.StringExpression; +import org.labkey.api.util.StringUtilsLabKey; import org.labkey.api.util.URLHelper; import org.labkey.api.util.UniqueID; import org.labkey.api.util.CsrfInput; @@ -2841,29 +2841,14 @@ public void export(ConvertArraysToExcelForm form, HttpServletResponse response, String filename = filenamePrefix + "." + delimType.extension; String newlineChar = !rootObject.isNull("newlineChar") ? rootObject.getString("newlineChar") : "\n"; - PageFlowUtil.prepareResponseForFile(response, Collections.emptyMap(), filename, true); - response.setContentType(delimType.contentType); + response.setCharacterEncoding(StringUtilsLabKey.DEFAULT_CHARSET.name()); - //NOTE: we could also have used TSVWriter; however, this is in use elsewhere and we dont need a custom subclass - try (CSVWriter writer = new CSVWriter(response.getWriter(), delimType.delim, quoteType.quoteChar, newlineChar)) + try(var tsvWriter = new TSVJSONWriter(filenamePrefix, rowsArray)) { - for (int i = 0; i < rowsArray.length(); i++) - { - List objectList = rowsArray.getJSONArray(i).toList(); - Iterator it = objectList.iterator(); - List list = new ArrayList<>(); - - while (it.hasNext()) - { - Object o = it.next(); - if (o != null) - list.add(o.toString()); - else - list.add(""); - } - - writer.writeNext(list.toArray(new String[0])); - } + tsvWriter.setRowSeparator(newlineChar); + tsvWriter.setDelimiterCharacter(delimType); + tsvWriter.setQuoteCharacter(quoteType); + tsvWriter.write(response); } JSONObject qInfo = rootObject.optJSONObject("queryinfo"); diff --git a/pipeline/package-lock.json b/pipeline/package-lock.json index f34fdb9772b..a38e4e16d96 100644 --- a/pipeline/package-lock.json +++ b/pipeline/package-lock.json @@ -8,7 +8,7 @@ "name": "pipeline", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.68.1" + "@labkey/components": "6.68.2" }, "devDependencies": { "@labkey/build": "8.6.0", @@ -2716,9 +2716,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.68.1", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.68.1.tgz", - "integrity": "sha512-8YphakuF2oRaunHegtGkGhyu7duXSWTy7CbA4UI5phzQrWwZIDrKcjE3WUuCpiaMiahuvADG2v8RgzbwsWOEbA==", + "version": "6.68.2", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.68.2.tgz", + "integrity": "sha512-pZkWqRoa+VFTJBk+eNdgceylqpfqZbx7QB6hWXizvFDefeOZIMqCfQrvGJQQkDcDEQxbjB9NXtsqgPHrPCq+Ow==", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", diff --git a/pipeline/package.json b/pipeline/package.json index dfbfff62758..15b749d44ca 100644 --- a/pipeline/package.json +++ b/pipeline/package.json @@ -14,7 +14,7 @@ "build-prod": "npm run clean && cross-env NODE_ENV=production PROD_SOURCE_MAP=source-map webpack --config node_modules/@labkey/build/webpack/prod.config.js --color --progress --profile" }, "dependencies": { - "@labkey/components": "6.68.1" + "@labkey/components": "6.68.2" }, "devDependencies": { "@labkey/build": "8.6.0", diff --git a/visualization/resources/web/vis/genericChart/genericChartHelper.js b/visualization/resources/web/vis/genericChart/genericChartHelper.js index df59985f05c..2c3db024862 100644 --- a/visualization/resources/web/vis/genericChart/genericChartHelper.js +++ b/visualization/resources/web/vis/genericChart/genericChartHelper.js @@ -1949,14 +1949,19 @@ LABKEY.vis.GenericChartHelper = new function(){ return; var plotConfigArr = generatePlotConfigs(renderTo, chartConfig, labels, aes, scales, geom, data, trendlineData); + let plots = []; $.each(plotConfigArr, function(idx, plotConfig) { if (chartType === 'pie_chart') { - new LABKEY.vis.PieChart(plotConfig); + plots.push(new LABKEY.vis.PieChart(plotConfig)); } else { - new LABKEY.vis.Plot(plotConfig).render(); + const plot = new LABKEY.vis.Plot(plotConfig); + plot.render(); + plots.push(plot); } }, this); + + return plots; } var _renderMessages = function(divId, messages) {