diff --git a/.changeset/eighty-apples-care.md b/.changeset/eighty-apples-care.md new file mode 100644 index 00000000..345450eb --- /dev/null +++ b/.changeset/eighty-apples-care.md @@ -0,0 +1,5 @@ +--- +"@itwin/changed-elements-react": patch +--- + +Nvtable persists when loading comparison diff --git a/.gitignore b/.gitignore index 2435c323..b5d06cc4 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ pnpm-debug.log* .env.* packages/test-app-frontend/dist/ +.DS_Store diff --git a/packages/changed-elements-react/src/NamedVersionSelector/NamedVersionSelector.tsx b/packages/changed-elements-react/src/NamedVersionSelector/NamedVersionSelector.tsx index c89cf9f2..f4ae0243 100644 --- a/packages/changed-elements-react/src/NamedVersionSelector/NamedVersionSelector.tsx +++ b/packages/changed-elements-react/src/NamedVersionSelector/NamedVersionSelector.tsx @@ -26,7 +26,7 @@ import { runManagerStartComparisonV2 } from "../widgets/comparisonJobWidget/common/versionCompareV2WidgetUtils.js"; import { IconEx } from "./IconEx.js"; -import { namedVersionSelectorContext } from "./NamedVersionSelectorContext.js"; +import { NamedVersionSelectorContentContext, NamedVersionSelectorContentProps, namedVersionSelectorContext } from "./NamedVersionSelectorContext.js"; import { Sticky } from "./Sticky.js"; import { TextEx } from "./TextEx.js"; import { useComparisonJobs } from "./useComparisonJobs.js"; @@ -61,8 +61,10 @@ export function NamedVersionSelectorWidget(props: Readonly(); const [isComparing, setIsComparing] = useState(manager.isComparing); const [isComparisonStarted, setIsComparisonStarted] = useState(manager.isComparisonReady); + useEffect( () => { const cleanup = [ @@ -86,20 +88,51 @@ export function NamedVersionSelectorWidget(props: Readonly(null); - if (!isComparing) { - return ( - - ); - } + const onNamedVersionOpened = async (targetVersion?: NamedVersionEntry) => { + setTargetVersion(targetVersion?.namedVersion); + if (!targetVersion || !currentNamedVersion || targetVersion.job?.status !== "Completed") { + return; + } + + await runManagerStartComparisonV2({ + comparisonJob: { + comparisonJob: { + status: "Completed", + jobId: targetVersion.job.jobId, + iTwinId, + iModelId, + startChangesetId: currentChangesetId, + endChangesetId: targetVersion.namedVersion.targetChangesetId ?? "", + comparison: { + href: targetVersion.job.comparisonUrl, + }, + }, + }, + comparisonJobClient, + iModelConnection: iModel, + targetVersion: targetVersion.namedVersion, + currentVersion: currentNamedVersion, + getToastsEnabled: () => true, + iModelsClient, + }); + }; return ( @@ -110,6 +143,13 @@ export function NamedVersionSelectorWidget(props: Readonly {t("VersionCompare:versionCompare.versionPickerTitle")} + + { + !isComparisonStarted && + + } + + {isComparisonStarted &&
-
+ } + - - {(value) => ( - - {props.manager?.currentVersion && isComparisonStarted && - } - - - )} - + { + currentNamedVersion && + + } + + { + !isComparing && + + +
+ {feedbackUrl && } +
+
+ } + + { + isComparing && + + {(value) => ( + + + + )} + + } +
); } @@ -160,137 +230,24 @@ function LoadingState(): ReactElement { ); } - -type LoadedStateProps = Omit & { currentNamedVersion: NamedVersion; }; - -function LoadedState(props: Readonly): ReactElement { - return ( - - ); -} - -type NamedVersionSelectorContentProps = { - isLoading: boolean; - entries: NamedVersionEntry[]; - currentNamedVersion: NamedVersion | undefined; - iTwinId: string; - iModelId: string; - onNamedVersionOpened: (version: NamedVersionEntry) => void; - updateJobStatus: ReturnType["updateJobStatus"]; - emptyState?: ReactNode; - manageVersions?: ReactNode; -}; - -function NamedVersionSelectorContent( - props: Readonly, -): ReactElement { - if (!props.isLoading && props.entries.length === 0) { +function NamedVersionSelectorContent(): ReactElement { + const { isLoading, currentNamedVersion, ...restProps } = useContext(NamedVersionSelectorContentContext); + if (!isLoading && restProps.entries.length === 0) { return ; } - if (!props.currentNamedVersion || (props.isLoading && props.entries.length === 0)) { + if (!currentNamedVersion || (isLoading && restProps.entries.length === 0)) { return ; } return ( - ); } -interface NamedVersionSelectorProps { - iModel: IModelConnection; - manager: VersionCompareManager; - emptyState?: ReactNode; - manageVersions?: ReactNode; - feedbackUrl?: string; - documentationHref?: string; -} - -function NamedVersionSelector(props: Readonly): ReactElement { - const { iModelsClient, comparisonJobClient } = useVersionCompare(); - if (!comparisonJobClient) { - throw new Error("V2 Client is not initialized in given context."); - } - - const { iModel, manager, emptyState, manageVersions, feedbackUrl } = props; - - const iTwinId = iModel.iTwinId as string; - const iModelId = iModel.iModelId as string; - const currentChangesetId = iModel.changeset.id; - - const { isLoading, currentNamedVersion, entries, updateJobStatus } = useNamedVersionsList({ - iTwinId, - iModelId, - currentChangesetId, - }); - - const [openedVersion, setOpenedVersion] = useState(manager.targetVersion); - const onNamedVersionOpened = async (targetVersion?: NamedVersionEntry) => { - setOpenedVersion(targetVersion?.namedVersion); - if (!targetVersion || !currentNamedVersion || targetVersion.job?.status !== "Completed") { - return; - } - - await runManagerStartComparisonV2({ - comparisonJob: { - comparisonJob: { - status: "Completed", - jobId: targetVersion.job.jobId, - iTwinId, - iModelId, - startChangesetId: currentChangesetId, - endChangesetId: targetVersion.namedVersion.targetChangesetId ?? "", - comparison: { - href: targetVersion.job.comparisonUrl, - }, - }, - }, - comparisonJobClient, - iModelConnection: iModel, - targetVersion: targetVersion.namedVersion, - currentVersion: currentNamedVersion, - getToastsEnabled: () => true, - iModelsClient, - }); - manager.versionCompareStopped.addOnce(() => setOpenedVersion(undefined)); - }; - - const namedVersionSelectorProps: Readonly = { - isLoading, - currentNamedVersion, - entries, - iTwinId, - iModelId, - onNamedVersionOpened, - updateJobStatus, - emptyState, - manageVersions, - }; - - return ( - - - - {t("VersionCompare:versionCompare.versionPickerTitle")} - - {currentNamedVersion && } - - { - currentNamedVersion && - - } - -
- {feedbackUrl && } -
-
- ); -} - interface WidgetProps { children?: ReactNode; } @@ -394,18 +351,9 @@ function PlaceholderNamedVersionInfo(): ReactElement { ); } -interface NamedVersionSelectorLoadedProps { - iTwinId: string; - iModelId: string; - currentNamedVersion: NamedVersion; - entries: NamedVersionEntry[]; - updateJobStatus: ReturnType["updateJobStatus"]; - onNamedVersionOpened: (version: NamedVersionEntry) => void; - emptyState?: ReactNode; - manageVersions?: ReactNode; -} +type LoadedStateProps = Omit & { currentNamedVersion: NamedVersion; }; -function NamedVersionSelectorLoaded(props: Readonly): ReactElement { +function NamedVersionSelectorLoaded(props: LoadedStateProps): ReactElement { const { iTwinId, iModelId, @@ -518,7 +466,7 @@ function NamedVersionSelectorLoaded(props: Readonly { - props.entries.map((entry) => ( + entries.map((entry) => ( )) } diff --git a/packages/changed-elements-react/src/NamedVersionSelector/NamedVersionSelectorContext.tsx b/packages/changed-elements-react/src/NamedVersionSelector/NamedVersionSelectorContext.tsx index bd3198c2..117989da 100644 --- a/packages/changed-elements-react/src/NamedVersionSelector/NamedVersionSelectorContext.tsx +++ b/packages/changed-elements-react/src/NamedVersionSelector/NamedVersionSelectorContext.tsx @@ -2,9 +2,10 @@ * Copyright (c) Bentley Systems, Incorporated. All rights reserved. * See LICENSE.md in the project root for license terms and full copyright notice. *--------------------------------------------------------------------------------------------*/ -import { createContext } from "react"; +import { createContext, ReactNode } from "react"; -import type { NamedVersionEntry } from "./useNamedVersionsList.js"; +import type { NamedVersionEntry, useNamedVersionsList } from "./useNamedVersionsList.js"; +import { NamedVersion } from "../clients/iModelsClient.js"; export interface NamedVersionSelectorContextValue { /** Invoked when users request Named Version processinig. */ @@ -42,3 +43,19 @@ export const namedVersionSelectorContext = createContext ({ cancel: () => { } }), contextExists: false, }); + +export type NamedVersionSelectorContentProps = { + isLoading: boolean; + entries: NamedVersionEntry[]; + currentNamedVersion: NamedVersion | undefined; + iTwinId: string; + iModelId: string; + onNamedVersionOpened: (version: NamedVersionEntry) => void; + updateJobStatus: ReturnType["updateJobStatus"]; + emptyState?: ReactNode; + manageVersions?: ReactNode; +}; + +export const NamedVersionSelectorContentContext = createContext( + {} as NamedVersionSelectorContentProps, +) diff --git a/packages/changed-elements-react/src/VersionCompareContext.tsx b/packages/changed-elements-react/src/VersionCompareContext.tsx index ad0271b7..3d78c66c 100644 --- a/packages/changed-elements-react/src/VersionCompareContext.tsx +++ b/packages/changed-elements-react/src/VersionCompareContext.tsx @@ -57,3 +57,4 @@ export interface VersionCompareContextValue { } const versionCompareContext = createContext(undefined); + diff --git a/packages/changed-elements-react/src/api/VersionCompareManager.ts b/packages/changed-elements-react/src/api/VersionCompareManager.ts index a45f8a81..4eb92ada 100644 --- a/packages/changed-elements-react/src/api/VersionCompareManager.ts +++ b/packages/changed-elements-react/src/api/VersionCompareManager.ts @@ -439,6 +439,10 @@ export class VersionCompareManager { this.progressCoordinator.updateProgress(VersionCompareProgressStage.OpenTargetImodel); + // Keep metadata around for UI uses and other queries + this.currentVersion = currentVersion; + this.targetVersion = targetVersion; + // Open the target version IModel const changesetId = targetVersion.changesetId; this._targetIModel = await CheckpointConnection.openRemote( @@ -448,11 +452,6 @@ export class VersionCompareManager { ); this.progressCoordinator.updateProgress(VersionCompareProgressStage.OpenTargetImodel, 100); - - // Keep metadata around for UI uses and other queries - this.currentVersion = currentVersion; - this.targetVersion = targetVersion; - this.progressCoordinator.updateProgress(VersionCompareProgressStage.InitComparison); let wantedModelClasses = [