@tduniec/plugin-template-designer 0.1.7

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 (69) hide show
  1. package/README.md +120 -0
  2. package/dist/api/scaffolderActions.esm.js +42 -0
  3. package/dist/api/scaffolderActions.esm.js.map +1 -0
  4. package/dist/components/DesignerFlow/DesignerFlow.esm.js +370 -0
  5. package/dist/components/DesignerFlow/DesignerFlow.esm.js.map +1 -0
  6. package/dist/components/DesignerFlow/flowConfig.esm.js +21 -0
  7. package/dist/components/DesignerFlow/flowConfig.esm.js.map +1 -0
  8. package/dist/components/DesignerFlow/handlers.esm.js +288 -0
  9. package/dist/components/DesignerFlow/handlers.esm.js.map +1 -0
  10. package/dist/components/DesignerFlow/model.esm.js +181 -0
  11. package/dist/components/DesignerFlow/model.esm.js.map +1 -0
  12. package/dist/components/DesignerFlow/nodeLayout.esm.js +138 -0
  13. package/dist/components/DesignerFlow/nodeLayout.esm.js.map +1 -0
  14. package/dist/components/DesignerFlow/parameterTransforms.esm.js +184 -0
  15. package/dist/components/DesignerFlow/parameterTransforms.esm.js.map +1 -0
  16. package/dist/components/Nodes/ActionNode.esm.js +437 -0
  17. package/dist/components/Nodes/ActionNode.esm.js.map +1 -0
  18. package/dist/components/Nodes/OutputNode.esm.js +368 -0
  19. package/dist/components/Nodes/OutputNode.esm.js.map +1 -0
  20. package/dist/components/Nodes/ParameterInputNode.esm.js +310 -0
  21. package/dist/components/Nodes/ParameterInputNode.esm.js.map +1 -0
  22. package/dist/components/Nodes/ParameterTitlesNode.esm.js +251 -0
  23. package/dist/components/Nodes/ParameterTitlesNode.esm.js.map +1 -0
  24. package/dist/components/Nodes/ParametersNode.esm.js +142 -0
  25. package/dist/components/Nodes/ParametersNode.esm.js.map +1 -0
  26. package/dist/components/Nodes/action/schema.esm.js +117 -0
  27. package/dist/components/Nodes/action/schema.esm.js.map +1 -0
  28. package/dist/components/Nodes/action/useActionInputs.esm.js +66 -0
  29. package/dist/components/Nodes/action/useActionInputs.esm.js.map +1 -0
  30. package/dist/components/Nodes/common/AutoWidthPopper.esm.js +22 -0
  31. package/dist/components/Nodes/common/AutoWidthPopper.esm.js.map +1 -0
  32. package/dist/components/Nodes/common/nodeInteraction.esm.js +9 -0
  33. package/dist/components/Nodes/common/nodeInteraction.esm.js.map +1 -0
  34. package/dist/components/Nodes/output/useOutputController.esm.js +191 -0
  35. package/dist/components/Nodes/output/useOutputController.esm.js.map +1 -0
  36. package/dist/components/Nodes/parameters/useParameterSections.esm.js +162 -0
  37. package/dist/components/Nodes/parameters/useParameterSections.esm.js.map +1 -0
  38. package/dist/components/Nodes/types.esm.js +8 -0
  39. package/dist/components/Nodes/types.esm.js.map +1 -0
  40. package/dist/components/TemplateDesigner/TemplateDesigner.esm.js +115 -0
  41. package/dist/components/TemplateDesigner/TemplateDesigner.esm.js.map +1 -0
  42. package/dist/components/TemplateDesigner/components/FieldEditorDialog.esm.js +32 -0
  43. package/dist/components/TemplateDesigner/components/FieldEditorDialog.esm.js.map +1 -0
  44. package/dist/components/TemplateDesigner/components/TemplateLanding.esm.js +102 -0
  45. package/dist/components/TemplateDesigner/components/TemplateLanding.esm.js.map +1 -0
  46. package/dist/components/TemplateDesigner/components/TemplateWorkspace.esm.js +200 -0
  47. package/dist/components/TemplateDesigner/components/TemplateWorkspace.esm.js.map +1 -0
  48. package/dist/components/TemplateDesigner/index.esm.js +2 -0
  49. package/dist/components/TemplateDesigner/index.esm.js.map +1 -0
  50. package/dist/components/TemplateDesigner/useFieldEditor.esm.js +96 -0
  51. package/dist/components/TemplateDesigner/useFieldEditor.esm.js.map +1 -0
  52. package/dist/components/TemplateDesigner/useTemplateState.esm.js +391 -0
  53. package/dist/components/TemplateDesigner/useTemplateState.esm.js.map +1 -0
  54. package/dist/components/TemplateDesigner/utils.esm.js +46 -0
  55. package/dist/components/TemplateDesigner/utils.esm.js.map +1 -0
  56. package/dist/index.d.ts +9 -0
  57. package/dist/index.esm.js +2 -0
  58. package/dist/index.esm.js.map +1 -0
  59. package/dist/plugin.esm.js +19 -0
  60. package/dist/plugin.esm.js.map +1 -0
  61. package/dist/routes.esm.js +8 -0
  62. package/dist/routes.esm.js.map +1 -0
  63. package/dist/utils/createSequentialEdges.esm.js +15 -0
  64. package/dist/utils/createSequentialEdges.esm.js.map +1 -0
  65. package/dist/utils/sampleTemplate.esm.js +40 -0
  66. package/dist/utils/sampleTemplate.esm.js.map +1 -0
  67. package/dist/utils/yamlJsonConversion.esm.js +47 -0
  68. package/dist/utils/yamlJsonConversion.esm.js.map +1 -0
  69. package/package.json +116 -0
@@ -0,0 +1,162 @@
1
+ import { useCallback } from 'react';
2
+
3
+ const buildUniqueId = () => `${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
4
+ const createSectionTemplate = () => {
5
+ const unique = buildUniqueId();
6
+ return {
7
+ id: `section-${unique}`,
8
+ title: "New Section",
9
+ description: "",
10
+ fields: [],
11
+ properties: {},
12
+ required: []
13
+ };
14
+ };
15
+ const createFieldTemplate = (section) => {
16
+ const unique = buildUniqueId();
17
+ const nextIndex = (section.fields?.length ?? 0) + 1;
18
+ const fallbackName = `field_${nextIndex}`;
19
+ return {
20
+ id: `${section.id}-field-${unique}`,
21
+ fieldName: fallbackName,
22
+ sectionId: section.id,
23
+ sectionTitle: section.title,
24
+ required: false,
25
+ schema: {
26
+ title: `Field ${nextIndex}`,
27
+ type: "string"
28
+ }
29
+ };
30
+ };
31
+ const useParameterSectionsController = (data) => {
32
+ const applySectionsUpdate = useCallback(
33
+ (updater) => {
34
+ if (!data.onUpdateSections) {
35
+ return;
36
+ }
37
+ data.onUpdateSections(data.rfId, (prev) => updater(prev ?? []));
38
+ },
39
+ [data]
40
+ );
41
+ const handleSectionUpdate = useCallback(
42
+ (sectionId, updater) => {
43
+ applySectionsUpdate(
44
+ (prev) => (prev ?? []).map(
45
+ (section) => section.id === sectionId ? updater(section) : section
46
+ )
47
+ );
48
+ },
49
+ [applySectionsUpdate]
50
+ );
51
+ const handleFieldUpdate = useCallback(
52
+ (sectionId, fieldId, updater) => {
53
+ handleSectionUpdate(sectionId, (section) => ({
54
+ ...section,
55
+ fields: section.fields?.map(
56
+ (field) => field.id === fieldId ? updater(field) : field
57
+ ) ?? []
58
+ }));
59
+ },
60
+ [handleSectionUpdate]
61
+ );
62
+ const handleAddSection = useCallback(
63
+ (afterSectionId) => {
64
+ applySectionsUpdate((prev) => {
65
+ const list = [...prev ?? []];
66
+ const insertIndex = afterSectionId ? Math.max(
67
+ list.findIndex((section) => section.id === afterSectionId) + 1,
68
+ 0
69
+ ) : list.length;
70
+ const nextSection = createSectionTemplate();
71
+ list.splice(insertIndex, 0, nextSection);
72
+ return list;
73
+ });
74
+ },
75
+ [applySectionsUpdate]
76
+ );
77
+ const handleMoveSection = useCallback(
78
+ (sectionId, direction) => {
79
+ applySectionsUpdate((prev) => {
80
+ const list = [...prev ?? []];
81
+ const currentIndex = list.findIndex(
82
+ (section) => section.id === sectionId
83
+ );
84
+ if (currentIndex < 0) {
85
+ return list;
86
+ }
87
+ const targetIndex = direction === "up" ? currentIndex - 1 : currentIndex + 1;
88
+ if (targetIndex < 0 || targetIndex >= list.length) {
89
+ return list;
90
+ }
91
+ const [item] = list.splice(currentIndex, 1);
92
+ list.splice(targetIndex, 0, item);
93
+ return list;
94
+ });
95
+ },
96
+ [applySectionsUpdate]
97
+ );
98
+ const handleAddField = useCallback(
99
+ (sectionId, afterFieldId) => {
100
+ applySectionsUpdate(
101
+ (prev) => (prev ?? []).map((section) => {
102
+ if (section.id !== sectionId) {
103
+ return section;
104
+ }
105
+ const fields = [...section.fields ?? []];
106
+ const insertIndex = afterFieldId && fields.length ? Math.max(
107
+ fields.findIndex((field) => field.id === afterFieldId) + 1,
108
+ 0
109
+ ) : fields.length;
110
+ const newField = createFieldTemplate(section);
111
+ fields.splice(insertIndex, 0, newField);
112
+ return {
113
+ ...section,
114
+ fields
115
+ };
116
+ })
117
+ );
118
+ },
119
+ [applySectionsUpdate]
120
+ );
121
+ const handleMoveField = useCallback(
122
+ (sectionId, fieldId, direction) => {
123
+ applySectionsUpdate(
124
+ (prev) => (prev ?? []).map((section) => {
125
+ if (section.id !== sectionId) {
126
+ return section;
127
+ }
128
+ const fields = [...section.fields ?? []];
129
+ const currentIndex = fields.findIndex(
130
+ (field) => field.id === fieldId
131
+ );
132
+ if (currentIndex < 0) {
133
+ return section;
134
+ }
135
+ const targetIndex = direction === "up" ? currentIndex - 1 : currentIndex + 1;
136
+ if (targetIndex < 0 || targetIndex >= fields.length) {
137
+ return section;
138
+ }
139
+ const [item] = fields.splice(currentIndex, 1);
140
+ fields.splice(targetIndex, 0, item);
141
+ return {
142
+ ...section,
143
+ fields
144
+ };
145
+ })
146
+ );
147
+ },
148
+ [applySectionsUpdate]
149
+ );
150
+ return {
151
+ sections: data.sections ?? [],
152
+ handleSectionUpdate,
153
+ handleFieldUpdate,
154
+ handleAddSection,
155
+ handleMoveSection,
156
+ handleAddField,
157
+ handleMoveField
158
+ };
159
+ };
160
+
161
+ export { useParameterSectionsController };
162
+ //# sourceMappingURL=useParameterSections.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useParameterSections.esm.js","sources":["../../../../src/components/Nodes/parameters/useParameterSections.ts"],"sourcesContent":["import { useCallback } from \"react\";\nimport type {\n ParameterFieldDisplay,\n ParameterSectionDisplay,\n ParametersNodeData,\n} from \"../types\";\n\nconst buildUniqueId = () =>\n `${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;\n\nconst createSectionTemplate = (): ParameterSectionDisplay => {\n const unique = buildUniqueId();\n return {\n id: `section-${unique}`,\n title: \"New Section\",\n description: \"\",\n fields: [],\n properties: {},\n required: [],\n };\n};\n\nconst createFieldTemplate = (\n section: ParameterSectionDisplay\n): ParameterFieldDisplay => {\n const unique = buildUniqueId();\n const nextIndex = (section.fields?.length ?? 0) + 1;\n const fallbackName = `field_${nextIndex}`;\n return {\n id: `${section.id}-field-${unique}`,\n fieldName: fallbackName,\n sectionId: section.id,\n sectionTitle: section.title,\n required: false,\n schema: {\n title: `Field ${nextIndex}`,\n type: \"string\",\n },\n };\n};\n\nexport const useParameterSectionsController = (data: ParametersNodeData) => {\n const applySectionsUpdate = useCallback(\n (\n updater: (\n prevSections: ParameterSectionDisplay[]\n ) => ParameterSectionDisplay[]\n ) => {\n if (!data.onUpdateSections) {\n return;\n }\n data.onUpdateSections(data.rfId, (prev) => updater(prev ?? []));\n },\n [data]\n );\n\n const handleSectionUpdate = useCallback(\n (\n sectionId: string,\n updater: (section: ParameterSectionDisplay) => ParameterSectionDisplay\n ) => {\n applySectionsUpdate((prev) =>\n (prev ?? []).map((section) =>\n section.id === sectionId ? updater(section) : section\n )\n );\n },\n [applySectionsUpdate]\n );\n\n const handleFieldUpdate = useCallback(\n (\n sectionId: string,\n fieldId: string,\n updater: (field: ParameterFieldDisplay) => ParameterFieldDisplay\n ) => {\n handleSectionUpdate(sectionId, (section) => ({\n ...section,\n fields:\n section.fields?.map((field) =>\n field.id === fieldId ? updater(field) : field\n ) ?? [],\n }));\n },\n [handleSectionUpdate]\n );\n\n const handleAddSection = useCallback(\n (afterSectionId?: string) => {\n applySectionsUpdate((prev) => {\n const list = [...(prev ?? [])];\n const insertIndex = afterSectionId\n ? Math.max(\n list.findIndex((section) => section.id === afterSectionId) + 1,\n 0\n )\n : list.length;\n const nextSection = createSectionTemplate();\n list.splice(insertIndex, 0, nextSection);\n return list;\n });\n },\n [applySectionsUpdate]\n );\n\n const handleMoveSection = useCallback(\n (sectionId: string, direction: \"up\" | \"down\") => {\n applySectionsUpdate((prev) => {\n const list = [...(prev ?? [])];\n const currentIndex = list.findIndex(\n (section) => section.id === sectionId\n );\n if (currentIndex < 0) {\n return list;\n }\n const targetIndex =\n direction === \"up\" ? currentIndex - 1 : currentIndex + 1;\n if (targetIndex < 0 || targetIndex >= list.length) {\n return list;\n }\n const [item] = list.splice(currentIndex, 1);\n list.splice(targetIndex, 0, item);\n return list;\n });\n },\n [applySectionsUpdate]\n );\n\n const handleAddField = useCallback(\n (sectionId: string, afterFieldId?: string) => {\n applySectionsUpdate((prev) =>\n (prev ?? []).map((section) => {\n if (section.id !== sectionId) {\n return section;\n }\n const fields = [...(section.fields ?? [])];\n const insertIndex =\n afterFieldId && fields.length\n ? Math.max(\n fields.findIndex((field) => field.id === afterFieldId) + 1,\n 0\n )\n : fields.length;\n const newField = createFieldTemplate(section);\n fields.splice(insertIndex, 0, newField);\n return {\n ...section,\n fields,\n };\n })\n );\n },\n [applySectionsUpdate]\n );\n\n const handleMoveField = useCallback(\n (sectionId: string, fieldId: string, direction: \"up\" | \"down\") => {\n applySectionsUpdate((prev) =>\n (prev ?? []).map((section) => {\n if (section.id !== sectionId) {\n return section;\n }\n const fields = [...(section.fields ?? [])];\n const currentIndex = fields.findIndex(\n (field) => field.id === fieldId\n );\n if (currentIndex < 0) {\n return section;\n }\n const targetIndex =\n direction === \"up\" ? currentIndex - 1 : currentIndex + 1;\n if (targetIndex < 0 || targetIndex >= fields.length) {\n return section;\n }\n const [item] = fields.splice(currentIndex, 1);\n fields.splice(targetIndex, 0, item);\n return {\n ...section,\n fields,\n };\n })\n );\n },\n [applySectionsUpdate]\n );\n\n return {\n sections: data.sections ?? [],\n handleSectionUpdate,\n handleFieldUpdate,\n handleAddSection,\n handleMoveSection,\n handleAddField,\n handleMoveField,\n };\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ const NODE_VERTICAL_SPACING = {
2
+ parametersNode: 120,
3
+ actionNode: 120,
4
+ outputNode: 120
5
+ };
6
+
7
+ export { NODE_VERTICAL_SPACING };
8
+ //# sourceMappingURL=types.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.esm.js","sources":["../../../src/components/Nodes/types.ts"],"sourcesContent":["import type {\n ScaffolderTaskOutput,\n TaskStep,\n TemplateParametersV1beta3,\n TemplateParameterSchema,\n} from \"@backstage/plugin-scaffolder-common\";\n\nexport type DesignerNodeType = \"parametersNode\" | \"actionNode\" | \"outputNode\";\n\nexport type TemplateParametersValue =\n | TemplateParametersV1beta3\n | TemplateParametersV1beta3[]\n | TemplateParameterSchema\n | TemplateParameterSchema[]\n | undefined;\n\nexport type AddNodeConfig = {\n afterRfId: string;\n type?: DesignerNodeType;\n stepTemplate?: Partial<TaskStep>;\n outputTemplate?: ScaffolderTaskOutput;\n parametersTemplate?: TemplateParametersValue;\n};\n\ntype BaseNodeData = {\n /** Stable ReactFlow node id */\n rfId: string;\n /** Cached scaffolder action ids for dropdown options */\n scaffolderActionIds?: string[];\n /** Cached action input schemas keyed by action id */\n scaffolderActionInputsById?: Record<string, Record<string, unknown>>;\n /** Cached action output schemas keyed by action id */\n scaffolderActionOutputsById?: Record<string, Record<string, unknown>>;\n /** Suggestions for referencing previous step outputs */\n stepOutputReferences?: string[];\n onAddNode?: (config: AddNodeConfig) => void;\n};\n\nexport type ActionNodeData = BaseNodeData & {\n /** User payload; id is editable string (reserved by your template) */\n step: TaskStep & { input?: Record<string, unknown> };\n onUpdateField?: (rfId: string, field: keyof TaskStep, value: string) => void;\n onUpdateInput?: (rfId: string, key: string, value: unknown) => void;\n onRemoveInputKey?: (rfId: string, key: string) => void;\n};\n\nexport type OutputNodeData = BaseNodeData & {\n output: ScaffolderTaskOutput;\n onUpdateOutput?: (\n rfId: string,\n updater: (prev: ScaffolderTaskOutput) => ScaffolderTaskOutput\n ) => void;\n};\n\nexport type ParameterFieldDisplay = {\n id: string;\n fieldName: string;\n sectionId: string;\n sectionTitle?: string;\n required: boolean;\n schema?: Record<string, unknown>;\n};\n\nexport type ParameterSectionDisplay = {\n id: string;\n title?: string;\n description?: string;\n required?: string[];\n properties?: Record<string, Record<string, unknown>>;\n fields: ParameterFieldDisplay[];\n};\n\nexport type ParametersNodeData = BaseNodeData & {\n parameters: TemplateParametersValue;\n sections?: ParameterSectionDisplay[];\n onUpdateSections?: (\n rfId: string,\n updater: (prev: ParameterSectionDisplay[]) => ParameterSectionDisplay[]\n ) => void;\n};\n\nexport const NODE_VERTICAL_SPACING: Record<DesignerNodeType, number> = {\n parametersNode: 120,\n actionNode: 120,\n outputNode: 120,\n};\n"],"names":[],"mappings":"AAiFO,MAAM,qBAAA,GAA0D;AAAA,EACrE,cAAA,EAAgB,GAAA;AAAA,EAChB,UAAA,EAAY,GAAA;AAAA,EACZ,UAAA,EAAY;AACd;;;;"}
@@ -0,0 +1,115 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useState, useCallback } from 'react';
3
+ import { Page, Content, ContentHeader, SupportButton } from '@backstage/core-components';
4
+ import { FieldEditorDialog } from './components/FieldEditorDialog.esm.js';
5
+ import { TemplateLanding } from './components/TemplateLanding.esm.js';
6
+ import { TemplateWorkspace } from './components/TemplateWorkspace.esm.js';
7
+ import { useFieldEditor } from './useFieldEditor.esm.js';
8
+ import { useTemplateState } from './useTemplateState.esm.js';
9
+
10
+ const TemplateDesigner = () => {
11
+ const [showYaml, setShowYaml] = useState(true);
12
+ const {
13
+ templateObject,
14
+ templateYaml,
15
+ yamlError,
16
+ loadError,
17
+ templateSteps,
18
+ templateParameters,
19
+ templateOutput,
20
+ templateSource,
21
+ isReloading,
22
+ isSaving,
23
+ fileInputRef,
24
+ handleStartSampleTemplate,
25
+ handleTemplateFileSelected,
26
+ handleOpenTemplatePicker,
27
+ handleYamlChange,
28
+ handleStepsChange,
29
+ handleParametersChange,
30
+ handleOutputChange,
31
+ handleReloadFromFile,
32
+ handleSaveTemplate
33
+ } = useTemplateState();
34
+ const {
35
+ editorState,
36
+ editorValue,
37
+ setEditorValue,
38
+ interactionRootRef,
39
+ closeEditor,
40
+ applyEditorValue
41
+ } = useFieldEditor();
42
+ const handleToggleYaml = useCallback(() => {
43
+ setShowYaml((prev) => !prev);
44
+ }, []);
45
+ const activeTemplateLabel = templateSource?.label;
46
+ let reloadButtonLabel = "Reset sample";
47
+ if (templateSource?.type === "file") {
48
+ reloadButtonLabel = isReloading ? "Reloading..." : "Reload file";
49
+ }
50
+ let saveButtonLabel = templateSource?.type === "file" ? "Save" : "Save as file";
51
+ if (isSaving) {
52
+ saveButtonLabel = "Saving...";
53
+ }
54
+ return /* @__PURE__ */ jsxs("div", { ref: interactionRootRef, style: { height: "100%" }, children: [
55
+ /* @__PURE__ */ jsx(Page, { themeId: "tool", children: /* @__PURE__ */ jsxs(Content, { children: [
56
+ /* @__PURE__ */ jsx(ContentHeader, { title: "Template Designer", children: /* @__PURE__ */ jsx(SupportButton, { children: "A description of your plugin goes here." }) }),
57
+ /* @__PURE__ */ jsx(
58
+ "input",
59
+ {
60
+ ref: fileInputRef,
61
+ type: "file",
62
+ accept: ".yaml,.yml,.json",
63
+ style: { display: "none" },
64
+ onChange: handleTemplateFileSelected
65
+ }
66
+ ),
67
+ !templateObject ? /* @__PURE__ */ jsx(
68
+ TemplateLanding,
69
+ {
70
+ loadError,
71
+ onStartSampleTemplate: handleStartSampleTemplate,
72
+ onOpenTemplatePicker: handleOpenTemplatePicker
73
+ }
74
+ ) : /* @__PURE__ */ jsx(
75
+ TemplateWorkspace,
76
+ {
77
+ templateSteps,
78
+ templateParameters,
79
+ templateOutput,
80
+ templateYaml,
81
+ yamlError,
82
+ loadError,
83
+ showYaml,
84
+ onToggleYaml: handleToggleYaml,
85
+ onYamlChange: handleYamlChange,
86
+ onStepsChange: handleStepsChange,
87
+ onParametersChange: handleParametersChange,
88
+ onOutputChange: handleOutputChange,
89
+ onReload: handleReloadFromFile,
90
+ onSave: handleSaveTemplate,
91
+ onOpenTemplatePicker: handleOpenTemplatePicker,
92
+ activeTemplateLabel,
93
+ reloadButtonLabel,
94
+ saveButtonLabel,
95
+ isReloading,
96
+ isSaving
97
+ }
98
+ )
99
+ ] }) }),
100
+ /* @__PURE__ */ jsx(
101
+ FieldEditorDialog,
102
+ {
103
+ open: Boolean(editorState),
104
+ label: editorState?.label,
105
+ value: editorValue,
106
+ onChange: setEditorValue,
107
+ onClose: closeEditor,
108
+ onApply: applyEditorValue
109
+ }
110
+ )
111
+ ] });
112
+ };
113
+
114
+ export { TemplateDesigner };
115
+ //# sourceMappingURL=TemplateDesigner.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplateDesigner.esm.js","sources":["../../../src/components/TemplateDesigner/TemplateDesigner.tsx"],"sourcesContent":["import { useCallback, useState } from \"react\";\nimport {\n Page,\n Content,\n ContentHeader,\n SupportButton,\n} from \"@backstage/core-components\";\nimport { FieldEditorDialog } from \"./components/FieldEditorDialog\";\nimport { TemplateLanding } from \"./components/TemplateLanding\";\nimport { TemplateWorkspace } from \"./components/TemplateWorkspace\";\nimport { useFieldEditor } from \"./useFieldEditor\";\nimport { useTemplateState } from \"./useTemplateState\";\n\nexport const TemplateDesigner = () => {\n const [showYaml, setShowYaml] = useState(true);\n const {\n templateObject,\n templateYaml,\n yamlError,\n loadError,\n templateSteps,\n templateParameters,\n templateOutput,\n templateSource,\n isReloading,\n isSaving,\n fileInputRef,\n handleStartSampleTemplate,\n handleTemplateFileSelected,\n handleOpenTemplatePicker,\n handleYamlChange,\n handleStepsChange,\n handleParametersChange,\n handleOutputChange,\n handleReloadFromFile,\n handleSaveTemplate,\n } = useTemplateState();\n const {\n editorState,\n editorValue,\n setEditorValue,\n interactionRootRef,\n closeEditor,\n applyEditorValue,\n } = useFieldEditor();\n\n const handleToggleYaml = useCallback(() => {\n setShowYaml((prev) => !prev);\n }, []);\n\n const activeTemplateLabel = templateSource?.label;\n\n let reloadButtonLabel = \"Reset sample\";\n if (templateSource?.type === \"file\") {\n reloadButtonLabel = isReloading ? \"Reloading...\" : \"Reload file\";\n }\n\n let saveButtonLabel =\n templateSource?.type === \"file\" ? \"Save\" : \"Save as file\";\n if (isSaving) {\n saveButtonLabel = \"Saving...\";\n }\n\n return (\n <div ref={interactionRootRef} style={{ height: \"100%\" }}>\n <Page themeId=\"tool\">\n <Content>\n <ContentHeader title=\"Template Designer\">\n <SupportButton>\n A description of your plugin goes here.\n </SupportButton>\n </ContentHeader>\n\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".yaml,.yml,.json\"\n style={{ display: \"none\" }}\n onChange={handleTemplateFileSelected}\n />\n\n {!templateObject ? (\n <TemplateLanding\n loadError={loadError}\n onStartSampleTemplate={handleStartSampleTemplate}\n onOpenTemplatePicker={handleOpenTemplatePicker}\n />\n ) : (\n <TemplateWorkspace\n templateSteps={templateSteps}\n templateParameters={templateParameters}\n templateOutput={templateOutput}\n templateYaml={templateYaml}\n yamlError={yamlError}\n loadError={loadError}\n showYaml={showYaml}\n onToggleYaml={handleToggleYaml}\n onYamlChange={handleYamlChange}\n onStepsChange={handleStepsChange}\n onParametersChange={handleParametersChange}\n onOutputChange={handleOutputChange}\n onReload={handleReloadFromFile}\n onSave={handleSaveTemplate}\n onOpenTemplatePicker={handleOpenTemplatePicker}\n activeTemplateLabel={activeTemplateLabel}\n reloadButtonLabel={reloadButtonLabel}\n saveButtonLabel={saveButtonLabel}\n isReloading={isReloading}\n isSaving={isSaving}\n />\n )}\n </Content>\n </Page>\n <FieldEditorDialog\n open={Boolean(editorState)}\n label={editorState?.label}\n value={editorValue}\n onChange={setEditorValue}\n onClose={closeEditor}\n onApply={applyEditorValue}\n />\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { Dialog, DialogTitle, DialogContent, TextField, DialogActions, Button } from '@material-ui/core';
3
+
4
+ const FieldEditorDialog = ({
5
+ open,
6
+ label,
7
+ value,
8
+ onChange,
9
+ onClose,
10
+ onApply
11
+ }) => /* @__PURE__ */ jsxs(Dialog, { open, onClose, fullWidth: true, maxWidth: "md", children: [
12
+ /* @__PURE__ */ jsx(DialogTitle, { children: label ? `Edit ${label}` : "Edit field" }),
13
+ /* @__PURE__ */ jsx(DialogContent, { children: /* @__PURE__ */ jsx(
14
+ TextField,
15
+ {
16
+ multiline: true,
17
+ minRows: 8,
18
+ variant: "outlined",
19
+ value,
20
+ onChange: (event) => onChange(event.target.value),
21
+ fullWidth: true,
22
+ autoFocus: true
23
+ }
24
+ ) }),
25
+ /* @__PURE__ */ jsxs(DialogActions, { children: [
26
+ /* @__PURE__ */ jsx(Button, { onClick: onClose, children: "Cancel" }),
27
+ /* @__PURE__ */ jsx(Button, { color: "primary", variant: "contained", onClick: onApply, children: "Apply" })
28
+ ] })
29
+ ] });
30
+
31
+ export { FieldEditorDialog };
32
+ //# sourceMappingURL=FieldEditorDialog.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldEditorDialog.esm.js","sources":["../../../../src/components/TemplateDesigner/components/FieldEditorDialog.tsx"],"sourcesContent":["import {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n TextField,\n} from \"@material-ui/core\";\n\ntype FieldEditorDialogProps = {\n open: boolean;\n label?: string;\n value: string;\n onChange: (value: string) => void;\n onClose: () => void;\n onApply: () => void;\n};\n\nexport const FieldEditorDialog = ({\n open,\n label,\n value,\n onChange,\n onClose,\n onApply,\n}: FieldEditorDialogProps) => (\n <Dialog open={open} onClose={onClose} fullWidth maxWidth=\"md\">\n <DialogTitle>{label ? `Edit ${label}` : \"Edit field\"}</DialogTitle>\n <DialogContent>\n <TextField\n multiline\n minRows={8}\n variant=\"outlined\"\n value={value}\n onChange={(event) => onChange(event.target.value)}\n fullWidth\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus\n />\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose}>Cancel</Button>\n <Button color=\"primary\" variant=\"contained\" onClick={onApply}>\n Apply\n </Button>\n </DialogActions>\n </Dialog>\n);\n"],"names":[],"mappings":";;;AAkBO,MAAM,oBAAoB,CAAC;AAAA,EAChC,IAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,0BACG,MAAA,EAAA,EAAO,IAAA,EAAY,SAAkB,SAAA,EAAS,IAAA,EAAC,UAAS,IAAA,EACvD,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAa,QAAA,EAAA,KAAA,GAAQ,CAAA,KAAA,EAAQ,KAAK,KAAK,YAAA,EAAa,CAAA;AAAA,sBACpD,aAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAAS,CAAA;AAAA,MACT,OAAA,EAAQ,UAAA;AAAA,MACR,KAAA;AAAA,MACA,UAAU,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,MAChD,SAAA,EAAS,IAAA;AAAA,MAET,SAAA,EAAS;AAAA;AAAA,GACX,EACF,CAAA;AAAA,uBACC,aAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAS,OAAA,EAAS,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,oBAChC,GAAA,CAAC,UAAO,KAAA,EAAM,SAAA,EAAU,SAAQ,WAAA,EAAY,OAAA,EAAS,SAAS,QAAA,EAAA,OAAA,EAE9D;AAAA,GAAA,EACF;AAAA,CAAA,EACF;;;;"}
@@ -0,0 +1,102 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { Grid, Paper, Box, Typography, Button } from '@material-ui/core';
3
+ import { useTheme } from '@material-ui/core/styles';
4
+
5
+ const TemplateLanding = ({
6
+ loadError,
7
+ onStartSampleTemplate,
8
+ onOpenTemplatePicker
9
+ }) => {
10
+ const theme = useTheme();
11
+ return /* @__PURE__ */ jsx(
12
+ Grid,
13
+ {
14
+ container: true,
15
+ justifyContent: "center",
16
+ alignItems: "center",
17
+ style: { minHeight: "60vh" },
18
+ children: /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 10, lg: 8, children: /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 4, alignItems: "stretch", children: [
19
+ /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 6, children: /* @__PURE__ */ jsxs(
20
+ Paper,
21
+ {
22
+ elevation: 3,
23
+ style: {
24
+ padding: 32,
25
+ height: "100%",
26
+ minHeight: 320,
27
+ display: "flex",
28
+ flexDirection: "column",
29
+ gap: 16
30
+ },
31
+ children: [
32
+ /* @__PURE__ */ jsxs(Box, { children: [
33
+ /* @__PURE__ */ jsx(Typography, { variant: "h6", children: "Create new template" }),
34
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "textSecondary", children: "Start with a tidy sample blueprint that includes a single action step and helpful starter metadata." })
35
+ ] }),
36
+ /* @__PURE__ */ jsx(Box, { mt: "auto", display: "flex", justifyContent: "flex-start", children: /* @__PURE__ */ jsx(
37
+ Button,
38
+ {
39
+ color: "primary",
40
+ variant: "contained",
41
+ onClick: onStartSampleTemplate,
42
+ children: "Start new template"
43
+ }
44
+ ) })
45
+ ]
46
+ }
47
+ ) }),
48
+ /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 6, children: /* @__PURE__ */ jsxs(
49
+ Paper,
50
+ {
51
+ elevation: 3,
52
+ style: {
53
+ padding: 32,
54
+ height: "100%",
55
+ minHeight: 320,
56
+ display: "flex",
57
+ flexDirection: "column",
58
+ gap: 16
59
+ },
60
+ children: [
61
+ /* @__PURE__ */ jsxs(Box, { children: [
62
+ /* @__PURE__ */ jsx(Typography, { variant: "h6", children: "Load from file" }),
63
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "textSecondary", children: "Import an existing template in YAML or JSON format and iterate in the visual designer." })
64
+ ] }),
65
+ /* @__PURE__ */ jsxs(
66
+ Box,
67
+ {
68
+ mt: "auto",
69
+ display: "flex",
70
+ flexDirection: "column",
71
+ style: { gap: 8 },
72
+ children: [
73
+ /* @__PURE__ */ jsx(
74
+ Button,
75
+ {
76
+ color: "primary",
77
+ variant: "outlined",
78
+ onClick: onOpenTemplatePicker,
79
+ children: "Choose file"
80
+ }
81
+ ),
82
+ loadError && /* @__PURE__ */ jsx(
83
+ Typography,
84
+ {
85
+ variant: "body2",
86
+ style: { color: theme.palette.error.main },
87
+ children: loadError
88
+ }
89
+ )
90
+ ]
91
+ }
92
+ )
93
+ ]
94
+ }
95
+ ) })
96
+ ] }) })
97
+ }
98
+ );
99
+ };
100
+
101
+ export { TemplateLanding };
102
+ //# sourceMappingURL=TemplateLanding.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplateLanding.esm.js","sources":["../../../../src/components/TemplateDesigner/components/TemplateLanding.tsx"],"sourcesContent":["import { Box, Button, Grid, Paper, Typography } from \"@material-ui/core\";\nimport { useTheme } from \"@material-ui/core/styles\";\n\ntype TemplateLandingProps = {\n loadError?: string;\n onStartSampleTemplate: () => void;\n onOpenTemplatePicker: () => void;\n};\n\nexport const TemplateLanding = ({\n loadError,\n onStartSampleTemplate,\n onOpenTemplatePicker,\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={6}>\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={6}>\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>\n </Grid>\n </Grid>\n );\n};\n"],"names":[],"mappings":";;;;AASO,MAAM,kBAAkB,CAAC;AAAA,EAC9B,SAAA;AAAA,EACA,qBAAA;AAAA,EACA;AACF,CAAA,KAA4B;AAC1B,EAAA,MAAM,QAAQ,QAAA,EAAS;AAEvB,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAS,IAAA;AAAA,MACT,cAAA,EAAe,QAAA;AAAA,MACf,UAAA,EAAW,QAAA;AAAA,MACX,KAAA,EAAO,EAAE,SAAA,EAAW,MAAA,EAAO;AAAA,MAE3B,8BAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA,EAC7B,+BAAC,IAAA,EAAA,EAAK,SAAA,EAAS,MAAC,OAAA,EAAS,CAAA,EAAG,YAAW,SAAA,EACrC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,QAAK,IAAA,EAAI,IAAA,EAAC,EAAA,EAAI,EAAA,EAAI,IAAI,CAAA,EACrB,QAAA,kBAAA,IAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA;AAAA,YACX,KAAA,EAAO;AAAA,cACL,OAAA,EAAS,EAAA;AAAA,cACT,MAAA,EAAQ,MAAA;AAAA,cACR,SAAA,EAAW,GAAA;AAAA,cACX,OAAA,EAAS,MAAA;AAAA,cACT,aAAA,EAAe,QAAA;AAAA,cACf,GAAA,EAAK;AAAA,aACP;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAA,IAAA,CAAC,GAAA,EAAA,EACC,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,QAAA,EAAA,qBAAA,EAAmB,CAAA;AAAA,oCAC3C,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,iBAAgB,QAAA,EAAA,qGAAA,EAGlD;AAAA,eAAA,EACF,CAAA;AAAA,kCACC,GAAA,EAAA,EAAI,EAAA,EAAG,QAAO,OAAA,EAAQ,MAAA,EAAO,gBAAe,YAAA,EAC3C,QAAA,kBAAA,GAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAM,SAAA;AAAA,kBACN,OAAA,EAAQ,WAAA;AAAA,kBACR,OAAA,EAAS,qBAAA;AAAA,kBACV,QAAA,EAAA;AAAA;AAAA,eAED,EACF;AAAA;AAAA;AAAA,SACF,EACF,CAAA;AAAA,4BACC,IAAA,EAAA,EAAK,IAAA,EAAI,MAAC,EAAA,EAAI,EAAA,EAAI,IAAI,CAAA,EACrB,QAAA,kBAAA,IAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA;AAAA,YACX,KAAA,EAAO;AAAA,cACL,OAAA,EAAS,EAAA;AAAA,cACT,MAAA,EAAQ,MAAA;AAAA,cACR,SAAA,EAAW,GAAA;AAAA,cACX,OAAA,EAAS,MAAA;AAAA,cACT,aAAA,EAAe,QAAA;AAAA,cACf,GAAA,EAAK;AAAA,aACP;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAA,IAAA,CAAC,GAAA,EAAA,EACC,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,oCACtC,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,iBAAgB,QAAA,EAAA,wFAAA,EAGlD;AAAA,eAAA,EACF,CAAA;AAAA,8BACA,IAAA;AAAA,gBAAC,GAAA;AAAA,gBAAA;AAAA,kBACC,EAAA,EAAG,MAAA;AAAA,kBACH,OAAA,EAAQ,MAAA;AAAA,kBACR,aAAA,EAAc,QAAA;AAAA,kBACd,KAAA,EAAO,EAAE,GAAA,EAAK,CAAA,EAAE;AAAA,kBAEhB,QAAA,EAAA;AAAA,oCAAA,GAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBACC,KAAA,EAAM,SAAA;AAAA,wBACN,OAAA,EAAQ,UAAA;AAAA,wBACR,OAAA,EAAS,oBAAA;AAAA,wBACV,QAAA,EAAA;AAAA;AAAA,qBAED;AAAA,oBACC,SAAA,oBACC,GAAA;AAAA,sBAAC,UAAA;AAAA,sBAAA;AAAA,wBACC,OAAA,EAAQ,OAAA;AAAA,wBACR,OAAO,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,MAAM,IAAA,EAAK;AAAA,wBAExC,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA;AAEJ;AAAA;AAAA,SACF,EACF;AAAA,OAAA,EACF,CAAA,EACF;AAAA;AAAA,GACF;AAEJ;;;;"}