From 8cc4e120273cb029b844f4827f0ac3e954b43f99 Mon Sep 17 00:00:00 2001 From: tmaog Date: Fri, 12 Sep 2025 18:29:35 +0200 Subject: [PATCH 1/5] feat: new node circuit activity, define and implementation --- .../Forms/Fields/MultiArrayField.tsx | 90 ++++++++++++++++++ src/components/LateralMenu/LateralMenu.tsx | 1 + .../Nodes/CircuitNodeProperties.tsx | 25 +++++ .../ReactFlowCircuitNode.tsx | 57 +++++++++++ .../ReactFlowTrueFalseNode.tsx | 11 +-- src/components/ReactFlowNode/index.ts | 1 + src/public/circuitIcon.png | Bin 0 -> 19575 bytes .../polyglotElements/nodes/CircuitNode.ts | 30 ++++++ .../polyglotElements/nodes/TrueFalseNode.ts | 4 +- src/types/polyglotElements/nodes/index.ts | 1 + 10 files changed, 211 insertions(+), 9 deletions(-) create mode 100644 src/components/Forms/Fields/MultiArrayField.tsx create mode 100644 src/components/Properties/Nodes/CircuitNodeProperties.tsx create mode 100644 src/components/ReactFlowNode/ReactFlowCircuitNode/ReactFlowCircuitNode.tsx create mode 100644 src/public/circuitIcon.png create mode 100644 src/types/polyglotElements/nodes/CircuitNode.ts diff --git a/src/components/Forms/Fields/MultiArrayField.tsx b/src/components/Forms/Fields/MultiArrayField.tsx new file mode 100644 index 00000000..a49fa426 --- /dev/null +++ b/src/components/Forms/Fields/MultiArrayField.tsx @@ -0,0 +1,90 @@ +import { AddIcon, ArrowForwardIcon, CloseIcon } from '@chakra-ui/icons'; +import { Button, Flex, FormControl, FormLabel, Input } from '@chakra-ui/react'; +import { useState } from 'react'; +import { + RegisterOptions, + useFieldArray, + useFormContext, +} from 'react-hook-form'; + +type FieldConfig = { + name: string; // es: "left" o "right" + placeholder?: string; // testo nell'input + constraints?: RegisterOptions; +}; + +const MultiFieldArray = ({ + label, + name, + fieldsConfig, +}: { + label: string; + name: string; // es: "pairs" o "translations" + fieldsConfig: FieldConfig[]; +}) => { + const { register, control } = useFormContext(); + const { fields, append, remove } = useFieldArray({ + control, + name, + }); + + // stato temporaneo per nuovi valori + const [newValues, setNewValues] = useState>( + Object.fromEntries(fieldsConfig.map((f) => [f.name, ''])) + ); + + const handleChange = (field: string, value: string) => { + setNewValues((prev) => ({ ...prev, [field]: value })); + }; + + const handleAdd = () => { + if (Object.values(newValues).every((v) => !v)) return; + append(newValues); + setNewValues(Object.fromEntries(fieldsConfig.map((f) => [f.name, '']))); + }; + + return ( + + {label} + + {fields.map((field, index) => ( + + {fieldsConfig.map((fc, i) => ( + + + {fieldsConfig.length === 2 && i === 0 && } + + ))} + + + ))} + + + {fieldsConfig.map((fc, i) => ( + + handleChange(fc.name, e.target.value)} + placeholder={fc.placeholder} + borderColor="grey" + /> + {fieldsConfig.length === 2 && i === 0 && } + + ))} + + + + ); +}; + +export default MultiFieldArray; diff --git a/src/components/LateralMenu/LateralMenu.tsx b/src/components/LateralMenu/LateralMenu.tsx index 021ff69b..edc36bce 100644 --- a/src/components/LateralMenu/LateralMenu.tsx +++ b/src/components/LateralMenu/LateralMenu.tsx @@ -75,6 +75,7 @@ const listImplementedNodes = [ 'codingQuestionNode', 'CollaborativeModelingNode', 'UMLModelingNode', + 'CircuitNode', ]; export type LateralMenuProps = { isOpen: boolean; diff --git a/src/components/Properties/Nodes/CircuitNodeProperties.tsx b/src/components/Properties/Nodes/CircuitNodeProperties.tsx new file mode 100644 index 00000000..cf3a3abf --- /dev/null +++ b/src/components/Properties/Nodes/CircuitNodeProperties.tsx @@ -0,0 +1,25 @@ +import MultiFieldArray from '../../Forms/Fields/MultiArrayField'; +import TextField from '../../Forms/Fields/TextField'; +import NodeProperties from './NodeProperties'; + +const CircuitNodeProperties = () => { + return ( + <> + + + + + ); +}; + +export default CircuitNodeProperties; diff --git a/src/components/ReactFlowNode/ReactFlowCircuitNode/ReactFlowCircuitNode.tsx b/src/components/ReactFlowNode/ReactFlowCircuitNode/ReactFlowCircuitNode.tsx new file mode 100644 index 00000000..4217cd77 --- /dev/null +++ b/src/components/ReactFlowNode/ReactFlowCircuitNode/ReactFlowCircuitNode.tsx @@ -0,0 +1,57 @@ +import { useTheme } from '@fluentui/react'; +import { Handle, Position } from 'reactflow'; +import icon from '../../../public/circuitIcon.png'; +import useStore from '../../../store'; +import { CircuitNode } from '../../../types/polyglotElements'; +import Card from '../../Card/Card'; +import { ReactFlowNodeProps } from '../ReactFlowNode'; + +type ReactFlowCircuitNodeProps = ReactFlowNodeProps & + CircuitNode; + +const ReactFlowMultipleChoiceQuestionNode = ({ + id, +}: ReactFlowCircuitNodeProps) => { + const [onConnect, label] = useStore((state) => [ + state.onConnect, + state.nodeMap.get(id)?.title, + ]); + const theme = useTheme(); + + return ( + + + {label} + + + + ); +}; + +export default ReactFlowMultipleChoiceQuestionNode; diff --git a/src/components/ReactFlowNode/ReactFlowTrueFalseNode/ReactFlowTrueFalseNode.tsx b/src/components/ReactFlowNode/ReactFlowTrueFalseNode/ReactFlowTrueFalseNode.tsx index d86905c4..56c36802 100644 --- a/src/components/ReactFlowNode/ReactFlowTrueFalseNode/ReactFlowTrueFalseNode.tsx +++ b/src/components/ReactFlowNode/ReactFlowTrueFalseNode/ReactFlowTrueFalseNode.tsx @@ -2,16 +2,13 @@ import { useTheme } from '@fluentui/react'; import { Handle, Position } from 'reactflow'; import icon from '../../../public/trueFalse_icon.png'; import useStore from '../../../store'; -import { MultipleChoiceQuestionNode } from '../../../types/polyglotElements'; +import { CircuitNode } from '../../../types/polyglotElements'; import Card from '../../Card/Card'; import { ReactFlowNodeProps } from '../ReactFlowNode'; -type ReactFlowMultipleChoiceQuestionNodeProps = ReactFlowNodeProps & - MultipleChoiceQuestionNode; +type ReactFlowTrueFalseNodeProps = ReactFlowNodeProps & CircuitNode; -const ReactFlowMultipleChoiceQuestionNode = ({ - id, -}: ReactFlowMultipleChoiceQuestionNodeProps) => { +const ReactFlowTrueFalseNode = ({ id }: ReactFlowTrueFalseNodeProps) => { const [onConnect, label] = useStore((state) => [ state.onConnect, state.nodeMap.get(id)?.title, @@ -54,4 +51,4 @@ const ReactFlowMultipleChoiceQuestionNode = ({ ); }; -export default ReactFlowMultipleChoiceQuestionNode; +export default ReactFlowTrueFalseNode; diff --git a/src/components/ReactFlowNode/index.ts b/src/components/ReactFlowNode/index.ts index 78d73e5d..974bba23 100644 --- a/src/components/ReactFlowNode/index.ts +++ b/src/components/ReactFlowNode/index.ts @@ -26,3 +26,4 @@ export { default as ReactFlowSummaryNode } from './ReactFlowSummaryNode/ReactFlo export { default as ReactFlowTrueFalseNode } from './ReactFlowTrueFalseNode/ReactFlowTrueFalseNode'; export { default as ReactFlowUMLModelingNode } from './ReactFlowUMLModelingNode/ReactFlowUMLModelingNode'; export { default as ReactFlowWatchVideoNode } from './ReactFlowWatchVideoNode/ReactFlowWatchVideoNode'; +export { default as ReactFlowCircuitNode } from './ReactFlowCircuitNode/ReactFlowCircuitNode'; diff --git a/src/public/circuitIcon.png b/src/public/circuitIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..7bb123d9153523b43a42a0bf8e476eca55da48ea GIT binary patch literal 19575 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 L)z4*}Q$iB}-}GC3 literal 0 HcmV?d00001 diff --git a/src/types/polyglotElements/nodes/CircuitNode.ts b/src/types/polyglotElements/nodes/CircuitNode.ts new file mode 100644 index 00000000..931b4f2e --- /dev/null +++ b/src/types/polyglotElements/nodes/CircuitNode.ts @@ -0,0 +1,30 @@ +import CircuitNodeProperties from '../../../components/Properties/Nodes/CircuitNodeProperties'; +import { ReactFlowCircuitNode } from '../../../components/ReactFlowNode'; +import icon from '../../../public/circuitIcon.png'; +import { polyglotNodeComponentMapping } from '../elementMapping'; +import { defaultPolyglotNodeData, NodeData, PolyglotNode } from './Node'; + +export type CircuitData = NodeData & { + instructions: string; + pinsList: { pin: string; value: string }[]; +}; + +export type CircuitNode = PolyglotNode & { + type: 'CircuitNode'; + data: CircuitData; +}; + +polyglotNodeComponentMapping.registerMapping({ + elementType: 'CircuitNode', + name: 'Circuit', + icon: icon.src, + group: 'apply_assessment', + platform: 'Arduino', + propertiesComponent: CircuitNodeProperties, + elementComponent: ReactFlowCircuitNode, + defaultData: { + ...defaultPolyglotNodeData, + pinsList: [], + instructions: '', + }, +}); diff --git a/src/types/polyglotElements/nodes/TrueFalseNode.ts b/src/types/polyglotElements/nodes/TrueFalseNode.ts index 472229fb..822d6bfb 100644 --- a/src/types/polyglotElements/nodes/TrueFalseNode.ts +++ b/src/types/polyglotElements/nodes/TrueFalseNode.ts @@ -12,12 +12,12 @@ export type TrueFalseNodeData = NodeData & { positivePoints?: number; }; -export type TrueFalseNodeNode = PolyglotNode & { +export type TrueFalseNode = PolyglotNode & { type: 'TrueFalseNode'; data: TrueFalseNodeData; }; -polyglotNodeComponentMapping.registerMapping({ +polyglotNodeComponentMapping.registerMapping({ elementType: 'TrueFalseNode', name: 'True False', icon: icon.src, diff --git a/src/types/polyglotElements/nodes/index.ts b/src/types/polyglotElements/nodes/index.ts index e4595a9a..394a58ff 100644 --- a/src/types/polyglotElements/nodes/index.ts +++ b/src/types/polyglotElements/nodes/index.ts @@ -28,3 +28,4 @@ export * from './SummaryNode'; export * from './TrueFalseNode'; export * from './UMLModelingNode'; export * from './WatchVideoNode'; +export * from './CircuitNode' From a7721676a7773fb3a28fb468aa3164f34eb756f4 Mon Sep 17 00:00:00 2001 From: tmaog Date: Fri, 12 Sep 2025 18:30:17 +0200 Subject: [PATCH 2/5] feat: new node circuit activity, define and implementation --- .../ReactFlowCircuitNode/ReactFlowCircuitNode.tsx | 3 +-- src/components/ReactFlowNode/index.ts | 2 +- src/types/polyglotElements/nodes/index.ts | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/components/ReactFlowNode/ReactFlowCircuitNode/ReactFlowCircuitNode.tsx b/src/components/ReactFlowNode/ReactFlowCircuitNode/ReactFlowCircuitNode.tsx index 4217cd77..c40c1bca 100644 --- a/src/components/ReactFlowNode/ReactFlowCircuitNode/ReactFlowCircuitNode.tsx +++ b/src/components/ReactFlowNode/ReactFlowCircuitNode/ReactFlowCircuitNode.tsx @@ -6,8 +6,7 @@ import { CircuitNode } from '../../../types/polyglotElements'; import Card from '../../Card/Card'; import { ReactFlowNodeProps } from '../ReactFlowNode'; -type ReactFlowCircuitNodeProps = ReactFlowNodeProps & - CircuitNode; +type ReactFlowCircuitNodeProps = ReactFlowNodeProps & CircuitNode; const ReactFlowMultipleChoiceQuestionNode = ({ id, diff --git a/src/components/ReactFlowNode/index.ts b/src/components/ReactFlowNode/index.ts index 974bba23..c8fb8ef1 100644 --- a/src/components/ReactFlowNode/index.ts +++ b/src/components/ReactFlowNode/index.ts @@ -3,6 +3,7 @@ export { default as ReactFlowAnalyzingPlottingDataNode } from './ReactFlowAnalyz export { default as ReactFlowBrainstormingNode } from './ReactFlowBrainstormingNode/ReactFlowBrainstormingNode'; export { default as ReactFlowCalculationNode } from './ReactFlowCalculationNode/ReactFlowCalculationNode'; export { default as ReactFlowCasesEvaluationNode } from './ReactFlowCasesEvaluationNode/ReactFlowCasesEvaluationNode'; +export { default as ReactFlowCircuitNode } from './ReactFlowCircuitNode/ReactFlowCircuitNode'; export { default as ReactFlowCloseEndedQuestionNode } from './ReactFlowCloseEndedQuestionNode/ReactFlowCloseEndedQuestionNode'; export { default as ReactFlowCodingQuestionNode } from './ReactFlowCodingQuestionNode/ReactFlowCodingQuestionNode'; export { default as ReactFlowCollaborativeModelingNode } from './ReactFlowCollaborativeModelingNode/ReactFlowCollaborativeModelingNode'; @@ -26,4 +27,3 @@ export { default as ReactFlowSummaryNode } from './ReactFlowSummaryNode/ReactFlo export { default as ReactFlowTrueFalseNode } from './ReactFlowTrueFalseNode/ReactFlowTrueFalseNode'; export { default as ReactFlowUMLModelingNode } from './ReactFlowUMLModelingNode/ReactFlowUMLModelingNode'; export { default as ReactFlowWatchVideoNode } from './ReactFlowWatchVideoNode/ReactFlowWatchVideoNode'; -export { default as ReactFlowCircuitNode } from './ReactFlowCircuitNode/ReactFlowCircuitNode'; diff --git a/src/types/polyglotElements/nodes/index.ts b/src/types/polyglotElements/nodes/index.ts index 394a58ff..c7b2cbae 100644 --- a/src/types/polyglotElements/nodes/index.ts +++ b/src/types/polyglotElements/nodes/index.ts @@ -3,6 +3,7 @@ export * from './AnalyzingPlottingDataNode'; export * from './BrainstormingNode'; export * from './CalculationNode'; export * from './CasesEvaluationNode'; +export * from './CircuitNode'; export * from './CloseEndedQuestionNode'; export * from './CodingQuestionNode'; export * from './CollaborativeModelingNode'; @@ -28,4 +29,3 @@ export * from './SummaryNode'; export * from './TrueFalseNode'; export * from './UMLModelingNode'; export * from './WatchVideoNode'; -export * from './CircuitNode' From 62fea013d473e168e71e00ec60cf4486abcbcf34 Mon Sep 17 00:00:00 2001 From: tmaog Date: Fri, 12 Sep 2025 18:39:53 +0200 Subject: [PATCH 3/5] feat: new node circuit activity, define and implementation --- .../Properties/Nodes/CircuitNodeProperties.tsx | 2 +- src/types/polyglotElements/nodes/CircuitNode.ts | 1 - src/utils/utils.ts | 11 +++++++++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/components/Properties/Nodes/CircuitNodeProperties.tsx b/src/components/Properties/Nodes/CircuitNodeProperties.tsx index cf3a3abf..aa39b477 100644 --- a/src/components/Properties/Nodes/CircuitNodeProperties.tsx +++ b/src/components/Properties/Nodes/CircuitNodeProperties.tsx @@ -6,7 +6,7 @@ const CircuitNodeProperties = () => { return ( <> diff --git a/src/types/polyglotElements/nodes/CircuitNode.ts b/src/types/polyglotElements/nodes/CircuitNode.ts index 931b4f2e..da71f7aa 100644 --- a/src/types/polyglotElements/nodes/CircuitNode.ts +++ b/src/types/polyglotElements/nodes/CircuitNode.ts @@ -19,7 +19,6 @@ polyglotNodeComponentMapping.registerMapping({ name: 'Circuit', icon: icon.src, group: 'apply_assessment', - platform: 'Arduino', propertiesComponent: CircuitNodeProperties, elementComponent: ReactFlowCircuitNode, defaultData: { diff --git a/src/utils/utils.ts b/src/utils/utils.ts index bcc8ff65..a192e6a3 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -69,8 +69,13 @@ export const createNewDefaultPolyglotFlow = (): PolyglotFlow => { export const createNewDefaultPolyglotNode: ( pos: { x: number; y: number }, - nodeType?: string -) => any = (pos, nodeType = 'multipleChoiceQuestionNode') => { + nodeType?: string, + platform?: string +) => any = ( + pos, + nodeType = 'multipleChoiceQuestionNode', + platform = 'WebApp' +) => { const id = UUIDv4(); return { _id: id, @@ -78,6 +83,7 @@ export const createNewDefaultPolyglotNode: ( title: 'New Node', description: '', difficulty: 1, + platform: platform, data: polyglotNodeComponentMapping.defaultDataMapping[nodeType], reactFlow: { id: id, @@ -120,6 +126,7 @@ export const createNewDefaultPolyglotEdge = ( type: type, markerEnd: { type: MarkerType.Arrow, + color: 'grey', //to change for pass fail edge width: 25, height: 25, }, From f9afb1e535f5ff24cd51e43cc62778993f3656ba Mon Sep 17 00:00:00 2001 From: tmaog Date: Fri, 12 Sep 2025 18:44:05 +0200 Subject: [PATCH 4/5] fix: remove outdated code and bugfix --- src/data/abstractExample.ts | 1 + src/data/exampleData.ts | 4 ++ .../nodes/CasesEvaluationNode.ts | 40 --------------- .../nodes/CreateKeywordsListNode.ts | 19 ------- .../nodes/FindSolutionNode.ts | 19 ------- .../nodes/ImageEvaluationNode.ts | 49 ------------------- .../nodes/InnovationPitchNode.ts | 40 --------------- .../nodes/MemoriseKeywordsListNode.ts | 19 ------- .../polyglotElements/nodes/MindMapNode.ts | 19 ------- .../nodes/ProblemSolvingNode.ts | 19 ------- .../nodes/PromptEngineeringNode.ts | 25 ---------- 11 files changed, 5 insertions(+), 249 deletions(-) diff --git a/src/data/abstractExample.ts b/src/data/abstractExample.ts index b1aa4932..c3d7e97a 100644 --- a/src/data/abstractExample.ts +++ b/src/data/abstractExample.ts @@ -88,6 +88,7 @@ const subFlow = new Map(); type: 'passFailEdge', markerEnd: { type: MarkerType.Arrow, + color: 'grey', // or any color you prefer width: 25, height: 25, }, diff --git a/src/data/exampleData.ts b/src/data/exampleData.ts index 84129fc1..240cd67d 100644 --- a/src/data/exampleData.ts +++ b/src/data/exampleData.ts @@ -169,6 +169,7 @@ const exampleFlows = new Map(); target: ids[1], type: 'passFailEdge', markerEnd: { + color: 'grey', type: MarkerType.Arrow, width: 25, height: 25, @@ -191,6 +192,7 @@ const exampleFlows = new Map(); target: ids[3], type: 'exactValueEdge', markerEnd: { + color: 'grey', type: MarkerType.Arrow, width: 25, height: 25, @@ -211,6 +213,7 @@ const exampleFlows = new Map(); target: ids[5], type: 'unconditionalEdge', markerEnd: { + color: 'grey', type: MarkerType.Arrow, width: 25, height: 25, @@ -235,6 +238,7 @@ const exampleFlows = new Map(); target: ids[7], type: 'customValidationEdge', markerEnd: { + color: 'grey', type: MarkerType.Arrow, width: 25, height: 25, diff --git a/src/types/polyglotElements/nodes/CasesEvaluationNode.ts b/src/types/polyglotElements/nodes/CasesEvaluationNode.ts index 80594b62..8b427f89 100644 --- a/src/types/polyglotElements/nodes/CasesEvaluationNode.ts +++ b/src/types/polyglotElements/nodes/CasesEvaluationNode.ts @@ -30,44 +30,4 @@ polyglotNodeComponentMapping.registerMapping({ link: '', uploadLearner: false, }, - transformData: (node) => { - const oldData = node.data as CasesEvaluationNodeData; - - const data = { - ...oldData, - }; - /* - const challengeSetup: ChallengeSetup[] = [ - ` -using Polyglot.Interactive; -var kernel = Kernel.Root.FindKernelByName("multiplechoice") as MultipleChoiceKernel; -kernel.Options = new HashSet { ${data.choices - .map((_, i) => `"${i + 1}"`) - .join(', ')} }; -`, - ]; - const challengeContent: ChallengeContent[] = [ - { - type: 'multiplechoice', - content: '', - priority: 1, - }, - { - type: 'markdown', - content: - data.question + - data.choices.map((value, index) => '\n' + (index + 1) + '. ' + value), - priority: 0, - }, - ]; -*/ - return { - ...node, - data, - runtimeData: { - //challengeSetup, - //challengeContent, - }, - }; - }, }); diff --git a/src/types/polyglotElements/nodes/CreateKeywordsListNode.ts b/src/types/polyglotElements/nodes/CreateKeywordsListNode.ts index 1a4bc525..6e26a15f 100644 --- a/src/types/polyglotElements/nodes/CreateKeywordsListNode.ts +++ b/src/types/polyglotElements/nodes/CreateKeywordsListNode.ts @@ -30,23 +30,4 @@ polyglotNodeComponentMapping.registerMapping({ instructions: '', ...defaultPolyglotNodeData, }, - transformData: (node) => { - const oldData = node as CreateKeywordsListNode; - - const challengeSetup: ChallengeSetup[] = []; - const challengeContent: ChallengeContent[] = [ - { - type: 'markdown', - content: oldData.data?.text, - }, - ]; - - return { - ...node, - runtimeData: { - challengeSetup, - challengeContent, - }, - }; - }, }); diff --git a/src/types/polyglotElements/nodes/FindSolutionNode.ts b/src/types/polyglotElements/nodes/FindSolutionNode.ts index 4fd7f53e..191993f0 100644 --- a/src/types/polyglotElements/nodes/FindSolutionNode.ts +++ b/src/types/polyglotElements/nodes/FindSolutionNode.ts @@ -34,23 +34,4 @@ polyglotNodeComponentMapping.registerMapping({ uploadLearner: false, ...defaultPolyglotNodeData, }, - transformData: (node) => { - const oldData = node as FindSolutionNode; - - const challengeSetup: ChallengeSetup[] = []; - const challengeContent: ChallengeContent[] = [ - { - type: 'markdown', - content: oldData.data?.text, - }, - ]; - - return { - ...node, - runtimeData: { - challengeSetup, - challengeContent, - }, - }; - }, }); diff --git a/src/types/polyglotElements/nodes/ImageEvaluationNode.ts b/src/types/polyglotElements/nodes/ImageEvaluationNode.ts index 4fbd0663..fdf501e2 100644 --- a/src/types/polyglotElements/nodes/ImageEvaluationNode.ts +++ b/src/types/polyglotElements/nodes/ImageEvaluationNode.ts @@ -31,53 +31,4 @@ polyglotNodeComponentMapping.registerMapping({ isAnswerCorrect: [], question: '', }, - transformData: (node) => { - const oldData = node.data as ImageEvaluationNodeData; - - const data = { - ...oldData, - correctAnswers: zip(oldData?.answers, oldData?.isAnswerCorrect).reduce( - (acc, { first, second }) => { - if (second) { - acc.push(first); - } - return acc; - }, - [] as string[] - ), - }; - /* - const challengeSetup: ChallengeSetup[] = [ - ` -using Polyglot.Interactive; -var kernel = Kernel.Root.FindKernelByName("multiplechoice") as MultipleChoiceKernel; -kernel.Options = new HashSet { ${data.choices - .map((_, i) => `"${i + 1}"`) - .join(', ')} }; -`, - ]; - const challengeContent: ChallengeContent[] = [ - { - type: 'multiplechoice', - content: '', - priority: 1, - }, - { - type: 'markdown', - content: - data.question + - data.choices.map((value, index) => '\n' + (index + 1) + '. ' + value), - priority: 0, - }, - ]; -*/ - return { - ...node, - data, - runtimeData: { - //challengeSetup, - //challengeContent, - }, - }; - }, }); diff --git a/src/types/polyglotElements/nodes/InnovationPitchNode.ts b/src/types/polyglotElements/nodes/InnovationPitchNode.ts index b078e874..f27f5572 100644 --- a/src/types/polyglotElements/nodes/InnovationPitchNode.ts +++ b/src/types/polyglotElements/nodes/InnovationPitchNode.ts @@ -30,44 +30,4 @@ polyglotNodeComponentMapping.registerMapping({ link: '', uploadLearner: false, }, - transformData: (node) => { - const oldData = node.data as InnovationPitchNodeData; - - const data = { - ...oldData, - }; - /* - const challengeSetup: ChallengeSetup[] = [ - ` -using Polyglot.Interactive; -var kernel = Kernel.Root.FindKernelByName("multiplechoice") as MultipleChoiceKernel; -kernel.Options = new HashSet { ${data.choices - .map((_, i) => `"${i + 1}"`) - .join(', ')} }; -`, - ]; - const challengeContent: ChallengeContent[] = [ - { - type: 'multiplechoice', - content: '', - priority: 1, - }, - { - type: 'markdown', - content: - data.question + - data.choices.map((value, index) => '\n' + (index + 1) + '. ' + value), - priority: 0, - }, - ]; -*/ - return { - ...node, - data, - runtimeData: { - //challengeSetup, - //challengeContent, - }, - }; - }, }); diff --git a/src/types/polyglotElements/nodes/MemoriseKeywordsListNode.ts b/src/types/polyglotElements/nodes/MemoriseKeywordsListNode.ts index 2e6b2165..1ab3efc7 100644 --- a/src/types/polyglotElements/nodes/MemoriseKeywordsListNode.ts +++ b/src/types/polyglotElements/nodes/MemoriseKeywordsListNode.ts @@ -32,23 +32,4 @@ polyglotNodeComponentMapping.registerMapping({ keywords: [], ...defaultPolyglotNodeData, }, - transformData: (node) => { - const oldData = node as MemoriseKeywordsListNode; - - const challengeSetup: ChallengeSetup[] = []; - const challengeContent: ChallengeContent[] = [ - { - type: 'markdown', - content: oldData.data?.text, - }, - ]; - - return { - ...node, - runtimeData: { - challengeSetup, - challengeContent, - }, - }; - }, }); diff --git a/src/types/polyglotElements/nodes/MindMapNode.ts b/src/types/polyglotElements/nodes/MindMapNode.ts index dc7015b3..2c00f4d8 100644 --- a/src/types/polyglotElements/nodes/MindMapNode.ts +++ b/src/types/polyglotElements/nodes/MindMapNode.ts @@ -34,23 +34,4 @@ polyglotNodeComponentMapping.registerMapping({ uploadLearner: false, ...defaultPolyglotNodeData, }, - transformData: (node) => { - const oldData = node as MindMapNode; - - const challengeSetup: ChallengeSetup[] = []; - const challengeContent: ChallengeContent[] = [ - { - type: 'markdown', - content: oldData.data?.text, - }, - ]; - - return { - ...node, - runtimeData: { - challengeSetup, - challengeContent, - }, - }; - }, }); diff --git a/src/types/polyglotElements/nodes/ProblemSolvingNode.ts b/src/types/polyglotElements/nodes/ProblemSolvingNode.ts index 02d23438..846132bd 100644 --- a/src/types/polyglotElements/nodes/ProblemSolvingNode.ts +++ b/src/types/polyglotElements/nodes/ProblemSolvingNode.ts @@ -34,23 +34,4 @@ polyglotNodeComponentMapping.registerMapping({ uploadLearner: false, ...defaultPolyglotNodeData, }, - transformData: (node) => { - const oldData = node as ProblemSolvingNode; - - const challengeSetup: ChallengeSetup[] = []; - const challengeContent: ChallengeContent[] = [ - { - type: 'markdown', - content: oldData.data?.text, - }, - ]; - - return { - ...node, - runtimeData: { - challengeSetup, - challengeContent, - }, - }; - }, }); diff --git a/src/types/polyglotElements/nodes/PromptEngineeringNode.ts b/src/types/polyglotElements/nodes/PromptEngineeringNode.ts index 33c28011..920b4b18 100644 --- a/src/types/polyglotElements/nodes/PromptEngineeringNode.ts +++ b/src/types/polyglotElements/nodes/PromptEngineeringNode.ts @@ -39,29 +39,4 @@ int main() { language: 'csharp', ...defaultPolyglotNodeData, }, - transformData: (node) => { - const oldData = node as PromptEngineeringNode; - - const challengeSetup: ChallengeSetup[] = []; - const challengeContent: ChallengeContent[] = [ - { - type: 'markdown', - content: oldData.data?.question, - priority: 0, - }, - { - type: oldData.data?.language, - content: oldData.data?.codeTemplate, - priority: 1, - }, - ]; - - return { - ...node, - runtimeData: { - challengeSetup, - challengeContent, - }, - }; - }, }); From e73188d26d4bf88e6fed7c8049ad8e827fd06d2d Mon Sep 17 00:00:00 2001 From: tmaog Date: Sat, 13 Sep 2025 16:32:44 +0200 Subject: [PATCH 5/5] fix: merge bug --- src/data/abstractExample.ts | 1 - src/utils/utils.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/src/data/abstractExample.ts b/src/data/abstractExample.ts index 3b279b69..589f843d 100644 --- a/src/data/abstractExample.ts +++ b/src/data/abstractExample.ts @@ -89,7 +89,6 @@ const subFlow = new Map(); target: ids[1], type: 'passFailEdge', markerEnd: { - color: 'green', type: MarkerType.Arrow, color: 'grey', // or any color you prefer width: 25, diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 0b45c22b..18088934 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -130,7 +130,6 @@ export const createNewDefaultPolyglotEdge = ( markerEnd: { color: type == 'unconditionalEdge' ? 'grey' : 'green', type: MarkerType.Arrow, - color: 'grey', //to change for pass fail edge width: 25, height: 25, },