diff --git a/frontend/src/lib/components/apps/components/layout/AppTabs.svelte b/frontend/src/lib/components/apps/components/layout/AppTabs.svelte index 072d9afbaf..347b957b82 100644 --- a/frontend/src/lib/components/apps/components/layout/AppTabs.svelte +++ b/frontend/src/lib/components/apps/components/layout/AppTabs.svelte @@ -4,7 +4,12 @@ import { initConfig, initOutput } from '../../editor/appUtils' import { components } from '../../editor/component' import SubGridEditor from '../../editor/SubGridEditor.svelte' - import type { AppViewerContext, ComponentCustomCSS, RichConfigurations } from '../../types' + import type { + AppViewerContext, + ComponentCustomCSS, + RichConfiguration, + RichConfigurations + } from '../../types' import { concatCustomCss } from '../../utils' import InputValue from '../helpers/InputValue.svelte' import InitializeComponent from '../helpers/InitializeComponent.svelte' @@ -15,6 +20,7 @@ export let tabs: string[] export let customCss: ComponentCustomCSS<'tabscomponent'> | undefined = undefined export let render: boolean + export let disabledTabs: RichConfiguration[] let resolvedConfig = initConfig( components['tabscomponent'].initialData.configuration, @@ -76,23 +82,30 @@ $: selected != undefined && handleTabSelection() let selectedIndex = tabs?.indexOf(selected) ?? -1 $: css = concatCustomCss($app.css?.tabscomponent, customCss) + + let resolvedDisabledTabs: boolean[] = [] +{#each disabledTabs ?? [] as disableTab, index} + +{/each} +
{#if !resolvedConfig.tabsKind || resolvedConfig.tabsKind == 'tabs' || (resolvedConfig.tabsKind == 'invisibleOnView' && $mode == 'dnd')}
- {#each tabs ?? [] as res} + {#each tabs ?? [] as res, index} {res} diff --git a/frontend/src/lib/components/apps/editor/component/Component.svelte b/frontend/src/lib/components/apps/editor/component/Component.svelte index cfe38d167d..934035d34f 100644 --- a/frontend/src/lib/components/apps/editor/component/Component.svelte +++ b/frontend/src/lib/components/apps/editor/component/Component.svelte @@ -421,6 +421,7 @@ configuration={component.configuration} id={component.id} tabs={component.tabs} + disabledTabs={component.disabledTabs} customCss={component.customCss} {componentContainerHeight} {render} diff --git a/frontend/src/lib/components/apps/editor/component/components.ts b/frontend/src/lib/components/apps/editor/component/components.ts index a3d83367a9..8714250202 100644 --- a/frontend/src/lib/components/apps/editor/component/components.ts +++ b/frontend/src/lib/components/apps/editor/component/components.ts @@ -106,6 +106,7 @@ export type VerticalDividerComponent = BaseComponent<'verticaldividercomponent'> export type FileInputComponent = BaseComponent<'fileinputcomponent'> export type TabsComponent = BaseComponent<'tabscomponent'> & { tabs: string[] + disabledTabs: RichConfiguration[] } export type ContainerComponent = BaseComponent<'containercomponent'> export type DrawerComponent = BaseComponent<'drawercomponent'> diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte index 19758ff330..4f3a8a989e 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte @@ -245,7 +245,9 @@ {#if componentSettings.item.data.type === 'tabscomponent'} {:else if componentSettings.item.data.type === 'steppercomponent'} item.originalIndex !== index) + // Delete the item in the disabledTabs array + disabledTabs = disabledTabs.filter((_, i) => i !== index) + component.numberOfSubgrids = items.length // Update the originalIndex of the remaining items items.forEach((item, i) => { item.originalIndex = i }) items = items + delete $app!.subgrids![items.length] $app = $app } @@ -96,6 +116,12 @@ $app!.subgrids![`${component.id}-${items[i].originalIndex}`] ?? [] } + const newDisabledTabs: RichConfiguration[] = [] + for (let i = 0; i < items.length; i++) { + newDisabledTabs.push(disabledTabs[items[i].originalIndex]) + } + disabledTabs = newDisabledTabs + // update originalIndex items.forEach((item, i) => { item.originalIndex = i @@ -145,26 +171,34 @@ on:finalize={handleFinalize} > {#each items as item, index (item.id)} -
- updateItemValue(index, e)} - type="text" - bind:value={items[index].value} - /> -
- deleteSubgrid(index)} /> -
- -
- +
+
+ updateItemValue(index, e)} + type="text" + bind:value={items[index].value} + /> +
+ deleteSubgrid(index)} /> +
+ + + +
+ +
+ + {#if canDisableTabs} + + {/if}
{/each} diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/GridTabDisabled.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/GridTabDisabled.svelte new file mode 100644 index 0000000000..797e29159d --- /dev/null +++ b/frontend/src/lib/components/apps/editor/settingsPanel/GridTabDisabled.svelte @@ -0,0 +1,59 @@ + + + { + if (disablable) { + field = { + type: 'eval', + expr: 'false', + fieldType: 'boolean' + } + } else { + field = { + type: 'static', + value: false, + fieldType: 'boolean' + } + } + }} +/> + +{#if disablable} +
+ +
+{/if} diff --git a/frontend/src/lib/components/common/tabs/Tab.svelte b/frontend/src/lib/components/common/tabs/Tab.svelte index 900cddd0dd..71cba8b1c2 100644 --- a/frontend/src/lib/components/common/tabs/Tab.svelte +++ b/frontend/src/lib/components/common/tabs/Tab.svelte @@ -11,6 +11,8 @@ export let selectedClass = '' export let selectedStyle = '' + export let disabled: boolean = false + const fontSizeClasses = { xs: 'text-xs', sm: 'text-sm', @@ -30,7 +32,8 @@ : 'border-gray-300 border-opacity-0 hover:border-opacity-100 text-gray-600', fontSizeClasses[size], c, - $selected?.startsWith(value) ? selectedClass : '' + $selected?.startsWith(value) ? selectedClass : '', + disabled ? 'cursor-not-allowed text-gray-400' : '' )} style={`${style} ${$selected?.startsWith(value) ? selectedStyle : ''}`} on:click={() => { @@ -41,6 +44,7 @@ } }} on:pointerdown|stopPropagation + {disabled} >