@@ -29,6 +29,10 @@ import reflex_enterprise as rxe
2929class BasicDndState (rx .State ):
3030 drop_count: int = 0
3131
32+ def increment_drop_count (self ):
33+ self .drop_count += 1
34+
35+
3236@rx.memo
3337def draggable_card ():
3438 return rxe.dnd.draggable(
@@ -64,7 +68,7 @@ def basic_drag_drop():
6468 font_weight = " bold"
6569 ),
6670 accept = [" BasicCard" ],
67- on_drop = BasicDndState.setvar( " drop_count " , BasicDndState.drop_count + 1 ) ,
71+ on_drop = BasicDndState.increment_drop_count ,
6872 ),
6973 spacing = " 4" ,
7074 align = " start"
@@ -84,6 +88,10 @@ import reflex_enterprise as rxe
8488class MultiPositionState (rx .State ):
8589 card_position: int = 0
8690
91+ def set_card_position (self , position : int ):
92+ self .card_position = position
93+
94+
8795@rx.memo
8896def movable_card ():
8997 return rxe.dnd.draggable(
@@ -118,7 +126,7 @@ def drop_zone(position: int):
118126 border_color = rx.cond(params.is_over, " green.500" , " red.500" ),
119127 bg = rx.cond(params.is_over, " green.100" , " blue.100" ),
120128 accept = [" MovableCard" ],
121- on_drop = MultiPositionState.setvar( " card_position " , position),
129+ on_drop = lambda _ : MultiPositionState.set_card_position( position),
122130 display = " flex" ,
123131 align_items = " center" ,
124132 justify_content = " center"
@@ -129,7 +137,7 @@ def multi_position_example():
129137 rx.text(" Drag the card between positions" , weight = " bold" ),
130138 rx.grid(
131139 drop_zone(0 ),
132- drop_zone(1 ),
140+ drop_zone(1 ),
133141 drop_zone(2 ),
134142 drop_zone(3 ),
135143 columns = " 2" ,
@@ -152,7 +160,10 @@ import reflex_enterprise as rxe
152160class StateTrackingState (rx .State ):
153161 drag_info: str = " No drag activity"
154162
155- @rx.memo
163+ def set_drag_info (self , value : str ):
164+ self .drag_info = value
165+
166+ @rx.memo
156167def tracked_draggable ():
157168 drag_params = rxe.dnd.Draggable.collected_params
158169 return rxe.dnd.draggable(
@@ -165,7 +176,7 @@ def tracked_draggable():
165176 opacity = rx.cond(drag_params.is_dragging, 0.5 , 1.0 )
166177 ),
167178 type = " TrackedItem" ,
168- on_end = StateTrackingState.setvar( " drag_info " , " Drag ended" )
179+ on_end = StateTrackingState.set_drag_info( " Drag ended" )
169180 )
170181
171182def tracked_drop_target ():
@@ -184,8 +195,8 @@ def tracked_drop_target():
184195 justify_content = " center"
185196 ),
186197 accept = [" TrackedItem" ],
187- on_drop = StateTrackingState.setvar( " drag_info " , " Item successfully dropped!" ),
188- on_hover = StateTrackingState.setvar( " drag_info " , " Item hovering over drop zone" )
198+ on_drop = StateTrackingState.set_drag_info( " Item successfully dropped!" ),
199+ on_hover = StateTrackingState.set_drag_info( " Item hovering over drop zone" )
189200 )
190201
191202def state_tracking_example ():
@@ -227,34 +238,34 @@ class DynamicListState(rx.State):
227238 def move_item (self , item_data : dict , target_list : str ):
228239 item_id = item_data.get(" id" )
229240 source_list = item_data.get(" list_id" )
230-
241+
231242 if not item_id or not source_list:
232243 return
233-
244+
234245 # Find the item in the source list
235246 source_items = getattr (self , f " list_ { source_list.lower()} " )
236247 item_to_move = None
237248 for item in source_items:
238249 if item.id == item_id:
239250 item_to_move = item
240251 break
241-
252+
242253 if not item_to_move:
243254 return
244-
255+
245256 # Remove from source list only
246257 if source_list == " A" :
247258 self .list_a = [item for item in self .list_a if item.id != item_id]
248259 else :
249260 self .list_b = [item for item in self .list_b if item.id != item_id]
250-
261+
251262 # Create new item for target list
252263 new_item = ListItem(
253264 id = item_id,
254265 text = item_to_move.text,
255266 list_id = target_list
256267 )
257-
268+
258269 # Add to target list
259270 if target_list == " A" :
260271 self .list_a.append(new_item)
@@ -421,6 +432,9 @@ import reflex_enterprise as rxe
421432class SimpleState (rx .State ):
422433 message: str = " No items dropped yet"
423434
435+ def set_message_from_item (self , item : dict ):
436+ self .message = f " Dropped: { item[' name' ]} "
437+
424438def simple_draggable ():
425439 return rxe.dnd.draggable(
426440 rx.box(
@@ -444,7 +458,7 @@ def simple_drop_target():
444458 min_height = " 100px"
445459 ),
446460 accept = [" simple" ],
447- on_drop = lambda item : SimpleState.setvar( " message " , f " Dropped: { item[ ' name ' ] } " )
461+ on_drop = SimpleState.set_message_from_item
448462 )
449463
450464def item_data_example ():
@@ -467,6 +481,12 @@ class CollectState(rx.State):
467481 drag_info: str = " No drag activity"
468482 drop_info: str = " No drop activity"
469483
484+ def handle_drop (self , item : dict ):
485+ self .drop_info = f " Dropped: { item.get(' name' , ' Unknown' )} "
486+ return rx.toast(f " Successfully dropped { item.get(' name' , ' item' )} " )
487+
488+
489+
470490def collect_draggable ():
471491 params = rxe.dnd.Draggable.collected_params
472492 return rxe.dnd.draggable(
@@ -516,10 +536,7 @@ def collect_drop_target():
516536 min_height = " 120px"
517537 ),
518538 accept = [" collect_item" ],
519- on_drop = lambda item : [
520- CollectState.setvar(" drop_info" , f " Dropped: { item.get(' name' , ' Unknown' )} " ),
521- rx.toast(f " Successfully dropped { item.get(' name' , ' item' )} " )
522- ]
539+ on_drop = CollectState.handle_drop,
523540 )
524541
525542def custom_collect_example ():
0 commit comments