def create_queue_keyboard_system( config:SortableQueueConfig, # Queue configuration ids:SortableQueueHtmlIds, # HTML ID generators urls:SortableQueueUrls, # URL endpoints for HTMX actions zone_focus_classes:tuple=('ring-0',), # CSS classes when queue zone is active item_focus_classes:Optional=None, # CSS classes on focused item (default: bg-base-300) data_attributes:tuple=(), # Data attributes to extract (e.g., ("record-id", "provider-id")) on_focus_change:Optional=None, # JS callback on item focus change hidden_input_prefix:Optional=None, # Prefix for hidden state inputs system_id:Optional=None, # Keyboard system ID (auto-generated from ids.system_id if not set) show_hints:bool=False, # Show keyboard hints UI)->KeyboardSystem: # Complete rendered keyboard system
Create a self-contained keyboard system for the sortable queue.
Returns a rendered KeyboardSystem with a single FocusZone (LinearVertical navigation) and built-in actions for Delete/Backspace remove and Shift+Arrow reorder. Works standalone or as a child in a hierarchy via coord.setParent(system_id, parent_id).
Tests
from fasthtml.common import to_xml# Test setupconfig = SortableQueueConfig(prefix="tk")ids = SortableQueueHtmlIds(prefix="tk")urls = SortableQueueUrls(reorder="/tk/reorder", remove="/tk/remove", clear="/tk/clear")# --- Basic creation with defaults ---kb = create_queue_keyboard_system(config, ids, urls)assertisinstance(kb, KeyboardSystem)assert kb.script isnotNoneassert kb.hidden_inputs isnotNoneassert kb.action_buttons isnotNone# --- Default item focus classes (bg-base-300) ---script_xml = to_xml(kb.script)assert"bg-base-300"in script_xml # Default focus styling in JS config# --- System ID ---assert"tk-queue-kb"in script_xml # system_id appears in JS config# Custom system_idkb2 = create_queue_keyboard_system(config, ids, urls, system_id="my-custom-kb")script_xml2 = to_xml(kb2.script)assert"my-custom-kb"in script_xml2# --- Action buttons ---btns_xml = to_xml(kb.action_buttons)assert ids.remove_btn in btns_xml # Remove button presentassert ids.reorder_up_btn in btns_xml # Reorder up button presentassert ids.reorder_down_btn in btns_xml # Reorder down button presentassert"/tk/remove"in btns_xml # Remove URL wiredassert"/tk/reorder"in btns_xml # Reorder URL wired# --- Direction vals on reorder buttons ---assert"direction"in btns_xml# --- Zone config in script ---assertf"li.{config.item_class}"in script_xml # Item selectorassert ids.container in script_xml # Zone container ID# --- Custom item focus classes override default ---kb3 = create_queue_keyboard_system( config, ids, urls, item_focus_classes=("bg-custom",), data_attributes=("record-id", "provider-id"), on_focus_change="myFocusCallback", hidden_input_prefix="my-focused", show_hints=True,)assertisinstance(kb3, KeyboardSystem)assert kb3.hints isnotNone# Hints rendered when show_hints=Truescript_xml3 = to_xml(kb3.script)assert"bg-custom"in script_xml3assert"bg-base-300"notin script_xml3 # Default overriddenassert"myFocusCallback"in script_xml3assert"record-id"in script_xml3print("All keyboard tests passed")