From 78febcb2299d6cc813ca516389419d12ab60497d Mon Sep 17 00:00:00 2001 From: labkey-matthewb Date: Fri, 6 Jun 2025 13:38:52 -0700 Subject: [PATCH] Always set Results for DisplayColumns that rely on FieldKey binding. (MissingValueDisplayColumn) Also, just removed using viewForm.getOldValues() which only contains PKs now anyway. --- api/src/org/labkey/api/data/DataRegion.java | 55 +++++++++++---------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/api/src/org/labkey/api/data/DataRegion.java b/api/src/org/labkey/api/data/DataRegion.java index 1891d35e25a..99a8acd8a16 100644 --- a/api/src/org/labkey/api/data/DataRegion.java +++ b/api/src/org/labkey/api/data/DataRegion.java @@ -29,7 +29,6 @@ import org.junit.Assert; import org.junit.Test; import org.labkey.api.collections.BoundMap; -import org.labkey.api.collections.CaseInsensitiveHashMap; import org.labkey.api.collections.ResultSetRowMapFactory; import org.labkey.api.collections.RowMap; import org.labkey.api.collections.Sets; @@ -2065,36 +2064,38 @@ private void renderInputForm(RenderContext ctx, HtmlWriter out) private void renderUpdateForm(RenderContext ctx, HtmlWriter out) { - TableViewForm viewForm = ctx.getForm(); - Map valueMap = ctx.getRow(); - LinkedHashMap selectKeyMap = getSelectColumns(); - if (null == valueMap) + try { - if (!hasPermission(ctx, ReadPermission.class)) - throw new UnauthorizedException(); - - valueMap = new CaseInsensitiveHashMap<>(); - - TableInfo tinfoMain = getTable(); - Collection> maps = new TableSelector(tinfoMain, selectKeyMap.values(), new PkFilter(tinfoMain, viewForm.getPkVals()), null).getMapCollection(); - if (!maps.isEmpty()) - valueMap.putAll(maps.iterator().next()); - - //For updates, the valueMap is the OLD version of the data. - //If there is no old data, we reselect to get it - if (null != viewForm.getOldValues()) + TableViewForm viewForm = ctx.getForm(); + Map valueMap = ctx.getRow(); + LinkedHashMap selectKeyMap = getSelectColumns(); + if (null == valueMap) { - //UNDONE: getOldValues() sometimes returns a map and sometimes a bean, this seems broken to me (MAB) - Object old = viewForm.getOldValues(); - if (old instanceof Map m) - valueMap.putAll(m); - else - valueMap.putAll(new BoundMap(old)); + if (!hasPermission(ctx, ReadPermission.class)) + throw new UnauthorizedException(); + + // For update the Results holds the current version of the data. + // The posted values (for reshow) are help by TableViewForm (RenderContext.getForm()). see DisplayColumn.getInputValue() + TableInfo tinfoMain = getTable(); + var results = new TableSelector(tinfoMain, selectKeyMap.values(), new PkFilter(tinfoMain, viewForm.getPkVals()), null).getResults(true); + // NOTE MissingValueDisplayColumn does not work without Results, it relies on using .get(FieldKey) that it enables + if (results.next()) + { + ctx.setResults(results); + ctx.setRow(results.getRowMap()); + } } - ctx.setRow(valueMap); - } - renderForm(ctx, out); + renderForm(ctx, out); + } + catch (SQLException e) + { + throw new RuntimeSQLException(e); + } + finally + { + ResultSetUtil.close(ctx.getResults()); + } } /**