@@ -5,8 +5,21 @@ import CropSquareIcon from "@mui/icons-material/CropSquare"
5
5
import PlayCircleOutlineIcon from "@mui/icons-material/PlayCircleOutline"
6
6
import ReplayIcon from "@mui/icons-material/Replay"
7
7
import { LoadingButton } from "components/LoadingButton/LoadingButton"
8
- import { FC } from "react"
8
+ import { FC , useRef , useState } from "react"
9
9
import BlockOutlined from "@mui/icons-material/BlockOutlined"
10
+ import ButtonGroup from "@mui/material/ButtonGroup"
11
+ import ExpandMoreOutlined from "@mui/icons-material/ExpandMoreOutlined"
12
+ import Popover from "@mui/material/Popover"
13
+ import {
14
+ HelpTooltipText ,
15
+ HelpTooltipTitle ,
16
+ } from "components/Tooltips/HelpTooltip/HelpTooltip"
17
+ import Box from "@mui/material/Box"
18
+ import { useQuery } from "@tanstack/react-query"
19
+ import { Workspace } from "api/typesGenerated"
20
+ import { getWorkspaceParameters } from "api/api"
21
+ import { BuildParametersForm } from "./BuildParametersPopover"
22
+ import { Loader } from "components/Loader/Loader"
10
23
11
24
interface WorkspaceAction {
12
25
loading ?: boolean
@@ -31,17 +44,92 @@ export const UpdateButton: FC<WorkspaceAction> = ({
31
44
)
32
45
}
33
46
34
- export const StartButton : FC < WorkspaceAction > = ( { handleAction, loading } ) => {
47
+ export const StartButton : FC < WorkspaceAction & { workspace : Workspace } > = ( {
48
+ handleAction,
49
+ workspace,
50
+ loading,
51
+ } ) => {
52
+ const anchorRef = useRef < HTMLButtonElement > ( null )
53
+ const [ isOpen , setIsOpen ] = useState ( false )
54
+ const { data : parameters } = useQuery ( {
55
+ queryKey : [ "workspace" , workspace . id , "parameters" ] ,
56
+ queryFn : ( ) => getWorkspaceParameters ( workspace ) ,
57
+ enabled : isOpen ,
58
+ } )
59
+ const ephemeralParameters = parameters
60
+ ? parameters . templateVersionRichParameters . filter ( ( p ) => p . ephemeral )
61
+ : undefined
62
+
35
63
return (
36
- < LoadingButton
37
- loading = { loading }
38
- loadingIndicator = "Starting..."
39
- loadingPosition = "start"
40
- startIcon = { < PlayCircleOutlineIcon /> }
41
- onClick = { handleAction }
64
+ < ButtonGroup
65
+ variant = "outlined"
66
+ sx = { {
67
+ // Workaround to make the border transitions smmothly on button groups
68
+ "& > button:hover + button" : {
69
+ borderLeft : "1px solid #FFF" ,
70
+ } ,
71
+ } }
42
72
>
43
- Start
44
- </ LoadingButton >
73
+ < LoadingButton
74
+ loading = { loading }
75
+ loadingIndicator = "Starting..."
76
+ loadingPosition = "start"
77
+ startIcon = { < PlayCircleOutlineIcon /> }
78
+ onClick = { handleAction }
79
+ >
80
+ Start
81
+ </ LoadingButton >
82
+ < Button
83
+ disabled = { loading }
84
+ color = "neutral"
85
+ sx = { { px : 0 } }
86
+ ref = { anchorRef }
87
+ onClick = { ( ) => {
88
+ setIsOpen ( true )
89
+ } }
90
+ >
91
+ < ExpandMoreOutlined sx = { { fontSize : 16 } } />
92
+ </ Button >
93
+ < Popover
94
+ open = { isOpen }
95
+ anchorEl = { anchorRef . current }
96
+ onClose = { ( ) => {
97
+ setIsOpen ( false )
98
+ } }
99
+ anchorOrigin = { {
100
+ vertical : "bottom" ,
101
+ horizontal : "right" ,
102
+ } }
103
+ transformOrigin = { {
104
+ vertical : "top" ,
105
+ horizontal : "right" ,
106
+ } }
107
+ sx = { {
108
+ ".MuiPaper-root" : {
109
+ p : 2.5 ,
110
+ width : ( theme ) => theme . spacing ( 38 ) ,
111
+ marginTop : 1 ,
112
+ } ,
113
+ } }
114
+ >
115
+ < Box sx = { { color : ( theme ) => theme . palette . text . secondary } } >
116
+ < HelpTooltipTitle > Build Options</ HelpTooltipTitle >
117
+ < HelpTooltipText >
118
+ These parameters only apply for a single workspace start.
119
+ </ HelpTooltipText >
120
+ </ Box >
121
+ < Box >
122
+ { parameters && parameters . buildParameters && ephemeralParameters ? (
123
+ < BuildParametersForm
124
+ buildParameters = { parameters . buildParameters }
125
+ ephemeralParameters = { ephemeralParameters }
126
+ />
127
+ ) : (
128
+ < Loader />
129
+ ) }
130
+ </ Box >
131
+ </ Popover >
132
+ </ ButtonGroup >
45
133
)
46
134
}
47
135
0 commit comments