diff --git a/legalconsenthub/app/utils/formDiff.ts b/legalconsenthub/app/utils/formDiff.ts index deec55a..16a3473 100644 --- a/legalconsenthub/app/utils/formDiff.ts +++ b/legalconsenthub/app/utils/formDiff.ts @@ -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 } diff --git a/legalconsenthub/test/unit/formDiff.spec.ts b/legalconsenthub/test/unit/formDiff.spec.ts index 729cc07..343ebd0 100644 --- a/legalconsenthub/test/unit/formDiff.spec.ts +++ b/legalconsenthub/test/unit/formDiff.spec.ts @@ -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'),