From be86d7cba1c7cb50a87ac0a426c4e66e8195b0fc Mon Sep 17 00:00:00 2001 From: thsparks Date: Fri, 13 Sep 2024 15:18:38 -0700 Subject: [PATCH 01/31] In progress still getting things working... --- localtypings/pxteditor.d.ts | 28 +++++++-- pxteditor/editorcontroller.ts | 10 ++- pxtservices/editorDriver.ts | 12 ++++ .../components/CriteriaInstanceDisplay.tsx | 27 +++++--- .../src/services/makecodeEditorService.ts | 5 ++ webapp/src/app.tsx | 23 ++++++- webapp/src/monacoFlyout.tsx | 14 ++--- webapp/src/monacopyhelper.ts | 61 ++++++++++++++++++- 8 files changed, 155 insertions(+), 25 deletions(-) diff --git a/localtypings/pxteditor.d.ts b/localtypings/pxteditor.d.ts index 7ba3c537a68e..01bf1b191d19 100644 --- a/localtypings/pxteditor.d.ts +++ b/localtypings/pxteditor.d.ts @@ -75,6 +75,7 @@ declare namespace pxt.editor { | "convertcloudprojectstolocal" | "setlanguagerestriction" | "gettoolboxcategories" + | "getreadableblockname" | "toggletrace" // EditorMessageToggleTraceRequest | "togglehighcontrast" @@ -453,14 +454,23 @@ declare namespace pxt.editor { advanced?: boolean; } - export interface EditorMessageServiceWorkerRegisteredRequest extends EditorMessageRequest { - action: "serviceworkerregistered"; - } - export interface EditorMessageGetToolboxCategoriesResponse { categories: pxt.editor.ToolboxCategoryDefinition[]; } + export interface EditorMessageGetBlockReadableNameRequest extends EditorMessageRequest { + action: "getreadableblockname"; + blockId: string; + } + + export interface EditorMessageGetBlockReadableNameResponse { + readableName: pxt.editor.ReadableBlockName | undefined; + } + + export interface EditorMessageServiceWorkerRegisteredRequest extends EditorMessageRequest { + action: "serviceworkerregistered"; + } + export interface DataStreams { console?: T; messages?: T; @@ -997,6 +1007,7 @@ declare namespace pxt.editor { // getBlocks(): Blockly.Block[]; getBlocks(): any[]; getToolboxCategories(advanced?: boolean): pxt.editor.EditorMessageGetToolboxCategoriesResponse; + getReadableBlockName(blockId: string): pxt.editor.ReadableBlockName | undefined; toggleHighContrast(): void; setHighContrast(on: boolean): void; @@ -1264,6 +1275,15 @@ declare namespace pxt.editor { blockId?: string; } + export interface ReadableBlockName { + parts: ReadableBlockNamePart[]; + } + + export interface ReadableBlockNamePart { + kind: "label" | "break" | "param", + content?: string, + } + interface BaseAssetEditorRequest { id?: number; files: pxt.Map; diff --git a/pxteditor/editorcontroller.ts b/pxteditor/editorcontroller.ts index a1bcf94afe0a..0b697d716eca 100644 --- a/pxteditor/editorcontroller.ts +++ b/pxteditor/editorcontroller.ts @@ -202,13 +202,21 @@ case "renderxml": { resp = results; }); } -case "gettoolboxcategories": { + case "gettoolboxcategories": { const msg = data as pxt.editor.EditorMessageGetToolboxCategoriesRequest; return Promise.resolve() .then(() => { resp = projectView.getToolboxCategories(msg.advanced); }); } + case "getreadableblockname": { + const msg = data as pxt.editor.EditorMessageGetBlockReadableNameRequest; + return Promise.resolve() + .then(() => { + const readableName = projectView.getReadableBlockName(msg.blockId); + resp = { readableName } as pxt.editor.EditorMessageGetBlockReadableNameResponse; + }); + } case "renderpython": { const rendermsg = data as pxt.editor.EditorMessageRenderPythonRequest; return Promise.resolve() diff --git a/pxtservices/editorDriver.ts b/pxtservices/editorDriver.ts index bb75415ca0a7..234a5046f3a7 100644 --- a/pxtservices/editorDriver.ts +++ b/pxtservices/editorDriver.ts @@ -389,6 +389,18 @@ export class EditorDriver extends IframeDriver { return (resp.resp as pxt.editor.EditorMessageGetToolboxCategoriesResponse).categories; } + async getBlockReadableName(blockId: string): Promise { + const resp = await this.sendRequest( + { + type: "pxteditor", + action: "getreadableblockname", + blockId + } as pxt.editor.EditorMessageGetBlockReadableNameRequest + ) as pxt.editor.EditorMessageResponse; + + return (resp.resp as pxt.editor.EditorMessageGetBlockReadableNameResponse)?.readableName; + } + async runValidatorPlan(validatorPlan: pxt.blocks.ValidatorPlan, planLib: pxt.blocks.ValidatorPlan[]) { const resp = await this.sendRequest( { diff --git a/teachertool/src/components/CriteriaInstanceDisplay.tsx b/teachertool/src/components/CriteriaInstanceDisplay.tsx index 50e8f30089e3..4f912acff4ab 100644 --- a/teachertool/src/components/CriteriaInstanceDisplay.tsx +++ b/teachertool/src/components/CriteriaInstanceDisplay.tsx @@ -5,13 +5,14 @@ import { logDebug } from "../services/loggingService"; import { setParameterValue } from "../transforms/setParameterValue"; import { classList } from "react-common/components/util"; import { getReadableBlockString, splitCriteriaTemplate } from "../utils"; -import { useContext, useMemo, useState } from "react"; +import { useContext, useEffect, useMemo, useState } from "react"; import { Input } from "react-common/components/controls/Input"; import { Button } from "react-common/components/controls/Button"; import { AppStateContext } from "../state/appStateContext"; import { Strings } from "../constants"; import { showModal } from "../transforms/showModal"; import { BlockPickerOptions } from "../types/modalOptions"; +import { getBlockReadableName } from "../services/makecodeEditorService"; interface InlineInputSegmentProps { initialValue: string; @@ -67,14 +68,9 @@ interface BlockData { } const BlockInputSegment: React.FC = ({ instance, param }) => { const { state: teacherTool } = useContext(AppStateContext); - function handleClick() { - showModal({ - modal: "block-picker", - criteriaInstanceId: instance.instanceId, - paramName: param.name, - } as BlockPickerOptions); - } + const [blockText, setBlockText] = useState(undefined); + // Maybe makes sense to move this to use effect and handle call to setBlockText as a separate part of same use effect? const blockData = useMemo(() => { if (!param.value || !teacherTool.toolboxCategories) { return undefined; @@ -84,16 +80,29 @@ const BlockInputSegment: React.FC = ({ instance, param } for (const category of Object.values(teacherTool.toolboxCategories)) { const block = category.blocks?.find(b => b.blockId === param.value); if (block) { + async function updateBlockText(blockId: string | undefined) { + const blockReadableName = blockId ? await getBlockReadableName(blockId) : undefined; + setBlockText(blockReadableName ? blockReadableName.parts.map(part => part.content).join(" ") : undefined); + } + /* await */ updateBlockText(block.blockId); return { category, block }; } } return undefined; }, [param.value, teacherTool.toolboxCategories]); + function handleClick() { + showModal({ + modal: "block-picker", + criteriaInstanceId: instance.instanceId, + paramName: param.name, + } as BlockPickerOptions); + } + const style = blockData ? { backgroundColor: blockData.category.color, color: "white" } : undefined; return (