Files
govoplan-files/webui/src/module.ts
T
zemion 2baa8f2657
Module Package Release / publish-packages (push) Successful in 11s
feat: promote files to a stable product destination
2026-08-24 17:58:33 +02:00

171 lines
6.1 KiB
TypeScript

import { createElement, lazy } from "react";
import {
hasScope,
type AdminSectionsUiCapability,
type DashboardWidgetsUiCapability,
type FilesConnectorsUiCapability,
type FilesFileExplorerUiCapability,
type PlatformWebModule,
type QuickAccessToolsUiCapability
} from "@govoplan/core-webui";
import { generatedTranslations as productSurfaceTranslations } from "@govoplan/core-webui/outcome-product-surface-translations";
import { FolderTree } from "./features/files/components/FileManagerComponents";
import FileConnectorSettingsPanel from "./features/files/FileConnectorSettingsPanel";
import ManagedFileChooser from "./features/files/components/ManagedFileChooser";
import FileSpacesWidget from "./features/files/FileSpacesWidget";
import FileQuickAccess from "./features/files/FileQuickAccess";
import { listFileSpaces, listFiles, listFilesDelta, listFolders, resolveFilePatterns, shareFilesWithTarget } from "./api/files";
import { generatedTranslations } from "./i18n/generatedTranslations";
import "./styles/file-manager.css";
const FilesPage = lazy(() => import("./features/files/FilesPage"));
const FileIntegrityPanel = lazy(() => import("./features/files/FileIntegrityPanel"));
const fileRead = ["files:file:read"];
const translations = {
en: { ...generatedTranslations.en, ...productSurfaceTranslations.en },
de: { ...generatedTranslations.de, ...productSurfaceTranslations.de }
};
const fileDashboardWidgets: DashboardWidgetsUiCapability = {
widgets: [
{
id: "files.spaces",
surfaceId: "files.widget.spaces",
title: "File spaces",
description: "Managed and connected file spaces available to you.",
moduleId: "files",
category: "Content",
order: 35,
defaultVisible: false,
defaultSize: "medium",
supportedSizes: ["medium", "wide"],
anyOf: fileRead,
refreshIntervalMs: 60_000,
defaultConfiguration: {
maxItems: 6,
includeConnectors: true
},
configurationFields: [
{
id: "maxItems",
label: "Maximum spaces",
kind: "number",
min: 1,
max: 16,
step: 1,
required: true
},
{
id: "includeConnectors",
label: "Include connected storage",
kind: "boolean"
}
],
render: ({ settings, refreshKey, configuration }) =>
createElement(FileSpacesWidget, {
settings,
refreshKey,
configuration
})
}
]
};
const fileQuickAccessTools: QuickAccessToolsUiCapability = {
tools: [
{
id: "files.recent",
render: (context) => createElement(FileQuickAccess, context)
}
]
};
const fileConnectorAdminSections: AdminSectionsUiCapability = {
sections: [
{
id: "system-file-connectors",
moduleId: "files",
kind: "settings",
surfaceId: "files.admin.system-connectors",
label: "i18n:govoplan-files.file_connections.1e362326",
group: "SYSTEM",
order: 75,
anyOf: ["system:settings:read", "files:file:admin"],
render: ({ settings, auth }) => createElement(FileConnectorSettingsPanel, {
settings,
scopeType: "system",
canWrite: hasScope(auth, "system:settings:write") || hasScope(auth, "files:file:admin")
})
},
{
id: "tenant-file-connectors",
moduleId: "files",
kind: "settings",
surfaceId: "files.admin.tenant-connectors",
label: "i18n:govoplan-files.file_connections.1e362326",
group: "TENANT",
order: 65,
anyOf: ["admin:settings:read", "files:file:admin"],
render: ({ settings, auth }) => createElement(FileConnectorSettingsPanel, {
settings,
scopeType: "tenant",
canWrite: hasScope(auth, "admin:settings:write") || hasScope(auth, "files:file:admin")
})
},
{
id: "tenant-file-integrity",
moduleId: "files",
kind: "operations",
surfaceId: "files.admin.tenant-integrity",
label: "File integrity",
group: "TENANT",
order: 66,
allOf: ["files:file:admin"],
render: ({ settings, auth }) => createElement(FileIntegrityPanel, {
settings,
canWrite: hasScope(auth, "files:file:admin")
})
}]
};
export const filesModule: PlatformWebModule = {
id: "files",
label: "i18n:govoplan-files.files.6ce6c512",
version: "1.0.0",
dependencies: ["access"],
translations,
viewSurfaces: [
{ id: "files.admin.system-connectors", moduleId: "files", kind: "section", label: "System file connections", order: 75 },
{ id: "files.admin.tenant-connectors", moduleId: "files", kind: "section", label: "Tenant file connections", order: 65 },
{ id: "files.admin.tenant-integrity", moduleId: "files", kind: "section", label: "File integrity", order: 66 },
{ id: "files.admin.group-connectors", moduleId: "files", kind: "section", label: "Group file connections", order: 65 },
{ id: "files.admin.user-connectors", moduleId: "files", kind: "section", label: "User file connections", order: 65 },
{ id: "files.settings.connectors", moduleId: "files", kind: "section", label: "Personal file connections", order: 20 },
{ id: "files.widget.spaces", moduleId: "files", kind: "section", label: "File spaces widget", order: 35 },
{ id: "files.quick_access.files", moduleId: "files", kind: "quick_access", label: "Files Quick Access", order: 40 }
],
navItems: [{ to: "/files", label: "i18n:govoplan-files.files.6ce6c512", iconName: "folder", anyOf: fileRead, order: 40 }],
routes: [
{ path: "/files", anyOf: fileRead, order: 40, render: ({ settings, auth }) => createElement(FilesPage, { settings, auth }) }],
uiCapabilities: {
"files.fileExplorer": {
FolderTree,
ManagedFileChooser,
listFileSpaces,
listFiles,
listFilesDelta,
listFolders,
resolveFilePatterns,
shareFilesWithTarget
} satisfies FilesFileExplorerUiCapability,
"files.connectors": {
FileConnectorScopeManager: FileConnectorSettingsPanel
} satisfies FilesConnectorsUiCapability,
"admin.sections": fileConnectorAdminSections,
"dashboard.widgets": fileDashboardWidgets,
"quickAccess.tools": fileQuickAccessTools
}
};
export default filesModule;