diff --git a/src/telemetry/index.ts b/src/telemetry/index.ts index 6d4c2611..c0520603 100644 --- a/src/telemetry/index.ts +++ b/src/telemetry/index.ts @@ -45,13 +45,15 @@ export function activateTelemetry(context: vscode.ExtensionContext) { // Track file open events const trackFileOpens = vscode.workspace.onDidOpenTextDocument((document) => { const fileName = document.fileName.toLowerCase(); - const fileType = - fileName.endsWith(".nf.test") ? ".nf.test" - : fileName.endsWith(".nf") ? ".nf" - : fileName.endsWith(".config") ? ".config" - : undefined; + const fileType = fileName.endsWith(".nf.test") + ? ".nf.test" + : fileName.endsWith(".nf") + ? ".nf" + : fileName.endsWith(".config") + ? ".config" + : undefined; if (fileType) { - trackEvent("fileOpened", { fileType }); + trackEvent("fileSelected", { fileType }); } }); context.subscriptions.push(trackFileOpens); @@ -110,13 +112,13 @@ function createTrackEvent(context: vscode.ExtensionContext) { } function isTelemetryEnabled(): boolean { - const globalTelemetryLevel = vscode.workspace - .getConfiguration("telemetry") - .get("telemetryLevel", "all"); - const enabled = vscode.workspace - .getConfiguration("nextflow") - .get("telemetry.enabled", false); - return globalTelemetryLevel !== "off" && enabled; + const globalTelemetryLevel = vscode.workspace + .getConfiguration("telemetry") + .get("telemetryLevel", "all"); + const enabled = vscode.workspace + .getConfiguration("nextflow") + .get("telemetry.enabled", false); + return globalTelemetryLevel !== "off" && enabled; } function getUserId(context: vscode.ExtensionContext): string { @@ -128,7 +130,9 @@ function getUserId(context: vscode.ExtensionContext): string { return anonId; } -export function deactivateTelemetry(context: vscode.ExtensionContext): Thenable { +export function deactivateTelemetry( + context: vscode.ExtensionContext +): Thenable { if (!isTelemetryEnabled() || !posthogClient) { return Promise.resolve(); } diff --git a/src/webview/WebviewProvider/index.ts b/src/webview/WebviewProvider/index.ts index 07f23cde..43cc0eab 100644 --- a/src/webview/WebviewProvider/index.ts +++ b/src/webview/WebviewProvider/index.ts @@ -148,6 +148,8 @@ class WebviewProvider implements vscode.WebviewViewProvider { public async initViewData(refresh?: boolean) { const { viewID, _context, _currentView: view } = this; if (!view) return; + const wsState = this._context.workspaceState; + const selectedFile = wsState.get("selectedFile"); if (viewID === "userInfo") { this.getRepoInfo(); const accessToken = await this.getAccessToken(); @@ -157,16 +159,25 @@ class WebviewProvider implements vscode.WebviewViewProvider { const fileList = buildList(); view.webview.postMessage({ fileList, - tree: buildTree(fileList.files) + tree: buildTree(fileList.files), + selectedFile }); } } - public async openFileEvent(filePath: string) { + public async reloadView() { + if (!this._currentView) return; + const html = this.getBuiltHTML(this._currentView); + this._currentView.webview.html = html; + await this.initViewData(true); + } + + public async setSelectedFile(filePath: string) { this._currentView?.webview.postMessage({ - command: "fileOpened", - filePath + selectedFile: filePath }); + const wsState = this._context.workspaceState; + wsState.update("selectedFile", filePath); } private async openFile(file: FileNode) { @@ -174,7 +185,6 @@ class WebviewProvider implements vscode.WebviewViewProvider { await vscode.window.showTextDocument(doc, { selection: new vscode.Range(file.line || 0, 0, file.line || 0, 0) }); - this.openFileEvent(file.filePath); } private async openChat() { diff --git a/src/webview/index.ts b/src/webview/index.ts index 6c17c109..8a56d71f 100644 --- a/src/webview/index.ts +++ b/src/webview/index.ts @@ -47,7 +47,7 @@ export function activateWebview( document.uri.fsPath.endsWith(".nf") || document.uri.fsPath.endsWith(".nf.test") ) { - workflowProvider.openFileEvent(document.uri.fsPath); + workflowProvider.setSelectedFile(document.uri.fsPath); } }); diff --git a/webview-ui/src/Context/WorkspaceProvider/index.tsx b/webview-ui/src/Context/WorkspaceProvider/index.tsx index b3cb1ed8..d6963243 100644 --- a/webview-ui/src/Context/WorkspaceProvider/index.tsx +++ b/webview-ui/src/Context/WorkspaceProvider/index.tsx @@ -13,6 +13,7 @@ const WorkspaceContext = createContext({ selectedItems: [], selectItem: () => {}, isSelected: () => false, + isSelectedFile: () => false, viewID: "", testCount: 0, login: () => {}, @@ -34,6 +35,7 @@ interface WorkspaceContextType { selectedItems: string[]; selectItem: (name: string) => void; isSelected: (name: string) => boolean; + isSelectedFile: (file: FileNodeType) => boolean; viewID: string; testCount: number; login: () => void; @@ -50,9 +52,18 @@ type Props = { vscode: any; viewID: string; isCursor: boolean; + selectedFile: string; + setSelectedFile: (file: string) => void; }; -const WorkspaceProvider = ({ children, vscode, viewID, isCursor }: Props) => { +const WorkspaceProvider = ({ + children, + vscode, + viewID, + isCursor, + selectedFile, + setSelectedFile +}: Props) => { const state = vscode.getState(); const [testCount, setTestCount] = useState(0); @@ -80,6 +91,9 @@ const WorkspaceProvider = ({ children, vscode, viewID, isCursor }: Props) => { useEffect(() => { const handleMessage = (event: MessageEvent) => { const message = event.data; + if (message.selectedFile) { + setSelectedFile(message.selectedFile); + } if (message.fileList) { const { files, tests } = message.fileList; setFiles(sortFiles(files || [])); @@ -105,6 +119,11 @@ const WorkspaceProvider = ({ children, vscode, viewID, isCursor }: Props) => { return selectedItems.includes(name); } + function isSelectedFile(file: FileNodeType) { + console.log("🟠 isSelectedFile", selectedFile, file.filePath); + return selectedFile === file.filePath; + } + function openFile(file: FileNodeType) { if (!file) return; vscode.postMessage({ command: "openFile", file }); @@ -148,6 +167,7 @@ const WorkspaceProvider = ({ children, vscode, viewID, isCursor }: Props) => { selectedItems, selectItem, isSelected, + isSelectedFile, testCount, login, viewID, diff --git a/webview-ui/src/Context/index.tsx b/webview-ui/src/Context/index.tsx index 57b483df..ed37de16 100644 --- a/webview-ui/src/Context/index.tsx +++ b/webview-ui/src/Context/index.tsx @@ -39,15 +39,14 @@ const Context = ({ children }: Props) => { const [workspaces, setWorkspaces] = useState([]); const [computeEnvs, setComputeEnvs] = useState([]); const [organizations, setOrganizations] = useState([]); - const [runs, setRuns] = useState( - undefined - ); + const [runs, setRuns] = useState(undefined); const [pipelines, setPipelines] = useState( undefined ); const [repoInfo, setRepoInfo] = useState(undefined); const [datasets, setDatasets] = useState([]); const [dataLinks, setDataLinks] = useState([]); + const [selectedFile, setSelectedFile] = useState(""); useEffect(() => { const handleMessage = (event: MessageEvent) => { @@ -63,13 +62,20 @@ const Context = ({ children }: Props) => { if (data.repoInfo) setRepoInfo(data.repoInfo); if (data.datasets) setDatasets(data.datasets); if (data.dataLinks) setDataLinks(data.dataLinks); + if (data.selectedFile) setSelectedFile(data.selectedFile); }; window.addEventListener("message", handleMessage); return () => window.removeEventListener("message", handleMessage); }, []); return ( - + {viewID === "userInfo" ? ( { - const { openFile, getTest, viewID: type } = useWorkspaceContext(); + const { + openFile, + getTest, + viewID: type, + isSelectedFile + } = useWorkspaceContext(); const testFile = getTest(node.name); let typeStyleName = "workflow"; if (type === "processes") { typeStyleName = "process"; } - return ( -
+
{type === "workflows" && ( - + )}
); diff --git a/webview-ui/src/components/FileList/FileNodeChildren.tsx b/webview-ui/src/components/FileList/FileNodeChildren.tsx index 91c716f7..621c2313 100644 --- a/webview-ui/src/components/FileList/FileNodeChildren.tsx +++ b/webview-ui/src/components/FileList/FileNodeChildren.tsx @@ -1,21 +1,28 @@ -import styles from "./styles.module.css"; +import clsx from "clsx"; import { useWorkspaceContext } from "../../Context"; +import { FileNode as FileNodeType } from "../../Context/WorkspaceProvider/types"; + +import styles from "./styles.module.css"; + const FileNodeChildren = ({ - parent, - label, - items = [] + fileNode, + label }: { - parent: string; + fileNode: FileNodeType; label: string; - items: string[]; }) => { - const { getFile, openFile, isSelected, selectItem } = useWorkspaceContext(); + const { getFile, openFile, isSelected, isSelectedFile, selectItem } = + useWorkspaceContext(); - const linkableFiles = items?.map((label) => getFile(label)).filter(Boolean); - const itemKey = `${parent}.${label}`; + const linkableFiles = fileNode?.imports + ?.map((label) => getFile(label)) + .filter(Boolean); + const itemKey = `${fileNode?.name}.${label}`; const isOpen = isSelected(itemKey); + if (!linkableFiles) return null; + return (