From 831ff60bdf97c131266141d012bebf91dc01bf26 Mon Sep 17 00:00:00 2001 From: Faton Ramadani Date: Tue, 4 Apr 2023 16:00:50 +0200 Subject: [PATCH] App input (#1353) * feat(frontend): record frontend errors * feat(frontend): display result * feat(frontend): Fix name shadowing * feat(frontend): fix typo * fix(frontend): better display frontend errors * fix(frontend): wip * wip * feat(frontend): text input * feat(frontend): enable double click to open + disabled mode when input is computed or connected * feat(frontend): fix monaco setCode * feat(frontend): revert package.json changes * feat(frontend): fix syncing issues * feat(frontend): adapt style * feat(frontend): fix event propagation --- .../src/lib/components/TemplateEditor.svelte | 14 +- .../apps/components/display/AppText.svelte | 202 +++++++++++++----- .../components/helpers/AlignWrapper.svelte | 21 +- .../apps/editor/ComponentHeader.svelte | 21 +- .../apps/editor/component/Component.svelte | 10 + .../settingsPanel/ComponentPanel.svelte | 2 +- frontend/src/lib/components/apps/types.ts | 1 + frontend/src/lib/components/apps/utils.ts | 28 ++- frontend/tailwind.config.cjs | 40 ++++ 9 files changed, 264 insertions(+), 75 deletions(-) diff --git a/frontend/src/lib/components/TemplateEditor.svelte b/frontend/src/lib/components/TemplateEditor.svelte index f99265ee49..61247b1b8f 100644 --- a/frontend/src/lib/components/TemplateEditor.svelte +++ b/frontend/src/lib/components/TemplateEditor.svelte @@ -11,7 +11,8 @@ import libStdContent from '$lib/es5.d.ts.txt?raw' import { editor as meditor, languages, Range, Uri as mUri } from 'monaco-editor' import { buildWorkerDefinition } from 'monaco-editor-workers' - import { createEventDispatcher, onDestroy, onMount } from 'svelte' + import { createEventDispatcher, getContext, onDestroy, onMount } from 'svelte' + import type { AppViewerContext } from './apps/types' languages.typescript.javascriptDefaults.setCompilerOptions({ target: languages.typescript.ScriptTarget.Latest, @@ -372,6 +373,17 @@ let editor: meditor.IStandaloneCodeEditor let model: meditor.ITextModel + const { componentControl, selectedComponent } = getContext('AppViewerContext') + + if ($selectedComponent) { + $componentControl[$selectedComponent[0]] = { + setCode: (value: string) => { + code = value + setCode(value) + } + } + } + export let code: string = '' export let hash: string = createHash() export let automaticLayout = true diff --git a/frontend/src/lib/components/apps/components/display/AppText.svelte b/frontend/src/lib/components/apps/components/display/AppText.svelte index 1e8db81539..93c8b4e8dd 100644 --- a/frontend/src/lib/components/apps/components/display/AppText.svelte +++ b/frontend/src/lib/components/apps/components/display/AppText.svelte @@ -29,13 +29,15 @@ export let initializing: boolean | undefined = undefined export let customCss: ComponentCustomCSS<'textcomponent'> | undefined = undefined export let render: boolean + export let editorMode: boolean = false let resolvedConfig = initConfig( components['textcomponent'].initialData.configuration, configuration ) - const { app, worldStore, mode } = getContext('AppViewerContext') + const { app, worldStore, mode, componentControl } = + getContext('AppViewerContext') const editorcontext = getContext('AppEditorContext') @@ -79,10 +81,67 @@ } } + function getClassesByType() { + switch (resolvedConfig.style) { + case 'Title': + return 'h1-textarea' + case 'Subtitle': + return 'h3-textarea' + case 'Body': + return 'p-textarea' + case 'Caption': + return 'p-textarea' + case 'Label': + return 'label' + default: + return 'p-textarea' + } + } + let component = 'p' let classes = '' + + function getHorizontalAlignement() { + if (horizontalAlignment) { + switch (horizontalAlignment) { + case 'left': + return '!text-left' + case 'center': + return '!text-center' + case 'right': + return '!text-right' + default: + return '!text-left' + } + } + } + $: resolvedConfig.style && (component = getComponent()) $: resolvedConfig.style && (classes = getClasses()) + $: initialValue = componentInput?.type == 'template' ? componentInput.eval : '' + $: editableValue = initialValue ? JSON.parse(JSON.stringify(initialValue)) : '' + + let rows = 1 + + function onInput(e: Event) { + const target = e.target as HTMLTextAreaElement + + if (target.value) { + $componentControl[id]?.setCode?.(target.value) + editableValue + autosize() + } + } + + function autosize() { + const el = document.getElementById(`text-${id}`) + setTimeout(() => { + if (el !== null) { + el.style.cssText = 'height:auto; padding:0' + el.style.cssText = 'height:' + el.scrollHeight + 'px' + } + }, 0) + } {#each Object.keys(components['textcomponent'].initialData.configuration) as key (key)} @@ -95,58 +154,99 @@ {/each} -
- - {#if !result || result === ''} -
- No text -
- {:else} - -
{ - if ($mode === 'dnd' && componentInput?.type == 'template') { - let ontextfocus = editorcontext?.ontextfocus - if (ontextfocus) { - get(ontextfocus)?.() - } +
{ + if (!editorMode) { + editorMode = true + document.getElementById(`text-${id}`)?.focus() + autosize() + } + }} + on:keydown|stopPropagation + > + {#if editorMode && componentInput?.type == 'template'} + +