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}
>