@@ -101,7 +90,7 @@ Right-click any folder for **New File** and **New Folder** entries that scope to
Filenames cannot be empty, cannot contain `/` or `\`, and cannot be `.` or `..`. The Create button stays disabled until the input passes validation.
-## Uploading files (Skipper+)
+## Uploading files
The dashed **Upload file** affordance at the top of the tree opens a file picker. Uploads are one file at a time.
@@ -111,21 +100,21 @@ The dashed **Upload file** affordance at the top of the tree opens a file picker
| Target directory | The currently selected directory, or the stack root if no file is open. |
| Same-name files | Overwritten without prompt. |
-On Community, and for users without stack edit permission, the upload affordance is hidden entirely.
+The upload affordance is hidden for users without stack edit permission.
-On Community the dialog opens read-only: the toggles render the current state and the footer shows only **Close**. On Skipper+ the toggles are interactive and the footer adds **Save**.
+When your account has stack edit permission, the toggles are interactive and the footer adds **Save**. For viewer accounts the dialog opens read-only: the toggles render the current state and the footer shows only **Close**.
-| Right-click target | Skipper+ entries | Community admin entries |
+| Right-click target | Admin entries (with stack edit) | Viewer entries |
|---|---|---|
| Folder | New File, New Folder, Rename, Delete | No write entries |
-| File | Rename, Permissions, Delete | Permissions |
+| File | Rename, Permissions, Delete | Permissions (read-only) |
-On Community, write actions are hidden in the file explorer. The Permissions dialog opens for everyone, but only Skipper and Admiral users can save changes.
+The Permissions dialog opens for everyone; only users with stack edit permission can save changes.
## Troubleshooting
@@ -192,12 +181,12 @@ On Community, write actions are hidden in the file explorer. The Permissions dia
The container caches the file at startup, or the mount is configured read-only inside the container. Restart the service after saving so the container picks up the new file.
{filename}
{label} · {formatBytes(size)}
- {canDownload && ( - - )} + ); } @@ -98,8 +92,6 @@ export function FileViewer({ isDarkMode, onSaved, }: FileViewerProps) { - const { isPaid } = useLicense(); - const [content, setContent] = useState(''); const [originalContent, setOriginalContent] = useState(''); const [loading, setLoading] = useState(false); @@ -109,7 +101,7 @@ export function FileViewer({ const [isOversized, setIsOversized] = useState(false); const [size, setSize] = useState(0); - const readOnly = !canEdit || !isPaid; + const readOnly = !canEdit; const editorOptions = useMemo( () => ({ @@ -220,7 +212,6 @@ export function FileViewer({ label="Binary file" stackName={stackName} relPath={selectedPath} - canDownload={isPaid} /> ); } @@ -233,7 +224,6 @@ export function FileViewer({ label="File too large to preview" stackName={stackName} relPath={selectedPath} - canDownload={isPaid} /> ); } diff --git a/frontend/src/components/files/StackFileExplorer.tsx b/frontend/src/components/files/StackFileExplorer.tsx index 51b5ba20..dce8b45c 100644 --- a/frontend/src/components/files/StackFileExplorer.tsx +++ b/frontend/src/components/files/StackFileExplorer.tsx @@ -2,7 +2,6 @@ import { useState, useEffect, useCallback } from 'react'; import { Trash2, FolderPlus, Download, Loader2 } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { toast } from '@/components/ui/toast-store'; -import { useLicense } from '@/context/LicenseContext'; import { downloadStackFile, listStackDirectory } from '@/lib/stackFilesApi'; import { FileTree } from './FileTree'; import { FileViewer } from './FileViewer'; @@ -29,7 +28,6 @@ export function StackFileExplorer({ onNavigateToCompose, onNavigateToEnv, }: StackFileExplorerProps) { - const { isPaid } = useLicense(); const [selectedPath, setSelectedPath] = useState