@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.
- package/LICENSE +201 -0
- package/README.md +2 -2
- package/dist/alpha.esm.js +2 -2
- package/dist/alpha.esm.js.map +1 -1
- package/dist/components/DesignerFlow/DesignerFlow.esm.js +97 -54
- package/dist/components/DesignerFlow/DesignerFlow.esm.js.map +1 -1
- package/dist/components/DesignerFlow/handlers.esm.js +14 -3
- package/dist/components/DesignerFlow/handlers.esm.js.map +1 -1
- package/dist/components/Nodes/ActionNode.esm.js +6 -4
- package/dist/components/Nodes/ActionNode.esm.js.map +1 -1
- package/dist/components/Nodes/OutputNode.esm.js +3 -1
- package/dist/components/Nodes/OutputNode.esm.js.map +1 -1
- package/dist/components/Nodes/ParametersNode.esm.js +3 -1
- package/dist/components/Nodes/ParametersNode.esm.js.map +1 -1
- package/dist/components/Nodes/action/schema.esm.js +36 -9
- package/dist/components/Nodes/action/schema.esm.js.map +1 -1
- package/dist/components/TemplateDesigner/TemplateDesigner.esm.js +70 -46
- package/dist/components/TemplateDesigner/TemplateDesigner.esm.js.map +1 -1
- package/dist/components/TemplateDesigner/components/FieldEditorDialog.esm.js +42 -19
- package/dist/components/TemplateDesigner/components/FieldEditorDialog.esm.js.map +1 -1
- package/dist/components/TemplateDesigner/components/TemplateLanding.esm.js +1 -0
- package/dist/components/TemplateDesigner/components/TemplateLanding.esm.js.map +1 -1
- package/dist/components/TemplateDesigner/components/TemplateWorkspace.esm.js +224 -174
- package/dist/components/TemplateDesigner/components/TemplateWorkspace.esm.js.map +1 -1
- package/dist/components/TemplateDesigner/components/codemirrorTheme.esm.js +30 -0
- package/dist/components/TemplateDesigner/components/codemirrorTheme.esm.js.map +1 -0
- package/dist/components/TemplateDesigner/useFieldEditor.esm.js +31 -32
- package/dist/components/TemplateDesigner/useFieldEditor.esm.js.map +1 -1
- package/dist/components/TemplateDesigner/useTemplateState.esm.js +253 -53
- package/dist/components/TemplateDesigner/useTemplateState.esm.js.map +1 -1
- package/dist/components/TemplateDesignerIcon.esm.js +33 -0
- package/dist/components/TemplateDesignerIcon.esm.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.esm.js +1 -0
- package/dist/index.esm.js.map +1 -1
- package/dist/package.json.esm.js +1 -1
- 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
|
|
4
|
+
return void 0;
|
|
5
5
|
}
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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 {
|
|
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
|
-
|
|
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:
|
|
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 {
|
|
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
|
-
}) =>
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
{
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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(
|
|
26
|
-
/* @__PURE__ */ jsx(
|
|
27
|
-
/* @__PURE__ */ jsx(
|
|
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
|
|
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;;;;"}
|
|
@@ -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":";;;;;AAoBO,MAAM,kBAAkB,CAAC;AAAA,EAC9B,SAAA;AAAA,EACA,qBAAA;AAAA,EACA,oBAAA;AAAA,EACA,kBAAA;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,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,qBAAA,EAAmB,CAAA;AAAA,oCAC3C,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,iBAAgB,QAAA,EAAA,wCAAA,EAElD;AAAA,eAAA,EACF,CAAA;AAAA,8BACA,GAAA;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,kBAAA,GAAA;AAAA,oBAAC,YAAA;AAAA,oBAAA;AAAA,sBACC,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAO;AAAA,sBACvB,IAAA,EAAK,OAAA;AAAA,sBACL,OAAA,EAAS,sBAAsB,EAAC;AAAA,sBAChC,gBAAgB,CAAC,MAAA,KACf,OAAO,QAAA,CAAS,KAAA,IAAS,OAAO,QAAA,CAAS,IAAA;AAAA,sBAE3C,QAAA,EAAU,CAAC,EAAA,EAAI,KAAA,KAAU;AACvB,wBAAA,IAAI,KAAA,EAAO;AACT,0BAAA,qBAAA,CAAsB,KAAK,CAAA;AAAA,wBAC7B;AAAA,sBACF,CAAA;AAAA,sBACA,WAAA,EAAa,CAAC,MAAA,qBACZ,GAAA;AAAA,wBAAC,SAAA;AAAA,wBAAA;AAAA,0BACE,GAAG,MAAA;AAAA,0BACJ,YAAA,EAAa,KAAA;AAAA,0BACb,KAAA,EAAM,iBAAA;AAAA,0BACN,OAAA,EAAQ;AAAA;AAAA;AACV;AAAA;AAEJ;AAAA;AACF;AAAA;AAAA,SACF,EACF;AAAA,OAAA,EACF,CAAA,EACF;AAAA;AAAA,GACF;AAEJ;;;;"}
|