From 74cc8905f868c53c4c49df468f8380dda8cbedd4 Mon Sep 17 00:00:00 2001 From: tristantr Date: Thu, 23 Oct 2025 16:20:26 +0200 Subject: [PATCH] Add tooltip per Tab header in app builder --- .../apps/components/layout/AppTabs.svelte | 69 ++++++++++++------- .../editor/component/ComponentInner.svelte | 1 + .../apps/editor/component/components.ts | 5 ++ .../settingsPanel/ComponentPanel.svelte | 2 + .../apps/editor/settingsPanel/GridTab.svelte | 23 ++++++- .../settingsPanel/GridTabTooltip.svelte | 30 ++++++++ .../src/lib/components/common/tabs/Tab.svelte | 11 ++- 7 files changed, 114 insertions(+), 27 deletions(-) create mode 100644 frontend/src/lib/components/apps/editor/settingsPanel/GridTabTooltip.svelte diff --git a/frontend/src/lib/components/apps/components/layout/AppTabs.svelte b/frontend/src/lib/components/apps/components/layout/AppTabs.svelte index 3b89db04dc..d22e34d03d 100644 --- a/frontend/src/lib/components/apps/components/layout/AppTabs.svelte +++ b/frontend/src/lib/components/apps/components/layout/AppTabs.svelte @@ -29,6 +29,7 @@ render: boolean disabledTabs: RichConfiguration[] hiddenTabs: RichConfiguration[] + tooltipTabs: RichConfiguration[] | undefined onTabChange?: string[] | undefined } @@ -41,6 +42,7 @@ render, disabledTabs, hiddenTabs, + tooltipTabs = undefined, onTabChange = undefined }: Props = $props() @@ -157,7 +159,7 @@ let resolvedDisabledTabs: boolean[] = $state([]) let resolvedHiddenTabs: boolean[] = $state([]) - + let resolvedTooltipTabs: string[] = $state([]) // Filter visible tabs based on hiddenTabs configuration let visibleTabsIndices = $derived( (tabs ?? []).map((_, index) => index).filter((index) => !resolvedHiddenTabs[index]) @@ -210,6 +212,10 @@ {/each} +{#each tooltipTabs ?? [] as tooltipTab, index} + +{/each} + {#if everRender}
{#if !resolvedConfig.tabsKind || resolvedConfig.tabsKind == 'tabs' || (resolvedConfig.tabsKind == 'invisibleOnView' && $mode == 'dnd')} @@ -229,6 +235,9 @@ selectedStyle={css?.selectedTab?.style} disabled={resolvedDisabledTabs[index]} label={res} + tooltip={resolvedTooltipTabs[index] && String(resolvedTooltipTabs[index]).length > 0 + ? String(resolvedTooltipTabs[index]) + : undefined} /> {/if} {/each} @@ -245,6 +254,11 @@ > {#each tabs ?? [] as res, index} {#if !resolvedHiddenTabs[index]} +
0 + ? String(resolvedTooltipTabs[index]) + : undefined} + > + +
{/if} {/each}
@@ -279,29 +294,35 @@ {#each tabs ?? [] as res, index} {#if !resolvedHiddenTabs[index]}
- + +
& { tabs: string[] disabledTabs: RichConfiguration[] hiddenTabs: RichConfiguration[] + tooltipTabs: RichConfiguration[] onTabChange?: string[] } @@ -3124,6 +3125,10 @@ See date-fns format for more information. By default, it is 'dd.MM.yyyy HH:mm' hiddenTabs: [ { type: 'static', value: false, fieldType: 'boolean' }, { type: 'static', value: false, fieldType: 'boolean' } + ] as RichConfiguration[], + tooltipTabs: [ + { type: 'static', value: '', fieldType: 'text' }, + { type: 'static', value: '', fieldType: 'text' }, ] as RichConfiguration[] } }, diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte index 3d9c7d9a4c..50e72b92fa 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte @@ -393,9 +393,11 @@ bind:tabs={item.data.tabs} bind:disabledTabs={item.data.disabledTabs} bind:hiddenTabs={item.data.hiddenTabs} + bind:tooltipTabs={item.data.tooltipTabs} bind:component={item.data} canDisableTabs canHideTabs + canTooltipTabs /> {:else if item.data.type === 'aggridcomponentee'} diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/GridTab.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/GridTab.svelte index b1111244db..7d9fa7aa83 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/GridTab.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/GridTab.svelte @@ -14,13 +14,16 @@ import { GripVertical, Plus } from 'lucide-svelte' import GridTabDisabled from './GridTabDisabled.svelte' import GridTabHidden from './GridTabHidden.svelte' + import GridTabTooltip from './GridTabTooltip.svelte' interface Props { tabs?: string[] disabledTabs?: RichConfiguration[] hiddenTabs?: RichConfiguration[] + tooltipTabs?: RichConfiguration[] canDisableTabs?: boolean canHideTabs?: boolean + canTooltipTabs?: boolean word?: string component: AppComponent } @@ -29,8 +32,10 @@ tabs = $bindable(undefined), disabledTabs = $bindable(undefined), hiddenTabs = $bindable(undefined), + tooltipTabs = $bindable(undefined), canDisableTabs = false, canHideTabs = false, + canTooltipTabs = false, word = 'Tab', component = $bindable() }: Props = $props() @@ -51,6 +56,12 @@ { type: 'static', value: false, fieldType: 'boolean' } ] } + if (tooltipTabs == undefined) { + tooltipTabs = [ + { type: 'static', value: '', fieldType: 'text' }, + { type: 'static', value: '', fieldType: 'text' } + ] + } }) let items = $state.raw( @@ -89,6 +100,7 @@ disabledTabs = [...(disabledTabs ?? []), { type: 'static', value: false, fieldType: 'boolean' }] hiddenTabs = [...(hiddenTabs ?? []), { type: 'static', value: false, fieldType: 'boolean' }] + tooltipTabs = [...(tooltipTabs ?? []), { type: 'static', value: '', fieldType: 'text' }] } function deleteSubgrid(index: number) { @@ -114,6 +126,8 @@ // Delete the item in the hiddenTabs array hiddenTabs = (hiddenTabs ?? []).filter((_, i) => i !== index) + // Delete the item in the tooltipTabs array + tooltipTabs = (tooltipTabs ?? []).filter((_, i) => i !== index) component.numberOfSubgrids = items.length // Update the originalIndex of the remaining items items.forEach((item, i) => { @@ -152,13 +166,15 @@ const newDisabledTabs: RichConfiguration[] = [] const newHiddenTabs: RichConfiguration[] = [] + const newTooltipTabs: RichConfiguration[] = [] for (let i = 0; i < items.length; i++) { disabledTabs && newDisabledTabs.push(disabledTabs[items[i].originalIndex]) hiddenTabs && newHiddenTabs.push(hiddenTabs[items[i].originalIndex]) + tooltipTabs && newTooltipTabs.push(tooltipTabs[items[i].originalIndex]) } disabledTabs = newDisabledTabs hiddenTabs = newHiddenTabs - + tooltipTabs = newTooltipTabs // update originalIndex items.forEach((item, i) => { item.originalIndex = i @@ -226,6 +242,11 @@
{/if} + {#if canTooltipTabs && tooltipTabs} +
+ +
+ {/if} {/each} diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/GridTabTooltip.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/GridTabTooltip.svelte new file mode 100644 index 0000000000..4e99343bdf --- /dev/null +++ b/frontend/src/lib/components/apps/editor/settingsPanel/GridTabTooltip.svelte @@ -0,0 +1,30 @@ + + + \ No newline at end of file diff --git a/frontend/src/lib/components/common/tabs/Tab.svelte b/frontend/src/lib/components/common/tabs/Tab.svelte index 53993a8bcd..0b53f804d2 100644 --- a/frontend/src/lib/components/common/tabs/Tab.svelte +++ b/frontend/src/lib/components/common/tabs/Tab.svelte @@ -21,6 +21,7 @@ exact?: boolean otherValues?: string[] disabled?: boolean + tooltip?: string extra?: import('svelte').Snippet } @@ -39,6 +40,7 @@ exact = false, otherValues = [], disabled = false, + tooltip = undefined, extra = undefined }: Props = $props() const { selected, update, hashNavigation } = getContext('Tabs') @@ -58,7 +60,11 @@ let isSelected = $derived(isSelectedFn($selected)) - + +