feat(graph): add more graph to editor communication (#18315)
This commit is contained in:
parent
054a371aab
commit
d5ceca9499
@ -23,6 +23,10 @@ export class ExternalApi {
|
|||||||
};
|
};
|
||||||
|
|
||||||
private fileClickCallbackListeners: ((url: string) => void)[] = [];
|
private fileClickCallbackListeners: ((url: string) => void)[] = [];
|
||||||
|
private openProjectConfigCallbackListeners: ((
|
||||||
|
projectName: string
|
||||||
|
) => void)[] = [];
|
||||||
|
private runTaskCallbackListeners: ((taskId: string) => void)[] = [];
|
||||||
|
|
||||||
get depGraphService() {
|
get depGraphService() {
|
||||||
return this.projectGraphService;
|
return this.projectGraphService;
|
||||||
@ -34,6 +38,14 @@ export class ExternalApi {
|
|||||||
const url = `${event.sourceRoot}/${event.file}`;
|
const url = `${event.sourceRoot}/${event.file}`;
|
||||||
this.fileClickCallbackListeners.forEach((cb) => cb(url));
|
this.fileClickCallbackListeners.forEach((cb) => cb(url));
|
||||||
}
|
}
|
||||||
|
if (event.type === 'ProjectOpenConfigClick') {
|
||||||
|
this.openProjectConfigCallbackListeners.forEach((cb) =>
|
||||||
|
cb(event.projectName)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (event.type === 'RunTaskClick') {
|
||||||
|
this.runTaskCallbackListeners.forEach((cb) => cb(event.taskId));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -58,6 +70,12 @@ export class ExternalApi {
|
|||||||
registerFileClickCallback(callback: (url: string) => void) {
|
registerFileClickCallback(callback: (url: string) => void) {
|
||||||
this.fileClickCallbackListeners.push(callback);
|
this.fileClickCallbackListeners.push(callback);
|
||||||
}
|
}
|
||||||
|
registerOpenProjectConfigCallback(callback: (projectName: string) => void) {
|
||||||
|
this.openProjectConfigCallbackListeners.push(callback);
|
||||||
|
}
|
||||||
|
registerRunTaskCallback(callback: (taskId: string) => void) {
|
||||||
|
this.runTaskCallbackListeners.push(callback);
|
||||||
|
}
|
||||||
|
|
||||||
private handleLegacyProjectGraphEvent(event: ProjectGraphMachineEvents) {
|
private handleLegacyProjectGraphEvent(event: ProjectGraphMachineEvents) {
|
||||||
switch (event.type) {
|
switch (event.type) {
|
||||||
|
|||||||
@ -38,10 +38,22 @@ interface FileLinkClickEvent {
|
|||||||
file: string;
|
file: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface ProjectOpenConfigClickEvent {
|
||||||
|
type: 'ProjectOpenConfigClick';
|
||||||
|
projectName: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface RunTaskClickEvent {
|
||||||
|
type: 'RunTaskClick';
|
||||||
|
taskId: string;
|
||||||
|
}
|
||||||
|
|
||||||
export type GraphInteractionEvents =
|
export type GraphInteractionEvents =
|
||||||
| ProjectNodeClickEvent
|
| ProjectNodeClickEvent
|
||||||
| EdgeClickEvent
|
| EdgeClickEvent
|
||||||
| GraphRegeneratedEvent
|
| GraphRegeneratedEvent
|
||||||
| TaskNodeClickEvent
|
| TaskNodeClickEvent
|
||||||
| BackgroundClickEvent
|
| BackgroundClickEvent
|
||||||
| FileLinkClickEvent;
|
| FileLinkClickEvent
|
||||||
|
| ProjectOpenConfigClickEvent
|
||||||
|
| RunTaskClickEvent;
|
||||||
|
|||||||
@ -20,16 +20,34 @@ export class GraphTooltipService {
|
|||||||
this.hideAll();
|
this.hideAll();
|
||||||
break;
|
break;
|
||||||
case 'ProjectNodeClick':
|
case 'ProjectNodeClick':
|
||||||
|
const openConfigCallback =
|
||||||
|
graph.renderMode === 'nx-console'
|
||||||
|
? () =>
|
||||||
|
graph.broadcast({
|
||||||
|
type: 'ProjectOpenConfigClick',
|
||||||
|
projectName: event.data.id,
|
||||||
|
})
|
||||||
|
: undefined;
|
||||||
this.openProjectNodeToolTip(event.ref, {
|
this.openProjectNodeToolTip(event.ref, {
|
||||||
id: event.data.id,
|
id: event.data.id,
|
||||||
tags: event.data.tags,
|
tags: event.data.tags,
|
||||||
type: event.data.type,
|
type: event.data.type,
|
||||||
description: event.data.description,
|
description: event.data.description,
|
||||||
|
openConfigCallback,
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case 'TaskNodeClick':
|
case 'TaskNodeClick':
|
||||||
|
const runTaskCallback =
|
||||||
|
graph.renderMode === 'nx-console'
|
||||||
|
? () =>
|
||||||
|
graph.broadcast({
|
||||||
|
type: 'RunTaskClick',
|
||||||
|
taskId: event.data.id,
|
||||||
|
})
|
||||||
|
: undefined;
|
||||||
this.openTaskNodeTooltip(event.ref, {
|
this.openTaskNodeTooltip(event.ref, {
|
||||||
...event.data,
|
...event.data,
|
||||||
|
runTaskCallback,
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case 'EdgeClick':
|
case 'EdgeClick':
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
import { PencilSquareIcon } from '@heroicons/react/24/outline';
|
||||||
import { Tag } from '@nx/graph/ui-components';
|
import { Tag } from '@nx/graph/ui-components';
|
||||||
import { ReactNode } from 'react';
|
import { ReactNode } from 'react';
|
||||||
|
|
||||||
@ -6,6 +7,7 @@ export interface ProjectNodeToolTipProps {
|
|||||||
id: string;
|
id: string;
|
||||||
tags: string[];
|
tags: string[];
|
||||||
description?: string;
|
description?: string;
|
||||||
|
openConfigCallback?: () => void;
|
||||||
|
|
||||||
children?: ReactNode | ReactNode[];
|
children?: ReactNode | ReactNode[];
|
||||||
}
|
}
|
||||||
@ -16,12 +18,24 @@ export function ProjectNodeToolTip({
|
|||||||
tags,
|
tags,
|
||||||
children,
|
children,
|
||||||
description,
|
description,
|
||||||
|
openConfigCallback,
|
||||||
}: ProjectNodeToolTipProps) {
|
}: ProjectNodeToolTipProps) {
|
||||||
return (
|
return (
|
||||||
<div className="text-sm text-slate-700 dark:text-slate-400">
|
<div className="text-sm text-slate-700 dark:text-slate-400">
|
||||||
<h4>
|
<h4 className="flex justify-between items-center gap-4">
|
||||||
|
<div className="flex items-center">
|
||||||
<Tag className="mr-3">{type}</Tag>
|
<Tag className="mr-3">{type}</Tag>
|
||||||
<span className="font-mono">{id}</span>
|
<span className="font-mono">{id}</span>
|
||||||
|
</div>
|
||||||
|
{openConfigCallback ? (
|
||||||
|
<button
|
||||||
|
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"
|
||||||
|
title="Edit project.json in editor"
|
||||||
|
onClick={openConfigCallback}
|
||||||
|
>
|
||||||
|
<PencilSquareIcon className="h-5 w-5" />
|
||||||
|
</button>
|
||||||
|
) : undefined}
|
||||||
</h4>
|
</h4>
|
||||||
{tags.length > 0 ? (
|
{tags.length > 0 ? (
|
||||||
<p className="my-2">
|
<p className="my-2">
|
||||||
|
|||||||
@ -1,8 +1,10 @@
|
|||||||
|
import { PlayIcon } from '@heroicons/react/24/outline';
|
||||||
import { Tag } from '@nx/graph/ui-components';
|
import { Tag } from '@nx/graph/ui-components';
|
||||||
|
|
||||||
export interface TaskNodeTooltipProps {
|
export interface TaskNodeTooltipProps {
|
||||||
id: string;
|
id: string;
|
||||||
executor: string;
|
executor: string;
|
||||||
|
runTaskCallback?: () => void;
|
||||||
description?: string;
|
description?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -10,13 +12,26 @@ export function TaskNodeTooltip({
|
|||||||
id,
|
id,
|
||||||
executor,
|
executor,
|
||||||
description,
|
description,
|
||||||
|
runTaskCallback: runTargetCallback,
|
||||||
}: TaskNodeTooltipProps) {
|
}: TaskNodeTooltipProps) {
|
||||||
return (
|
return (
|
||||||
<div className="text-sm text-slate-700 dark:text-slate-400">
|
<div className="text-sm text-slate-700 dark:text-slate-400">
|
||||||
<h4>
|
<h4 className="flex justify-between items-center gap-4">
|
||||||
|
<div className="flex items-center">
|
||||||
<Tag className="mr-3">{executor}</Tag>
|
<Tag className="mr-3">{executor}</Tag>
|
||||||
<span className="font-mono">{id}</span>
|
<span className="font-mono">{id}</span>
|
||||||
|
</div>
|
||||||
|
{runTargetCallback ? (
|
||||||
|
<button
|
||||||
|
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"
|
||||||
|
title="Run Task"
|
||||||
|
onClick={runTargetCallback}
|
||||||
|
>
|
||||||
|
<PlayIcon className="h-5 w-5" />
|
||||||
|
</button>
|
||||||
|
) : undefined}
|
||||||
</h4>
|
</h4>
|
||||||
|
<h4></h4>
|
||||||
{description ? <p className="mt-4">{description}</p> : null}
|
{description ? <p className="mt-4">{description}</p> : null}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user