diff --git a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditor/FileBrowser.test.tsx b/plugins/scaffolder/src/components/FileBrowser/FileBrowser.test.tsx
similarity index 100%
rename from plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditor/FileBrowser.test.tsx
rename to plugins/scaffolder/src/components/FileBrowser/FileBrowser.test.tsx
diff --git a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditor/FileBrowser.tsx b/plugins/scaffolder/src/components/FileBrowser/FileBrowser.tsx
similarity index 76%
rename from plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditor/FileBrowser.tsx
rename to plugins/scaffolder/src/components/FileBrowser/FileBrowser.tsx
index a815fc06f2..1273b8ad09 100644
--- a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditor/FileBrowser.tsx
+++ b/plugins/scaffolder/src/components/FileBrowser/FileBrowser.tsx
@@ -20,12 +20,6 @@ import TreeView from '@material-ui/lab/TreeView';
import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
import ChevronRightIcon from '@material-ui/icons/ChevronRight';
import TreeItem from '@material-ui/lab/TreeItem';
-import {
- TemplateDirectoryAccess,
- TemplateFileAccess,
-} from '../../../lib/filesystem';
-import { useAsync, useMountEffect } from '@react-hookz/web';
-import { ErrorPanel, Progress } from '@backstage/core-components';
const useStyles = makeStyles({
root: {
@@ -114,11 +108,15 @@ function FileTreeItem({ entry }: { entry: FileEntry }) {
}
interface FileBrowserProps {
- selected?: string;
+ /** A list of all filepaths to show, directories are separated with a `/` */
filePaths: string[];
+ /** The currently selected file */
+ selected?: string;
+ /** Callback for when a file is selected */
onSelect?(filePath: string): void;
}
+/** A simple file browser that allows you to select individual files */
export function FileBrowser(props: FileBrowserProps) {
const classes = useStyles();
@@ -145,41 +143,3 @@ export function FileBrowser(props: FileBrowserProps) {
);
}
-
-interface TemplateDirectoryAccessBrowserProps {
- directory: TemplateDirectoryAccess;
- onSelect?(file: TemplateFileAccess): void;
-}
-
-function TemplateDirectoryAccessBrowser(
- props: TemplateDirectoryAccessBrowserProps,
-) {
- const [state, { execute }] = useAsync(async () => {
- const files = await props.directory.listFiles();
- return {
- filePaths: files.map(file => file.path),
- getFile: (path: string) => files.find(file => file.path === path),
- };
- });
-
- useMountEffect(execute);
-
- if (state.error) {
- return ;
- } else if (!state.result) {
- return ;
- }
-
- const handleSelect = (path: string) => {
- const file = state.result?.getFile(path);
- if (file) {
- props.onSelect?.(file);
- }
- };
-
- return (
-
- );
-}
-
-FileBrowser.TemplateDirectoryAccess = TemplateDirectoryAccessBrowser;
diff --git a/plugins/scaffolder/src/components/FileBrowser/index.ts b/plugins/scaffolder/src/components/FileBrowser/index.ts
new file mode 100644
index 0000000000..5d18109a9c
--- /dev/null
+++ b/plugins/scaffolder/src/components/FileBrowser/index.ts
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2022 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export { FileBrowser } from './FileBrowser';
diff --git a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditor/DryRunResults/DryRunResultsView.tsx b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditor/DryRunResults/DryRunResultsView.tsx
index 1b03d80f34..9e0f613d91 100644
--- a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditor/DryRunResults/DryRunResultsView.tsx
+++ b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditor/DryRunResults/DryRunResultsView.tsx
@@ -27,7 +27,7 @@ import React, { useEffect, useMemo, useState } from 'react';
import { TaskStatusStepper } from '../../../TaskPage/TaskPage';
import { TaskPageLinks } from '../../../TaskPage/TaskPageLinks';
import { useDryRun } from '../DryRunContext';
-import { FileBrowser } from '../FileBrowser';
+import { FileBrowser } from '../../../FileBrowser';
import { DryRunResultsSplitView } from './DryRunResultsSplitView';
const useStyles = makeStyles({
diff --git a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditor/TemplateEditor.tsx b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditor/TemplateEditor.tsx
index be3ae84d39..e1900357ad 100644
--- a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditor/TemplateEditor.tsx
+++ b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditor/TemplateEditor.tsx
@@ -44,7 +44,7 @@ import { TemplateParameterSchema } from '../../../types';
import { MultistepJsonForm } from '../../MultistepJsonForm';
import { createValidator } from '../../TemplatePage';
import { TemplateDirectoryAccess } from '../../../lib/filesystem';
-import { FileBrowser } from './FileBrowser';
+import { FileBrowser } from '../../FileBrowser';
import {
DirectoryEditorProvider,
useDirectoryEditor,