mirror of
https://github.com/Azure/cosmos-explorer.git
synced 2025-12-29 13:51:49 +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>
171 lines
6.0 KiB
TypeScript
171 lines
6.0 KiB
TypeScript
import { IMessageBarStyles, MessageBar, MessageBarType, Stack } from "@fluentui/react";
|
|
import { monacoTheme, useThemeStore } from "hooks/useTheme";
|
|
import * as monaco from "monaco-editor";
|
|
import * as React from "react";
|
|
import * as DataModels from "../../../../Contracts/DataModels";
|
|
import { loadMonaco } from "../../../LazyMonaco";
|
|
import { titleAndInputStackProps, unsavedEditorWarningMessage } from "../SettingsRenderUtils";
|
|
import { isDirty, isIndexTransforming } from "../SettingsUtils";
|
|
import { IndexingPolicyRefreshComponent } from "./IndexingPolicyRefresh/IndexingPolicyRefreshComponent";
|
|
export interface IndexingPolicyComponentProps {
|
|
shouldDiscardIndexingPolicy: boolean;
|
|
resetShouldDiscardIndexingPolicy: () => void;
|
|
indexingPolicyContent: DataModels.IndexingPolicy;
|
|
indexingPolicyContentBaseline: DataModels.IndexingPolicy;
|
|
onIndexingPolicyContentChange: (newIndexingPolicy: DataModels.IndexingPolicy) => void;
|
|
logIndexingPolicySuccessMessage: () => void;
|
|
indexTransformationProgress: number;
|
|
refreshIndexTransformationProgress: () => Promise<void>;
|
|
isVectorSearchEnabled?: boolean;
|
|
onIndexingPolicyDirtyChange: (isIndexingPolicyDirty: boolean) => void;
|
|
}
|
|
|
|
interface IndexingPolicyComponentState {
|
|
indexingPolicyContentIsValid: boolean;
|
|
}
|
|
|
|
export class IndexingPolicyComponent extends React.Component<
|
|
IndexingPolicyComponentProps,
|
|
IndexingPolicyComponentState
|
|
> {
|
|
private shouldCheckComponentIsDirty = true;
|
|
private indexingPolicyDiv = React.createRef<HTMLDivElement>();
|
|
private indexingPolicyEditor: monaco.editor.IStandaloneCodeEditor;
|
|
private themeUnsubscribe: () => void;
|
|
|
|
private darkThemeMessageBarStyles: Partial<IMessageBarStyles> = {
|
|
root: {
|
|
selectors: {
|
|
"&.ms-MessageBar--warning": {
|
|
backgroundColor: "var(--colorStatusWarningBackground1)",
|
|
border: "1px solid var(--colorStatusWarningBorder1)",
|
|
},
|
|
".ms-MessageBar-icon": {
|
|
color: "var(--colorNeutralForeground1)",
|
|
},
|
|
".ms-MessageBar-text": {
|
|
color: "var(--colorNeutralForeground1)",
|
|
},
|
|
},
|
|
},
|
|
};
|
|
|
|
constructor(props: IndexingPolicyComponentProps) {
|
|
super(props);
|
|
this.state = {
|
|
indexingPolicyContentIsValid: true,
|
|
};
|
|
}
|
|
|
|
componentDidUpdate(): void {
|
|
if (this.props.shouldDiscardIndexingPolicy) {
|
|
this.resetIndexingPolicyEditor();
|
|
this.props.resetShouldDiscardIndexingPolicy();
|
|
}
|
|
this.onComponentUpdate();
|
|
}
|
|
|
|
componentDidMount(): void {
|
|
this.resetIndexingPolicyEditor();
|
|
this.onComponentUpdate();
|
|
}
|
|
|
|
componentWillUnmount(): void {
|
|
this.themeUnsubscribe && this.themeUnsubscribe();
|
|
}
|
|
|
|
public resetIndexingPolicyEditor = (): void => {
|
|
if (!this.indexingPolicyEditor) {
|
|
this.createIndexingPolicyEditor();
|
|
} else {
|
|
this.indexingPolicyEditor.updateOptions({
|
|
readOnly: isIndexTransforming(this.props.indexTransformationProgress),
|
|
});
|
|
const indexingPolicyEditorModel = this.indexingPolicyEditor.getModel();
|
|
const value: string = JSON.stringify(this.props.indexingPolicyContent, undefined, 4);
|
|
indexingPolicyEditorModel.setValue(value);
|
|
}
|
|
this.onComponentUpdate();
|
|
};
|
|
|
|
private onComponentUpdate = (): void => {
|
|
if (!this.shouldCheckComponentIsDirty) {
|
|
this.shouldCheckComponentIsDirty = true;
|
|
return;
|
|
}
|
|
this.props.onIndexingPolicyDirtyChange(this.IsComponentDirty());
|
|
this.shouldCheckComponentIsDirty = false;
|
|
};
|
|
|
|
public IsComponentDirty = (): boolean => {
|
|
if (
|
|
isDirty(this.props.indexingPolicyContent, this.props.indexingPolicyContentBaseline) &&
|
|
this.state.indexingPolicyContentIsValid
|
|
) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
};
|
|
|
|
private async createIndexingPolicyEditor(): Promise<void> {
|
|
if (!this.indexingPolicyDiv.current) {
|
|
return;
|
|
}
|
|
const value: string = JSON.stringify(this.props.indexingPolicyContent, undefined, 4);
|
|
const monaco = await loadMonaco();
|
|
if (this.indexingPolicyDiv.current) {
|
|
this.indexingPolicyEditor = monaco.editor.create(this.indexingPolicyDiv.current, {
|
|
value: value,
|
|
language: "json",
|
|
readOnly: isIndexTransforming(this.props.indexTransformationProgress),
|
|
ariaLabel: "Indexing Policy",
|
|
theme: monacoTheme(),
|
|
});
|
|
if (this.indexingPolicyEditor) {
|
|
this.themeUnsubscribe = useThemeStore.subscribe(() => {
|
|
if (this.indexingPolicyEditor) {
|
|
monaco.editor.setTheme(monacoTheme());
|
|
}
|
|
});
|
|
|
|
const indexingPolicyEditorModel = this.indexingPolicyEditor.getModel();
|
|
indexingPolicyEditorModel.onDidChangeContent(this.onEditorContentChange.bind(this));
|
|
this.props.logIndexingPolicySuccessMessage();
|
|
}
|
|
}
|
|
}
|
|
|
|
private onEditorContentChange = (): void => {
|
|
const indexingPolicyEditorModel = this.indexingPolicyEditor.getModel();
|
|
try {
|
|
const newIndexingPolicyContent = JSON.parse(indexingPolicyEditorModel.getValue()) as DataModels.IndexingPolicy;
|
|
this.props.onIndexingPolicyContentChange(newIndexingPolicyContent);
|
|
this.setState({ indexingPolicyContentIsValid: true });
|
|
} catch (e) {
|
|
this.setState({ indexingPolicyContentIsValid: false });
|
|
}
|
|
};
|
|
|
|
public render(): JSX.Element {
|
|
return (
|
|
<Stack {...titleAndInputStackProps}>
|
|
<IndexingPolicyRefreshComponent
|
|
indexTransformationProgress={this.props.indexTransformationProgress}
|
|
refreshIndexTransformationProgress={this.props.refreshIndexTransformationProgress}
|
|
/>
|
|
{isDirty(this.props.indexingPolicyContent, this.props.indexingPolicyContentBaseline) && (
|
|
<MessageBar
|
|
messageBarType={MessageBarType.warning}
|
|
messageBarIconProps={{ iconName: "WarningSolid", className: "messageBarWarningIcon" }}
|
|
styles={this.darkThemeMessageBarStyles}
|
|
>
|
|
{unsavedEditorWarningMessage("indexPolicy")}
|
|
</MessageBar>
|
|
)}
|
|
<div className="settingsV2Editor" tabIndex={0} ref={this.indexingPolicyDiv}></div>
|
|
</Stack>
|
|
);
|
|
}
|
|
}
|