From c61252661ad7c2beade213c6118e4583cd341649 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Tue, 25 Nov 2025 12:18:47 -0800 Subject: [PATCH 1/8] getUpdatedData: identify columns in use --- packages/components/src/internal/util/utils.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/components/src/internal/util/utils.ts b/packages/components/src/internal/util/utils.ts index b30e0fa5cb..b70f0bd311 100644 --- a/packages/components/src/internal/util/utils.ts +++ b/packages/components/src/internal/util/utils.ts @@ -306,9 +306,10 @@ export function isSameWithStringCompare(value1: any, value2: any): boolean { } /** - * Constructs an array of objects (suitable for the rows parameter of updateRows) where each object contains the - * values that are different from the ones in originalData object as well as the primary key values for that row. - * If updatedValues is empty or all of the originalData values are the same as the updatedValues, returns an empty array. + * Constructs an array of objects, suitable for the "rows" parameter of updateRows, where each object contains the + * values that are different from the ones in the originalData object as well as the primary key values for that row. + * If updatedValues are empty, or all the originalData values are the same as the updatedValues, then it returns an + * empty array. * * @param originalData a map from an id field to a Map from fieldKeys to an object with a 'value' field * @param updatedValues an object mapping fieldKeys to values that are being updated @@ -323,10 +324,11 @@ export function getUpdatedData( ): any[] { const updateValuesMap = Map(updatedValues); const pkColsLc = new Set(); + const pkColsInUse = new Set(); queryInfo.pkCols.forEach(key => pkColsLc.add(key.toLowerCase())); additionalCols?.forEach(col => pkColsLc.add(col.toLowerCase())); - // if the originalData has the container/folder values, keep those as well (i.e. treat it as a primary key) + // if the originalData has the container/folder values, keep those as well (i.e., treat it as a primary key) const folderKey = originalData .first() .keySeq() @@ -353,6 +355,7 @@ export function getUpdatedData( if (fieldValueMap?.has('value')) { if (isPKCol) { + pkColsInUse.add(key.toLowerCase()); return m.set(key, fieldValueMap.get('value')); } @@ -399,7 +402,7 @@ export function getUpdatedData( }); // we want the rows that contain more than just the primaryKeys return updatedData - .filter(rowData => rowData.size > pkColsLc.size) + .filter(rowData => rowData.size > pkColsInUse.size) .map(rowData => rowData.toJS()) .toArray(); } From 1019906dd89477193c6af3e723ba486e5d3d257f Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Tue, 9 Dec 2025 10:03:44 -0800 Subject: [PATCH 2/8] SampleTypePropertiesPanel: fix valid check --- .../domainproperties/samples/SampleTypeDesigner.tsx | 2 +- .../domainproperties/samples/SampleTypePropertiesPanel.tsx | 6 ++++-- .../internal/components/domainproperties/samples/models.ts | 6 +++--- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/components/src/internal/components/domainproperties/samples/SampleTypeDesigner.tsx b/packages/components/src/internal/components/domainproperties/samples/SampleTypeDesigner.tsx index 464a7ee44f..966e8b5b73 100644 --- a/packages/components/src/internal/components/domainproperties/samples/SampleTypeDesigner.tsx +++ b/packages/components/src/internal/components/domainproperties/samples/SampleTypeDesigner.tsx @@ -1,5 +1,5 @@ import React, { FC, memo, ReactNode } from 'react'; -import { List, Map } from 'immutable'; +import { List } from 'immutable'; import { Domain, getServerContext } from '@labkey/api'; import { diff --git a/packages/components/src/internal/components/domainproperties/samples/SampleTypePropertiesPanel.tsx b/packages/components/src/internal/components/domainproperties/samples/SampleTypePropertiesPanel.tsx index 3d9ea635f0..a792a902d4 100644 --- a/packages/components/src/internal/components/domainproperties/samples/SampleTypePropertiesPanel.tsx +++ b/packages/components/src/internal/components/domainproperties/samples/SampleTypePropertiesPanel.tsx @@ -292,10 +292,12 @@ class SampleTypePropertiesPanelImpl extends PureComponent { - const { model, updateModel, metricUnitProps } = this.props; + const { metricUnitProps, model, updateModel } = this.props; const updatedModel = newModel || model; - const isValid = updatedModel?.hasValidProperties() && updatedModel?.isMetricUnitValid(); + const isValid = + updatedModel?.hasValidProperties() && + (!metricUnitProps?.includeMetricUnitProperty || updatedModel?.isMetricUnitValid()); this.setState( () => ({ isValid }), diff --git a/packages/components/src/internal/components/domainproperties/samples/models.ts b/packages/components/src/internal/components/domainproperties/samples/models.ts index cabd917bde..ec8253f6ba 100644 --- a/packages/components/src/internal/components/domainproperties/samples/models.ts +++ b/packages/components/src/internal/components/domainproperties/samples/models.ts @@ -1,4 +1,4 @@ -import { fromJS, Map, OrderedMap, Record } from 'immutable'; +import { OrderedMap, Record } from 'immutable'; import { DomainDesign, DomainDetails, IDomainField } from '../models'; import { IImportAlias, IParentAlias } from '../../entities/models'; @@ -74,7 +74,7 @@ export class SampleTypeModel extends Record({ return !this.rowId; } - isValid(defaultNameFieldConfig?: Partial) { + isValid(defaultNameFieldConfig?: Partial): boolean { return ( this.hasValidProperties() && !this.hasInvalidNameField(defaultNameFieldConfig) && @@ -84,7 +84,7 @@ export class SampleTypeModel extends Record({ ); } - isMetricUnitValid() { + isMetricUnitValid(): boolean { return this.metricUnit != null; } From 37aca81696d4013fe25ebf505456f5827ffdf17e Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Tue, 9 Dec 2025 10:53:47 -0800 Subject: [PATCH 3/8] SampleTypePropertiesPanel: fix check more --- .../samples/SampleTypeDesigner.tsx | 6 +++--- .../samples/SampleTypePropertiesPanel.tsx | 19 ++++++------------- .../domainproperties/samples/models.ts | 8 ++++---- 3 files changed, 13 insertions(+), 20 deletions(-) diff --git a/packages/components/src/internal/components/domainproperties/samples/SampleTypeDesigner.tsx b/packages/components/src/internal/components/domainproperties/samples/SampleTypeDesigner.tsx index 966e8b5b73..efa84cc7bb 100644 --- a/packages/components/src/internal/components/domainproperties/samples/SampleTypeDesigner.tsx +++ b/packages/components/src/internal/components/domainproperties/samples/SampleTypeDesigner.tsx @@ -369,7 +369,7 @@ export class SampleTypeDesignerImpl extends React.PureComponent this.saveDomain(false, comment ?? auditUserComment)); @@ -385,8 +385,8 @@ export class SampleTypeDesignerImpl extends React.PureComponent 0) { exception = 'Duplicate parent alias header found: ' + getDuplicateAlias(model.parentAliases, true).join(', '); - } else if (!model.isMetricUnitValid()) { - exception = metricUnitProps?.metricUnitLabel + ' field is required.'; + } else if (!model.isMetricUnitValid(metricUnitProps)) { + exception = (metricUnitProps?.metricUnitLabel ?? 'Units') + ' field is required.'; } else { exception = model.domain.getFirstFieldError(); } diff --git a/packages/components/src/internal/components/domainproperties/samples/SampleTypePropertiesPanel.tsx b/packages/components/src/internal/components/domainproperties/samples/SampleTypePropertiesPanel.tsx index a792a902d4..d90632fb7b 100644 --- a/packages/components/src/internal/components/domainproperties/samples/SampleTypePropertiesPanel.tsx +++ b/packages/components/src/internal/components/domainproperties/samples/SampleTypePropertiesPanel.tsx @@ -293,21 +293,14 @@ class SampleTypePropertiesPanelImpl extends PureComponent { const { metricUnitProps, model, updateModel } = this.props; + const updatedModel = newModel ?? model; - const updatedModel = newModel || model; - const isValid = - updatedModel?.hasValidProperties() && - (!metricUnitProps?.includeMetricUnitProperty || updatedModel?.isMetricUnitValid()); - - this.setState( - () => ({ isValid }), - () => { - // Issue 39918: only consider the model changed if there is a newModel param - if (newModel) { - updateModel(updatedModel); - } + this.setState({ isValid: updatedModel.isMetricUnitValid(metricUnitProps) }, () => { + // Issue 39918: only consider the model changed if there is a newModel param + if (newModel) { + updateModel(newModel); } - ); + }); }; onFormChange = (evt: any): void => { diff --git a/packages/components/src/internal/components/domainproperties/samples/models.ts b/packages/components/src/internal/components/domainproperties/samples/models.ts index ec8253f6ba..1107160f14 100644 --- a/packages/components/src/internal/components/domainproperties/samples/models.ts +++ b/packages/components/src/internal/components/domainproperties/samples/models.ts @@ -74,18 +74,18 @@ export class SampleTypeModel extends Record({ return !this.rowId; } - isValid(defaultNameFieldConfig?: Partial): boolean { + isValid(defaultNameFieldConfig?: Partial, metricUnitProps?: MetricUnitProps): boolean { return ( this.hasValidProperties() && !this.hasInvalidNameField(defaultNameFieldConfig) && getDuplicateAlias(this.parentAliases, true).size === 0 && !this.domain.hasInvalidFields() && - this.isMetricUnitValid() + this.isMetricUnitValid(metricUnitProps) ); } - isMetricUnitValid(): boolean { - return this.metricUnit != null; + isMetricUnitValid(metricUnitProps?: MetricUnitProps): boolean { + return !metricUnitProps?.includeMetricUnitProperty || this.metricUnit != null; } hasValidProperties(): boolean { From dc2d5044dfbacc4dae4c2702b6ebce1000082447 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Tue, 9 Dec 2025 11:09:56 -0800 Subject: [PATCH 4/8] Test updates --- .../samples/SampleTypeDesigner.test.tsx | 92 ++++++------------- .../samples/SampleTypeDesigner.tsx | 11 ++- 2 files changed, 36 insertions(+), 67 deletions(-) diff --git a/packages/components/src/internal/components/domainproperties/samples/SampleTypeDesigner.test.tsx b/packages/components/src/internal/components/domainproperties/samples/SampleTypeDesigner.test.tsx index ffb35ca3cb..ea0f3ae0c0 100644 --- a/packages/components/src/internal/components/domainproperties/samples/SampleTypeDesigner.test.tsx +++ b/packages/components/src/internal/components/domainproperties/samples/SampleTypeDesigner.test.tsx @@ -5,8 +5,6 @@ import { userEvent } from '@testing-library/user-event'; import { waitFor } from '@testing-library/dom'; -import { PROPERTIES_PANEL_ERROR_MSG } from '../constants'; - import { DomainDetails } from '../models'; import { getTestAPIWrapper } from '../../../APIWrapper'; @@ -17,7 +15,8 @@ import { renderWithAppContext } from '../../../test/reactTestLibraryHelpers'; import { TEST_LKS_STARTER_MODULE_CONTEXT } from '../../../productFixtures'; -import { SampleTypeDesigner, SampleTypeDesignerImpl } from './SampleTypeDesigner'; +import { SampleTypeDesigner, SampleTypeDesignerImpl, SampleTypeDesignerProps } from './SampleTypeDesigner'; +import { getQueryTestAPIWrapper } from '../../../query/APIWrapper'; const SERVER_CONTEXT = { moduleContext: { @@ -57,65 +56,46 @@ const PARENT_OPTIONS = [ }, ]; -const BASE_PROPS = { - appPropertiesOnly: true, - onComplete: jest.fn(), - onCancel: jest.fn(), +const BASE_PROPS: SampleTypeDesignerProps = { api: getTestAPIWrapper(jest.fn, { entity: getEntityTestAPIWrapper(jest.fn, { initParentOptionsSelects: jest.fn().mockResolvedValue({ parentOptions: PARENT_OPTIONS, parentAliases: Map(), }), + loadNameExpressionOptions: jest.fn().mockResolvedValue({}), + }), + query: getQueryTestAPIWrapper(jest.fn, { + selectRows: jest.fn().mockResolvedValue({ rows: [] }), }), }), + appPropertiesOnly: true, + currentPanelIndex: 0, + firstState: true, + onComplete: jest.fn(), + onCancel: jest.fn(), + onFinish: jest.fn(), + onTogglePanel: jest.fn(), + setSubmitting: jest.fn(), + submitting: false, + validatePanel: 0, + visitedPanels: List(), }; describe('SampleTypeDesigner', () => { test('default properties', async () => { - const form = ( - - ); - - renderWithAppContext(form, { - serverContext: SERVER_CONTEXT, - }); + renderWithAppContext(, { serverContext: SERVER_CONTEXT }); await waitFor(() => { expect(document.getElementsByClassName('domain-form-panel')).toHaveLength(2); }); const panelTitles = document.querySelectorAll('.domain-panel-title'); - expect(panelTitles[0].textContent).toBe('Sample Type Properties'); - expect(panelTitles[1].textContent).toBe('Fields'); + expect(panelTitles[0]).toHaveTextContent('Sample Type Properties'); + expect(panelTitles[1]).toHaveTextContent('Fields'); }); test('allowFolderExclusion', async () => { - const form = ( - - ); - - renderWithAppContext(form, { + renderWithAppContext(, { serverContext: SERVER_CONTEXT, }); @@ -123,9 +103,9 @@ describe('SampleTypeDesigner', () => { expect(document.getElementsByClassName('domain-form-panel')).toHaveLength(3); }); const panelTitles = document.querySelectorAll('.domain-panel-title'); - expect(panelTitles[0].textContent).toBe('Sample Type Properties'); - expect(panelTitles[1].textContent).toBe('Fields'); - expect(panelTitles[2].textContent).toBe('Folders'); + expect(panelTitles[0]).toHaveTextContent('Sample Type Properties'); + expect(panelTitles[1]).toHaveTextContent('Fields'); + expect(panelTitles[2]).toHaveTextContent('Folders'); }); test('initModel with name URL props', async () => { @@ -146,26 +126,16 @@ describe('SampleTypeDesigner', () => { nameReadOnly: true, }) )} - currentPanelIndex={0} - firstState={true} - onFinish={jest.fn()} - onTogglePanel={jest.fn()} - setSubmitting={jest.fn()} - submitting={false} - validatePanel={0} - visitedPanels={List()} /> ); - renderWithAppContext(form, { - serverContext: SERVER_CONTEXT, - }); + renderWithAppContext(form, { serverContext: SERVER_CONTEXT }); await waitFor(() => { expect(document.querySelectorAll('.domain-form-panel')).toHaveLength(2); }); const panelTitles = document.querySelectorAll('.domain-panel-title'); - expect(panelTitles[0].textContent).toBe('Sample Type Properties'); - expect(panelTitles[1].textContent).toBe('Fields'); + expect(panelTitles[0]).toHaveTextContent('Sample Type Properties'); + expect(panelTitles[1]).toHaveTextContent('Fields'); expect(document.getElementsByClassName('translator--toggle__wizard')).toHaveLength(1); }); @@ -185,10 +155,6 @@ describe('SampleTypeDesigner', () => { const panelHeader = document.querySelector('div#domain-header'); await userEvent.click(panelHeader); const alerts = document.getElementsByClassName('alert'); - // still expect to have only two alerts. We don't show the Barcode header in the file import panel. - // Jest doesn't want to switch to that panel. - expect(alerts).toHaveLength(2); - expect(alerts[0].textContent).toEqual(PROPERTIES_PANEL_ERROR_MSG); - expect(alerts[1].textContent).toEqual('Please correct errors in the properties panel before saving.'); + expect(alerts).toHaveLength(0); }); }); diff --git a/packages/components/src/internal/components/domainproperties/samples/SampleTypeDesigner.tsx b/packages/components/src/internal/components/domainproperties/samples/SampleTypeDesigner.tsx index efa84cc7bb..1fa60693d0 100644 --- a/packages/components/src/internal/components/domainproperties/samples/SampleTypeDesigner.tsx +++ b/packages/components/src/internal/components/domainproperties/samples/SampleTypeDesigner.tsx @@ -90,7 +90,7 @@ const AliquotOptionsHelp: FC<{ helpTopic: string }> = memo(({ helpTopic }) => { }); AliquotOptionsHelp.displayName = 'AliquotOptionsHelp'; -interface Props { +interface OwnProps { aliquotNamePatternProps?: AliquotNamePatternProps; allowFolderExclusion?: boolean; api?: ComponentsAPIWrapper; @@ -137,8 +137,11 @@ interface State { showUniqueIdConfirmation: boolean; uniqueIdsConfirmed: boolean; } + // Exported for testing -export class SampleTypeDesignerImpl extends React.PureComponent { +export type SampleTypeDesignerProps = InjectedBaseDomainDesignerProps & OwnProps; + +export class SampleTypeDesignerImpl extends React.PureComponent { static defaultProps = { api: getDefaultAPIWrapper(), defaultSampleFieldConfig: DEFAULT_SAMPLE_FIELD_CONFIG, @@ -156,7 +159,7 @@ export class SampleTypeDesignerImpl extends React.PureComponent(SampleTypeDesignerImpl); +export const SampleTypeDesigner = withBaseDomainDesigner(SampleTypeDesignerImpl); From 1f4a7f7306b13df0ad13e8c0783c1a267c5c8308 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Tue, 9 Dec 2025 22:00:12 -0800 Subject: [PATCH 5/8] Retain hasValidProperties check --- .../samples/SampleTypeDesigner.test.tsx | 33 ++++++++++++++----- .../samples/SampleTypeDesigner.tsx | 12 ++++--- .../samples/SampleTypePropertiesPanel.tsx | 3 +- 3 files changed, 33 insertions(+), 15 deletions(-) diff --git a/packages/components/src/internal/components/domainproperties/samples/SampleTypeDesigner.test.tsx b/packages/components/src/internal/components/domainproperties/samples/SampleTypeDesigner.test.tsx index ea0f3ae0c0..a281da1a7c 100644 --- a/packages/components/src/internal/components/domainproperties/samples/SampleTypeDesigner.test.tsx +++ b/packages/components/src/internal/components/domainproperties/samples/SampleTypeDesigner.test.tsx @@ -5,6 +5,8 @@ import { userEvent } from '@testing-library/user-event'; import { waitFor } from '@testing-library/dom'; +import { PROPERTIES_PANEL_ERROR_MSG } from '../constants'; + import { DomainDetails } from '../models'; import { getTestAPIWrapper } from '../../../APIWrapper'; @@ -15,7 +17,12 @@ import { renderWithAppContext } from '../../../test/reactTestLibraryHelpers'; import { TEST_LKS_STARTER_MODULE_CONTEXT } from '../../../productFixtures'; -import { SampleTypeDesigner, SampleTypeDesignerImpl, SampleTypeDesignerProps } from './SampleTypeDesigner'; +import { + SampleTypeDesigner, + SampleTypeDesignerImpl, + SampleTypeDesignerImplProps, + SampleTypeDesignerProps, +} from './SampleTypeDesigner'; import { getQueryTestAPIWrapper } from '../../../query/APIWrapper'; const SERVER_CONTEXT = { @@ -56,7 +63,7 @@ const PARENT_OPTIONS = [ }, ]; -const BASE_PROPS: SampleTypeDesignerProps = { +const DESIGNER_PROPS: SampleTypeDesignerProps = { api: getTestAPIWrapper(jest.fn, { entity: getEntityTestAPIWrapper(jest.fn, { initParentOptionsSelects: jest.fn().mockResolvedValue({ @@ -70,21 +77,25 @@ const BASE_PROPS: SampleTypeDesignerProps = { }), }), appPropertiesOnly: true, + onCancel: jest.fn(), + onComplete: jest.fn(), +}; + +const DESIGNER_IMPL_PROPS: SampleTypeDesignerImplProps = { currentPanelIndex: 0, firstState: true, - onComplete: jest.fn(), - onCancel: jest.fn(), onFinish: jest.fn(), onTogglePanel: jest.fn(), setSubmitting: jest.fn(), submitting: false, validatePanel: 0, visitedPanels: List(), + ...DESIGNER_PROPS, }; describe('SampleTypeDesigner', () => { test('default properties', async () => { - renderWithAppContext(, { serverContext: SERVER_CONTEXT }); + renderWithAppContext(, { serverContext: SERVER_CONTEXT }); await waitFor(() => { expect(document.getElementsByClassName('domain-form-panel')).toHaveLength(2); @@ -95,7 +106,7 @@ describe('SampleTypeDesigner', () => { }); test('allowFolderExclusion', async () => { - renderWithAppContext(, { + renderWithAppContext(, { serverContext: SERVER_CONTEXT, }); @@ -111,7 +122,7 @@ describe('SampleTypeDesigner', () => { test('initModel with name URL props', async () => { const form = ( { }); test('open fields panel, with barcodes', async () => { - renderWithAppContext(, { + // NOTE: Here we are calling the full designer, SampleTypeDesigner, not the SampleTypeDesignerImpl + renderWithAppContext(, { serverContext: { moduleContext: { ...TEST_LKS_STARTER_MODULE_CONTEXT, @@ -155,6 +167,9 @@ describe('SampleTypeDesigner', () => { const panelHeader = document.querySelector('div#domain-header'); await userEvent.click(panelHeader); const alerts = document.getElementsByClassName('alert'); - expect(alerts).toHaveLength(0); + // still expect to have only two alerts. We don't show the Barcode header in the file import panel. + // Jest doesn't want to switch to that panel. + expect(alerts[0]).toHaveTextContent(PROPERTIES_PANEL_ERROR_MSG); + expect(alerts[1]).toHaveTextContent('Please correct errors in the properties panel before saving.'); }); }); diff --git a/packages/components/src/internal/components/domainproperties/samples/SampleTypeDesigner.tsx b/packages/components/src/internal/components/domainproperties/samples/SampleTypeDesigner.tsx index 1fa60693d0..eb3544cf58 100644 --- a/packages/components/src/internal/components/domainproperties/samples/SampleTypeDesigner.tsx +++ b/packages/components/src/internal/components/domainproperties/samples/SampleTypeDesigner.tsx @@ -90,7 +90,8 @@ const AliquotOptionsHelp: FC<{ helpTopic: string }> = memo(({ helpTopic }) => { }); AliquotOptionsHelp.displayName = 'AliquotOptionsHelp'; -interface OwnProps { +// Exported for testing +export interface SampleTypeDesignerProps { aliquotNamePatternProps?: AliquotNamePatternProps; allowFolderExclusion?: boolean; api?: ComponentsAPIWrapper; @@ -139,9 +140,10 @@ interface State { } // Exported for testing -export type SampleTypeDesignerProps = InjectedBaseDomainDesignerProps & OwnProps; +export type SampleTypeDesignerImplProps = InjectedBaseDomainDesignerProps & SampleTypeDesignerProps; -export class SampleTypeDesignerImpl extends React.PureComponent { +// Exported for testing +export class SampleTypeDesignerImpl extends React.PureComponent { static defaultProps = { api: getDefaultAPIWrapper(), defaultSampleFieldConfig: DEFAULT_SAMPLE_FIELD_CONFIG, @@ -159,7 +161,7 @@ export class SampleTypeDesignerImpl extends React.PureComponent(SampleTypeDesignerImpl); +export const SampleTypeDesigner = withBaseDomainDesigner(SampleTypeDesignerImpl); diff --git a/packages/components/src/internal/components/domainproperties/samples/SampleTypePropertiesPanel.tsx b/packages/components/src/internal/components/domainproperties/samples/SampleTypePropertiesPanel.tsx index d90632fb7b..8e8ef2ed02 100644 --- a/packages/components/src/internal/components/domainproperties/samples/SampleTypePropertiesPanel.tsx +++ b/packages/components/src/internal/components/domainproperties/samples/SampleTypePropertiesPanel.tsx @@ -294,8 +294,9 @@ class SampleTypePropertiesPanelImpl extends PureComponent { const { metricUnitProps, model, updateModel } = this.props; const updatedModel = newModel ?? model; + const isValid = updatedModel.hasValidProperties() && updatedModel.isMetricUnitValid(metricUnitProps); - this.setState({ isValid: updatedModel.isMetricUnitValid(metricUnitProps) }, () => { + this.setState({ isValid }, () => { // Issue 39918: only consider the model changed if there is a newModel param if (newModel) { updateModel(newModel); From 5ab694b4184e4bc955178370b615e3d29c13e0b2 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Wed, 10 Dec 2025 13:49:51 -0800 Subject: [PATCH 6/8] 7.3.1-fb-remove-sample-lsid.0 --- 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 60a2646b52..2fc395bc8b 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "7.3.0", + "version": "7.3.1-fb-remove-sample-lsid.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "7.3.0", + "version": "7.3.1-fb-remove-sample-lsid.0", "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 b5e284d630..0ca2e05f22 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "7.3.0", + "version": "7.3.1-fb-remove-sample-lsid.0", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ From af9e0d0c3ed541c54e8011b764e74bb585c3cb97 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Sat, 13 Dec 2025 10:40:56 -0800 Subject: [PATCH 7/8] Prepare release notes --- packages/components/releaseNotes/components.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/components/releaseNotes/components.md b/packages/components/releaseNotes/components.md index ece69808c2..eebfc5ab91 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 7.3.1 +*Released*: 13 December 2025 +- Remove LSID column from provisioned sample tables +- Update `getUpdatedData()` utility method to only check for primary keys actually used in data iteration. + ### version 7.3.0 *Released*: 10 December 2025 - CharBuilderModal: add UI for legend position From 9a108407abfccb871a29552d5f21ecfb0f2b3bd1 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Sat, 13 Dec 2025 10:41:32 -0800 Subject: [PATCH 8/8] v7.3.1 --- 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 2fc395bc8b..442dd5c57b 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "7.3.1-fb-remove-sample-lsid.0", + "version": "7.3.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "7.3.1-fb-remove-sample-lsid.0", + "version": "7.3.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 0ca2e05f22..94c8910ad6 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "7.3.1-fb-remove-sample-lsid.0", + "version": "7.3.1", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [