I can add multiple tabs

This commit is contained in:
2025-11-14 22:32:26 +01:00
parent 7ff8b3ea14
commit 93f6da66a5
9 changed files with 452 additions and 164 deletions

View File

@@ -10,11 +10,13 @@ from typing import Literal
from fasthtml.common import *
from myfasthtml.controls.BaseCommands import BaseCommands
from myfasthtml.controls.Boundaries import Boundaries
from myfasthtml.controls.UserProfile import UserProfile
from myfasthtml.controls.helpers import mk, Ids
from myfasthtml.core.commands import Command
from myfasthtml.core.dbmanager import DbObject
from myfasthtml.core.instances import InstancesManager, SingleInstance
from myfasthtml.core.utils import get_id
from myfasthtml.icons.fluent import panel_left_expand20_regular as left_drawer_icon
from myfasthtml.icons.fluent_p2 import panel_right_expand20_regular as right_drawer_icon
@@ -64,14 +66,20 @@ class Layout(SingleInstance):
right_drawer (bool): Whether to include a right drawer
"""
class DrawerContent:
def __init__(self, owner, side: Literal["left", "right"]):
class Content:
def __init__(self, owner):
self._owner = owner
self.side = side
self._content = []
self._ids = set()
def append(self, content):
def add(self, content):
content_id = get_id(content)
if content_id in self._ids:
return
self._content.append(content)
if content_id is not None:
self._ids.add(content_id)
def get_content(self):
return self._content
@@ -89,13 +97,16 @@ class Layout(SingleInstance):
self.app_name = app_name
# Content storage
self._header_content = None
self._footer_content = None
self._main_content = None
self._state = LayoutState(self)
self._boundaries = Boundaries(session, self)
self.commands = Commands(self)
self.left_drawer = self.DrawerContent(self, "left")
self.right_drawer = self.DrawerContent(self, "right")
self.left_drawer = self.Content(self)
self.right_drawer = self.Content(self)
self.header_left = self.Content(self)
self.header_right = self.Content(self)
self.footer_left = self.Content(self)
self.footer_right = self.Content(self)
def set_footer(self, content):
"""
@@ -159,8 +170,16 @@ class Layout(SingleInstance):
Header: FastHTML Header component
"""
return Header(
self._mk_left_drawer_icon(),
InstancesManager.get(self._session, Ids.UserProfile, UserProfile),
Div( # left
self._mk_left_drawer_icon(),
*self.header_left.get_content(),
cls="flex gap-1"
),
Div( # right
*self.header_right.get_content(),
InstancesManager.get(self._session, Ids.UserProfile, UserProfile),
cls="flex gap-1"
),
cls="mf-layout-header"
)
@@ -281,4 +300,4 @@ class Layout(SingleInstance):
Returns:
Div: The rendered layout
"""
return self.render()
return self.render()