feat(webui): complete files quick access

This commit is contained in:
2026-08-19 19:48:56 +02:00
parent ad55d47645
commit e1361427b8
9 changed files with 228 additions and 17 deletions
+40
View File
@@ -16,6 +16,7 @@ import { FormGrid, ActionToolbar,
type ApiSettings,
type AuthInfo, i18nMessage } from
"@govoplan/core-webui";
import { useLocation, useNavigate } from "react-router";
import {
bulkDeleteFiles,
bulkRenameFiles,
@@ -114,12 +115,15 @@ const FILES_WORKFLOW_DOCUMENTATION = {
} as const;
export default function FilesPage({ settings, auth }: {settings: ApiSettings;auth: AuthInfo;}) {
const location = useLocation();
const navigate = useNavigate();
const canDownload = hasScope(auth, "files:download");
const canUpload = hasScope(auth, "files:upload");
const canOrganize = hasScope(auth, "files:organize");
const canDelete = hasScope(auth, "files:delete");
const canShare = hasScope(auth, "files:file:share");
const [spaces, setSpaces] = useState<FileSpace[]>(EMPTY_SPACES);
const [spacesLoaded, setSpacesLoaded] = useState(false);
const [activeSpaceId, setActiveSpaceId] = useState("");
const activeSpace = spaces.find((space) => space.id === activeSpaceId) ?? spaces[0] ?? null;
const activeSpaceIsConnector = activeSpace?.space_type === "connector";
@@ -330,6 +334,7 @@ export default function FilesPage({ settings, auth }: {settings: ApiSettings;aut
}, [activeSpaceId, currentFolder, propertyFiltersActive, propertyFilterResults, searchActive, searchResults, sortColumn, sortDirection]);
async function loadSpaces() {
setSpacesLoaded(false);
setBusy(true);
setError("");
try {
@@ -341,6 +346,7 @@ export default function FilesPage({ settings, auth }: {settings: ApiSettings;aut
} catch (err) {
setError(err instanceof Error ? err.message : String(err));
} finally {
setSpacesLoaded(true);
setBusy(false);
}
}
@@ -434,6 +440,40 @@ export default function FilesPage({ settings, auth }: {settings: ApiSettings;aut
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [settings.apiBaseUrl, settings.apiKey, settings.accessToken]);
useEffect(() => {
const parameters = new URLSearchParams(location.search);
if (parameters.get("quickAction") !== "upload" || !spacesLoaded) return;
const uploadSpace =
activeSpace && !isConnectorSpace(activeSpace)
? activeSpace
: spaces.find((space) => !isConnectorSpace(space)) ?? null;
if (canUpload && uploadSpace) {
setActiveSpaceId(uploadSpace.id);
openDialog("upload", { spaceId: uploadSpace.id, folderPath: "" });
} else if (!canUpload) {
setError("File upload permission is required.");
} else {
setError("No authorized managed file space is available for upload.");
}
parameters.delete("quickAction");
const search = parameters.toString();
navigate(
{ pathname: location.pathname, search: search ? `?${search}` : "" },
{ replace: true, state: location.state }
);
}, [
activeSpace,
canUpload,
location.pathname,
location.search,
location.state,
navigate,
spaces,
spacesLoaded
]);
useEffect(() => {
if (!contextMenu) return undefined;
const close = () => setContextMenu(null);