diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index 18780237de..81c589a4c2 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "7.41.0", + "version": "7.41.1-fb-terminalStorageUseBarcode.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "7.41.0", + "version": "7.41.1-fb-terminalStorageUseBarcode.1", "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 f4b2e6b088..85a51c745c 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "7.41.0", + "version": "7.41.1-fb-terminalStorageUseBarcode.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 0367471a67..fdbd35e91f 100644 --- a/packages/components/releaseNotes/components.md +++ b/packages/components/releaseNotes/components.md @@ -1,6 +1,12 @@ # @labkey/components Components, models, actions, and utility functions for LabKey applications and pages +### version TBD +*Released*: TBD +- App support for terminal storage barcodes + - add `StorageUnitBarcode` as an allowed field for import + - Updated resolveDuplicatesAsName() to check for the "barcode" identifier + ### version 7.41.0 *Released*: 1 June 2026 - GitHub Issue 903: Remove Cross-Container Sample and Data Class Import Feature diff --git a/packages/components/src/internal/components/samples/constants.ts b/packages/components/src/internal/components/samples/constants.ts index a6c421bf9c..0d232253be 100644 --- a/packages/components/src/internal/components/samples/constants.ts +++ b/packages/components/src/internal/components/samples/constants.ts @@ -204,12 +204,17 @@ export const SAMPLE_STORAGE_COLUMNS_WITH_SUBSELECT_EXPR = [ 'StorageLocation', ]; -export const SAMPLE_INSERT_EXTRA_COLUMNS = [...AMOUNT_AND_UNITS_COLUMNS, ...SAMPLE_STORAGE_COLUMNS, ALIQUOTED_FROM_COL]; +export const SAMPLE_INSERT_EXTRA_COLUMNS = [ + ...AMOUNT_AND_UNITS_COLUMNS, + ...SAMPLE_STORAGE_COLUMNS, + ALIQUOTED_FROM_COL, +]; export const SAMPLE_IMPORT_EXTRA_ALLOWED_COLUMNS = [ ...SAMPLE_INSERT_EXTRA_COLUMNS, 'SampleID', 'EnteredStorage', 'ExpirationDate', + 'StorageUnitBarcode', ]; export const SAMPLE_DATA_EXPORT_CONFIG = { diff --git a/packages/components/src/internal/util/messaging.test.ts b/packages/components/src/internal/util/messaging.test.ts index fad8f2d740..9dde9ce66e 100644 --- a/packages/components/src/internal/util/messaging.test.ts +++ b/packages/components/src/internal/util/messaging.test.ts @@ -555,4 +555,35 @@ describe('resolveDuplicatesAsName', () => { ); }); }); + + describe('barcode constraint', () => { + const barcodeError = + 'ERROR: duplicate key value violates unique constraint "uq_box_barcode"\n' + + ' Detail: Key (barcode)=(BC-123) already exists.'; + + test('uses "barcode" identifier when constraint is uq_box_barcode', () => { + expect(resolveDuplicatesAsName(barcodeError, 'boxes')).toBe( + "There was a problem creating your boxes. Duplicate barcode 'BC-123' found." + ); + }); + + test('uq_box_barcode check is case-insensitive', () => { + const upperCaseError = barcodeError.replace('uq_box_barcode', 'UQ_BOX_BARCODE'); + expect(resolveDuplicatesAsName(upperCaseError, 'boxes')).toBe( + "There was a problem creating your boxes. Duplicate barcode 'BC-123' found." + ); + }); + + test('uses "name" identifier when constraint is not uq_box_barcode', () => { + expect(resolveDuplicatesAsName('Key (name)=(BC-123) already exists.', 'boxes')).toBe( + "There was a problem creating your boxes. Duplicate name 'BC-123' found." + ); + }); + + test('respects optional params', () => { + expect(resolveDuplicatesAsName(barcodeError, 'box', 'boxes', 'importing')).toBe( + "There was a problem importing your boxes. Duplicate barcode 'BC-123' found." + ); + }); + }); }); diff --git a/packages/components/src/internal/util/messaging.tsx b/packages/components/src/internal/util/messaging.tsx index 03009a52eb..c034588b5e 100644 --- a/packages/components/src/internal/util/messaging.tsx +++ b/packages/components/src/internal/util/messaging.tsx @@ -79,7 +79,8 @@ export function resolveDuplicatesAsName( } let retMsg = `There was a problem ${verbPresParticiple || 'creating'} your ${nounPlural || noun || 'data'}.`; if (name) { - retMsg += ` Duplicate name '${name}' found.`; + const identifierType = errorMsg.toLowerCase().indexOf('uq_box_barcode') > -1 ? 'barcode' : 'name'; + retMsg += ` Duplicate ${identifierType} '${name}' found.`; } else { retMsg += ` Check the existing ${nounPlural || noun || 'data'} for possible duplicates and make sure any referenced ${ nounPlural || noun || 'data'