1
1
import Button from "@mui/material/Button" ;
2
2
import IconButton from "@mui/material/IconButton" ;
3
3
import Link from "@mui/material/Link" ;
4
- import { makeStyles } from "@mui/styles" ;
5
4
import Tooltip from "@mui/material/Tooltip" ;
6
5
import CreateIcon from "@mui/icons-material/AddOutlined" ;
7
6
import BuildIcon from "@mui/icons-material/BuildOutlined" ;
@@ -21,7 +20,7 @@ import { AvatarData } from "components/AvatarData/AvatarData";
21
20
import { TemplateResourcesTable } from "components/TemplateResourcesTable/TemplateResourcesTable" ;
22
21
import { WorkspaceBuildLogs } from "components/WorkspaceBuildLogs/WorkspaceBuildLogs" ;
23
22
import { PublishVersionData } from "pages/TemplateVersionEditorPage/types" ;
24
- import { FC , useCallback , useEffect , useRef , useState } from "react" ;
23
+ import { type FC , useCallback , useEffect , useRef , useState } from "react" ;
25
24
import {
26
25
createFile ,
27
26
existsFile ,
@@ -46,17 +45,17 @@ import {
46
45
getStatus ,
47
46
TemplateVersionStatusBadge ,
48
47
} from "./TemplateVersionStatusBadge" ;
49
- import { Theme } from "@mui/material/styles" ;
50
48
import AlertTitle from "@mui/material/AlertTitle" ;
51
49
import { DashboardFullPage } from "components/Dashboard/DashboardLayout" ;
50
+ import { type Interpolation , type Theme , useTheme } from "@emotion/react" ;
52
51
53
52
export interface TemplateVersionEditorProps {
54
53
template : Template ;
55
54
templateVersion : TemplateVersion ;
55
+ isBuildingNewVersion : boolean ;
56
56
defaultFileTree : FileTree ;
57
57
buildLogs ?: ProvisionerJobLog [ ] ;
58
58
resources ?: WorkspaceResource [ ] ;
59
- deploymentBannerVisible ?: boolean ;
60
59
disablePreview : boolean ;
61
60
disableUpdate : boolean ;
62
61
onPreview : ( files : FileTree ) => void ;
@@ -92,8 +91,8 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
92
91
disablePreview,
93
92
disableUpdate,
94
93
template,
95
- deploymentBannerVisible,
96
94
templateVersion,
95
+ isBuildingNewVersion,
97
96
defaultFileTree,
98
97
onPreview,
99
98
onPublish,
@@ -111,6 +110,7 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
111
110
onSubmitMissingVariableValues,
112
111
onCancelSubmitMissingVariableValues,
113
112
} ) => {
113
+ const theme = useTheme ( ) ;
114
114
// If resources are provided, show them by default!
115
115
// This is for Storybook!
116
116
const [ selectedTab , setSelectedTab ] = useState ( ( ) => ( resources ? 1 : 0 ) ) ;
@@ -173,22 +173,20 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
173
173
const templateVersionSucceeded = templateVersion . job . status === "succeeded" ;
174
174
const showBuildLogs = Boolean ( buildLogs ) ;
175
175
const editorValue = getFileContent ( activePath ?? "" , fileTree ) as string ;
176
- const firstTemplateVersionOnEditor = useRef ( templateVersion ) ;
177
176
178
177
useEffect ( ( ) => {
179
178
window . dispatchEvent ( new Event ( "resize" ) ) ;
180
179
} , [ showBuildLogs ] ) ;
181
- const styles = useStyles ( {
182
- templateVersionSucceeded,
183
- showBuildLogs,
184
- deploymentBannerVisible,
185
- } ) ;
186
180
187
181
return (
188
182
< >
189
- < DashboardFullPage className = { styles . root } >
190
- < div className = { styles . topbar } data-testid = "topbar" >
191
- < div className = { styles . topbarSides } >
183
+ < DashboardFullPage
184
+ css = { {
185
+ background : theme . palette . background . default ,
186
+ } }
187
+ >
188
+ < div css = { styles . topbar } data-testid = "topbar" >
189
+ < div css = { styles . topbarSides } >
192
190
< Link
193
191
component = { RouterLink }
194
192
underline = "none"
@@ -220,12 +218,9 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
220
218
</ Alert >
221
219
) }
222
220
223
- < div className = { styles . topbarSides } >
224
- { /* Only start to show the build when a new template version is building */ }
225
- { templateVersion . id !== firstTemplateVersionOnEditor . current . id && (
226
- < div className = { styles . buildStatus } >
227
- < TemplateVersionStatusBadge version = { templateVersion } />
228
- </ div >
221
+ < div css = { styles . topbarSides } >
222
+ { isBuildingNewVersion && (
223
+ < TemplateVersionStatusBadge version = { templateVersion } />
229
224
) }
230
225
231
226
< Button
@@ -248,11 +243,11 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
248
243
</ div >
249
244
</ div >
250
245
251
- < div className = { styles . sidebarAndEditor } >
252
- < div className = { styles . sidebar } >
253
- < div className = { styles . sidebarTitle } >
246
+ < div css = { styles . sidebarAndEditor } >
247
+ < div css = { styles . sidebar } >
248
+ < div css = { styles . sidebarTitle } >
254
249
Template files
255
- < div className = { styles . sidebarActions } >
250
+ < div css = { styles . sidebarActions } >
256
251
< Tooltip title = "Create File" placement = "top" >
257
252
< IconButton
258
253
aria-label = "Create File"
@@ -331,8 +326,16 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
331
326
/>
332
327
</ div >
333
328
334
- < div className = { styles . editorPane } >
335
- < div className = { styles . editor } data-chromatic = "ignore" >
329
+ < div
330
+ css = { {
331
+ display : "grid" ,
332
+ width : "100%" ,
333
+ gridTemplateColumns : showBuildLogs ? "1fr 1fr" : "1fr 0fr" ,
334
+ minHeight : "100%" ,
335
+ overflow : "hidden" ,
336
+ } }
337
+ >
338
+ < div css = { styles . editor } data-chromatic = "ignore" >
336
339
{ activePath ? (
337
340
< MonacoEditor
338
341
value = { editorValue }
@@ -352,12 +355,12 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
352
355
) }
353
356
</ div >
354
357
355
- < div className = { styles . panelWrapper } >
356
- < div className = { styles . tabs } >
358
+ < div css = { styles . panelWrapper } >
359
+ < div css = { styles . tabs } >
357
360
< button
358
- className = { `${ styles . tab } ${
359
- selectedTab === 0 ? "active" : ""
360
- } `}
361
+ css = { `
362
+ ${ styles . tab } ${ selectedTab === 0 ? "active" : "" }
363
+ ` }
361
364
onClick = { ( ) => {
362
365
setSelectedTab ( 0 ) ;
363
366
} }
@@ -372,9 +375,9 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
372
375
373
376
{ ! disableUpdate && (
374
377
< button
375
- className = { `${ styles . tab } ${
376
- selectedTab === 1 ? "active" : ""
377
- } `}
378
+ css = { `
379
+ ${ styles . tab } ${ selectedTab === 1 ? "active" : "" }
380
+ ` }
378
381
onClick = { ( ) => {
379
382
setSelectedTab ( 1 ) ;
380
383
} }
@@ -386,9 +389,13 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
386
389
</ div >
387
390
388
391
< div
389
- className = { `${ styles . panel } ${ styles . buildLogs } ${
390
- selectedTab === 0 ? "" : "hidden"
391
- } `}
392
+ css = { [
393
+ styles . panel ,
394
+ {
395
+ display : selectedTab !== 0 ? "none" : "flex" ,
396
+ flexDirection : "column" ,
397
+ } ,
398
+ ] }
392
399
>
393
400
{ templateVersion . job . error && (
394
401
< div >
@@ -419,9 +426,13 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
419
426
</ div >
420
427
421
428
< div
422
- className = { `${ styles . panel } ${ styles . resources } ${
423
- selectedTab === 1 ? "" : "hidden"
424
- } `}
429
+ css = { [
430
+ styles . panel ,
431
+ {
432
+ paddingBottom : theme . spacing ( 2 ) ,
433
+ display : selectedTab !== 1 ? "none" : undefined ,
434
+ } ,
435
+ ] }
425
436
>
426
437
{ resources && (
427
438
< TemplateResourcesTable
@@ -432,12 +443,6 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
432
443
) }
433
444
</ div >
434
445
</ div >
435
-
436
- { templateVersionSucceeded && (
437
- < >
438
- < div className = { styles . panelDivider } />
439
- </ >
440
- ) }
441
446
</ div >
442
447
</ div >
443
448
</ DashboardFullPage >
@@ -462,48 +467,33 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
462
467
) ;
463
468
} ;
464
469
465
- const useStyles = makeStyles <
466
- Theme ,
467
- {
468
- templateVersionSucceeded : boolean ;
469
- showBuildLogs : boolean ;
470
- deploymentBannerVisible ?: boolean ;
471
- }
472
- > ( ( theme ) => ( {
473
- root : {
474
- background : theme . palette . background . default ,
475
- } ,
476
- topbar : {
470
+ const styles = {
471
+ topbar : ( theme ) => ( {
477
472
padding : theme . spacing ( 2 ) ,
478
473
borderBottom : `1px solid ${ theme . palette . divider } ` ,
479
474
display : "flex" ,
480
475
alignItems : "center" ,
481
476
justifyContent : "space-between" ,
482
477
height : topbarHeight ,
483
478
background : theme . palette . background . paper ,
484
- } ,
485
- topbarSides : {
479
+ } ) ,
480
+ topbarSides : ( theme ) => ( {
486
481
display : "flex" ,
487
482
alignItems : "center" ,
488
483
gap : theme . spacing ( 2 ) ,
489
- } ,
490
- buildStatus : {
491
- display : "flex" ,
492
- alignItems : "center" ,
493
- gap : 8 ,
494
- } ,
484
+ } ) ,
495
485
sidebarAndEditor : {
496
486
display : "flex" ,
497
487
flex : 1 ,
498
488
flexBasis : 0 ,
499
489
overflow : "hidden" ,
500
490
} ,
501
- sidebar : {
491
+ sidebar : ( theme ) => ( {
502
492
minWidth : 256 ,
503
493
backgroundColor : theme . palette . background . paper ,
504
494
borderRight : `1px solid ${ theme . palette . divider } ` ,
505
- } ,
506
- sidebarTitle : {
495
+ } ) ,
496
+ sidebarTitle : ( theme ) => ( {
507
497
fontSize : 10 ,
508
498
textTransform : "uppercase" ,
509
499
padding : theme . spacing ( 1 , 2 ) ,
@@ -512,45 +502,33 @@ const useStyles = makeStyles<
512
502
letterSpacing : "0.5px" ,
513
503
display : "flex" ,
514
504
alignItems : "center" ,
515
- } ,
516
- sidebarActions : {
505
+ } ) ,
506
+ sidebarActions : ( theme ) => ( {
517
507
marginLeft : "auto" ,
518
508
"& svg" : {
519
509
fill : theme . palette . text . primary ,
520
510
} ,
521
- } ,
522
- editorPane : {
523
- display : "grid" ,
524
- width : "100%" ,
525
- gridTemplateColumns : ( props ) =>
526
- props . showBuildLogs ? "1fr 1fr" : "1fr 0fr" ,
527
- minHeight : "100%" ,
528
- overflow : "hidden" ,
529
- } ,
511
+ } ) ,
530
512
editor : {
531
513
flex : 1 ,
532
514
} ,
533
- panelWrapper : {
515
+ panelWrapper : ( theme ) => ( {
534
516
flex : 1 ,
535
517
borderLeft : `1px solid ${ theme . palette . divider } ` ,
536
518
overflow : "hidden" ,
537
519
display : "flex" ,
538
520
flexDirection : "column" ,
539
- } ,
521
+ } ) ,
540
522
panel : {
541
523
overflowY : "auto" ,
542
524
height : "100%" ,
543
525
544
- "&.hidden" : {
545
- display : "none" ,
546
- } ,
547
-
548
526
// Hack to access customize resource-card from here
549
527
"& .resource-card" : {
550
528
border : 0 ,
551
529
} ,
552
530
} ,
553
- tabs : {
531
+ tabs : ( theme ) => ( {
554
532
borderBottom : `1px solid ${ theme . palette . divider } ` ,
555
533
display : "flex" ,
556
534
boxShadow : "#000000 0 6px 6px -6px inset" ,
@@ -561,8 +539,8 @@ const useStyles = makeStyles<
561
539
textTransform : "none" ,
562
540
letterSpacing : "unset" ,
563
541
} ,
564
- } ,
565
- tab : {
542
+ } ) ,
543
+ tab : ( theme ) => ( {
566
544
cursor : "pointer" ,
567
545
padding : theme . spacing ( 1.5 ) ,
568
546
fontSize : 10 ,
@@ -601,8 +579,8 @@ const useStyles = makeStyles<
601
579
"&:hover" : {
602
580
color : theme . palette . text . primary ,
603
581
} ,
604
- } ,
605
- tabBar : {
582
+ } ) ,
583
+ tabBar : ( theme ) => ( {
606
584
padding : "8px 16px" ,
607
585
position : "sticky" ,
608
586
top : 0 ,
@@ -615,12 +593,5 @@ const useStyles = makeStyles<
615
593
"&.top" : {
616
594
borderTop : `1px solid ${ theme . palette . divider } ` ,
617
595
} ,
618
- } ,
619
- buildLogs : {
620
- display : "flex" ,
621
- flexDirection : "column" ,
622
- } ,
623
- resources : {
624
- paddingBottom : theme . spacing ( 2 ) ,
625
- } ,
626
- } ) ) ;
596
+ } ) ,
597
+ } satisfies Record < string , Interpolation < Theme > > ;
0 commit comments