@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.
- package/README.md +120 -0
- package/dist/api/scaffolderActions.esm.js +42 -0
- package/dist/api/scaffolderActions.esm.js.map +1 -0
- package/dist/components/DesignerFlow/DesignerFlow.esm.js +370 -0
- package/dist/components/DesignerFlow/DesignerFlow.esm.js.map +1 -0
- package/dist/components/DesignerFlow/flowConfig.esm.js +21 -0
- package/dist/components/DesignerFlow/flowConfig.esm.js.map +1 -0
- package/dist/components/DesignerFlow/handlers.esm.js +288 -0
- package/dist/components/DesignerFlow/handlers.esm.js.map +1 -0
- package/dist/components/DesignerFlow/model.esm.js +181 -0
- package/dist/components/DesignerFlow/model.esm.js.map +1 -0
- package/dist/components/DesignerFlow/nodeLayout.esm.js +138 -0
- package/dist/components/DesignerFlow/nodeLayout.esm.js.map +1 -0
- package/dist/components/DesignerFlow/parameterTransforms.esm.js +184 -0
- package/dist/components/DesignerFlow/parameterTransforms.esm.js.map +1 -0
- package/dist/components/Nodes/ActionNode.esm.js +437 -0
- package/dist/components/Nodes/ActionNode.esm.js.map +1 -0
- package/dist/components/Nodes/OutputNode.esm.js +368 -0
- package/dist/components/Nodes/OutputNode.esm.js.map +1 -0
- package/dist/components/Nodes/ParameterInputNode.esm.js +310 -0
- package/dist/components/Nodes/ParameterInputNode.esm.js.map +1 -0
- package/dist/components/Nodes/ParameterTitlesNode.esm.js +251 -0
- package/dist/components/Nodes/ParameterTitlesNode.esm.js.map +1 -0
- package/dist/components/Nodes/ParametersNode.esm.js +142 -0
- package/dist/components/Nodes/ParametersNode.esm.js.map +1 -0
- package/dist/components/Nodes/action/schema.esm.js +117 -0
- package/dist/components/Nodes/action/schema.esm.js.map +1 -0
- package/dist/components/Nodes/action/useActionInputs.esm.js +66 -0
- package/dist/components/Nodes/action/useActionInputs.esm.js.map +1 -0
- package/dist/components/Nodes/common/AutoWidthPopper.esm.js +22 -0
- package/dist/components/Nodes/common/AutoWidthPopper.esm.js.map +1 -0
- package/dist/components/Nodes/common/nodeInteraction.esm.js +9 -0
- package/dist/components/Nodes/common/nodeInteraction.esm.js.map +1 -0
- package/dist/components/Nodes/output/useOutputController.esm.js +191 -0
- package/dist/components/Nodes/output/useOutputController.esm.js.map +1 -0
- package/dist/components/Nodes/parameters/useParameterSections.esm.js +162 -0
- package/dist/components/Nodes/parameters/useParameterSections.esm.js.map +1 -0
- package/dist/components/Nodes/types.esm.js +8 -0
- package/dist/components/Nodes/types.esm.js.map +1 -0
- package/dist/components/TemplateDesigner/TemplateDesigner.esm.js +115 -0
- package/dist/components/TemplateDesigner/TemplateDesigner.esm.js.map +1 -0
- package/dist/components/TemplateDesigner/components/FieldEditorDialog.esm.js +32 -0
- package/dist/components/TemplateDesigner/components/FieldEditorDialog.esm.js.map +1 -0
- package/dist/components/TemplateDesigner/components/TemplateLanding.esm.js +102 -0
- package/dist/components/TemplateDesigner/components/TemplateLanding.esm.js.map +1 -0
- package/dist/components/TemplateDesigner/components/TemplateWorkspace.esm.js +200 -0
- package/dist/components/TemplateDesigner/components/TemplateWorkspace.esm.js.map +1 -0
- package/dist/components/TemplateDesigner/index.esm.js +2 -0
- package/dist/components/TemplateDesigner/index.esm.js.map +1 -0
- package/dist/components/TemplateDesigner/useFieldEditor.esm.js +96 -0
- package/dist/components/TemplateDesigner/useFieldEditor.esm.js.map +1 -0
- package/dist/components/TemplateDesigner/useTemplateState.esm.js +391 -0
- package/dist/components/TemplateDesigner/useTemplateState.esm.js.map +1 -0
- package/dist/components/TemplateDesigner/utils.esm.js +46 -0
- package/dist/components/TemplateDesigner/utils.esm.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.esm.js +2 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/plugin.esm.js +19 -0
- package/dist/plugin.esm.js.map +1 -0
- package/dist/routes.esm.js +8 -0
- package/dist/routes.esm.js.map +1 -0
- package/dist/utils/createSequentialEdges.esm.js +15 -0
- package/dist/utils/createSequentialEdges.esm.js.map +1 -0
- package/dist/utils/sampleTemplate.esm.js +40 -0
- package/dist/utils/sampleTemplate.esm.js.map +1 -0
- package/dist/utils/yamlJsonConversion.esm.js +47 -0
- package/dist/utils/yamlJsonConversion.esm.js.map +1 -0
- 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 @@
|
|
|
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":";;;;;;;;;AAaO,MAAM,mBAAmB,MAAM;AACpC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,IAAI,CAAA;AAC7C,EAAA,MAAM;AAAA,IACJ,cAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAA;AAAA,IACA,kBAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA,yBAAA;AAAA,IACA,0BAAA;AAAA,IACA,wBAAA;AAAA,IACA,gBAAA;AAAA,IACA,iBAAA;AAAA,IACA,sBAAA;AAAA,IACA,kBAAA;AAAA,IACA,oBAAA;AAAA,IACA;AAAA,MACE,gBAAA,EAAiB;AACrB,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,kBAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,MACE,cAAA,EAAe;AAEnB,EAAA,MAAM,gBAAA,GAAmB,YAAY,MAAM;AACzC,IAAA,WAAA,CAAY,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA;AAAA,EAC7B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,sBAAsB,cAAA,EAAgB,KAAA;AAE5C,EAAA,IAAI,iBAAA,GAAoB,cAAA;AACxB,EAAA,IAAI,cAAA,EAAgB,SAAS,MAAA,EAAQ;AACnC,IAAA,iBAAA,GAAoB,cAAc,cAAA,GAAiB,aAAA;AAAA,EACrD;AAEA,EAAA,IAAI,eAAA,GACF,cAAA,EAAgB,IAAA,KAAS,MAAA,GAAS,MAAA,GAAS,cAAA;AAC7C,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,eAAA,GAAkB,WAAA;AAAA,EACpB;AAEA,EAAA,uBACE,IAAA,CAAC,SAAI,GAAA,EAAK,kBAAA,EAAoB,OAAO,EAAE,MAAA,EAAQ,QAAO,EACpD,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,MAAA,EACZ,QAAA,kBAAA,IAAA,CAAC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,iBAAc,KAAA,EAAM,mBAAA,EACnB,QAAA,kBAAA,GAAA,CAAC,aAAA,EAAA,EAAc,qDAEf,CAAA,EACF,CAAA;AAAA,sBAEA,GAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,YAAA;AAAA,UACL,IAAA,EAAK,MAAA;AAAA,UACL,MAAA,EAAO,kBAAA;AAAA,UACP,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAO;AAAA,UACzB,QAAA,EAAU;AAAA;AAAA,OACZ;AAAA,MAEC,CAAC,cAAA,mBACA,GAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UACC,SAAA;AAAA,UACA,qBAAA,EAAuB,yBAAA;AAAA,UACvB,oBAAA,EAAsB;AAAA;AAAA,OACxB,mBAEA,GAAA;AAAA,QAAC,iBAAA;AAAA,QAAA;AAAA,UACC,aAAA;AAAA,UACA,kBAAA;AAAA,UACA,cAAA;AAAA,UACA,YAAA;AAAA,UACA,SAAA;AAAA,UACA,SAAA;AAAA,UACA,QAAA;AAAA,UACA,YAAA,EAAc,gBAAA;AAAA,UACd,YAAA,EAAc,gBAAA;AAAA,UACd,aAAA,EAAe,iBAAA;AAAA,UACf,kBAAA,EAAoB,sBAAA;AAAA,UACpB,cAAA,EAAgB,kBAAA;AAAA,UAChB,QAAA,EAAU,oBAAA;AAAA,UACV,MAAA,EAAQ,kBAAA;AAAA,UACR,oBAAA,EAAsB,wBAAA;AAAA,UACtB,mBAAA;AAAA,UACA,iBAAA;AAAA,UACA,eAAA;AAAA,UACA,WAAA;AAAA,UACA;AAAA;AAAA;AACF,KAAA,EAEJ,CAAA,EACF,CAAA;AAAA,oBACA,GAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,QAAQ,WAAW,CAAA;AAAA,QACzB,OAAO,WAAA,EAAa,KAAA;AAAA,QACpB,KAAA,EAAO,WAAA;AAAA,QACP,QAAA,EAAU,cAAA;AAAA,QACV,OAAA,EAAS,WAAA;AAAA,QACT,OAAA,EAAS;AAAA;AAAA;AACX,GAAA,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -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":"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"}
|