@tduniec/plugin-template-designer-foundation 0.1.1
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/CHANGELOG.md +13 -0
- package/README.md +13 -0
- package/dist/api/useScaffolderActions.esm.js +59 -0
- package/dist/api/useScaffolderActions.esm.js.map +1 -0
- package/dist/components/FieldEditorDialog.esm.js +55 -0
- package/dist/components/FieldEditorDialog.esm.js.map +1 -0
- package/dist/components/Nodes/ActionNode.esm.js +613 -0
- package/dist/components/Nodes/ActionNode.esm.js.map +1 -0
- package/dist/components/Nodes/OutputNode.esm.js +373 -0
- package/dist/components/Nodes/OutputNode.esm.js.map +1 -0
- package/dist/components/Nodes/ParameterInputNode.esm.js +320 -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 +147 -0
- package/dist/components/Nodes/ParametersNode.esm.js.map +1 -0
- package/dist/components/Nodes/action/schema.esm.js +68 -0
- package/dist/components/Nodes/action/schema.esm.js.map +1 -0
- package/dist/components/Nodes/action/useActionInputs.esm.js +71 -0
- package/dist/components/Nodes/action/useActionInputs.esm.js.map +1 -0
- package/dist/components/Nodes/common/AutoWidthPopper.esm.js +11 -0
- package/dist/components/Nodes/common/AutoWidthPopper.esm.js.map +1 -0
- package/dist/components/Nodes/common/nodeInteraction.esm.js +20 -0
- package/dist/components/Nodes/common/nodeInteraction.esm.js.map +1 -0
- package/dist/components/Nodes/output/useOutputController.esm.js +125 -0
- package/dist/components/Nodes/output/useOutputController.esm.js.map +1 -0
- package/dist/components/TemplateDesigner/TemplateLanding.esm.js +157 -0
- package/dist/components/TemplateDesigner/TemplateLanding.esm.js.map +1 -0
- package/dist/components/TemplateDesigner/TemplateWorkspace.esm.js +416 -0
- package/dist/components/TemplateDesigner/TemplateWorkspace.esm.js.map +1 -0
- package/dist/components/TemplateDesigner/codemirrorTheme.esm.js +30 -0
- package/dist/components/TemplateDesigner/codemirrorTheme.esm.js.map +1 -0
- package/dist/components/TemplateDesigner/useFieldEditor.esm.js +95 -0
- package/dist/components/TemplateDesigner/useFieldEditor.esm.js.map +1 -0
- package/dist/components/TemplateDesignerIcon.esm.js +33 -0
- package/dist/components/TemplateDesignerIcon.esm.js.map +1 -0
- package/dist/components/designerFlowConfig.esm.js +13 -0
- package/dist/components/designerFlowConfig.esm.js.map +1 -0
- package/dist/designerFlow/DesignerFlow.esm.js +828 -0
- package/dist/designerFlow/DesignerFlow.esm.js.map +1 -0
- package/dist/designerFlow/handlers.esm.js +317 -0
- package/dist/designerFlow/handlers.esm.js.map +1 -0
- package/dist/designerFlow/model.esm.js +166 -0
- package/dist/designerFlow/model.esm.js.map +1 -0
- package/dist/designerFlow/nodeLayout.esm.js +108 -0
- package/dist/designerFlow/nodeLayout.esm.js.map +1 -0
- package/dist/designerFlow/parameterTransforms.esm.js +124 -0
- package/dist/designerFlow/parameterTransforms.esm.js.map +1 -0
- package/dist/designerFlow/utils/stableComparators.esm.js +69 -0
- package/dist/designerFlow/utils/stableComparators.esm.js.map +1 -0
- package/dist/foundation/actionNodeCustomization.esm.js +20 -0
- package/dist/foundation/actionNodeCustomization.esm.js.map +1 -0
- package/dist/foundation/actionNodeRegistry.esm.js +30 -0
- package/dist/foundation/actionNodeRegistry.esm.js.map +1 -0
- package/dist/foundation/featureFlags.esm.js +6 -0
- package/dist/foundation/featureFlags.esm.js.map +1 -0
- package/dist/foundation/templateSources.esm.js +16 -0
- package/dist/foundation/templateSources.esm.js.map +1 -0
- package/dist/index.d.ts +382 -0
- package/dist/index.esm.js +25 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/state/templateUtils.esm.js +46 -0
- package/dist/state/templateUtils.esm.js.map +1 -0
- package/dist/state/useParameterSections.esm.js +162 -0
- package/dist/state/useParameterSections.esm.js.map +1 -0
- package/dist/state/useTemplateState.esm.js +627 -0
- package/dist/state/useTemplateState.esm.js.map +1 -0
- package/dist/types/flowNodes.esm.js +8 -0
- package/dist/types/flowNodes.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/mocks/mocks.esm.js +120 -0
- package/dist/utils/mocks/mocks.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 +103 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { NodeToolbar, Position, Handle } from '@xyflow/react';
|
|
3
|
+
import { memo } from 'react';
|
|
4
|
+
import { styled, alpha, useTheme } from '@material-ui/core/styles';
|
|
5
|
+
import { Box, Typography, Chip, Button } from '@material-ui/core';
|
|
6
|
+
import SettingsIcon from '@material-ui/icons/Settings';
|
|
7
|
+
import AddIcon from '@material-ui/icons/Add';
|
|
8
|
+
import { createStopNodeInteraction } from './common/nodeInteraction.esm.js';
|
|
9
|
+
import { useParameterSectionsController } from '../../state/useParameterSections.esm.js';
|
|
10
|
+
import { ParameterTitlesNode } from './ParameterTitlesNode.esm.js';
|
|
11
|
+
|
|
12
|
+
const resolvePaletteMode = (theme) => theme.palette.mode ?? theme.palette.type ?? "light";
|
|
13
|
+
const Card = styled(Box)(({ theme }) => {
|
|
14
|
+
const paletteMode = resolvePaletteMode(theme);
|
|
15
|
+
return {
|
|
16
|
+
position: "relative",
|
|
17
|
+
background: alpha(
|
|
18
|
+
theme.palette.warning.main,
|
|
19
|
+
paletteMode === "dark" ? 0.18 : 0.12
|
|
20
|
+
),
|
|
21
|
+
border: `1px solid ${alpha(theme.palette.warning.main, 0.35)}`,
|
|
22
|
+
borderRadius: 12,
|
|
23
|
+
width: 760,
|
|
24
|
+
padding: theme.spacing(1.5),
|
|
25
|
+
boxShadow: theme.shadows[2],
|
|
26
|
+
color: theme.palette.text.primary,
|
|
27
|
+
overflow: "hidden",
|
|
28
|
+
"&::before": {
|
|
29
|
+
content: '""',
|
|
30
|
+
position: "absolute",
|
|
31
|
+
inset: 0,
|
|
32
|
+
background: `linear-gradient(135deg, ${alpha(
|
|
33
|
+
theme.palette.warning.light,
|
|
34
|
+
paletteMode === "dark" ? 0.28 : 0.18
|
|
35
|
+
)}, transparent 65%)`,
|
|
36
|
+
pointerEvents: "none",
|
|
37
|
+
zIndex: 0
|
|
38
|
+
},
|
|
39
|
+
"& > *": {
|
|
40
|
+
position: "relative",
|
|
41
|
+
zIndex: 1
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
});
|
|
45
|
+
const Header = styled(Box)(({ theme }) => {
|
|
46
|
+
const paletteMode = resolvePaletteMode(theme);
|
|
47
|
+
return {
|
|
48
|
+
display: "flex",
|
|
49
|
+
alignItems: "center",
|
|
50
|
+
justifyContent: "space-between",
|
|
51
|
+
padding: theme.spacing(1),
|
|
52
|
+
marginBottom: theme.spacing(1),
|
|
53
|
+
borderRadius: 8,
|
|
54
|
+
backgroundColor: alpha(
|
|
55
|
+
theme.palette.warning.main,
|
|
56
|
+
paletteMode === "dark" ? 0.24 : 0.14
|
|
57
|
+
),
|
|
58
|
+
border: `1px solid ${alpha(theme.palette.warning.main, 0.4)}`
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
const ParametersNodeComponent = ({
|
|
62
|
+
data
|
|
63
|
+
}) => {
|
|
64
|
+
if (process.env.NODE_ENV === "development") {
|
|
65
|
+
console.debug("[DesignerFlow] render ParametersNode", data.rfId);
|
|
66
|
+
}
|
|
67
|
+
const theme = useTheme();
|
|
68
|
+
const paletteMode = resolvePaletteMode(theme);
|
|
69
|
+
const {
|
|
70
|
+
sections,
|
|
71
|
+
handleSectionUpdate,
|
|
72
|
+
handleFieldUpdate,
|
|
73
|
+
handleAddSection,
|
|
74
|
+
handleMoveSection,
|
|
75
|
+
handleAddField,
|
|
76
|
+
handleMoveField
|
|
77
|
+
} = useParameterSectionsController(data);
|
|
78
|
+
const stopAll = createStopNodeInteraction();
|
|
79
|
+
return /* @__PURE__ */ jsxs(Card, { children: [
|
|
80
|
+
/* @__PURE__ */ jsxs(Header, { children: [
|
|
81
|
+
/* @__PURE__ */ jsxs(
|
|
82
|
+
Box,
|
|
83
|
+
{
|
|
84
|
+
display: "flex",
|
|
85
|
+
alignItems: "center",
|
|
86
|
+
style: { gap: theme.spacing(1) },
|
|
87
|
+
children: [
|
|
88
|
+
/* @__PURE__ */ jsx(
|
|
89
|
+
SettingsIcon,
|
|
90
|
+
{
|
|
91
|
+
fontSize: "small",
|
|
92
|
+
htmlColor: theme.palette.warning.dark
|
|
93
|
+
}
|
|
94
|
+
),
|
|
95
|
+
/* @__PURE__ */ jsx(Typography, { variant: "subtitle2", noWrap: true, children: "Parameters" })
|
|
96
|
+
]
|
|
97
|
+
}
|
|
98
|
+
),
|
|
99
|
+
/* @__PURE__ */ jsx(
|
|
100
|
+
Chip,
|
|
101
|
+
{
|
|
102
|
+
size: "small",
|
|
103
|
+
variant: "outlined",
|
|
104
|
+
label: "parameters",
|
|
105
|
+
style: {
|
|
106
|
+
borderColor: theme.palette.warning.dark,
|
|
107
|
+
color: paletteMode === "dark" ? theme.palette.warning.light : theme.palette.warning.dark,
|
|
108
|
+
textTransform: "uppercase"
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
)
|
|
112
|
+
] }),
|
|
113
|
+
/* @__PURE__ */ jsx(Box, { mt: 2, children: /* @__PURE__ */ jsx(
|
|
114
|
+
ParameterTitlesNode,
|
|
115
|
+
{
|
|
116
|
+
sections,
|
|
117
|
+
onSectionUpdate: handleSectionUpdate,
|
|
118
|
+
onFieldUpdate: handleFieldUpdate,
|
|
119
|
+
onAddSection: handleAddSection,
|
|
120
|
+
onMoveSection: handleMoveSection,
|
|
121
|
+
onAddField: handleAddField,
|
|
122
|
+
onMoveField: handleMoveField
|
|
123
|
+
}
|
|
124
|
+
) }),
|
|
125
|
+
/* @__PURE__ */ jsx(NodeToolbar, { position: Position.Bottom, children: /* @__PURE__ */ jsx(
|
|
126
|
+
Button,
|
|
127
|
+
{
|
|
128
|
+
variant: "outlined",
|
|
129
|
+
size: "small",
|
|
130
|
+
startIcon: /* @__PURE__ */ jsx(AddIcon, { fontSize: "small" }),
|
|
131
|
+
onClick: () => data.onAddNode?.({
|
|
132
|
+
afterRfId: data.rfId,
|
|
133
|
+
type: "actionNode"
|
|
134
|
+
}),
|
|
135
|
+
className: "nodrag nowheel",
|
|
136
|
+
onPointerDown: stopAll.onPointerDown,
|
|
137
|
+
onKeyDown: stopAll.onKeyDown,
|
|
138
|
+
children: "Add First Action"
|
|
139
|
+
}
|
|
140
|
+
) }),
|
|
141
|
+
/* @__PURE__ */ jsx(Handle, { type: "source", position: Position.Bottom })
|
|
142
|
+
] });
|
|
143
|
+
};
|
|
144
|
+
const ParametersNode = memo(ParametersNodeComponent);
|
|
145
|
+
|
|
146
|
+
export { ParametersNode };
|
|
147
|
+
//# sourceMappingURL=ParametersNode.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ParametersNode.esm.js","sources":["../../../src/components/Nodes/ParametersNode.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { Handle, NodeToolbar, Position } from \"@xyflow/react\";\nimport { memo } from \"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/flowNodes\";\nimport { createStopNodeInteraction } from \"./common/nodeInteraction\";\nimport { useParameterSectionsController } from \"../../state/useParameterSections\";\nimport { ParameterTitlesNode } from \"./ParameterTitlesNode\";\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\nconst ParametersNodeComponent: FC<{ data: ParametersNodeData }> = ({\n data,\n}) => {\n if (process.env.NODE_ENV === \"development\") {\n // Quick dev-only visibility into unnecessary renders per node.\n // eslint-disable-next-line no-console\n console.debug(\"[DesignerFlow] render ParametersNode\", data.rfId);\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\nexport const ParametersNode = memo(ParametersNodeComponent);\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
const normalizeSchemaType = (schema, value) => {
|
|
2
|
+
const explicitType = typeof schema === "object" ? schema?.type : void 0;
|
|
3
|
+
if (explicitType === "string") return "string";
|
|
4
|
+
if (explicitType === "number") return "number";
|
|
5
|
+
if (explicitType === "integer") return "integer";
|
|
6
|
+
if (explicitType === "boolean") return "boolean";
|
|
7
|
+
if (explicitType === "array") return "array";
|
|
8
|
+
if (explicitType === "object") return "object";
|
|
9
|
+
const inferredType = typeof value;
|
|
10
|
+
if (inferredType === "string") return "string";
|
|
11
|
+
if (inferredType === "number") return "number";
|
|
12
|
+
if (Array.isArray(value)) return "array";
|
|
13
|
+
if (value && typeof value === "object") return "object";
|
|
14
|
+
if (typeof value === "boolean") return "boolean";
|
|
15
|
+
return "unknown";
|
|
16
|
+
};
|
|
17
|
+
const buildTypeLabel = (schema) => {
|
|
18
|
+
if (!schema) {
|
|
19
|
+
return "";
|
|
20
|
+
}
|
|
21
|
+
if (schema.type) {
|
|
22
|
+
if (Array.isArray(schema.type)) {
|
|
23
|
+
return schema.type.join(" | ");
|
|
24
|
+
}
|
|
25
|
+
return String(schema.type);
|
|
26
|
+
}
|
|
27
|
+
return "";
|
|
28
|
+
};
|
|
29
|
+
const extractEnumOptions = (schema) => {
|
|
30
|
+
if (Array.isArray(schema?.enum)) {
|
|
31
|
+
return schema.enum.map((value) => typeof value === "string" ? value : null).filter(Boolean);
|
|
32
|
+
}
|
|
33
|
+
return [];
|
|
34
|
+
};
|
|
35
|
+
const coerceValueForType = (value, type) => {
|
|
36
|
+
if (type === "number" || type === "integer") {
|
|
37
|
+
const parsed = Number(value);
|
|
38
|
+
return Number.isNaN(parsed) ? value : parsed;
|
|
39
|
+
}
|
|
40
|
+
if (type === "boolean") {
|
|
41
|
+
if (value === "true") return true;
|
|
42
|
+
if (value === "false") return false;
|
|
43
|
+
}
|
|
44
|
+
if (type === "array" || type === "object") {
|
|
45
|
+
try {
|
|
46
|
+
return JSON.parse(value);
|
|
47
|
+
} catch {
|
|
48
|
+
return value;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return value;
|
|
52
|
+
};
|
|
53
|
+
const stringifyValueForDisplay = (value, type) => {
|
|
54
|
+
if (value === void 0 || value === null) {
|
|
55
|
+
return "";
|
|
56
|
+
}
|
|
57
|
+
if (type === "object" || type === "array") {
|
|
58
|
+
try {
|
|
59
|
+
return JSON.stringify(value, null, 2);
|
|
60
|
+
} catch {
|
|
61
|
+
return String(value);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return String(value);
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export { buildTypeLabel, coerceValueForType, extractEnumOptions, normalizeSchemaType, stringifyValueForDisplay };
|
|
68
|
+
//# 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 = Record<string, unknown>;\n\nexport type NormalizedSchemaType =\n | \"string\"\n | \"number\"\n | \"integer\"\n | \"boolean\"\n | \"array\"\n | \"object\"\n | \"unknown\";\n\nexport const normalizeSchemaType = (\n schema?: JsonSchemaProperty,\n value?: unknown\n): NormalizedSchemaType => {\n const explicitType = typeof schema === \"object\" ? schema?.type : undefined;\n if (explicitType === \"string\") return \"string\";\n if (explicitType === \"number\") return \"number\";\n if (explicitType === \"integer\") return \"integer\";\n if (explicitType === \"boolean\") return \"boolean\";\n if (explicitType === \"array\") return \"array\";\n if (explicitType === \"object\") return \"object\";\n\n const inferredType = typeof value;\n if (inferredType === \"string\") return \"string\";\n if (inferredType === \"number\") return \"number\";\n if (Array.isArray(value)) return \"array\";\n if (value && typeof value === \"object\") return \"object\";\n if (typeof value === \"boolean\") return \"boolean\";\n\n return \"unknown\";\n};\n\nexport const buildTypeLabel = (schema?: JsonSchemaProperty) => {\n if (!schema) {\n return \"\";\n }\n if (schema.type) {\n if (Array.isArray(schema.type)) {\n return schema.type.join(\" | \");\n }\n return String(schema.type);\n }\n return \"\";\n};\n\nexport const extractEnumOptions = (schema?: JsonSchemaProperty): string[] => {\n if (Array.isArray(schema?.enum)) {\n return schema.enum\n .map((value) => (typeof value === \"string\" ? value : null))\n .filter(Boolean) as string[];\n }\n return [];\n};\n\nexport const coerceValueForType = (\n value: string,\n type: NormalizedSchemaType\n): unknown => {\n if (type === \"number\" || type === \"integer\") {\n const parsed = Number(value);\n return Number.isNaN(parsed) ? value : parsed;\n }\n if (type === \"boolean\") {\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n }\n if (type === \"array\" || type === \"object\") {\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n }\n return value;\n};\n\nexport const stringifyValueForDisplay = (\n value: unknown,\n type: NormalizedSchemaType\n): string => {\n if (value === undefined || value === null) {\n return \"\";\n }\n if (type === \"object\" || type === \"array\") {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n }\n return String(value);\n};\n"],"names":[],"mappings":"AAWO,MAAM,mBAAA,GAAsB,CACjC,MAAA,EACA,KAAA,KACyB;AACzB,EAAA,MAAM,YAAA,GAAe,OAAO,MAAA,KAAW,QAAA,GAAW,QAAQ,IAAA,GAAO,MAAA;AACjE,EAAA,IAAI,YAAA,KAAiB,UAAU,OAAO,QAAA;AACtC,EAAA,IAAI,YAAA,KAAiB,UAAU,OAAO,QAAA;AACtC,EAAA,IAAI,YAAA,KAAiB,WAAW,OAAO,SAAA;AACvC,EAAA,IAAI,YAAA,KAAiB,WAAW,OAAO,SAAA;AACvC,EAAA,IAAI,YAAA,KAAiB,SAAS,OAAO,OAAA;AACrC,EAAA,IAAI,YAAA,KAAiB,UAAU,OAAO,QAAA;AAEtC,EAAA,MAAM,eAAe,OAAO,KAAA;AAC5B,EAAA,IAAI,YAAA,KAAiB,UAAU,OAAO,QAAA;AACtC,EAAA,IAAI,YAAA,KAAiB,UAAU,OAAO,QAAA;AACtC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,OAAA;AACjC,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,QAAA;AAC/C,EAAA,IAAI,OAAO,KAAA,KAAU,SAAA,EAAW,OAAO,SAAA;AAEvC,EAAA,OAAO,SAAA;AACT;AAEO,MAAM,cAAA,GAAiB,CAAC,MAAA,KAAgC;AAC7D,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,IAAA,EAAM;AACf,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,EAAG;AAC9B,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,IAC/B;AACA,IAAA,OAAO,MAAA,CAAO,OAAO,IAAI,CAAA;AAAA,EAC3B;AACA,EAAA,OAAO,EAAA;AACT;AAEO,MAAM,kBAAA,GAAqB,CAAC,MAAA,KAA0C;AAC3E,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAQ,IAAI,CAAA,EAAG;AAC/B,IAAA,OAAO,MAAA,CAAO,IAAA,CACX,GAAA,CAAI,CAAC,KAAA,KAAW,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,IAAK,CAAA,CACzD,MAAA,CAAO,OAAO,CAAA;AAAA,EACnB;AACA,EAAA,OAAO,EAAC;AACV;AAEO,MAAM,kBAAA,GAAqB,CAChC,KAAA,EACA,IAAA,KACY;AACZ,EAAA,IAAI,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,SAAA,EAAW;AAC3C,IAAA,MAAM,MAAA,GAAS,OAAO,KAAK,CAAA;AAC3B,IAAA,OAAO,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,GAAI,KAAA,GAAQ,MAAA;AAAA,EACxC;AACA,EAAA,IAAI,SAAS,SAAA,EAAW;AACtB,IAAA,IAAI,KAAA,KAAU,QAAQ,OAAO,IAAA;AAC7B,IAAA,IAAI,KAAA,KAAU,SAAS,OAAO,KAAA;AAAA,EAChC;AACA,EAAA,IAAI,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,QAAA,EAAU;AACzC,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,IACzB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEO,MAAM,wBAAA,GAA2B,CACtC,KAAA,EACA,IAAA,KACW;AACX,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,OAAA,EAAS;AACzC,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA;AAAA,IACtC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,OAAO,KAAK,CAAA;AAAA,IACrB;AAAA,EACF;AACA,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;;;;"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
import { actionNodeCustomizationRegistry } from '../../../foundation/actionNodeCustomization.esm.js';
|
|
3
|
+
import { normalizeSchemaType, buildTypeLabel, extractEnumOptions } from './schema.esm.js';
|
|
4
|
+
|
|
5
|
+
const useActionInputs = ({
|
|
6
|
+
data,
|
|
7
|
+
step,
|
|
8
|
+
actionId,
|
|
9
|
+
newKey
|
|
10
|
+
}) => {
|
|
11
|
+
const schemaDecorators = useMemo(
|
|
12
|
+
() => actionNodeCustomizationRegistry.getSchemaDecorators(),
|
|
13
|
+
[]
|
|
14
|
+
);
|
|
15
|
+
const actionInputSchema = useMemo(() => {
|
|
16
|
+
if (!actionId) {
|
|
17
|
+
return {};
|
|
18
|
+
}
|
|
19
|
+
const baseSchema = data.scaffolderActionInputsById?.[actionId] ?? {};
|
|
20
|
+
return schemaDecorators.reduce(
|
|
21
|
+
(acc, decorator) => decorator({ actionId, step, schema: acc }) ?? acc,
|
|
22
|
+
baseSchema
|
|
23
|
+
);
|
|
24
|
+
}, [actionId, data.scaffolderActionInputsById, schemaDecorators, step]);
|
|
25
|
+
const inputEntries = useMemo(() => {
|
|
26
|
+
const stepInput = step?.input ?? {};
|
|
27
|
+
return Object.entries(stepInput);
|
|
28
|
+
}, [step?.input]);
|
|
29
|
+
const usedInputKeys = useMemo(
|
|
30
|
+
() => new Set(inputEntries.map(([key]) => key)),
|
|
31
|
+
[inputEntries]
|
|
32
|
+
);
|
|
33
|
+
const missingRequiredInputKeys = useMemo(() => {
|
|
34
|
+
const requiredKeys = data.scaffolderActionInputRequiredById?.[actionId] ?? [];
|
|
35
|
+
return requiredKeys.filter((key) => !usedInputKeys.has(key));
|
|
36
|
+
}, [actionId, data.scaffolderActionInputRequiredById, usedInputKeys]);
|
|
37
|
+
const availableInputOptions = useMemo(() => {
|
|
38
|
+
const options = Object.entries(actionInputSchema ?? {}).filter(([key]) => !usedInputKeys.has(key)).map(([key, schema]) => {
|
|
39
|
+
const typedSchema = schema;
|
|
40
|
+
return {
|
|
41
|
+
key,
|
|
42
|
+
label: `${key} (${buildTypeLabel(typedSchema) || "string"})`,
|
|
43
|
+
schema: typedSchema,
|
|
44
|
+
type: normalizeSchemaType(typedSchema)
|
|
45
|
+
};
|
|
46
|
+
});
|
|
47
|
+
return options;
|
|
48
|
+
}, [actionInputSchema, usedInputKeys]);
|
|
49
|
+
const trimmedNewKey = newKey.trim();
|
|
50
|
+
const selectedNewKeyOption = availableInputOptions.find((opt) => opt.key === trimmedNewKey) ?? null;
|
|
51
|
+
const newKeyNormalizedType = normalizeSchemaType(
|
|
52
|
+
selectedNewKeyOption?.schema
|
|
53
|
+
);
|
|
54
|
+
const newKeyTypeLabel = buildTypeLabel(selectedNewKeyOption?.schema);
|
|
55
|
+
const newKeyEnumOptions = extractEnumOptions(selectedNewKeyOption?.schema);
|
|
56
|
+
return {
|
|
57
|
+
actionInputSchema,
|
|
58
|
+
inputEntries,
|
|
59
|
+
usedInputKeys,
|
|
60
|
+
missingRequiredInputKeys,
|
|
61
|
+
availableInputOptions,
|
|
62
|
+
trimmedNewKey,
|
|
63
|
+
selectedNewKeyOption,
|
|
64
|
+
newKeyNormalizedType,
|
|
65
|
+
newKeyTypeLabel,
|
|
66
|
+
newKeyEnumOptions
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
export { useActionInputs };
|
|
71
|
+
//# 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/flowNodes\";\nimport {\n actionNodeCustomizationRegistry,\n type ActionSchemaDecorator,\n} from \"../../../foundation/actionNodeCustomization\";\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 schemaDecorators = useMemo<ActionSchemaDecorator[]>(\n () => actionNodeCustomizationRegistry.getSchemaDecorators(),\n []\n );\n\n const actionInputSchema = useMemo(() => {\n if (!actionId) {\n return {} as Record<string, JsonSchemaProperty>;\n }\n const baseSchema = (data.scaffolderActionInputsById?.[actionId] ??\n {}) as Record<string, JsonSchemaProperty>;\n return schemaDecorators.reduce(\n (acc, decorator) => decorator({ actionId, step, schema: acc }) ?? acc,\n baseSchema\n );\n }, [actionId, data.scaffolderActionInputsById, schemaDecorators, step]);\n\n const inputEntries = useMemo(() => {\n const stepInput = step?.input ?? {};\n return Object.entries(stepInput);\n }, [step?.input]);\n\n const usedInputKeys = useMemo(\n () => new Set(inputEntries.map(([key]) => key)),\n [inputEntries]\n );\n\n const missingRequiredInputKeys = useMemo(() => {\n const requiredKeys =\n data.scaffolderActionInputRequiredById?.[actionId] ?? [];\n return requiredKeys.filter((key) => !usedInputKeys.has(key));\n }, [actionId, data.scaffolderActionInputRequiredById, usedInputKeys]);\n\n const availableInputOptions = useMemo<ActionInputOption[]>(() => {\n const options = Object.entries(actionInputSchema ?? {})\n .filter(([key]) => !usedInputKeys.has(key))\n .map(([key, schema]) => {\n const typedSchema = schema as JsonSchemaProperty | undefined;\n return {\n key,\n label: `${key} (${buildTypeLabel(typedSchema) || \"string\"})`,\n schema: typedSchema,\n type: normalizeSchemaType(typedSchema),\n };\n });\n return options;\n }, [actionInputSchema, usedInputKeys]);\n\n const trimmedNewKey = newKey.trim();\n const selectedNewKeyOption =\n availableInputOptions.find((opt) => opt.key === trimmedNewKey) ?? null;\n const newKeyNormalizedType = normalizeSchemaType(\n selectedNewKeyOption?.schema\n );\n const newKeyTypeLabel = buildTypeLabel(selectedNewKeyOption?.schema);\n const newKeyEnumOptions = extractEnumOptions(selectedNewKeyOption?.schema);\n\n return {\n actionInputSchema,\n inputEntries,\n usedInputKeys,\n missingRequiredInputKeys,\n availableInputOptions,\n trimmedNewKey,\n selectedNewKeyOption,\n newKeyNormalizedType,\n newKeyTypeLabel,\n newKeyEnumOptions,\n };\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { Popper } from '@material-ui/core';
|
|
3
|
+
|
|
4
|
+
const AutoWidthPopper = (props) => {
|
|
5
|
+
const { anchorEl } = props;
|
|
6
|
+
const width = anchorEl?.clientWidth ?? void 0;
|
|
7
|
+
return /* @__PURE__ */ jsx(Popper, { ...props, style: { width, ...props.style } });
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export { AutoWidthPopper };
|
|
11
|
+
//# 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\";\nimport type { PopperProps } from \"@material-ui/core\";\n\n// Popper that matches the width of the input for nicer Autocomplete menus.\nexport const AutoWidthPopper = (props: PopperProps) => {\n const { anchorEl } = props;\n const width = (anchorEl as HTMLElement | null)?.clientWidth ?? undefined;\n return <Popper {...props} style={{ width, ...props.style }} />;\n};\n"],"names":[],"mappings":";;;AAIO,MAAM,eAAA,GAAkB,CAAC,KAAA,KAAuB;AACrD,EAAA,MAAM,EAAE,UAAS,GAAI,KAAA;AACrB,EAAA,MAAM,KAAA,GAAS,UAAiC,WAAA,IAAe,MAAA;AAC/D,EAAA,uBAAO,GAAA,CAAC,MAAA,EAAA,EAAQ,GAAG,KAAA,EAAO,KAAA,EAAO,EAAE,KAAA,EAAO,GAAG,KAAA,CAAM,KAAA,EAAM,EAAG,CAAA;AAC9D;;;;"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const createStopNodeInteraction = () => ({
|
|
2
|
+
onPointerDown: (e) => {
|
|
3
|
+
e.stopPropagation();
|
|
4
|
+
},
|
|
5
|
+
onKeyDown: (e) => {
|
|
6
|
+
e.stopPropagation();
|
|
7
|
+
},
|
|
8
|
+
className: "nodrag nowheel",
|
|
9
|
+
inputProps: {
|
|
10
|
+
onPointerDown: (e) => {
|
|
11
|
+
e.stopPropagation();
|
|
12
|
+
},
|
|
13
|
+
onKeyDown: (e) => {
|
|
14
|
+
e.stopPropagation();
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
export { createStopNodeInteraction };
|
|
20
|
+
//# sourceMappingURL=nodeInteraction.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodeInteraction.esm.js","sources":["../../../../src/components/Nodes/common/nodeInteraction.ts"],"sourcesContent":["// Utilities to prevent ReactFlow interactions from interfering with inputs.\nexport const createStopNodeInteraction = () => ({\n onPointerDown: (e: React.PointerEvent<HTMLElement>) => {\n e.stopPropagation();\n },\n onKeyDown: (e: React.KeyboardEvent<HTMLElement>) => {\n e.stopPropagation();\n },\n className: \"nodrag nowheel\",\n inputProps: {\n onPointerDown: (e: React.PointerEvent<HTMLElement>) => {\n e.stopPropagation();\n },\n onKeyDown: (e: React.KeyboardEvent<HTMLElement>) => {\n e.stopPropagation();\n },\n },\n});\n"],"names":[],"mappings":"AACO,MAAM,4BAA4B,OAAO;AAAA,EAC9C,aAAA,EAAe,CAAC,CAAA,KAAuC;AACrD,IAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,EACpB,CAAA;AAAA,EACA,SAAA,EAAW,CAAC,CAAA,KAAwC;AAClD,IAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,EACpB,CAAA;AAAA,EACA,SAAA,EAAW,gBAAA;AAAA,EACX,UAAA,EAAY;AAAA,IACV,aAAA,EAAe,CAAC,CAAA,KAAuC;AACrD,MAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,IACpB,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,CAAA,KAAwC;AAClD,MAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,IACpB;AAAA;AAEJ,CAAA;;;;"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { useMemo, useCallback } from 'react';
|
|
2
|
+
|
|
3
|
+
const useOutputController = (data) => {
|
|
4
|
+
const { rfId, output } = data;
|
|
5
|
+
const stepOutputReferences = useMemo(
|
|
6
|
+
() => data.stepOutputReferences ?? [],
|
|
7
|
+
[data.stepOutputReferences]
|
|
8
|
+
);
|
|
9
|
+
const referenceOptions = useMemo(
|
|
10
|
+
() => Array.from(new Set(stepOutputReferences.filter(Boolean))),
|
|
11
|
+
[stepOutputReferences]
|
|
12
|
+
);
|
|
13
|
+
const links = useMemo(
|
|
14
|
+
() => Array.isArray(output?.links) ? [...output.links] : [],
|
|
15
|
+
[output?.links]
|
|
16
|
+
);
|
|
17
|
+
const textEntries = useMemo(
|
|
18
|
+
() => Array.isArray(output?.text) ? [...output.text] : [],
|
|
19
|
+
[output]
|
|
20
|
+
);
|
|
21
|
+
const setLinkFieldValue = useCallback(
|
|
22
|
+
(index, field, value) => {
|
|
23
|
+
const next = [...links];
|
|
24
|
+
const entry = { ...next[index] ?? {} };
|
|
25
|
+
entry[field] = value;
|
|
26
|
+
next[index] = entry;
|
|
27
|
+
data.onUpdateOutput?.(rfId, (prev) => ({
|
|
28
|
+
...prev ?? {},
|
|
29
|
+
links: next
|
|
30
|
+
}));
|
|
31
|
+
},
|
|
32
|
+
[data, links, rfId]
|
|
33
|
+
);
|
|
34
|
+
const handleLinkChange = useCallback(
|
|
35
|
+
(index, field) => (event) => {
|
|
36
|
+
setLinkFieldValue(index, field, event.target.value);
|
|
37
|
+
},
|
|
38
|
+
[setLinkFieldValue]
|
|
39
|
+
);
|
|
40
|
+
const handleAddLink = useCallback(() => {
|
|
41
|
+
data.onUpdateOutput?.(rfId, (prev) => ({
|
|
42
|
+
...prev ?? {},
|
|
43
|
+
links: [...links, { title: "Link", url: "" }]
|
|
44
|
+
}));
|
|
45
|
+
}, [data, links, rfId]);
|
|
46
|
+
const handleRemoveLink = useCallback(
|
|
47
|
+
(index) => {
|
|
48
|
+
const next = [...links];
|
|
49
|
+
next.splice(index, 1);
|
|
50
|
+
data.onUpdateOutput?.(rfId, (prev) => ({
|
|
51
|
+
...prev ?? {},
|
|
52
|
+
links: next
|
|
53
|
+
}));
|
|
54
|
+
},
|
|
55
|
+
[data, links, rfId]
|
|
56
|
+
);
|
|
57
|
+
const setTextFieldValue = useCallback(
|
|
58
|
+
(index, field, value) => {
|
|
59
|
+
const next = [...textEntries];
|
|
60
|
+
const entry = { ...next[index] ?? {} };
|
|
61
|
+
entry[field] = value;
|
|
62
|
+
next[index] = entry;
|
|
63
|
+
data.onUpdateOutput?.(rfId, (prev) => ({
|
|
64
|
+
...prev ?? {},
|
|
65
|
+
text: next
|
|
66
|
+
}));
|
|
67
|
+
},
|
|
68
|
+
[data, textEntries, rfId]
|
|
69
|
+
);
|
|
70
|
+
const handleTextChange = useCallback(
|
|
71
|
+
(index, field) => (event) => {
|
|
72
|
+
setTextFieldValue(index, field, event.target.value);
|
|
73
|
+
},
|
|
74
|
+
[setTextFieldValue]
|
|
75
|
+
);
|
|
76
|
+
const handleTextDefaultToggle = useCallback(
|
|
77
|
+
(index) => {
|
|
78
|
+
const next = textEntries.map((entry, idx) => ({
|
|
79
|
+
...entry,
|
|
80
|
+
default: idx === index ? !entry?.default : false
|
|
81
|
+
}));
|
|
82
|
+
data.onUpdateOutput?.(rfId, (prev) => ({
|
|
83
|
+
...prev ?? {},
|
|
84
|
+
text: next
|
|
85
|
+
}));
|
|
86
|
+
},
|
|
87
|
+
[data, rfId, textEntries]
|
|
88
|
+
);
|
|
89
|
+
const handleAddText = useCallback(() => {
|
|
90
|
+
data.onUpdateOutput?.(rfId, (prev) => ({
|
|
91
|
+
...prev ?? {},
|
|
92
|
+
text: [...textEntries, { title: "Note", content: "" }]
|
|
93
|
+
}));
|
|
94
|
+
}, [data, rfId, textEntries]);
|
|
95
|
+
const handleRemoveText = useCallback(
|
|
96
|
+
(index) => {
|
|
97
|
+
const next = [...textEntries];
|
|
98
|
+
next.splice(index, 1);
|
|
99
|
+
data.onUpdateOutput?.(rfId, (prev) => ({
|
|
100
|
+
...prev ?? {},
|
|
101
|
+
text: next
|
|
102
|
+
}));
|
|
103
|
+
},
|
|
104
|
+
[data, textEntries, rfId]
|
|
105
|
+
);
|
|
106
|
+
return {
|
|
107
|
+
stepOutputReferences,
|
|
108
|
+
links,
|
|
109
|
+
textEntries,
|
|
110
|
+
referenceOptions,
|
|
111
|
+
setLinkFieldValue,
|
|
112
|
+
handleLinkChange,
|
|
113
|
+
handleAddLink,
|
|
114
|
+
handleRemoveLink,
|
|
115
|
+
setTextFieldValue,
|
|
116
|
+
handleTextChange,
|
|
117
|
+
handleTextDefaultToggle,
|
|
118
|
+
handleAddText,
|
|
119
|
+
handleRemoveText,
|
|
120
|
+
rfId
|
|
121
|
+
};
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
export { useOutputController };
|
|
125
|
+
//# 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 } from \"react\";\nimport type { OutputNodeData } from \"../../../types/flowNodes\";\n\nexport const useOutputController = (data: OutputNodeData) => {\n const { rfId, output } = data;\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 () =>\n Array.isArray((output as any)?.text) ? [...(output as any).text] : [],\n [output]\n );\n\n const setLinkFieldValue = useCallback(\n (\n index: number,\n field: \"title\" | \"icon\" | \"url\" | \"entityRef\",\n value: string\n ) => {\n const next = [...links];\n const entry = { ...(next[index] ?? {}) };\n entry[field] = value;\n next[index] = entry;\n data.onUpdateOutput?.(rfId, (prev) => ({\n ...(prev ?? {}),\n links: next,\n }));\n },\n [data, links, rfId]\n );\n\n const handleLinkChange = useCallback(\n (index: number, field: \"title\" | \"icon\" | \"url\" | \"entityRef\") =>\n (event: React.ChangeEvent<HTMLInputElement>) => {\n setLinkFieldValue(index, field, event.target.value);\n },\n [setLinkFieldValue]\n );\n\n const handleAddLink = useCallback(() => {\n data.onUpdateOutput?.(rfId, (prev) => ({\n ...(prev ?? {}),\n links: [...links, { title: \"Link\", url: \"\" }],\n }));\n }, [data, links, rfId]);\n\n const handleRemoveLink = useCallback(\n (index: number) => {\n const next = [...links];\n next.splice(index, 1);\n data.onUpdateOutput?.(rfId, (prev) => ({\n ...(prev ?? {}),\n links: next,\n }));\n },\n [data, links, rfId]\n );\n\n const setTextFieldValue = useCallback(\n (\n index: number,\n field: \"title\" | \"icon\" | \"content\" | \"default\",\n value: unknown\n ) => {\n const next = [...textEntries];\n const entry = { ...(next[index] ?? {}) };\n (entry as any)[field] = value;\n next[index] = entry;\n data.onUpdateOutput?.(rfId, (prev: any) => ({\n ...(prev ?? {}),\n text: next,\n }));\n },\n [data, textEntries, rfId]\n );\n\n const handleTextChange = useCallback(\n (index: number, field: \"title\" | \"icon\" | \"content\") =>\n (event: React.ChangeEvent<HTMLInputElement>) => {\n setTextFieldValue(index, field, event.target.value);\n },\n [setTextFieldValue]\n );\n\n const handleTextDefaultToggle = useCallback(\n (index: number) => {\n const next = textEntries.map((entry, idx) => ({\n ...entry,\n default: idx === index ? !entry?.default : false,\n }));\n data.onUpdateOutput?.(rfId, (prev: any) => ({\n ...(prev ?? {}),\n text: next,\n }));\n },\n [data, rfId, textEntries]\n );\n\n const handleAddText = useCallback(() => {\n data.onUpdateOutput?.(rfId, (prev: any) => ({\n ...(prev ?? {}),\n text: [...textEntries, { title: \"Note\", content: \"\" }],\n }));\n }, [data, rfId, textEntries]);\n\n const handleRemoveText = useCallback(\n (index: number) => {\n const next = [...textEntries];\n next.splice(index, 1);\n data.onUpdateOutput?.(rfId, (prev: any) => ({\n ...(prev ?? {}),\n text: next,\n }));\n },\n [data, textEntries, rfId]\n );\n\n return {\n stepOutputReferences,\n links,\n textEntries,\n referenceOptions,\n setLinkFieldValue,\n handleLinkChange,\n handleAddLink,\n handleRemoveLink,\n setTextFieldValue,\n handleTextChange,\n handleTextDefaultToggle,\n handleAddText,\n handleRemoveText,\n rfId,\n };\n};\n"],"names":[],"mappings":"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"}
|