mirror of
https://github.com/Azure/cosmos-explorer.git
synced 2025-12-18 16:31:31 +00:00
* First dark theme commits for command bar * Updated theme on sidebar * Updated tabs, sidebar, splash screen * settings theme changes * Dark theme applied to Monaco editor * Dark theme to stored procedures * Fixed sidebar scroll * Updated scroll issue in sidebar * Command bar items fixed * Fixed lint errors * fixed lint errors * settings side panel fixed * Second last iteration for css * Fixed all the issues of css * Updated the theme icon for now on DE to change the theme from portal/DE itself * Formatting issue resolved * Remove CloudShellTerminalComponent changes - revert to master version * Fixed test issue * Fixed formatting issue * Fix tests: update snapshots and revert xterm imports for compatibility * Fix xterm imports in CloudShellTerminalComponent to use @xterm packages * Fix Cloud Shell component imports for compatibility * Update test snapshots * Fix xterm package consistency across all CloudShell components * Fix TypeScript compilation errors in CloudShell components and query Documents - Standardized xterm package imports across CloudShell components to use legacy 'xterm' package - Fixed Terminal type compatibility issues in CommonUtils.tsx - Added type casting for enableQueryControl property in queryDocuments.ts to handle Azure Cosmos SDK interface limitations - Applied code formatting to ensure consistency * Update failing snapshot tests - Updated TreeNodeComponent snapshot tests for loading states - Updated ThroughputInputAutoPilotV3Component snapshots for number formatting changes (10,00,000 -> 1,000,000) - All snapshot tests now pass * Fixed test issue * Fixed test issue * Updated the buttons for theme * Updated the Theme changes based on portal theme changes * Updated review comments * Updated the duplicate code and fixed the fabric react error * Few places styling added and resolving few comments * Fixed errors * Fixed comments * Fixed comments * Fixed comments * Fixed full text policy issue for mongoru accounts * Resolved comments for class Name and few others * Added css for homepage in ru accounts * Final commit with all the feedback issues resolved * Lint error resolved * Updated the review comments and few Ui issues * Resolved review comments and changed header bg and active state color * Moved svg code to different file and imported * css fixed for the hpome page boxed for ru account * Lint errors * Fixed boxes issue in ru accounts * Handled the initial theme from the portal * Updated snap * Update snapshots for TreeNodeComponent and CreateCopyJobScreensProvider tests * Fix duplicate DataExplorerRoot test id causing Playwright strict mode violation * Fix locale-dependent number formatting in ThroughputInputAutoPilotV3Component --------- Co-authored-by: Sakshi Gupta <sakshig+microsoft@microsoft.com> Co-authored-by: Sakshi Gupta <sakshig@microsoft.com>
231 lines
9.0 KiB
TypeScript
231 lines
9.0 KiB
TypeScript
import { DefaultButton, Pivot, PivotItem, Stack } from "@fluentui/react";
|
|
import { FullTextPolicy, VectorEmbedding, VectorEmbeddingPolicy } from "Contracts/DataModels";
|
|
import {
|
|
FullTextPoliciesComponent,
|
|
getFullTextLanguageOptions,
|
|
} from "Explorer/Controls/FullTextSeach/FullTextPoliciesComponent";
|
|
import { titleAndInputStackProps } from "Explorer/Controls/Settings/SettingsRenderUtils";
|
|
import { ContainerPolicyTabTypes, isDirty } from "Explorer/Controls/Settings/SettingsUtils";
|
|
import { VectorEmbeddingPoliciesComponent } from "Explorer/Controls/VectorSearch/VectorEmbeddingPoliciesComponent";
|
|
import React from "react";
|
|
|
|
export interface ContainerPolicyComponentProps {
|
|
vectorEmbeddingPolicy: VectorEmbeddingPolicy;
|
|
vectorEmbeddingPolicyBaseline: VectorEmbeddingPolicy;
|
|
onVectorEmbeddingPolicyChange: (newVectorEmbeddingPolicy: VectorEmbeddingPolicy) => void;
|
|
onVectorEmbeddingPolicyDirtyChange: (isVectorEmbeddingPolicyDirty: boolean) => void;
|
|
isVectorSearchEnabled: boolean;
|
|
fullTextPolicy: FullTextPolicy;
|
|
fullTextPolicyBaseline: FullTextPolicy;
|
|
onFullTextPolicyChange: (newFullTextPolicy: FullTextPolicy) => void;
|
|
onFullTextPolicyDirtyChange: (isFullTextPolicyDirty: boolean) => void;
|
|
isFullTextSearchEnabled: boolean;
|
|
shouldDiscardContainerPolicies: boolean;
|
|
resetShouldDiscardContainerPolicyChange: () => void;
|
|
isGlobalSecondaryIndex?: boolean;
|
|
}
|
|
|
|
export const ContainerPolicyComponent: React.FC<ContainerPolicyComponentProps> = ({
|
|
vectorEmbeddingPolicy,
|
|
vectorEmbeddingPolicyBaseline,
|
|
onVectorEmbeddingPolicyChange,
|
|
onVectorEmbeddingPolicyDirtyChange,
|
|
isVectorSearchEnabled,
|
|
fullTextPolicy,
|
|
fullTextPolicyBaseline,
|
|
onFullTextPolicyChange,
|
|
onFullTextPolicyDirtyChange,
|
|
isFullTextSearchEnabled,
|
|
shouldDiscardContainerPolicies,
|
|
resetShouldDiscardContainerPolicyChange,
|
|
}) => {
|
|
const [selectedTab, setSelectedTab] = React.useState<ContainerPolicyTabTypes>(
|
|
ContainerPolicyTabTypes.VectorPolicyTab,
|
|
);
|
|
const [vectorEmbeddings, setVectorEmbeddings] = React.useState<VectorEmbedding[]>();
|
|
const [vectorEmbeddingsBaseline, setVectorEmbeddingsBaseline] = React.useState<VectorEmbedding[]>();
|
|
const [discardVectorChanges, setDiscardVectorChanges] = React.useState<boolean>(false);
|
|
const [fullTextSearchPolicy, setFullTextSearchPolicy] = React.useState<FullTextPolicy>();
|
|
const [fullTextSearchPolicyBaseline, setFullTextSearchPolicyBaseline] = React.useState<FullTextPolicy>();
|
|
const [discardFullTextChanges, setDiscardFullTextChanges] = React.useState<boolean>(false);
|
|
|
|
React.useEffect(() => {
|
|
setVectorEmbeddings(vectorEmbeddingPolicy?.vectorEmbeddings);
|
|
setVectorEmbeddingsBaseline(vectorEmbeddingPolicyBaseline?.vectorEmbeddings);
|
|
}, [vectorEmbeddingPolicy]);
|
|
|
|
React.useEffect(() => {
|
|
setFullTextSearchPolicy(fullTextPolicy);
|
|
setFullTextSearchPolicyBaseline(fullTextPolicyBaseline);
|
|
}, [fullTextPolicy, fullTextPolicyBaseline]);
|
|
|
|
React.useEffect(() => {
|
|
if (shouldDiscardContainerPolicies) {
|
|
setVectorEmbeddings(vectorEmbeddingPolicyBaseline?.vectorEmbeddings);
|
|
setDiscardVectorChanges(true);
|
|
setFullTextSearchPolicy(fullTextPolicyBaseline);
|
|
setDiscardFullTextChanges(true);
|
|
resetShouldDiscardContainerPolicyChange();
|
|
}
|
|
});
|
|
|
|
const checkAndSendVectorEmbeddingPoliciesToSettings = (newVectorEmbeddings: VectorEmbedding[]): void => {
|
|
if (isDirty(newVectorEmbeddings, vectorEmbeddingsBaseline)) {
|
|
onVectorEmbeddingPolicyDirtyChange(true);
|
|
onVectorEmbeddingPolicyChange({ vectorEmbeddings: newVectorEmbeddings });
|
|
} else {
|
|
resetShouldDiscardContainerPolicyChange();
|
|
}
|
|
};
|
|
|
|
const checkAndSendFullTextPolicyToSettings = (newFullTextPolicy: FullTextPolicy): void => {
|
|
if (isDirty(newFullTextPolicy, fullTextSearchPolicyBaseline)) {
|
|
onFullTextPolicyDirtyChange(true);
|
|
onFullTextPolicyChange(newFullTextPolicy);
|
|
} else {
|
|
resetShouldDiscardContainerPolicyChange();
|
|
}
|
|
};
|
|
|
|
const onVectorChangesDiscarded = (): void => {
|
|
setDiscardVectorChanges(false);
|
|
};
|
|
|
|
const onFullTextChangesDiscarded = (): void => {
|
|
setDiscardFullTextChanges(false);
|
|
};
|
|
|
|
const onPivotChange = (item: PivotItem): void => {
|
|
const selectedTab = ContainerPolicyTabTypes[item.props.itemKey as keyof typeof ContainerPolicyTabTypes];
|
|
setSelectedTab(selectedTab);
|
|
};
|
|
|
|
return (
|
|
<div>
|
|
<Pivot
|
|
onLinkClick={onPivotChange}
|
|
selectedKey={ContainerPolicyTabTypes[selectedTab]}
|
|
styles={{
|
|
root: {
|
|
color: "var(--colorNeutralForeground1)",
|
|
},
|
|
link: {
|
|
color: "var(--colorNeutralForeground1)",
|
|
backgroundColor: "transparent",
|
|
selectors: {
|
|
":hover": {
|
|
color: "var(--colorNeutralForeground1)",
|
|
backgroundColor: "transparent",
|
|
},
|
|
":active": {
|
|
color: "var(--colorNeutralForeground1)",
|
|
backgroundColor: "transparent",
|
|
},
|
|
},
|
|
},
|
|
linkIsSelected: {
|
|
color: "var(--colorNeutralForeground1)",
|
|
backgroundColor: "transparent",
|
|
selectors: {
|
|
":before": {
|
|
color: "var(--colorNeutralForeground1)",
|
|
backgroundColor: "var(--colorBrandForeground1)",
|
|
},
|
|
":hover": {
|
|
color: "var(--colorNeutralForeground1)",
|
|
backgroundColor: "transparent",
|
|
},
|
|
":active": {
|
|
color: "var(--colorNeutralForeground1)",
|
|
backgroundColor: "transparent",
|
|
},
|
|
},
|
|
},
|
|
linkContent: {
|
|
color: "inherit",
|
|
},
|
|
text: {
|
|
color: "inherit",
|
|
},
|
|
}}
|
|
>
|
|
{isVectorSearchEnabled && (
|
|
<PivotItem
|
|
itemKey={ContainerPolicyTabTypes[ContainerPolicyTabTypes.VectorPolicyTab]}
|
|
style={{ marginTop: 20, color: "var(--colorNeutralForeground1)" }}
|
|
headerText="Vector Policy"
|
|
>
|
|
<Stack {...titleAndInputStackProps} styles={{ root: { position: "relative", maxWidth: "400px" } }}>
|
|
{vectorEmbeddings && (
|
|
<VectorEmbeddingPoliciesComponent
|
|
disabled={true}
|
|
vectorEmbeddings={vectorEmbeddings}
|
|
vectorIndexes={undefined}
|
|
onVectorEmbeddingChange={(vectorEmbeddings: VectorEmbedding[]) =>
|
|
checkAndSendVectorEmbeddingPoliciesToSettings(vectorEmbeddings)
|
|
}
|
|
discardChanges={discardVectorChanges}
|
|
onChangesDiscarded={onVectorChangesDiscarded}
|
|
/>
|
|
)}
|
|
</Stack>
|
|
</PivotItem>
|
|
)}
|
|
{isFullTextSearchEnabled && (
|
|
<PivotItem
|
|
itemKey={ContainerPolicyTabTypes[ContainerPolicyTabTypes.FullTextPolicyTab]}
|
|
style={{ marginTop: 20, color: "var(--colorNeutralForeground1)" }}
|
|
headerText="Full Text Policy"
|
|
>
|
|
<Stack {...titleAndInputStackProps} styles={{ root: { position: "relative", maxWidth: "400px" } }}>
|
|
{fullTextSearchPolicy ? (
|
|
<FullTextPoliciesComponent
|
|
fullTextPolicy={fullTextSearchPolicy}
|
|
onFullTextPathChange={(newFullTextPolicy: FullTextPolicy) =>
|
|
checkAndSendFullTextPolicyToSettings(newFullTextPolicy)
|
|
}
|
|
discardChanges={discardFullTextChanges}
|
|
onChangesDiscarded={onFullTextChangesDiscarded}
|
|
/>
|
|
) : (
|
|
<DefaultButton
|
|
id={"create-full-text-policy"}
|
|
styles={{
|
|
root: {
|
|
fontSize: 12,
|
|
color: "var(--colorNeutralForeground1)",
|
|
backgroundColor: "transparent",
|
|
borderColor: "var(--colorNeutralForeground1)",
|
|
},
|
|
rootHovered: {
|
|
color: "var(--colorNeutralForeground1)",
|
|
backgroundColor: "transparent",
|
|
borderColor: "var(--colorNeutralForeground1)",
|
|
},
|
|
rootPressed: {
|
|
color: "var(--colorNeutralForeground1)",
|
|
backgroundColor: "transparent",
|
|
borderColor: "var(--colorNeutralForeground1)",
|
|
},
|
|
rootDisabled: {
|
|
backgroundColor: "transparent",
|
|
},
|
|
}}
|
|
onClick={() => {
|
|
checkAndSendFullTextPolicyToSettings({
|
|
defaultLanguage: getFullTextLanguageOptions()[0].key as never,
|
|
fullTextPaths: [],
|
|
});
|
|
}}
|
|
>
|
|
Create new full text search policy
|
|
</DefaultButton>
|
|
)}
|
|
</Stack>
|
|
</PivotItem>
|
|
)}
|
|
</Pivot>
|
|
</div>
|
|
);
|
|
};
|