paperclip-plugin-navigator 0.1.2 → 0.1.4
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/manifest.d.ts.map +1 -1
- package/dist/manifest.js +18 -4
- package/dist/manifest.js.map +1 -1
- package/dist/ui/index.d.ts +2 -1
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +40 -1
- package/dist/ui/index.js.map +2 -2
- package/package.json +1 -1
package/dist/manifest.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAWzE,QAAA,MAAM,QAAQ,EAAE,yBAgDf,CAAC;AAEF,eAAe,QAAQ,CAAC"}
|
package/dist/manifest.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
const PLUGIN_ID = "paperclip-plugin-navigator";
|
|
2
|
-
const PLUGIN_VERSION = "0.1.
|
|
3
|
-
const
|
|
2
|
+
const PLUGIN_VERSION = "0.1.4";
|
|
3
|
+
const NAV_PAGE_SLOT_ID = "navigator-page";
|
|
4
|
+
const NAV_SIDEBAR_SLOT_ID = "navigator-sidebar";
|
|
4
5
|
const NAV_EXPORT_NAME = "NavigatorPage";
|
|
6
|
+
const NAV_SIDEBAR_EXPORT_NAME = "NavigatorSidebarEntry";
|
|
5
7
|
const manifest = {
|
|
6
8
|
id: PLUGIN_ID,
|
|
7
9
|
apiVersion: 1,
|
|
@@ -10,7 +12,13 @@ const manifest = {
|
|
|
10
12
|
description: "Browse projects with real names and open them directly in your external filebrowser.",
|
|
11
13
|
author: "paperclip-plugin-navigator",
|
|
12
14
|
categories: ["workspace", "ui"],
|
|
13
|
-
capabilities: [
|
|
15
|
+
capabilities: [
|
|
16
|
+
"projects.read",
|
|
17
|
+
"project.workspaces.read",
|
|
18
|
+
"companies.read",
|
|
19
|
+
"ui.page.register",
|
|
20
|
+
"ui.sidebar.register",
|
|
21
|
+
],
|
|
14
22
|
instanceConfigSchema: {
|
|
15
23
|
type: "object",
|
|
16
24
|
properties: {
|
|
@@ -28,9 +36,15 @@ const manifest = {
|
|
|
28
36
|
},
|
|
29
37
|
ui: {
|
|
30
38
|
slots: [
|
|
39
|
+
{
|
|
40
|
+
type: "sidebar",
|
|
41
|
+
id: NAV_SIDEBAR_SLOT_ID,
|
|
42
|
+
displayName: "Files",
|
|
43
|
+
exportName: NAV_SIDEBAR_EXPORT_NAME,
|
|
44
|
+
},
|
|
31
45
|
{
|
|
32
46
|
type: "page",
|
|
33
|
-
id:
|
|
47
|
+
id: NAV_PAGE_SLOT_ID,
|
|
34
48
|
displayName: "Files",
|
|
35
49
|
exportName: NAV_EXPORT_NAME,
|
|
36
50
|
},
|
package/dist/manifest.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAEA,MAAM,SAAS,GAAG,4BAA4B,CAAC;AAE/C,MAAM,cAAc,GAAG,OAAO,CAAC;AAE/B,MAAM,
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAEA,MAAM,SAAS,GAAG,4BAA4B,CAAC;AAE/C,MAAM,cAAc,GAAG,OAAO,CAAC;AAE/B,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;AAC1C,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;AAChD,MAAM,eAAe,GAAG,eAAe,CAAC;AACxC,MAAM,uBAAuB,GAAG,uBAAuB,CAAC;AAExD,MAAM,QAAQ,GAA8B;IAC1C,EAAE,EAAE,SAAS;IACb,UAAU,EAAE,CAAC;IACb,OAAO,EAAE,cAAc;IACvB,WAAW,EAAE,gBAAgB;IAC7B,WAAW,EACT,sFAAsF;IACxF,MAAM,EAAE,4BAA4B;IACpC,UAAU,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC;IAC/B,YAAY,EAAE;QACZ,eAAe;QACf,yBAAyB;QACzB,gBAAgB;QAChB,kBAAkB;QAClB,qBAAqB;KACtB;IACD,oBAAoB,EAAE;QACpB,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,kBAAkB,EAAE;gBAClB,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,uBAAuB;gBAC9B,WAAW,EACT,8EAA8E;aACjF;SACF;QACD,QAAQ,EAAE,CAAC,oBAAoB,CAAC;KACjC;IACD,WAAW,EAAE;QACX,MAAM,EAAE,kBAAkB;QAC1B,EAAE,EAAE,WAAW;KAChB;IACD,EAAE,EAAE;QACF,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,SAAS;gBACf,EAAE,EAAE,mBAAmB;gBACvB,WAAW,EAAE,OAAO;gBACpB,UAAU,EAAE,uBAAuB;aACpC;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,EAAE,EAAE,gBAAgB;gBACpB,WAAW,EAAE,OAAO;gBACpB,UAAU,EAAE,eAAe;aAC5B;SACF;KACF;CACF,CAAC;AAEF,eAAe,QAAQ,CAAC"}
|
package/dist/ui/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
import type { PluginPageProps } from "@paperclipai/plugin-sdk/ui";
|
|
1
|
+
import type { PluginPageProps, PluginSidebarProps } from "@paperclipai/plugin-sdk/ui";
|
|
2
|
+
export declare function NavigatorSidebarEntry({ context }: PluginSidebarProps): import("react/jsx-runtime").JSX.Element;
|
|
2
3
|
export declare function NavigatorPage({ context }: PluginPageProps): import("react/jsx-runtime").JSX.Element;
|
|
3
4
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/ui/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AA0KtF,wBAAgB,qBAAqB,CAAC,EAAE,OAAO,EAAE,EAAE,kBAAkB,2CAoCpE;AAED,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,EAAE,eAAe,2CA4HzD"}
|
package/dist/ui/index.js
CHANGED
|
@@ -160,6 +160,44 @@ var styles = {
|
|
|
160
160
|
color: COLORS.textSecondary
|
|
161
161
|
}
|
|
162
162
|
};
|
|
163
|
+
function NavigatorSidebarEntry({ context }) {
|
|
164
|
+
const href = context.companyPrefix ? `/${context.companyPrefix}/plugins/paperclip-plugin-navigator` : `/plugins/paperclip-plugin-navigator`;
|
|
165
|
+
return /* @__PURE__ */ jsxs(
|
|
166
|
+
"a",
|
|
167
|
+
{
|
|
168
|
+
href,
|
|
169
|
+
style: {
|
|
170
|
+
display: "flex",
|
|
171
|
+
alignItems: "center",
|
|
172
|
+
gap: "8px",
|
|
173
|
+
padding: "6px 8px",
|
|
174
|
+
borderRadius: "6px",
|
|
175
|
+
fontSize: "14px",
|
|
176
|
+
fontWeight: 500,
|
|
177
|
+
color: "inherit",
|
|
178
|
+
textDecoration: "none"
|
|
179
|
+
},
|
|
180
|
+
children: [
|
|
181
|
+
/* @__PURE__ */ jsx(
|
|
182
|
+
"svg",
|
|
183
|
+
{
|
|
184
|
+
width: "16",
|
|
185
|
+
height: "16",
|
|
186
|
+
viewBox: "0 0 24 24",
|
|
187
|
+
fill: "none",
|
|
188
|
+
stroke: "currentColor",
|
|
189
|
+
strokeWidth: "2",
|
|
190
|
+
strokeLinecap: "round",
|
|
191
|
+
strokeLinejoin: "round",
|
|
192
|
+
"aria-hidden": "true",
|
|
193
|
+
children: /* @__PURE__ */ jsx("path", { d: "M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z" })
|
|
194
|
+
}
|
|
195
|
+
),
|
|
196
|
+
"Files"
|
|
197
|
+
]
|
|
198
|
+
}
|
|
199
|
+
);
|
|
200
|
+
}
|
|
163
201
|
function NavigatorPage({ context }) {
|
|
164
202
|
const [searchTerm, setSearchTerm] = useState("");
|
|
165
203
|
const { data, loading, error, refresh } = usePluginData("projects", {
|
|
@@ -253,6 +291,7 @@ function NavigatorPage({ context }) {
|
|
|
253
291
|
] });
|
|
254
292
|
}
|
|
255
293
|
export {
|
|
256
|
-
NavigatorPage
|
|
294
|
+
NavigatorPage,
|
|
295
|
+
NavigatorSidebarEntry
|
|
257
296
|
};
|
|
258
297
|
//# sourceMappingURL=index.js.map
|
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 { useState, useMemo } from \"react\";\nimport type { PluginPageProps } from \"@paperclipai/plugin-sdk/ui\";\nimport { usePluginData } from \"@paperclipai/plugin-sdk/ui\";\n\ninterface ProjectEntry {\n id: string;\n name: string;\n path: string | null;\n fileBrowserUrl: string | null;\n}\n\nconst COLORS = {\n border: \"#e5e7eb\",\n bg: \"#f9fafb\",\n bgCard: \"#ffffff\",\n textPrimary: \"#111827\",\n textSecondary: \"#6b7280\",\n textMuted: \"#9ca3af\",\n primary: \"#2563eb\",\n primaryHover: \"#1d4ed8\",\n danger: \"#ef4444\",\n warningBg: \"#fffbeb\",\n warningBorder: \"#fcd34d\",\n warningText: \"#92400e\",\n};\n\nconst styles = {\n container: {\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n padding: \"32px\",\n maxWidth: \"1000px\",\n margin: \"0 auto\",\n color: COLORS.textPrimary,\n },\n header: {\n marginBottom: \"32px\",\n },\n title: {\n fontSize: \"24px\",\n fontWeight: 600,\n letterSpacing: \"-0.025em\",\n margin: \"0 0 8px 0\",\n },\n description: {\n fontSize: \"14px\",\n color: COLORS.textSecondary,\n margin: 0,\n },\n toolbar: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n marginBottom: \"20px\",\n gap: \"16px\",\n },\n searchWrapper: {\n position: \"relative\" as const,\n flex: 1,\n },\n searchInput: {\n width: \"100%\",\n padding: \"10px 12px 10px 36px\",\n fontSize: \"14px\",\n borderRadius: \"8px\",\n border: `1px solid ${COLORS.border}`,\n outline: \"none\",\n transition: \"border-color 0.2s\",\n },\n searchIcon: {\n position: \"absolute\" as const,\n left: \"12px\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n color: COLORS.textMuted,\n pointerEvents: \"none\" as const,\n },\n configWarning: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n padding: \"12px 16px\",\n backgroundColor: COLORS.warningBg,\n border: `1px solid ${COLORS.warningBorder}`,\n borderRadius: \"8px\",\n marginBottom: \"24px\",\n fontSize: \"14px\",\n color: COLORS.warningText,\n },\n tableCard: {\n backgroundColor: COLORS.bgCard,\n border: `1px solid ${COLORS.border}`,\n borderRadius: \"12px\",\n overflow: \"hidden\",\n boxShadow: \"0 1px 3px rgba(0,0,0,0.1)\",\n },\n tableHeader: {\n display: \"grid\",\n gridTemplateColumns: \"1fr 140px\",\n padding: \"12px 20px\",\n backgroundColor: COLORS.bg,\n borderBottom: `1px solid ${COLORS.border}`,\n fontSize: \"12px\",\n fontWeight: 600,\n textTransform: \"uppercase\" as const,\n letterSpacing: \"0.05em\",\n color: COLORS.textSecondary,\n },\n row: {\n display: \"grid\",\n gridTemplateColumns: \"1fr 140px\",\n padding: \"16px 20px\",\n borderBottom: `1px solid ${COLORS.border}`,\n alignItems: \"center\",\n transition: \"background-color 0.15s\",\n \":last-child\": {\n borderBottom: \"none\",\n },\n },\n projectMain: {\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: \"4px\",\n minWidth: 0,\n },\n projectName: {\n fontSize: \"15px\",\n fontWeight: 500,\n color: COLORS.textPrimary,\n },\n projectPath: {\n fontSize: \"12px\",\n color: COLORS.textMuted,\n fontFamily: \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\",\n whiteSpace: \"nowrap\" as const,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n },\n actionCell: {\n display: \"flex\",\n justifyContent: \"flex-end\",\n },\n button: {\n padding: \"8px 16px\",\n borderRadius: \"6px\",\n fontSize: \"13px\",\n fontWeight: 500,\n cursor: \"pointer\",\n textDecoration: \"none\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"all 0.2s\",\n border: \"none\",\n },\n primaryButton: {\n backgroundColor: COLORS.primary,\n color: \"#fff\",\n },\n disabledButton: {\n backgroundColor: COLORS.bg,\n color: COLORS.textMuted,\n cursor: \"not-allowed\",\n border: `1px solid ${COLORS.border}`,\n },\n emptyState: {\n padding: \"60px 20px\",\n textAlign: \"center\" as const,\n color: COLORS.textSecondary,\n },\n};\n\nexport function NavigatorPage({ context }: PluginPageProps) {\n const [searchTerm, setSearchTerm] = useState(\"\");\n const { data, loading, error, refresh } = usePluginData<ProjectEntry[]>(\"projects\", {\n companyId: context.companyId ?? undefined,\n });\n\n const projects = data ?? [];\n \n const filteredProjects = useMemo(() => {\n if (!searchTerm) return projects;\n const lower = searchTerm.toLowerCase();\n return projects.filter(p => \n p.name.toLowerCase().includes(lower) || \n (p.path && p.path.toLowerCase().includes(lower))\n );\n }, [projects, searchTerm]);\n\n // Infer if config is missing (if we have projects but NO fileBrowserUrls)\n const isConfigMissing = useMemo(() => {\n return projects.length > 0 && projects.every(p => p.fileBrowserUrl === null && p.path !== null);\n }, [projects]);\n\n return (\n <div style={styles.container}>\n <header style={styles.header}>\n <h1 style={styles.title}>Project Navigator</h1>\n <p style={styles.description}>\n Browse and access your project files via the external file manager.\n </p>\n </header>\n\n {isConfigMissing && (\n <div style={styles.configWarning}>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"/>\n </svg>\n <span>\n <strong>Configuration needed:</strong> The File Browser Base URL is not set. Please contact your administrator.\n </span>\n </div>\n )}\n\n <div style={styles.toolbar}>\n <div style={styles.searchWrapper}>\n <div style={styles.searchIcon}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"/><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"/>\n </svg>\n </div>\n <input\n type=\"text\"\n placeholder=\"Search projects...\"\n style={styles.searchInput}\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n />\n </div>\n <button \n onClick={() => refresh()} \n style={{...styles.button, ...styles.disabledButton, cursor: 'pointer'}}\n title=\"Refresh list\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{marginRight: '8px'}}>\n <path d=\"M23 4v6h-6M1 20v-6h6M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15\"/>\n </svg>\n Refresh\n </button>\n </div>\n\n <div style={styles.tableCard}>\n <div style={styles.tableHeader}>\n <span>Project</span>\n <span style={{textAlign: 'right'}}>Action</span>\n </div>\n\n {loading && (\n <div style={styles.emptyState}>\n <p>Loading projects...</p>\n </div>\n )}\n\n {!loading && error && (\n <div style={{...styles.emptyState, color: COLORS.danger}}>\n <p>Error loading projects: {error.message}</p>\n </div>\n )}\n\n {!loading && !error && filteredProjects.length === 0 && (\n <div style={styles.emptyState}>\n <p>{searchTerm ? 'No projects match your search.' : 'No projects found.'}</p>\n </div>\n )}\n\n {!loading && !error && filteredProjects.map((project) => (\n <div key={project.id} style={styles.row}>\n <div style={styles.projectMain}>\n <span style={styles.projectName}>{project.name}</span>\n {project.path && (\n <span style={styles.projectPath} title={project.path}>\n {project.path}\n </span>\n )}\n </div>\n <div style={styles.actionCell}>\n {project.fileBrowserUrl ? (\n <a\n href={project.fileBrowserUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{...styles.button, ...styles.primaryButton}}\n >\n Open Files\n </a>\n ) : (\n <span style={{...styles.button, ...styles.disabledButton}} title=\"No workspace available\">\n Unavailable\n </span>\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n\n"],
|
|
5
|
-
"mappings": ";AAAA,SAAS,UAAU,eAAe;AAElC,SAAS,qBAAqB;
|
|
4
|
+
"sourcesContent": ["import { useState, useMemo } from \"react\";\nimport type { PluginPageProps, PluginSidebarProps } from \"@paperclipai/plugin-sdk/ui\";\nimport { usePluginData } from \"@paperclipai/plugin-sdk/ui\";\n\ninterface ProjectEntry {\n id: string;\n name: string;\n path: string | null;\n fileBrowserUrl: string | null;\n}\n\nconst COLORS = {\n border: \"#e5e7eb\",\n bg: \"#f9fafb\",\n bgCard: \"#ffffff\",\n textPrimary: \"#111827\",\n textSecondary: \"#6b7280\",\n textMuted: \"#9ca3af\",\n primary: \"#2563eb\",\n primaryHover: \"#1d4ed8\",\n danger: \"#ef4444\",\n warningBg: \"#fffbeb\",\n warningBorder: \"#fcd34d\",\n warningText: \"#92400e\",\n};\n\nconst styles = {\n container: {\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n padding: \"32px\",\n maxWidth: \"1000px\",\n margin: \"0 auto\",\n color: COLORS.textPrimary,\n },\n header: {\n marginBottom: \"32px\",\n },\n title: {\n fontSize: \"24px\",\n fontWeight: 600,\n letterSpacing: \"-0.025em\",\n margin: \"0 0 8px 0\",\n },\n description: {\n fontSize: \"14px\",\n color: COLORS.textSecondary,\n margin: 0,\n },\n toolbar: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n marginBottom: \"20px\",\n gap: \"16px\",\n },\n searchWrapper: {\n position: \"relative\" as const,\n flex: 1,\n },\n searchInput: {\n width: \"100%\",\n padding: \"10px 12px 10px 36px\",\n fontSize: \"14px\",\n borderRadius: \"8px\",\n border: `1px solid ${COLORS.border}`,\n outline: \"none\",\n transition: \"border-color 0.2s\",\n },\n searchIcon: {\n position: \"absolute\" as const,\n left: \"12px\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n color: COLORS.textMuted,\n pointerEvents: \"none\" as const,\n },\n configWarning: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n padding: \"12px 16px\",\n backgroundColor: COLORS.warningBg,\n border: `1px solid ${COLORS.warningBorder}`,\n borderRadius: \"8px\",\n marginBottom: \"24px\",\n fontSize: \"14px\",\n color: COLORS.warningText,\n },\n tableCard: {\n backgroundColor: COLORS.bgCard,\n border: `1px solid ${COLORS.border}`,\n borderRadius: \"12px\",\n overflow: \"hidden\",\n boxShadow: \"0 1px 3px rgba(0,0,0,0.1)\",\n },\n tableHeader: {\n display: \"grid\",\n gridTemplateColumns: \"1fr 140px\",\n padding: \"12px 20px\",\n backgroundColor: COLORS.bg,\n borderBottom: `1px solid ${COLORS.border}`,\n fontSize: \"12px\",\n fontWeight: 600,\n textTransform: \"uppercase\" as const,\n letterSpacing: \"0.05em\",\n color: COLORS.textSecondary,\n },\n row: {\n display: \"grid\",\n gridTemplateColumns: \"1fr 140px\",\n padding: \"16px 20px\",\n borderBottom: `1px solid ${COLORS.border}`,\n alignItems: \"center\",\n transition: \"background-color 0.15s\",\n \":last-child\": {\n borderBottom: \"none\",\n },\n },\n projectMain: {\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: \"4px\",\n minWidth: 0,\n },\n projectName: {\n fontSize: \"15px\",\n fontWeight: 500,\n color: COLORS.textPrimary,\n },\n projectPath: {\n fontSize: \"12px\",\n color: COLORS.textMuted,\n fontFamily: \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\",\n whiteSpace: \"nowrap\" as const,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n },\n actionCell: {\n display: \"flex\",\n justifyContent: \"flex-end\",\n },\n button: {\n padding: \"8px 16px\",\n borderRadius: \"6px\",\n fontSize: \"13px\",\n fontWeight: 500,\n cursor: \"pointer\",\n textDecoration: \"none\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"all 0.2s\",\n border: \"none\",\n },\n primaryButton: {\n backgroundColor: COLORS.primary,\n color: \"#fff\",\n },\n disabledButton: {\n backgroundColor: COLORS.bg,\n color: COLORS.textMuted,\n cursor: \"not-allowed\",\n border: `1px solid ${COLORS.border}`,\n },\n emptyState: {\n padding: \"60px 20px\",\n textAlign: \"center\" as const,\n color: COLORS.textSecondary,\n },\n};\n\nexport function NavigatorSidebarEntry({ context }: PluginSidebarProps) {\n const href = context.companyPrefix\n ? `/${context.companyPrefix}/plugins/paperclip-plugin-navigator`\n : `/plugins/paperclip-plugin-navigator`;\n\n return (\n <a\n href={href}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"6px 8px\",\n borderRadius: \"6px\",\n fontSize: \"14px\",\n fontWeight: 500,\n color: \"inherit\",\n textDecoration: \"none\",\n }}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\" />\n </svg>\n Files\n </a>\n );\n}\n\nexport function NavigatorPage({ context }: PluginPageProps) {\n const [searchTerm, setSearchTerm] = useState(\"\");\n const { data, loading, error, refresh } = usePluginData<ProjectEntry[]>(\"projects\", {\n companyId: context.companyId ?? undefined,\n });\n\n const projects = data ?? [];\n \n const filteredProjects = useMemo(() => {\n if (!searchTerm) return projects;\n const lower = searchTerm.toLowerCase();\n return projects.filter(p => \n p.name.toLowerCase().includes(lower) || \n (p.path && p.path.toLowerCase().includes(lower))\n );\n }, [projects, searchTerm]);\n\n // Infer if config is missing (if we have projects but NO fileBrowserUrls)\n const isConfigMissing = useMemo(() => {\n return projects.length > 0 && projects.every(p => p.fileBrowserUrl === null && p.path !== null);\n }, [projects]);\n\n return (\n <div style={styles.container}>\n <header style={styles.header}>\n <h1 style={styles.title}>Project Navigator</h1>\n <p style={styles.description}>\n Browse and access your project files via the external file manager.\n </p>\n </header>\n\n {isConfigMissing && (\n <div style={styles.configWarning}>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"/>\n </svg>\n <span>\n <strong>Configuration needed:</strong> The File Browser Base URL is not set. Please contact your administrator.\n </span>\n </div>\n )}\n\n <div style={styles.toolbar}>\n <div style={styles.searchWrapper}>\n <div style={styles.searchIcon}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"/><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"/>\n </svg>\n </div>\n <input\n type=\"text\"\n placeholder=\"Search projects...\"\n style={styles.searchInput}\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n />\n </div>\n <button \n onClick={() => refresh()} \n style={{...styles.button, ...styles.disabledButton, cursor: 'pointer'}}\n title=\"Refresh list\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{marginRight: '8px'}}>\n <path d=\"M23 4v6h-6M1 20v-6h6M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15\"/>\n </svg>\n Refresh\n </button>\n </div>\n\n <div style={styles.tableCard}>\n <div style={styles.tableHeader}>\n <span>Project</span>\n <span style={{textAlign: 'right'}}>Action</span>\n </div>\n\n {loading && (\n <div style={styles.emptyState}>\n <p>Loading projects...</p>\n </div>\n )}\n\n {!loading && error && (\n <div style={{...styles.emptyState, color: COLORS.danger}}>\n <p>Error loading projects: {error.message}</p>\n </div>\n )}\n\n {!loading && !error && filteredProjects.length === 0 && (\n <div style={styles.emptyState}>\n <p>{searchTerm ? 'No projects match your search.' : 'No projects found.'}</p>\n </div>\n )}\n\n {!loading && !error && filteredProjects.map((project) => (\n <div key={project.id} style={styles.row}>\n <div style={styles.projectMain}>\n <span style={styles.projectName}>{project.name}</span>\n {project.path && (\n <span style={styles.projectPath} title={project.path}>\n {project.path}\n </span>\n )}\n </div>\n <div style={styles.actionCell}>\n {project.fileBrowserUrl ? (\n <a\n href={project.fileBrowserUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{...styles.button, ...styles.primaryButton}}\n >\n Open Files\n </a>\n ) : (\n <span style={{...styles.button, ...styles.disabledButton}} title=\"No workspace available\">\n Unavailable\n </span>\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED