@jk3labs/paperclip-plugin-file-browser 0.2.1 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ui/index.js +35 -7
- package/dist/ui/index.js.map +2 -2
- package/package.json +5 -4
package/dist/ui/index.js
CHANGED
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
import {
|
|
10
10
|
FileTree,
|
|
11
11
|
MetricCard,
|
|
12
|
+
Spinner,
|
|
12
13
|
ErrorBoundary
|
|
13
14
|
} from "@paperclipai/plugin-sdk/ui";
|
|
14
15
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -35,14 +36,18 @@ function formatSize(bytes) {
|
|
|
35
36
|
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
36
37
|
}
|
|
37
38
|
function FileBrowser({ companyId }) {
|
|
39
|
+
console.debug("[FileBrowser] Initializing with companyId:", companyId);
|
|
38
40
|
const [currentPath, setCurrentPath] = useState("");
|
|
39
41
|
const [selectedFile, setSelectedFile] = useState(null);
|
|
42
|
+
console.debug("[FileBrowser] State initialized. Fetching data for path:", currentPath);
|
|
40
43
|
const { data, loading, error, refresh } = usePluginData(
|
|
41
44
|
"file-tree",
|
|
42
45
|
{ companyId: companyId ?? "", relativePath: currentPath }
|
|
43
46
|
);
|
|
47
|
+
console.debug("[FileBrowser] usePluginData result:", { data, loading, error });
|
|
44
48
|
const downloadFile = usePluginAction("download-file");
|
|
45
49
|
const downloadZip = usePluginAction("download-zip");
|
|
50
|
+
console.debug("[FileBrowser] Plugin actions initialized:", { downloadFile, downloadZip });
|
|
46
51
|
const nodes = buildNodes(data);
|
|
47
52
|
const handleSelectFile = useCallback((path) => {
|
|
48
53
|
setSelectedFile(path);
|
|
@@ -52,17 +57,35 @@ function FileBrowser({ companyId }) {
|
|
|
52
57
|
setSelectedFile(null);
|
|
53
58
|
}, []);
|
|
54
59
|
const handleDownloadFile = useCallback(async () => {
|
|
55
|
-
|
|
60
|
+
console.debug("[FileBrowser] handleDownloadFile called with:", { selectedFile, companyId });
|
|
61
|
+
if (!selectedFile || !companyId) {
|
|
62
|
+
console.debug("[FileBrowser] handleDownloadFile: Missing selectedFile or companyId");
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
56
65
|
try {
|
|
57
|
-
await downloadFile({ companyId,
|
|
58
|
-
|
|
66
|
+
const result = await downloadFile({ companyId, filePath: selectedFile });
|
|
67
|
+
console.debug("[FileBrowser] handleDownloadFile result:", result);
|
|
68
|
+
if (result?.url) {
|
|
69
|
+
window.open(result.url, "_blank");
|
|
70
|
+
}
|
|
71
|
+
} catch (err) {
|
|
72
|
+
console.error("[FileBrowser] Failed to download file:", err);
|
|
59
73
|
}
|
|
60
74
|
}, [selectedFile, companyId, downloadFile]);
|
|
61
75
|
const handleDownloadZip = useCallback(async () => {
|
|
62
|
-
|
|
76
|
+
console.debug("[FileBrowser] handleDownloadZip called with:", { currentPath, companyId });
|
|
77
|
+
if (!currentPath || !companyId) {
|
|
78
|
+
console.debug("[FileBrowser] handleDownloadZip: Missing currentPath or companyId");
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
63
81
|
try {
|
|
64
|
-
await downloadZip({ companyId,
|
|
65
|
-
|
|
82
|
+
const result = await downloadZip({ companyId, directoryPath: currentPath });
|
|
83
|
+
console.debug("[FileBrowser] handleDownloadZip result:", result);
|
|
84
|
+
if (result?.url) {
|
|
85
|
+
window.open(result.url, "_blank");
|
|
86
|
+
}
|
|
87
|
+
} catch (err) {
|
|
88
|
+
console.error("[FileBrowser] Failed to download zip:", err);
|
|
66
89
|
}
|
|
67
90
|
}, [currentPath, companyId, downloadZip]);
|
|
68
91
|
const handleNavigateUp = useCallback(() => {
|
|
@@ -103,7 +126,8 @@ function FileBrowser({ companyId }) {
|
|
|
103
126
|
"Error: ",
|
|
104
127
|
data.error
|
|
105
128
|
] }),
|
|
106
|
-
/* @__PURE__ */ jsx(
|
|
129
|
+
loading && /* @__PURE__ */ jsx(Spinner, { size: "medium", text: "Loading files...", style: { padding: "2rem 0" } }),
|
|
130
|
+
!loading && /* @__PURE__ */ jsx(
|
|
107
131
|
FileTree,
|
|
108
132
|
{
|
|
109
133
|
nodes,
|
|
@@ -124,14 +148,18 @@ function FileBrowser({ companyId }) {
|
|
|
124
148
|
] });
|
|
125
149
|
}
|
|
126
150
|
function DashboardWidget(_props) {
|
|
151
|
+
console.debug("[DashboardWidget] Rendering with props:", _props);
|
|
127
152
|
const { companyId } = useHostContext();
|
|
153
|
+
console.debug("[DashboardWidget] Resolved companyId:", companyId);
|
|
128
154
|
return /* @__PURE__ */ jsx(ErrorBoundary, { fallback: /* @__PURE__ */ jsx("div", { style: { padding: "1rem", color: "var(--text-error, red)" }, children: "File Browser: failed to render" }), children: /* @__PURE__ */ jsxs("div", { style: { display: "grid", gap: "0.5rem" }, children: [
|
|
129
155
|
/* @__PURE__ */ jsx("strong", { children: "File Browser" }),
|
|
130
156
|
/* @__PURE__ */ jsx(FileBrowser, { companyId })
|
|
131
157
|
] }) });
|
|
132
158
|
}
|
|
133
159
|
function FileBrowserTab(props) {
|
|
160
|
+
console.debug("[FileBrowserTab] Rendering with props:", props);
|
|
134
161
|
const { companyId } = props.context;
|
|
162
|
+
console.debug("[FileBrowserTab] Resolved companyId from context:", companyId);
|
|
135
163
|
return /* @__PURE__ */ jsx(ErrorBoundary, { fallback: /* @__PURE__ */ jsx("div", { style: { padding: "1rem", color: "var(--text-error, red)" }, children: "File Browser tab: failed to render" }), children: /* @__PURE__ */ jsx(FileBrowser, { companyId }) });
|
|
136
164
|
}
|
|
137
165
|
function FileBrowserSidebarItem(props) {
|
package/dist/ui/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/ui/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import { useCallback, useState } from \"react\";\nimport {\n usePluginData,\n usePluginAction,\n useHostContext,\n useHostNavigation,\n type PluginWidgetProps,\n type PluginDetailTabProps,\n type PluginProjectSidebarItemProps,\n} from \"@paperclipai/plugin-sdk/ui\";\nimport {\n FileTree,\n MetricCard,\n Spinner,\n ErrorBoundary,\n type FileTreeNode,\n} from \"@paperclipai/plugin-sdk/ui\";\n\ninterface FileEntry {\n name: string;\n path: string;\n kind: \"file\" | \"directory\";\n size?: number | null;\n modifiedAt?: string | null;\n}\n\ninterface FileTreeData {\n currentPath: string;\n directories: FileEntry[];\n files: FileEntry[];\n error?: string;\n}\n\nfunction buildNodes(data: FileTreeData | null): FileTreeNode[] {\n if (!data) return [];\n const dirNodes: FileTreeNode[] = data.directories.map((d) => ({\n name: d.name,\n path: d.path,\n kind: \"dir\" as const,\n children: [],\n }));\n const fileNodes: FileTreeNode[] = data.files.map((f) => ({\n name: f.name,\n path: f.path,\n kind: \"file\" as const,\n children: [],\n }));\n return [...dirNodes, ...fileNodes];\n}\n\nfunction formatSize(bytes: number | null | undefined): string {\n if (bytes == null) return \"-\";\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction FileBrowser({ companyId }: { companyId: string | null }) {\n const [currentPath, setCurrentPath] = useState(\"\");\n const [selectedFile, setSelectedFile] = useState<string | null>(null);\n\n const { data, loading, error, refresh } = usePluginData<FileTreeData>(\n \"file-tree\",\n { companyId: companyId ?? \"\", relativePath: currentPath }\n );\n\n const downloadFile = usePluginAction(\"download-file\");\n const downloadZip = usePluginAction(\"download-zip\");\n\n const nodes = buildNodes(data);\n\n const handleSelectFile = useCallback((path: string) => {\n setSelectedFile(path);\n }, []);\n\n const handleToggleDir = useCallback((path: string) => {\n setCurrentPath(path);\n setSelectedFile(null);\n }, []);\n\n const handleDownloadFile = useCallback(async () => {\n if (!selectedFile || !companyId) return;\n try {\n await downloadFile({ companyId,
|
|
5
|
-
"mappings": ";AAAA,SAAS,aAAa,gBAAgB;AACtC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AACP;AAAA,EACE;AAAA,EACA;AAAA,
|
|
4
|
+
"sourcesContent": ["import { useCallback, useState } from \"react\";\nimport {\n usePluginData,\n usePluginAction,\n useHostContext,\n useHostNavigation,\n type PluginWidgetProps,\n type PluginDetailTabProps,\n type PluginProjectSidebarItemProps,\n} from \"@paperclipai/plugin-sdk/ui\";\nimport {\n FileTree,\n MetricCard,\n Spinner,\n ErrorBoundary,\n type FileTreeNode,\n} from \"@paperclipai/plugin-sdk/ui\";\n\ninterface FileEntry {\n name: string;\n path: string;\n kind: \"file\" | \"directory\";\n size?: number | null;\n modifiedAt?: string | null;\n}\n\ninterface FileTreeData {\n currentPath: string;\n directories: FileEntry[];\n files: FileEntry[];\n error?: string;\n}\n\nfunction buildNodes(data: FileTreeData | null): FileTreeNode[] {\n if (!data) return [];\n const dirNodes: FileTreeNode[] = data.directories.map((d) => ({\n name: d.name,\n path: d.path,\n kind: \"dir\" as const,\n children: [],\n }));\n const fileNodes: FileTreeNode[] = data.files.map((f) => ({\n name: f.name,\n path: f.path,\n kind: \"file\" as const,\n children: [],\n }));\n return [...dirNodes, ...fileNodes];\n}\n\nfunction formatSize(bytes: number | null | undefined): string {\n if (bytes == null) return \"-\";\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction FileBrowser({ companyId }: { companyId: string | null }) {\n console.debug(\"[FileBrowser] Initializing with companyId:\", companyId);\n const [currentPath, setCurrentPath] = useState(\"\");\n const [selectedFile, setSelectedFile] = useState<string | null>(null);\n console.debug(\"[FileBrowser] State initialized. Fetching data for path:\", currentPath);\n\n const { data, loading, error, refresh } = usePluginData<FileTreeData>(\n \"file-tree\",\n { companyId: companyId ?? \"\", relativePath: currentPath }\n );\n console.debug(\"[FileBrowser] usePluginData result:\", { data, loading, error });\n\n const downloadFile = usePluginAction(\"download-file\");\n const downloadZip = usePluginAction(\"download-zip\");\n console.debug(\"[FileBrowser] Plugin actions initialized:\", { downloadFile, downloadZip });\n\n const nodes = buildNodes(data);\n\n const handleSelectFile = useCallback((path: string) => {\n setSelectedFile(path);\n }, []);\n\n const handleToggleDir = useCallback((path: string) => {\n setCurrentPath(path);\n setSelectedFile(null);\n }, []);\n\n const handleDownloadFile = useCallback(async () => {\n console.debug(\"[FileBrowser] handleDownloadFile called with:\", { selectedFile, companyId });\n if (!selectedFile || !companyId) {\n console.debug(\"[FileBrowser] handleDownloadFile: Missing selectedFile or companyId\");\n return;\n }\n try {\n const result = await downloadFile({ companyId, filePath: selectedFile });\n console.debug(\"[FileBrowser] handleDownloadFile result:\", result);\n if (result?.url) {\n window.open(result.url, \"_blank\");\n }\n } catch (err) {\n console.error(\"[FileBrowser] Failed to download file:\", err);\n }\n }, [selectedFile, companyId, downloadFile]);\n\n const handleDownloadZip = useCallback(async () => {\n console.debug(\"[FileBrowser] handleDownloadZip called with:\", { currentPath, companyId });\n if (!currentPath || !companyId) {\n console.debug(\"[FileBrowser] handleDownloadZip: Missing currentPath or companyId\");\n return;\n }\n try {\n const result = await downloadZip({ companyId, directoryPath: currentPath });\n console.debug(\"[FileBrowser] handleDownloadZip result:\", result);\n if (result?.url) {\n window.open(result.url, \"_blank\");\n }\n } catch (err) {\n console.error(\"[FileBrowser] Failed to download zip:\", err);\n }\n }, [currentPath, companyId, downloadZip]);\n\n const handleNavigateUp = useCallback(() => {\n if (!currentPath) return;\n const parts = currentPath.split(\"/\");\n parts.pop();\n setCurrentPath(parts.join(\"/\"));\n setSelectedFile(null);\n }, [currentPath]);\n\n const handleRefresh = useCallback(() => {\n refresh();\n }, [refresh]);\n\n const fileCount = data?.files.length ?? 0;\n const dirCount = data?.directories.length ?? 0;\n const totalSize = data?.files.reduce((sum, f) => sum + (f.size ?? 0), 0) ?? 0;\n\n if (!companyId) {\n return <div style={{ padding: \"1rem\" }}>Select a company to browse files.</div>;\n }\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.75rem\", padding: \"0.5rem 0\" }}>\n <div style={{ display: \"flex\", gap: \"0.5rem\", flexWrap: \"wrap\" }}>\n <MetricCard label=\"Files\" value={fileCount} />\n <MetricCard label=\"Directories\" value={dirCount} />\n <MetricCard label=\"Total Size\" value={formatSize(totalSize)} />\n </div>\n\n <div style={{ display: \"flex\", gap: \"0.5rem\", alignItems: \"center\", flexWrap: \"wrap\" }}>\n {currentPath && (\n <button onClick={handleNavigateUp} style={{ fontSize: \"0.85rem\" }}>\n .. / \n </button>\n )}\n <span style={{ fontSize: \"0.85rem\", color: \"var(--text-secondary, #888)\" }}>\n /{currentPath || \"\"}\n </span>\n <div style={{ marginLeft: \"auto\", display: \"flex\", gap: \"0.5rem\" }}>\n <button onClick={handleRefresh} style={{ fontSize: \"0.85rem\" }}>\n Refresh\n </button>\n {selectedFile && (\n <button onClick={handleDownloadFile} style={{ fontSize: \"0.85rem\" }}>\n Download File\n </button>\n )}\n {currentPath && (\n <button onClick={handleDownloadZip} style={{ fontSize: \"0.85rem\" }}>\n Download Folder (ZIP)\n </button>\n )}\n </div>\n </div>\n\n {data?.error && (\n <div style={{ color: \"var(--text-error, red)\", fontSize: \"0.85rem\" }}>\n Error: {data.error}\n </div>\n )}\n \n {loading && (\n <Spinner size=\"medium\" text=\"Loading files...\" style={{ padding: \"2rem 0\" }} />\n )}\n \n {!loading && (\n <FileTree\n nodes={nodes}\n selectedFile={selectedFile}\n expandedPaths={[]}\n onSelectFile={handleSelectFile}\n onToggleDir={handleToggleDir}\n loading={loading}\n error={error ? { message: error.message } : null}\n empty={{ title: \"Empty directory\", description: \"No files or directories found.\" }}\n ariaLabel=\"File browser\"\n />\n )}\n\n {selectedFile && (\n <div style={{ fontSize: \"0.8rem\", color: \"var(--text-secondary, #888)\", paddingTop: \"0.25rem\" }}>\n Selected: {selectedFile}\n </div>\n )}\n </div>\n );\n}\n\nexport function DashboardWidget(_props: PluginWidgetProps) {\n console.debug(\"[DashboardWidget] Rendering with props:\", _props);\n const { companyId } = useHostContext();\n console.debug(\"[DashboardWidget] Resolved companyId:\", companyId);\n return (\n <ErrorBoundary fallback={<div style={{ padding: \"1rem\", color: \"var(--text-error, red)\" }}>File Browser: failed to render</div>}>\n <div style={{ display: \"grid\", gap: \"0.5rem\" }}>\n <strong>File Browser</strong>\n <FileBrowser companyId={companyId} />\n </div>\n </ErrorBoundary>\n );\n}\n\nexport function FileBrowserTab(props: PluginDetailTabProps) {\n console.debug(\"[FileBrowserTab] Rendering with props:\", props);\n const { companyId } = props.context;\n console.debug(\"[FileBrowserTab] Resolved companyId from context:\", companyId);\n return (\n <ErrorBoundary fallback={<div style={{ padding: \"1rem\", color: \"var(--text-error, red)\" }}>File Browser tab: failed to render</div>}>\n <FileBrowser companyId={companyId} />\n </ErrorBoundary>\n );\n}\n\nexport function FileBrowserSidebarItem(props: PluginProjectSidebarItemProps) {\n const { entityId: projectId } = props.context;\n const { navigate, resolveHref } = useHostNavigation();\n const href = resolveHref(`/projects/${projectId}?tab=plugin:jkl.file-browser:file-browser-tab`);\n return (\n <a\n href={href}\n onClick={(e) => { e.preventDefault(); navigate(href); }}\n style={{ fontSize: \"0.85rem\", display: \"flex\", alignItems: \"center\", gap: \"0.35rem\", padding: \"0.2rem 0\", color: \"var(--text-link, #4488cc)\", textDecoration: \"none\" }}\n >\n Files\n </a>\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jk3labs/paperclip-plugin-file-browser",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "A file browser plugin for Paperclip workspaces",
|
|
6
6
|
"files": [
|
|
@@ -29,6 +29,10 @@
|
|
|
29
29
|
],
|
|
30
30
|
"author": "JK3Labs",
|
|
31
31
|
"license": "MIT",
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"react": "^18.2.0",
|
|
34
|
+
"react-dom": "^18.2.0"
|
|
35
|
+
},
|
|
32
36
|
"devDependencies": {
|
|
33
37
|
"@paperclipai/plugin-sdk": "2026.525.0",
|
|
34
38
|
"@rollup/plugin-node-resolve": "^16.0.1",
|
|
@@ -40,8 +44,5 @@
|
|
|
40
44
|
"tslib": "^2.8.1",
|
|
41
45
|
"typescript": "^5.7.3",
|
|
42
46
|
"vitest": "^3.0.5"
|
|
43
|
-
},
|
|
44
|
-
"peerDependencies": {
|
|
45
|
-
"react": ">=18"
|
|
46
47
|
}
|
|
47
48
|
}
|