@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,142 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { NodeToolbar, Position, Handle } from '@xyflow/react';
|
|
3
|
+
import { useTheme, styled, alpha } from '@material-ui/core/styles';
|
|
4
|
+
import { Box, Typography, Chip, Button } from '@material-ui/core';
|
|
5
|
+
import SettingsIcon from '@material-ui/icons/Settings';
|
|
6
|
+
import AddIcon from '@material-ui/icons/Add';
|
|
7
|
+
import { ParameterTitlesNode } from './ParameterTitlesNode.esm.js';
|
|
8
|
+
import { createStopNodeInteraction } from './common/nodeInteraction.esm.js';
|
|
9
|
+
import { useParameterSectionsController } from './parameters/useParameterSections.esm.js';
|
|
10
|
+
|
|
11
|
+
const resolvePaletteMode = (theme) => theme.palette.mode ?? theme.palette.type ?? "light";
|
|
12
|
+
const Card = styled(Box)(({ theme }) => {
|
|
13
|
+
const paletteMode = resolvePaletteMode(theme);
|
|
14
|
+
return {
|
|
15
|
+
position: "relative",
|
|
16
|
+
background: alpha(
|
|
17
|
+
theme.palette.warning.main,
|
|
18
|
+
paletteMode === "dark" ? 0.18 : 0.12
|
|
19
|
+
),
|
|
20
|
+
border: `1px solid ${alpha(theme.palette.warning.main, 0.35)}`,
|
|
21
|
+
borderRadius: 12,
|
|
22
|
+
width: 760,
|
|
23
|
+
padding: theme.spacing(1.5),
|
|
24
|
+
boxShadow: theme.shadows[2],
|
|
25
|
+
color: theme.palette.text.primary,
|
|
26
|
+
overflow: "hidden",
|
|
27
|
+
"&::before": {
|
|
28
|
+
content: '""',
|
|
29
|
+
position: "absolute",
|
|
30
|
+
inset: 0,
|
|
31
|
+
background: `linear-gradient(135deg, ${alpha(
|
|
32
|
+
theme.palette.warning.light,
|
|
33
|
+
paletteMode === "dark" ? 0.28 : 0.18
|
|
34
|
+
)}, transparent 65%)`,
|
|
35
|
+
pointerEvents: "none",
|
|
36
|
+
zIndex: 0
|
|
37
|
+
},
|
|
38
|
+
"& > *": {
|
|
39
|
+
position: "relative",
|
|
40
|
+
zIndex: 1
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
});
|
|
44
|
+
const Header = styled(Box)(({ theme }) => {
|
|
45
|
+
const paletteMode = resolvePaletteMode(theme);
|
|
46
|
+
return {
|
|
47
|
+
display: "flex",
|
|
48
|
+
alignItems: "center",
|
|
49
|
+
justifyContent: "space-between",
|
|
50
|
+
padding: theme.spacing(1),
|
|
51
|
+
marginBottom: theme.spacing(1),
|
|
52
|
+
borderRadius: 8,
|
|
53
|
+
backgroundColor: alpha(
|
|
54
|
+
theme.palette.warning.main,
|
|
55
|
+
paletteMode === "dark" ? 0.24 : 0.14
|
|
56
|
+
),
|
|
57
|
+
border: `1px solid ${alpha(theme.palette.warning.main, 0.4)}`
|
|
58
|
+
};
|
|
59
|
+
});
|
|
60
|
+
const ParametersNode = ({
|
|
61
|
+
data
|
|
62
|
+
}) => {
|
|
63
|
+
const theme = useTheme();
|
|
64
|
+
const paletteMode = resolvePaletteMode(theme);
|
|
65
|
+
const {
|
|
66
|
+
sections,
|
|
67
|
+
handleSectionUpdate,
|
|
68
|
+
handleFieldUpdate,
|
|
69
|
+
handleAddSection,
|
|
70
|
+
handleMoveSection,
|
|
71
|
+
handleAddField,
|
|
72
|
+
handleMoveField
|
|
73
|
+
} = useParameterSectionsController(data);
|
|
74
|
+
const stopAll = createStopNodeInteraction();
|
|
75
|
+
return /* @__PURE__ */ jsxs(Card, { children: [
|
|
76
|
+
/* @__PURE__ */ jsxs(Header, { children: [
|
|
77
|
+
/* @__PURE__ */ jsxs(
|
|
78
|
+
Box,
|
|
79
|
+
{
|
|
80
|
+
display: "flex",
|
|
81
|
+
alignItems: "center",
|
|
82
|
+
style: { gap: theme.spacing(1) },
|
|
83
|
+
children: [
|
|
84
|
+
/* @__PURE__ */ jsx(
|
|
85
|
+
SettingsIcon,
|
|
86
|
+
{
|
|
87
|
+
fontSize: "small",
|
|
88
|
+
htmlColor: theme.palette.warning.dark
|
|
89
|
+
}
|
|
90
|
+
),
|
|
91
|
+
/* @__PURE__ */ jsx(Typography, { variant: "subtitle2", noWrap: true, children: "Parameters" })
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
),
|
|
95
|
+
/* @__PURE__ */ jsx(
|
|
96
|
+
Chip,
|
|
97
|
+
{
|
|
98
|
+
size: "small",
|
|
99
|
+
variant: "outlined",
|
|
100
|
+
label: "parameters",
|
|
101
|
+
style: {
|
|
102
|
+
borderColor: theme.palette.warning.dark,
|
|
103
|
+
color: paletteMode === "dark" ? theme.palette.warning.light : theme.palette.warning.dark,
|
|
104
|
+
textTransform: "uppercase"
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
)
|
|
108
|
+
] }),
|
|
109
|
+
/* @__PURE__ */ jsx(Box, { mt: 2, children: /* @__PURE__ */ jsx(
|
|
110
|
+
ParameterTitlesNode,
|
|
111
|
+
{
|
|
112
|
+
sections,
|
|
113
|
+
onSectionUpdate: handleSectionUpdate,
|
|
114
|
+
onFieldUpdate: handleFieldUpdate,
|
|
115
|
+
onAddSection: handleAddSection,
|
|
116
|
+
onMoveSection: handleMoveSection,
|
|
117
|
+
onAddField: handleAddField,
|
|
118
|
+
onMoveField: handleMoveField
|
|
119
|
+
}
|
|
120
|
+
) }),
|
|
121
|
+
/* @__PURE__ */ jsx(NodeToolbar, { position: Position.Bottom, children: /* @__PURE__ */ jsx(
|
|
122
|
+
Button,
|
|
123
|
+
{
|
|
124
|
+
variant: "outlined",
|
|
125
|
+
size: "small",
|
|
126
|
+
startIcon: /* @__PURE__ */ jsx(AddIcon, { fontSize: "small" }),
|
|
127
|
+
onClick: () => data.onAddNode?.({
|
|
128
|
+
afterRfId: data.rfId,
|
|
129
|
+
type: "actionNode"
|
|
130
|
+
}),
|
|
131
|
+
className: "nodrag nowheel",
|
|
132
|
+
onPointerDown: stopAll.onPointerDown,
|
|
133
|
+
onKeyDown: stopAll.onKeyDown,
|
|
134
|
+
children: "Add First Action"
|
|
135
|
+
}
|
|
136
|
+
) }),
|
|
137
|
+
/* @__PURE__ */ jsx(Handle, { type: "source", position: Position.Bottom })
|
|
138
|
+
] });
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
export { ParametersNode };
|
|
142
|
+
//# sourceMappingURL=ParametersNode.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ParametersNode.esm.js","sources":["../../../src/components/Nodes/ParametersNode.tsx"],"sourcesContent":["import { Handle, NodeToolbar, Position } from \"@xyflow/react\";\nimport { alpha, styled, useTheme } from \"@material-ui/core/styles\";\nimport { Box, Button, Chip, Typography } from \"@material-ui/core\";\nimport SettingsIcon from \"@material-ui/icons/Settings\";\nimport AddIcon from \"@material-ui/icons/Add\";\nimport type { ParametersNodeData } from \"./types\";\nimport { ParameterTitlesNode } from \"./ParameterTitlesNode\";\nimport { createStopNodeInteraction } from \"./common/nodeInteraction\";\nimport { useParameterSectionsController } from \"./parameters/useParameterSections\";\n\nconst resolvePaletteMode = (theme: { palette: { type?: string } }) =>\n (theme.palette as { mode?: \"light\" | \"dark\" }).mode ??\n theme.palette.type ??\n \"light\";\n\nconst Card = styled(Box)(({ theme }) => {\n const paletteMode = resolvePaletteMode(theme);\n return {\n position: \"relative\",\n background: alpha(\n theme.palette.warning.main,\n paletteMode === \"dark\" ? 0.18 : 0.12\n ),\n border: `1px solid ${alpha(theme.palette.warning.main, 0.35)}`,\n borderRadius: 12,\n width: 760,\n padding: theme.spacing(1.5),\n boxShadow: theme.shadows[2],\n color: theme.palette.text.primary,\n overflow: \"hidden\",\n \"&::before\": {\n content: '\"\"',\n position: \"absolute\",\n inset: 0,\n background: `linear-gradient(135deg, ${alpha(\n theme.palette.warning.light,\n paletteMode === \"dark\" ? 0.28 : 0.18\n )}, transparent 65%)`,\n pointerEvents: \"none\",\n zIndex: 0,\n },\n \"& > *\": {\n position: \"relative\",\n zIndex: 1,\n },\n };\n});\n\nconst Header = styled(Box)(({ theme }) => {\n const paletteMode = resolvePaletteMode(theme);\n return {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: theme.spacing(1),\n marginBottom: theme.spacing(1),\n borderRadius: 8,\n backgroundColor: alpha(\n theme.palette.warning.main,\n paletteMode === \"dark\" ? 0.24 : 0.14\n ),\n border: `1px solid ${alpha(theme.palette.warning.main, 0.4)}`,\n };\n});\n\nexport const ParametersNode: React.FC<{ data: ParametersNodeData }> = ({\n data,\n}) => {\n const theme = useTheme();\n const paletteMode = resolvePaletteMode(theme);\n const {\n sections,\n handleSectionUpdate,\n handleFieldUpdate,\n handleAddSection,\n handleMoveSection,\n handleAddField,\n handleMoveField,\n } = useParameterSectionsController(data);\n\n const stopAll = createStopNodeInteraction();\n\n return (\n <Card>\n <Header>\n <Box\n display=\"flex\"\n alignItems=\"center\"\n style={{ gap: theme.spacing(1) }}\n >\n <SettingsIcon\n fontSize=\"small\"\n htmlColor={theme.palette.warning.dark}\n />\n <Typography variant=\"subtitle2\" noWrap>\n Parameters\n </Typography>\n </Box>\n <Chip\n size=\"small\"\n variant=\"outlined\"\n label=\"parameters\"\n style={{\n borderColor: theme.palette.warning.dark,\n color:\n paletteMode === \"dark\"\n ? theme.palette.warning.light\n : theme.palette.warning.dark,\n textTransform: \"uppercase\",\n }}\n />\n </Header>\n\n <Box mt={2}>\n <ParameterTitlesNode\n sections={sections}\n onSectionUpdate={handleSectionUpdate}\n onFieldUpdate={handleFieldUpdate}\n onAddSection={handleAddSection}\n onMoveSection={handleMoveSection}\n onAddField={handleAddField}\n onMoveField={handleMoveField}\n />\n </Box>\n\n <NodeToolbar position={Position.Bottom}>\n <Button\n variant=\"outlined\"\n size=\"small\"\n startIcon={<AddIcon fontSize=\"small\" />}\n onClick={() =>\n data.onAddNode?.({\n afterRfId: data.rfId,\n type: \"actionNode\",\n })\n }\n className=\"nodrag nowheel\"\n onPointerDown={stopAll.onPointerDown}\n onKeyDown={stopAll.onKeyDown}\n >\n Add First Action\n </Button>\n </NodeToolbar>\n\n <Handle type=\"source\" position={Position.Bottom} />\n </Card>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
const capitalize = (value) => value.length > 0 ? value[0].toUpperCase() + value.slice(1) : value;
|
|
2
|
+
const getFirstType = (type) => {
|
|
3
|
+
if (!type) {
|
|
4
|
+
return "string";
|
|
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;
|
|
9
|
+
}
|
|
10
|
+
return "string";
|
|
11
|
+
};
|
|
12
|
+
const normalizeSchemaType = (schema) => {
|
|
13
|
+
if (!schema || typeof schema !== "object") {
|
|
14
|
+
return "string";
|
|
15
|
+
}
|
|
16
|
+
return getFirstType(schema.type);
|
|
17
|
+
};
|
|
18
|
+
const getArrayItemTypeLabel = (schema) => {
|
|
19
|
+
if (!schema) {
|
|
20
|
+
return "";
|
|
21
|
+
}
|
|
22
|
+
const items = schema.items;
|
|
23
|
+
if (!items) {
|
|
24
|
+
return "";
|
|
25
|
+
}
|
|
26
|
+
if (Array.isArray(items)) {
|
|
27
|
+
const [first] = items;
|
|
28
|
+
if (!first) {
|
|
29
|
+
return "";
|
|
30
|
+
}
|
|
31
|
+
return capitalize(normalizeSchemaType(first));
|
|
32
|
+
}
|
|
33
|
+
return capitalize(normalizeSchemaType(items));
|
|
34
|
+
};
|
|
35
|
+
const buildTypeLabel = (schema) => {
|
|
36
|
+
const normalized = normalizeSchemaType(schema);
|
|
37
|
+
if (normalized === "array") {
|
|
38
|
+
const itemsLabel = getArrayItemTypeLabel(schema);
|
|
39
|
+
return itemsLabel ? `Array<${itemsLabel}>` : "Array";
|
|
40
|
+
}
|
|
41
|
+
if (normalized === "integer") {
|
|
42
|
+
return "Integer";
|
|
43
|
+
}
|
|
44
|
+
if (normalized === "unknown") {
|
|
45
|
+
return "Unknown";
|
|
46
|
+
}
|
|
47
|
+
return capitalize(normalized);
|
|
48
|
+
};
|
|
49
|
+
const stringifyValueForDisplay = (value, type) => {
|
|
50
|
+
if (value === void 0 || value === null) {
|
|
51
|
+
return "";
|
|
52
|
+
}
|
|
53
|
+
if (type === "array" || type === "object") {
|
|
54
|
+
if (typeof value === "string") {
|
|
55
|
+
return value;
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
return JSON.stringify(value, null, 2);
|
|
59
|
+
} catch {
|
|
60
|
+
return String(value);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (typeof value === "boolean") {
|
|
64
|
+
return value ? "true" : "false";
|
|
65
|
+
}
|
|
66
|
+
return String(value);
|
|
67
|
+
};
|
|
68
|
+
const coerceValueForType = (raw, type) => {
|
|
69
|
+
if (raw === "") {
|
|
70
|
+
return "";
|
|
71
|
+
}
|
|
72
|
+
if (type === "boolean") {
|
|
73
|
+
if (raw === "true") {
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
if (raw === "false") {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
return raw;
|
|
80
|
+
}
|
|
81
|
+
if (type === "number" || type === "integer") {
|
|
82
|
+
const num = Number(raw);
|
|
83
|
+
if (!Number.isNaN(num)) {
|
|
84
|
+
return num;
|
|
85
|
+
}
|
|
86
|
+
return raw;
|
|
87
|
+
}
|
|
88
|
+
if (type === "array" || type === "object") {
|
|
89
|
+
try {
|
|
90
|
+
return JSON.parse(raw);
|
|
91
|
+
} catch {
|
|
92
|
+
return raw;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return raw;
|
|
96
|
+
};
|
|
97
|
+
const extractEnumOptions = (schema) => {
|
|
98
|
+
if (!schema || !Array.isArray(schema.enum)) {
|
|
99
|
+
return [];
|
|
100
|
+
}
|
|
101
|
+
return schema.enum.map((option) => {
|
|
102
|
+
if (option === void 0 || option === null) {
|
|
103
|
+
return "";
|
|
104
|
+
}
|
|
105
|
+
if (typeof option === "object") {
|
|
106
|
+
try {
|
|
107
|
+
return JSON.stringify(option);
|
|
108
|
+
} catch {
|
|
109
|
+
return String(option);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return String(option);
|
|
113
|
+
}).filter((option) => option !== "");
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
export { buildTypeLabel, coerceValueForType, extractEnumOptions, normalizeSchemaType, stringifyValueForDisplay };
|
|
117
|
+
//# sourceMappingURL=schema.esm.js.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
import { normalizeSchemaType, buildTypeLabel, extractEnumOptions } from './schema.esm.js';
|
|
3
|
+
|
|
4
|
+
const useActionInputs = ({
|
|
5
|
+
data,
|
|
6
|
+
step,
|
|
7
|
+
actionId,
|
|
8
|
+
newKey
|
|
9
|
+
}) => {
|
|
10
|
+
const actionInputSchema = useMemo(() => {
|
|
11
|
+
if (!actionId) {
|
|
12
|
+
return {};
|
|
13
|
+
}
|
|
14
|
+
const inputs = data.scaffolderActionInputsById?.[actionId] ?? {};
|
|
15
|
+
return inputs;
|
|
16
|
+
}, [actionId, data.scaffolderActionInputsById]);
|
|
17
|
+
const actionInputOptions = useMemo(() => {
|
|
18
|
+
return Object.entries(actionInputSchema).map(([key, schema]) => {
|
|
19
|
+
const normalized = normalizeSchemaType(schema);
|
|
20
|
+
const label = buildTypeLabel(schema);
|
|
21
|
+
return {
|
|
22
|
+
key,
|
|
23
|
+
label: label ? `${key} (${label})` : key,
|
|
24
|
+
schema,
|
|
25
|
+
type: normalized
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
}, [actionInputSchema]);
|
|
29
|
+
const inputEntries = useMemo(
|
|
30
|
+
() => Object.entries(step.input ?? {}),
|
|
31
|
+
[step.input]
|
|
32
|
+
);
|
|
33
|
+
const usedInputKeys = useMemo(
|
|
34
|
+
() => new Set(inputEntries.map(([key]) => key)),
|
|
35
|
+
[inputEntries]
|
|
36
|
+
);
|
|
37
|
+
const availableInputOptions = useMemo(
|
|
38
|
+
() => actionInputOptions.filter((option) => !usedInputKeys.has(option.key)),
|
|
39
|
+
[actionInputOptions, usedInputKeys]
|
|
40
|
+
);
|
|
41
|
+
const trimmedNewKey = newKey.trim();
|
|
42
|
+
const selectedNewKeyOption = useMemo(
|
|
43
|
+
() => availableInputOptions.find((option) => option.key === trimmedNewKey) ?? null,
|
|
44
|
+
[availableInputOptions, trimmedNewKey]
|
|
45
|
+
);
|
|
46
|
+
const newKeySchema = selectedNewKeyOption?.schema ?? (trimmedNewKey ? actionInputSchema?.[trimmedNewKey] : void 0);
|
|
47
|
+
const newKeyNormalizedType = normalizeSchemaType(newKeySchema);
|
|
48
|
+
const newKeyTypeLabel = buildTypeLabel(newKeySchema) || "String";
|
|
49
|
+
const newKeyEnumOptions = extractEnumOptions(newKeySchema);
|
|
50
|
+
return {
|
|
51
|
+
actionInputSchema,
|
|
52
|
+
actionInputOptions,
|
|
53
|
+
inputEntries,
|
|
54
|
+
usedInputKeys,
|
|
55
|
+
availableInputOptions,
|
|
56
|
+
trimmedNewKey,
|
|
57
|
+
selectedNewKeyOption,
|
|
58
|
+
newKeySchema,
|
|
59
|
+
newKeyNormalizedType,
|
|
60
|
+
newKeyTypeLabel,
|
|
61
|
+
newKeyEnumOptions
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
export { useActionInputs };
|
|
66
|
+
//# sourceMappingURL=useActionInputs.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useActionInputs.esm.js","sources":["../../../../src/components/Nodes/action/useActionInputs.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport type { TaskStep } from \"@backstage/plugin-scaffolder-common\";\nimport type { ActionNodeData } from \"../types\";\nimport type { JsonSchemaProperty, NormalizedSchemaType } from \"./schema\";\nimport {\n buildTypeLabel,\n extractEnumOptions,\n normalizeSchemaType,\n} from \"./schema\";\n\ntype ActionInputOption = {\n key: string;\n label: string;\n schema?: JsonSchemaProperty;\n type: NormalizedSchemaType;\n};\n\ntype UseActionInputsArgs = {\n data: ActionNodeData;\n step: TaskStep;\n actionId: string;\n newKey: string;\n};\n\nexport const useActionInputs = ({\n data,\n step,\n actionId,\n newKey,\n}: UseActionInputsArgs) => {\n const actionInputSchema = useMemo(() => {\n if (!actionId) {\n return {} as Record<string, JsonSchemaProperty>;\n }\n const inputs = (data.scaffolderActionInputsById?.[actionId] ??\n {}) as Record<string, JsonSchemaProperty>;\n return inputs;\n }, [actionId, data.scaffolderActionInputsById]);\n\n const actionInputOptions = useMemo<ActionInputOption[]>(() => {\n return Object.entries(actionInputSchema).map(([key, schema]) => {\n const normalized = normalizeSchemaType(schema);\n const label = buildTypeLabel(schema);\n return {\n key,\n label: label ? `${key} (${label})` : key,\n schema,\n type: normalized,\n };\n });\n }, [actionInputSchema]);\n\n const inputEntries = useMemo(\n () => Object.entries(step.input ?? {}),\n [step.input]\n );\n const usedInputKeys = useMemo(\n () => new Set(inputEntries.map(([key]) => key)),\n [inputEntries]\n );\n const availableInputOptions = useMemo(\n () => actionInputOptions.filter((option) => !usedInputKeys.has(option.key)),\n [actionInputOptions, usedInputKeys]\n );\n const trimmedNewKey = newKey.trim();\n const selectedNewKeyOption = useMemo(\n () =>\n availableInputOptions.find((option) => option.key === trimmedNewKey) ??\n null,\n [availableInputOptions, trimmedNewKey]\n );\n\n const newKeySchema =\n selectedNewKeyOption?.schema ??\n (trimmedNewKey ? actionInputSchema?.[trimmedNewKey] : undefined);\n const newKeyNormalizedType = normalizeSchemaType(newKeySchema);\n const newKeyTypeLabel = buildTypeLabel(newKeySchema) || \"String\";\n const newKeyEnumOptions = extractEnumOptions(newKeySchema);\n\n return {\n actionInputSchema,\n actionInputOptions,\n inputEntries,\n usedInputKeys,\n availableInputOptions,\n trimmedNewKey,\n selectedNewKeyOption,\n newKeySchema,\n newKeyNormalizedType,\n newKeyTypeLabel,\n newKeyEnumOptions,\n };\n};\n"],"names":[],"mappings":";;;AAwBO,MAAM,kBAAkB,CAAC;AAAA,EAC9B,IAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,KAA2B;AACzB,EAAA,MAAM,iBAAA,GAAoB,QAAQ,MAAM;AACtC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,MAAM,MAAA,GAAU,IAAA,CAAK,0BAAA,GAA6B,QAAQ,KACxD,EAAC;AACH,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,QAAA,EAAU,IAAA,CAAK,0BAA0B,CAAC,CAAA;AAE9C,EAAA,MAAM,kBAAA,GAAqB,QAA6B,MAAM;AAC5D,IAAA,OAAO,MAAA,CAAO,QAAQ,iBAAiB,CAAA,CAAE,IAAI,CAAC,CAAC,GAAA,EAAK,MAAM,CAAA,KAAM;AAC9D,MAAA,MAAM,UAAA,GAAa,oBAAoB,MAAM,CAAA;AAC7C,MAAA,MAAM,KAAA,GAAQ,eAAe,MAAM,CAAA;AACnC,MAAA,OAAO;AAAA,QACL,GAAA;AAAA,QACA,OAAO,KAAA,GAAQ,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAA,GAAM,GAAA;AAAA,QACrC,MAAA;AAAA,QACA,IAAA,EAAM;AAAA,OACR;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,iBAAiB,CAAC,CAAA;AAEtB,EAAA,MAAM,YAAA,GAAe,OAAA;AAAA,IACnB,MAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,IAAS,EAAE,CAAA;AAAA,IACrC,CAAC,KAAK,KAAK;AAAA,GACb;AACA,EAAA,MAAM,aAAA,GAAgB,OAAA;AAAA,IACpB,MAAM,IAAI,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,CAAC,CAAC,GAAG,CAAA,KAAM,GAAG,CAAC,CAAA;AAAA,IAC9C,CAAC,YAAY;AAAA,GACf;AACA,EAAA,MAAM,qBAAA,GAAwB,OAAA;AAAA,IAC5B,MAAM,kBAAA,CAAmB,MAAA,CAAO,CAAC,MAAA,KAAW,CAAC,aAAA,CAAc,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,IAC1E,CAAC,oBAAoB,aAAa;AAAA,GACpC;AACA,EAAA,MAAM,aAAA,GAAgB,OAAO,IAAA,EAAK;AAClC,EAAA,MAAM,oBAAA,GAAuB,OAAA;AAAA,IAC3B,MACE,sBAAsB,IAAA,CAAK,CAAC,WAAW,MAAA,CAAO,GAAA,KAAQ,aAAa,CAAA,IACnE,IAAA;AAAA,IACF,CAAC,uBAAuB,aAAa;AAAA,GACvC;AAEA,EAAA,MAAM,eACJ,oBAAA,EAAsB,MAAA,KACrB,aAAA,GAAgB,iBAAA,GAAoB,aAAa,CAAA,GAAI,MAAA,CAAA;AACxD,EAAA,MAAM,oBAAA,GAAuB,oBAAoB,YAAY,CAAA;AAC7D,EAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,YAAY,CAAA,IAAK,QAAA;AACxD,EAAA,MAAM,iBAAA,GAAoB,mBAAmB,YAAY,CAAA;AAEzD,EAAA,OAAO;AAAA,IACL,iBAAA;AAAA,IACA,kBAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,qBAAA;AAAA,IACA,aAAA;AAAA,IACA,oBAAA;AAAA,IACA,YAAA;AAAA,IACA,oBAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import Popper from '@material-ui/core/Popper';
|
|
3
|
+
|
|
4
|
+
const AutoWidthPopper = (props) => {
|
|
5
|
+
const { style, anchorEl, ...restProps } = props;
|
|
6
|
+
const anchorWidth = anchorEl && "clientWidth" in anchorEl ? anchorEl.clientWidth : void 0;
|
|
7
|
+
return /* @__PURE__ */ jsx(
|
|
8
|
+
Popper,
|
|
9
|
+
{
|
|
10
|
+
...restProps,
|
|
11
|
+
anchorEl,
|
|
12
|
+
style: {
|
|
13
|
+
...style,
|
|
14
|
+
width: "auto",
|
|
15
|
+
minWidth: anchorWidth ?? style?.minWidth
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
);
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export { AutoWidthPopper };
|
|
22
|
+
//# sourceMappingURL=AutoWidthPopper.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AutoWidthPopper.esm.js","sources":["../../../../src/components/Nodes/common/AutoWidthPopper.tsx"],"sourcesContent":["import Popper from \"@material-ui/core/Popper\";\nimport type { PopperProps } from \"@material-ui/core/Popper\";\n\n// Popper that allows Autocomplete dropdowns to expand beyond the input width while\n// keeping a minimum width equal to the anchor element.\nexport const AutoWidthPopper = (props: PopperProps) => {\n const { style, anchorEl, ...restProps } = props;\n\n const anchorWidth =\n anchorEl && \"clientWidth\" in anchorEl\n ? (anchorEl as HTMLElement).clientWidth\n : undefined;\n\n return (\n <Popper\n {...restProps}\n anchorEl={anchorEl}\n style={{\n ...style,\n width: \"auto\",\n minWidth: anchorWidth ?? style?.minWidth,\n }}\n />\n );\n};\n"],"names":[],"mappings":";;;AAKO,MAAM,eAAA,GAAkB,CAAC,KAAA,KAAuB;AACrD,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAU,GAAG,WAAU,GAAI,KAAA;AAE1C,EAAA,MAAM,WAAA,GACJ,QAAA,IAAY,aAAA,IAAiB,QAAA,GACxB,SAAyB,WAAA,GAC1B,MAAA;AAEN,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACE,GAAG,SAAA;AAAA,MACJ,QAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,KAAA,EAAO,MAAA;AAAA,QACP,QAAA,EAAU,eAAe,KAAA,EAAO;AAAA;AAClC;AAAA,GACF;AAEJ;;;;"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
const createStopNodeInteraction = () => ({
|
|
2
|
+
onPointerDown: (event) => event.stopPropagation(),
|
|
3
|
+
onKeyDown: (event) => event.stopPropagation(),
|
|
4
|
+
className: "nodrag nowheel",
|
|
5
|
+
inputProps: { "data-nodrag": true }
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
export { createStopNodeInteraction };
|
|
9
|
+
//# sourceMappingURL=nodeInteraction.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodeInteraction.esm.js","sources":["../../../../src/components/Nodes/common/nodeInteraction.ts"],"sourcesContent":["import type { KeyboardEvent, SyntheticEvent } from \"react\";\n\nexport type StopNodeInteraction = {\n onPointerDown: (event: SyntheticEvent) => void;\n onKeyDown: (event: KeyboardEvent) => void;\n className: string;\n inputProps: { [key: string]: unknown };\n};\n\nexport const createStopNodeInteraction = (): StopNodeInteraction => ({\n onPointerDown: (event: SyntheticEvent) => event.stopPropagation(),\n onKeyDown: (event: KeyboardEvent) => event.stopPropagation(),\n className: \"nodrag nowheel\",\n inputProps: { \"data-nodrag\": true },\n});\n"],"names":[],"mappings":"AASO,MAAM,4BAA4B,OAA4B;AAAA,EACnE,aAAA,EAAe,CAAC,KAAA,KAA0B,KAAA,CAAM,eAAA,EAAgB;AAAA,EAChE,SAAA,EAAW,CAAC,KAAA,KAAyB,KAAA,CAAM,eAAA,EAAgB;AAAA,EAC3D,SAAA,EAAW,gBAAA;AAAA,EACX,UAAA,EAAY,EAAE,aAAA,EAAe,IAAA;AAC/B,CAAA;;;;"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { useState, useMemo, useCallback } from 'react';
|
|
2
|
+
|
|
3
|
+
const BUILTIN_KEYS = /* @__PURE__ */ new Set(["links", "text"]);
|
|
4
|
+
const useOutputController = (data) => {
|
|
5
|
+
const { rfId, output } = data;
|
|
6
|
+
const [newCustomKey, setNewCustomKey] = useState("");
|
|
7
|
+
const [newCustomValue, setNewCustomValue] = useState("");
|
|
8
|
+
const stepOutputReferences = useMemo(
|
|
9
|
+
() => data.stepOutputReferences ?? [],
|
|
10
|
+
[data.stepOutputReferences]
|
|
11
|
+
);
|
|
12
|
+
const referenceOptions = useMemo(
|
|
13
|
+
() => Array.from(new Set(stepOutputReferences.filter(Boolean))),
|
|
14
|
+
[stepOutputReferences]
|
|
15
|
+
);
|
|
16
|
+
const links = useMemo(
|
|
17
|
+
() => Array.isArray(output?.links) ? [...output.links] : [],
|
|
18
|
+
[output?.links]
|
|
19
|
+
);
|
|
20
|
+
const textEntries = useMemo(
|
|
21
|
+
() => Array.isArray(output?.text) ? [...output.text] : [],
|
|
22
|
+
[output?.text]
|
|
23
|
+
);
|
|
24
|
+
const customEntries = useMemo(() => {
|
|
25
|
+
if (!output || typeof output !== "object") {
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
return Object.entries(output).filter(([key]) => !BUILTIN_KEYS.has(key));
|
|
29
|
+
}, [output]);
|
|
30
|
+
const updateOutput = useCallback(
|
|
31
|
+
(updater) => {
|
|
32
|
+
data.onUpdateOutput?.(rfId, updater);
|
|
33
|
+
},
|
|
34
|
+
[data, rfId]
|
|
35
|
+
);
|
|
36
|
+
const handleCustomValueChange = useCallback(
|
|
37
|
+
(key) => (event) => {
|
|
38
|
+
const raw = event.target.value;
|
|
39
|
+
updateOutput((prev) => ({
|
|
40
|
+
...prev ?? {},
|
|
41
|
+
[key]: raw
|
|
42
|
+
}));
|
|
43
|
+
},
|
|
44
|
+
[updateOutput]
|
|
45
|
+
);
|
|
46
|
+
const handleRemoveCustom = useCallback(
|
|
47
|
+
(key) => {
|
|
48
|
+
updateOutput((prev) => {
|
|
49
|
+
const next = { ...prev ?? {} };
|
|
50
|
+
delete next[key];
|
|
51
|
+
return next;
|
|
52
|
+
});
|
|
53
|
+
},
|
|
54
|
+
[updateOutput]
|
|
55
|
+
);
|
|
56
|
+
const handleAddCustom = useCallback(() => {
|
|
57
|
+
const trimmedKey = newCustomKey.trim();
|
|
58
|
+
if (!trimmedKey || BUILTIN_KEYS.has(trimmedKey)) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
updateOutput((prev) => {
|
|
62
|
+
if (prev && Object.prototype.hasOwnProperty.call(prev, trimmedKey)) {
|
|
63
|
+
return prev;
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
...prev ?? {},
|
|
67
|
+
[trimmedKey]: newCustomValue
|
|
68
|
+
};
|
|
69
|
+
});
|
|
70
|
+
setNewCustomKey("");
|
|
71
|
+
setNewCustomValue("");
|
|
72
|
+
}, [newCustomKey, newCustomValue, updateOutput]);
|
|
73
|
+
const setLinkFieldValue = useCallback(
|
|
74
|
+
(index, field, value) => {
|
|
75
|
+
const normalized = value ?? "";
|
|
76
|
+
updateOutput((prev) => {
|
|
77
|
+
const currentLinks = Array.isArray(prev?.links) ? [...prev.links] : [];
|
|
78
|
+
const target = { ...currentLinks[index] ?? {} };
|
|
79
|
+
target[field] = normalized;
|
|
80
|
+
currentLinks[index] = target;
|
|
81
|
+
return { ...prev ?? {}, links: currentLinks };
|
|
82
|
+
});
|
|
83
|
+
},
|
|
84
|
+
[updateOutput]
|
|
85
|
+
);
|
|
86
|
+
const handleLinkChange = useCallback(
|
|
87
|
+
(index, field) => (event) => {
|
|
88
|
+
setLinkFieldValue(index, field, event.target.value);
|
|
89
|
+
},
|
|
90
|
+
[setLinkFieldValue]
|
|
91
|
+
);
|
|
92
|
+
const handleRemoveLink = useCallback(
|
|
93
|
+
(index) => {
|
|
94
|
+
updateOutput((prev) => {
|
|
95
|
+
const currentLinks = Array.isArray(prev?.links) ? [...prev.links] : [];
|
|
96
|
+
currentLinks.splice(index, 1);
|
|
97
|
+
if (!currentLinks.length) {
|
|
98
|
+
const { links: _omit, ...rest } = prev ?? {};
|
|
99
|
+
return rest;
|
|
100
|
+
}
|
|
101
|
+
return { ...prev ?? {}, links: currentLinks };
|
|
102
|
+
});
|
|
103
|
+
},
|
|
104
|
+
[updateOutput]
|
|
105
|
+
);
|
|
106
|
+
const handleAddLink = useCallback(() => {
|
|
107
|
+
updateOutput((prev) => {
|
|
108
|
+
const currentLinks = Array.isArray(prev?.links) ? [...prev.links] : [];
|
|
109
|
+
currentLinks.push({ title: "", url: "" });
|
|
110
|
+
return { ...prev ?? {}, links: currentLinks };
|
|
111
|
+
});
|
|
112
|
+
}, [updateOutput]);
|
|
113
|
+
const setTextFieldValue = useCallback(
|
|
114
|
+
(index, field, value) => {
|
|
115
|
+
const normalized = value ?? "";
|
|
116
|
+
updateOutput((prev) => {
|
|
117
|
+
const currentText = Array.isArray(prev?.text) ? [...prev.text] : [];
|
|
118
|
+
const target = { ...currentText[index] ?? {} };
|
|
119
|
+
target[field] = normalized;
|
|
120
|
+
currentText[index] = target;
|
|
121
|
+
return { ...prev ?? {}, text: currentText };
|
|
122
|
+
});
|
|
123
|
+
},
|
|
124
|
+
[updateOutput]
|
|
125
|
+
);
|
|
126
|
+
const handleTextChange = useCallback(
|
|
127
|
+
(index, field) => (event) => {
|
|
128
|
+
setTextFieldValue(index, field, event.target.value);
|
|
129
|
+
},
|
|
130
|
+
[setTextFieldValue]
|
|
131
|
+
);
|
|
132
|
+
const handleTextDefaultToggle = useCallback(
|
|
133
|
+
(index) => {
|
|
134
|
+
updateOutput((prev) => {
|
|
135
|
+
const currentText = Array.isArray(prev?.text) ? [...prev.text] : [];
|
|
136
|
+
const target = { ...currentText[index] ?? {} };
|
|
137
|
+
target.default = !target.default;
|
|
138
|
+
currentText[index] = target;
|
|
139
|
+
return { ...prev ?? {}, text: currentText };
|
|
140
|
+
});
|
|
141
|
+
},
|
|
142
|
+
[updateOutput]
|
|
143
|
+
);
|
|
144
|
+
const handleRemoveText = useCallback(
|
|
145
|
+
(index) => {
|
|
146
|
+
updateOutput((prev) => {
|
|
147
|
+
const currentText = Array.isArray(prev?.text) ? [...prev.text] : [];
|
|
148
|
+
currentText.splice(index, 1);
|
|
149
|
+
if (!currentText.length) {
|
|
150
|
+
const { text: _omit, ...rest } = prev ?? {};
|
|
151
|
+
return rest;
|
|
152
|
+
}
|
|
153
|
+
return { ...prev ?? {}, text: currentText };
|
|
154
|
+
});
|
|
155
|
+
},
|
|
156
|
+
[updateOutput]
|
|
157
|
+
);
|
|
158
|
+
const handleAddText = useCallback(() => {
|
|
159
|
+
updateOutput((prev) => {
|
|
160
|
+
const currentText = Array.isArray(prev?.text) ? [...prev.text] : [];
|
|
161
|
+
currentText.push({ title: "", content: "" });
|
|
162
|
+
return { ...prev ?? {}, text: currentText };
|
|
163
|
+
});
|
|
164
|
+
}, [updateOutput]);
|
|
165
|
+
return {
|
|
166
|
+
stepOutputReferences,
|
|
167
|
+
referenceOptions,
|
|
168
|
+
links,
|
|
169
|
+
textEntries,
|
|
170
|
+
customEntries,
|
|
171
|
+
newCustomKey,
|
|
172
|
+
setNewCustomKey,
|
|
173
|
+
newCustomValue,
|
|
174
|
+
setNewCustomValue,
|
|
175
|
+
handleAddCustom,
|
|
176
|
+
handleCustomValueChange,
|
|
177
|
+
handleRemoveCustom,
|
|
178
|
+
setLinkFieldValue,
|
|
179
|
+
handleLinkChange,
|
|
180
|
+
handleAddLink,
|
|
181
|
+
handleRemoveLink,
|
|
182
|
+
setTextFieldValue,
|
|
183
|
+
handleTextChange,
|
|
184
|
+
handleTextDefaultToggle,
|
|
185
|
+
handleAddText,
|
|
186
|
+
handleRemoveText
|
|
187
|
+
};
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
export { useOutputController };
|
|
191
|
+
//# sourceMappingURL=useOutputController.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useOutputController.esm.js","sources":["../../../../src/components/Nodes/output/useOutputController.ts"],"sourcesContent":["import { useCallback, useMemo, useState } from \"react\";\nimport type { ChangeEvent } from \"react\";\nimport type { OutputNodeData } from \"../types\";\n\nconst BUILTIN_KEYS = new Set([\"links\", \"text\"]);\n\ntype LinkField = \"title\" | \"icon\" | \"url\" | \"entityRef\";\ntype TextField = \"title\" | \"icon\" | \"content\";\n\ntype UpdateFn<T> = (index: number, field: T, value: string) => void;\n\nexport const useOutputController = (data: OutputNodeData) => {\n const { rfId, output } = data;\n const [newCustomKey, setNewCustomKey] = useState(\"\");\n const [newCustomValue, setNewCustomValue] = useState(\"\");\n\n const stepOutputReferences = useMemo(\n () => data.stepOutputReferences ?? [],\n [data.stepOutputReferences]\n );\n const referenceOptions = useMemo(\n () => Array.from(new Set(stepOutputReferences.filter(Boolean))),\n [stepOutputReferences]\n );\n\n const links = useMemo(\n () => (Array.isArray(output?.links) ? [...output.links] : []),\n [output?.links]\n );\n const textEntries = useMemo(\n () => (Array.isArray(output?.text) ? [...output.text] : []),\n [output?.text]\n );\n const customEntries = useMemo(() => {\n if (!output || typeof output !== \"object\") {\n return [] as Array<[string, unknown]>;\n }\n return Object.entries(output).filter(([key]) => !BUILTIN_KEYS.has(key));\n }, [output]);\n\n const updateOutput = useCallback(\n (\n updater: (prev: OutputNodeData[\"output\"]) => OutputNodeData[\"output\"]\n ): void => {\n data.onUpdateOutput?.(rfId, updater);\n },\n [data, rfId]\n );\n\n const handleCustomValueChange = useCallback(\n (key: string) => (event: ChangeEvent<HTMLInputElement>) => {\n const raw = event.target.value;\n updateOutput((prev) => ({\n ...(prev ?? {}),\n [key]: raw,\n }));\n },\n [updateOutput]\n );\n\n const handleRemoveCustom = useCallback(\n (key: string) => {\n updateOutput((prev) => {\n const next = { ...(prev ?? {}) };\n delete next[key];\n return next;\n });\n },\n [updateOutput]\n );\n\n const handleAddCustom = useCallback(() => {\n const trimmedKey = newCustomKey.trim();\n if (!trimmedKey || BUILTIN_KEYS.has(trimmedKey)) {\n return;\n }\n updateOutput((prev) => {\n if (prev && Object.prototype.hasOwnProperty.call(prev, trimmedKey)) {\n return prev;\n }\n return {\n ...(prev ?? {}),\n [trimmedKey]: newCustomValue,\n };\n });\n setNewCustomKey(\"\");\n setNewCustomValue(\"\");\n }, [newCustomKey, newCustomValue, updateOutput]);\n\n const setLinkFieldValue = useCallback<UpdateFn<LinkField>>(\n (index, field, value) => {\n const normalized = value ?? \"\";\n updateOutput((prev) => {\n const currentLinks = Array.isArray(prev?.links) ? [...prev.links] : [];\n const target = { ...(currentLinks[index] ?? {}) };\n target[field] = normalized;\n currentLinks[index] = target;\n return { ...(prev ?? {}), links: currentLinks };\n });\n },\n [updateOutput]\n );\n\n const handleLinkChange = useCallback(\n (index: number, field: LinkField) =>\n (event: ChangeEvent<HTMLInputElement>) => {\n setLinkFieldValue(index, field, event.target.value);\n },\n [setLinkFieldValue]\n );\n\n const handleRemoveLink = useCallback(\n (index: number) => {\n updateOutput((prev) => {\n const currentLinks = Array.isArray(prev?.links) ? [...prev.links] : [];\n currentLinks.splice(index, 1);\n if (!currentLinks.length) {\n const { links: _omit, ...rest } = prev ?? {};\n return rest;\n }\n return { ...(prev ?? {}), links: currentLinks };\n });\n },\n [updateOutput]\n );\n\n const handleAddLink = useCallback(() => {\n updateOutput((prev) => {\n const currentLinks = Array.isArray(prev?.links) ? [...prev.links] : [];\n currentLinks.push({ title: \"\", url: \"\" });\n return { ...(prev ?? {}), links: currentLinks };\n });\n }, [updateOutput]);\n\n const setTextFieldValue = useCallback<UpdateFn<TextField>>(\n (index, field, value) => {\n const normalized = value ?? \"\";\n updateOutput((prev) => {\n const currentText = Array.isArray(prev?.text) ? [...prev.text] : [];\n const target = { ...(currentText[index] ?? {}) };\n target[field] = normalized;\n currentText[index] = target;\n return { ...(prev ?? {}), text: currentText };\n });\n },\n [updateOutput]\n );\n\n const handleTextChange = useCallback(\n (index: number, field: TextField) =>\n (event: ChangeEvent<HTMLInputElement>) => {\n setTextFieldValue(index, field, event.target.value);\n },\n [setTextFieldValue]\n );\n\n const handleTextDefaultToggle = useCallback(\n (index: number) => {\n updateOutput((prev) => {\n const currentText = Array.isArray(prev?.text) ? [...prev.text] : [];\n const target = { ...(currentText[index] ?? {}) };\n target.default = !target.default;\n currentText[index] = target;\n return { ...(prev ?? {}), text: currentText };\n });\n },\n [updateOutput]\n );\n\n const handleRemoveText = useCallback(\n (index: number) => {\n updateOutput((prev) => {\n const currentText = Array.isArray(prev?.text) ? [...prev.text] : [];\n currentText.splice(index, 1);\n if (!currentText.length) {\n const { text: _omit, ...rest } = prev ?? {};\n return rest;\n }\n return { ...(prev ?? {}), text: currentText };\n });\n },\n [updateOutput]\n );\n\n const handleAddText = useCallback(() => {\n updateOutput((prev) => {\n const currentText = Array.isArray(prev?.text) ? [...prev.text] : [];\n currentText.push({ title: \"\", content: \"\" });\n return { ...(prev ?? {}), text: currentText };\n });\n }, [updateOutput]);\n\n return {\n stepOutputReferences,\n referenceOptions,\n links,\n textEntries,\n customEntries,\n newCustomKey,\n setNewCustomKey,\n newCustomValue,\n setNewCustomValue,\n handleAddCustom,\n handleCustomValueChange,\n handleRemoveCustom,\n setLinkFieldValue,\n handleLinkChange,\n handleAddLink,\n handleRemoveLink,\n setTextFieldValue,\n handleTextChange,\n handleTextDefaultToggle,\n handleAddText,\n handleRemoveText,\n };\n};\n"],"names":[],"mappings":"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"}
|