diff --git a/frontend/src/lib/components/apps/components/buttons/AppButton.svelte b/frontend/src/lib/components/apps/components/buttons/AppButton.svelte index e4c96b05e3..f0ee695f94 100644 --- a/frontend/src/lib/components/apps/components/buttons/AppButton.svelte +++ b/frontend/src/lib/components/apps/components/buttons/AppButton.svelte @@ -86,6 +86,33 @@ $: errorsMessage = Object.values(errors) .filter((x) => x != '') .join('\n') + + async function handleClick(event: CustomEvent) { + event?.stopPropagation() + event?.preventDefault() + + if (preclickAction) { + await preclickAction() + } + + ownClick = true + + if (!runnableComponent) { + if (gotoUrl) { + if (gotoNewTab) { + window.open(gotoUrl, '_blank') + } else { + goto(gotoUrl) + } + } + } else { + await runnableComponent?.runComponent() + } + + if (recomputeIds) { + await Promise.all(recomputeIds.map((id) => $runnableComponents?.[id]?.())) + } + } @@ -131,32 +158,7 @@ e?.stopPropagation() window.dispatchEvent(new Event('pointerup')) }} - on:click={async (e) => { - if (preclickAction) { - await preclickAction() - } - e?.stopPropagation() - e?.preventDefault() - ownClick = true - - if (!runnableComponent) { - if (gotoUrl) { - if (gotoNewTab) { - window.open(gotoUrl, '_blank') - } else { - goto(gotoUrl) - } - } - } else { - await runnableComponent?.runComponent() - } - - if (recomputeIds) { - recomputeIds.forEach((id) => { - $runnableComponents[id]?.() - }) - } - }} + on:click={handleClick} {size} {color} {loading} diff --git a/frontend/src/lib/components/apps/components/display/AppMap.svelte b/frontend/src/lib/components/apps/components/display/AppMap.svelte index 466b3c9196..d748338c97 100644 --- a/frontend/src/lib/components/apps/components/display/AppMap.svelte +++ b/frontend/src/lib/components/apps/components/display/AppMap.svelte @@ -164,7 +164,6 @@ function handleSyncRegion() { const gridItem = findGridItem($app, id) - if (!map || !gridItem) { return } diff --git a/frontend/src/lib/components/apps/components/display/AppPdf.svelte b/frontend/src/lib/components/apps/components/display/AppPdf.svelte index d56cf40362..f44b5ffc93 100644 --- a/frontend/src/lib/components/apps/components/display/AppPdf.svelte +++ b/frontend/src/lib/components/apps/components/display/AppPdf.svelte @@ -118,7 +118,6 @@ function scrollToPage(page: number) { page = pageNumber = minMax(page, 1, pages.length) const offset = (wrapper?.children.item(page - 1) as HTMLCanvasElement | null)?.offsetTop - // debugger if (!offset) { return } diff --git a/frontend/src/lib/components/apps/components/display/AppText.svelte b/frontend/src/lib/components/apps/components/display/AppText.svelte index c7473f9623..1b715ee069 100644 --- a/frontend/src/lib/components/apps/components/display/AppText.svelte +++ b/frontend/src/lib/components/apps/components/display/AppText.svelte @@ -10,6 +10,7 @@ import { twMerge } from 'tailwind-merge' import type { AppEditorContext, ComponentCustomCSS } from '../../types' import { getContext } from 'svelte' + import ResizeWrapper from '../helpers/ResizeWrapper.svelte' export let id: string export let componentInput: AppInput | undefined @@ -26,6 +27,7 @@ let result: string | undefined = undefined let style: 'Title' | 'Subtitle' | 'Body' | 'Caption' | 'Label' | undefined = undefined let copyButton: boolean + let fitContent = false function getComponent() { switch (style) { @@ -63,36 +65,39 @@ + - - {#if !result || result === ''} -
- No text -
- {:else} -
- - {String(result)} - - {#if copyButton && result} - - - Copy to clipboard - - {/if} -
- {/if} -
+ + + {#if !result || result === ''} +
+ No text +
+ {:else} +
+ + {String(result)} + + {#if copyButton && result} + + + Copy to clipboard + + {/if} +
+ {/if} +
+
diff --git a/frontend/src/lib/components/apps/components/display/table/AppTable.svelte b/frontend/src/lib/components/apps/components/display/table/AppTable.svelte index 79e66113be..86ec3c993a 100644 --- a/frontend/src/lib/components/apps/components/display/table/AppTable.svelte +++ b/frontend/src/lib/components/apps/components/display/table/AppTable.svelte @@ -64,11 +64,11 @@ let selectedRowIndex = -1 - function toggleRow(row: Record, rowIndex: number) { - if (selectedRowIndex !== rowIndex) { + function toggleRow(row: Record, rowIndex: number, force: boolean = false) { + if (selectedRowIndex !== rowIndex || force) { selectedRowIndex = rowIndex - outputs?.selectedRow.set(row.original) - outputs?.selectedRowIndex.set(rowIndex) + outputs?.selectedRow.set(row.original, force) + outputs?.selectedRowIndex.set(rowIndex, force) } } @@ -138,6 +138,9 @@ function rerender() { table = createSvelteTable(options) + if (result) { + toggleRow({ original: result[0] }, 0, true) + } } $: result && rerender() diff --git a/frontend/src/lib/components/apps/components/helpers/ResizeWrapper.svelte b/frontend/src/lib/components/apps/components/helpers/ResizeWrapper.svelte new file mode 100644 index 0000000000..97faadac64 --- /dev/null +++ b/frontend/src/lib/components/apps/components/helpers/ResizeWrapper.svelte @@ -0,0 +1,30 @@ + + +{#if shouldWrap} +
+ +
+{:else} + +{/if} diff --git a/frontend/src/lib/components/apps/components/helpers/RunnableComponent.svelte b/frontend/src/lib/components/apps/components/helpers/RunnableComponent.svelte index b01b2f3d95..f4eed9115e 100644 --- a/frontend/src/lib/components/apps/components/helpers/RunnableComponent.svelte +++ b/frontend/src/lib/components/apps/components/helpers/RunnableComponent.svelte @@ -2,10 +2,12 @@ import { goto } from '$app/navigation' import type { Schema } from '$lib/common' import Alert from '$lib/components/common/alert/Alert.svelte' + import Popover from '$lib/components/Popover.svelte' import SchemaForm from '$lib/components/SchemaForm.svelte' import TestJobLoader from '$lib/components/TestJobLoader.svelte' import { AppService, type CompletedJob } from '$lib/gen' - import { defaultIfEmptyString, emptySchema, sendUserToast } from '$lib/utils' + import { classNames, defaultIfEmptyString, emptySchema, sendUserToast } from '$lib/utils' + import { Bug } from 'lucide-svelte' import { getContext, onMount } from 'svelte' import type { AppInputs, Runnable } from '../../inputType' import type { Output } from '../../rx' @@ -104,7 +106,6 @@ } $: outputs?.loading?.set(testIsLoading) - $: schemaStripped = stripSchema(fields, $stateId) function stripSchema(inputs: AppInputs, s: any): Schema { @@ -276,16 +277,28 @@ Please select a runnable {:else if result?.error && $mode === 'preview'} -
- -
- An error occured, please contact the app author. - Job id: {testJob?.id} -
{JSON.stringify(result.error, null, 4)}
-				
-
-
+
+ + + +
+ +
+ An error occured, please contact the app author. + Job id: {testJob?.id} +
+
+
+
+
+
+
{:else} diff --git a/frontend/src/lib/components/apps/editor/ComponentHeader.svelte b/frontend/src/lib/components/apps/editor/ComponentHeader.svelte index c08d4a4834..b48c65aa5d 100644 --- a/frontend/src/lib/components/apps/editor/ComponentHeader.svelte +++ b/frontend/src/lib/components/apps/editor/ComponentHeader.svelte @@ -15,8 +15,7 @@ const dispatch = createEventDispatcher() - const { errorByComponent, openDebugRun, focusedGrid, worldStore } = - getContext('AppEditorContext') + const { errorByComponent, openDebugRun } = getContext('AppEditorContext') $: error = Object.values($errorByComponent).find((e) => e.componentId === component.id) diff --git a/frontend/src/lib/components/apps/editor/component/Component.svelte b/frontend/src/lib/components/apps/editor/component/Component.svelte index 4093917e34..e844411340 100644 --- a/frontend/src/lib/components/apps/editor/component/Component.svelte +++ b/frontend/src/lib/components/apps/editor/component/Component.svelte @@ -47,7 +47,7 @@ export let locked: boolean = false export let pointerdown: boolean = false - const { staticOutputs, mode, connectingInput, app } = + const { staticOutputs, mode, connectingInput, app, errorByComponent } = getContext('AppEditorContext') let hover = false let initializing: boolean | undefined = undefined @@ -57,6 +57,9 @@ // $: if (!deepEqual(component, pComponent)) { // component = JSON.parse(JSON.stringify(pComponent)) // } + + $: componentWithErrors = Object.values($errorByComponent).map((e) => e.componentId) + $: hasError = componentWithErrors.includes(component.id)
{:else if component.type === 'selectcomponent'} {:else if component.type === 'formbuttoncomponent'} {:else if component.type === 'checkboxcomponent'} {#if initializing}
diff --git a/frontend/src/lib/components/apps/editor/component/components.ts b/frontend/src/lib/components/apps/editor/component/components.ts index 9789e85d94..1ce0dc00ba 100644 --- a/frontend/src/lib/components/apps/editor/component/components.ts +++ b/frontend/src/lib/components/apps/editor/component/components.ts @@ -231,6 +231,12 @@ export const components: Record = { value: false, fieldType: 'boolean', onlyStatic: true + }, + fitContent: { + type: 'static', + value: false, + fieldType: 'boolean', + onlyStatic: true } }, customCss: { diff --git a/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte b/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte index b421a0a972..ec3d563000 100644 --- a/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +++ b/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte @@ -131,9 +131,8 @@
Format -
+
{isMac ? '⌘' : 'CTRL'} - S
@@ -154,9 +153,8 @@
Run -
+
{isMac ? '⌘' : 'CTRL'} -
diff --git a/frontend/src/lib/components/apps/types.ts b/frontend/src/lib/components/apps/types.ts index 5e552da3da..21b9410659 100644 --- a/frontend/src/lib/components/apps/types.ts +++ b/frontend/src/lib/components/apps/types.ts @@ -43,14 +43,14 @@ export interface BaseAppComponent extends Partial { configuration: Record< string, GeneralAppInput & - ( - | StaticAppInput - | ConnectedAppInput - | UserAppInput - | RowAppInput - | EvalAppInput - | UploadAppInput - ) + ( + | StaticAppInput + | ConnectedAppInput + | UserAppInput + | RowAppInput + | EvalAppInput + | UploadAppInput + ) > card: boolean | undefined customCss?: ComponentCustomCSS