@tduniec/plugin-template-designer 0.3.0 → 0.3.2

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 (37) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +2 -2
  3. package/dist/alpha.esm.js +2 -2
  4. package/dist/alpha.esm.js.map +1 -1
  5. package/dist/components/DesignerFlow/DesignerFlow.esm.js +97 -54
  6. package/dist/components/DesignerFlow/DesignerFlow.esm.js.map +1 -1
  7. package/dist/components/DesignerFlow/handlers.esm.js +14 -3
  8. package/dist/components/DesignerFlow/handlers.esm.js.map +1 -1
  9. package/dist/components/Nodes/ActionNode.esm.js +6 -4
  10. package/dist/components/Nodes/ActionNode.esm.js.map +1 -1
  11. package/dist/components/Nodes/OutputNode.esm.js +3 -1
  12. package/dist/components/Nodes/OutputNode.esm.js.map +1 -1
  13. package/dist/components/Nodes/ParametersNode.esm.js +3 -1
  14. package/dist/components/Nodes/ParametersNode.esm.js.map +1 -1
  15. package/dist/components/Nodes/action/schema.esm.js +36 -9
  16. package/dist/components/Nodes/action/schema.esm.js.map +1 -1
  17. package/dist/components/TemplateDesigner/TemplateDesigner.esm.js +70 -46
  18. package/dist/components/TemplateDesigner/TemplateDesigner.esm.js.map +1 -1
  19. package/dist/components/TemplateDesigner/components/FieldEditorDialog.esm.js +42 -19
  20. package/dist/components/TemplateDesigner/components/FieldEditorDialog.esm.js.map +1 -1
  21. package/dist/components/TemplateDesigner/components/TemplateLanding.esm.js +1 -0
  22. package/dist/components/TemplateDesigner/components/TemplateLanding.esm.js.map +1 -1
  23. package/dist/components/TemplateDesigner/components/TemplateWorkspace.esm.js +224 -174
  24. package/dist/components/TemplateDesigner/components/TemplateWorkspace.esm.js.map +1 -1
  25. package/dist/components/TemplateDesigner/components/codemirrorTheme.esm.js +30 -0
  26. package/dist/components/TemplateDesigner/components/codemirrorTheme.esm.js.map +1 -0
  27. package/dist/components/TemplateDesigner/useFieldEditor.esm.js +31 -32
  28. package/dist/components/TemplateDesigner/useFieldEditor.esm.js.map +1 -1
  29. package/dist/components/TemplateDesigner/useTemplateState.esm.js +253 -53
  30. package/dist/components/TemplateDesigner/useTemplateState.esm.js.map +1 -1
  31. package/dist/components/TemplateDesignerIcon.esm.js +33 -0
  32. package/dist/components/TemplateDesignerIcon.esm.js.map +1 -0
  33. package/dist/index.d.ts +4 -1
  34. package/dist/index.esm.js +1 -0
  35. package/dist/index.esm.js.map +1 -1
  36. package/dist/package.json.esm.js +1 -1
  37. package/package.json +1 -1
@@ -1,19 +1,46 @@
1
1
  const capitalize = (value) => value.length > 0 ? value[0].toUpperCase() + value.slice(1) : value;
2
2
  const getFirstType = (type) => {
3
3
  if (!type) {
4
- return "string";
4
+ return void 0;
5
5
  }
6
- const value = Array.isArray(type) ? type[0] : type;
7
- if (value === "string" || value === "number" || value === "integer" || value === "boolean" || value === "array" || value === "object") {
8
- return value;
6
+ const values = Array.isArray(type) ? type : [type];
7
+ const match = values.find(
8
+ (value) => value === "string" || value === "number" || value === "integer" || value === "boolean" || value === "array" || value === "object"
9
+ );
10
+ return match;
11
+ };
12
+ const inferTypeFromValue = (value) => {
13
+ if (value === null || value === void 0) {
14
+ return void 0;
9
15
  }
10
- return "string";
16
+ if (Array.isArray(value)) {
17
+ return "array";
18
+ }
19
+ if (typeof value === "object") {
20
+ return "object";
21
+ }
22
+ if (typeof value === "boolean") {
23
+ return "boolean";
24
+ }
25
+ if (typeof value === "number") {
26
+ return Number.isInteger(value) ? "integer" : "number";
27
+ }
28
+ return void 0;
11
29
  };
12
- const normalizeSchemaType = (schema) => {
30
+ const normalizeSchemaType = (schema, value) => {
13
31
  if (!schema || typeof schema !== "object") {
14
- return "string";
32
+ const inferred2 = inferTypeFromValue(value);
33
+ return inferred2 ?? "string";
34
+ }
35
+ const schemaType = getFirstType(schema.type);
36
+ if (schemaType) {
37
+ return schemaType;
38
+ }
39
+ const inferred = inferTypeFromValue(value);
40
+ if (inferred) {
41
+ return inferred;
15
42
  }
16
- return getFirstType(schema.type);
43
+ return "string";
17
44
  };
18
45
  const getArrayItemTypeLabel = (schema) => {
19
46
  if (!schema) {
@@ -50,7 +77,7 @@ const stringifyValueForDisplay = (value, type) => {
50
77
  if (value === void 0 || value === null) {
51
78
  return "";
52
79
  }
53
- if (type === "array" || type === "object") {
80
+ if (type === "array" || type === "object" || Array.isArray(value) || typeof value === "object") {
54
81
  if (typeof value === "string") {
55
82
  return value;
56
83
  }
@@ -1 +1 @@
1
- {"version":3,"file":"schema.esm.js","sources":["../../../../src/components/Nodes/action/schema.ts"],"sourcesContent":["export type JsonSchemaProperty = {\n type?: string | string[];\n enum?: unknown[];\n items?: JsonSchemaProperty | JsonSchemaProperty[];\n} & Record<string, unknown>;\n\nexport type NormalizedSchemaType =\n | \"string\"\n | \"number\"\n | \"integer\"\n | \"boolean\"\n | \"array\"\n | \"object\"\n | \"unknown\";\n\nconst capitalize = (value: string) =>\n value.length > 0 ? value[0].toUpperCase() + value.slice(1) : value;\n\nconst getFirstType = (\n type: string | string[] | undefined\n): NormalizedSchemaType => {\n if (!type) {\n return \"string\";\n }\n const value = Array.isArray(type) ? type[0] : type;\n if (\n value === \"string\" ||\n value === \"number\" ||\n value === \"integer\" ||\n value === \"boolean\" ||\n value === \"array\" ||\n value === \"object\"\n ) {\n return value;\n }\n return \"string\";\n};\n\nexport const normalizeSchemaType = (\n schema: JsonSchemaProperty | undefined\n): NormalizedSchemaType => {\n if (!schema || typeof schema !== \"object\") {\n return \"string\";\n }\n return getFirstType(schema.type);\n};\n\nconst getArrayItemTypeLabel = (schema: JsonSchemaProperty | undefined) => {\n if (!schema) {\n return \"\";\n }\n const items = schema.items;\n if (!items) {\n return \"\";\n }\n if (Array.isArray(items)) {\n const [first] = items;\n if (!first) {\n return \"\";\n }\n return capitalize(normalizeSchemaType(first));\n }\n return capitalize(normalizeSchemaType(items));\n};\n\nexport const buildTypeLabel = (schema: JsonSchemaProperty | undefined) => {\n const normalized = normalizeSchemaType(schema);\n if (normalized === \"array\") {\n const itemsLabel = getArrayItemTypeLabel(schema);\n return itemsLabel ? `Array<${itemsLabel}>` : \"Array\";\n }\n if (normalized === \"integer\") {\n return \"Integer\";\n }\n if (normalized === \"unknown\") {\n return \"Unknown\";\n }\n return capitalize(normalized);\n};\n\nexport const stringifyValueForDisplay = (\n value: unknown,\n type: NormalizedSchemaType\n) => {\n if (value === undefined || value === null) {\n return \"\";\n }\n\n if (type === \"array\" || type === \"object\") {\n if (typeof value === \"string\") {\n return value;\n }\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n }\n\n if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n }\n\n return String(value);\n};\n\nexport const coerceValueForType = (\n raw: string,\n type: NormalizedSchemaType\n): unknown => {\n if (raw === \"\") {\n return \"\";\n }\n\n if (type === \"boolean\") {\n if (raw === \"true\") {\n return true;\n }\n if (raw === \"false\") {\n return false;\n }\n return raw;\n }\n\n if (type === \"number\" || type === \"integer\") {\n const num = Number(raw);\n if (!Number.isNaN(num)) {\n return num;\n }\n return raw;\n }\n\n if (type === \"array\" || type === \"object\") {\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n }\n\n return raw;\n};\n\nexport const extractEnumOptions = (schema: JsonSchemaProperty | undefined) => {\n if (!schema || !Array.isArray(schema.enum)) {\n return [] as string[];\n }\n return schema.enum\n .map((option): string => {\n if (option === undefined || option === null) {\n return \"\";\n }\n if (typeof option === \"object\") {\n try {\n return JSON.stringify(option);\n } catch {\n return String(option);\n }\n }\n return String(option);\n })\n .filter((option) => option !== \"\");\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.esm.js","sources":["../../../../src/components/Nodes/action/schema.ts"],"sourcesContent":["export type JsonSchemaProperty = {\n type?: string | string[];\n enum?: unknown[];\n items?: JsonSchemaProperty | JsonSchemaProperty[];\n} & Record<string, unknown>;\n\nexport type NormalizedSchemaType =\n | \"string\"\n | \"number\"\n | \"integer\"\n | \"boolean\"\n | \"array\"\n | \"object\"\n | \"unknown\";\n\nconst capitalize = (value: string) =>\n value.length > 0 ? value[0].toUpperCase() + value.slice(1) : value;\n\nconst getFirstType = (\n type: string | string[] | undefined\n): NormalizedSchemaType | undefined => {\n if (!type) {\n return undefined;\n }\n const values = Array.isArray(type) ? type : [type];\n const match = values.find(\n (value): value is NormalizedSchemaType =>\n value === \"string\" ||\n value === \"number\" ||\n value === \"integer\" ||\n value === \"boolean\" ||\n value === \"array\" ||\n value === \"object\"\n );\n return match;\n};\n\nconst inferTypeFromValue = (\n value: unknown\n): NormalizedSchemaType | undefined => {\n if (value === null || value === undefined) {\n return undefined;\n }\n if (Array.isArray(value)) {\n return \"array\";\n }\n if (typeof value === \"object\") {\n return \"object\";\n }\n if (typeof value === \"boolean\") {\n return \"boolean\";\n }\n if (typeof value === \"number\") {\n return Number.isInteger(value) ? \"integer\" : \"number\";\n }\n return undefined;\n};\n\nexport const normalizeSchemaType = (\n schema: JsonSchemaProperty | undefined,\n value?: unknown\n): NormalizedSchemaType => {\n if (!schema || typeof schema !== \"object\") {\n const inferred = inferTypeFromValue(value);\n return inferred ?? \"string\";\n }\n const schemaType = getFirstType(schema.type);\n if (schemaType) {\n return schemaType;\n }\n const inferred = inferTypeFromValue(value);\n if (inferred) {\n return inferred;\n }\n return \"string\";\n};\n\nconst getArrayItemTypeLabel = (schema: JsonSchemaProperty | undefined) => {\n if (!schema) {\n return \"\";\n }\n const items = schema.items;\n if (!items) {\n return \"\";\n }\n if (Array.isArray(items)) {\n const [first] = items;\n if (!first) {\n return \"\";\n }\n return capitalize(normalizeSchemaType(first));\n }\n return capitalize(normalizeSchemaType(items));\n};\n\nexport const buildTypeLabel = (schema: JsonSchemaProperty | undefined) => {\n const normalized = normalizeSchemaType(schema);\n if (normalized === \"array\") {\n const itemsLabel = getArrayItemTypeLabel(schema);\n return itemsLabel ? `Array<${itemsLabel}>` : \"Array\";\n }\n if (normalized === \"integer\") {\n return \"Integer\";\n }\n if (normalized === \"unknown\") {\n return \"Unknown\";\n }\n return capitalize(normalized);\n};\n\nexport const stringifyValueForDisplay = (\n value: unknown,\n type: NormalizedSchemaType\n) => {\n if (value === undefined || value === null) {\n return \"\";\n }\n\n if (\n type === \"array\" ||\n type === \"object\" ||\n Array.isArray(value) ||\n typeof value === \"object\"\n ) {\n if (typeof value === \"string\") {\n return value;\n }\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n }\n\n if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n }\n\n return String(value);\n};\n\nexport const coerceValueForType = (\n raw: string,\n type: NormalizedSchemaType\n): unknown => {\n if (raw === \"\") {\n return \"\";\n }\n\n if (type === \"boolean\") {\n if (raw === \"true\") {\n return true;\n }\n if (raw === \"false\") {\n return false;\n }\n return raw;\n }\n\n if (type === \"number\" || type === \"integer\") {\n const num = Number(raw);\n if (!Number.isNaN(num)) {\n return num;\n }\n return raw;\n }\n\n if (type === \"array\" || type === \"object\") {\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n }\n\n return raw;\n};\n\nexport const extractEnumOptions = (schema: JsonSchemaProperty | undefined) => {\n if (!schema || !Array.isArray(schema.enum)) {\n return [] as string[];\n }\n return schema.enum\n .map((option): string => {\n if (option === undefined || option === null) {\n return \"\";\n }\n if (typeof option === \"object\") {\n try {\n return JSON.stringify(option);\n } catch {\n return String(option);\n }\n }\n return String(option);\n })\n .filter((option) => option !== \"\");\n};\n"],"names":["inferred"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { useState, useCallback } from 'react';
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { useState, useCallback, useMemo } from 'react';
3
3
  import { Page, Content, ContentHeader, SupportButton } from '@backstage/core-components';
4
4
  import { FieldEditorDialog } from './components/FieldEditorDialog.esm.js';
5
5
  import { TemplateLanding } from './components/TemplateLanding.esm.js';
@@ -20,6 +20,7 @@ const TemplateDesigner = () => {
20
20
  templateSource,
21
21
  isReloading,
22
22
  isSaving,
23
+ isSyncing,
23
24
  fileInputRef,
24
25
  handleStartSampleTemplate,
25
26
  handleTemplateFileSelected,
@@ -33,14 +34,7 @@ const TemplateDesigner = () => {
33
34
  availableTemplates,
34
35
  selectCatalogTemplate
35
36
  } = useTemplateState();
36
- const {
37
- editorState,
38
- editorValue,
39
- setEditorValue,
40
- interactionRootRef,
41
- closeEditor,
42
- applyEditorValue
43
- } = useFieldEditor();
37
+ const { editorState, interactionRootRef, closeEditor, applyEditorValue } = useFieldEditor();
44
38
  const handleToggleYaml = useCallback(() => {
45
39
  setShowYaml((prev) => !prev);
46
40
  }, []);
@@ -55,6 +49,70 @@ const TemplateDesigner = () => {
55
49
  if (isSaving) {
56
50
  saveButtonLabel = "Saving...";
57
51
  }
52
+ const workspace = useMemo(
53
+ () => templateObject ? /* @__PURE__ */ jsx(
54
+ TemplateWorkspace,
55
+ {
56
+ templateSteps,
57
+ templateParameters,
58
+ templateOutput,
59
+ templateYaml,
60
+ yamlError,
61
+ loadError,
62
+ showYaml,
63
+ onToggleYaml: handleToggleYaml,
64
+ onYamlChange: handleYamlChange,
65
+ onStepsChange: handleStepsChange,
66
+ onParametersChange: handleParametersChange,
67
+ onOutputChange: handleOutputChange,
68
+ onReload: handleReloadFromFile,
69
+ onSave: handleSaveTemplate,
70
+ onOpenTemplatePicker: handleOpenTemplatePicker,
71
+ activeTemplateLabel,
72
+ reloadButtonLabel,
73
+ saveButtonLabel,
74
+ isReloading,
75
+ isSaving,
76
+ isSyncing
77
+ }
78
+ ) : /* @__PURE__ */ jsx(
79
+ TemplateLanding,
80
+ {
81
+ loadError,
82
+ onStartSampleTemplate: handleStartSampleTemplate,
83
+ onOpenTemplatePicker: handleOpenTemplatePicker,
84
+ availableTemplates,
85
+ selectCatalogTemplate
86
+ }
87
+ ),
88
+ [
89
+ templateObject,
90
+ templateSteps,
91
+ templateParameters,
92
+ templateOutput,
93
+ templateYaml,
94
+ yamlError,
95
+ loadError,
96
+ showYaml,
97
+ handleToggleYaml,
98
+ handleYamlChange,
99
+ handleStepsChange,
100
+ handleParametersChange,
101
+ handleOutputChange,
102
+ handleReloadFromFile,
103
+ handleSaveTemplate,
104
+ handleOpenTemplatePicker,
105
+ activeTemplateLabel,
106
+ reloadButtonLabel,
107
+ saveButtonLabel,
108
+ isReloading,
109
+ isSaving,
110
+ isSyncing,
111
+ handleStartSampleTemplate,
112
+ availableTemplates,
113
+ selectCatalogTemplate
114
+ ]
115
+ );
58
116
  return /* @__PURE__ */ jsxs("div", { ref: interactionRootRef, style: { height: "100%" }, children: [
59
117
  /* @__PURE__ */ jsx(Page, { themeId: "tool", children: /* @__PURE__ */ jsxs(Content, { children: [
60
118
  /* @__PURE__ */ jsx(ContentHeader, { title: "Template Designer", children: /* @__PURE__ */ jsx(SupportButton, { children: "Template Designer turns blank Backstage YAML into a storyboard-like canvas, guiding anyone through drag-and-drop scaffolder authoring before ever touching code. Rally non-experts, broadcast best practices, and accelerate template launches directly inside Backstage." }) }),
@@ -68,48 +126,14 @@ const TemplateDesigner = () => {
68
126
  onChange: handleTemplateFileSelected
69
127
  }
70
128
  ),
71
- !templateObject ? /* @__PURE__ */ jsx(
72
- TemplateLanding,
73
- {
74
- loadError,
75
- onStartSampleTemplate: handleStartSampleTemplate,
76
- onOpenTemplatePicker: handleOpenTemplatePicker,
77
- availableTemplates,
78
- selectCatalogTemplate
79
- }
80
- ) : /* @__PURE__ */ jsx(
81
- TemplateWorkspace,
82
- {
83
- templateSteps,
84
- templateParameters,
85
- templateOutput,
86
- templateYaml,
87
- yamlError,
88
- loadError,
89
- showYaml,
90
- onToggleYaml: handleToggleYaml,
91
- onYamlChange: handleYamlChange,
92
- onStepsChange: handleStepsChange,
93
- onParametersChange: handleParametersChange,
94
- onOutputChange: handleOutputChange,
95
- onReload: handleReloadFromFile,
96
- onSave: handleSaveTemplate,
97
- onOpenTemplatePicker: handleOpenTemplatePicker,
98
- activeTemplateLabel,
99
- reloadButtonLabel,
100
- saveButtonLabel,
101
- isReloading,
102
- isSaving
103
- }
104
- )
129
+ workspace
105
130
  ] }) }),
106
131
  /* @__PURE__ */ jsx(
107
132
  FieldEditorDialog,
108
133
  {
109
134
  open: Boolean(editorState),
110
135
  label: editorState?.label,
111
- value: editorValue,
112
- onChange: setEditorValue,
136
+ value: editorState?.initialValue ?? "",
113
137
  onClose: closeEditor,
114
138
  onApply: applyEditorValue
115
139
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateDesigner.esm.js","sources":["../../../src/components/TemplateDesigner/TemplateDesigner.tsx"],"sourcesContent":["import { useCallback, useState } from \"react\";\nimport {\n Content,\n ContentHeader,\n Page,\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 availableTemplates,\n selectCatalogTemplate,\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 } else if (templateSource?.type === \"catalog\") {\n reloadButtonLabel = \"Reload template\";\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 Template Designer turns blank Backstage YAML into a\n storyboard-like canvas, guiding anyone through drag-and-drop\n scaffolder authoring before ever touching code. Rally non-experts,\n broadcast best practices, and accelerate template launches\n directly inside Backstage.\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 availableTemplates={availableTemplates}\n selectCatalogTemplate={selectCatalogTemplate}\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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"}
1
+ {"version":3,"file":"TemplateDesigner.esm.js","sources":["../../../src/components/TemplateDesigner/TemplateDesigner.tsx"],"sourcesContent":["import { useCallback, useMemo, useState } from \"react\";\nimport {\n Content,\n ContentHeader,\n Page,\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 isSyncing,\n fileInputRef,\n handleStartSampleTemplate,\n handleTemplateFileSelected,\n handleOpenTemplatePicker,\n handleYamlChange,\n handleStepsChange,\n handleParametersChange,\n handleOutputChange,\n handleReloadFromFile,\n handleSaveTemplate,\n availableTemplates,\n selectCatalogTemplate,\n } = useTemplateState();\n const { editorState, interactionRootRef, closeEditor, 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 } else if (templateSource?.type === \"catalog\") {\n reloadButtonLabel = \"Reload template\";\n }\n\n let saveButtonLabel =\n templateSource?.type === \"file\" ? \"Save\" : \"Save as file\";\n if (isSaving) {\n saveButtonLabel = \"Saving...\";\n }\n\n const workspace = useMemo(\n () =>\n templateObject ? (\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 isSyncing={isSyncing}\n />\n ) : (\n <TemplateLanding\n loadError={loadError}\n onStartSampleTemplate={handleStartSampleTemplate}\n onOpenTemplatePicker={handleOpenTemplatePicker}\n availableTemplates={availableTemplates}\n selectCatalogTemplate={selectCatalogTemplate}\n />\n ),\n [\n templateObject,\n templateSteps,\n templateParameters,\n templateOutput,\n templateYaml,\n yamlError,\n loadError,\n showYaml,\n handleToggleYaml,\n handleYamlChange,\n handleStepsChange,\n handleParametersChange,\n handleOutputChange,\n handleReloadFromFile,\n handleSaveTemplate,\n handleOpenTemplatePicker,\n activeTemplateLabel,\n reloadButtonLabel,\n saveButtonLabel,\n isReloading,\n isSaving,\n isSyncing,\n handleStartSampleTemplate,\n availableTemplates,\n selectCatalogTemplate,\n ]\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 Template Designer turns blank Backstage YAML into a\n storyboard-like canvas, guiding anyone through drag-and-drop\n scaffolder authoring before ever touching code. Rally non-experts,\n broadcast best practices, and accelerate template launches\n directly inside Backstage.\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 {workspace}\n </Content>\n </Page>\n <FieldEditorDialog\n open={Boolean(editorState)}\n label={editorState?.label}\n value={editorState?.initialValue ?? \"\"}\n onClose={closeEditor}\n onApply={applyEditorValue}\n />\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1,32 +1,55 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { Dialog, DialogTitle, DialogContent, TextField, DialogActions, Button } from '@material-ui/core';
3
+ import { useRef, useEffect } from 'react';
3
4
 
4
5
  const FieldEditorDialog = ({
5
6
  open,
6
7
  label,
7
8
  value,
8
- onChange,
9
9
  onClose,
10
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
11
+ }) => {
12
+ const draftRef = useRef(value);
13
+ const inputRef = useRef(null);
14
+ useEffect(() => {
15
+ if (open) {
16
+ draftRef.current = value;
17
+ if (inputRef.current) {
18
+ inputRef.current.value = value;
19
+ }
23
20
  }
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
- ] });
21
+ }, [open, value]);
22
+ return /* @__PURE__ */ jsxs(Dialog, { open, onClose, fullWidth: true, maxWidth: "md", children: [
23
+ /* @__PURE__ */ jsx(DialogTitle, { children: label ? `Edit ${label}` : "Edit field" }),
24
+ /* @__PURE__ */ jsx(DialogContent, { children: /* @__PURE__ */ jsx(
25
+ TextField,
26
+ {
27
+ multiline: true,
28
+ minRows: 8,
29
+ variant: "outlined",
30
+ defaultValue: value,
31
+ inputRef,
32
+ onChange: (event) => {
33
+ draftRef.current = event.target.value;
34
+ },
35
+ fullWidth: true,
36
+ autoFocus: true
37
+ }
38
+ ) }),
39
+ /* @__PURE__ */ jsxs(DialogActions, { children: [
40
+ /* @__PURE__ */ jsx(Button, { onClick: onClose, children: "Cancel" }),
41
+ /* @__PURE__ */ jsx(
42
+ Button,
43
+ {
44
+ color: "primary",
45
+ variant: "contained",
46
+ onClick: () => onApply(draftRef.current ?? value),
47
+ children: "Apply"
48
+ }
49
+ )
50
+ ] })
51
+ ] });
52
+ };
30
53
 
31
54
  export { FieldEditorDialog };
32
55
  //# sourceMappingURL=FieldEditorDialog.esm.js.map
@@ -1 +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;;;;"}
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\";\nimport { useEffect, useRef } from \"react\";\n\ntype FieldEditorDialogProps = {\n open: boolean;\n label?: string;\n value: string;\n onClose: () => void;\n onApply: (value: string) => void;\n};\n\nexport const FieldEditorDialog = ({\n open,\n label,\n value,\n onClose,\n onApply,\n}: FieldEditorDialogProps) => {\n const draftRef = useRef(value);\n const inputRef = useRef<HTMLInputElement | HTMLTextAreaElement | null>(null);\n\n useEffect(() => {\n if (open) {\n draftRef.current = value;\n if (inputRef.current) {\n inputRef.current.value = value;\n }\n }\n }, [open, value]);\n\n return (\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 defaultValue={value}\n inputRef={inputRef}\n onChange={(event) => {\n draftRef.current = event.target.value;\n }}\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\n color=\"primary\"\n variant=\"contained\"\n onClick={() => onApply(draftRef.current ?? value)}\n >\n Apply\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n"],"names":[],"mappings":";;;;AAkBO,MAAM,oBAAoB,CAAC;AAAA,EAChC,IAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,KAA8B;AAC5B,EAAA,MAAM,QAAA,GAAW,OAAO,KAAK,CAAA;AAC7B,EAAA,MAAM,QAAA,GAAW,OAAsD,IAAI,CAAA;AAE3E,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AACnB,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,QAAA,CAAS,QAAQ,KAAA,GAAQ,KAAA;AAAA,MAC3B;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,KAAK,CAAC,CAAA;AAEhB,EAAA,4BACG,MAAA,EAAA,EAAO,IAAA,EAAY,SAAkB,SAAA,EAAS,IAAA,EAAC,UAAS,IAAA,EACvD,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,WAAA,EAAA,EAAa,QAAA,EAAA,KAAA,GAAQ,CAAA,KAAA,EAAQ,KAAK,KAAK,YAAA,EAAa,CAAA;AAAA,wBACpD,aAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS,CAAA;AAAA,QACT,OAAA,EAAQ,UAAA;AAAA,QACR,YAAA,EAAc,KAAA;AAAA,QACd,QAAA;AAAA,QACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,UAAA,QAAA,CAAS,OAAA,GAAU,MAAM,MAAA,CAAO,KAAA;AAAA,QAClC,CAAA;AAAA,QACA,SAAA,EAAS,IAAA;AAAA,QAET,SAAA,EAAS;AAAA;AAAA,KACX,EACF,CAAA;AAAA,yBACC,aAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAS,OAAA,EAAS,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,sBAChC,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,SAAA;AAAA,UACN,OAAA,EAAQ,WAAA;AAAA,UACR,OAAA,EAAS,MAAM,OAAA,CAAQ,QAAA,CAAS,WAAW,KAAK,CAAA;AAAA,UACjD,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -124,6 +124,7 @@ const TemplateLanding = ({
124
124
  Autocomplete,
125
125
  {
126
126
  style: { width: "100%" },
127
+ size: "small",
127
128
  options: availableTemplates ?? [],
128
129
  getOptionLabel: (option) => option.metadata.title ?? option.metadata.name,
129
130
  onChange: (_e, value) => {
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateLanding.esm.js","sources":["../../../../src/components/TemplateDesigner/components/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 { TemplateEntityV1beta3 } from \"@backstage/plugin-scaffolder-common\";\nimport Autocomplete from \"@material-ui/lab/Autocomplete\";\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 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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"}
1
+ {"version":3,"file":"TemplateLanding.esm.js","sources":["../../../../src/components/TemplateDesigner/components/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 { TemplateEntityV1beta3 } from \"@backstage/plugin-scaffolder-common\";\nimport Autocomplete from \"@material-ui/lab/Autocomplete\";\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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"}