From edee7d63682405c94b0bbe065aaff8ccc2fb6070 Mon Sep 17 00:00:00 2001 From: XingY Date: Wed, 4 Mar 2026 14:15:12 -0800 Subject: [PATCH 1/2] GitHub Issue 897: Study dataset should not allow multivalue text choice as a third key --- packages/components/package-lock.json | 4 ++-- packages/components/package.json | 2 +- packages/components/releaseNotes/components.md | 4 ++++ .../internal/components/domainproperties/dataset/actions.ts | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index abf3ee1b12..b5d61e3229 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "7.21.0", + "version": "7.22.0-fb-mvtcMVFK.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "7.21.0", + "version": "7.22.0-fb-mvtcMVFK.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 ea78fad86f..24859034f0 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "7.21.0", + "version": "7.22.0-fb-mvtcMVFK.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 d1a361d5e3..5c86cd6624 100644 --- a/packages/components/releaseNotes/components.md +++ b/packages/components/releaseNotes/components.md @@ -1,6 +1,10 @@ # @labkey/components Components, models, actions, and utility functions for LabKey applications and pages +### version 7.X +*Released*: X March 2026 +- GitHub Issue 897: Study dataset should not allow multivalue text choice as a third key + ### version 7.21.0 *Released*: 26 February 2026 - Package updates diff --git a/packages/components/src/internal/components/domainproperties/dataset/actions.ts b/packages/components/src/internal/components/domainproperties/dataset/actions.ts index e3cf75bc53..3be2a239ac 100644 --- a/packages/components/src/internal/components/domainproperties/dataset/actions.ts +++ b/packages/components/src/internal/components/domainproperties/dataset/actions.ts @@ -79,7 +79,7 @@ export function getAdditionalKeyFields(domain: DomainDesign, timepointType: stri } domain.fields - .filter(field => !field.isCalculatedField()) + .filter(field => !field.isCalculatedField() && !field.isMultiChoiceField()) .map(field => { additionalKeyFields = additionalKeyFields.push({ value: field.name, label: field.name }); }); From a0f4fc62ef9c42e01590861f53bd28dc9c650495 Mon Sep 17 00:00:00 2001 From: XingY Date: Fri, 6 Mar 2026 15:58:57 -0800 Subject: [PATCH 2/2] publish --- packages/components/package-lock.json | 4 +- packages/components/package.json | 2 +- .../components/releaseNotes/components.md | 4 +- .../domainproperties/dataset/actions.test.ts | 90 +++++++++++++++++++ 4 files changed, 95 insertions(+), 5 deletions(-) create mode 100644 packages/components/src/internal/components/domainproperties/dataset/actions.test.ts diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index 6da289d74c..8805e991b3 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "7.22.0", + "version": "7.22.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "7.22.0", + "version": "7.22.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 13d80e8d64..798b1f5ffd 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "7.22.1-fb-mvtcMVFK.1", + "version": "7.22.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 3d7d8c086a..b9f4543463 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 7.X -*Released*: X March 2026 +### version 7.22.1 +*Released*: 6 March 2026 - GitHub Issue 897: Study dataset should not allow multivalue text choice as a third key ### version 7.22.0 diff --git a/packages/components/src/internal/components/domainproperties/dataset/actions.test.ts b/packages/components/src/internal/components/domainproperties/dataset/actions.test.ts new file mode 100644 index 0000000000..c7d10e3c66 --- /dev/null +++ b/packages/components/src/internal/components/domainproperties/dataset/actions.test.ts @@ -0,0 +1,90 @@ +import { DomainDesign } from '../models'; +import { CALCULATED_CONCEPT_URI, MULTI_CHOICE_RANGE_URI } from '../constants'; + +import { TIME_KEY_FIELD_DISPLAY, TIME_KEY_FIELD_KEY, VISIT_TIMEPOINT_TYPE } from './constants'; +import { getAdditionalKeyFields } from './actions'; + +describe('getAdditionalKeyFields', () => { + test('includes time key field for date-based study', () => { + const domain = DomainDesign.create({}); + const result = getAdditionalKeyFields(domain, 'DATE'); + + expect(result.size).toBe(1); + expect(result.get(0)).toEqual({ value: TIME_KEY_FIELD_KEY, label: TIME_KEY_FIELD_DISPLAY }); + }); + + test('excludes time key field for visit-based study', () => { + const domain = DomainDesign.create({}); + const result = getAdditionalKeyFields(domain, VISIT_TIMEPOINT_TYPE); + + expect(result.size).toBe(0); + }); + + test('includes regular fields', () => { + const domain = DomainDesign.create({ + fields: [ + { name: 'Field1', rangeURI: 'int' }, + { name: 'Field2', rangeURI: 'string' }, + ], + }); + const result = getAdditionalKeyFields(domain, VISIT_TIMEPOINT_TYPE); + + expect(result.size).toBe(2); + expect(result.get(0)).toEqual({ value: 'Field1', label: 'Field1' }); + expect(result.get(1)).toEqual({ value: 'Field2', label: 'Field2' }); + }); + + test('excludes calculated fields', () => { + const domain = DomainDesign.create({ + fields: [ + { name: 'Regular', rangeURI: 'int' }, + { name: 'Calculated', rangeURI: 'int', conceptURI: CALCULATED_CONCEPT_URI }, + ], + }); + const result = getAdditionalKeyFields(domain, VISIT_TIMEPOINT_TYPE); + + expect(result.size).toBe(1); + expect(result.get(0)).toEqual({ value: 'Regular', label: 'Regular' }); + }); + + test('excludes multi-choice fields', () => { + const domain = DomainDesign.create({ + fields: [ + { name: 'Regular', rangeURI: 'int' }, + { name: 'MultiChoice', rangeURI: MULTI_CHOICE_RANGE_URI }, + ], + }); + const result = getAdditionalKeyFields(domain, VISIT_TIMEPOINT_TYPE); + + expect(result.size).toBe(1); + expect(result.get(0)).toEqual({ value: 'Regular', label: 'Regular' }); + }); + + test('includes time key field before domain fields for non-visit study', () => { + const domain = DomainDesign.create({ + fields: [{ name: 'Field1', rangeURI: 'int' }], + }); + const result = getAdditionalKeyFields(domain, 'Timepoints'); + + expect(result.size).toBe(2); + expect(result.get(0)).toEqual({ value: TIME_KEY_FIELD_KEY, label: TIME_KEY_FIELD_DISPLAY }); + expect(result.get(1)).toEqual({ value: 'Field1', label: 'Field1' }); + }); + + test('filters out both calculated and multi-choice fields while keeping regular fields', () => { + const domain = DomainDesign.create({ + fields: [ + { name: 'Regular1', rangeURI: 'int' }, + { name: 'Calculated', rangeURI: 'int', conceptURI: CALCULATED_CONCEPT_URI }, + { name: 'Regular2', rangeURI: 'string' }, + { name: 'MultiChoice', rangeURI: MULTI_CHOICE_RANGE_URI }, + ], + }); + const result = getAdditionalKeyFields(domain, 'Timepoints'); + + expect(result.size).toBe(3); + expect(result.get(0)).toEqual({ value: TIME_KEY_FIELD_KEY, label: TIME_KEY_FIELD_DISPLAY }); + expect(result.get(1)).toEqual({ value: 'Regular1', label: 'Regular1' }); + expect(result.get(2)).toEqual({ value: 'Regular2', label: 'Regular2' }); + }); +});