refactor: extract shared components (C) — action toolbar, infinite-scroll, picker, state helpers, search #193
Labels
Clear labels
AI Gen
area:auth
area:backend
area:ci
area:db
area:frontend
area:shared
good first issue
Need Triage
page:admin-users
page:album-detail
page:albums
page:cosplayer-detail
page:cosplayers
page:home
page:jobs
page:login
page:photos
page:register
page:settings
page:stats
page:user
performance
priority:critical
priority:high
priority:low
priority:medium
type:docs
type:refactor
bug
duplicate
enhancement
help wanted
invalid
question
wontfix
Autogenerated By AI
Authentication, JWT, refresh tokens
Lactose API (controllers, repos, services, models)
Docker, CI/CD, Gitea Actions
EF Core, migrations, pgvector
MilkStream WASM client (Blazor UI, SCSS, components)
Butter shared library (DTOs, enums, MIME types)
Good for new contributors
Needs to be categorized by a Human
Admin user management (/Users)
Album detail page (/albums/{id})
Albums list (/albums)
Cosplayer detail page (/cosplayer/{id})
Cosplayers list (/cosplayers)
Home page (/)
Background jobs page (/Jobs)
Login page (/login)
Photos page (/photos)
Register page (/Register)
Settings page (/Settings)
Statistics page (/Stats)
User profile page (/User/{id})
Performance or scalability concern
Blocker / must fix immediately
Must fix / urgent
Nice to have
Should fix
Documentation
Code cleanup or refactoring
Something is not working
This issue or pull request already exists
New feature
Need some help
Something is wrong
More information is needed
This won't be fixed
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: MilkyShots/MilkyShots#193
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Closes the Area C (shared components) children of #155: #158, #159, #160, #161, #162.
Completed
✅ #158 — Extract shared multi-select action toolbar (
e24e6cc,98c3fd5)New
ResponsiveActionBar+ActionButton(+ResponsiveActionVariantenum) render a desktop inline group and a mobile dropdown from a single button definition, preservingEventCallbacksemantics. MigratedAlbumDetail,Albums,CosplayerDetail,Cosplayers.Jobsintentionally left out (different responsive pattern). Later unified the select-all toggle across Albums/Cosplayers.✅ #159 — Unify infinite-scroll pagination (
291eb61,104193a)New
InfiniteScrollController<T>wrapsPageBuffer<T>+ the load-state machine (ReloadAsync/LoadNextAsync/LoadPreviousAsync). MigratedHome(dropped its hand-rolled buffer),AlbumGrid,CosplayerGrid.✅ #160 — Decompose AlbumAssetPicker duplicate templates (
fe8c1d5)Extracted the ~147-line duplicated
picker-layout(sidebar + main) into aRenderFragment PickerLayout; Embedded/Modal now differ only in wrapper, loading gate, and footer. Net −144 lines.✅ #161 — Extract selection/confirm/visibility state helpers (
abe446d,9ccdfe5)New
MultiSelect<T>,DeleteConfirmation,VisibilityApplyState;SelectionRangeupdated to work withMultiSelect. AdoptedMultiSelectin AlbumDetail/Albums/Cosplayers/CosplayerDetail/AlbumAssetPicker (grids'SelectedIdswidened toIReadOnlyCollection<Guid>);DeleteConfirmation+VisibilityApplyStatein AlbumDetail/CosplayerDetail/AlbumAssetPicker.Partial: Cosplayers/Albums keep their original delete/visibility wiring (cascade/merge state); FolderBrowser/BrokenAssetList/AdminUsers/Settings/User not yet migrated — noted as follow-up.
✅ #162 — Consolidate search/dropdown + debounce (
90026a6,a5d32d7)New
PersonSearchDropdowncomponent (search input + dropdown + version-guard + blur-close) and a singleDebouncehelper. Migrated the duplicated person-search inAlbumForm+LinkToCosplayerModaltoPersonSearchDropdown; replaced the Timer-based search debounces inAlbumAssetPicker+FolderBrowserwithDebounce.Verification
dotnet build MilkStream.Client— 0 warnings, 0 errors.Frontend-only ⇒ review by REDCODE.