Can edit Cloud init user data from UI
	
		
			
	
		
	
	
		
	
		
			Some checks failed
		
		
	
	
		
			
				
	
				continuous-integration/drone/push Build is failing
				
			
		
		
	
	
				
					
				
			
		
			Some checks failed
		
		
	
	continuous-integration/drone/push Build is failing
				
			This commit is contained in:
		@@ -3,16 +3,44 @@ import "@fontsource/roboto/400.css";
 | 
			
		||||
import "@fontsource/roboto/500.css";
 | 
			
		||||
import "@fontsource/roboto/700.css";
 | 
			
		||||
 | 
			
		||||
import { ThemeProvider, createTheme } from "@mui/material";
 | 
			
		||||
import React from "react";
 | 
			
		||||
import ReactDOM from "react-dom/client";
 | 
			
		||||
import { App } from "./App";
 | 
			
		||||
import { AlertDialogProvider } from "./hooks/providers/AlertDialogProvider";
 | 
			
		||||
import { ConfirmDialogProvider } from "./hooks/providers/ConfirmDialogProvider";
 | 
			
		||||
import { LoadingMessageProvider } from "./hooks/providers/LoadingMessageProvider";
 | 
			
		||||
import { SnackbarProvider } from "./hooks/providers/SnackbarProvider";
 | 
			
		||||
import "./index.css";
 | 
			
		||||
import { LoadServerConfig } from "./widgets/LoadServerConfig";
 | 
			
		||||
import { ThemeProvider, createTheme } from "@mui/material";
 | 
			
		||||
import { LoadingMessageProvider } from "./hooks/providers/LoadingMessageProvider";
 | 
			
		||||
import { AlertDialogProvider } from "./hooks/providers/AlertDialogProvider";
 | 
			
		||||
import { SnackbarProvider } from "./hooks/providers/SnackbarProvider";
 | 
			
		||||
import { ConfirmDialogProvider } from "./hooks/providers/ConfirmDialogProvider";
 | 
			
		||||
 | 
			
		||||
import { loader } from "@monaco-editor/react";
 | 
			
		||||
import * as monaco from "monaco-editor";
 | 
			
		||||
import EditorWorker from "monaco-editor/esm/vs/editor/editor.worker?worker";
 | 
			
		||||
import { configureMonacoYaml } from "monaco-yaml";
 | 
			
		||||
import YamlWorker from "monaco-yaml/yaml.worker?worker";
 | 
			
		||||
 | 
			
		||||
// This allows to use a self hosted instance of Monaco editor
 | 
			
		||||
loader.config({ monaco });
 | 
			
		||||
 | 
			
		||||
// Add YAML support to Monaco
 | 
			
		||||
configureMonacoYaml(monaco, {
 | 
			
		||||
  enableSchemaRequest: false,
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
/// YAML worker
 | 
			
		||||
window.MonacoEnvironment = {
 | 
			
		||||
  getWorker(_moduleId, label) {
 | 
			
		||||
    switch (label) {
 | 
			
		||||
      case "editorWorkerService":
 | 
			
		||||
        return new EditorWorker();
 | 
			
		||||
      case "yaml":
 | 
			
		||||
        return new YamlWorker();
 | 
			
		||||
      default:
 | 
			
		||||
        throw new Error(`Unknown label ${label}`);
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const darkTheme = createTheme({
 | 
			
		||||
  palette: {
 | 
			
		||||
@@ -20,9 +48,7 @@ const darkTheme = createTheme({
 | 
			
		||||
  },
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const root = ReactDOM.createRoot(
 | 
			
		||||
  document.getElementById("root")!
 | 
			
		||||
);
 | 
			
		||||
const root = ReactDOM.createRoot(document.getElementById("root")!);
 | 
			
		||||
root.render(
 | 
			
		||||
  <React.StrictMode>
 | 
			
		||||
    <ThemeProvider theme={darkTheme}>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,4 @@
 | 
			
		||||
import Editor from "@monaco-editor/react";
 | 
			
		||||
import RefreshIcon from "@mui/icons-material/Refresh";
 | 
			
		||||
import { Grid, IconButton, InputAdornment, Tooltip } from "@mui/material";
 | 
			
		||||
import { v4 as uuidv4 } from "uuid";
 | 
			
		||||
@@ -33,6 +34,10 @@ export function CloudInitEditor(p: CloudInitProps): React.ReactElement {
 | 
			
		||||
          {...p}
 | 
			
		||||
          editable={p.editable && p.vm.cloud_init.attach_config}
 | 
			
		||||
        />
 | 
			
		||||
        <CloudInitRawUserData
 | 
			
		||||
          {...p}
 | 
			
		||||
          editable={p.editable && p.vm.cloud_init.attach_config}
 | 
			
		||||
        />
 | 
			
		||||
      </Grid>
 | 
			
		||||
    </>
 | 
			
		||||
  );
 | 
			
		||||
@@ -100,3 +105,24 @@ function CloudInitMetadata(p: CloudInitProps): React.ReactElement {
 | 
			
		||||
    </EditSection>
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function CloudInitRawUserData(p: CloudInitProps): React.ReactElement {
 | 
			
		||||
  return (
 | 
			
		||||
    <EditSection title="User data">
 | 
			
		||||
      <Editor
 | 
			
		||||
        theme="vs-dark"
 | 
			
		||||
        options={{
 | 
			
		||||
          readOnly: !p.editable,
 | 
			
		||||
          quickSuggestions: { other: true, comments: true, strings: true },
 | 
			
		||||
        }}
 | 
			
		||||
        language="yaml"
 | 
			
		||||
        height={"30vh"}
 | 
			
		||||
        value={p.vm.cloud_init.user_data}
 | 
			
		||||
        onChange={(v) => {
 | 
			
		||||
          p.vm.cloud_init.user_data = v ?? "";
 | 
			
		||||
          p.onChange?.();
 | 
			
		||||
        }}
 | 
			
		||||
      />
 | 
			
		||||
    </EditSection>
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user