From c4a67ca9305fccecdd34b37462fe7959e3845495 Mon Sep 17 00:00:00 2001 From: XingY Date: Mon, 7 Jul 2025 20:22:06 -0700 Subject: [PATCH 1/8] Use original case in duplicate name error message --- packages/components/package.json | 2 +- .../components/releaseNotes/components.md | 5 +++++ .../internal/components/editable/models.ts | 20 ++++++++++++++----- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/packages/components/package.json b/packages/components/package.json index 80ab158e99..e8895af962 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.54.0", + "version": "6.54.1-fb-sampleNameCase.1", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ diff --git a/packages/components/releaseNotes/components.md b/packages/components/releaseNotes/components.md index 4d5cdb5d4a..dca0b2116f 100644 --- a/packages/components/releaseNotes/components.md +++ b/packages/components/releaseNotes/components.md @@ -1,6 +1,11 @@ # @labkey/components Components, models, actions, and utility functions for LabKey applications and pages +### version 6.X +*Released*: X July 2025 +- Issue 52657: LKSM: We shouldn't allow creating sample names that differ only in case + - Use original case in duplicate name error message + ### version 6.54.0 *Released*: 3 July 2025 - ProductMenu shows 'Dashboard' instead of 'Storage' as subtitle in FM /home route diff --git a/packages/components/src/internal/components/editable/models.ts b/packages/components/src/internal/components/editable/models.ts index 2856b175c0..125807c1f2 100644 --- a/packages/components/src/internal/components/editable/models.ts +++ b/packages/components/src/internal/components/editable/models.ts @@ -426,6 +426,7 @@ export class EditorModel let keyValues = Map>(); // map from row number to list of key values on that row let uniqueKeyMap = Map>(); // map from value to rows with that value let missingRequired = Map>(); // map from column caption to list of rows missing a value for that column + const originalUniqueValMap = {} for (let rn = 0; rn < this.rowCount; rn++) { columns.forEach(col => { const fieldKey = col.fieldKey; @@ -476,11 +477,13 @@ export class EditorModel // there better be only one of these const valueDescriptor = values.get(0); if (valueDescriptor && this.hasRawValue(valueDescriptor)) { - const stringVal = valueDescriptor.raw.toString().trim().toLowerCase(); - if (uniqueKeyMap.has(stringVal)) { - uniqueKeyMap = uniqueKeyMap.set(stringVal, uniqueKeyMap.get(stringVal).push(rn + 1)); + const rawStringVal = valueDescriptor.raw.toString().trim(); + const stringValLc = rawStringVal.toLowerCase(); + if (uniqueKeyMap.has(stringValLc)) { + uniqueKeyMap = uniqueKeyMap.set(stringValLc, uniqueKeyMap.get(stringValLc).push(rn + 1)); } else { - uniqueKeyMap = uniqueKeyMap.set(stringVal, List([rn + 1])); + originalUniqueValMap[stringValLc] = rawStringVal; + uniqueKeyMap = uniqueKeyMap.set(stringValLc, List([rn + 1])); } } } @@ -488,7 +491,14 @@ export class EditorModel } let uniqueKeyViolations = Map>>(); - const duplicates = uniqueKeyMap.filter(rowNumbers => rowNumbers.size > 1).toMap(); + const duplicates = uniqueKeyMap + .filter(rowNumbers => rowNumbers.size > 1) + .reduce((keyMap, values, uniqueValueLc) => { + const uniqueValueOriginal = originalUniqueValMap[uniqueValueLc]; + if (uniqueValueOriginal) return keyMap.set(uniqueValueOriginal, values); + else return keyMap.set(uniqueValueLc, values); + }, Map>()) + .toMap(); if (duplicates.size > 0 && uniqueFieldCol) { uniqueKeyViolations = uniqueKeyViolations.set(uniqueFieldCol.caption, duplicates); } From ca88d30440a5b9bcd911f7bd86877c343736430c Mon Sep 17 00:00:00 2001 From: XingY Date: Mon, 7 Jul 2025 20:32:26 -0700 Subject: [PATCH 2/8] Use original case in duplicate name error message --- packages/components/package-lock.json | 4 ++-- .../components/src/internal/components/editable/models.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index 6fa6f64083..665eb8b4c6 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "6.54.0", + "version": "6.54.1-fb-sampleNameCase.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.54.0", + "version": "6.54.1-fb-sampleNameCase.1", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", diff --git a/packages/components/src/internal/components/editable/models.ts b/packages/components/src/internal/components/editable/models.ts index 125807c1f2..c13361d56f 100644 --- a/packages/components/src/internal/components/editable/models.ts +++ b/packages/components/src/internal/components/editable/models.ts @@ -426,7 +426,7 @@ export class EditorModel let keyValues = Map>(); // map from row number to list of key values on that row let uniqueKeyMap = Map>(); // map from value to rows with that value let missingRequired = Map>(); // map from column caption to list of rows missing a value for that column - const originalUniqueValMap = {} + const originalUniqueValMap = {}; for (let rn = 0; rn < this.rowCount; rn++) { columns.forEach(col => { const fieldKey = col.fieldKey; From 0dace5fcdef0205819cdc6510f046811fa64e240 Mon Sep 17 00:00:00 2001 From: XingY Date: Tue, 8 Jul 2025 09:49:34 -0700 Subject: [PATCH 3/8] update test --- .../components/editable/models.test.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/components/src/internal/components/editable/models.test.ts b/packages/components/src/internal/components/editable/models.test.ts index 68e5863999..928729ca7c 100644 --- a/packages/components/src/internal/components/editable/models.test.ts +++ b/packages/components/src/internal/components/editable/models.test.ts @@ -252,15 +252,16 @@ describe('EditorModel', () => { expect(uniqueKeyViolations.get(colOneCaption).size).toBe(3); expect(uniqueKeyViolations.get(colOneCaption).has('a')).toBe(true); expect(uniqueKeyViolations.get(colOneCaption).get('a')).toEqual(List([1, 2])); - expect(uniqueKeyViolations.get(colOneCaption).has('caseinsensitive')).toBe(true); - expect(uniqueKeyViolations.get(colOneCaption).get('caseinsensitive')).toEqual(List([3, 4])); - expect(uniqueKeyViolations.get(colOneCaption).has('spacedupe')).toBe(true); - expect(uniqueKeyViolations.get(colOneCaption).get('spacedupe')).toEqual(List([5, 6])); + expect(uniqueKeyViolations.get(colOneCaption).has('caseinsensitive')).toBe(false); + expect(uniqueKeyViolations.get(colOneCaption).has('caseInSenSiTive')).toBe(true); + expect(uniqueKeyViolations.get(colOneCaption).get('caseInSenSiTive')).toEqual(List([3, 4])); + expect(uniqueKeyViolations.get(colOneCaption).has('spaceDupe')).toBe(true); + expect(uniqueKeyViolations.get(colOneCaption).get('spaceDupe')).toEqual(List([5, 6])); const errors = editorModel.getValidationErrors(colOneFk); expect(errors.errors).toEqual([ `Duplicate value (a) for ${colOneCaption} on rows 1, 2.`, - `Duplicate value (caseinsensitive) for ${colOneCaption} on rows 3, 4.`, - `Duplicate value (spacedupe) for ${colOneCaption} on rows 5, 6.`, + `Duplicate value (caseInSenSiTive) for ${colOneCaption} on rows 3, 4.`, + `Duplicate value (spaceDupe) for ${colOneCaption} on rows 5, 6.`, ]); }); @@ -290,11 +291,11 @@ describe('EditorModel', () => { expect(uniqueKeyViolations.size).toBe(1); expect(uniqueKeyViolations.has(colOneCaption)).toBe(true); expect(uniqueKeyViolations.get(colOneCaption).size).toBe(1); - expect(uniqueKeyViolations.get(colOneCaption).has('caseinsensitive')).toBe(true); - expect(uniqueKeyViolations.get(colOneCaption).get('caseinsensitive')).toEqual(List([3, 4])); + expect(uniqueKeyViolations.get(colOneCaption).has('caseInSenSiTive')).toBe(true); + expect(uniqueKeyViolations.get(colOneCaption).get('caseInSenSiTive')).toEqual(List([3, 4])); const errors = editorModel.getValidationErrors(colOneFk); expect(errors.errors).toEqual([ - `Duplicate value (caseinsensitive) for ${colOneCaption} on rows 3, 4.`, + `Duplicate value (caseInSenSiTive) for ${colOneCaption} on rows 3, 4.`, `${colOneCaption} is missing from row 1.`, ]); expect(errors.cellMessages.toJS()).toStrictEqual({ From fca753226110905f91a16d36bcedd4251438883d Mon Sep 17 00:00:00 2001 From: XingY Date: Tue, 8 Jul 2025 09:51:24 -0700 Subject: [PATCH 4/8] lint --- .../src/internal/components/editable/models.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/components/src/internal/components/editable/models.test.ts b/packages/components/src/internal/components/editable/models.test.ts index 928729ca7c..87a988013f 100644 --- a/packages/components/src/internal/components/editable/models.test.ts +++ b/packages/components/src/internal/components/editable/models.test.ts @@ -930,7 +930,7 @@ describe('EditorModel', () => { }); test('with original multi values, multiple same values, but ordering is changed', () => { - let updatedRows = emMultipleComplexInputs.getUpdatedData( + const updatedRows = emMultipleComplexInputs.getUpdatedData( fromJS({ 0: { [expInputCol.fieldKey]: [ @@ -941,7 +941,7 @@ describe('EditorModel', () => { { value: 123, displayValue: 'Value 123', - } + }, ], }, 1: { From e9785768ca1a3213db05188442c15ff9565e3d9a Mon Sep 17 00:00:00 2001 From: XingY Date: Tue, 8 Jul 2025 09:52:09 -0700 Subject: [PATCH 5/8] publish --- packages/components/package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index b972ea14d9..f8852cce7b 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "6.54.1", + "version": "6.54.2-fb-sampleNameCase.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.54.1", + "version": "6.54.2-fb-sampleNameCase.1", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", From 0f612f01d55f3284c650d4100918f2c626e0351c Mon Sep 17 00:00:00 2001 From: XingY Date: Wed, 9 Jul 2025 12:02:49 -0700 Subject: [PATCH 6/8] Merge branch 'develop' into fb_sampleNameCase # Conflicts: # biologics/package-lock.json # biologics/package.json # inventory/package-lock.json # inventory/package.json # sampleManagement/package-lock.json # sampleManagement/package.json --- packages/components/package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index be65cfc7d7..a25ab576ca 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "6.54.2", + "version": "6.54.3-fb-sampleNameCase.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.54.2", + "version": "6.54.3-fb-sampleNameCase.1", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", From fa72a841395a17ac0126d0d2a5483a0af1f9c349 Mon Sep 17 00:00:00 2001 From: XingY Date: Thu, 10 Jul 2025 14:47:58 -0700 Subject: [PATCH 7/8] update release note --- packages/components/releaseNotes/components.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/components/releaseNotes/components.md b/packages/components/releaseNotes/components.md index 016ed4e3e4..9b9304f132 100644 --- a/packages/components/releaseNotes/components.md +++ b/packages/components/releaseNotes/components.md @@ -1,8 +1,8 @@ # @labkey/components Components, models, actions, and utility functions for LabKey applications and pages -### version 6.X -*Released*: X July 2025 +### version 6.54.3 +*Released*: 10 July 2025 - Issue 52657: LKSM: We shouldn't allow creating sample names that differ only in case - Use original case in duplicate name error message From 26de95b5d12ef443b7f8096206fe4260ed1c51b8 Mon Sep 17 00:00:00 2001 From: XingY Date: Thu, 10 Jul 2025 14:51:01 -0700 Subject: [PATCH 8/8] publish --- packages/components/package-lock.json | 4 ++-- packages/components/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index a25ab576ca..34a2b8b29e 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "6.54.3-fb-sampleNameCase.1", + "version": "6.54.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.54.3-fb-sampleNameCase.1", + "version": "6.54.3", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", diff --git a/packages/components/package.json b/packages/components/package.json index 8893ab580f..f31f8179eb 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.54.3-fb-sampleNameCase.1", + "version": "6.54.3", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [