mirror of
https://github.com/Azure/cosmos-explorer.git
synced 2025-12-24 19:31:36 +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>
163 lines
5.9 KiB
TypeScript
163 lines
5.9 KiB
TypeScript
import { FontIcon, IMessageBarStyles, Link, MessageBar, MessageBarType, Stack, Text } from "@fluentui/react";
|
|
import * as DataModels from "Contracts/DataModels";
|
|
import { titleAndInputStackProps, unsavedEditorWarningMessage } from "Explorer/Controls/Settings/SettingsRenderUtils";
|
|
import { isDirty } from "Explorer/Controls/Settings/SettingsUtils";
|
|
import { loadMonaco } from "Explorer/LazyMonaco";
|
|
import { monacoTheme, useThemeStore } from "hooks/useTheme";
|
|
import * as monaco from "monaco-editor";
|
|
import * as React from "react";
|
|
export interface ComputedPropertiesComponentProps {
|
|
computedPropertiesContent: DataModels.ComputedProperties;
|
|
computedPropertiesContentBaseline: DataModels.ComputedProperties;
|
|
logComputedPropertiesSuccessMessage: () => void;
|
|
onComputedPropertiesContentChange: (newComputedProperties: DataModels.ComputedProperties) => void;
|
|
onComputedPropertiesDirtyChange: (isComputedPropertiesDirty: boolean) => void;
|
|
resetShouldDiscardComputedProperties: () => void;
|
|
shouldDiscardComputedProperties: boolean;
|
|
}
|
|
|
|
interface ComputedPropertiesComponentState {
|
|
computedPropertiesContentIsValid: boolean;
|
|
}
|
|
|
|
export class ComputedPropertiesComponent extends React.Component<
|
|
ComputedPropertiesComponentProps,
|
|
ComputedPropertiesComponentState
|
|
> {
|
|
private shouldCheckComponentIsDirty = true;
|
|
private computedPropertiesDiv = React.createRef<HTMLDivElement>();
|
|
private computedPropertiesEditor: 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: ComputedPropertiesComponentProps) {
|
|
super(props);
|
|
this.state = {
|
|
computedPropertiesContentIsValid: true,
|
|
};
|
|
}
|
|
|
|
componentDidUpdate(): void {
|
|
if (this.props.shouldDiscardComputedProperties) {
|
|
this.resetComputedPropertiesEditor();
|
|
this.props.resetShouldDiscardComputedProperties();
|
|
}
|
|
this.onComponentUpdate();
|
|
}
|
|
|
|
componentDidMount(): void {
|
|
this.resetComputedPropertiesEditor();
|
|
this.onComponentUpdate();
|
|
}
|
|
|
|
componentWillUnmount(): void {
|
|
this.themeUnsubscribe && this.themeUnsubscribe();
|
|
}
|
|
|
|
public resetComputedPropertiesEditor = (): void => {
|
|
if (!this.computedPropertiesEditor) {
|
|
this.createComputedPropertiesEditor();
|
|
} else {
|
|
const indexingPolicyEditorModel = this.computedPropertiesEditor.getModel();
|
|
const value: string = JSON.stringify(this.props.computedPropertiesContent, undefined, 4);
|
|
indexingPolicyEditorModel.setValue(value);
|
|
}
|
|
this.onComponentUpdate();
|
|
};
|
|
|
|
private onComponentUpdate = (): void => {
|
|
if (!this.shouldCheckComponentIsDirty) {
|
|
this.shouldCheckComponentIsDirty = true;
|
|
return;
|
|
}
|
|
this.props.onComputedPropertiesDirtyChange(this.IsComponentDirty());
|
|
this.shouldCheckComponentIsDirty = false;
|
|
};
|
|
|
|
public IsComponentDirty = (): boolean => {
|
|
if (
|
|
isDirty(this.props.computedPropertiesContent, this.props.computedPropertiesContentBaseline) &&
|
|
this.state.computedPropertiesContentIsValid
|
|
) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
};
|
|
|
|
private async createComputedPropertiesEditor(): Promise<void> {
|
|
const value: string = JSON.stringify(this.props.computedPropertiesContent, undefined, 4);
|
|
const monaco = await loadMonaco();
|
|
this.computedPropertiesEditor = monaco.editor.create(this.computedPropertiesDiv.current, {
|
|
value: value,
|
|
language: "json",
|
|
ariaLabel: "Computed properties",
|
|
theme: monacoTheme(),
|
|
});
|
|
if (this.computedPropertiesEditor) {
|
|
// Subscribe to theme changes
|
|
this.themeUnsubscribe = useThemeStore.subscribe(() => {
|
|
if (this.computedPropertiesEditor) {
|
|
monaco.editor.setTheme(monacoTheme());
|
|
}
|
|
});
|
|
|
|
const computedPropertiesEditorModel = this.computedPropertiesEditor.getModel();
|
|
computedPropertiesEditorModel.onDidChangeContent(this.onEditorContentChange.bind(this));
|
|
this.props.logComputedPropertiesSuccessMessage();
|
|
}
|
|
}
|
|
|
|
private onEditorContentChange = (): void => {
|
|
const computedPropertiesEditorModel = this.computedPropertiesEditor.getModel();
|
|
try {
|
|
const newComputedPropertiesContent = JSON.parse(
|
|
computedPropertiesEditorModel.getValue(),
|
|
) as DataModels.ComputedProperties;
|
|
this.props.onComputedPropertiesContentChange(newComputedPropertiesContent);
|
|
this.setState({ computedPropertiesContentIsValid: true });
|
|
} catch (e) {
|
|
this.setState({ computedPropertiesContentIsValid: false });
|
|
}
|
|
};
|
|
|
|
public render(): JSX.Element {
|
|
return (
|
|
<Stack {...titleAndInputStackProps}>
|
|
{isDirty(this.props.computedPropertiesContent, this.props.computedPropertiesContentBaseline) && (
|
|
<MessageBar
|
|
messageBarType={MessageBarType.warning}
|
|
messageBarIconProps={{ iconName: "WarningSolid", className: "messageBarWarningIcon" }}
|
|
styles={this.darkThemeMessageBarStyles}
|
|
>
|
|
{unsavedEditorWarningMessage("computedProperties")}
|
|
</MessageBar>
|
|
)}
|
|
<Text style={{ marginLeft: "30px", marginBottom: "10px", color: "var(--colorNeutralForeground1)" }}>
|
|
<Link target="_blank" href="https://aka.ms/computed-properties-preview/">
|
|
{"Learn more"} <FontIcon iconName="NavigateExternalInline" />
|
|
</Link>
|
|
  about how to define computed properties and how to use them.
|
|
</Text>
|
|
<div className="settingsV2Editor" tabIndex={0} ref={this.computedPropertiesDiv}></div>
|
|
</Stack>
|
|
);
|
|
}
|
|
}
|