""" Triage Layout Generates a Prodigy-style binary accept/reject/skip interface for rapid data curation. Features include: - Three large buttons: Accept (green), Reject (red), Skip (gray) - Keyboard shortcuts: a (accept), r (reject), s (skip) - Auto-advance to next item option - Progress indicator display - Minimal UI optimized for rapid decisions """ import logging from typing import Dict, Any, Tuple, List from .identifier_utils import ( safe_generate_layout, escape_html_content, generate_layout_attributes, ) logger = logging.getLogger(__name__) # Default labels for triage actions DEFAULT_ACCEPT_LABEL = "Keep" DEFAULT_REJECT_LABEL = "Discard" DEFAULT_SKIP_LABEL = "Unsure" # Default keyboard shortcuts (1/2/3 are adjacent and easy for rapid annotation) DEFAULT_KEYBINDINGS = { "accept": "1", "reject": "2", "skip": "3", } def generate_triage_layout(annotation_scheme: Dict[str, Any]) -> Tuple[str, List[Tuple[str, str]]]: """ Generate HTML for a triage (accept/reject/skip) interface. Args: annotation_scheme (dict): Configuration including: - name: Schema identifier - description: Display description - accept_label: Custom label for accept button (default: "Accept") - reject_label: Custom label for reject button (default: "Reject") - skip_label: Custom label for skip button (default: "Skip") - auto_advance: Whether to auto-advance after selection (default: true) - show_progress: Whether to show progress indicator (default: true) - accept_key: Custom keyboard shortcut for accept (default: "a") - reject_key: Custom keyboard shortcut for reject (default: "r") - skip_key: Custom keyboard shortcut for skip (default: "s") Returns: tuple: (html_string, key_bindings) html_string: Complete HTML for the triage interface key_bindings: List of (key, description) tuples for keyboard shortcuts """ return safe_generate_layout(annotation_scheme, _generate_triage_layout_internal) def _generate_triage_layout_internal(annotation_scheme: Dict[str, Any]) -> Tuple[str, List[Tuple[str, str]]]: """ Internal function to generate triage layout after validation. """ logger.debug(f"Generating triage layout for schema: {annotation_scheme['name']}") schema_name = annotation_scheme["name"] description = annotation_scheme.get("description", "") # Get custom labels or use defaults accept_label = annotation_scheme.get("accept_label", DEFAULT_ACCEPT_LABEL) reject_label = annotation_scheme.get("reject_label", DEFAULT_REJECT_LABEL) skip_label = annotation_scheme.get("skip_label", DEFAULT_SKIP_LABEL) # Get keyboard shortcuts accept_key = annotation_scheme.get("accept_key", DEFAULT_KEYBINDINGS["accept"]) reject_key = annotation_scheme.get("reject_key", DEFAULT_KEYBINDINGS["reject"]) skip_key = annotation_scheme.get("skip_key", DEFAULT_KEYBINDINGS["skip"]) # Get options auto_advance = annotation_scheme.get("auto_advance", True) show_progress = annotation_scheme.get("show_progress", True) # Get layout attributes for grid positioning layout_attrs = generate_layout_attributes(annotation_scheme) # Build keybindings list key_bindings = [ (accept_key, f"{schema_name}: {accept_label}"), (reject_key, f"{schema_name}: {reject_label}"), (skip_key, f"{schema_name}: {skip_label}"), ] # Escape for HTML attributes safe_schema_name = escape_html_content(schema_name) safe_description = escape_html_content(description) safe_accept_label = escape_html_content(accept_label) safe_reject_label = escape_html_content(reject_label) safe_skip_label = escape_html_content(skip_label) # Build the HTML html = f"""
{safe_description}
""" # Add progress indicator if enabled if show_progress: html += """
0 / 0
""".format(schema_name=safe_schema_name) html += """
""" logger.info(f"Successfully generated triage layout for {schema_name}") return html, key_bindings