File tree Expand file tree Collapse file tree 5 files changed +84
-7
lines changed Expand file tree Collapse file tree 5 files changed +84
-7
lines changed Original file line number Diff line number Diff line change @@ -23,6 +23,10 @@ export class ExternalApi {
23
23
} ;
24
24
25
25
private fileClickCallbackListeners : ( ( url : string ) => void ) [ ] = [ ] ;
26
+ private openProjectConfigCallbackListeners : ( (
27
+ projectName : string
28
+ ) => void ) [ ] = [ ] ;
29
+ private runTaskCallbackListeners : ( ( taskId : string ) => void ) [ ] = [ ] ;
26
30
27
31
get depGraphService ( ) {
28
32
return this . projectGraphService ;
@@ -34,6 +38,14 @@ export class ExternalApi {
34
38
const url = `${ event . sourceRoot } /${ event . file } ` ;
35
39
this . fileClickCallbackListeners . forEach ( ( cb ) => cb ( url ) ) ;
36
40
}
41
+ if ( event . type === 'ProjectOpenConfigClick' ) {
42
+ this . openProjectConfigCallbackListeners . forEach ( ( cb ) =>
43
+ cb ( event . projectName )
44
+ ) ;
45
+ }
46
+ if ( event . type === 'RunTaskClick' ) {
47
+ this . runTaskCallbackListeners . forEach ( ( cb ) => cb ( event . taskId ) ) ;
48
+ }
37
49
} ) ;
38
50
}
39
51
@@ -58,6 +70,12 @@ export class ExternalApi {
58
70
registerFileClickCallback ( callback : ( url : string ) => void ) {
59
71
this . fileClickCallbackListeners . push ( callback ) ;
60
72
}
73
+ registerOpenProjectConfigCallback ( callback : ( projectName : string ) => void ) {
74
+ this . openProjectConfigCallbackListeners . push ( callback ) ;
75
+ }
76
+ registerRunTaskCallback ( callback : ( taskId : string ) => void ) {
77
+ this . runTaskCallbackListeners . push ( callback ) ;
78
+ }
61
79
62
80
private handleLegacyProjectGraphEvent ( event : ProjectGraphMachineEvents ) {
63
81
switch ( event . type ) {
Original file line number Diff line number Diff line change @@ -38,10 +38,22 @@ interface FileLinkClickEvent {
38
38
file : string ;
39
39
}
40
40
41
+ interface ProjectOpenConfigClickEvent {
42
+ type : 'ProjectOpenConfigClick' ;
43
+ projectName : string ;
44
+ }
45
+
46
+ interface RunTaskClickEvent {
47
+ type : 'RunTaskClick' ;
48
+ taskId : string ;
49
+ }
50
+
41
51
export type GraphInteractionEvents =
42
52
| ProjectNodeClickEvent
43
53
| EdgeClickEvent
44
54
| GraphRegeneratedEvent
45
55
| TaskNodeClickEvent
46
56
| BackgroundClickEvent
47
- | FileLinkClickEvent ;
57
+ | FileLinkClickEvent
58
+ | ProjectOpenConfigClickEvent
59
+ | RunTaskClickEvent ;
Original file line number Diff line number Diff line change @@ -20,16 +20,34 @@ export class GraphTooltipService {
20
20
this . hideAll ( ) ;
21
21
break ;
22
22
case 'ProjectNodeClick' :
23
+ const openConfigCallback =
24
+ graph . renderMode === 'nx-console'
25
+ ? ( ) =>
26
+ graph . broadcast ( {
27
+ type : 'ProjectOpenConfigClick' ,
28
+ projectName : event . data . id ,
29
+ } )
30
+ : undefined ;
23
31
this . openProjectNodeToolTip ( event . ref , {
24
32
id : event . data . id ,
25
33
tags : event . data . tags ,
26
34
type : event . data . type ,
27
35
description : event . data . description ,
36
+ openConfigCallback,
28
37
} ) ;
29
38
break ;
30
39
case 'TaskNodeClick' :
40
+ const runTaskCallback =
41
+ graph . renderMode === 'nx-console'
42
+ ? ( ) =>
43
+ graph . broadcast ( {
44
+ type : 'RunTaskClick' ,
45
+ taskId : event . data . id ,
46
+ } )
47
+ : undefined ;
31
48
this . openTaskNodeTooltip ( event . ref , {
32
49
...event . data ,
50
+ runTaskCallback,
33
51
} ) ;
34
52
break ;
35
53
case 'EdgeClick' :
Original file line number Diff line number Diff line change
1
+ import { PencilSquareIcon } from '@heroicons/react/24/outline' ;
1
2
import { Tag } from '@nx/graph/ui-components' ;
2
3
import { ReactNode } from 'react' ;
3
4
@@ -6,6 +7,7 @@ export interface ProjectNodeToolTipProps {
6
7
id : string ;
7
8
tags : string [ ] ;
8
9
description ?: string ;
10
+ openConfigCallback ?: ( ) => void ;
9
11
10
12
children ?: ReactNode | ReactNode [ ] ;
11
13
}
@@ -16,12 +18,24 @@ export function ProjectNodeToolTip({
16
18
tags,
17
19
children,
18
20
description,
21
+ openConfigCallback,
19
22
} : ProjectNodeToolTipProps ) {
20
23
return (
21
24
< div className = "text-sm text-slate-700 dark:text-slate-400" >
22
- < h4 >
23
- < Tag className = "mr-3" > { type } </ Tag >
24
- < span className = "font-mono" > { id } </ span >
25
+ < h4 className = "flex justify-between items-center gap-4" >
26
+ < div className = "flex items-center" >
27
+ < Tag className = "mr-3" > { type } </ Tag >
28
+ < span className = "font-mono" > { id } </ span >
29
+ </ div >
30
+ { openConfigCallback ? (
31
+ < button
32
+ className = " flex items-center rounded-md border-slate-300 bg-white p-1 font-medium text-slate-500 shadow-sm ring-1 transition hover:bg-slate-50 dark:border-slate-600 dark:bg-slate-800 dark:text-slate-400 dark:ring-slate-600 hover:dark:bg-slate-700"
33
+ title = "Edit project.json in editor"
34
+ onClick = { openConfigCallback }
35
+ >
36
+ < PencilSquareIcon className = "h-5 w-5" />
37
+ </ button >
38
+ ) : undefined }
25
39
</ h4 >
26
40
{ tags . length > 0 ? (
27
41
< p className = "my-2" >
Original file line number Diff line number Diff line change
1
+ import { PlayIcon } from '@heroicons/react/24/outline' ;
1
2
import { Tag } from '@nx/graph/ui-components' ;
2
3
3
4
export interface TaskNodeTooltipProps {
4
5
id : string ;
5
6
executor : string ;
7
+ runTaskCallback ?: ( ) => void ;
6
8
description ?: string ;
7
9
}
8
10
9
11
export function TaskNodeTooltip ( {
10
12
id,
11
13
executor,
12
14
description,
15
+ runTaskCallback : runTargetCallback ,
13
16
} : TaskNodeTooltipProps ) {
14
17
return (
15
18
< div className = "text-sm text-slate-700 dark:text-slate-400" >
16
- < h4 >
17
- < Tag className = "mr-3" > { executor } </ Tag >
18
- < span className = "font-mono" > { id } </ span >
19
+ < h4 className = "flex justify-between items-center gap-4" >
20
+ < div className = "flex items-center" >
21
+ < Tag className = "mr-3" > { executor } </ Tag >
22
+ < span className = "font-mono" > { id } </ span >
23
+ </ div >
24
+ { runTargetCallback ? (
25
+ < button
26
+ className = " flex items-center rounded-md border-slate-300 bg-white p-1 font-medium text-slate-500 shadow-sm ring-1 transition hover:bg-slate-50 dark:border-slate-600 dark:bg-slate-800 dark:text-slate-400 dark:ring-slate-600 hover:dark:bg-slate-700"
27
+ title = "Run Task"
28
+ onClick = { runTargetCallback }
29
+ >
30
+ < PlayIcon className = "h-5 w-5" />
31
+ </ button >
32
+ ) : undefined }
19
33
</ h4 >
34
+ < h4 > </ h4 >
20
35
{ description ? < p className = "mt-4" > { description } </ p > : null }
21
36
</ div >
22
37
) ;
You can’t perform that action at this time.
0 commit comments