123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- from __future__ import annotations
- from typing import Callable, Optional, Protocol
- from nicegui import ui
- class Item(Protocol):
- title: str
- dragged: Optional[card] = None
- class column(ui.column):
- def __init__(self, name: str, on_drop: Optional[Callable[[Item, str], None]] = None) -> None:
- super().__init__()
- with self.classes('bg-blue-grey-2 w-60 p-4 rounded shadow-2'):
- ui.label(name).classes('text-bold ml-1')
- self.name = name
- self.on('dragover.prevent', self.highlight)
- self.on('dragleave', self.unhighlight)
- self.on('drop', self.move_card)
- self.on_drop = on_drop
- def highlight(self) -> None:
- self.classes(remove='bg-blue-grey-2', add='bg-blue-grey-3')
- def unhighlight(self) -> None:
- self.classes(remove='bg-blue-grey-3', add='bg-blue-grey-2')
- def move_card(self) -> None:
- global dragged
- self.unhighlight()
- dragged.parent_slot.parent.remove(dragged)
- with self:
- card(dragged.item)
- self.on_drop(dragged.item, self.name)
- dragged = None
- class card(ui.card):
- def __init__(self, item: Item) -> None:
- super().__init__()
- self.item = item
- with self.props('draggable').classes('w-full cursor-pointer bg-grey-1'):
- ui.label(item.title)
- self.on('dragstart', self.handle_dragstart)
- def handle_dragstart(self) -> None:
- global dragged
- dragged = self
|