Skip to content

Bug: all text shown in entity cards should be selectable and copyable #1624

Closed

Description

@JoshuaRowePhantom

Summary

Text displayed in an entity card should be selectable and copyable using the application's established copyable-text control/style. In the shown House card (git-worktree, filesystem-path), the title, type labels, field keys (path, branch, head-commit, target-branch) and values (including the full path and commit SHA) must be copyable directly from the card. Apply the same rule to every other textual item rendered by entity cards, not just this entity type.

Reproduction

  1. Open an entity card with text fields, such as a git-worktree card containing path, branch, head-commit and target-branch.
  2. Try selecting an individual label or value and copying it (mouse selection / Ctrl+C), then paste into a text editor.
  3. Repeat for the card title, type labels and other text-based card content.

Actual: Text in the card cannot consistently be selected and copied as expected; users must find the value elsewhere (for example in the underlying entity data).

Expected: Every displayed textual item in read mode can be selected and copied with its exact content, while existing buttons/links, editing, wrapping, search highlighting, and card navigation still work. Long paths and SHA values must be copied intact, without truncation.

Context / regression check

#1214 previously implemented SafeSelectableTextBlock for the title, type labels and read-mode property keys/values. Current XAML still appears to use that control in these locations; investigate whether interaction, styling, pointer handling, rendering paths or additional templates prevent actual copying, rather than only replacing TextBlock tags. Use the existing safe selectable/copyable text convention (not bare SelectableTextBlock, which has a zero-width wrapping issue). Include a rendered-card interaction regression test for selection and clipboard copying on the screenshot's git-worktree fields, and cover other text/card templates as needed.

Activity

  1. JoshuaRowePhantom commented on Oct 9, 2026

    @JoshuaRowePhantom
    OwnerAuthor

    Verification result

    Status: ❌ 3 issue(s) found
    Commits checked: e94916a Fix #1624: make rendered entity-card text selectable and copyable (against features)

    Outstanding gaps

    • Feature coverage — button labels are still not selectable/copyable. Phantom.Workspaces/Controls/EntityCardControl.axaml still renders shortcut labels (Shortcut.Label) and the JSON action text (JsonButtonText) as ordinary Button Content in read mode; Phantom.Workspaces/Templates/WorkspaceDataTemplates.axaml also renders reference-search candidate names as Button Content. Those text items cannot be mouse-selected and copied with Ctrl+C. Preserve their actions while enabling selection, as required for all textual card items, including buttons.
    • Test coverage — other card renderings are unverified by rendered selection/clipboard tests. The new tests cover one git-worktree card, one reference, one external URL, one plain attachment, and a badge; they do not exercise copy/navigation on the button labels above, entity-list links, array/object expander headers, markdown attachment headers/content, or external URL activation. The issue explicitly requires all text/card templates and preservation of link activation, not just presence of selectable control types.
    • Branch coverage — new CopyableLinkTextBlock logic lacks interaction tests for its conditional paths. No test exercises disabled/null commands, right-button presses, releasing outside the control, small versus threshold-exceeding drags, or Space-key activation (CopyableLinkTextBlock.cs); only left click/drag and Enter on a reference link are covered. The shared verification criteria require conditional branches in new code to have tests.

    Tests

    Focused command: .\scripts\run-tests.ps1 -Mode fast -TestProject .\Phantom.Workspaces.Tests\Phantom.Workspaces.Tests.csproj -TestNames EntityCardControlTests,EntityCardControlInteractionTests (invoked from skills root with worktree-prefixed paths). Runner results log:

      Phantom.Workspaces.Data.Core -> C:\dev\Phantom.Workspaces-Skills\worktrees\20\Phantom.Workspaces.Data.Core\bin\Debug\net10.0\Phantom.Workspaces.Data.Core.dll
      Phantom.Workspaces.Llm.Interfaces -> C:\dev\Phantom.Workspaces-Skills\worktrees\20\Phantom.Workspaces.Llm.Interfaces\bin\Debug\net10.0\Phantom.Workspaces.Llm.Interfaces.dll
      Phantom.Workspaces.Data.Web.Client -> C:\dev\Phantom.Workspaces-Skills\worktrees\20\Phantom.Workspaces.Data.Web.Client\bin\Debug\net10.0\Phantom.Workspaces.Data.Web.Client.dll
      Phantom.Workspaces.Llm.Echo -> C:\dev\Phantom.Workspaces-Skills\worktrees\20\Phantom.Workspaces.Llm.Echo\bin\Debug\net10.0\Phantom.Workspaces.Llm.Echo.dll
      Phantom.Workspaces.Containers -> C:\dev\Phantom.Workspaces-Skills\worktrees\20\Phantom.Workspaces.Containers\bin\Debug\net10.0\Phantom.Workspaces.Containers.dll
      Phantom.Workspaces.Data.MongoDB -> C:\dev\Phantom.Workspaces-Skills\worktrees\20\Phantom.Workspaces.Data.MongoDB\bin\Debug\net10.0\Phantom.Workspaces.Data.MongoDB.dll
      Phantom.Workspaces.Transport -> C:\dev\Phantom.Workspaces-Skills\worktrees\20\Phantom.Workspaces.Transport\bin\Debug\net10.0\Phantom.Workspaces.Transport.dll
      mxc: building the native unit and generating C# P/Invoke bindings (cargo build -p mxc_ffi -p plm --features "dotnetsdk" --target x86_64-pc-windows-msvc )
         Compiling mxc_ffi v0.8.0 (C:\dev\Phantom.Workspaces-Skills\worktrees\20\microsoft\mxc\src\ffi\mxc_ffi)
          Finished `dev` profile [unoptimized + debuginfo] target(s) in 7.97s
      Microsoft.Mxc.Sdk -> C:\dev\Phantom.Workspaces-Skills\worktrees\20\microsoft\mxc\sdk\dotnet\Microsoft.Mxc.Sdk\bin\Debug\net8.0\Microsoft.Mxc.Sdk.dll
      Phantom.Workspaces.Llm.Core -> C:\dev\Phantom.Workspaces-Skills\worktrees\20\Phantom.Workspaces.Llm.Core\bin\Debug\net10.0\Phantom.Workspaces.Llm.Core.dll
      Phantom.Workspaces.Gui.Shared -> C:\dev\Phantom.Workspaces-Skills\worktrees\20\Phantom.Workspaces.Gui.Shared\bin\Debug\net10.0\Phantom.Workspaces.Gui.Shared.dll
      Phantom.Workspaces.Logging -> C:\dev\Phantom.Workspaces-Skills\worktrees\20\Phantom.Workspaces.Logging\bin\Debug\net10.0\Phantom.Workspaces.Logging.dll
      Phantom.Dock.Avalonia.TabSwitching -> C:\dev\Phantom.Workspaces-Skills\worktrees\20\Phantom.Dock.Avalonia.TabSwitching\Phantom.Dock.Avalonia.TabSwitching\bin\Debug\net10.0\Phantom.Dock.Avalonia.TabSwitching.dll
      Phantom.Workspaces.Agent.Gui -> C:\dev\Phantom.Workspaces-Skills\worktrees\20\Phantom.Workspaces.Agent.Gui\bin\Debug\net10.0\Phantom.Workspaces.Agent.Gui.dll
      Phantom.Workspaces.Data.Offline -> C:\dev\Phantom.Workspaces-Skills\worktrees\20\Phantom.Workspaces.Data.Offline\bin\Debug\net10.0\Phantom.Workspaces.Data.Offline.dll
      Phantom.Workspaces.Testing -> C:\dev\Phantom.Workspaces-Skills\worktrees\20\Phantom.Workspaces.Testing\bin\Debug\net10.0\Phantom.Workspaces.Testing.dll
      Phantom.Workspaces.Test.WindowsProcessProbe -> C:\dev\Phantom.Workspaces-Skills\worktrees\20\Phantom.Workspaces.Test.WindowsProcessProbe\bin\Debug\net10.0\Phantom.Workspaces.Test.WindowsProcessProbe.dll
      Phantom.Workspaces.Data.Core.Tests -> C:\dev\Phantom.Workspaces-Skills\worktrees\20\Phantom.Workspaces.Data.Core.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.Core.Tests.dll
      Phantom.Workspaces.Data.MongoDB.Tests -> C:\dev\Phantom.Workspaces-Skills\worktrees\20\Phantom.Workspaces.Data.MongoDB.Tests\bin\Debug\net10.0\Phantom.Workspaces.Data.MongoDB.Tests.dll
      Phantom.Workspaces.Data.Web.Server -> C:\dev\Phantom.Workspaces-Skills\worktrees\20\Phantom.Workspaces.Data.Web.Server\bin\Debug\net10.0\Phantom.Workspaces.Data.Web.Server.dll
      Phantom.Workspaces.Install -> C:\dev\Phantom.Workspaces-Skills\worktrees\20\Phantom.Workspaces.Install\bin\Debug\net10.0\Phantom.Workspaces.Install.dll
      Phantom.Workspaces.Web.Server -> C:\dev\Phantom.Workspaces-Skills\worktrees\20\Phantom.Workspaces.Web.Server\bin\Debug\net10.0\Phantom.Workspaces.Web.Server.dll
      Phantom.Workspaces.Copilot.Cli.Wrapper -> C:\dev\Phantom.Workspaces-Skills\worktrees\20\Phantom.Workspaces.Copilot.Cli.Wrapper\bin\Debug\net10.0\phantom-copilot-wrapper.dll
      Phantom.Workspaces -> C:\dev\Phantom.Workspaces-Skills\worktrees\20\Phantom.Workspaces\bin\Debug\net10.0\Phantom.Workspaces.dll
      Phantom.Workspaces.ProcessAcceptance -> C:\dev\Phantom.Workspaces-Skills\worktrees\20\Phantom.Workspaces.ProcessAcceptance\bin\Debug\net10.0\Phantom.Workspaces.ProcessAcceptance.dll
      Phantom.Workspaces.Testing.Gui -> C:\dev\Phantom.Workspaces-Skills\worktrees\20\Phantom.Workspaces.Testing.Gui\bin\Debug\net10.0\Phantom.Workspaces.Testing.Gui.dll
      Phantom.Workspaces.Tests -> C:\dev\Phantom.Workspaces-Skills\worktrees\20\Phantom.Workspaces.Tests\bin\Debug\net10.0\Phantom.Workspaces.Tests.dll
    Test run for C:\dev\Phantom.Workspaces-Skills\worktrees\20\Phantom.Workspaces.Tests\bin\Debug\net10.0\Phantom.Workspaces.Tests.dll (.NETCoreApp,Version=v10.0)
    A total of 1 test files matched the specified pattern.
    Data collector 'Blame' message: All tests finished running, Sequence file will not be generated.
    Results File: C:\dev\Phantom.Workspaces-Skills\worktrees\20\Phantom.Workspaces.Tests\TestResults\jrowe_DAEMON_2026-10-08_17_40_14_net10.0.trx
    
    Passed!  - Failed:     0, Passed:    34, Skipped:     0, Total:    34, Duration: 37 s - Phantom.Workspaces.Tests.dll (net10.0)
    
    === Test Run Summary ===
    Executed : 34
    Passed   : 34
    Failed   : 0
    
    

    Slow suite: Not required: diff changes UI, UI tests, and test runner only; no filesystem or Git repository layer changes. No �erified-locally label applied.

  2. JoshuaRowePhantom commented on Oct 9, 2026

    @JoshuaRowePhantom
    OwnerAuthor

    Verification result

    Status: ✅ Verified
    Commits checked: b7482cc Follow up #1624: copy action labels and exercise card interactions; e94916a Fix #1624: make rendered entity-card text selectable and copyable (against features)

    Outstanding gaps

    None — all criteria satisfied. The three previously reported gaps are addressed: button/action labels use selectable content while retaining command activation; rendered-card interaction tests cover worktree title/types/field keys/full path/SHA, shortcuts, JSON/edit controls, references, entity-list links, search candidates, array/object and attachment expanders, markdown, external URLs, and badges; selectable-link tests cover null/disabled commands, right clicks, out-of-bounds release, small/large drags, Enter and Space. Selection/Ctrl+C tests inspect the actual clipboard and guard against accidental card navigation.

    Tests

    Approved targeted scripts\run-tests.ps1 -Mode fast runs at tip b7482cc:

    • -TestProject .\worktrees\20\Phantom.Workspaces.Gui.Shared.Tests\Phantom.Workspaces.Gui.Shared.Tests.csproj -TestNames CopyableLinkTextBlockTests: Executed 4, Passed 4, Failed 0.
    • -TestProject .\worktrees\20\Phantom.Workspaces.Tests\Phantom.Workspaces.Tests.csproj -TestNames EntityCardControlTests,EntityCardControlInteractionTests: Executed 40, Passed 40, Failed 0. Final worktrees\20\scripts\test-results.log reports Passed! - Failed: 0, Passed: 40, Skipped: 0, Total: 40.

    Slow suite not required: no filesystem or Git repository layer changes. Checkout source/submodules completed successfully; working tree clean.

  3. added a commit that references this issue on Oct 9, 2026
  4. JoshuaRowePhantom commented on Oct 9, 2026

    @JoshuaRowePhantom
    OwnerAuthor

    Checked into features via #1626 (merge 1b86a98). Hosted fast CI 37966216282 passed 8,019/8,019; full CI 37966209695 passed on Windows and Linux. #1617 and #1618 retain their separate acceptance gates.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingverified-locallyImplementation has been verified locally

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions