@tduniec/plugin-template-designer-foundation 0.1.1

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.
Files changed (78) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +13 -0
  3. package/dist/api/useScaffolderActions.esm.js +59 -0
  4. package/dist/api/useScaffolderActions.esm.js.map +1 -0
  5. package/dist/components/FieldEditorDialog.esm.js +55 -0
  6. package/dist/components/FieldEditorDialog.esm.js.map +1 -0
  7. package/dist/components/Nodes/ActionNode.esm.js +613 -0
  8. package/dist/components/Nodes/ActionNode.esm.js.map +1 -0
  9. package/dist/components/Nodes/OutputNode.esm.js +373 -0
  10. package/dist/components/Nodes/OutputNode.esm.js.map +1 -0
  11. package/dist/components/Nodes/ParameterInputNode.esm.js +320 -0
  12. package/dist/components/Nodes/ParameterInputNode.esm.js.map +1 -0
  13. package/dist/components/Nodes/ParameterTitlesNode.esm.js +251 -0
  14. package/dist/components/Nodes/ParameterTitlesNode.esm.js.map +1 -0
  15. package/dist/components/Nodes/ParametersNode.esm.js +147 -0
  16. package/dist/components/Nodes/ParametersNode.esm.js.map +1 -0
  17. package/dist/components/Nodes/action/schema.esm.js +68 -0
  18. package/dist/components/Nodes/action/schema.esm.js.map +1 -0
  19. package/dist/components/Nodes/action/useActionInputs.esm.js +71 -0
  20. package/dist/components/Nodes/action/useActionInputs.esm.js.map +1 -0
  21. package/dist/components/Nodes/common/AutoWidthPopper.esm.js +11 -0
  22. package/dist/components/Nodes/common/AutoWidthPopper.esm.js.map +1 -0
  23. package/dist/components/Nodes/common/nodeInteraction.esm.js +20 -0
  24. package/dist/components/Nodes/common/nodeInteraction.esm.js.map +1 -0
  25. package/dist/components/Nodes/output/useOutputController.esm.js +125 -0
  26. package/dist/components/Nodes/output/useOutputController.esm.js.map +1 -0
  27. package/dist/components/TemplateDesigner/TemplateLanding.esm.js +157 -0
  28. package/dist/components/TemplateDesigner/TemplateLanding.esm.js.map +1 -0
  29. package/dist/components/TemplateDesigner/TemplateWorkspace.esm.js +416 -0
  30. package/dist/components/TemplateDesigner/TemplateWorkspace.esm.js.map +1 -0
  31. package/dist/components/TemplateDesigner/codemirrorTheme.esm.js +30 -0
  32. package/dist/components/TemplateDesigner/codemirrorTheme.esm.js.map +1 -0
  33. package/dist/components/TemplateDesigner/useFieldEditor.esm.js +95 -0
  34. package/dist/components/TemplateDesigner/useFieldEditor.esm.js.map +1 -0
  35. package/dist/components/TemplateDesignerIcon.esm.js +33 -0
  36. package/dist/components/TemplateDesignerIcon.esm.js.map +1 -0
  37. package/dist/components/designerFlowConfig.esm.js +13 -0
  38. package/dist/components/designerFlowConfig.esm.js.map +1 -0
  39. package/dist/designerFlow/DesignerFlow.esm.js +828 -0
  40. package/dist/designerFlow/DesignerFlow.esm.js.map +1 -0
  41. package/dist/designerFlow/handlers.esm.js +317 -0
  42. package/dist/designerFlow/handlers.esm.js.map +1 -0
  43. package/dist/designerFlow/model.esm.js +166 -0
  44. package/dist/designerFlow/model.esm.js.map +1 -0
  45. package/dist/designerFlow/nodeLayout.esm.js +108 -0
  46. package/dist/designerFlow/nodeLayout.esm.js.map +1 -0
  47. package/dist/designerFlow/parameterTransforms.esm.js +124 -0
  48. package/dist/designerFlow/parameterTransforms.esm.js.map +1 -0
  49. package/dist/designerFlow/utils/stableComparators.esm.js +69 -0
  50. package/dist/designerFlow/utils/stableComparators.esm.js.map +1 -0
  51. package/dist/foundation/actionNodeCustomization.esm.js +20 -0
  52. package/dist/foundation/actionNodeCustomization.esm.js.map +1 -0
  53. package/dist/foundation/actionNodeRegistry.esm.js +30 -0
  54. package/dist/foundation/actionNodeRegistry.esm.js.map +1 -0
  55. package/dist/foundation/featureFlags.esm.js +6 -0
  56. package/dist/foundation/featureFlags.esm.js.map +1 -0
  57. package/dist/foundation/templateSources.esm.js +16 -0
  58. package/dist/foundation/templateSources.esm.js.map +1 -0
  59. package/dist/index.d.ts +382 -0
  60. package/dist/index.esm.js +25 -0
  61. package/dist/index.esm.js.map +1 -0
  62. package/dist/state/templateUtils.esm.js +46 -0
  63. package/dist/state/templateUtils.esm.js.map +1 -0
  64. package/dist/state/useParameterSections.esm.js +162 -0
  65. package/dist/state/useParameterSections.esm.js.map +1 -0
  66. package/dist/state/useTemplateState.esm.js +627 -0
  67. package/dist/state/useTemplateState.esm.js.map +1 -0
  68. package/dist/types/flowNodes.esm.js +8 -0
  69. package/dist/types/flowNodes.esm.js.map +1 -0
  70. package/dist/utils/createSequentialEdges.esm.js +15 -0
  71. package/dist/utils/createSequentialEdges.esm.js.map +1 -0
  72. package/dist/utils/mocks/mocks.esm.js +120 -0
  73. package/dist/utils/mocks/mocks.esm.js.map +1 -0
  74. package/dist/utils/sampleTemplate.esm.js +40 -0
  75. package/dist/utils/sampleTemplate.esm.js.map +1 -0
  76. package/dist/utils/yamlJsonConversion.esm.js +47 -0
  77. package/dist/utils/yamlJsonConversion.esm.js.map +1 -0
  78. package/package.json +103 -0
@@ -0,0 +1,157 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { Grid, Paper, Box, Typography, Button, TextField } from '@material-ui/core';
3
+ import { useTheme } from '@material-ui/core/styles';
4
+ import Autocomplete from '@material-ui/lab/Autocomplete';
5
+
6
+ const TemplateLanding = ({
7
+ loadError,
8
+ onStartSampleTemplate,
9
+ onOpenTemplatePicker,
10
+ availableTemplates,
11
+ selectCatalogTemplate
12
+ }) => {
13
+ const theme = useTheme();
14
+ return /* @__PURE__ */ jsx(
15
+ Grid,
16
+ {
17
+ container: true,
18
+ justifyContent: "center",
19
+ alignItems: "center",
20
+ style: { minHeight: "60vh" },
21
+ children: /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 10, lg: 8, children: /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 4, alignItems: "stretch", children: [
22
+ /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 4, children: /* @__PURE__ */ jsxs(
23
+ Paper,
24
+ {
25
+ elevation: 3,
26
+ style: {
27
+ padding: 32,
28
+ height: "100%",
29
+ minHeight: 320,
30
+ display: "flex",
31
+ flexDirection: "column",
32
+ gap: 16
33
+ },
34
+ children: [
35
+ /* @__PURE__ */ jsxs(Box, { children: [
36
+ /* @__PURE__ */ jsx(Typography, { variant: "h6", children: "Create new template" }),
37
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "textSecondary", children: "Start with a tidy sample blueprint that includes a single action step and helpful starter metadata." })
38
+ ] }),
39
+ /* @__PURE__ */ jsx(Box, { mt: "auto", display: "flex", justifyContent: "flex-start", children: /* @__PURE__ */ jsx(
40
+ Button,
41
+ {
42
+ color: "primary",
43
+ variant: "contained",
44
+ onClick: onStartSampleTemplate,
45
+ children: "Start new template"
46
+ }
47
+ ) })
48
+ ]
49
+ }
50
+ ) }),
51
+ /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 4, children: /* @__PURE__ */ jsxs(
52
+ Paper,
53
+ {
54
+ elevation: 3,
55
+ style: {
56
+ padding: 32,
57
+ height: "100%",
58
+ minHeight: 320,
59
+ display: "flex",
60
+ flexDirection: "column",
61
+ gap: 16
62
+ },
63
+ children: [
64
+ /* @__PURE__ */ jsxs(Box, { children: [
65
+ /* @__PURE__ */ jsx(Typography, { variant: "h6", children: "Load from file" }),
66
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "textSecondary", children: "Import an existing template in YAML or JSON format and iterate in the visual designer." })
67
+ ] }),
68
+ /* @__PURE__ */ jsxs(
69
+ Box,
70
+ {
71
+ mt: "auto",
72
+ display: "flex",
73
+ flexDirection: "column",
74
+ style: { gap: 8 },
75
+ children: [
76
+ /* @__PURE__ */ jsx(
77
+ Button,
78
+ {
79
+ color: "primary",
80
+ variant: "outlined",
81
+ onClick: onOpenTemplatePicker,
82
+ children: "Choose file"
83
+ }
84
+ ),
85
+ loadError && /* @__PURE__ */ jsx(
86
+ Typography,
87
+ {
88
+ variant: "body2",
89
+ style: { color: theme.palette.error.main },
90
+ children: loadError
91
+ }
92
+ )
93
+ ]
94
+ }
95
+ )
96
+ ]
97
+ }
98
+ ) }),
99
+ /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 4, children: /* @__PURE__ */ jsxs(
100
+ Paper,
101
+ {
102
+ elevation: 3,
103
+ style: {
104
+ padding: 32,
105
+ height: "100%",
106
+ minHeight: 320,
107
+ display: "flex",
108
+ flexDirection: "column",
109
+ gap: 16
110
+ },
111
+ children: [
112
+ /* @__PURE__ */ jsxs(Box, { children: [
113
+ /* @__PURE__ */ jsx(Typography, { variant: "h6", children: "Select from catalog" }),
114
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "textSecondary", children: "Select existing template from catalog." })
115
+ ] }),
116
+ /* @__PURE__ */ jsx(
117
+ Box,
118
+ {
119
+ mt: "auto",
120
+ display: "flex",
121
+ flexDirection: "column",
122
+ style: { gap: 8 },
123
+ children: /* @__PURE__ */ jsx(
124
+ Autocomplete,
125
+ {
126
+ style: { width: "100%" },
127
+ size: "small",
128
+ options: availableTemplates ?? [],
129
+ getOptionLabel: (option) => option.metadata.title ?? option.metadata.name,
130
+ onChange: (_e, value) => {
131
+ if (value) {
132
+ selectCatalogTemplate(value);
133
+ }
134
+ },
135
+ renderInput: (params) => /* @__PURE__ */ jsx(
136
+ TextField,
137
+ {
138
+ ...params,
139
+ autoComplete: "off",
140
+ label: "Select template",
141
+ variant: "outlined"
142
+ }
143
+ )
144
+ }
145
+ )
146
+ }
147
+ )
148
+ ]
149
+ }
150
+ ) })
151
+ ] }) })
152
+ }
153
+ );
154
+ };
155
+
156
+ export { TemplateLanding };
157
+ //# sourceMappingURL=TemplateLanding.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplateLanding.esm.js","sources":["../../../src/components/TemplateDesigner/TemplateLanding.tsx"],"sourcesContent":["import {\n Box,\n Button,\n Grid,\n Paper,\n TextField,\n Typography,\n} from \"@material-ui/core\";\nimport { useTheme } from \"@material-ui/core/styles\";\nimport Autocomplete from \"@material-ui/lab/Autocomplete\";\nimport type { TemplateEntityV1beta3 } from \"@backstage/plugin-scaffolder-common\";\n\ntype TemplateLandingProps = {\n loadError?: string;\n onStartSampleTemplate: () => void;\n onOpenTemplatePicker: () => void;\n availableTemplates: TemplateEntityV1beta3[];\n selectCatalogTemplate: (selected: TemplateEntityV1beta3) => void;\n};\n\nexport const TemplateLanding = ({\n loadError,\n onStartSampleTemplate,\n onOpenTemplatePicker,\n availableTemplates,\n selectCatalogTemplate,\n}: TemplateLandingProps) => {\n const theme = useTheme();\n\n return (\n <Grid\n container\n justifyContent=\"center\"\n alignItems=\"center\"\n style={{ minHeight: \"60vh\" }}\n >\n <Grid item xs={12} md={10} lg={8}>\n <Grid container spacing={4} alignItems=\"stretch\">\n <Grid item xs={12} md={4}>\n <Paper\n elevation={3}\n style={{\n padding: 32,\n height: \"100%\",\n minHeight: 320,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n }}\n >\n <Box>\n <Typography variant=\"h6\">Create new template</Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Start with a tidy sample blueprint that includes a single\n action step and helpful starter metadata.\n </Typography>\n </Box>\n <Box mt=\"auto\" display=\"flex\" justifyContent=\"flex-start\">\n <Button\n color=\"primary\"\n variant=\"contained\"\n onClick={onStartSampleTemplate}\n >\n Start new template\n </Button>\n </Box>\n </Paper>\n </Grid>\n <Grid item xs={12} md={4}>\n <Paper\n elevation={3}\n style={{\n padding: 32,\n height: \"100%\",\n minHeight: 320,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n }}\n >\n <Box>\n <Typography variant=\"h6\">Load from file</Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Import an existing template in YAML or JSON format and iterate\n in the visual designer.\n </Typography>\n </Box>\n <Box\n mt=\"auto\"\n display=\"flex\"\n flexDirection=\"column\"\n style={{ gap: 8 }}\n >\n <Button\n color=\"primary\"\n variant=\"outlined\"\n onClick={onOpenTemplatePicker}\n >\n Choose file\n </Button>\n {loadError && (\n <Typography\n variant=\"body2\"\n style={{ color: theme.palette.error.main }}\n >\n {loadError}\n </Typography>\n )}\n </Box>\n </Paper>\n </Grid>\n <Grid item xs={12} md={4}>\n <Paper\n elevation={3}\n style={{\n padding: 32,\n height: \"100%\",\n minHeight: 320,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n }}\n >\n <Box>\n <Typography variant=\"h6\">Select from catalog</Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Select existing template from catalog.\n </Typography>\n </Box>\n <Box\n mt=\"auto\"\n display=\"flex\"\n flexDirection=\"column\"\n style={{ gap: 8 }}\n >\n <Autocomplete\n style={{ width: \"100%\" }}\n size=\"small\"\n options={availableTemplates ?? []}\n getOptionLabel={(option) =>\n option.metadata.title ?? option.metadata.name\n }\n onChange={(_e, value) => {\n if (value) {\n selectCatalogTemplate(value);\n }\n }}\n renderInput={(params) => (\n <TextField\n {...params}\n autoComplete=\"off\"\n label=\"Select template\"\n variant=\"outlined\"\n />\n )}\n />\n </Box>\n </Paper>\n </Grid>\n </Grid>\n </Grid>\n </Grid>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,416 @@
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import { useRef, useState, useMemo, useCallback, useEffect } from 'react';
3
+ import { CircularProgress, Typography, Grid, Button, Paper } from '@material-ui/core';
4
+ import { useTheme } from '@material-ui/core/styles';
5
+ import CodeMirror from '@uiw/react-codemirror';
6
+ import { yaml } from '@codemirror/lang-yaml';
7
+ import { createCodeMirrorTheme } from './codemirrorTheme.esm.js';
8
+ import DesignerFlow from '../../designerFlow/DesignerFlow.esm.js';
9
+ import { ActionNode } from '../Nodes/ActionNode.esm.js';
10
+ import { OutputNode } from '../Nodes/OutputNode.esm.js';
11
+
12
+ const TemplateWorkspace = ({
13
+ templateSteps,
14
+ templateParameters,
15
+ templateOutput,
16
+ templateYaml,
17
+ yamlError,
18
+ loadError,
19
+ showYaml,
20
+ onToggleYaml,
21
+ onYamlChange,
22
+ onStepsChange,
23
+ onParametersChange,
24
+ onOutputChange,
25
+ onReload,
26
+ onSave,
27
+ onOpenTemplatePicker,
28
+ activeTemplateLabel,
29
+ reloadButtonLabel,
30
+ saveButtonLabel,
31
+ isReloading,
32
+ isSaving,
33
+ isSyncing = false,
34
+ parametersNodeComponent,
35
+ actionNodeComponent = ActionNode,
36
+ outputNodeComponent = OutputNode,
37
+ headerActionsSlot,
38
+ flowTopSlot,
39
+ rightPanelSlot
40
+ }) => {
41
+ const workspaceRef = useRef(null);
42
+ const [workspaceHeight, setWorkspaceHeight] = useState(null);
43
+ const theme = useTheme();
44
+ const paletteMode = theme.palette.mode ?? theme.palette.type ?? "light";
45
+ const yamlDraftRef = useRef(templateYaml);
46
+ const templateYamlRef = useRef(templateYaml);
47
+ const debounceRef = useRef(null);
48
+ const flowDebounceRef = useRef(null);
49
+ const lastGoodFlowModelRef = useRef({
50
+ steps: templateSteps,
51
+ parameters: templateParameters,
52
+ output: templateOutput
53
+ });
54
+ const [debouncedFlowModel, setDebouncedFlowModel] = useState({
55
+ steps: templateSteps,
56
+ parameters: templateParameters,
57
+ output: templateOutput
58
+ });
59
+ const yamlExtensions = useMemo(() => [yaml()], []);
60
+ const codeMirrorTheme = useMemo(
61
+ () => createCodeMirrorTheme(theme, paletteMode),
62
+ [paletteMode, theme]
63
+ );
64
+ const flushYamlDraft = useCallback(() => {
65
+ if (debounceRef.current) {
66
+ clearTimeout(debounceRef.current);
67
+ debounceRef.current = null;
68
+ }
69
+ if (yamlDraftRef.current !== templateYamlRef.current) {
70
+ onYamlChange(yamlDraftRef.current);
71
+ }
72
+ }, [onYamlChange]);
73
+ const handleYamlChange = useCallback(
74
+ (value) => {
75
+ yamlDraftRef.current = value;
76
+ if (debounceRef.current) {
77
+ clearTimeout(debounceRef.current);
78
+ }
79
+ debounceRef.current = setTimeout(() => {
80
+ if (yamlDraftRef.current !== templateYamlRef.current) {
81
+ onYamlChange(yamlDraftRef.current);
82
+ }
83
+ debounceRef.current = null;
84
+ }, 600);
85
+ },
86
+ [onYamlChange]
87
+ );
88
+ const flushFlowDebounce = useCallback(() => {
89
+ if (flowDebounceRef.current) {
90
+ clearTimeout(flowDebounceRef.current);
91
+ flowDebounceRef.current = null;
92
+ }
93
+ if (!yamlError) {
94
+ lastGoodFlowModelRef.current = {
95
+ steps: templateSteps,
96
+ parameters: templateParameters,
97
+ output: templateOutput
98
+ };
99
+ }
100
+ setDebouncedFlowModel(lastGoodFlowModelRef.current);
101
+ }, [templateParameters, templateSteps, templateOutput, yamlError]);
102
+ const handleYamlBlur = useCallback(() => {
103
+ flushYamlDraft();
104
+ flushFlowDebounce();
105
+ }, [flushFlowDebounce, flushYamlDraft]);
106
+ useEffect(() => {
107
+ if (!yamlError) {
108
+ lastGoodFlowModelRef.current = {
109
+ steps: templateSteps,
110
+ parameters: templateParameters,
111
+ output: templateOutput
112
+ };
113
+ }
114
+ if (flowDebounceRef.current) {
115
+ clearTimeout(flowDebounceRef.current);
116
+ }
117
+ flowDebounceRef.current = setTimeout(() => {
118
+ setDebouncedFlowModel(lastGoodFlowModelRef.current);
119
+ flowDebounceRef.current = null;
120
+ }, 400);
121
+ }, [templateParameters, templateSteps, templateOutput, yamlError]);
122
+ useEffect(() => {
123
+ yamlDraftRef.current = templateYaml;
124
+ templateYamlRef.current = templateYaml;
125
+ }, [templateYaml]);
126
+ useEffect(() => {
127
+ if (!showYaml) {
128
+ flushYamlDraft();
129
+ }
130
+ }, [showYaml, flushYamlDraft]);
131
+ useEffect(
132
+ () => () => {
133
+ if (debounceRef.current) {
134
+ clearTimeout(debounceRef.current);
135
+ }
136
+ if (flowDebounceRef.current) {
137
+ clearTimeout(flowDebounceRef.current);
138
+ }
139
+ flushYamlDraft();
140
+ },
141
+ [flushYamlDraft]
142
+ );
143
+ const recalcWorkspaceHeight = useCallback(() => {
144
+ if (typeof window === "undefined") {
145
+ return;
146
+ }
147
+ const node = workspaceRef.current;
148
+ if (!node) {
149
+ return;
150
+ }
151
+ const rect = node.getBoundingClientRect();
152
+ const available = window.innerHeight - rect.top - 16;
153
+ setWorkspaceHeight(Math.max(available, 320));
154
+ }, []);
155
+ useEffect(() => {
156
+ recalcWorkspaceHeight();
157
+ if (typeof window === "undefined") {
158
+ return void 0;
159
+ }
160
+ const handleResize = () => recalcWorkspaceHeight();
161
+ window.addEventListener("resize", handleResize);
162
+ return () => window.removeEventListener("resize", handleResize);
163
+ }, [recalcWorkspaceHeight]);
164
+ return /* @__PURE__ */ jsxs(
165
+ "div",
166
+ {
167
+ ref: workspaceRef,
168
+ style: {
169
+ position: "relative",
170
+ height: workspaceHeight ? `${workspaceHeight}px` : "100vh",
171
+ minHeight: 0
172
+ },
173
+ children: [
174
+ isSyncing && /* @__PURE__ */ jsxs(
175
+ "div",
176
+ {
177
+ style: {
178
+ position: "fixed",
179
+ left: "calc(72px + 160px)",
180
+ bottom: 24,
181
+ display: "flex",
182
+ alignItems: "center",
183
+ gap: 8,
184
+ padding: "6px 10px",
185
+ borderRadius: 8,
186
+ background: paletteMode === "dark" ? "rgba(33,33,33,0.9)" : "rgba(255,255,255,0.95)",
187
+ boxShadow: theme.shadows[3],
188
+ border: `1px solid ${theme.palette.divider}`,
189
+ zIndex: (theme.zIndex?.tooltip ?? 1500) + 1,
190
+ pointerEvents: "none"
191
+ },
192
+ children: [
193
+ /* @__PURE__ */ jsx(CircularProgress, { size: 16, thickness: 5, color: "primary" }),
194
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "textSecondary", children: "Syncing..." })
195
+ ]
196
+ }
197
+ ),
198
+ /* @__PURE__ */ jsx(Grid, { container: true, spacing: 3, direction: "column", style: { height: "100%" }, children: /* @__PURE__ */ jsx(Grid, { item: true, style: { height: "100%" }, children: /* @__PURE__ */ jsxs(
199
+ "div",
200
+ {
201
+ style: {
202
+ height: "100%",
203
+ display: "flex",
204
+ flexDirection: "column",
205
+ gap: 16
206
+ },
207
+ children: [
208
+ /* @__PURE__ */ jsxs(
209
+ "div",
210
+ {
211
+ style: {
212
+ display: "flex",
213
+ justifyContent: "space-between",
214
+ alignItems: "center",
215
+ flexWrap: "wrap",
216
+ gap: 12
217
+ },
218
+ children: [
219
+ /* @__PURE__ */ jsxs(
220
+ "div",
221
+ {
222
+ style: {
223
+ display: "flex",
224
+ alignItems: "center",
225
+ gap: 12,
226
+ flexWrap: "wrap"
227
+ },
228
+ children: [
229
+ activeTemplateLabel && /* @__PURE__ */ jsxs(Typography, { variant: "body2", color: "textSecondary", children: [
230
+ "Active template: ",
231
+ activeTemplateLabel
232
+ ] }),
233
+ /* @__PURE__ */ jsx(
234
+ Button,
235
+ {
236
+ color: "primary",
237
+ variant: "contained",
238
+ size: "small",
239
+ onClick: onReload,
240
+ disabled: isReloading,
241
+ children: reloadButtonLabel
242
+ }
243
+ ),
244
+ /* @__PURE__ */ jsx(
245
+ Button,
246
+ {
247
+ color: "primary",
248
+ variant: "outlined",
249
+ size: "small",
250
+ onClick: onSave,
251
+ disabled: isSaving,
252
+ children: saveButtonLabel
253
+ }
254
+ ),
255
+ /* @__PURE__ */ jsx(
256
+ Button,
257
+ {
258
+ color: "primary",
259
+ variant: "outlined",
260
+ size: "small",
261
+ onClick: onOpenTemplatePicker,
262
+ children: "Load different file"
263
+ }
264
+ )
265
+ ]
266
+ }
267
+ ),
268
+ /* @__PURE__ */ jsxs(
269
+ "div",
270
+ {
271
+ style: {
272
+ display: "flex",
273
+ alignItems: "center",
274
+ gap: 8
275
+ },
276
+ children: [
277
+ isSyncing && /* @__PURE__ */ jsxs(
278
+ "div",
279
+ {
280
+ style: {
281
+ display: "flex",
282
+ alignItems: "center",
283
+ gap: 6,
284
+ padding: "2px 6px",
285
+ borderRadius: 6,
286
+ background: paletteMode === "dark" ? "rgba(33,33,33,0.8)" : "rgba(255,255,255,0.9)",
287
+ border: `1px solid ${theme.palette.divider}`
288
+ },
289
+ children: [
290
+ /* @__PURE__ */ jsx(CircularProgress, { size: 14, thickness: 5, color: "primary" }),
291
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "textSecondary", children: "Syncing..." })
292
+ ]
293
+ }
294
+ ),
295
+ /* @__PURE__ */ jsx(Button, { variant: "outlined", size: "small", onClick: onToggleYaml, children: showYaml ? "Hide YAML" : "Show YAML" })
296
+ ]
297
+ }
298
+ )
299
+ ]
300
+ }
301
+ ),
302
+ loadError && /* @__PURE__ */ jsx(
303
+ Typography,
304
+ {
305
+ variant: "body2",
306
+ style: { color: theme.palette.error.main },
307
+ children: loadError
308
+ }
309
+ ),
310
+ headerActionsSlot && /* @__PURE__ */ jsx("div", { style: { display: "flex", flexWrap: "wrap", gap: 12 }, children: headerActionsSlot }),
311
+ /* @__PURE__ */ jsxs(
312
+ "div",
313
+ {
314
+ style: {
315
+ flex: 1,
316
+ display: "flex",
317
+ gap: 16,
318
+ minHeight: 0,
319
+ height: "100%"
320
+ },
321
+ children: [
322
+ /* @__PURE__ */ jsx(
323
+ "div",
324
+ {
325
+ style: {
326
+ flex: showYaml ? 1.6 : 1,
327
+ minWidth: 0,
328
+ display: "flex",
329
+ flexDirection: "column"
330
+ },
331
+ children: /* @__PURE__ */ jsxs("div", { style: { flex: 1, minHeight: 0 }, children: [
332
+ flowTopSlot,
333
+ /* @__PURE__ */ jsx(
334
+ DesignerFlow,
335
+ {
336
+ steps: debouncedFlowModel.steps,
337
+ parameters: debouncedFlowModel.parameters,
338
+ output: debouncedFlowModel.output,
339
+ onStepsChange,
340
+ onParametersChange,
341
+ onOutputChange,
342
+ actionNodeComponent,
343
+ parametersNodeComponent,
344
+ outputNodeComponent
345
+ }
346
+ )
347
+ ] })
348
+ }
349
+ ),
350
+ (showYaml || rightPanelSlot) && /* @__PURE__ */ jsxs(
351
+ Paper,
352
+ {
353
+ elevation: 2,
354
+ style: {
355
+ flex: 1,
356
+ display: "flex",
357
+ flexDirection: "column",
358
+ minWidth: 0,
359
+ overflow: "hidden"
360
+ },
361
+ children: [
362
+ showYaml && /* @__PURE__ */ jsxs(Fragment, { children: [
363
+ /* @__PURE__ */ jsx(
364
+ "div",
365
+ {
366
+ style: {
367
+ padding: "12px 16px",
368
+ borderBottom: "1px solid rgba(0,0,0,0.12)",
369
+ fontWeight: 600,
370
+ fontSize: "0.875rem"
371
+ },
372
+ children: "YAML Preview"
373
+ }
374
+ ),
375
+ yamlError && /* @__PURE__ */ jsx(
376
+ "div",
377
+ {
378
+ style: {
379
+ padding: "8px 16px",
380
+ borderBottom: "1px solid rgba(0,0,0,0.08)",
381
+ color: theme.palette.error.main,
382
+ fontSize: "0.75rem",
383
+ background: paletteMode === "dark" ? "rgba(255, 82, 82, 0.1)" : "rgba(244, 67, 54, 0.08)"
384
+ },
385
+ children: yamlError
386
+ }
387
+ ),
388
+ /* @__PURE__ */ jsx("div", { style: { flex: 1, minHeight: 0, overflow: "auto" }, children: /* @__PURE__ */ jsx(
389
+ CodeMirror,
390
+ {
391
+ value: templateYaml,
392
+ extensions: yamlExtensions,
393
+ theme: codeMirrorTheme,
394
+ height: "100%",
395
+ onChange: handleYamlChange,
396
+ onBlur: handleYamlBlur
397
+ }
398
+ ) })
399
+ ] }),
400
+ rightPanelSlot && !showYaml && /* @__PURE__ */ jsx("div", { style: { flex: 1, minHeight: 0, overflow: "auto" }, children: rightPanelSlot })
401
+ ]
402
+ }
403
+ )
404
+ ]
405
+ }
406
+ )
407
+ ]
408
+ }
409
+ ) }) })
410
+ ]
411
+ }
412
+ );
413
+ };
414
+
415
+ export { TemplateWorkspace };
416
+ //# sourceMappingURL=TemplateWorkspace.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplateWorkspace.esm.js","sources":["../../../src/components/TemplateDesigner/TemplateWorkspace.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport {\n Button,\n Grid,\n Paper,\n Typography,\n CircularProgress,\n} from \"@material-ui/core\";\nimport { useTheme } from \"@material-ui/core/styles\";\nimport CodeMirror from \"@uiw/react-codemirror\";\nimport { yaml } from \"@codemirror/lang-yaml\";\nimport { createCodeMirrorTheme } from \"./codemirrorTheme\";\nimport type {\n ScaffolderTaskOutput,\n TaskStep,\n} from \"@backstage/plugin-scaffolder-common\";\nimport type { TemplateParametersValue } from \"../../types/flowNodes\";\nimport DesignerFlow, {\n type DesignerFlowProps,\n} from \"../../designerFlow/DesignerFlow\";\nimport { ActionNode } from \"../Nodes/ActionNode\";\nimport { OutputNode } from \"../Nodes/OutputNode\";\n\ntype TemplateWorkspaceProps = {\n templateSteps: TaskStep[];\n templateParameters: TemplateParametersValue;\n templateOutput?: ScaffolderTaskOutput;\n templateYaml: string;\n yamlError?: string;\n loadError?: string;\n showYaml: boolean;\n onToggleYaml: () => void;\n onYamlChange: (value: string) => void;\n onStepsChange: (steps: TaskStep[]) => void;\n onParametersChange: (parameters: TemplateParametersValue) => void;\n onOutputChange: (output?: ScaffolderTaskOutput) => void;\n onReload: () => void;\n onSave: () => void;\n onOpenTemplatePicker: () => void;\n activeTemplateLabel?: string;\n reloadButtonLabel: string;\n saveButtonLabel: string;\n isReloading: boolean;\n isSaving: boolean;\n isSyncing?: boolean;\n parametersNodeComponent: DesignerFlowProps[\"parametersNodeComponent\"];\n actionNodeComponent?: DesignerFlowProps[\"actionNodeComponent\"];\n outputNodeComponent?: DesignerFlowProps[\"outputNodeComponent\"];\n headerActionsSlot?: ReactNode;\n flowTopSlot?: ReactNode;\n rightPanelSlot?: ReactNode;\n};\n\nexport const TemplateWorkspace = ({\n templateSteps,\n templateParameters,\n templateOutput,\n templateYaml,\n yamlError,\n loadError,\n showYaml,\n onToggleYaml,\n onYamlChange,\n onStepsChange,\n onParametersChange,\n onOutputChange,\n onReload,\n onSave,\n onOpenTemplatePicker,\n activeTemplateLabel,\n reloadButtonLabel,\n saveButtonLabel,\n isReloading,\n isSaving,\n isSyncing = false,\n parametersNodeComponent,\n actionNodeComponent = ActionNode as DesignerFlowProps[\"actionNodeComponent\"],\n outputNodeComponent = OutputNode as DesignerFlowProps[\"outputNodeComponent\"],\n headerActionsSlot,\n flowTopSlot,\n rightPanelSlot,\n}: TemplateWorkspaceProps) => {\n const workspaceRef = useRef<HTMLDivElement | null>(null);\n const [workspaceHeight, setWorkspaceHeight] = useState<number | null>(null);\n const theme = useTheme();\n const paletteMode =\n (theme.palette as { mode?: \"light\" | \"dark\" }).mode ??\n theme.palette.type ??\n \"light\";\n const yamlDraftRef = useRef(templateYaml);\n const templateYamlRef = useRef(templateYaml);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const flowDebounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const lastGoodFlowModelRef = useRef<{\n steps: TaskStep[];\n parameters: TemplateParametersValue;\n output?: ScaffolderTaskOutput;\n }>({\n steps: templateSteps,\n parameters: templateParameters,\n output: templateOutput,\n });\n const [debouncedFlowModel, setDebouncedFlowModel] = useState<{\n steps: TaskStep[];\n parameters: TemplateParametersValue;\n output?: ScaffolderTaskOutput;\n }>({\n steps: templateSteps,\n parameters: templateParameters,\n output: templateOutput,\n });\n const yamlExtensions = useMemo(() => [yaml()], []);\n const codeMirrorTheme = useMemo(\n () => createCodeMirrorTheme(theme, paletteMode),\n [paletteMode, theme]\n );\n\n const flushYamlDraft = useCallback(() => {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n debounceRef.current = null;\n }\n if (yamlDraftRef.current !== templateYamlRef.current) {\n onYamlChange(yamlDraftRef.current);\n }\n }, [onYamlChange]);\n\n const handleYamlChange = useCallback(\n (value: string) => {\n yamlDraftRef.current = value;\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n debounceRef.current = setTimeout(() => {\n if (yamlDraftRef.current !== templateYamlRef.current) {\n onYamlChange(yamlDraftRef.current);\n }\n debounceRef.current = null;\n }, 600); // Send YAML updates after user pauses; avoids live sync on every keystroke.\n },\n [onYamlChange]\n );\n\n const flushFlowDebounce = useCallback(() => {\n if (flowDebounceRef.current) {\n clearTimeout(flowDebounceRef.current);\n flowDebounceRef.current = null;\n }\n // Push latest parsable props immediately; used when user clicks out.\n if (!yamlError) {\n lastGoodFlowModelRef.current = {\n steps: templateSteps,\n parameters: templateParameters,\n output: templateOutput,\n };\n }\n setDebouncedFlowModel(lastGoodFlowModelRef.current);\n }, [templateParameters, templateSteps, templateOutput, yamlError]);\n\n const handleYamlBlur = useCallback(() => {\n flushYamlDraft();\n // Ensure pending graph updates flush when user leaves the editor.\n flushFlowDebounce();\n }, [flushFlowDebounce, flushYamlDraft]);\n\n useEffect(() => {\n // Keep the last good (parsable) model so YAML drafts with errors don't blank the canvas.\n if (!yamlError) {\n lastGoodFlowModelRef.current = {\n steps: templateSteps,\n parameters: templateParameters,\n output: templateOutput,\n };\n }\n if (flowDebounceRef.current) {\n clearTimeout(flowDebounceRef.current);\n }\n // Debounce to avoid re-rendering the graph on every keystroke in YAML/editor.\n flowDebounceRef.current = setTimeout(() => {\n // If YAML is broken, keep showing the last good model instead of empty graph.\n setDebouncedFlowModel(lastGoodFlowModelRef.current);\n flowDebounceRef.current = null;\n }, 400);\n }, [templateParameters, templateSteps, templateOutput, yamlError]);\n\n useEffect(() => {\n yamlDraftRef.current = templateYaml;\n templateYamlRef.current = templateYaml;\n }, [templateYaml]);\n\n useEffect(() => {\n if (!showYaml) {\n flushYamlDraft();\n }\n }, [showYaml, flushYamlDraft]);\n\n useEffect(\n () => () => {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n if (flowDebounceRef.current) {\n clearTimeout(flowDebounceRef.current);\n }\n flushYamlDraft();\n },\n [flushYamlDraft]\n );\n\n const recalcWorkspaceHeight = useCallback(() => {\n if (typeof window === \"undefined\") {\n return;\n }\n const node = workspaceRef.current;\n if (!node) {\n return;\n }\n const rect = node.getBoundingClientRect();\n const available = window.innerHeight - rect.top - 16;\n setWorkspaceHeight(Math.max(available, 320));\n }, []);\n\n useEffect(() => {\n recalcWorkspaceHeight();\n if (typeof window === \"undefined\") {\n return undefined;\n }\n const handleResize = () => recalcWorkspaceHeight();\n window.addEventListener(\"resize\", handleResize);\n return () => window.removeEventListener(\"resize\", handleResize);\n }, [recalcWorkspaceHeight]);\n\n return (\n <div\n ref={workspaceRef}\n style={{\n position: \"relative\",\n height: workspaceHeight ? `${workspaceHeight}px` : \"100vh\",\n minHeight: 0,\n }}\n >\n {isSyncing && (\n <div\n style={{\n position: \"fixed\",\n left: \"calc(72px + 160px)\",\n bottom: 24,\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"6px 10px\",\n borderRadius: 8,\n background:\n paletteMode === \"dark\"\n ? \"rgba(33,33,33,0.9)\"\n : \"rgba(255,255,255,0.95)\",\n boxShadow: theme.shadows[3],\n border: `1px solid ${theme.palette.divider}`,\n zIndex: (theme.zIndex?.tooltip ?? 1500) + 1,\n pointerEvents: \"none\",\n }}\n >\n <CircularProgress size={16} thickness={5} color=\"primary\" />\n <Typography variant=\"caption\" color=\"textSecondary\">\n Syncing...\n </Typography>\n </div>\n )}\n <Grid container spacing={3} direction=\"column\" style={{ height: \"100%\" }}>\n <Grid item style={{ height: \"100%\" }}>\n <div\n style={{\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n }}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n flexWrap: \"wrap\",\n gap: 12,\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n flexWrap: \"wrap\",\n }}\n >\n {activeTemplateLabel && (\n <Typography variant=\"body2\" color=\"textSecondary\">\n Active template: {activeTemplateLabel}\n </Typography>\n )}\n <Button\n color=\"primary\"\n variant=\"contained\"\n size=\"small\"\n onClick={onReload}\n disabled={isReloading}\n >\n {reloadButtonLabel}\n </Button>\n <Button\n color=\"primary\"\n variant=\"outlined\"\n size=\"small\"\n onClick={onSave}\n disabled={isSaving}\n >\n {saveButtonLabel}\n </Button>\n <Button\n color=\"primary\"\n variant=\"outlined\"\n size=\"small\"\n onClick={onOpenTemplatePicker}\n >\n Load different file\n </Button>\n </div>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n }}\n >\n {isSyncing && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"2px 6px\",\n borderRadius: 6,\n background:\n paletteMode === \"dark\"\n ? \"rgba(33,33,33,0.8)\"\n : \"rgba(255,255,255,0.9)\",\n border: `1px solid ${theme.palette.divider}`,\n }}\n >\n <CircularProgress size={14} thickness={5} color=\"primary\" />\n <Typography variant=\"caption\" color=\"textSecondary\">\n Syncing...\n </Typography>\n </div>\n )}\n <Button variant=\"outlined\" size=\"small\" onClick={onToggleYaml}>\n {showYaml ? \"Hide YAML\" : \"Show YAML\"}\n </Button>\n </div>\n </div>\n {loadError && (\n <Typography\n variant=\"body2\"\n style={{ color: theme.palette.error.main }}\n >\n {loadError}\n </Typography>\n )}\n {headerActionsSlot && (\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 12 }}>\n {headerActionsSlot}\n </div>\n )}\n <div\n style={{\n flex: 1,\n display: \"flex\",\n gap: 16,\n minHeight: 0,\n height: \"100%\",\n }}\n >\n <div\n style={{\n flex: showYaml ? 1.6 : 1,\n minWidth: 0,\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <div style={{ flex: 1, minHeight: 0 }}>\n {flowTopSlot}\n <DesignerFlow\n steps={debouncedFlowModel.steps}\n parameters={debouncedFlowModel.parameters}\n output={debouncedFlowModel.output}\n onStepsChange={onStepsChange}\n onParametersChange={onParametersChange}\n onOutputChange={onOutputChange}\n actionNodeComponent={actionNodeComponent}\n parametersNodeComponent={parametersNodeComponent}\n outputNodeComponent={outputNodeComponent}\n />\n </div>\n </div>\n {(showYaml || rightPanelSlot) && (\n <Paper\n elevation={2}\n style={{\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n minWidth: 0,\n overflow: \"hidden\",\n }}\n >\n {showYaml && (\n <>\n <div\n style={{\n padding: \"12px 16px\",\n borderBottom: \"1px solid rgba(0,0,0,0.12)\",\n fontWeight: 600,\n fontSize: \"0.875rem\",\n }}\n >\n YAML Preview\n </div>\n {yamlError && (\n <div\n style={{\n padding: \"8px 16px\",\n borderBottom: \"1px solid rgba(0,0,0,0.08)\",\n color: theme.palette.error.main,\n fontSize: \"0.75rem\",\n background:\n paletteMode === \"dark\"\n ? \"rgba(255, 82, 82, 0.1)\"\n : \"rgba(244, 67, 54, 0.08)\",\n }}\n >\n {yamlError}\n </div>\n )}\n <div style={{ flex: 1, minHeight: 0, overflow: \"auto\" }}>\n <CodeMirror\n value={templateYaml}\n extensions={yamlExtensions}\n theme={codeMirrorTheme}\n height=\"100%\"\n onChange={handleYamlChange}\n onBlur={handleYamlBlur}\n />\n </div>\n </>\n )}\n {rightPanelSlot && !showYaml && (\n <div style={{ flex: 1, minHeight: 0, overflow: \"auto\" }}>\n {rightPanelSlot}\n </div>\n )}\n </Paper>\n )}\n </div>\n </div>\n </Grid>\n </Grid>\n </div>\n );\n};\n"],"names":[],"mappings":"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"}