From c3730ec83f7ab99a0fc18e5a837d346dd2e73b00 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Fri, 26 Dec 2025 15:51:35 -0800 Subject: [PATCH 01/15] Bump @labkey/api --- packages/components/package-lock.json | 8 ++++---- packages/components/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index 7610e79326..905530f0ac 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -10,7 +10,7 @@ "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", - "@labkey/api": "1.44.0", + "@labkey/api": "1.44.1-fb-lineage-441.0", "@testing-library/dom": "~10.4.1", "@testing-library/jest-dom": "~6.9.1", "@testing-library/react": "~16.3.0", @@ -3535,9 +3535,9 @@ } }, "node_modules/@labkey/api": { - "version": "1.44.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.44.0.tgz", - "integrity": "sha512-qfHSWENWN2E1KTRACDj/Qq4Rq/tq8KIr5l6XOnMGLEoepUe8DneAnfcIVD5239oxwFDxMLEFCH83EKeat0C/9g==", + "version": "1.44.1-fb-lineage-441.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.44.1-fb-lineage-441.0.tgz", + "integrity": "sha512-lM4LPqqUHQUe/zFWwpJr/1aiidACrHVlEurtoU3A2q4zYP19tAu8ehyhUH80s7y3pCwwzkAUBGuaBbfgpAik7w==", "license": "Apache-2.0" }, "node_modules/@labkey/build": { diff --git a/packages/components/package.json b/packages/components/package.json index 84725424be..e71442c829 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -50,7 +50,7 @@ "homepage": "https://github.com/LabKey/labkey-ui-components#readme", "dependencies": { "@hello-pangea/dnd": "18.0.1", - "@labkey/api": "1.44.0", + "@labkey/api": "1.44.1-fb-lineage-441.0", "@testing-library/dom": "~10.4.1", "@testing-library/jest-dom": "~6.9.1", "@testing-library/react": "~16.3.0", From f1c0b4a8010a6816c4f26c783082e637f580fd98 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Sat, 27 Dec 2025 16:00:29 -0800 Subject: [PATCH 02/15] Lineage: support restricted nodes --- .../src/internal/components/lineage/models.ts | 5 ++++ .../components/lineage/node/LineageDetail.tsx | 15 ++++++++---- .../lineage/node/LineageNodeDetail.tsx | 23 +++++++++++-------- .../src/internal/components/lineage/utils.ts | 4 ++++ .../src/internal/url/URLResolver.ts | 4 ++++ 5 files changed, 36 insertions(+), 15 deletions(-) diff --git a/packages/components/src/internal/components/lineage/models.ts b/packages/components/src/internal/components/lineage/models.ts index 43cb850b4f..46936ac84f 100644 --- a/packages/components/src/internal/components/lineage/models.ts +++ b/packages/components/src/internal/components/lineage/models.ts @@ -287,6 +287,7 @@ export class LineageNode pkFilters: undefined, properties: undefined, queryName: undefined, + restricted: undefined, schemaName: undefined, steps: undefined, type: undefined, @@ -327,6 +328,7 @@ export class LineageNode declare pkFilters: Experiment.LineagePKFilter[]; declare properties: any; declare queryName: string; + declare restricted: boolean; declare schemaName: string; declare steps: List; declare type: string; @@ -352,6 +354,9 @@ export class LineageNode ...{ children: LineageLink.createList(values.children), lsid, + name: values.restricted + ? `Restricted ${values.type === 'Data' ? 'Source' : values.type}` + : values.name, parents: LineageLink.createList(values.parents), steps: List(values.steps?.map(stepProps => new LineageRunStep(stepProps))), }, diff --git a/packages/components/src/internal/components/lineage/node/LineageDetail.tsx b/packages/components/src/internal/components/lineage/node/LineageDetail.tsx index 6b9b7d7ae6..a1ff6a7255 100644 --- a/packages/components/src/internal/components/lineage/node/LineageDetail.tsx +++ b/packages/components/src/internal/components/lineage/node/LineageDetail.tsx @@ -45,8 +45,10 @@ LineageDetailImpl.displayName = 'LineageDetailImpl'; const LineageDetailWithQueryModels = withQueryModels(LineageDetailImpl); export const LineageDetail: FC = memo(({ item }) => { - const queryConfigs = useMemo( - () => ({ + const queryConfigs = useMemo(() => { + if (item.restricted) return {}; + + return { model: { baseFilters: item.pkFilters.map(pkFilter => Filter.create(pkFilter.fieldKey, pkFilter.value)), containerPath: item.containerPath, @@ -55,9 +57,12 @@ export const LineageDetail: FC = memo(({ item }) => { // Must specify '*' columns be requested to resolve "properties" columns requiredColumns: ['*', SAMPLE_STATE_COLOR_COLUMN_NAME, SAMPLE_STATE_TYPE_COLUMN_NAME], }, - }), - [item] - ); + }; + }, [item]); + + if (item.restricted) { + return This {item.name} cannot be viewed.; + } // providing "key" to allow for reload on lsid change return ; diff --git a/packages/components/src/internal/components/lineage/node/LineageNodeDetail.tsx b/packages/components/src/internal/components/lineage/node/LineageNodeDetail.tsx index ff9e1708f3..366fe3fa05 100644 --- a/packages/components/src/internal/components/lineage/node/LineageNodeDetail.tsx +++ b/packages/components/src/internal/components/lineage/node/LineageNodeDetail.tsx @@ -65,29 +65,32 @@ export class LineageNodeDetail extends PureComponent this.selectStep(undefined)} stepIdx={stepIdx} />; } const nodeDetails = ( <> - + {!restricted && ( + + )} ); return (
- {node.isRun ? ( + {isRun && !restricted ? ( {nodeDetails} diff --git a/packages/components/src/internal/components/lineage/utils.ts b/packages/components/src/internal/components/lineage/utils.ts index 8f4edc23ad..b596f55b19 100644 --- a/packages/components/src/internal/components/lineage/utils.ts +++ b/packages/components/src/internal/components/lineage/utils.ts @@ -105,6 +105,8 @@ export function resolveIconAndShapeForNode( if (queryInfoIconURL && queryInfoIconURL !== DEFAULT_ICON_URL) { iconURL = queryInfoIconURL.toLowerCase(); + } else if (item?.restricted) { + iconURL = 'lock'; } else if (item) { const schemaName = item.schemaName?.toLowerCase() ?? ''; const queryName = item.queryName?.toLowerCase() ?? ''; @@ -140,6 +142,8 @@ export function resolveIconAndShapeForNode( imageShape = 'image'; } + console.log('iconURL', imageFromIdentifier(iconURL, isSeed, false)); + return { iconURL, image: imageFromIdentifier(iconURL, isSeed, false), diff --git a/packages/components/src/internal/url/URLResolver.ts b/packages/components/src/internal/url/URLResolver.ts index d6aded2486..0149ab0ef9 100644 --- a/packages/components/src/internal/url/URLResolver.ts +++ b/packages/components/src/internal/url/URLResolver.ts @@ -618,6 +618,10 @@ export class URLResolver { overview: item.url, }; + if (item.restricted) { + return metadata; + } + if (item.type && acceptedTypes.indexOf(item.type) >= 0 && (item.queryName || item.cpasType || item.lsid)) { // Issue 48836: Resolve lineage item URL from queryName if available let name = item.queryName; From 94116effc7b3ec98cde146a1f9148d60229c10a9 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Sun, 28 Dec 2025 10:30:51 -0800 Subject: [PATCH 03/15] Functional components --- .../lineage/node/LineageNodeDetail.tsx | 198 +++++++----------- .../lineage/node/LineageNodeDetailFactory.tsx | 104 +++++---- .../lineage/node/NodeDetailHeader.tsx | 91 ++++---- 3 files changed, 172 insertions(+), 221 deletions(-) diff --git a/packages/components/src/internal/components/lineage/node/LineageNodeDetail.tsx b/packages/components/src/internal/components/lineage/node/LineageNodeDetail.tsx index 366fe3fa05..be76843b96 100644 --- a/packages/components/src/internal/components/lineage/node/LineageNodeDetail.tsx +++ b/packages/components/src/internal/components/lineage/node/LineageNodeDetail.tsx @@ -2,7 +2,7 @@ * Copyright (c) 2016-2020 LabKey Corporation. All rights reserved. No portion of this work may be reproduced in * any form or by any electronic or mechanical means without written permission from LabKey Corporation. */ -import React, { FC, memo, PureComponent, ReactNode, useCallback, useMemo, useState } from 'react'; +import React, { FC, memo, ReactNode, useCallback, useMemo, useState } from 'react'; import { List } from 'immutable'; import { Tab, Tabs } from '../../../Tabs'; @@ -12,6 +12,7 @@ import { isAliquotNode, LineageIOWithMetadata, LineageNode, + LineageNodeCollection, LineageNodeCollectionByType, } from '../models'; import { LineageOptions } from '../types'; @@ -32,81 +33,53 @@ interface LineageNodeDetailProps { seed: string; } -interface LineageNodeDetailState { - stepIdx: number; - tabKey: string; -} - -const initialState: LineageNodeDetailState = { - stepIdx: undefined, - tabKey: 'details', -}; - -export class LineageNodeDetail extends PureComponent { - readonly state: LineageNodeDetailState = initialState; - - componentDidUpdate(prevProps: Readonly): void { - const prevNode = prevProps.node; - const { node } = this.props; +export const LineageNodeDetail: FC = memo(props => { + const { seed, node, highlightNode, lineageOptions } = props; + const { isRun, restricted } = node; + const [stepIdx, setStepIdx] = useState(undefined); + const [tabKey, setTabKey] = useState('details'); + const onBack = useCallback(() => setStepIdx(undefined), []); - if ((prevNode.isRun || node.isRun) && prevNode.lsid !== node.lsid) { - this.setState(initialState); - } + if (isRun && stepIdx !== undefined) { + return ; } - changeTab = (tabKey: string): void => { - this.setState({ tabKey }); - }; - - selectStep = (stepIdx: number): void => { - this.setState({ stepIdx }); - }; - - render(): ReactNode { - const { seed, node, highlightNode, lineageOptions } = this.props; - const { stepIdx, tabKey } = this.state; - const { isRun, restricted } = node; - - if (isRun && stepIdx !== undefined) { - return this.selectStep(undefined)} stepIdx={stepIdx} />; - } - - const nodeDetails = ( - <> - - {!restricted && ( - - )} - - ); - - return ( -
- - {isRun && !restricted ? ( - - - {nodeDetails} - - - - - - - ) : ( - nodeDetails - )} -
- ); - } -} + const nodeDetails = ( + <> + + {!restricted && ( + + )} + + ); + + return ( +
+ + {isRun && !restricted ? ( + + + {nodeDetails} + + + + + + + ) : ( + nodeDetails + )} +
+ ); +}); +LineageNodeDetail.displayName = 'LineageNodeDetail'; interface ClusterNodeDetailProps { highlightNode?: string; @@ -116,52 +89,43 @@ interface ClusterNodeDetailProps { parentNodeName?: string; } -export class ClusterNodeDetail extends PureComponent { - static getGroupDisplayName(nodesByType, groupName, parentNodeName?) { - const group = nodesByType[groupName]; - const isAliquot = isAliquotNode(group); - const aliquotDisplayName = (parentNodeName ? parentNodeName + ' ' : '') + 'Aliquots'; - return isAliquot ? aliquotDisplayName : group.displayType; - } +function getGroupDisplayName(nodeCollection: LineageNodeCollection, parentNodeName?: string): string { + if (isAliquotNode(nodeCollection)) return (parentNodeName ? parentNodeName + ' ' : '') + 'Aliquots'; + return nodeCollection.displayType; +} - render(): ReactNode { - const { highlightNode, nodes, options, parentNodeName } = this.props; - - const nodesByType = this.props.nodesByType ?? createLineageNodeCollections(nodes, options); - const groups = Object.keys(nodesByType).sort(); - - let iconURL; - let title; - if (groups.length === 1) { - title = nodes.length + ' ' + ClusterNodeDetail.getGroupDisplayName(nodesByType, groups[0]); - iconURL = nodes[0].iconProps.iconURL; - } else { - title = nodes.length + ' items of different types'; - iconURL = 'default'; - } - - return ( -
- - {groups.map(groupName => { - const groupDisplayName = ClusterNodeDetail.getGroupDisplayName( - nodesByType, - groupName, - parentNodeName - ); - return ( - - ); - })} -
- ); +export const ClusterNodeDetail: FC = memo(props => { + const { highlightNode, nodes, options, parentNodeName } = props; + const { groups, nodesByType } = useMemo(() => { + const nodesByType = props.nodesByType ?? createLineageNodeCollections(nodes, options); + return { groups: Object.keys(nodesByType).sort(), nodesByType }; + }, [nodes, options, props.nodesByType]); + + let iconURL: string; + let title: ReactNode; + if (groups.length === 1) { + title = nodes.length + ' ' + getGroupDisplayName(nodesByType[groups[0]]); + iconURL = nodes[0].iconProps.iconURL; + } else { + title = nodes.length + ' items of different types'; + iconURL = 'default'; } -} + + return ( +
+ + {groups.map(groupName => ( + + ))} +
+ ); +}); +ClusterNodeDetail.displayName = 'ClusterNodeDetail'; interface RunStepNodeDetailProps { node: LineageNode; diff --git a/packages/components/src/internal/components/lineage/node/LineageNodeDetailFactory.tsx b/packages/components/src/internal/components/lineage/node/LineageNodeDetailFactory.tsx index 4945cdd116..00971e5185 100644 --- a/packages/components/src/internal/components/lineage/node/LineageNodeDetailFactory.tsx +++ b/packages/components/src/internal/components/lineage/node/LineageNodeDetailFactory.tsx @@ -1,4 +1,4 @@ -import React, { PureComponent, ReactNode } from 'react'; +import React, { FC, memo } from 'react'; import { LineageOptions } from '../types'; import { isBasicNode, isClusterNode, isCombinedNode, Lineage, VisGraphNodeType } from '../models'; @@ -14,68 +14,62 @@ export interface LineageNodeDetailFactoryProps { selectedNodes: VisGraphNodeType[]; } -export class LineageNodeDetailFactory extends PureComponent { - render(): ReactNode { - const { highlightNode, lineage, lineageOptions, selectedNodes } = this.props; +export const LineageNodeDetailFactory: FC = memo(props => { + const { highlightNode, lineage, lineageOptions, selectedNodes } = props; - if (!lineage || lineage.error) { - return null; - } + if (!lineage || lineage.error) return null; - if (!lineage.isLoaded()) { - // Render selected node if seed has been pre-fetched - if (lineage.isSeedLoaded()) { - return ( - - ); - } + if (!lineage.isLoaded()) { + // Render selected node if seed has been pre-fetched + if (!lineage.isSeedLoaded()) { return ; } - if (!selectedNodes || selectedNodes.length === 0) { - return Select a node from the graph to view the details.; - } + const node = lineage.seedResult.nodes.get(lineage.seed); + return ; + } - if (selectedNodes.length === 1) { - const node = selectedNodes[0]; + if (!selectedNodes || selectedNodes.length === 0) { + return Select a node from the graph to view the details.; + } - if (isBasicNode(node)) { - return ( - - ); - } else if (isCombinedNode(node)) { - return ( - - ); - } else if (isClusterNode(node)) { - return ( - n.kind === 'node' && n.lineageNode)} - options={lineageOptions} - /> - ); - } + if (selectedNodes.length === 1) { + const node = selectedNodes[0]; - throw new Error('unknown node kind'); + if (isBasicNode(node)) { + return ( + + ); + } else if (isCombinedNode(node)) { + return ( + + ); + } else if (isClusterNode(node)) { + return ( + n.kind === 'node' && n.lineageNode)} + options={lineageOptions} + /> + ); } - return
Multiple selected nodes
; + throw new Error('unknown node kind'); } -} + + return
Multiple selected nodes
; +}); +LineageNodeDetailFactory.displayName = 'LineageNodeDetailFactory'; diff --git a/packages/components/src/internal/components/lineage/node/NodeDetailHeader.tsx b/packages/components/src/internal/components/lineage/node/NodeDetailHeader.tsx index 3166d75907..5fcf1b0684 100644 --- a/packages/components/src/internal/components/lineage/node/NodeDetailHeader.tsx +++ b/packages/components/src/internal/components/lineage/node/NodeDetailHeader.tsx @@ -1,4 +1,4 @@ -import React, { PropsWithChildren, PureComponent, ReactNode } from 'react'; +import React, { FC, memo, PropsWithChildren, ReactNode } from 'react'; import { LineageNode } from '../models'; import { LineageDataLink } from '../LineageDataLink'; @@ -9,58 +9,51 @@ export interface DetailHeaderProps extends PropsWithChildren { iconSrc: string; } -export class DetailHeader extends PureComponent { - render(): ReactNode { - const { children, header, iconSrc } = this.props; - - return ( -
- - - -
-
-

{header}

-
-
{children}
-
+export const DetailHeader: FC = memo(({ children, header, iconSrc }) => ( +
+ + + +
+
+

{header}

- ); - } -} +
{children}
+
+
+)); +DetailHeader.displayName = 'DetailHeader'; export interface NodeDetailHeaderProps { node: LineageNode; seed?: string; } -export class NodeDetailHeader extends PureComponent { - render(): ReactNode { - const { node, seed } = this.props; - const { links, meta, name } = node; - const lineageUrl = links.lineage; - const isSeed = seed === node.lsid; - - const aliases = meta?.aliases; - const description = meta?.description; - const displayType = meta?.displayType; - - const header = ( - <> - {(lineageUrl && !isSeed && {name}) || name} -
- Overview - Lineage -
- - ); - - return ( - - {displayType &&
{displayType}
} - {aliases &&
{aliases.join(', ')}
} - {description &&
{description}
} -
- ); - } -} +export const NodeDetailHeader: FC = memo(({ node, seed }) => { + const { links, meta, name } = node; + const lineageUrl = links.lineage; + const isSeed = seed === node.lsid; + + const aliases = meta?.aliases; + const description = meta?.description; + const displayType = meta?.displayType; + + const header = ( + <> + {(lineageUrl && !isSeed && {name}) || name} +
+ Overview + Lineage +
+ + ); + + return ( + + {displayType &&
{displayType}
} + {aliases &&
{aliases.join(', ')}
} + {description &&
{description}
} +
+ ); +}); +NodeDetailHeader.displayName = 'NodeDetailHeader'; From bb5212924e0fc8f8ba5505e445364bea622c6047 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Sun, 28 Dec 2025 16:51:40 -0800 Subject: [PATCH 04/15] Bump @labkey/api --- packages/components/package-lock.json | 8 ++++---- packages/components/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index 905530f0ac..f9f5b56598 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -10,7 +10,7 @@ "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", - "@labkey/api": "1.44.1-fb-lineage-441.0", + "@labkey/api": "1.44.1-fb-lineage-441.1", "@testing-library/dom": "~10.4.1", "@testing-library/jest-dom": "~6.9.1", "@testing-library/react": "~16.3.0", @@ -3535,9 +3535,9 @@ } }, "node_modules/@labkey/api": { - "version": "1.44.1-fb-lineage-441.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.44.1-fb-lineage-441.0.tgz", - "integrity": "sha512-lM4LPqqUHQUe/zFWwpJr/1aiidACrHVlEurtoU3A2q4zYP19tAu8ehyhUH80s7y3pCwwzkAUBGuaBbfgpAik7w==", + "version": "1.44.1-fb-lineage-441.1", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.44.1-fb-lineage-441.1.tgz", + "integrity": "sha512-j9CC2tDX2+gP+fDTFGNRg+Qmq2w0/tssSSgm0EVP4NQG5N9BnLxrnSTBCDBsaqfRRFHqL/8+KPDzsm0hQH28QQ==", "license": "Apache-2.0" }, "node_modules/@labkey/build": { diff --git a/packages/components/package.json b/packages/components/package.json index e71442c829..93adff861a 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -50,7 +50,7 @@ "homepage": "https://github.com/LabKey/labkey-ui-components#readme", "dependencies": { "@hello-pangea/dnd": "18.0.1", - "@labkey/api": "1.44.1-fb-lineage-441.0", + "@labkey/api": "1.44.1-fb-lineage-441.1", "@testing-library/dom": "~10.4.1", "@testing-library/jest-dom": "~6.9.1", "@testing-library/react": "~16.3.0", From 779ee7f4f45c04cba5a71c75c9570640723a1591 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Mon, 29 Dec 2025 06:44:07 -0800 Subject: [PATCH 05/15] includeRestrictedNodes --- .../components/src/internal/components/lineage/actions.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/components/src/internal/components/lineage/actions.ts b/packages/components/src/internal/components/lineage/actions.ts index fce4a012e7..0c5f7e210f 100644 --- a/packages/components/src/internal/components/lineage/actions.ts +++ b/packages/components/src/internal/components/lineage/actions.ts @@ -323,6 +323,10 @@ export class ServerLineageAPIWrapper implements LineageAPIWrapper { container = currentContainerId; } + if (fetchOptions.includeRestrictedNodes === undefined) { + fetchOptions.includeRestrictedNodes = true; + } + // Lineage API currently responds with the container's entity ID. // Only apply container if it doesn't match the current container. if (container !== currentContainerId) { @@ -342,6 +346,7 @@ export class ServerLineageAPIWrapper implements LineageAPIWrapper { fetchOptions.includeInputsAndOutputs === true, fetchOptions.includeRunSteps === true, fetchOptions.includeProperties === true, + fetchOptions.includeRestrictedNodes === true, options?.runProtocolLsid ?? '', ].join('|'); From 5d5360240c081f22c16f9b28ee55872638f68365 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Mon, 29 Dec 2025 07:17:31 -0800 Subject: [PATCH 06/15] Remove logging --- packages/components/src/internal/components/lineage/utils.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/components/src/internal/components/lineage/utils.ts b/packages/components/src/internal/components/lineage/utils.ts index b596f55b19..0c975ed469 100644 --- a/packages/components/src/internal/components/lineage/utils.ts +++ b/packages/components/src/internal/components/lineage/utils.ts @@ -142,8 +142,6 @@ export function resolveIconAndShapeForNode( imageShape = 'image'; } - console.log('iconURL', imageFromIdentifier(iconURL, isSeed, false)); - return { iconURL, image: imageFromIdentifier(iconURL, isSeed, false), From bc91ff90d4f466df65fec9c79f7aff1a2e646edf Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Tue, 6 Jan 2026 08:03:01 -0800 Subject: [PATCH 07/15] Undo includeRestrictedNodes --- .../components/src/internal/components/lineage/actions.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/components/src/internal/components/lineage/actions.ts b/packages/components/src/internal/components/lineage/actions.ts index 0c5f7e210f..fce4a012e7 100644 --- a/packages/components/src/internal/components/lineage/actions.ts +++ b/packages/components/src/internal/components/lineage/actions.ts @@ -323,10 +323,6 @@ export class ServerLineageAPIWrapper implements LineageAPIWrapper { container = currentContainerId; } - if (fetchOptions.includeRestrictedNodes === undefined) { - fetchOptions.includeRestrictedNodes = true; - } - // Lineage API currently responds with the container's entity ID. // Only apply container if it doesn't match the current container. if (container !== currentContainerId) { @@ -346,7 +342,6 @@ export class ServerLineageAPIWrapper implements LineageAPIWrapper { fetchOptions.includeInputsAndOutputs === true, fetchOptions.includeRunSteps === true, fetchOptions.includeProperties === true, - fetchOptions.includeRestrictedNodes === true, options?.runProtocolLsid ?? '', ].join('|'); From ea61842c4fb69c96e1261928181445cfb46f44c7 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Tue, 6 Jan 2026 08:04:42 -0800 Subject: [PATCH 08/15] Bump @labkey/api --- packages/components/package-lock.json | 8 ++++---- packages/components/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index f9f5b56598..f979a0a2a1 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -10,7 +10,7 @@ "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", - "@labkey/api": "1.44.1-fb-lineage-441.1", + "@labkey/api": "1.44.1-fb-lineage-441.2", "@testing-library/dom": "~10.4.1", "@testing-library/jest-dom": "~6.9.1", "@testing-library/react": "~16.3.0", @@ -3535,9 +3535,9 @@ } }, "node_modules/@labkey/api": { - "version": "1.44.1-fb-lineage-441.1", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.44.1-fb-lineage-441.1.tgz", - "integrity": "sha512-j9CC2tDX2+gP+fDTFGNRg+Qmq2w0/tssSSgm0EVP4NQG5N9BnLxrnSTBCDBsaqfRRFHqL/8+KPDzsm0hQH28QQ==", + "version": "1.44.1-fb-lineage-441.2", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.44.1-fb-lineage-441.2.tgz", + "integrity": "sha512-/0JuBnCHdtM3dyz1l/WlRrWsSDK2E64V7hfdocG2FFUksWScruArtWsgSpxJT1jbjUeZgEBfTFZthVNzDIyvaA==", "license": "Apache-2.0" }, "node_modules/@labkey/build": { diff --git a/packages/components/package.json b/packages/components/package.json index 93adff861a..42044caed8 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -50,7 +50,7 @@ "homepage": "https://github.com/LabKey/labkey-ui-components#readme", "dependencies": { "@hello-pangea/dnd": "18.0.1", - "@labkey/api": "1.44.1-fb-lineage-441.1", + "@labkey/api": "1.44.1-fb-lineage-441.2", "@testing-library/dom": "~10.4.1", "@testing-library/jest-dom": "~6.9.1", "@testing-library/react": "~16.3.0", From 9824647d6f301787fba722f55f17420e1ca820ab Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Wed, 7 Jan 2026 08:44:52 -0800 Subject: [PATCH 09/15] 7.11.1-fb-lineage-441.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 f979a0a2a1..5fc8b36a32 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "7.11.0", + "version": "7.11.1-fb-lineage-441.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "7.11.0", + "version": "7.11.1-fb-lineage-441.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 42044caed8..514e5799d3 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "7.11.0", + "version": "7.11.1-fb-lineage-441.0", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ From 4a2ac4d799a478242d782cc14d149799040efcab Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Wed, 7 Jan 2026 09:38:08 -0800 Subject: [PATCH 10/15] Group restricted nodes --- .../components/src/internal/components/lineage/actions.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/components/src/internal/components/lineage/actions.ts b/packages/components/src/internal/components/lineage/actions.ts index fce4a012e7..5c9fa01cb1 100644 --- a/packages/components/src/internal/components/lineage/actions.ts +++ b/packages/components/src/internal/components/lineage/actions.ts @@ -81,6 +81,10 @@ function applyLineageMetadata( meta: metadata[node.lsid], }; + if (!config.meta && node.restricted) { + config.meta = new LineageNodeMetadata({ displayType: 'Restricted' }); + } + // Unfortunately, Immutable.merge converts all types to Immutable types (e.g. {} -> Map) which // is not acceptable. Doing a manual merge... Object.keys(config).forEach(prop => { From 27c19fcd1f196c8f1c672099f3fb0bcce902d8a9 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Wed, 7 Jan 2026 09:38:44 -0800 Subject: [PATCH 11/15] lint --- .../components/src/internal/components/lineage/actions.ts | 6 +++--- packages/components/src/internal/url/URLResolver.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/components/src/internal/components/lineage/actions.ts b/packages/components/src/internal/components/lineage/actions.ts index 5c9fa01cb1..709b15bccc 100644 --- a/packages/components/src/internal/components/lineage/actions.ts +++ b/packages/components/src/internal/components/lineage/actions.ts @@ -243,7 +243,7 @@ export interface LineageAPIWrapper { distance?: number, options?: LineageOptions ) => Promise; - loadNodeMetadata: (lineage: LineageResult) => Array>; + loadNodeMetadata: (lineage: LineageResult) => Promise[]; loadSampleStats: (lineageResult: LineageResult) => Promise; loadSeedResult: (seed: string, container?: string, options?: LineageOptions) => Promise; } @@ -356,7 +356,7 @@ export class ServerLineageAPIWrapper implements LineageAPIWrapper { return lineageResultCache[key]; }; - loadNodeMetadata = (lineage: LineageResult): Array> => { + loadNodeMetadata = (lineage: LineageResult): Promise[] => { // Node metadata does not support nodes with multiple primary keys. These could be supported, however, // each node would require it's own request for the unique keys combination. Also, nodes without any primary // keys cannot be filtered upon and thus are also not supported. @@ -418,7 +418,7 @@ export class TestLineageAPIWrapper extends ServerLineageAPIWrapper { this.result = result; this.metadata = metadata; } - loadNodeMetadata = (lineage: LineageResult): Array> => { + loadNodeMetadata = (lineage: LineageResult): Promise[] => { return this.metadata.map(m => Promise.resolve(m)); }; diff --git a/packages/components/src/internal/url/URLResolver.ts b/packages/components/src/internal/url/URLResolver.ts index 0149ab0ef9..1e37874a8c 100644 --- a/packages/components/src/internal/url/URLResolver.ts +++ b/packages/components/src/internal/url/URLResolver.ts @@ -38,7 +38,7 @@ let resolvers = OrderedSet(); let urlMappers: List = List(); -export type URLMapperResolverValue = AppURL | string | boolean; +export type URLMapperResolverValue = AppURL | boolean | string; export type URLMapperResolver = ( url: string, row: Map, From 4498219ba02902fb9c7e43ff4bff231b4c00b935 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Wed, 7 Jan 2026 09:40:50 -0800 Subject: [PATCH 12/15] 7.11.1-fb-lineage-441.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 5fc8b36a32..7f67e12faf 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "7.11.1-fb-lineage-441.0", + "version": "7.11.1-fb-lineage-441.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "7.11.1-fb-lineage-441.0", + "version": "7.11.1-fb-lineage-441.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 514e5799d3..2a806bc004 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "7.11.1-fb-lineage-441.0", + "version": "7.11.1-fb-lineage-441.1", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ From 3df45ff4f23387554489f8112ef33f090601e5ea Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Wed, 7 Jan 2026 14:02:57 -0800 Subject: [PATCH 13/15] Prepare release notes --- packages/components/releaseNotes/components.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/components/releaseNotes/components.md b/packages/components/releaseNotes/components.md index cedc332aa0..6b72a1954c 100644 --- a/packages/components/releaseNotes/components.md +++ b/packages/components/releaseNotes/components.md @@ -1,6 +1,10 @@ # @labkey/components Components, models, actions, and utility functions for LabKey applications and pages +### version 7.12.0 +*Released*: 7 January 2026 +- Lineage: add "restricted" property + ### version 7.11.0 *Released*: 6 January 2026 - GitHub Issue 73: Field editor Advanced Settings to allow for non-unique constraint / index From 2339f6f534b1c98d62cb1cd01030afa3e6e1ec36 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Wed, 7 Jan 2026 14:04:18 -0800 Subject: [PATCH 14/15] Bump @labkey/api --- packages/components/package-lock.json | 8 ++++---- packages/components/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index 7f67e12faf..92b0e0468f 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -10,7 +10,7 @@ "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", - "@labkey/api": "1.44.1-fb-lineage-441.2", + "@labkey/api": "1.44.1", "@testing-library/dom": "~10.4.1", "@testing-library/jest-dom": "~6.9.1", "@testing-library/react": "~16.3.0", @@ -3535,9 +3535,9 @@ } }, "node_modules/@labkey/api": { - "version": "1.44.1-fb-lineage-441.2", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.44.1-fb-lineage-441.2.tgz", - "integrity": "sha512-/0JuBnCHdtM3dyz1l/WlRrWsSDK2E64V7hfdocG2FFUksWScruArtWsgSpxJT1jbjUeZgEBfTFZthVNzDIyvaA==", + "version": "1.44.1", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.44.1.tgz", + "integrity": "sha512-VUS4KLfwAsE45A3MnJUU3j97ei0ncQHv6OVVAN3kitID0xe8+mZ7B39zETVye3Dqgwa8TbYvsCp2t46QmBmwVQ==", "license": "Apache-2.0" }, "node_modules/@labkey/build": { diff --git a/packages/components/package.json b/packages/components/package.json index 2a806bc004..f65070d4d3 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -50,7 +50,7 @@ "homepage": "https://github.com/LabKey/labkey-ui-components#readme", "dependencies": { "@hello-pangea/dnd": "18.0.1", - "@labkey/api": "1.44.1-fb-lineage-441.2", + "@labkey/api": "1.44.1", "@testing-library/dom": "~10.4.1", "@testing-library/jest-dom": "~6.9.1", "@testing-library/react": "~16.3.0", From 89d6543917b22013892ef8df92de4050a59dd300 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Wed, 7 Jan 2026 14:05:20 -0800 Subject: [PATCH 15/15] 7.12.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 92b0e0468f..ba5e5982d8 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "7.11.1-fb-lineage-441.1", + "version": "7.12.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "7.11.1-fb-lineage-441.1", + "version": "7.12.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 f65070d4d3..716b7874b0 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "7.11.1-fb-lineage-441.1", + "version": "7.12.0", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [