fix(frontend): Table diff not working when row count does not change
This commit is contained in:
@@ -54,8 +54,15 @@ export function compareApplicationFormValues(
|
||||
? formatUserValueLabel(versionValue, versionData.element.options, versionData.element.type)
|
||||
: null
|
||||
|
||||
// Skip if labels are the same (actual displayed values haven't changed)
|
||||
if (currentLabel === versionLabel) {
|
||||
// Skip if values are the same (actual values haven't changed)
|
||||
// For tables, compare the serialized data directly since labels only show row count
|
||||
if (elementType === 'TABLE') {
|
||||
const currentSerialized = typeof currentValue === 'string' ? currentValue : null
|
||||
const versionSerialized = typeof versionValue === 'string' ? versionValue : null
|
||||
if (currentSerialized === versionSerialized) {
|
||||
continue
|
||||
}
|
||||
} else if (currentLabel === versionLabel) {
|
||||
continue
|
||||
}
|
||||
|
||||
|
||||
@@ -627,6 +627,31 @@ describe('formDiff', () => {
|
||||
expect(diff.changedAnswers[0].tableDiff!.rows[1].currentValues['Name']).toBe('Janet')
|
||||
})
|
||||
|
||||
it('should detect modified rows when row count is the same', () => {
|
||||
const current = createForm([
|
||||
createFormElement('table_1', 'Employees', 'TABLE', [
|
||||
createOption('["John", "Janet"]', 'Name'),
|
||||
createOption('["Developer", "Designer"]', 'Role')
|
||||
])
|
||||
])
|
||||
const version = createSnapshot([
|
||||
createSnapshotElement('table_1', 'Employees', 'TABLE', [
|
||||
createOption('["John", "Jane"]', 'Name'),
|
||||
createOption('["Developer", "Designer"]', 'Role')
|
||||
])
|
||||
])
|
||||
|
||||
const diff = compareApplicationFormValues(current, version)
|
||||
|
||||
expect(diff.changedAnswers).toHaveLength(1)
|
||||
expect(diff.changedAnswers[0].tableDiff).toBeDefined()
|
||||
expect(diff.changedAnswers[0].tableDiff!.addedCount).toBe(0)
|
||||
expect(diff.changedAnswers[0].tableDiff!.modifiedCount).toBe(1)
|
||||
expect(diff.changedAnswers[0].tableDiff!.rows[1].changeType).toBe('modified')
|
||||
expect(diff.changedAnswers[0].tableDiff!.rows[1].previousValues['Name']).toBe('Jane')
|
||||
expect(diff.changedAnswers[0].tableDiff!.rows[1].currentValues['Name']).toBe('Janet')
|
||||
})
|
||||
|
||||
it('should detect mixed changes (added, removed, modified)', () => {
|
||||
const current = createForm([
|
||||
createFormElement('table_1', 'Employees', 'TABLE', [
|
||||
@@ -673,8 +698,6 @@ describe('formDiff', () => {
|
||||
})
|
||||
|
||||
it('should handle boolean values in table cells', () => {
|
||||
// Note: The diff algorithm compares by label first ("N Zeilen").
|
||||
// If row count is the same, no change is detected at the label level.
|
||||
// To detect boolean cell changes, we need a row count change too.
|
||||
const current = createForm([
|
||||
createFormElement('table_1', 'Settings', 'TABLE', [
|
||||
@@ -697,8 +720,6 @@ describe('formDiff', () => {
|
||||
})
|
||||
|
||||
it('should handle array values in table cells', () => {
|
||||
// Note: The diff algorithm compares by label first ("N Zeilen").
|
||||
// To detect array cell changes, we need a row count change too.
|
||||
const current = createForm([
|
||||
createFormElement('table_1', 'Projects', 'TABLE', [
|
||||
createOption('["Project A", "Project B"]', 'Name'),
|
||||
|
||||
Reference in New Issue
Block a user