diff --git a/packages/core-svelte/src/lib/components/TextComponent.svelte b/packages/core-svelte/src/lib/components/TextComponent.svelte index 65070dcdc..3ce72be47 100644 --- a/packages/core-svelte/src/lib/components/TextComponent.svelte +++ b/packages/core-svelte/src/lib/components/TextComponent.svelte @@ -75,7 +75,7 @@ * It is called from the box. */ export async function setFocus(): Promise { - LOGGER.log("setFocus "+ id + " input is there: " + !!inputElement); + console.log("TextComponent.setFocus "+ id + " input is there: " + !!inputElement); if (!!inputElement) { inputElement.focus(); } else { diff --git a/packages/core-svelte/src/lib/components/TextDropdownComponent.svelte b/packages/core-svelte/src/lib/components/TextDropdownComponent.svelte index 9c6848ac8..2d8d6a8d0 100644 --- a/packages/core-svelte/src/lib/components/TextDropdownComponent.svelte +++ b/packages/core-svelte/src/lib/components/TextDropdownComponent.svelte @@ -66,7 +66,7 @@ * This function sets the focus on this element programmatically. */ const setFocus = () => { - LOGGER.log("setFocus " + box.kind + id); + console.log("TextDropdownComponent.setFocus " + box.kind + id); if (!!textComponent) { textComponent.setFocus(); } else { @@ -359,7 +359,14 @@ isEditing = false; dropdownShown = false; - box.executeOption(editor, selected); // TODO the result of the execution is ignored + const post = box.executeOption(editor, selected); // TODO the result of the execution is ignored + if (!!post) { + if (typeof post === "function") { + post() + } else { + console.log("POST is noit a function: " + post) + } + } if (isActionBox(box)) { // ActionBox, action done, clear input text setTextLocalAndInBox(''); } else { diff --git a/packages/core-svelte/src/lib/components/svelte-utils/CommonFunctions.ts b/packages/core-svelte/src/lib/components/svelte-utils/CommonFunctions.ts index 91af1f8ad..d013e3604 100644 --- a/packages/core-svelte/src/lib/components/svelte-utils/CommonFunctions.ts +++ b/packages/core-svelte/src/lib/components/svelte-utils/CommonFunctions.ts @@ -1,4 +1,4 @@ -import { AST, Box, FRE_NULL_COMMAND, FreLogger, FreCommand, FreEditor, FreEditorUtil, type FrePostAction, toFreKey } from "@freon4dsl/core"; +import { AST, Box, FreLogger, FreEditor, FreEditorUtil, type FrePostAction, toFreKey, FreAction } from "@freon4dsl/core"; import { viewport } from "./EditorViewportStore.js"; import { get } from "svelte/store"; @@ -46,8 +46,8 @@ export function calculatePos(viewportSize: number, contentSize: number, mousePos } export function executeCustomKeyboardShortCut(event: KeyboardEvent, index: number, box: Box, editor: FreEditor) { - const cmd: FreCommand = FreEditorUtil.findKeyboardShortcutCommand(toFreKey(event), box, editor); - if (cmd !== FRE_NULL_COMMAND) { + const cmd: FreAction = FreEditorUtil.findKeyboardShortcutAction(toFreKey(event), box, editor); + if (cmd !== null) { let postAction: FrePostAction; AST.change(() => { // todo KeyboardEvent does not have an "action" prop, so what is happening here? diff --git a/packages/core/src/editor/actions/FreAction.ts b/packages/core/src/editor/actions/FreAction.ts index 8db4e158a..c26a36464 100644 --- a/packages/core/src/editor/actions/FreAction.ts +++ b/packages/core/src/editor/actions/FreAction.ts @@ -1,15 +1,19 @@ import { FreNode } from "../../ast/index.js"; +import { FreLogger } from "../../logging/index.js"; import { FreCaret } from "../util/index.js"; import { Box } from "../boxes/index.js"; import { FreEditor } from "../FreEditor.js"; -import { FreCommand } from "./FreCommand.js"; import { FreTriggerUse, FreTriggerType } from "./FreTriggers.js"; +export const ACTION_LOGGER = new FreLogger("FreAction") + export type CustomAction = (box: Box, trigger: FreTriggerUse, editor: FreEditor) => FreNode | null; export type FrePostAction = () => void; +/** + * Use this if there is no post action. + */ export const EMPTY_POST_ACTION = function () { - /* todo create this function body */ }; export type ReferenceShortcut = { @@ -53,7 +57,11 @@ export abstract class FreAction { referenceShortcut?: ReferenceShortcut; /** - * Returns the command object that can be executed to perform the action. + * Execute the action + * @param box The selected box on which this action is executed + * @param trigger The trigger that causes this action to execute + * @param editor The editor + * @param index The index in the list, if there is any */ - abstract command(): FreCommand; + abstract execute(box: Box, trigger: FreTriggerUse, editor: FreEditor, index?: number): FrePostAction; } diff --git a/packages/core/src/editor/actions/FreCommand.ts b/packages/core/src/editor/actions/FreCommand.ts deleted file mode 100644 index 49f2ec398..000000000 --- a/packages/core/src/editor/actions/FreCommand.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Box } from "../boxes/index.js"; -import { FreEditor } from "../FreEditor.js"; -import { EMPTY_POST_ACTION, FrePostAction } from "./FreAction.js"; -import { FreTriggerUse } from "./FreTriggers.js" -import { FreLogger } from "../../logging/index.js"; - -export const FRECOMMAND_LOGGER = new FreLogger("FreCommand"); // .mute(); - -/** - * Abstract supercass for all commands in Freon. - * FreCommand is the only place where actual changes (coming from the editor) to the model should be made. - * - * The `undo()` function is not always implemented yet. - */ -export abstract class FreCommand { - /** - * Executes the action, should contain all model changes for this action. - * Returns a function that should be executed after the projection has been calculated as a result - * of the changes by `execute`. Otherwise, boxes and/or element that need to selected will not be available. - * @param box The box that is selected when invoking this command. - * @param text The text or keyboard shortcut or menu that invoked this command. // todo why do we need this here? - * @param editor The editor instance in which this command is invoked. - * @param index If the action is executed on a list, the index at which to execute the action. - */ - abstract execute(box: Box, text: FreTriggerUse, editor: FreEditor, index: number): FrePostAction; - - /** - * Undo this command. - * The assumption is that this will be done on the model in the state directly after executing this command. - * If this is not the case, the undo might give unexpected results. - * By keeping all executed commands on a stack, undo can be realized for multiple commands. - * - * @param box - * @param editor - */ - abstract undo(box: Box, editor: FreEditor): void; - // todo implement undo function in all subclasses of FreCommand -} - -class FreNullCommand extends FreCommand { - // @ts-ignore - // parameters present to adhere to base class signature - execute(box: Box, text: FreTriggerUse, editor: FreEditor): FrePostAction { - return EMPTY_POST_ACTION; - } - - // @ts-ignore - // parameters present to adhere to base class signature - undo(box: Box, editor: FreEditor): void { - /* to be done */ - } -} - -export const FRE_NULL_COMMAND: FreCommand = new FreNullCommand(); diff --git a/packages/core/src/editor/actions/FreCreateBinaryExpressionAction.ts b/packages/core/src/editor/actions/FreCreateBinaryExpressionAction.ts index 0ef8bab41..bc222d9bc 100644 --- a/packages/core/src/editor/actions/FreCreateBinaryExpressionAction.ts +++ b/packages/core/src/editor/actions/FreCreateBinaryExpressionAction.ts @@ -1,10 +1,10 @@ import { FreBinaryExpression } from "../../ast/index.js"; -import { FreUtils } from "../../util/index.js"; +import { AST } from "../../change-manager/index.js"; +import { BTREE, FRE_BINARY_EXPRESSION_LEFT, FreUtils, Selected } from "../../util/index.js"; import { Box } from "../boxes/index.js"; import { FreEditor } from "../FreEditor.js"; -import { FreAction } from "./FreAction.js"; -import { FreCommand } from "./FreCommand.js"; -import { FreCreateBinaryExpressionCommand } from "./FreCreateBinaryExpressionCommand.js"; +import { ACTION_LOGGER, FreAction, FrePostAction } from "./FreAction.js"; +import { FreTriggerUse, triggerTypeToString } from "./FreTriggers.js"; export class FreCreateBinaryExpressionAction extends FreAction { @@ -22,7 +22,30 @@ export class FreCreateBinaryExpressionAction extends FreAction { super(); } - command(): FreCommand { - return new FreCreateBinaryExpressionCommand(this.expressionBuilder); + execute(box: Box, trigger: FreTriggerUse, editor: FreEditor): FrePostAction { + // console.log("FreCreateBinaryExpressionCommand: trigger [" + triggerTypeToString(trigger) + "] part: "); + let selected: Selected + AST.change( () => { + selected = BTREE.insertBinaryExpression( + this.expressionBuilder(box, triggerTypeToString(trigger), editor), + box, + editor, + ); + }) + // TODO Check whether this fix works consistently correct. + const childProperty = selected.boxRoleToSelect === FRE_BINARY_EXPRESSION_LEFT ? "left" : "right"; + return function () { + ACTION_LOGGER.log( + "FreCreateBinaryExpressionCommand select after: " + + selected.element.freLanguageConcept() + + " ID " + + selected.element.freId() + + " rolr " + + childProperty, + ); + editor.selectElement(selected.element, childProperty); + editor.selectFirstEditableChildBox(selected.element); + }; } + } diff --git a/packages/core/src/editor/actions/FreCreateBinaryExpressionCommand.ts b/packages/core/src/editor/actions/FreCreateBinaryExpressionCommand.ts deleted file mode 100644 index 3a08387b3..000000000 --- a/packages/core/src/editor/actions/FreCreateBinaryExpressionCommand.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { FreBinaryExpression } from "../../ast/index.js"; -import { AST } from "../../change-manager/index.js"; -import { BTREE, FRE_BINARY_EXPRESSION_LEFT, Selected } from "../../util/index.js"; -import { Box } from "../boxes/index.js"; -import { FreEditor } from "../FreEditor.js"; -import { FreCaret } from "../util/index.js"; -import { FrePostAction } from "./FreAction.js"; -import { FreCommand, FRECOMMAND_LOGGER } from "./FreCommand.js"; -import { FreTriggerUse, triggerTypeToString } from "./FreTriggers.js"; - -export type FreBinaryExpressionBuilder = (box: Box, text: string, editor: FreEditor) => FreBinaryExpression; - -export class FreCreateBinaryExpressionCommand extends FreCommand { - expressionBuilder: FreBinaryExpressionBuilder; - boxRoleToSelect: string; - caretPosition: FreCaret; - - constructor(expressionBuilder: FreBinaryExpressionBuilder) { - super(); - this.expressionBuilder = expressionBuilder; - } - - execute(box: Box, trigger: FreTriggerUse, editor: FreEditor): FrePostAction { - // console.log("FreCreateBinaryExpressionCommand: trigger [" + triggerTypeToString(trigger) + "] part: "); - let selected: Selected - AST.change( () => { - selected = BTREE.insertBinaryExpression( - this.expressionBuilder(box, triggerTypeToString(trigger), editor), - box, - editor, - ); - }) - // TODO Check whether this fix works consistently correct. - const childProperty = selected.boxRoleToSelect === FRE_BINARY_EXPRESSION_LEFT ? "left" : "right"; - return function () { - FRECOMMAND_LOGGER.log( - "FreCreateBinaryExpressionCommand select after: " + - selected.element.freLanguageConcept() + - " ID " + - selected.element.freId() + - " rolr " + - childProperty, - ); - editor.selectElement(selected.element, childProperty); - editor.selectFirstEditableChildBox(selected.element); - }; - } - - // @ts-ignore - // parameters present to adhere to base class signature - undo() { - /* to be done */ - } -} diff --git a/packages/core/src/editor/actions/FreCreatePartAction.ts b/packages/core/src/editor/actions/FreCreatePartAction.ts index 1b5ffb12f..4d8666f6b 100644 --- a/packages/core/src/editor/actions/FreCreatePartAction.ts +++ b/packages/core/src/editor/actions/FreCreatePartAction.ts @@ -1,7 +1,10 @@ -import { FreUtils } from "../../util/index.js"; -import { FreAction } from "./FreAction.js"; -import { FreCommand } from "./FreCommand.js"; -import { FreCreatePartCommand } from "./FreCreatePartCommand.js"; +import { FreBinaryExpression, FreNode } from "../../ast/index.js"; +import { FreLanguage } from "../../language/index.js"; +import { BTREE, FreUtils } from "../../util/index.js"; +import { Box } from "../boxes/index.js"; +import { FreEditor } from "../FreEditor.js"; +import { ACTION_LOGGER, EMPTY_POST_ACTION, FreAction, FrePostAction } from "./FreAction.js"; +import { FreTriggerUse, isString, triggerTypeToString } from "./FreTriggers.js"; // import { FreLogger } from "../../logging"; // const LOGGER = new FreLogger("FreCreateElementAction"); @@ -22,7 +25,75 @@ export class FreCreatePartAction extends FreAction { FreUtils.initializeObject(this, initializer); } - command(): FreCommand { - return new FreCreatePartCommand(this.propertyName, this.conceptName, this.referenceShortcut); + /** + * + * @param box + * @param trigger + * @param editor + * @param index If the property is a list, the index in the list at which the created element will be stored. + */ + execute(box: Box, trigger: FreTriggerUse, editor: FreEditor, index?: number): FrePostAction { + // todo make index optional and set the default value to -1; + ACTION_LOGGER.log( + "CreatePartCommand: trigger [" + + triggerTypeToString(trigger) + + "] part: " + + this.conceptName + + " in " + + this.propertyName + + " index " + + index + + " refshort " + + this.referenceShortcut + + " parentbox " + + box?.node?.freLanguageConcept(), + ); + const ownerConcept: string = box.node.freLanguageConcept(); + const propName: string = this.propertyName; + const theModelElement = box.node[propName]; + + const newElement: FreNode = FreLanguage.getInstance().classifier(this.conceptName)?.creator({}); + if (newElement === undefined || newElement === null) { + // TODO Find out why this happens sometimes + ACTION_LOGGER.error("ActionBox action: Unexpected new element undefined"); + return EMPTY_POST_ACTION; + } + ACTION_LOGGER.log( + `FreCreatePartCommand: setting/adding to ${propName} of ${box.node.freId()} (${box.node.freLanguageConcept()}) to ${newElement.freId()} (${newElement.freLanguageConcept()})`, + ); + if (FreLanguage.getInstance().classifierProperty(ownerConcept, propName).isList) { + if (index >= 0) { + theModelElement.splice(index, 0, newElement); + } else { + theModelElement.push(newElement); + } + } else { + box.node[propName] = newElement; + } + if (!!trigger && isString(trigger) && !!this.referenceShortcut) { + newElement[this.referenceShortcut.propertyName] = FreLanguage.getInstance().referenceCreator( + trigger, + this.referenceShortcut.conceptName, + ); + } + // Always rebalance for a binary expression + if (newElement.freIsBinaryExpression()) { + BTREE.balanceTree(newElement as FreBinaryExpression, editor); + } + return function () { + // editor.selectElement(newElement); + // tslint:disable-next-line:max-line-length + ACTION_LOGGER.log( + "CreatePartCommand: newElement:" + + newElement.freId() + + " " + + newElement.freLanguageConcept() + + ", selected element: " + + editor.selectedBox.node.freId() + + " of kind " + + editor.selectedBox.kind, + ); + editor.selectFirstEditableChildBox(newElement, true); + }; } } diff --git a/packages/core/src/editor/actions/FreCreatePartCommand.ts b/packages/core/src/editor/actions/FreCreatePartCommand.ts deleted file mode 100644 index feb427de7..000000000 --- a/packages/core/src/editor/actions/FreCreatePartCommand.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { BTREE } from "../../util/index.js"; -import { EMPTY_POST_ACTION, FrePostAction, ReferenceShortcut } from "./FreAction.js"; -import { Box } from "../boxes/index.js"; -import { isString, FreTriggerUse, triggerTypeToString } from "./FreTriggers.js"; -import { FreEditor } from "../FreEditor.js"; -import { FreBinaryExpression, FreNode } from "../../ast/index.js"; -import { FreLanguage } from "../../language/index.js"; -import { FreCommand, FRECOMMAND_LOGGER } from "./FreCommand.js"; - -/** - * Command to create a part (child) of a FreElement. - * The FreElement of the box on which this command is executed shpould have a property with `propertyName` of - * type `conceptName`. - */ -export class FreCreatePartCommand extends FreCommand { - propertyName: string; // The name of the property in which the created element will be stored. - conceptName: string; // The name of the concept that will be created. - referenceShortcut: ReferenceShortcut; // todo - - constructor(propertyName: string, conceptName: string, referenceShortcut: ReferenceShortcut) { - super(); - this.propertyName = propertyName; - this.conceptName = conceptName; - this.referenceShortcut = referenceShortcut; - FRECOMMAND_LOGGER.log("+++++++++++++++ Create part command " + propertyName + ", " + conceptName); - } - - /** - * - * @param box - * @param trigger - * @param editor - * @param index If the property is a list, the index in the list at which the created element will be stored. - */ - execute(box: Box, trigger: FreTriggerUse, editor: FreEditor, index: number): FrePostAction { - // todo make index optional and set the default value to -1; - FRECOMMAND_LOGGER.log( - "CreatePartCommand: trigger [" + - triggerTypeToString(trigger) + - "] part: " + - this.conceptName + - " in " + - this.propertyName + - " index " + - index + - " refshort " + - this.referenceShortcut + - " parentbox " + - box?.node?.freLanguageConcept(), - ); - const ownerConcept: string = box.node.freLanguageConcept(); - const propName: string = this.propertyName; - const theModelElement = box.node[propName]; - - const newElement: FreNode = FreLanguage.getInstance().classifier(this.conceptName)?.creator({}); - if (newElement === undefined || newElement === null) { - // TODO Find out why this happens sometimes - FRECOMMAND_LOGGER.error("ActionBox action: Unexpected new element undefined"); - return EMPTY_POST_ACTION; - } - FRECOMMAND_LOGGER.log( - `FreCreatePartCommand: setting/adding to ${propName} of ${box.node.freId()} (${box.node.freLanguageConcept()}) to ${newElement.freId()} (${newElement.freLanguageConcept()})`, - ); - if (FreLanguage.getInstance().classifierProperty(ownerConcept, propName).isList) { - if (index >= 0) { - theModelElement.splice(index, 0, newElement); - } else { - theModelElement.push(newElement); - } - } else { - box.node[propName] = newElement; - } - if (!!trigger && isString(trigger) && !!this.referenceShortcut) { - newElement[this.referenceShortcut.propertyName] = FreLanguage.getInstance().referenceCreator( - trigger, - this.referenceShortcut.conceptName, - ); - } - // Always rebalance for a binary expression - if (newElement.freIsBinaryExpression()) { - BTREE.balanceTree(newElement as FreBinaryExpression, editor); - } - return function () { - // editor.selectElement(newElement); - // tslint:disable-next-line:max-line-length - FRECOMMAND_LOGGER.log( - "CreatePartCommand: newElement:" + - newElement.freId() + - " " + - newElement.freLanguageConcept() + - ", selected element: " + - editor.selectedBox.node.freId() + - " of kind " + - editor.selectedBox.kind, - ); - editor.selectFirstEditableChildBox(newElement, true); - }; - } - - // @ts-ignore - // parameters present to adhere to base class signature - undo(box: Box, editor: FreEditor) { - /* to be done */ - } -} diff --git a/packages/core/src/editor/actions/FreCreateSiblingAction.ts b/packages/core/src/editor/actions/FreCreateSiblingAction.ts index c26643217..512495d72 100644 --- a/packages/core/src/editor/actions/FreCreateSiblingAction.ts +++ b/packages/core/src/editor/actions/FreCreateSiblingAction.ts @@ -1,7 +1,10 @@ +import { FreNode } from "../../ast/index.js"; +import { FreLanguage } from "../../language/index.js"; import { FreUtils } from "../../util/index.js"; -import { FreAction } from "./FreAction.js"; -import { FreCommand } from "./FreCommand.js"; -import { FreCreateSiblingCommand } from "./FreCreateSiblingCommand.js"; +import { Box } from "../boxes/index.js"; +import { FreEditor } from "../FreEditor.js"; +import { ACTION_LOGGER, EMPTY_POST_ACTION, FreAction, FrePostAction } from "./FreAction.js"; +import { FreTriggerUse, isString, triggerTypeToString } from "./FreTriggers.js"; // import { FreLogger } from "../../logging"; // const LOGGER = new FreLogger("FreCreateSiblingAction"); @@ -19,7 +22,56 @@ export class FreCreateSiblingAction extends FreAction { FreUtils.initializeObject(this, initializer); } - command(): FreCommand { - return new FreCreateSiblingCommand(this.conceptName, null); + /** + * + * @param box + * @param trigger + * @param editor + * @param index If the property is a list, the index in the list at which the created element will be stored. + */ + execute(box: Box, trigger: FreTriggerUse, editor: FreEditor): FrePostAction { + // todo make index optional and set the default value to -1; + ACTION_LOGGER.log( + "CreateSiblingCommand: trigger [" + + triggerTypeToString(trigger) + + "] part: " + + this.conceptName + + " refshort " + + this.referenceShortcut, + ); + const ownerDescriptor = box.node.freOwnerDescriptor(); + const ownerConcept: string = ownerDescriptor.owner.freLanguageConcept(); + const propName: string = ownerDescriptor.propertyName; + let theModelElement = ownerDescriptor.owner[propName]; + + const newElement: FreNode = FreLanguage.getInstance().concept(this.conceptName)?.creator({}); + if (newElement === undefined || newElement === null) { + // TODO Find out why this happens sometimes + ACTION_LOGGER.error("FreCreateSiblingCommand: Unexpected new element undefined"); + return EMPTY_POST_ACTION; + } + if (FreLanguage.getInstance().classifierProperty(ownerConcept, propName).isList) { + theModelElement.splice(ownerDescriptor.propertyIndex + 1, 0, newElement); + } else { + theModelElement = newElement; + } + if (!!trigger && isString(trigger) && !!this.referenceShortcut) { + newElement[this.referenceShortcut.propertyName] = FreLanguage.getInstance().referenceCreator( + trigger, + this.referenceShortcut.conceptName, + ); + } + const self = this; + if (!!this.boxRoleToSelect) { + return function () { + editor.selectElementBox(newElement, self.boxRoleToSelect); + }; + } else { + return function () { + editor.selectElement(newElement); + editor.selectFirstEditableChildBox(newElement); + }; + } } + } diff --git a/packages/core/src/editor/actions/FreCreateSiblingCommand.ts b/packages/core/src/editor/actions/FreCreateSiblingCommand.ts deleted file mode 100644 index f5450b0f2..000000000 --- a/packages/core/src/editor/actions/FreCreateSiblingCommand.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { EMPTY_POST_ACTION, FrePostAction, ReferenceShortcut } from "./FreAction.js"; -import { Box } from "../boxes/index.js"; -import { isString, FreTriggerUse, triggerTypeToString } from "./FreTriggers.js"; -import { FreEditor } from "../FreEditor.js"; -import { FreNode } from "../../ast/index.js"; -import { FreLanguage } from "../../language/index.js"; -import { FreCommand, FRECOMMAND_LOGGER } from "./FreCommand.js"; - -/** - * Command to create a part (child) of a FreElement. - * The FreElement of the box on which this command is executed shpould have a property with `propertyName` of - * type `conceptName`. - */ -export class FreCreateSiblingCommand extends FreCommand { - // propertyName: string; // The name of the property in which the created element will be stored. - conceptName: string; // The name of the concept that will be created. - referenceShortcut: ReferenceShortcut; // todo - boxRoleToSelect: string; - - constructor(conceptName: string, referenceShortcut: ReferenceShortcut, boxRoleToSelect?: string) { - super(); - this.conceptName = conceptName; - this.referenceShortcut = referenceShortcut; - this.boxRoleToSelect = boxRoleToSelect; - } - - /** - * - * @param box - * @param trigger - * @param editor - * @param index If the property is a list, the index in the list at which the created element will be stored. - */ - execute(box: Box, trigger: FreTriggerUse, editor: FreEditor): FrePostAction { - // todo make index optional and set the default value to -1; - FRECOMMAND_LOGGER.log( - "CreateSiblingCommand: trigger [" + - triggerTypeToString(trigger) + - "] part: " + - this.conceptName + - " refshort " + - this.referenceShortcut, - ); - const ownerDescriptor = box.node.freOwnerDescriptor(); - const ownerConcept: string = ownerDescriptor.owner.freLanguageConcept(); - const propName: string = ownerDescriptor.propertyName; - let theModelElement = ownerDescriptor.owner[propName]; - - const newElement: FreNode = FreLanguage.getInstance().concept(this.conceptName)?.creator({}); - if (newElement === undefined || newElement === null) { - // TODO Find out why this happens sometimes - FRECOMMAND_LOGGER.error("FreCreateSiblingCommand: Unexpected new element undefined"); - return EMPTY_POST_ACTION; - } - if (FreLanguage.getInstance().classifierProperty(ownerConcept, propName).isList) { - theModelElement.splice(ownerDescriptor.propertyIndex + 1, 0, newElement); - } else { - theModelElement = newElement; - } - if (!!trigger && isString(trigger) && !!this.referenceShortcut) { - newElement[this.referenceShortcut.propertyName] = FreLanguage.getInstance().referenceCreator( - trigger, - this.referenceShortcut.conceptName, - ); - } - const self = this; - if (!!this.boxRoleToSelect) { - return function () { - editor.selectElementBox(newElement, self.boxRoleToSelect); - }; - } else { - return function () { - editor.selectElement(newElement); - editor.selectFirstEditableChildBox(newElement); - }; - } - } - - // @ts-ignore - // parameters present to adhere to base class signature - undo(box: Box, editor: FreEditor) { - /* to be done */ - } -} diff --git a/packages/core/src/editor/actions/FreCustomAction.ts b/packages/core/src/editor/actions/FreCustomAction.ts index 3e29099c4..749052247 100644 --- a/packages/core/src/editor/actions/FreCustomAction.ts +++ b/packages/core/src/editor/actions/FreCustomAction.ts @@ -1,9 +1,15 @@ +import { AST } from "../../change-manager/index.js"; import { FreUtils } from "../../util/index.js"; -import { FreAction, CustomAction, FreCustomCommand } from "./internal.js"; -import { FreCommand } from "./FreCommand.js"; -// import { FreLogger } from "../../logging"; - -// const LOGGER = new FreLogger("FreCustomAction"); +import { Box } from "../boxes/index.js"; +import { FreEditor } from "../FreEditor.js"; +import { + FreAction, + CustomAction, + FreTriggerUse, + FrePostAction, + triggerTypeToString, + ACTION_LOGGER +} from "./internal.js"; export class FreCustomAction extends FreAction { static create(initializer?: Partial) { @@ -20,7 +26,45 @@ export class FreCustomAction extends FreAction { super(); } - command(): FreCommand { - return new FreCustomCommand(this.action, this.boxRoleToSelect, this.caretPosition); + /** + * @see FreAction.execute + * @param box + * @param trigger + * @param editor + */ + override execute(box: Box, trigger: FreTriggerUse, editor: FreEditor): FrePostAction { + ACTION_LOGGER.log("FreCustomCommand: trigger [" + triggerTypeToString(trigger) + "]"); + ACTION_LOGGER.log("FreCustomCommand: action [" + this.action + "]"); + const self = this; + let selected + AST.change( () => { + selected = self.action(box, triggerTypeToString(trigger), editor); + }) + if (!!selected) { + if (!!self.boxRoleToSelect) { + return function () { + ACTION_LOGGER.log("FreCustomCommand select " + box.node.freLanguageConcept() + " box " + self.boxRoleToSelect); + editor.selectElementBox(selected, self.boxRoleToSelect, self.caretPosition); + }; + } else { + // Default: select the first editable child of the selected element + return function () { + ACTION_LOGGER.log("editor.selectFirstEditableChildBox(selected) "); + editor.selectFirstEditableChildBox(selected); + }; + } + } + return function(): void { + // TODO "REFERENCE" is a quickfix to get the selection correct + if (self.boxRoleToSelect === "REFERENCE") { + const index = (box.node[box.propertyName] as Array).length -1 + // const empty = editor.findBoxForNode(box.node, box.propertyName) + editor.selectElement(box.node, box.propertyName, index) + editor.selectNextLeaf() + ACTION_LOGGER.log(`REFERENCE node ${box.node.freId()} prop ${box.propertyName} index ${index}`) + } + } + // return EMPTY_POST_ACTION; } + } diff --git a/packages/core/src/editor/actions/FreCustomCommand.ts b/packages/core/src/editor/actions/FreCustomCommand.ts deleted file mode 100644 index 607fcd9f4..000000000 --- a/packages/core/src/editor/actions/FreCustomCommand.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { AST } from "../../change-manager/index.js"; -import { Box } from "../boxes/index.js"; -import { FreEditor } from "../FreEditor.js"; -import { FreCaret } from "../util/index.js"; -import { CustomAction, EMPTY_POST_ACTION, FrePostAction } from "./FreAction.js"; -import { FreCommand, FRECOMMAND_LOGGER } from "./FreCommand.js"; -import { FreTriggerUse, triggerTypeToString } from "./FreTriggers.js"; - -export class FreCustomCommand extends FreCommand { - boxRoleToSelect: string; - caretPosition: FreCaret; - action: CustomAction; - - constructor(action: CustomAction, boxRoleToSelect: string, caretPosition: FreCaret) { - super(); - this.action = action; - this.boxRoleToSelect = boxRoleToSelect; - this.caretPosition = caretPosition; - } - - execute(box: Box, trigger: FreTriggerUse, editor: FreEditor): FrePostAction { - FRECOMMAND_LOGGER.log("FreCustomCommand: trigger [" + triggerTypeToString(trigger) + "]"); - FRECOMMAND_LOGGER.log("FreCustomCommand: action [" + this.action + "]"); - const self = this; - let selected - AST.change( () => { - selected = self.action(box, triggerTypeToString(trigger), editor); - }) - if (!!selected) { - if (!!self.boxRoleToSelect) { - return function () { - console.log("FreCustomCommand select " + box.node.freLanguageConcept() + " box " + self.boxRoleToSelect); - editor.selectElementBox(selected, self.boxRoleToSelect, self.caretPosition); - }; - } else { - // Default: select the first editable child of the selected element - return function () { - editor.selectFirstEditableChildBox(selected); - }; - } - } - return EMPTY_POST_ACTION; - } - - // @ts-ignore - // parameters present to adhere to base class signature - undo() { - /* to be done */ - } -} diff --git a/packages/core/src/editor/actions/internal.ts b/packages/core/src/editor/actions/internal.ts index a8129b394..063d277f2 100644 --- a/packages/core/src/editor/actions/internal.ts +++ b/packages/core/src/editor/actions/internal.ts @@ -7,12 +7,9 @@ * concepts that are using them. */ -export * from "./FreCommand.js"; export * from "./FreAction.js"; export * from "./FreCustomAction.js"; export * from "./FreCreateBinaryExpressionAction.js"; export * from "./FreCreatePartAction.js"; export * from "./FreCreateSiblingAction.js"; export * from "./FreTriggers.js"; -export * from "./FreCreateBinaryExpressionCommand.js" -export * from "./FreCustomCommand.js" diff --git a/packages/core/src/editor/boxes/ActionBox.ts b/packages/core/src/editor/boxes/ActionBox.ts index f4bb268e2..11be1d0f0 100644 --- a/packages/core/src/editor/boxes/ActionBox.ts +++ b/packages/core/src/editor/boxes/ActionBox.ts @@ -63,8 +63,8 @@ export class ActionBox extends AbstractChoiceBox { } } }); - } else if (!!this.propertyName) { - // Reference property + } else if (!isNullOrUndefined(this.propertyName)) { + // Only has a propertyname, so it is a reference property const propDef: FreLanguageProperty = FreLanguage.getInstance().classifierProperty( this.node.freLanguageConcept(), this.propertyName, @@ -98,7 +98,7 @@ export class ActionBox extends AbstractChoiceBox { conceptName: string, concept: FreLanguageConcept, ): SelectOption { - LOGGER.log("ActionBox.createElementAction property: " + propertyName + " concept " + conceptName); + LOGGER.log("createElementAction property: " + propertyName + " concept " + conceptName); return { id: conceptName, label: concept.trigger, @@ -119,6 +119,7 @@ export class ActionBox extends AbstractChoiceBox { */ private addReferenceShortcuts(concept: FreLanguageConcept, result: SelectOption[], editor: FreEditor) { // Create the new element for this behavior inside a dummy and then point the owner to the + LOGGER.log("addReferenceShortcuts") // current element. This way the new element is not part of the model and will not trigger mobx // reactions. But the scoper can be used to find available references, because the scoper only // needs the owner. @@ -186,6 +187,7 @@ export class ActionBox extends AbstractChoiceBox { parentNode[property.name].push(FreNodeReference.create(name, null)); return null; }, + boxRoleToSelect: "REFERENCE" }), })), ); diff --git a/packages/core/src/editor/boxes/ButtonBox.ts b/packages/core/src/editor/boxes/ButtonBox.ts index 0dbe2de37..2e9291519 100644 --- a/packages/core/src/editor/boxes/ButtonBox.ts +++ b/packages/core/src/editor/boxes/ButtonBox.ts @@ -27,8 +27,7 @@ export class ButtonBox extends Box { // execute the action let postAction: FrePostAction = null; AST.changeNamed("ButtonBox.executeAction", () => { - const command = action.command(); - postAction = command.execute(this, "no-label", editor, -1); + postAction = action.execute(this, "no-label", editor, -1); }); if (!!postAction) { postAction(); diff --git a/packages/core/src/editor/util/BehaviorUtils.ts b/packages/core/src/editor/util/BehaviorUtils.ts index 4e353d23a..137d629f1 100644 --- a/packages/core/src/editor/util/BehaviorUtils.ts +++ b/packages/core/src/editor/util/BehaviorUtils.ts @@ -43,8 +43,7 @@ export function executeBehavior(box: Box, text: string, label: string, editor: F let execresult: FrePostAction = null; if (matchArray !== null && label === matchArray[0]) { runInAction(() => { - const command = action.command(); - execresult = command.execute(box, label, editor, index); + execresult = action.execute(box, label, editor, index); }); if (!!execresult) { execresult(); @@ -56,8 +55,7 @@ export function executeBehavior(box: Box, text: string, label: string, editor: F LOGGER.log(` executeBehavior: MATCH DFULL TEXT label [${label}] refshortcut [${action.referenceShortcut}]`); let postAction: FrePostAction; runInAction(() => { - const command = action.command(); - postAction = command.execute(box, label, editor, index); + postAction = action.execute(box, label, editor, index); }); postAction(); return BehaviorExecutionResult.EXECUTED; @@ -95,8 +93,7 @@ export function executeSingleBehavior( const index = -1; // todo get the correct index AST.change(() => { - const command = action.command(); - execresult = command.execute(box, label, editor, index); + execresult = action.execute(box, label, editor, index); }); if (!!execresult) { execresult(); diff --git a/packages/core/src/editor/util/FreEditorUtil.ts b/packages/core/src/editor/util/FreEditorUtil.ts index eecb58e80..28421bf69 100644 --- a/packages/core/src/editor/util/FreEditorUtil.ts +++ b/packages/core/src/editor/util/FreEditorUtil.ts @@ -1,6 +1,6 @@ import { AST } from "../../change-manager/index.js"; import { FreLogger } from "../../logging/index.js"; -import { Box, FRE_NULL_COMMAND, FreCommand, FreEditor } from "../index.js"; +import { Box, FreAction, FreEditor } from "../index.js"; import { FreExpressionNode } from "../../ast/index.js"; import { isFreExpression } from "../../ast-utils/index.js"; import { isProKey, FreTriggerUse } from "../actions/index.js"; @@ -40,7 +40,7 @@ export class FreEditorUtil { */ // TODO question: freKey has type FreTriggerUSe which is either a string or a FreKey, but the check here says that freKey must be a 'isProKey', // which tests whether its input is a FreKey. Why??? - static findKeyboardShortcutCommand(freKey: FreTriggerUse, box: Box, editor: FreEditor): FreCommand { + static findKeyboardShortcutAction(freKey: FreTriggerUse, box: Box, editor: FreEditor): FreAction { LOGGER.log( "findKeyboardShortcutCommand for box " + box.role + @@ -62,14 +62,14 @@ export class FreEditorUtil { if (act.trigger.meta === freKey.meta && act.trigger.key === freKey.key) { if (act.activeInBoxRoles.includes(box.role)) { LOGGER.log("findKeyboardShortcutCommand: executing keyboard action"); - return act.command(); + return act; } else { LOGGER.log("findKeyboardShortcutCommand: Keyboard action does not include role " + box.role); } } } } - return FRE_NULL_COMMAND; + return null; } } diff --git a/packages/meta/src/editordef/generator/templates/DefaultActionsTemplate.ts b/packages/meta/src/editordef/generator/templates/DefaultActionsTemplate.ts index 9157160fb..6d0f7496d 100644 --- a/packages/meta/src/editordef/generator/templates/DefaultActionsTemplate.ts +++ b/packages/meta/src/editordef/generator/templates/DefaultActionsTemplate.ts @@ -134,11 +134,19 @@ export class DefaultActionsTemplate { } } else { // reference - rolename = Roles.propertyRole( - myClassifier.name, - optionalPropertyName, - "referencebox", - ); + if (prop.isList) { + rolename = Roles.propertyRole( + myClassifier.name, + optionalPropertyName, + "new-list-item" + ) + } else { + rolename = Roles.propertyRole( + myClassifier.name, + optionalPropertyName, + "referencebox", + ); + } } } result += `${Names.FreCustomAction}.create( diff --git a/packages/samples/Example/src/defs/LanguageDefinition-default.edit b/packages/samples/Example/src/defs/LanguageDefinition-default.edit index e24acac86..e5fe3eecb 100644 --- a/packages/samples/Example/src/defs/LanguageDefinition-default.edit +++ b/packages/samples/Example/src/defs/LanguageDefinition-default.edit @@ -11,7 +11,7 @@ Attribute { } Entity { [ - ${abstract} entity ${name} [? base ${baseEntity}] { + ${abstract} entity ${name} [? base ${baseEntity}] [? implements ${baseInterfaces}] { ${attributes } ${methods vertical } } @@ -22,6 +22,7 @@ ExampleUnit { [ ${documentation} unit ${name} { + ${interfaces vertical } ${entities vertical } unit level methods: ${methods vertical} diff --git a/packages/samples/Example/src/defs/LanguageDefinition.ast b/packages/samples/Example/src/defs/LanguageDefinition.ast index e29819657..5fb6c5f83 100644 --- a/packages/samples/Example/src/defs/LanguageDefinition.ast +++ b/packages/samples/Example/src/defs/LanguageDefinition.ast @@ -10,6 +10,7 @@ modelunit ExampleUnit { documentation: Documentation; name: identifier; entities: Entity[]; + interfaces: Interface[]; methods: Method[]; file-extension = "exm"; } @@ -21,11 +22,16 @@ concept Documentation { interface Type base BaseType { } +concept Interface implements Type { + methods: Method[]; +} + concept Entity implements Type { abstract: boolean; attributes: Attribute[]; methods: Method[]; reference baseEntity?: Entity; + reference baseInterfaces: Interface[]; } concept Method { diff --git a/packages/server/modelstore/Model8/AnnesUnit.json b/packages/server/modelstore/Model8/AnnesUnit.json index f44c5dc40..1704faf8f 100644 --- a/packages/server/modelstore/Model8/AnnesUnit.json +++ b/packages/server/modelstore/Model8/AnnesUnit.json @@ -20,6 +20,16 @@ } ], "containments": [ + { + "containment": { + "language": "-default-key-Example", + "version": "2023.1", + "key": "-default-key-ExampleUnit-documentation" + }, + "children": [ + "ID-23" + ] + }, { "containment": { "language": "-default-key-Example", @@ -30,6 +40,17 @@ "ID-19" ] }, + { + "containment": { + "language": "-default-key-Example", + "version": "2023.1", + "key": "-default-key-ExampleUnit-interfaces" + }, + "children": [ + "ID-24", + "ID-25" + ] + }, { "containment": { "language": "-default-key-Example", @@ -43,6 +64,28 @@ "annotations": [], "parent": null }, + { + "id": "ID-23", + "classifier": { + "language": "-default-key-Example", + "version": "2023.1", + "key": "-default-key-Documentation" + }, + "properties": [ + { + "property": { + "language": "-default-key-Example", + "version": "2023.1", + "key": "-default-key-Documentation-text" + }, + "value": "" + } + ], + "containments": [], + "references": [], + "annotations": [], + "parent": "ID-18" + }, { "id": "ID-19", "classifier": { @@ -51,6 +94,14 @@ "key": "-default-key-Entity" }, "properties": [ + { + "property": { + "language": "-default-key-Example", + "version": "2023.1", + "key": "-default-key-Entity-abstract" + }, + "value": "false" + }, { "property": { "language": "-default-key-Example", @@ -82,7 +133,16 @@ ] } ], - "references": [], + "references": [ + { + "reference": { + "language": "-default-key-Example", + "version": "2023.1", + "key": "-default-key-Entity-baseInterfaces" + }, + "targets": [] + } + ], "annotations": [], "parent": "ID-18" }, @@ -152,6 +212,68 @@ "references": [], "annotations": [], "parent": "ID-19" + }, + { + "id": "ID-24", + "classifier": { + "language": "-default-key-Example", + "version": "2023.1", + "key": "-default-key-Interface" + }, + "properties": [ + { + "property": { + "language": "-default-key-Example", + "version": "2023.1", + "key": "-default-key-BaseType-name" + }, + "value": "One" + } + ], + "containments": [ + { + "containment": { + "language": "-default-key-Example", + "version": "2023.1", + "key": "-default-key-Interface-methods" + }, + "children": [] + } + ], + "references": [], + "annotations": [], + "parent": "ID-18" + }, + { + "id": "ID-25", + "classifier": { + "language": "-default-key-Example", + "version": "2023.1", + "key": "-default-key-Interface" + }, + "properties": [ + { + "property": { + "language": "-default-key-Example", + "version": "2023.1", + "key": "-default-key-BaseType-name" + }, + "value": "Two" + } + ], + "containments": [ + { + "containment": { + "language": "-default-key-Example", + "version": "2023.1", + "key": "-default-key-Interface-methods" + }, + "children": [] + } + ], + "references": [], + "annotations": [], + "parent": "ID-18" } ] -} \ No newline at end of file +} diff --git a/packages/server/modelstore/Model8/AnnesUnitPublic.json b/packages/server/modelstore/Model8/AnnesUnitPublic.json index f44c5dc40..1704faf8f 100644 --- a/packages/server/modelstore/Model8/AnnesUnitPublic.json +++ b/packages/server/modelstore/Model8/AnnesUnitPublic.json @@ -20,6 +20,16 @@ } ], "containments": [ + { + "containment": { + "language": "-default-key-Example", + "version": "2023.1", + "key": "-default-key-ExampleUnit-documentation" + }, + "children": [ + "ID-23" + ] + }, { "containment": { "language": "-default-key-Example", @@ -30,6 +40,17 @@ "ID-19" ] }, + { + "containment": { + "language": "-default-key-Example", + "version": "2023.1", + "key": "-default-key-ExampleUnit-interfaces" + }, + "children": [ + "ID-24", + "ID-25" + ] + }, { "containment": { "language": "-default-key-Example", @@ -43,6 +64,28 @@ "annotations": [], "parent": null }, + { + "id": "ID-23", + "classifier": { + "language": "-default-key-Example", + "version": "2023.1", + "key": "-default-key-Documentation" + }, + "properties": [ + { + "property": { + "language": "-default-key-Example", + "version": "2023.1", + "key": "-default-key-Documentation-text" + }, + "value": "" + } + ], + "containments": [], + "references": [], + "annotations": [], + "parent": "ID-18" + }, { "id": "ID-19", "classifier": { @@ -51,6 +94,14 @@ "key": "-default-key-Entity" }, "properties": [ + { + "property": { + "language": "-default-key-Example", + "version": "2023.1", + "key": "-default-key-Entity-abstract" + }, + "value": "false" + }, { "property": { "language": "-default-key-Example", @@ -82,7 +133,16 @@ ] } ], - "references": [], + "references": [ + { + "reference": { + "language": "-default-key-Example", + "version": "2023.1", + "key": "-default-key-Entity-baseInterfaces" + }, + "targets": [] + } + ], "annotations": [], "parent": "ID-18" }, @@ -152,6 +212,68 @@ "references": [], "annotations": [], "parent": "ID-19" + }, + { + "id": "ID-24", + "classifier": { + "language": "-default-key-Example", + "version": "2023.1", + "key": "-default-key-Interface" + }, + "properties": [ + { + "property": { + "language": "-default-key-Example", + "version": "2023.1", + "key": "-default-key-BaseType-name" + }, + "value": "One" + } + ], + "containments": [ + { + "containment": { + "language": "-default-key-Example", + "version": "2023.1", + "key": "-default-key-Interface-methods" + }, + "children": [] + } + ], + "references": [], + "annotations": [], + "parent": "ID-18" + }, + { + "id": "ID-25", + "classifier": { + "language": "-default-key-Example", + "version": "2023.1", + "key": "-default-key-Interface" + }, + "properties": [ + { + "property": { + "language": "-default-key-Example", + "version": "2023.1", + "key": "-default-key-BaseType-name" + }, + "value": "Two" + } + ], + "containments": [ + { + "containment": { + "language": "-default-key-Example", + "version": "2023.1", + "key": "-default-key-Interface-methods" + }, + "children": [] + } + ], + "references": [], + "annotations": [], + "parent": "ID-18" } ] -} \ No newline at end of file +} diff --git a/packages/webapp-starter/src/starter.ts b/packages/webapp-starter/src/starter.ts index fb08b0ef5..29ff07928 100644 --- a/packages/webapp-starter/src/starter.ts +++ b/packages/webapp-starter/src/starter.ts @@ -1,32 +1,6 @@ import { FreonLayout, WebappConfigurator } from "@freon4dsl/webapp-lib"; import {FreLogger, ServerCommunication} from "@freon4dsl/core"; // import { LionWebRepositoryCommunication } from "@freon4dsl/core" -import { setCustomComponents } from "@freon4dsl/core-svelte"; -// For DocuProject: -// import ShowAnimatedGif from "./customComponents/forDocuProject/ShowAnimatedGif.svelte"; -// import SMUI_Card_Component from "./customComponents/forDocuProject/SMUI_Card_Component.svelte"; -// import SMUI_Accordion from "./customComponents/forDocuProject/SMUI_Accordion.svelte"; -// import SMUI_Dialog from "./customComponents/forDocuProject/SMUI_Dialog.svelte"; -// import DatePicker from "./customComponents/forDocuProject/DatePicker.svelte"; -// import {InsuranceModelEnvironment} from "@freon4dsl/samples-docuproject"; -// For ExternalTester -// import BooleanWrapperComponent from "./customComponents/forExternalTester/BooleanWrapperComponent.svelte"; -// import NumberWrapperComponent from "./customComponents/forExternalTester/NumberWrapperComponent.svelte"; -// import StringWrapperComponent from "./customComponents/forExternalTester/StringWrapperComponent.svelte"; -// import FragmentWrapperComponent from "./customComponents/forExternalTester/FragmentWrapperComponent.svelte"; -// import ExternalStringComponent from "./customComponents/forExternalTester/ExternalStringComponent.svelte"; -// import ExternalSimpleComponent from "./customComponents/forExternalTester/ExternalSimpleComponent.svelte"; -// import ExternalRefListComponent from "./customComponents/forExternalTester/ExternalRefListComponent.svelte"; -// import ExternalRefComponent from "./customComponents/forExternalTester/ExternalRefComponent.svelte"; -// import ExternalPartListComponent from "./customComponents/forExternalTester/ExternalPartListComponent.svelte"; -// import ExternalPartComponent from "./customComponents/forExternalTester/ExternalPartComponent.svelte"; -// import ExternalNumberComponent from "./customComponents/forExternalTester/ExternalNumberComponent.svelte"; -// import ExternalBooleanComponent from "./customComponents/forExternalTester/ExternalBooleanComponent.svelte"; -// import PartWrapperComponent from "./customComponents/forExternalTester/PartWrapperComponent.svelte"; -// import PartListWrapperComponent from "./customComponents/forExternalTester/PartListWrapperComponent.svelte"; -// import RefWrapperComponent from "./customComponents/forExternalTester/RefWrapperComponent.svelte"; -// import RefListWrapperComponent from "./customComponents/forExternalTester/RefListWrapperComponent.svelte"; -// import { ExternalModelEnvironment } from "@freon4dsl/samples-external-tester"; /** * The one and only reference to the actual language for which this editor runs @@ -40,38 +14,6 @@ WebappConfigurator.getInstance().setEditorEnvironment(ExampleEnvironment.getInst // WebappConfigurator.getInstance().setServerCommunication(LionWebRepositoryCommunication.getInstance()); WebappConfigurator.getInstance().setServerCommunication(ServerCommunication.getInstance()); -/** - * Make the external components known to Freon before starting the app! - */ -// For DocuProject: -// setCustomComponents([ -// {component: ShowAnimatedGif, knownAs: "AnimatedGif"}, -// {component: SMUI_Card_Component, knownAs: "SMUI_Card"}, -// {component: SMUI_Accordion, knownAs: "SMUI_Accordion"}, -// {component: SMUI_Dialog, knownAs: "SMUI_Dialog"}, -// {component: DatePicker, knownAs: "DatePicker"} -// ]); -// For ExternalTester: -// setCustomComponents([ -// { component: BooleanWrapperComponent, knownAs: "booleanWrapper" }, -// { component: FragmentWrapperComponent, knownAs: "fragmentWrapper" }, -// { component: NumberWrapperComponent, knownAs: "numberWrapper" }, -// { component: PartWrapperComponent, knownAs: "partWrapper" }, -// { component: PartListWrapperComponent, knownAs: "partListWrapper" }, -// { component: RefWrapperComponent, knownAs: "refWrapper" }, -// { component: RefListWrapperComponent, knownAs: "refListWrapper" }, -// { component: StringWrapperComponent, knownAs: "stringWrapper" }, -// -// { component: ExternalBooleanComponent, knownAs: "booleanReplacer" }, -// { component: ExternalNumberComponent, knownAs: "numberReplacer" }, -// { component: ExternalPartComponent, knownAs: "partReplacer" }, -// { component: ExternalPartListComponent, knownAs: "partListReplacer" }, -// { component: ExternalRefComponent, knownAs: "refReplacer" }, -// { component: ExternalRefListComponent, knownAs: "refListReplacer" }, -// { component: ExternalSimpleComponent, knownAs: "simple" }, -// { component: ExternalStringComponent, knownAs: "stringReplacer" }, -// ]); - /** * Now start the app ... */ @@ -79,4 +21,11 @@ const app = new FreonLayout({ target: document.body, }); +// FreLogger.unmute("FreProjectionHandler") +// FreLogger.unmute("TextComponent") +// FreLogger.unmute("TextDropdownComponent") +// FreLogger.unmute("DropdownComponent") +FreLogger.unmute("ActionBox") +FreLogger.unmute("BehaviorUtils") +FreLogger.setFilter(["beforeUpdate", "afterUpdate", "onMount", "REFRESH", "refresh", "setting text to"]) export default app;