Enable original azure resource tree for Fabric native and turn on Settings page

This commit is contained in:
Laurent Nguyen 2025-04-11 12:11:02 +02:00
parent a3bfc89318
commit cbda2a3325
4 changed files with 79 additions and 56 deletions

View File

@ -1,3 +1,4 @@
import { isFabric } from "Platform/Fabric/FabricUtil";
import { AuthType } from "../../AuthType"; import { AuthType } from "../../AuthType";
import { Offer, ReadCollectionOfferParams } from "../../Contracts/DataModels"; import { Offer, ReadCollectionOfferParams } from "../../Contracts/DataModels";
import { userContext } from "../../UserContext"; import { userContext } from "../../UserContext";
@ -13,6 +14,11 @@ import { readOfferWithSDK } from "./readOfferWithSDK";
export const readCollectionOffer = async (params: ReadCollectionOfferParams): Promise<Offer> => { export const readCollectionOffer = async (params: ReadCollectionOfferParams): Promise<Offer> => {
const clearMessage = logConsoleProgress(`Querying offer for collection ${params.collectionId}`); const clearMessage = logConsoleProgress(`Querying offer for collection ${params.collectionId}`);
if (isFabric()) {
// Not exposing offers in Fabric
return undefined;
}
try { try {
if ( if (
userContext.authType === AuthType.AAD && userContext.authType === AuthType.AAD &&

View File

@ -12,6 +12,7 @@ import {
ThroughputBucketsComponentProps, ThroughputBucketsComponentProps,
} from "Explorer/Controls/Settings/SettingsSubComponents/ThroughputInputComponents/ThroughputBucketsComponent"; } from "Explorer/Controls/Settings/SettingsSubComponents/ThroughputInputComponents/ThroughputBucketsComponent";
import { useDatabases } from "Explorer/useDatabases"; import { useDatabases } from "Explorer/useDatabases";
import { isFabricNative } from "Platform/Fabric/FabricUtil";
import { isFullTextSearchEnabled, isVectorSearchEnabled } from "Utils/CapabilityUtils"; import { isFullTextSearchEnabled, isVectorSearchEnabled } from "Utils/CapabilityUtils";
import { isRunningOnPublicCloud } from "Utils/CloudUtils"; import { isRunningOnPublicCloud } from "Utils/CloudUtils";
import * as React from "react"; import * as React from "react";
@ -1270,6 +1271,7 @@ export class SettingsComponent extends React.Component<SettingsComponentProps, S
database: useDatabases.getState().findDatabaseWithId(this.collection.databaseId), database: useDatabases.getState().findDatabaseWithId(this.collection.databaseId),
collection: this.collection, collection: this.collection,
explorer: this.props.settingsTab.getContainer(), explorer: this.props.settingsTab.getContainer(),
isReadOnly: isFabricNative(),
}; };
const tabs: SettingsV2TabInfo[] = []; const tabs: SettingsV2TabInfo[] = [];

View File

@ -29,16 +29,26 @@ export interface PartitionKeyComponentProps {
database: ViewModels.Database; database: ViewModels.Database;
collection: ViewModels.Collection; collection: ViewModels.Collection;
explorer: Explorer; explorer: Explorer;
isReadOnly?: boolean; // true: cannot change partition key
} }
export const PartitionKeyComponent: React.FC<PartitionKeyComponentProps> = ({ database, collection, explorer }) => { export const PartitionKeyComponent: React.FC<PartitionKeyComponentProps> = ({
database,
collection,
explorer,
isReadOnly,
}) => {
const { dataTransferJobs } = useDataTransferJobs(); const { dataTransferJobs } = useDataTransferJobs();
const [portalDataTransferJob, setPortalDataTransferJob] = React.useState<DataTransferJobGetResults>(null); const [portalDataTransferJob, setPortalDataTransferJob] = React.useState<DataTransferJobGetResults>(null);
React.useEffect(() => { React.useEffect(() => {
if (isReadOnly) {
return;
}
const loadDataTransferJobs = refreshDataTransferOperations; const loadDataTransferJobs = refreshDataTransferOperations;
loadDataTransferJobs(); loadDataTransferJobs();
}, []); }, [isReadOnly]);
React.useEffect(() => { React.useEffect(() => {
const currentJob = findPortalDataTransferJob(); const currentJob = findPortalDataTransferJob();
@ -163,56 +173,61 @@ export const PartitionKeyComponent: React.FC<PartitionKeyComponentProps> = ({ da
</Stack> </Stack>
</Stack> </Stack>
</Stack> </Stack>
<MessageBar messageBarType={MessageBarType.warning}>
To safeguard the integrity of the data being copied to the new container, ensure that no updates are made to the {!isReadOnly && (
source container for the entire duration of the partition key change process. <>
<Link <MessageBar messageBarType={MessageBarType.warning}>
href="https://learn.microsoft.com/azure/cosmos-db/container-copy#how-does-container-copy-work" To safeguard the integrity of the data being copied to the new container, ensure that no updates are made to
target="_blank" the source container for the entire duration of the partition key change process.
underline <Link
> href="https://learn.microsoft.com/azure/cosmos-db/container-copy#how-does-container-copy-work"
Learn more target="_blank"
</Link> underline
</MessageBar> >
<Text> Learn more
To change the partition key, a new destination container must be created or an existing destination container </Link>
selected. Data will then be copied to the destination container. </MessageBar>
</Text> <Text>
{configContext.platform !== Platform.Emulator && ( To change the partition key, a new destination container must be created or an existing destination
<PrimaryButton container selected. Data will then be copied to the destination container.
styles={{ root: { width: "fit-content" } }} </Text>
text="Change" {configContext.platform !== Platform.Emulator && (
onClick={startPartitionkeyChangeWorkflow} <PrimaryButton
disabled={isCurrentJobInProgress(portalDataTransferJob)} styles={{ root: { width: "fit-content" } }}
/> text="Change"
)} onClick={startPartitionkeyChangeWorkflow}
{portalDataTransferJob && ( disabled={isCurrentJobInProgress(portalDataTransferJob)}
<Stack> />
<Text styles={textHeadingStyle}>{partitionKeyName} change job</Text> )}
<Stack {portalDataTransferJob && (
horizontal <Stack>
tokens={{ childrenGap: 20 }} <Text styles={textHeadingStyle}>{partitionKeyName} change job</Text>
styles={{ <Stack
root: { horizontal
alignItems: "center", tokens={{ childrenGap: 20 }}
}, styles={{
}} root: {
> alignItems: "center",
<ProgressIndicator },
label={portalDataTransferJob?.properties?.jobName} }}
description={getProgressDescription()} >
percentComplete={getPercentageComplete()} <ProgressIndicator
styles={{ label={portalDataTransferJob?.properties?.jobName}
root: { description={getProgressDescription()}
width: "85%", percentComplete={getPercentageComplete()}
}, styles={{
}} root: {
></ProgressIndicator> width: "85%",
{isCurrentJobInProgress(portalDataTransferJob) && ( },
<DefaultButton text="Cancel" onClick={() => cancelRunningDataTransferJob(portalDataTransferJob)} /> }}
)} ></ProgressIndicator>
</Stack> {isCurrentJobInProgress(portalDataTransferJob) && (
</Stack> <DefaultButton text="Cancel" onClick={() => cancelRunningDataTransferJob(portalDataTransferJob)} />
)}
</Stack>
</Stack>
)}
</>
)} )}
</Stack> </Stack>
); );

View File

@ -6,7 +6,7 @@ import StoredProcedure from "Explorer/Tree/StoredProcedure";
import Trigger from "Explorer/Tree/Trigger"; import Trigger from "Explorer/Tree/Trigger";
import UserDefinedFunction from "Explorer/Tree/UserDefinedFunction"; import UserDefinedFunction from "Explorer/Tree/UserDefinedFunction";
import { useDatabases } from "Explorer/useDatabases"; import { useDatabases } from "Explorer/useDatabases";
import { isFabricMirrored } from "Platform/Fabric/FabricUtil"; import { isFabric, isFabricMirrored, isFabricNative } from "Platform/Fabric/FabricUtil";
import { getItemName } from "Utils/APITypeUtils"; import { getItemName } from "Utils/APITypeUtils";
import { isServerlessAccount } from "Utils/CapabilityUtils"; import { isServerlessAccount } from "Utils/CapabilityUtils";
import { useTabs } from "hooks/useTabs"; import { useTabs } from "hooks/useTabs";
@ -23,7 +23,7 @@ import { useNotebook } from "../Notebook/useNotebook";
import { useSelectedNode } from "../useSelectedNode"; import { useSelectedNode } from "../useSelectedNode";
export const shouldShowScriptNodes = (): boolean => { export const shouldShowScriptNodes = (): boolean => {
return !isFabricMirrored() && (userContext.apiType === "SQL" || userContext.apiType === "Gremlin"); return !isFabric() && (userContext.apiType === "SQL" || userContext.apiType === "Gremlin");
}; };
const TreeDatabaseIcon = <DatabaseRegular fontSize={16} />; const TreeDatabaseIcon = <DatabaseRegular fontSize={16} />;
@ -219,7 +219,7 @@ export const buildCollectionNode = (
): TreeNode => { ): TreeNode => {
let children: TreeNode[]; let children: TreeNode[];
// Flat Tree for Fabric // Flat Tree for Fabric
if (configContext.platform !== Platform.Fabric) { if (!isFabricMirrored()) {
children = buildCollectionNodeChildren(database, collection, isNotebookEnabled, container, refreshActiveTab); children = buildCollectionNodeChildren(database, collection, isNotebookEnabled, container, refreshActiveTab);
} }
@ -317,7 +317,7 @@ const buildCollectionNodeChildren = (
children.push({ children.push({
id, id,
label: database.isDatabaseShared() || isServerlessAccount() ? "Settings" : "Scale & Settings", label: database.isDatabaseShared() || isServerlessAccount() || isFabricNative() ? "Settings" : "Scale & Settings",
onClick: collection.onSettingsClick.bind(collection), onClick: collection.onSettingsClick.bind(collection),
isSelected: () => isSelected: () =>
useSelectedNode useSelectedNode