From 5fbcbdae0a3ba2b0e07e0d395e5ebb6ec4c33865 Mon Sep 17 00:00:00 2001 From: XingY Date: Mon, 6 Oct 2025 20:59:18 -0700 Subject: [PATCH 01/13] Issue 52878: Attachment thumbnails from ancestor columns not rendered in Sample Type grid --- packages/components/releaseNotes/components.md | 5 +++++ .../src/internal/renderers/AncestorRenderer.tsx | 5 +++-- .../src/internal/renderers/DefaultRenderer.tsx | 3 +++ .../src/internal/renderers/MultiValueRenderer.tsx | 9 ++++++++- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/packages/components/releaseNotes/components.md b/packages/components/releaseNotes/components.md index 60283cb066..3fdb218283 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 6.X +*Released*: X October 2025 +- Issue 52878: Attachment thumbnails from ancestor columns not rendered in Sample Type grid + - Modify `AncestorRenderer` and `MultiValueRenderer` to handle file/attachment columns + ### version 6.62.8 *Released*: 3 October 2025 - Issue 53328: AssayDefinitionModel.hasLookup to only consider the first sample lookup column for assay import cases diff --git a/packages/components/src/internal/renderers/AncestorRenderer.tsx b/packages/components/src/internal/renderers/AncestorRenderer.tsx index a1e495cabf..94dd6f1b2d 100644 --- a/packages/components/src/internal/renderers/AncestorRenderer.tsx +++ b/packages/components/src/internal/renderers/AncestorRenderer.tsx @@ -22,9 +22,10 @@ export const ANCESTOR_LOOKUP_CONCEPT_URI = 'http://www.labkey.org/types#ancestor interface Props { data: Map; + col?: any; } -export const AncestorRenderer: FC = memo(({ data }) => { +export const AncestorRenderer: FC = memo(({ data, col }) => { if (Map.isMap(data) && data.size > 0) { const { displayValue, value } = data.toJS(); if (value < 0 && displayValue) { @@ -35,7 +36,7 @@ export const AncestorRenderer: FC = memo(({ data }) => { ); } - return ; + return ; } return null; diff --git a/packages/components/src/internal/renderers/DefaultRenderer.tsx b/packages/components/src/internal/renderers/DefaultRenderer.tsx index 76dbbb12e1..34d0ca9a15 100644 --- a/packages/components/src/internal/renderers/DefaultRenderer.tsx +++ b/packages/components/src/internal/renderers/DefaultRenderer.tsx @@ -24,6 +24,7 @@ import { isConditionalFormattingEnabled } from '../app/utils'; import { AppLink } from '../url/AppLink'; import { MultiValueRenderer } from './MultiValueRenderer'; +import { FileColumnRenderer } from './FileColumnRenderer'; interface Props { col?: QueryColumn; @@ -55,6 +56,8 @@ export const DefaultRenderer: FC = memo(({ col, data, noLink }) => { } else if (List.isList(data)) { // defensively return a MultiValueRenderer, this column likely wasn't declared properly as "multiValue" return ; + } else if (col?.type?.toLowerCase() === 'file' || col?.inputType?.toLowerCase() === 'file') { + return ; } else { if (isConditionalFormattingEnabled()) { style = getDataStyling(data); diff --git a/packages/components/src/internal/renderers/MultiValueRenderer.tsx b/packages/components/src/internal/renderers/MultiValueRenderer.tsx index 0c528f4a62..d8e069ee41 100644 --- a/packages/components/src/internal/renderers/MultiValueRenderer.tsx +++ b/packages/components/src/internal/renderers/MultiValueRenderer.tsx @@ -15,16 +15,23 @@ */ import React, { FC, Fragment, memo, ReactNode } from 'react'; import { Map } from 'immutable'; +import { QueryColumn } from '../../public/QueryColumn'; +import { FileColumnRenderer } from './FileColumnRenderer'; export interface MultiValueRendererProps { data: Map; + col?: QueryColumn; } -export const MultiValueRenderer: FC = memo(({ data }) => { +export const MultiValueRenderer: FC = memo(({ data, col }) => { if (!data || data.size === 0) { return null; } + if (data.size === 1 && (col?.type?.toLowerCase() === 'file' || col?.inputType?.toLowerCase() === 'file')) { + return ; + } + let i = -1; return (
From 78417d30de3d706555de9d27238e683dabf8de7d Mon Sep 17 00:00:00 2001 From: XingY Date: Mon, 6 Oct 2025 21:20:43 -0700 Subject: [PATCH 02/13] jest --- .../renderers/AncestorRenderer.test.tsx | 13 +++++++ .../internal/renderers/AncestorRenderer.tsx | 4 +-- .../internal/renderers/DefaultRenderer.tsx | 2 +- .../renderers/MultiValueRenderer.test.tsx | 35 +++++++++++++++++++ .../internal/renderers/MultiValueRenderer.tsx | 8 ++--- 5 files changed, 55 insertions(+), 7 deletions(-) diff --git a/packages/components/src/internal/renderers/AncestorRenderer.test.tsx b/packages/components/src/internal/renderers/AncestorRenderer.test.tsx index 1a18d5387e..ce943bbe1d 100644 --- a/packages/components/src/internal/renderers/AncestorRenderer.test.tsx +++ b/packages/components/src/internal/renderers/AncestorRenderer.test.tsx @@ -4,6 +4,7 @@ import { Map } from 'immutable'; import { render } from '@testing-library/react'; import { AncestorRenderer } from './AncestorRenderer'; +import { QueryColumn } from '../../public/QueryColumn'; describe('AncestorRenderer', () => { test('No data', () => { @@ -28,6 +29,18 @@ describe('AncestorRenderer', () => { expect(links).toHaveLength(1); expect(links[0].getAttribute('href')).toBe(data.url); expect(links[0].textContent).toBe(data.displayValue); + expect(document.querySelectorAll('.attachment-card')).toHaveLength(0); + }); + + test('positive value, and file type column', () => { + const data = { + value: 'a.txt', + displayValue: 'a.txt', + url: 'http://samples.org/Sample-123', + }; + render(); + expect(document.querySelectorAll('span.text-muted')).toHaveLength(0); + expect(document.querySelectorAll('.attachment-card')).toHaveLength(1); }); test('negative value', () => { diff --git a/packages/components/src/internal/renderers/AncestorRenderer.tsx b/packages/components/src/internal/renderers/AncestorRenderer.tsx index 94dd6f1b2d..bf6af3cd88 100644 --- a/packages/components/src/internal/renderers/AncestorRenderer.tsx +++ b/packages/components/src/internal/renderers/AncestorRenderer.tsx @@ -21,8 +21,8 @@ import { DefaultRenderer } from './DefaultRenderer'; export const ANCESTOR_LOOKUP_CONCEPT_URI = 'http://www.labkey.org/types#ancestorLookup'; interface Props { - data: Map; col?: any; + data: Map; } export const AncestorRenderer: FC = memo(({ data, col }) => { @@ -36,7 +36,7 @@ export const AncestorRenderer: FC = memo(({ data, col }) => { ); } - return ; + return ; } return null; diff --git a/packages/components/src/internal/renderers/DefaultRenderer.tsx b/packages/components/src/internal/renderers/DefaultRenderer.tsx index 34d0ca9a15..94f45a9f45 100644 --- a/packages/components/src/internal/renderers/DefaultRenderer.tsx +++ b/packages/components/src/internal/renderers/DefaultRenderer.tsx @@ -77,7 +77,7 @@ export const DefaultRenderer: FC = memo(({ col, data, noLink }) => { if (url && !noLink) { const targetBlank = data.get('urlTarget') === TARGET_BLANK; return ( - + {display} ); diff --git a/packages/components/src/internal/renderers/MultiValueRenderer.test.tsx b/packages/components/src/internal/renderers/MultiValueRenderer.test.tsx index 3e3a112be0..8150929401 100644 --- a/packages/components/src/internal/renderers/MultiValueRenderer.test.tsx +++ b/packages/components/src/internal/renderers/MultiValueRenderer.test.tsx @@ -4,6 +4,7 @@ import { fromJS, Map } from 'immutable'; import { render } from '@testing-library/react'; import { MultiValueRenderer } from './MultiValueRenderer'; +import { QueryColumn } from '../../public/QueryColumn'; describe('MultiValueRenderer', () => { test('empty data', () => { @@ -23,6 +24,20 @@ describe('MultiValueRenderer', () => { expect(document.body.textContent).toBe('24'); }); + test('data shapes, value, file column', () => { + const data = fromJS({24: {value: 'a.txt', url: 'a.txt' }}); + render(); + expect(document.body.textContent).toBe('a.txt'); + expect(document.querySelectorAll('.attachment-card')).toHaveLength(0); + }); + + test('data list, value, file column', () => { + const data = fromJS([{value: 'a.txt', url: 'a.txt' }]); + render(); + expect(document.body.textContent).toBe('a.txtDownload'); + expect(document.querySelectorAll('.attachment-card')).toHaveLength(1); + }); + test('data shapes, displayValue', () => { const data = fromJS({ 24: { displayValue: 'Griffey', value: 24 } }); render(); @@ -59,6 +74,26 @@ describe('MultiValueRenderer', () => { expect(link[0].getAttribute('href')).toEqual('https://www.mariners.com/ichiro'); }); + test('multiple values, file column', () => { + const data = fromJS({ + 11: { value: 'a.txt', url: 'a.txt'}, + 24: { value: 'b.txt', url: 'b.txt' }, + 51: { value: 'c.txt', url: 'c.txt' }, + }); + render(); + const spans = document.querySelectorAll('span'); + expect(spans.length).toBe(3); + expect(spans[0].textContent).toEqual('a.txt'); + expect(spans[1].textContent).toEqual(', b.txt'); + expect(spans[2].textContent).toEqual(', c.txt'); + + const link = spans[2].querySelectorAll('a'); + expect(link).toHaveLength(1); + expect(link[0].getAttribute('href')).toEqual('c.txt'); + + expect(document.querySelectorAll('.attachment-card')).toHaveLength(0); + }); + test('non-Map values', () => { const data = Map({ 11: [], diff --git a/packages/components/src/internal/renderers/MultiValueRenderer.tsx b/packages/components/src/internal/renderers/MultiValueRenderer.tsx index d8e069ee41..c44830b01b 100644 --- a/packages/components/src/internal/renderers/MultiValueRenderer.tsx +++ b/packages/components/src/internal/renderers/MultiValueRenderer.tsx @@ -14,13 +14,13 @@ * limitations under the License. */ import React, { FC, Fragment, memo, ReactNode } from 'react'; -import { Map } from 'immutable'; +import { List, Map } from 'immutable'; import { QueryColumn } from '../../public/QueryColumn'; import { FileColumnRenderer } from './FileColumnRenderer'; export interface MultiValueRendererProps { - data: Map; col?: QueryColumn; + data: Map; } export const MultiValueRenderer: FC = memo(({ data, col }) => { @@ -28,7 +28,7 @@ export const MultiValueRenderer: FC = memo(({ data, col return null; } - if (data.size === 1 && (col?.type?.toLowerCase() === 'file' || col?.inputType?.toLowerCase() === 'file')) { + if (List.isList(data) && data.size === 1 && (col?.type?.toLowerCase() === 'file' || col?.inputType?.toLowerCase() === 'file')) { return ; } @@ -65,7 +65,7 @@ export const MultiValueRenderer: FC = memo(({ data, col return ( // IntelliJ mistakenly presumes that key is an index. // In fact, it is the key of the map which is unique. - // eslint-disable-next-line react/no-array-index-key + {++i > 0 ? ', ' : ''} {url ? {text} : text} From 3e5a1d4d0aa05332ea3e414f4603ed3996796881 Mon Sep 17 00:00:00 2001 From: XingY Date: Mon, 6 Oct 2025 21:33:18 -0700 Subject: [PATCH 03/13] Issue 52878: Attachment thumbnails from ancestor/lineage columns not rendered grids --- packages/components/package-lock.json | 4 ++-- packages/components/package.json | 2 +- .../src/internal/renderers/AncestorRenderer.test.tsx | 2 +- .../internal/renderers/MultiValueRenderer.test.tsx | 12 ++++++------ .../src/internal/renderers/MultiValueRenderer.tsx | 6 +++++- 5 files changed, 15 insertions(+), 11 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index 7c14cb08c1..e17b5315e3 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "6.62.8", + "version": "6.62.9-fb-issue52878.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.62.8", + "version": "6.62.9-fb-issue52878.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 4089db5bfd..a671ba31dd 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.62.8", + "version": "6.62.9-fb-issue52878.1", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ diff --git a/packages/components/src/internal/renderers/AncestorRenderer.test.tsx b/packages/components/src/internal/renderers/AncestorRenderer.test.tsx index ce943bbe1d..f075bb8c9c 100644 --- a/packages/components/src/internal/renderers/AncestorRenderer.test.tsx +++ b/packages/components/src/internal/renderers/AncestorRenderer.test.tsx @@ -38,7 +38,7 @@ describe('AncestorRenderer', () => { displayValue: 'a.txt', url: 'http://samples.org/Sample-123', }; - render(); + render(); expect(document.querySelectorAll('span.text-muted')).toHaveLength(0); expect(document.querySelectorAll('.attachment-card')).toHaveLength(1); }); diff --git a/packages/components/src/internal/renderers/MultiValueRenderer.test.tsx b/packages/components/src/internal/renderers/MultiValueRenderer.test.tsx index 8150929401..85846dad2a 100644 --- a/packages/components/src/internal/renderers/MultiValueRenderer.test.tsx +++ b/packages/components/src/internal/renderers/MultiValueRenderer.test.tsx @@ -25,15 +25,15 @@ describe('MultiValueRenderer', () => { }); test('data shapes, value, file column', () => { - const data = fromJS({24: {value: 'a.txt', url: 'a.txt' }}); - render(); + const data = fromJS({ 24: { value: 'a.txt', url: 'a.txt' } }); + render(); expect(document.body.textContent).toBe('a.txt'); expect(document.querySelectorAll('.attachment-card')).toHaveLength(0); }); test('data list, value, file column', () => { - const data = fromJS([{value: 'a.txt', url: 'a.txt' }]); - render(); + const data = fromJS([{ value: 'a.txt', url: 'a.txt' }]); + render(); expect(document.body.textContent).toBe('a.txtDownload'); expect(document.querySelectorAll('.attachment-card')).toHaveLength(1); }); @@ -76,11 +76,11 @@ describe('MultiValueRenderer', () => { test('multiple values, file column', () => { const data = fromJS({ - 11: { value: 'a.txt', url: 'a.txt'}, + 11: { value: 'a.txt', url: 'a.txt' }, 24: { value: 'b.txt', url: 'b.txt' }, 51: { value: 'c.txt', url: 'c.txt' }, }); - render(); + render(); const spans = document.querySelectorAll('span'); expect(spans.length).toBe(3); expect(spans[0].textContent).toEqual('a.txt'); diff --git a/packages/components/src/internal/renderers/MultiValueRenderer.tsx b/packages/components/src/internal/renderers/MultiValueRenderer.tsx index c44830b01b..cde9ed4e67 100644 --- a/packages/components/src/internal/renderers/MultiValueRenderer.tsx +++ b/packages/components/src/internal/renderers/MultiValueRenderer.tsx @@ -28,7 +28,11 @@ export const MultiValueRenderer: FC = memo(({ data, col return null; } - if (List.isList(data) && data.size === 1 && (col?.type?.toLowerCase() === 'file' || col?.inputType?.toLowerCase() === 'file')) { + if ( + List.isList(data) && + data.size === 1 && + (col?.type?.toLowerCase() === 'file' || col?.inputType?.toLowerCase() === 'file') + ) { return ; } From 4156c7c166a519621ebb95fb0e8b7398bd8d10a6 Mon Sep 17 00:00:00 2001 From: XingY Date: Tue, 7 Oct 2025 15:23:43 -0700 Subject: [PATCH 04/13] Merge branch 'develop' into fb_issue52878 # Conflicts: # packages/components/package-lock.json # packages/components/package.json # packages/components/releaseNotes/components.md --- packages/components/package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index a7b47b15fb..dc83532404 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "6.63.0", + "version": "6.63.1-fb-issue52878.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.63.0", + "version": "6.63.1-fb-issue52878.1", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", From c7f1121ff307ece1563577836a81fce577595cf4 Mon Sep 17 00:00:00 2001 From: XingY Date: Tue, 7 Oct 2025 16:16:39 -0700 Subject: [PATCH 05/13] hide aliquot only fields from parent panel --- .../components/src/internal/components/samples/actions.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/components/src/internal/components/samples/actions.ts b/packages/components/src/internal/components/samples/actions.ts index 8006b6538b..e802a77613 100644 --- a/packages/components/src/internal/components/samples/actions.ts +++ b/packages/components/src/internal/components/samples/actions.ts @@ -216,6 +216,7 @@ export function getSelectionLineageData( export interface GroupedSampleDisplayColumns { aliquotHeaderDisplayColumns: QueryColumn[]; + aliquotOnlyColumns: string[]; // should hide from parent panel displayColumns: QueryColumn[]; editColumns: QueryColumn[]; } @@ -239,6 +240,7 @@ export function getGroupedSampleDisplayColumns( const editColumns = []; const displayColumns = []; const aliquotHeaderDisplayColumns = []; + const aliquotOnlyColumns = []; allDisplayColumns.forEach(col => { const lcFieldKey = col.fieldKey.toLowerCase(); @@ -259,6 +261,8 @@ export function getGroupedSampleDisplayColumns( sampleTypeDomainFields.independentFields.indexOf(lcFieldKey) > -1 ) { aliquotHeaderDisplayColumns.push(col); + if (sampleTypeDomainFields.aliquotFields.indexOf(lcFieldKey) > -1) + aliquotOnlyColumns.push(col.fieldKey); } } else { if (sampleTypeDomainFields.aliquotFields.indexOf(lcFieldKey) === -1) { @@ -294,6 +298,7 @@ export function getGroupedSampleDisplayColumns( return { aliquotHeaderDisplayColumns, + aliquotOnlyColumns, displayColumns, editColumns, }; From ee9bde11c4024d33eaa6fb95659d23bef27da6bb Mon Sep 17 00:00:00 2001 From: XingY Date: Tue, 7 Oct 2025 20:36:05 -0700 Subject: [PATCH 06/13] Selenium test for 52914 and 52878 --- packages/components/package-lock.json | 4 ++-- packages/components/package.json | 2 +- .../components/src/internal/renderers/DefaultRenderer.tsx | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index dc83532404..98ea8cdda1 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "6.63.1-fb-issue52878.1", + "version": "6.63.1-fb-issue52878.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.63.1-fb-issue52878.1", + "version": "6.63.1-fb-issue52878.3", "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 bb3c077ebe..001d065e81 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.63.1-fb-issue52878.1", + "version": "6.63.1-fb-issue52878.3", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ diff --git a/packages/components/src/internal/renderers/DefaultRenderer.tsx b/packages/components/src/internal/renderers/DefaultRenderer.tsx index 94f45a9f45..ebe2c54502 100644 --- a/packages/components/src/internal/renderers/DefaultRenderer.tsx +++ b/packages/components/src/internal/renderers/DefaultRenderer.tsx @@ -55,7 +55,7 @@ export const DefaultRenderer: FC = memo(({ col, data, noLink }) => { display = data ? 'true' : 'false'; } else if (List.isList(data)) { // defensively return a MultiValueRenderer, this column likely wasn't declared properly as "multiValue" - return ; + return ; } else if (col?.type?.toLowerCase() === 'file' || col?.inputType?.toLowerCase() === 'file') { return ; } else { From 616e55a8cec3009909fa52af4978b226b7f9b661 Mon Sep 17 00:00:00 2001 From: XingY Date: Wed, 8 Oct 2025 10:02:22 -0700 Subject: [PATCH 07/13] fix user avatar --- .../components/src/internal/renderers/DefaultRenderer.tsx | 6 ++++-- .../src/internal/renderers/FileColumnRenderer.tsx | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/components/src/internal/renderers/DefaultRenderer.tsx b/packages/components/src/internal/renderers/DefaultRenderer.tsx index ebe2c54502..3455a40cda 100644 --- a/packages/components/src/internal/renderers/DefaultRenderer.tsx +++ b/packages/components/src/internal/renderers/DefaultRenderer.tsx @@ -56,8 +56,6 @@ export const DefaultRenderer: FC = memo(({ col, data, noLink }) => { } else if (List.isList(data)) { // defensively return a MultiValueRenderer, this column likely wasn't declared properly as "multiValue" return ; - } else if (col?.type?.toLowerCase() === 'file' || col?.inputType?.toLowerCase() === 'file') { - return ; } else { if (isConditionalFormattingEnabled()) { style = getDataStyling(data); @@ -65,6 +63,10 @@ export const DefaultRenderer: FC = memo(({ col, data, noLink }) => { className += ' status-pill'; } } + + if (!style && (col?.type?.toLowerCase() === 'file' || col?.inputType?.toLowerCase() === 'file')) + return ; + if (data.has('formattedValue')) { display = data.get('formattedValue'); } else { diff --git a/packages/components/src/internal/renderers/FileColumnRenderer.tsx b/packages/components/src/internal/renderers/FileColumnRenderer.tsx index 8cb79aca74..88778d82e6 100644 --- a/packages/components/src/internal/renderers/FileColumnRenderer.tsx +++ b/packages/components/src/internal/renderers/FileColumnRenderer.tsx @@ -56,11 +56,11 @@ export const getAttachmentCardProp = ( let url, value, display; if (Iterable.isIterable(data)) { url = data.get('url'); - value = data.get('value'); + value = data.get('value')?.toString(); display = getFileDisplayValue(data.get('displayValue') ?? value); } else { url = caseInsensitive(data, 'url'); - value = caseInsensitive(data, 'value'); + value = caseInsensitive(data, 'value')?.toString(); display = getFileDisplayValue(caseInsensitive(data, 'displayValue') ?? value); } const titleStyle = isConditionalFormattingEnabled() ? getDataStyling(data) : undefined; From d9b9e61082a9c778a279a0f70af943f5cba52261 Mon Sep 17 00:00:00 2001 From: XingY Date: Fri, 10 Oct 2025 09:47:28 -0700 Subject: [PATCH 08/13] Use FileInput for user avatar in detail view --- .../src/internal/renderers/DefaultRenderer.tsx | 9 ++++----- .../src/internal/renderers/MultiValueRenderer.tsx | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/components/src/internal/renderers/DefaultRenderer.tsx b/packages/components/src/internal/renderers/DefaultRenderer.tsx index 3455a40cda..d101755d8a 100644 --- a/packages/components/src/internal/renderers/DefaultRenderer.tsx +++ b/packages/components/src/internal/renderers/DefaultRenderer.tsx @@ -56,17 +56,16 @@ export const DefaultRenderer: FC = memo(({ col, data, noLink }) => { } else if (List.isList(data)) { // defensively return a MultiValueRenderer, this column likely wasn't declared properly as "multiValue" return ; - } else { + } if ((col?.isFileInput)) { + return ; + } + else { if (isConditionalFormattingEnabled()) { style = getDataStyling(data); if (style?.backgroundColor) { className += ' status-pill'; } } - - if (!style && (col?.type?.toLowerCase() === 'file' || col?.inputType?.toLowerCase() === 'file')) - return ; - if (data.has('formattedValue')) { display = data.get('formattedValue'); } else { diff --git a/packages/components/src/internal/renderers/MultiValueRenderer.tsx b/packages/components/src/internal/renderers/MultiValueRenderer.tsx index cde9ed4e67..58382d7b57 100644 --- a/packages/components/src/internal/renderers/MultiValueRenderer.tsx +++ b/packages/components/src/internal/renderers/MultiValueRenderer.tsx @@ -31,7 +31,7 @@ export const MultiValueRenderer: FC = memo(({ data, col if ( List.isList(data) && data.size === 1 && - (col?.type?.toLowerCase() === 'file' || col?.inputType?.toLowerCase() === 'file') + (col?.isFileInput) ) { return ; } From 5d86b05f659cdba773468f6816bf59c5557fe34a Mon Sep 17 00:00:00 2001 From: XingY Date: Fri, 10 Oct 2025 09:49:26 -0700 Subject: [PATCH 09/13] Use FileInput for user avatar in detail view --- 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 afae23f4ab..c8c69171b3 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "6.64.2-fb-issue52878.1", + "version": "6.64.2-fb-issue52878.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.64.2-fb-issue52878.1", + "version": "6.64.2-fb-issue52878.2", "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 ae744f6808..38eb6f00b6 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.64.2-fb-issue52878.1", + "version": "6.64.2-fb-issue52878.2", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ From d109d7bf299d0a8c4543488c6e086bad707c4580 Mon Sep 17 00:00:00 2001 From: XingY Date: Fri, 10 Oct 2025 10:58:50 -0700 Subject: [PATCH 10/13] Fix else if --- .../src/internal/renderers/AncestorRenderer.test.tsx | 2 +- .../components/src/internal/renderers/DefaultRenderer.tsx | 2 +- .../src/internal/renderers/MultiValueRenderer.test.tsx | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/components/src/internal/renderers/AncestorRenderer.test.tsx b/packages/components/src/internal/renderers/AncestorRenderer.test.tsx index f075bb8c9c..6d3c12baff 100644 --- a/packages/components/src/internal/renderers/AncestorRenderer.test.tsx +++ b/packages/components/src/internal/renderers/AncestorRenderer.test.tsx @@ -38,7 +38,7 @@ describe('AncestorRenderer', () => { displayValue: 'a.txt', url: 'http://samples.org/Sample-123', }; - render(); + render(); expect(document.querySelectorAll('span.text-muted')).toHaveLength(0); expect(document.querySelectorAll('.attachment-card')).toHaveLength(1); }); diff --git a/packages/components/src/internal/renderers/DefaultRenderer.tsx b/packages/components/src/internal/renderers/DefaultRenderer.tsx index d101755d8a..2a50b94266 100644 --- a/packages/components/src/internal/renderers/DefaultRenderer.tsx +++ b/packages/components/src/internal/renderers/DefaultRenderer.tsx @@ -56,7 +56,7 @@ export const DefaultRenderer: FC = memo(({ col, data, noLink }) => { } else if (List.isList(data)) { // defensively return a MultiValueRenderer, this column likely wasn't declared properly as "multiValue" return ; - } if ((col?.isFileInput)) { + } else if ((col?.isFileInput)) { return ; } else { diff --git a/packages/components/src/internal/renderers/MultiValueRenderer.test.tsx b/packages/components/src/internal/renderers/MultiValueRenderer.test.tsx index 85846dad2a..c73dc6a20d 100644 --- a/packages/components/src/internal/renderers/MultiValueRenderer.test.tsx +++ b/packages/components/src/internal/renderers/MultiValueRenderer.test.tsx @@ -26,14 +26,14 @@ describe('MultiValueRenderer', () => { test('data shapes, value, file column', () => { const data = fromJS({ 24: { value: 'a.txt', url: 'a.txt' } }); - render(); + render(); expect(document.body.textContent).toBe('a.txt'); expect(document.querySelectorAll('.attachment-card')).toHaveLength(0); }); test('data list, value, file column', () => { const data = fromJS([{ value: 'a.txt', url: 'a.txt' }]); - render(); + render(); expect(document.body.textContent).toBe('a.txtDownload'); expect(document.querySelectorAll('.attachment-card')).toHaveLength(1); }); @@ -80,7 +80,7 @@ describe('MultiValueRenderer', () => { 24: { value: 'b.txt', url: 'b.txt' }, 51: { value: 'c.txt', url: 'c.txt' }, }); - render(); + render(); const spans = document.querySelectorAll('span'); expect(spans.length).toBe(3); expect(spans[0].textContent).toEqual('a.txt'); From be7736db8aa15082a1fca3da0bdf635d22f3b859 Mon Sep 17 00:00:00 2001 From: XingY Date: Fri, 10 Oct 2025 11:01:40 -0700 Subject: [PATCH 11/13] Merge branch 'develop' into fb_issue52878 # Conflicts: # biologics/package-lock.json # biologics/package.json # inventory/package-lock.json # inventory/package.json # sampleManagement/package-lock.json # sampleManagement/package.json --- 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 c8c69171b3..533be853fa 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "6.64.2-fb-issue52878.2", + "version": "6.64.2-fb-issue52878.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.64.2-fb-issue52878.2", + "version": "6.64.2-fb-issue52878.3", "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 38eb6f00b6..f885c4ed8a 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.64.2-fb-issue52878.2", + "version": "6.64.2-fb-issue52878.3", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ From 3889647b1f315a04687cd574ab085d476d2a0125 Mon Sep 17 00:00:00 2001 From: Xing Yang <5168106+XingY@users.noreply.github.com> Date: Fri, 10 Oct 2025 12:05:11 -0700 Subject: [PATCH 12/13] Update packages/components/src/internal/renderers/DefaultRenderer.tsx Co-authored-by: Cory Nathe --- packages/components/src/internal/renderers/DefaultRenderer.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/components/src/internal/renderers/DefaultRenderer.tsx b/packages/components/src/internal/renderers/DefaultRenderer.tsx index 2a50b94266..4c34ad9057 100644 --- a/packages/components/src/internal/renderers/DefaultRenderer.tsx +++ b/packages/components/src/internal/renderers/DefaultRenderer.tsx @@ -56,7 +56,7 @@ export const DefaultRenderer: FC = memo(({ col, data, noLink }) => { } else if (List.isList(data)) { // defensively return a MultiValueRenderer, this column likely wasn't declared properly as "multiValue" return ; - } else if ((col?.isFileInput)) { + } else if (col?.isFileInput) { return ; } else { From 1791ccfc2406447d79dc8328f18ecb1749923ecb Mon Sep 17 00:00:00 2001 From: XingY Date: Fri, 10 Oct 2025 15:24:48 -0700 Subject: [PATCH 13/13] publish --- packages/components/package-lock.json | 4 ++-- packages/components/package.json | 2 +- packages/components/releaseNotes/components.md | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index 533be853fa..f8213951c2 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "6.64.2-fb-issue52878.3", + "version": "6.64.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "6.64.2-fb-issue52878.3", + "version": "6.64.2", "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 f885c4ed8a..01ba679eb6 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "6.64.2-fb-issue52878.3", + "version": "6.64.2", "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 fee9042d4c..f3fa59c2b2 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 6.X -*Released*: X October 2025 +### version 6.64.2 +*Released*: 10 October 2025 - Issue 52878: Attachment thumbnails from ancestor columns not rendered in Sample Type grid - Modify `AncestorRenderer` and `MultiValueRenderer` to handle file/attachment columns