Path: blob/main/extensions/copilot/test/simulation/workbench/components/currentRunPicker.tsx
13399 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { Button, Dialog, DialogActions, DialogBody, DialogContent, DialogSurface, DialogTitle, Dropdown, Input, Option, OptionOnSelectData, SelectionEvents } from '@fluentui/react-components';6import { Edit16Regular } from '@fluentui/react-icons';7import * as mobxlite from 'mobx-react-lite';8import * as React from 'react';9import { SimulationRunsProvider } from '../stores/simulationBaseline';10import { useInternalToolbarPickerStyles } from './pickerStyle';1112type Props = {13simulationRunsProvider: SimulationRunsProvider;14outputFolderName: string;15onChange: (selected: string | undefined) => void;16disabled?: boolean;17};1819export const CurrentRunPicker = mobxlite.observer(({ simulationRunsProvider, onChange, disabled, outputFolderName }: Props) => {20const [isRenameDialogOpen, setIsRenameDialogOpen] = React.useState(false);21const [newName, setNewName] = React.useState('');22const [runToRename, setRunToRename] = React.useState<string>('');2324const id = 'currentRunPicker';25const styles = useInternalToolbarPickerStyles();2627const handleRenameClick = (runName: string) => {28setRunToRename(runName);29setNewName(runName);30setIsRenameDialogOpen(true);31};3233const handleRenameConfirm = async () => {34if (runToRename && newName) {35const success = await simulationRunsProvider.renameRun(runToRename, newName);36if (success) {37onChange(newName);38}39}40setIsRenameDialogOpen(false);41};4243const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {44if (e.key === 'Enter') {45e.preventDefault();46handleRenameConfirm();47}48};4950return (51<div className={styles.root}>52<label htmlFor={id}>Current run</label>53<div style={{ display: 'flex', alignItems: 'center' }}>54<Dropdown55aria-labelledby={id}56clearable={outputFolderName !== ''}57disabled={disabled}58placeholder='Select a run'59size='small'60selectedOptions={[outputFolderName]}61value={outputFolderName}62onOptionSelect={(_e: SelectionEvents, { optionValue }: OptionOnSelectData) => onChange(optionValue)}63>64{simulationRunsProvider.runs.map((run) => (65<Option key={run.name} value={run.name} text={run.friendlyName}>66<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', width: '100%' }}>67<span>{run.friendlyName}</span>68<Button69icon={<Edit16Regular />}70appearance='subtle'71size='small'72onClick={(e) => {73e.stopPropagation();74handleRenameClick(run.name);75}}76/>77</div>78</Option>79))}80</Dropdown>81</div>8283<Dialog open={isRenameDialogOpen} onOpenChange={(_, { open }) => setIsRenameDialogOpen(open)}>84<DialogSurface>85<DialogBody>86<DialogTitle>Rename Run</DialogTitle>87<DialogContent>88<Input89value={newName}90onChange={(e) => setNewName(e.target.value)}91placeholder='Enter new name'92onKeyDown={handleKeyDown}93/>94</DialogContent>95<DialogActions>96<Button appearance='secondary' onClick={() => setIsRenameDialogOpen(false)}>Cancel</Button>97<Button appearance='primary' onClick={handleRenameConfirm}>Rename ↵</Button>98</DialogActions>99</DialogBody>100</DialogSurface>101</Dialog>102</div>103);104});105106107