Skip to content

fix(table-metadata): Keeps the notes on values on default selection PXWEB2-616 #357

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Mar 24, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 67 additions & 0 deletions PxWeb.UnitTests/Helpers/NotesFixTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
using System.Reflection;

namespace PxWeb.UnitTests.Helpers
{
[TestClass]
public class NotesFixTests
{
[TestMethod]
public void GetNotes_WhenContent_ShouldReturnEmptyDictonary()
{
// Arrange
var variable = ModelStore.CreateContentVariable("", PlacementType.Stub, 2);

// Act
var methodInfo = typeof(Bjarte3).GetMethod("GetNotes", BindingFlags.NonPublic | BindingFlags.Static);
var result = methodInfo?.Invoke(null, new object[] { variable });

// Assert
Assert.IsNotNull(result);
Assert.IsInstanceOfType(result, typeof(Dictionary<string, Notes>));
Assert.AreEqual(0, ((Dictionary<string, Notes>)result).Count);
}

[TestMethod]
public void GetNotes_WhenOneNoteOnFirstValue_ShouldReturDictonaryWithOneKey()
{
// Arrange
var variable = ModelStore.CreateTimeVariable("", PlacementType.Stub, 10);
variable.Values[0].AddNote(new PCAxis.Paxiom.Note("A note!", NoteType.Value, false));
var valueCode = variable.Values[0].Code;

// Act
var methodInfo = typeof(Bjarte3).GetMethod("GetNotes", BindingFlags.NonPublic | BindingFlags.Static);
var result = methodInfo?.Invoke(null, new object[] { variable });

// Assert
Assert.IsNotNull(result);
Assert.IsInstanceOfType(result, typeof(Dictionary<string, Notes>));
Assert.AreEqual(1, ((Dictionary<string, Notes>)result).Count);
Assert.IsTrue(((Dictionary<string, Notes>)result).ContainsKey(valueCode));
}


[TestMethod]
public void GetReapply_WhenOneNoteOnFirstValue_ShouldHaveANotOnFirstValue()
{
// Arrange
const string noteText = "A note!";
var variable = ModelStore.CreateTimeVariable("", PlacementType.Stub, 10);
variable.Values[0].AddNote(new PCAxis.Paxiom.Note(noteText, NoteType.Value, false));
var valueCode = variable.Values[0].Code;
var variable2 = ModelStore.CreateTimeVariable("", PlacementType.Stub, 10);
var methodInfo = typeof(Bjarte3).GetMethod("GetNotes", BindingFlags.NonPublic | BindingFlags.Static);
var notes = methodInfo?.Invoke(null, new object[] { variable }) as Dictionary<string, Notes> ?? new Dictionary<string, Notes>();

// Act
var methodInfo2 = typeof(Bjarte3).GetMethod("ReapplyNotes", BindingFlags.NonPublic | BindingFlags.Static);
var result = methodInfo2?.Invoke(null, new object[] { variable2, notes });

// Assert
Assert.IsTrue(variable2.Values[0].HasNotes());
Assert.AreEqual(noteText, variable2.Values[0].Notes[0].Text);
Assert.AreEqual(1, variable2.Values[0].Notes.Count);

}
}
}
2 changes: 1 addition & 1 deletion PxWeb.UnitTests/ModelStore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ public static PCAxis.Paxiom.Variable CreateClassificationVariable(string suffix,
return variable;
}

private static PCAxis.Paxiom.Variable CreateContentVariable(string suffix, PlacementType placementType, int numberOfValues)
public static PCAxis.Paxiom.Variable CreateContentVariable(string suffix, PlacementType placementType, int numberOfValues)
{
var name = $"cont_{suffix}";
Variable variable = new Variable(name, placementType);
Expand Down
40 changes: 40 additions & 0 deletions PxWeb/Code/Api2/DataSelection/Bjarte3.cs
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,9 @@ private static void ReapplyCodelist(IPXModelBuilder builder, PXMeta meta)
{
foreach (var variable in meta.Variables)
{

var valueNotes = GetNotes(variable);

if (variable.HasValuesets() && variable.CurrentGrouping is null && variable.CurrentValueSet is null)
{
builder.ApplyValueSet(variable.Code, variable.ValueSets[0]);
Expand All @@ -273,6 +276,43 @@ private static void ReapplyCodelist(IPXModelBuilder builder, PXMeta meta)
{
builder.ApplyValueSet(variable.Code, variable.CurrentValueSet);
}
var newVariable = builder.Model.Meta.Variables.FirstOrDefault(v => v.Code == variable.Code);
if (newVariable is not null)
{
ReapplyNotes(newVariable, valueNotes);
}
}
}

private static Dictionary<string, Notes> GetNotes(Variable variable)
{
var valueNotes = new Dictionary<string, Notes>();
//Skip Content variables since they have not other valueset or grouping
if (variable.IsContentVariable)
{
return valueNotes;
}

foreach (var value in variable.Values.Where(v => v.HasNotes()))
{
valueNotes.Add(value.Code, value.Notes);
}
return valueNotes;
}

private static void ReapplyNotes(Variable variable, Dictionary<string, Notes> valueNotes)
{

foreach (var valueCode in valueNotes.Keys)
{
var value = variable.Values.FirstOrDefault(v => v.Code == valueCode);
if (value is not null && !value.HasNotes())
{
foreach (var note in valueNotes[valueCode])
{
value.AddNote(note);
}
}
}
}
}
Expand Down