Skip to content

Commit e291a44

Browse files
authored
Issue 53153: Disable value validation for expInput, aliquotParent columns (#1824)
1 parent 8865cd4 commit e291a44

File tree

7 files changed

+61
-56
lines changed

7 files changed

+61
-56
lines changed

packages/components/package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/components/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@labkey/components",
3-
"version": "6.53.0",
3+
"version": "6.53.1",
44
"description": "Components, models, actions, and utility functions for LabKey applications and pages",
55
"sideEffects": false,
66
"files": [

packages/components/releaseNotes/components.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
# @labkey/components
22
Components, models, actions, and utility functions for LabKey applications and pages
33

4+
### version 6.53.1
5+
*Released*: 3 July 2025
6+
- Issue 53153: Disable value validation for expInput, aliquotParent columns
7+
48
### version 6.53.0
59
*Released*: 1 July 2025
610
- Remove AssayResultsForSamplesButton, AssayResultsForSamplesMenuItem

packages/components/src/internal/components/forms/BulkAddUpdateForm.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React, { FC, useMemo } from 'react';
2-
import { List, Map } from 'immutable';
2+
import { List } from 'immutable';
33

44
import { Operation } from '../../../public/QueryColumn';
55

@@ -18,9 +18,9 @@ type BaseProps = Omit<
1818
| 'hideButtons'
1919
| 'includeCountField'
2020
| 'initiallyDisableFields'
21+
| 'queryInfo'
2122
| 'showLabelAsterisk'
2223
| 'title'
23-
| 'queryInfo'
2424
>;
2525

2626
interface BulkAddUpdateFormProps extends BaseProps {

packages/components/src/internal/components/forms/QueryFormInputs.tsx

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,6 @@ export class QueryFormInputs extends React.Component<QueryFormInputsProps, State
270270
getContainerFilterForLookups()
271271
}
272272
containerPath={col.lookup.containerPath ?? containerPath}
273-
toggleDisabledTooltip={toggleDisabledTooltip}
274273
description={col.description}
275274
displayColumn={col.lookup.displayColumn}
276275
fireQSChangeOnInit={fireQSChangeOnInit}
@@ -282,6 +281,7 @@ export class QueryFormInputs extends React.Component<QueryFormInputsProps, State
282281
maxRows={10}
283282
multiple={multiple}
284283
name={fieldKey}
284+
notFoundValuesEnabled={!(col.isExpInput() || col.isAliquotParent())} // Issue 53153
285285
onQSChange={this.onSelectChange}
286286
onToggleDisable={this.onToggleDisable}
287287
placeholder="Select or type to search..."
@@ -290,6 +290,7 @@ export class QueryFormInputs extends React.Component<QueryFormInputsProps, State
290290
required={col.required}
291291
schemaQuery={col.lookup.schemaQuery}
292292
showLabel
293+
toggleDisabledTooltip={toggleDisabledTooltip}
293294
value={value}
294295
valueColumn={col.lookup.keyColumn}
295296
/>
@@ -303,6 +304,7 @@ export class QueryFormInputs extends React.Component<QueryFormInputsProps, State
303304
<TextChoiceInput
304305
addLabelAsterisk={showAsteriskSymbol}
305306
allowDisable={allowFieldDisable}
307+
description={col.description}
306308
formsy
307309
initiallyDisabled={shouldDisableField}
308310
key={fieldKey}
@@ -311,7 +313,6 @@ export class QueryFormInputs extends React.Component<QueryFormInputsProps, State
311313
placeholder="Select or type to search..."
312314
queryColumn={col}
313315
renderFieldLabel={renderFieldLabel}
314-
description={col.description}
315316
value={value}
316317
/>
317318
);
@@ -320,80 +321,80 @@ export class QueryFormInputs extends React.Component<QueryFormInputsProps, State
320321
if (col.inputType === 'textarea') {
321322
return (
322323
<TextAreaInput
323-
key={fieldKey}
324-
queryColumn={col}
325-
value={value}
324+
addLabelAsterisk={showAsteriskSymbol}
326325
allowDisable={allowFieldDisable}
327326
initiallyDisabled={shouldDisableField}
327+
key={fieldKey}
328328
onToggleDisable={this.onToggleDisable}
329-
addLabelAsterisk={showAsteriskSymbol}
329+
queryColumn={col}
330330
renderFieldLabel={renderFieldLabel}
331+
value={value}
331332
/>
332333
);
333334
} else if (col.inputType === 'file' && renderFileInputs) {
334335
return (
335336
<FileInput
337+
addLabelAsterisk={showAsteriskSymbol}
338+
allowDisable={allowFieldDisable}
336339
formsy
337-
key={fieldKey}
338-
queryColumn={col}
340+
initiallyDisabled={shouldDisableField}
339341
initialValue={value}
342+
key={fieldKey}
340343
name={fieldKey}
341-
allowDisable={allowFieldDisable}
342-
initiallyDisabled={shouldDisableField}
343344
onToggleDisable={this.onToggleDisable}
344-
addLabelAsterisk={showAsteriskSymbol}
345+
queryColumn={col}
345346
renderFieldLabel={renderFieldLabel}
346347
showLabel
347348
/>
348349
);
349350
}
350351
switch (col.jsonType) {
351-
case 'date':
352-
case 'time':
352+
case 'boolean':
353353
return (
354-
<DatePickerInput
355-
key={fieldKey}
356-
queryColumn={col}
357-
value={value}
354+
<CheckboxInput
355+
addLabelAsterisk={showAsteriskSymbol}
358356
allowDisable={allowFieldDisable}
359357
initiallyDisabled={shouldDisableField}
358+
key={fieldKey}
360359
onToggleDisable={this.onToggleDisable}
361-
addLabelAsterisk={showAsteriskSymbol}
360+
queryColumn={col}
362361
renderFieldLabel={renderFieldLabel}
362+
value={value}
363363
/>
364364
);
365-
case 'boolean':
365+
case 'date':
366+
case 'time':
366367
return (
367-
<CheckboxInput
368-
key={fieldKey}
369-
queryColumn={col}
370-
value={value}
368+
<DatePickerInput
369+
addLabelAsterisk={showAsteriskSymbol}
371370
allowDisable={allowFieldDisable}
372371
initiallyDisabled={shouldDisableField}
372+
key={fieldKey}
373373
onToggleDisable={this.onToggleDisable}
374-
addLabelAsterisk={showAsteriskSymbol}
374+
queryColumn={col}
375375
renderFieldLabel={renderFieldLabel}
376+
value={value}
376377
/>
377378
);
378379
default:
379380
return (
380381
<React.Fragment key={fieldKey}>
381382
<TextInput
382-
queryColumn={col}
383-
value={value ? String(value) : value}
383+
addLabelAsterisk={showAsteriskSymbol}
384384
allowDisable={allowFieldDisable}
385385
initiallyDisabled={shouldDisableField}
386386
onToggleDisable={this.onToggleDisable}
387-
addLabelAsterisk={showAsteriskSymbol}
387+
queryColumn={col}
388388
renderFieldLabel={renderFieldLabel}
389+
value={value ? String(value) : value}
389390
/>
390391
{internalSpacesWarningFieldKeys?.indexOf(fieldKey.toLowerCase()) > -1 && (
391392
<div className="row shift-margin-to-bottom">
392393
<div className="col-sm-3 col-xs-12" />
393394
<div className="col-sm-9 col-xs-12 text-danger">
394395
<InternalSpacesWarning
395-
value={value}
396396
fieldName={col.caption?.toLowerCase() ?? col.name.toLowerCase()}
397+
value={value}
397398
/>
398399
</div>
399400
</div>

packages/components/src/internal/components/forms/QueryInfoForm.tsx

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import { FormButtons } from '../../FormButtons';
2727

2828
import { EntityCreationTypeModel } from '../samples/models';
2929
import { QueryInfo } from '../../../public/QueryInfo';
30-
import { formatDate, formatDateTime, formatTime } from '../../util/Date';
3130
import { Alert } from '../base/Alert';
3231
import { LoadingSpinner } from '../base/LoadingSpinner';
3332

@@ -56,7 +55,7 @@ export const getUpdatedFields = (
5655
for (const key in data) {
5756
if (data.hasOwnProperty(key)) {
5857
if (fieldsToUpdate.has(key.toLowerCase()) || (additionalFields && additionalFields?.indexOf(key) !== -1)) {
59-
const col = queryInfo?.getColumn(key);
58+
const col = queryInfo.getColumn(key);
6059
if (col?.jsonType === 'string' && typeof data[key] === 'string') {
6160
filteredData = filteredData.set(key, data[key]?.trim());
6261
} else {
@@ -72,8 +71,8 @@ export const getUpdatedFields = (
7271
export interface QueryInfoFormProps extends Omit<QueryFormInputsProps, 'onFieldsEnabledChange'> {
7372
api?: ComponentsAPIWrapper;
7473
asModal?: boolean;
75-
canSubmitNotDirty?: boolean;
7674
cancelText?: string;
75+
canSubmitNotDirty?: boolean;
7776
countText?: string;
7877
creationTypeOptions?: EntityCreationTypeModel[];
7978
disabled?: boolean;
@@ -347,9 +346,9 @@ export class QueryInfoForm extends PureComponent<QueryInfoFormProps, State> {
347346
<CommentTextArea
348347
actionName="Update"
349348
containerClassName="inline-comment"
349+
inline
350350
onChange={this.onCommentChange}
351351
requiresUserComment={requiresUserComment}
352-
inline
353352
/>
354353
)}
355354

@@ -434,17 +433,17 @@ export class QueryInfoForm extends PureComponent<QueryInfoFormProps, State> {
434433
{!showErrorsAtBottom && this.renderError()}
435434
<Formsy
436435
className="form-horizontal"
437-
onValidSubmit={this.handleValidSubmit}
438-
onValid={this.enableSubmitButton}
439436
onChange={this.handleChange}
440437
onInvalid={this.disableSubmitButton}
438+
onValid={this.enableSubmitButton}
439+
onValidSubmit={this.handleValidSubmit}
441440
ref={this.formRef}
442441
>
443442
<QueryInfoQuantity
443+
countText={countText}
444444
creationTypeOptions={creationTypeOptions}
445445
includeCountField={includeCountField}
446446
maxCount={maxCount}
447-
countText={countText}
448447
onCountChange={this.onCountChange}
449448
/>
450449
{(header || showQuantityHeader) && <hr />}

packages/components/src/internal/components/forms/detail/DetailDisplay.tsx

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,7 @@ export function resolveDetailEditRenderer(
341341
maxRows={10}
342342
multiple={multiple}
343343
name={col.fieldKey}
344+
notFoundValuesEnabled={!(col.isExpInput() || col.isAliquotParent())} // Issue 53153
344345
onBlur={options?.onBlur}
345346
onQSChange={options?.onSelectChange}
346347
placeholder={options?.placeholder ?? 'Select or type to search...'}
@@ -358,15 +359,15 @@ export function resolveDetailEditRenderer(
358359
if (col.validValues) {
359360
return (
360361
<TextChoiceInput
362+
autoFocus={options?.autoFocus}
361363
formsy
362364
inputClass={DETAIL_INPUT_WRAPPER_CLASS_NAME}
363-
queryColumn={col}
364-
value={value}
365-
autoFocus={options?.autoFocus}
366365
onBlur={options?.onBlur}
367366
onChange={options?.onSelectChange}
368367
placeholder={options?.placeholder ?? 'Select or type to search...'}
368+
queryColumn={col}
369369
showLabel={showLabel}
370+
value={value}
370371
/>
371372
);
372373
}
@@ -425,6 +426,7 @@ export function resolveDetailEditRenderer(
425426
return (
426427
<TextInput
427428
elementWrapperClassName={DETAIL_INPUT_WRAPPER_CLASS_NAME}
429+
includeSpacesWarning={options.includeSpacesWarning}
428430
isUpdate={true}
429431
queryColumn={col}
430432
// Issue 43561: Support name expression fields
@@ -434,7 +436,6 @@ export function resolveDetailEditRenderer(
434436
// required if the nameExpression is not defined to force the form to require a value.
435437
required={col.required || col.nameExpression !== undefined}
436438
showLabel={showLabel}
437-
includeSpacesWarning={options.includeSpacesWarning}
438439
validatePristine
439440
validationError={validationError}
440441
value={value}
@@ -449,45 +450,45 @@ export function resolveDetailRenderer(column: QueryColumn): Renderer {
449450

450451
if (column?.detailRenderer) {
451452
switch (column.detailRenderer.toLowerCase()) {
452-
case 'multivaluedetailrenderer':
453-
renderer = d => <MultiValueRenderer data={d} />;
454-
break;
455453
case 'aliasrenderer':
456454
renderer = d => <AliasRenderer data={d} view="detail" />;
457455
break;
458456
case 'appendunits':
459-
renderer = d => <AppendUnits data={d} col={column} />;
457+
renderer = d => <AppendUnits col={column} data={d} />;
460458
break;
461459
case 'assayrunreference':
462460
renderer = d => <AssayRunReferenceRenderer data={d} />;
463461
break;
464-
case 'labelcolorrenderer':
465-
renderer = d => <LabelColorRenderer data={d} />;
462+
case 'expirationdatecolumnrenderer':
463+
renderer = d => <ExpirationDateColumnRenderer col={column} data={d} tableCell={false} />;
466464
break;
467465
case 'filecolumnrenderer':
468466
renderer = d => <FileColumnRenderer data={d} isFileLink={column.rangeURI === FILELINK_RANGE_URI} />;
469467
break;
470468
case 'foldercolumnrenderer':
471469
renderer = d => <FolderColumnRenderer data={d} />;
472470
break;
471+
case 'labelcolorrenderer':
472+
renderer = d => <LabelColorRenderer data={d} />;
473+
break;
474+
case 'multivaluedetailrenderer':
475+
renderer = d => <MultiValueRenderer data={d} />;
476+
break;
473477
case 'nolinkrenderer':
474478
renderer = d => <NoLinkRenderer data={d} />;
475479
break;
480+
case 'samplestatusrenderer':
481+
renderer = (d, r) => <SampleStatusRenderer row={r} />;
482+
break;
476483
case 'sampletypeimportaliasrenderer':
477484
renderer = d => <SampleTypeImportAliasRenderer data={d} />;
478485
break;
479486
case 'sourcetypeimportaliasrenderer':
480487
renderer = d => <SourceTypeImportAliasRenderer data={d} />;
481488
break;
482-
case 'samplestatusrenderer':
483-
renderer = (d, r) => <SampleStatusRenderer row={r} />;
484-
break;
485489
case 'userdetailsrenderer':
486490
renderer = d => <UserDetailsRenderer data={d} />;
487491
break;
488-
case 'expirationdatecolumnrenderer':
489-
renderer = d => <ExpirationDateColumnRenderer data={d} col={column} tableCell={false} />;
490-
break;
491492
default:
492493
break;
493494
}

0 commit comments

Comments
 (0)