[Feature] Tagger performer match improvements#6854
[Feature] Tagger performer match improvements#6854Stash-KennyG wants to merge 41 commits intostashapp:developfrom
Conversation
…rmerPreview component - Added cardClassName prop to PerformerPopoverCard and PerformerPopover for customizable styling. - Introduced MatchedPerformerPreview component to encapsulate PerformerPopover usage with a performerID. - Updated PerformerResult to utilize MatchedPerformerPreview for improved structure and styling.
Made-with: Cursor
Made-with: Cursor
Made-with: Cursor
Made-with: Cursor
Made-with: Cursor
Made-with: Cursor
…component - Added delta row functionality to display differences between local and remote performer data in MatchedPerformerPreview. - Introduced ScrapedPerformerPreview component for displaying scraped performer details with hover functionality. - Updated PerformerResult to integrate ScrapedPerformerPreview and pass necessary props for delta rows and warnings. - Enhanced styling for performer popovers to improve user experience.
- Simplified conditions for displaying remote aliases and URLs by removing unnecessary checks against local counts. - Ensured that rows are only pushed when remote counts exceed local counts, improving clarity and performance.
Document summary, test plan, and compatibility note for card class shape changes. Made-with: Cursor
Cursor overzealous.
Use full findPerformer data for mismatch comparisons and selected hover content, and normalize scraped card mapping to satisfy PerformerDataFragment shape. Made-with: Cursor
Apply Prettier-compatible formatting updates in matched preview, performer result, and scraped preview components. Made-with: Cursor
Normalize formatting patterns to align with repository Prettier output. Made-with: Cursor
Restructure imports and helper formatting to better match repository Prettier conventions. Made-with: Cursor
Rework formatting structure in performer result and scraped preview to match established Prettier output style. Made-with: Cursor
Format PerformerResult and ScrapedPerformerPreview with Prettier to satisfy validate-ui format checks. Made-with: Cursor
Use repository Prettier version to align with CI format-check expectations. Made-with: Cursor
Gykes
left a comment
There was a problem hiding this comment.
Static review only, no actual testing was done.
- Refactored buildPerformerDeltaRows to utilize `intl` for label formatting, improving localization. - Updated loading state message to use `FormattedMessage` for better internationalization. - Ensured all performer attributes are displayed with localized labels, enhancing user experience across different languages.
- Added `useIntl` hook to support localized performer names. - Updated `toPerformerCardData` function to utilize `intl` for formatting unknown performer names, enhancing user experience across different languages.
…tionality. - Replaced `PerformerCard` with `LocalPerformerCard` in `MatchedPerformerPreview` for better encapsulation. - Introduced `RemotePerformerCard` in `ScrapedPerformerPreview` to enhance the display of performer details, including gender and country flag. - Updated content rendering in `ScrapedPerformerPreview` to utilize the new `RemotePerformerCard` component.
…roved value handling. - Enhanced the normalizeValue function to handle numeric-like strings, converting them to numbers when applicable. - Maintained existing functionality for trimming and lowercasing non-numeric strings, ensuring consistent value normalization.
Convert scraped performer gender strings to GenderEnum using stringToGender before rendering GenderIcon so UI type-check passes in CI. Made-with: Cursor
…azy/async functionality - Updated MatchedPerformerPreview to utilize scraped performer data and handle loading states more effectively. - Introduced delta row calculations for displaying differences between local and scraped performer data. - Removed redundant code and improved the overall organization of the components for better maintainability.
Gykes
left a comment
There was a problem hiding this comment.
Another static review.
Looking better, once these are addressed/chatted about I will do app testing.
Refactor PerformerPopover and related components for improved functionality and structure - Updated PerformerPopover to accept preview data, loading states, and additional card extras for enhanced flexibility. - Replaced PerformerCard with PerformerPreviewCard in PerformerPopoverCard for better encapsulation and display of performer details. - Refactored MatchedPerformerPreview and ScrapedPerformerPreview to utilize PerformerPopover, streamlining the rendering of performer information and loading states. - Improved styling by renaming CSS classes for consistency and clarity.
- Replaced PerformerPreviewCard with PerformerCard in PerformerPopover for better encapsulation and display. - Simplified MatchedPerformerPreview by removing unnecessary loading state handling and age calculations. - Enhanced styling in Tagger component with additional padding for better layout consistency.
- Updated CSS class names from `tagger-performer-popover` to `performer-preview-popover` for clarity. - Enhanced styling for the new `performer-preview-popover` class to ensure consistent dimensions and image handling. - Removed outdated styles related to the previous tagger popover implementation.
Reorder padding declarations in the matched performer popover extra block to satisfy alphabetical property order enforced by stylelint. Made-with: Cursor
Use full PerformerCard in PerformerPopover ID mode so favorites and card button overlays render again, while keeping previewData mode for scraped/tagger previews. Made-with: Cursor
Normalize import formatting in ScrapedPerformerPreview to match repository Prettier output and unblock validate-ui format-check. Made-with: Cursor
What Changed Since PR Opened
Data Shape Strategy (No Unsafe Casts)
Hover/Lazy-Load Behavior
UI/Styling Adjustments
CI/Validation Fixes Applied
|
|
So, after some quick testing of the feature it looks okay. There is a small UX thing that I noticed and not sure if it is intended.
From a UX standpoint I would image that, since there is no hyperlinked information in this modal, then it should go away when you remove your hover from the name of the performer on the tagger card. This is, of course, opinionated and I think no matter what way you do it you will get pushback. In my opinion, the hover should disappear when you move your mouse off of the performer name. With that in mind lets go ahead and go that route and if there is a large enough of a pushback then we can revert. |
|
Current behavior is intentional. When you hover a performer and the modal appears, it remains active if the cursor moves into the modal. That allows click or ctrl/middle-click actions directly from the modal (open stash or stashdb). The primary driver was the right side where that interaction did not exist before. The left side already supported it, but I kept behavior consistent across both sides rather than introducing different hover models. Implementation differs slightly (inline block vs box picker), but both treat the modal as part of the hover region by design. Net effect: dismissal is lateral movement, not vertical. The suggestion is valid from a simplicity standpoint. Current design prioritizes interaction over quick dismissal. If that tradeoff proves wrong, it can be adjusted, but would lose the ability to interact with the card in case someone wanted to get more details. Also, in highlighting performer mis-matches - interaction with middle click may be necssary... |
|
If it is intentional then you can keep it as is. I imagine that people will want to be directed to the Stash Box link to verify performer at some point. Off the top of my head I don't have a solution for the issue I was having but I don't think it's a massive one. I think this is mostly ready for WP review anyway so will probably give it another quick look over and test then send it his way, |
- Added `cardContent` prop to `PerformerPopover` and `PerformerPopoverCard` for flexible content rendering. - Introduced `TaggerPerformerPopover` to handle both local and scraped performer data, replacing the previous `ScrapedPerformerPreview`. - Created `ScrapedPerformerCard` for displaying scraped performer details, including age and country flag. - Updated styles for the tag popover card to ensure consistent dimensions and improved layout. This refactor improves the encapsulation and display of performer information across the tagger components.
- Eliminated the PerformerPreviewCard component, simplifying the PerformerPopoverCard structure. - Updated loading state logic to directly display loading text without relying on preview data. - Removed unused props related to performer preview data for cleaner code and improved maintainability.
- Added media query for max-height to adjust dimensions of the tagger performer popover card. - Updated class names in TaggerPerformerPopover to ensure consistent styling with the new card structure. - Removed outdated styles from the Tags component to streamline CSS and improve maintainability.
- Removed MatchedPerformerPreview component and integrated its functionality into TaggerPerformerPopover. - Updated PerformerResult to utilize TaggerPerformerPopover for displaying performer details. - Enhanced TaggerPerformerPopover to include delta row calculations for differences between local and scraped performer data. - Improved code organization and maintainability by consolidating related logic into the popover component.
- Added a comment to clarify the use of the BEM class for the performer card age styling. - Included a stylelint directive to prevent naming conflicts with reusable components.
- Adjusted import order for better organization and readability.
…6889) The x86_64 and CUDA backend stages still used golang:1.24.3 while go.mod requires Go 1.25, which broke make docker-build under GOTOOLCHAIN=local. Bump both images to golang:1.25.9 to match docker/compiler/Dockerfile and PR stashapp#6869. Verified with: make docker-build Fixes stashapp#6887 Co-authored-by: KennyG <kennyg@kennyg.com> Co-authored-by: Cursor <cursoragent@cursor.com> (cherry picked from commit 3afe292)
…tashapp#6889)" This reverts commit d9d5023.
Enhance Tagger performer match UX with hover previews and mismatch warnings
Provides a performer hover-pop-over to the tagger UI so performers can be clearly seen and verified against potential match candidates before committing stashID changes in the local database.
Closes #6853
Improves match confidence at the decision point, reducing accidental performer cross-linking when multiple people have similar names.
For existing users, this should improve speed and tagging accuracy because identity verification happens inline instead of requiring extra page navigation.
In larger libraries, this should reduce correction/rework effort (unlinking and relinking performers) and improve long-term data quality.
Additional operational benefits:
Scope and Non-Goals
Platform and Interaction Considerations
Functionality Details
Behavior Details
PerformerCard.attached stash_id != incoming remote_site_idANDattached stash_endpoint == incoming stash_endpointMismatch Fields Covers
Test Plan
Notes
LLM Details
[✔] LLM use is openly disclosed. Made with Cursor
[✔] Code is reviewed by a human.
[✔] Human testing and validation was performed.
[✔] You take full responsibility for the code (including license compliance).