- Rename the filesystem browse route from /api/asset/fs-browse to /api/asset/directory
(controller route, client URL, REST tests, and service log label).
- Remove the old /api/asset/browse endpoint and its BrowseAssets/GetDirectoryNames
repository code, plus the client BrowseAsync method. Repoint AlbumAssetPicker's
admin/curator folder browse to the /directory endpoint.
- Drop the now-unused pg_catalog.split_part DbFunction mapping.
- Refresh .env GIT_VERSION.
- Add MediaService.VideoUrl for the display media endpoint
- ImagePreview renders a <video> (webp poster) for video MIME types; otherwise the existing <img>
- Download and 'View full size' use the video URL for animated assets
- Home and AlbumDetail pass the asset MIME type into the shared preview
Aligns the maintenance page with the project's existing pagination pattern
instead of relying on the X-Total-Count response header, which is not
exposed to the WASM client over CORS. The broken report now pages by
'count >= page size' like AlbumAssetPicker, and folder browse pages over
the on-disk file count carried in the response body. The pagination bar
always renders when files exist so browsing can never strand on a page
with no database matches.
Refs #180
Add BrokenAssetList (paginated broken-assets grid with retry/delete and
requeue buttons) and FolderBrowser (filesystem browsing with folder
sidebar, breadcrumbs, bulk visibility/delete). Maintenance.razor now
switches between the two tabs. Add EJobType.AnimatedConversion.
Refs #180#181
Breaks up the monolithic Stats.razor into reusable pieces under
Components/Shared/ per the AGENTS.md extraction rule:
- StatCountCard: covers the three count-card shapes used 19 times
(solid top-level, outline data-completeness, icon-title sections).
- StatTable: reusable card+table scaffold for the seven distribution
tables, with optional header/footer row fragments.
- Formatting: static FormatBytes / PercentOfTotal helpers (were private
methods in Stats.razor).
Stats.razor now composes these; visual output is unchanged.
Refs #176
CosplayerDetail now fetches album pages from GET /api/album?personOwnerId=
instead of re-fetching the entire PersonDetailedDto per scroll page. The home
browse page opts out of the asset count query (includeCount=false).
- Remove 16 unused using System; imports from migration files (implicit usings available)
- Fix 6 empty catch blocks with proper exception logging
- Remove unused import (false positive flagged as wontfix)
- Skip test coverage, orphaned, and stale exclude issues as false positives
- Add missing namespace to IPersonRepository.cs
- Rename IFolderRepository Create/Delete to Insert/Remove for CRUD consistency
- Fix ITagRepository.Delete parameter name from 'id' to 'tag'
- Add missing IDisposable to IMediaRepository
- Rename SettingsExtensions to SettingsExtension for naming consistency
- Rename PagedParametersDTO.cs to PagedParametersDto.cs
- Add .desloppify/ to .gitignore
Adds GET /api/auth/register endpoint to check registration status.
Register page now pre-checks on load and shows EmptyState instead of
the form when registration is disabled. Fixes#149.
LoginService.Register() now returns HttpStatusCode instead of bool,
so the frontend can distinguish between 403 (registration disabled),
409 (duplicate), and other failures. Fixes#149.
- Add CascadeVisibilityToAssetsAsync to AlbumService (skips private/deleted)
- Replace duplicated loop+filter in Albums, CosplayerDetail, PersonForm with single call
- Update labels to describe skip-private/deleted behavior
- Add BulkUpdateAlbumsAsync to AlbumService
- Fix AlbumCard border gate from IsAdminOrCurator to CanEdit()
- CosplayerDetail: Delete, Unlink, Visibility buttons in select mode
- CosplayerDetail: Select All / Deselect All button
- CosplayerDetail: visibility breakdown stats in header
- CosplayerDetail: visibility modal for albums