@burdenoff/fluidgrids-fe-sdk 2026.510.105
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/README.md +149 -0
- package/dist/ExecutionDetailPage-3EVS3WEC.js +6 -0
- package/dist/ExecutionDetailPage-3EVS3WEC.js.map +1 -0
- package/dist/ExecutionsListPage-NH2JLL2D.js +8 -0
- package/dist/ExecutionsListPage-NH2JLL2D.js.map +1 -0
- package/dist/TemplateConfigurationModal-UJAGRE7X.js +258 -0
- package/dist/TemplateConfigurationModal-UJAGRE7X.js.map +1 -0
- package/dist/TemplateDetailPanel-UXH6KPCH.js +172 -0
- package/dist/TemplateDetailPanel-UXH6KPCH.js.map +1 -0
- package/dist/WorkflowBuilder-BMKFLHVE.js +15 -0
- package/dist/WorkflowBuilder-BMKFLHVE.js.map +1 -0
- package/dist/WorkflowsList-CLI32VRE.js +8 -0
- package/dist/WorkflowsList-CLI32VRE.js.map +1 -0
- package/dist/chunk-4FFPGQD3.js +584 -0
- package/dist/chunk-4FFPGQD3.js.map +1 -0
- package/dist/chunk-5BDQNSP3.js +107 -0
- package/dist/chunk-5BDQNSP3.js.map +1 -0
- package/dist/chunk-6PHBYAEG.js +11494 -0
- package/dist/chunk-6PHBYAEG.js.map +1 -0
- package/dist/chunk-BQXHJIER.js +45 -0
- package/dist/chunk-BQXHJIER.js.map +1 -0
- package/dist/chunk-BXDSTMUA.js +8848 -0
- package/dist/chunk-BXDSTMUA.js.map +1 -0
- package/dist/chunk-CGKBAJMM.js +292 -0
- package/dist/chunk-CGKBAJMM.js.map +1 -0
- package/dist/chunk-FGYVIXQ7.js +979 -0
- package/dist/chunk-FGYVIXQ7.js.map +1 -0
- package/dist/chunk-G7B4SYFM.js +22 -0
- package/dist/chunk-G7B4SYFM.js.map +1 -0
- package/dist/chunk-GSJOLO3A.js +251 -0
- package/dist/chunk-GSJOLO3A.js.map +1 -0
- package/dist/chunk-GSS5PHRL.js +386 -0
- package/dist/chunk-GSS5PHRL.js.map +1 -0
- package/dist/chunk-GY66IQWN.js +524 -0
- package/dist/chunk-GY66IQWN.js.map +1 -0
- package/dist/chunk-LUGJJ7LL.js +297 -0
- package/dist/chunk-LUGJJ7LL.js.map +1 -0
- package/dist/chunk-NDJSUC4W.js +155 -0
- package/dist/chunk-NDJSUC4W.js.map +1 -0
- package/dist/chunk-UOCR65PI.js +262 -0
- package/dist/chunk-UOCR65PI.js.map +1 -0
- package/dist/chunk-WD52O45G.js +2015 -0
- package/dist/chunk-WD52O45G.js.map +1 -0
- package/dist/chunk-WWU2O2SR.js +52 -0
- package/dist/chunk-WWU2O2SR.js.map +1 -0
- package/dist/chunk-XQP33UJR.js +57 -0
- package/dist/chunk-XQP33UJR.js.map +1 -0
- package/dist/chunk-Z54K22LP.js +82 -0
- package/dist/chunk-Z54K22LP.js.map +1 -0
- package/dist/client-AMUUS7VE.js +3 -0
- package/dist/client-AMUUS7VE.js.map +1 -0
- package/dist/config-E4E7M6IN.js +3 -0
- package/dist/config-E4E7M6IN.js.map +1 -0
- package/dist/global-client-OW43ZRDR.js +3 -0
- package/dist/global-client-OW43ZRDR.js.map +1 -0
- package/dist/global-operations-WPTEYCJM.js +3 -0
- package/dist/global-operations-WPTEYCJM.js.map +1 -0
- package/dist/index.d.ts +56706 -0
- package/dist/index.js +6564 -0
- package/dist/index.js.map +1 -0
- package/dist/styles.css +139 -0
- package/dist/template-input-applicator-657KE4DM.js +3 -0
- package/dist/template-input-applicator-657KE4DM.js.map +1 -0
- package/dist/useImportWorkflowTemplate-2HS5D2OP.js +11 -0
- package/dist/useImportWorkflowTemplate-2HS5D2OP.js.map +1 -0
- package/dist/useTemplateDetail-NK63V3PC.js +6 -0
- package/dist/useTemplateDetail-NK63V3PC.js.map +1 -0
- package/package.json +148 -0
package/README.md
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# @burdenoff/fluidgrids-fe-sdk
|
|
2
|
+
|
|
3
|
+
FluidGrids Workflow Builder SDK - Embeddable visual workflow automation for React applications.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @burdenoff/fluidgrids-fe-sdk
|
|
9
|
+
# or
|
|
10
|
+
bun add @burdenoff/fluidgrids-fe-sdk
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Quick Start
|
|
14
|
+
|
|
15
|
+
### Standalone Workflow Builder
|
|
16
|
+
|
|
17
|
+
Use `WorkflowBuilder` when you want a self-contained workflow builder with its own Apollo client:
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
import { WorkflowBuilder } from '@burdenoff/fluidgrids-fe-sdk';
|
|
21
|
+
import '@burdenoff/fluidgrids-fe-sdk/styles.css';
|
|
22
|
+
|
|
23
|
+
function App() {
|
|
24
|
+
return (
|
|
25
|
+
<WorkflowBuilder
|
|
26
|
+
apiGatewayUrl={process.env.NEXT_PUBLIC_FLUIDGRIDS_API_URL!}
|
|
27
|
+
authToken="your-auth-token"
|
|
28
|
+
workspaceId="your-workspace-id"
|
|
29
|
+
onSave={(workflow) => {
|
|
30
|
+
console.log('Workflow saved:', workflow);
|
|
31
|
+
}}
|
|
32
|
+
onExecute={(runId) => {
|
|
33
|
+
console.log('Execution started:', runId);
|
|
34
|
+
}}
|
|
35
|
+
/>
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Full Workflow Module with Routing
|
|
41
|
+
|
|
42
|
+
Use `FluidGridsRoot` for complete workflow management including list, builder, runs, and credentials:
|
|
43
|
+
|
|
44
|
+
```tsx
|
|
45
|
+
import { FluidGridsRoot } from '@burdenoff/fluidgrids-fe-sdk';
|
|
46
|
+
import '@burdenoff/fluidgrids-fe-sdk/styles.css';
|
|
47
|
+
import { useNavigate } from 'react-router-dom';
|
|
48
|
+
|
|
49
|
+
function App() {
|
|
50
|
+
const navigate = useNavigate();
|
|
51
|
+
|
|
52
|
+
return (
|
|
53
|
+
<FluidGridsRoot
|
|
54
|
+
basePath="/workflows"
|
|
55
|
+
apiGatewayUrl={process.env.NEXT_PUBLIC_FLUIDGRIDS_API_URL!}
|
|
56
|
+
authToken="your-auth-token"
|
|
57
|
+
workspaceId="your-workspace-id"
|
|
58
|
+
navigate={(path) => navigate(path)}
|
|
59
|
+
onWorkflowSave={(workflow) => {
|
|
60
|
+
console.log('Workflow saved:', workflow);
|
|
61
|
+
}}
|
|
62
|
+
/>
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Core Builder (BYO Apollo Client)
|
|
68
|
+
|
|
69
|
+
Use `WorkflowBuilderCore` when you want to provide your own Apollo client:
|
|
70
|
+
|
|
71
|
+
```tsx
|
|
72
|
+
import { WorkflowBuilderCore, FluidGridsProvider } from '@burdenoff/fluidgrids-fe-sdk';
|
|
73
|
+
import { ApolloProvider } from '@apollo/client';
|
|
74
|
+
import { yourApolloClient } from './apollo';
|
|
75
|
+
|
|
76
|
+
function App() {
|
|
77
|
+
return (
|
|
78
|
+
<FluidGridsProvider
|
|
79
|
+
apiGatewayUrl={process.env.NEXT_PUBLIC_FLUIDGRIDS_API_URL!}
|
|
80
|
+
authToken="your-auth-token"
|
|
81
|
+
workspaceId="your-workspace-id"
|
|
82
|
+
trustedOrigins={[window.location.origin]}
|
|
83
|
+
apolloClient={yourApolloClient}
|
|
84
|
+
>
|
|
85
|
+
<WorkflowBuilderCore
|
|
86
|
+
workflow={yourWorkflowData}
|
|
87
|
+
onSave={(workflow) => console.log('Saved:', workflow)}
|
|
88
|
+
/>
|
|
89
|
+
</FluidGridsProvider>
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## API Reference
|
|
95
|
+
|
|
96
|
+
### WorkflowBuilder Props
|
|
97
|
+
|
|
98
|
+
| Prop | Type | Required | Description |
|
|
99
|
+
|------|------|----------|-------------|
|
|
100
|
+
| `apiGatewayUrl` | `string` | Yes | Workspace API Gateway URL |
|
|
101
|
+
| `authToken` | `string` | No | Authentication token |
|
|
102
|
+
| `workspaceId` | `string` | Yes | Current workspace ID |
|
|
103
|
+
| `tenantId` | `string` | No | Current tenant ID |
|
|
104
|
+
| `workflowId` | `string` | No | Workflow ID to load |
|
|
105
|
+
| `workflowVersion` | `string` | No | Workflow version to load |
|
|
106
|
+
| `initialWorkflow` | `WorkflowData` | No | Initial workflow data |
|
|
107
|
+
| `readonly` | `boolean` | No | Disable editing |
|
|
108
|
+
| `hideHeader` | `boolean` | No | Hide the header toolbar |
|
|
109
|
+
| `hideSidebar` | `boolean` | No | Hide the sidebar |
|
|
110
|
+
| `hideLogsPanel` | `boolean` | No | Hide the logs panel |
|
|
111
|
+
| `onSave` | `(workflow) => void` | No | Save callback |
|
|
112
|
+
| `onExecute` | `(runId) => void` | No | Execute callback |
|
|
113
|
+
| `onNodeClick` | `(node) => void` | No | Node click callback |
|
|
114
|
+
| `onBack` | `() => void` | No | Back button callback |
|
|
115
|
+
| `className` | `string` | No | Custom CSS class |
|
|
116
|
+
|
|
117
|
+
### FluidGridsRoot Props
|
|
118
|
+
|
|
119
|
+
| Prop | Type | Required | Description |
|
|
120
|
+
|------|------|----------|-------------|
|
|
121
|
+
| `basePath` | `string` | No | Base path for routing |
|
|
122
|
+
| `apiGatewayUrl` | `string` | Yes | Workspace API Gateway URL |
|
|
123
|
+
| `authToken` | `string` | No | Authentication token |
|
|
124
|
+
| `workspaceId` | `string` | Yes | Current workspace ID |
|
|
125
|
+
| `tenantId` | `string` | No | Current tenant ID |
|
|
126
|
+
| `currentUser` | `User` | No | Current user info |
|
|
127
|
+
| `navigate` | `(path) => void` | No | Navigation function |
|
|
128
|
+
| `readonly` | `boolean` | No | Global readonly mode |
|
|
129
|
+
| `onWorkflowSave` | `(workflow) => void` | No | Save callback |
|
|
130
|
+
| `onWorkflowExecute` | `(runId, workflowId) => void` | No | Execute callback |
|
|
131
|
+
| `className` | `string` | No | Custom CSS class |
|
|
132
|
+
|
|
133
|
+
## Styling
|
|
134
|
+
|
|
135
|
+
The SDK uses Tailwind CSS for styling. Make sure you have Tailwind configured in your project, or import the pre-built styles:
|
|
136
|
+
|
|
137
|
+
```tsx
|
|
138
|
+
import '@burdenoff/fluidgrids-fe-sdk/styles.css';
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Security Notes
|
|
142
|
+
|
|
143
|
+
- Pass runtime URLs through environment variables instead of hardcoded localhost defaults.
|
|
144
|
+
- Use `trustedOrigins` when embedding the SDK into known host applications.
|
|
145
|
+
- Avoid logging or persisting `authToken` values in app telemetry or error reports.
|
|
146
|
+
|
|
147
|
+
## License
|
|
148
|
+
|
|
149
|
+
Proprietary - Copyright Burdenoff Consultancy Services Pvt Ltd.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { ExecutionDetailPage } from './chunk-GY66IQWN.js';
|
|
2
|
+
import './chunk-WD52O45G.js';
|
|
3
|
+
import './chunk-FGYVIXQ7.js';
|
|
4
|
+
import './chunk-5BDQNSP3.js';
|
|
5
|
+
//# sourceMappingURL=ExecutionDetailPage-3EVS3WEC.js.map
|
|
6
|
+
//# sourceMappingURL=ExecutionDetailPage-3EVS3WEC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"ExecutionDetailPage-3EVS3WEC.js"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { ExecutionsListPage } from './chunk-UOCR65PI.js';
|
|
2
|
+
import './chunk-WD52O45G.js';
|
|
3
|
+
import './chunk-4FFPGQD3.js';
|
|
4
|
+
import './chunk-FGYVIXQ7.js';
|
|
5
|
+
import './chunk-5BDQNSP3.js';
|
|
6
|
+
import './chunk-WWU2O2SR.js';
|
|
7
|
+
//# sourceMappingURL=ExecutionsListPage-NH2JLL2D.js.map
|
|
8
|
+
//# sourceMappingURL=ExecutionsListPage-NH2JLL2D.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"ExecutionsListPage-NH2JLL2D.js"}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { Label } from './chunk-G7B4SYFM.js';
|
|
2
|
+
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, Input, DialogFooter } from './chunk-NDJSUC4W.js';
|
|
3
|
+
import { Badge, Button } from './chunk-Z54K22LP.js';
|
|
4
|
+
import { useState, useMemo } from 'react';
|
|
5
|
+
import { Sparkles, KeyRound, Download, CheckCircle2, ShoppingCart, AlertTriangle, Loader2 } from 'lucide-react';
|
|
6
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
function TemplateConfigurationModal({
|
|
9
|
+
open,
|
|
10
|
+
onOpenChange,
|
|
11
|
+
template,
|
|
12
|
+
content,
|
|
13
|
+
nodeCheckResult,
|
|
14
|
+
onConfirm,
|
|
15
|
+
importing = false
|
|
16
|
+
}) {
|
|
17
|
+
const [workflowName, setWorkflowName] = useState(
|
|
18
|
+
content?.defaultWorkflowName || template?.name || ""
|
|
19
|
+
);
|
|
20
|
+
const [inputValues, setInputValues] = useState({});
|
|
21
|
+
useMemo(() => {
|
|
22
|
+
if (template) {
|
|
23
|
+
setWorkflowName(content?.defaultWorkflowName || template.name || "");
|
|
24
|
+
const defaults = {};
|
|
25
|
+
if (content?.requiredInputs) {
|
|
26
|
+
for (const input of content.requiredInputs) {
|
|
27
|
+
if (input.defaultValue) {
|
|
28
|
+
defaults[input.name] = input.defaultValue;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
setInputValues(defaults);
|
|
33
|
+
}
|
|
34
|
+
}, [template?.id]);
|
|
35
|
+
const requiredInputs = content?.requiredInputs || [];
|
|
36
|
+
const hasRequiredInputs = requiredInputs.length > 0;
|
|
37
|
+
nodeCheckResult && (nodeCheckResult.missing.length > 0 || nodeCheckResult.missingPaid.length > 0);
|
|
38
|
+
const hasRequiredCredentials = (content?.requiredCredentialTypes?.length ?? 0) > 0;
|
|
39
|
+
const hasPaidBlockers = (nodeCheckResult?.missingPaid.length ?? 0) > 0;
|
|
40
|
+
const isValid = useMemo(() => {
|
|
41
|
+
if (!workflowName.trim()) return false;
|
|
42
|
+
for (const input of requiredInputs) {
|
|
43
|
+
if (input.required && !inputValues[input.name]?.trim()) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return true;
|
|
48
|
+
}, [workflowName, inputValues, requiredInputs]);
|
|
49
|
+
const handleInputChange = (name, value) => {
|
|
50
|
+
setInputValues((prev) => ({ ...prev, [name]: value }));
|
|
51
|
+
};
|
|
52
|
+
const handleConfirm = () => {
|
|
53
|
+
onConfirm({
|
|
54
|
+
name: workflowName.trim(),
|
|
55
|
+
templateInputs: inputValues
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
if (!template || !content) return null;
|
|
59
|
+
return /* @__PURE__ */ jsx(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs(
|
|
60
|
+
DialogContent,
|
|
61
|
+
{
|
|
62
|
+
size: "lg",
|
|
63
|
+
className: "!flex !flex-col !max-h-[85vh] overflow-hidden p-0 gap-0",
|
|
64
|
+
children: [
|
|
65
|
+
/* @__PURE__ */ jsxs(DialogHeader, { className: "px-6 pt-6 pb-4 border-b shrink-0", children: [
|
|
66
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
67
|
+
/* @__PURE__ */ jsx(Sparkles, { className: "size-5 text-primary" }),
|
|
68
|
+
/* @__PURE__ */ jsxs(DialogTitle, { className: "text-xl", children: [
|
|
69
|
+
'Import "',
|
|
70
|
+
template.name,
|
|
71
|
+
'"'
|
|
72
|
+
] })
|
|
73
|
+
] }),
|
|
74
|
+
/* @__PURE__ */ jsx(DialogDescription, { children: "Configure and import this workflow template into your workspace" })
|
|
75
|
+
] }),
|
|
76
|
+
/* @__PURE__ */ jsxs("div", { className: "flex-1 overflow-y-auto px-6 py-5 space-y-6", children: [
|
|
77
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
78
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: "workflow-name", className: "text-sm font-medium", children: "Workflow Name" }),
|
|
79
|
+
/* @__PURE__ */ jsx(
|
|
80
|
+
Input,
|
|
81
|
+
{
|
|
82
|
+
id: "workflow-name",
|
|
83
|
+
value: workflowName,
|
|
84
|
+
onChange: (e) => setWorkflowName(e.target.value),
|
|
85
|
+
placeholder: "Enter workflow name"
|
|
86
|
+
}
|
|
87
|
+
)
|
|
88
|
+
] }),
|
|
89
|
+
hasRequiredInputs && /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
|
|
90
|
+
/* @__PURE__ */ jsxs("h4", { className: "text-sm font-semibold text-foreground flex items-center gap-2", children: [
|
|
91
|
+
/* @__PURE__ */ jsx(KeyRound, { className: "size-4" }),
|
|
92
|
+
"Required Configuration"
|
|
93
|
+
] }),
|
|
94
|
+
/* @__PURE__ */ jsx("div", { className: "space-y-3", children: requiredInputs.map((input) => /* @__PURE__ */ jsx(
|
|
95
|
+
TemplateInputField,
|
|
96
|
+
{
|
|
97
|
+
input,
|
|
98
|
+
value: inputValues[input.name] || "",
|
|
99
|
+
onChange: (value) => handleInputChange(input.name, value)
|
|
100
|
+
},
|
|
101
|
+
input.name
|
|
102
|
+
)) })
|
|
103
|
+
] }),
|
|
104
|
+
nodeCheckResult && /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
|
|
105
|
+
/* @__PURE__ */ jsxs("h4", { className: "text-sm font-semibold text-foreground flex items-center gap-2", children: [
|
|
106
|
+
/* @__PURE__ */ jsx(Download, { className: "size-4" }),
|
|
107
|
+
"Node Dependencies"
|
|
108
|
+
] }),
|
|
109
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
110
|
+
nodeCheckResult.installed.map((node) => /* @__PURE__ */ jsxs(
|
|
111
|
+
"div",
|
|
112
|
+
{
|
|
113
|
+
className: "flex items-center gap-2 text-sm",
|
|
114
|
+
children: [
|
|
115
|
+
/* @__PURE__ */ jsx(CheckCircle2, { className: "size-4 text-green-500 shrink-0" }),
|
|
116
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
117
|
+
node.displayName || node.nodeType,
|
|
118
|
+
" v",
|
|
119
|
+
node.nodeVersion
|
|
120
|
+
] }),
|
|
121
|
+
/* @__PURE__ */ jsx(Badge, { variant: "secondary", className: "text-xs ml-auto", children: "Installed" })
|
|
122
|
+
]
|
|
123
|
+
},
|
|
124
|
+
node.nodeType
|
|
125
|
+
)),
|
|
126
|
+
nodeCheckResult.missing.map((node) => /* @__PURE__ */ jsxs(
|
|
127
|
+
"div",
|
|
128
|
+
{
|
|
129
|
+
className: "flex items-center gap-2 text-sm",
|
|
130
|
+
children: [
|
|
131
|
+
/* @__PURE__ */ jsx(Download, { className: "size-4 text-blue-500 shrink-0" }),
|
|
132
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
133
|
+
node.displayName || node.nodeType,
|
|
134
|
+
" v",
|
|
135
|
+
node.nodeVersion
|
|
136
|
+
] }),
|
|
137
|
+
/* @__PURE__ */ jsx(
|
|
138
|
+
Badge,
|
|
139
|
+
{
|
|
140
|
+
variant: "outline",
|
|
141
|
+
className: "text-xs ml-auto border-blue-500/30 text-blue-500",
|
|
142
|
+
children: "Will install"
|
|
143
|
+
}
|
|
144
|
+
)
|
|
145
|
+
]
|
|
146
|
+
},
|
|
147
|
+
node.nodeType
|
|
148
|
+
)),
|
|
149
|
+
nodeCheckResult.missingPaid.map((node) => /* @__PURE__ */ jsxs(
|
|
150
|
+
"div",
|
|
151
|
+
{
|
|
152
|
+
className: "flex items-center gap-2 text-sm",
|
|
153
|
+
children: [
|
|
154
|
+
/* @__PURE__ */ jsx(ShoppingCart, { className: "size-4 text-amber-500 shrink-0" }),
|
|
155
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
156
|
+
node.displayName || node.nodeType,
|
|
157
|
+
" v",
|
|
158
|
+
node.nodeVersion
|
|
159
|
+
] }),
|
|
160
|
+
/* @__PURE__ */ jsx(
|
|
161
|
+
Badge,
|
|
162
|
+
{
|
|
163
|
+
variant: "outline",
|
|
164
|
+
className: "text-xs ml-auto border-amber-500/30 text-amber-500",
|
|
165
|
+
children: "Purchase required"
|
|
166
|
+
}
|
|
167
|
+
)
|
|
168
|
+
]
|
|
169
|
+
},
|
|
170
|
+
node.nodeType
|
|
171
|
+
))
|
|
172
|
+
] })
|
|
173
|
+
] }),
|
|
174
|
+
hasRequiredCredentials && /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
|
|
175
|
+
/* @__PURE__ */ jsxs("h4", { className: "text-sm font-semibold text-foreground flex items-center gap-2", children: [
|
|
176
|
+
/* @__PURE__ */ jsx(KeyRound, { className: "size-4" }),
|
|
177
|
+
"Credentials Needed"
|
|
178
|
+
] }),
|
|
179
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "You'll need to configure these credentials after importing:" }),
|
|
180
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2", children: content.requiredCredentialTypes?.map((cred) => /* @__PURE__ */ jsxs(Badge, { variant: "outline", className: "text-xs", children: [
|
|
181
|
+
/* @__PURE__ */ jsx(KeyRound, { className: "size-3 mr-1" }),
|
|
182
|
+
cred
|
|
183
|
+
] }, cred)) })
|
|
184
|
+
] }),
|
|
185
|
+
/* @__PURE__ */ jsx("div", { className: "rounded-lg bg-muted/50 p-3 text-sm text-muted-foreground", children: /* @__PURE__ */ jsxs("p", { children: [
|
|
186
|
+
"The workflow will be created as a ",
|
|
187
|
+
/* @__PURE__ */ jsx("strong", { children: "DRAFT" }),
|
|
188
|
+
". You can review and edit it in the builder before activating."
|
|
189
|
+
] }) }),
|
|
190
|
+
hasPaidBlockers && /* @__PURE__ */ jsxs("div", { className: "rounded-lg bg-amber-500/10 border border-amber-500/30 p-3 text-sm text-amber-700 dark:text-amber-400 flex items-start gap-2", children: [
|
|
191
|
+
/* @__PURE__ */ jsx(AlertTriangle, { className: "size-4 mt-0.5 shrink-0" }),
|
|
192
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
193
|
+
/* @__PURE__ */ jsx("p", { className: "font-medium", children: "Purchase required" }),
|
|
194
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 text-xs", children: "Some nodes require purchase from the store before this template can be fully imported. The workflow will be created but those nodes may not function until installed." })
|
|
195
|
+
] })
|
|
196
|
+
] })
|
|
197
|
+
] }),
|
|
198
|
+
/* @__PURE__ */ jsxs(DialogFooter, { className: "px-6 py-4 border-t shrink-0", children: [
|
|
199
|
+
/* @__PURE__ */ jsx(
|
|
200
|
+
Button,
|
|
201
|
+
{
|
|
202
|
+
variant: "outline",
|
|
203
|
+
onClick: () => onOpenChange(false),
|
|
204
|
+
disabled: importing,
|
|
205
|
+
children: "Cancel"
|
|
206
|
+
}
|
|
207
|
+
),
|
|
208
|
+
/* @__PURE__ */ jsx(Button, { onClick: handleConfirm, disabled: !isValid || importing, children: importing ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
209
|
+
/* @__PURE__ */ jsx(Loader2, { className: "size-4 mr-2 animate-spin" }),
|
|
210
|
+
"Importing..."
|
|
211
|
+
] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
212
|
+
/* @__PURE__ */ jsx(Sparkles, { className: "size-4 mr-2" }),
|
|
213
|
+
"Import & Open in Builder"
|
|
214
|
+
] }) })
|
|
215
|
+
] })
|
|
216
|
+
]
|
|
217
|
+
}
|
|
218
|
+
) });
|
|
219
|
+
}
|
|
220
|
+
function TemplateInputField({
|
|
221
|
+
input,
|
|
222
|
+
value,
|
|
223
|
+
onChange
|
|
224
|
+
}) {
|
|
225
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
|
|
226
|
+
/* @__PURE__ */ jsxs(Label, { htmlFor: `template-input-${input.name}`, className: "text-sm", children: [
|
|
227
|
+
input.label,
|
|
228
|
+
input.required && /* @__PURE__ */ jsx("span", { className: "text-destructive ml-1", children: "*" })
|
|
229
|
+
] }),
|
|
230
|
+
input.type === "select" && input.options ? /* @__PURE__ */ jsxs(
|
|
231
|
+
"select",
|
|
232
|
+
{
|
|
233
|
+
id: `template-input-${input.name}`,
|
|
234
|
+
value,
|
|
235
|
+
onChange: (e) => onChange(e.target.value),
|
|
236
|
+
className: "flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
|
|
237
|
+
children: [
|
|
238
|
+
/* @__PURE__ */ jsx("option", { value: "", children: "Select..." }),
|
|
239
|
+
input.options.map((opt) => /* @__PURE__ */ jsx("option", { value: opt.value, children: opt.label }, opt.value))
|
|
240
|
+
]
|
|
241
|
+
}
|
|
242
|
+
) : /* @__PURE__ */ jsx(
|
|
243
|
+
Input,
|
|
244
|
+
{
|
|
245
|
+
id: `template-input-${input.name}`,
|
|
246
|
+
type: input.type === "secret" ? "password" : input.type === "number" ? "number" : "text",
|
|
247
|
+
value,
|
|
248
|
+
onChange: (e) => onChange(e.target.value),
|
|
249
|
+
placeholder: input.placeholder
|
|
250
|
+
}
|
|
251
|
+
),
|
|
252
|
+
input.helpText && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: input.helpText })
|
|
253
|
+
] });
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
export { TemplateConfigurationModal };
|
|
257
|
+
//# sourceMappingURL=TemplateConfigurationModal-UJAGRE7X.js.map
|
|
258
|
+
//# sourceMappingURL=TemplateConfigurationModal-UJAGRE7X.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/builder/components/flow-builder/components/templates/TemplateConfigurationModal.tsx"],"names":[],"mappings":"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","file":"TemplateConfigurationModal-UJAGRE7X.js","sourcesContent":["import { useState, useMemo } from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogFooter,\n} from \"../../../../../ui/dialog\";\nimport { Input } from \"../../../../../ui/input\";\nimport { Button } from \"../../../../../ui/button\";\nimport { Badge } from \"../../../../../ui/badge\";\nimport { Label } from \"../../../../../ui/label\";\nimport type { StoreProduct } from \"../../../../../generated/global-types\";\nimport type {\n WorkflowTemplateContent,\n TemplateNodeCheckResult,\n TemplateRequiredInput,\n} from \"../../../../../types/workflow-template-content\";\nimport {\n Loader2,\n CheckCircle2,\n Download,\n ShoppingCart,\n KeyRound,\n Sparkles,\n AlertTriangle,\n} from \"lucide-react\";\n\nexport interface TemplateConfigurationModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n template: StoreProduct | null;\n content: WorkflowTemplateContent | null;\n nodeCheckResult: TemplateNodeCheckResult | null;\n onConfirm: (config: {\n name: string;\n templateInputs: Record<string, string | number>;\n }) => void;\n importing?: boolean;\n}\n\n/**\n * Configuration modal shown before importing a template that has:\n * - Required user inputs (e.g., Slack webhook URL)\n * - Missing node dependencies\n * - Required credential types\n *\n * Allows the user to review what will happen and fill in required fields.\n */\nexport function TemplateConfigurationModal({\n open,\n onOpenChange,\n template,\n content,\n nodeCheckResult,\n onConfirm,\n importing = false,\n}: TemplateConfigurationModalProps) {\n const [workflowName, setWorkflowName] = useState(\n content?.defaultWorkflowName || template?.name || \"\",\n );\n const [inputValues, setInputValues] = useState<Record<string, string>>({});\n\n // Reset form when template changes\n useMemo(() => {\n if (template) {\n setWorkflowName(content?.defaultWorkflowName || template.name || \"\");\n // Pre-fill default values\n const defaults: Record<string, string> = {};\n if (content?.requiredInputs) {\n for (const input of content.requiredInputs) {\n if (input.defaultValue) {\n defaults[input.name] = input.defaultValue;\n }\n }\n }\n setInputValues(defaults);\n }\n }, [template?.id]);\n\n const requiredInputs = content?.requiredInputs || [];\n const hasRequiredInputs = requiredInputs.length > 0;\n const hasMissingNodes =\n nodeCheckResult &&\n (nodeCheckResult.missing.length > 0 ||\n nodeCheckResult.missingPaid.length > 0);\n const hasRequiredCredentials =\n (content?.requiredCredentialTypes?.length ?? 0) > 0;\n const hasPaidBlockers = (nodeCheckResult?.missingPaid.length ?? 0) > 0;\n\n // Check if all required fields are filled\n const isValid = useMemo(() => {\n if (!workflowName.trim()) return false;\n for (const input of requiredInputs) {\n if (input.required && !inputValues[input.name]?.trim()) {\n return false;\n }\n }\n return true;\n }, [workflowName, inputValues, requiredInputs]);\n\n const handleInputChange = (name: string, value: string) => {\n setInputValues((prev) => ({ ...prev, [name]: value }));\n };\n\n const handleConfirm = () => {\n onConfirm({\n name: workflowName.trim(),\n templateInputs: inputValues,\n });\n };\n\n if (!template || !content) return null;\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n size=\"lg\"\n className=\"!flex !flex-col !max-h-[85vh] overflow-hidden p-0 gap-0\"\n >\n <DialogHeader className=\"px-6 pt-6 pb-4 border-b shrink-0\">\n <div className=\"flex items-center gap-2\">\n <Sparkles className=\"size-5 text-primary\" />\n <DialogTitle className=\"text-xl\">\n Import \"{template.name}\"\n </DialogTitle>\n </div>\n <DialogDescription>\n Configure and import this workflow template into your workspace\n </DialogDescription>\n </DialogHeader>\n\n {/* Scrollable Content */}\n <div className=\"flex-1 overflow-y-auto px-6 py-5 space-y-6\">\n {/* Workflow Name */}\n <div className=\"space-y-2\">\n <Label htmlFor=\"workflow-name\" className=\"text-sm font-medium\">\n Workflow Name\n </Label>\n <Input\n id=\"workflow-name\"\n value={workflowName}\n onChange={(e) => setWorkflowName(e.target.value)}\n placeholder=\"Enter workflow name\"\n />\n </div>\n\n {/* Required Configuration Inputs */}\n {hasRequiredInputs && (\n <div className=\"space-y-3\">\n <h4 className=\"text-sm font-semibold text-foreground flex items-center gap-2\">\n <KeyRound className=\"size-4\" />\n Required Configuration\n </h4>\n <div className=\"space-y-3\">\n {requiredInputs.map((input) => (\n <TemplateInputField\n key={input.name}\n input={input}\n value={inputValues[input.name] || \"\"}\n onChange={(value) => handleInputChange(input.name, value)}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Node Dependencies */}\n {nodeCheckResult && (\n <div className=\"space-y-3\">\n <h4 className=\"text-sm font-semibold text-foreground flex items-center gap-2\">\n <Download className=\"size-4\" />\n Node Dependencies\n </h4>\n <div className=\"space-y-2\">\n {/* Installed nodes */}\n {nodeCheckResult.installed.map((node) => (\n <div\n key={node.nodeType}\n className=\"flex items-center gap-2 text-sm\"\n >\n <CheckCircle2 className=\"size-4 text-green-500 shrink-0\" />\n <span>\n {node.displayName || node.nodeType} v{node.nodeVersion}\n </span>\n <Badge variant=\"secondary\" className=\"text-xs ml-auto\">\n Installed\n </Badge>\n </div>\n ))}\n\n {/* Missing free nodes (will be installed) */}\n {nodeCheckResult.missing.map((node) => (\n <div\n key={node.nodeType}\n className=\"flex items-center gap-2 text-sm\"\n >\n <Download className=\"size-4 text-blue-500 shrink-0\" />\n <span>\n {node.displayName || node.nodeType} v{node.nodeVersion}\n </span>\n <Badge\n variant=\"outline\"\n className=\"text-xs ml-auto border-blue-500/30 text-blue-500\"\n >\n Will install\n </Badge>\n </div>\n ))}\n\n {/* Missing paid nodes (need purchase) */}\n {nodeCheckResult.missingPaid.map((node) => (\n <div\n key={node.nodeType}\n className=\"flex items-center gap-2 text-sm\"\n >\n <ShoppingCart className=\"size-4 text-amber-500 shrink-0\" />\n <span>\n {node.displayName || node.nodeType} v{node.nodeVersion}\n </span>\n <Badge\n variant=\"outline\"\n className=\"text-xs ml-auto border-amber-500/30 text-amber-500\"\n >\n Purchase required\n </Badge>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Required Credentials */}\n {hasRequiredCredentials && (\n <div className=\"space-y-3\">\n <h4 className=\"text-sm font-semibold text-foreground flex items-center gap-2\">\n <KeyRound className=\"size-4\" />\n Credentials Needed\n </h4>\n <p className=\"text-xs text-muted-foreground\">\n You'll need to configure these credentials after importing:\n </p>\n <div className=\"flex flex-wrap gap-2\">\n {content.requiredCredentialTypes?.map((cred) => (\n <Badge key={cred} variant=\"outline\" className=\"text-xs\">\n <KeyRound className=\"size-3 mr-1\" />\n {cred}\n </Badge>\n ))}\n </div>\n </div>\n )}\n\n {/* Info Banner */}\n <div className=\"rounded-lg bg-muted/50 p-3 text-sm text-muted-foreground\">\n <p>\n The workflow will be created as a <strong>DRAFT</strong>. You can\n review and edit it in the builder before activating.\n </p>\n </div>\n\n {/* Paid Node Blocker Warning */}\n {hasPaidBlockers && (\n <div className=\"rounded-lg bg-amber-500/10 border border-amber-500/30 p-3 text-sm text-amber-700 dark:text-amber-400 flex items-start gap-2\">\n <AlertTriangle className=\"size-4 mt-0.5 shrink-0\" />\n <div>\n <p className=\"font-medium\">Purchase required</p>\n <p className=\"mt-1 text-xs\">\n Some nodes require purchase from the store before this\n template can be fully imported. The workflow will be created\n but those nodes may not function until installed.\n </p>\n </div>\n </div>\n )}\n </div>\n\n {/* Footer */}\n <DialogFooter className=\"px-6 py-4 border-t shrink-0\">\n <Button\n variant=\"outline\"\n onClick={() => onOpenChange(false)}\n disabled={importing}\n >\n Cancel\n </Button>\n <Button onClick={handleConfirm} disabled={!isValid || importing}>\n {importing ? (\n <>\n <Loader2 className=\"size-4 mr-2 animate-spin\" />\n Importing...\n </>\n ) : (\n <>\n <Sparkles className=\"size-4 mr-2\" />\n Import & Open in Builder\n </>\n )}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\n// ============================================================================\n// Sub-component: Template Input Field\n// ============================================================================\n\nfunction TemplateInputField({\n input,\n value,\n onChange,\n}: {\n input: TemplateRequiredInput;\n value: string;\n onChange: (value: string) => void;\n}) {\n return (\n <div className=\"space-y-1.5\">\n <Label htmlFor={`template-input-${input.name}`} className=\"text-sm\">\n {input.label}\n {input.required && <span className=\"text-destructive ml-1\">*</span>}\n </Label>\n {input.type === \"select\" && input.options ? (\n <select\n id={`template-input-${input.name}`}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n >\n <option value=\"\">Select...</option>\n {input.options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n ) : (\n <Input\n id={`template-input-${input.name}`}\n type={\n input.type === \"secret\"\n ? \"password\"\n : input.type === \"number\"\n ? \"number\"\n : \"text\"\n }\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={input.placeholder}\n />\n )}\n {input.helpText && (\n <p className=\"text-xs text-muted-foreground\">{input.helpText}</p>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { Button, Badge } from './chunk-Z54K22LP.js';
|
|
2
|
+
import { X, Sparkles, Star, Download, Eye, User, Calendar, Tag, ExternalLink } from 'lucide-react';
|
|
3
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
function formatNumber(count) {
|
|
6
|
+
if (count >= 1e6) {
|
|
7
|
+
return `${(count / 1e6).toFixed(1)}M`;
|
|
8
|
+
}
|
|
9
|
+
if (count >= 1e3) {
|
|
10
|
+
return `${(count / 1e3).toFixed(1)}k`;
|
|
11
|
+
}
|
|
12
|
+
return count.toString();
|
|
13
|
+
}
|
|
14
|
+
function formatDate(dateStr) {
|
|
15
|
+
if (!dateStr) return "Unknown";
|
|
16
|
+
try {
|
|
17
|
+
return new Date(dateStr).toLocaleDateString("en-US", {
|
|
18
|
+
year: "numeric",
|
|
19
|
+
month: "short",
|
|
20
|
+
day: "numeric"
|
|
21
|
+
});
|
|
22
|
+
} catch {
|
|
23
|
+
return "Unknown";
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function TemplateDetailPanel({
|
|
27
|
+
template,
|
|
28
|
+
onClose,
|
|
29
|
+
onUseTemplate
|
|
30
|
+
}) {
|
|
31
|
+
const previewImage = template.screenshots?.[0] || template.icon;
|
|
32
|
+
template.videoUrls && template.videoUrls.length > 0;
|
|
33
|
+
return /* @__PURE__ */ jsxs("div", { className: "w-full md:w-1/2 lg:w-2/5 border-l bg-background overflow-y-auto", children: [
|
|
34
|
+
/* @__PURE__ */ jsxs("div", { className: "sticky top-0 z-10 flex items-center justify-between px-4 py-3 bg-background border-b", children: [
|
|
35
|
+
/* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold truncate pr-4", children: "Template Details" }),
|
|
36
|
+
/* @__PURE__ */ jsx(
|
|
37
|
+
Button,
|
|
38
|
+
{
|
|
39
|
+
variant: "ghost",
|
|
40
|
+
size: "icon",
|
|
41
|
+
onClick: onClose,
|
|
42
|
+
className: "size-8 shrink-0",
|
|
43
|
+
children: /* @__PURE__ */ jsx(X, { className: "size-4" })
|
|
44
|
+
}
|
|
45
|
+
)
|
|
46
|
+
] }),
|
|
47
|
+
/* @__PURE__ */ jsxs("div", { className: "p-4 space-y-5", children: [
|
|
48
|
+
/* @__PURE__ */ jsxs("div", { className: "relative aspect-video w-full rounded-lg overflow-hidden bg-gradient-to-br from-primary/5 to-primary/10", children: [
|
|
49
|
+
previewImage ? /* @__PURE__ */ jsx(
|
|
50
|
+
"img",
|
|
51
|
+
{
|
|
52
|
+
src: previewImage,
|
|
53
|
+
alt: template.name,
|
|
54
|
+
className: "w-full h-full object-cover"
|
|
55
|
+
}
|
|
56
|
+
) : /* @__PURE__ */ jsx("div", { className: "w-full h-full flex items-center justify-center", children: /* @__PURE__ */ jsx(Sparkles, { className: "size-16 text-primary/30" }) }),
|
|
57
|
+
/* @__PURE__ */ jsx("div", { className: "absolute top-2 left-2", children: template.pricingModel === "FREE" ? /* @__PURE__ */ jsx(
|
|
58
|
+
Badge,
|
|
59
|
+
{
|
|
60
|
+
variant: "secondary",
|
|
61
|
+
className: "bg-green-500 text-white border-0",
|
|
62
|
+
children: "Free"
|
|
63
|
+
}
|
|
64
|
+
) : /* @__PURE__ */ jsxs(
|
|
65
|
+
Badge,
|
|
66
|
+
{
|
|
67
|
+
variant: "default",
|
|
68
|
+
className: "bg-blue-500 text-white border-0",
|
|
69
|
+
children: [
|
|
70
|
+
"$",
|
|
71
|
+
template.price?.toString() || "0"
|
|
72
|
+
]
|
|
73
|
+
}
|
|
74
|
+
) }),
|
|
75
|
+
template.featured && /* @__PURE__ */ jsx("div", { className: "absolute top-2 right-2", children: /* @__PURE__ */ jsxs(
|
|
76
|
+
Badge,
|
|
77
|
+
{
|
|
78
|
+
variant: "default",
|
|
79
|
+
className: "bg-gradient-to-r from-yellow-500 to-orange-500 text-white border-0 shadow-lg",
|
|
80
|
+
children: [
|
|
81
|
+
/* @__PURE__ */ jsx(Star, { className: "size-3 mr-1 fill-white" }),
|
|
82
|
+
"Featured"
|
|
83
|
+
]
|
|
84
|
+
}
|
|
85
|
+
) })
|
|
86
|
+
] }),
|
|
87
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
88
|
+
/* @__PURE__ */ jsx("h2", { className: "text-lg font-bold", children: template.name }),
|
|
89
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground mt-1.5 leading-relaxed", children: template.longDescription || template.description || "No description available" })
|
|
90
|
+
] }),
|
|
91
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4 text-sm text-muted-foreground", children: [
|
|
92
|
+
template.rating && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
93
|
+
/* @__PURE__ */ jsx(Star, { className: "size-4 fill-yellow-400 text-yellow-400" }),
|
|
94
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium text-foreground", children: template.rating.toFixed(1) }),
|
|
95
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
96
|
+
"(",
|
|
97
|
+
template.reviewCount || 0,
|
|
98
|
+
")"
|
|
99
|
+
] })
|
|
100
|
+
] }),
|
|
101
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
102
|
+
/* @__PURE__ */ jsx(Download, { className: "size-4" }),
|
|
103
|
+
/* @__PURE__ */ jsx("span", { children: formatNumber(template.downloads || 0) })
|
|
104
|
+
] }),
|
|
105
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
106
|
+
/* @__PURE__ */ jsx(Eye, { className: "size-4" }),
|
|
107
|
+
/* @__PURE__ */ jsx("span", { children: formatNumber(template.viewCount || 0) })
|
|
108
|
+
] })
|
|
109
|
+
] }),
|
|
110
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sm", children: [
|
|
111
|
+
/* @__PURE__ */ jsx(User, { className: "size-4 text-muted-foreground" }),
|
|
112
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: template.authorName || template.publisher?.name || "Unknown" }),
|
|
113
|
+
template.publisher?.isVerified && /* @__PURE__ */ jsx(Badge, { variant: "secondary", className: "text-xs px-1.5 py-0", children: "Verified" })
|
|
114
|
+
] }),
|
|
115
|
+
template.publishedAt && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
|
|
116
|
+
/* @__PURE__ */ jsx(Calendar, { className: "size-4" }),
|
|
117
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
118
|
+
"Published ",
|
|
119
|
+
formatDate(template.publishedAt)
|
|
120
|
+
] })
|
|
121
|
+
] }),
|
|
122
|
+
(template.category || template.tags && template.tags.length > 0) && /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
123
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
|
|
124
|
+
/* @__PURE__ */ jsx(Tag, { className: "size-4" }),
|
|
125
|
+
/* @__PURE__ */ jsx("span", { children: "Category & Tags" })
|
|
126
|
+
] }),
|
|
127
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-1.5", children: [
|
|
128
|
+
template.category && /* @__PURE__ */ jsx(Badge, { variant: "default", className: "text-xs", children: template.category }),
|
|
129
|
+
template.tags?.map((tag) => /* @__PURE__ */ jsx(Badge, { variant: "outline", className: "text-xs", children: tag }, tag))
|
|
130
|
+
] })
|
|
131
|
+
] }),
|
|
132
|
+
template.compatibleProducts && template.compatibleProducts.length > 0 && /* @__PURE__ */ jsxs("div", { className: "text-xs text-muted-foreground", children: [
|
|
133
|
+
/* @__PURE__ */ jsx("span", { children: "Compatible with: " }),
|
|
134
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: template.compatibleProducts.join(", ") })
|
|
135
|
+
] }),
|
|
136
|
+
template.screenshots && template.screenshots.length > 1 && /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
137
|
+
/* @__PURE__ */ jsx("h4", { className: "text-sm font-semibold", children: "Screenshots" }),
|
|
138
|
+
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 gap-2", children: template.screenshots.slice(1, 5).map((screenshot, i) => /* @__PURE__ */ jsx(
|
|
139
|
+
"img",
|
|
140
|
+
{
|
|
141
|
+
src: screenshot,
|
|
142
|
+
alt: `${template.name} screenshot ${i + 2}`,
|
|
143
|
+
className: "w-full h-auto rounded-md border"
|
|
144
|
+
},
|
|
145
|
+
i
|
|
146
|
+
)) })
|
|
147
|
+
] }),
|
|
148
|
+
/* @__PURE__ */ jsxs("div", { className: "pt-2 space-y-2", children: [
|
|
149
|
+
/* @__PURE__ */ jsxs(Button, { className: "w-full", onClick: () => onUseTemplate(template), children: [
|
|
150
|
+
/* @__PURE__ */ jsx(Sparkles, { className: "size-4 mr-2" }),
|
|
151
|
+
"Use This Template"
|
|
152
|
+
] }),
|
|
153
|
+
template.publisher?.websiteUrl && /* @__PURE__ */ jsx(Button, { variant: "outline", className: "w-full", asChild: true, children: /* @__PURE__ */ jsxs(
|
|
154
|
+
"a",
|
|
155
|
+
{
|
|
156
|
+
href: template.publisher.websiteUrl,
|
|
157
|
+
target: "_blank",
|
|
158
|
+
rel: "noopener noreferrer",
|
|
159
|
+
children: [
|
|
160
|
+
/* @__PURE__ */ jsx(ExternalLink, { className: "size-4 mr-2" }),
|
|
161
|
+
"View Publisher"
|
|
162
|
+
]
|
|
163
|
+
}
|
|
164
|
+
) })
|
|
165
|
+
] })
|
|
166
|
+
] })
|
|
167
|
+
] });
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export { TemplateDetailPanel };
|
|
171
|
+
//# sourceMappingURL=TemplateDetailPanel-UXH6KPCH.js.map
|
|
172
|
+
//# sourceMappingURL=TemplateDetailPanel-UXH6KPCH.js.map
|