From aaaece99e745b67bf4bd2dde949eca5bf8b89e85 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 4 Jan 2023 10:11:22 +0100 Subject: [PATCH] apps UX nits --- frontend/src/lib/components/SchemaForm.svelte | 3 +- .../src/lib/components/TemplateEditor.svelte | 7 +- .../components/dataDisplay/AppText.svelte | 2 +- .../apps/components/form/AppForm.svelte | 54 +++++++------ .../helpers/RunnableComponent.svelte | 23 +++--- .../apps/components/table/AppTable.svelte | 10 +-- .../apps/components/table/tableOptions.ts | 11 ++- .../apps/editor/ComponentHeader.svelte | 21 +++-- .../components/apps/editor/GridEditor.svelte | 4 +- .../componentsPanel/ComponentList.svelte | 7 +- .../apps/editor/componentsPanel/data.ts | 28 ++++--- .../editor/contextPanel/ContextPanel.svelte | 8 +- .../InlineScriptEditor.svelte | 4 +- .../ComponentInputTypeEditor.svelte | 7 +- .../settingsPanel/InputsSpecsEditor.svelte | 78 ++++++++++--------- .../editor/settingsPanel/Recompute.svelte | 2 +- frontend/src/lib/components/apps/inputType.ts | 2 +- frontend/src/lib/components/apps/rx.ts | 4 +- frontend/src/lib/components/apps/types.ts | 2 +- 19 files changed, 157 insertions(+), 120 deletions(-) diff --git a/frontend/src/lib/components/SchemaForm.svelte b/frontend/src/lib/components/SchemaForm.svelte index 3337c1780f..fb28bb8f22 100644 --- a/frontend/src/lib/components/SchemaForm.svelte +++ b/frontend/src/lib/components/SchemaForm.svelte @@ -28,6 +28,7 @@ export let noVariablePicker = false export let filter: string[] | undefined = undefined export let noDynamicToggle = false + export let flexWrap = false let clazz: string = '' export { clazz as class } @@ -55,7 +56,7 @@ let variableEditor: VariableEditor | undefined = undefined -
+
{#if Object.keys(schema?.properties ?? {}).length > 0} {#each Object.keys(schema?.properties ?? {}) as argName, i (argName)} {#if !filter || filter.includes(argName)} diff --git a/frontend/src/lib/components/TemplateEditor.svelte b/frontend/src/lib/components/TemplateEditor.svelte index 493e4a5f10..e83b2a3de1 100644 --- a/frontend/src/lib/components/TemplateEditor.svelte +++ b/frontend/src/lib/components/TemplateEditor.svelte @@ -13,6 +13,7 @@ } from '$lib/editorUtils' import { languages, editor as meditor, Uri as mUri, Range } from 'monaco-editor' import libStdContent from '$lib/es5.d.ts.txt?raw' + import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker' languages.typescript.javascriptDefaults.setCompilerOptions({ target: languages.typescript.ScriptTarget.Latest, @@ -386,7 +387,11 @@ // @ts-ignore self.MonacoEnvironment = { getWorker: function (_moduleId: any, label: string) { - return new tsWorker() + if (label == 'typescript') { + return new tsWorker() + } else { + return new editorWorker() + } } } } diff --git a/frontend/src/lib/components/apps/components/dataDisplay/AppText.svelte b/frontend/src/lib/components/apps/components/dataDisplay/AppText.svelte index 9a9b2bcfcb..ceffaea085 100644 --- a/frontend/src/lib/components/apps/components/dataDisplay/AppText.svelte +++ b/frontend/src/lib/components/apps/components/dataDisplay/AppText.svelte @@ -6,7 +6,7 @@ export let id: string export let componentInput: AppInput | undefined - export let horizontalAlignment: 'left' | 'center' | 'right' | undefined = undefined + export let horizontalAlignment: 'left' | 'center' | 'right' | undefined = 'left' export let verticalAlignment: 'top' | 'center' | 'bottom' | undefined = undefined export let configuration: Record diff --git a/frontend/src/lib/components/apps/components/form/AppForm.svelte b/frontend/src/lib/components/apps/components/form/AppForm.svelte index aa94f3b1bf..ec39603541 100644 --- a/frontend/src/lib/components/apps/components/form/AppForm.svelte +++ b/frontend/src/lib/components/apps/components/form/AppForm.svelte @@ -63,28 +63,38 @@ forceSchemaDisplay={true} > - + if (recomputeIds) { + recomputeIds.forEach((id) => { + $runnableComponents[id]?.() + }) + } + }} + {size} + {color} + > + {labelValue} + +
+
diff --git a/frontend/src/lib/components/apps/components/helpers/RunnableComponent.svelte b/frontend/src/lib/components/apps/components/helpers/RunnableComponent.svelte index dceff558b8..ea6f8ffc6e 100644 --- a/frontend/src/lib/components/apps/components/helpers/RunnableComponent.svelte +++ b/frontend/src/lib/components/apps/components/helpers/RunnableComponent.svelte @@ -253,10 +253,17 @@ bind:this={testJobLoader} /> -
- {#if schemaStripped !== undefined && (autoRefresh || forceSchemaDisplay)} -
+
+ {#if autoRefresh === true} +
+ +
+ {/if} + {#if schemaStripped && Object.keys(schemaStripped?.properties ?? {}).length > 0 && (autoRefresh || forceSchemaDisplay)} +
{result.error}
- {:else if autoRefresh === true} -
- -
- - {:else} - +
+ +
{/if}
diff --git a/frontend/src/lib/components/apps/components/table/AppTable.svelte b/frontend/src/lib/components/apps/components/table/AppTable.svelte index d0cacc9fb0..384e23aa59 100644 --- a/frontend/src/lib/components/apps/components/table/AppTable.svelte +++ b/frontend/src/lib/components/apps/components/table/AppTable.svelte @@ -37,9 +37,9 @@ } const options = writable>({ + ...tableOptions, data: [], - columns: [], - ...tableOptions + columns: [] }) let table = createSvelteTable(options) @@ -67,14 +67,14 @@ const headers = Array.from(new Set(result.flatMap((row) => Object.keys(row)))) $options = { + ...tableOptions, data: filteredResult, columns: headers.map((header) => { return { accessorKey: header, cell: (info) => info.getValue() } - }), - ...tableOptions + }) } } @@ -177,7 +177,7 @@ {@const component = renderCell(cell.column.columnDef.cell, context)} toggleRow(row, rowIndex)} - class="p-4 whitespace-nowrap text-xs text-gray-900" + class="p-4 whitespace-pre-wrap truncate text-xs text-gray-900" > {#if typeof cell.column.columnDef.cell != 'string' && cellIsObject(cell.column.columnDef.cell, context)} {JSON.stringify(cell.column.columnDef.cell(context), null, 4)} diff --git a/frontend/src/lib/components/apps/components/table/tableOptions.ts b/frontend/src/lib/components/apps/components/table/tableOptions.ts index edac8def25..24541e1b85 100644 --- a/frontend/src/lib/components/apps/components/table/tableOptions.ts +++ b/frontend/src/lib/components/apps/components/table/tableOptions.ts @@ -1,13 +1,16 @@ -import { getCoreRowModel, getPaginationRowModel } from '@tanstack/svelte-table' +import { getCoreRowModel, getPaginationRowModel, type TableOptions } from '@tanstack/svelte-table' -const tableOptions = { +const tableOptions: TableOptions> = { + data: [], + columns: [], + enableColumnResizing: false, getCoreRowModel: getCoreRowModel(), getPaginationRowModel: getPaginationRowModel(), initialState: { pagination: { - pageSize: 10 + pageSize: 25 } - } + }, } export { tableOptions } diff --git a/frontend/src/lib/components/apps/editor/ComponentHeader.svelte b/frontend/src/lib/components/apps/editor/ComponentHeader.svelte index e988f98772..f171513eb6 100644 --- a/frontend/src/lib/components/apps/editor/ComponentHeader.svelte +++ b/frontend/src/lib/components/apps/editor/ComponentHeader.svelte @@ -14,9 +14,12 @@ @@ -25,29 +28,31 @@ {#if pointerdown || selected || hover} {/if} {#if selected || hover} {/if} diff --git a/frontend/src/lib/components/apps/editor/GridEditor.svelte b/frontend/src/lib/components/apps/editor/GridEditor.svelte index 72655b6623..59dae733c9 100644 --- a/frontend/src/lib/components/apps/editor/GridEditor.svelte +++ b/frontend/src/lib/components/apps/editor/GridEditor.svelte @@ -116,7 +116,7 @@ >
selectComponent(detail.id)} diff --git a/frontend/src/lib/components/apps/editor/componentsPanel/ComponentList.svelte b/frontend/src/lib/components/apps/editor/componentsPanel/ComponentList.svelte index f4f32769fd..1909043195 100644 --- a/frontend/src/lib/components/apps/editor/componentsPanel/ComponentList.svelte +++ b/frontend/src/lib/components/apps/editor/componentsPanel/ComponentList.svelte @@ -19,9 +19,9 @@ function getMinDimensionsByComponent(componentType: AppComponent['type'], column: number): Size { // Dimensions key formula: :-: const dimensions: Record<`${number}:${number}-${number}:${number}`, AppComponent['type'][]> = { + '4:1-4:1': ['textcomponent'], + '2:1-2:1': ['buttoncomponent'], '4:2-4:2': [ - 'buttoncomponent', - 'textcomponent', 'checkboxcomponent', 'textinputcomponent', 'numberinputcomponent', @@ -29,7 +29,8 @@ 'passwordinputcomponent', 'dateinputcomponent' ], - '4:12-4:12': ['barchartcomponent', 'piechartcomponent', 'formcomponent', 'displaycomponent'], + '3:5-6:5': ['formcomponent'], + '4:12-4:12': ['barchartcomponent', 'piechartcomponent', 'displaycomponent'], '3:10-6:12': ['tablecomponent'] } // Finds the key that is associated with the component type and extracts the dimensions from it diff --git a/frontend/src/lib/components/apps/editor/componentsPanel/data.ts b/frontend/src/lib/components/apps/editor/componentsPanel/data.ts index c7dd08e5b3..cd1ccee96c 100644 --- a/frontend/src/lib/components/apps/editor/componentsPanel/data.ts +++ b/frontend/src/lib/components/apps/editor/componentsPanel/data.ts @@ -14,6 +14,7 @@ const inputs: ComponentSet = { type: 'static', value: 'Type...', fieldType: 'text', + onlyStatic: true, }, }, card: false @@ -100,6 +101,7 @@ const buttons: ComponentSet = { components: [ { ...defaultAlignement, + softWrap: true, id: 'buttoncomponent', type: 'buttoncomponent', componentInput: { @@ -120,14 +122,14 @@ const buttons: ComponentSet = { color: { fieldType: 'select', type: 'static', - + onlyStatic: true, optionValuesKey: 'buttonColorOptions', value: 'blue' }, size: { fieldType: 'select', type: 'static', - + onlyStatic: true, optionValuesKey: 'buttonSizeOptions', value: 'xs' } @@ -156,6 +158,7 @@ const buttons: ComponentSet = { color: { fieldType: 'select', type: 'static', + onlyStatic: true, value: 'dark', optionValuesKey: 'buttonColorOptions', }, @@ -163,6 +166,7 @@ const buttons: ComponentSet = { fieldType: 'select', type: 'static', value: 'xs', + onlyStatic: true, optionValuesKey: 'buttonSizeOptions', } }, @@ -176,20 +180,21 @@ const display: ComponentSet = { title: 'Display', components: [ { - ...defaultAlignement, + softWrap: true, + horizontalAlignment: 'left', + verticalAlignment: 'top', id: 'textcomponent', type: 'textcomponent', componentInput: { type: 'static', fieldType: 'textarea', - value: 'Lorem ipsum', - + value: 'Hello ${ctx.username}', }, configuration: { style: { fieldType: 'select', type: 'static', - + onlyStatic: true, optionValuesKey: 'textStyleOptions', value: 'Body' }, @@ -205,21 +210,22 @@ const display: ComponentSet = { card: false }, { + id: 'tablecomponent', type: 'tablecomponent', configuration: { search: { fieldType: 'select', type: 'static', - + onlyStatic: true, optionValuesKey: 'tableSearchOptions', value: 'Disabled' }, pagination: { type: 'static', - + onlyStatic: true, fieldType: 'boolean', - value: false + value: true } }, componentInput: { @@ -249,7 +255,7 @@ const display: ComponentSet = { configuration: { theme: { type: 'static', - + onlyStatic: true, fieldType: 'select', optionValuesKey: 'chartThemeOptions', value: 'theme1' @@ -276,7 +282,7 @@ const display: ComponentSet = { configuration: { theme: { type: 'static', - + onlyStatic: true, fieldType: 'select', optionValuesKey: 'chartThemeOptions', value: 'theme1' diff --git a/frontend/src/lib/components/apps/editor/contextPanel/ContextPanel.svelte b/frontend/src/lib/components/apps/editor/contextPanel/ContextPanel.svelte index f3f1791f72..a1050fc7cf 100644 --- a/frontend/src/lib/components/apps/editor/contextPanel/ContextPanel.svelte +++ b/frontend/src/lib/components/apps/editor/contextPanel/ContextPanel.svelte @@ -30,13 +30,13 @@ if (component?.data.type) { return displayData[component?.data.type].name - } else if (componentId == 'context') { + } else if (componentId == 'ctx') { return 'Context' } else { return 'Table action' } } - $: panels = [['context', ['email', 'username']] as [string, string[]]].concat( + $: panels = [['ctx', ['email', 'username']] as [string, string[]]].concat( Object.entries($staticOutputs) ) @@ -58,7 +58,7 @@ ? undefined : () => ($selectedComponent = componentId)} class={classNames( - 'px-2 text-2xs py-0.5 font-bold rounded-t-sm w-fit', + 'px-2 text-2xs py-0.5 border border-gray-300 font-bold rounded-t-sm w-fit', $selectedComponent === componentId ? ' bg-indigo-500 text-white' : 'bg-gray-200 text-gray-500' @@ -80,7 +80,7 @@
-
-
+
+
{#if name !== undefined} {/if} diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/ComponentInputTypeEditor.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/ComponentInputTypeEditor.svelte index b9b5efc25a..26859fe1b7 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/ComponentInputTypeEditor.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/ComponentInputTypeEditor.svelte @@ -13,6 +13,7 @@ $: if (componentInput.fieldType == 'textarea' && componentInput.type == 'static') { //@ts-ignore componentInput.type = 'template' + componentInput['eval'] = componentInput.value } const brackets = '${}' @@ -37,7 +38,7 @@ disable={disableStatic} > {#if clientWidth > 250} - + {/if} {/if} @@ -50,7 +51,7 @@ size="xs" > {#if clientWidth > 250} - + {/if} {#if clientWidth > 250} - + {/if} diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/InputsSpecsEditor.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/InputsSpecsEditor.svelte index 973b8768ca..6daeaaa1bc 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/InputsSpecsEditor.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/InputsSpecsEditor.svelte @@ -13,7 +13,7 @@ export let inputSpecs: Record< string, - StaticAppInput | ConnectedAppInput | UserAppInput | RowAppInput + (StaticAppInput | ConnectedAppInput | UserAppInput | RowAppInput) & { onlyStatic?: boolean } > export let userInputEnabled: boolean = true export let staticOnly: boolean = false @@ -31,54 +31,56 @@ {shouldCapitalize ? capitalize(inputSpecKey) : inputSpecKey} -
+
{input.fieldType === 'array' && input.subFieldType ? `${capitalize(fieldTypeToTsType(input.subFieldType))}[]` : capitalize(fieldTypeToTsType(input.fieldType))} - - - {#if rowColumns} + {#if !inputSpecs[inputSpecKey].onlyStatic} + + {#if rowColumns} + + {/if} + {#if userInputEnabled && (!input.format?.startsWith('resource-') || true)} + + {/if} + - {/if} - {#if userInputEnabled && (!input.format?.startsWith('resource-') || true)} - - {/if} - - + + {/if}
diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/Recompute.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/Recompute.svelte index 526d94463a..d39f5f0e2f 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/Recompute.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/Recompute.svelte @@ -40,7 +40,7 @@ {#each Object.keys($runnableComponents ?? {}).filter((id) => id !== ownId) as id} - {id} + {id} + fields: Record type: 'runnable' } diff --git a/frontend/src/lib/components/apps/rx.ts b/frontend/src/lib/components/apps/rx.ts index fab701947d..6804313e6f 100644 --- a/frontend/src/lib/components/apps/rx.ts +++ b/frontend/src/lib/components/apps/rx.ts @@ -32,8 +32,8 @@ export function buildWorld( const state = writable(0) const outputsById: Record>> = { - context: Object.fromEntries(Object.entries(context).map(([k, v]) => { - return [k, newWorld.newOutput('context', k, state, v)] + ctx: Object.fromEntries(Object.entries(context).map(([k, v]) => { + return [k, newWorld.newOutput('ctx', k, state, v)] })) } for (const [k, outputs] of Object.entries(components)) { diff --git a/frontend/src/lib/components/apps/types.ts b/frontend/src/lib/components/apps/types.ts index f7bd79fec9..763c078ca0 100644 --- a/frontend/src/lib/components/apps/types.ts +++ b/frontend/src/lib/components/apps/types.ts @@ -53,7 +53,7 @@ export type Aligned = { export interface BaseAppComponent extends Partial { id: ComponentID componentInput: AppInput | undefined - configuration: Record + configuration: Record card: boolean | undefined /** * If `true` then the wrapper will allow items to flow outside of it's borders.