From d570ef58acc3a49102fb85590855b5908a3fca83 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sat, 18 Mar 2023 15:29:42 +0100 Subject: [PATCH] improve type definition of apps and sync them with static components + purge app content of unecessary data --- .../apps/components/buttons/AppButton.svelte | 6 +- .../apps/components/buttons/AppForm.svelte | 4 +- .../components/buttons/AppFormButton.svelte | 6 +- .../components/display/AppBarChart.svelte | 2 +- .../display/AppDisplayComponent.svelte | 2 +- .../apps/components/display/AppHtml.svelte | 2 +- .../apps/components/display/AppIcon.svelte | 2 +- .../apps/components/display/AppImage.svelte | 2 +- .../apps/components/display/AppMap.svelte | 2 +- .../apps/components/display/AppPdf.svelte | 14 +- .../components/display/AppPieChart.svelte | 2 +- .../components/display/AppScatterChart.svelte | 9 +- .../apps/components/display/AppText.svelte | 3 +- .../components/display/AppTimeseries.svelte | 9 +- .../components/display/table/AppTable.svelte | 8 +- .../apps/components/helpers/InputValue.svelte | 3 - .../helpers/NonRunnableComponent.svelte | 4 - .../helpers/RunnableComponent.svelte | 12 +- .../components/helpers/RunnableWrapper.svelte | 4 +- .../apps/components/inputs/AppCheckbox.svelte | 9 +- .../components/inputs/AppDateInput.svelte | 2 +- .../components/inputs/AppFileInput.svelte | 4 +- .../components/inputs/AppMultiSelect.svelte | 3 +- .../components/inputs/AppNumberInput.svelte | 2 +- .../components/inputs/AppRangeInput.svelte | 3 +- .../apps/components/inputs/AppSelect.svelte | 2 +- .../components/inputs/AppSliderInputs.svelte | 3 +- .../components/inputs/AppTextInput.svelte | 2 +- .../inputs/currency/AppCurrencyInput.svelte | 2 +- .../components/layout/AppContainer.svelte | 9 +- .../apps/components/layout/AppDivider.svelte | 4 +- .../apps/components/layout/AppDrawer.svelte | 7 +- .../components/layout/AppSplitpanes.svelte | 17 +- .../apps/components/layout/AppTabs.svelte | 8 +- .../components/apps/editor/GridEditor.svelte | 8 +- .../apps/editor/SubGridEditor.svelte | 5 +- .../lib/components/apps/editor/appUtils.ts | 69 +- .../apps/editor/component/Component.svelte | 6 +- .../component/ComponentNavigation.svelte | 8 +- .../apps/editor/component/components.ts | 760 ++++++++---------- .../apps/editor/component/default-codes.ts | 58 +- .../componentsPanel/ComponentList.svelte | 18 +- .../editor/componentsPanel/CssProperty.svelte | 8 +- .../editor/componentsPanel/CssSettings.svelte | 153 ++-- .../editor/componentsPanel/ListItem.svelte | 5 + .../InlineScriptEditor.svelte | 3 + .../ArrayStaticInputEditor.svelte | 49 +- .../settingsPanel/ComponentPanel.svelte | 35 +- .../settingsPanel/InputsSpecEditor.svelte | 32 +- .../settingsPanel/InputsSpecsEditor.svelte | 18 +- .../settingsPanel/SelectedRunnable.svelte | 4 +- .../editor/settingsPanel/SubTypeEditor.svelte | 18 +- .../editor/settingsPanel/TableActions.svelte | 68 +- .../inputEditor/ColorInput.svelte | 4 +- .../inputEditor/IconSelectInput.svelte | 2 +- .../inputEditor/RunnableInputEditor.svelte | 4 +- .../inputEditor/StaticInputEditor.svelte | 63 +- .../triggerLists/ComponentTriggerList.svelte | 24 +- .../components/apps/svelte-grid/Grid.svelte | 4 - .../apps/svelte-grid/MoveResize.svelte | 28 +- .../components/apps/svelte-grid/types.d.ts | 8 +- .../apps/svelte-grid/utils/helper.ts | 62 +- frontend/src/lib/components/apps/types.ts | 45 +- frontend/src/lib/components/apps/utils.ts | 44 +- .../(root)/(logged)/apps/add/+page.svelte | 3 +- 65 files changed, 845 insertions(+), 944 deletions(-) diff --git a/frontend/src/lib/components/apps/components/buttons/AppButton.svelte b/frontend/src/lib/components/apps/components/buttons/AppButton.svelte index b9fbe48a10..eb59d736c1 100644 --- a/frontend/src/lib/components/apps/components/buttons/AppButton.svelte +++ b/frontend/src/lib/components/apps/components/buttons/AppButton.svelte @@ -23,7 +23,7 @@ export let verticalAlignment: 'top' | 'center' | 'bottom' | undefined = undefined export let noWFull = false export let preclickAction: (() => Promise) | undefined = undefined - export let customCss: ComponentCustomCSS<'button'> | undefined = undefined + export let customCss: ComponentCustomCSS<'buttoncomponent'> | undefined = undefined export let render: boolean export let initializing: boolean | undefined = true @@ -158,10 +158,10 @@ + {/if} + + + {#each search != '' ? entries.filter((x) => x.name + .toLowerCase() + .includes(search.toLowerCase())) : entries as { type, name, icon, ids } (name)} {#if ids.length > 0} - + { + if ($app.css != undefined) { + if (e.detail && $app.css[type] == undefined) { + $app.css[type] = Object.fromEntries(ids.map(({ id }) => [id, {}])) + } + } + }} + >
@@ -140,13 +123,14 @@
- {#each ids as id} + {#each ids as { id, forceStyle, forceClass }}
- {#if $app?.css?.[type][id]} + {#if $app?.css?.[type]} (isCustom[type] = true)} /> {/if}
@@ -155,43 +139,6 @@ {/if} {/each} -
- -
- {#if $isOpenStore[SHOW_UNUSED_ID]} -
- {#each unusedComponents as { type, name, icon, ids }} - {#if ids.length > 0} - -
- - - {name} - -
-
- {#each ids as id} -
- {#if $app?.css?.[type][id]} - (isCustom[type] = true)} - /> - {/if} -
- {/each} -
-
- {/if} - {/each} -
- {/if} {#if !emptyString(jsonError)} diff --git a/frontend/src/lib/components/apps/editor/componentsPanel/ListItem.svelte b/frontend/src/lib/components/apps/editor/componentsPanel/ListItem.svelte index 5930ec7b68..f6340580a6 100644 --- a/frontend/src/lib/components/apps/editor/componentsPanel/ListItem.svelte +++ b/frontend/src/lib/components/apps/editor/componentsPanel/ListItem.svelte @@ -2,12 +2,17 @@ import { slide } from 'svelte/transition' import { ChevronDown } from 'lucide-svelte' import { isOpenStore } from './store' + import { createEventDispatcher } from 'svelte' export let title: string export let prefix: string | undefined = undefined + const dispatch = createEventDispatcher() + $: storeTitle = prefix + title $: isOpen = prefix ? $isOpenStore[storeTitle] : true + + $: dispatch('open', isOpen)
diff --git a/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte b/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte index 8b64cfa158..5bfb5cb850 100644 --- a/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +++ b/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte @@ -206,6 +206,8 @@
+ +
{#if inlineScript.language != 'frontend'} { + inlineScript.content = editor?.getCode() ?? '' runLoading = true await $runnableComponents[id]?.() runLoading = false diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte index 7b5f43c340..ac74ca0f23 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte @@ -2,41 +2,48 @@ import { Button } from '$lib/components/common' import { faPlus, faTrashAlt } from '@fortawesome/free-solid-svg-icons' import { createEventDispatcher } from 'svelte' - import type { StaticAppInput } from '../../inputType' + import type { InputType, StaticAppInput, StaticInput } from '../../inputType' import { staticValues } from '../componentsPanel/componentStaticValues' import SubTypeEditor from './SubTypeEditor.svelte' - type ArrayComponentInput = Extract + export let componentInput: StaticInput + export let subFieldType: InputType | undefined = undefined + export let optionValuesKey: keyof typeof staticValues | undefined = undefined - export let componentInput: ArrayComponentInput const dispatch = createEventDispatcher() function addElementByType() { + console.log('ADD') if (!Array.isArray(componentInput.value)) { componentInput.value = [] } - if (componentInput.subFieldType && componentInput.value) { - if (componentInput.subFieldType === 'boolean') { - componentInput.value.push(false) - } else if (componentInput.subFieldType === 'number') { - componentInput.value.push(0) - } else if (componentInput.subFieldType === 'object') { - componentInput.value.push({}) - } else if (componentInput.subFieldType === 'labeledresource') { - componentInput.value.push({ value: '', label: '' }) + let value: any[] = componentInput.value + if (subFieldType) { + if (subFieldType === 'boolean') { + value.push(false) + } else if (subFieldType === 'number') { + value.push(0) + } else if (subFieldType === 'object') { + value.push({}) + } else if (subFieldType === 'labeledresource') { + value.push({ value: '', label: '' }) } else if ( - componentInput.subFieldType === 'text' || - componentInput.subFieldType === 'textarea' || + subFieldType === 'text' || + subFieldType === 'textarea' || // TODO: Add support for these types - componentInput.subFieldType === 'date' || - componentInput.subFieldType === 'time' || - componentInput.subFieldType === 'datetime' + subFieldType === 'date' || + subFieldType === 'time' || + subFieldType === 'datetime' ) { - componentInput.value.push('') - } else if (componentInput.subFieldType === 'select') { - componentInput.value.push(staticValues[componentInput.optionValuesKey][0]) + value.push('') + } else if (subFieldType === 'select' && optionValuesKey) { + value.push(staticValues[optionValuesKey][0]) } + } else { + value.push('') } + + console.log(value, componentInput.value) componentInput = componentInput } @@ -55,7 +62,7 @@ {#if Array.isArray(componentInput.value)} {#each componentInput.value as value, index (index)}
- +