Skip to content

Commit 4403a18

Browse files
committed
Keep user navigation from URL
1 parent ce75edd commit 4403a18

File tree

3 files changed

+47
-21
lines changed

3 files changed

+47
-21
lines changed

site/src/pages/TemplateVersionEditorPage/FileTreeView.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ export const FileTreeView: FC<FileTreeViewProps> = ({
151151
defaultCollapseIcon={<ExpandMoreIcon />}
152152
defaultExpandIcon={<ChevronRightIcon />}
153153
aria-label="Files"
154+
defaultExpanded={activePath ? expandablePaths(activePath) : []}
154155
defaultSelected={activePath}
155156
>
156157
{Object.keys(fileTree)
@@ -234,3 +235,12 @@ const FileTypeMarkdown: FC = () => (
234235
<polygon points="22.955 20.636 18.864 16.136 21.591 16.136 21.591 11.364 24.318 11.364 24.318 16.136 27.045 16.136 22.955 20.636" />
235236
</svg>
236237
);
238+
239+
const expandablePaths = (path: string) => {
240+
const paths = path.split("/");
241+
const result = [];
242+
for (let i = 1; i < paths.length; i++) {
243+
result.push(paths.slice(0, i).join("/"));
244+
}
245+
return result;
246+
};

site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import {
3030
isFolder,
3131
moveFile,
3232
removeFile,
33-
traverse,
3433
updateFile,
3534
} from "utils/filetree";
3635
import {
@@ -83,20 +82,10 @@ export interface TemplateVersionEditorProps {
8382
defaultTab?: Tab;
8483
provisionerTags: Record<string, string>;
8584
onUpdateProvisionerTags: (tags: Record<string, string>) => void;
85+
activePath: string | undefined;
86+
onActivePathChange: (path: string | undefined) => void;
8687
}
8788

88-
const findInitialFile = (fileTree: FileTree): string | undefined => {
89-
let initialFile: string | undefined;
90-
91-
traverse(fileTree, (content, filename, path) => {
92-
if (filename.endsWith(".tf")) {
93-
initialFile = path;
94-
}
95-
});
96-
97-
return initialFile;
98-
};
99-
10089
export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
10190
disablePreview,
10291
disableUpdate,
@@ -121,6 +110,8 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
121110
defaultTab,
122111
provisionerTags,
123112
onUpdateProvisionerTags,
113+
activePath,
114+
onActivePathChange,
124115
}) => {
125116
const theme = useTheme();
126117
const [selectedTab, setSelectedTab] = useState<Tab>(defaultTab);
@@ -129,9 +120,6 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
129120
const [deleteFileOpen, setDeleteFileOpen] = useState<string>();
130121
const [renameFileOpen, setRenameFileOpen] = useState<string>();
131122
const [dirty, setDirty] = useState(false);
132-
const [activePath, setActivePath] = useState<string | undefined>(() =>
133-
findInitialFile(fileTree),
134-
);
135123

136124
const triggerPreview = useCallback(() => {
137125
onPreview(fileTree);
@@ -382,7 +370,7 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
382370
checkExists={(path) => existsFile(path, fileTree)}
383371
onConfirm={(path) => {
384372
setFileTree((fileTree) => createFile(path, fileTree, ""));
385-
setActivePath(path);
373+
onActivePathChange(path);
386374
setCreateFileOpen(false);
387375
setDirty(true);
388376
}}
@@ -397,7 +385,7 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
397385
);
398386
setDeleteFileOpen(undefined);
399387
if (activePath === deleteFileOpen) {
400-
setActivePath(undefined);
388+
onActivePathChange(undefined);
401389
}
402390
setDirty(true);
403391
}}
@@ -420,7 +408,7 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
420408
setFileTree((fileTree) =>
421409
moveFile(renameFileOpen, newPath, fileTree),
422410
);
423-
setActivePath(newPath);
411+
onActivePathChange(newPath);
424412
setRenameFileOpen(undefined);
425413
setDirty(true);
426414
}}
@@ -431,7 +419,7 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
431419
onDelete={(file) => setDeleteFileOpen(file)}
432420
onSelect={(filePath) => {
433421
if (!isFolder(filePath, fileTree)) {
434-
setActivePath(filePath);
422+
onActivePathChange(filePath);
435423
}
436424
}}
437425
onRename={(file) => setRenameFileOpen(file)}

site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.tsx

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { type FC, useEffect, useState } from "react";
22
import { Helmet } from "react-helmet-async";
33
import { useMutation, useQuery, useQueryClient } from "react-query";
4-
import { useNavigate, useParams } from "react-router-dom";
4+
import { useNavigate, useParams, useSearchParams } from "react-router-dom";
55
import { TemplateVersionEditor } from "./TemplateVersionEditor";
66
import { useOrganizationId } from "contexts/auth/useOrganizationId";
77
import { pageTitle } from "utils/page";
@@ -76,6 +76,20 @@ export const TemplateVersionEditorPage: FC = () => {
7676
const [lastSuccessfulPublishedVersion, setLastSuccessfulPublishedVersion] =
7777
useState<TemplateVersion>();
7878

79+
// File navigation
80+
const [searchParams, setSearchParams] = useSearchParams();
81+
// It can be undefined when a selected file is deleted
82+
const activePath: string | undefined =
83+
searchParams.get("path") ?? findInitialFile(fileTree ?? {});
84+
const onActivePathChange = (path: string | undefined) => {
85+
if (path) {
86+
searchParams.set("path", path);
87+
} else {
88+
searchParams.delete("path");
89+
}
90+
setSearchParams(searchParams);
91+
};
92+
7993
const navigateToVersion = (version: TemplateVersion) => {
8094
return navigate(
8195
`/templates/${templateName}/versions/${version.name}/edit`,
@@ -122,6 +136,8 @@ export const TemplateVersionEditorPage: FC = () => {
122136

123137
{templateQuery.data && templateVersionQuery.data && fileTree ? (
124138
<TemplateVersionEditor
139+
activePath={activePath}
140+
onActivePathChange={onActivePathChange}
125141
template={templateQuery.data}
126142
templateVersion={templateVersionQuery.data}
127143
defaultFileTree={fileTree}
@@ -372,4 +388,16 @@ const publishVersion = async (options: {
372388
return Promise.all(publishActions);
373389
};
374390

391+
const findInitialFile = (fileTree: FileTree): string | undefined => {
392+
let initialFile: string | undefined;
393+
394+
traverse(fileTree, (content, filename, path) => {
395+
if (filename.endsWith(".tf")) {
396+
initialFile = path;
397+
}
398+
});
399+
400+
return initialFile;
401+
};
402+
375403
export default TemplateVersionEditorPage;

0 commit comments

Comments
 (0)