diff --git a/SYS/result_table.py b/SYS/result_table.py index 8dfd836..9cf23b2 100644 --- a/SYS/result_table.py +++ b/SYS/result_table.py @@ -1897,7 +1897,8 @@ class ItemDetailView(ResultTable): """Render the item details panel above the standard results table.""" from rich.table import Table as RichTable from rich.panel import Panel - from rich.console import Group, Columns + from rich.console import Group + from rich.columns import Columns from rich.text import Text # 1. Create Detail Grid diff --git a/cmdlet/get_note.py b/cmdlet/get_note.py index 9a953e1..96cd28d 100644 --- a/cmdlet/get_note.py +++ b/cmdlet/get_note.py @@ -101,7 +101,20 @@ class Get_Note(Cmdlet): store_registry = Store(config) any_notes = False display_items: List[Dict[str, Any]] = [] - note_table: Optional[ResultTable] = None + + # We assume single subject for get-note detail view + main_res = results[0] + + from SYS.result_table import ItemDetailView, extract_item_metadata + metadata = extract_item_metadata(main_res) + + note_table = ( + ItemDetailView("Notes", item_metadata=metadata) + .set_table("note") + .set_value_case("preserve") + .set_preserve_order(True) + ) + note_table.set_source_command("get-note", []) for res in results: if not isinstance(res, dict): @@ -125,6 +138,12 @@ class Get_Note(Cmdlet): ) if not resolved_hash: continue + + # Update metadata if we resolved a hash that wasn't in source + if resolved_hash and not metadata.get("Hash"): + metadata["Hash"] = resolved_hash + if store_name and not metadata.get("Store"): + metadata["Store"] = store_name try: backend = store_registry[store_name] @@ -148,13 +167,6 @@ class Get_Note(Cmdlet): continue any_notes = True - if note_table is None: - note_table = ( - ResultTable("note") - .set_table("note") - .set_value_case("preserve") - .set_preserve_order(True) - ) # Emit each note as its own row so CLI renders a proper note table for k in sorted(notes.keys(), key=lambda x: str(x).lower()): v = notes.get(k) @@ -176,13 +188,18 @@ class Get_Note(Cmdlet): } display_items.append(payload) if note_table is not None: - note_table.add_result(payload) + row = note_table.add_row() + row.add_column("Name", str(k)) + row.add_column("Text", preview.strip()) + ctx.emit(payload) + # Always set the table overlay even if empty to show item details + ctx.set_last_result_table_overlay(note_table, display_items, subject=result) + if not any_notes: - ctx.emit("No notes found.") - elif note_table is not None: - ctx.set_last_result_table(note_table, display_items, subject=result) + log("No notes found.") + return 0 diff --git a/cmdlet/get_relationship.py b/cmdlet/get_relationship.py index 03762b9..5d7d27a 100644 --- a/cmdlet/get_relationship.py +++ b/cmdlet/get_relationship.py @@ -499,20 +499,6 @@ def _run(result: Any, _args: Sequence[str], config: Dict[str, Any]) -> int: if not found_relationships: log(f"Hydrus relationships fetch failed: {exc}", file=sys.stderr) - if not found_relationships: - try: - from rich.panel import Panel - from SYS.rich_display import stdout_console - - title = source_title or (hash_hex[:16] + "..." if hash_hex else "Item") - stdout_console().print( - Panel(f"{title} has no relationships", - title="Relationships") - ) - except Exception: - log("No relationships found.") - return 0 - # Display results from SYS.result_table import ItemDetailView, extract_item_metadata @@ -580,11 +566,15 @@ def _run(result: Any, _args: Sequence[str], config: Dict[str, Any]) -> int: f"hash:{item['hash']}"] ) - ctx.set_last_result_table(table, pipeline_results) + # Ensure empty state is still navigable/visible + ctx.set_last_result_table_overlay(table, pipeline_results) from SYS.rich_display import stdout_console stdout_console().print(table) + if not found_relationships: + log("No relationships found.") + return 0 diff --git a/cmdlet/get_tag.py b/cmdlet/get_tag.py index 39004a2..a6c98ba 100644 --- a/cmdlet/get_tag.py +++ b/cmdlet/get_tag.py @@ -1753,10 +1753,7 @@ def _run(result: Any, args: Sequence[str], config: Dict[str, Any]) -> int: storage = Store(config) backend = storage[store_name] current, source = backend.get_tag(file_hash, config=config) - - if not current: - log("No tags found", file=sys.stderr) - return 1 + current = list(current or []) service_name = "" except KeyError: diff --git a/cmdlet/get_url.py b/cmdlet/get_url.py index d3c1f28..cb6f593 100644 --- a/cmdlet/get_url.py +++ b/cmdlet/get_url.py @@ -453,13 +453,14 @@ class Get_Url(Cmdlet): # Use overlay mode to avoid "merging" with the previous status/table state. # This is idiomatic for detail views and prevents the search table from being # contaminated by partial re-renders. - ctx.set_last_result_table_overlay(table if items else None, items, subject=result) + ctx.set_last_result_table_overlay(table, items, subject=result) # Emit items at the end for pipeline continuity for item in items: ctx.emit(item) if not items: + # Still log it but the panel will show the item context log("No url found", file=sys.stderr) return 0