From 67777856995b0b043d20ee2a0c043f4ef087470f Mon Sep 17 00:00:00 2001 From: cnathe Date: Thu, 6 Nov 2025 14:00:56 -0600 Subject: [PATCH 01/17] ChartBuilderModal update to include trendline option for provided parameters --- .../components/releaseNotes/components.md | 5 + .../components/chart/ChartBuilderModal.tsx | 10 ++ .../components/chart/ChartFieldOption.tsx | 27 +--- .../components/chart/TrendlineOption.tsx | 135 ++++++++++++------ .../src/internal/components/chart/utils.ts | 28 ++++ 5 files changed, 134 insertions(+), 71 deletions(-) diff --git a/packages/components/releaseNotes/components.md b/packages/components/releaseNotes/components.md index 863905d206..0cf39a15e9 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 TBD +*Released*: TBD +- Line chart trendline options for provided parameters to CalculateCurveFit API + - ChartBuilderModal update to include trendline option for provided parameters + ### version 6.70.1 *Released*: 6 November 2025 - use export-tools to remove unused package exports diff --git a/packages/components/src/internal/components/chart/ChartBuilderModal.tsx b/packages/components/src/internal/components/chart/ChartBuilderModal.tsx index d39e674ae5..2aa5edb1a0 100644 --- a/packages/components/src/internal/components/chart/ChartBuilderModal.tsx +++ b/packages/components/src/internal/components/chart/ChartBuilderModal.tsx @@ -74,6 +74,7 @@ export const getChartBuilderQueryConfig = ( viewName: savedConfig?.viewName || viewName, columns: Object.values(fieldValues) .filter(field => field?.value && typeof field.value === 'string') // just those fields with values + .filter(field => !field.equation) // exclude the trendlineType .map(field => field.data?.fieldKey ?? field.value), // Issue 52050: use fieldKey for special characters sort: LABKEY_VIS.GenericChartHelper.getQueryConfigSortKey(chartConfig.measures), filterArray: savedConfig?.filterArray ?? [], @@ -140,6 +141,7 @@ export const getChartBuilderChartConfig = ( trendlineType: undefined, trendlineAsymptoteMin: undefined, trendlineAsymptoteMax: undefined, + trendlineParameters: undefined, ...savedConfig?.geomOptions, }, } as ChartConfig; @@ -186,6 +188,7 @@ export const getChartBuilderChartConfig = ( config.geomOptions.trendlineType = type === '' ? undefined : type; config.geomOptions.trendlineAsymptoteMin = fieldValues.trendlineAsymptoteMin?.value; config.geomOptions.trendlineAsymptoteMax = fieldValues.trendlineAsymptoteMax?.value; + config.geomOptions.trendlineParameters = fieldValues.trendlineParameters?.value; } if ( @@ -377,8 +380,10 @@ const ChartTypeQueryForm: FC = memo(props => { {hasTrendlineOption && ( )} @@ -673,6 +678,11 @@ export const ChartBuilderModal: FC = memo(({ actions, mo value: chartConfig.geomOptions.trendlineAsymptoteMax, }; } + if (chartConfig.geomOptions.trendlineParameters) { + fieldValues_['trendlineParameters'] = { + value: chartConfig.geomOptions.trendlineParameters, + }; + } } return fieldValues_; diff --git a/packages/components/src/internal/components/chart/ChartFieldOption.tsx b/packages/components/src/internal/components/chart/ChartFieldOption.tsx index cc716ee5a6..26e01eda9b 100644 --- a/packages/components/src/internal/components/chart/ChartFieldOption.tsx +++ b/packages/components/src/internal/components/chart/ChartFieldOption.tsx @@ -5,37 +5,12 @@ import { SelectInput, SelectInputOption } from '../forms/input/SelectInput'; import { QueryModel } from '../../../public/QueryModel/QueryModel'; import { LABKEY_VIS } from '../../constants'; -import { naturalSortByProperty } from '../../../public/sort'; import { ChartFieldRangeScaleOptions } from './ChartFieldRangeScaleOptions'; import { ChartFieldInfo, ChartTypeInfo, ScaleType } from './models'; -import { getFieldDataType, shouldShowAggregateOptions, shouldShowRangeScaleOptions } from './utils'; +import { getFieldDataType, getSelectOptions, shouldShowAggregateOptions, shouldShowRangeScaleOptions } from './utils'; import { ChartFieldAggregateOptions } from './ChartFieldAggregateOptions'; -export const getSelectOptions = ( - model: QueryModel, - chartType: ChartTypeInfo, - field: ChartFieldInfo -): SelectInputOption[] => { - const allowableTypes = LABKEY_VIS.GenericChartHelper.getAllowableTypes(field); - - return model.queryInfo - .getDisplayColumns(model.viewName) - .filter(col => { - const colType = getFieldDataType(col); - const hasMatchingType = allowableTypes.indexOf(colType) > -1; - const isMeasureDimensionMatch = LABKEY_VIS.GenericChartHelper.isMeasureDimensionMatch( - chartType.name, - field, - col.measure, - col.dimension - ); - return hasMatchingType || isMeasureDimensionMatch; - }) - .sort(naturalSortByProperty('caption')) - .map(col => ({ label: col.caption, value: col.fieldKey, data: col })); -}; - const DEFAULT_SCALE_VALUES = { type: 'automatic', trans: 'linear' }; interface OwnProps { diff --git a/packages/components/src/internal/components/chart/TrendlineOption.tsx b/packages/components/src/internal/components/chart/TrendlineOption.tsx index 045c402a51..505f036ce1 100644 --- a/packages/components/src/internal/components/chart/TrendlineOption.tsx +++ b/packages/components/src/internal/components/chart/TrendlineOption.tsx @@ -10,8 +10,9 @@ import { OverlayTrigger } from '../../OverlayTrigger'; import { Popover } from '../../Popover'; import { RadioGroupInput, RadioGroupOption } from '../forms/input/RadioGroupInput'; -import { TrendlineType } from './models'; -import { getFieldDataType } from './utils'; +import { ChartFieldInfo, ChartTypeInfo, TrendlineType } from './models'; +import { getFieldDataType, getSelectOptions } from './utils'; +import { QueryModel } from '../../../public/QueryModel/QueryModel'; const ASYMPTOTE_TYPES = [ { value: 'automatic', label: 'Automatic' }, @@ -20,14 +21,17 @@ const ASYMPTOTE_TYPES = [ interface TrendlineOptionProps { fieldValues: Record; + model: QueryModel; onFieldChange: (key: string, value: SelectInputOption) => void; schemaQuery: SchemaQuery; + selectedType: ChartTypeInfo; } export const TrendlineOption: FC = memo(props => { const TRENDLINE_OPTIONS: TrendlineType[] = Object.values(LABKEY_VIS.GenericChartHelper.TRENDLINE_OPTIONS); - const { fieldValues, onFieldChange, schemaQuery } = props; - const showFieldOptions = fieldValues.trendlineType?.showMin || fieldValues.trendlineType?.showMax; + const { fieldValues, onFieldChange, schemaQuery, model, selectedType } = props; + const showFieldOptions = fieldValues.trendlineType && fieldValues.trendlineType.value !== ''; + const showAsymptoteOptions = fieldValues.trendlineType?.showMin || fieldValues.trendlineType?.showMax; // hide the trendline option if no x-axis value selected and for date field selection on x-axis const hidden = useMemo(() => { @@ -35,6 +39,30 @@ export const TrendlineOption: FC = memo(props => { return !fieldValues.x?.value || jsonType === 'date' || jsonType === 'time'; }, [fieldValues.x]); + const options = useMemo(() => { + const field = { + name: 'parameters', + textOnly: true, + label: 'Provided Parameters', + required: false, + } as ChartFieldInfo; + return getSelectOptions(model, selectedType, field); + }, [model, selectedType]); + // Issue 52050: use fieldKey for special characters + const parameterInputValue = useMemo(() => { + if (fieldValues?.trendlineParameters) { + return fieldValues.trendlineParameters.data?.fieldKey ?? fieldValues.trendlineParameters.value; + } + return undefined; + }, [fieldValues]); + + const onParameterFieldChange = useCallback( + (name: string, _: string, selectedOption: SelectInputOption) => { + onFieldChange(name, selectedOption); + }, + [onFieldChange] + ); + const [loadingTrendlineOptions, setLoadingTrendlineOptions] = useState(true); const [asymptoteType, setAsymptoteType] = useState('automatic'); const [asymptoteMin, setAsymptoteMin] = useState(''); @@ -129,64 +157,81 @@ export const TrendlineOption: FC = memo(props => {
{showFieldOptions && (
-
- - -
- {asymptoteType === 'manual' && ( -
- {fieldValues.trendlineType?.showMin && ( - - )} - {fieldValues.trendlineType?.showMin && - fieldValues.trendlineType?.showMax && -} - {fieldValues.trendlineType?.showMax && ( - +
+ + +
+ {asymptoteType === 'manual' && ( +
+ {fieldValues.trendlineType?.showMin && ( + + )} + {fieldValues.trendlineType?.showMin && + fieldValues.trendlineType?.showMax && -} + {fieldValues.trendlineType?.showMax && ( + + )} + {invalidRange && ( +
Invalid range (Max <= Min)
+ )} +
)} - {invalidRange && ( -
Invalid range (Max <= Min)
- )} -
+ )} +
+ + +
} + triggerType="click" >
diff --git a/packages/components/src/internal/components/chart/utils.ts b/packages/components/src/internal/components/chart/utils.ts index 14baf1acf0..0da1bc3662 100644 --- a/packages/components/src/internal/components/chart/utils.ts +++ b/packages/components/src/internal/components/chart/utils.ts @@ -1,5 +1,9 @@ import { Map } from 'immutable'; import { ChartFieldInfo, ChartTypeInfo } from './models'; +import { QueryModel } from '../../../public/QueryModel/QueryModel'; +import { SelectInputOption } from '../forms/input/SelectInput'; +import { naturalSortByProperty } from '../../../public/sort'; +import { LABKEY_VIS } from '../../constants'; export interface HorizontalBarData { backgroundColor?: string; @@ -91,3 +95,27 @@ export const shouldShowAggregateOptions = (field: ChartFieldInfo, selectedType: const isLine = selectedType.name === 'line_plot'; return field.name === 'y' && (isBar || isLine); }; + +export const getSelectOptions = ( + model: QueryModel, + chartType: ChartTypeInfo, + field: ChartFieldInfo +): SelectInputOption[] => { + const allowableTypes = LABKEY_VIS.GenericChartHelper.getAllowableTypes(field); + + return model.queryInfo + .getDisplayColumns(model.viewName) + .filter(col => { + const colType = getFieldDataType(col); + const hasMatchingType = allowableTypes.indexOf(colType) > -1; + const isMeasureDimensionMatch = LABKEY_VIS.GenericChartHelper.isMeasureDimensionMatch( + chartType.name, + field, + col.measure, + col.dimension + ); + return hasMatchingType || isMeasureDimensionMatch; + }) + .sort(naturalSortByProperty('caption')) + .map(col => ({ label: col.caption, value: col.fieldKey, data: col })); +}; From 6ffe1b4d489925b0910f65630358aed7f2ca0f56 Mon Sep 17 00:00:00 2001 From: cnathe Date: Thu, 6 Nov 2025 14:01:37 -0600 Subject: [PATCH 02/17] Include new 5 Parameter nonlinear curve fit option in trendline select --- packages/components/releaseNotes/components.md | 1 + .../src/internal/components/chart/CurveFitStatsGrid.tsx | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/components/releaseNotes/components.md b/packages/components/releaseNotes/components.md index 0cf39a15e9..276bf35b3c 100644 --- a/packages/components/releaseNotes/components.md +++ b/packages/components/releaseNotes/components.md @@ -5,6 +5,7 @@ Components, models, actions, and utility functions for LabKey applications and p *Released*: TBD - Line chart trendline options for provided parameters to CalculateCurveFit API - ChartBuilderModal update to include trendline option for provided parameters + - Include new 5 Parameter nonlinear curve fit option in trendline select ### version 6.70.1 *Released*: 6 November 2025 diff --git a/packages/components/src/internal/components/chart/CurveFitStatsGrid.tsx b/packages/components/src/internal/components/chart/CurveFitStatsGrid.tsx index a8a6583519..e164b0bf71 100644 --- a/packages/components/src/internal/components/chart/CurveFitStatsGrid.tsx +++ b/packages/components/src/internal/components/chart/CurveFitStatsGrid.tsx @@ -102,7 +102,7 @@ interface NonlinearCurveFitData { } interface NonlinearCurveFit extends CurveFit, NonlinearCurveFitData { - type: '3 Parameter' | '4 Parameter' | 'Five Parameter' | 'Four Parameter' | 'Three Parameter'; + type: '3 Parameter' | '4 Parameter' | '5 Parameter' | 'Five Parameter' | 'Four Parameter' | 'Three Parameter'; } interface CurveFitData { @@ -138,7 +138,7 @@ type PossibleTrendlines = | Trendline | Trendline; -const nonLinearTrendlineTypes = ['3 Parameter', '4 Parameter', 'Five Parameter', 'Four Parameter', 'Three Parameter']; +const nonLinearTrendlineTypes = ['3 Parameter', '4 Parameter', '5 Parameter', 'Five Parameter', 'Four Parameter', 'Three Parameter']; function isNonlinearTrendline( trendline: PossibleTrendlines ): trendline is Trendline { From 8a82027a76bdea1d6aea02963821510a6d0df8d4 Mon Sep 17 00:00:00 2001 From: cnathe Date: Thu, 6 Nov 2025 14:02:08 -0600 Subject: [PATCH 03/17] 6.70.1-trendlineProvidedParams.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 65d5f3e458..068a11957c 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "6.70.1", + "version": "6.70.1-trendlineProvidedParams.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.70.1", + "version": "6.70.1-trendlineProvidedParams.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 3ef32062e1..468d2f9dc6 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.70.1", + "version": "6.70.1-trendlineProvidedParams.0", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ From 096757c9bd5b81f17e1b4a2c62146698cf2adad1 Mon Sep 17 00:00:00 2001 From: cnathe Date: Thu, 6 Nov 2025 14:13:22 -0600 Subject: [PATCH 04/17] jest test updates --- .../chart/ChartFieldOption.test.tsx | 39 +++++------- .../components/chart/TrendlineOption.test.tsx | 46 ++++++++++++++ .../internal/components/chart/utils.test.ts | 60 ++++++++++++++++++- 3 files changed, 120 insertions(+), 25 deletions(-) diff --git a/packages/components/src/internal/components/chart/ChartFieldOption.test.tsx b/packages/components/src/internal/components/chart/ChartFieldOption.test.tsx index 7cc9917dd7..1094662ddf 100644 --- a/packages/components/src/internal/components/chart/ChartFieldOption.test.tsx +++ b/packages/components/src/internal/components/chart/ChartFieldOption.test.tsx @@ -13,12 +13,13 @@ import { SchemaQuery } from '../../../public/SchemaQuery'; import { QueryInfo } from '../../../public/QueryInfo'; import { ViewInfo } from '../../ViewInfo'; -import { ChartFieldOption, getSelectOptions } from './ChartFieldOption'; -import { ChartFieldInfo, ChartTypeInfo } from './models'; +import { ChartFieldOption } from './ChartFieldOption'; +import {ChartFieldInfo, ChartTypeInfo} from './models'; LABKEY_VIS = { GenericChartHelper: { getAllowableTypes: () => ['int', 'double'], + isMeasureDimensionMatch: () => true, isNumericType: (type: string) => type === 'int', }, }; @@ -60,28 +61,6 @@ const model = makeTestQueryModel( 0 ); -describe('getSelectOptions', () => { - test('hasMatchingType', () => { - LABKEY_VIS.GenericChartHelper = { - ...LABKEY_VIS.GenericChartHelper, - isMeasureDimensionMatch: () => false, - }; - const field = { name: 'x' } as ChartFieldInfo; - const options = getSelectOptions(model, BAR_CHART_TYPE, field); - expect(options.length).toBe(2); - }); - - test('isMeasureDimensionMatch', () => { - LABKEY_VIS.GenericChartHelper = { - ...LABKEY_VIS.GenericChartHelper, - isMeasureDimensionMatch: () => true, - }; - const field = { name: 'x' } as ChartFieldInfo; - const options = getSelectOptions(model, BAR_CHART_TYPE, field); - expect(options.length).toBe(3); - }); -}); - describe('ChartFieldOption', () => { test('line chart for x, showFieldOptions for int', async () => { render( @@ -89,8 +68,10 @@ describe('ChartFieldOption', () => { field={{ name: 'x', label: 'X Axis', required: true } as ChartFieldInfo} fieldValues={{ x: { value: 'field1', data: { type: 'int' } } }} model={model} + onErrorBarChange={jest.fn()} onScaleChange={jest.fn()} onSelectFieldChange={jest.fn()} + scaleValues={undefined} selectedType={LINE_PLOT_TYPE} /> ); @@ -108,8 +89,10 @@ describe('ChartFieldOption', () => { field={{ name: 'x', label: 'X Axis', required: true } as ChartFieldInfo} fieldValues={{ x: { value: 'field1', data: { type: 'date' } } }} model={model} + onErrorBarChange={jest.fn()} onScaleChange={jest.fn()} onSelectFieldChange={jest.fn()} + scaleValues={undefined} selectedType={LINE_PLOT_TYPE} /> ); @@ -127,8 +110,10 @@ describe('ChartFieldOption', () => { field={{ name: 'x', label: 'X Axis', required: true } as ChartFieldInfo} fieldValues={{ x: { value: 'field1', data: { type: 'int' } } }} model={model} + onErrorBarChange={jest.fn()} onScaleChange={jest.fn()} onSelectFieldChange={jest.fn()} + scaleValues={undefined} selectedType={BAR_CHART_TYPE} /> ); @@ -146,8 +131,10 @@ describe('ChartFieldOption', () => { field={{ name: 'x', label: 'X Axis', required: false } as ChartFieldInfo} fieldValues={{ x: { value: 'field1', data: { type: 'date' } } }} model={model} + onErrorBarChange={jest.fn()} onScaleChange={jest.fn()} onSelectFieldChange={jest.fn()} + scaleValues={undefined} selectedType={LINE_PLOT_TYPE} /> ); @@ -163,8 +150,10 @@ describe('ChartFieldOption', () => { field={{ name: 'x', label: 'X Axis', required: true } as ChartFieldInfo} fieldValues={{ x: { value: 'field1', data: { type: 'int' } } }} model={model} + onErrorBarChange={jest.fn()} onScaleChange={jest.fn()} onSelectFieldChange={jest.fn()} + scaleValues={undefined} selectedType={LINE_PLOT_TYPE} /> ); @@ -194,6 +183,7 @@ describe('ChartFieldOption', () => { field={{ name: 'x', label: 'X Axis', required: true } as ChartFieldInfo} fieldValues={{ x: { value: 'field1', data: { type: 'int' } } }} model={model} + onErrorBarChange={jest.fn()} onScaleChange={jest.fn()} onSelectFieldChange={jest.fn()} scaleValues={{ trans: 'log', type: 'manual', min: '3', max: '20' }} @@ -231,6 +221,7 @@ describe('ChartFieldOption', () => { field={{ name: 'x', label: 'X Axis', required: true } as ChartFieldInfo} fieldValues={{ x: { value: 'field1', data: { type: 'int' } } }} model={model} + onErrorBarChange={jest.fn()} onScaleChange={jest.fn()} onSelectFieldChange={jest.fn()} scaleValues={{ trans: 'log', type: 'manual', min: '1', max: '0' }} diff --git a/packages/components/src/internal/components/chart/TrendlineOption.test.tsx b/packages/components/src/internal/components/chart/TrendlineOption.test.tsx index 05c8831808..8f9edcd9a0 100644 --- a/packages/components/src/internal/components/chart/TrendlineOption.test.tsx +++ b/packages/components/src/internal/components/chart/TrendlineOption.test.tsx @@ -7,9 +7,15 @@ import { LABKEY_VIS } from '../../constants'; import { SchemaQuery } from '../../../public/SchemaQuery'; import { TrendlineOption } from './TrendlineOption'; +import {makeTestQueryModel} from "../../../public/QueryModel/testUtils"; +import {QueryInfo} from "../../../public/QueryInfo"; +import {ViewInfo} from "../../ViewInfo"; +import {ChartTypeInfo} from "./models"; LABKEY_VIS = { GenericChartHelper: { + getAllowableTypes: () => ['text'], + isMeasureDimensionMatch: () => true, TRENDLINE_OPTIONS: [ { value: 'option1', label: 'Option 1', schemaPrefix: undefined }, { value: 'option2', label: 'Option 2', schemaPrefix: null }, @@ -19,13 +25,43 @@ LABKEY_VIS = { }, }; +const LINE_PLOT_TYPE = { + name: 'line_plot', +} as ChartTypeInfo; + +const columns = [ + { fieldKey: 'intCol', jsonType: 'int' }, + { fieldKey: 'doubleCol', jsonType: 'double' }, + { fieldKey: 'textCol', jsonType: 'string' }, +]; + +const model = makeTestQueryModel( + new SchemaQuery('schema', 'query', 'view'), + QueryInfo.fromJsonForTests( + { + columns, + name: 'query', + schemaName: 'schema', + views: [ + { columns, name: ViewInfo.DEFAULT_NAME }, + { columns, name: 'view' }, + ], + }, + true + ), + [], + 0 +); + describe('TrendlineOption', () => { test('hidden without x-axis value selected', async () => { render( ); await waitFor(() => { @@ -47,8 +83,10 @@ describe('TrendlineOption', () => { render( ); await waitFor(() => { @@ -77,8 +115,10 @@ describe('TrendlineOption', () => { render( ); await waitFor(() => { @@ -98,8 +138,10 @@ describe('TrendlineOption', () => { render( ); await waitFor(() => { @@ -120,8 +162,10 @@ describe('TrendlineOption', () => { render( ); await waitFor(() => { @@ -158,8 +202,10 @@ describe('TrendlineOption', () => { render( ); await waitFor(() => { diff --git a/packages/components/src/internal/components/chart/utils.test.ts b/packages/components/src/internal/components/chart/utils.test.ts index b424cf42da..ff8a7874a0 100644 --- a/packages/components/src/internal/components/chart/utils.test.ts +++ b/packages/components/src/internal/components/chart/utils.test.ts @@ -3,11 +3,23 @@ import { Map } from 'immutable'; import { createHorizontalBarCountLegendData, createHorizontalBarLegendData, - getFieldDataType, + getFieldDataType, getSelectOptions, shouldShowAggregateOptions, shouldShowRangeScaleOptions, } from './utils'; import { ChartFieldInfo, ChartTypeInfo } from './models'; +import { LABKEY_VIS } from "../../constants"; +import {makeTestQueryModel} from "../../../public/QueryModel/testUtils"; +import {SchemaQuery} from "../../../public/SchemaQuery"; +import {QueryInfo} from "../../../public/QueryInfo"; +import {ViewInfo} from "../../ViewInfo"; + +LABKEY_VIS = { + GenericChartHelper: { + getAllowableTypes: () => ['int', 'double'], + isNumericType: (type: string) => type === 'int', + }, +}; describe('createHorizontalBarLegendData', () => { test('all different', () => { @@ -357,3 +369,49 @@ describe('shouldShowAggregateOptions', () => { expect(shouldShowAggregateOptions(yField, LINE_PLOT_TYPE)).toBe(true); }); }); + +describe('getSelectOptions', () => { + const columns = [ + { fieldKey: 'intCol', jsonType: 'int' }, + { fieldKey: 'doubleCol', jsonType: 'double' }, + { fieldKey: 'textCol', jsonType: 'string' }, + ]; + + const model = makeTestQueryModel( + new SchemaQuery('schema', 'query', 'view'), + QueryInfo.fromJsonForTests( + { + columns, + name: 'query', + schemaName: 'schema', + views: [ + { columns, name: ViewInfo.DEFAULT_NAME }, + { columns, name: 'view' }, + ], + }, + true + ), + [], + 0 + ); + + test('hasMatchingType', () => { + LABKEY_VIS.GenericChartHelper = { + ...LABKEY_VIS.GenericChartHelper, + isMeasureDimensionMatch: () => false, + }; + const field = { name: 'x' } as ChartFieldInfo; + const options = getSelectOptions(model, BAR_CHART_TYPE, field); + expect(options.length).toBe(2); + }); + + test('isMeasureDimensionMatch', () => { + LABKEY_VIS.GenericChartHelper = { + ...LABKEY_VIS.GenericChartHelper, + isMeasureDimensionMatch: () => true, + }; + const field = { name: 'x' } as ChartFieldInfo; + const options = getSelectOptions(model, BAR_CHART_TYPE, field); + expect(options.length).toBe(3); + }); +}); From 42b5a91cd81699b2c80800cc02da1c69b6a51048 Mon Sep 17 00:00:00 2001 From: cnathe Date: Mon, 10 Nov 2025 08:20:56 -0600 Subject: [PATCH 05/17] 6.70.3-trendlineProvidedParams.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 293398d0e4..d5bc810128 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "6.70.3", + "version": "6.70.3-trendlineProvidedParams.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.70.3", + "version": "6.70.3-trendlineProvidedParams.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 2307b705ba..2ae3e431b6 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.70.3", + "version": "6.70.3-trendlineProvidedParams.0", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ From 1979d8f5115e5daf0c68ae5d722c8e15831f6ad0 Mon Sep 17 00:00:00 2001 From: cnathe Date: Mon, 10 Nov 2025 12:07:30 -0600 Subject: [PATCH 06/17] Add trendline Provided Parameters tooltip description text --- .../src/internal/components/chart/ChartBuilderModal.tsx | 2 +- .../src/internal/components/chart/TrendlineOption.tsx | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/components/src/internal/components/chart/ChartBuilderModal.tsx b/packages/components/src/internal/components/chart/ChartBuilderModal.tsx index 2aa5edb1a0..5445e6378d 100644 --- a/packages/components/src/internal/components/chart/ChartBuilderModal.tsx +++ b/packages/components/src/internal/components/chart/ChartBuilderModal.tsx @@ -74,7 +74,7 @@ export const getChartBuilderQueryConfig = ( viewName: savedConfig?.viewName || viewName, columns: Object.values(fieldValues) .filter(field => field?.value && typeof field.value === 'string') // just those fields with values - .filter(field => !field.equation) // exclude the trendlineType + .filter(field => !field.equation) // exclude the trendlineType field (which has an equation value) .map(field => field.data?.fieldKey ?? field.value), // Issue 52050: use fieldKey for special characters sort: LABKEY_VIS.GenericChartHelper.getQueryConfigSortKey(chartConfig.measures), filterArray: savedConfig?.filterArray ?? [], diff --git a/packages/components/src/internal/components/chart/TrendlineOption.tsx b/packages/components/src/internal/components/chart/TrendlineOption.tsx index 505f036ce1..cbcbbfee76 100644 --- a/packages/components/src/internal/components/chart/TrendlineOption.tsx +++ b/packages/components/src/internal/components/chart/TrendlineOption.tsx @@ -218,7 +218,14 @@ export const TrendlineOption: FC = memo(props => { )}
Date: Mon, 10 Nov 2025 12:07:45 -0600 Subject: [PATCH 07/17] Use column metadata displayWidth in app grid column render calcWidths --- packages/components/releaseNotes/components.md | 1 + packages/components/src/internal/components/base/Grid.tsx | 2 +- packages/components/src/public/QueryColumn.ts | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/components/releaseNotes/components.md b/packages/components/releaseNotes/components.md index 6ec03765da..7999ebb08e 100644 --- a/packages/components/releaseNotes/components.md +++ b/packages/components/releaseNotes/components.md @@ -6,6 +6,7 @@ Components, models, actions, and utility functions for LabKey applications and p - Line chart trendline options for provided parameters to CalculateCurveFit API - ChartBuilderModal update to include trendline option for provided parameters - Include new 5 Parameter nonlinear curve fit option in trendline select + - Use column metadata displayWidth in app grid column render calcWidths ### version 6.70.2 *Released*: 6 November 2025 diff --git a/packages/components/src/internal/components/base/Grid.tsx b/packages/components/src/internal/components/base/Grid.tsx index 2b970c9176..cf14dcaa22 100644 --- a/packages/components/src/internal/components/base/Grid.tsx +++ b/packages/components/src/internal/components/base/Grid.tsx @@ -48,7 +48,7 @@ function processColumns(columns: List): List { raw: c, tableCell: c.tableCell, title: c.title || c.caption, - width: c.width, + width: c.width || c.displayWidth, }); }) .toList(); diff --git a/packages/components/src/public/QueryColumn.ts b/packages/components/src/public/QueryColumn.ts index e241ecb1b5..1370b73d47 100644 --- a/packages/components/src/public/QueryColumn.ts +++ b/packages/components/src/public/QueryColumn.ts @@ -128,6 +128,7 @@ export class QueryColumn implements IQueryColumn { declare description: string; declare dimension: boolean; declare displayAsLookup: boolean; + declare displayWidth: number | string; // declare excludeFromShifting: boolean; // declare ext: any; declare facetingBehaviorType: string; From e512440aefff44c602b8dd683e183f782915354b Mon Sep 17 00:00:00 2001 From: cnathe Date: Mon, 10 Nov 2025 12:08:09 -0600 Subject: [PATCH 08/17] 6.70.3-trendlineProvidedParams.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 d5bc810128..59bcfe548f 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "6.70.3-trendlineProvidedParams.0", + "version": "6.70.3-trendlineProvidedParams.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.70.3-trendlineProvidedParams.0", + "version": "6.70.3-trendlineProvidedParams.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 2ae3e431b6..d97554ba1b 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.70.3-trendlineProvidedParams.0", + "version": "6.70.3-trendlineProvidedParams.1", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ From b9b5d46bca175fbc5fc38a0f40957a97b702c3cd Mon Sep 17 00:00:00 2001 From: cnathe Date: Mon, 17 Nov 2025 10:21:23 -0600 Subject: [PATCH 09/17] 6.70.5-trendlineProvidedParams.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 5804df043c..e99849e47d 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "6.70.5", + "version": "6.70.5-trendlineProvidedParams.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.70.5", + "version": "6.70.5-trendlineProvidedParams.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 b156cc69c9..10833a0a6e 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.70.5", + "version": "6.70.5-trendlineProvidedParams.0", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ From 1e7672538705a03b27d5c924c2c0d7c5152a34b6 Mon Sep 17 00:00:00 2001 From: cnathe Date: Mon, 17 Nov 2025 13:27:03 -0600 Subject: [PATCH 10/17] null check on plots before setting --- packages/components/src/internal/components/chart/Chart.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/components/src/internal/components/chart/Chart.tsx b/packages/components/src/internal/components/chart/Chart.tsx index 37fc366297..cde101b31a 100644 --- a/packages/components/src/internal/components/chart/Chart.tsx +++ b/packages/components/src/internal/components/chart/Chart.tsx @@ -175,7 +175,7 @@ export const SVGChart: FC = memo(({ api, chart, container, filters, query measureStore, trendlineData ); - setPlot(plots[0]); + if (plots) setPlot(plots[0]); } } }; From 7ea08b6df123a4a1438072200b05a1f10124d3ac Mon Sep 17 00:00:00 2001 From: cnathe Date: Mon, 17 Nov 2025 13:27:32 -0600 Subject: [PATCH 11/17] CR feedback - split out TrendlineOptionPopover --- .../components/chart/TrendlineOption.tsx | 261 ++++++++++-------- 1 file changed, 152 insertions(+), 109 deletions(-) diff --git a/packages/components/src/internal/components/chart/TrendlineOption.tsx b/packages/components/src/internal/components/chart/TrendlineOption.tsx index cbcbbfee76..aa2f3c9cce 100644 --- a/packages/components/src/internal/components/chart/TrendlineOption.tsx +++ b/packages/components/src/internal/components/chart/TrendlineOption.tsx @@ -31,7 +31,6 @@ export const TrendlineOption: FC = memo(props => { const TRENDLINE_OPTIONS: TrendlineType[] = Object.values(LABKEY_VIS.GenericChartHelper.TRENDLINE_OPTIONS); const { fieldValues, onFieldChange, schemaQuery, model, selectedType } = props; const showFieldOptions = fieldValues.trendlineType && fieldValues.trendlineType.value !== ''; - const showAsymptoteOptions = fieldValues.trendlineType?.showMin || fieldValues.trendlineType?.showMax; // hide the trendline option if no x-axis value selected and for date field selection on x-axis const hidden = useMemo(() => { @@ -39,38 +38,11 @@ export const TrendlineOption: FC = memo(props => { return !fieldValues.x?.value || jsonType === 'date' || jsonType === 'time'; }, [fieldValues.x]); - const options = useMemo(() => { - const field = { - name: 'parameters', - textOnly: true, - label: 'Provided Parameters', - required: false, - } as ChartFieldInfo; - return getSelectOptions(model, selectedType, field); - }, [model, selectedType]); - // Issue 52050: use fieldKey for special characters - const parameterInputValue = useMemo(() => { - if (fieldValues?.trendlineParameters) { - return fieldValues.trendlineParameters.data?.fieldKey ?? fieldValues.trendlineParameters.value; - } - return undefined; - }, [fieldValues]); - - const onParameterFieldChange = useCallback( - (name: string, _: string, selectedOption: SelectInputOption) => { - onFieldChange(name, selectedOption); - }, - [onFieldChange] - ); - const [loadingTrendlineOptions, setLoadingTrendlineOptions] = useState(true); const [asymptoteType, setAsymptoteType] = useState('automatic'); const [asymptoteMin, setAsymptoteMin] = useState(''); const [asymptoteMax, setAsymptoteMax] = useState(''); - const invalidRange = useMemo( - () => !!asymptoteMin && !!asymptoteMax && asymptoteMax <= asymptoteMin, - [asymptoteMin, asymptoteMax] - ); + useEffect(() => { if (loadingTrendlineOptions && (!!fieldValues.trendlineAsymptoteMin || !!fieldValues.trendlineAsymptoteMax)) { setAsymptoteType('manual'); @@ -88,12 +60,6 @@ export const TrendlineOption: FC = memo(props => { setAsymptoteMax(event.target.value); }, []); - const applyTrendlineAsymptote = useCallback(() => { - if (invalidRange) return; - onFieldChange('trendlineAsymptoteMin', { value: asymptoteMin }); - onFieldChange('trendlineAsymptoteMax', { value: asymptoteMax }); - }, [onFieldChange, asymptoteMin, asymptoteMax, invalidRange]); - const clearTrendlineAsymptote = useCallback(() => { setAsymptoteMin(''); onFieldChange('trendlineAsymptoteMin', undefined); @@ -126,16 +92,6 @@ export const TrendlineOption: FC = memo(props => { [clearTrendlineAsymptote] ); - const asymptoteTypeOptions = useMemo(() => { - return ASYMPTOTE_TYPES.map( - option => - ({ - ...option, - selected: asymptoteType === option.value, - }) as RadioGroupOption - ); - }, [asymptoteType]); - if (hidden) return null; return ( @@ -172,70 +128,18 @@ export const TrendlineOption: FC = memo(props => { - {showAsymptoteOptions && ( - <> -
- - -
- {asymptoteType === 'manual' && ( -
- {fieldValues.trendlineType?.showMin && ( - - )} - {fieldValues.trendlineType?.showMin && - fieldValues.trendlineType?.showMax && -} - {fieldValues.trendlineType?.showMax && ( - - )} - {invalidRange && ( -
Invalid range (Max <= Min)
- )} -
- )} - - )} -
- - -
+ } triggerType="click" @@ -249,3 +153,142 @@ export const TrendlineOption: FC = memo(props => { ); }); TrendlineOption.displayName = 'TrendlineOption'; + +interface TrendlineOptionPopoverProps { + asymptoteMax: string; + asymptoteMin: string; + asymptoteType: string; + fieldValues: Record; + model: QueryModel; + onAsymptoteTypeChange: (selected: string) => void; + onFieldChange: (key: string, value: SelectInputOption) => void; + onTrendlineAsymptoteMax: (event: ChangeEvent) => void; + onTrendlineAsymptoteMin: (event: ChangeEvent) => void; + selectedType: ChartTypeInfo; +} + +const TrendlineOptionPopover: FC = props => { + const { + fieldValues, + model, + selectedType, + asymptoteType, + onAsymptoteTypeChange, + onFieldChange, + asymptoteMin, + asymptoteMax, + onTrendlineAsymptoteMin, + onTrendlineAsymptoteMax, + } = props; + const showAsymptoteOptions = fieldValues.trendlineType?.showMin || fieldValues.trendlineType?.showMax; + const invalidRange = useMemo( + () => !!asymptoteMin && !!asymptoteMax && asymptoteMax <= asymptoteMin, + [asymptoteMin, asymptoteMax] + ); + + const options = useMemo(() => { + const field = { + name: 'parameters', + textOnly: true, + label: 'Provided Parameters', + required: false, + } as ChartFieldInfo; + return getSelectOptions(model, selectedType, field); + }, [model, selectedType]); + // Issue 52050: use fieldKey for special characters + const parameterInputValue = useMemo(() => { + if (fieldValues?.trendlineParameters) { + return fieldValues.trendlineParameters.data?.fieldKey ?? fieldValues.trendlineParameters.value; + } + return undefined; + }, [fieldValues]); + + const asymptoteTypeOptions = useMemo(() => { + return ASYMPTOTE_TYPES.map( + option => + ({ + ...option, + selected: asymptoteType === option.value, + }) as RadioGroupOption + ); + }, [asymptoteType]); + + const applyTrendlineAsymptote = useCallback(() => { + if (invalidRange) return; + onFieldChange('trendlineAsymptoteMin', { value: asymptoteMin }); + onFieldChange('trendlineAsymptoteMax', { value: asymptoteMax }); + }, [onFieldChange, asymptoteMin, asymptoteMax, invalidRange]); + + const onParameterFieldChange = useCallback( + (name: string, _: string, selectedOption: SelectInputOption) => { + onFieldChange(name, selectedOption); + }, + [onFieldChange] + ); + + return ( +
+ {showAsymptoteOptions && ( + <> +
+ + +
+ {asymptoteType === 'manual' && ( +
+ {fieldValues.trendlineType?.showMin && ( + + )} + {fieldValues.trendlineType?.showMin && fieldValues.trendlineType?.showMax && ( + - + )} + {fieldValues.trendlineType?.showMax && ( + + )} + {invalidRange &&
Invalid range (Max <= Min)
} +
+ )} + + )} +
+ + +
+
+ ); +}; From 62a9c62f9c76c48fc7b9cf06717c32d03ebb2296 Mon Sep 17 00:00:00 2001 From: cnathe Date: Mon, 17 Nov 2025 13:29:10 -0600 Subject: [PATCH 12/17] 6.70.5-trendlineProvidedParams.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 e99849e47d..b93efa51dc 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "6.70.5-trendlineProvidedParams.0", + "version": "6.70.5-trendlineProvidedParams.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.70.5-trendlineProvidedParams.0", + "version": "6.70.5-trendlineProvidedParams.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 10833a0a6e..38c4619501 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.70.5-trendlineProvidedParams.0", + "version": "6.70.5-trendlineProvidedParams.1", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ From 28cc4eacab74be0ea2ae055d0999fd0851b42955 Mon Sep 17 00:00:00 2001 From: cnathe Date: Thu, 20 Nov 2025 09:54:59 -0600 Subject: [PATCH 13/17] 6.70.8-trendlineProvidedParams.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 9e1d8eea96..4d39455877 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "6.70.8", + "version": "6.70.8-trendlineProvidedParams.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.70.8", + "version": "6.70.8-trendlineProvidedParams.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 30d6f24d4c..37e46fbe43 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.70.8", + "version": "6.70.8-trendlineProvidedParams.0", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ From 0918063fa308299d9cab57b9f299eea91d116fe6 Mon Sep 17 00:00:00 2001 From: cnathe Date: Thu, 20 Nov 2025 11:05:44 -0600 Subject: [PATCH 14/17] jest update for TrendlineOption provided parameters display select input --- .../components/chart/TrendlineOption.test.tsx | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/packages/components/src/internal/components/chart/TrendlineOption.test.tsx b/packages/components/src/internal/components/chart/TrendlineOption.test.tsx index 8f9edcd9a0..97a069b4ed 100644 --- a/packages/components/src/internal/components/chart/TrendlineOption.test.tsx +++ b/packages/components/src/internal/components/chart/TrendlineOption.test.tsx @@ -72,6 +72,7 @@ describe('TrendlineOption', () => { expect(document.querySelectorAll('.field-option-icon')).toHaveLength(0); expect(document.querySelectorAll('input[name="trendlineAsymptoteMin"]')).toHaveLength(0); expect(document.querySelectorAll('input[name="trendlineAsymptoteMax"]')).toHaveLength(0); + expect(document.querySelectorAll('input[name="trendlineParameters"]')).toHaveLength(0); }); test('shown with x-axis value selected, non-date', async () => { @@ -79,6 +80,7 @@ describe('TrendlineOption', () => { x: { data: { jsonType: 'int' }, value: 'field1' }, trendlineAsymptoteMin: { value: undefined }, trendlineAsymptoteMax: { value: undefined }, + trendlineParameters: { value: undefined }, }; render( { x: { data: { jsonType: 'date' }, value: 'field1' }, trendlineAsymptoteMin: { value: undefined }, trendlineAsymptoteMax: { value: undefined }, + trendlineParameters: { value: undefined }, }; render( { x: { data: { type: 'time' }, value: 'field1' }, trendlineAsymptoteMin: { value: undefined }, trendlineAsymptoteMax: { value: undefined }, + trendlineParameters: { value: undefined }, }; render( { trendlineType: { value: 'option1', showMin: true, showMax: true }, trendlineAsymptoteMin: { value: '0.1' }, trendlineAsymptoteMax: { value: '1.0' }, + trendlineParameters: { value: undefined }, }; render( { trendlineType: { value: 'option1', showMin: true, showMax: false }, trendlineAsymptoteMin: { value: '0.1' }, trendlineAsymptoteMax: { value: undefined }, + trendlineParameters: { value: undefined }, }; render( { expect(document.querySelectorAll('input[name="trendlineAsymptoteMax"]')).toHaveLength(0); expect(document.querySelector('input[name="trendlineAsymptoteMin"]').getAttribute('value')).toBe(''); }); + + test('show provided parameters in trendline gear tooltip', async () => { + const fieldValues = { + x: { data: { jsonType: 'int' }, value: 'field1' }, + trendlineType: { value: 'option1', showMin: true, showMax: true }, + trendlineAsymptoteMin: { value: undefined }, + trendlineAsymptoteMax: { value: undefined }, + trendlineParameters: { value: 'field1' }, + }; + render( + + ); + await waitFor(() => { + expect(document.querySelectorAll('.trendline-option')).toHaveLength(1); + }); + + expect(document.querySelectorAll('.select-input')).toHaveLength(1); // trendline type + expect(document.querySelectorAll('.field-option-icon')).toHaveLength(1); + + await userEvent.click(document.querySelector('.fa-gear')); + expect(document.querySelectorAll('.select-input')).toHaveLength(2); // trendline type and now provided parameters + expect(document.querySelectorAll('input[name="trendlineParameters"]')).toHaveLength(1); + expect(document.querySelector('input[name="trendlineParameters"]').getAttribute('value')).toBe('field1'); + }); }); From 72934c0493831cd29a30cf147d9f014497df51e2 Mon Sep 17 00:00:00 2001 From: cnathe Date: Thu, 20 Nov 2025 14:47:18 -0600 Subject: [PATCH 15/17] npm run lint-branch-fix --- .../components/chart/ChartFieldOption.test.tsx | 2 +- .../internal/components/chart/CurveFitStatsGrid.tsx | 9 ++++++++- .../components/chart/TrendlineOption.test.tsx | 8 ++++---- .../src/internal/components/chart/utils.test.ts | 13 +++++++------ 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/packages/components/src/internal/components/chart/ChartFieldOption.test.tsx b/packages/components/src/internal/components/chart/ChartFieldOption.test.tsx index 1094662ddf..c67e2e8455 100644 --- a/packages/components/src/internal/components/chart/ChartFieldOption.test.tsx +++ b/packages/components/src/internal/components/chart/ChartFieldOption.test.tsx @@ -14,7 +14,7 @@ import { QueryInfo } from '../../../public/QueryInfo'; import { ViewInfo } from '../../ViewInfo'; import { ChartFieldOption } from './ChartFieldOption'; -import {ChartFieldInfo, ChartTypeInfo} from './models'; +import { ChartFieldInfo, ChartTypeInfo } from './models'; LABKEY_VIS = { GenericChartHelper: { diff --git a/packages/components/src/internal/components/chart/CurveFitStatsGrid.tsx b/packages/components/src/internal/components/chart/CurveFitStatsGrid.tsx index e164b0bf71..39599b6e11 100644 --- a/packages/components/src/internal/components/chart/CurveFitStatsGrid.tsx +++ b/packages/components/src/internal/components/chart/CurveFitStatsGrid.tsx @@ -138,7 +138,14 @@ type PossibleTrendlines = | Trendline | Trendline; -const nonLinearTrendlineTypes = ['3 Parameter', '4 Parameter', '5 Parameter', 'Five Parameter', 'Four Parameter', 'Three Parameter']; +const nonLinearTrendlineTypes = [ + '3 Parameter', + '4 Parameter', + '5 Parameter', + 'Five Parameter', + 'Four Parameter', + 'Three Parameter', +]; function isNonlinearTrendline( trendline: PossibleTrendlines ): trendline is Trendline { diff --git a/packages/components/src/internal/components/chart/TrendlineOption.test.tsx b/packages/components/src/internal/components/chart/TrendlineOption.test.tsx index 97a069b4ed..f80075bd5a 100644 --- a/packages/components/src/internal/components/chart/TrendlineOption.test.tsx +++ b/packages/components/src/internal/components/chart/TrendlineOption.test.tsx @@ -7,10 +7,10 @@ import { LABKEY_VIS } from '../../constants'; import { SchemaQuery } from '../../../public/SchemaQuery'; import { TrendlineOption } from './TrendlineOption'; -import {makeTestQueryModel} from "../../../public/QueryModel/testUtils"; -import {QueryInfo} from "../../../public/QueryInfo"; -import {ViewInfo} from "../../ViewInfo"; -import {ChartTypeInfo} from "./models"; +import { makeTestQueryModel } from '../../../public/QueryModel/testUtils'; +import { QueryInfo } from '../../../public/QueryInfo'; +import { ViewInfo } from '../../ViewInfo'; +import { ChartTypeInfo } from './models'; LABKEY_VIS = { GenericChartHelper: { diff --git a/packages/components/src/internal/components/chart/utils.test.ts b/packages/components/src/internal/components/chart/utils.test.ts index ff8a7874a0..364a65dfe5 100644 --- a/packages/components/src/internal/components/chart/utils.test.ts +++ b/packages/components/src/internal/components/chart/utils.test.ts @@ -3,16 +3,17 @@ import { Map } from 'immutable'; import { createHorizontalBarCountLegendData, createHorizontalBarLegendData, - getFieldDataType, getSelectOptions, + getFieldDataType, + getSelectOptions, shouldShowAggregateOptions, shouldShowRangeScaleOptions, } from './utils'; import { ChartFieldInfo, ChartTypeInfo } from './models'; -import { LABKEY_VIS } from "../../constants"; -import {makeTestQueryModel} from "../../../public/QueryModel/testUtils"; -import {SchemaQuery} from "../../../public/SchemaQuery"; -import {QueryInfo} from "../../../public/QueryInfo"; -import {ViewInfo} from "../../ViewInfo"; +import { LABKEY_VIS } from '../../constants'; +import { makeTestQueryModel } from '../../../public/QueryModel/testUtils'; +import { SchemaQuery } from '../../../public/SchemaQuery'; +import { QueryInfo } from '../../../public/QueryInfo'; +import { ViewInfo } from '../../ViewInfo'; LABKEY_VIS = { GenericChartHelper: { From 768d52a532f6605d81e96954d306ac5c82cbc4d2 Mon Sep 17 00:00:00 2001 From: cnathe Date: Thu, 20 Nov 2025 14:47:56 -0600 Subject: [PATCH 16/17] Update release notes with version number and release date --- 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 b8102078d2..ed1fce005f 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 TBD -*Released*: TBD +### version 6.71.0 +*Released*: 20 November 2025 - Line chart trendline options for provided parameters to CalculateCurveFit API - ChartBuilderModal update to include trendline option for provided parameters - Include new 5 Parameter nonlinear curve fit option in trendline select From 6bae612d6c5f1dbb6730fe2b09b822e890e813b7 Mon Sep 17 00:00:00 2001 From: cnathe Date: Thu, 20 Nov 2025 14:48:25 -0600 Subject: [PATCH 17/17] 6.71.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 4d39455877..bccd357bb4 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "6.70.8-trendlineProvidedParams.0", + "version": "6.71.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.70.8-trendlineProvidedParams.0", + "version": "6.71.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 37e46fbe43..b02aa74fff 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.70.8-trendlineProvidedParams.0", + "version": "6.71.0", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [